From 065f6e0a2064140743f86370f3d5c5e680f39858 Mon Sep 17 00:00:00 2001 From: proski Date: Mon, 29 Mar 2004 14:54:30 +0000 Subject: [PATCH] * stage2/boot.c: Imply --no-mem-option for Linux kernels with protocol version 2.03 and above (Linux 2.4.18 and newer). --- ChangeLog | 5 +++++ NEWS | 1 + docs/grub.texi | 2 +- stage2/boot.c | 18 ++++++++++++++++-- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb0f8167d..673b96419 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-03-28 Pavel Roskin + + * stage2/boot.c: Imply --no-mem-option for Linux kernels with + protocol version 2.03 and above (Linux 2.4.18 and newer). + 2004-03-27 Yoshinori K. Okuji * stage2/char_io.c [!GRUB_UTIL] (memcpy): New function. It is diff --git a/NEWS b/NEWS index ecb841ca4..988a257dd 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,7 @@ New: * Support ATARAID for Linux in the grub shell and grub-install. * Add CDROM support for El Torito with no emulation mode. You can use (cd) as a CDROM drive in the config file. +* Option --no-mem-option is implied for Linux 2.4.18 and newer. New in 0.94 - 2004-01-25: * Support building on x86-64 with gcc -m32. diff --git a/docs/grub.texi b/docs/grub.texi index 5f8f62e59..e0096be99 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -2735,7 +2735,7 @@ a kernel type in the other cases, quite safely. The option @option{--no-mem-option} is effective only for Linux. If the option is specified, GRUB doesn't pass the option @option{mem=} to the -kernel. +kernel. This option is implied for Linux kernels 2.4.18 and newer. @end deffn diff --git a/stage2/boot.c b/stage2/boot.c index b49f9fe97..4185d23e3 100644 --- a/stage2/boot.c +++ b/stage2/boot.c @@ -407,10 +407,24 @@ load_image (char *kernel, char *arg, kernel_t suggested_type, while (dest < linux_data_tmp_addr + LINUX_CL_END_OFFSET && *src) *(dest++) = *(src++); - /* Add a mem option automatically only if the user doesn't - specify it explicitly. */ + /* Old Linux kernels have problems determining the amount of + the available memory. To work around this problem, we add + the "mem" option to the kernel command line. This has its + own drawbacks because newer kernels can determine the + memory map more accurately. Boot protocol 2.03, which + appeared in Linux 2.4.18, provides a pointer to the kernel + version string, so we could check it. But since kernel + 2.4.18 and newer are known to detect memory reliably, boot + protocol 2.03 already implies that the kernel is new + enough. The "mem" option is added if neither of the + following conditions is met: + 1) The "mem" option is already present. + 2) The "kernel" command is used with "--no-mem-option". + 3) GNU GRUB is configured not to pass the "mem" option. + 4) The kernel supports boot protocol 2.03 or newer. */ if (! grub_strstr (arg, "mem=") && ! (load_flags & KERNEL_LOAD_NO_MEM_OPTION) + && lh->version < 0x0203 /* kernel version < 2.4.18 */ && dest + 15 < linux_data_tmp_addr + LINUX_CL_END_OFFSET) { *dest++ = ' ';