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 <[EMAIL PROTECTED]> [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"); _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel