• Reinette Chatre's avatar
    selftests/sgx: Enable multiple thread support · 26e688f1
    Reinette Chatre authored
    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: default avatarReinette Chatre <reinette.chatre@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
    Acked-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Link: https://lkml.kernel.org/r/a49dc0d85401db788a0a3f0d795e848abf3b1f44.1636997631.git.reinette.chatre@intel.com
    26e688f1
test_encl_bootstrap.S 2.03 KB