summaryrefslogtreecommitdiffstats
path: root/private/ntos/nthals/halncr/i386/ncrstop.c
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/nthals/halncr/i386/ncrstop.c
downloadNT4.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.c219
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
+ }
+}