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;