41-104 Vol. 3D
SGX INSTRUCTION REFERENCES
THEN #GP(0); FI;
(* SECS.ATTRIBUTES.XFRM selects the features to be saved. *)
(* CR_XSAVE_PAGE_n: A list of 1 or more physical address of pages that contain the XSAVE area. *)
XRSTOR(TMP_MODE64, SECS.ATTRIBUTES.XFRM, CR_XSAVE_PAGE_n);
IF (XRSTOR failed with #GP)
THEN
DS:RBX.STATE INACTIVE;
#GP(0);
FI;
CR_ENCALVE_MODE 1;
CR_ACTIVE_SECS TMP_SECS;
CR_ELRANGE (TMP_SECS.BASEADDR, TMP_SECS.SIZE);
(* Save sate for possible AEXs *)
CR_TCS_PA Physical_Address (DS:RBX);
CR_TCS_LA RBX;
CR_TCS_LA.AEP RCX;
(* Save the hidden portions of FS and GS *)
CR_SAVE_FS_selector FS.selector;
CR_SAVE_FS_base FS.base;
CR_SAVE_FS_limit FS.limit;
CR_SAVE_FS_access_rights FS.access_rights;
CR_SAVE_GS_selector GS.selector;
CR_SAVE_GS_base GS.base;
CR_SAVE_GS_limit GS.limit;
CR_SAVE_GS_access_rights GS.access_rights;
(* Set CR_ENCLAVE_ENTRY_IP *)
CR_ENCLAVE_ENTRY_IP CRIP”
RIP TMP_TARGET;
Restore_GPRs from DS:TMP_GPR;
(*Restore the RFLAGS values from SSA*)
RFLAGS.CF DS:TMP_GPR.RFLAGS.CF;
RFLAGS.PF DS:TMP_GPR.RFLAGS.PF;
RFLAGS.AF DS:TMP_GPR.RFLAGS.AF;
RFLAGS.ZF DS:TMP_GPR.RFLAGS.ZF;
RFLAGS.SF DS:TMP_GPR.RFLAGS.SF;
RFLAGS.DF DS:TMP_GPR.RFLAGS.DF;
RFLAGS.OF DS:TMP_GPR.RFLAGS.OF;
RFLAGS.NT DS:TMP_GPR.RFLAGS.NT;
RFLAGS.AC DS:TMP_GPR.RFLAGS.AC;
RFLAGS.ID DS:TMP_GPR.RFLAGS.ID;
RFLAGS.RF DS:TMP_GPR.RFLAGS.RF;
RFLAGS.VM 0;
IF (RFLAGS.IOPL = 3)
THEN RFLAGS.IF = DS:TMP_GPR.IF; FI;
IF (TCS.FLAGS.OPTIN = 0)