Skip to main content

libarch/arm64/
feature.rs

1// Copyright 2026 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use bitrs::{bitfield_repr, layout};
6use regio::arm64::{SysReg, spec};
7
8/// [arm/sysreg]/ID_AA64ISAR0_EL1: AArch64 Instruction Set Attribute Register 0
9pub const ID_AA64ISAR0_EL1: SysReg<spec::ID_AA64ISAR0_EL1, InstructionSetAttributeRegister0> =
10    SysReg::new();
11
12#[bitfield_repr(u8)]
13#[derive(Clone, Copy)]
14pub enum IdAa64IsaR0Rndr {
15    None = 0b0000,
16    Rng = 0b0001,
17}
18
19#[bitfield_repr(u8)]
20#[derive(Clone, Copy)]
21pub enum IdAa64IsaR0Tlb {
22    None = 0b0000,
23    Tlbios = 0b0001,
24    Tlbirange = 0b0010,
25}
26
27#[bitfield_repr(u8)]
28#[derive(Clone, Copy)]
29pub enum IdAa64IsaR0Ts {
30    None = 0b0000,
31    FlagM = 0b0001,
32    FlagM2 = 0b0010,
33}
34
35#[bitfield_repr(u8)]
36#[derive(Clone, Copy)]
37pub enum IdAa64IsaR0Fhm {
38    None = 0b0000,
39    Fhm = 0b0001,
40}
41
42#[bitfield_repr(u8)]
43#[derive(Clone, Copy)]
44pub enum IdAa64IsaR0DotProd {
45    None = 0b0000,
46    DotProd = 0b0001,
47}
48
49#[bitfield_repr(u8)]
50#[derive(Clone, Copy)]
51pub enum IdAa64IsaR0Sm4 {
52    None = 0b0000,
53    Sm4 = 0b0001,
54}
55
56#[bitfield_repr(u8)]
57#[derive(Clone, Copy)]
58pub enum IdAa64IsaR0Sm3 {
59    None = 0b0000,
60    Sm3 = 0b0001,
61}
62
63#[bitfield_repr(u8)]
64#[derive(Clone, Copy)]
65pub enum IdAa64IsaR0Sha3 {
66    None = 0b0000,
67    Sha3 = 0b0001,
68}
69
70#[bitfield_repr(u8)]
71#[derive(Clone, Copy)]
72pub enum IdAa64IsaR0Rdm {
73    None = 0b0000,
74    Rdm = 0b0001,
75}
76
77#[bitfield_repr(u8)]
78#[derive(Clone, Copy)]
79pub enum IdAa64IsaR0Atomic {
80    None = 0b0000,
81    Lse = 0b0010,
82}
83
84#[bitfield_repr(u8)]
85#[derive(Clone, Copy)]
86pub enum IdAa64IsaR0Crc32 {
87    None = 0b0000,
88    Crc32 = 0b0001,
89}
90
91#[bitfield_repr(u8)]
92#[derive(Clone, Copy)]
93pub enum IdAa64IsaR0Sha2 {
94    None = 0b0000,
95    Sha256 = 0b0001,
96    Sha512 = 0b0010,
97}
98
99#[bitfield_repr(u8)]
100#[derive(Clone, Copy)]
101pub enum IdAa64IsaR0Sha1 {
102    None = 0b0000,
103    Sha1 = 0b0001,
104}
105
106#[bitfield_repr(u8)]
107#[derive(Clone, Copy)]
108pub enum IdAa64IsaR0Aes {
109    None = 0b0000,
110    Aes = 0b0001,
111    Pmull = 0b0010,
112}
113
114layout!({
115    /// The layout of [`ID_AA64ISAR0_EL1`].
116    pub struct InstructionSetAttributeRegister0(u64);
117    {
118        let rndr @ 63..60: IdAa64IsaR0Rndr;
119        let tlb @ 59..56: IdAa64IsaR0Tlb;
120        let ts @ 55..52: IdAa64IsaR0Ts;
121        let fhm @ 51..48: IdAa64IsaR0Fhm;
122        let dp @ 47..44: IdAa64IsaR0DotProd;
123        let sm4 @ 43..40: IdAa64IsaR0Sm4;
124        let sm3 @ 39..36: IdAa64IsaR0Sm3;
125        let sha3 @ 35..32: IdAa64IsaR0Sha3;
126        let rdm @ 31..28: IdAa64IsaR0Rdm;
127        let __ @ 27..24;
128        let atomic @ 23..20: IdAa64IsaR0Atomic;
129        let crc32 @ 19..16: IdAa64IsaR0Crc32;
130        let sha2 @ 15..12: IdAa64IsaR0Sha2;
131        let sha1 @ 11..8: IdAa64IsaR0Sha1;
132        let aes @ 7..4: IdAa64IsaR0Aes;
133        let __ @ 3..0;
134    }
135});
136
137/// [arm/sysreg]/ID_AA64ISAR1_EL1: AArch64 Instruction Set Attribute Register 1
138pub const ID_AA64ISAR1_EL1: SysReg<spec::ID_AA64ISAR1_EL1, InstructionSetAttributeRegister1> =
139    SysReg::new();
140
141#[bitfield_repr(u8)]
142#[derive(Clone, Copy)]
143pub enum IdAa64IsaR1Ls64 {
144    None = 0b0000,
145    Ls64 = 0b0001,
146    Ls64V = 0b0010,
147    Ls64Accdata = 0b0011,
148}
149
150#[bitfield_repr(u8)]
151#[derive(Clone, Copy)]
152pub enum IdAa64IsaR1Xs {
153    None = 0b0000,
154    Xs = 0b0001,
155}
156
157#[bitfield_repr(u8)]
158#[derive(Clone, Copy)]
159pub enum IdAa64IsaR1I8mm {
160    None = 0b0000,
161    I8mm = 0b0001,
162}
163
164#[bitfield_repr(u8)]
165#[derive(Clone, Copy)]
166pub enum IdAa64IsaR1Dgh {
167    None = 0b0000,
168    Dgh = 0b0001,
169}
170
171#[bitfield_repr(u8)]
172#[derive(Clone, Copy)]
173pub enum IdAa64IsaR1Bf16 {
174    None = 0b0000,
175    Bf16 = 0b0001,
176}
177
178#[bitfield_repr(u8)]
179#[derive(Clone, Copy)]
180pub enum IdAa64IsaR1Specres {
181    None = 0b0000,
182    Specres = 0b0001,
183}
184
185#[bitfield_repr(u8)]
186#[derive(Clone, Copy)]
187pub enum IdAa64IsaR1Sb {
188    None = 0b0000,
189    Sb = 0b0001,
190}
191
192#[bitfield_repr(u8)]
193#[derive(Clone, Copy)]
194pub enum IdAa64IsaR1Frintts {
195    None = 0b0000,
196    Frintts = 0b0001,
197}
198
199#[bitfield_repr(u8)]
200#[derive(Clone, Copy)]
201pub enum IdAa64IsaR1Gpi {
202    None = 0b0000,
203    Gpi = 0b0001,
204}
205
206#[bitfield_repr(u8)]
207#[derive(Clone, Copy)]
208pub enum IdAa64IsaR1Gpa {
209    None = 0b0000,
210    Gpa = 0b0001,
211}
212
213#[bitfield_repr(u8)]
214#[derive(Clone, Copy)]
215pub enum IdAa64IsaR1Lrcpc {
216    None = 0b0000,
217    Lrcpc = 0b0001,
218    Lrcpc2 = 0b0010,
219}
220
221#[bitfield_repr(u8)]
222#[derive(Clone, Copy)]
223pub enum IdAa64IsaR1Fcma {
224    None = 0b0000,
225    Fcma = 0b0001,
226}
227
228#[bitfield_repr(u8)]
229#[derive(Clone, Copy)]
230pub enum IdAa64IsaR1Jscvt {
231    None = 0b0000,
232    Jscvt = 0b0001,
233}
234
235#[bitfield_repr(u8)]
236#[derive(Clone, Copy)]
237pub enum IdAa64IsaR1Pauth {
238    None = 0b0000,
239    Pauth = 0b0001,
240    PauthEnhanced = 0b0010,
241    Pauth2 = 0b0011,
242    Fpac = 0b0100,
243    FpacCombined = 0b0101,
244}
245
246#[bitfield_repr(u8)]
247#[derive(Clone, Copy)]
248pub enum IdAa64IsaR1Dpb {
249    None = 0b0000,
250    Dpb = 0b0001,
251    Dpb2 = 0b0010,
252}
253
254layout!({
255    /// The layout of [`ID_AA64ISAR1_EL1`].
256    pub struct InstructionSetAttributeRegister1(u64);
257    {
258        let ls64 @ 63..60: IdAa64IsaR1Ls64;
259        let xs @ 59..56: IdAa64IsaR1Xs;
260        let i8mm @ 55..52: IdAa64IsaR1I8mm;
261        let dgh @ 51..48: IdAa64IsaR1Dgh;
262        let bf16 @ 47..44: IdAa64IsaR1Bf16;
263        let specres @ 43..40: IdAa64IsaR1Specres;
264        let sb @ 39..36: IdAa64IsaR1Sb;
265        let frintts @ 35..32: IdAa64IsaR1Frintts;
266        let gpi @ 31..28: IdAa64IsaR1Gpi;
267        let gpa @ 27..24: IdAa64IsaR1Gpa;
268        let lrcpc @ 23..20: IdAa64IsaR1Lrcpc;
269        let fcma @ 19..16: IdAa64IsaR1Fcma;
270        let jscvt @ 15..12: IdAa64IsaR1Jscvt;
271        let api @ 11..8: IdAa64IsaR1Pauth;
272        let apa @ 7..4: IdAa64IsaR1Pauth;
273        let dpb @ 3..0: IdAa64IsaR1Dpb;
274    }
275});
276
277/// [arm/sysreg]/ID_AA64ISAR2_EL1: AArch64 Instruction Set Attribute Register 2
278pub const ID_AA64ISAR2_EL1: SysReg<spec::ID_AA64ISAR2_EL1, InstructionSetAttributeRegister2> =
279    SysReg::new();
280
281#[bitfield_repr(u8)]
282#[derive(Clone, Copy)]
283pub enum IdAa64IsaR2Ats1a {
284    None = 0b0000,
285    Ats1a = 0b0001,
286}
287
288#[bitfield_repr(u8)]
289#[derive(Clone, Copy)]
290pub enum IdAa64IsaR2Lut {
291    None = 0b0000,
292    Lut = 0b0001,
293}
294
295#[bitfield_repr(u8)]
296#[derive(Clone, Copy)]
297pub enum IdAa64IsaR2Cssc {
298    None = 0b0000,
299    Cssc = 0b0001, // FEAT_CSSC
300}
301
302#[bitfield_repr(u8)]
303#[derive(Clone, Copy)]
304pub enum IdAa64IsaR2Rprfm {
305    None = 0b0000,
306    Rprfm = 0b0001, // FEAT_RPRFM
307}
308
309#[bitfield_repr(u8)]
310#[derive(Clone, Copy)]
311pub enum IdAa64IsaR2Prfmslc {
312    None = 0b0000,
313    Prfmslc = 0b0001, // FEAT_PRFMSLC
314}
315
316#[bitfield_repr(u8)]
317#[derive(Clone, Copy)]
318pub enum IdAa64IsaR2Sysinstr128 {
319    None = 0b0000,
320    Sysinstr128 = 0b0001, // FEAT_SYSINSTR128
321}
322
323#[bitfield_repr(u8)]
324#[derive(Clone, Copy)]
325pub enum IdAa64IsaR2Sysreg128 {
326    None = 0b0000,
327    Sysreg128 = 0b0001, // FEAT_SYSREG128
328}
329
330#[bitfield_repr(u8)]
331#[derive(Clone, Copy)]
332pub enum IdAa64IsaR2Clrbhb {
333    None = 0b0000,
334    Clrbhb = 0b0001, // FEAT_CLRBHB
335}
336
337#[bitfield_repr(u8)]
338#[derive(Clone, Copy)]
339pub enum IdAa64IsaR2PacFrac {
340    None = 0b0000,
341    PacFrac = 0b0001, // FEAT_CONSTPACFIELD
342}
343
344#[bitfield_repr(u8)]
345#[derive(Clone, Copy)]
346pub enum IdAa64IsaR2Bc {
347    None = 0b0000,
348    Bc = 0b0001, // FEAT_HBC
349}
350
351#[bitfield_repr(u8)]
352#[derive(Clone, Copy)]
353pub enum IdAa64IsaR2Mops {
354    None = 0b0000,
355    Mops = 0b0001, // FEAT_MOPS
356}
357
358#[bitfield_repr(u8)]
359#[derive(Clone, Copy)]
360pub enum IdAa64IsaR2Apa3 {
361    None = 0b0000,
362    NoEnhanced = 0b0001,   // FEAT_PAuth
363    EnhancedPac = 0b0010,  // FEAT_EPAC
364    EnhancedPac2 = 0b0011, // FEAT_Pauth2
365    Fpac = 0b0100,         // FEAT_FPAC
366    FpacCombined = 0b0101, // FEAT_FPACCCOMBINE
367}
368
369#[bitfield_repr(u8)]
370#[derive(Clone, Copy)]
371pub enum IdAa64IsaR2Gpa3 {
372    None = 0b0000,
373    Gpa3 = 0b0001, // FEAT_PACQARMA3
374}
375
376#[bitfield_repr(u8)]
377#[derive(Clone, Copy)]
378pub enum IdAa64IsaR2Rpres {
379    None = 0b0000,
380    Rpres = 0b0001, // FEAT_RPRES
381}
382
383#[bitfield_repr(u8)]
384#[derive(Clone, Copy)]
385pub enum IdAa64IsaR2Wfxt {
386    None = 0b0000,
387    Wfxt = 0b0001, // FEAT_WFxT
388}
389
390layout!({
391    /// The layout of [`ID_AA64ISAR2_EL1`].
392    pub struct InstructionSetAttributeRegister2(u64);
393    {
394        let ats1a @ 63..60: IdAa64IsaR2Ats1a;
395        let lut @ 59..56: IdAa64IsaR2Lut;
396        let cssc @ 55..52: IdAa64IsaR2Cssc;
397        let rprfm @ 51..48: IdAa64IsaR2Rprfm;
398        let __ @ 47..44;
399        let prfmslc @ 43..40: IdAa64IsaR2Prfmslc;
400        let sysinstr_128 @ 39..36: IdAa64IsaR2Sysinstr128;
401        let sysreg_128 @ 35..32: IdAa64IsaR2Sysreg128;
402        let clrbhb @ 31..28: IdAa64IsaR2Clrbhb;
403        let pac_frac @ 27..24: IdAa64IsaR2PacFrac;
404        let bc @ 23..20: IdAa64IsaR2Bc;
405        let mops @ 19..16: IdAa64IsaR2Mops;
406        let apa3 @ 15..12: IdAa64IsaR2Apa3;
407        let gpa3 @ 11..8: IdAa64IsaR2Gpa3;
408        let rpres @ 7..4: IdAa64IsaR2Rpres;
409        let wfxt @ 3..0: IdAa64IsaR2Wfxt;
410    }
411});
412
413/// [arm/sysreg]/ID_AA64PFR0_EL1: AArch64 Processor Feature Register 0
414pub const ID_AA64PFR0_EL1: SysReg<spec::ID_AA64PFR0_EL1, ProcessorFeatureRegister0> = SysReg::new();
415
416#[bitfield_repr(u8)]
417#[derive(Clone, Copy)]
418pub enum IdAa64Pfr0Csv3 {
419    None = 0b0000,
420    Csv3 = 0b0001,
421}
422
423#[bitfield_repr(u8)]
424#[derive(Clone, Copy)]
425pub enum IdAa64Pfr0Csv2 {
426    None = 0b0000,
427    Csv2 = 0b0001,
428    Csv2_2 = 0b0010,
429}
430
431#[bitfield_repr(u8)]
432#[derive(Clone, Copy)]
433pub enum IdAa64Pfr0Dit {
434    None = 0b0000,
435    Dit = 0b0001,
436}
437
438#[bitfield_repr(u8)]
439#[derive(Clone, Copy)]
440pub enum IdAa64Pfr0Amu {
441    None = 0b0000,
442    Amuv1 = 0b0001,
443    Amuv1p1 = 0b0010,
444}
445
446#[bitfield_repr(u8)]
447#[derive(Clone, Copy)]
448pub enum IdAa64Pfr0Mpam {
449    None = 0b0000,
450    Mpam = 0b0001,
451}
452
453#[bitfield_repr(u8)]
454#[derive(Clone, Copy)]
455pub enum IdAa64Pfr0Sel2 {
456    None = 0b0000,
457    Sel2 = 0b0001,
458}
459
460#[bitfield_repr(u8)]
461#[derive(Clone, Copy)]
462pub enum IdAa64Pfr0Sve {
463    None = 0b0000,
464    Sve = 0b0001,
465}
466
467#[bitfield_repr(u8)]
468#[derive(Clone, Copy)]
469pub enum IdAa64Pfr0Ras {
470    None = 0b0000,
471    Ras = 0b0001,
472    Rasv1p1 = 0b0010,
473}
474
475#[bitfield_repr(u8)]
476#[derive(Clone, Copy)]
477pub enum IdAa64Pfr0Gic {
478    None = 0b0000,
479    Gic4 = 0b0001,
480    Gic4_1 = 0b0010,
481}
482
483#[bitfield_repr(u8)]
484#[derive(Clone, Copy)]
485pub enum IdAa64Pfr0Fp {
486    Fp = 0b0000,
487    Fp16 = 0b0001,
488    None = 0b1111,
489}
490
491#[bitfield_repr(u8)]
492#[derive(Clone, Copy)]
493pub enum IdAa64Pfr0El {
494    None = 0b0000, // EL[23] not implemented.
495    El64 = 0b0001, // ELn supported in AAarch64 state
496    El32 = 0b0010, // ELn supported in AAarch64 or AAarch32 state
497}
498
499layout!({
500    /// The layout of [`ID_AA64PFR0_EL1`].
501    pub struct ProcessorFeatureRegister0(u64);
502    {
503        let csv3 @ 63..60: IdAa64Pfr0Csv3;
504        let csv2 @ 59..56: IdAa64Pfr0Csv2;
505        let __ @ 55..52;
506        let dit @ 51..48: IdAa64Pfr0Dit;
507        let amu @ 47..44: IdAa64Pfr0Amu;
508        let mpam @ 43..40: IdAa64Pfr0Mpam;
509        let sel2 @ 39..36: IdAa64Pfr0Sel2;
510        let sve @ 35..32: IdAa64Pfr0Sve;
511        let ras @ 31..28: IdAa64Pfr0Ras;
512        let gic @ 27..24: IdAa64Pfr0Gic;
513        let advsimd @ 23..20: IdAa64Pfr0Fp;
514        let fp @ 19..16: IdAa64Pfr0Fp;
515        let el3 @ 15..12: IdAa64Pfr0El;
516        let el2 @ 11..8: IdAa64Pfr0El;
517        let el1 @ 7..4: IdAa64Pfr0El;
518        let el0 @ 3..0: IdAa64Pfr0El;
519    }
520});
521
522/// [arm/sysreg]/ID_AA64PFR1_EL1: AArch64 Processor Feature Register 1
523pub const ID_AA64PFR1_EL1: SysReg<spec::ID_AA64PFR1_EL1, ProcessorFeatureRegister1> = SysReg::new();
524
525#[bitfield_repr(u8)]
526#[derive(Clone, Copy)]
527pub enum IdAa64Pfr1El1Pfar {
528    None = 0b0000,
529    Pfar = 0b0001, // FEAT_PFAR
530}
531
532#[bitfield_repr(u8)]
533#[derive(Clone, Copy)]
534pub enum IdAa64Pfr1El1Df2 {
535    None = 0b0000,
536    Df2 = 0b0001, // FEAT_DoubleFault2
537}
538
539#[bitfield_repr(u8)]
540#[derive(Clone, Copy)]
541pub enum IdAa64Pfr1El1Mtex {
542    None = 0b0000,
543    Mtex = 0b0001, // FEAT_MTE_NO_ADDRESS_TAGS, FEAT_MTE_CANONICAL_TAGS
544}
545
546#[bitfield_repr(u8)]
547#[derive(Clone, Copy)]
548pub enum IdAa64Pfr1El1The {
549    None = 0b0000,
550    The = 0b0001, // FEAT_THE
551}
552
553#[bitfield_repr(u8)]
554#[derive(Clone, Copy)]
555pub enum IdAa64Pfr1El1Gcs {
556    None = 0b0000,
557    Gcs = 0b0001, // FEAT_GCS
558}
559
560#[bitfield_repr(u8)]
561#[derive(Clone, Copy)]
562pub enum IdAa64Pfr1El1MteFrac {
563    Async = 0b0000, // FEAT_MTE_ASYNC
564    None = 0b1111,
565}
566
567#[bitfield_repr(u8)]
568#[derive(Clone, Copy)]
569pub enum IdAa64Pfr1El1Nmi {
570    None = 0b0000,
571    Nmi = 0b0001, // FEAT_NMI
572}
573
574#[bitfield_repr(u8)]
575#[derive(Clone, Copy)]
576pub enum IdAa64Pfr1El1Csv2Frac {
577    None = 0b0000,
578    Csv2_1p1 = 0b0001, // FEAT_CSV2_1p1
579    Csv2_1p2 = 0b0010, // FEAT_CSV2_1p2
580}
581
582#[bitfield_repr(u8)]
583#[derive(Clone, Copy)]
584pub enum IdAa64Pfr1El1RndrTrap {
585    None = 0b0000,
586    Trap = 0b0001, // FEAT_RNG_TRAP
587}
588
589#[bitfield_repr(u8)]
590#[derive(Clone, Copy)]
591pub enum IdAa64Pfr1El1Sme {
592    None = 0b0000,
593    Sme = 0b0001,  // FEAT_SME
594    Sme2 = 0b0010, // FEAT_SME2
595}
596
597#[bitfield_repr(u8)]
598#[derive(Clone, Copy)]
599pub enum IdAa64Pfr1El1Mte {
600    None = 0b0000,
601    Mte = 0b0001,  // FEAT_MTE
602    Mte2 = 0b0010, // FEAT_MTE2
603    Mte3 = 0b0011, // FEAT_MTE3
604}
605
606#[bitfield_repr(u8)]
607#[derive(Clone, Copy)]
608pub enum IdAa64Pfr1El1Ssbs {
609    None = 0b0000,
610    Ssbs = 0b0001,  // FEAT_SSBS
611    Ssbs2 = 0b0010, // FEAT_SSBS2
612}
613
614#[bitfield_repr(u8)]
615#[derive(Clone, Copy)]
616pub enum IdAa64Pfr1El1Bt {
617    None = 0b0000,
618    Bt = 0b0001, // FEAT_BTI
619}
620
621layout!({
622    /// The layout of [`ID_AA64PFR1_EL1`].
623    pub struct ProcessorFeatureRegister1(u64);
624    {
625        let pfar @ 63..60: IdAa64Pfr1El1Pfar;
626        let df2 @ 59..56: IdAa64Pfr1El1Df2;
627        let mtex @ 55..52: IdAa64Pfr1El1Mtex;
628        let the @ 51..48: IdAa64Pfr1El1The;
629        let gcs @ 47..44: IdAa64Pfr1El1Gcs;
630        let mte_frac @ 43..40: IdAa64Pfr1El1MteFrac;
631        let nmi @ 39..36: IdAa64Pfr1El1Nmi;
632        let csv2_frac @ 35..32: IdAa64Pfr1El1Csv2Frac;
633        let rndr_trap @ 31..28: IdAa64Pfr1El1RndrTrap;
634        let sme @ 27..24: IdAa64Pfr1El1Sme;
635        let __ @ 23..20;
636        let mpam_frac @ 19..16;
637        let ras_frac @ 15..12;
638        let mte @ 11..8: IdAa64Pfr1El1Mte;
639        let ssbs @ 7..4: IdAa64Pfr1El1Ssbs;
640        let bt @ 3..0: IdAa64Pfr1El1Bt;
641    }
642});
643
644/// [arm/v9]: D24.2.82 ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0
645pub const ID_AA64MMFR0_EL1: SysReg<spec::ID_AA64MMFR0_EL1, MemoryModelFeatureRegister0> =
646    SysReg::new();
647
648/// ASID size.
649#[bitfield_repr(u8)]
650#[derive(Clone, Copy)]
651pub enum AsidSize {
652    Asid8Bits = 0b0000,
653    Asid16Bits = 0b0010,
654}
655
656/// Physical address size.
657///
658/// The same encoding is used by several registers, including system registers TCR_EL1.IPS,
659/// TCR_EL2.PS, and the feature register ID_AA64MMFR0_EL1.PARange.
660///
661/// [arm/v9]: D24.2.82 ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0
662/// [arm/v9]: D24.2.182 Translation Control Register (EL1)
663/// [arm/v9]: D24.2.183 Translation Control Register (EL2)
664#[bitfield_repr(u8)]
665#[derive(Clone, Copy)]
666pub enum PhysicalAddressSize {
667    Pa32Bits = 0b0000,
668    Pa36Bits = 0b0001,
669    Pa40Bits = 0b0010,
670    Pa42Bits = 0b0011,
671    Pa44Bits = 0b0100,
672    Pa48Bits = 0b0101,
673    Pa52Bits = 0b0110,
674    Pa56Bits = 0b0111, // FEAT_D128
675}
676
677layout!({
678    /// The layout of [`ID_AA64MMFR0_EL1`].
679    pub struct MemoryModelFeatureRegister0(u64);
680    {
681        let ecv @ 63..60; // Enhanced Counter Virtualization (FEAT_ECV)
682        let fgt @ 59..56; // Fine-Grained Trap controls (FEAT_FGT)
683        let __ @ 55..48;
684        let exs @ 47..44; // Disable context synchronizing exceptions (FEAT_ExS)
685        let tgran4_2 @ 43..40; // 4 kiB granules at stage 2
686        let tgran64_2 @ 39..36; // 64 kiB granules at stage 2
687        let tgran16_2 @ 35..32; // 16 kiB granules at stage 2
688        let tgran4 @ 31..28; // 4 kiB granules at stage 1
689        let tgran64 @ 27..24; // 64 kiB granules at stage 1
690        let tgran16 @ 23..20; // 16 kiB granules at stage 1
691        let big_end_el0 @ 19..16; // Mixed-endian support for EL0 only
692        let sns_mem @ 15..12; // Secure and Non-secure Memory distinguished
693        let big_end @ 11..8; // Mixed-endian support
694        let asid_bits @ 7..4: AsidSize; // Number of ASID bits
695        let pa_range @ 3..0: PhysicalAddressSize; // Supported Physical Address range
696    }
697});
698
699/// [arm/v9]: D24.2.83 ID_AA64MMFR1_EL1, AArch64 Memory Model Feature Register 1
700pub const ID_AA64MMFR1_EL1: SysReg<spec::ID_AA64MMFR1_EL1, MemoryModelFeatureRegister1> =
701    SysReg::new();
702
703layout!({
704    /// The layout of [`ID_AA64MMFR1_EL1`].
705    pub struct MemoryModelFeatureRegister1(u64);
706    {
707        let __ @ 63..60;
708        let cmow @ 59..56; // Cache maintenance instruction permission (FEAT_CMOW)
709        let tidcp1 @ 55..52; // TIDCP are implemented (FEAT_TIDCP1)
710        let ntlbpa @ 51..48; // Intermediate caching of translation table walks (FEAT_nTLBPA)
711        let afp @ 47..44; // FPCR.{AH, FIZ, NEP} support (FEAT_AFP)
712        let hcx @ 43..40; // HCRX_EL2 and its associated EL3 trap (FEAT_HCX)
713        let ets @ 39..36; // Enhanced Translation Synchronization (FEAT_ETS)
714        let twed @ 35..32; // Configurable delayed trapping of WFE (FEAT_TWED)
715        let xnx @ 31..28; // Execute-never control at stage 2 (FEAT_XNX)
716        let spec_sei @ 27..24; // SError interrupt exceptions from speculative reads
717        let pan @ 23..20; // Privileged Access Never (FEAT_PAN, FEAT_PAN2, FEAT_PAN3)
718        let lo @ 19..16; // Limited ordering regions (FEAT_LOR)
719        let hpds @ 15..12; // Hierarchical Permission Disables (FEAT_HPDS, FEAT_HPDS2)
720        let vh @ 11..8; // Virtualization Host Extensions (FEAT_VHE)
721        let vmid_bits @ 7..4: AsidSize; // Number of VMID bits (FEAT_VMID16)
722        let hafdbs @ 3..0; // Hardware updates to access flag and dirty state (FEAT_HAFDBS)
723    }
724});
725
726/// [arm/v9]: D24.2.84 ID_AA64MMFR2_EL1, AArch64 Memory Model Feature Register 2
727pub const ID_AA64MMFR2_EL1: SysReg<spec::ID_AA64MMFR2_EL1, MemoryModelFeatureRegister2> =
728    SysReg::new();
729
730layout!({
731    /// The layout of [`ID_AA64MMFR2_EL1`].
732    pub struct MemoryModelFeatureRegister2(u64);
733    {
734        let e0pd @ 63..60; // Preventing EL0 access to halves to address space (FEAT_E0PD)
735        let evt @ 59..56; // Enhanced Virtualization Traps (FEAT_EVT)
736        let bbm @ 55..52; // Break-before-make level support (FEAT_BBM)
737        let ttl @ 51..48; // Support for TTL field (FEAT_TTL)
738        let __ @ 47..44;
739        let fwb @ 43..40; // Support for HCR_EL2.FB (FEAT_S2FWB)
740        let ids @ 39..36; // Exception generated by ID space (FEAT_IDST)
741        let at @ 35..32; // Unaligned single-copy atomic functions (FEAT_LSE2)
742        let st @ 31..28; // Small translation tables (FEAT_TTST)
743        let nv @ 27..24; // Nested Virtualization (FEAT_NV/FEAT_NV2)
744        let ccidx @ 23..20; // Revised CCSIDR_EL1 register format (FEAT_CCIDX)
745        let varange @ 19..16; // Support for larger virtual addresses (FEAT_LVA)
746        let iesb @ 15..12; // Support for IESB bit in SCTLR_ELx (FEAT_IESB)
747        let lsm @ 11..8; // Supoprt for LSMAOE and nTLSMD bit in SCTLR_EL1 (FEAT_LSMAOC)
748        let uao @ 7..4; // User Access Override (FEAT_UAO)
749        let cnp @ 3..0; // Common not Private translations (FEAT_TTCNP)
750    }
751});
752
753/// [arm/v9]: D24.2.85 ID_AA64MMFR3_EL1, AArch64 Memory Model Feature Register 3
754pub const ID_AA64MMFR3_EL1: SysReg<spec::ID_AA64MMFR3_EL1, MemoryModelFeatureRegister3> =
755    SysReg::new();
756
757layout!({
758    /// The layout of [`ID_AA64MMFR3_EL1`].
759    pub struct MemoryModelFeatureRegister3(u64);
760    {
761        let spec_fpacc @ 63..60; // Speculative behavior in pac auth failure
762        let aderr @ 59..56; // Asynchronous device error exception
763        let sderr @ 55..52; // Synchronous device error exception
764        let __ @ 51..48;
765        let anerr @ 47..44; // Asynchronous normal error exception
766        let snerr @ 43..40; // Synchronous normal error exception
767        let d128_2 @ 39..36; // 128-bit S2 translation table descriptor
768        let d128 @ 35..32; // 128-bit translation table descriptor (FEAT_D128)
769        let mec @ 31..28; // Memory Encryption Contexts (FEAT_MEC)
770        let aie @ 27..24; // Attribute indexing (FEAT_AIE)
771        let s2poe @ 23..20; // Stage 2 permission overlay (FEAT_S2POE)
772        let s1poe @ 19..16; // Stage 1 permission overlay (FEAT_S1POE)
773        let s2pie @ 15..12; // Stage 2 permission indirection (FEAT_S2PIE)
774        let s1pie @ 11..8; // Stage 1 permission indirection (FEAT_S1PIE)
775        let sctlrx @ 7..4; // SCTLR extension (FEAT_SCTLR2)
776        let tcrx @ 3..0; // TCR extension (FEAT_TCR2)
777    }
778});
779
780/// [arm/v9]: D24.2.86 ID_AA64MMFR4_EL1, AArch64 Memory Model Feature Register 4
781pub const ID_AA64MMFR4_EL1: SysReg<spec::ID_AA64MMFR4_EL1, MemoryModelFeatureRegister4> =
782    SysReg::new();
783
784layout!({
785    /// The layout of [`ID_AA64MMFR4_EL1`].
786    pub struct MemoryModelFeatureRegister4(u64);
787    {
788        let __ @ 63..40;
789        let e3dse @ 39..36; // Delegated SError exceptions from EL3 (FEAT_E3DSE)
790        let __ @ 35..28;
791        let e2h0 @ 27..24; // Support for programming HCR_EL2.E2H (FEAT_E2H0)
792        let nv_frac @ 23..20; // Support for a subset of FEAT_NV and FEAT_NV2
793        let fgwte3 @ 19..16; // Fine Grained Write Trap EL3 (FEAT_FGWTE3)
794        let hacdbs @ 15..12; // Hardware accelerated cleaning of dirty state (FEAT_HACDBS)
795        let asid2 @ 11..8; // Support for concurrent use of two ASIDs (FEAT_ASID2)
796        let eiesb @ 7..4; // Early Implicit Error Synchronization event (FEAT_IESB)
797        let __ @ 3..0;
798    }
799});