Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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) { } }
|