Skip to content

Commit 26e688f

Browse files
rchatrehansendc
authored andcommitted
selftests/sgx: Enable multiple thread support
Each thread executing in an enclave is associated with a Thread Control Structure (TCS). The test enclave contains two hardcoded TCS. Each TCS contains meta-data used by the hardware to save and restore thread specific information when entering/exiting the enclave. The two TCS structures within the test enclave share their SSA (State Save Area) resulting in the threads clobbering each other's data. Fix this by providing each TCS their own SSA area. Additionally, there is an 8K stack space and its address is computed from the enclave entry point which is correctly done for TCS #1 that starts on the first address inside the enclave but results in out of bounds memory when entering as TCS #2. Split 8K stack space into two separate pages with offset symbol between to ensure the current enclave entry calculation can continue to be used for both threads. While using the enclave with multiple threads requires these fixes the impact is not apparent because every test up to this point enters the enclave from the first TCS. More detail about the stack fix: ------------------------------- Before this change the test enclave (test_encl) looks as follows: .tcs (2 pages): (page 1) TCS #1 (page 2) TCS #2 .text (1 page) One page of code .data (5 pages) (page 1) encl_buffer (page 2) encl_buffer (page 3) SSA (page 4 and 5) STACK encl_stack: As shown above there is a symbol, encl_stack, that points to the end of the .data segment (pointing to the end of page 5 in .data) which is also the end of the enclave. The enclave entry code computes the stack address by adding encl_stack to the pointer to the TCS that entered the enclave. When entering at TCS #1 the stack is computed correctly but when entering at TCS #2 the stack pointer would point to one page beyond the end of the enclave and a #PF would result when TCS #2 attempts to enter the enclave. The fix involves moving the encl_stack symbol between the two stack pages. Doing so enables the stack address computation in the entry code to compute the correct stack address for each TCS. Signed-off-by: Reinette Chatre <[email protected]> Signed-off-by: Dave Hansen <[email protected]> Reviewed-by: Jarkko Sakkinen <[email protected]> Acked-by: Dave Hansen <[email protected]> Link: https://lkml.kernel.org/r/a49dc0d85401db788a0a3f0d795e848abf3b1f44.1636997631.git.reinette.chatre@intel.com
1 parent abc5cec commit 26e688f

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

tools/testing/selftests/sgx/test_encl_bootstrap.S

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
.fill 1, 8, 0 # STATE (set by CPU)
1414
.fill 1, 8, 0 # FLAGS
15-
.quad encl_ssa # OSSA
15+
.quad encl_ssa_tcs1 # OSSA
1616
.fill 1, 4, 0 # CSSA (set by CPU)
1717
.fill 1, 4, 1 # NSSA
1818
.quad encl_entry # OENTRY
@@ -23,10 +23,10 @@
2323
.fill 1, 4, 0xFFFFFFFF # GSLIMIT
2424
.fill 4024, 1, 0 # Reserved
2525

26-
# Identical to the previous TCS.
26+
# TCS2
2727
.fill 1, 8, 0 # STATE (set by CPU)
2828
.fill 1, 8, 0 # FLAGS
29-
.quad encl_ssa # OSSA
29+
.quad encl_ssa_tcs2 # OSSA
3030
.fill 1, 4, 0 # CSSA (set by CPU)
3131
.fill 1, 4, 1 # NSSA
3232
.quad encl_entry # OENTRY
@@ -40,8 +40,9 @@
4040
.text
4141

4242
encl_entry:
43-
# RBX contains the base address for TCS, which is also the first address
44-
# inside the enclave. By adding the value of le_stack_end to it, we get
43+
# RBX contains the base address for TCS, which is the first address
44+
# inside the enclave for TCS #1 and one page into the enclave for
45+
# TCS #2. By adding the value of encl_stack to it, we get
4546
# the absolute address for the stack.
4647
lea (encl_stack)(%rbx), %rax
4748
xchg %rsp, %rax
@@ -81,9 +82,15 @@ encl_entry:
8182

8283
.section ".data", "aw"
8384

84-
encl_ssa:
85+
encl_ssa_tcs1:
86+
.space 4096
87+
encl_ssa_tcs2:
8588
.space 4096
8689

8790
.balign 4096
88-
.space 8192
91+
# Stack of TCS #1
92+
.space 4096
8993
encl_stack:
94+
.balign 4096
95+
# Stack of TCS #2
96+
.space 4096

0 commit comments

Comments
 (0)