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
* 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 <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 @@ 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;
}