diff --git a/kexec-tools-2.0.3-Load-bzImages-smaller-than-32-KiB.patch b/kexec-tools-2.0.3-Load-bzImages-smaller-than-32-KiB.patch new file mode 100644 index 0000000..42f169f --- /dev/null +++ b/kexec-tools-2.0.3-Load-bzImages-smaller-than-32-KiB.patch @@ -0,0 +1,73 @@ +From 0e4946bc3009e7b9ce6f9d792077eddd7e40cc14 Mon Sep 17 00:00:00 2001 +From: Eric Biggers +Date: Tue, 5 Jun 2012 19:46:07 -0400 +Subject: [PATCH] Load bzImages smaller than 32 KiB + +Allow bzImages smaller than 32KiB to be kexec'ed. + +The current code will fail to load a bzImage smaller than 32768 bytes (sizeof +struct x86_linux_header), but the 'memdisk' program that comes with syslinux is +only about 26 KiB. This patch changes the minimum size to 1024 bytes (2 +sectors), which appears to be the limit that syslinux enforces. + +Removed the "tail" field of struct x86_linux_header because it doesn't seem to +actually be used (is there a reason for it?). + +Also, note that bzImage_probe() was incorrectly using `sizeof (header)', even +though header is a pointer. + +Signed-off-by: Eric Biggers +Signed-off-by: Simon Horman +--- + include/x86/x86-linux.h | 2 -- + kexec/arch/i386/kexec-bzImage.c | 7 +++++-- + 2 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/include/x86/x86-linux.h b/include/x86/x86-linux.h +index 59d35c9..2ebcc3a 100644 +--- a/include/x86/x86-linux.h ++++ b/include/x86/x86-linux.h +@@ -233,7 +233,6 @@ struct x86_linux_header { + uint32_t high_base; /* 0x24C */ + uint32_t high_memsz; /* 0x250 */ + uint32_t high_filesz; /* 0x254 */ +- uint32_t tail[32*1024 - 0x258]; /* 0x258 */ + #else + uint32_t kernel_alignment; /* 0x230 */ + uint8_t relocatable_kernel; /* 0x234 */ +@@ -241,7 +240,6 @@ struct x86_linux_header { + uint32_t cmdline_size; /* 0x238 */ + uint32_t hardware_subarch; /* 0x23C */ + uint64_t hardware_subarch_data; /* 0x240 */ +- uint8_t tail[32*1024 - 0x248]; /* 0x248 */ + #endif + } PACKED; + +diff --git a/kexec/arch/i386/kexec-bzImage.c b/kexec/arch/i386/kexec-bzImage.c +index 54c4427..6998587 100644 +--- a/kexec/arch/i386/kexec-bzImage.c ++++ b/kexec/arch/i386/kexec-bzImage.c +@@ -44,7 +44,10 @@ static const int probe_debug = 0; + int bzImage_probe(const char *buf, off_t len) + { + const struct x86_linux_header *header; +- if ((uintmax_t)len < (uintmax_t)sizeof(header)) { ++ if ((uintmax_t)len < (uintmax_t)(2 * 512)) { ++ if (probe_debug) { ++ fprintf(stderr, "File is too short to be a bzImage!\n"); ++ } + return -1; + } + header = (const struct x86_linux_header *)buf; +@@ -118,7 +121,7 @@ int do_bzImage_load(struct kexec_info *info, + /* + * Find out about the file I am about to load. + */ +- if ((uintmax_t)kernel_len < (uintmax_t)sizeof(setup_header)) { ++ if ((uintmax_t)kernel_len < (uintmax_t)(2 * 512)) { + return -1; + } + memcpy(&setup_header, kernel, sizeof(setup_header)); +-- +1.7.1 + diff --git a/kexec-tools-2.0.3-kdump-pass-acpi_rsdp-to-2nd-kernel-for-efi-booting.patch b/kexec-tools-2.0.3-kdump-pass-acpi_rsdp-to-2nd-kernel-for-efi-booting.patch new file mode 100644 index 0000000..78e8eff --- /dev/null +++ b/kexec-tools-2.0.3-kdump-pass-acpi_rsdp-to-2nd-kernel-for-efi-booting.patch @@ -0,0 +1,82 @@ +From 75d1a16f0b4e5b33e91a51d93014f1fd8303f36e Mon Sep 17 00:00:00 2001 +From: Dave Young +Date: Thu, 18 Oct 2012 11:16:08 +0800 +Subject: [PATCH] kdump: pass acpi_rsdp= to 2nd kernel for efi booting + +In case efi booting, kdump need kernel parameter acpi_rsdp= to retrieve +the acpi root table physical address. + +Add a function cmdline_add_efi to get the address from /sys/firmware/efi/systab +If there's no such file or read fail the function will just do nothing. + +Tested efi boot Fedora 17 on thinkpad T420. + +Some background info for this issue: +http://lists.infradead.org/pipermail/kexec/2010-March/003889.html + +[v1 -> v2]: +Address comments from Khalid and Simon +use fgets instead of read(2) to iterate the file +do not add 'noefi' because kexec does not construct EFI signature +in bootloader signature in boot_params, so kexec'd kernel will +disable EFI automatically even without noefi. + +Signed-off-by: Dave Young +Reviewed-by: Khalid Aziz +Acked-by: "Eric W. Biederman" +Signed-off-by: Simon Horman +--- + kexec/arch/i386/crashdump-x86.c | 35 +++++++++++++++++++++++++++++++++++ + 1 file changed, 35 insertions(+) + +--- kexec-tools-2.0.3.orig/kexec/arch/i386/crashdump-x86.c ++++ kexec-tools-2.0.3/kexec/arch/i386/crashdump-x86.c +@@ -665,6 +665,40 @@ static int cmdline_add_memmap_acpi(char + return 0; + } + ++/* Appends 'acpi_rsdp=' commandline for efi boot crash dump */ ++static void cmdline_add_efi(char *cmdline) ++{ ++ FILE *fp; ++ int cmdlen, len; ++ char line[MAX_LINE], *s; ++ const char *acpis = " acpi_rsdp="; ++ ++ fp = fopen("/sys/firmware/efi/systab", "r"); ++ if (!fp) ++ return; ++ ++ while(fgets(line, sizeof(line), fp) != 0) { ++ /* ACPI20= always goes before ACPI= */ ++ if ((strstr(line, "ACPI20=")) || (strstr(line, "ACPI="))) { ++ line[strlen(line) - 1] = '\0'; ++ s = strchr(line, '='); ++ s += 1; ++ len = strlen(s) + strlen(acpis); ++ cmdlen = strlen(cmdline) + len; ++ if (cmdlen > (COMMAND_LINE_SIZE - 1)) ++ die("Command line overflow\n"); ++ strcat(cmdline, acpis); ++ strcat(cmdline, s); ++ dbgprintf("Command line after adding efi\n"); ++ dbgprintf("%s\n", cmdline); ++ ++ break; ++ } ++ } ++ ++ fclose(fp); ++} ++ + static void get_backup_area(unsigned long *start, unsigned long *end) + { + const char *iomem = proc_iomem(); +@@ -838,6 +872,7 @@ int load_crashdump_segments(struct kexec + if (delete_memmap(memmap_p, elfcorehdr, memsz) < 0) + return -1; + cmdline_add_memmap(mod_cmdline, memmap_p); ++ cmdline_add_efi(mod_cmdline); + cmdline_add_elfcorehdr(mod_cmdline, elfcorehdr); + + /* Inform second kernel about the presence of ACPI tables. */ diff --git a/kexec-tools.spec b/kexec-tools.spec index 610cd3f..9a0f049 100644 --- a/kexec-tools.spec +++ b/kexec-tools.spec @@ -49,6 +49,8 @@ Obsoletes: diskdumputils netdump # # Patches 0 through 100 are meant for x86 kexec-tools enablement # +Patch001: kexec-tools-2.0.3-Load-bzImages-smaller-than-32-KiB.patch +Patch002: kexec-tools-2.0.3-kdump-pass-acpi_rsdp-to-2nd-kernel-for-efi-booting.patch # # Patches 101 through 200 are meant for x86_64 kexec-tools enablement @@ -90,6 +92,8 @@ mkdir -p -m755 kcp tar -z -x -v -f %{SOURCE9} +%patch001 -p1 +%patch002 -p1 %patch301 -p1 %patch601 -p1