From 16ce2a0acf29b62927ee8d0cddbbc17f12832dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 17 Dec 2012 00:22:11 +0000 Subject: [PATCH] [FREELDR] - Effectively reboot instead of exiting the bootloader and hanging. - Do a cold reboot instead of a (soft) warm reboot, to let the user be able to choose another boot support or do anything else, instead of directly rebooting to the bootloader. Rename the concerned function accordingly. svn path=/trunk/; revision=57935 --- reactos/boot/freeldr/freeldr/arch/i386/custom.c | 2 +- reactos/boot/freeldr/freeldr/arch/i386/entry.S | 6 +++--- .../boot/freeldr/freeldr/arch/realmode/amd64.S | 6 +++--- .../freeldr/freeldr/arch/realmode/helpers.inc | 17 +++++++---------- .../boot/freeldr/freeldr/arch/realmode/i386.S | 2 +- reactos/boot/freeldr/freeldr/freeldr.c | 9 +++++++-- .../freeldr/freeldr/include/arch/pc/pcbios.h | 2 +- .../freeldr/freeldr/include/arch/pc/x86common.h | 2 +- reactos/boot/freeldr/freeldr/ui/tui.c | 4 ++-- reactos/boot/freeldr/freeldr/ui/ui.c | 2 +- 10 files changed, 27 insertions(+), 25 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/custom.c b/reactos/boot/freeldr/freeldr/arch/i386/custom.c index 2e754ece57e..b9d1c0d7fa1 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/custom.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/custom.c @@ -359,5 +359,5 @@ VOID OptionMenuReboot(VOID) UiMessageBox("The system will now reboot."); DiskStopFloppyMotor(); - SoftReboot(); + Reboot(); } diff --git a/reactos/boot/freeldr/freeldr/arch/i386/entry.S b/reactos/boot/freeldr/freeldr/arch/i386/entry.S index 63c0a0b3048..795cd40afe0 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/entry.S +++ b/reactos/boot/freeldr/freeldr/arch/i386/entry.S @@ -198,10 +198,10 @@ _PxeCallApi: ret -PUBLIC _SoftReboot -_SoftReboot: +PUBLIC _Reboot +_Reboot: /* Set the function ID */ - mov bx, FNID_SoftReboot + mov bx, FNID_Reboot /*Switch to real mode (We don't return) */ jmp SwitchToReal diff --git a/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S b/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S index 51294e15967..7d35fb684c3 100644 --- a/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S +++ b/reactos/boot/freeldr/freeldr/arch/realmode/amd64.S @@ -50,7 +50,7 @@ Startup: /* Wait for a keypress */ int HEX(16) - jmp SoftReboot + jmp Reboot Msg_Unsupported: .ascii "This CPU is not supported.", CR, LF @@ -330,11 +330,11 @@ LongModeEntryPoint: .long 0, 0 int HEX(16) - jmp SoftReboot + jmp Reboot CallbackTable: .word Int386 - .word SoftReboot + .word Reboot .word ChainLoadBiosBootSectorCode .word PxeCallApi .word PnpBiosGetDeviceNodeCount diff --git a/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc b/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc index dd1fd492748..38fe40c60b6 100644 --- a/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc +++ b/reactos/boot/freeldr/freeldr/arch/realmode/helpers.inc @@ -92,20 +92,17 @@ writehex_common: popfd ret -SoftReboot: - mov ax, HEX(40) - mov ds, ax - mov si, HEX(72) +Reboot: + cli - /* Set the word at location 40:72 to 1234h */ - mov word ptr [si], HEX(1234) + /* Set the word at location 40h:72h to 0 (cold reboot) */ + mov word ptr ds:[HEX(0472)], HEX(0) - /* and jump to location FFFF:0 in ROM */ - ljmp16 HEX(0FFFF), HEX(0000) + /* and jump to location F000h:FFF0h in ROM */ + ljmp16 HEX(0F000), HEX(0FFF0) ChainLoadBiosBootSectorCode: - /* Load segment registers */ cli xor ax, ax @@ -117,4 +114,4 @@ ChainLoadBiosBootSectorCode: mov esp, HEX(7C00) /* Jump to the bootsector code */ - ljmp16 HEX(0000), HEX(7C00) + ljmp16 HEX(0000), HEX(7C00) diff --git a/reactos/boot/freeldr/freeldr/arch/realmode/i386.S b/reactos/boot/freeldr/freeldr/arch/realmode/i386.S index 12c6afc84ee..e4876c84652 100644 --- a/reactos/boot/freeldr/freeldr/arch/realmode/i386.S +++ b/reactos/boot/freeldr/freeldr/arch/realmode/i386.S @@ -142,7 +142,7 @@ pm_entrypoint: callback_table: .word Int386 - .word SoftReboot + .word Reboot .word ChainLoadBiosBootSectorCode .word PxeCallApi .word PnpBiosGetDeviceNodeCount diff --git a/reactos/boot/freeldr/freeldr/freeldr.c b/reactos/boot/freeldr/freeldr/freeldr.c index 6d069b63573..01af41e2219 100644 --- a/reactos/boot/freeldr/freeldr/freeldr.c +++ b/reactos/boot/freeldr/freeldr/freeldr.c @@ -40,13 +40,13 @@ VOID BootMain(LPSTR CmdLine) if (!UiInitialize(FALSE)) { UiMessageBoxCritical("Unable to initialize UI.\n"); - return; + goto quit; } if (!MmInitializeMemoryManager()) { UiMessageBoxCritical("Unable to initialize memory manager"); - return; + goto quit; } #ifdef _M_IX86 @@ -54,6 +54,11 @@ VOID BootMain(LPSTR CmdLine) HalpInitBusHandler(); #endif RunLoader(); + +quit: + /* If we reach this point, something went wrong before, therefore reboot */ + DiskStopFloppyMotor(); + Reboot(); } // We need to emulate these, because the original ones don't work in freeldr diff --git a/reactos/boot/freeldr/freeldr/include/arch/pc/pcbios.h b/reactos/boot/freeldr/freeldr/include/arch/pc/pcbios.h index 3f10198c9cf..b2a2d7900e4 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/pc/pcbios.h +++ b/reactos/boot/freeldr/freeldr/include/arch/pc/pcbios.h @@ -119,7 +119,7 @@ int Int386(int ivec, REGS* in, REGS* out); void EnableA20(void); VOID ChainLoadBiosBootSectorCode(VOID); // Implemented in boot.S -VOID SoftReboot(VOID); // Implemented in boot.S +VOID Reboot(VOID); // Implemented in boot.S VOID DetectHardware(VOID); // Implemented in hardware.c #endif /* ! __ASM__ */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h b/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h index e8c729704dc..91f8c420a0a 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h +++ b/reactos/boot/freeldr/freeldr/include/arch/pc/x86common.h @@ -48,7 +48,7 @@ /* Realmode function IDs */ #define FNID_Int386 0 -#define FNID_SoftReboot 1 +#define FNID_Reboot 1 #define FNID_ChainLoadBiosBootSectorCode 2 #define FNID_PxeCallApi 3 #define FNID_PnpBiosGetDeviceNodeCount 4 diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c index 89e4a391b8d..a9d134f035a 100644 --- a/reactos/boot/freeldr/freeldr/ui/tui.c +++ b/reactos/boot/freeldr/freeldr/ui/tui.c @@ -48,8 +48,8 @@ int TuiPrintf(const char *Format, ...) BOOLEAN TuiInitialize(VOID) { - MachVideoClearScreen(ATTR(COLOR_WHITE, COLOR_BLACK)); MachVideoHideShowTextCursor(FALSE); + MachVideoClearScreen(ATTR(COLOR_GRAY, COLOR_BLACK)); TextVideoBuffer = VideoAllocateOffScreenBuffer(); if (TextVideoBuffer == NULL) @@ -71,7 +71,7 @@ VOID TuiUnInitialize(VOID) MachVideoSetDisplayMode(NULL, FALSE); } - //VideoClearScreen(); + MachVideoClearScreen(ATTR(COLOR_GRAY, COLOR_BLACK)); MachVideoHideShowTextCursor(TRUE); } diff --git a/reactos/boot/freeldr/freeldr/ui/ui.c b/reactos/boot/freeldr/freeldr/ui/ui.c index b43091a2ab6..015491d8bef 100644 --- a/reactos/boot/freeldr/freeldr/ui/ui.c +++ b/reactos/boot/freeldr/freeldr/ui/ui.c @@ -229,7 +229,7 @@ BOOLEAN UiInitialize(BOOLEAN ShowGui) VOID UiUnInitialize(PCSTR BootText) { UiDrawBackdrop(); - UiDrawStatusText("Booting..."); + UiDrawStatusText(BootText); UiInfoBox(BootText); UiVtbl.UnInitialize();