background image

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)