summaryrefslogtreecommitdiff
path: root/include/lib/el3_runtime/context_el1.h
blob: f320d2c5f9d4dfc835abb63d3f758ebf104ab521 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
/*
 * Copyright (c) 2024-2026, Arm Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef CONTEXT_EL1_H
#define CONTEXT_EL1_H

#include <lib/extensions/sysreg128.h>

#ifndef __ASSEMBLER__

/*******************************************************************************
 * EL1 Registers:
 * AArch64 EL1 system register context structure for preserving the
 * architectural state during world switches.
 ******************************************************************************/

typedef struct el1_common_regs {
	uint64_t spsr_el1;
	uint64_t elr_el1;

#if (!ERRATA_SPECULATIVE_AT)
	uint64_t sctlr_el1;
	uint64_t tcr_el1;
#endif /* ERRATA_SPECULATIVE_AT=0 */

	uint64_t cpacr_el1;
	uint64_t csselr_el1;
	uint64_t sp_el1;
	uint64_t esr_el1;
	uint64_t mair_el1;
	uint64_t amair_el1;
	uint64_t actlr_el1;
	uint64_t tpidr_el1;
	uint64_t tpidr_el0;
	uint64_t tpidrro_el0;
	uint64_t far_el1;
	uint64_t afsr0_el1;
	uint64_t afsr1_el1;
	uint64_t contextidr_el1;
	uint64_t vbar_el1;
	uint64_t mdccint_el1;
	uint64_t mdscr_el1;
	sysreg_t par_el1;
	sysreg_t ttbr0_el1;
	sysreg_t ttbr1_el1;
} el1_common_regs_t;

typedef struct el1_aarch32_regs {
	uint64_t spsr_abt;
	uint64_t spsr_und;
	uint64_t spsr_irq;
	uint64_t spsr_fiq;
	uint64_t dacr32_el2;
	uint64_t ifsr32_el2;
} el1_aarch32_regs_t;

typedef struct el1_arch_timer_regs {
#if NS_TIMER_SWITCH
	uint64_t cntp_ctl_el0;
	uint64_t cntp_cval_el0;
	uint64_t cntv_ctl_el0;
	uint64_t cntv_cval_el0;
#endif
	uint64_t cntkctl_el1;
} el1_arch_timer_regs_t;

typedef struct el1_mte2_regs {
	uint64_t tfsre0_el1;
	uint64_t tfsr_el1;
	uint64_t rgsr_el1;
	uint64_t gcr_el1;
} el1_mte2_regs_t;

typedef struct el1_ras_regs {
	uint64_t disr_el1;
} el1_ras_regs_t;

typedef struct el1_s1pie_regs {
	uint64_t pire0_el1;
	uint64_t pir_el1;
} el1_s1pie_regs_t;

typedef struct el1_s1poe_regs {
	uint64_t por_el1;
} el1_s1poe_regs_t;

typedef struct el1_s2poe_regs {
	uint64_t s2por_el1;
} el1_s2poe_regs_t;

typedef struct el1_tcr2_regs {
	uint64_t tcr2_el1;
} el1_tcr2_regs_t;

typedef struct el1_trf_regs {
	uint64_t trfcr_el1;
} el1_trf_regs_t;

typedef struct el1_csv2_2_regs {
	uint64_t scxtnum_el0;
	uint64_t scxtnum_el1;
} el1_csv2_2_regs_t;

typedef struct el1_gcs_regs {
	uint64_t gcscr_el1;
	uint64_t gcscre0_el1;
	uint64_t gcspr_el1;
	uint64_t gcspr_el0;
} el1_gcs_regs_t;

typedef struct el1_the_regs {
	sysreg_t rcwmask_el1;
	sysreg_t rcwsmask_el1;
} el1_the_regs_t;

typedef struct el1_sctlr2_regs {
	uint64_t sctlr2_el1;
} el1_sctlr2_regs_t;

typedef struct el1_ls64_regs {
	uint64_t accdata_el1;
} el1_ls64_regs_t;

typedef struct el1_step2_regs {
	uint64_t mdstepop_el1;
} el1_step2_regs_t;

