summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kexec/arch/x86_64/crashdump-x86_64.c707
-rw-r--r--kexec/arch/x86_64/crashdump-x86_64.h27
2 files changed, 0 insertions, 734 deletions
diff --git a/kexec/arch/x86_64/crashdump-x86_64.c b/kexec/arch/x86_64/crashdump-x86_64.c
deleted file mode 100644
index fc2dd91..0000000
--- a/kexec/arch/x86_64/crashdump-x86_64.c
+++ /dev/null
@@ -1,707 +0,0 @@
-/*
- * kexec: Linux boots Linux
- *
- * Created by: Murali M Chakravarthy (muralim@in.ibm.com)
- * Copyright (C) IBM Corporation, 2005. All rights reserved
- * Heavily borrowed from kexec/arch/i386/crashdump-x86.c
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation (version 2 of the License).
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <limits.h>
-#include <elf.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include "../../kexec.h"
-#include "../../kexec-elf.h"
-#include "../../kexec-syscall.h"
-#include "../../crashdump.h"
-#include "kexec-x86_64.h"
-#include "crashdump-x86_64.h"
-#include <x86/x86-linux.h>
-
-
-/* Forward Declaration. */
-static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end);
-
-static int get_kernel_page_offset(struct kexec_info *info,
- struct crash_elf_info *elf_info)
-{
- int kv;
-
- kv = kernel_version();
- if (kv < 0)
- return -1;
-
- if (kv < KERNEL_VERSION(2, 6, 27))
- elf_info->page_offset = PAGE_OFFSET_PRE_2_6_27;
- else
- elf_info->page_offset = PAGE_OFFSET;
-
- return 0;
-}
-
-
-#define KERN_VADDR_ALIGN 0x100000 /* 1MB */
-
-/* Read kernel physical load addr from the file returned by proc_iomem()
- * (Kernel Code) and store in kexec_info */
-static int get_kernel_paddr(struct kexec_info *info,
- struct crash_elf_info *elf_info)
-{
- uint64_t start;
-
- if (xen_present()) /* Kernel not entity mapped under Xen */
- return 0;
-
- if (parse_iomem_single("Kernel code\n", &start, NULL) == 0) {
- elf_info->kern_paddr_start = start;
-#ifdef DEBUG
- printf("kernel load physical addr start = 0x%016Lx\n", start);
-#endif
- return 0;
- }
-
- fprintf(stderr, "Cannot determine kernel physical load addr\n");
- return -1;
-}
-
-/* Retrieve info regarding virtual address kernel has been compiled for and
- * size of the kernel from /proc/kcore. Current /proc/kcore parsing from
- * from kexec-tools fails because of malformed elf notes. A kernel patch has
- * been submitted. For the folks using older kernels, this function
- * hard codes the values to remain backward compatible. Once things stablize
- * we should get rid of backward compatible code. */
-
-static int get_kernel_vaddr_and_size(struct kexec_info *info,
- struct crash_elf_info *elf_info)
-{
- int result;
- const char kcore[] = "/proc/kcore";
- char *buf;
- struct mem_ehdr ehdr;
- struct mem_phdr *phdr, *end_phdr;
- int align;
- unsigned long size;
- uint32_t elf_flags = 0;
-
- if (xen_present()) /* Kernel not entity mapped under Xen */
- return 0;
-
- align = getpagesize();
- size = KCORE_ELF_HEADERS_SIZE;
- buf = slurp_file_len(kcore, size);
- if (!buf) {
- fprintf(stderr, "Cannot read %s: %s\n", kcore, strerror(errno));
- return -1;
- }
-
- /* Don't perform checks to make sure stated phdrs and shdrs are
- * actually present in the core file. It is not practical
- * to read the GB size file into a user space buffer, Given the
- * fact that we don't use any info from that.
- */
- elf_flags |= ELF_SKIP_FILESZ_CHECK;
- result = build_elf_core_info(buf, size, &ehdr, elf_flags);
- if (result < 0) {
- /* Perhaps KCORE_ELF_HEADERS_SIZE is too small? */
- fprintf(stderr, "ELF core (kcore) parse failed\n");
- return -1;
- }
-
- /* Traverse through the Elf headers and find the region where
- * kernel is mapped. */
- end_phdr = &ehdr.e_phdr[ehdr.e_phnum];
- for(phdr = ehdr.e_phdr; phdr != end_phdr; phdr++) {
- if (phdr->p_type == PT_LOAD) {
- unsigned long saddr = phdr->p_vaddr;
- unsigned long eaddr = phdr->p_vaddr + phdr->p_memsz;
- unsigned long size;
-
- /* Look for kernel text mapping header. */
- if ((saddr >= __START_KERNEL_map) &&
- (eaddr <= __START_KERNEL_map + KERNEL_TEXT_SIZE)) {
- saddr = (saddr) & (~(KERN_VADDR_ALIGN - 1));
- elf_info->kern_vaddr_start = saddr;
- size = eaddr - saddr;
- /* Align size to page size boundary. */
- size = (size + align - 1) & (~(align - 1));
- elf_info->kern_size = size;
-#ifdef DEBUG
- printf("kernel vaddr = 0x%lx size = 0x%lx\n",
- saddr, size);
-#endif
- return 0;
- }
- }
- }
- fprintf(stderr, "Can't find kernel text map area from kcore\n");
- return -1;
-}
-
-/* Stores a sorted list of RAM memory ranges for which to create elf headers.
- * A separate program header is created for backup region */
-static struct memory_range crash_memory_range[CRASH_MAX_MEMORY_RANGES];
-
-/* Memory region reserved for storing panic kernel and other data. */
-static struct memory_range crash_reserved_mem;
-
-/* Reads the appropriate file and retrieves the SYSTEM RAM regions for whom to
- * create Elf headers. Keeping it separate from get_memory_ranges() as
- * requirements are different in the case of normal kexec and crashdumps.
- *
- * Normal kexec needs to look at all of available physical memory irrespective
- * of the fact how much of it is being used by currently running kernel.
- * Crashdumps need to have access to memory regions actually being used by
- * running kernel. Expecting a different file/data structure than /proc/iomem
- * to look into down the line. May be something like /proc/kernelmem or may
- * be zone data structures exported from kernel.
- */
-static int get_crash_memory_ranges(struct memory_range **range, int *ranges,
- int kexec_flags)
-{
- const char *iomem= proc_iomem();
- int memory_ranges = 0, gart = 0;
- char line[MAX_LINE];
- FILE *fp;
- unsigned long long start, end;
- uint64_t gart_start = 0, gart_end = 0;
-
- fp = fopen(iomem, "r");
- if (!fp) {
- fprintf(stderr, "Cannot open %s: %s\n",
- iomem, strerror(errno));
- return -1;
- }
-
- /* First entry is for first 640K region. Different bios report first
- * 640K in different manner hence hardcoding it */
- if (!(kexec_flags & KEXEC_PRESERVE_CONTEXT)) {
- crash_memory_range[0].start = 0x00000000;
- crash_memory_range[0].end = 0x0009ffff;
- crash_memory_range[0].type = RANGE_RAM;
- memory_ranges++;
- }
-
- while(fgets(line, sizeof(line), fp) != 0) {
- char *str;
- int type, consumed, count;
-
- if (memory_ranges >= CRASH_MAX_MEMORY_RANGES)
- break;
- count = sscanf(line, "%Lx-%Lx : %n",
- &start, &end, &consumed);
- if (count != 2)
- continue;
- str = line + consumed;
-#ifdef DEBUG
- printf("%016Lx-%016Lx : %s",
- start, end, str);
-#endif
- /* Only Dumping memory of type System RAM. */
- if (memcmp(str, "System RAM\n", 11) == 0) {
- type = RANGE_RAM;
- } else if (memcmp(str, "Crash kernel\n", 13) == 0) {
- /* Reserved memory region. New kernel can
- * use this region to boot into. */
- crash_reserved_mem.start = start;
- crash_reserved_mem.end = end;
- crash_reserved_mem.type = RANGE_RAM;
- continue;
- } else if (memcmp(str, "ACPI Tables\n", 12) == 0) {
- /*
- * ACPI Tables area need to be passed to new
- * kernel with appropriate memmap= option. This
- * is needed so that x86_64 kernel creates linear
- * mapping for this region which is required for
- * initializing acpi tables in second kernel.
- */
- type = RANGE_ACPI;
- } else if(memcmp(str,"ACPI Non-volatile Storage\n",26) == 0 ) {
- type = RANGE_ACPI_NVS;
- } else if (memcmp(str, "GART\n", 5) == 0) {
- gart_start = start;
- gart_end = end;
- gart = 1;
- continue;
- } else {
- continue;
- }
-
- /* First 640K already registered */
- if (end <= 0x0009ffff)
- continue;
-
- crash_memory_range[memory_ranges].start = start;
- crash_memory_range[memory_ranges].end = end;
- crash_memory_range[memory_ranges].type = type;
- memory_ranges++;
- }
- fclose(fp);
- if (kexec_flags & KEXEC_PRESERVE_CONTEXT) {
- int i;
- for (i = 0; i < memory_ranges; i++) {
- if (crash_memory_range[i].end > 0x0009ffff) {
- crash_reserved_mem.start = \
- crash_memory_range[i].start;
- break;
- }
- }
- if (crash_reserved_mem.start >= mem_max) {
- fprintf(stderr, "Too small mem_max: 0x%llx.\n", mem_max);
- return -1;
- }
- crash_reserved_mem.end = mem_max;
- crash_reserved_mem.type = RANGE_RAM;
- }
- if (exclude_region(&memory_ranges, crash_reserved_mem.start,
- crash_reserved_mem.end) < 0)
- return -1;
- if (gart) {
- /* exclude GART region if the system has one */
- if (exclude_region(&memory_ranges, gart_start, gart_end) < 0)
- return -1;
- }
- *range = crash_memory_range;
- *ranges = memory_ranges;
-#ifdef DEBUG
- int i;
- printf("CRASH MEMORY RANGES\n");
- for(i = 0; i < memory_ranges; i++) {
- start = crash_memory_range[i].start;
- end = crash_memory_range[i].end;
- printf("%016Lx-%016Lx\n", start, end);
- }
-#endif
- return 0;
-}
-
-/* Removes crash reserve region from list of memory chunks for whom elf program
- * headers have to be created. Assuming crash reserve region to be a single
- * continuous area fully contained inside one of the memory chunks */
-static int exclude_region(int *nr_ranges, uint64_t start, uint64_t end)
-{
- int i, j, tidx = -1;
- struct memory_range temp_region = { 0, 0, 0 };
-
- for (i = 0; i < (*nr_ranges); i++) {
- unsigned long long mstart, mend;
- mstart = crash_memory_range[i].start;
- mend = crash_memory_range[i].end;
- if (start < mend && end > mstart) {
- if (start != mstart && end != mend) {
- /* Split memory region */
- crash_memory_range[i].end = start - 1;
- temp_region.start = end + 1;
- temp_region.end = mend;
- temp_region.type = RANGE_RAM;
- tidx = i+1;
- } else if (start != mstart)
- crash_memory_range[i].end = start - 1;
- else
- crash_memory_range[i].start = end + 1;
- }
- }
- /* Insert split memory region, if any. */
- if (tidx >= 0) {
- if (*nr_ranges == CRASH_MAX_MEMORY_RANGES) {
- /* No space to insert another element. */
- fprintf(stderr, "Error: Number of crash memory ranges"
- " excedeed the max limit\n");
- return -1;
- }
- for (j = (*nr_ranges - 1); j >= tidx; j--)
- crash_memory_range[j+1] = crash_memory_range[j];
- crash_memory_range[tidx].start = temp_region.start;
- crash_memory_range[tidx].end = temp_region.end;
- crash_memory_range[tidx].type = temp_region.type;
- (*nr_ranges)++;
- }
- return 0;
-}
-
-/* Adds a segment from list of memory regions which new kernel can use to
- * boot. Segment start and end should be aligned to 1K boundary. */
-static int add_memmap(struct memory_range *memmap_p, unsigned long long addr,
- size_t size)
-{
- int i, j, nr_entries = 0, tidx = 0, align = 1024;
- unsigned long long mstart, mend;
-
- /* Do alignment check. */
- if ((addr%align) || (size%align))
- return -1;
-
- /* Make sure at least one entry in list is free. */
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (!mstart && !mend)
- break;
- else
- nr_entries++;
- }
- if (nr_entries == CRASH_MAX_MEMMAP_NR)
- return -1;
-
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (mstart == 0 && mend == 0)
- break;
- if (mstart <= (addr+size-1) && mend >=addr)
- /* Overlapping region. */
- return -1;
- else if (addr > mend)
- tidx = i+1;
- }
- /* Insert the memory region. */
- for (j = nr_entries-1; j >= tidx; j--)
- memmap_p[j+1] = memmap_p[j];
- memmap_p[tidx].start = addr;
- memmap_p[tidx].end = addr + size - 1;
-#ifdef DEBUG
- printf("Memmap after adding segment\n");
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (mstart == 0 && mend == 0)
- break;
- printf("%016llx - %016llx\n",
- mstart, mend);
- }
-#endif
- return 0;
-}
-
-/* Removes a segment from list of memory regions which new kernel can use to
- * boot. Segment start and end should be aligned to 1K boundary. */
-static int delete_memmap(struct memory_range *memmap_p, unsigned long long addr,
- size_t size)
-{
- int i, j, nr_entries = 0, tidx = -1, operation = 0, align = 1024;
- unsigned long long mstart, mend;
- struct memory_range temp_region = { 0, 0, 0 };
-
- /* Do alignment check. */
- if ((addr%align) || (size%align))
- return -1;
-
- /* Make sure at least one entry in list is free. */
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (!mstart && !mend)
- break;
- else
- nr_entries++;
- }
- if (nr_entries == CRASH_MAX_MEMMAP_NR)
- /* List if full */
- return -1;
-
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (mstart == 0 && mend == 0)
- /* Did not find the segment in the list. */
- return -1;
- if (mstart <= addr && mend >= (addr + size - 1)) {
- if (mstart == addr && mend == (addr + size - 1)) {
- /* Exact match. Delete region */
- operation = -1;
- tidx = i;
- break;
- }
- if (mstart != addr && mend != (addr + size - 1)) {
- /* Split in two */
- memmap_p[i].end = addr - 1;
- temp_region.start = addr + size;
- temp_region.end = mend;
- operation = 1;
- tidx = i;
- break;
- }
-
- /* No addition/deletion required. Adjust the existing.*/
- if (mstart != addr) {
- memmap_p[i].end = addr - 1;
- break;
- } else {
- memmap_p[i].start = addr + size;
- break;
- }
- }
- }
- if ((operation == 1) && tidx >=0) {
- /* Insert the split memory region. */
- for (j = nr_entries-1; j > tidx; j--)
- memmap_p[j+1] = memmap_p[j];
- memmap_p[tidx+1] = temp_region;
- }
- if ((operation == -1) && tidx >=0) {
- /* Delete the exact match memory region. */
- for (j = i+1; j < CRASH_MAX_MEMMAP_NR; j++)
- memmap_p[j-1] = memmap_p[j];
- memmap_p[j-1].start = memmap_p[j-1].end = 0;
- }
-#ifdef DEBUG
- printf("Memmap after deleting segment\n");
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- mstart = memmap_p[i].start;
- mend = memmap_p[i].end;
- if (mstart == 0 && mend == 0) {
- break;
- }
- printf("%016llx - %016llx\n",
- mstart, mend);
- }
-#endif
- return 0;
-}
-
-/* Converts unsigned long to ascii string. */
-static void ultoa(unsigned long i, char *str)
-{
- int j = 0, k;
- char tmp;
-
- do {
- str[j++] = i % 10 + '0';
- } while ((i /=10) > 0);
- str[j] = '\0';
-
- /* Reverse the string. */
- for (j = 0, k = strlen(str) - 1; j < k; j++, k--) {
- tmp = str[k];
- str[k] = str[j];
- str[j] = tmp;
- }
-}
-
-/* Adds the appropriate memmap= options to command line, indicating the
- * memory regions the new kernel can use to boot into. */
-static int cmdline_add_memmap(char *cmdline, struct memory_range *memmap_p)
-{
- int i, cmdlen, len;
- unsigned long min_sizek = 100;
- char str_mmap[256], str_tmp[20];
-
- /* Exact map */
- strcpy(str_mmap, " memmap=exactmap");
- len = strlen(str_mmap);
- cmdlen = strlen(cmdline) + len;
- if (cmdlen > (COMMAND_LINE_SIZE - 1))
- die("Command line overflow\n");
- strcat(cmdline, str_mmap);
-
- for (i = 0; i < CRASH_MAX_MEMMAP_NR; i++) {
- unsigned long startk, endk;
- startk = (memmap_p[i].start/1024);
- endk = ((memmap_p[i].end + 1)/1024);
- if (!startk && !endk)
- /* All regions traversed. */
- break;
-
- /* A region is not worth adding if region size < 100K. It eats
- * up precious command line length. */
- if ((endk - startk) < min_sizek)
- continue;
- strcpy (str_mmap, " memmap=");
- ultoa((endk-startk), str_tmp);
- strcat (str_mmap, str_tmp);
- strcat (str_mmap, "K@");
- ultoa(startk, str_tmp);
- strcat (str_mmap, str_tmp);
- strcat (str_mmap, "K");
- len = strlen(str_mmap);
- cmdlen = strlen(cmdline) + len;
- if (cmdlen > (COMMAND_LINE_SIZE - 1))
- die("Command line overflow\n");
- strcat(cmdline, str_mmap);
- }
-#ifdef DEBUG
- printf("Command line after adding memmap\n");
- printf("%s\n", cmdline);
-#endif
- return 0;
-}
-
-/* Adds the elfcorehdr= command line parameter to command line. */
-static int cmdline_add_elfcorehdr(char *cmdline, unsigned long addr)
-{
- int cmdlen, len, align = 1024;
- char str[30], *ptr;
-
- /* Passing in elfcorehdr=xxxK format. Saves space required in cmdline.
- * Ensure 1K alignment*/
- if (addr%align)
- return -1;
- addr = addr/align;
- ptr = str;
- strcpy(str, " elfcorehdr=");
- ptr += strlen(str);
- ultoa(addr, ptr);
- strcat(str, "K");
- len = strlen(str);
- cmdlen = strlen(cmdline) + len;
- if (cmdlen > (COMMAND_LINE_SIZE - 1))
- die("Command line overflow\n");
- strcat(cmdline, str);
-#ifdef DEBUG
- printf("Command line after adding elfcorehdr\n");
- printf("%s\n", cmdline);
-#endif
- return 0;
-}
-
-/* Appends memmap=X#Y commandline for ACPI to command line*/
-static int cmdline_add_memmap_acpi(char *cmdline, unsigned long start,
- unsigned long end)
-{
- int cmdlen, len, align = 1024;
- unsigned long startk, endk;
- char str_mmap[256], str_tmp[20];
-
- if (!(end - start))
- return 0;
-
- startk = start/1024;
- endk = (end + align - 1)/1024;
- strcpy (str_mmap, " memmap=");
- ultoa((endk - startk), str_tmp);
- strcat (str_mmap, str_tmp);
- strcat (str_mmap, "K#");
- ultoa(startk, str_tmp);
- strcat (str_mmap, str_tmp);
- strcat (str_mmap, "K");
- len = strlen(str_mmap);
- cmdlen = strlen(cmdline) + len;
- if (cmdlen > (COMMAND_LINE_SIZE - 1))
- die("Command line overflow\n");
- strcat(cmdline, str_mmap);
-
-#ifdef DEBUG
- printf("Command line after adding acpi memmap\n");
- printf("%s\n", cmdline);
-#endif
- return 0;
-}
-
-/* Loads additional segments in case of a panic kernel is being loaded.
- * One segment for backup region, another segment for storing elf headers
- * for crash memory image.
- */
-int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
- unsigned long max_addr, unsigned long min_base)
-{
- void *tmp;
- unsigned long sz, bufsz, memsz, elfcorehdr;
- int nr_ranges, align = 1024, i;
- struct memory_range *mem_range, *memmap_p;
-
- struct crash_elf_info elf_info =
- {
- class: ELFCLASS64,
- data: ELFDATA2LSB,
- machine: EM_X86_64,
- backup_src_start: BACKUP_SRC_START,
- backup_src_end: BACKUP_SRC_END,
- };
-
- if (get_kernel_page_offset(info, &elf_info))
- return -1;
-
- if (get_kernel_paddr(info, &elf_info))
- return -1;
-
- if (get_kernel_vaddr_and_size(info, &elf_info))
- return -1;
-
- if (get_crash_memory_ranges(&mem_range, &nr_ranges,
- info->kexec_flags) < 0)
- return -1;
-
- /* Memory regions which panic kernel can safely use to boot into */
- sz = (sizeof(struct memory_range) * (KEXEC_MAX_SEGMENTS + 1));
- memmap_p = xmalloc(sz);
- memset(memmap_p, 0, sz);
- add_memmap(memmap_p, BACKUP_SRC_START, BACKUP_SRC_SIZE);
- sz = crash_reserved_mem.end - crash_reserved_mem.start +1;
- add_memmap(memmap_p, crash_reserved_mem.start, sz);
-
- /* Create a backup region segment to store backup data*/
- if (!(info->kexec_flags & KEXEC_PRESERVE_CONTEXT)) {
- sz = (BACKUP_SRC_SIZE + align - 1) & ~(align - 1);
- tmp = xmalloc(sz);
- memset(tmp, 0, sz);
- info->backup_start = add_buffer(info, tmp, sz, sz, align,
- 0, max_addr, 1);
- if (delete_memmap(memmap_p, info->backup_start, sz) < 0)
- return -1;
- }
-
- /* Create elf header segment and store crash image data. */
- if (crash_create_elf64_headers(info, &elf_info,
- crash_memory_range, nr_ranges,
- &tmp, &bufsz,
- ELF_CORE_HEADER_ALIGN) < 0)
- return -1;
- /* the size of the elf headers allocated is returned in 'bufsz' */
-
- /* Hack: With some ld versions (GNU ld version 2.14.90.0.4 20030523),
- * vmlinux program headers show a gap of two pages between bss segment
- * and data segment but effectively kernel considers it as bss segment
- * and overwrites the any data placed there. Hence bloat the memsz of
- * elf core header segment to 16K to avoid being placed in such gaps.
- * This is a makeshift solution until it is fixed in kernel.
- */
- if (bufsz < (16*1024))
- /* bufsize is big enough for all the PT_NOTE's and PT_LOAD's */
- memsz = 16*1024;
- /* memsz will be the size of the memory hole we look for */
- else
- memsz = bufsz;
- elfcorehdr = add_buffer(info, tmp, bufsz, memsz, align, min_base,
- max_addr, -1);
- if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0)
- return -1;
- cmdline_add_memmap(mod_cmdline, memmap_p);
- cmdline_add_elfcorehdr(mod_cmdline, elfcorehdr);
-
- /* Inform second kernel about the presence of ACPI tables. */
- for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
- unsigned long start, end;
- if ( !( mem_range[i].type == RANGE_ACPI
- || mem_range[i].type == RANGE_ACPI_NVS) )
- continue;
- start = mem_range[i].start;
- end = mem_range[i].end;
- cmdline_add_memmap_acpi(mod_cmdline, start, end);
- }
- return 0;
-}
-
-int is_crashkernel_mem_reserved(void)
-{
- uint64_t start, end;
-
- return parse_iomem_single("Crash kernel\n", &start, &end) == 0 ?
- (start != end) : 0;
-}
diff --git a/kexec/arch/x86_64/crashdump-x86_64.h b/kexec/arch/x86_64/crashdump-x86_64.h
deleted file mode 100644
index 9392709..0000000
--- a/kexec/arch/x86_64/crashdump-x86_64.h
+++ /dev/null
@@ -1,27 +0,0 @@
-#ifndef CRASHDUMP_X86_64_H
-#define CRASHDUMP_X86_64_H
-
-#include "../../kexec.h"
-
-int load_crashdump_segments(struct kexec_info *info, char *mod_cmdline,
- unsigned long max_addr, unsigned long min_base);
-
-#define __START_KERNEL_map 0xffffffff80000000UL
-
-#define PAGE_OFFSET_PRE_2_6_27 0xffff810000000000UL
-#define PAGE_OFFSET 0xffff880000000000UL
-
-#define MAXMEM 0x3fffffffffffUL
-
-/* Kernel text size */
-#define KERNEL_TEXT_SIZE (512UL*1024*1024)
-
-#define CRASH_MAX_MEMMAP_NR (KEXEC_MAX_SEGMENTS + 1)
-#define CRASH_MAX_MEMORY_RANGES (MAX_MEMORY_RANGES + 2)
-
-/* Backup Region, First 640K of System RAM. */
-#define BACKUP_SRC_START 0x00000000
-#define BACKUP_SRC_END 0x0009ffff
-#define BACKUP_SRC_SIZE (BACKUP_SRC_END - BACKUP_SRC_START + 1)
-
-#endif /* CRASHDUMP_X86_64_H */