blob: 6b516da9ae9847760c52e6391b02b7f0ae474ff5 [file] [log] [blame]
Jayanth Dodderi Chidanand86e5e5d2024-08-05 19:52:29 +01001/*
2 * Copyright (c) 2024, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef CONTEXT_EL1_H
8#define CONTEXT_EL1_H
9
10#include <stdint.h>
11#include <stdio.h>
12#include <tftf_lib.h>
13
14#define NS_CORRUPT_EL1_REGS 1
15#define NS_RESTORE_EL1_REGS 0
16/**
17 * Structure template to define individual EL1 register.
18 */
19typedef struct el1_reg {
20 char *reg_name;
21 uint64_t reg_value;
22} el1_reg_t;
23
24/*******************************************************************************
25 * EL1 Registers:
26 * AArch64 EL1 system registers which are intended to be saved and restored as
27 * part of context management library during world switch.
28 ******************************************************************************/
29
30typedef struct el1_common_regs {
31 el1_reg_t spsr_el1;
32 el1_reg_t elr_el1;
33 el1_reg_t sctlr_el1;
34 el1_reg_t tcr_el1;
35 el1_reg_t cpacr_el1;
36 el1_reg_t csselr_el1;
37 el1_reg_t sp_el1;
38 el1_reg_t esr_el1;
39 el1_reg_t ttbr0_el1;
40 el1_reg_t ttbr1_el1;
41 el1_reg_t mair_el1;
42 el1_reg_t amair_el1;
43 el1_reg_t actlr_el1;
44 el1_reg_t tpidr_el1;
45 el1_reg_t tpidr_el0;
46 el1_reg_t tpidrro_el0;
47 el1_reg_t par_el1;
48 el1_reg_t far_el1;
49 el1_reg_t afsr0_el1;
50 el1_reg_t afsr1_el1;
51 el1_reg_t contextidr_el1;
52 el1_reg_t vbar_el1;
53 el1_reg_t mdccint_el1;
54 el1_reg_t mdscr_el1;
55} el1_common_regs_t;
56
57typedef struct el1_aarch32_regs {
58 el1_reg_t spsr_abt;
59 el1_reg_t spsr_und;
60 el1_reg_t spsr_irq;
61 el1_reg_t spsr_fiq;
62 el1_reg_t dacr32_el2;
63 el1_reg_t ifsr32_el2;
64} el1_aarch32_regs_t;
65
66typedef struct el1_arch_timer_regs {
67 el1_reg_t cntp_ctl_el0;
68 el1_reg_t cntp_cval_el0;
69 el1_reg_t cntv_ctl_el0;
70 el1_reg_t cntv_cval_el0;
71 el1_reg_t cntkctl_el1;
72} el1_arch_timer_regs_t;
73
74typedef struct el1_mte2_regs {
75 el1_reg_t tfsre0_el1;
76 el1_reg_t tfsr_el1;
77 el1_reg_t rgsr_el1;
78 el1_reg_t gcr_el1;
79} el1_mte2_regs_t;
80
81typedef struct el1_ras_regs {
82 el1_reg_t disr_el1;
83} el1_ras_regs_t;
84
85typedef struct el1_s1pie_regs {
86 el1_reg_t pire0_el1;
87 el1_reg_t pir_el1;
88} el1_s1pie_regs_t;
89
90typedef struct el1_s1poe_regs {
91 el1_reg_t por_el1;
92} el1_s1poe_regs_t;
93
94typedef struct el1_s2poe_regs {
95 el1_reg_t s2por_el1;
96} el1_s2poe_regs_t;
97
98typedef struct el1_tcr2_regs {
99 el1_reg_t tcr2_el1;
100} el1_tcr2_regs_t;
101
102typedef struct el1_trf_regs {
103 el1_reg_t trfcr_el1;
104} el1_trf_regs_t;
105
106typedef struct el1_csv2_2_regs {
107 el1_reg_t scxtnum_el0;
108 el1_reg_t scxtnum_el1;
109} el1_csv2_2_regs_t;
110
111typedef struct el1_gcs_regs {
112 el1_reg_t gcscr_el1;
113 el1_reg_t gcscre0_el1;
114 el1_reg_t gcspr_el1;
115 el1_reg_t gcspr_el0;
116} el1_gcs_regs_t;
117typedef struct el1_ctx_regs {
118 el1_common_regs_t common;
119 el1_aarch32_regs_t el1_aarch32;
120 el1_arch_timer_regs_t arch_timer;
121 el1_mte2_regs_t mte2;
122 el1_ras_regs_t ras;
123 el1_s1pie_regs_t s1pie;
124 el1_s1poe_regs_t s1poe;
125 el1_s2poe_regs_t s2poe;
126 el1_tcr2_regs_t tcr2;
127 el1_trf_regs_t trf;
128 el1_csv2_2_regs_t csv2_2;
129 el1_gcs_regs_t gcs;
130} el1_ctx_regs_t;
131
132/*
133 * Helper macros to access and print members of the el1_ctx_regs_t structure.
134 */
135
136#define PRINT_CTX_MEM_SEPARATOR() \
137 printf("+-----------------------+--------------------+\n"); \
138
139#define PRINT_CTX_MEMBER(feat, reg) \
140 { \
141 printf("| %-15s | 0x%016llx |\n", \
142 (feat->reg).reg_name, (feat->reg).reg_value); \
143 PRINT_CTX_MEM_SEPARATOR(); \
144 }
145
146#define write_el1_ctx_reg(feat, reg, name, val) \
147{ \
148 (feat->reg).reg_name = name; \
149 (feat->reg).reg_value = (uint64_t)val; \
150}
151
152/* Macros to access members of the 'el1_ctx_regs_t' structure */
153#define get_el1_common_regs_ctx(h) (&((el1_ctx_regs_t *) h)->common)
154#define get_el1_aarch32_regs_ctx(h) (&((el1_ctx_regs_t *) h)->el1_aarch32)
155#define get_el1_arch_timer_regs_ctx(h) (&((el1_ctx_regs_t *) h)->arch_timer)
156#define get_el1_mte2_regs_ctx(h) (&((el1_ctx_regs_t *) h)->mte2)
157#define get_el1_ras_regs_ctx(h) (&((el1_ctx_regs_t *) h)->ras)
158#define get_el1_s1pie_regs_ctx(h) (&((el1_ctx_regs_t *) h)->s1pie)
159#define get_el1_s1poe_regs_ctx(h) (&((el1_ctx_regs_t *) h)->s1poe)
160#define get_el1_s2poe_regs_ctx(h) (&((el1_ctx_regs_t *) h)->s2poe)
161#define get_el1_tcr2_regs_ctx(h) (&((el1_ctx_regs_t *) h)->tcr2)
162#define get_el1_trf_regs_ctx(h) (&((el1_ctx_regs_t *) h)->trf)
163#define get_el1_csv2_2_regs_ctx(h) (&((el1_ctx_regs_t *) h)->csv2_2)
164#define get_el1_gcs_regs_ctx(h) (&((el1_ctx_regs_t *) h)->gcs)
165
166/**
167 * --------------------------------------
168 * EL1 context accessor public functions.
169 * --------------------------------------
170 */
171void print_el1_sysregs_context(const el1_ctx_regs_t *el1_ctx);
172void save_el1_sysregs_context(const el1_ctx_regs_t *el1_ctx);
173void modify_el1_context_sysregs(const el1_ctx_regs_t *el1_ctx, const bool modify_option);
174bool compare_el1_contexts(const el1_ctx_regs_t *el1_ctx1, const el1_ctx_regs_t *el1_ctx2);
175
176#endif /* CONTEXT_EL1_H */