grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines


From: Alon Bar-Lev
Subject: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines
Date: Fri, 2 May 2008 19:36:01 +0300

Hello,

Continue from bug#13606 [1]

cmd_line_ptr should not be truncated to 256.

A draft patch is provided. I could not test it as grub-2 does not work in my 
VMWare (ATA) configuration.
It enters rescue prompt and when I set root (hd0, 1) I get "error: unknown 
device".
I tried adding many modules (lspci for example) but not see any command when 
typing help.

Please review this patch or apply something better.
For EFI I did not understand what the lh.cl_offset = 0 is for, but as only 
recent boot protocols are
supported I am not sure it is required.

Signed-off-by: Alon Bar-Lev <address@hidden>

[1] https://savannah.gnu.org/bugs/?13606

---

diff -urNp grub-1.96.org/include/grub/i386/linux.h 
grub-1.96/include/grub/i386/linux.h
--- grub-1.96.org/include/grub/i386/linux.h     2007-07-21 21:22:34.000000000 
+0300
+++ grub-1.96/include/grub/i386/linux.h 2008-05-02 19:18:15.000000000 +0300
@@ -41,7 +41,9 @@
 
 #define GRUB_LINUX_CL_OFFSET           0x9000
 #define GRUB_LINUX_CL_END_OFFSET       0x90FF
-#define GRUB_LINUX_SETUP_MOVE_SIZE     0x9100
+#define GRUB_LINUX_CL_0202_OFFSET      0x9100
+#define GRUB_LINUX_CL_0202_END_OFFSET  0x9FFF
+#define GRUB_LINUX_SETUP_MOVE_SIZE     0xA000
 #define GRUB_LINUX_CL_MAGIC            0xA33F
 
 #define GRUB_LINUX_EFI_SIGNATURE       \
diff -urNp grub-1.96.org/loader/i386/efi/linux.c 
grub-1.96/loader/i386/efi/linux.c
--- grub-1.96.org/loader/i386/efi/linux.c       2007-07-22 00:09:47.000000000 
+0300
+++ grub-1.96/loader/i386/efi/linux.c   2008-05-02 19:19:12.000000000 +0300
@@ -391,8 +391,8 @@ grub_rescue_cmd_linux (int argc, char *a
   lh.type_of_loader = 0x50;
 
   lh.cl_magic = GRUB_LINUX_CL_MAGIC;
-  lh.cl_offset = GRUB_LINUX_CL_END_OFFSET;
-  lh.cmd_line_ptr = (char *) real_mode_mem + GRUB_LINUX_CL_OFFSET;
+  lh.cl_offset = 0;
+  lh.cmd_line_ptr = (char *) real_mode_mem + GRUB_LINUX_CL_0202_OFFSET;
   lh.ramdisk_image = 0;
   lh.ramdisk_size = 0;
 
@@ -531,7 +531,7 @@ grub_rescue_cmd_linux (int argc, char *a
       }
 
   /* Specify the boot file.  */
-  dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_OFFSET,
+  dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_0202_OFFSET,
                      "BOOT_IMAGE=");
   dest = grub_stpcpy (dest, argv[0]);
   
@@ -539,7 +539,7 @@ grub_rescue_cmd_linux (int argc, char *a
   for (i = 1;
        i < argc
         && dest + grub_strlen (argv[i]) + 1 < ((char *) real_mode_mem
-                                               + GRUB_LINUX_CL_END_OFFSET);
+                                               + 
GRUB_LINUX_CL_0202_END_OFFSET);
        i++)
     {
       *dest++ = ' ';
diff -urNp grub-1.96.org/loader/i386/pc/linux.c grub-1.96/loader/i386/pc/linux.c
--- grub-1.96.org/loader/i386/pc/linux.c        2008-01-12 02:31:55.000000000 
+0200
+++ grub-1.96/loader/i386/pc/linux.c    2008-05-02 19:20:35.000000000 +0300
@@ -117,7 +117,7 @@ grub_rescue_cmd_linux (int argc, char *a
        }
       
       if (grub_le_to_cpu16 (lh.version) >= 0x0202)
-       lh.cmd_line_ptr = grub_linux_real_addr + GRUB_LINUX_CL_OFFSET;
+       lh.cmd_line_ptr = grub_linux_real_addr + GRUB_LINUX_CL_OFFSET;
       else
        {
          lh.cl_magic = grub_cpu_to_le16 (GRUB_LINUX_CL_MAGIC);
@@ -244,7 +244,7 @@ grub_rescue_cmd_linux (int argc, char *a
                  << GRUB_DISK_SECTOR_BITS));
 
   /* Specify the boot file.  */
-  dest = grub_stpcpy (grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET,
+  dest = grub_stpcpy (grub_linux_tmp_addr + GRUB_LINUX_CL_0202_OFFSET,
                      "BOOT_IMAGE=");
   dest = grub_stpcpy (dest, argv[0]);
   
@@ -252,13 +252,18 @@ grub_rescue_cmd_linux (int argc, char *a
   for (i = 1;
        i < argc
         && dest + grub_strlen (argv[i]) + 1 < (grub_linux_tmp_addr
-                                               + GRUB_LINUX_CL_END_OFFSET);
+                                               + 
GRUB_LINUX_CL_0202_END_OFFSET);
        i++)
     {
       *dest++ = ' ';
       dest = grub_stpcpy (dest, argv[i]);
     }
 
+  grub_strncpy (grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET,
+                grub_linux_tmp_addr + GRUB_LINUX_CL_0202_OFFSET,
+               GRUB_LINUX_CL_END_OFFSET - GRUB_LINUX_CL_OFFSET - 1);
+  *(grub_linux_tmp_addr + GRUB_LINUX_CL_END_OFFSET) = '\0';
+
   len = prot_size;
   if (grub_file_read (file, (char *) GRUB_LINUX_BZIMAGE_ADDR, len) != len)
     grub_error (GRUB_ERR_FILE_READ_ERROR, "Couldn't read file");




reply via email to

[Prev in Thread] Current Thread [Next in Thread]