background image

Vol. 3D 41-97

SGX INSTRUCTION REFERENCES

THEN #PF(DS:RBX); 

FI;

(* Address verification for REPORTDATA (RCX) *)
IF ( (DS:RCX is not 128Byte Aligned) or (DS:RCX is not within CR_ELRANGE) )

THEN #GP(0); FI;

IF (DS:RCX does not resolve within an EPC) 

THEN #P(DS:RCX); FI;

IF (EPCM(DS:RCX). VALID = 0)

THEN #PF(DS:RCX); FI;

IF (EPCM(DS:RCX).BLOCKED = 1) ) 

THEN #PF(DS:RCX); FI;

(* Check page parameters for correctness *)
IF ( (EPCM(DS:RCX).PT ≠ PT_REG) or (EPCM(DS:RCX).ENCLAVESECS ≠ CR_ACTIVE_SECS) or (EPCM(DS:RCX).PENDING = 1) or

(EPCM(DS:RCX).MODIFIED = 1) or (EPCM(DS:RCX).ENCLAVEADDRESS ≠ (DS:RCX & ~0FFFH) ) or (EPCM(DS:RCX).R = 0) ) 
THEN #PF(DS:RCX); 

FI;

(* Address verification for OUTPUTDATA (RDX) *)
IF ( (DS:RDX is not 512Byte Aligned) or (DS:RDX is not within CR_ELRANGE) )

THEN #GP(0); FI;

IF (DS:RDX does not resolve within an EPC) 

THEN #PF(DS:RDX); FI;

IF (EPCM(DS:RDX). VALID = 0)

THEN #PF(DS:RDX); FI;

IF (EPCM(DS:RDX).BLOCKED = 1) ) 

THEN #PF(DS:RDX); FI;

(* Check page parameters for correctness *)
IF ( (EPCM(DS:RDX).PT ≠ PT_REG) or (EPCM(DS:RDX).ENCLAVESECS ≠ CR_ACTIVE_SECS) or

(EPCM(DS:RDX).ENCLAVEADDRESS ≠ (DS:RDX & ~0FFFH) ) or (EPCM(DS:RDX).W = 0) ) 
THEN #PF(DS:RDX); 

FI;

(* REPORT MAC needs to be computed over data which cannot be modified *)
TMP_REPORT.CPUSVN  CR_CPUSVN;
TMP_REPORT.ISVPRODID  TMP_CURRENTSECS.ISVPRODID;
TMP_REPORT.ISVSVN  TMP_CURRENTSECS..ISVSVN;
TMP_REPORT.ATTRIBUTES  TMP_CURRENTSECS.ATTRIBUTES;
TMP_REPORT.REPORTDATA  DS:RCX[511:0];
TMP_REPORT.MRENCLAVE  TMP_CURRENTSECS.MRENCLAVE;
TMP_REPORT.MRSIGNER  TMP_CURRENTSECS.MRSIGNER;
TMP_REPORT.MRRESERVED  0;
TMP_REPORT.KEYID[255:0]  CR_REPORT_KEYID;
TMP_REPORT.MISCSELECT  TMP_CURRENTSECS.MISCSELECT;