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
This commit is contained in:
ReactOS Portable Systems Group 2010-01-01 20:55:15 +00:00
parent a9786a898d
commit 6f0ef76efe

View file

@ -1,25 +1,30 @@
/* /*
* PROJECT: ReactOS HAL * PROJECT: ReactOS Hardware Abstraction Layer (HAL)
* LICENSE: GPL - See COPYING in the top level directory * LICENSE: BSD - See COPYING.ARM in the top level directory
* FILE: hal/halx86/generic/misc.c * FILE: halx86/generic/misc.c
* PURPOSE: Miscellanous Routines * PURPOSE: NMI, I/O Mapping and x86 Subs
* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) * PROGRAMMERS: ReactOS Portable Systems Group
* Eric Kohl (ekohl@abo.rhein-zeitung.de)
*/ */
/* INCLUDES ******************************************************************/ /* INCLUDES *******************************************************************/
#include <hal.h> #include <hal.h>
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
/* PRIVATE FUNCTIONS *********************************************************/ /* GLOBALS *******************************************************************/
BOOLEAN HalpNMIInProgress;
/* PRIVATE FUNCTIONS **********************************************************/
VOID VOID
NTAPI NTAPI
HalpCheckPowerButton(VOID) HalpCheckPowerButton(VOID)
{ {
/* Nothing to do on non-ACPI */ //
// Nothing to do on non-ACPI
//
return; return;
} }
@ -28,7 +33,9 @@ NTAPI
HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress, HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
IN ULONG NumberPage) IN ULONG NumberPage)
{ {
/* Use kernel memory manager I/O map facilities */ //
// Use kernel memory manager I/O map facilities
//
return MmMapIoSpace(PhysicalAddress, return MmMapIoSpace(PhysicalAddress,
NumberPage << PAGE_SHIFT, NumberPage << PAGE_SHIFT,
MmNonCached); MmNonCached);
@ -39,7 +46,9 @@ NTAPI
HalpUnmapVirtualAddress(IN PVOID VirtualAddress, HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
IN ULONG NumberPages) IN ULONG NumberPages)
{ {
/* Use kernel memory manager I/O map facilities */ //
// Use kernel memory manager I/O map facilities
//
MmUnmapIoSpace(VirtualAddress, NumberPages << PAGE_SHIFT); MmUnmapIoSpace(VirtualAddress, NumberPages << PAGE_SHIFT);
} }
@ -112,32 +121,96 @@ VOID
NTAPI NTAPI
HalHandleNMI(IN PVOID NmiInfo) 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"); // Get the NMI Flag
HalDisplayString ("Call your hardware vendor for support\n\n"); //
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"); 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 **FlatDispatch,
OUT PKINTERRUPT_ROUTINE *NoConnection) OUT PKINTERRUPT_ROUTINE *NoConnection)
{ {
/* Not implemented on x86 */ //
// Not implemented on x86
//
return 0; return 0;
} }
@ -160,6 +235,8 @@ VOID
NTAPI NTAPI
KeFlushWriteBuffer(VOID) KeFlushWriteBuffer(VOID)
{ {
/* Not implemented on x86 */ //
// Not implemented on x86
//
return; return;
} }