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.
This commit is contained in:
parent
3c5148ff24
commit
30ec0405c4
6 changed files with 85 additions and 5 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
||||||
|
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>
|
2002-03-24 Yoshinori K. Okuji <okuji@enbug.org>
|
||||||
|
|
||||||
* stage2/stage2.c (run_menu): Call cls outside the loop to run
|
* stage2/stage2.c (run_menu): Call cls outside the loop to run
|
||||||
|
|
5
NEWS
5
NEWS
|
@ -17,6 +17,11 @@ New in 0.92:
|
||||||
* The command "terminal" accepts a new option, "--lines=LINES". You can
|
* The command "terminal" accepts a new option, "--lines=LINES". You can
|
||||||
set the maximum number of lines arbitrarily with this option. If you
|
set the maximum number of lines arbitrarily with this option. If you
|
||||||
don't specify it, the maximum number will be 24.
|
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:
|
New in 0.91 - 2002-01-21:
|
||||||
* Support for Linux DAC960 is added.
|
* Support for Linux DAC960 is added.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* boot.c - load and bootstrap a kernel */
|
/* boot.c - load and bootstrap a kernel */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
static int cur_addr;
|
static int cur_addr;
|
||||||
entry_func entry_addr;
|
entry_func entry_addr;
|
||||||
static struct mod_list mll[99];
|
static struct mod_list mll[99];
|
||||||
|
static int linux_mem_size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The next two functions, 'load_image' and 'load_module', are the building
|
* The next two functions, 'load_image' and 'load_module', are the building
|
||||||
|
@ -299,6 +299,60 @@ load_image (char *kernel, char *arg, kernel_t suggested_type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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);
|
memmove ((char *) LINUX_SETUP, buffer, data_len + SECTOR_SIZE);
|
||||||
|
|
||||||
if (lh->header != LINUX_MAGIC_SIGNATURE ||
|
if (lh->header != LINUX_MAGIC_SIGNATURE ||
|
||||||
|
@ -720,7 +774,12 @@ load_initrd (char *initrd)
|
||||||
goto fail;
|
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)
|
if (moveto + len >= LINUX_INITRD_MAX_ADDRESS)
|
||||||
moveto = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000;
|
moveto = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000;
|
||||||
|
|
||||||
|
|
|
@ -948,7 +948,7 @@ safe_parse_maxint (char **str_ptr, int *myint_ptr)
|
||||||
found = 1;
|
found = 1;
|
||||||
if (myint > ((MAXINT - digit) / mult))
|
if (myint > ((MAXINT - digit) / mult))
|
||||||
{
|
{
|
||||||
errnum = ERR_NUMBER_PARSING;
|
errnum = ERR_NUMBER_OVERFLOW;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
myint = (myint * mult) + digit;
|
myint = (myint * mult) + digit;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* common.c - miscellaneous shared variables and routines */
|
/* common.c - miscellaneous shared variables and routines */
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -77,6 +77,7 @@ char *err_list[] =
|
||||||
[ERR_NO_DISK] = "Selected disk does not exist",
|
[ERR_NO_DISK] = "Selected disk does not exist",
|
||||||
[ERR_NO_DISK_SPACE] = "No spare sectors on the disk",
|
[ERR_NO_DISK_SPACE] = "No spare sectors on the disk",
|
||||||
[ERR_NO_PART] = "No such partition",
|
[ERR_NO_PART] = "No such partition",
|
||||||
|
[ERR_NUMBER_OVERFLOW] = "Overflow while parsing number",
|
||||||
[ERR_NUMBER_PARSING] = "Error while parsing number",
|
[ERR_NUMBER_PARSING] = "Error while parsing number",
|
||||||
[ERR_OUTSIDE_PART] = "Attempt to access block outside partition",
|
[ERR_OUTSIDE_PART] = "Attempt to access block outside partition",
|
||||||
[ERR_PRIVILEGED] = "Must be authenticated",
|
[ERR_PRIVILEGED] = "Must be authenticated",
|
||||||
|
|
|
@ -548,6 +548,7 @@ typedef enum
|
||||||
ERR_PRIVILEGED,
|
ERR_PRIVILEGED,
|
||||||
ERR_NEED_SERIAL,
|
ERR_NEED_SERIAL,
|
||||||
ERR_NO_DISK_SPACE,
|
ERR_NO_DISK_SPACE,
|
||||||
|
ERR_NUMBER_OVERFLOW,
|
||||||
|
|
||||||
MAX_ERR_NUM
|
MAX_ERR_NUM
|
||||||
} grub_error_t;
|
} grub_error_t;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue