All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines
@ 2008-05-02 16:36 Alon Bar-Lev
  2008-05-02 16:50 ` Vesa Jääskeläinen
  0 siblings, 1 reply; 15+ messages in thread
From: Alon Bar-Lev @ 2008-05-02 16:36 UTC (permalink / raw)
  To: grub-devel


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 <alon.barlev@gmail.com>

[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");



^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2008-05-02 21:39 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-02 16:36 [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines Alon Bar-Lev
2008-05-02 16:50 ` Vesa Jääskeläinen
2008-05-02 16:59   ` Alon Bar-Lev
2008-05-02 17:07     ` Vesa Jääskeläinen
2008-05-02 17:17       ` Alon Bar-Lev
2008-05-02 18:04         ` Vesa Jääskeläinen
2008-05-02 18:10           ` Alon Bar-Lev
2008-05-02 18:27             ` Vesa Jääskeläinen
2008-05-02 19:03               ` Alon Bar-Lev
2008-05-02 19:44                 ` Vesa Jääskeläinen
2008-05-02 20:28                   ` Alon Bar-Lev
2008-05-02 20:48                     ` Vesa Jääskeläinen
2008-05-02 21:04                       ` Alon Bar-Lev
2008-05-02 21:17                         ` Alon Bar-Lev
2008-05-02 21:39                           ` [PATCH] " Alon Bar-Lev

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.