* stage2/boot.c (linux_mem_size): New variable.
(load_image): Check a mem= option and set LINUX_MEM_SIZE to the
specified memory size, if any. Otherwise, to zero. When an
overflow is detected, use LINUX_INITRD_MAX_ADDRESS instead.
(load_initrd): If LINUX_MEM_SIZE is non-zero, use it instead of
the actual memory size.
* stage2/char_io.c (safe_parse_maxint): Use ERR_NUMBER_OVERFLOW
instead of ERR_NUMBER_PARSING, when an overflow occurs.
* stage2/common.c [!STAGE1_5] (err_list): Added
ERR_NUMBER_OVERFLOW.
* stage2/shared.h (ERR_NUMBER_OVERFLOW): New constant.
+2002-03-26 Yoshinori K. Okuji <okuji@enbug.org>
+
+ * stage2/boot.c (linux_mem_size): New variable.
+ (load_image): Check a mem= option and set LINUX_MEM_SIZE to the
+ specified memory size, if any. Otherwise, to zero. When an
+ overflow is detected, use LINUX_INITRD_MAX_ADDRESS instead.
+ (load_initrd): If LINUX_MEM_SIZE is non-zero, use it instead of
+ the actual memory size.
+ * stage2/char_io.c (safe_parse_maxint): Use ERR_NUMBER_OVERFLOW
+ instead of ERR_NUMBER_PARSING, when an overflow occurs.
+ * stage2/common.c [!STAGE1_5] (err_list): Added
+ ERR_NUMBER_OVERFLOW.
+ * stage2/shared.h (ERR_NUMBER_OVERFLOW): New constant.
+
2002-03-24 Yoshinori K. Okuji <okuji@enbug.org>
* stage2/stage2.c (run_menu): Call cls outside the loop to run
* The command "terminal" accepts a new option, "--lines=LINES". You can
set the maximum number of lines arbitrarily with this option. If you
don't specify it, the maximum number will be 24.
+* The mem= option for Linux is recognized and used to limit the maximum
+ address of initrd.
+* A fallback entry is executed immediately after a default entry,
+ without prompting a user's intervention, as the manual has ever been
+ saying.
New in 0.91 - 2002-01-21:
* Support for Linux DAC960 is added.
/* boot.c - load and bootstrap a kernel */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2000,2001,2002 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static int cur_addr;
entry_func entry_addr;
static struct mod_list mll[99];
-
+static int linux_mem_size;
/*
* The next two functions, 'load_image' and 'load_module', are the building
lh->vid_mode = vid_mode;
}
}
+
+ /* Check the mem= option to limit memory used for initrd. */
+ {
+ char *mem;
+
+ mem = grub_strstr (arg, "mem=");
+ if (mem)
+ {
+ char *value = mem + 4;
+
+ safe_parse_maxint (&value, &linux_mem_size);
+ switch (errnum)
+ {
+ case ERR_NUMBER_OVERFLOW:
+ /* If an overflow occurs, use the maximum address for
+ initrd instead. This is good, because MAXINT is
+ greater than LINUX_INITRD_MAX_ADDRESS. */
+ linux_mem_size = LINUX_INITRD_MAX_ADDRESS;
+ errnum = ERR_NONE;
+ break;
+
+ case ERR_NONE:
+ {
+ int shift = 0;
+
+ switch (grub_tolower (*value))
+ {
+ case 'g':
+ shift += 10;
+ case 'm':
+ shift += 10;
+ case 'k':
+ shift += 10;
+ default:
+ break;
+ }
+
+ /* Check an overflow. */
+ if (linux_mem_size > (MAXINT >> shift))
+ linux_mem_size = LINUX_INITRD_MAX_ADDRESS;
+ else
+ linux_mem_size <<= shift;
+ }
+ break;
+
+ default:
+ linux_mem_size = 0;
+ errnum = ERR_NONE;
+ break;
+ }
+ }
+ else
+ linux_mem_size = 0;
+ }
memmove ((char *) LINUX_SETUP, buffer, data_len + SECTOR_SIZE);
goto fail;
}
- moveto = ((mbi.mem_upper + 0x400) * 0x400 - len) & 0xfffff000;
+ if (linux_mem_size)
+ moveto = linux_mem_size;
+ else
+ moveto = (mbi.mem_upper + 0x400) << 10;
+
+ moveto = (moveto - len) & 0xfffff000;
if (moveto + len >= LINUX_INITRD_MAX_ADDRESS)
moveto = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000;
found = 1;
if (myint > ((MAXINT - digit) / mult))
{
- errnum = ERR_NUMBER_PARSING;
+ errnum = ERR_NUMBER_OVERFLOW;
return 0;
}
myint = (myint * mult) + digit;
/* common.c - miscellaneous shared variables and routines */
/*
* GRUB -- GRand Unified Bootloader
- * Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+ * Copyright (C) 1999,2000,2001,2002 Free Software Foundation, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
[ERR_NO_DISK] = "Selected disk does not exist",
[ERR_NO_DISK_SPACE] = "No spare sectors on the disk",
[ERR_NO_PART] = "No such partition",
+ [ERR_NUMBER_OVERFLOW] = "Overflow while parsing number",
[ERR_NUMBER_PARSING] = "Error while parsing number",
[ERR_OUTSIDE_PART] = "Attempt to access block outside partition",
[ERR_PRIVILEGED] = "Must be authenticated",
ERR_PRIVILEGED,
ERR_NEED_SERIAL,
ERR_NO_DISK_SPACE,
+ ERR_NUMBER_OVERFLOW,
MAX_ERR_NUM
} grub_error_t;