cortex_a/registers/cpacr_el1.rs
1// SPDX-License-Identifier: Apache-2.0 OR MIT
2//
3// Copyright (c) 2018-2022 by the author(s)
4//
5// Author(s):
6// - Valentin B. <valentin.be@protonmail.com>
7
8//! Architectural Feature Access Control Register - EL1
9//!
10//! Controls access to trace, SVE, and Advanced SIMD and floating-point functionality.
11
12use tock_registers::{
13 interfaces::{Readable, Writeable},
14 register_bitfields,
15};
16
17register_bitfields! {u64,
18 pub CPACR_EL1 [
19 /// Traps EL0 and EL1 System register accesses to all implemented trace
20 /// registers from both Execution states to EL1, or to EL2 when it is
21 /// implemented and enabled in the current Security state and HCR_EL2.TGE
22 /// is 1, as follows:
23 ///
24 /// - In AArch64 state, accesses to trace registers are trapped, reported
25 /// using ESR_ELx.EC value 0x18.
26 ///
27 /// - In AArch32 state, MRC and MCR accesses to trace registers are trapped,
28 /// reported using ESR_ELx.EC value 0x05.
29 ///
30 /// - In AArch32 state, MCR and MCRR accesses to trace registers are trapped,
31 /// reported using ESR_ELx.EC value 0x0C.
32 ///
33 /// System register accesses to the trace registers can have side-effects.
34 /// When a System register access is trapped, any side-effects that are
35 /// normally associated with the access do not occur before the exception is
36 /// taken.
37 ///
38 /// If System register access to the trace functionality is not implemented,
39 /// this bit is considered reserved.
40 ///
41 /// On a Warm reset, this field resets to an undefined value.
42 TTA OFFSET(28) NUMBITS(1) [
43 /// This control does not cause any instructions to be trapped.
44 NoTrap = 0b0,
45 /// This control causes EL0 and EL1 System register accesses to all
46 /// implemented trace registers to be trapped.
47 TrapTrace = 0b1
48 ],
49
50 /// Traps execution at EL0 and EL1 of instructions that access the Advanced SIMD
51 /// and floating-point registers from both Execution states to EL1, reported using
52 /// ESR_ELx.EC value 0x07, or to EL2 reported using ESR_ELx.EC value 0x00 when EL2
53 /// is implemented and enabled in the current Security state and HCR_EL2.TGE is 1,
54 /// as follows:
55 ///
56 /// - In AArch64 state, accesses to FPCR, FPSR, any of the SIMD and floating-point
57 /// registers V0-V31, including their views as D0-31 registers or S0-31 registers.
58 ///
59 /// - In AArch32 state, FPSCR, and any of the SIMD and floating-point registers
60 /// Q0-15, including their views as D0-31 registers or S0-31 registers.
61 ///
62 /// Traps execution at EL1 and EL0 of SVE instructions to EL1, or to EL2 when El2
63 /// is implemented and enabled for the current Security state and HCR_EL2.TGE is 1.
64 /// The exception is reported using ESR_ELx.EC value 0x07.
65 ///
66 /// A trap taken as a result of [`CPACR_EL1::ZEN`] has precendence over a trap taken
67 /// as a result of [`CPACR_EL1::FPEN`].
68 ///
69 /// On a Warm reset, this fields resets to an undefined value.
70 FPEN OFFSET(20) NUMBITS(2) [
71 /// This control causes execution of these instructions at EL0 and EL1 to be trapped.
72 TrapEl0El1 = 0b00,
73 /// This control causes execution of these instructions at EL0 to be trapped, but
74 /// does not cause any instructions at EL1 to be trapped.
75 TrapEl0 = 0b01,
76 /// This control causes execution of these instructions at EL1 and EL0 to be trapped.
77 TrapEl1El0 = 0b10,
78 /// This control does not cause execution of any instructions to be trapped.
79 TrapNothing = 0b11
80 ],
81
82 /// **When FEAT_SVE is implemented:**
83 ///
84 /// Traps execution at EL1 and EL0 of SVE instructions and instructions that directly
85 /// access the ZCR_EL1 Systme register to EL1, or to EL2 when El2 is implemented in the
86 /// current Security state and HCR_EL2.TGE is 1.
87 ///
88 /// The exception is reported using ESR_ELx.EC value 0x19.
89 ///
90 /// A trap taken as a result of CPACR_EL1.ZEN has precedence over a trap taken as a result
91 /// of CPACR_EL1.FPEN.
92 ///
93 /// On a Warm reset, this field resets to an undefined value.
94 ///
95 /// **Otherwise:**
96 ///
97 /// Reserved.
98 ZEN OFFSET(16) NUMBITS(2) [
99 /// This control causes execution of these instructions at EL0 and EL1 to be trapped.
100 TrapEl0El1 = 0b00,
101 /// This control causes execution of these instructions at EL0 to be trapped, but
102 /// does not cause execution of any instructions at EL1 to be trapped.
103 TrapEl0 = 0b01,
104 /// This control causes execution of these instructions at EL1 and EL0 to be trapped.
105 TrapEl1El0 = 0b10,
106 /// This control does not cause execution of any instructions to be trapped.
107 TrapNothing = 0b11
108 ]
109 ]
110}
111
112pub struct Reg;
113
114impl Readable for Reg {
115 type T = u64;
116 type R = ();
117
118 sys_coproc_read_raw!(u64, "CPACR_EL1", "x");
119}
120
121impl Writeable for Reg {
122 type T = u64;
123 type R = ();
124
125 sys_coproc_write_raw!(u64, "CPACR_EL1", "x");
126}
127
128pub const CPACR_EL1: Reg = Reg;