sylveos

Toy Operating System
Log | Files | Refs

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 };