41-62 Vol. 3D
SGX INSTRUCTION REFERENCES
GOTO ERROR_EXIT;
FI:
TMP_HEADER.EID 0;
(* Obtain EID as an enclave handle for software *)
TMP_PCMD_ENCLAVEID (DS:RCX).EID;
ELSE IF (EPCM(DS:RCX).PT is PT_VA)
TMP_HEADER.EID 0; // Zero is not a special value
(* No enclave handle for VA pages*)
TMP_PCMD_ENCLAVEID 0;
FI;
(* Zero out TMP_HEADER*)
TMP_HEADER[ sizeof(TMP_HEADER)-1 : 0] 0;
TMP_HEADER.LINADDR EPCM(DS:RCX).ENCLAVEADDRESS;
TMP_HEADER.SECINFO.FLAGS.PT EPCM(DS:RCX).PT;
TMP_HEADER.SECINFO.FLAGS.RWX EPCM(DS:RCX).RWX;
TMP_HEADER.SECINFO.FLAGS.PENDING EPCM(DS:RCX).PENDING;
TMP_HEADER.SECINFO.FLAGS.MODIFIED EPCM(DS:RCX).MODIFIED;
TMP_HEADER.SECINFO.FLAGS.PR EPCM(DS:RCX).PR;
(* Encrypt the page, DS:RCX could be encrypted in place. AES-GCM produces 2 values, {ciphertext, MAC}. *)
(* AES-GCM input parameters: key, GCM Counter, MAC_HDR, MAC_HDR_SIZE, SRC, SRC_SIZE)*)
{DS:TMP_SRCPGE, DS:TMP_PCMD.MAC} AES_GCM_ENC(CR_BASE_PK), (TMP_VER << 32),
TMP_HEADER, 128, DS:RCX, 4096);
(* Write the output *)
Zero out DS:TMP_PCMD.SECINFO
DS:TMP_PCMD.SECINFO.FLAGS.PT EPCM(DS:RCX).PT;
DS:TMP_PCMD.SECINFO.FLAGS.RWX EPCM(DS:RCX).RWX;
DS:TMP_PCMD.SECINFO.FLAGS.PENDING EPCM(DS:RCX).PENDING;
DS:TMP_PCMD.SECINFO.FLAGS.MODIFIED EPCM(DS:RCX).MODIFIED;
DS:TMP_PCMD.SECINFO.FLAGS.PR EPCM(DS:RCX).PR;
DS:TMP_PCMD.RESERVED 0;
DS:TMP_PCMD.ENCLAVEID TMP_PCMD_ENCLAVEID;
DS:RBX.LINADDR EPCM(DS:RCX).ENCLAVEADDRESS;
(*Check if version array slot was empty *)
IF ([DS.RDX])
THEN
RAX SGX_VA_SLOT_OCCUPIED
RFLAGS.CF 1;
FI;
(* Write version to Version Array slot *)
[DS.RDX] TMP_VER;
(* Free up EPCM Entry *)
EPCM.(DS:RCX).VALID 0;
EXIT:
Flags Affected
ZF is set if page is not blocked, not tracked, or a child is present. Otherwise cleared.
CF is set if VA slot is previously occupied, Otherwise cleared.