41-78 Vol. 3D
SGX INSTRUCTION REFERENCES
(* Save state 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;
(* If XSAVE is enabled, save XCR0 and replace it with SECS.ATTRIBUTES.XFRM*)
IF (CR4.OSXSAVE = 1)
CR_SAVE_XCR0 XCR0;
XCR0 TMP_SECS.ATTRIBUTES.XFRM;
FI;
(* Set CR_ENCLAVE_ENTRY_IP *)
CR_ENCLAVE_ENTRY_IP CRIP”
RIP NRIP;
RAX (DS:RBX).CSSA;
(* Save the outside RSP and RBP so they can be restored on interrupt or EEXIT *)
DS:TMP_SSA.U_RSP RSP;
DS:TMP_SSA.U_RBP RBP;
(* Do the FS/GS swap *)
FS.base TMP_FSBASE;
FS.limit DS:RBX.FSLIMIT;
FS.type 0001b;
FS.W DS.W;
FS.S 1;
FS.DPL DS.DPL;
FS.G 1;
FS.B 1;
FS.P 1;
FS.AVL DS.AVL;
FS.L DS.L;
FS.unusable 0;
FS.selector 0BH;
GS.base TMP_GSBASE;
GS.limit DS:RBX.GSLIMIT;
GS.type 0001b;
GS.W DS.W;
GS.S 1;
GS.DPL DS.DPL;
GS.G 1;
GS.B 1;
GS.P 1;
GS.AVL DS.AVL;