1cf7c6d10SRichard Henderson /*
2cf7c6d10SRichard Henderson * QEMU ARM CP Register access and descriptions
3cf7c6d10SRichard Henderson *
4cf7c6d10SRichard Henderson * Copyright (c) 2022 Linaro Ltd
5cf7c6d10SRichard Henderson *
6cf7c6d10SRichard Henderson * This program is free software; you can redistribute it and/or
7cf7c6d10SRichard Henderson * modify it under the terms of the GNU General Public License
8cf7c6d10SRichard Henderson * as published by the Free Software Foundation; either version 2
9cf7c6d10SRichard Henderson * of the License, or (at your option) any later version.
10cf7c6d10SRichard Henderson *
11cf7c6d10SRichard Henderson * This program is distributed in the hope that it will be useful,
12cf7c6d10SRichard Henderson * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cf7c6d10SRichard Henderson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14cf7c6d10SRichard Henderson * GNU General Public License for more details.
15cf7c6d10SRichard Henderson *
16cf7c6d10SRichard Henderson * You should have received a copy of the GNU General Public License
17cf7c6d10SRichard Henderson * along with this program; if not, see
18cf7c6d10SRichard Henderson * <http://www.gnu.org/licenses/gpl-2.0.html>
19cf7c6d10SRichard Henderson */
20cf7c6d10SRichard Henderson
21cf7c6d10SRichard Henderson #ifndef TARGET_ARM_CPREGS_H
22cf7c6d10SRichard Henderson #define TARGET_ARM_CPREGS_H
23cf7c6d10SRichard Henderson
2435d44e3fSPhilippe Mathieu-Daudé #include "hw/registerfields.h"
25*7f31b2f5SPhilippe Mathieu-Daudé #include "target/arm/kvm-consts.h"
2635d44e3fSPhilippe Mathieu-Daudé
27cf7c6d10SRichard Henderson /*
2887c3f0f2SRichard Henderson * ARMCPRegInfo type field bits:
29cf7c6d10SRichard Henderson */
3087c3f0f2SRichard Henderson enum {
3187c3f0f2SRichard Henderson /*
3287c3f0f2SRichard Henderson * Register must be handled specially during translation.
3387c3f0f2SRichard Henderson * The method is one of the values below:
3487c3f0f2SRichard Henderson */
3587c3f0f2SRichard Henderson ARM_CP_SPECIAL_MASK = 0x000f,
3687c3f0f2SRichard Henderson /* Special: no change to PE state: writes ignored, reads ignored. */
3787c3f0f2SRichard Henderson ARM_CP_NOP = 0x0001,
3887c3f0f2SRichard Henderson /* Special: sysreg is WFI, for v5 and v6. */
3987c3f0f2SRichard Henderson ARM_CP_WFI = 0x0002,
4087c3f0f2SRichard Henderson /* Special: sysreg is NZCV. */
4187c3f0f2SRichard Henderson ARM_CP_NZCV = 0x0003,
4287c3f0f2SRichard Henderson /* Special: sysreg is CURRENTEL. */
4387c3f0f2SRichard Henderson ARM_CP_CURRENTEL = 0x0004,
4487c3f0f2SRichard Henderson /* Special: sysreg is DC ZVA or similar. */
4587c3f0f2SRichard Henderson ARM_CP_DC_ZVA = 0x0005,
4687c3f0f2SRichard Henderson ARM_CP_DC_GVA = 0x0006,
4787c3f0f2SRichard Henderson ARM_CP_DC_GZVA = 0x0007,
4887c3f0f2SRichard Henderson
4987c3f0f2SRichard Henderson /* Flag: reads produce resetvalue; writes ignored. */
5087c3f0f2SRichard Henderson ARM_CP_CONST = 1 << 4,
5187c3f0f2SRichard Henderson /* Flag: For ARM_CP_STATE_AA32, sysreg is 64-bit. */
5287c3f0f2SRichard Henderson ARM_CP_64BIT = 1 << 5,
5387c3f0f2SRichard Henderson /*
5487c3f0f2SRichard Henderson * Flag: TB should not be ended after a write to this register
5587c3f0f2SRichard Henderson * (the default is that the TB ends after cp writes).
5687c3f0f2SRichard Henderson */
5787c3f0f2SRichard Henderson ARM_CP_SUPPRESS_TB_END = 1 << 6,
5887c3f0f2SRichard Henderson /*
5987c3f0f2SRichard Henderson * Flag: Permit a register definition to override a previous definition
6087c3f0f2SRichard Henderson * for the same (cp, is64, crn, crm, opc1, opc2) tuple: either the new
6187c3f0f2SRichard Henderson * or the old must have the ARM_CP_OVERRIDE bit set.
6287c3f0f2SRichard Henderson */
6387c3f0f2SRichard Henderson ARM_CP_OVERRIDE = 1 << 7,
6487c3f0f2SRichard Henderson /*
6587c3f0f2SRichard Henderson * Flag: Register is an alias view of some underlying state which is also
6687c3f0f2SRichard Henderson * visible via another register, and that the other register is handling
6787c3f0f2SRichard Henderson * migration and reset; registers marked ARM_CP_ALIAS will not be migrated
6887c3f0f2SRichard Henderson * but may have their state set by syncing of register state from KVM.
6987c3f0f2SRichard Henderson */
7087c3f0f2SRichard Henderson ARM_CP_ALIAS = 1 << 8,
7187c3f0f2SRichard Henderson /*
7287c3f0f2SRichard Henderson * Flag: Register does I/O and therefore its accesses need to be marked
73dfd1b812SRichard Henderson * with translator_io_start() and also end the TB. In particular,
74dfd1b812SRichard Henderson * registers which implement clocks or timers require this.
7587c3f0f2SRichard Henderson */
7687c3f0f2SRichard Henderson ARM_CP_IO = 1 << 9,
7787c3f0f2SRichard Henderson /*
7887c3f0f2SRichard Henderson * Flag: Register has no underlying state and does not support raw access
7987c3f0f2SRichard Henderson * for state saving/loading; it will not be used for either migration or
8087c3f0f2SRichard Henderson * KVM state synchronization. Typically this is for "registers" which are
8187c3f0f2SRichard Henderson * actually used as instructions for cache maintenance and so on.
8287c3f0f2SRichard Henderson */
8387c3f0f2SRichard Henderson ARM_CP_NO_RAW = 1 << 10,
8487c3f0f2SRichard Henderson /*
8587c3f0f2SRichard Henderson * Flag: The read or write hook might raise an exception; the generated
8687c3f0f2SRichard Henderson * code will synchronize the CPU state before calling the hook so that it
8787c3f0f2SRichard Henderson * is safe for the hook to call raise_exception().
8887c3f0f2SRichard Henderson */
8987c3f0f2SRichard Henderson ARM_CP_RAISES_EXC = 1 << 11,
9087c3f0f2SRichard Henderson /*
9187c3f0f2SRichard Henderson * Flag: Writes to the sysreg might change the exception level - typically
9287c3f0f2SRichard Henderson * on older ARM chips. For those cases we need to re-read the new el when
9387c3f0f2SRichard Henderson * recomputing the translation flags.
9487c3f0f2SRichard Henderson */
9587c3f0f2SRichard Henderson ARM_CP_NEWEL = 1 << 12,
9687c3f0f2SRichard Henderson /*
9787c3f0f2SRichard Henderson * Flag: Access check for this sysreg is identical to accessing FPU state
9887c3f0f2SRichard Henderson * from an instruction: use translation fp_access_check().
9987c3f0f2SRichard Henderson */
10087c3f0f2SRichard Henderson ARM_CP_FPU = 1 << 13,
10187c3f0f2SRichard Henderson /*
10287c3f0f2SRichard Henderson * Flag: Access check for this sysreg is identical to accessing SVE state
10387c3f0f2SRichard Henderson * from an instruction: use translation sve_access_check().
10487c3f0f2SRichard Henderson */
10587c3f0f2SRichard Henderson ARM_CP_SVE = 1 << 14,
10687c3f0f2SRichard Henderson /* Flag: Do not expose in gdb sysreg xml. */
10787c3f0f2SRichard Henderson ARM_CP_NO_GDB = 1 << 15,
108696ba377SRichard Henderson /*
109696ba377SRichard Henderson * Flags: If EL3 but not EL2...
110696ba377SRichard Henderson * - UNDEF: discard the cpreg,
111696ba377SRichard Henderson * - KEEP: retain the cpreg as is,
112696ba377SRichard Henderson * - C_NZ: set const on the cpreg, but retain resetvalue,
113696ba377SRichard Henderson * - else: set const on the cpreg, zero resetvalue, aka RES0.
114696ba377SRichard Henderson * See rule RJFFP in section D1.1.3 of DDI0487H.a.
115696ba377SRichard Henderson */
116696ba377SRichard Henderson ARM_CP_EL3_NO_EL2_UNDEF = 1 << 16,
117696ba377SRichard Henderson ARM_CP_EL3_NO_EL2_KEEP = 1 << 17,
118696ba377SRichard Henderson ARM_CP_EL3_NO_EL2_C_NZ = 1 << 18,
119bca063d5SRichard Henderson /*
120bca063d5SRichard Henderson * Flag: Access check for this sysreg is constrained by the
121bca063d5SRichard Henderson * ARM pseudocode function CheckSMEAccess().
122bca063d5SRichard Henderson */
123bca063d5SRichard Henderson ARM_CP_SME = 1 << 19,
124c35da11dSPeter Maydell /*
125c35da11dSPeter Maydell * Flag: one of the four EL2 registers which redirect to the
126c35da11dSPeter Maydell * equivalent EL1 register when FEAT_NV2 is enabled.
127c35da11dSPeter Maydell */
128c35da11dSPeter Maydell ARM_CP_NV2_REDIRECT = 1 << 20,
12987c3f0f2SRichard Henderson };
130cf7c6d10SRichard Henderson
131cf7c6d10SRichard Henderson /*
1329200d5ccSFabiano Rosas * Interface for defining coprocessor registers.
1339200d5ccSFabiano Rosas * Registers are defined in tables of arm_cp_reginfo structs
1349200d5ccSFabiano Rosas * which are passed to define_arm_cp_regs().
1359200d5ccSFabiano Rosas */
1369200d5ccSFabiano Rosas
1379200d5ccSFabiano Rosas /*
1389200d5ccSFabiano Rosas * When looking up a coprocessor register we look for it
1399200d5ccSFabiano Rosas * via an integer which encodes all of:
1409200d5ccSFabiano Rosas * coprocessor number
1419200d5ccSFabiano Rosas * Crn, Crm, opc1, opc2 fields
1429200d5ccSFabiano Rosas * 32 or 64 bit register (ie is it accessed via MRC/MCR
1439200d5ccSFabiano Rosas * or via MRRC/MCRR?)
1449200d5ccSFabiano Rosas * non-secure/secure bank (AArch32 only)
1459200d5ccSFabiano Rosas * We allow 4 bits for opc1 because MRRC/MCRR have a 4 bit field.
1469200d5ccSFabiano Rosas * (In this case crn and opc2 should be zero.)
1479200d5ccSFabiano Rosas * For AArch64, there is no 32/64 bit size distinction;
1489200d5ccSFabiano Rosas * instead all registers have a 2 bit op0, 3 bit op1 and op2,
1499200d5ccSFabiano Rosas * and 4 bit CRn and CRm. The encoding patterns are chosen
1509200d5ccSFabiano Rosas * to be easy to convert to and from the KVM encodings, and also
1519200d5ccSFabiano Rosas * so that the hashtable can contain both AArch32 and AArch64
1529200d5ccSFabiano Rosas * registers (to allow for interprocessing where we might run
1539200d5ccSFabiano Rosas * 32 bit code on a 64 bit core).
1549200d5ccSFabiano Rosas */
1559200d5ccSFabiano Rosas /*
1569200d5ccSFabiano Rosas * This bit is private to our hashtable cpreg; in KVM register
1579200d5ccSFabiano Rosas * IDs the AArch64/32 distinction is the KVM_REG_ARM/ARM64
1589200d5ccSFabiano Rosas * in the upper bits of the 64 bit ID.
1599200d5ccSFabiano Rosas */
1609200d5ccSFabiano Rosas #define CP_REG_AA64_SHIFT 28
1619200d5ccSFabiano Rosas #define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT)
1629200d5ccSFabiano Rosas
1639200d5ccSFabiano Rosas /*
1649200d5ccSFabiano Rosas * To enable banking of coprocessor registers depending on ns-bit we
1659200d5ccSFabiano Rosas * add a bit to distinguish between secure and non-secure cpregs in the
1669200d5ccSFabiano Rosas * hashtable.
1679200d5ccSFabiano Rosas */
1689200d5ccSFabiano Rosas #define CP_REG_NS_SHIFT 29
1699200d5ccSFabiano Rosas #define CP_REG_NS_MASK (1 << CP_REG_NS_SHIFT)
1709200d5ccSFabiano Rosas
1719200d5ccSFabiano Rosas #define ENCODE_CP_REG(cp, is64, ns, crn, crm, opc1, opc2) \
1729200d5ccSFabiano Rosas ((ns) << CP_REG_NS_SHIFT | ((cp) << 16) | ((is64) << 15) | \
1739200d5ccSFabiano Rosas ((crn) << 11) | ((crm) << 7) | ((opc1) << 3) | (opc2))
1749200d5ccSFabiano Rosas
1759200d5ccSFabiano Rosas #define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \
1769200d5ccSFabiano Rosas (CP_REG_AA64_MASK | \
1779200d5ccSFabiano Rosas ((cp) << CP_REG_ARM_COPROC_SHIFT) | \
1789200d5ccSFabiano Rosas ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \
1799200d5ccSFabiano Rosas ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \
1809200d5ccSFabiano Rosas ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \
1819200d5ccSFabiano Rosas ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \
1829200d5ccSFabiano Rosas ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT))
1839200d5ccSFabiano Rosas
1849200d5ccSFabiano Rosas /*
1859200d5ccSFabiano Rosas * Convert a full 64 bit KVM register ID to the truncated 32 bit
1869200d5ccSFabiano Rosas * version used as a key for the coprocessor register hashtable
1879200d5ccSFabiano Rosas */
kvm_to_cpreg_id(uint64_t kvmid)1889200d5ccSFabiano Rosas static inline uint32_t kvm_to_cpreg_id(uint64_t kvmid)
1899200d5ccSFabiano Rosas {
1909200d5ccSFabiano Rosas uint32_t cpregid = kvmid;
1919200d5ccSFabiano Rosas if ((kvmid & CP_REG_ARCH_MASK) == CP_REG_ARM64) {
1929200d5ccSFabiano Rosas cpregid |= CP_REG_AA64_MASK;
1939200d5ccSFabiano Rosas } else {
1949200d5ccSFabiano Rosas if ((kvmid & CP_REG_SIZE_MASK) == CP_REG_SIZE_U64) {
1959200d5ccSFabiano Rosas cpregid |= (1 << 15);
1969200d5ccSFabiano Rosas }
1979200d5ccSFabiano Rosas
1989200d5ccSFabiano Rosas /*
1999200d5ccSFabiano Rosas * KVM is always non-secure so add the NS flag on AArch32 register
2009200d5ccSFabiano Rosas * entries.
2019200d5ccSFabiano Rosas */
2029200d5ccSFabiano Rosas cpregid |= 1 << CP_REG_NS_SHIFT;
2039200d5ccSFabiano Rosas }
2049200d5ccSFabiano Rosas return cpregid;
2059200d5ccSFabiano Rosas }
2069200d5ccSFabiano Rosas
2079200d5ccSFabiano Rosas /*
2089200d5ccSFabiano Rosas * Convert a truncated 32 bit hashtable key into the full
2099200d5ccSFabiano Rosas * 64 bit KVM register ID.
2109200d5ccSFabiano Rosas */
cpreg_to_kvm_id(uint32_t cpregid)2119200d5ccSFabiano Rosas static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
2129200d5ccSFabiano Rosas {
2139200d5ccSFabiano Rosas uint64_t kvmid;
2149200d5ccSFabiano Rosas
2159200d5ccSFabiano Rosas if (cpregid & CP_REG_AA64_MASK) {
2169200d5ccSFabiano Rosas kvmid = cpregid & ~CP_REG_AA64_MASK;
2179200d5ccSFabiano Rosas kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM64;
2189200d5ccSFabiano Rosas } else {
2199200d5ccSFabiano Rosas kvmid = cpregid & ~(1 << 15);
2209200d5ccSFabiano Rosas if (cpregid & (1 << 15)) {
2219200d5ccSFabiano Rosas kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM;
2229200d5ccSFabiano Rosas } else {
2239200d5ccSFabiano Rosas kvmid |= CP_REG_SIZE_U32 | CP_REG_ARM;
2249200d5ccSFabiano Rosas }
2259200d5ccSFabiano Rosas }
2269200d5ccSFabiano Rosas return kvmid;
2279200d5ccSFabiano Rosas }
2289200d5ccSFabiano Rosas
2299200d5ccSFabiano Rosas /*
230cf7c6d10SRichard Henderson * Valid values for ARMCPRegInfo state field, indicating which of
231cf7c6d10SRichard Henderson * the AArch32 and AArch64 execution states this register is visible in.
232cf7c6d10SRichard Henderson * If the reginfo doesn't explicitly specify then it is AArch32 only.
233cf7c6d10SRichard Henderson * If the reginfo is declared to be visible in both states then a second
234cf7c6d10SRichard Henderson * reginfo is synthesised for the AArch32 view of the AArch64 register,
235cf7c6d10SRichard Henderson * such that the AArch32 view is the lower 32 bits of the AArch64 one.
236cf7c6d10SRichard Henderson * Note that we rely on the values of these enums as we iterate through
237cf7c6d10SRichard Henderson * the various states in some places.
238cf7c6d10SRichard Henderson */
239d95101d6SRichard Henderson typedef enum {
240cf7c6d10SRichard Henderson ARM_CP_STATE_AA32 = 0,
241cf7c6d10SRichard Henderson ARM_CP_STATE_AA64 = 1,
242cf7c6d10SRichard Henderson ARM_CP_STATE_BOTH = 2,
243d95101d6SRichard Henderson } CPState;
244cf7c6d10SRichard Henderson
245cf7c6d10SRichard Henderson /*
246cf7c6d10SRichard Henderson * ARM CP register secure state flags. These flags identify security state
247cf7c6d10SRichard Henderson * attributes for a given CP register entry.
248cf7c6d10SRichard Henderson * The existence of both or neither secure and non-secure flags indicates that
249cf7c6d10SRichard Henderson * the register has both a secure and non-secure hash entry. A single one of
250cf7c6d10SRichard Henderson * these flags causes the register to only be hashed for the specified
251cf7c6d10SRichard Henderson * security state.
252cf7c6d10SRichard Henderson * Although definitions may have any combination of the S/NS bits, each
253cf7c6d10SRichard Henderson * registered entry will only have one to identify whether the entry is secure
254cf7c6d10SRichard Henderson * or non-secure.
255cf7c6d10SRichard Henderson */
256cbe64585SRichard Henderson typedef enum {
257cbe64585SRichard Henderson ARM_CP_SECSTATE_BOTH = 0, /* define one cpreg for each secstate */
258cf7c6d10SRichard Henderson ARM_CP_SECSTATE_S = (1 << 0), /* bit[0]: Secure state register */
259cf7c6d10SRichard Henderson ARM_CP_SECSTATE_NS = (1 << 1), /* bit[1]: Non-secure state register */
260cbe64585SRichard Henderson } CPSecureState;
261cf7c6d10SRichard Henderson
262cf7c6d10SRichard Henderson /*
263cf7c6d10SRichard Henderson * Access rights:
264cf7c6d10SRichard Henderson * We define bits for Read and Write access for what rev C of the v7-AR ARM ARM
265cf7c6d10SRichard Henderson * defines as PL0 (user), PL1 (fiq/irq/svc/abt/und/sys, ie privileged), and
266cf7c6d10SRichard Henderson * PL2 (hyp). The other level which has Read and Write bits is Secure PL1
267cf7c6d10SRichard Henderson * (ie any of the privileged modes in Secure state, or Monitor mode).
268cf7c6d10SRichard Henderson * If a register is accessible in one privilege level it's always accessible
269cf7c6d10SRichard Henderson * in higher privilege levels too. Since "Secure PL1" also follows this rule
270cf7c6d10SRichard Henderson * (ie anything visible in PL2 is visible in S-PL1, some things are only
271cf7c6d10SRichard Henderson * visible in S-PL1) but "Secure PL1" is a bit of a mouthful, we bend the
272cf7c6d10SRichard Henderson * terminology a little and call this PL3.
273cf7c6d10SRichard Henderson * In AArch64 things are somewhat simpler as the PLx bits line up exactly
274cf7c6d10SRichard Henderson * with the ELx exception levels.
275cf7c6d10SRichard Henderson *
276cf7c6d10SRichard Henderson * If access permissions for a register are more complex than can be
277cf7c6d10SRichard Henderson * described with these bits, then use a laxer set of restrictions, and
278cf7c6d10SRichard Henderson * do the more restrictive/complex check inside a helper function.
279cf7c6d10SRichard Henderson */
28039107337SRichard Henderson typedef enum {
28139107337SRichard Henderson PL3_R = 0x80,
28239107337SRichard Henderson PL3_W = 0x40,
28339107337SRichard Henderson PL2_R = 0x20 | PL3_R,
28439107337SRichard Henderson PL2_W = 0x10 | PL3_W,
28539107337SRichard Henderson PL1_R = 0x08 | PL2_R,
28639107337SRichard Henderson PL1_W = 0x04 | PL2_W,
28739107337SRichard Henderson PL0_R = 0x02 | PL1_R,
28839107337SRichard Henderson PL0_W = 0x01 | PL1_W,
289cf7c6d10SRichard Henderson
290cf7c6d10SRichard Henderson /*
291cf7c6d10SRichard Henderson * For user-mode some registers are accessible to EL0 via a kernel
292cf7c6d10SRichard Henderson * trap-and-emulate ABI. In this case we define the read permissions
293cf7c6d10SRichard Henderson * as actually being PL0_R. However some bits of any given register
294cf7c6d10SRichard Henderson * may still be masked.
295cf7c6d10SRichard Henderson */
296cf7c6d10SRichard Henderson #ifdef CONFIG_USER_ONLY
29739107337SRichard Henderson PL0U_R = PL0_R,
298cf7c6d10SRichard Henderson #else
29939107337SRichard Henderson PL0U_R = PL1_R,
300cf7c6d10SRichard Henderson #endif
301cf7c6d10SRichard Henderson
30239107337SRichard Henderson PL3_RW = PL3_R | PL3_W,
30339107337SRichard Henderson PL2_RW = PL2_R | PL2_W,
30439107337SRichard Henderson PL1_RW = PL1_R | PL1_W,
30539107337SRichard Henderson PL0_RW = PL0_R | PL0_W,
30639107337SRichard Henderson } CPAccessRights;
307cf7c6d10SRichard Henderson
308cf7c6d10SRichard Henderson typedef enum CPAccessResult {
309cf7c6d10SRichard Henderson /* Access is permitted */
310cf7c6d10SRichard Henderson CP_ACCESS_OK = 0,
311330477eaSRichard Henderson
312330477eaSRichard Henderson /*
313330477eaSRichard Henderson * Combined with one of the following, the low 2 bits indicate the
314330477eaSRichard Henderson * target exception level. If 0, the exception is taken to the usual
315330477eaSRichard Henderson * target EL (EL1 or PL1 if in EL0, otherwise to the current EL).
316330477eaSRichard Henderson */
317330477eaSRichard Henderson CP_ACCESS_EL_MASK = 3,
318330477eaSRichard Henderson
319cf7c6d10SRichard Henderson /*
320cf7c6d10SRichard Henderson * Access fails due to a configurable trap or enable which would
321cf7c6d10SRichard Henderson * result in a categorized exception syndrome giving information about
322cf7c6d10SRichard Henderson * the failing instruction (ie syndrome category 0x3, 0x4, 0x5, 0x6,
323330477eaSRichard Henderson * 0xc or 0x18).
324cf7c6d10SRichard Henderson */
325330477eaSRichard Henderson CP_ACCESS_TRAP = (1 << 2),
326330477eaSRichard Henderson CP_ACCESS_TRAP_EL2 = CP_ACCESS_TRAP | 2,
327330477eaSRichard Henderson CP_ACCESS_TRAP_EL3 = CP_ACCESS_TRAP | 3,
328330477eaSRichard Henderson
329cf7c6d10SRichard Henderson /*
330cf7c6d10SRichard Henderson * Access fails and results in an exception syndrome 0x0 ("uncategorized").
331cf7c6d10SRichard Henderson * Note that this is not a catch-all case -- the set of cases which may
332cf7c6d10SRichard Henderson * result in this failure is specifically defined by the architecture.
33380ea70f2SPeter Maydell * This trap is always to the usual target EL, never directly to a
33480ea70f2SPeter Maydell * specified target EL.
335cf7c6d10SRichard Henderson */
336330477eaSRichard Henderson CP_ACCESS_TRAP_UNCATEGORIZED = (2 << 2),
337cf7c6d10SRichard Henderson } CPAccessResult;
338cf7c6d10SRichard Henderson
33915126d9cSPeter Maydell /* Indexes into fgt_read[] */
34015126d9cSPeter Maydell #define FGTREG_HFGRTR 0
34115126d9cSPeter Maydell #define FGTREG_HDFGRTR 1
34215126d9cSPeter Maydell /* Indexes into fgt_write[] */
34315126d9cSPeter Maydell #define FGTREG_HFGWTR 0
34415126d9cSPeter Maydell #define FGTREG_HDFGWTR 1
34515126d9cSPeter Maydell /* Indexes into fgt_exec[] */
34615126d9cSPeter Maydell #define FGTREG_HFGITR 0
34715126d9cSPeter Maydell
34815126d9cSPeter Maydell FIELD(HFGRTR_EL2, AFSR0_EL1, 0, 1)
34915126d9cSPeter Maydell FIELD(HFGRTR_EL2, AFSR1_EL1, 1, 1)
35015126d9cSPeter Maydell FIELD(HFGRTR_EL2, AIDR_EL1, 2, 1)
35115126d9cSPeter Maydell FIELD(HFGRTR_EL2, AMAIR_EL1, 3, 1)
35215126d9cSPeter Maydell FIELD(HFGRTR_EL2, APDAKEY, 4, 1)
35315126d9cSPeter Maydell FIELD(HFGRTR_EL2, APDBKEY, 5, 1)
35415126d9cSPeter Maydell FIELD(HFGRTR_EL2, APGAKEY, 6, 1)
35515126d9cSPeter Maydell FIELD(HFGRTR_EL2, APIAKEY, 7, 1)
35615126d9cSPeter Maydell FIELD(HFGRTR_EL2, APIBKEY, 8, 1)
35715126d9cSPeter Maydell FIELD(HFGRTR_EL2, CCSIDR_EL1, 9, 1)
35815126d9cSPeter Maydell FIELD(HFGRTR_EL2, CLIDR_EL1, 10, 1)
35915126d9cSPeter Maydell FIELD(HFGRTR_EL2, CONTEXTIDR_EL1, 11, 1)
36015126d9cSPeter Maydell FIELD(HFGRTR_EL2, CPACR_EL1, 12, 1)
36115126d9cSPeter Maydell FIELD(HFGRTR_EL2, CSSELR_EL1, 13, 1)
36215126d9cSPeter Maydell FIELD(HFGRTR_EL2, CTR_EL0, 14, 1)
36315126d9cSPeter Maydell FIELD(HFGRTR_EL2, DCZID_EL0, 15, 1)
36415126d9cSPeter Maydell FIELD(HFGRTR_EL2, ESR_EL1, 16, 1)
36515126d9cSPeter Maydell FIELD(HFGRTR_EL2, FAR_EL1, 17, 1)
36615126d9cSPeter Maydell FIELD(HFGRTR_EL2, ISR_EL1, 18, 1)
36715126d9cSPeter Maydell FIELD(HFGRTR_EL2, LORC_EL1, 19, 1)
36815126d9cSPeter Maydell FIELD(HFGRTR_EL2, LOREA_EL1, 20, 1)
36915126d9cSPeter Maydell FIELD(HFGRTR_EL2, LORID_EL1, 21, 1)
37015126d9cSPeter Maydell FIELD(HFGRTR_EL2, LORN_EL1, 22, 1)
37115126d9cSPeter Maydell FIELD(HFGRTR_EL2, LORSA_EL1, 23, 1)
37215126d9cSPeter Maydell FIELD(HFGRTR_EL2, MAIR_EL1, 24, 1)
37315126d9cSPeter Maydell FIELD(HFGRTR_EL2, MIDR_EL1, 25, 1)
37415126d9cSPeter Maydell FIELD(HFGRTR_EL2, MPIDR_EL1, 26, 1)
37515126d9cSPeter Maydell FIELD(HFGRTR_EL2, PAR_EL1, 27, 1)
37615126d9cSPeter Maydell FIELD(HFGRTR_EL2, REVIDR_EL1, 28, 1)
37715126d9cSPeter Maydell FIELD(HFGRTR_EL2, SCTLR_EL1, 29, 1)
37815126d9cSPeter Maydell FIELD(HFGRTR_EL2, SCXTNUM_EL1, 30, 1)
37915126d9cSPeter Maydell FIELD(HFGRTR_EL2, SCXTNUM_EL0, 31, 1)
38015126d9cSPeter Maydell FIELD(HFGRTR_EL2, TCR_EL1, 32, 1)
38115126d9cSPeter Maydell FIELD(HFGRTR_EL2, TPIDR_EL1, 33, 1)
38215126d9cSPeter Maydell FIELD(HFGRTR_EL2, TPIDRRO_EL0, 34, 1)
38315126d9cSPeter Maydell FIELD(HFGRTR_EL2, TPIDR_EL0, 35, 1)
38415126d9cSPeter Maydell FIELD(HFGRTR_EL2, TTBR0_EL1, 36, 1)
38515126d9cSPeter Maydell FIELD(HFGRTR_EL2, TTBR1_EL1, 37, 1)
38615126d9cSPeter Maydell FIELD(HFGRTR_EL2, VBAR_EL1, 38, 1)
38715126d9cSPeter Maydell FIELD(HFGRTR_EL2, ICC_IGRPENN_EL1, 39, 1)
38815126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERRIDR_EL1, 40, 1)
38915126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERRSELR_EL1, 41, 1)
39015126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXFR_EL1, 42, 1)
39115126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXCTLR_EL1, 43, 1)
39215126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXSTATUS_EL1, 44, 1)
39315126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXMISCN_EL1, 45, 1)
39415126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXPFGF_EL1, 46, 1)
39515126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXPFGCTL_EL1, 47, 1)
39615126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXPFGCDN_EL1, 48, 1)
39715126d9cSPeter Maydell FIELD(HFGRTR_EL2, ERXADDR_EL1, 49, 1)
39815126d9cSPeter Maydell FIELD(HFGRTR_EL2, NACCDATA_EL1, 50, 1)
39915126d9cSPeter Maydell /* 51-53: RES0 */
40015126d9cSPeter Maydell FIELD(HFGRTR_EL2, NSMPRI_EL1, 54, 1)
40115126d9cSPeter Maydell FIELD(HFGRTR_EL2, NTPIDR2_EL0, 55, 1)
40215126d9cSPeter Maydell /* 56-63: RES0 */
40315126d9cSPeter Maydell
40415126d9cSPeter Maydell /* These match HFGRTR but bits for RO registers are RES0 */
40515126d9cSPeter Maydell FIELD(HFGWTR_EL2, AFSR0_EL1, 0, 1)
40615126d9cSPeter Maydell FIELD(HFGWTR_EL2, AFSR1_EL1, 1, 1)
40715126d9cSPeter Maydell FIELD(HFGWTR_EL2, AMAIR_EL1, 3, 1)
40815126d9cSPeter Maydell FIELD(HFGWTR_EL2, APDAKEY, 4, 1)
40915126d9cSPeter Maydell FIELD(HFGWTR_EL2, APDBKEY, 5, 1)
41015126d9cSPeter Maydell FIELD(HFGWTR_EL2, APGAKEY, 6, 1)
41115126d9cSPeter Maydell FIELD(HFGWTR_EL2, APIAKEY, 7, 1)
41215126d9cSPeter Maydell FIELD(HFGWTR_EL2, APIBKEY, 8, 1)
41315126d9cSPeter Maydell FIELD(HFGWTR_EL2, CONTEXTIDR_EL1, 11, 1)
41415126d9cSPeter Maydell FIELD(HFGWTR_EL2, CPACR_EL1, 12, 1)
41515126d9cSPeter Maydell FIELD(HFGWTR_EL2, CSSELR_EL1, 13, 1)
41615126d9cSPeter Maydell FIELD(HFGWTR_EL2, ESR_EL1, 16, 1)
41715126d9cSPeter Maydell FIELD(HFGWTR_EL2, FAR_EL1, 17, 1)
41815126d9cSPeter Maydell FIELD(HFGWTR_EL2, LORC_EL1, 19, 1)
41915126d9cSPeter Maydell FIELD(HFGWTR_EL2, LOREA_EL1, 20, 1)
42015126d9cSPeter Maydell FIELD(HFGWTR_EL2, LORN_EL1, 22, 1)
42115126d9cSPeter Maydell FIELD(HFGWTR_EL2, LORSA_EL1, 23, 1)
42215126d9cSPeter Maydell FIELD(HFGWTR_EL2, MAIR_EL1, 24, 1)
42315126d9cSPeter Maydell FIELD(HFGWTR_EL2, PAR_EL1, 27, 1)
42415126d9cSPeter Maydell FIELD(HFGWTR_EL2, SCTLR_EL1, 29, 1)
42515126d9cSPeter Maydell FIELD(HFGWTR_EL2, SCXTNUM_EL1, 30, 1)
42615126d9cSPeter Maydell FIELD(HFGWTR_EL2, SCXTNUM_EL0, 31, 1)
42715126d9cSPeter Maydell FIELD(HFGWTR_EL2, TCR_EL1, 32, 1)
42815126d9cSPeter Maydell FIELD(HFGWTR_EL2, TPIDR_EL1, 33, 1)
42915126d9cSPeter Maydell FIELD(HFGWTR_EL2, TPIDRRO_EL0, 34, 1)
43015126d9cSPeter Maydell FIELD(HFGWTR_EL2, TPIDR_EL0, 35, 1)
43115126d9cSPeter Maydell FIELD(HFGWTR_EL2, TTBR0_EL1, 36, 1)
43215126d9cSPeter Maydell FIELD(HFGWTR_EL2, TTBR1_EL1, 37, 1)
43315126d9cSPeter Maydell FIELD(HFGWTR_EL2, VBAR_EL1, 38, 1)
43415126d9cSPeter Maydell FIELD(HFGWTR_EL2, ICC_IGRPENN_EL1, 39, 1)
43515126d9cSPeter Maydell FIELD(HFGWTR_EL2, ERRSELR_EL1, 41, 1)
43615126d9cSPeter Maydell FIELD(HFGWTR_EL2, ERXCTLR_EL1, 43, 1)
43715126d9cSPeter Maydell FIELD(HFGWTR_EL2, ERXSTATUS_EL1, 44, 1)
43815126d9cSPeter Maydell FIELD(HFGWTR_EL2, ERXMISCN_EL1, 45, 1)
43915126d9cSPeter Maydell FIELD(HFGWTR_EL2, ERXPFGCTL_EL1, 47, 1)
44015126d9cSPeter Maydell FIELD(HFGWTR_EL2, ERXPFGCDN_EL1, 48, 1)
44115126d9cSPeter Maydell FIELD(HFGWTR_EL2, ERXADDR_EL1, 49, 1)
44215126d9cSPeter Maydell FIELD(HFGWTR_EL2, NACCDATA_EL1, 50, 1)
44315126d9cSPeter Maydell FIELD(HFGWTR_EL2, NSMPRI_EL1, 54, 1)
44415126d9cSPeter Maydell FIELD(HFGWTR_EL2, NTPIDR2_EL0, 55, 1)
44515126d9cSPeter Maydell
44615126d9cSPeter Maydell FIELD(HFGITR_EL2, ICIALLUIS, 0, 1)
44715126d9cSPeter Maydell FIELD(HFGITR_EL2, ICIALLU, 1, 1)
44815126d9cSPeter Maydell FIELD(HFGITR_EL2, ICIVAU, 2, 1)
44915126d9cSPeter Maydell FIELD(HFGITR_EL2, DCIVAC, 3, 1)
45015126d9cSPeter Maydell FIELD(HFGITR_EL2, DCISW, 4, 1)
45115126d9cSPeter Maydell FIELD(HFGITR_EL2, DCCSW, 5, 1)
45215126d9cSPeter Maydell FIELD(HFGITR_EL2, DCCISW, 6, 1)
45315126d9cSPeter Maydell FIELD(HFGITR_EL2, DCCVAU, 7, 1)
45415126d9cSPeter Maydell FIELD(HFGITR_EL2, DCCVAP, 8, 1)
45515126d9cSPeter Maydell FIELD(HFGITR_EL2, DCCVADP, 9, 1)
45615126d9cSPeter Maydell FIELD(HFGITR_EL2, DCCIVAC, 10, 1)
45715126d9cSPeter Maydell FIELD(HFGITR_EL2, DCZVA, 11, 1)
45815126d9cSPeter Maydell FIELD(HFGITR_EL2, ATS1E1R, 12, 1)
45915126d9cSPeter Maydell FIELD(HFGITR_EL2, ATS1E1W, 13, 1)
46015126d9cSPeter Maydell FIELD(HFGITR_EL2, ATS1E0R, 14, 1)
46115126d9cSPeter Maydell FIELD(HFGITR_EL2, ATS1E0W, 15, 1)
46215126d9cSPeter Maydell FIELD(HFGITR_EL2, ATS1E1RP, 16, 1)
46315126d9cSPeter Maydell FIELD(HFGITR_EL2, ATS1E1WP, 17, 1)
46415126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVMALLE1OS, 18, 1)
46515126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAE1OS, 19, 1)
46615126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIASIDE1OS, 20, 1)
46715126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAAE1OS, 21, 1)
46815126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVALE1OS, 22, 1)
46915126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAALE1OS, 23, 1)
47015126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAE1OS, 24, 1)
47115126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAAE1OS, 25, 1)
47215126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVALE1OS, 26, 1)
47315126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAALE1OS, 27, 1)
47415126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVMALLE1IS, 28, 1)
47515126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAE1IS, 29, 1)
47615126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIASIDE1IS, 30, 1)
47715126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAAE1IS, 31, 1)
47815126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVALE1IS, 32, 1)
47915126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAALE1IS, 33, 1)
48015126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAE1IS, 34, 1)
48115126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAAE1IS, 35, 1)
48215126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVALE1IS, 36, 1)
48315126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAALE1IS, 37, 1)
48415126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAE1, 38, 1)
48515126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAAE1, 39, 1)
48615126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVALE1, 40, 1)
48715126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIRVAALE1, 41, 1)
48815126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVMALLE1, 42, 1)
48915126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAE1, 43, 1)
49015126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIASIDE1, 44, 1)
49115126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAAE1, 45, 1)
49215126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVALE1, 46, 1)
49315126d9cSPeter Maydell FIELD(HFGITR_EL2, TLBIVAALE1, 47, 1)
49415126d9cSPeter Maydell FIELD(HFGITR_EL2, CFPRCTX, 48, 1)
49515126d9cSPeter Maydell FIELD(HFGITR_EL2, DVPRCTX, 49, 1)
49615126d9cSPeter Maydell FIELD(HFGITR_EL2, CPPRCTX, 50, 1)
49715126d9cSPeter Maydell FIELD(HFGITR_EL2, ERET, 51, 1)
49815126d9cSPeter Maydell FIELD(HFGITR_EL2, SVC_EL0, 52, 1)
49915126d9cSPeter Maydell FIELD(HFGITR_EL2, SVC_EL1, 53, 1)
50015126d9cSPeter Maydell FIELD(HFGITR_EL2, DCCVAC, 54, 1)
50115126d9cSPeter Maydell FIELD(HFGITR_EL2, NBRBINJ, 55, 1)
50215126d9cSPeter Maydell FIELD(HFGITR_EL2, NBRBIALL, 56, 1)
50315126d9cSPeter Maydell
50415126d9cSPeter Maydell FIELD(HDFGRTR_EL2, DBGBCRN_EL1, 0, 1)
50515126d9cSPeter Maydell FIELD(HDFGRTR_EL2, DBGBVRN_EL1, 1, 1)
50615126d9cSPeter Maydell FIELD(HDFGRTR_EL2, DBGWCRN_EL1, 2, 1)
50715126d9cSPeter Maydell FIELD(HDFGRTR_EL2, DBGWVRN_EL1, 3, 1)
50815126d9cSPeter Maydell FIELD(HDFGRTR_EL2, MDSCR_EL1, 4, 1)
50915126d9cSPeter Maydell FIELD(HDFGRTR_EL2, DBGCLAIM, 5, 1)
51015126d9cSPeter Maydell FIELD(HDFGRTR_EL2, DBGAUTHSTATUS_EL1, 6, 1)
51115126d9cSPeter Maydell FIELD(HDFGRTR_EL2, DBGPRCR_EL1, 7, 1)
51215126d9cSPeter Maydell /* 8: RES0: OSLAR_EL1 is WO */
51315126d9cSPeter Maydell FIELD(HDFGRTR_EL2, OSLSR_EL1, 9, 1)
51415126d9cSPeter Maydell FIELD(HDFGRTR_EL2, OSECCR_EL1, 10, 1)
51515126d9cSPeter Maydell FIELD(HDFGRTR_EL2, OSDLR_EL1, 11, 1)
51615126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMEVCNTRN_EL0, 12, 1)
51715126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMEVTYPERN_EL0, 13, 1)
51815126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMCCFILTR_EL0, 14, 1)
51915126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMCCNTR_EL0, 15, 1)
52015126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMCNTEN, 16, 1)
52115126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMINTEN, 17, 1)
52215126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMOVS, 18, 1)
52315126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSELR_EL0, 19, 1)
52415126d9cSPeter Maydell /* 20: RES0: PMSWINC_EL0 is WO */
52515126d9cSPeter Maydell /* 21: RES0: PMCR_EL0 is WO */
52615126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMMIR_EL1, 22, 1)
52715126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMBLIMITR_EL1, 23, 1)
52815126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMBPTR_EL1, 24, 1)
52915126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMBSR_EL1, 25, 1)
53015126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSCR_EL1, 26, 1)
53115126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSEVFR_EL1, 27, 1)
53215126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSFCR_EL1, 28, 1)
53315126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSICR_EL1, 29, 1)
53415126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSIDR_EL1, 30, 1)
53515126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSIRR_EL1, 31, 1)
53615126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMSLATFR_EL1, 32, 1)
53715126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRC, 33, 1)
53815126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCAUTHSTATUS, 34, 1)
53915126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCAUXCTLR, 35, 1)
54015126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCCLAIM, 36, 1)
54115126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCCNTVRn, 37, 1)
54215126d9cSPeter Maydell /* 38, 39: RES0 */
54315126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCID, 40, 1)
54415126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCIMSPECN, 41, 1)
54515126d9cSPeter Maydell /* 42: RES0: TRCOSLAR is WO */
54615126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCOSLSR, 43, 1)
54715126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCPRGCTLR, 44, 1)
54815126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCSEQSTR, 45, 1)
54915126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCSSCSRN, 46, 1)
55015126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCSTATR, 47, 1)
55115126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRCVICTLR, 48, 1)
55215126d9cSPeter Maydell /* 49: RES0: TRFCR_EL1 is WO */
55315126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRBBASER_EL1, 50, 1)
55415126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRBIDR_EL1, 51, 1)
55515126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRBLIMITR_EL1, 52, 1)
55615126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRBMAR_EL1, 53, 1)
55715126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRBPTR_EL1, 54, 1)
55815126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRBSR_EL1, 55, 1)
55915126d9cSPeter Maydell FIELD(HDFGRTR_EL2, TRBTRG_EL1, 56, 1)
56015126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMUSERENR_EL0, 57, 1)
56115126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMCEIDN_EL0, 58, 1)
56215126d9cSPeter Maydell FIELD(HDFGRTR_EL2, NBRBIDR, 59, 1)
56315126d9cSPeter Maydell FIELD(HDFGRTR_EL2, NBRBCTL, 60, 1)
56415126d9cSPeter Maydell FIELD(HDFGRTR_EL2, NBRBDATA, 61, 1)
56515126d9cSPeter Maydell FIELD(HDFGRTR_EL2, NPMSNEVFR_EL1, 62, 1)
56615126d9cSPeter Maydell FIELD(HDFGRTR_EL2, PMBIDR_EL1, 63, 1)
56715126d9cSPeter Maydell
56815126d9cSPeter Maydell /*
56915126d9cSPeter Maydell * These match HDFGRTR_EL2, but bits for RO registers are RES0.
57015126d9cSPeter Maydell * A few bits are for WO registers, where the HDFGRTR_EL2 bit is RES0.
57115126d9cSPeter Maydell */
57215126d9cSPeter Maydell FIELD(HDFGWTR_EL2, DBGBCRN_EL1, 0, 1)
57315126d9cSPeter Maydell FIELD(HDFGWTR_EL2, DBGBVRN_EL1, 1, 1)
57415126d9cSPeter Maydell FIELD(HDFGWTR_EL2, DBGWCRN_EL1, 2, 1)
57515126d9cSPeter Maydell FIELD(HDFGWTR_EL2, DBGWVRN_EL1, 3, 1)
57615126d9cSPeter Maydell FIELD(HDFGWTR_EL2, MDSCR_EL1, 4, 1)
57715126d9cSPeter Maydell FIELD(HDFGWTR_EL2, DBGCLAIM, 5, 1)
57815126d9cSPeter Maydell FIELD(HDFGWTR_EL2, DBGPRCR_EL1, 7, 1)
57915126d9cSPeter Maydell FIELD(HDFGWTR_EL2, OSLAR_EL1, 8, 1)
58015126d9cSPeter Maydell FIELD(HDFGWTR_EL2, OSLSR_EL1, 9, 1)
58115126d9cSPeter Maydell FIELD(HDFGWTR_EL2, OSECCR_EL1, 10, 1)
58215126d9cSPeter Maydell FIELD(HDFGWTR_EL2, OSDLR_EL1, 11, 1)
58315126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMEVCNTRN_EL0, 12, 1)
58415126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMEVTYPERN_EL0, 13, 1)
58515126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMCCFILTR_EL0, 14, 1)
58615126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMCCNTR_EL0, 15, 1)
58715126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMCNTEN, 16, 1)
58815126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMINTEN, 17, 1)
58915126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMOVS, 18, 1)
59015126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSELR_EL0, 19, 1)
59115126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSWINC_EL0, 20, 1)
59215126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMCR_EL0, 21, 1)
59315126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMBLIMITR_EL1, 23, 1)
59415126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMBPTR_EL1, 24, 1)
59515126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMBSR_EL1, 25, 1)
59615126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSCR_EL1, 26, 1)
59715126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSEVFR_EL1, 27, 1)
59815126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSFCR_EL1, 28, 1)
59915126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSICR_EL1, 29, 1)
60015126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSIRR_EL1, 31, 1)
60115126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMSLATFR_EL1, 32, 1)
60215126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRC, 33, 1)
60315126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCAUXCTLR, 35, 1)
60415126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCCLAIM, 36, 1)
60515126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCCNTVRn, 37, 1)
60615126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCIMSPECN, 41, 1)
60715126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCOSLAR, 42, 1)
60815126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCPRGCTLR, 44, 1)
60915126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCSEQSTR, 45, 1)
61015126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCSSCSRN, 46, 1)
61115126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRCVICTLR, 48, 1)
61215126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRFCR_EL1, 49, 1)
61315126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRBBASER_EL1, 50, 1)
61415126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRBLIMITR_EL1, 52, 1)
61515126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRBMAR_EL1, 53, 1)
61615126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRBPTR_EL1, 54, 1)
61715126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRBSR_EL1, 55, 1)
61815126d9cSPeter Maydell FIELD(HDFGWTR_EL2, TRBTRG_EL1, 56, 1)
61915126d9cSPeter Maydell FIELD(HDFGWTR_EL2, PMUSERENR_EL0, 57, 1)
62015126d9cSPeter Maydell FIELD(HDFGWTR_EL2, NBRBCTL, 60, 1)
62115126d9cSPeter Maydell FIELD(HDFGWTR_EL2, NBRBDATA, 61, 1)
62215126d9cSPeter Maydell FIELD(HDFGWTR_EL2, NPMSNEVFR_EL1, 62, 1)
62315126d9cSPeter Maydell
624361c33f6SPeter Maydell /* Which fine-grained trap bit register to check, if any */
625361c33f6SPeter Maydell FIELD(FGT, TYPE, 10, 3)
626361c33f6SPeter Maydell FIELD(FGT, REV, 9, 1) /* Is bit sense reversed? */
627361c33f6SPeter Maydell FIELD(FGT, IDX, 6, 3) /* Index within a uint64_t[] array */
628361c33f6SPeter Maydell FIELD(FGT, BITPOS, 0, 6) /* Bit position within the uint64_t */
629361c33f6SPeter Maydell
630361c33f6SPeter Maydell /*
631361c33f6SPeter Maydell * Macros to define FGT_##bitname enum constants to use in ARMCPRegInfo::fgt
632361c33f6SPeter Maydell * fields. We assume for brevity's sake that there are no duplicated
633361c33f6SPeter Maydell * bit names across the various FGT registers.
634361c33f6SPeter Maydell */
635361c33f6SPeter Maydell #define DO_BIT(REG, BITNAME) \
636361c33f6SPeter Maydell FGT_##BITNAME = FGT_##REG | R_##REG##_EL2_##BITNAME##_SHIFT
637361c33f6SPeter Maydell
638361c33f6SPeter Maydell /* Some bits have reversed sense, so 0 means trap and 1 means not */
639361c33f6SPeter Maydell #define DO_REV_BIT(REG, BITNAME) \
640361c33f6SPeter Maydell FGT_##BITNAME = FGT_##REG | FGT_REV | R_##REG##_EL2_##BITNAME##_SHIFT
641361c33f6SPeter Maydell
642361c33f6SPeter Maydell typedef enum FGTBit {
643361c33f6SPeter Maydell /*
644361c33f6SPeter Maydell * These bits tell us which register arrays to use:
645361c33f6SPeter Maydell * if FGT_R is set then reads are checked against fgt_read[];
646361c33f6SPeter Maydell * if FGT_W is set then writes are checked against fgt_write[];
647361c33f6SPeter Maydell * if FGT_EXEC is set then all accesses are checked against fgt_exec[].
648361c33f6SPeter Maydell *
649361c33f6SPeter Maydell * For almost all bits in the R/W register pairs, the bit exists in
650361c33f6SPeter Maydell * both registers for a RW register, in HFGRTR/HDFGRTR for a RO register
651361c33f6SPeter Maydell * with the corresponding HFGWTR/HDFGTWTR bit being RES0, and vice-versa
652361c33f6SPeter Maydell * for a WO register. There are unfortunately a couple of exceptions
653361c33f6SPeter Maydell * (PMCR_EL0, TRFCR_EL1) where the register being trapped is RW but
654361c33f6SPeter Maydell * the FGT system only allows trapping of writes, not reads.
655361c33f6SPeter Maydell *
656361c33f6SPeter Maydell * Note that we arrange these bits so that a 0 FGTBit means "no trap".
657361c33f6SPeter Maydell */
658361c33f6SPeter Maydell FGT_R = 1 << R_FGT_TYPE_SHIFT,
659361c33f6SPeter Maydell FGT_W = 2 << R_FGT_TYPE_SHIFT,
660361c33f6SPeter Maydell FGT_EXEC = 4 << R_FGT_TYPE_SHIFT,
661361c33f6SPeter Maydell FGT_RW = FGT_R | FGT_W,
662361c33f6SPeter Maydell /* Bit to identify whether trap bit is reversed sense */
663361c33f6SPeter Maydell FGT_REV = R_FGT_REV_MASK,
664361c33f6SPeter Maydell
665361c33f6SPeter Maydell /*
666361c33f6SPeter Maydell * If a bit exists in HFGRTR/HDFGRTR then either the register being
667361c33f6SPeter Maydell * trapped is RO or the bit also exists in HFGWTR/HDFGWTR, so we either
668361c33f6SPeter Maydell * want to trap for both reads and writes or else it's harmless to mark
669361c33f6SPeter Maydell * it as trap-on-writes.
670361c33f6SPeter Maydell * If a bit exists only in HFGWTR/HDFGWTR then either the register being
671361c33f6SPeter Maydell * trapped is WO, or else it is one of the two oddball special cases
672361c33f6SPeter Maydell * which are RW but have only a write trap. We mark these as only
673361c33f6SPeter Maydell * FGT_W so we get the right behaviour for those special cases.
674361c33f6SPeter Maydell * (If a bit was added in future that provided only a read trap for an
675361c33f6SPeter Maydell * RW register we'd need to do something special to get the FGT_R bit
676361c33f6SPeter Maydell * only. But this seems unlikely to happen.)
677361c33f6SPeter Maydell *
678361c33f6SPeter Maydell * So for the DO_BIT/DO_REV_BIT macros: use FGT_HFGRTR/FGT_HDFGRTR if
679361c33f6SPeter Maydell * the bit exists in that register. Otherwise use FGT_HFGWTR/FGT_HDFGWTR.
680361c33f6SPeter Maydell */
681361c33f6SPeter Maydell FGT_HFGRTR = FGT_RW | (FGTREG_HFGRTR << R_FGT_IDX_SHIFT),
682361c33f6SPeter Maydell FGT_HFGWTR = FGT_W | (FGTREG_HFGWTR << R_FGT_IDX_SHIFT),
683361c33f6SPeter Maydell FGT_HDFGRTR = FGT_RW | (FGTREG_HDFGRTR << R_FGT_IDX_SHIFT),
684361c33f6SPeter Maydell FGT_HDFGWTR = FGT_W | (FGTREG_HDFGWTR << R_FGT_IDX_SHIFT),
685361c33f6SPeter Maydell FGT_HFGITR = FGT_EXEC | (FGTREG_HFGITR << R_FGT_IDX_SHIFT),
686158c276cSPeter Maydell
687158c276cSPeter Maydell /* Trap bits in HFGRTR_EL2 / HFGWTR_EL2, starting from bit 0. */
688158c276cSPeter Maydell DO_BIT(HFGRTR, AFSR0_EL1),
689158c276cSPeter Maydell DO_BIT(HFGRTR, AFSR1_EL1),
690158c276cSPeter Maydell DO_BIT(HFGRTR, AIDR_EL1),
691158c276cSPeter Maydell DO_BIT(HFGRTR, AMAIR_EL1),
692158c276cSPeter Maydell DO_BIT(HFGRTR, APDAKEY),
693158c276cSPeter Maydell DO_BIT(HFGRTR, APDBKEY),
694158c276cSPeter Maydell DO_BIT(HFGRTR, APGAKEY),
695158c276cSPeter Maydell DO_BIT(HFGRTR, APIAKEY),
696158c276cSPeter Maydell DO_BIT(HFGRTR, APIBKEY),
697158c276cSPeter Maydell DO_BIT(HFGRTR, CCSIDR_EL1),
698158c276cSPeter Maydell DO_BIT(HFGRTR, CLIDR_EL1),
699158c276cSPeter Maydell DO_BIT(HFGRTR, CONTEXTIDR_EL1),
700b19ed03cSPeter Maydell DO_BIT(HFGRTR, CPACR_EL1),
701b19ed03cSPeter Maydell DO_BIT(HFGRTR, CSSELR_EL1),
702b19ed03cSPeter Maydell DO_BIT(HFGRTR, CTR_EL0),
703b19ed03cSPeter Maydell DO_BIT(HFGRTR, DCZID_EL0),
704b19ed03cSPeter Maydell DO_BIT(HFGRTR, ESR_EL1),
705b19ed03cSPeter Maydell DO_BIT(HFGRTR, FAR_EL1),
706b19ed03cSPeter Maydell DO_BIT(HFGRTR, ISR_EL1),
707b19ed03cSPeter Maydell DO_BIT(HFGRTR, LORC_EL1),
708b19ed03cSPeter Maydell DO_BIT(HFGRTR, LOREA_EL1),
709b19ed03cSPeter Maydell DO_BIT(HFGRTR, LORID_EL1),
710b19ed03cSPeter Maydell DO_BIT(HFGRTR, LORN_EL1),
711b19ed03cSPeter Maydell DO_BIT(HFGRTR, LORSA_EL1),
71267dd8030SPeter Maydell DO_BIT(HFGRTR, MAIR_EL1),
71367dd8030SPeter Maydell DO_BIT(HFGRTR, MIDR_EL1),
71467dd8030SPeter Maydell DO_BIT(HFGRTR, MPIDR_EL1),
71567dd8030SPeter Maydell DO_BIT(HFGRTR, PAR_EL1),
71667dd8030SPeter Maydell DO_BIT(HFGRTR, REVIDR_EL1),
71767dd8030SPeter Maydell DO_BIT(HFGRTR, SCTLR_EL1),
71867dd8030SPeter Maydell DO_BIT(HFGRTR, SCXTNUM_EL1),
71967dd8030SPeter Maydell DO_BIT(HFGRTR, SCXTNUM_EL0),
72067dd8030SPeter Maydell DO_BIT(HFGRTR, TCR_EL1),
72167dd8030SPeter Maydell DO_BIT(HFGRTR, TPIDR_EL1),
72267dd8030SPeter Maydell DO_BIT(HFGRTR, TPIDRRO_EL0),
72367dd8030SPeter Maydell DO_BIT(HFGRTR, TPIDR_EL0),
724bd8db7d9SPeter Maydell DO_BIT(HFGRTR, TTBR0_EL1),
725bd8db7d9SPeter Maydell DO_BIT(HFGRTR, TTBR1_EL1),
726bd8db7d9SPeter Maydell DO_BIT(HFGRTR, VBAR_EL1),
727bd8db7d9SPeter Maydell DO_BIT(HFGRTR, ICC_IGRPENN_EL1),
728bd8db7d9SPeter Maydell DO_BIT(HFGRTR, ERRIDR_EL1),
729bd8db7d9SPeter Maydell DO_REV_BIT(HFGRTR, NSMPRI_EL1),
730bd8db7d9SPeter Maydell DO_REV_BIT(HFGRTR, NTPIDR2_EL0),
731917b1405SPeter Maydell
732917b1405SPeter Maydell /* Trap bits in HDFGRTR_EL2 / HDFGWTR_EL2, starting from bit 0. */
733917b1405SPeter Maydell DO_BIT(HDFGRTR, DBGBCRN_EL1),
734917b1405SPeter Maydell DO_BIT(HDFGRTR, DBGBVRN_EL1),
735917b1405SPeter Maydell DO_BIT(HDFGRTR, DBGWCRN_EL1),
736917b1405SPeter Maydell DO_BIT(HDFGRTR, DBGWVRN_EL1),
737917b1405SPeter Maydell DO_BIT(HDFGRTR, MDSCR_EL1),
738917b1405SPeter Maydell DO_BIT(HDFGRTR, DBGCLAIM),
739917b1405SPeter Maydell DO_BIT(HDFGWTR, OSLAR_EL1),
740917b1405SPeter Maydell DO_BIT(HDFGRTR, OSLSR_EL1),
741917b1405SPeter Maydell DO_BIT(HDFGRTR, OSECCR_EL1),
742917b1405SPeter Maydell DO_BIT(HDFGRTR, OSDLR_EL1),
743dc780233SPeter Maydell DO_BIT(HDFGRTR, PMEVCNTRN_EL0),
744dc780233SPeter Maydell DO_BIT(HDFGRTR, PMEVTYPERN_EL0),
745dc780233SPeter Maydell DO_BIT(HDFGRTR, PMCCFILTR_EL0),
746dc780233SPeter Maydell DO_BIT(HDFGRTR, PMCCNTR_EL0),
747dc780233SPeter Maydell DO_BIT(HDFGRTR, PMCNTEN),
748dc780233SPeter Maydell DO_BIT(HDFGRTR, PMINTEN),
749dc780233SPeter Maydell DO_BIT(HDFGRTR, PMOVS),
750dc780233SPeter Maydell DO_BIT(HDFGRTR, PMSELR_EL0),
751dc780233SPeter Maydell DO_BIT(HDFGWTR, PMSWINC_EL0),
752dc780233SPeter Maydell DO_BIT(HDFGWTR, PMCR_EL0),
753dc780233SPeter Maydell DO_BIT(HDFGRTR, PMMIR_EL1),
754dc780233SPeter Maydell DO_BIT(HDFGRTR, PMCEIDN_EL0),
755dd345653SPeter Maydell
756dd345653SPeter Maydell /* Trap bits in HFGITR_EL2, starting from bit 0 */
757dd345653SPeter Maydell DO_BIT(HFGITR, ICIALLUIS),
758dd345653SPeter Maydell DO_BIT(HFGITR, ICIALLU),
759dd345653SPeter Maydell DO_BIT(HFGITR, ICIVAU),
760dd345653SPeter Maydell DO_BIT(HFGITR, DCIVAC),
761dd345653SPeter Maydell DO_BIT(HFGITR, DCISW),
762dd345653SPeter Maydell DO_BIT(HFGITR, DCCSW),
763dd345653SPeter Maydell DO_BIT(HFGITR, DCCISW),
764dd345653SPeter Maydell DO_BIT(HFGITR, DCCVAU),
765dd345653SPeter Maydell DO_BIT(HFGITR, DCCVAP),
766dd345653SPeter Maydell DO_BIT(HFGITR, DCCVADP),
767dd345653SPeter Maydell DO_BIT(HFGITR, DCCIVAC),
768dd345653SPeter Maydell DO_BIT(HFGITR, DCZVA),
769132c98cdSPeter Maydell DO_BIT(HFGITR, ATS1E1R),
770132c98cdSPeter Maydell DO_BIT(HFGITR, ATS1E1W),
771132c98cdSPeter Maydell DO_BIT(HFGITR, ATS1E0R),
772132c98cdSPeter Maydell DO_BIT(HFGITR, ATS1E0W),
773132c98cdSPeter Maydell DO_BIT(HFGITR, ATS1E1RP),
774132c98cdSPeter Maydell DO_BIT(HFGITR, ATS1E1WP),
775bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVMALLE1OS),
776bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAE1OS),
777bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIASIDE1OS),
778bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAAE1OS),
779bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVALE1OS),
780bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAALE1OS),
781bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAE1OS),
782bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAAE1OS),
783bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVALE1OS),
784bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAALE1OS),
785bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVMALLE1IS),
786bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAE1IS),
787bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIASIDE1IS),
788bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAAE1IS),
789bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVALE1IS),
790bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAALE1IS),
791bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAE1IS),
792bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAAE1IS),
793bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVALE1IS),
794bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAALE1IS),
795bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAE1),
796bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAAE1),
797bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVALE1),
798bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIRVAALE1),
799bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVMALLE1),
800bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAE1),
801bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIASIDE1),
802bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAAE1),
803bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVALE1),
804bf2f0625SPeter Maydell DO_BIT(HFGITR, TLBIVAALE1),
805950037e2SPeter Maydell DO_BIT(HFGITR, CFPRCTX),
806950037e2SPeter Maydell DO_BIT(HFGITR, DVPRCTX),
807950037e2SPeter Maydell DO_BIT(HFGITR, CPPRCTX),
808950037e2SPeter Maydell DO_BIT(HFGITR, DCCVAC),
809361c33f6SPeter Maydell } FGTBit;
810361c33f6SPeter Maydell
811361c33f6SPeter Maydell #undef DO_BIT
812361c33f6SPeter Maydell #undef DO_REV_BIT
813361c33f6SPeter Maydell
814cf7c6d10SRichard Henderson typedef struct ARMCPRegInfo ARMCPRegInfo;
815cf7c6d10SRichard Henderson
816cf7c6d10SRichard Henderson /*
817cf7c6d10SRichard Henderson * Access functions for coprocessor registers. These cannot fail and
818cf7c6d10SRichard Henderson * may not raise exceptions.
819cf7c6d10SRichard Henderson */
820cf7c6d10SRichard Henderson typedef uint64_t CPReadFn(CPUARMState *env, const ARMCPRegInfo *opaque);
821cf7c6d10SRichard Henderson typedef void CPWriteFn(CPUARMState *env, const ARMCPRegInfo *opaque,
822cf7c6d10SRichard Henderson uint64_t value);
823cf7c6d10SRichard Henderson /* Access permission check functions for coprocessor registers. */
824cf7c6d10SRichard Henderson typedef CPAccessResult CPAccessFn(CPUARMState *env,
825cf7c6d10SRichard Henderson const ARMCPRegInfo *opaque,
826cf7c6d10SRichard Henderson bool isread);
827cf7c6d10SRichard Henderson /* Hook function for register reset */
828cf7c6d10SRichard Henderson typedef void CPResetFn(CPUARMState *env, const ARMCPRegInfo *opaque);
829cf7c6d10SRichard Henderson
830cf7c6d10SRichard Henderson #define CP_ANY 0xff
831cf7c6d10SRichard Henderson
832daf9b4a0SPeter Maydell /* Flags in the high bits of nv2_redirect_offset */
833daf9b4a0SPeter Maydell #define NV2_REDIR_NV1 0x4000 /* Only redirect when HCR_EL2.NV1 == 1 */
834daf9b4a0SPeter Maydell #define NV2_REDIR_NO_NV1 0x8000 /* Only redirect when HCR_EL2.NV1 == 0 */
835daf9b4a0SPeter Maydell #define NV2_REDIR_FLAG_MASK 0xc000
836daf9b4a0SPeter Maydell
837cf7c6d10SRichard Henderson /* Definition of an ARM coprocessor register */
838cf7c6d10SRichard Henderson struct ARMCPRegInfo {
839cf7c6d10SRichard Henderson /* Name of register (useful mainly for debugging, need not be unique) */
840cf7c6d10SRichard Henderson const char *name;
841cf7c6d10SRichard Henderson /*
842cf7c6d10SRichard Henderson * Location of register: coprocessor number and (crn,crm,opc1,opc2)
843cf7c6d10SRichard Henderson * tuple. Any of crm, opc1 and opc2 may be CP_ANY to indicate a
844cf7c6d10SRichard Henderson * 'wildcard' field -- any value of that field in the MRC/MCR insn
845cf7c6d10SRichard Henderson * will be decoded to this register. The register read and write
846cf7c6d10SRichard Henderson * callbacks will be passed an ARMCPRegInfo with the crn/crm/opc1/opc2
847cf7c6d10SRichard Henderson * used by the program, so it is possible to register a wildcard and
848cf7c6d10SRichard Henderson * then behave differently on read/write if necessary.
849cf7c6d10SRichard Henderson * For 64 bit registers, only crm and opc1 are relevant; crn and opc2
850cf7c6d10SRichard Henderson * must both be zero.
851cf7c6d10SRichard Henderson * For AArch64-visible registers, opc0 is also used.
852cf7c6d10SRichard Henderson * Since there are no "coprocessors" in AArch64, cp is purely used as a
853cf7c6d10SRichard Henderson * way to distinguish (for KVM's benefit) guest-visible system registers
854cf7c6d10SRichard Henderson * from demuxed ones provided to preserve the "no side effects on
855cf7c6d10SRichard Henderson * KVM register read/write from QEMU" semantics. cp==0x13 is guest
856cf7c6d10SRichard Henderson * visible (to match KVM's encoding); cp==0 will be converted to
857cf7c6d10SRichard Henderson * cp==0x13 when the ARMCPRegInfo is registered, for convenience.
858cf7c6d10SRichard Henderson */
859cf7c6d10SRichard Henderson uint8_t cp;
860cf7c6d10SRichard Henderson uint8_t crn;
861cf7c6d10SRichard Henderson uint8_t crm;
862cf7c6d10SRichard Henderson uint8_t opc0;
863cf7c6d10SRichard Henderson uint8_t opc1;
864cf7c6d10SRichard Henderson uint8_t opc2;
865cf7c6d10SRichard Henderson /* Execution state in which this register is visible: ARM_CP_STATE_* */
866d95101d6SRichard Henderson CPState state;
867cf7c6d10SRichard Henderson /* Register type: ARM_CP_* bits/values */
868cf7c6d10SRichard Henderson int type;
869cf7c6d10SRichard Henderson /* Access rights: PL*_[RW] */
87039107337SRichard Henderson CPAccessRights access;
871cf7c6d10SRichard Henderson /* Security state: ARM_CP_SECSTATE_* bits/values */
872cbe64585SRichard Henderson CPSecureState secure;
873cf7c6d10SRichard Henderson /*
874361c33f6SPeter Maydell * Which fine-grained trap register bit to check, if any. This
875361c33f6SPeter Maydell * value encodes both the trap register and bit within it.
876361c33f6SPeter Maydell */
877361c33f6SPeter Maydell FGTBit fgt;
878daf9b4a0SPeter Maydell
879daf9b4a0SPeter Maydell /*
880daf9b4a0SPeter Maydell * Offset from VNCR_EL2 when FEAT_NV2 redirects access to memory;
881daf9b4a0SPeter Maydell * may include an NV2_REDIR_* flag.
882daf9b4a0SPeter Maydell */
883daf9b4a0SPeter Maydell uint32_t nv2_redirect_offset;
884daf9b4a0SPeter Maydell
885361c33f6SPeter Maydell /*
886cf7c6d10SRichard Henderson * The opaque pointer passed to define_arm_cp_regs_with_opaque() when
887cf7c6d10SRichard Henderson * this register was defined: can be used to hand data through to the
888cf7c6d10SRichard Henderson * register read/write functions, since they are passed the ARMCPRegInfo*.
889cf7c6d10SRichard Henderson */
890cf7c6d10SRichard Henderson void *opaque;
891cf7c6d10SRichard Henderson /*
892cf7c6d10SRichard Henderson * Value of this register, if it is ARM_CP_CONST. Otherwise, if
893cf7c6d10SRichard Henderson * fieldoffset is non-zero, the reset value of the register.
894cf7c6d10SRichard Henderson */
895cf7c6d10SRichard Henderson uint64_t resetvalue;
896cf7c6d10SRichard Henderson /*
897cf7c6d10SRichard Henderson * Offset of the field in CPUARMState for this register.
898cf7c6d10SRichard Henderson * This is not needed if either:
899cf7c6d10SRichard Henderson * 1. type is ARM_CP_CONST or one of the ARM_CP_SPECIALs
900cf7c6d10SRichard Henderson * 2. both readfn and writefn are specified
901cf7c6d10SRichard Henderson */
902cf7c6d10SRichard Henderson ptrdiff_t fieldoffset; /* offsetof(CPUARMState, field) */
903cf7c6d10SRichard Henderson
904cf7c6d10SRichard Henderson /*
905cf7c6d10SRichard Henderson * Offsets of the secure and non-secure fields in CPUARMState for the
906cf7c6d10SRichard Henderson * register if it is banked. These fields are only used during the static
907cf7c6d10SRichard Henderson * registration of a register. During hashing the bank associated
908cf7c6d10SRichard Henderson * with a given security state is copied to fieldoffset which is used from
909cf7c6d10SRichard Henderson * there on out.
910cf7c6d10SRichard Henderson *
911cf7c6d10SRichard Henderson * It is expected that register definitions use either fieldoffset or
912cf7c6d10SRichard Henderson * bank_fieldoffsets in the definition but not both. It is also expected
913cf7c6d10SRichard Henderson * that both bank offsets are set when defining a banked register. This
914cf7c6d10SRichard Henderson * use indicates that a register is banked.
915cf7c6d10SRichard Henderson */
916cf7c6d10SRichard Henderson ptrdiff_t bank_fieldoffsets[2];
917cf7c6d10SRichard Henderson
918cf7c6d10SRichard Henderson /*
919cf7c6d10SRichard Henderson * Function for making any access checks for this register in addition to
920cf7c6d10SRichard Henderson * those specified by the 'access' permissions bits. If NULL, no extra
921cf7c6d10SRichard Henderson * checks required. The access check is performed at runtime, not at
922cf7c6d10SRichard Henderson * translate time.
923cf7c6d10SRichard Henderson */
924cf7c6d10SRichard Henderson CPAccessFn *accessfn;
925cf7c6d10SRichard Henderson /*
926cf7c6d10SRichard Henderson * Function for handling reads of this register. If NULL, then reads
927cf7c6d10SRichard Henderson * will be done by loading from the offset into CPUARMState specified
928cf7c6d10SRichard Henderson * by fieldoffset.
929cf7c6d10SRichard Henderson */
930cf7c6d10SRichard Henderson CPReadFn *readfn;
931cf7c6d10SRichard Henderson /*
932cf7c6d10SRichard Henderson * Function for handling writes of this register. If NULL, then writes
933cf7c6d10SRichard Henderson * will be done by writing to the offset into CPUARMState specified
934cf7c6d10SRichard Henderson * by fieldoffset.
935cf7c6d10SRichard Henderson */
936cf7c6d10SRichard Henderson CPWriteFn *writefn;
937cf7c6d10SRichard Henderson /*
938cf7c6d10SRichard Henderson * Function for doing a "raw" read; used when we need to copy
939cf7c6d10SRichard Henderson * coprocessor state to the kernel for KVM or out for
940cf7c6d10SRichard Henderson * migration. This only needs to be provided if there is also a
941cf7c6d10SRichard Henderson * readfn and it has side effects (for instance clear-on-read bits).
942cf7c6d10SRichard Henderson */
943cf7c6d10SRichard Henderson CPReadFn *raw_readfn;
944cf7c6d10SRichard Henderson /*
945cf7c6d10SRichard Henderson * Function for doing a "raw" write; used when we need to copy KVM
946cf7c6d10SRichard Henderson * kernel coprocessor state into userspace, or for inbound
947cf7c6d10SRichard Henderson * migration. This only needs to be provided if there is also a
948cf7c6d10SRichard Henderson * writefn and it masks out "unwritable" bits or has write-one-to-clear
949cf7c6d10SRichard Henderson * or similar behaviour.
950cf7c6d10SRichard Henderson */
951cf7c6d10SRichard Henderson CPWriteFn *raw_writefn;
952cf7c6d10SRichard Henderson /*
953cf7c6d10SRichard Henderson * Function for resetting the register. If NULL, then reset will be done
954cf7c6d10SRichard Henderson * by writing resetvalue to the field specified in fieldoffset. If
955cf7c6d10SRichard Henderson * fieldoffset is 0 then no reset will be done.
956cf7c6d10SRichard Henderson */
957cf7c6d10SRichard Henderson CPResetFn *resetfn;
958cf7c6d10SRichard Henderson
959cf7c6d10SRichard Henderson /*
960e730287cSPeter Maydell * "Original" readfn, writefn, accessfn.
961cf7c6d10SRichard Henderson * For ARMv8.1-VHE register aliases, we overwrite the read/write
962cf7c6d10SRichard Henderson * accessor functions of various EL1/EL0 to perform the runtime
963cf7c6d10SRichard Henderson * check for which sysreg should actually be modified, and then
964cf7c6d10SRichard Henderson * forwards the operation. Before overwriting the accessors,
965cf7c6d10SRichard Henderson * the original function is copied here, so that accesses that
966cf7c6d10SRichard Henderson * really do go to the EL1/EL0 version proceed normally.
967cf7c6d10SRichard Henderson * (The corresponding EL2 register is linked via opaque.)
968cf7c6d10SRichard Henderson */
969cf7c6d10SRichard Henderson CPReadFn *orig_readfn;
970cf7c6d10SRichard Henderson CPWriteFn *orig_writefn;
971e730287cSPeter Maydell CPAccessFn *orig_accessfn;
972cf7c6d10SRichard Henderson };
973cf7c6d10SRichard Henderson
974cf7c6d10SRichard Henderson /*
975cf7c6d10SRichard Henderson * Macros which are lvalues for the field in CPUARMState for the
976cf7c6d10SRichard Henderson * ARMCPRegInfo *ri.
977cf7c6d10SRichard Henderson */
978cf7c6d10SRichard Henderson #define CPREG_FIELD32(env, ri) \
979cf7c6d10SRichard Henderson (*(uint32_t *)((char *)(env) + (ri)->fieldoffset))
980cf7c6d10SRichard Henderson #define CPREG_FIELD64(env, ri) \
981cf7c6d10SRichard Henderson (*(uint64_t *)((char *)(env) + (ri)->fieldoffset))
982cf7c6d10SRichard Henderson
9835809ac57SRichard Henderson void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu, const ARMCPRegInfo *reg,
9845809ac57SRichard Henderson void *opaque);
985cf7c6d10SRichard Henderson
define_one_arm_cp_reg(ARMCPU * cpu,const ARMCPRegInfo * regs)986cf7c6d10SRichard Henderson static inline void define_one_arm_cp_reg(ARMCPU *cpu, const ARMCPRegInfo *regs)
987cf7c6d10SRichard Henderson {
9885809ac57SRichard Henderson define_one_arm_cp_reg_with_opaque(cpu, regs, NULL);
989cf7c6d10SRichard Henderson }
9905809ac57SRichard Henderson
9915809ac57SRichard Henderson void define_arm_cp_regs_with_opaque_len(ARMCPU *cpu, const ARMCPRegInfo *regs,
9925809ac57SRichard Henderson void *opaque, size_t len);
9935809ac57SRichard Henderson
9945809ac57SRichard Henderson #define define_arm_cp_regs_with_opaque(CPU, REGS, OPAQUE) \
9955809ac57SRichard Henderson do { \
9965809ac57SRichard Henderson QEMU_BUILD_BUG_ON(ARRAY_SIZE(REGS) == 0); \
9975809ac57SRichard Henderson define_arm_cp_regs_with_opaque_len(CPU, REGS, OPAQUE, \
9985809ac57SRichard Henderson ARRAY_SIZE(REGS)); \
9995809ac57SRichard Henderson } while (0)
10005809ac57SRichard Henderson
10015809ac57SRichard Henderson #define define_arm_cp_regs(CPU, REGS) \
10025809ac57SRichard Henderson define_arm_cp_regs_with_opaque(CPU, REGS, NULL)
10035809ac57SRichard Henderson
1004cf7c6d10SRichard Henderson const ARMCPRegInfo *get_arm_cp_reginfo(GHashTable *cpregs, uint32_t encoded_cp);
1005cf7c6d10SRichard Henderson
1006cf7c6d10SRichard Henderson /*
1007cf7c6d10SRichard Henderson * Definition of an ARM co-processor register as viewed from
1008cf7c6d10SRichard Henderson * userspace. This is used for presenting sanitised versions of
1009cf7c6d10SRichard Henderson * registers to userspace when emulating the Linux AArch64 CPU
1010cf7c6d10SRichard Henderson * ID/feature ABI (advertised as HWCAP_CPUID).
1011cf7c6d10SRichard Henderson */
1012cf7c6d10SRichard Henderson typedef struct ARMCPRegUserSpaceInfo {
1013cf7c6d10SRichard Henderson /* Name of register */
1014cf7c6d10SRichard Henderson const char *name;
1015cf7c6d10SRichard Henderson
1016cf7c6d10SRichard Henderson /* Is the name actually a glob pattern */
1017cf7c6d10SRichard Henderson bool is_glob;
1018cf7c6d10SRichard Henderson
1019cf7c6d10SRichard Henderson /* Only some bits are exported to user space */
1020cf7c6d10SRichard Henderson uint64_t exported_bits;
1021cf7c6d10SRichard Henderson
1022cf7c6d10SRichard Henderson /* Fixed bits are applied after the mask */
1023cf7c6d10SRichard Henderson uint64_t fixed_bits;
1024cf7c6d10SRichard Henderson } ARMCPRegUserSpaceInfo;
1025cf7c6d10SRichard Henderson
10265809ac57SRichard Henderson void modify_arm_cp_regs_with_len(ARMCPRegInfo *regs, size_t regs_len,
10275809ac57SRichard Henderson const ARMCPRegUserSpaceInfo *mods,
10285809ac57SRichard Henderson size_t mods_len);
1029cf7c6d10SRichard Henderson
10305809ac57SRichard Henderson #define modify_arm_cp_regs(REGS, MODS) \
10315809ac57SRichard Henderson do { \
10325809ac57SRichard Henderson QEMU_BUILD_BUG_ON(ARRAY_SIZE(REGS) == 0); \
10335809ac57SRichard Henderson QEMU_BUILD_BUG_ON(ARRAY_SIZE(MODS) == 0); \
10345809ac57SRichard Henderson modify_arm_cp_regs_with_len(REGS, ARRAY_SIZE(REGS), \
10355809ac57SRichard Henderson MODS, ARRAY_SIZE(MODS)); \
10365809ac57SRichard Henderson } while (0)
1037cf7c6d10SRichard Henderson
1038cf7c6d10SRichard Henderson /* CPWriteFn that can be used to implement writes-ignored behaviour */
1039cf7c6d10SRichard Henderson void arm_cp_write_ignore(CPUARMState *env, const ARMCPRegInfo *ri,
1040cf7c6d10SRichard Henderson uint64_t value);
1041cf7c6d10SRichard Henderson /* CPReadFn that can be used for read-as-zero behaviour */
1042cf7c6d10SRichard Henderson uint64_t arm_cp_read_zero(CPUARMState *env, const ARMCPRegInfo *ri);
1043cf7c6d10SRichard Henderson
1044f43ee493SPeter Maydell /* CPWriteFn that just writes the value to ri->fieldoffset */
1045f43ee493SPeter Maydell void raw_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value);
1046f43ee493SPeter Maydell
1047cf7c6d10SRichard Henderson /*
1048cf7c6d10SRichard Henderson * CPResetFn that does nothing, for use if no reset is required even
1049cf7c6d10SRichard Henderson * if fieldoffset is non zero.
1050cf7c6d10SRichard Henderson */
1051cf7c6d10SRichard Henderson void arm_cp_reset_ignore(CPUARMState *env, const ARMCPRegInfo *opaque);
1052cf7c6d10SRichard Henderson
1053cf7c6d10SRichard Henderson /*
1054cf7c6d10SRichard Henderson * Return true if this reginfo struct's field in the cpu state struct
1055cf7c6d10SRichard Henderson * is 64 bits wide.
1056cf7c6d10SRichard Henderson */
cpreg_field_is_64bit(const ARMCPRegInfo * ri)1057cf7c6d10SRichard Henderson static inline bool cpreg_field_is_64bit(const ARMCPRegInfo *ri)
1058cf7c6d10SRichard Henderson {
1059cf7c6d10SRichard Henderson return (ri->state == ARM_CP_STATE_AA64) || (ri->type & ARM_CP_64BIT);
1060cf7c6d10SRichard Henderson }
1061cf7c6d10SRichard Henderson
cp_access_ok(int current_el,const ARMCPRegInfo * ri,int isread)1062cf7c6d10SRichard Henderson static inline bool cp_access_ok(int current_el,
1063cf7c6d10SRichard Henderson const ARMCPRegInfo *ri, int isread)
1064cf7c6d10SRichard Henderson {
1065cf7c6d10SRichard Henderson return (ri->access >> ((current_el * 2) + isread)) & 1;
1066cf7c6d10SRichard Henderson }
1067cf7c6d10SRichard Henderson
1068cf7c6d10SRichard Henderson /* Raw read of a coprocessor register (as needed for migration, etc) */
1069cf7c6d10SRichard Henderson uint64_t read_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri);
1070cf7c6d10SRichard Henderson
107175662f36SPeter Maydell /*
107275662f36SPeter Maydell * Return true if the cp register encoding is in the "feature ID space" as
107375662f36SPeter Maydell * defined by FEAT_IDST (and thus should be reported with ER_ELx.EC
107475662f36SPeter Maydell * as EC_SYSTEMREGISTERTRAP rather than EC_UNCATEGORIZED).
107575662f36SPeter Maydell */
arm_cpreg_encoding_in_idspace(uint8_t opc0,uint8_t opc1,uint8_t opc2,uint8_t crn,uint8_t crm)107675662f36SPeter Maydell static inline bool arm_cpreg_encoding_in_idspace(uint8_t opc0, uint8_t opc1,
107775662f36SPeter Maydell uint8_t opc2,
107875662f36SPeter Maydell uint8_t crn, uint8_t crm)
107975662f36SPeter Maydell {
108075662f36SPeter Maydell return opc0 == 3 && (opc1 == 0 || opc1 == 1 || opc1 == 3) &&
108175662f36SPeter Maydell crn == 0 && crm < 8;
108275662f36SPeter Maydell }
108375662f36SPeter Maydell
108475662f36SPeter Maydell /*
108575662f36SPeter Maydell * As arm_cpreg_encoding_in_idspace(), but take the encoding from an
108675662f36SPeter Maydell * ARMCPRegInfo.
108775662f36SPeter Maydell */
arm_cpreg_in_idspace(const ARMCPRegInfo * ri)108875662f36SPeter Maydell static inline bool arm_cpreg_in_idspace(const ARMCPRegInfo *ri)
108975662f36SPeter Maydell {
109075662f36SPeter Maydell return ri->state == ARM_CP_STATE_AA64 &&
109175662f36SPeter Maydell arm_cpreg_encoding_in_idspace(ri->opc0, ri->opc1, ri->opc2,
109275662f36SPeter Maydell ri->crn, ri->crm);
109375662f36SPeter Maydell }
109475662f36SPeter Maydell
109534bfe467SFabiano Rosas #ifdef CONFIG_USER_ONLY
define_cortex_a72_a57_a53_cp_reginfo(ARMCPU * cpu)109634bfe467SFabiano Rosas static inline void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu) { }
109734bfe467SFabiano Rosas #else
109834bfe467SFabiano Rosas void define_cortex_a72_a57_a53_cp_reginfo(ARMCPU *cpu);
109934bfe467SFabiano Rosas #endif
110034bfe467SFabiano Rosas
11016d482423SRichard Henderson CPAccessResult access_tvm_trvm(CPUARMState *, const ARMCPRegInfo *, bool);
11026d482423SRichard Henderson
110367d10fc4SPeter Maydell /**
110467d10fc4SPeter Maydell * arm_cpreg_trap_in_nv: Return true if cpreg traps in nested virtualization
110567d10fc4SPeter Maydell *
110667d10fc4SPeter Maydell * Return true if this cpreg is one which should be trapped to EL2 if
110767d10fc4SPeter Maydell * it is executed at EL1 when nested virtualization is enabled via HCR_EL2.NV.
110867d10fc4SPeter Maydell */
arm_cpreg_traps_in_nv(const ARMCPRegInfo * ri)110967d10fc4SPeter Maydell static inline bool arm_cpreg_traps_in_nv(const ARMCPRegInfo *ri)
111067d10fc4SPeter Maydell {
111167d10fc4SPeter Maydell /*
111267d10fc4SPeter Maydell * The Arm ARM defines the registers to be trapped in terms of
111367d10fc4SPeter Maydell * their names (I_TZTZL). However the underlying principle is "if
111467d10fc4SPeter Maydell * it would UNDEF at EL1 but work at EL2 then it should trap", and
111567d10fc4SPeter Maydell * the way the encoding of sysregs and system instructions is done
111667d10fc4SPeter Maydell * means that the right set of registers is exactly those where
111767d10fc4SPeter Maydell * the opc1 field is 4 or 5. (You can see this also in the assert
111867d10fc4SPeter Maydell * we do that the opc1 field and the permissions mask line up in
111967d10fc4SPeter Maydell * define_one_arm_cp_reg_with_opaque().)
112067d10fc4SPeter Maydell * Checking the opc1 field is easier for us and avoids the problem
112167d10fc4SPeter Maydell * that we do not consistently use the right architectural names
112267d10fc4SPeter Maydell * for all sysregs, since we treat the name field as largely for debug.
112367d10fc4SPeter Maydell *
112467d10fc4SPeter Maydell * However we do this check, it is going to be at least potentially
112567d10fc4SPeter Maydell * fragile to future new sysregs, but this seems the least likely
112667d10fc4SPeter Maydell * to break.
112767d10fc4SPeter Maydell *
112867d10fc4SPeter Maydell * In particular, note that the released sysreg XML defines that
112967d10fc4SPeter Maydell * the FEAT_MEC sysregs and instructions do not follow this FEAT_NV
113067d10fc4SPeter Maydell * trapping rule, so we will need to add an ARM_CP_* flag to indicate
113167d10fc4SPeter Maydell * "register does not trap on NV" to handle those if/when we implement
113267d10fc4SPeter Maydell * FEAT_MEC.
113367d10fc4SPeter Maydell */
113467d10fc4SPeter Maydell return ri->opc1 == 4 || ri->opc1 == 5;
113567d10fc4SPeter Maydell }
113667d10fc4SPeter Maydell
1137cf7c6d10SRichard Henderson #endif /* TARGET_ARM_CPREGS_H */
1138