summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWANG Chao <chaowang@redhat.com>2014-04-28 21:26:11 +0800
committerSimon Horman <horms@verge.net.au>2014-04-29 10:59:31 +0900
commit91f5b9c0175ef02019f7d7208816373ff7ca8811 (patch)
tree5953c2dc6df88f27d86e47d003ac4301befdc31c
parent90853885a859e42b0ff6935199bf6fceda1c6a87 (diff)
downloadkexec-tools-91f5b9c0175ef02019f7d7208816373ff7ca8811.tar.gz
kdump: pass e820 reserved region to 2nd kernel via e820 table or setup_data
e820 reserved region could be useful in 2nd kernel. For example, PCI mmconf (extended mode) requires reserved region otherwise it falls back to legacy mode. The following log is from Cliff Wickman <cpw@sgi.com>: PCI: MMCONFIG for domain 1003 [bus 3f-3f] at [mem 0xff0ff00000-0xff0fffffff] (base 0xff0c000000) [Firmware Bug]: PCI: MMCONFIG at [mem 0x80000000-0x80cfffff] not reserved in ACPI motherboard resources PCI: not using MMCONFIG PCI devices on segment 1 (>0) can't fall back to legacy mode, thus kernel probing fails and device can't be found. We don't pass reserved region because these regions could be too much and eat up our very limited kernel command line resource in memmap=exactmap case. However now we use e820 map and setup_data to pass memory map to 2nd kernel and the number of reserved regions should not be a problem any more. Signed-off-by: WANG Chao <chaowang@redhat.com> Signed-off-by: Simon Horman <horms@verge.net.au>
-rw-r--r--kexec/arch/i386/crashdump-x86.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/kexec/arch/i386/crashdump-x86.c b/kexec/arch/i386/crashdump-x86.c
index 4a1491b..cc33347 100644
--- a/kexec/arch/i386/crashdump-x86.c
+++ b/kexec/arch/i386/crashdump-x86.c
@@ -300,6 +300,9 @@ static int get_crash_memory_ranges(struct memory_range **range, int *ranges,
type = RANGE_ACPI;
} else if(memcmp(str,"ACPI Non-volatile Storage\n",26) == 0 ) {
type = RANGE_ACPI_NVS;
+ } else if(memcmp(str,"reserved\n",9) == 0 ) {
+ type = RANGE_RESERVED;
+ } else if (memcmp(str, "GART\n", 5) == 0) {
} else if (memcmp(str, "GART\n", 5) == 0) {
gart_start = start;
gart_end = end;
@@ -989,14 +992,15 @@ int load_crashdump_segments(struct kexec_info *info, char* mod_cmdline,
for (i = 0; i < CRASH_MAX_MEMORY_RANGES; i++) {
unsigned long start, end, size, type;
if ( !( mem_range[i].type == RANGE_ACPI
- || mem_range[i].type == RANGE_ACPI_NVS) )
+ || mem_range[i].type == RANGE_ACPI_NVS
+ || mem_range[i].type == RANGE_RESERVED))
continue;
start = mem_range[i].start;
end = mem_range[i].end;
type = mem_range[i].type;
size = end - start + 1;
add_memmap(memmap_p, &nr_memmap, start, size, type);
- if (arch_options.pass_memmap_cmdline)
+ if (arch_options.pass_memmap_cmdline || type != RANGE_RESERVED)
cmdline_add_memmap_acpi(mod_cmdline, start, end);
}