typedef struct el1_sysregs {

	el1_common_regs_t common;
	el1_arch_timer_regs_t arch_timer;

#if CTX_INCLUDE_AARCH32_REGS
	el1_aarch32_regs_t el1_aarch32;
#endif

#if ENABLE_FEAT_MTE2
	el1_mte2_regs_t mte2;
#endif

#if ENABLE_FEAT_RAS
	el1_ras_regs_t ras;
#endif

#if ENABLE_FEAT_S1PIE
	el1_s1pie_regs_t s1pie;
#endif

#if ENABLE_FEAT_S1POE
	el1_s1poe_regs_t s1poe;
#endif

#if ENABLE_FEAT_S2POE
	el1_s2poe_regs_t s2poe;
#endif

#if ENABLE_FEAT_TCR2
	el1_tcr2_regs_t tcr2;
#endif

#if ENABLE_TRF_FOR_NS
	el1_trf_regs_t trf;
#endif

#if ENABLE_FEAT_CSV2_2
	el1_csv2_2_regs_t csv2_2;
#endif

#if ENABLE_FEAT_GCS
	el1_gcs_regs_t gcs;
#endif

#if ENABLE_FEAT_THE
	el1_the_regs_t the;
#endif

#if ENABLE_FEAT_SCTLR2
	el1_sctlr2_regs_t sctlr2;
#endif

#if ENABLE_FEAT_LS64_ACCDATA
	el1_ls64_regs_t ls64;
#endif

#if ENABLE_FEAT_STEP2
	el1_step2_regs_t step2;
#endif

} el1_sysregs_t;


/*
 * Macros to access members related to individual features of the el1_sysregs_t
 * structures.
 */

#define read_el1_ctx_common(ctx, reg)		(((ctx)->common).reg)

#define write_el1_ctx_common(ctx, reg, val)	((((ctx)->common).reg)	\
							= (uint64_t) (val))

#define write_el1_ctx_common_sysreg128(ctx, reg, val)	((((ctx)->common).reg)	\
							= (sysreg_t) (val))

#define read_el1_ctx_arch_timer(ctx, reg)		(((ctx)->arch_timer).reg)
#define write_el1_ctx_arch_timer(ctx, reg, val)	((((ctx)->arch_timer).reg)	\
							= (uint64_t) (val))

#if CTX_INCLUDE_AARCH32_REGS
#define read_el1_ctx_aarch32(ctx, reg)		(((ctx)->el1_aarch32).reg)
#define write_el1_ctx_aarch32(ctx, reg, val)	((((ctx)->el1_aarch32).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_aarch32(ctx, reg)		ULL(0)
#define write_el1_ctx_aarch32(ctx, reg, val)
#endif /* CTX_INCLUDE_AARCH32_REGS */

#if ENABLE_FEAT_MTE2
#define read_el1_ctx_mte2(ctx, reg)		(((ctx)->mte2).reg)
#define write_el1_ctx_mte2(ctx, reg, val)	((((ctx)->mte2).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_mte2(ctx, reg)		ULL(0)
#define write_el1_ctx_mte2(ctx, reg, val)
#endif /* ENABLE_FEAT_MTE2 */

#if ENABLE_FEAT_RAS
#define read_el1_ctx_ras(ctx, reg)		(((ctx)->ras).reg)
#define write_el1_ctx_ras(ctx, reg, val)	((((ctx)->ras).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_ras(ctx, reg)		ULL(0)
#define write_el1_ctx_ras(ctx, reg, val)
#endif /* ENABLE_FEAT_RAS */

#if ENABLE_FEAT_S1PIE
#define read_el1_ctx_s1pie(ctx, reg)		(((ctx)->s1pie).reg)
#define write_el1_ctx_s1pie(ctx, reg, val)	((((ctx)->s1pie).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_s1pie(ctx, reg)		ULL(0)
#define write_el1_ctx_s1pie(ctx, reg, val)
#endif /* ENABLE_FEAT_S1PIE */

#if ENABLE_FEAT_S1POE
#define read_el1_ctx_s1poe(ctx, reg)		(((ctx)->s1poe).reg)
#define write_el1_ctx_s1poe(ctx, reg, val)	((((ctx)->s1poe).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_s1poe(ctx, reg)		ULL(0)
#define write_el1_ctx_s1poe(ctx, reg, val)
#endif /* ENABLE_FEAT_S1POE */

