xref: /aosp_15_r20/external/arm-trusted-firmware/lib/el3_runtime/aarch64/context.S (revision 54fd6939e177f8ff529b10183254802c76df6d08)
1*54fd6939SJiyong Park/*
2*54fd6939SJiyong Park * Copyright (c) 2013-2021, ARM Limited and Contributors. All rights reserved.
3*54fd6939SJiyong Park *
4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause
5*54fd6939SJiyong Park */
6*54fd6939SJiyong Park
7*54fd6939SJiyong Park#include <arch.h>
8*54fd6939SJiyong Park#include <asm_macros.S>
9*54fd6939SJiyong Park#include <assert_macros.S>
10*54fd6939SJiyong Park#include <context.h>
11*54fd6939SJiyong Park#include <el3_common_macros.S>
12*54fd6939SJiyong Park
13*54fd6939SJiyong Park#if CTX_INCLUDE_EL2_REGS
14*54fd6939SJiyong Park	.global	el2_sysregs_context_save
15*54fd6939SJiyong Park	.global	el2_sysregs_context_restore
16*54fd6939SJiyong Park#endif
17*54fd6939SJiyong Park
18*54fd6939SJiyong Park	.global	el1_sysregs_context_save
19*54fd6939SJiyong Park	.global	el1_sysregs_context_restore
20*54fd6939SJiyong Park#if CTX_INCLUDE_FPREGS
21*54fd6939SJiyong Park	.global	fpregs_context_save
22*54fd6939SJiyong Park	.global	fpregs_context_restore
23*54fd6939SJiyong Park#endif
24*54fd6939SJiyong Park	.global	save_gp_pmcr_pauth_regs
25*54fd6939SJiyong Park	.global	restore_gp_pmcr_pauth_regs
26*54fd6939SJiyong Park	.global save_and_update_ptw_el1_sys_regs
27*54fd6939SJiyong Park	.global	el3_exit
28*54fd6939SJiyong Park
29*54fd6939SJiyong Park#if CTX_INCLUDE_EL2_REGS
30*54fd6939SJiyong Park
31*54fd6939SJiyong Park/* -----------------------------------------------------
32*54fd6939SJiyong Park * The following function strictly follows the AArch64
33*54fd6939SJiyong Park * PCS to use x9-x16 (temporary caller-saved registers)
34*54fd6939SJiyong Park * to save EL2 system register context. It assumes that
35*54fd6939SJiyong Park * 'x0' is pointing to a 'el2_sys_regs' structure where
36*54fd6939SJiyong Park * the register context will be saved.
37*54fd6939SJiyong Park *
38*54fd6939SJiyong Park * The following registers are not added.
39*54fd6939SJiyong Park * AMEVCNTVOFF0<n>_EL2
40*54fd6939SJiyong Park * AMEVCNTVOFF1<n>_EL2
41*54fd6939SJiyong Park * ICH_AP0R<n>_EL2
42*54fd6939SJiyong Park * ICH_AP1R<n>_EL2
43*54fd6939SJiyong Park * ICH_LR<n>_EL2
44*54fd6939SJiyong Park * -----------------------------------------------------
45*54fd6939SJiyong Park */
46*54fd6939SJiyong Parkfunc el2_sysregs_context_save
47*54fd6939SJiyong Park	mrs	x9, actlr_el2
48*54fd6939SJiyong Park	mrs	x10, afsr0_el2
49*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_ACTLR_EL2]
50*54fd6939SJiyong Park
51*54fd6939SJiyong Park	mrs	x11, afsr1_el2
52*54fd6939SJiyong Park	mrs	x12, amair_el2
53*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_AFSR1_EL2]
54*54fd6939SJiyong Park
55*54fd6939SJiyong Park	mrs	x13, cnthctl_el2
56*54fd6939SJiyong Park	mrs	x14, cntvoff_el2
57*54fd6939SJiyong Park	stp	x13, x14, [x0, #CTX_CNTHCTL_EL2]
58*54fd6939SJiyong Park
59*54fd6939SJiyong Park	mrs	x15, cptr_el2
60*54fd6939SJiyong Park	str	x15, [x0, #CTX_CPTR_EL2]
61*54fd6939SJiyong Park
62*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
63*54fd6939SJiyong Park	mrs	x16, dbgvcr32_el2
64*54fd6939SJiyong Park	str	x16, [x0, #CTX_DBGVCR32_EL2]
65*54fd6939SJiyong Park#endif
66*54fd6939SJiyong Park
67*54fd6939SJiyong Park	mrs	x9, elr_el2
68*54fd6939SJiyong Park	mrs	x10, esr_el2
69*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_ELR_EL2]
70*54fd6939SJiyong Park
71*54fd6939SJiyong Park	mrs	x11, far_el2
72*54fd6939SJiyong Park	mrs	x12, hacr_el2
73*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_FAR_EL2]
74*54fd6939SJiyong Park
75*54fd6939SJiyong Park	mrs	x13, hcr_el2
76*54fd6939SJiyong Park	mrs	x14, hpfar_el2
77*54fd6939SJiyong Park	stp	x13, x14, [x0, #CTX_HCR_EL2]
78*54fd6939SJiyong Park
79*54fd6939SJiyong Park	mrs	x15, hstr_el2
80*54fd6939SJiyong Park	mrs	x16, ICC_SRE_EL2
81*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_HSTR_EL2]
82*54fd6939SJiyong Park
83*54fd6939SJiyong Park	mrs	x9, ICH_HCR_EL2
84*54fd6939SJiyong Park	mrs	x10, ICH_VMCR_EL2
85*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_ICH_HCR_EL2]
86*54fd6939SJiyong Park
87*54fd6939SJiyong Park	mrs	x11, mair_el2
88*54fd6939SJiyong Park	mrs	x12, mdcr_el2
89*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_MAIR_EL2]
90*54fd6939SJiyong Park
91*54fd6939SJiyong Park#if ENABLE_SPE_FOR_LOWER_ELS
92*54fd6939SJiyong Park	mrs	x13, PMSCR_EL2
93*54fd6939SJiyong Park	str	x13, [x0, #CTX_PMSCR_EL2]
94*54fd6939SJiyong Park#endif
95*54fd6939SJiyong Park	mrs	x14, sctlr_el2
96*54fd6939SJiyong Park	str	x14, [x0, #CTX_SCTLR_EL2]
97*54fd6939SJiyong Park
98*54fd6939SJiyong Park	mrs	x15, spsr_el2
99*54fd6939SJiyong Park	mrs	x16, sp_el2
100*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_SPSR_EL2]
101*54fd6939SJiyong Park
102*54fd6939SJiyong Park	mrs	x9, tcr_el2
103*54fd6939SJiyong Park	mrs	x10, tpidr_el2
104*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_TCR_EL2]
105*54fd6939SJiyong Park
106*54fd6939SJiyong Park	mrs	x11, ttbr0_el2
107*54fd6939SJiyong Park	mrs	x12, vbar_el2
108*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_TTBR0_EL2]
109*54fd6939SJiyong Park
110*54fd6939SJiyong Park	mrs	x13, vmpidr_el2
111*54fd6939SJiyong Park	mrs	x14, vpidr_el2
112*54fd6939SJiyong Park	stp	x13, x14, [x0, #CTX_VMPIDR_EL2]
113*54fd6939SJiyong Park
114*54fd6939SJiyong Park	mrs	x15, vtcr_el2
115*54fd6939SJiyong Park	mrs	x16, vttbr_el2
116*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_VTCR_EL2]
117*54fd6939SJiyong Park
118*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS
119*54fd6939SJiyong Park	mrs	x9, TFSR_EL2
120*54fd6939SJiyong Park	str	x9, [x0, #CTX_TFSR_EL2]
121*54fd6939SJiyong Park#endif
122*54fd6939SJiyong Park
123*54fd6939SJiyong Park#if ENABLE_MPAM_FOR_LOWER_ELS
124*54fd6939SJiyong Park	mrs	x10, MPAM2_EL2
125*54fd6939SJiyong Park	str	x10, [x0, #CTX_MPAM2_EL2]
126*54fd6939SJiyong Park
127*54fd6939SJiyong Park	mrs	x11, MPAMHCR_EL2
128*54fd6939SJiyong Park	mrs	x12, MPAMVPM0_EL2
129*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_MPAMHCR_EL2]
130*54fd6939SJiyong Park
131*54fd6939SJiyong Park	mrs	x13, MPAMVPM1_EL2
132*54fd6939SJiyong Park	mrs	x14, MPAMVPM2_EL2
133*54fd6939SJiyong Park	stp	x13, x14, [x0, #CTX_MPAMVPM1_EL2]
134*54fd6939SJiyong Park
135*54fd6939SJiyong Park	mrs	x15, MPAMVPM3_EL2
136*54fd6939SJiyong Park	mrs	x16, MPAMVPM4_EL2
137*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_MPAMVPM3_EL2]
138*54fd6939SJiyong Park
139*54fd6939SJiyong Park	mrs	x9, MPAMVPM5_EL2
140*54fd6939SJiyong Park	mrs	x10, MPAMVPM6_EL2
141*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_MPAMVPM5_EL2]
142*54fd6939SJiyong Park
143*54fd6939SJiyong Park	mrs	x11, MPAMVPM7_EL2
144*54fd6939SJiyong Park	mrs	x12, MPAMVPMV_EL2
145*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_MPAMVPM7_EL2]
146*54fd6939SJiyong Park#endif
147*54fd6939SJiyong Park
148*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 6)
149*54fd6939SJiyong Park	mrs	x13, HAFGRTR_EL2
150*54fd6939SJiyong Park	mrs	x14, HDFGRTR_EL2
151*54fd6939SJiyong Park	stp	x13, x14, [x0, #CTX_HAFGRTR_EL2]
152*54fd6939SJiyong Park
153*54fd6939SJiyong Park	mrs	x15, HDFGWTR_EL2
154*54fd6939SJiyong Park	mrs	x16, HFGITR_EL2
155*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_HDFGWTR_EL2]
156*54fd6939SJiyong Park
157*54fd6939SJiyong Park	mrs	x9, HFGRTR_EL2
158*54fd6939SJiyong Park	mrs	x10, HFGWTR_EL2
159*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_HFGRTR_EL2]
160*54fd6939SJiyong Park
161*54fd6939SJiyong Park	mrs	x11, CNTPOFF_EL2
162*54fd6939SJiyong Park	str	x11, [x0, #CTX_CNTPOFF_EL2]
163*54fd6939SJiyong Park#endif
164*54fd6939SJiyong Park
165*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 4)
166*54fd6939SJiyong Park	mrs	x12, contextidr_el2
167*54fd6939SJiyong Park	str	x12, [x0, #CTX_CONTEXTIDR_EL2]
168*54fd6939SJiyong Park
169*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
170*54fd6939SJiyong Park	mrs	x13, sder32_el2
171*54fd6939SJiyong Park	str	x13, [x0, #CTX_SDER32_EL2]
172*54fd6939SJiyong Park#endif
173*54fd6939SJiyong Park	mrs	x14, ttbr1_el2
174*54fd6939SJiyong Park	mrs	x15, vdisr_el2
175*54fd6939SJiyong Park	stp	x14, x15, [x0, #CTX_TTBR1_EL2]
176*54fd6939SJiyong Park
177*54fd6939SJiyong Park#if CTX_INCLUDE_NEVE_REGS
178*54fd6939SJiyong Park	mrs	x16, vncr_el2
179*54fd6939SJiyong Park	str	x16, [x0, #CTX_VNCR_EL2]
180*54fd6939SJiyong Park#endif
181*54fd6939SJiyong Park
182*54fd6939SJiyong Park	mrs	x9, vsesr_el2
183*54fd6939SJiyong Park	mrs	x10, vstcr_el2
184*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_VSESR_EL2]
185*54fd6939SJiyong Park
186*54fd6939SJiyong Park	mrs	x11, vsttbr_el2
187*54fd6939SJiyong Park	mrs	x12, TRFCR_EL2
188*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_VSTTBR_EL2]
189*54fd6939SJiyong Park#endif
190*54fd6939SJiyong Park
191*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 5)
192*54fd6939SJiyong Park	mrs	x13, scxtnum_el2
193*54fd6939SJiyong Park	str	x13, [x0, #CTX_SCXTNUM_EL2]
194*54fd6939SJiyong Park#endif
195*54fd6939SJiyong Park
196*54fd6939SJiyong Park#if ENABLE_FEAT_HCX
197*54fd6939SJiyong Park	mrs	x14, hcrx_el2
198*54fd6939SJiyong Park	str	x14, [x0, #CTX_HCRX_EL2]
199*54fd6939SJiyong Park#endif
200*54fd6939SJiyong Park
201*54fd6939SJiyong Park	ret
202*54fd6939SJiyong Parkendfunc el2_sysregs_context_save
203*54fd6939SJiyong Park
204*54fd6939SJiyong Park
205*54fd6939SJiyong Park/* -----------------------------------------------------
206*54fd6939SJiyong Park * The following function strictly follows the AArch64
207*54fd6939SJiyong Park * PCS to use x9-x16 (temporary caller-saved registers)
208*54fd6939SJiyong Park * to restore EL2 system register context.  It assumes
209*54fd6939SJiyong Park * that 'x0' is pointing to a 'el2_sys_regs' structure
210*54fd6939SJiyong Park * from where the register context will be restored
211*54fd6939SJiyong Park
212*54fd6939SJiyong Park * The following registers are not restored
213*54fd6939SJiyong Park * AMEVCNTVOFF0<n>_EL2
214*54fd6939SJiyong Park * AMEVCNTVOFF1<n>_EL2
215*54fd6939SJiyong Park * ICH_AP0R<n>_EL2
216*54fd6939SJiyong Park * ICH_AP1R<n>_EL2
217*54fd6939SJiyong Park * ICH_LR<n>_EL2
218*54fd6939SJiyong Park * -----------------------------------------------------
219*54fd6939SJiyong Park */
220*54fd6939SJiyong Parkfunc el2_sysregs_context_restore
221*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_ACTLR_EL2]
222*54fd6939SJiyong Park	msr	actlr_el2, x9
223*54fd6939SJiyong Park	msr	afsr0_el2, x10
224*54fd6939SJiyong Park
225*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_AFSR1_EL2]
226*54fd6939SJiyong Park	msr	afsr1_el2, x11
227*54fd6939SJiyong Park	msr	amair_el2, x12
228*54fd6939SJiyong Park
229*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_CNTHCTL_EL2]
230*54fd6939SJiyong Park	msr	cnthctl_el2, x13
231*54fd6939SJiyong Park	msr	cntvoff_el2, x14
232*54fd6939SJiyong Park
233*54fd6939SJiyong Park	ldr	x15, [x0, #CTX_CPTR_EL2]
234*54fd6939SJiyong Park	msr	cptr_el2, x15
235*54fd6939SJiyong Park
236*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
237*54fd6939SJiyong Park	ldr	x16, [x0, #CTX_DBGVCR32_EL2]
238*54fd6939SJiyong Park	msr	dbgvcr32_el2, x16
239*54fd6939SJiyong Park#endif
240*54fd6939SJiyong Park
241*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_ELR_EL2]
242*54fd6939SJiyong Park	msr	elr_el2, x9
243*54fd6939SJiyong Park	msr	esr_el2, x10
244*54fd6939SJiyong Park
245*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_FAR_EL2]
246*54fd6939SJiyong Park	msr	far_el2, x11
247*54fd6939SJiyong Park	msr	hacr_el2, x12
248*54fd6939SJiyong Park
249*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_HCR_EL2]
250*54fd6939SJiyong Park	msr	hcr_el2, x13
251*54fd6939SJiyong Park	msr	hpfar_el2, x14
252*54fd6939SJiyong Park
253*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_HSTR_EL2]
254*54fd6939SJiyong Park	msr	hstr_el2, x15
255*54fd6939SJiyong Park	msr	ICC_SRE_EL2, x16
256*54fd6939SJiyong Park
257*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_ICH_HCR_EL2]
258*54fd6939SJiyong Park	msr	ICH_HCR_EL2, x9
259*54fd6939SJiyong Park	msr	ICH_VMCR_EL2, x10
260*54fd6939SJiyong Park
261*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_MAIR_EL2]
262*54fd6939SJiyong Park	msr	mair_el2, x11
263*54fd6939SJiyong Park	msr	mdcr_el2, x12
264*54fd6939SJiyong Park
265*54fd6939SJiyong Park#if ENABLE_SPE_FOR_LOWER_ELS
266*54fd6939SJiyong Park	ldr	x13, [x0, #CTX_PMSCR_EL2]
267*54fd6939SJiyong Park	msr	PMSCR_EL2, x13
268*54fd6939SJiyong Park#endif
269*54fd6939SJiyong Park	ldr	x14, [x0, #CTX_SCTLR_EL2]
270*54fd6939SJiyong Park	msr	sctlr_el2, x14
271*54fd6939SJiyong Park
272*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_SPSR_EL2]
273*54fd6939SJiyong Park	msr	spsr_el2, x15
274*54fd6939SJiyong Park	msr	sp_el2, x16
275*54fd6939SJiyong Park
276*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_TCR_EL2]
277*54fd6939SJiyong Park	msr	tcr_el2, x9
278*54fd6939SJiyong Park	msr	tpidr_el2, x10
279*54fd6939SJiyong Park
280*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_TTBR0_EL2]
281*54fd6939SJiyong Park	msr	ttbr0_el2, x11
282*54fd6939SJiyong Park	msr	vbar_el2, x12
283*54fd6939SJiyong Park
284*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_VMPIDR_EL2]
285*54fd6939SJiyong Park	msr	vmpidr_el2, x13
286*54fd6939SJiyong Park	msr	vpidr_el2, x14
287*54fd6939SJiyong Park
288*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_VTCR_EL2]
289*54fd6939SJiyong Park	msr	vtcr_el2, x15
290*54fd6939SJiyong Park	msr	vttbr_el2, x16
291*54fd6939SJiyong Park
292*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS
293*54fd6939SJiyong Park	ldr	x9, [x0, #CTX_TFSR_EL2]
294*54fd6939SJiyong Park	msr	TFSR_EL2, x9
295*54fd6939SJiyong Park#endif
296*54fd6939SJiyong Park
297*54fd6939SJiyong Park#if ENABLE_MPAM_FOR_LOWER_ELS
298*54fd6939SJiyong Park	ldr	x10, [x0, #CTX_MPAM2_EL2]
299*54fd6939SJiyong Park	msr	MPAM2_EL2, x10
300*54fd6939SJiyong Park
301*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_MPAMHCR_EL2]
302*54fd6939SJiyong Park	msr	MPAMHCR_EL2, x11
303*54fd6939SJiyong Park	msr	MPAMVPM0_EL2, x12
304*54fd6939SJiyong Park
305*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_MPAMVPM1_EL2]
306*54fd6939SJiyong Park	msr	MPAMVPM1_EL2, x13
307*54fd6939SJiyong Park	msr	MPAMVPM2_EL2, x14
308*54fd6939SJiyong Park
309*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_MPAMVPM3_EL2]
310*54fd6939SJiyong Park	msr	MPAMVPM3_EL2, x15
311*54fd6939SJiyong Park	msr	MPAMVPM4_EL2, x16
312*54fd6939SJiyong Park
313*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_MPAMVPM5_EL2]
314*54fd6939SJiyong Park	msr	MPAMVPM5_EL2, x9
315*54fd6939SJiyong Park	msr	MPAMVPM6_EL2, x10
316*54fd6939SJiyong Park
317*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_MPAMVPM7_EL2]
318*54fd6939SJiyong Park	msr	MPAMVPM7_EL2, x11
319*54fd6939SJiyong Park	msr	MPAMVPMV_EL2, x12
320*54fd6939SJiyong Park#endif
321*54fd6939SJiyong Park
322*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 6)
323*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_HAFGRTR_EL2]
324*54fd6939SJiyong Park	msr	HAFGRTR_EL2, x13
325*54fd6939SJiyong Park	msr	HDFGRTR_EL2, x14
326*54fd6939SJiyong Park
327*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_HDFGWTR_EL2]
328*54fd6939SJiyong Park	msr	HDFGWTR_EL2, x15
329*54fd6939SJiyong Park	msr	HFGITR_EL2, x16
330*54fd6939SJiyong Park
331*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_HFGRTR_EL2]
332*54fd6939SJiyong Park	msr	HFGRTR_EL2, x9
333*54fd6939SJiyong Park	msr	HFGWTR_EL2, x10
334*54fd6939SJiyong Park
335*54fd6939SJiyong Park	ldr	x11, [x0, #CTX_CNTPOFF_EL2]
336*54fd6939SJiyong Park	msr	CNTPOFF_EL2, x11
337*54fd6939SJiyong Park#endif
338*54fd6939SJiyong Park
339*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 4)
340*54fd6939SJiyong Park	ldr	x12, [x0, #CTX_CONTEXTIDR_EL2]
341*54fd6939SJiyong Park	msr	contextidr_el2, x12
342*54fd6939SJiyong Park
343*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
344*54fd6939SJiyong Park	ldr	x13, [x0, #CTX_SDER32_EL2]
345*54fd6939SJiyong Park	msr	sder32_el2, x13
346*54fd6939SJiyong Park#endif
347*54fd6939SJiyong Park	ldp	x14, x15, [x0, #CTX_TTBR1_EL2]
348*54fd6939SJiyong Park	msr	ttbr1_el2, x14
349*54fd6939SJiyong Park	msr	vdisr_el2, x15
350*54fd6939SJiyong Park
351*54fd6939SJiyong Park#if CTX_INCLUDE_NEVE_REGS
352*54fd6939SJiyong Park	ldr	x16, [x0, #CTX_VNCR_EL2]
353*54fd6939SJiyong Park	msr	vncr_el2, x16
354*54fd6939SJiyong Park#endif
355*54fd6939SJiyong Park
356*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_VSESR_EL2]
357*54fd6939SJiyong Park	msr	vsesr_el2, x9
358*54fd6939SJiyong Park	msr	vstcr_el2, x10
359*54fd6939SJiyong Park
360*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_VSTTBR_EL2]
361*54fd6939SJiyong Park	msr	vsttbr_el2, x11
362*54fd6939SJiyong Park	msr	TRFCR_EL2, x12
363*54fd6939SJiyong Park#endif
364*54fd6939SJiyong Park
365*54fd6939SJiyong Park#if ARM_ARCH_AT_LEAST(8, 5)
366*54fd6939SJiyong Park	ldr	x13, [x0, #CTX_SCXTNUM_EL2]
367*54fd6939SJiyong Park	msr	scxtnum_el2, x13
368*54fd6939SJiyong Park#endif
369*54fd6939SJiyong Park
370*54fd6939SJiyong Park#if ENABLE_FEAT_HCX
371*54fd6939SJiyong Park	ldr	x14, [x0, #CTX_HCRX_EL2]
372*54fd6939SJiyong Park	msr	hcrx_el2, x14
373*54fd6939SJiyong Park#endif
374*54fd6939SJiyong Park
375*54fd6939SJiyong Park	ret
376*54fd6939SJiyong Parkendfunc el2_sysregs_context_restore
377*54fd6939SJiyong Park
378*54fd6939SJiyong Park#endif /* CTX_INCLUDE_EL2_REGS */
379*54fd6939SJiyong Park
380*54fd6939SJiyong Park/* ------------------------------------------------------------------
381*54fd6939SJiyong Park * The following function strictly follows the AArch64 PCS to use
382*54fd6939SJiyong Park * x9-x17 (temporary caller-saved registers) to save EL1 system
383*54fd6939SJiyong Park * register context. It assumes that 'x0' is pointing to a
384*54fd6939SJiyong Park * 'el1_sys_regs' structure where the register context will be saved.
385*54fd6939SJiyong Park * ------------------------------------------------------------------
386*54fd6939SJiyong Park */
387*54fd6939SJiyong Parkfunc el1_sysregs_context_save
388*54fd6939SJiyong Park
389*54fd6939SJiyong Park	mrs	x9, spsr_el1
390*54fd6939SJiyong Park	mrs	x10, elr_el1
391*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_SPSR_EL1]
392*54fd6939SJiyong Park
393*54fd6939SJiyong Park#if !ERRATA_SPECULATIVE_AT
394*54fd6939SJiyong Park	mrs	x15, sctlr_el1
395*54fd6939SJiyong Park	mrs	x16, tcr_el1
396*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_SCTLR_EL1]
397*54fd6939SJiyong Park#endif
398*54fd6939SJiyong Park
399*54fd6939SJiyong Park	mrs	x17, cpacr_el1
400*54fd6939SJiyong Park	mrs	x9, csselr_el1
401*54fd6939SJiyong Park	stp	x17, x9, [x0, #CTX_CPACR_EL1]
402*54fd6939SJiyong Park
403*54fd6939SJiyong Park	mrs	x10, sp_el1
404*54fd6939SJiyong Park	mrs	x11, esr_el1
405*54fd6939SJiyong Park	stp	x10, x11, [x0, #CTX_SP_EL1]
406*54fd6939SJiyong Park
407*54fd6939SJiyong Park	mrs	x12, ttbr0_el1
408*54fd6939SJiyong Park	mrs	x13, ttbr1_el1
409*54fd6939SJiyong Park	stp	x12, x13, [x0, #CTX_TTBR0_EL1]
410*54fd6939SJiyong Park
411*54fd6939SJiyong Park	mrs	x14, mair_el1
412*54fd6939SJiyong Park	mrs	x15, amair_el1
413*54fd6939SJiyong Park	stp	x14, x15, [x0, #CTX_MAIR_EL1]
414*54fd6939SJiyong Park
415*54fd6939SJiyong Park	mrs	x16, actlr_el1
416*54fd6939SJiyong Park	mrs	x17, tpidr_el1
417*54fd6939SJiyong Park	stp	x16, x17, [x0, #CTX_ACTLR_EL1]
418*54fd6939SJiyong Park
419*54fd6939SJiyong Park	mrs	x9, tpidr_el0
420*54fd6939SJiyong Park	mrs	x10, tpidrro_el0
421*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_TPIDR_EL0]
422*54fd6939SJiyong Park
423*54fd6939SJiyong Park	mrs	x13, par_el1
424*54fd6939SJiyong Park	mrs	x14, far_el1
425*54fd6939SJiyong Park	stp	x13, x14, [x0, #CTX_PAR_EL1]
426*54fd6939SJiyong Park
427*54fd6939SJiyong Park	mrs	x15, afsr0_el1
428*54fd6939SJiyong Park	mrs	x16, afsr1_el1
429*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_AFSR0_EL1]
430*54fd6939SJiyong Park
431*54fd6939SJiyong Park	mrs	x17, contextidr_el1
432*54fd6939SJiyong Park	mrs	x9, vbar_el1
433*54fd6939SJiyong Park	stp	x17, x9, [x0, #CTX_CONTEXTIDR_EL1]
434*54fd6939SJiyong Park
435*54fd6939SJiyong Park	/* Save AArch32 system registers if the build has instructed so */
436*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
437*54fd6939SJiyong Park	mrs	x11, spsr_abt
438*54fd6939SJiyong Park	mrs	x12, spsr_und
439*54fd6939SJiyong Park	stp	x11, x12, [x0, #CTX_SPSR_ABT]
440*54fd6939SJiyong Park
441*54fd6939SJiyong Park	mrs	x13, spsr_irq
442*54fd6939SJiyong Park	mrs	x14, spsr_fiq
443*54fd6939SJiyong Park	stp	x13, x14, [x0, #CTX_SPSR_IRQ]
444*54fd6939SJiyong Park
445*54fd6939SJiyong Park	mrs	x15, dacr32_el2
446*54fd6939SJiyong Park	mrs	x16, ifsr32_el2
447*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_DACR32_EL2]
448*54fd6939SJiyong Park#endif
449*54fd6939SJiyong Park
450*54fd6939SJiyong Park	/* Save NS timer registers if the build has instructed so */
451*54fd6939SJiyong Park#if NS_TIMER_SWITCH
452*54fd6939SJiyong Park	mrs	x10, cntp_ctl_el0
453*54fd6939SJiyong Park	mrs	x11, cntp_cval_el0
454*54fd6939SJiyong Park	stp	x10, x11, [x0, #CTX_CNTP_CTL_EL0]
455*54fd6939SJiyong Park
456*54fd6939SJiyong Park	mrs	x12, cntv_ctl_el0
457*54fd6939SJiyong Park	mrs	x13, cntv_cval_el0
458*54fd6939SJiyong Park	stp	x12, x13, [x0, #CTX_CNTV_CTL_EL0]
459*54fd6939SJiyong Park
460*54fd6939SJiyong Park	mrs	x14, cntkctl_el1
461*54fd6939SJiyong Park	str	x14, [x0, #CTX_CNTKCTL_EL1]
462*54fd6939SJiyong Park#endif
463*54fd6939SJiyong Park
464*54fd6939SJiyong Park	/* Save MTE system registers if the build has instructed so */
465*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS
466*54fd6939SJiyong Park	mrs	x15, TFSRE0_EL1
467*54fd6939SJiyong Park	mrs	x16, TFSR_EL1
468*54fd6939SJiyong Park	stp	x15, x16, [x0, #CTX_TFSRE0_EL1]
469*54fd6939SJiyong Park
470*54fd6939SJiyong Park	mrs	x9, RGSR_EL1
471*54fd6939SJiyong Park	mrs	x10, GCR_EL1
472*54fd6939SJiyong Park	stp	x9, x10, [x0, #CTX_RGSR_EL1]
473*54fd6939SJiyong Park#endif
474*54fd6939SJiyong Park
475*54fd6939SJiyong Park	ret
476*54fd6939SJiyong Parkendfunc el1_sysregs_context_save
477*54fd6939SJiyong Park
478*54fd6939SJiyong Park/* ------------------------------------------------------------------
479*54fd6939SJiyong Park * The following function strictly follows the AArch64 PCS to use
480*54fd6939SJiyong Park * x9-x17 (temporary caller-saved registers) to restore EL1 system
481*54fd6939SJiyong Park * register context.  It assumes that 'x0' is pointing to a
482*54fd6939SJiyong Park * 'el1_sys_regs' structure from where the register context will be
483*54fd6939SJiyong Park * restored
484*54fd6939SJiyong Park * ------------------------------------------------------------------
485*54fd6939SJiyong Park */
486*54fd6939SJiyong Parkfunc el1_sysregs_context_restore
487*54fd6939SJiyong Park
488*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_SPSR_EL1]
489*54fd6939SJiyong Park	msr	spsr_el1, x9
490*54fd6939SJiyong Park	msr	elr_el1, x10
491*54fd6939SJiyong Park
492*54fd6939SJiyong Park#if !ERRATA_SPECULATIVE_AT
493*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_SCTLR_EL1]
494*54fd6939SJiyong Park	msr	sctlr_el1, x15
495*54fd6939SJiyong Park	msr	tcr_el1, x16
496*54fd6939SJiyong Park#endif
497*54fd6939SJiyong Park
498*54fd6939SJiyong Park	ldp	x17, x9, [x0, #CTX_CPACR_EL1]
499*54fd6939SJiyong Park	msr	cpacr_el1, x17
500*54fd6939SJiyong Park	msr	csselr_el1, x9
501*54fd6939SJiyong Park
502*54fd6939SJiyong Park	ldp	x10, x11, [x0, #CTX_SP_EL1]
503*54fd6939SJiyong Park	msr	sp_el1, x10
504*54fd6939SJiyong Park	msr	esr_el1, x11
505*54fd6939SJiyong Park
506*54fd6939SJiyong Park	ldp	x12, x13, [x0, #CTX_TTBR0_EL1]
507*54fd6939SJiyong Park	msr	ttbr0_el1, x12
508*54fd6939SJiyong Park	msr	ttbr1_el1, x13
509*54fd6939SJiyong Park
510*54fd6939SJiyong Park	ldp	x14, x15, [x0, #CTX_MAIR_EL1]
511*54fd6939SJiyong Park	msr	mair_el1, x14
512*54fd6939SJiyong Park	msr	amair_el1, x15
513*54fd6939SJiyong Park
514*54fd6939SJiyong Park	ldp 	x16, x17, [x0, #CTX_ACTLR_EL1]
515*54fd6939SJiyong Park	msr	actlr_el1, x16
516*54fd6939SJiyong Park	msr	tpidr_el1, x17
517*54fd6939SJiyong Park
518*54fd6939SJiyong Park	ldp	x9, x10, [x0, #CTX_TPIDR_EL0]
519*54fd6939SJiyong Park	msr	tpidr_el0, x9
520*54fd6939SJiyong Park	msr	tpidrro_el0, x10
521*54fd6939SJiyong Park
522*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_PAR_EL1]
523*54fd6939SJiyong Park	msr	par_el1, x13
524*54fd6939SJiyong Park	msr	far_el1, x14
525*54fd6939SJiyong Park
526*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_AFSR0_EL1]
527*54fd6939SJiyong Park	msr	afsr0_el1, x15
528*54fd6939SJiyong Park	msr	afsr1_el1, x16
529*54fd6939SJiyong Park
530*54fd6939SJiyong Park	ldp	x17, x9, [x0, #CTX_CONTEXTIDR_EL1]
531*54fd6939SJiyong Park	msr	contextidr_el1, x17
532*54fd6939SJiyong Park	msr	vbar_el1, x9
533*54fd6939SJiyong Park
534*54fd6939SJiyong Park	/* Restore AArch32 system registers if the build has instructed so */
535*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
536*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_SPSR_ABT]
537*54fd6939SJiyong Park	msr	spsr_abt, x11
538*54fd6939SJiyong Park	msr	spsr_und, x12
539*54fd6939SJiyong Park
540*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_SPSR_IRQ]
541*54fd6939SJiyong Park	msr	spsr_irq, x13
542*54fd6939SJiyong Park	msr	spsr_fiq, x14
543*54fd6939SJiyong Park
544*54fd6939SJiyong Park	ldp	x15, x16, [x0, #CTX_DACR32_EL2]
545*54fd6939SJiyong Park	msr	dacr32_el2, x15
546*54fd6939SJiyong Park	msr	ifsr32_el2, x16
547*54fd6939SJiyong Park#endif
548*54fd6939SJiyong Park	/* Restore NS timer registers if the build has instructed so */
549*54fd6939SJiyong Park#if NS_TIMER_SWITCH
550*54fd6939SJiyong Park	ldp	x10, x11, [x0, #CTX_CNTP_CTL_EL0]
551*54fd6939SJiyong Park	msr	cntp_ctl_el0, x10
552*54fd6939SJiyong Park	msr	cntp_cval_el0, x11
553*54fd6939SJiyong Park
554*54fd6939SJiyong Park	ldp	x12, x13, [x0, #CTX_CNTV_CTL_EL0]
555*54fd6939SJiyong Park	msr	cntv_ctl_el0, x12
556*54fd6939SJiyong Park	msr	cntv_cval_el0, x13
557*54fd6939SJiyong Park
558*54fd6939SJiyong Park	ldr	x14, [x0, #CTX_CNTKCTL_EL1]
559*54fd6939SJiyong Park	msr	cntkctl_el1, x14
560*54fd6939SJiyong Park#endif
561*54fd6939SJiyong Park	/* Restore MTE system registers if the build has instructed so */
562*54fd6939SJiyong Park#if CTX_INCLUDE_MTE_REGS
563*54fd6939SJiyong Park	ldp	x11, x12, [x0, #CTX_TFSRE0_EL1]
564*54fd6939SJiyong Park	msr	TFSRE0_EL1, x11
565*54fd6939SJiyong Park	msr	TFSR_EL1, x12
566*54fd6939SJiyong Park
567*54fd6939SJiyong Park	ldp	x13, x14, [x0, #CTX_RGSR_EL1]
568*54fd6939SJiyong Park	msr	RGSR_EL1, x13
569*54fd6939SJiyong Park	msr	GCR_EL1, x14
570*54fd6939SJiyong Park#endif
571*54fd6939SJiyong Park
572*54fd6939SJiyong Park	/* No explict ISB required here as ERET covers it */
573*54fd6939SJiyong Park	ret
574*54fd6939SJiyong Parkendfunc el1_sysregs_context_restore
575*54fd6939SJiyong Park
576*54fd6939SJiyong Park/* ------------------------------------------------------------------
577*54fd6939SJiyong Park * The following function follows the aapcs_64 strictly to use
578*54fd6939SJiyong Park * x9-x17 (temporary caller-saved registers according to AArch64 PCS)
579*54fd6939SJiyong Park * to save floating point register context. It assumes that 'x0' is
580*54fd6939SJiyong Park * pointing to a 'fp_regs' structure where the register context will
581*54fd6939SJiyong Park * be saved.
582*54fd6939SJiyong Park *
583*54fd6939SJiyong Park * Access to VFP registers will trap if CPTR_EL3.TFP is set.
584*54fd6939SJiyong Park * However currently we don't use VFP registers nor set traps in
585*54fd6939SJiyong Park * Trusted Firmware, and assume it's cleared.
586*54fd6939SJiyong Park *
587*54fd6939SJiyong Park * TODO: Revisit when VFP is used in secure world
588*54fd6939SJiyong Park * ------------------------------------------------------------------
589*54fd6939SJiyong Park */
590*54fd6939SJiyong Park#if CTX_INCLUDE_FPREGS
591*54fd6939SJiyong Parkfunc fpregs_context_save
592*54fd6939SJiyong Park	stp	q0, q1, [x0, #CTX_FP_Q0]
593*54fd6939SJiyong Park	stp	q2, q3, [x0, #CTX_FP_Q2]
594*54fd6939SJiyong Park	stp	q4, q5, [x0, #CTX_FP_Q4]
595*54fd6939SJiyong Park	stp	q6, q7, [x0, #CTX_FP_Q6]
596*54fd6939SJiyong Park	stp	q8, q9, [x0, #CTX_FP_Q8]
597*54fd6939SJiyong Park	stp	q10, q11, [x0, #CTX_FP_Q10]
598*54fd6939SJiyong Park	stp	q12, q13, [x0, #CTX_FP_Q12]
599*54fd6939SJiyong Park	stp	q14, q15, [x0, #CTX_FP_Q14]
600*54fd6939SJiyong Park	stp	q16, q17, [x0, #CTX_FP_Q16]
601*54fd6939SJiyong Park	stp	q18, q19, [x0, #CTX_FP_Q18]
602*54fd6939SJiyong Park	stp	q20, q21, [x0, #CTX_FP_Q20]
603*54fd6939SJiyong Park	stp	q22, q23, [x0, #CTX_FP_Q22]
604*54fd6939SJiyong Park	stp	q24, q25, [x0, #CTX_FP_Q24]
605*54fd6939SJiyong Park	stp	q26, q27, [x0, #CTX_FP_Q26]
606*54fd6939SJiyong Park	stp	q28, q29, [x0, #CTX_FP_Q28]
607*54fd6939SJiyong Park	stp	q30, q31, [x0, #CTX_FP_Q30]
608*54fd6939SJiyong Park
609*54fd6939SJiyong Park	mrs	x9, fpsr
610*54fd6939SJiyong Park	str	x9, [x0, #CTX_FP_FPSR]
611*54fd6939SJiyong Park
612*54fd6939SJiyong Park	mrs	x10, fpcr
613*54fd6939SJiyong Park	str	x10, [x0, #CTX_FP_FPCR]
614*54fd6939SJiyong Park
615*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
616*54fd6939SJiyong Park	mrs	x11, fpexc32_el2
617*54fd6939SJiyong Park	str	x11, [x0, #CTX_FP_FPEXC32_EL2]
618*54fd6939SJiyong Park#endif
619*54fd6939SJiyong Park	ret
620*54fd6939SJiyong Parkendfunc fpregs_context_save
621*54fd6939SJiyong Park
622*54fd6939SJiyong Park/* ------------------------------------------------------------------
623*54fd6939SJiyong Park * The following function follows the aapcs_64 strictly to use x9-x17
624*54fd6939SJiyong Park * (temporary caller-saved registers according to AArch64 PCS) to
625*54fd6939SJiyong Park * restore floating point register context. It assumes that 'x0' is
626*54fd6939SJiyong Park * pointing to a 'fp_regs' structure from where the register context
627*54fd6939SJiyong Park * will be restored.
628*54fd6939SJiyong Park *
629*54fd6939SJiyong Park * Access to VFP registers will trap if CPTR_EL3.TFP is set.
630*54fd6939SJiyong Park * However currently we don't use VFP registers nor set traps in
631*54fd6939SJiyong Park * Trusted Firmware, and assume it's cleared.
632*54fd6939SJiyong Park *
633*54fd6939SJiyong Park * TODO: Revisit when VFP is used in secure world
634*54fd6939SJiyong Park * ------------------------------------------------------------------
635*54fd6939SJiyong Park */
636*54fd6939SJiyong Parkfunc fpregs_context_restore
637*54fd6939SJiyong Park	ldp	q0, q1, [x0, #CTX_FP_Q0]
638*54fd6939SJiyong Park	ldp	q2, q3, [x0, #CTX_FP_Q2]
639*54fd6939SJiyong Park	ldp	q4, q5, [x0, #CTX_FP_Q4]
640*54fd6939SJiyong Park	ldp	q6, q7, [x0, #CTX_FP_Q6]
641*54fd6939SJiyong Park	ldp	q8, q9, [x0, #CTX_FP_Q8]
642*54fd6939SJiyong Park	ldp	q10, q11, [x0, #CTX_FP_Q10]
643*54fd6939SJiyong Park	ldp	q12, q13, [x0, #CTX_FP_Q12]
644*54fd6939SJiyong Park	ldp	q14, q15, [x0, #CTX_FP_Q14]
645*54fd6939SJiyong Park	ldp	q16, q17, [x0, #CTX_FP_Q16]
646*54fd6939SJiyong Park	ldp	q18, q19, [x0, #CTX_FP_Q18]
647*54fd6939SJiyong Park	ldp	q20, q21, [x0, #CTX_FP_Q20]
648*54fd6939SJiyong Park	ldp	q22, q23, [x0, #CTX_FP_Q22]
649*54fd6939SJiyong Park	ldp	q24, q25, [x0, #CTX_FP_Q24]
650*54fd6939SJiyong Park	ldp	q26, q27, [x0, #CTX_FP_Q26]
651*54fd6939SJiyong Park	ldp	q28, q29, [x0, #CTX_FP_Q28]
652*54fd6939SJiyong Park	ldp	q30, q31, [x0, #CTX_FP_Q30]
653*54fd6939SJiyong Park
654*54fd6939SJiyong Park	ldr	x9, [x0, #CTX_FP_FPSR]
655*54fd6939SJiyong Park	msr	fpsr, x9
656*54fd6939SJiyong Park
657*54fd6939SJiyong Park	ldr	x10, [x0, #CTX_FP_FPCR]
658*54fd6939SJiyong Park	msr	fpcr, x10
659*54fd6939SJiyong Park
660*54fd6939SJiyong Park#if CTX_INCLUDE_AARCH32_REGS
661*54fd6939SJiyong Park	ldr	x11, [x0, #CTX_FP_FPEXC32_EL2]
662*54fd6939SJiyong Park	msr	fpexc32_el2, x11
663*54fd6939SJiyong Park#endif
664*54fd6939SJiyong Park	/*
665*54fd6939SJiyong Park	 * No explict ISB required here as ERET to
666*54fd6939SJiyong Park	 * switch to secure EL1 or non-secure world
667*54fd6939SJiyong Park	 * covers it
668*54fd6939SJiyong Park	 */
669*54fd6939SJiyong Park
670*54fd6939SJiyong Park	ret
671*54fd6939SJiyong Parkendfunc fpregs_context_restore
672*54fd6939SJiyong Park#endif /* CTX_INCLUDE_FPREGS */
673*54fd6939SJiyong Park
674*54fd6939SJiyong Park/* ------------------------------------------------------------------
675*54fd6939SJiyong Park * The following function is used to save and restore all the general
676*54fd6939SJiyong Park * purpose and ARMv8.3-PAuth (if enabled) registers.
677*54fd6939SJiyong Park * It also checks if Secure Cycle Counter is not disabled in MDCR_EL3
678*54fd6939SJiyong Park * when ARMv8.5-PMU is implemented, and if called from Non-secure
679*54fd6939SJiyong Park * state saves PMCR_EL0 and disables Cycle Counter.
680*54fd6939SJiyong Park *
681*54fd6939SJiyong Park * Ideally we would only save and restore the callee saved registers
682*54fd6939SJiyong Park * when a world switch occurs but that type of implementation is more
683*54fd6939SJiyong Park * complex. So currently we will always save and restore these
684*54fd6939SJiyong Park * registers on entry and exit of EL3.
685*54fd6939SJiyong Park * These are not macros to ensure their invocation fits within the 32
686*54fd6939SJiyong Park * instructions per exception vector.
687*54fd6939SJiyong Park * clobbers: x18
688*54fd6939SJiyong Park * ------------------------------------------------------------------
689*54fd6939SJiyong Park */
690*54fd6939SJiyong Parkfunc save_gp_pmcr_pauth_regs
691*54fd6939SJiyong Park	stp	x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0]
692*54fd6939SJiyong Park	stp	x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2]
693*54fd6939SJiyong Park	stp	x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4]
694*54fd6939SJiyong Park	stp	x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6]
695*54fd6939SJiyong Park	stp	x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8]
696*54fd6939SJiyong Park	stp	x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10]
697*54fd6939SJiyong Park	stp	x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12]
698*54fd6939SJiyong Park	stp	x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14]
699*54fd6939SJiyong Park	stp	x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16]
700*54fd6939SJiyong Park	stp	x18, x19, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X18]
701*54fd6939SJiyong Park	stp	x20, x21, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X20]
702*54fd6939SJiyong Park	stp	x22, x23, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X22]
703*54fd6939SJiyong Park	stp	x24, x25, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X24]
704*54fd6939SJiyong Park	stp	x26, x27, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X26]
705*54fd6939SJiyong Park	stp	x28, x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X28]
706*54fd6939SJiyong Park	mrs	x18, sp_el0
707*54fd6939SJiyong Park	str	x18, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_SP_EL0]
708*54fd6939SJiyong Park
709*54fd6939SJiyong Park	/* ----------------------------------------------------------
710*54fd6939SJiyong Park	 * Check if earlier initialization MDCR_EL3.SCCD/MCCD to 1
711*54fd6939SJiyong Park	 * failed, meaning that FEAT_PMUv3p5/7 is not implemented and
712*54fd6939SJiyong Park	 * PMCR_EL0 should be saved in non-secure context.
713*54fd6939SJiyong Park	 * ----------------------------------------------------------
714*54fd6939SJiyong Park	 */
715*54fd6939SJiyong Park	mov_imm	x10, (MDCR_SCCD_BIT | MDCR_MCCD_BIT)
716*54fd6939SJiyong Park	mrs	x9, mdcr_el3
717*54fd6939SJiyong Park	tst	x9, x10
718*54fd6939SJiyong Park	bne	1f
719*54fd6939SJiyong Park
720*54fd6939SJiyong Park	/* Secure Cycle Counter is not disabled */
721*54fd6939SJiyong Park	mrs	x9, pmcr_el0
722*54fd6939SJiyong Park
723*54fd6939SJiyong Park	/* Check caller's security state */
724*54fd6939SJiyong Park	mrs	x10, scr_el3
725*54fd6939SJiyong Park	tst	x10, #SCR_NS_BIT
726*54fd6939SJiyong Park	beq	2f
727*54fd6939SJiyong Park
728*54fd6939SJiyong Park	/* Save PMCR_EL0 if called from Non-secure state */
729*54fd6939SJiyong Park	str	x9, [sp, #CTX_EL3STATE_OFFSET + CTX_PMCR_EL0]
730*54fd6939SJiyong Park
731*54fd6939SJiyong Park	/* Disable cycle counter when event counting is prohibited */
732*54fd6939SJiyong Park2:	orr	x9, x9, #PMCR_EL0_DP_BIT
733*54fd6939SJiyong Park	msr	pmcr_el0, x9
734*54fd6939SJiyong Park	isb
735*54fd6939SJiyong Park1:
736*54fd6939SJiyong Park#if CTX_INCLUDE_PAUTH_REGS
737*54fd6939SJiyong Park	/* ----------------------------------------------------------
738*54fd6939SJiyong Park 	 * Save the ARMv8.3-PAuth keys as they are not banked
739*54fd6939SJiyong Park 	 * by exception level
740*54fd6939SJiyong Park	 * ----------------------------------------------------------
741*54fd6939SJiyong Park	 */
742*54fd6939SJiyong Park	add	x19, sp, #CTX_PAUTH_REGS_OFFSET
743*54fd6939SJiyong Park
744*54fd6939SJiyong Park	mrs	x20, APIAKeyLo_EL1	/* x21:x20 = APIAKey */
745*54fd6939SJiyong Park	mrs	x21, APIAKeyHi_EL1
746*54fd6939SJiyong Park	mrs	x22, APIBKeyLo_EL1	/* x23:x22 = APIBKey */
747*54fd6939SJiyong Park	mrs	x23, APIBKeyHi_EL1
748*54fd6939SJiyong Park	mrs	x24, APDAKeyLo_EL1	/* x25:x24 = APDAKey */
749*54fd6939SJiyong Park	mrs	x25, APDAKeyHi_EL1
750*54fd6939SJiyong Park	mrs	x26, APDBKeyLo_EL1	/* x27:x26 = APDBKey */
751*54fd6939SJiyong Park	mrs	x27, APDBKeyHi_EL1
752*54fd6939SJiyong Park	mrs	x28, APGAKeyLo_EL1	/* x29:x28 = APGAKey */
753*54fd6939SJiyong Park	mrs	x29, APGAKeyHi_EL1
754*54fd6939SJiyong Park
755*54fd6939SJiyong Park	stp	x20, x21, [x19, #CTX_PACIAKEY_LO]
756*54fd6939SJiyong Park	stp	x22, x23, [x19, #CTX_PACIBKEY_LO]
757*54fd6939SJiyong Park	stp	x24, x25, [x19, #CTX_PACDAKEY_LO]
758*54fd6939SJiyong Park	stp	x26, x27, [x19, #CTX_PACDBKEY_LO]
759*54fd6939SJiyong Park	stp	x28, x29, [x19, #CTX_PACGAKEY_LO]
760*54fd6939SJiyong Park#endif /* CTX_INCLUDE_PAUTH_REGS */
761*54fd6939SJiyong Park
762*54fd6939SJiyong Park	ret
763*54fd6939SJiyong Parkendfunc save_gp_pmcr_pauth_regs
764*54fd6939SJiyong Park
765*54fd6939SJiyong Park/* ------------------------------------------------------------------
766*54fd6939SJiyong Park * This function restores ARMv8.3-PAuth (if enabled) and all general
767*54fd6939SJiyong Park * purpose registers except x30 from the CPU context.
768*54fd6939SJiyong Park * x30 register must be explicitly restored by the caller.
769*54fd6939SJiyong Park * ------------------------------------------------------------------
770*54fd6939SJiyong Park */
771*54fd6939SJiyong Parkfunc restore_gp_pmcr_pauth_regs
772*54fd6939SJiyong Park#if CTX_INCLUDE_PAUTH_REGS
773*54fd6939SJiyong Park 	/* Restore the ARMv8.3 PAuth keys */
774*54fd6939SJiyong Park	add	x10, sp, #CTX_PAUTH_REGS_OFFSET
775*54fd6939SJiyong Park
776*54fd6939SJiyong Park	ldp	x0, x1, [x10, #CTX_PACIAKEY_LO]	/* x1:x0 = APIAKey */
777*54fd6939SJiyong Park	ldp	x2, x3, [x10, #CTX_PACIBKEY_LO]	/* x3:x2 = APIBKey */
778*54fd6939SJiyong Park	ldp	x4, x5, [x10, #CTX_PACDAKEY_LO]	/* x5:x4 = APDAKey */
779*54fd6939SJiyong Park	ldp	x6, x7, [x10, #CTX_PACDBKEY_LO]	/* x7:x6 = APDBKey */
780*54fd6939SJiyong Park	ldp	x8, x9, [x10, #CTX_PACGAKEY_LO]	/* x9:x8 = APGAKey */
781*54fd6939SJiyong Park
782*54fd6939SJiyong Park	msr	APIAKeyLo_EL1, x0
783*54fd6939SJiyong Park	msr	APIAKeyHi_EL1, x1
784*54fd6939SJiyong Park	msr	APIBKeyLo_EL1, x2
785*54fd6939SJiyong Park	msr	APIBKeyHi_EL1, x3
786*54fd6939SJiyong Park	msr	APDAKeyLo_EL1, x4
787*54fd6939SJiyong Park	msr	APDAKeyHi_EL1, x5
788*54fd6939SJiyong Park	msr	APDBKeyLo_EL1, x6
789*54fd6939SJiyong Park	msr	APDBKeyHi_EL1, x7
790*54fd6939SJiyong Park	msr	APGAKeyLo_EL1, x8
791*54fd6939SJiyong Park	msr	APGAKeyHi_EL1, x9
792*54fd6939SJiyong Park#endif /* CTX_INCLUDE_PAUTH_REGS */
793*54fd6939SJiyong Park
794*54fd6939SJiyong Park	/* ----------------------------------------------------------
795*54fd6939SJiyong Park	 * Restore PMCR_EL0 when returning to Non-secure state if
796*54fd6939SJiyong Park	 * Secure Cycle Counter is not disabled in MDCR_EL3 when
797*54fd6939SJiyong Park	 * ARMv8.5-PMU is implemented.
798*54fd6939SJiyong Park	 * ----------------------------------------------------------
799*54fd6939SJiyong Park	 */
800*54fd6939SJiyong Park	mrs	x0, scr_el3
801*54fd6939SJiyong Park	tst	x0, #SCR_NS_BIT
802*54fd6939SJiyong Park	beq	2f
803*54fd6939SJiyong Park
804*54fd6939SJiyong Park	/* ----------------------------------------------------------
805*54fd6939SJiyong Park	 * Back to Non-secure state.
806*54fd6939SJiyong Park	 * Check if earlier initialization MDCR_EL3.SCCD/MCCD to 1
807*54fd6939SJiyong Park	 * failed, meaning that FEAT_PMUv3p5/7 is not implemented and
808*54fd6939SJiyong Park	 * PMCR_EL0 should be restored from non-secure context.
809*54fd6939SJiyong Park	 * ----------------------------------------------------------
810*54fd6939SJiyong Park	 */
811*54fd6939SJiyong Park	mov_imm	x1, (MDCR_SCCD_BIT | MDCR_MCCD_BIT)
812*54fd6939SJiyong Park	mrs	x0, mdcr_el3
813*54fd6939SJiyong Park	tst	x0, x1
814*54fd6939SJiyong Park	bne	2f
815*54fd6939SJiyong Park	ldr	x0, [sp, #CTX_EL3STATE_OFFSET + CTX_PMCR_EL0]
816*54fd6939SJiyong Park	msr	pmcr_el0, x0
817*54fd6939SJiyong Park2:
818*54fd6939SJiyong Park	ldp	x0, x1, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X0]
819*54fd6939SJiyong Park	ldp	x2, x3, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X2]
820*54fd6939SJiyong Park	ldp	x4, x5, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X4]
821*54fd6939SJiyong Park	ldp	x6, x7, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X6]
822*54fd6939SJiyong Park	ldp	x8, x9, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X8]
823*54fd6939SJiyong Park	ldp	x10, x11, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X10]
824*54fd6939SJiyong Park	ldp	x12, x13, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X12]
825*54fd6939SJiyong Park	ldp	x14, x15, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X14]
826*54fd6939SJiyong Park	ldp	x16, x17, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X16]
827*54fd6939SJiyong Park	ldp	x18, x19, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X18]
828*54fd6939SJiyong Park	ldp	x20, x21, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X20]
829*54fd6939SJiyong Park	ldp	x22, x23, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X22]
830*54fd6939SJiyong Park	ldp	x24, x25, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X24]
831*54fd6939SJiyong Park	ldp	x26, x27, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X26]
832*54fd6939SJiyong Park	ldr	x28, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_SP_EL0]
833*54fd6939SJiyong Park	msr	sp_el0, x28
834*54fd6939SJiyong Park	ldp	x28, x29, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_X28]
835*54fd6939SJiyong Park	ret
836*54fd6939SJiyong Parkendfunc restore_gp_pmcr_pauth_regs
837*54fd6939SJiyong Park
838*54fd6939SJiyong Park/*
839*54fd6939SJiyong Park * In case of ERRATA_SPECULATIVE_AT, save SCTLR_EL1 and TCR_EL1
840*54fd6939SJiyong Park * registers and update EL1 registers to disable stage1 and stage2
841*54fd6939SJiyong Park * page table walk
842*54fd6939SJiyong Park */
843*54fd6939SJiyong Parkfunc save_and_update_ptw_el1_sys_regs
844*54fd6939SJiyong Park	/* ----------------------------------------------------------
845*54fd6939SJiyong Park	 * Save only sctlr_el1 and tcr_el1 registers
846*54fd6939SJiyong Park	 * ----------------------------------------------------------
847*54fd6939SJiyong Park	 */
848*54fd6939SJiyong Park	mrs	x29, sctlr_el1
849*54fd6939SJiyong Park	str	x29, [sp, #(CTX_EL1_SYSREGS_OFFSET + CTX_SCTLR_EL1)]
850*54fd6939SJiyong Park	mrs	x29, tcr_el1
851*54fd6939SJiyong Park	str	x29, [sp, #(CTX_EL1_SYSREGS_OFFSET + CTX_TCR_EL1)]
852*54fd6939SJiyong Park
853*54fd6939SJiyong Park	/* ------------------------------------------------------------
854*54fd6939SJiyong Park	 * Must follow below order in order to disable page table
855*54fd6939SJiyong Park	 * walk for lower ELs (EL1 and EL0). First step ensures that
856*54fd6939SJiyong Park	 * page table walk is disabled for stage1 and second step
857*54fd6939SJiyong Park	 * ensures that page table walker should use TCR_EL1.EPDx
858*54fd6939SJiyong Park	 * bits to perform address translation. ISB ensures that CPU
859*54fd6939SJiyong Park	 * does these 2 steps in order.
860*54fd6939SJiyong Park	 *
861*54fd6939SJiyong Park	 * 1. Update TCR_EL1.EPDx bits to disable page table walk by
862*54fd6939SJiyong Park	 *    stage1.
863*54fd6939SJiyong Park	 * 2. Enable MMU bit to avoid identity mapping via stage2
864*54fd6939SJiyong Park	 *    and force TCR_EL1.EPDx to be used by the page table
865*54fd6939SJiyong Park	 *    walker.
866*54fd6939SJiyong Park	 * ------------------------------------------------------------
867*54fd6939SJiyong Park	 */
868*54fd6939SJiyong Park	orr	x29, x29, #(TCR_EPD0_BIT)
869*54fd6939SJiyong Park	orr	x29, x29, #(TCR_EPD1_BIT)
870*54fd6939SJiyong Park	msr	tcr_el1, x29
871*54fd6939SJiyong Park	isb
872*54fd6939SJiyong Park	mrs	x29, sctlr_el1
873*54fd6939SJiyong Park	orr	x29, x29, #SCTLR_M_BIT
874*54fd6939SJiyong Park	msr	sctlr_el1, x29
875*54fd6939SJiyong Park	isb
876*54fd6939SJiyong Park
877*54fd6939SJiyong Park	ret
878*54fd6939SJiyong Parkendfunc save_and_update_ptw_el1_sys_regs
879*54fd6939SJiyong Park
880*54fd6939SJiyong Park/* ------------------------------------------------------------------
881*54fd6939SJiyong Park * This routine assumes that the SP_EL3 is pointing to a valid
882*54fd6939SJiyong Park * context structure from where the gp regs and other special
883*54fd6939SJiyong Park * registers can be retrieved.
884*54fd6939SJiyong Park * ------------------------------------------------------------------
885*54fd6939SJiyong Park */
886*54fd6939SJiyong Parkfunc el3_exit
887*54fd6939SJiyong Park#if ENABLE_ASSERTIONS
888*54fd6939SJiyong Park	/* el3_exit assumes SP_EL0 on entry */
889*54fd6939SJiyong Park	mrs	x17, spsel
890*54fd6939SJiyong Park	cmp	x17, #MODE_SP_EL0
891*54fd6939SJiyong Park	ASM_ASSERT(eq)
892*54fd6939SJiyong Park#endif
893*54fd6939SJiyong Park
894*54fd6939SJiyong Park	/* ----------------------------------------------------------
895*54fd6939SJiyong Park	 * Save the current SP_EL0 i.e. the EL3 runtime stack which
896*54fd6939SJiyong Park	 * will be used for handling the next SMC.
897*54fd6939SJiyong Park	 * Then switch to SP_EL3.
898*54fd6939SJiyong Park	 * ----------------------------------------------------------
899*54fd6939SJiyong Park	 */
900*54fd6939SJiyong Park	mov	x17, sp
901*54fd6939SJiyong Park	msr	spsel, #MODE_SP_ELX
902*54fd6939SJiyong Park	str	x17, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]
903*54fd6939SJiyong Park
904*54fd6939SJiyong Park	/* ----------------------------------------------------------
905*54fd6939SJiyong Park	 * Restore SPSR_EL3, ELR_EL3 and SCR_EL3 prior to ERET
906*54fd6939SJiyong Park	 * ----------------------------------------------------------
907*54fd6939SJiyong Park	 */
908*54fd6939SJiyong Park	ldr	x18, [sp, #CTX_EL3STATE_OFFSET + CTX_SCR_EL3]
909*54fd6939SJiyong Park	ldp	x16, x17, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]
910*54fd6939SJiyong Park	msr	scr_el3, x18
911*54fd6939SJiyong Park	msr	spsr_el3, x16
912*54fd6939SJiyong Park	msr	elr_el3, x17
913*54fd6939SJiyong Park
914*54fd6939SJiyong Park#if IMAGE_BL31
915*54fd6939SJiyong Park	/* ----------------------------------------------------------
916*54fd6939SJiyong Park	 * Restore CPTR_EL3.
917*54fd6939SJiyong Park	 * ZCR is only restored if SVE is supported and enabled.
918*54fd6939SJiyong Park	 * Synchronization is required before zcr_el3 is addressed.
919*54fd6939SJiyong Park	 * ----------------------------------------------------------
920*54fd6939SJiyong Park	 */
921*54fd6939SJiyong Park	ldp	x19, x20, [sp, #CTX_EL3STATE_OFFSET + CTX_CPTR_EL3]
922*54fd6939SJiyong Park	msr	cptr_el3, x19
923*54fd6939SJiyong Park
924*54fd6939SJiyong Park	ands	x19, x19, #CPTR_EZ_BIT
925*54fd6939SJiyong Park	beq	sve_not_enabled
926*54fd6939SJiyong Park
927*54fd6939SJiyong Park	isb
928*54fd6939SJiyong Park	msr	S3_6_C1_C2_0, x20 /* zcr_el3 */
929*54fd6939SJiyong Parksve_not_enabled:
930*54fd6939SJiyong Park#endif
931*54fd6939SJiyong Park
932*54fd6939SJiyong Park#if IMAGE_BL31 && DYNAMIC_WORKAROUND_CVE_2018_3639
933*54fd6939SJiyong Park	/* ----------------------------------------------------------
934*54fd6939SJiyong Park	 * Restore mitigation state as it was on entry to EL3
935*54fd6939SJiyong Park	 * ----------------------------------------------------------
936*54fd6939SJiyong Park	 */
937*54fd6939SJiyong Park	ldr	x17, [sp, #CTX_CVE_2018_3639_OFFSET + CTX_CVE_2018_3639_DISABLE]
938*54fd6939SJiyong Park	cbz	x17, 1f
939*54fd6939SJiyong Park	blr	x17
940*54fd6939SJiyong Park1:
941*54fd6939SJiyong Park#endif
942*54fd6939SJiyong Park	restore_ptw_el1_sys_regs
943*54fd6939SJiyong Park
944*54fd6939SJiyong Park	/* ----------------------------------------------------------
945*54fd6939SJiyong Park	 * Restore general purpose (including x30), PMCR_EL0 and
946*54fd6939SJiyong Park	 * ARMv8.3-PAuth registers.
947*54fd6939SJiyong Park	 * Exit EL3 via ERET to a lower exception level.
948*54fd6939SJiyong Park 	 * ----------------------------------------------------------
949*54fd6939SJiyong Park 	 */
950*54fd6939SJiyong Park	bl	restore_gp_pmcr_pauth_regs
951*54fd6939SJiyong Park	ldr	x30, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
952*54fd6939SJiyong Park
953*54fd6939SJiyong Park#if IMAGE_BL31 && RAS_EXTENSION
954*54fd6939SJiyong Park	/* ----------------------------------------------------------
955*54fd6939SJiyong Park	 * Issue Error Synchronization Barrier to synchronize SErrors
956*54fd6939SJiyong Park	 * before exiting EL3. We're running with EAs unmasked, so
957*54fd6939SJiyong Park	 * any synchronized errors would be taken immediately;
958*54fd6939SJiyong Park	 * therefore no need to inspect DISR_EL1 register.
959*54fd6939SJiyong Park 	 * ----------------------------------------------------------
960*54fd6939SJiyong Park	 */
961*54fd6939SJiyong Park	esb
962*54fd6939SJiyong Park#else
963*54fd6939SJiyong Park	dsb	sy
964*54fd6939SJiyong Park#endif
965*54fd6939SJiyong Park#ifdef IMAGE_BL31
966*54fd6939SJiyong Park	str	xzr, [sp, #CTX_EL3STATE_OFFSET + CTX_IS_IN_EL3]
967*54fd6939SJiyong Park#endif
968*54fd6939SJiyong Park	exception_return
969*54fd6939SJiyong Park
970*54fd6939SJiyong Parkendfunc el3_exit
971