[Top][All Lists]
[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");
- [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines,
Alon Bar-Lev <=
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Vesa Jääskeläinen, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Alon Bar-Lev, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Vesa Jääskeläinen, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Alon Bar-Lev, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Vesa Jääskeläinen, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Alon Bar-Lev, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Vesa Jääskeläinen, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Alon Bar-Lev, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Vesa Jääskeläinen, 2008/05/02
- Re: [PATCH/DRAFT] Support linux boot protocol >= 2.02 long command-lines, Alon Bar-Lev, 2008/05/02