background image

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;