grub-devel
[Top][All Lists]
Advanced

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

Re: [PATCH] Long linux kernel command lines


From: Jan Alsenz
Subject: Re: [PATCH] Long linux kernel command lines
Date: Wed, 11 Feb 2009 13:48:02 +0100
User-agent: Thunderbird 2.0.0.19 (X11/20090201)

Hi again!

I checked the boot protocol documentation and found that since version
2.06 (kernel 2.6.22) there is a field with the supported command line size.

I updated my patch to respect this field if it is present, otherwise the
maximum 4k buffer is used.

Greets,

Jan


Jan Alsenz schrieb:
> Hello!
> 
> I just noticed, that the pc linux loader (loader/i386/pc/linux.c) always
> truncates the kernel command line to less than 256 characters.
> Well since I needed a longer command line, I fixed this problem.
> 
> I found a patch on this list from last year (
> http://lists.gnu.org/archive/html/grub-devel/2008-05/msg00005.html ),
> which apparently was lost in some other discussion.
> I didn't use it, because I think my version works better with older kernels.
> 
> I tested this on my machine and it worked without a problem with a
> 2.6.27 kernel.
> 
> It would be great if you could add this (or something like it), so I can
> switch to the official version again.
> 
> Thanks and Regards,
> 
> Jan
> 
--- loader/i386/pc/linux.c.orig 2009-02-11 10:56:27.000000000 +0100
+++ loader/i386/pc/linux.c      2009-02-11 10:56:38.000000000 +0100
@@ -30,6 +30,7 @@
 #include <grub/rescue.h>
 #include <grub/dl.h>
 #include <grub/cpu/linux.h>
+#include <grub/mm.h>
 
 #define GRUB_LINUX_CL_OFFSET           0x9000
 #define GRUB_LINUX_CL_END_OFFSET       0x90FF
@@ -38,11 +39,15 @@
 
 static grub_size_t linux_mem_size;
 static int loaded;
+static char* kernel_cl_space = NULL;
+#define GRUB_LINUX_CL_MAX_SIZE 0x1000  /* maximum defined for linux kernels */
 
 static grub_err_t
 grub_linux_unload (void)
 {
   grub_dl_unref (my_mod);
+  grub_free(kernel_cl_space);
+  kernel_cl_space = NULL;
   loaded = 0;
   return GRUB_ERR_NONE;
 }
@@ -119,9 +124,14 @@
          lh.loadflags |= GRUB_LINUX_FLAG_CAN_USE_HEAP;
        }
       
-      if (grub_le_to_cpu16 (lh.version) >= 0x0202)
-       lh.cmd_line_ptr = grub_linux_real_addr + GRUB_LINUX_CL_OFFSET;
-      else
+      if (grub_le_to_cpu16 (lh.version) >= 0x0202) {
+          if (grub_le_to_cpu16 (lh.version) >= 0x0206) {
+                 kernel_cl_space = grub_malloc(lh.cmdline_size+1);
+          } else {
+                 kernel_cl_space = grub_malloc(GRUB_LINUX_CL_MAX_SIZE);
+          }
+         lh.cmd_line_ptr = kernel_cl_space;
+      } else
        {
          lh.cl_magic = grub_cpu_to_le16 (GRUB_LINUX_CL_MAGIC);
          lh.cl_offset = grub_cpu_to_le16 (GRUB_LINUX_CL_OFFSET);
@@ -245,16 +255,29 @@
                 ((GRUB_LINUX_MAX_SETUP_SECTS - setup_sects - 1)
                  << GRUB_DISK_SECTOR_BITS));
 
+  /* Choose the command line area */
+  char* cl_end;
+  if (kernel_cl_space) {
+         dest = kernel_cl_space;
+      if (grub_le_to_cpu16 (lh.version) >= 0x0206) {
+         cl_end = dest + lh.cmdline_size;
+      } else {
+         cl_end = dest + GRUB_LINUX_CL_MAX_SIZE - 1;
+      }
+  } else {
+         dest = grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET;
+         cl_end = grub_linux_tmp_addr + GRUB_LINUX_CL_END_OFFSET;
+  }
+  
   /* Specify the boot file.  */
-  dest = grub_stpcpy (grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET,
+  dest = grub_stpcpy (dest,
                      "BOOT_IMAGE=");
   dest = grub_stpcpy (dest, argv[0]);
   
   /* Copy kernel parameters.  */
   for (i = 1;
        i < argc
-        && dest + grub_strlen (argv[i]) + 1 < (grub_linux_tmp_addr
-                                               + GRUB_LINUX_CL_END_OFFSET);
+        && dest + grub_strlen (argv[i]) + 1 < cl_end;
        i++)
     {
       *dest++ = ' ';
--- include/grub/i386/linux.h.orig      2009-02-11 10:43:01.000000000 +0100
+++ include/grub/i386/linux.h   2009-02-11 10:50:33.000000000 +0100
@@ -123,6 +123,15 @@
   grub_uint16_t pad1;                  /* Unused */
   char *cmd_line_ptr;                  /* Points to the kernel command line */
   grub_uint32_t initrd_addr_max;        /* Highest address for initrd */
+  /* 2.05+ */
+  grub_uint32_t kernel_alignment;      /* Physical addr alignment required for 
kernel */
+  grub_uint8_t relocatable_kernel;     /* Whether kernel is relocatable or not 
*/
+  grub_uint8_t pad2[3];                                /* Unused */
+  /* 2.06+ */
+  grub_uint32_t cmdline_size;          /* Maximum size of the kernel command 
line */
+  /* 2.07+ */
+  grub_uint32_t hardware_subarch;      /* Hardware subarchitecture */
+  grub_uint64_t hardware_subarch_data; /* Subarchitecture-specific data */
 } __attribute__ ((packed));
 
 /* Boot parameters for Linux based on 2.6.12. This is used by the setup

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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