xref: /rk3399_ARM-atf/include/lib/el3_runtime/context_el2.h (revision 4ec4e545c66cb888bfbedcea4030a234421457d7)
1 /*
2  * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef CONTEXT_EL2_H
8 #define CONTEXT_EL2_H
9 
10 #ifndef __ASSEMBLER__
11 /*******************************************************************************
12  * EL2 Registers:
13  * AArch64 EL2 system register context structure for preserving the
14  * architectural state during world switches.
15  ******************************************************************************/
16 typedef struct el2_common_regs {
17 	uint64_t actlr_el2;
18 	uint64_t afsr0_el2;
19 	uint64_t afsr1_el2;
20 	uint64_t amair_el2;
21 	uint64_t cnthctl_el2;
22 	uint64_t cntvoff_el2;
23 	uint64_t cptr_el2;
24 	uint64_t dbgvcr32_el2;
25 	uint64_t elr_el2;
26 	uint64_t esr_el2;
27 	uint64_t far_el2;
28 	uint64_t hacr_el2;
29 	uint64_t hcr_el2;
30 	uint64_t hpfar_el2;
31 	uint64_t hstr_el2;
32 	uint64_t icc_sre_el2;
33 	uint64_t ich_hcr_el2;
34 	uint64_t ich_vmcr_el2;
35 	uint64_t mair_el2;
36 	uint64_t mdcr_el2;
37 	uint64_t pmscr_el2;
38 	uint64_t sctlr_el2;
39 	uint64_t spsr_el2;
40 	uint64_t sp_el2;
41 	uint64_t tcr_el2;
42 	uint64_t tpidr_el2;
43 	uint64_t ttbr0_el2;
44 	uint64_t vbar_el2;
45 	uint64_t vmpidr_el2;
46 	uint64_t vpidr_el2;
47 	uint64_t vtcr_el2;
48 	uint64_t vttbr_el2;
49 } el2_common_regs_t;
50 
51 typedef struct el2_mte2_regs {
52 	uint64_t tfsr_el2;
53 } el2_mte2_regs_t;
54 
55 typedef struct el2_fgt_regs {
56 	uint64_t hdfgrtr_el2;
57 	uint64_t hafgrtr_el2;
58 	uint64_t hdfgwtr_el2;
59 	uint64_t hfgitr_el2;
60 	uint64_t hfgrtr_el2;
61 	uint64_t hfgwtr_el2;
62 } el2_fgt_regs_t;
63 
64 typedef struct el2_fgt2_regs {
65 	uint64_t hdfgrtr2_el2;
66 	uint64_t hdfgwtr2_el2;
67 	uint64_t hfgitr2_el2;
68 	uint64_t hfgrtr2_el2;
69 	uint64_t hfgwtr2_el2;
70 } el2_fgt2_regs_t;
71 
72 typedef struct el2_ecv_regs {
73 	uint64_t cntpoff_el2;
74 } el2_ecv_regs_t;
75 
76 typedef struct el2_vhe_regs {
77 	uint64_t contextidr_el2;
78 	uint64_t ttbr1_el2;
79 } el2_vhe_regs_t;
80 
81 typedef struct el2_ras_regs {
82 	uint64_t vdisr_el2;
83 	uint64_t vsesr_el2;
84 } el2_ras_regs_t;
85 
86 typedef struct el2_neve_regs {
87 	uint64_t vncr_el2;
88 } el2_neve_regs_t;
89 
90 typedef struct el2_trf_regs {
91 	uint64_t trfcr_el2;
92 } el2_trf_regs_t;
93 
94 typedef struct el2_csv2_regs {
95 	uint64_t scxtnum_el2;
96 } el2_csv2_regs_t;
97 
98 typedef struct el2_hcx_regs {
99 	uint64_t hcrx_el2;
100 } el2_hcx_regs_t;
101 
102 typedef struct el2_tcr2_regs {
103 	uint64_t tcr2_el2;
104 } el2_tcr2_regs_t;
105 
106 typedef struct el2_sxpoe_regs {
107 	uint64_t por_el2;
108 } el2_sxpoe_regs_t;
109 
110 typedef struct el2_sxpie_regs {
111 	uint64_t pire0_el2;
112 	uint64_t pir_el2;
113 } el2_sxpie_regs_t;
114 
115 typedef struct el2_s2pie_regs {
116 	uint64_t s2pir_el2;
117 } el2_s2pie_regs_t;
118 
119 typedef struct el2_gcs_regs {
120 	uint64_t gcscr_el2;
121 	uint64_t gcspr_el2;
122 } el2_gcs_regs_t;
123 
124 typedef struct el2_mpam_regs {
125 	uint64_t mpam2_el2;
126 	uint64_t mpamhcr_el2;
127 	uint64_t mpamvpm0_el2;
128 	uint64_t mpamvpm1_el2;
129 	uint64_t mpamvpm2_el2;
130 	uint64_t mpamvpm3_el2;
131 	uint64_t mpamvpm4_el2;
132 	uint64_t mpamvpm5_el2;
133 	uint64_t mpamvpm6_el2;
134 	uint64_t mpamvpm7_el2;
135 	uint64_t mpamvpmv_el2;
136 } el2_mpam_regs_t;
137 
138 typedef struct el2_sctlr2_regs {
139 	uint64_t sctlr2_el2;
140 } el2_sctlr2_regs_t;
141 
142 typedef struct el2_sysregs {
143 
144 	el2_common_regs_t common;
145 
146 #if ENABLE_FEAT_MTE2
147 	el2_mte2_regs_t mte2;
148 #endif
149 
150 #if ENABLE_FEAT_FGT
151 	el2_fgt_regs_t fgt;
152 #endif
153 
154 #if ENABLE_FEAT_FGT2
155 	el2_fgt2_regs_t fgt2;
156 #endif
157 
158 #if ENABLE_FEAT_ECV
159 	el2_ecv_regs_t ecv;
160 #endif
161 
162 #if ENABLE_FEAT_VHE
163 	el2_vhe_regs_t vhe;
164 #endif
165 
166 #if ENABLE_FEAT_RAS
167 	el2_ras_regs_t ras;
168 #endif
169 
170 #if CTX_INCLUDE_NEVE_REGS
171 	el2_neve_regs_t neve;
172 #endif
173 
174 #if ENABLE_TRF_FOR_NS
175 	el2_trf_regs_t trf;
176 #endif
177 
178 #if ENABLE_FEAT_CSV2_2
179 	el2_csv2_regs_t csv2;
180 #endif
181 
182 #if ENABLE_FEAT_HCX
183 	el2_hcx_regs_t hcx;
184 #endif
185 
186 #if ENABLE_FEAT_TCR2
187 	el2_tcr2_regs_t tcr2;
188 #endif
189 
190 #if (ENABLE_FEAT_S1POE || ENABLE_FEAT_S2POE)
191 	el2_sxpoe_regs_t sxpoe;
192 #endif
193 
194 #if (ENABLE_FEAT_S1PIE || ENABLE_FEAT_S2PIE)
195 	el2_sxpie_regs_t sxpie;
196 #endif
197 
198 #if ENABLE_FEAT_S2PIE
199 	el2_s2pie_regs_t s2pie;
200 #endif
201 
202 #if ENABLE_FEAT_GCS
203 	el2_gcs_regs_t gcs;
204 #endif
205 
206 #if CTX_INCLUDE_MPAM_REGS
207 	el2_mpam_regs_t mpam;
208 #endif
209 
210 #if ENABLE_FEAT_SCTLR2
211 	el2_sctlr2_regs_t sctlr2;
212 #endif
213 
214 } el2_sysregs_t;
215 
216 /*
217  * Macros to access members related to individual features of the el2_sysregs_t
218  * structures.
219  */
220 #define read_el2_ctx_common(ctx, reg)		(((ctx)->common).reg)
221 
222 #define write_el2_ctx_common(ctx, reg, val)	((((ctx)->common).reg)	\
223 							= (uint64_t) (val))
224 
225 #if ENABLE_FEAT_MTE2
226 #define read_el2_ctx_mte2(ctx, reg)		(((ctx)->mte2).reg)
227 #define write_el2_ctx_mte2(ctx, reg, val)	((((ctx)->mte2).reg)	\
228 							= (uint64_t) (val))
229 #else
230 #define read_el2_ctx_mte2(ctx, reg)		ULL(0)
231 #define write_el2_ctx_mte2(ctx, reg, val)
232 #endif /* ENABLE_FEAT_MTE2 */
233 
234 #if ENABLE_FEAT_FGT
235 #define read_el2_ctx_fgt(ctx, reg)		(((ctx)->fgt).reg)
236 #define write_el2_ctx_fgt(ctx, reg, val)	((((ctx)->fgt).reg)	\
237 							= (uint64_t) (val))
238 #else
239 #define read_el2_ctx_fgt(ctx, reg)		ULL(0)
240 #define write_el2_ctx_fgt(ctx, reg, val)
241 #endif /* ENABLE_FEAT_FGT */
242 
243 #if ENABLE_FEAT_FGT2
244 #define read_el2_ctx_fgt2(ctx, reg)		(((ctx)->fgt2).reg)
245 #define write_el2_ctx_fgt2(ctx, reg, val)	((((ctx)->fgt2).reg)	\
246 							= (uint64_t) (val))
247 #else
248 #define read_el2_ctx_fgt2(ctx, reg)		ULL(0)
249 #define write_el2_ctx_fgt2(ctx, reg, val)
250 #endif /* ENABLE_FEAT_FGT */
251 
252 #if ENABLE_FEAT_ECV
253 #define read_el2_ctx_ecv(ctx, reg)		(((ctx)->ecv).reg)
254 #define write_el2_ctx_ecv(ctx, reg, val)	((((ctx)->ecv).reg)	\
255 							= (uint64_t) (val))
256 #else
257 #define read_el2_ctx_ecv(ctx, reg)		ULL(0)
258 #define write_el2_ctx_ecv(ctx, reg, val)
259 #endif /* ENABLE_FEAT_ECV */
260 
261 #if ENABLE_FEAT_VHE
262 #define read_el2_ctx_vhe(ctx, reg)		(((ctx)->vhe).reg)
263 #define write_el2_ctx_vhe(ctx, reg, val)	((((ctx)->vhe).reg)	\
264 							= (uint64_t) (val))
265 #else
266 #define read_el2_ctx_vhe(ctx, reg)		ULL(0)
267 #define write_el2_ctx_vhe(ctx, reg, val)
268 #endif /* ENABLE_FEAT_VHE */
269 
270 #if ENABLE_FEAT_RAS
271 #define read_el2_ctx_ras(ctx, reg)		(((ctx)->ras).reg)
272 #define write_el2_ctx_ras(ctx, reg, val)	((((ctx)->ras).reg)	\
273 							= (uint64_t) (val))
274 #else
275 #define read_el2_ctx_ras(ctx, reg)		ULL(0)
276 #define write_el2_ctx_ras(ctx, reg, val)
277 #endif /* ENABLE_FEAT_RAS */
278 
279 #if CTX_INCLUDE_NEVE_REGS
280 #define read_el2_ctx_neve(ctx, reg)		(((ctx)->neve).reg)
281 #define write_el2_ctx_neve(ctx, reg, val)	((((ctx)->neve).reg)	\
282 							= (uint64_t) (val))
283 #else
284 #define read_el2_ctx_neve(ctx, reg)		ULL(0)
285 #define write_el2_ctx_neve(ctx, reg, val)
286 #endif /* CTX_INCLUDE_NEVE_REGS */
287 
288 #if ENABLE_TRF_FOR_NS
289 #define read_el2_ctx_trf(ctx, reg)		(((ctx)->trf).reg)
290 #define write_el2_ctx_trf(ctx, reg, val)	((((ctx)->trf).reg)	\
291 							= (uint64_t) (val))
292 #else
293 #define read_el2_ctx_trf(ctx, reg)		ULL(0)
294 #define write_el2_ctx_trf(ctx, reg, val)
295 #endif /* ENABLE_TRF_FOR_NS */
296 
297 #if ENABLE_FEAT_CSV2_2
298 #define read_el2_ctx_csv2_2(ctx, reg)		(((ctx)->csv2).reg)
299 #define write_el2_ctx_csv2_2(ctx, reg, val)	((((ctx)->csv2).reg)	\
300 							= (uint64_t) (val))
301 #else
302 #define read_el2_ctx_csv2_2(ctx, reg)		ULL(0)
303 #define write_el2_ctx_csv2_2(ctx, reg, val)
304 #endif /* ENABLE_FEAT_CSV2_2 */
305 
306 #if ENABLE_FEAT_HCX
307 #define read_el2_ctx_hcx(ctx, reg)		(((ctx)->hcx).reg)
308 #define write_el2_ctx_hcx(ctx, reg, val)	((((ctx)->hcx).reg)	\
309 							= (uint64_t) (val))
310 #else
311 #define read_el2_ctx_hcx(ctx, reg)		ULL(0)
312 #define write_el2_ctx_hcx(ctx, reg, val)
313 #endif /* ENABLE_FEAT_HCX */
314 
315 #if ENABLE_FEAT_TCR2
316 #define read_el2_ctx_tcr2(ctx, reg)		(((ctx)->tcr2).reg)
317 #define write_el2_ctx_tcr2(ctx, reg, val)	((((ctx)->tcr2).reg)	\
318 							= (uint64_t) (val))
319 #else
320 #define read_el2_ctx_tcr2(ctx, reg)		ULL(0)
321 #define write_el2_ctx_tcr2(ctx, reg, val)
322 #endif /* ENABLE_FEAT_TCR2 */
323 
324 #if (ENABLE_FEAT_S1POE || ENABLE_FEAT_S2POE)
325 #define read_el2_ctx_sxpoe(ctx, reg)		(((ctx)->sxpoe).reg)
326 #define write_el2_ctx_sxpoe(ctx, reg, val)	((((ctx)->sxpoe).reg)	\
327 							= (uint64_t) (val))
328 #else
329 #define read_el2_ctx_sxpoe(ctx, reg)		ULL(0)
330 #define write_el2_ctx_sxpoe(ctx, reg, val)
331 #endif /*(ENABLE_FEAT_S1POE || ENABLE_FEAT_S2POE) */
332 
333 #if (ENABLE_FEAT_S1PIE || ENABLE_FEAT_S2PIE)
334 #define read_el2_ctx_sxpie(ctx, reg)		(((ctx)->sxpie).reg)
335 #define write_el2_ctx_sxpie(ctx, reg, val)	((((ctx)->sxpie).reg)	\
336 							= (uint64_t) (val))
337 #else
338 #define read_el2_ctx_sxpie(ctx, reg)		ULL(0)
339 #define write_el2_ctx_sxpie(ctx, reg, val)
340 #endif /*(ENABLE_FEAT_S1PIE || ENABLE_FEAT_S2PIE) */
341 
342 #if ENABLE_FEAT_S2PIE
343 #define read_el2_ctx_s2pie(ctx, reg)		(((ctx)->s2pie).reg)
344 #define write_el2_ctx_s2pie(ctx, reg, val)	((((ctx)->s2pie).reg)	\
345 							= (uint64_t) (val))
346 #else
347 #define read_el2_ctx_s2pie(ctx, reg)		ULL(0)
348 #define write_el2_ctx_s2pie(ctx, reg, val)
349 #endif /* ENABLE_FEAT_S2PIE */
350 
351 #if ENABLE_FEAT_GCS
352 #define read_el2_ctx_gcs(ctx, reg)		(((ctx)->gcs).reg)
353 #define write_el2_ctx_gcs(ctx, reg, val)	((((ctx)->gcs).reg)	\
354 							= (uint64_t) (val))
355 #else
356 #define read_el2_ctx_gcs(ctx, reg)		ULL(0)
357 #define write_el2_ctx_gcs(ctx, reg, val)
358 #endif /* ENABLE_FEAT_GCS */
359 
360 #if CTX_INCLUDE_MPAM_REGS
361 #define read_el2_ctx_mpam(ctx, reg)		(((ctx)->mpam).reg)
362 #define write_el2_ctx_mpam(ctx, reg, val)	((((ctx)->mpam).reg)	\
363 							= (uint64_t) (val))
364 #else
365 #define read_el2_ctx_mpam(ctx, reg)		ULL(0)
366 #define write_el2_ctx_mpam(ctx, reg, val)
367 #endif /* CTX_INCLUDE_MPAM_REGS */
368 
369 #if ENABLE_FEAT_SCTLR2
370 #define read_el2_ctx_sctlr2(ctx, reg)		(((ctx)->sctlr2).reg)
371 #define write_el2_ctx_sctlr2(ctx, reg, val)	((((ctx)->sctlr2).reg)	\
372 							= (uint64_t) (val))
373 #else
374 #define read_el2_ctx_sctlr2(ctx, reg)		ULL(0)
375 #define write_el2_ctx_sctlr2(ctx, reg, val)
376 #endif /* ENABLE_FEAT_SCTLR2 */
377 
378 /******************************************************************************/
379 
380 #endif /* __ASSEMBLER__ */
381 
382 #endif /* CONTEXT_EL2_H */
383