|
|
|
Re: [PATCH] Add support for longer kernel command lines(i586, x86_64, IA64) | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] | |
Just wondering why no IA64 code in the patch, but mentioned it in the subject.
Thanks
Luming
>-----Original Message-----
>From: fastboot-bounces@xxxxxxxxxxxxxx
>[mailto:fastboot-bounces@xxxxxxxxxxxxxx] On Behalf Of Bernhard Walle
>Sent: 2007年3月6日 6:35
>To: fastboot@xxxxxxxx
>Subject: [PATCH] Add support for longer kernel
>command lines(i586, x86_64, IA64)
>
>This patch increases the kernel command line size for x86_64 and i386
>to 2048 characters. This is necessary because with kernel 2.6.21
>and newer, the kernel command line size has increased and kexec needs
>lot of command line space, so this solves some "command line overflow"
>problems.
>
>To be able to warn users running older kernels that the command line
>is too long (and don't wait that the kernel truncates it), the
>patch tries to get the kernel command line length from the kernel
>image that is loaded if possible by checking the length of the
>static array that holds the kernel command line when booting.
>
>If this is not possible or the command line is not in the range
>[256; 2048], the default value is used (2048).
>
>The patch is against kexec-tools-testing from Simon Horman.
>
>Signed-off-by: Bernhard Walle <bwalle@xxxxxxx>
>
>---
> include/x86/x86-linux.h | 8 ++-----
> kexec/arch/i386/crashdump-x86.c | 36
>++++++++++++++++++++++++++++++++---
> kexec/arch/i386/crashdump-x86.h | 5 ++++
> kexec/arch/i386/kexec-bzImage.c | 8 +++----
> kexec/arch/i386/kexec-elf-x86.c | 8 +++----
> kexec/arch/i386/x86-linux-setup.c | 6 +++--
> kexec/arch/x86_64/crashdump-x86_64.c | 35
>+++++++++++++++++++++++++++++++---
> kexec/arch/x86_64/crashdump-x86_64.h | 3 ++
> kexec/arch/x86_64/kexec-elf-x86_64.c | 11 ++++++----
> 9 files changed, 95 insertions(+), 25 deletions(-)
>
>Index: kexec-tools-snap/include/x86/x86-linux.h
>===================================================================
>--- kexec-tools-snap.orig/include/x86/x86-linux.h
>+++ kexec-tools-snap/include/x86/x86-linux.h
>@@ -148,14 +148,12 @@ struct x86_linux_param_header {
> #endif
> struct e820entry e820_map[E820MAX]; /* 0x2d0 */
> /* 0x550 */
>-#define COMMAND_LINE_SIZE 256
>+#define COMMAND_LINE_SIZE 2048
> };
>
> struct x86_linux_faked_param_header {
>- struct x86_linux_param_header hdr; /* 0x00 */
>- uint8_t reserved16[688]; /* 0x550 */
>- uint8_t command_line[COMMAND_LINE_SIZE]; /* 0x800 */
>- uint8_t reserved17[1792]; /* 0x900 - 0x1000 */
>+ struct x86_linux_param_header hdr;
>+ uint8_t command_line[COMMAND_LINE_SIZE];
> };
>
> struct x86_linux_header {
>Index: kexec-tools-snap/kexec/arch/i386/crashdump-x86.c
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/i386/crashdump-x86.c
>+++ kexec-tools-snap/kexec/arch/i386/crashdump-x86.c
>@@ -46,6 +46,36 @@ static struct memory_range crash_memory_
> /* Memory region reserved for storing panic kernel and other data. */
> static struct memory_range crash_reserved_mem;
>
>+/* real length of the command line from the kernel image,
>needed because
>+ * command line size on x86-64 was increased recently in -mm tree */
>+int real_command_line_size = COMMAND_LINE_SIZE;
>+
>+
>+/* Tries to read the kernel command line size from the symbol table
>+ * of the ELF kernel binary. */
>+void set_command_line_size(struct mem_ehdr *ehdr)
>+{
>+ int ret;
>+ struct mem_sym mem_sym;
>+
>+ /* > 2.6.20-rc6-mm */
>+ ret = elf_rel_find_symbol(ehdr, "saved_command_line", &mem_sym);
>+ if (ret != 0) {
>+ /* older kernel */
>+ ret = elf_rel_find_symbol(ehdr,
>"boot_command_line", &mem_sym);
>+ if (ret != 0) {
>+ return;
>+ }
>+ }
>+
>+ /* current -mm kernel */
>+ if (mem_sym.st_size >= 256 && mem_sym.st_size <
>COMMAND_LINE_SIZE) {
>+ real_command_line_size = mem_sym.st_size;
>+ return;
>+ }
>+}
>+
>+
> /* 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.
>@@ -363,7 +393,7 @@ static int cmdline_add_memmap(char *cmdl
> strcpy(str_mmap, " memmap=exactmap");
> len = strlen(str_mmap);
> cmdlen = strlen(cmdline) + len;
>- if (cmdlen > (COMMAND_LINE_SIZE - 1))
>+ if (cmdlen > (real_command_line_size - 1))
> die("Command line overflow\n");
> strcat(cmdline, str_mmap);
>
>@@ -388,7 +418,7 @@ static int cmdline_add_memmap(char *cmdl
> strcat (str_mmap, "K");
> len = strlen(str_mmap);
> cmdlen = strlen(cmdline) + len;
>- if (cmdlen > (COMMAND_LINE_SIZE - 1))
>+ if (cmdlen > (real_command_line_size - 1))
> die("Command line overflow\n");
> strcat(cmdline, str_mmap);
> }
>@@ -418,7 +448,7 @@ static int cmdline_add_elfcorehdr(char *
> strcat(str, "K");
> len = strlen(str);
> cmdlen = strlen(cmdline) + len;
>- if (cmdlen > (COMMAND_LINE_SIZE - 1))
>+ if (cmdlen > (real_command_line_size - 1))
> die("Command line overflow\n");
> strcat(cmdline, str);
> #if 0
>Index: kexec-tools-snap/kexec/arch/i386/crashdump-x86.h
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/i386/crashdump-x86.h
>+++ kexec-tools-snap/kexec/arch/i386/crashdump-x86.h
>@@ -2,8 +2,11 @@
> #define CRASHDUMP_X86_H
>
> struct kexec_info;
>+struct mem_ehdr;
> int load_crashdump_segments(struct kexec_info *info, char
>*mod_cmdline,
> unsigned long max_addr,
>unsigned long min_base);
>+void set_command_line_size(struct mem_ehdr *ehdr);
>+
>
> #define PAGE_OFFSET 0xc0000000
> #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
>@@ -19,4 +22,6 @@ int load_crashdump_segments(struct kexec
> #define BACKUP_SRC_END 0x0009ffff
> #define BACKUP_SRC_SIZE (BACKUP_SRC_END - BACKUP_SRC_START + 1)
>
>+extern int real_command_line_size;
>+
> #endif /* CRASHDUMP_X86_H */
>Index: kexec-tools-snap/kexec/arch/x86_64/crashdump-x86_64.c
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/x86_64/crashdump-x86_64.c
>+++ kexec-tools-snap/kexec/arch/x86_64/crashdump-x86_64.c
>@@ -50,6 +50,35 @@ static struct crash_elf_info elf_info =
> /* Forward Declaration. */
> static int exclude_crash_reserve_region(int *nr_ranges);
>
>+/* real length of the command line from the kernel image,
>needed because
>+ * command line size on x86-64 was increased recently in -mm tree */
>+int real_command_line_size = COMMAND_LINE_SIZE;
>+
>+
>+/* Tries to read the kernel command line size from the symbol table
>+ * of the ELF kernel binary. */
>+void set_command_line_size(struct mem_ehdr *ehdr)
>+{
>+ int ret;
>+ struct mem_sym mem_sym;
>+
>+ /* > 2.6.20-rc6-mm */
>+ ret = elf_rel_find_symbol(ehdr, "saved_command_line", &mem_sym);
>+ if (ret != 0) {
>+ /* older kernel */
>+ ret = elf_rel_find_symbol(ehdr,
>"boot_command_line", &mem_sym);
>+ if (ret != 0) {
>+ return;
>+ }
>+ }
>+
>+ /* current -mm kernel */
>+ if (mem_sym.st_size >= 256 && mem_sym.st_size <
>COMMAND_LINE_SIZE) {
>+ real_command_line_size = mem_sym.st_size;
>+ return;
>+ }
>+}
>+
> #define KERN_VADDR_ALIGN 0x100000 /* 1MB */
>
> /* Read kernel physical load addr from /proc/iomem (Kernel Code) and
>@@ -494,7 +523,7 @@ static int cmdline_add_memmap(char *cmdl
> strcat (str_mmap, "K");
> len = strlen(str_mmap);
> cmdlen = strlen(cmdline) + len;
>- if (cmdlen > (COMMAND_LINE_SIZE - 1))
>+ if (cmdlen > (real_command_line_size - 1))
> die("Command line overflow\n");
> strcat(cmdline, str_mmap);
> }
>@@ -523,7 +552,7 @@ static int cmdline_add_elfcorehdr(char *
> strcat(str, "K");
> len = strlen(str);
> cmdlen = strlen(cmdline) + len;
>- if (cmdlen > (COMMAND_LINE_SIZE - 1))
>+ if (cmdlen > (real_command_line_size - 1))
> die("Command line overflow\n");
> strcat(cmdline, str);
> #ifdef DEBUG
>@@ -555,7 +584,7 @@ static int cmdline_add_memmap_acpi(char
> strcat (str_mmap, "K");
> len = strlen(str_mmap);
> cmdlen = strlen(cmdline) + len;
>- if (cmdlen > (COMMAND_LINE_SIZE - 1))
>+ if (cmdlen > (real_command_line_size - 1))
> die("Command line overflow\n");
> strcat(cmdline, str_mmap);
>
>Index: kexec-tools-snap/kexec/arch/x86_64/crashdump-x86_64.h
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/x86_64/crashdump-x86_64.h
>+++ kexec-tools-snap/kexec/arch/x86_64/crashdump-x86_64.h
>@@ -3,6 +3,7 @@
>
> int load_crashdump_segments(struct kexec_info *info, char
>*mod_cmdline,
> unsigned long max_addr,
>unsigned long min_base);
>+void set_command_line_size(struct mem_ehdr *ehdr);
>
> #define __START_KERNEL_map 0xffffffff80000000UL
> #define PAGE_OFFSET 0xffff810000000000UL
>@@ -21,4 +22,6 @@ int load_crashdump_segments(struct kexec
> #define BACKUP_SRC_END 0x0009ffff
> #define BACKUP_SRC_SIZE (BACKUP_SRC_END -
>BACKUP_SRC_START + 1)
>
>+extern int real_command_line_size;
>+
> #endif /* CRASHDUMP_X86_64_H */
>Index: kexec-tools-snap/kexec/arch/x86_64/kexec-elf-x86_64.c
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/x86_64/kexec-elf-x86_64.c
>+++ kexec-tools-snap/kexec/arch/x86_64/kexec-elf-x86_64.c
>@@ -166,12 +166,12 @@ int elf_x86_64_load(int argc, char **arg
> * taking crash dumps.
> */
> if (info->kexec_flags & KEXEC_ON_CRASH) {
>- modified_cmdline = xmalloc(COMMAND_LINE_SIZE);
>- memset((void *)modified_cmdline, 0, COMMAND_LINE_SIZE);
>+ modified_cmdline = xmalloc(real_command_line_size);
>+ memset((void *)modified_cmdline, 0,
>real_command_line_size);
> if (command_line) {
> strncpy(modified_cmdline, command_line,
>- COMMAND_LINE_SIZE);
>- modified_cmdline[COMMAND_LINE_SIZE - 1] = '\0';
>+ real_command_line_size);
>+ modified_cmdline[real_command_line_size
>- 1] = '\0';
> }
> modified_cmdline_len = strlen(modified_cmdline);
> }
>@@ -182,6 +182,9 @@ int elf_x86_64_load(int argc, char **arg
> entry = ehdr.e_entry;
> max_addr = elf_max_addr(&ehdr);
>
>+ /* try to set the command line size correctly */
>+ set_command_line_size(&ehdr);
>+
> /* Do we want arguments? */
> if (arg_style != ARG_STYLE_NONE) {
> /* Load the setup code */
>Index: kexec-tools-snap/kexec/arch/i386/kexec-bzImage.c
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/i386/kexec-bzImage.c
>+++ kexec-tools-snap/kexec/arch/i386/kexec-bzImage.c
>@@ -156,12 +156,12 @@ int do_bzImage_load(struct kexec_info *i
> * taking crash dumps.
> */
> if (info->kexec_flags & KEXEC_ON_CRASH) {
>- modified_cmdline = xmalloc(COMMAND_LINE_SIZE);
>- memset((void *)modified_cmdline, 0, COMMAND_LINE_SIZE);
>+ modified_cmdline = xmalloc(real_command_line_size);
>+ memset((void *)modified_cmdline, 0,
>real_command_line_size);
> if (command_line) {
> strncpy(modified_cmdline, command_line,
>- COMMAND_LINE_SIZE);
>- modified_cmdline[COMMAND_LINE_SIZE - 1] = '\0';
>+ real_command_line_size);
>+ modified_cmdline[real_command_line_size
>- 1] = '\0';
> }
>
> /* If panic kernel is being loaded, additional
>segments need
>Index: kexec-tools-snap/kexec/arch/i386/kexec-elf-x86.c
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/i386/kexec-elf-x86.c
>+++ kexec-tools-snap/kexec/arch/i386/kexec-elf-x86.c
>@@ -166,12 +166,12 @@ int elf_x86_load(int argc, char **argv,
> * taking crash dumps.
> */
> if (info->kexec_flags & KEXEC_ON_CRASH) {
>- modified_cmdline = xmalloc(COMMAND_LINE_SIZE);
>- memset((void *)modified_cmdline, 0, COMMAND_LINE_SIZE);
>+ modified_cmdline = xmalloc(real_command_line_size);
>+ memset((void *)modified_cmdline, 0,
>real_command_line_size);
> if (command_line) {
> strncpy(modified_cmdline, command_line,
>- COMMAND_LINE_SIZE);
>- modified_cmdline[COMMAND_LINE_SIZE - 1] = '\0';
>+ real_command_line_size);
>+ modified_cmdline[real_command_line_size
>- 1] = '\0';
> }
> modified_cmdline_len = strlen(modified_cmdline);
> }
>Index: kexec-tools-snap/kexec/arch/i386/x86-linux-setup.c
>===================================================================
>--- kexec-tools-snap.orig/kexec/arch/i386/x86-linux-setup.c
>+++ kexec-tools-snap/kexec/arch/i386/x86-linux-setup.c
>@@ -32,6 +32,8 @@
> #include "kexec-x86.h"
> #include "x86-linux-setup.h"
>
>+extern int real_command_line_size;
>+
> void init_linux_parameters(struct x86_linux_param_header *real_mode)
> {
> /* Fill in the values that are usually provided by the
>kernel. */
>@@ -91,8 +93,8 @@ void setup_linux_bootloader_parameters(
> }
>
> /* Fill in the command line */
>- if (cmdline_len > COMMAND_LINE_SIZE) {
>- cmdline_len = COMMAND_LINE_SIZE;
>+ if (cmdline_len > real_command_line_size) {
>+ cmdline_len = real_command_line_size;
> }
> cmdline_ptr = ((char *)real_mode) + cmdline_offset;
> memcpy(cmdline_ptr, cmdline, cmdline_len);
>_______________________________________________
>fastboot mailing list
>fastboot@xxxxxxxxxxxxxx
>https://lists.osdl.org/mailman/listinfo/fastboot
>
_______________________________________________ fastboot mailing list fastboot@xxxxxxxxxxxxxx https://lists.osdl.org/mailman/listinfo/fastboot
[Netdev] [Linux Wireless] [Kernel Newbies] [Security] [Linux for Hams] [Netfilter] [Bugtraq] [Photo] [Yosemite] [Yosemite Forum] [MIPS Linux] [ARM Linux] [Linux RAID] [Linux Admin] [Samba] [Linux Media] [Linux Resources]