[2.4][2.5][Trivial Patch] Bug in i386/kernel/process.c?
I was poking into how to force a warm boot (found it easily enough) and started reading process.c, where the details live.
We have:
static int reboot_mode;
int reboot_thru_bios;
static int __init reboot_setup(char *str)
{
...set reboot_mode/reboot_thru_bios according to reboot=... }__setup("reboot=", reboot_setup);
Farther down:
/* Write 0x1234 to absolute memory location 0x472. The BIOS
reads
this on booting to tell it to "Bypass memory test (also warm boot)". This seems like a fairly standard thing that gets
set by
REBOOT.COM programs, and the previous reset routine did this too. */
*((unsigned short *)0x472) = reboot_mode;
(similar code farther down in !reboot_thru_bios)
....but reboot_mode doesn't seem to be initialized if you don't set it via reboot=...? (Same for reboot_thru_bios)
A simple patch to use the defaults (according to the code comments) is below; if this is right please push accordingly:
Its against 2.4 but should apply to 2.5 as well.
arch/i386/kernel/process.c 2003-07-03 12:16:46.000000000 -0400 renamed from arch/i386/kernel/process.c.orig 2003-07-03 12:15:36.000000000 -0400 +2 -2
@@ -152,8 +152,8 @@ __setup("idle=", idle_setup); static long no_idt[2]; -static int reboot_mode; -int reboot_thru_bios; +static int reboot_mode = 0x1234; +int reboot_thru_bios = 1; #ifdef CONFIG_SMP int reboot_smp = 0;
Signature · 1 line
Disconnect <[email protected]>
Er, that patch won't apply to 2.5 - the code is the same, but its moved to reboot.c.
Same change, diff't file/offset.
Quoted 45 lines · Disconnect
I was poking into how to force a warm boot (found it easily enough) and started reading
process.c, where the details live.We have:
static intreboot_mode;
intreboot_thru_bios;static int
__initreboot_setup(char *str)
{
...set reboot_mode/reboot_thru_bios according to reboot=... }__setup("reboot=", reboot_setup);Farther down:
/* Write 0x1234 to absolute memory location 0x472. The BIOSreads
this on booting to tell it to "Bypass memory test (also warm boot)". This seems like a fairly standard thing that gets
set by
REBOOT.COM programs, and the previous reset routine did this too. */*((unsigned short *)0x472) =
reboot_mode;
(similar code farther down in !reboot_thru_bios)....but
reboot_modedoesn't seem to be initialized if you don't set it via reboot=...? (Same forreboot_thru_bios)A simple patch to use the defaults (according to the code comments) is below; if this is right please push accordingly:
Its against 2.4 but should apply to 2.5 as well.
arch/i386/kernel/process.c 2003-07-03 12:16:46.000000000 -0400 renamed from arch/i386/kernel/process.c.orig 2003-07-03 12:15:36.000000000 -0400 +2
-2@@ -152,8 +152,8 @@ __setup("idle=", idle_setup); static long no_idt[2]; -static int reboot_mode; -int reboot_thru_bios; +static int reboot_mode = 0x1234; +int reboot_thru_bios = 1; #ifdef CONFIG_SMP int reboot_smp = 0;
Signature · 1 line
Disconnect <[email protected]>