ソースを参照

[Pal/Linux-SGX] Use common code path to clear regs and then EEXIT

Simon Gaiser 6 年 前
コミット
19fb0d2d89
1 ファイル変更30 行追加15 行削除
  1. 30 15
      Pal/src/host/Linux-SGX/enclave_entry.S

+ 30 - 15
Pal/src/host/Linux-SGX/enclave_entry.S

@@ -120,8 +120,8 @@ enclave_entry:
 
 	# exit address in RDX, mov it to RBX
 	movq %rdx, %rbx
-	movq $EEXIT, %rax
-	ENCLU
+
+	jmp .Lclear_and_eexit
 
 .Lhandle_exception:
 	# If this enclave thread has not been initialized yet, we should not
@@ -226,9 +226,36 @@ enclave_entry:
 
 	# exit address in RDX, mov it to RBX
 	movq %rdx, %rbx
+	# fallthrough
+
+	# Clear other registers and similar state and then call EEXIT
+	#
+	# Arguments for EEXIT/untrusted code (not cleared):
+	#
+	#     %rbx: exit target
+	#     %rsp: untrusted stack
+	#     %rdi, %rsi: (optional) arguments to untrusted code.
+.Lclear_and_eexit:
+	# %rax is argument to EEXIT
+	# %rbx is argument to EEXIT
+	# %rcx is set to AEP by EEXIT
+	xorq %rdx, %rdx
+	# %rsi, %rdi are arguments to the untrusted code
+	xorq %rbp, %rbp
+	# %rsp points to untrusted stack
+	xorq %r8, %r8
+	xorq %r9, %r9
+	xorq %r10, %r10
+	xorq %r11, %r11
+	xorq %r12, %r12
+	xorq %r13, %r13
+	xorq %r14, %r14
+	subq %r15, %r15 # use sub to set flags to a fixed value
+
 	movq $EEXIT, %rax
 	ENCLU
 
+	ud2 # We should never get here.
 
 	.global sgx_ocall
 	.type sgx_ocall, @function
@@ -268,17 +295,6 @@ sgx_ocall:
 
 	movq $1, %gs:SGX_OCALL_PREPARED
 
-	xorq %rdx, %rdx
-	xorq %r8, %r8
-	xorq %r9, %r9
-	xorq %r10, %r10
-	xorq %r11, %r11
-	xorq %r12, %r12
-	xorq %r13, %r13
-	xorq %r14, %r14
-	xorq %r15, %r15
-	xorq %rbp, %rbp
-
 	movq %rsp, %gs:SGX_STACK
 
 	# It's ok to use the untrusted stack and exit target below without
@@ -289,8 +305,7 @@ sgx_ocall:
 	andq $STACK_ALIGN, %rsp
 
 	movq %gs:SGX_EXIT_TARGET, %rbx
-	movq $EEXIT, %rax
-	ENCLU
+	jmp .Lclear_and_eexit
 
 .Lreturn_from_ocall:
 	# PAL convention: