grub-devel
[Top][All Lists]
Advanced

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

[PATCH] Long linux kernel command lines


From: Jan Alsenz
Subject: [PATCH] Long linux kernel command lines
Date: Tue, 10 Feb 2009 19:02:56 +0100
User-agent: Thunderbird 2.0.0.19 (X11/20090201)

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-10 17:45:05.000000000 +0100
+++ loader/i386/pc/linux.c      2009-02-10 17:25:22.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,10 @@
          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) {
+         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 +251,25 @@
                 ((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;
+         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++ = ' ';

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

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