background image

40-6 Vol. 3D

ENCLAVE EXITING EVENTS

(* Restore the FS and GS *)
FS.selector  CR_SAVE_FS.selector;
FS.base  CR_SAVE_FS.base;
FS.limit  CR_SAVE_FS.limit;
FS.access_rights  CR_SAVE_FS.access_rights;
GS.selector  CR_SAVE_GS.selector;
GS.base  CR_SAVE_GS.base;
GS.limit  CR_SAVE_GS.limit;
GS.access_rights  CR_SAVE_GS.access_rights;

(* Examine exception code and update enclave internal states*)
exception_code  Exception or interrupt vector;

(* Indicate the exit reason in SSA *)
IF (exception_code = (#DE OR #DB OR #BP OR #BR OR #UD OR #MF OR #AC OR #XM ))

THEN

CR_GPR_PA.EXITINFO.VECTOR  exception_code;
IF (exception code = #BP)

THEN CR_GPR_PA.EXITINFO.EXIT_TYPE  6;
ELSE CR_GPR_PA.EXITINFO.EXIT_TYPE  3;

FI;
CR_GPR_PA.EXITINFO.VALID  1;

ELSE IF (exception_code is #PF or #GP )

THEN 
(* Check SECS.MISCSELECT using CR_ACTIVE_SECS *) 
IF (SECS.MISCSELECT[0] is set) 

THEN 
CR_GPR_PA.EXITINFO.VECTOR  exception_code; 
CR_GPR_PA.EXITINFO.EXIT_TYPE  3; 
IF (exception_code is #PF) 

THEN 

SSA.MISC.EXINFO. MADDR  CR2; 
SSA.MISC.EXINFO.ERRCD  PFEC; 
SSA.MISC.EXINFO.RESERVED  0; 

ELSE

SSA.MISC.EXINFO. MADDR  0; 
SSA.MISC.EXINFO.ERRCD  GPEC; 
SSA.MISC.EXINFO.RESERVED  0; 

FI; 
CR_GPR_PA.EXITINFO.VALID  1; 

FI;

ELSE

CR_GPR_PA.EXITINFO.VECTOR  0;
CR_GPR_PA.EXITINFO.EXIT_TYPE  0
CR_GPR_PA.REASON.VALID  0;

FI;

(* Execution will resume at the AEP *)
RIP  CR_TCS_PA.AEP;

(* Set EAX to the ERESUME leaf index *)
EAX  3;