mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 09:25:10 +00:00
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:
parent
a9786a898d
commit
6f0ef76efe
1 changed files with 106 additions and 29 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue