From 6f0ef76efe0162ea354cd36011cb8bdb1b5e714d Mon Sep 17 00:00:00 2001 From: ReactOS Portable Systems Group Date: Fri, 1 Jan 2010 20:55:15 +0000 Subject: [PATCH] NMI Support Patch 6: [HAL]: Fix NMI recursion issues. [HAL]: Reset the display during NMI and paint the NMI Screen of Death. svn path=/trunk/; revision=44860 --- reactos/hal/halx86/generic/misc.c | 135 +++++++++++++++++++++++------- 1 file changed, 106 insertions(+), 29 deletions(-) diff --git a/reactos/hal/halx86/generic/misc.c b/reactos/hal/halx86/generic/misc.c index d81febb11ea..794ee6a9c6f 100644 --- a/reactos/hal/halx86/generic/misc.c +++ b/reactos/hal/halx86/generic/misc.c @@ -1,25 +1,30 @@ /* - * PROJECT: ReactOS HAL - * LICENSE: GPL - See COPYING in the top level directory - * FILE: hal/halx86/generic/misc.c - * PURPOSE: Miscellanous Routines - * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) - * Eric Kohl (ekohl@abo.rhein-zeitung.de) + * PROJECT: ReactOS Hardware Abstraction Layer (HAL) + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: halx86/generic/misc.c + * PURPOSE: NMI, I/O Mapping and x86 Subs + * PROGRAMMERS: ReactOS Portable Systems Group */ -/* INCLUDES ******************************************************************/ +/* INCLUDES *******************************************************************/ #include #define NDEBUG #include -/* PRIVATE FUNCTIONS *********************************************************/ +/* GLOBALS *******************************************************************/ + +BOOLEAN HalpNMIInProgress; + +/* PRIVATE FUNCTIONS **********************************************************/ VOID NTAPI HalpCheckPowerButton(VOID) { - /* Nothing to do on non-ACPI */ + // + // Nothing to do on non-ACPI + // return; } @@ -28,7 +33,9 @@ NTAPI HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress, IN ULONG NumberPage) { - /* Use kernel memory manager I/O map facilities */ + // + // Use kernel memory manager I/O map facilities + // return MmMapIoSpace(PhysicalAddress, NumberPage << PAGE_SHIFT, MmNonCached); @@ -39,7 +46,9 @@ NTAPI HalpUnmapVirtualAddress(IN PVOID VirtualAddress, IN ULONG NumberPages) { - /* Use kernel memory manager I/O map facilities */ + // + // Use kernel memory manager I/O map facilities + // MmUnmapIoSpace(VirtualAddress, NumberPages << PAGE_SHIFT); } @@ -112,32 +121,96 @@ VOID NTAPI HalHandleNMI(IN PVOID NmiInfo) { - UCHAR ucStatus; + UCHAR NmiStatus; - /* Get the NMI Flag */ - ucStatus = READ_PORT_UCHAR((PUCHAR)0x61); + // + // Don't recurse + // + if (HalpNMIInProgress++) while (TRUE); - /* Display NMI failure string */ - HalDisplayString ("\n*** Hardware Malfunction\n\n"); - HalDisplayString ("Call your hardware vendor for support\n\n"); + // + // Get the NMI Flag + // + NmiStatus = READ_PORT_UCHAR((PUCHAR)0x61); - /* Check for parity error */ - if (ucStatus & 0x80) + // + // Switch to boot vieo + // + if (InbvIsBootDriverInstalled()) { - /* Display message */ - HalDisplayString ("NMI: Parity Check / Memory Parity Error\n"); + // + // Acquire ownership + // + InbvAcquireDisplayOwnership(); + InbvResetDisplay(); + + // + // Fill the screen + // + InbvSolidColorFill(0, 0, 639, 479, 1); + InbvSetScrollRegion(0, 0, 639, 479); + + // + // Enable text + // + InbvSetTextColor(15); + InbvInstallDisplayStringFilter(NULL); + InbvEnableDisplayString(TRUE); } - /* Check for I/O failure */ - if (ucStatus & 0x40) + // + // Display NMI failure string + // + HalDisplayString("\n*** Hardware Malfunction\n\n"); + HalDisplayString("Call your hardware vendor for support\n\n"); + + // + // Check for parity error + // + if (NmiStatus & 0x80) { - /* Display message */ - HalDisplayString ("NMI: Channel Check / IOCHK\n"); + // + // Display message + // + HalDisplayString("NMI: Parity Check / Memory Parity Error\n"); } - /* Halt the system */ + // + // Check for I/O failure + // + if (NmiStatus & 0x40) + { + // + // Display message + // + HalDisplayString("NMI: Channel Check / IOCHK\n"); + } + + // + // Check for EISA systems + // + if (HalpBusType == MACHINE_TYPE_EISA) + { + // + // FIXME: Not supported + // + UNIMPLEMENTED; + } + + // + // Halt the system + // HalDisplayString("\n*** The system has halted ***\n"); - //KeEnterKernelDebugger(); + + // + // Enter the debugger if possible + // + //if (!KdDebuggerNotPresent && KdDebuggerEnabled) KeEnterKernelDebugger(); + + // + // Freeze the system + // + while (TRUE); } /* @@ -149,7 +222,9 @@ HalSystemVectorDispatchEntry(IN ULONG Vector, OUT PKINTERRUPT_ROUTINE **FlatDispatch, OUT PKINTERRUPT_ROUTINE *NoConnection) { - /* Not implemented on x86 */ + // + // Not implemented on x86 + // return 0; } @@ -160,6 +235,8 @@ VOID NTAPI KeFlushWriteBuffer(VOID) { - /* Not implemented on x86 */ + // + // Not implemented on x86 + // return; }