windows-nt/Source/XPSP1/NT/base/boot/bd/i386/reboot.c
2020-09-26 16:20:57 +08:00

160 lines
2.5 KiB
C

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
bdreboot.c
Abstract:
System reboot function. Currently part of the debugger because
that's the only place it's used.
Author:
Bryan M. Willman (bryanwi) 4-Dec-90
Revision History:
--*/
#include "bd.h"
VOID
FwStallExecution(
IN ULONG Microseconds
);
#define CMOS_CTRL (PUCHAR )0x70
#define CMOS_DATA (PUCHAR )0x71
#define RESET 0xfe
#define KEYBPORT (PUCHAR )0x64
VOID
HalpReboot (
VOID
)
/*++
Routine Description:
This procedure resets the CMOS clock to the standard timer settings
so the bios will work, and then issues a reset command to the keyboard
to cause a warm boot.
It is very machine dependent, this implementation is intended for
PC-AT like machines.
This code copied from the "old debugger" sources.
N.B.
Will NOT return.
--*/
{
UCHAR Scratch;
PUSHORT Magic;
//
// Turn off interrupts
//
_asm {
cli
}
//
// Reset the cmos clock to a standard value
// (We are setting the periodic interrupt control on the MC147818)
//
//
// Disable periodic interrupt
//
WRITE_PORT_UCHAR(CMOS_CTRL, 0x0b); // Set up for control reg B.
FwStallExecution(1);
Scratch = READ_PORT_UCHAR(CMOS_DATA);
FwStallExecution(1);
Scratch &= 0xbf; // Clear periodic interrupt enable
WRITE_PORT_UCHAR(CMOS_DATA, Scratch);
FwStallExecution(1);
//
// Set "standard" divider rate
//
WRITE_PORT_UCHAR(CMOS_CTRL, 0x0a); // Set up for control reg A.
FwStallExecution(1);
Scratch = READ_PORT_UCHAR(CMOS_DATA);
FwStallExecution(1);
Scratch &= 0xf0; // Clear rate setting
Scratch |= 6; // Set default rate and divider
WRITE_PORT_UCHAR(CMOS_DATA, Scratch);
FwStallExecution(1);
//
// Set a "neutral" cmos address to prevent weirdness
// (Why is this needed? Source this was copied from doesn't say)
//
WRITE_PORT_UCHAR(CMOS_CTRL, 0x15);
FwStallExecution(1);
//
// If we return, send the reset command to the keyboard controller
//
WRITE_PORT_UCHAR(KEYBPORT, RESET);
_asm {
hlt
}
}
VOID
BdReboot (
VOID
)
/*++
Routine Description:
Just calls the HalReturnToFirmware function.
Arguments:
None
Return Value:
Does not return
--*/
{
//
// Never returns from HAL
//
HalpReboot();
while (TRUE) {
}
}