[Top][All Lists]
[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
signature.asc
Description: OpenPGP digital signature