1#[allow(unused)]
4use arbitrary_int::u4;
5
6use crate::register::{SysReg, SysRegRead, SysRegWrite};
7
8#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11#[cfg(arm_architecture = "v5te")]
12pub struct Ifsr {
13 #[bits(4..=7, rw)]
15 domain: u4,
16 #[bits([0..=3], rw)]
18 status: Option<IfsrStatus>,
19}
20
21#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24#[cfg(arm_architecture = "v6")]
25pub struct Ifsr {
26 #[bits(4..=7, rw)]
28 domain: u4,
29 #[bits([0..=3], rw)]
31 status: Option<IfsrStatus>,
32}
33
34#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
36#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
37#[cfg(arm_architecture = "v7-r")]
38pub struct Ifsr {
39 #[bit(12, r)]
41 sd: bool,
42 #[bits(4..=7, rw)]
44 domain: u4,
45 #[bits([0..=3, 10], rw)]
47 status: Option<IfsrStatus>,
48}
49
50#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
52#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
53#[cfg(arm_architecture = "v7-a")]
54pub struct Ifsr {
55 #[bit(16, rw)]
57 fnv: bool,
58 #[bit(12, rw)]
60 ext: bool,
61 #[bits([0..=3, 10], rw)]
63 status: Option<IfsrStatus>,
64}
65
66#[bitbybit::bitfield(u32, debug, defmt_bitfields(feature = "defmt"))]
68#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
69#[cfg(arm_architecture = "v8-r")]
70pub struct Ifsr {
71 #[bit(16, rw)]
73 fnv: bool,
74 #[bit(12, rw)]
76 ext: bool,
77 #[bits([0..=5], rw)]
79 status: Option<IfsrStatus>,
80}
81
82#[bitbybit::bitenum(u4, exhaustive = false)]
84#[cfg_attr(feature = "defmt", derive(defmt::Format))]
85#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
86#[derive(Debug, PartialEq, Eq)]
87#[cfg(arm_architecture = "v5te")]
88pub enum IfsrStatus {
89 Alignment = 1,
91 DebugEvent = 2,
93 AlignmentAlt = 3,
95 TranslationFaultFirstLevel = 5,
97 TranslationFaultSecondLevel = 7,
99 SyncExtAbort = 8,
101 DomainFaultFirstLevel = 9,
103 SyncExtAbortAlt = 10,
105 DomainFaultSecondLevel = 11,
107 SyncExtAbortOnTranslationTableWalkFirstLevel = 12,
109 PermissionFaultFirstLevel = 13,
111 SyncExtAbortOnTranslationTableWalkSecondLevel = 14,
113 PermissionFaultSecondLevel = 15,
115}
116
117#[bitbybit::bitenum(u4, exhaustive = false)]
119#[cfg_attr(feature = "defmt", derive(defmt::Format))]
120#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
121#[derive(Debug, PartialEq, Eq)]
122#[cfg(arm_architecture = "v6")]
123pub enum IfsrStatus {
124 Alignment = 1,
126 DebugEvent = 2,
128 AccessFlagFaultFirstLevel = 3,
130 TranslationFaultFirstLevel = 5,
132 AccessFlagFaultSecondLevel = 6,
134 TranslationFaultSecondLevel = 7,
136 SyncExtAbort = 8,
138 DomainFaultFirstLevel = 9,
140 DomainFaultSecondLevel = 11,
142 SyncExtAbortOnTranslationTableWalkFirstLevel = 12,
144 PermissionFaultFirstLevel = 13,
146 SyncExtAbortOnTranslationTableWalkSecondLevel = 14,
148 PermissionFaultSecondLevel = 15,
150}
151
152#[bitbybit::bitenum(u5, exhaustive = false)]
154#[cfg_attr(feature = "defmt", derive(defmt::Format))]
155#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
156#[derive(Debug, PartialEq, Eq)]
157#[cfg(arm_architecture = "v7-r")]
158pub enum IfsrStatus {
159 Alignment = 1,
161 DebugEvent = 2,
163 SyncExtAbort = 8,
165 PermissionFaultFirstLevel = 13,
167 AsyncExtAbort = 21,
169 SyncParityEccError = 25,
171 AsyncParityEccError = 24,
173}
174
175#[bitbybit::bitenum(u5, exhaustive = false)]
177#[cfg_attr(feature = "defmt", derive(defmt::Format))]
178#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
179#[derive(Debug, PartialEq, Eq)]
180#[cfg(arm_architecture = "v7-a")]
181pub enum IfsrStatus {
182 SyncExtAbortOnTranslationTableWalkFirstLevel = 0b01100,
184 SyncExtAbortOnTranslationTableWalkSecondLevel = 0b01110,
186 SyncParErrorOnTranslationTableWalkFirstLevel = 0b11100,
188 SyncParErrorOnTranslationTableWalkSecondLevel = 0b11110,
190 TranslationFaultFirstLevel = 0b00101,
192 TranslationFaultSecondLevel = 0b00111,
194 AccessFlagFaultFirstLevel = 0b00011,
196 AccessFlagFaultSecondLevel = 0b00110,
198 DomainFaultFirstLevel = 0b01001,
200 DomainFaultSecondLevel = 0b01011,
202 PermissionFaultFirstLevel = 0b01101,
204 PermissionFaultSecondLevel = 0b01111,
206 DebugEvent = 0b00010,
208 SyncExtAbort = 0b01000,
210 TlbConflictAbort = 0b10000,
212 Lockdown = 0b10100,
214 CoprocessorAbort = 0b11010,
216 SyncParErrorOnMemAccess = 0b11001,
218}
219
220#[bitbybit::bitenum(u6, exhaustive = false)]
222#[cfg_attr(feature = "defmt", derive(defmt::Format))]
223#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
224#[derive(Debug, PartialEq, Eq)]
225#[cfg(arm_architecture = "v8-r")]
226pub enum IfsrStatus {
227 Translation = 4,
229 Permission = 12,
231 SyncExtAbort = 16,
233 SyncParityEccError = 24,
235 PcAlignment = 33,
237 Debug = 34,
239}
240
241impl SysReg for Ifsr {
242 const CP: u32 = 15;
243 const CRN: u32 = 5;
244 const OP1: u32 = 0;
245 const CRM: u32 = 0;
246 const OP2: u32 = 1;
247}
248
249impl crate::register::SysRegRead for Ifsr {}
250
251impl Ifsr {
252 #[inline]
253 pub fn read() -> Ifsr {
255 Self::new_with_raw_value(<Self as SysRegRead>::read_raw())
256 }
257}
258
259impl crate::register::SysRegWrite for Ifsr {}
260
261impl Ifsr {
262 #[inline]
263 pub unsafe fn write(value: Self) {
269 unsafe {
270 <Self as SysRegWrite>::write_raw(value.raw_value());
271 }
272 }
273}