1use bitrs::layout;
6use regio::arm64::{SysReg, spec};
7
8pub const DEBUG_BANK_SIZE: usize = 16;
12
13layout!({
14 pub struct BreakpointControlRegister(u64);
16 {
17 let __ @ 63..24;
18 let bt @ 23..20; let lbn @ 19..16; let ssc @ 15..14; let hmc @ 13; let __ @ 12..9;
23 let bas @ 8..5; let __ @ 4..3;
25 let pmc @ 2..1; let e @ 0; }
28});
29
30layout!({
31 pub struct WatchpointControlRegister(u64);
33 {
34 let __ @ 63..29;
35 let mask @ 28..24; let __ @ 23..21;
37 let wt @ 20; let lbn @ 19..16; let ssc @ 15..14; let hmc @ 13; let bas @ 12..5; let lsc @ 4..3; let pac @ 2..1; let e @ 0; }
46});
47
48macro_rules! sysreg_bank {
52 (
53 $doc:literal, $layout:ty, $read:ident, $write:ident;
54 $($n:literal => $name:ident),* $(,)?
55 ) => {
56 $(
57 #[doc = $doc]
58 pub const $name: SysReg<spec::$name, $layout> = SysReg::new();
59 )*
60
61 #[cfg(target_arch = "aarch64")]
65 #[inline]
66 pub fn $read(n: usize) -> $layout {
67 match n {
68 $($n => $name.read(),)*
69 _ => panic!("debug register index {n} out of range"),
70 }
71 }
72
73 #[cfg(target_arch = "aarch64")]
77 #[inline]
78 pub fn $write(n: usize, value: $layout) {
79 match n {
80 $($n => $name.write(value),)*
81 _ => panic!("debug register index {n} out of range"),
82 }
83 }
84 };
85}
86
87sysreg_bank!(
88 "[arm/sysreg]/dbgbcrn_el1: DBGBCR<n>_EL1, Debug Breakpoint Control Registers",
89 BreakpointControlRegister, read_dbgbcr, write_dbgbcr;
90 0 => DBGBCR0_EL1, 1 => DBGBCR1_EL1, 2 => DBGBCR2_EL1, 3 => DBGBCR3_EL1,
91 4 => DBGBCR4_EL1, 5 => DBGBCR5_EL1, 6 => DBGBCR6_EL1, 7 => DBGBCR7_EL1,
92 8 => DBGBCR8_EL1, 9 => DBGBCR9_EL1, 10 => DBGBCR10_EL1, 11 => DBGBCR11_EL1,
93 12 => DBGBCR12_EL1, 13 => DBGBCR13_EL1, 14 => DBGBCR14_EL1, 15 => DBGBCR15_EL1,
94);
95
96sysreg_bank!(
97 "[arm/sysreg]/dbgbvrn_el1: DBGBVR<n>_EL1, Debug Breakpoint Value Registers",
98 u64, read_dbgbvr, write_dbgbvr;
99 0 => DBGBVR0_EL1, 1 => DBGBVR1_EL1, 2 => DBGBVR2_EL1, 3 => DBGBVR3_EL1,
100 4 => DBGBVR4_EL1, 5 => DBGBVR5_EL1, 6 => DBGBVR6_EL1, 7 => DBGBVR7_EL1,
101 8 => DBGBVR8_EL1, 9 => DBGBVR9_EL1, 10 => DBGBVR10_EL1, 11 => DBGBVR11_EL1,
102 12 => DBGBVR12_EL1, 13 => DBGBVR13_EL1, 14 => DBGBVR14_EL1, 15 => DBGBVR15_EL1,
103);
104
105sysreg_bank!(
106 "[arm/sysreg]/dbgwcrn_el1: DBGWCR<n>_EL1, Debug Watchpoint Control Registers",
107 WatchpointControlRegister, read_dbgwcr, write_dbgwcr;
108 0 => DBGWCR0_EL1, 1 => DBGWCR1_EL1, 2 => DBGWCR2_EL1, 3 => DBGWCR3_EL1,
109 4 => DBGWCR4_EL1, 5 => DBGWCR5_EL1, 6 => DBGWCR6_EL1, 7 => DBGWCR7_EL1,
110 8 => DBGWCR8_EL1, 9 => DBGWCR9_EL1, 10 => DBGWCR10_EL1, 11 => DBGWCR11_EL1,
111 12 => DBGWCR12_EL1, 13 => DBGWCR13_EL1, 14 => DBGWCR14_EL1, 15 => DBGWCR15_EL1,
112);
113
114sysreg_bank!(
115 "[arm/sysreg]/dbgwvrn_el1: DBGWVR<n>_EL1, Debug Watchpoint Value Registers",
116 u64, read_dbgwvr, write_dbgwvr;
117 0 => DBGWVR0_EL1, 1 => DBGWVR1_EL1, 2 => DBGWVR2_EL1, 3 => DBGWVR3_EL1,
118 4 => DBGWVR4_EL1, 5 => DBGWVR5_EL1, 6 => DBGWVR6_EL1, 7 => DBGWVR7_EL1,
119 8 => DBGWVR8_EL1, 9 => DBGWVR9_EL1, 10 => DBGWVR10_EL1, 11 => DBGWVR11_EL1,
120 12 => DBGWVR12_EL1, 13 => DBGWVR13_EL1, 14 => DBGWVR14_EL1, 15 => DBGWVR15_EL1,
121);
122
123pub const MDSCR_EL1: SysReg<spec::MDSCR_EL1, MonitorDebugSystemControlRegister> = SysReg::new();
125
126layout!({
127 pub struct MonitorDebugSystemControlRegister(u64);
129 {
130 let __ @ 63..36;
131 let ehbwe @ 35;
132 let enspm @ 34;
133 let tta @ 33;
134 let embwe @ 32;
135 let tfo @ 31; let rxfull @ 30; let txfull @ 29; let __ @ 28;
139 let rxo @ 27; let txu @ 26; let __ @ 25..24;
142 let intdis @ 23..22; let tda @ 21; let __ @ 20;
145 let sc2 @ 19;
146 let __ @ 18..16;
147 let mde @ 15; let hde @ 14; let kde @ 13; let tdcc @ 12; let __ @ 11..7;
152 let err @ 6; let __ @ 5..1;
154 let ss @ 0; }
156});