faults.zig (2673B)
1 pub const FaultKindZero = enum(u4) { 2 _NoFunction0 = 0b0000, 3 AlignmentFault = 0b0001, 4 InstructionDebugEventFault = 0b0010, 5 AccessBitFaultOnSection = 0b0011, 6 InstructionCacheMaintenanceOperationFault = 0b0100, 7 TranslationSectionFault = 0b0101, 8 AccessBitFault = 0b0110, 9 TranslationPageFault = 0b0111, 10 PreciseExternalAbort = 0b1000, 11 DomainSectionFault = 0b1001, 12 _NoFunction10 = 0b1010, 13 DomainPageFault = 0b1011, 14 ExternalAbortOnTranslationFirstLevel = 0b1100, 15 PermissionSectionFault = 0b1101, 16 ExternalAbortOnTranslationSecondLevel = 0b1110, 17 PermissionPageFault = 0b1111, 18 }; 19 20 pub const AxiSource = enum(u1) { 21 Decode = 0, 22 Slave = 1, 23 }; 24 25 pub const DFSR = packed struct(u32) { 26 pub const FaultKindOne = enum(u4) { 27 ImpreciseExternalAbort = 0b0110, 28 }; 29 pub const AbortSource = enum(u1) { 30 Read = 0, 31 Write = 1, 32 }; 33 34 status: packed union { 35 @"0": FaultKindZero, 36 @"1": FaultKindOne, 37 }, 38 domain: u4, 39 _reserved_8_9: u2, 40 status_kind: u1, 41 abort_source: AbortSource, 42 axi_source: AxiSource, 43 _reserved_13_31: u19, 44 45 pub fn get() @This() { 46 return asm volatile ("MRC p15, 0, %[result], c5, c0, 0" 47 : [result] "=r" (-> @This()), 48 ); 49 } 50 51 pub fn set(self: *@This()) void { 52 asm volatile ("MCR p15, 0, %[value], c5, c0, 0" 53 : 54 : [value] "r" (@as(u32, @bitCast(self.*))), 55 ); 56 } 57 }; 58 59 pub const IFSR = packed struct(u32) { 60 status: FaultKindZero, 61 _reserved_4_9: u6, 62 status_kind: u1, 63 _reserved_11: u1, 64 axi_source: AxiSource, 65 _reserved_13_31: u19, 66 67 pub fn get() @This() { 68 return asm volatile ("MRC p15, 0, %[result], c5, c0, 1" 69 : [result] "=r" (-> @This()), 70 ); 71 } 72 73 pub fn set(self: *@This()) void { 74 asm volatile ("MCR p15, 0, %[value], c5, c0, 1" 75 : 76 : [value] "r" (@as(u32, @bitCast(self.*))), 77 ); 78 } 79 }; 80 81 pub const FAR = struct { 82 pub fn get() u32 { 83 return asm volatile ("MRC p15, 0, %[result], c6, c0, 0" 84 : [result] "=r" (-> u32), 85 ); 86 } 87 88 pub fn set(address: u32) void { 89 asm volatile ("MCR p15, 0, %[result], c6, c0, 0" 90 : 91 : [result] "r" (address), 92 ); 93 } 94 }; 95 96 pub const IFAR = struct { 97 pub fn get() u32 { 98 return asm volatile ("MRC p15, 0, %[result], c6, c0, 2" 99 : [result] "=r" (-> u32), 100 ); 101 } 102 103 pub fn set(address: u32) void { 104 asm volatile ("MCR p15, 0, %[result], c6, c0, 2" 105 : 106 : [result] "r" (address), 107 ); 108 } 109 };