background image

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.