ARMv8: adding more mackerel definitions of system registers
authorReto Achermann <reto.achermann@inf.ethz.ch>
Tue, 7 Mar 2017 14:31:54 +0000 (15:31 +0100)
committerReto Achermann <reto.achermann@inf.ethz.ch>
Tue, 7 Mar 2017 14:31:54 +0000 (15:31 +0100)
Signed-off-by: Reto Achermann <reto.achermann@inf.ethz.ch>

devices/armv8.dev
kernel/include/arch/armv8/sysreg.h

index c4a936f..4258a16 100644 (file)
@@ -111,7 +111,7 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         V        1 "Overflow condition flag";
         _       28 mbz;
     };
-
+    
     register SP_EL0 rw sysreg(sp_el0) "Stack Pointer (EL0)" {
         addr    64 "Stack pointer";
     };
@@ -133,6 +133,127 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         SP       1 "Stack pointer use (1=Use SP_ELx at Exception level ELx)";
     };
     
+    
+    constants MAIR_Mem width(2) "Shareability" {
+        MAIR_MEM_Write_Through_Transient = 0b00;
+        MAIR_MEM_NonCache = 0b01;
+        MAIR_MEM_Write_Through_Non_Transient = 0b10;
+        MAIR_MEM_Write_Back_Non_Transient = 0b11;
+    };
+    
+    constants MAIR_Dev width(2) "Shareability" {
+        MAIR_DEV_nGnRnE = 0b00;
+        MAIR_DEV_nGnRE  = 0b01;
+        MAIR_DEV_nGRE   = 0b10;
+        MAIR_DEV_GRE    = 0b11;
+    };
+
+    
+    register MAIR_EL1 rw sysreg(mair_el1) "Memory Attribute Indirection Register (EL1)" {
+        attr7_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr7_mem_rw    2 "Read/Write allocate policy";
+        attr7_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr6_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr6_mem_rw    2 "Read/Write allocate policy";
+        attr6_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr5_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr5_mem_rw    2 "Read/Write allocate policy";
+        attr5_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr4_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr4_mem_rw    2 "Read/Write allocate policy";
+        attr4_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr3_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr3_mem_rw    2 "Read/Write allocate policy";
+        attr3_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;        
+        attr2_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr2_mem_rw    2 "Read/Write allocate policy";
+        attr2_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr1_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr1_mem_rw    2 "Read/Write allocate policy";
+        attr1_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;      
+        attr0_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr0_mem_rw    2 "Read/Write allocate policy";
+        attr0_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;      
+    };
+    
+    register MAIR_EL2 rw sysreg(mair_el2) "Memory Attribute Indirection Register (EL2)" {
+        attr7_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr7_mem_rw    2 "Read/Write allocate policy";
+        attr7_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr6_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr6_mem_rw    2 "Read/Write allocate policy";
+        attr6_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr5_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr5_mem_rw    2 "Read/Write allocate policy";
+        attr5_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr4_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr4_mem_rw    2 "Read/Write allocate policy";
+        attr4_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr3_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr3_mem_rw    2 "Read/Write allocate policy";
+        attr3_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;        
+        attr2_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr2_mem_rw    2 "Read/Write allocate policy";
+        attr2_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr1_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr1_mem_rw    2 "Read/Write allocate policy";
+        attr1_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;      
+        attr0_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr0_mem_rw    2 "Read/Write allocate policy";
+        attr0_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;      
+    };
+    
+    register MAIR_EL3 rw sysreg(mair_el3) "Memory Attribute Indirection Register (EL3)" {
+        attr7_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr7_mem_rw    2 "Read/Write allocate policy";
+        attr7_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr6_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr6_mem_rw    2 "Read/Write allocate policy";
+        attr6_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr5_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr5_mem_rw    2 "Read/Write allocate policy";
+        attr5_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr4_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr4_mem_rw    2 "Read/Write allocate policy";
+        attr4_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr3_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr3_mem_rw    2 "Read/Write allocate policy";
+        attr3_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;        
+        attr2_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr2_mem_rw    2 "Read/Write allocate policy";
+        attr2_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;
+        attr1_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr1_mem_rw    2 "Read/Write allocate policy";
+        attr1_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;      
+        attr0_mem       2 type(MAIR_Mem) "Memory / Write Back";
+        attr0_mem_rw    2 "Read/Write allocate policy";
+        attr0_dev 2 type(MAIR_Dev) "Device memory type";  
+        _         2 mbz;      
+    };
+    
     register SPSR_abt rw sysreg(spsr_abt) "Saved Program Status Register (Abort mode)" {
         N     1 "Set to the value of CPSR.N on taking an exception to Abort mode";
         Z     1 "Set to the value of CPSR.Z on taking an exception to Abort mode";
@@ -167,7 +288,9 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         I     1 "IRQ mask bit";
         F     1 "FIQ mask bit.";
         _     2 mbz;
-        M     4 "AArch32 mode that an exception was taken from";
+        EL    2 "AArch64 mode that an exception was taken from";
+        _     1 mbz;
+        SP    1 "Stack pointer is determined by EL";
     };
     
     register SPSR_EL2 rw sysreg(spsr_el2) "Saved Program Status Register (EL2)" {
@@ -184,7 +307,9 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         I     1 "IRQ mask bit";
         F     1 "FIQ mask bit.";
         _     2 mbz;
-        M     4 "AArch32 mode that an exception was taken from";
+        EL     2 "AArch64 mode that an exception was taken from";
+        _     1 mbz;
+        SP    1 "Stack pointer is determined by EL";
     };
     
     register SPSR_EL3 rw sysreg(spsr_el3) "Saved Program Status Register (EL3)" {
@@ -201,7 +326,9 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         I     1 "IRQ mask bit";
         F     1 "FIQ mask bit.";
         _     2 mbz;
-        M     4 "AArch32 mode that an exception was taken from";
+        EL    2 "AArch64 mode that an exception was taken from";
+        _     1 mbz;
+        SP    1 "Stack pointer is determined by EL";
     };
     
     
