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

Reply via email to