1#![no_std]
3#![allow(non_upper_case_globals)]
4#![allow(missing_docs)]
5
6use core::mem::{offset_of, size_of};
7
8#[repr(C)]
12pub struct Ptregs {
13 regs_x0: u64,
14 regs_x1: u64,
15 regs_x2: u64,
16 regs_x3: u64,
17 regs_x4: u64,
18 regs_x5: u64,
19 regs_x6: u64,
20 regs_x7: u64,
21 regs_x8: u64,
22 regs_x9: u64,
23 regs_x10: u64,
24 regs_x11: u64,
25 regs_x12: u64,
26 regs_x13: u64,
27 regs_x14: u64,
28 regs_x15: u64,
29 regs_x16: u64,
30 regs_x17: u64,
31 regs_x18: u64,
32 regs_x19: u64,
33 regs_x20: u64,
34 regs_x21: u64,
35 regs_x22: u64,
36 regs_x23: u64,
37 regs_x24: u64,
38 regs_x25: u64,
39 regs_x26: u64,
40 regs_x27: u64,
41 regs_x28: u64,
42 regs_x29: u64,
43 regs_x30: u64,
44 sp: u64,
45 pc: u64,
46 pstate: u64,
47
48 orig_x0: u64,
49 syscallno: i32,
50 unused2: u32,
51 orig_addr_limit: u64,
52 unused: u64,
53 stackframe: [u64; 2],
54}
55
56impl Ptregs {
57 pub fn get_pc(&self) -> u64 {
59 self.pc
60 }
61
62 pub fn get_pstate(&self) -> u64 {
64 self.pstate
65 }
66
67 pub fn get_orig_addr_limit(&self) -> u64 {
69 self.orig_addr_limit
70 }
71}
72
73pub const S_X0: usize = offset_of!(Ptregs, regs_x0);
75pub const S_X1: usize = offset_of!(Ptregs, regs_x1);
77pub const S_X2: usize = offset_of!(Ptregs, regs_x2);
79pub const S_X3: usize = offset_of!(Ptregs, regs_x3);
81pub const S_X4: usize = offset_of!(Ptregs, regs_x4);
83pub const S_X5: usize = offset_of!(Ptregs, regs_x5);
85pub const S_X6: usize = offset_of!(Ptregs, regs_x6);
87pub const S_X7: usize = offset_of!(Ptregs, regs_x7);
89pub const S_X8: usize = offset_of!(Ptregs, regs_x8);
91pub const S_X9: usize = offset_of!(Ptregs, regs_x9);
93pub const S_X10: usize = offset_of!(Ptregs, regs_x10);
95pub const S_X11: usize = offset_of!(Ptregs, regs_x11);
97pub const S_X12: usize = offset_of!(Ptregs, regs_x12);
99pub const S_X13: usize = offset_of!(Ptregs, regs_x13);
101pub const S_X14: usize = offset_of!(Ptregs, regs_x14);
103pub const S_X15: usize = offset_of!(Ptregs, regs_x15);
105pub const S_X16: usize = offset_of!(Ptregs, regs_x16);
107pub const S_X17: usize = offset_of!(Ptregs, regs_x17);
109pub const S_X18: usize = offset_of!(Ptregs, regs_x18);
111pub const S_X19: usize = offset_of!(Ptregs, regs_x19);
113pub const S_X20: usize = offset_of!(Ptregs, regs_x20);
115pub const S_X21: usize = offset_of!(Ptregs, regs_x21);
117pub const S_X22: usize = offset_of!(Ptregs, regs_x22);
119pub const S_X23: usize = offset_of!(Ptregs, regs_x23);
121pub const S_X24: usize = offset_of!(Ptregs, regs_x24);
123pub const S_X25: usize = offset_of!(Ptregs, regs_x25);
125pub const S_X26: usize = offset_of!(Ptregs, regs_x26);
127pub const S_X27: usize = offset_of!(Ptregs, regs_x27);
129pub const S_X28: usize = offset_of!(Ptregs, regs_x28);
131pub const S_X29: usize = offset_of!(Ptregs, regs_x29);
133pub const S_LR: usize = offset_of!(Ptregs, regs_x30);
135pub const S_SP: usize = offset_of!(Ptregs, sp);
137pub const S_PC: usize = offset_of!(Ptregs, pc);
139pub const S_PSTATE: usize = offset_of!(Ptregs, pstate);
141pub const S_ORIG_X0: usize = offset_of!(Ptregs, orig_x0);
143pub const S_SYSCALLNO: usize = offset_of!(Ptregs, syscallno);
145pub const S_ORIG_ADDR_LIMIT: usize = offset_of!(Ptregs, orig_addr_limit);
147pub const S_STACKFRAME: usize = offset_of!(Ptregs, stackframe);
149pub const S_FRAME_SIZE: usize = size_of::<Ptregs>();
151
152#[cfg(test)]
153mod test {
154 use super::*;
155
156 #[test]
157 fn test() {
158 assert_eq!(S_X0, 0);
159 assert_eq!(S_X1, 8);
160 assert_eq!(S_X2, 16);
161 assert_eq!(S_X3, 24);
162 assert_eq!(S_X4, 32);
163 assert_eq!(S_X5, 40);
164 assert_eq!(S_X6, 48);
165 assert_eq!(S_X7, 56);
166 assert_eq!(S_X8, 64);
167 assert_eq!(S_X9, 72);
168 assert_eq!(S_X10, 80);
169 assert_eq!(S_X11, 88);
170 assert_eq!(S_X12, 96);
171 assert_eq!(S_X13, 104);
172 assert_eq!(S_X14, 112);
173 assert_eq!(S_X15, 120);
174 assert_eq!(S_X16, 128);
175 assert_eq!(S_X17, 136);
176 assert_eq!(S_X18, 144);
177 assert_eq!(S_X19, 152);
178 assert_eq!(S_X20, 160);
179 assert_eq!(S_X21, 168);
180 assert_eq!(S_X22, 176);
181 assert_eq!(S_X23, 184);
182 assert_eq!(S_X24, 192);
183 assert_eq!(S_X25, 200);
184 assert_eq!(S_X26, 208);
185 assert_eq!(S_X27, 216);
186 assert_eq!(S_X28, 224);
187 assert_eq!(S_X29, 232);
188 assert_eq!(S_LR, 240);
189 assert_eq!(S_SP, 248);
190 assert_eq!(S_PC, 256);
191 assert_eq!(S_PSTATE, 264);
192 assert_eq!(S_ORIG_X0, 272);
193 assert_eq!(S_SYSCALLNO, 280);
194 assert_eq!(S_ORIG_ADDR_LIMIT, 288);
195 assert_eq!(S_STACKFRAME, 304);
196 assert_eq!(S_FRAME_SIZE, 320);
197 }
198}
199
200pub const VA_BITS: usize = 48;
202
203pub const PA_BITS: usize = 48;
205
206pub const KIMAGE_START: usize = 0xffff000000000000;
210
211pub const KIO_VADDR: usize = 0xffff001000000000;
215pub const KIO_VADDR_END: usize = 0xffff001400000000;
217
218pub const KMEM_VADDR: usize = 0xffff002000000000;
222pub const KMEM_VADDR_END: usize = 0xffff002400000000;
224
225pub const KPAGE_VADDR: usize = 0xffff003000000000;
229pub const KPAGE_VADDR_END: usize = 0xffff003400000000;
231
232pub const CurrentEL_EL2: usize = 2 << 2;
234
235pub const SCTLR_EL1_RES1: usize = 1 << 11 | 1 << 20 | 1 << 22 | 1 << 28 | 1 << 29;
237pub const SCTLR_EL2_RES1: usize =
239 1 << 4 | 1 << 5 | 1 << 11 | 1 << 16 | 1 << 18 | 1 << 22 | 1 << 23 | 1 << 28 | 1 << 29;
240
241pub const ENDIAN_SET_EL1: usize = 0;
243pub const ENDIAN_SET_EL2: usize = 0;
245
246pub const BOOT_CPU_MODE_EL1: usize = 0xe11;
248pub const BOOT_CPU_MODE_EL2: usize = 0xe12;
250
251pub const PSR_F_BIT: usize = 0x00000040;
253pub const PSR_I_BIT: usize = 0x00000080;
255pub const PSR_A_BIT: usize = 0x00000100;
257pub const PSR_D_BIT: usize = 0x00000200;
259
260pub const PSR_MODE_EL0t: usize = 0x00000000;
262pub const PSR_MODE_EL1t: usize = 0x00000004;
264pub const PSR_MODE_EL1h: usize = 0x00000005;
266pub const PSR_MODE_EL2t: usize = 0x00000008;
268pub const PSR_MODE_EL2h: usize = 0x00000009;
270pub const PSR_MODE_EL3t: usize = 0x0000000c;
272pub const PSR_MODE_EL3h: usize = 0x0000000d;
274pub const PSR_MODE_MASK: usize = 0x0000000f;
276
277pub const PSR_MODE32_BIT: usize = 0x00000010;
279
280pub const MT_DEVICE_nGnRnE: usize = 0;
282pub const MT_DEVICE_nGnRE: usize = 1;
284pub const MT_DEVICE_GRE: usize = 2;
286pub const MT_NORMAL_NC: usize = 3;
288pub const MT_NORMAL: usize = 4;
290pub const MT_NORMAL_WT: usize = 5;
292
293pub const MAIR_ATTR: usize = (0x04 << (MT_DEVICE_nGnRE * 8))
308 | (0x0c << (MT_DEVICE_GRE * 8))
309 | (0x44 << (MT_NORMAL_NC * 8))
310 | (0xff << (MT_NORMAL * 8))
311 | (0xbb << (MT_NORMAL_WT * 8));
312
313pub const PGD_TYPE_TABLE: usize = 3;
315pub const PGD_TABLE_PXN: usize = 1 << 59;
317pub const PGD_TABLE_UXN: usize = 1 << 60;
319
320pub const PUD_TYPE_TABLE: usize = 3;
322pub const PUD_TABLE_PXN: usize = 1 << 59;
324pub const PUD_TABLE_UXN: usize = 1 << 58;
326
327pub const PMD_TYPE_TABLE: usize = 3;
329pub const PMD_TABLE_PXN: usize = 1 << 59;
331pub const PMD_TABLE_UXN: usize = 1 << 58;
333
334pub const PUD_TYPE_SECT: usize = 1 << 0;
336pub const PUD_TYPE_AF: usize = 1 << 10;
338pub const PUD_SECT_S: usize = 3 << 8;
340pub const SWAPPER_PUD_FLAGS: usize = PUD_TYPE_SECT | PUD_TYPE_AF | PUD_SECT_S;
342
343pub const SWAPPER_MM_NORMALFLAGS: usize = (MT_NORMAL << 2) | SWAPPER_PUD_FLAGS;
345pub const SWAPPER_MM_IOFLAGS: usize = (MT_DEVICE_nGnRE << 2) | SWAPPER_PUD_FLAGS;
347
348pub const PGD_SHIFT: usize = 39;
350pub const PGD_SIZE: usize = 0x8000000000;
352pub const PGD_MASK: usize = 0xffffff8000000000;
354pub const PTRS_PER_PGD: usize = 512;
356
357pub const PUD_SHIFT: usize = 30;
359pub const PUD_SIZE: usize = 0x40000000;
361pub const PUD_MASK: usize = 0xffffffffc0000000;
363pub const PTRS_PER_PUD: usize = 512;
365
366pub const PMD_SHIFT: usize = 21;
368pub const PMD_SIZE: usize = 0x200000;
370pub const PMD_MASK: usize = 0xffffffffffe00000;
372pub const PTRS_PER_PMD: usize = 512;
374
375pub const PTE_SHIFT: usize = 12;
377pub const PTE_SIZE: usize = 0x1000;
379pub const PTE_MASK: usize = 0xfffffffffffff000;
381pub const PTRS_PER_PTE: usize = 512;
383
384pub const PAGE_SIZE: usize = PTE_SIZE;
386
387pub const THREAD_STACK_SIZE: usize = 1 << 14;
389
390pub const SCTLR_ELx_DSSBS: usize = 1 << 44;
392pub const SCTLR_ELx_ENIA: usize = 1 << 31;
394pub const SCTLR_ELx_ENIB: usize = 1 << 30;
396pub const SCTLR_ELx_ENDA: usize = 1 << 27;
398pub const SCTLR_ELx_EE: usize = 1 << 25;
400pub const SCTLR_ELx_IESB: usize = 1 << 21;
402pub const SCTLR_ELx_WXN: usize = 1 << 19;
404pub const SCTLR_ELx_ENDB: usize = 1 << 13;
406pub const SCTLR_ELx_I: usize = 1 << 12;
408pub const SCTLR_ELx_SA: usize = 1 << 3;
410pub const SCTLR_ELx_C: usize = 1 << 2;
412pub const SCTLR_ELx_A: usize = 1 << 1;
414pub const SCTLR_ELx_M: usize = 1 << 0;
416
417pub const SCTLR_EL1_UCI: usize = 1 << 26;
419pub const SCTLR_EL1_E0E: usize = 1 << 24;
421pub const SCTLR_EL1_SPAN: usize = 1 << 23;
423pub const SCTLR_EL1_NTWE: usize = 1 << 18;
425pub const SCTLR_EL1_NTWI: usize = 1 << 16;
427pub const SCTLR_EL1_UCT: usize = 1 << 15;
429pub const SCTLR_EL1_DZE: usize = 1 << 14;
431pub const SCTLR_EL1_UMA: usize = 1 << 9;
433pub const SCTLR_EL1_SED: usize = 1 << 8;
435pub const SCTLR_EL1_ITD: usize = 1 << 7;
437pub const SCTLR_EL1_CP15BEN: usize = 1 << 5;
439pub const SCTLR_EL1_SA0: usize = 1 << 4;
441
442pub const SCTLR_EL1_SET: usize = SCTLR_ELx_M
444 | SCTLR_ELx_C
445 | SCTLR_ELx_SA
446 | SCTLR_EL1_SA0
447 | SCTLR_EL1_SED
448 | SCTLR_ELx_I
449 | SCTLR_EL1_DZE
450 | SCTLR_EL1_UCT
451 | SCTLR_EL1_NTWE
452 | SCTLR_ELx_IESB
453 | SCTLR_EL1_SPAN
454 | ENDIAN_SET_EL1
455 | SCTLR_EL1_UCI
456 | SCTLR_EL1_RES1;
457
458pub const TCR_T0SZ_OFFSET: usize = 0;
460pub const TCR_T1SZ_OFFSET: usize = 16;
462pub const TCR_T0SZ: usize = (64 - VA_BITS) << TCR_T0SZ_OFFSET;
464pub const TCR_T1SZ: usize = (64 - VA_BITS) << TCR_T1SZ_OFFSET;
466pub const TCR_TxSZ: usize = TCR_T0SZ | TCR_T1SZ;
468pub const TCR_TxSZ_WIDTH: usize = 6;
470
471pub const TCR_IRGN0_SHIFT: usize = 8;
473pub const TCR_IRGN1_SHIFT: usize = 24;
475pub const TCR_IRGN0_WBWA: usize = 1 << TCR_IRGN0_SHIFT;
477pub const TCR_IRGN1_WBWA: usize = 1 << TCR_IRGN1_SHIFT;
479pub const TCR_IRGN_WBWA: usize = TCR_IRGN0_WBWA | TCR_IRGN1_WBWA;
481
482pub const TCR_ORGN0_SHIFT: usize = 10;
484pub const TCR_ORGN1_SHIFT: usize = 26;
486pub const TCR_ORGN0_WBWA: usize = 1 << TCR_ORGN0_SHIFT;
488pub const TCR_ORGN1_WBWA: usize = 1 << TCR_ORGN1_SHIFT;
490pub const TCR_ORGN_WBWA: usize = TCR_ORGN0_WBWA | TCR_ORGN1_WBWA;
492
493pub const TCR_SH0_SHIFT: usize = 12;
495pub const TCR_SH1_SHIFT: usize = 28;
497pub const TCR_SH0_INNER: usize = 3 << TCR_SH0_SHIFT;
499pub const TCR_SH1_INNER: usize = 3 << TCR_SH1_SHIFT;
501pub const TCR_SHARED: usize = TCR_SH0_INNER | TCR_SH1_INNER;
503
504pub const TCR_TG0_SHIFT: usize = 14;
506pub const TCR_TG1_SHIFT: usize = 30;
508pub const TCR_TG0_4K: usize = 0 << TCR_TG0_SHIFT;
510pub const TCR_TG1_4K: usize = 2 << TCR_TG1_SHIFT;
512
513pub const TCR_CACHE_FLAGS: usize = TCR_IRGN_WBWA | TCR_ORGN_WBWA;
515pub const TCR_SMP_FLAGS: usize = TCR_SHARED;
517pub const TCR_TG_FLAGS: usize = TCR_TG0_4K | TCR_TG1_4K;
519
520pub const TCR_A1: usize = 1 << 22;
522pub const TCR_ASID16: usize = 1 << 36;
524pub const TCR_TBI0: usize = 1 << 37;
526
527pub const ID_AA64MMFR0_PARANGE_48: usize = 0x5;
529pub const ID_AA64MMFR0_PARANGE_MAX: usize = ID_AA64MMFR0_PARANGE_48;
531pub const ID_AA64MMFR0_PARANGE_SHIFT: usize = 0;
533pub const TCR_IPS_SHIFT: usize = 32;
535
536pub const ID_AA64MMFR0_TGRAN4_SHIFT: usize = 28;
538pub const ID_AA64MMFR0_TGRAN4_SUPPORTED: usize = 0;
540pub const ID_AA64MMFR0_TGRAN_SHIFT: usize = ID_AA64MMFR0_TGRAN4_SHIFT;
542pub const ID_AA64MMFR0_TGRAN_SUPPORTED: usize = ID_AA64MMFR0_TGRAN4_SUPPORTED;
544
545pub const KERNEL_DS: usize = usize::MAX;
547pub const USER_DS: usize = (1 << VA_BITS) - 1;
549
550pub const NO_SYSCALL: isize = -1;
552
553pub const BUG_BRK_IMM: usize = 0x800;
555
556pub const ESR_ELx_EC_UNKNOWN: usize = 0x00;
557pub const ESR_ELx_EC_WFx: usize = 0x01;
558pub const ESR_ELx_EC_CP15_32: usize = 0x03;
560pub const ESR_ELx_EC_CP15_64: usize = 0x04;
561pub const ESR_ELx_EC_CP14_MR: usize = 0x05;
562pub const ESR_ELx_EC_CP14_LS: usize = 0x06;
563pub const ESR_ELx_EC_FP_ASIMD: usize = 0x07;
564pub const ESR_ELx_EC_CP10_ID: usize = 0x08; pub const ESR_ELx_EC_PAC: usize = 0x09; pub const ESR_ELx_EC_CP14_64: usize = 0x0C;
568pub const ESR_ELx_EC_ILL: usize = 0x0E;
570pub const ESR_ELx_EC_SVC32: usize = 0x11;
572pub const ESR_ELx_EC_HVC32: usize = 0x12; pub const ESR_ELx_EC_SMC32: usize = 0x13; pub const ESR_ELx_EC_SVC64: usize = 0x15;
576pub const ESR_ELx_EC_HVC64: usize = 0x16; pub const ESR_ELx_EC_SMC64: usize = 0x17; pub const ESR_ELx_EC_SYS64: usize = 0x18;
579pub const ESR_ELx_EC_SVE: usize = 0x19;
580pub const ESR_ELx_EC_IMP_DEF: usize = 0x1f; pub const ESR_ELx_EC_IABT_LOW: usize = 0x20;
583pub const ESR_ELx_EC_IABT_CUR: usize = 0x21;
584pub const ESR_ELx_EC_PC_ALIGN: usize = 0x22;
585pub const ESR_ELx_EC_DABT_LOW: usize = 0x24;
587pub const ESR_ELx_EC_DABT_CUR: usize = 0x25;
588pub const ESR_ELx_EC_SP_ALIGN: usize = 0x26;
589pub const ESR_ELx_EC_FP_EXC32: usize = 0x28;
591pub const ESR_ELx_EC_FP_EXC64: usize = 0x2C;
593pub const ESR_ELx_EC_SERROR: usize = 0x2F;
595pub const ESR_ELx_EC_BREAKPT_LOW: usize = 0x30;
596pub const ESR_ELx_EC_BREAKPT_CUR: usize = 0x31;
597pub const ESR_ELx_EC_SOFTSTP_LOW: usize = 0x32;
598pub const ESR_ELx_EC_SOFTSTP_CUR: usize = 0x33;
599pub const ESR_ELx_EC_WATCHPT_LOW: usize = 0x34;
600pub const ESR_ELx_EC_WATCHPT_CUR: usize = 0x35;
601pub const ESR_ELx_EC_BKPT32: usize = 0x38;
603pub const ESR_ELx_EC_VECTOR32: usize = 0x3A; pub const ESR_ELx_EC_BRK64: usize = 0x3C;
607pub const ESR_ELx_EC_MAX: usize = 0x3F;
609
610pub const ESR_ELx_EC_SHIFT: usize = 26;
611pub const ESR_ELx_EC_MASK: usize = (0x3F) << ESR_ELx_EC_SHIFT;
612pub const fn esr_elx_ec(esr: usize) -> usize {
613 ((esr) & ESR_ELx_EC_MASK) >> ESR_ELx_EC_SHIFT
614}
615
616pub const ESR_ELx_IL_SHIFT: usize = 25;
617pub const ESR_ELx_IL: usize = (1) << ESR_ELx_IL_SHIFT;
618pub const ESR_ELx_ISS_MASK: usize = ESR_ELx_IL - 1;
619
620pub const ESR_ELx_WNR_SHIFT: usize = 6;
622pub const ESR_ELx_WNR: usize = (1) << ESR_ELx_WNR_SHIFT;
623
624pub const ESR_ELx_IDS_SHIFT: usize = 24;
626pub const ESR_ELx_IDS: usize = (1) << ESR_ELx_IDS_SHIFT;
627pub const ESR_ELx_AET_SHIFT: usize = 10;
628pub const ESR_ELx_AET: usize = (0x7) << ESR_ELx_AET_SHIFT;
629
630pub const ESR_ELx_AET_UC: usize = (0) << ESR_ELx_AET_SHIFT;
631pub const ESR_ELx_AET_UEU: usize = (1) << ESR_ELx_AET_SHIFT;
632pub const ESR_ELx_AET_UEO: usize = (2) << ESR_ELx_AET_SHIFT;
633pub const ESR_ELx_AET_UER: usize = (3) << ESR_ELx_AET_SHIFT;
634pub const ESR_ELx_AET_CE: usize = (6) << ESR_ELx_AET_SHIFT;
635
636pub const ESR_ELx_SET_SHIFT: usize = 11;
638pub const ESR_ELx_SET_MASK: usize = (3) << ESR_ELx_SET_SHIFT;
639pub const ESR_ELx_FnV_SHIFT: usize = 10;
640pub const ESR_ELx_FnV: usize = (1) << ESR_ELx_FnV_SHIFT;
641pub const ESR_ELx_EA_SHIFT: usize = 9;
642pub const ESR_ELx_EA: usize = (1) << ESR_ELx_EA_SHIFT;
643pub const ESR_ELx_S1PTW_SHIFT: usize = 7;
644pub const ESR_ELx_S1PTW: usize = (1) << ESR_ELx_S1PTW_SHIFT;
645
646pub const ESR_ELx_FSC: usize = 0x3F;
648pub const ESR_ELx_FSC_TYPE: usize = 0x3C;
649pub const ESR_ELx_FSC_EXTABT: usize = 0x10;
650pub const ESR_ELx_FSC_SERROR: usize = 0x11;
651pub const ESR_ELx_FSC_ACCESS: usize = 0x08;
652pub const ESR_ELx_FSC_FAT: usize = 0x04;
653pub const ESR_ELx_FSC_PERM: usize = 0x0C;
654
655pub const ESR_ELx_ISV_SHIFT: usize = 24;
657pub const ESR_ELx_ISV: usize = (1) << ESR_ELx_ISV_SHIFT;
658pub const ESR_ELx_SAS_SHIFT: usize = 22;
659pub const ESR_ELx_SAS: usize = (3) << ESR_ELx_SAS_SHIFT;
660pub const ESR_ELx_SSE_SHIFT: usize = 21;
661pub const ESR_ELx_SSE: usize = (1) << ESR_ELx_SSE_SHIFT;
662pub const ESR_ELx_SRT_SHIFT: usize = 16;
663pub const ESR_ELx_SRT_MASK: usize = (0x1F) << ESR_ELx_SRT_SHIFT;
664pub const ESR_ELx_SF_SHIFT: usize = 15;
665pub const ESR_ELx_SF: usize = (1) << ESR_ELx_SF_SHIFT;
666pub const ESR_ELx_AR_SHIFT: usize = 14;
667pub const ESR_ELx_AR: usize = (1) << ESR_ELx_AR_SHIFT;
668pub const ESR_ELx_CM_SHIFT: usize = 8;
669pub const ESR_ELx_CM: usize = (1) << ESR_ELx_CM_SHIFT;
670
671pub const ESR_ELx_CV: usize = (1) << 24;
673pub const ESR_ELx_COND_SHIFT: usize = 20;
674pub const ESR_ELx_COND_MASK: usize = (0xF) << ESR_ELx_COND_SHIFT;
675pub const ESR_ELx_WFx_ISS_TI: usize = (1) << 0;
676pub const ESR_ELx_WFx_ISS_WFI: usize = 0;
677pub const ESR_ELx_WFx_ISS_WFE: usize = (1) << 0;
678pub const ESR_ELx_xVC_IMM_MASK: usize = (1 << 16) - 1;
679
680pub const DISR_EL1_IDS: usize = (1) << 24;
681pub const DISR_EL1_ESR_MASK: usize = ESR_ELx_AET | ESR_ELx_EA | ESR_ELx_FSC;
684
685pub const ESR_ELx_WFx_MASK: usize = ESR_ELx_EC_MASK | ESR_ELx_WFx_ISS_TI;
687pub const ESR_ELx_WFx_WFI_VAL: usize = (ESR_ELx_EC_WFx << ESR_ELx_EC_SHIFT) | ESR_ELx_WFx_ISS_WFI;
688
689pub const fn esr_elx_val_brk64(imm: usize) -> usize {
690 (ESR_ELx_EC_BRK64 << ESR_ELx_EC_SHIFT) | ESR_ELx_IL | ((imm) & 0xffff)
691}
692
693pub const ESR_ELx_SYS64_ISS_RES0_SHIFT: usize = 22;
695pub const ESR_ELx_SYS64_ISS_RES0_MASK: usize = (0x7) << ESR_ELx_SYS64_ISS_RES0_SHIFT;
696pub const ESR_ELx_SYS64_ISS_DIR_MASK: usize = 0x1;
697pub const ESR_ELx_SYS64_ISS_DIR_READ: usize = 0x1;
698pub const ESR_ELx_SYS64_ISS_DIR_WRITE: usize = 0x0;
699
700pub const ESR_ELx_SYS64_ISS_RT_SHIFT: usize = 5;
701pub const ESR_ELx_SYS64_ISS_RT_MASK: usize = (0x1f) << ESR_ELx_SYS64_ISS_RT_SHIFT;
702pub const ESR_ELx_SYS64_ISS_CRM_SHIFT: usize = 1;
703pub const ESR_ELx_SYS64_ISS_CRM_MASK: usize = (0xf) << ESR_ELx_SYS64_ISS_CRM_SHIFT;
704pub const ESR_ELx_SYS64_ISS_CRN_SHIFT: usize = 10;
705pub const ESR_ELx_SYS64_ISS_CRN_MASK: usize = (0xf) << ESR_ELx_SYS64_ISS_CRN_SHIFT;
706pub const ESR_ELx_SYS64_ISS_OP1_SHIFT: usize = 14;
707pub const ESR_ELx_SYS64_ISS_OP1_MASK: usize = (0x7) << ESR_ELx_SYS64_ISS_OP1_SHIFT;
708pub const ESR_ELx_SYS64_ISS_OP2_SHIFT: usize = 17;
709pub const ESR_ELx_SYS64_ISS_OP2_MASK: usize = (0x7) << ESR_ELx_SYS64_ISS_OP2_SHIFT;
710pub const ESR_ELx_SYS64_ISS_OP0_SHIFT: usize = 20;
711pub const ESR_ELx_SYS64_ISS_OP0_MASK: usize = (0x3) << ESR_ELx_SYS64_ISS_OP0_SHIFT;
712pub const ESR_ELx_SYS64_ISS_SYS_MASK: usize = ESR_ELx_SYS64_ISS_OP0_MASK
713 | ESR_ELx_SYS64_ISS_OP1_MASK
714 | ESR_ELx_SYS64_ISS_OP2_MASK
715 | ESR_ELx_SYS64_ISS_CRN_MASK
716 | ESR_ELx_SYS64_ISS_CRM_MASK;
717pub const fn esr_elx_sys64_iss_sys_val(
718 op0: usize,
719 op1: usize,
720 op2: usize,
721 crn: usize,
722 crm: usize,
723) -> usize {
724 ((op0) << ESR_ELx_SYS64_ISS_OP0_SHIFT)
725 | ((op1) << ESR_ELx_SYS64_ISS_OP1_SHIFT)
726 | ((op2) << ESR_ELx_SYS64_ISS_OP2_SHIFT)
727 | ((crn) << ESR_ELx_SYS64_ISS_CRN_SHIFT)
728 | ((crm) << ESR_ELx_SYS64_ISS_CRM_SHIFT)
729}
730
731pub const ESR_ELx_SYS64_ISS_SYS_OP_MASK: usize =
732 ESR_ELx_SYS64_ISS_SYS_MASK | ESR_ELx_SYS64_ISS_DIR_MASK;
733pub const fn esr_elx_sys64_iss_rt(esr: usize) -> usize {
734 ((esr) & ESR_ELx_SYS64_ISS_RT_MASK) >> ESR_ELx_SYS64_ISS_RT_SHIFT
735}
736
737pub const ESR_ELx_SYS64_ISS_CRM_DC_CIVAC: usize = 14;
741pub const ESR_ELx_SYS64_ISS_CRM_DC_CVAP: usize = 12;
742pub const ESR_ELx_SYS64_ISS_CRM_DC_CVAU: usize = 11;
743pub const ESR_ELx_SYS64_ISS_CRM_DC_CVAC: usize = 10;
744pub const ESR_ELx_SYS64_ISS_CRM_IC_IVAU: usize = 5;
745
746pub const ESR_ELx_SYS64_ISS_EL0_CACHE_OP_MASK: usize = ESR_ELx_SYS64_ISS_OP0_MASK
747 | ESR_ELx_SYS64_ISS_OP1_MASK
748 | ESR_ELx_SYS64_ISS_OP2_MASK
749 | ESR_ELx_SYS64_ISS_CRN_MASK
750 | ESR_ELx_SYS64_ISS_DIR_MASK;
751pub const ESR_ELx_SYS64_ISS_EL0_CACHE_OP_VAL: usize =
752 esr_elx_sys64_iss_sys_val(1, 3, 1, 7, 0) | ESR_ELx_SYS64_ISS_DIR_WRITE;
753pub const ESR_ELx_SYS64_ISS_SYS_MRS_OP_MASK: usize = ESR_ELx_SYS64_ISS_OP0_MASK
757 | ESR_ELx_SYS64_ISS_OP1_MASK
758 | ESR_ELx_SYS64_ISS_CRN_MASK
759 | ESR_ELx_SYS64_ISS_DIR_MASK;
760pub const ESR_ELx_SYS64_ISS_SYS_MRS_OP_VAL: usize =
761 esr_elx_sys64_iss_sys_val(3, 0, 0, 0, 0) | ESR_ELx_SYS64_ISS_DIR_READ;
762
763pub const ESR_ELx_SYS64_ISS_SYS_CTR: usize = esr_elx_sys64_iss_sys_val(3, 3, 1, 0, 0);
764pub const ESR_ELx_SYS64_ISS_SYS_CTR_READ: usize =
765 ESR_ELx_SYS64_ISS_SYS_CTR | ESR_ELx_SYS64_ISS_DIR_READ;
766
767pub const ESR_ELx_SYS64_ISS_SYS_CNTVCT: usize =
768 esr_elx_sys64_iss_sys_val(3, 3, 2, 14, 0) | ESR_ELx_SYS64_ISS_DIR_READ;
769
770pub const ESR_ELx_SYS64_ISS_SYS_CNTFRQ: usize =
771 esr_elx_sys64_iss_sys_val(3, 3, 0, 14, 0) | ESR_ELx_SYS64_ISS_DIR_READ;
772
773pub const fn esr_sys64_to_sysreg(e: usize) -> usize {
774 sys_reg(
775 ((e) & ESR_ELx_SYS64_ISS_OP0_MASK) >> ESR_ELx_SYS64_ISS_OP0_SHIFT,
776 ((e) & ESR_ELx_SYS64_ISS_OP1_MASK) >> ESR_ELx_SYS64_ISS_OP1_SHIFT,
777 ((e) & ESR_ELx_SYS64_ISS_CRN_MASK) >> ESR_ELx_SYS64_ISS_CRN_SHIFT,
778 ((e) & ESR_ELx_SYS64_ISS_CRM_MASK) >> ESR_ELx_SYS64_ISS_CRM_SHIFT,
779 ((e) & ESR_ELx_SYS64_ISS_OP2_MASK) >> ESR_ELx_SYS64_ISS_OP2_SHIFT,
780 )
781}
782
783pub const fn esr_cp15_to_sysreg(e: usize) -> usize {
784 sys_reg(
785 3,
786 ((e) & ESR_ELx_SYS64_ISS_OP1_MASK) >> ESR_ELx_SYS64_ISS_OP1_SHIFT,
787 ((e) & ESR_ELx_SYS64_ISS_CRN_MASK) >> ESR_ELx_SYS64_ISS_CRN_SHIFT,
788 ((e) & ESR_ELx_SYS64_ISS_CRM_MASK) >> ESR_ELx_SYS64_ISS_CRM_SHIFT,
789 ((e) & ESR_ELx_SYS64_ISS_OP2_MASK) >> ESR_ELx_SYS64_ISS_OP2_SHIFT,
790 )
791}
792
793pub const ESR_ELx_FP_EXC_TFV: usize = (1) << 23;
799
800pub const ESR_ELx_CP15_32_ISS_DIR_MASK: usize = 0x1;
802pub const ESR_ELx_CP15_32_ISS_DIR_READ: usize = 0x1;
803pub const ESR_ELx_CP15_32_ISS_DIR_WRITE: usize = 0x0;
804
805pub const ESR_ELx_CP15_32_ISS_RT_SHIFT: usize = 5;
806pub const ESR_ELx_CP15_32_ISS_RT_MASK: usize = (0x1f) << ESR_ELx_CP15_32_ISS_RT_SHIFT;
807pub const ESR_ELx_CP15_32_ISS_CRM_SHIFT: usize = 1;
808pub const ESR_ELx_CP15_32_ISS_CRM_MASK: usize = (0xf) << ESR_ELx_CP15_32_ISS_CRM_SHIFT;
809pub const ESR_ELx_CP15_32_ISS_CRN_SHIFT: usize = 10;
810pub const ESR_ELx_CP15_32_ISS_CRN_MASK: usize = (0xf) << ESR_ELx_CP15_32_ISS_CRN_SHIFT;
811pub const ESR_ELx_CP15_32_ISS_OP1_SHIFT: usize = 14;
812pub const ESR_ELx_CP15_32_ISS_OP1_MASK: usize = (0x7) << ESR_ELx_CP15_32_ISS_OP1_SHIFT;
813pub const ESR_ELx_CP15_32_ISS_OP2_SHIFT: usize = 17;
814pub const ESR_ELx_CP15_32_ISS_OP2_MASK: usize = (0x7) << ESR_ELx_CP15_32_ISS_OP2_SHIFT;
815
816pub const ESR_ELx_CP15_32_ISS_SYS_MASK: usize = ESR_ELx_CP15_32_ISS_OP1_MASK
817 | ESR_ELx_CP15_32_ISS_OP2_MASK
818 | ESR_ELx_CP15_32_ISS_CRN_MASK
819 | ESR_ELx_CP15_32_ISS_CRM_MASK
820 | ESR_ELx_CP15_32_ISS_DIR_MASK;
821pub const fn esr_elx_cp15_32_iss_sys_val(op1: usize, op2: usize, crn: usize, crm: usize) -> usize {
822 ((op1) << ESR_ELx_CP15_32_ISS_OP1_SHIFT)
823 | ((op2) << ESR_ELx_CP15_32_ISS_OP2_SHIFT)
824 | ((crn) << ESR_ELx_CP15_32_ISS_CRN_SHIFT)
825 | ((crm) << ESR_ELx_CP15_32_ISS_CRM_SHIFT)
826}
827
828pub const ESR_ELx_CP15_64_ISS_DIR_MASK: usize = 0x1;
829pub const ESR_ELx_CP15_64_ISS_DIR_READ: usize = 0x1;
830pub const ESR_ELx_CP15_64_ISS_DIR_WRITE: usize = 0x0;
831
832pub const ESR_ELx_CP15_64_ISS_RT_SHIFT: usize = 5;
833pub const ESR_ELx_CP15_64_ISS_RT_MASK: usize = (0x1f) << ESR_ELx_CP15_64_ISS_RT_SHIFT;
834
835pub const ESR_ELx_CP15_64_ISS_RT2_SHIFT: usize = 10;
836pub const ESR_ELx_CP15_64_ISS_RT2_MASK: usize = (0x1f) << ESR_ELx_CP15_64_ISS_RT2_SHIFT;
837
838pub const ESR_ELx_CP15_64_ISS_OP1_SHIFT: usize = 16;
839pub const ESR_ELx_CP15_64_ISS_OP1_MASK: usize = (0xf) << ESR_ELx_CP15_64_ISS_OP1_SHIFT;
840pub const ESR_ELx_CP15_64_ISS_CRM_SHIFT: usize = 1;
841pub const ESR_ELx_CP15_64_ISS_CRM_MASK: usize = (0xf) << ESR_ELx_CP15_64_ISS_CRM_SHIFT;
842
843pub const fn esr_elx_cp15_64_iss_sys_val(op1: usize, crm: usize) -> usize {
844 ((op1) << ESR_ELx_CP15_64_ISS_OP1_SHIFT) | ((crm) << ESR_ELx_CP15_64_ISS_CRM_SHIFT)
845}
846
847pub const ESR_ELx_CP15_64_ISS_SYS_MASK: usize =
848 ESR_ELx_CP15_64_ISS_OP1_MASK | ESR_ELx_CP15_64_ISS_CRM_MASK | ESR_ELx_CP15_64_ISS_DIR_MASK;
849
850pub const ESR_ELx_CP15_64_ISS_SYS_CNTVCT: usize =
851 esr_elx_cp15_64_iss_sys_val(1, 14) | ESR_ELx_CP15_64_ISS_DIR_READ;
852
853pub const ESR_ELx_CP15_32_ISS_SYS_CNTFRQ: usize =
854 esr_elx_cp15_32_iss_sys_val(0, 0, 14, 0) | ESR_ELx_CP15_32_ISS_DIR_READ;
855
856pub const fn esr_is_data_abort(esr: usize) -> bool {
857 let ec = esr_elx_ec(esr);
858 ec == ESR_ELx_EC_DABT_LOW || ec == ESR_ELx_EC_DABT_CUR
859}
860
861pub const Op0_shift: usize = 19;
870pub const Op0_mask: usize = 0x3;
871pub const Op1_shift: usize = 16;
872pub const Op1_mask: usize = 0x7;
873pub const CRn_shift: usize = 12;
874pub const CRn_mask: usize = 0xf;
875pub const CRm_shift: usize = 8;
876pub const CRm_mask: usize = 0xf;
877pub const Op2_shift: usize = 5;
878pub const Op2_mask: usize = 0x7;
879
880pub const fn sys_reg(op0: usize, op1: usize, crn: usize, crm: usize, op2: usize) -> usize {
881 ((op0) << Op0_shift)
882 | ((op1) << Op1_shift)
883 | ((crn) << CRn_shift)
884 | ((crm) << CRm_shift)
885 | ((op2) << Op2_shift)
886}
887
888pub const TIF_NEED_RESCHED: usize = 1;
890
891pub const _TIF_WORK_MASK: usize = 1 << TIF_NEED_RESCHED;