@@ -448,7 +575,7 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         M        1 "MMU enable";
     };
 
-    constants fpen width(1) "Endianness configuration" {
+    constants fpen width(2) "Endianness configuration" {
         fpen_trap_any  = 0b00 "Trap any FP and SIMD instructions in EL0 or EL1";
         fpen_trap_el0  = 0b01 "Trap any FP and SIMD in EL0 to EL21";
         fpen_trap_el1  = 0b10 "Trap any FP and SIMD instructions in EL0 or EL1";
@@ -459,7 +586,7 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         _        3 mbz;
         TTA      1 "Traps EL0 and EL1 System register accesses to all implemented trace registers to EL1";
         _        6 mbz;
-        FPEN     2 type(endianness) "Traps EL0 and EL1 accesses to the SIMD and floating-point registers to EL1";
+        FPEN     2 type(fpen) "Traps EL0 and EL1 accesses to the SIMD and floating-point registers to EL1";
         _       20 mbz;
     };
 
@@ -600,7 +727,114 @@ device armv8 msbfirst () "ARMv8 architecture registers" {
         SRE     1 "System Register Enable";
     };
     
+    constants ID_FEATURE width(4) "Feature implemented" {
+        ID_FEATURE_IMPLEMENTED = 0b0000;
+        ID_FEATURE_NOT_IMPLEMENTED = 0b1111;
+    };
+    
+    constants EL_IMPLEMENTED width(4) "Feature implemented" {
+        ID_EL_NOT_IMPLEMENTED = 0b0000;
+        ID_EL_AARCH64_ONLY = 0b0001;
+        ID_EL_AARCH32_OR_64 = 0b0010;
+    };
    
+    register ID_AA64PFR0_EL1 ro sysreg(id_aa64pfr0_el1) "AArch64 Processor Feature Register 0" {
+        _      36 mbz;
+        GIC     4 "System register GIC interface support.";
+        AdvSIMD 4 type(ID_FEATURE) "Advanced SIMD. Defined values are";
+        FP      4 type(ID_FEATURE) "Floating-point. Defined values are:";
+        EL3     4 type(EL_IMPLEMENTED) "EL3 Exception level handlin";
+        EL2     4 type(EL_IMPLEMENTED)"EL2 Exception level handling.";
+        EL1     4 type(EL_IMPLEMENTED)"EL1 Exception level handling.";
+        EL0     4 type(EL_IMPLEMENTED)"EL0 Exception level handling.";
+    };
+    
+    register HCR_EL2 rw sysreg(hcr_el2) "Hypervisor Configuration Register" {
+        _ 25 mbz;
+        MIOCNC 1 "Mismatched Inner/Outer Cacheable Non-Coherency Enable, fo";
+        _     4 mbz;
+        ID    1 "Stage 2 Instruction access cacheability disable.";
+        CD    1 "Stage 2 Data access cacheability disable.";
+        RW    1 "Lower leves are AARCH64";
+        TRVM  1 "Trap Reads of Virtual Memory controls.";
+        HCD   1 "HVC instruction disable.";
+        TDZ   1 "Trap DC ZVA instructions.";
+        TGE   1 "Trap General Exceptions, from Non-secure EL0.";
+        TVM   1 "Trap Virtual Memory controls.";
+        TTLB  1 "Trap TLB maintenance instructions.";
+        TPU   1 "Trap cache maintenance instructions";
+        TPC   1 "Trap data or unified cache maintenance instructions";
+        TSW   1 "Trap data or unified cache maintenance instructions";
+        TACR  1 "Trap Auxiliary Control Registers. T";
+        TIDCP 1 "Trap IMPLEMENTATION DEFINED functionality.";
+        TSC   1 "Trap SMC instructions.";
+        TID3  1 "Trap ID group 3. Traps Non-secure EL1 reads of the following registers to EL2";
+        TID2  1 "Trap ID group 2. Traps the following register accesses to EL";
+        TID1  1 "Trap ID group 1. Traps Non-secure EL1 reads of the following registers are trapped to EL2";
+        TID0  1 "Trap ID group 0. Traps the following register accesses to EL2";
+        TWE   1 "Traps Non-secure EL0 and EL1 execution of WFE instructions to EL2";
+        TWI   1 "Traps Non-secure EL0 and EL1 execution of WFI instructions to EL2,";
+        DC    1 "Default Cacheability.";
+        BSU   2 "Barrier Shareability upgrade";
+        FB    1 "Force broadcast.";
+        VSE   1 "Virtual SError interrupt.";
+        VI    1 "Virtual IRQ Interrupt";
+        VF    1 "Virtual FIQ Interrupt.";
+        AMO   1 "Physical SError Interrupt routing.";
+        IMO   1 "Physical IRQ Routing.";
+        FMO   1 "Physical FIQ Routing.";
+        PTW   1 "Protected Table Walk.";
+        SWIO  1 "Set/Way Invalidation Override";
+        VM    1 "Virtualization enable. Enables stage 2 address translation";
+    };
+
+    register SCR_EL3 rw sysreg(scr_el3) "Secure Configuration Register" {
+        _   18 mbz;
+        TWE  1 "Traps EL2, EL1, and EL0 execution of WFE instructions to EL3,";
+        TWI  1 "Traps EL2, EL1, and EL0 execution of WFI instructions to EL3";
+        ST   1 "Traps Secure EL1 accesses to the Counter-timer Physical Secure timer registers to EL3";
+        RW   1 "Execution state control for lower Exception levels. (1 == AARCH64)";
+        SIF  1 "Secure instruction fetch.";
+        HCE  1 "Hypervisor Call instruction enable";
+        SMD  1 "Secure Monitor Call disable.";
+        _    1 mbz;
+        _    2 mb1;
+        EA   1 "External Abort and SError Interrupt Routing.";
+        FIQ  1 "Physical FIQ Routing.";
+        IRQ  1 "Physical IRQ Routing";
+        NS   1 "Non-secure bit.";
+    };
+    
+    register MDCR_EL2 rw sysreg(mdcr_el2) "Monitor Debug Configuration Register (EL3)" {
+        _   20 mbz;
+        TDRA  1 "Trap Debug ROM Address register access.";
+        TDOSA 1 "Trap debug OS-related register access";
+        TDA   1 "Trap Debug Access. Traps Non-secure EL0 and EL1 System register accesses";
+        TDE   1 "Trap Debug exception";
+        HPME  1 "Hypervisor Performance Monitors Enable.";
+        TPM   1 "Trap Performance Monitors accesses.";
+        TPMCR 1 "Trap PMCR_EL0 or PMCR accesses.";
+        HPMN  5 "Defines the number of Performance Monitors counters that are accessible from Non-secure EL0 and EL1 modes.";
+        
+    };
+    
+    register MDCR_EL3 rw sysreg(mdcr_el3) "Monitor Debug Configuration Register (EL3)" {
+        _    10 mbz;
+        EPMAD 1 "External debug interface Performance Monitors registers disable.";
+        EDAD  1 "External debug interface breakpoint and watchpoint register access disable.";
+        _     2 mbz;
+        SPME  1 "Secure Performance Monitors enable.";
+        SDD   1 "AArch64 Secure self-hosted invasive debug disable";
+        SPD32 2 "AArch32 Secure self-hosted privileged invasive debug control";
+        _     3 mbz;
+        TDOSA 1 "Trap debug OS-related register access. Traps EL2 and EL1 System";
+        TDA   1 "Trap Debug Access. Traps EL2, EL1, and EL0 System register accesses t";
+        _     2 mbz;
+        TPM   1 "Trap Performance Monitors accesses.";
+        _     6 mbz;
+    };
+    
+    
     register DC_CSIW wo cache_ctrl(cisw) "Data or unified Cache line Clean and Invalidate by Set/Way" {
         _       32 mbz;
         SetWay  28 "Set and ways. depends on the cache settings";
index c91d1fd..d4f4a2c 100644 (file)
@@ -78,6 +78,7 @@ ARMV8_SYSREG_RW(spsr_el1, SPSR_EL1, 32)
 ARMV8_SYSREG_RW(spsr_el2, SPSR_EL2, 32)
 ARMV8_SYSREG_RW(spsr_el3, SPSR_EL3, 32)
 
+ARMV8_SYSREG_RO(id_aa64pfr0_el1, id_aa64pfr0_el1, 64)
 
 ARMV8_SYSREG_RW(CPACR_EL1, CPACR_EL1, 32)
 ARMV8_SYSREG_RW(esr_el1, esr_el1, 64)
@@ -85,11 +86,22 @@ ARMV8_SYSREG_RW(esr_el1, esr_el1, 64)
 ARMV8_SYSREG_RW(dfsr, dfsr, 64)
 ARMV8_SYSREG_RW(ifsr, ifsr, 64)
 
+ARMV8_SYSREG_RW(hcr_el2, hcr_el2, 64)
+ARMV8_SYSREG_RW(scr_el3, scr_el3, 32)
+
+ARMV8_SYSREG_RW(mdcr_el2, mdcr_el2, 32)
+ARMV8_SYSREG_RW(mdcr_el3, mdcr_el3, 32)
+
+
 ARMV8_SYSREG_RW(ttbr0_el1, ttbr0_el1, 64)
 ARMV8_SYSREG_RW(ttbr0_el2, ttbr0_el2, 64)
 ARMV8_SYSREG_RW(ttbr0_el3, ttbr0_el3, 64)
 ARMV8_SYSREG_RW(ttbr1_el1, ttbr1_el1, 64)
 
+ARMV8_SYSREG_RW(mair_el1, mair_el1, 64)
+ARMV8_SYSREG_RW(mair_el2, mair_el2, 64)
+ARMV8_SYSREG_RW(mair_el3, mair_el3, 64)
+
 
 ARMV8_SYSREG_RW(ICC_AP0R0_EL1, S3_0_C12_C8_4, 32)
 ARMV8_SYSREG_RW(ICC_AP0R1_EL1, S3_0_C12_C8_5, 32)
@@ -155,12 +167,6 @@ ARMV8_SYSREG_RW(TTBCR, TTBCR, 32)
 #define ARMV8_CACHE_CTRL_WO(_name, _reg, _bits) \
     ARMV8_CACHE_CTRL_WRITE_FN(_name, _reg, _bits)
 
-#define ARMV8_CACHE_CTRL_RO(_name, _reg, _bits) \
-    ARMV8_CACHE_CTRL_READ_FN(_name, _reg, _bits)
-
-#define ARMV8_CACHE_CTRL_RW(_name, _reg, _bits) \
-    ARMV8_CACHE_CTRL_READ_FN(_name, _reg, _bits) \
-    ARMV8_CACHE_CTRL_WRITE_FN(_name, _reg, _bits)
 
 ARMV8_CACHE_CTRL_WO(cisw,CISW,64)
 ARMV8_CACHE_CTRL_WO(civac, CIVAC,64)
@@ -272,12 +278,6 @@ sysreg_read_cntfrq_el0(void) {
     return frq;
 }
 
-static inline uint64_t
-sysreg_read_sp_el0(void) {
-    uint64_t sp_el0;
-    __asm volatile("mrs %[sp_el0], sp_el0" : [sp_el0] "=r" (sp_el0));
-    return sp_el0;
-}
 
 static inline uint64_t
 sysreg_read_sp(void) {
@@ -335,11 +335,6 @@ sysreg_write_mdcr_el3(uint64_t x) {
     __asm volatile("msr mdcr_el3, %[x]" : : [x] "r" (x));
 }
 
-static inline void
-sysreg_write_hcr_el2(uint64_t x) {
-    __asm volatile("msr hcr_el2, %[x]" : : [x] "r" (x));
-}
-
 static inline uint64_t
 sysreg_read_sctlr_el1(void) {
     uint64_t sctlr_el1;
@@ -369,20 +364,12 @@ sysreg_write_mair_el1(uint64_t x) {
     __asm volatile("msr mair_el1, %[x]" : : [x] "r" (x));
 }
 
-static inline void
-sysreg_write_spsr_el3(uint64_t x) {
-    __asm volatile("msr spsr_el3, %[x]" : : [x] "r" (x));
-}
 
 static inline void
 sysreg_write_elr_el3(uint64_t x) {
     __asm volatile("msr elr_el3, %[x]" : : [x] "r" (x));
 }
 
-static inline void
-sysreg_write_spsr_el2(uint64_t x) {
-    __asm volatile("msr spsr_el2, %[x]" : : [x] "r" (x));
-}
 
 static inline void
 sysreg_write_elr_el2(uint64_t x) {