93 lines
2.1 KiB
ArmAsm
93 lines
2.1 KiB
ArmAsm
|
/* 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
|