aarch32_cpu/register/
mod.rs

1//! Access registers in Armv7-R and Armv8-R
2
3pub mod actlr;
4pub mod actlr2;
5pub mod adfsr;
6pub mod aidr;
7pub mod aifsr;
8pub mod amair0;
9pub mod amair1;
10pub mod bpiall;
11pub mod ccsidr;
12pub mod clidr;
13pub mod contextidr;
14pub mod cpacr;
15pub mod cpsr;
16pub mod csselr;
17pub mod ctr;
18pub mod dc_sw_ops;
19pub mod dccimvac;
20pub mod dccisw;
21pub mod dccmvac;
22pub mod dccmvau;
23pub mod dccsw;
24pub mod dcimvac;
25pub mod dcisw;
26pub mod dfar;
27pub mod dfsr;
28pub mod dlr;
29pub mod dracr;
30pub mod drbar;
31pub mod drsr;
32pub mod dspsr;
33pub mod fcseidr;
34pub mod icc_pmr;
35pub mod id_afr0;
36pub mod id_dfr0;
37pub mod id_isar0;
38pub mod id_isar1;
39pub mod id_isar2;
40pub mod id_isar3;
41pub mod id_isar4;
42pub mod id_isar5;
43pub mod id_mmfr0;
44pub mod id_mmfr1;
45pub mod id_mmfr2;
46pub mod id_mmfr3;
47pub mod id_mmfr4;
48pub mod id_pfr0;
49pub mod id_pfr1;
50pub mod ifar;
51pub mod ifsr;
52pub mod imp;
53pub mod iracr;
54pub mod irbar;
55pub mod irsr;
56pub mod mair0;
57pub mod mair1;
58pub mod midr;
59pub mod mpidr;
60pub mod mpuir;
61pub mod nsacr;
62pub mod par;
63pub mod pmccfiltr;
64pub mod pmccntr;
65pub mod pmceid0;
66pub mod pmceid1;
67pub mod pmcntenclr;
68pub mod pmcntenset;
69pub mod pmcr;
70pub mod pmevcntr0;
71pub mod pmevcntr1;
72pub mod pmevcntr2;
73pub mod pmevcntr3;
74pub mod pmevtyper0;
75pub mod pmevtyper1;
76pub mod pmevtyper2;
77pub mod pmevtyper3;
78pub mod pmintenclr;
79pub mod pmintenset;
80pub mod pmovsr;
81pub mod pmovsset;
82pub mod pmselr;
83pub mod pmswinc;
84pub mod pmuserenr;
85pub mod pmxevcntr;
86pub mod pmxevtyper;
87pub mod revidr;
88pub mod rgnr;
89pub mod rvbar;
90pub mod sctlr;
91pub mod tcmtr;
92pub mod tlbiall;
93pub mod tlbtr;
94pub mod tpidrprw;
95pub mod tpidruro;
96pub mod tpidrurw;
97pub mod vmpidr;
98pub mod vpidr;
99pub mod vsctlr;
100
101pub use actlr::Actlr;
102pub use actlr2::Actlr2;
103pub use adfsr::Adfsr;
104pub use aidr::Aidr;
105pub use aifsr::Aifsr;
106pub use amair0::Amair0;
107pub use amair1::Amair1;
108pub use bpiall::BpIAll;
109pub use ccsidr::Ccsidr;
110pub use clidr::Clidr;
111pub use contextidr::Contextidr;
112pub use cpacr::Cpacr;
113pub use cpsr::Cpsr;
114pub use csselr::Csselr;
115pub use ctr::Ctr;
116pub use dccimvac::Dccimvac;
117pub use dccisw::Dccisw;
118pub use dccmvac::Dccmvac;
119pub use dccmvau::Dccmvau;
120pub use dccsw::Dccsw;
121pub use dcimvac::Dcimvac;
122pub use dcisw::Dcisw;
123pub use dfar::Dfar;
124pub use dfsr::Dfsr;
125pub use dlr::Dlr;
126pub use dracr::Dracr;
127pub use drbar::Drbar;
128pub use drsr::Drsr;
129pub use dspsr::Dspsr;
130pub use fcseidr::Fcseidr;
131pub use icc_pmr::IccPmr;
132pub use id_afr0::IdAfr0;
133pub use id_dfr0::IdDfr0;
134pub use id_isar0::IdIsar0;
135pub use id_isar1::IdIsar1;
136pub use id_isar2::IdIsar2;
137pub use id_isar3::IdIsar3;
138pub use id_isar4::IdIsar4;
139pub use id_isar5::IdIsar5;
140pub use id_mmfr0::IdMmfr0;
141pub use id_mmfr1::IdMmfr1;
142pub use id_mmfr2::IdMmfr2;
143pub use id_mmfr3::IdMmfr3;
144pub use id_mmfr4::IdMmfr4;
145pub use id_pfr0::IdPfr0;
146pub use id_pfr1::IdPfr1;
147pub use ifar::Ifar;
148pub use ifsr::Ifsr;
149pub use iracr::Iracr;
150pub use irbar::Irbar;
151pub use irsr::Irsr;
152pub use mair0::Mair0;
153pub use mair1::Mair1;
154pub use midr::Midr;
155pub use mpidr::Mpidr;
156pub use mpuir::Mpuir;
157pub use nsacr::Nsacr;
158pub use par::Par;
159pub use pmccfiltr::Pmccfiltr;
160pub use pmccntr::Pmccntr;
161pub use pmceid0::Pmceid0;
162pub use pmceid1::Pmceid1;
163pub use pmcntenclr::Pmcntenclr;
164pub use pmcntenset::Pmcntenset;
165pub use pmcr::Pmcr;
166pub use pmevcntr0::Pmevcntr0;
167pub use pmevcntr1::Pmevcntr1;
168pub use pmevcntr2::Pmevcntr2;
169pub use pmevcntr3::Pmevcntr3;
170pub use pmevtyper0::Pmevtyper0;
171pub use pmevtyper1::Pmevtyper1;
172pub use pmevtyper2::Pmevtyper2;
173pub use pmevtyper3::Pmevtyper3;
174pub use pmintenclr::Pmintenclr;
175pub use pmintenset::Pmintenset;
176pub use pmovsr::Pmovsr;
177pub use pmovsset::Pmovsset;
178pub use pmselr::Pmselr;
179pub use pmswinc::Pmswinc;
180pub use pmuserenr::Pmuserenr;
181pub use pmxevcntr::Pmxevcntr;
182pub use pmxevtyper::Pmxevtyper;
183pub use revidr::Revidr;
184pub use rgnr::Rgnr;
185pub use rvbar::Rvbar;
186pub use sctlr::Sctlr;
187pub use tcmtr::Tcmtr;
188pub use tlbiall::TlbIAll;
189pub use tlbtr::Tlbtr;
190pub use tpidrprw::Tpidrprw;
191pub use tpidruro::Tpidruro;
192pub use tpidrurw::Tpidrurw;
193pub use vmpidr::Vmpidr;
194pub use vpidr::Vpidr;
195pub use vsctlr::Vsctlr;
196
197#[cfg(any(test, doc, arm_architecture = "v8-r"))]
198pub mod armv8r;
199#[cfg(any(test, doc, arm_architecture = "v8-r"))]
200pub use armv8r::*;
201
202pub use imp::*;
203
204/// Describes a 32-bit System Register
205pub trait SysReg {
206    /// Which Co-Processor (e.g. 15 for CP15) is this register in?
207    const CP: u32;
208    /// Which CRn argument (e.g. 0 for c0) accesses this register
209    const CRN: u32;
210    /// Which OP1 argument accesses this register
211    const OP1: u32;
212    /// Which CRm argument (e.g. 1 for c1) accesses this register
213    const CRM: u32;
214    /// Which OP2 argument accesses this register
215    const OP2: u32;
216}
217
218/// 32-bit Readable System Registers
219pub trait SysRegRead: SysReg {
220    /// Read a value from this 32-bit register
221    ///
222    /// # Safety
223    ///
224    /// You need to read the Architecture Reference Manual because this read
225    /// may have side-effects.
226    #[cfg_attr(not(feature = "check-asm"), inline)]
227    #[cfg_attr(
228        any(arm_architecture = "v4t", arm_architecture = "v5te"),
229        instruction_set(arm::a32)
230    )]
231    unsafe fn read_raw() -> u32 {
232        let r: u32;
233        #[cfg(target_arch = "arm")]
234        unsafe {
235            core::arch::asm!(
236                "mrc p{cp}, {op1}, {reg}, c{crn}, c{crm}, {op2}",
237                cp = const Self::CP,
238                op1 = const Self::OP1,
239                reg = out(reg) r,
240                crn = const Self::CRN,
241                crm = const Self::CRM,
242                op2 = const Self::OP2,
243                options(nomem, nostack, preserves_flags)
244            );
245        }
246        #[cfg(not(target_arch = "arm"))]
247        {
248            r = 0;
249        }
250        r
251    }
252}
253
254/// Writable 32-bit System Registers
255pub trait SysRegWrite: SysReg {
256    /// Write a value to this 32-bit register
257    ///
258    /// # Safety
259    ///
260    /// You need to read the Architecture Reference Manual to verify that you are
261    /// writing valid data here.
262    #[cfg_attr(not(feature = "check-asm"), inline)]
263    #[cfg_attr(
264        any(arm_architecture = "v4t", arm_architecture = "v5te"),
265        instruction_set(arm::a32)
266    )]
267    unsafe fn write_raw(_value: u32) {
268        #[cfg(target_arch = "arm")]
269        unsafe {
270            core::arch::asm!(
271                "mcr p{cp}, {op1}, {reg}, c{crn}, c{crm}, {op2}",
272                cp = const Self::CP,
273                op1 = const Self::OP1,
274                reg = in(reg) _value,
275                crn = const Self::CRN,
276                crm = const Self::CRM,
277                op2 = const Self::OP2,
278                options(nomem, nostack, preserves_flags)
279            );
280        }
281    }
282}
283
284/// Describes a 64-bit System Register
285pub trait SysReg64 {
286    /// Which Co-Processor (e.g. 15 for CP15) is this register in?
287    const CP: u32;
288    /// Which OP1 argument accesses this register
289    const OP1: u32;
290    /// Which CRm argument (e.g. 1 for c1) accesses this register
291    const CRM: u32;
292}
293
294/// 64-bit Readable System Registers
295pub trait SysRegRead64: SysReg64 {
296    /// Read a value from this 64-bit register
297    ///
298    /// # Safety
299    ///
300    /// You need to read the Architecture Reference Manual because this read
301    /// may have side-effects.
302    #[inline]
303    unsafe fn read_raw() -> u64 {
304        let r_lo: u32;
305        let r_hi: u32;
306        #[cfg(target_arch = "arm")]
307        unsafe {
308            core::arch::asm!(
309                "mrrc p{cp}, {op1}, {rt}, {rt2}, c{crm}",
310                cp = const Self::CP,
311                op1 = const Self::OP1,
312                rt = out(reg) r_lo,
313                rt2 = out(reg) r_hi,
314                crm = const Self::CRM,
315                options(nomem, nostack, preserves_flags)
316            );
317        }
318        #[cfg(not(target_arch = "arm"))]
319        {
320            r_lo = 0;
321            r_hi = 0;
322        }
323        ((r_hi as u64) << 32) | (r_lo as u64)
324    }
325}
326
327/// Writable 64-bit System Registers
328pub trait SysRegWrite64: SysReg64 {
329    /// Write a value to this 64-bit register
330    ///
331    /// # Safety
332    ///
333    /// You need to read the Architecture Reference Manual to verify that you are
334    /// writing valid data here.
335    #[inline]
336    unsafe fn write_raw(_value: u64) {
337        #[cfg(target_arch = "arm")]
338        unsafe {
339            let r_lo = _value as u32;
340            let r_hi = (_value >> 32) as u32;
341            core::arch::asm!(
342                "mcrr p{cp}, {op1}, {rt}, {rt2}, c{crm}",
343                cp = const Self::CP,
344                op1 = const Self::OP1,
345                rt = in(reg) r_lo,
346                rt2 = in(reg) r_hi,
347                crm = const Self::CRM,
348                options(nomem, nostack, preserves_flags)
349            );
350        }
351    }
352}