background image

15-32 Vol. 3B

MACHINE-CHECK ARCHITECTURE

Example 15-4.  Machine-Check Error Handler Pseudocode Supporting UCR

MACHINE CHECK HANDLER:  (* Called from INT 18 handler *)
NOERROR = TRUE;
ProcessorCount = 0;

IF CPU supports MCA

THEN

RESTARTABILITY = TRUE;

IF (Processor Family = 6 AND DisplayModel ≥ 0EH) OR (Processor Family > 6) 

THEN

IF ( MCG_LMCE = 1)

MCA_BROADCAST = FALSE;

ELSE

MCA_BROADCAST = TRUE;

FI;
Acquire SpinLock; 
ProcessorCount++;  (* Allowing one logical processor at a time to examine machine check registers *)

CALL MCA ERROR PROCESSING; (* returns RESTARTABILITY and NOERROR *)

ELSE 

MCA_BROADCAST = FALSE;

(* Implement a rendezvous mechanism with the other processors if necessary *)
CALL MCA ERROR PROCESSING;

FI;

ELSE (* Pentium(R) processor compatible *)

READ P5_MC_ADDR
READ P5_MC_TYPE;

RESTARTABILITY = FALSE;

FI;

IF NOERROR = TRUE
     THEN

IF NOT (MCG_RIPV = 1 AND MCG_EIPV = 0) 

THEN 

RESTARTABILITY = FALSE;

FI

FI;

IF RESTARTABILITY = FALSE

THEN 

Report RESTARTABILITY to console;
Reset system; 

FI;

IF MCA_BROADCAST = TRUE

THEN

IF ProcessorCount = MAX_PROCESSORS
    AND NOERROR = TRUE

THEN

Report RESTARTABILITY to console;
Reset system;

FI;

Release SpinLock; 
Wait till ProcessorCount = MAX_PROCESSRS on system; 
(* implement a timeout and abort function if necessary *)

FI;
CLEAR IA32_MCG_STATUS;
RESUME Execution;

(* End of MACHINE CHECK HANDLER*)

MCA ERROR PROCESSING:    (* MCA Error Processing Routine called from MCA Handler *)
IF MCIP flag in IA32_MCG_STATUS = 0

THEN (* MCIP=0 upon MCA is unexpected *)

RESTARTABILITY = FALSE;

FI;