1use bitrs::{bitfield_repr, layout, multilayout};
6use regio::arm64::{SysReg, spec};
7
8use super::PhysicalAddressSize;
9
10pub const CURRENT_EL: SysReg<spec::CurrentEL, CurrentEl> = SysReg::new();
12
13layout!({
14 pub struct CurrentEl(u64);
16 {
17 let __ @ 63..4;
18 let el @ 3..2;
19 let __ @ 1..0;
20 }
21});
22
23pub const MIDR_EL1: SysReg<spec::MIDR_EL1, MainIdRegister> = SysReg::new();
25
26layout!({
27 pub struct MainIdRegister(u64);
29 {
30 let __ @ 63..32;
31 let implementer @ 31..24; let variant @ 23..20; let architecture @ 19..16; let part_num @ 15..4; let revision @ 3..0; }
37});
38
39pub const MPIDR_EL1: SysReg<spec::MPIDR_EL1, MultiprocessorAffinityRegister> = SysReg::new();
41
42layout!({
43 pub struct MultiprocessorAffinityRegister(u64);
45 {
46 let __ @ 63..40;
47 let aff3 @ 39..32; let __ @ 31 = 1;
49 let u @ 30; let __ @ 29..25;
51 let mt @ 24; let aff2 @ 23..16; let aff1 @ 15..8; let aff0 @ 7..0; }
56});
57
58impl MultiprocessorAffinityRegister {
59 const AFFINITY_MASK: u64 = MultiprocessorAffinityRegister::AFF3_MASK
60 | MultiprocessorAffinityRegister::AFF2_MASK
61 | MultiprocessorAffinityRegister::AFF1_MASK
62 | MultiprocessorAffinityRegister::AFF0_MASK;
63
64 pub fn affinity(&self) -> u64 {
66 self.bits() & Self::AFFINITY_MASK
67 }
68}
69
70pub const SCTLR_EL1: SysReg<spec::SCTLR_EL1, SystemControlRegisterEl1> = SysReg::new();
72
73pub const SCTLR_EL2: SysReg<spec::SCTLR_EL2, SystemControlRegisterEl2> = SysReg::new();
75
76pub const SCTLR_EL3: SysReg<spec::SCTLR_EL3, SystemControlRegisterEl3> = SysReg::new();
78
79#[bitfield_repr(u8)]
80#[derive(Clone, Copy)]
81pub enum TagCheckFault {
82 None = 0b00, Synchronous = 0b01, Asynchronous = 0b10, SynchronousRead = 0b11, }
87
88multilayout!({
89 #[bitrs(el1)]
91 pub struct SystemControlRegisterEl1(u64);
92
93 #[bitrs(el2)]
95 pub struct SystemControlRegisterEl2(u64);
96
97 #[bitrs(el3)]
99 pub struct SystemControlRegisterEl3(u64);
100
101 {
103 let spintmask @ 62;
104 let nmi @ 61;
105 let tsco @ 59;
106 let tme @ 53;
107 let tmt @ 51;
108 let dsbss @ 44;
109 let ata @ 43;
110 let tcf @ 41..40: TagCheckFault;
111 let itfsb @ 37;
112 let bt @ 36;
113 let __ @ 34;
114 let enia @ 31;
115 let enib @ 30;
116 let enda @ 27;
117 let ee @ 25;
118 let eis @ 22;
119 let iesb @ 21;
120 let wxn @ 19;
121 let __ @ 17;
122 let dze @ 14;
123 let endb @ 13;
124 let i @ 12;
125 let eos @ 11;
126 let naa @ 6;
127 let sa @ 3;
128 let c @ 2;
129 let a @ 1;
130 let m @ 0;
131 }
132
133 #[any(el1, el2)]
135 {
136 let tidcp @ 63;
137 let entp2 @ 60;
138 let tsco0 @ 58;
139 let epan @ 57;
140 let enals @ 56;
141 let enas0 @ 55;
142 let enasr @ 54;
143 let tme0 @ 52;
144 let tmt0 @ 50;
145 let mscen @ 33;
146 let cmow @ 32;
147 }
148
149 #[el1]
151 {
152 let twedel @ 49..46;
153 let tweden @ 45;
154 let ata0 @ 42;
155 let tcf0 @ 39..38: TagCheckFault;
156 let bt0 @ 35;
157 let lsmaoe @ 29;
158 let ntlsmd @ 28;
159 let uci @ 26;
160 let e0e @ 24;
161 let span @ 23;
162 let tscxt @ 20;
163 let ntwe @ 18;
164 let ntwi @ 16;
165 let uct @ 15;
166 let enrctx @ 10;
167 let uma @ 9;
168 let sed @ 8;
169 let itd @ 7;
170 let cp15ben @ 5;
171 let sa0 @ 4;
172 }
173});
174
175impl SystemControlRegisterEl1 {
176 pub fn twedel_cycles(&self) -> Option<u64> {
178 if self.tweden() { Some(1u64 << self.twedel() << 8) } else { None }
179 }
180}
181
182pub const SCTLR2_EL1: SysReg<spec::SCTLR2_EL1, SystemControlRegister2El1> = SysReg::new();
184
185pub const SCTLR2_EL2: SysReg<spec::SCTLR2_EL2, SystemControlRegister2El2> = SysReg::new();
187
188pub const SCTLR2_EL3: SysReg<spec::SCTLR2_EL3, SystemControlRegister2El3> = SysReg::new();
190
191multilayout!({
192 #[bitrs(el1)]
194 pub struct SystemControlRegister2El1(u64);
195
196 #[bitrs(el2)]
198 pub struct SystemControlRegister2El2(u64);
199
200 #[bitrs(el3)]
202 pub struct SystemControlRegister2El3(u64);
203
204 {
206 let __ @ 63..7;
207 let enanerr @ 4;
208 let enaderr @ 3;
209 let __ @ 0;
210 }
211
212 #[any(el1, el2)]
214 {
215 let enidcp128 @ 6;
216 let ease @ 5;
217 let nmea @ 2;
218 }
219
220 #[any(el2, el3)]
222 {
223 let emec @ 1;
224 }
225});
226
227pub const SCR_EL3: SysReg<spec::SCR_EL3, SecureConfigurationRegister> = SysReg::new();
229
230layout!({
231 pub struct SecureConfigurationRegister(u64);
233 {
234 let __ @ 63..39;
235 let hxen @ 38;
236 let aden @ 37;
237 let enas0 @ 36;
238 let amvoffen @ 35;
239 let __ @ 34;
240 let twedel @ 33..30;
241 let tweden @ 29;
242 let ecven @ 28;
243 let fgten @ 27;
244 let ata @ 26;
245 let enscxt @ 25;
246 let __ @ 24..22;
247 let fien @ 21;
248 let nmea @ 20;
249 let ease @ 19;
250 let eel2 @ 18;
251 let api @ 17;
252 let apk @ 16;
253 let terr @ 15;
254 let tlor @ 14;
255 let twe @ 13;
256 let twi @ 12;
257 let st @ 11;
258 let rw @ 10;
259 let sif @ 9;
260 let hce @ 8;
261 let smd @ 7;
262 let __ @ 6;
263 let __ @ 5..4 = 0b11;
264 let ea @ 3;
265 let fiq @ 2;
266 let irq @ 1;
267 let ns @ 0;
268 }
269});
270
271#[bitfield_repr(u8)]
277#[derive(Clone, Copy)]
278pub enum ShareabilityAttribute {
279 None = 0b00,
280 Outer = 0b10,
282 Inner = 0b11,
283}
284
285#[bitfield_repr(u8)]
291#[derive(Clone, Copy)]
292pub enum CacheabilityAttribute {
293 NonCacheable = 0b00,
294 WriteBackReadWriteAllocate = 0b01,
295 WriteThroughReadAllocate = 0b10,
296 WriteBackReadAllocate = 0b11,
297}
298
299#[bitfield_repr(u8)]
305#[derive(Clone, Copy)]
306pub enum TcrTg0Value {
307 Tg4KiB = 0b00,
308 Tg16KiB = 0b10,
309 Tg64KiB = 0b01,
310}
311
312#[bitfield_repr(u8)]
318#[derive(Clone, Copy)]
319pub enum TcrTg1Value {
320 Tg16KiB = 0b01,
321 Tg4KiB = 0b10,
322 Tg64KiB = 0b11,
323}
324
325pub const TCR_EL1: SysReg<spec::TCR_EL1, TranslationControlRegisterEl1> = SysReg::new();
327
328pub const TCR_EL2: SysReg<spec::TCR_EL2, TranslationControlRegisterEl2> = SysReg::new();
330
331multilayout!({
332 #[bitrs(el1)]
334 pub struct TranslationControlRegisterEl1(u64);
335
336 #[bitrs(el2)]
338 pub struct TranslationControlRegisterEl2(u64);
339
340 {
342 let __ @ 63..62;
343 let tg0 @ 15..14: TcrTg0Value;
344 let sh0 @ 13..12: ShareabilityAttribute;
345 let orgn0 @ 11..10: CacheabilityAttribute;
346 let irgn0 @ 9..8: CacheabilityAttribute;
347 let t0sz @ 5..0;
348 }
349
350 #[el1]
351 {
352 let mtx1 @ 61;
353 let mtx0 @ 60;
354 let ds @ 59;
355 let tcma1 @ 58;
356 let tcma0 @ 57;
357 let e0pd1 @ 56;
358 let e0pd0 @ 55;
359 let nfd1 @ 54;
360 let nfd0 @ 53;
361 let tbid1 @ 52;
362 let tbid0 @ 51;
363 let hwu162 @ 50;
364 let hwu161 @ 49;
365 let hwu160 @ 48;
366 let hwu159 @ 47;
367 let hwu062 @ 46;
368 let hwu061 @ 45;
369 let hwu060 @ 44;
370 let hwu059 @ 43;
371 let hpd1 @ 42;
372 let hpd0 @ 41;
373 let hd @ 40;
374 let ha @ 39;
375 let tbi1 @ 38;
376 let tbi0 @ 37;
377 let asid_size @ 36; let __ @ 35;
379 let ips @ 34..32: PhysicalAddressSize;
380 let tg1 @ 31..30: TcrTg1Value;
381 let sh1 @ 29..28: ShareabilityAttribute;
382 let orgn1 @ 27..26: CacheabilityAttribute;
383 let irgn1 @ 25..24: CacheabilityAttribute;
384 let epd1 @ 23;
385 let a1 @ 22;
386 let t1sz @ 21..16;
387 let epd0 @ 7;
388 let __ @ 6;
389 }
390
391 #[el2]
392 {
393 let mtx @ 33;
394 let ds @ 32;
395 let __ @ 31 = 1;
396 let tcma @ 30;
397 let tbid @ 29;
398 let hwu62 @ 28;
399 let hwu61 @ 27;
400 let hwu60 @ 26;
401 let hwu59 @ 25;
402 let hpd @ 24;
403 let __ @ 23 = 1;
404 let hd @ 22;
405 let ha @ 21;
406 let tbi @ 20;
407 let ps @ 18..16: PhysicalAddressSize;
408 let __ @ 7..6;
409 }
410});
411
412pub const VTCR_EL2: SysReg<spec::VTCR_EL2, VirtualizationTranslationControlRegister> =
414 SysReg::new();
415
416layout!({
417 pub struct VirtualizationTranslationControlRegister(u64);
419 {
420 let __ @ 63..46;
421 let hdbss @ 45;
422 let haft @ 44;
423 let __ @ 43..42;
424 let tl0 @ 41;
425 let gcsh @ 40;
426 let __ @ 39;
427 let d128 @ 38;
428 let s2poe @ 37;
429 let s2pie @ 36;
430 let tl1 @ 35;
431 let assured_only @ 34;
432 let sl2 @ 33;
433 let ds @ 32;
434 let __ @ 31 = 1;
435 let nsa @ 30;
436 let nsw @ 29;
437 let hwu62 @ 28;
438 let hwu61 @ 27;
439 let hwu60 @ 26;
440 let hwu59 @ 25;
441 let __ @ 24;
442 let __ @ 23 = 1;
443 let hd @ 22;
444 let ha @ 21;
445 let __ @ 20;
446 let vs @ 19;
447 let ps @ 18..16: PhysicalAddressSize;
448 let tg0 @ 15..14: TcrTg0Value;
449 let sh0 @ 13..12: ShareabilityAttribute;
450 let orgn0 @ 11..10: CacheabilityAttribute;
451 let irgn0 @ 9..8: CacheabilityAttribute;
452 let sl0 @ 7..6;
453 let t0sz @ 5..0;
454 }
455});
456
457pub const TCR2_EL1: SysReg<spec::TCR2_EL1, ExtendedTranslationControlRegister> = SysReg::new();
459
460layout!({
461 pub struct ExtendedTranslationControlRegister(u64);
463 {
464 let __ @ 63..22;
465 let fngna1 @ 21; let fngna0 @ 20; let __ @ 19;
468 let fng1 @ 18; let fng0 @ 17; let a2 @ 16; let disch1 @ 15; let disch0 @ 14; let __ @ 13..12;
474 let haft @ 11; let pttwi @ 10; let __ @ 9..6;
477 let d128 @ 5; let aie @ 4; let poe @ 3; let e0poe @ 2; let pie @ 1; let pnch @ 0; }
484});
485
486pub const TTBR0_EL1: SysReg<spec::TTBR0_EL1, TranslationTableBaseRegister> = SysReg::new();
488
489pub const TTBR0_EL2: SysReg<spec::TTBR0_EL2, TranslationTableBaseRegister> = SysReg::new();
491
492pub const TTBR0_EL3: SysReg<spec::TTBR0_EL3, TranslationTableBaseRegister> = SysReg::new();
494
495pub const TTBR1_EL1: SysReg<spec::TTBR1_EL1, TranslationTableBaseRegister> = SysReg::new();
497
498pub const TTBR1_EL2: SysReg<spec::TTBR1_EL2, TranslationTableBaseRegister> = SysReg::new();
500
501pub const VTTBR_EL2: SysReg<spec::VTTBR_EL2, TranslationTableBaseRegister> = SysReg::new();
503
504layout!({
505 pub struct TranslationTableBaseRegister(u64);
508 {
509 let asid @ 63..48;
510 #[unshifted]
511 let addr @ 47..1; let cnp @ 0; }
514});
515
516impl TranslationTableBaseRegister {
517 pub fn vmid(&self) -> u16 {
521 self.asid()
522 }
523
524 pub fn set_vmid(&mut self, vmid: u16) -> &mut Self {
526 self.set_asid(vmid)
527 }
528}
529
530pub const DAIF: SysReg<spec::DAIF, Daif> = SysReg::new();
532
533layout!({
534 pub struct Daif(u64);
536 {
537 let __ @ 63..10;
538 let d @ 9;
539 let a @ 8;
540 let i @ 7;
541 let f @ 6;
542 let __ @ 5..0;
543 }
544});
545
546pub const VBAR_EL1: SysReg<spec::VBAR_EL1, VectorBaseAddressRegister> = SysReg::new();
548
549pub const VBAR_EL2: SysReg<spec::VBAR_EL2, VectorBaseAddressRegister> = SysReg::new();
551
552pub const VBAR_EL3: SysReg<spec::VBAR_EL3, VectorBaseAddressRegister> = SysReg::new();
554
555layout!({
556 pub struct VectorBaseAddressRegister(u64);
558 {
559 #[unshifted]
560 let addr @ 63..11;
561 let __ @ 10..0;
562 }
563});
564
565pub const ELR_EL1: SysReg<spec::ELR_EL1, ExceptionLinkRegister> = SysReg::new();
567
568pub const ELR_EL2: SysReg<spec::ELR_EL2, ExceptionLinkRegister> = SysReg::new();
570
571pub const ELR_EL3: SysReg<spec::ELR_EL3, ExceptionLinkRegister> = SysReg::new();
573
574layout!({
575 pub struct ExceptionLinkRegister(u64);
577 {
578 let pc @ 63..0;
579 }
580});
581
582pub const SP_EL0: SysReg<spec::SP_EL0, StackPointerRegister> = SysReg::new();
584
585pub const SP_EL1: SysReg<spec::SP_EL1, StackPointerRegister> = SysReg::new();
587
588pub const SP_EL2: SysReg<spec::SP_EL2, StackPointerRegister> = SysReg::new();
590
591layout!({
592 pub struct StackPointerRegister(u64);
594 {
595 let sp @ 63..0;
596 }
597});
598
599pub const SPSR_EL1: SysReg<spec::SPSR_EL1, SavedProgramStatusRegister> = SysReg::new();
601
602pub const SPSR_EL2: SysReg<spec::SPSR_EL2, SavedProgramStatusRegister> = SysReg::new();
604
605pub const SPSR_EL3: SysReg<spec::SPSR_EL3, SavedProgramStatusRegister> = SysReg::new();
607
608#[bitfield_repr(u8)]
609#[derive(Clone, Copy)]
610pub enum SpsrExceptionLevel {
611 El0t = 0b0000, El1t = 0b0100, El1h = 0b0101, El2t = 0b1000, El2h = 0b1001, El3t = 0b1100, El3h = 0b1101, }
619
620layout!({
621 pub struct SavedProgramStatusRegister(u64);
625 {
626 let __ @ 63..32;
627 let n @ 31;
628 let z @ 30;
629 let c @ 29;
630 let v @ 28;
631 let __ @ 27..26;
632 let tco @ 25;
633 let dit @ 24;
634 let uao @ 23;
635 let pan @ 22;
636 let ss @ 21;
637 let il @ 20;
638 let __ @ 19..13;
639 let ssbs @ 12;
640 let btype @ 11..10;
641 let d @ 9;
642 let a @ 8;
643 let i @ 7;
644 let f @ 6;
645 let __ @ 5;
646 let a32 @ 4; let m @ 3..0: SpsrExceptionLevel;
648 }
649});
650
651impl SavedProgramStatusRegister {
652 pub fn el(self) -> CurrentEl {
654 CurrentEl::from((self.m() as u64) & CurrentEl::EL_MASK)
655 }
656
657 pub fn spsel(self) -> bool {
659 (self.m() as u8) & 1 != 0
660 }
661}
662
663pub const NZCV: SysReg<spec::NZCV, Nzcv> = SysReg::new();
665
666layout!({
667 pub struct Nzcv(u64);
671 {
672 let __ @ 63..32;
673 let n @ 31;
674 let z @ 30;
675 let c @ 29;
676 let v @ 28;
677 let __ @ 27..0;
678 }
679});
680
681pub const ESR_EL1: SysReg<spec::ESR_EL1, ExceptionSyndromeRegister> = SysReg::new();
683
684pub const ESR_EL2: SysReg<spec::ESR_EL2, ExceptionSyndromeRegister> = SysReg::new();
686
687pub const ESR_EL3: SysReg<spec::ESR_EL3, ExceptionSyndromeRegister> = SysReg::new();
689
690#[bitfield_repr(u8)]
692#[derive(Clone, Copy)]
693pub enum ExceptionClass {
694 Unknown = 0b000000,
695 Wf = 0b000001, Mcr = 0b000011, Mcrr = 0b000100, McrCoproc = 0b000101, Ldc = 0b000110, Fp = 0b000111, Ld64b = 0b001010, McrrCoproc = 0b001100, Bti = 0b001101, IllegalExecution = 0b001110,
705 Svc32 = 0b010001,
706 Hvc32 = 0b010010, Smc32 = 0b010011, TrappedSysreg128 = 0b010100,
709 Svc64 = 0b010101,
710 Hvc64 = 0b010110, Smc64 = 0b010111, Msr = 0b011000, Sve = 0b011001,
714 Eret = 0b011010, Tstart = 0b011011,
716 Pac = 0b011100,
717 Sme = 0b011101,
718 ImplementationDefined = 0b011111, InstructionAbortLowerEl = 0b100000,
720 InstructionAbortSameEl = 0b100001,
721 PcAlignment = 0b100010,
722 DataAbortLowerEl = 0b100100,
723 DataAbortSameEl = 0b100101,
724 SpAlignment = 0b100110,
725 Mops = 0b100111,
726 Fpe32 = 0b101000,
727 Fpe64 = 0b101100,
728 Gcs = 0b101101,
729 Serror = 0b101111,
730 BreakpointLowerEl = 0b110000,
731 BreakpointSameEl = 0b110001,
732 StepLowerEl = 0b110010,
733 StepSameEl = 0b110011,
734 WatchpointLowerEl = 0b110100,
735 WatchpointSameEl = 0b110101,
736 Bkpt = 0b111000, VectorCatch = 0b111010, Brk = 0b111100, Profiling = 0b111101,
740}
741
742layout!({
743 pub struct ExceptionSyndromeRegister(u64);
747 {
748 let __ @ 63..56;
749 let iss2 @ 55..32;
750 let ec @ 31..26: ExceptionClass;
751 let il @ 25;
752 let iss @ 24..0;
753 }
754});
755
756pub const CPTR_EL2_NO_VHE: SysReg<spec::CPTR_EL2, ArchitecturalFeatureTrapRegisterNoVhe> =
758 SysReg::new();
759
760pub const CPTR_EL2_VHE: SysReg<spec::CPTR_EL2, ArchitecturalFeatureTrapRegisterVhe> = SysReg::new();
762
763pub const CPTR_EL3_NO_VHE: SysReg<spec::CPTR_EL3, ArchitecturalFeatureTrapRegisterNoVhe> =
765 SysReg::new();
766
767pub const CPTR_EL3_VHE: SysReg<spec::CPTR_EL3, ArchitecturalFeatureTrapRegisterVhe> = SysReg::new();
769
770multilayout!({
771 #[bitrs(no_e2h)]
773 pub struct ArchitecturalFeatureTrapRegisterNoVhe(u64);
774
775 #[bitrs(e2h)]
777 pub struct ArchitecturalFeatureTrapRegisterVhe(u64);
778
779 {
780 let __ @ 63..32;
781 let tcpac @ 31;
782 let tam @ 30;
783 let __ @ 29;
784 let __ @ 27..26;
785 let __ @ 23..22;
786 let __ @ 19..18;
787 }
788
789 #[e2h]
790 {
791 let tta @ 28;
792 let smen @ 25..24;
793 let fpen @ 21..20;
794 let zen @ 17..16;
795 let __ @ 15..0;
796 }
797
798 #[no_e2h]
799 {
800 let __ @ 28;
801 let __ @ 25..24;
802 let __ @ 21;
803 let tta @ 20;
804 let __ @ 17..14;
805 let __ @ 13 = 1;
806 let tsm @ 12;
807 let __ @ 11;
808 let tfp @ 10;
809 let __ @ 9 = 1;
810 let tz @ 8;
811 let __ @ 7..0;
812 }
813});
814
815pub const HCR_EL2: SysReg<spec::HCR_EL2, HypervisorConfigurationRegister> = SysReg::new();
817
818layout!({
819 pub struct HypervisorConfigurationRegister(u64);
821 {
822 let twedel @ 63..60;
823 let tweden @ 59;
824 let tid5 @ 58;
825 let dct @ 57;
826 let ata @ 56;
827 let ttlbos @ 55;
828 let ttlbis @ 54;
829 let enscxt @ 53;
830 let tocu @ 52;
831 let amvoffen @ 51;
832 let ticab @ 50;
833 let tid4 @ 49;
834 let gpf @ 48;
835 let fien @ 47;
836 let fwb @ 46;
837 let nv2 @ 45;
838 let at @ 44;
839 let nv1 @ 43;
840 let nv @ 42;
841 let api @ 41;
842 let apk @ 40;
843 let tme @ 39;
844 let miocnce @ 38;
845 let tea @ 37;
846 let terr @ 36;
847 let tlor @ 35;
848 let e2h @ 34;
849 let id @ 33;
850 let cd @ 32;
851 let rw @ 31;
852 let trvm @ 30;
853 let hcd @ 29;
854 let tdz @ 28;
855 let tge @ 27;
856 let tvm @ 26;
857 let ttlb @ 25;
858 let tpu @ 24;
859 let tcpc @ 23;
860 let tsw @ 22;
861 let tacr @ 21;
862 let tidcp @ 20;
863 let tsc @ 19;
864 let tid3 @ 18;
865 let tid2 @ 17;
866 let tid1 @ 16;
867 let tid0 @ 15;
868 let twe @ 14;
869 let twi @ 13;
870 let dc @ 12;
871 let bsu @ 11..10;
872 let fb @ 9;
873 let vse @ 8;
874 let vi @ 7;
875 let vf @ 6;
876 let amo @ 5;
877 let imo @ 4;
878 let fmo @ 3;
879 let ptw @ 2;
880 let swio @ 1;
881 let vm @ 0;
882 }
883});
884
885pub const HCRX_EL2: SysReg<spec::HCRX_EL2, ExtendedHypervisorConfigurationRegister> = SysReg::new();
887
888layout!({
889 pub struct ExtendedHypervisorConfigurationRegister(u64);
891 {
892 let __ @ 63..27; let srmasken @ 26; let __ @ 25;
895 let pacmen @ 24; let enfpm @ 23; let gcsen @ 22; let enidcp128 @ 21; let ensderr @ 20; let tmea @ 19; let ensnerr @ 18; let d128en @ 17; let pttwi @ 16; let sctlr2en @ 15; let tcr2en @ 14; let __ @ 13..12;
907 let mscen @ 11; let mce2 @ 10; let cmow @ 9; let vfnmi @ 8; let vinmi @ 7; let tallint @ 6; let smpme @ 5; let fgtnxs @ 4; let fnxs @ 3; let enasr @ 2; let enals @ 1; let enas0 @ 0; }
920});
921
922pub const CNTHCTL_EL2_NO_VHE: SysReg<
924 spec::CNTHCTL_EL2,
925 CounterTimerHypervisorControlRegisterNoVhe,
926> = SysReg::new();
927
928pub const CNTHCTL_EL2_VHE: SysReg<spec::CNTHCTL_EL2, CounterTimerHypervisorControlRegisterVhe> =
930 SysReg::new();
931
932multilayout!({
933 #[bitrs(no_e2h)]
935 pub struct CounterTimerHypervisorControlRegisterNoVhe(u64);
936
937 #[bitrs(e2h)]
939 pub struct CounterTimerHypervisorControlRegisterVhe(u64);
940
941 {
942 let __ @ 63..20;
943 let cntpmask @ 19;
944 let cntvmask @ 18;
945 let evntis @ 17;
946 let el1nvvct @ 16;
947 let el1nvpct @ 15;
948 let el1tvct @ 14;
949 let el1tvt @ 13;
950 let ecv @ 12;
951 let evnti @ 7..4;
952 let evntdir @ 3;
953 let evnten @ 2;
954 }
955
956 #[e2h]
957 {
958 let el1pten @ 11;
959 let el1pcten @ 10;
960 let el0pten @ 9;
961 let el0vten @ 8;
962 let el0vcten @ 1;
963 let el0pcten @ 0;
964 }
965
966 #[no_e2h]
967 {
968 let __ @ 11..8;
969 let el1pcen @ 1;
970 let el1pcten @ 0;
971 }
972});
973
974pub const ICC_SRE_EL1: SysReg<spec::ICC_SRE_EL1, InterruptControllerSystemRegisterEnableRegister> =
976 SysReg::new();
977
978pub const ICC_SRE_EL2: SysReg<spec::ICC_SRE_EL2, InterruptControllerSystemRegisterEnableRegister> =
980 SysReg::new();
981
982pub const ICC_SRE_EL3: SysReg<spec::ICC_SRE_EL3, InterruptControllerSystemRegisterEnableRegister> =
984 SysReg::new();
985
986layout!({
987 pub struct InterruptControllerSystemRegisterEnableRegister(u64);
989 {
990 let __ @ 63..4;
991 let enable @ 3;
992 let dib @ 2;
993 let dfb @ 1;
994 let sre @ 0;
995 }
996});
997
998#[cfg(test)]
999mod tests {
1000 use super::*;
1001
1002 #[test]
1003 fn multiprocessor_affinity() {
1004 let mpidr =
1005 *MultiprocessorAffinityRegister::new().set_aff0(1).set_aff1(2).set_aff2(3).set_aff3(4);
1006 assert_eq!(mpidr.affinity(), 0x04_0003_0201);
1007 }
1008}