According to multiboot specification "It should be possible to write compliant boot loaders that load the OS image from a variety of sources, including floppy disk, hard disk, and across a network. " It implicitly says that kernel shouldn't care about filename used by bootloader. About commandline it's only said: "If bit 2 of the `flags' longword is set, the `cmdline' field is valid, and contains the physical address of the command line to be passed to the kernel. The command line is a normal C-style zero-terminated string" Currently grub however passes filename as first argument of command line. Felix Zielcke did a series of tests and it revealed that OSes subdivide into two categories: 1) Ones that don't care whether this argument is omitted altogether or not (e.g. the don't ignore second argument even if filename is omitted) 2) Solaris (for kernel name) and AROS (for module name) both assume that filename is the same under grub and OS. This assumption isn't necessarily true. These OSes are broken one way or another. If we omit the first argument user can workaround the problem by supplying kernel/module OS image name as first argument of multiboot/module command line E.g. multiboot /RPOOL/opensolaris/@/platform/i86pc/kernel /platform/i86pc/kernel -- Regards Vladimir 'phcoder' Serbinenko
Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/ChangeLog b/ChangeLog index e553828..429bb75 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-08-01 Vladimir Serbinenko <phco...@gmail.com> + + * loader/i386/multiboot.c (grub_multiboot): Don't pass filename to + payload. + (grub_module): Likewise. + 2009-07-31 Vladimir Serbinenko <phco...@gmail.com> * partmap/pc.c (pc_partition_map_iterate): Check that boot flags are diff --git a/loader/i386/multiboot.c b/loader/i386/multiboot.c index 87ffcae..f25f77b 100644 --- a/loader/i386/multiboot.c +++ b/loader/i386/multiboot.c @@ -257,9 +257,12 @@ grub_multiboot (int argc, char *argv[]) mmap_length = grub_get_multiboot_mmap_len (); /* Figure out cmdline length. */ - for (i = 0, cmdline_length = 0; i < argc; i++) + for (i = 1, cmdline_length = 0; i < argc; i++) cmdline_length += grub_strlen (argv[i]) + 1; + if (cmdline_length == 0) + cmdline_length = 1; + boot_loader_name_length = sizeof(PACKAGE_STRING); #define cmdline_addr(x) ((void *) ((x) + code_size)) @@ -351,14 +354,16 @@ grub_multiboot (int argc, char *argv[]) if (! cmdline) goto fail; - for (i = 0; i < argc; i++) + for (i = 1; i < argc; i++) { p = grub_stpcpy (p, argv[i]); *(p++) = ' '; } /* Remove the space after the last word. */ - *(--p) = '\0'; + if (p != cmdline) + p--; + *p = 0; mbi->flags |= MULTIBOOT_INFO_CMDLINE; mbi->cmdline = (grub_uint32_t) cmdline_addr (grub_multiboot_payload_dest); @@ -422,9 +427,12 @@ grub_module (int argc, char *argv[]) goto fail; } - for (i = 0; i < argc; i++) + for (i = 1; i < argc; i++) len += grub_strlen (argv[i]) + 1; + if (len == 0) + len = 1; + cmdline = p = grub_malloc (len); if (! cmdline) goto fail; @@ -436,7 +444,9 @@ grub_module (int argc, char *argv[]) } /* Remove the space after the last word. */ - *(--p) = '\0'; + if (p != cmdline) + p--; + *p = '\0'; if (mbi->flags & MULTIBOOT_INFO_MODS) {
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel