background image

Vol. 3B 15-19

MACHINE-CHECK ARCHITECTURE

Example 15-1.  Machine-Check Initialization Pseudocode

Check CPUID Feature Flags for MCE and MCA support
IF CPU supports MCE
THEN

IF CPU supports MCA
THEN

IF (IA32_MCG_CAP.MCG_CTL_P = 1)

(* IA32_MCG_CTL register is present *)
THEN

IA32_MCG_CTL 

 FFFFFFFFFFFFFFFFH;

(* enables all MCA features *)

FI

IF (IA32_MCG_CAP.MCG_LMCE_P = 1 and IA32_FEATURE_CONTROL.LOCK = 1 and IA32_FEATURE_CONTROL.LMCE_ON= 1)
(* IA32_MCG_EXT_CTL register is present and platform has enabled LMCE to permit system software to use LMCE *)
THEN

IA32_MCG_EXT_CTL 

 IA32_MCG_EXT_CTL | 01H;

(* System software enables LMCE capability for hardware to signal MCE to a single logical processor*)

FI

(* Determine number of error-reporting banks supported *)
COUNT

 IA32_MCG_CAP.Count;

MAX_BANK_NUMBER 

 COUNT - 1;

IF (Processor Family is 6H and Processor EXTMODEL:MODEL is less than 1AH)

THEN

(* Enable logging of all errors except for MC0_CTL register *)
FOR error-reporting banks (1 through MAX_BANK_NUMBER)

DO

IA32_MCi_CTL 

 0FFFFFFFFFFFFFFFFH;

OD

ELSE

(* Enable logging of all errors including MC0_CTL register *)

FOR error-reporting banks (0 through MAX_BANK_NUMBER)
DO

IA32_MCi_CTL 

 0FFFFFFFFFFFFFFFFH;

OD

FI

(* BIOS clears all errors only on power-on reset *)

IF (BIOS detects Power-on reset)
THEN 

FOR error-reporting banks (0 through MAX_BANK_NUMBER)

DO

IA32_MCi_STATUS 

 0;

OD

ELSE

FOR error-reporting banks (0 through MAX_BANK_NUMBER)
DO

(Optional for BIOS and OS) Log valid errors
(OS only) IA32_MCi_STATUS 

 0;

OD

FI

FI

Setup the Machine Check Exception (#MC) handler for vector 18 in IDT

Set the MCE bit (bit 6) in CR4 register to enable Machine-Check Exceptions

FI