Author: ros-arm-bringup
Date: Fri Jan  1 21:55:15 2010
New Revision: 44860
URL: 
http://svn.reactos.org/svn/reactos?rev=44860&view=rev
Log:
NMI Support Patch 6:
    [HAL]: Fix NMI recursion issues.
    [HAL]: Reset the display during NMI and paint the NMI Screen of Death.
Modified:
    trunk/reactos/hal/halx86/generic/misc.c
Modified: trunk/reactos/hal/halx86/generic/misc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/misc.c?…
==============================================================================
--- trunk/reactos/hal/halx86/generic/misc.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/misc.c [iso-8859-1] Fri Jan  1 21:55:15 2010
@@ -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(a)reactos.org)
- *                  Eric Kohl (ekohl(a)abo.rhein-zeitung.de)
- */
-
-/* INCLUDES ******************************************************************/
+ * 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 *******************************************************************/
 #include <hal.h>
 #define NDEBUG
 #include <debug.h>
-/* 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 @@
 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 @@
 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 @@
 NTAPI
 HalHandleNMI(IN PVOID NmiInfo)
 {
-    UCHAR ucStatus;
-
-    /* Get the NMI Flag */
-    ucStatus = READ_PORT_UCHAR((PUCHAR)0x61);
-
-    /* Display NMI failure string */
-    HalDisplayString ("\n*** Hardware Malfunction\n\n");
-    HalDisplayString ("Call your hardware vendor for support\n\n");
-
-    /* Check for parity error */
-    if (ucStatus & 0x80)
-    {
-        /* Display message */
-        HalDisplayString ("NMI: Parity Check / Memory Parity Error\n");
-    }
-
-    /* Check for I/O failure */
-    if (ucStatus & 0x40)
-    {
-        /* Display message */
-        HalDisplayString ("NMI: Channel Check / IOCHK\n");
-    }
-
-    /* Halt the system */
+    UCHAR NmiStatus;
+
+    //
+    // Don't recurse
+    //
+    if (HalpNMIInProgress++) while (TRUE);
+
+    //
+    // Get the NMI Flag
+    //
+    NmiStatus = READ_PORT_UCHAR((PUCHAR)0x61);
+
+    //
+    // Switch to boot vieo
+    //
+    if (InbvIsBootDriverInstalled())
+    {
+        //
+        // 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);
+    }
+
+    //
+    // 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: Parity Check / Memory Parity Error\n");
+    }
+
+    //
+    // 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 @@
                              OUT PKINTERRUPT_ROUTINE **FlatDispatch,
                              OUT PKINTERRUPT_ROUTINE *NoConnection)
 {
-    /* Not implemented on x86 */
+    //
+    // Not implemented on x86
+    //
     return 0;
 }
@@ -160,6 +235,8 @@
 NTAPI
 KeFlushWriteBuffer(VOID)
 {
-    /* Not implemented on x86 */
+    //
+    // Not implemented on x86
+    //
     return;
 }