diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/nthals/halncr/i386/ncrstop.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/ntos/nthals/halncr/i386/ncrstop.c')
-rw-r--r-- | private/ntos/nthals/halncr/i386/ncrstop.c | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/private/ntos/nthals/halncr/i386/ncrstop.c b/private/ntos/nthals/halncr/i386/ncrstop.c new file mode 100644 index 000000000..31172977b --- /dev/null +++ b/private/ntos/nthals/halncr/i386/ncrstop.c @@ -0,0 +1,219 @@ +/*++ + +Copyright (c) 1992 NCR Corporation + +Module Name: + + ncrstop.c + +Abstract: + + Provides the interface to the firmware for x86. + +Author: + + Richard R. Barton (o-richb) 04-Feb-1992 + +Revision History: + +--*/ +#include "halp.h" +#include "ncr.h" + +/* + * Some plagarism from ixreboot.c + */ + +// +// Defines to let us diddle the CMOS clock and the keyboard +// + +#define CMOS_CTRL (PUCHAR )0x70 +#define CMOS_DATA (PUCHAR )0x71 + + +// below 2 defines are for 3450/3550 machines + +#define SHUT_DOWN 0x8F +#define SHUT5 0x05 + +#define RESET 0xfe +#define KEYBPORT (PUCHAR )0x64 + +extern ULONG NCRPlatform; + +extern BOOLEAN NCRPowerOffSystem; + +// +// Private function prototypes +// + +VOID +HalpReboot ( + VOID + ); + + +VOID +HalReturnToFirmware( + IN FIRMWARE_ENTRY Routine + ) + +/*++ + +Routine Description: + + Returns control to the firmware routine specified. + + BUGBUG This can probably do useful things (like rebooting) for some + values of Routine. + +Arguments: + + Routine - Supplies a value indicating which firmware routine to invoke. + +Return Value: + + Does not return. + +--*/ + +{ + switch (Routine) { + case HalPowerDownRoutine: + if (NCRPlatform != NCR3360) { + HalpCatPowerOffSystem(); + } + + case HalHaltRoutine: + case HalRestartRoutine: + case HalRebootRoutine: + + // + // Never returns + // + + if ((NCRPlatform != NCR3360) && (NCRPowerOffSystem == TRUE)) { + HalpCatPowerOffSystem(); + } else { + HalpVideoReboot(); + HalpReboot(); + } + break; + default: + DBGMSG(("HalReturnToFirmware called\n")); + DbgBreakPoint(); + break; + } +} + + +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; + + // + // By sticking 0x1234 at physical location 0x472, we can bypass the + // memory check after a reboot. + // + + Magic = HalpMapPhysicalMemory(0, 1); + Magic[0x472 / sizeof(USHORT)] = 0x1234; + + // + // Turn off interrupts + // + + HalpAcquireCmosSpinLock(); + + _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. + KeStallExecutionProcessor(1); + + Scratch = READ_PORT_UCHAR(CMOS_DATA); + KeStallExecutionProcessor(1); + + Scratch &= 0xbf; // Clear periodic interrupt enable + + WRITE_PORT_UCHAR(CMOS_DATA, Scratch); + KeStallExecutionProcessor(1); + + // + // Set "standard" divider rate + // + + WRITE_PORT_UCHAR(CMOS_CTRL, 0x0a); // Set up for control reg A. + KeStallExecutionProcessor(1); + + Scratch = READ_PORT_UCHAR(CMOS_DATA); + KeStallExecutionProcessor(1); + + Scratch &= 0xf0; // Clear rate setting + Scratch |= 6; // Set default rate and divider + + WRITE_PORT_UCHAR(CMOS_DATA, Scratch); + KeStallExecutionProcessor(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); + KeStallExecutionProcessor(1); + + // + // for 3450/3550 machines - Set shutdown flag to reset + // + + if ((NCRPlatform == NCR3450) || (NCRPlatform == NCR3550)) { + WRITE_PORT_UCHAR(CMOS_CTRL, SHUT_DOWN); + WRITE_PORT_UCHAR(CMOS_DATA, SHUT5); + } + + // + // Send the reset command to the keyboard controller + // + + WRITE_PORT_UCHAR(KEYBPORT, RESET); + + _asm { + hlt + } +} |