From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1LXEWC-0006H6-JQ for mharc-grub-devel@gnu.org; Wed, 11 Feb 2009 07:48:44 -0500 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LXEWA-0006ED-I8 for grub-devel@gnu.org; Wed, 11 Feb 2009 07:48:42 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LXEW8-0006C1-6J for Grub-devel@gnu.org; Wed, 11 Feb 2009 07:48:41 -0500 Received: from [199.232.76.173] (port=43313 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LXEW8-0006By-1E for Grub-devel@gnu.org; Wed, 11 Feb 2009 07:48:40 -0500 Received: from xsmtp0.ethz.ch ([82.130.70.14]:6868) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LXEW7-0007yS-GP for Grub-devel@gnu.org; Wed, 11 Feb 2009 07:48:39 -0500 Received: from xfe0.d.ethz.ch ([82.130.124.40]) by XSMTP0.ethz.ch with Microsoft SMTPSVC(6.0.3790.3959); Wed, 11 Feb 2009 13:48:39 +0100 Received: from [82.130.79.208] ([82.130.79.208]) by xfe0.d.ethz.ch over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Wed, 11 Feb 2009 13:48:38 +0100 Message-ID: <4992C902.4090400@student.ethz.ch> Date: Wed, 11 Feb 2009 13:48:02 +0100 From: Jan Alsenz User-Agent: Thunderbird 2.0.0.19 (X11/20090201) MIME-Version: 1.0 To: Grub-devel@gnu.org References: <4991C150.3090504@student.ethz.ch> In-Reply-To: <4991C150.3090504@student.ethz.ch> X-Enigmail-Version: 0.95.7 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig1EBF9FEE10AA5CA58FAC5502" X-OriginalArrivalTime: 11 Feb 2009 12:48:38.0198 (UTC) FILETIME=[0F2D8D60:01C98C47] X-detected-operating-system: by monty-python.gnu.org: Windows 2000 SP4, XP SP1+ Cc: Subject: Re: [PATCH] Long linux kernel command lines X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Feb 2009 12:48:42 -0000 This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig1EBF9FEE10AA5CA58FAC5502 Content-Type: multipart/mixed; boundary="------------000807060401070603090309" This is a multi-part message in MIME format. --------------000807060401070603090309 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable 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 siz= e. 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! >=20 > I just noticed, that the pc linux loader (loader/i386/pc/linux.c) alway= s > truncates the kernel command line to less than 256 characters. > Well since I needed a longer command line, I fixed this problem. >=20 > 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 ker= nels. >=20 > I tested this on my machine and it worked without a problem with a > 2.6.27 kernel. >=20 > It would be great if you could add this (or something like it), so I ca= n > switch to the official version again. >=20 > Thanks and Regards, >=20 > Jan >=20 --------------000807060401070603090309 Content-Type: text/plain; name="pc_linux_loader.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline; filename="pc_linux_loader.patch" --- 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 #include #include +#include =20 #define GRUB_LINUX_CL_OFFSET 0x9000 #define GRUB_LINUX_CL_END_OFFSET 0x90FF @@ -38,11 +39,15 @@ =20 static grub_size_t linux_mem_size; static int loaded; +static char* kernel_cl_space =3D NULL; +#define GRUB_LINUX_CL_MAX_SIZE 0x1000 /* maximum defined for linux kern= els */ =20 static grub_err_t grub_linux_unload (void) { grub_dl_unref (my_mod); + grub_free(kernel_cl_space); + kernel_cl_space =3D NULL; loaded =3D 0; return GRUB_ERR_NONE; } @@ -119,9 +124,14 @@ lh.loadflags |=3D GRUB_LINUX_FLAG_CAN_USE_HEAP; } =20 - if (grub_le_to_cpu16 (lh.version) >=3D 0x0202) - lh.cmd_line_ptr =3D grub_linux_real_addr + GRUB_LINUX_CL_OFFSET; - else + if (grub_le_to_cpu16 (lh.version) >=3D 0x0202) { + if (grub_le_to_cpu16 (lh.version) >=3D 0x0206) { + kernel_cl_space =3D grub_malloc(lh.cmdline_size+1); + } else { + kernel_cl_space =3D grub_malloc(GRUB_LINUX_CL_MAX_SIZE); + } + lh.cmd_line_ptr =3D kernel_cl_space; + } else { lh.cl_magic =3D grub_cpu_to_le16 (GRUB_LINUX_CL_MAGIC); lh.cl_offset =3D grub_cpu_to_le16 (GRUB_LINUX_CL_OFFSET); @@ -245,16 +255,29 @@ ((GRUB_LINUX_MAX_SETUP_SECTS - setup_sects - 1) << GRUB_DISK_SECTOR_BITS)); =20 + /* Choose the command line area */ + char* cl_end; + if (kernel_cl_space) { + dest =3D kernel_cl_space; + if (grub_le_to_cpu16 (lh.version) >=3D 0x0206) { + cl_end =3D dest + lh.cmdline_size; + } else { + cl_end =3D dest + GRUB_LINUX_CL_MAX_SIZE - 1; + } + } else { + dest =3D grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET; + cl_end =3D grub_linux_tmp_addr + GRUB_LINUX_CL_END_OFFSET; + } + =20 /* Specify the boot file. */ - dest =3D grub_stpcpy (grub_linux_tmp_addr + GRUB_LINUX_CL_OFFSET, + dest =3D grub_stpcpy (dest, "BOOT_IMAGE=3D"); dest =3D grub_stpcpy (dest, argv[0]); =20 /* Copy kernel parameters. */ for (i =3D 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++ =3D ' '; --- 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 fo= r kernel */ + grub_uint8_t relocatable_kernel; /* Whether kernel is relocatable or n= ot */ + grub_uint8_t pad2[3]; /* Unused */ + /* 2.06+ */ + grub_uint32_t cmdline_size; /* Maximum size of the kernel command lin= e */ + /* 2.07+ */ + grub_uint32_t hardware_subarch; /* Hardware subarchitecture */ + grub_uint64_t hardware_subarch_data; /* Subarchitecture-specific data = */ } __attribute__ ((packed)); =20 /* Boot parameters for Linux based on 2.6.12. This is used by the setup --------------000807060401070603090309-- --------------enig1EBF9FEE10AA5CA58FAC5502 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iEYEARECAAYFAkmSyQoACgkQfZylhtn4Xvfn3QCeP6nAV9BKk7KhyN5sq7AikAem WPsAnjpT7bGaQFaVjQxWtZsT+TAwmAgK =KaXA -----END PGP SIGNATURE----- --------------enig1EBF9FEE10AA5CA58FAC5502--