#if ENABLE_FEAT_S2POE
#define read_el1_ctx_s2poe(ctx, reg)		(((ctx)->s2poe).reg)
#define write_el1_ctx_s2poe(ctx, reg, val)	((((ctx)->s2poe).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_s2poe(ctx, reg)		ULL(0)
#define write_el1_ctx_s2poe(ctx, reg, val)
#endif /* ENABLE_FEAT_S2POE */

#if ENABLE_FEAT_TCR2
#define read_el1_ctx_tcr2(ctx, reg)		(((ctx)->tcr2).reg)
#define write_el1_ctx_tcr2(ctx, reg, val)	((((ctx)->tcr2).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_tcr2(ctx, reg)		ULL(0)
#define write_el1_ctx_tcr2(ctx, reg, val)
#endif /* ENABLE_FEAT_TCR2 */

#if ENABLE_TRF_FOR_NS
#define read_el1_ctx_trf(ctx, reg)		(((ctx)->trf).reg)
#define write_el1_ctx_trf(ctx, reg, val)	((((ctx)->trf).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_trf(ctx, reg)		ULL(0)
#define write_el1_ctx_trf(ctx, reg, val)
#endif /* ENABLE_TRF_FOR_NS */

#if ENABLE_FEAT_STEP2
#define read_el1_ctx_step2(ctx, reg)		(((ctx)->step2).reg)
#define write_el1_ctx_step2(ctx, reg, val)	((((ctx)->step2).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_step2(ctx, reg)		ULL(0)
#define write_el1_ctx_step2(ctx, reg, val)
#endif /* ENABLE_FEAT_STEP2 */

#if ENABLE_FEAT_CSV2_2
#define read_el1_ctx_csv2_2(ctx, reg)		(((ctx)->csv2_2).reg)
#define write_el1_ctx_csv2_2(ctx, reg, val)	((((ctx)->csv2_2).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_csv2_2(ctx, reg)		ULL(0)
#define write_el1_ctx_csv2_2(ctx, reg, val)
#endif /* ENABLE_FEAT_CSV2_2 */

#if ENABLE_FEAT_GCS
#define read_el1_ctx_gcs(ctx, reg)		(((ctx)->gcs).reg)
#define write_el1_ctx_gcs(ctx, reg, val)	((((ctx)->gcs).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_gcs(ctx, reg)		ULL(0)
#define write_el1_ctx_gcs(ctx, reg, val)
#endif /* ENABLE_FEAT_GCS */

#if ENABLE_FEAT_THE
#define read_el1_ctx_the(ctx, reg)		(((ctx)->the).reg)
#define write_el1_ctx_the_sysreg128(ctx, reg, val)	((((ctx)->the).reg)	\
							= (sysreg_t) (val))
#else
#define read_el1_ctx_the(ctx, reg)		ULL(0)
#define write_el1_ctx_the_sysreg128(ctx, reg, val)
#endif /* ENABLE_FEAT_THE */

#if ENABLE_FEAT_SCTLR2
#define read_el1_ctx_sctlr2(ctx, reg)		(((ctx)->sctlr2).reg)
#define write_el1_ctx_sctlr2(ctx, reg, val)	((((ctx)->sctlr2).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_sctlr2(ctx, reg)		ULL(0)
#define write_el1_ctx_sctlr2(ctx, reg, val)
#endif /* ENABLE_FEAT_SCTLR2 */

#if ENABLE_FEAT_LS64_ACCDATA
#define read_el1_ctx_ls64(ctx, reg)		(((ctx)->ls64).reg)
#define write_el1_ctx_ls64(ctx, reg, val)	((((ctx)->ls64).reg)	\
							= (uint64_t) (val))
#else
#define read_el1_ctx_ls64(ctx, reg)		ULL(0)
#define write_el1_ctx_ls64(ctx, reg, val)
#endif /* ENABLE_FEAT_LS64_ACCDATA */
/******************************************************************************/
#endif /* __ASSEMBLER__ */

#endif /* CONTEXT_EL1_H */