mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 08:32:58 +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
|
* 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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue