/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright(c) 2016-20 Intel Corporation. */ .macro ENCLU .byte 0x0f, 0x01, 0xd7 .endm .section ".tcs", "aw" .balign 4096 .fill 1, 8, 0 # STATE (set by CPU) .fill 1, 8, 0 # FLAGS .quad encl_ssa_tcs1 # OSSA .fill 1, 4, 0 # CSSA (set by CPU) .fill 1, 4, 1 # NSSA .quad encl_entry # OENTRY .fill 1, 8, 0 # AEP (set by EENTER and ERESUME) .fill 1, 8, 0 # OFSBASE .fill 1, 8, 0 # OGSBASE .fill 1, 4, 0xFFFFFFFF # FSLIMIT .fill 1, 4, 0xFFFFFFFF # GSLIMIT .fill 4024, 1, 0 # Reserved # TCS2 .fill 1, 8, 0 # STATE (set by CPU) .fill 1, 8, 0 # FLAGS .quad encl_ssa_tcs2 # OSSA .fill 1, 4, 0 # CSSA (set by CPU) .fill 1, 4, 1 # NSSA .quad encl_entry # OENTRY .fill 1, 8, 0 # AEP (set by EENTER and ERESUME) .fill 1, 8, 0 # OFSBASE .fill 1, 8, 0 # OGSBASE .fill 1, 4, 0xFFFFFFFF # FSLIMIT .fill 1, 4, 0xFFFFFFFF # GSLIMIT .fill 4024, 1, 0 # Reserved .text encl_entry: # RBX contains the base address for TCS, which is the first address # inside the enclave for TCS #1 and one page into the enclave for # TCS #2. First make it relative by substracting __encl_base and # then add the address of encl_stack to get the address for the stack. lea __encl_base(%rip), %rax sub %rax, %rbx lea encl_stack(%rip), %rax add %rbx, %rax jmp encl_entry_core encl_dyn_entry: # Entry point for dynamically created TCS page expected to follow # its stack directly. lea -1(%rbx), %rax encl_entry_core: xchg %rsp, %rax push %rax push %rcx # push the address after EENTER # NOTE: as the selftest enclave is *not* intended for production, # simplify the code by not initializing ABI registers on entry or # cleansing caller-save registers on exit. call encl_body # Prepare EEXIT target by popping the address of the instruction after # EENTER to RBX. pop %rbx # Restore the caller stack. pop %rax mov %rax, %rsp # EEXIT mov $4, %rax enclu .section ".data", "aw" encl_ssa_tcs1: .space 4096 encl_ssa_tcs2: .space 4096 .balign 4096 # Stack of TCS #1 .space 4096 encl_stack: .balign 4096 # Stack of TCS #2 .space 4096