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