1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright(c) 2016-20 Intel Corporation.
4  */
5 
6 	.macro ENCLU
7 	.byte 0x0f, 0x01, 0xd7
8 	.endm
9 
10 	.section ".tcs", "aw"
11 	.balign	4096
12 
13 	.fill	1, 8, 0			# STATE (set by CPU)
14 	.fill	1, 8, 0			# FLAGS
15 	.quad	encl_ssa_tcs1		# OSSA
16 	.fill	1, 4, 0			# CSSA (set by CPU)
17 	.fill	1, 4, 1			# NSSA
18 	.quad	encl_entry		# OENTRY
19 	.fill	1, 8, 0			# AEP (set by EENTER and ERESUME)
20 	.fill	1, 8, 0			# OFSBASE
21 	.fill	1, 8, 0			# OGSBASE
22 	.fill	1, 4, 0xFFFFFFFF 	# FSLIMIT
23 	.fill	1, 4, 0xFFFFFFFF	# GSLIMIT
24 	.fill	4024, 1, 0		# Reserved
25 
26 	# TCS2
27 	.fill	1, 8, 0			# STATE (set by CPU)
28 	.fill	1, 8, 0			# FLAGS
29 	.quad	encl_ssa_tcs2		# OSSA
30 	.fill	1, 4, 0			# CSSA (set by CPU)
31 	.fill	1, 4, 1			# NSSA
32 	.quad	encl_entry		# OENTRY
33 	.fill	1, 8, 0			# AEP (set by EENTER and ERESUME)
34 	.fill	1, 8, 0			# OFSBASE
35 	.fill	1, 8, 0			# OGSBASE
36 	.fill	1, 4, 0xFFFFFFFF 	# FSLIMIT
37 	.fill	1, 4, 0xFFFFFFFF	# GSLIMIT
38 	.fill	4024, 1, 0		# Reserved
39 
40 	.text
41 
42 encl_entry:
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
46 	# the absolute address for the stack.
47 	lea	(encl_stack)(%rbx), %rax
48 	jmp encl_entry_core
49 encl_dyn_entry:
50 	# Entry point for dynamically created TCS page expected to follow
51 	# its stack directly.
52 	lea -1(%rbx), %rax
53 encl_entry_core:
54 	xchg	%rsp, %rax
55 	push	%rax
56 
57 	push	%rcx # push the address after EENTER
58 	push	%rbx # push the enclave base address
59 
60 	call	encl_body
61 
62 	pop	%rbx # pop the enclave base address
63 
64 	/* Clear volatile GPRs, except RAX (EEXIT function). */
65 	xor     %rcx, %rcx
66 	xor     %rdx, %rdx
67 	xor     %rdi, %rdi
68 	xor     %rsi, %rsi
69 	xor     %r8, %r8
70 	xor     %r9, %r9
71 	xor     %r10, %r10
72 	xor     %r11, %r11
73 
74 	# Reset status flags.
75 	add     %rdx, %rdx # OF = SF = AF = CF = 0; ZF = PF = 1
76 
77 	# Prepare EEXIT target by popping the address of the instruction after
78 	# EENTER to RBX.
79 	pop	%rbx
80 
81 	# Restore the caller stack.
82 	pop	%rax
83 	mov	%rax, %rsp
84 
85 	# EEXIT
86 	mov	$4, %rax
87 	enclu
88 
89 	.section ".data", "aw"
90 
91 encl_ssa_tcs1:
92 	.space 4096
93 encl_ssa_tcs2:
94 	.space 4096
95 
96 	.balign 4096
97 	# Stack of TCS #1
98 	.space 4096
99 encl_stack:
100 	.balign 4096
101 	# Stack of TCS #2
102 	.space 4096
103