155 lines
2.9 KiB
C
155 lines
2.9 KiB
C
/*++
|
||
|
||
Copyright (c) 1994 Digital Equipment Corporation
|
||
|
||
Module Name:
|
||
|
||
alcorerr.c
|
||
|
||
Abstract:
|
||
|
||
This module implements error handling (machine checks and error
|
||
interrupts) for the Alcor platform.
|
||
|
||
Author:
|
||
|
||
Joe Notarangelo 27-Jul-1994
|
||
|
||
Environment:
|
||
|
||
Kernel mode only.
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "halp.h"
|
||
#include "alcor.h"
|
||
|
||
//
|
||
// Declare the extern variable UncorrectableError declared in
|
||
// inithal.c.
|
||
//
|
||
extern PERROR_FRAME PUncorrectableError;
|
||
|
||
|
||
//
|
||
// Function prototypes.
|
||
//
|
||
|
||
VOID
|
||
HalpSetMachineCheckEnables(
|
||
IN BOOLEAN DisableMachineChecks,
|
||
IN BOOLEAN DisableProcessorCorrectables,
|
||
IN BOOLEAN DisableSystemCorrectables
|
||
);
|
||
|
||
BOOLEAN
|
||
HalHandleNMI(
|
||
IN PKINTERRUPT Interrupt,
|
||
IN PVOID ServiceContext
|
||
);
|
||
|
||
|
||
VOID
|
||
HalpAlcorErrorInterrupt(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is the interrupt handler for an ALCOR machine check interrupt
|
||
The function calls HalpCiaReportFatalError()
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None. If a Fatal Error is detected the system is crashed.
|
||
|
||
--*/
|
||
{
|
||
|
||
HalAcquireDisplayOwnership(NULL);
|
||
|
||
//
|
||
// Display the dreaded banner.
|
||
//
|
||
|
||
HalDisplayString( "\nFatal system hardware error.\n\n" );
|
||
|
||
//
|
||
// If this is a CIA uncorrectable error then report the error and
|
||
// crash the system.
|
||
//
|
||
|
||
if( HalpCiaUncorrectableError() == TRUE ){
|
||
|
||
HalpCiaReportFatalError();
|
||
|
||
KeBugCheckEx( DATA_BUS_ERROR,
|
||
0xfacefeed, //jnfix - quick error interrupt id
|
||
0,
|
||
0,
|
||
(ULONG)PUncorrectableError );
|
||
|
||
}
|
||
|
||
//
|
||
// It was not a CIA uncorrectable error, therefore this must be an
|
||
// NMI interrupt.
|
||
//
|
||
|
||
HalHandleNMI( NULL, NULL );
|
||
|
||
return; // never
|
||
|
||
}
|
||
|
||
|
||
BOOLEAN
|
||
HalpPlatformMachineCheck(
|
||
IN PEXCEPTION_RECORD ExceptionRecord,
|
||
IN PKEXCEPTION_FRAME ExceptionFrame,
|
||
IN PKTRAP_FRAME TrapFrame
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine is given control when an hard error is acknowledged
|
||
by the CIA chipset. The routine is given the chance to
|
||
correct and dismiss the error.
|
||
|
||
Arguments:
|
||
|
||
ExceptionRecord - Supplies a pointer to the exception record generated
|
||
at the point of the exception.
|
||
|
||
ExceptionFrame - Supplies a pointer to the exception frame generated
|
||
at the point of the exception.
|
||
|
||
TrapFrame - Supplies a pointer to the trap frame generated
|
||
at the point of the exception.
|
||
|
||
Return Value:
|
||
|
||
TRUE is returned if the machine check has been handled and dismissed -
|
||
indicating that execution can continue. FALSE is return otherwise.
|
||
|
||
--*/
|
||
{
|
||
|
||
//
|
||
// All machine check handling on Alcor is determined by the CIA.
|
||
//
|
||
|
||
return( HalpCiaMachineCheck( ExceptionRecord,
|
||
ExceptionFrame,
|
||
TrapFrame ) );
|
||
|
||
}
|