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/sysreg]/ID_AA64ZFR0_EL1: SVE Feature ID Register 0
645pub const ID_AA64ZFR0_EL1: SysReg<spec::ID_AA64ZFR0_EL1, SveFeatureRegister0> = SysReg::new();
646
647#[bitfield_repr(u8)]
648#[derive(Clone, Copy)]
649pub enum IdAa64Zfr0F64mm {
650    None = 0b0000,
651    F64mm = 0b0001, // FEAT_F64MM
652}
653
654#[bitfield_repr(u8)]
655#[derive(Clone, Copy)]
656pub enum IdAa64Zfr0F32mm {
657    None = 0b0000,
658    F32mm = 0b0001, // FEAT_F32MM
659}
660
661#[bitfield_repr(u8)]
662#[derive(Clone, Copy)]
663pub enum IdAa64Zfr0F16mm {
664    None = 0b0000,
665    F16mm = 0b0001, // FEAT_F16MM
666}
667
668#[bitfield_repr(u8)]
669#[derive(Clone, Copy)]
670pub enum IdAa64Zfr0I8mm {
671    None = 0b0000,
672    I8mm = 0b0001, // FEAT_I8MM
673}
674
675#[bitfield_repr(u8)]
676#[derive(Clone, Copy)]
677pub enum IdAa64Zfr0Sm4 {
678    None = 0b0000,
679    Sm4 = 0b0001, // FEAT_SVE_SM4
680}
681
682#[bitfield_repr(u8)]
683#[derive(Clone, Copy)]
684pub enum IdAa64Zfr0Sha3 {
685    None = 0b0000,
686    Sha3 = 0b0001, // FEAT_SVE_SHA3
687}
688
689#[bitfield_repr(u8)]
690#[derive(Clone, Copy)]
691pub enum IdAa64Zfr0B16b16 {
692    None = 0b0000,
693    B16b16 = 0b0001,  // FEAT_SVE_B16B16
694    Bfscale = 0b0010, // FEAT_SVE_BFSCALE
695}
696
697#[bitfield_repr(u8)]
698#[derive(Clone, Copy)]
699pub enum IdAa64Zfr0Bf16 {
700    None = 0b0000,
701    Bf16 = 0b0001,  // FEAT_BF16
702    Ebf16 = 0b0010, // FEAT_EBF16
703}
704
705#[bitfield_repr(u8)]
706#[derive(Clone, Copy)]
707pub enum IdAa64Zfr0BitPerm {
708    None = 0b0000,
709    BitPerm = 0b0001, // FEAT_SVE_BitPerm
710}
711
712#[bitfield_repr(u8)]
713#[derive(Clone, Copy)]
714pub enum IdAa64Zfr0EltPerm {
715    None = 0b0000,
716    EltPerm = 0b0001, // FEAT_SVE_EltPerm
717}
718
719#[bitfield_repr(u8)]
720#[derive(Clone, Copy)]
721pub enum IdAa64Zfr0Aes {
722    None = 0b0000,
723    Aes = 0b0001,   // FEAT_SVE_AES
724    Pmull = 0b0010, // FEAT_SVE_PMULL128
725    Aes2 = 0b0011,  // FEAT_SVE_AES2
726}
727
728#[bitfield_repr(u8)]
729#[derive(Clone, Copy)]
730pub enum IdAa64Zfr0SveVer {
731    Sve = 0b0000,    // FEAT_SVE
732    Sve2 = 0b0001,   // FEAT_SVE2
733    Sve2p1 = 0b0010, // FEAT_SVE2p1
734    Sve2p2 = 0b0011, // FEAT_SVE2p2
735}
736
737layout!({
738    /// The layout of [`ID_AA64ZFR0_EL1`].
739    pub struct SveFeatureRegister0(u64);
740    {
741        let __ @ 63..60;
742        let f64mm @ 59..56: IdAa64Zfr0F64mm;
743        let f32mm @ 55..52: IdAa64Zfr0F32mm;
744        let f16mm @ 51..48: IdAa64Zfr0F16mm;
745        let i8mm @ 47..44: IdAa64Zfr0I8mm;
746        let sm4 @ 43..40: IdAa64Zfr0Sm4;
747        let __ @ 39..36;
748        let sha3 @ 35..32: IdAa64Zfr0Sha3;
749        let __ @ 31..28;
750        let b16b16 @ 27..24: IdAa64Zfr0B16b16;
751        let bf16 @ 23..20: IdAa64Zfr0Bf16;
752        let bit_perm @ 19..16: IdAa64Zfr0BitPerm;
753        let elt_perm @ 15..12: IdAa64Zfr0EltPerm;
754        let __ @ 11..8;
755        let aes @ 7..4: IdAa64Zfr0Aes;
756        let sve_ver @ 3..0: IdAa64Zfr0SveVer;
757    }
758});
759
760/// [arm/v9]: D24.2.82 ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0
761pub const ID_AA64MMFR0_EL1: SysReg<spec::ID_AA64MMFR0_EL1, MemoryModelFeatureRegister0> =
762    SysReg::new();
763
764/// ASID size.
765#[bitfield_repr(u8)]
766#[derive(Clone, Copy)]
767pub enum AsidSize {
768    Asid8Bits = 0b0000,
769    Asid16Bits = 0b0010,
770}
771
772/// Physical address size.
773///
774/// The same encoding is used by several registers, including system registers TCR_EL1.IPS,
775/// TCR_EL2.PS, and the feature register ID_AA64MMFR0_EL1.PARange.
776///
777/// [arm/v9]: D24.2.82 ID_AA64MMFR0_EL1, AArch64 Memory Model Feature Register 0
778/// [arm/v9]: D24.2.182 Translation Control Register (EL1)
779/// [arm/v9]: D24.2.183 Translation Control Register (EL2)
780#[bitfield_repr(u8)]
781#[derive(Clone, Copy)]
782pub enum PhysicalAddressSize {
783    Pa32Bits = 0b0000,
784    Pa36Bits = 0b0001,
785    Pa40Bits = 0b0010,
786    Pa42Bits = 0b0011,
787    Pa44Bits = 0b0100,
788    Pa48Bits = 0b0101,
789    Pa52Bits = 0b0110,
790    Pa56Bits = 0b0111, // FEAT_D128
791}
792
793layout!({
794    /// The layout of [`ID_AA64MMFR0_EL1`].
795    pub struct MemoryModelFeatureRegister0(u64);
796    {
797        let ecv @ 63..60; // Enhanced Counter Virtualization (FEAT_ECV)
798        let fgt @ 59..56; // Fine-Grained Trap controls (FEAT_FGT)
799        let __ @ 55..48;
800        let exs @ 47..44; // Disable context synchronizing exceptions (FEAT_ExS)
801        let tgran4_2 @ 43..40; // 4 kiB granules at stage 2
802        let tgran64_2 @ 39..36; // 64 kiB granules at stage 2
803        let tgran16_2 @ 35..32; // 16 kiB granules at stage 2
804        let tgran4 @ 31..28; // 4 kiB granules at stage 1
805        let tgran64 @ 27..24; // 64 kiB granules at stage 1
806        let tgran16 @ 23..20; // 16 kiB granules at stage 1
807        let big_end_el0 @ 19..16; // Mixed-endian support for EL0 only
808        let sns_mem @ 15..12; // Secure and Non-secure Memory distinguished
809        let big_end @ 11..8; // Mixed-endian support
810        let asid_bits @ 7..4: AsidSize; // Number of ASID bits
811        let pa_range @ 3..0: PhysicalAddressSize; // Supported Physical Address range
812    }
813});
814
815/// [arm/v9]: D24.2.83 ID_AA64MMFR1_EL1, AArch64 Memory Model Feature Register 1
816pub const ID_AA64MMFR1_EL1: SysReg<spec::ID_AA64MMFR1_EL1, MemoryModelFeatureRegister1> =
817    SysReg::new();
818
819layout!({
820    /// The layout of [`ID_AA64MMFR1_EL1`].
821    pub struct MemoryModelFeatureRegister1(u64);
822    {
823        let __ @ 63..60;
824        let cmow @ 59..56; // Cache maintenance instruction permission (FEAT_CMOW)
825        let tidcp1 @ 55..52; // TIDCP are implemented (FEAT_TIDCP1)
826        let ntlbpa @ 51..48; // Intermediate caching of translation table walks (FEAT_nTLBPA)
827        let afp @ 47..44; // FPCR.{AH, FIZ, NEP} support (FEAT_AFP)
828        let hcx @ 43..40; // HCRX_EL2 and its associated EL3 trap (FEAT_HCX)
829        let ets @ 39..36; // Enhanced Translation Synchronization (FEAT_ETS)
830        let twed @ 35..32; // Configurable delayed trapping of WFE (FEAT_TWED)
831        let xnx @ 31..28; // Execute-never control at stage 2 (FEAT_XNX)
832        let spec_sei @ 27..24; // SError interrupt exceptions from speculative reads
833        let pan @ 23..20; // Privileged Access Never (FEAT_PAN, FEAT_PAN2, FEAT_PAN3)
834        let lo @ 19..16; // Limited ordering regions (FEAT_LOR)
835        let hpds @ 15..12; // Hierarchical Permission Disables (FEAT_HPDS, FEAT_HPDS2)
836        let vh @ 11..8; // Virtualization Host Extensions (FEAT_VHE)
837        let vmid_bits @ 7..4: AsidSize; // Number of VMID bits (FEAT_VMID16)
838        let hafdbs @ 3..0; // Hardware updates to access flag and dirty state (FEAT_HAFDBS)
839    }
840});
841
842/// [arm/v9]: D24.2.84 ID_AA64MMFR2_EL1, AArch64 Memory Model Feature Register 2
843pub const ID_AA64MMFR2_EL1: SysReg<spec::ID_AA64MMFR2_EL1, MemoryModelFeatureRegister2> =
844    SysReg::new();
845
846layout!({
847    /// The layout of [`ID_AA64MMFR2_EL1`].
848    pub struct MemoryModelFeatureRegister2(u64);
849    {
850        let e0pd @ 63..60; // Preventing EL0 access to halves to address space (FEAT_E0PD)
851        let evt @ 59..56; // Enhanced Virtualization Traps (FEAT_EVT)
852        let bbm @ 55..52; // Break-before-make level support (FEAT_BBM)
853        let ttl @ 51..48; // Support for TTL field (FEAT_TTL)
854        let __ @ 47..44;
855        let fwb @ 43..40; // Support for HCR_EL2.FB (FEAT_S2FWB)
856        let ids @ 39..36; // Exception generated by ID space (FEAT_IDST)
857        let at @ 35..32; // Unaligned single-copy atomic functions (FEAT_LSE2)
858        let st @ 31..28; // Small translation tables (FEAT_TTST)
859        let nv @ 27..24; // Nested Virtualization (FEAT_NV/FEAT_NV2)
860        let ccidx @ 23..20; // Revised CCSIDR_EL1 register format (FEAT_CCIDX)
861        let varange @ 19..16; // Support for larger virtual addresses (FEAT_LVA)
862        let iesb @ 15..12; // Support for IESB bit in SCTLR_ELx (FEAT_IESB)
863        let lsm @ 11..8; // Supoprt for LSMAOE and nTLSMD bit in SCTLR_EL1 (FEAT_LSMAOC)
864        let uao @ 7..4; // User Access Override (FEAT_UAO)
865        let cnp @ 3..0; // Common not Private translations (FEAT_TTCNP)
866    }
867});
868
869/// [arm/v9]: D24.2.85 ID_AA64MMFR3_EL1, AArch64 Memory Model Feature Register 3
870pub const ID_AA64MMFR3_EL1: SysReg<spec::ID_AA64MMFR3_EL1, MemoryModelFeatureRegister3> =
871    SysReg::new();
872
873layout!({
874    /// The layout of [`ID_AA64MMFR3_EL1`].
875    pub struct MemoryModelFeatureRegister3(u64);
876    {
877        let spec_fpacc @ 63..60; // Speculative behavior in pac auth failure
878        let aderr @ 59..56; // Asynchronous device error exception
879        let sderr @ 55..52; // Synchronous device error exception
880        let __ @ 51..48;
881        let anerr @ 47..44; // Asynchronous normal error exception
882        let snerr @ 43..40; // Synchronous normal error exception
883        let d128_2 @ 39..36; // 128-bit S2 translation table descriptor
884        let d128 @ 35..32; // 128-bit translation table descriptor (FEAT_D128)
885        let mec @ 31..28; // Memory Encryption Contexts (FEAT_MEC)
886        let aie @ 27..24; // Attribute indexing (FEAT_AIE)
887        let s2poe @ 23..20; // Stage 2 permission overlay (FEAT_S2POE)
888        let s1poe @ 19..16; // Stage 1 permission overlay (FEAT_S1POE)
889        let s2pie @ 15..12; // Stage 2 permission indirection (FEAT_S2PIE)
890        let s1pie @ 11..8; // Stage 1 permission indirection (FEAT_S1PIE)
891        let sctlrx @ 7..4; // SCTLR extension (FEAT_SCTLR2)
892        let tcrx @ 3..0; // TCR extension (FEAT_TCR2)
893    }
894});
895
896/// [arm/v9]: D24.2.86 ID_AA64MMFR4_EL1, AArch64 Memory Model Feature Register 4
897pub const ID_AA64MMFR4_EL1: SysReg<spec::ID_AA64MMFR4_EL1, MemoryModelFeatureRegister4> =
898    SysReg::new();
899
900layout!({
901    /// The layout of [`ID_AA64MMFR4_EL1`].
902    pub struct MemoryModelFeatureRegister4(u64);
903    {
904        let __ @ 63..40;
905        let e3dse @ 39..36; // Delegated SError exceptions from EL3 (FEAT_E3DSE)
906        let __ @ 35..28;
907        let e2h0 @ 27..24; // Support for programming HCR_EL2.E2H (FEAT_E2H0)
908        let nv_frac @ 23..20; // Support for a subset of FEAT_NV and FEAT_NV2
909        let fgwte3 @ 19..16; // Fine Grained Write Trap EL3 (FEAT_FGWTE3)
910        let hacdbs @ 15..12; // Hardware accelerated cleaning of dirty state (FEAT_HACDBS)
911        let asid2 @ 11..8; // Support for concurrent use of two ASIDs (FEAT_ASID2)
912        let eiesb @ 7..4; // Early Implicit Error Synchronization event (FEAT_IESB)
913        let __ @ 3..0;
914    }
915});
916
917/// [arm/sysreg]/ID_AA64DFR0_EL1: AArch64 Debug Feature Register 0
918pub const ID_AA64DFR0_EL1: SysReg<spec::ID_AA64DFR0_EL1, DebugFeatureRegister0> = SysReg::new();
919
920layout!({
921    /// The layout of [`ID_AA64DFR0_EL1`].
922    pub struct DebugFeatureRegister0(u64);
923    {
924        let hpmn0 @ 63..60; // MDCR_EL2.HPMN may be zero (FEAT_HPMN0)
925        let ext_trc_buff @ 59..56; // Trace Buffer external mode (FEAT_TRBE_EXT)
926        let brbe @ 55..52; // Branch Record Buffer Extension (FEAT_BRBE)
927        let mtpmu @ 51..48; // Multi-threaded PMU (FEAT_MTPMU); signed field
928        let trace_buffer @ 47..44; // Trace Buffer Extension (FEAT_TRBE)
929        let trace_filt @ 43..40; // Self-hosted Trace Extension (FEAT_TRF)
930        let double_lock @ 39..36; // OS Double Lock (FEAT_DoubleLock); signed field
931        let pms_ver @ 35..32; // Statistical Profiling Extension version
932        let ctx_cmps @ 31..28; // Number of context-aware breakpoints, minus 1
933        let sebep @ 27..24; // Synchronous-exception-based event profiling (FEAT_SEBEP)
934        let wrps @ 23..20; // Number of watchpoints, minus 1
935        let pmss @ 19..16; // PMU snapshot extension (FEAT_PMUv3_SS)
936        let brps @ 15..12; // Number of breakpoints, minus 1
937        let pmu_ver @ 11..8; // Performance Monitors Extension version
938        let trace_ver @ 7..4; // Trace unit System register interface
939        let debug_ver @ 3..0; // Debug architecture version
940    }
941});