In order to allow appending to the dom0 command line even with boot loaders that only allow editing the kernel (i.e. Xen in our case) command line, support a ''--'' separator option. Signed-off-by: Jan Beulich <jbeulich@novell.com> Index: 2007-06-18/xen/arch/x86/setup.c ==================================================================--- 2007-06-18.orig/xen/arch/x86/setup.c 2007-06-19 11:13:50.000000000 +0200 +++ 2007-06-18/xen/arch/x86/setup.c 2007-06-19 11:26:17.000000000 +0200 @@ -405,7 +405,7 @@ void init_done(void) void __init __start_xen(unsigned long mbi_p) { char *memmap_type = NULL; - char __cmdline[] = "", *cmdline = __cmdline; + char __cmdline[] = "", *cmdline = __cmdline, *kextra; unsigned long _initrd_start = 0, _initrd_len = 0; unsigned int initrdidx = 1; char *_policy_start = NULL; @@ -425,7 +425,7 @@ void __init __start_xen(multiboot_info_t /* Parse the command-line options. */ if ( (mbi->flags & MBI_CMDLINE) && (mbi->cmdline != 0) ) cmdline = __va(mbi->cmdline); - cmdline_parse(cmdline); + kextra = cmdline_parse(cmdline); parse_video_info(); @@ -1005,19 +1005,27 @@ void __init __start_xen(multiboot_info_t /* Grab the DOM0 command line. */ cmdline = (char *)(mod[0].string ? __va(mod[0].string) : NULL); - if ( cmdline != NULL ) + if ( cmdline != NULL || kextra != NULL ) { static char dom0_cmdline[MAX_GUEST_CMDLINE]; - /* Skip past the image name and copy to a local buffer. */ - while ( *cmdline == '' '' ) cmdline++; - if ( (cmdline = strchr(cmdline, '' '')) != NULL ) + if ( cmdline != NULL ) { + /* Skip past the image name and copy to a local buffer. */ while ( *cmdline == '' '' ) cmdline++; - safe_strcpy(dom0_cmdline, cmdline); + if ( (cmdline = strchr(cmdline, '' '')) != NULL ) + { + while ( *cmdline == '' '' ) cmdline++; + safe_strcpy(dom0_cmdline, cmdline); + } } + else + dom0_cmdline[0] = ''\0''; /* Append any extra parameters. */ + if ( kextra != NULL ) + /* Note that kextra already includes a leading space. */ + safe_strcat(dom0_cmdline, kextra); if ( skip_ioapic_setup && !strstr(dom0_cmdline, "noapic") ) safe_strcat(dom0_cmdline, " noapic"); if ( acpi_skip_timer_override && Index: 2007-06-18/xen/common/kernel.c ==================================================================--- 2007-06-18.orig/xen/common/kernel.c 2007-06-18 12:03:19.000000000 +0200 +++ 2007-06-18/xen/common/kernel.c 2007-06-18 12:15:35.000000000 +0200 @@ -24,20 +24,20 @@ int tainted; -void cmdline_parse(char *cmdline) +char *cmdline_parse(char *cmdline) { char opt[100], *optval, *q; const char *p = cmdline; struct kernel_param *param; if ( p == NULL ) - return; + return (char *)p; /* Skip whitespace and the image name. */ while ( *p == '' '' ) p++; if ( (p = strchr(p, '' '')) == NULL ) - return; + return (char *)p; for ( ; ; ) { @@ -57,6 +57,9 @@ void cmdline_parse(char *cmdline) } *q = ''\0''; + if ( strcmp(opt, "--") == 0 ) + return (char *)p; + /* Search for value part of a key=value option. */ optval = strchr(opt, ''=''); if ( optval != NULL ) @@ -87,6 +90,8 @@ void cmdline_parse(char *cmdline) } } } + + return NULL; } /** Index: 2007-06-18/xen/include/xen/lib.h ==================================================================--- 2007-06-18.orig/xen/include/xen/lib.h 2007-06-19 11:25:18.000000000 +0200 +++ 2007-06-18/xen/include/xen/lib.h 2007-06-18 12:15:35.000000000 +0200 @@ -43,7 +43,7 @@ do { struct domain; -void cmdline_parse(char *cmdline); +char *cmdline_parse(char *cmdline); /*#define DEBUG_TRACE_DUMP*/ #ifdef DEBUG_TRACE_DUMP _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel