Home | History | Annotate | Line # | Download | only in include
armreg.h revision 1.10
      1 /* $NetBSD: armreg.h,v 1.10 2018/05/14 17:15:54 joerg Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2014 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Matt Thomas of 3am Software Foundry.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #ifndef _AARCH64_ARMREG_H_
     33 #define _AARCH64_ARMREG_H_
     34 
     35 #include <arm/cputypes.h>
     36 #include <sys/types.h>
     37 
     38 #define AARCH64REG_READ_INLINE2(regname, regdesc)		\
     39 static uint64_t inline						\
     40 reg_##regname##_read(void)					\
     41 {								\
     42 	uint64_t __rv;						\
     43 	__asm __volatile("mrs %0, " #regdesc : "=r"(__rv));	\
     44 	return __rv;						\
     45 }
     46 
     47 #define AARCH64REG_WRITE_INLINE2(regname, regdesc)		\
     48 static void inline						\
     49 reg_##regname##_write(uint64_t __val)				\
     50 {								\
     51 	__asm __volatile("msr " #regdesc ", %0" :: "r"(__val));	\
     52 }
     53 
     54 #define AARCH64REG_WRITEIMM_INLINE2(regname, regdesc)		\
     55 static void inline						\
     56 reg_##regname##_write(uint64_t __val)				\
     57 {								\
     58 	__asm __volatile("msr " #regdesc ", %0" :: "n"(__val));	\
     59 }
     60 
     61 #define AARCH64REG_READ_INLINE(regname)				\
     62 	AARCH64REG_READ_INLINE2(regname, regname)
     63 
     64 #define AARCH64REG_WRITE_INLINE(regname)			\
     65 	AARCH64REG_WRITE_INLINE2(regname, regname)
     66 
     67 #define AARCH64REG_WRITEIMM_INLINE(regname)			\
     68 	AARCH64REG_WRITEIMM_INLINE2(regname, regname)
     69 /*
     70  * System registers available at EL0 (user)
     71  */
     72 AARCH64REG_READ_INLINE(ctr_el0)		// Cache Type Register
     73 
     74 static const uintmax_t
     75    CTR_EL0_CWG_LINE	= __BITS(27,24), // Cacheback Writeback Granule
     76    CTR_EL0_ERG_LINE	= __BITS(23,20), // Exclusives Reservation Granule
     77    CTR_EL0_DMIN_LINE	= __BITS(19,16), // Dcache MIN LINE size (log2 - 2)
     78    CTR_EL0_L1IP_MASK	= __BITS(15,14),
     79    CTR_EL0_L1IP_AIVIVT	= 1, // ASID-tagged Virtual Index, Virtual Tag
     80    CTR_EL0_L1IP_VIPT	= 2, // Virtual Index, Physical Tag
     81    CTR_EL0_L1IP_PIPT	= 3, // Physical Index, Physical Tag
     82    CTR_EL0_IMIN_LINE	= __BITS(3,0); // Icache MIN LINE size (log2 - 2)
     83 
     84 AARCH64REG_READ_INLINE(dczid_el0)	// Data Cache Zero ID Register
     85 
     86 static const uintmax_t
     87     DCZID_DZP = __BIT(4),	// Data Zero Prohibited
     88     DCZID_BS  = __BITS(3,0);	// Block Size (log2 - 2)
     89 
     90 AARCH64REG_READ_INLINE(fpcr)		// Floating Point Control Register
     91 AARCH64REG_WRITE_INLINE(fpcr)
     92 
     93 static const uintmax_t
     94     FPCR_AHP    = __BIT(26),	// Alternative Half Precision
     95     FPCR_DN     = __BIT(25),	// Default Nan Control
     96     FPCR_FZ     = __BIT(24),	// Flush-To-Zero
     97     FPCR_RMODE  = __BITS(23,22),// Rounding Mode
     98      FPCR_RN     = 0,		//  Round Nearest
     99      FPCR_RP     = 1,		//  Round towards Plus infinity
    100      FPCR_RM     = 2,		//  Round towards Minus infinity
    101      FPCR_RZ     = 3,		//  Round towards Zero
    102     FPCR_STRIDE = __BITS(21,20),
    103     FPCR_LEN    = __BITS(18,16),
    104     FPCR_IDE    = __BIT(15),	// Input Denormal Exception enable
    105     FPCR_IXE    = __BIT(12),	// IneXact Exception enable
    106     FPCR_UFE    = __BIT(11),	// UnderFlow Exception enable
    107     FPCR_OFE    = __BIT(10),	// OverFlow Exception enable
    108     FPCR_DZE    = __BIT(9),	// Divide by Zero Exception enable
    109     FPCR_IOE    = __BIT(8),	// Invalid Operation Exception enable
    110     FPCR_ESUM   = 0x1F00;
    111 
    112 AARCH64REG_READ_INLINE(fpsr)		// Floating Point Status Register
    113 AARCH64REG_WRITE_INLINE(fpsr)
    114 
    115 static const uintmax_t
    116     FPSR_N32  = __BIT(31), // AARCH32 Negative
    117     FPSR_Z32  = __BIT(30), // AARCH32 Zero
    118     FPSR_C32  = __BIT(29), // AARCH32 Carry
    119     FPSR_V32  = __BIT(28), // AARCH32 Overflow
    120     FPSR_QC   = __BIT(27), // SIMD Saturation
    121     FPSR_IDC  = __BIT(7), // Input Denormal Cumulative status
    122     FPSR_IXC  = __BIT(4), // IneXact Cumulative status
    123     FPSR_UFC  = __BIT(3), // UnderFlow Cumulative status
    124     FPSR_OFC  = __BIT(2), // OverFlow Cumulative status
    125     FPSR_DZC  = __BIT(1), // Divide by Zero Cumulative status
    126     FPSR_IOC  = __BIT(0), // Invalid Operation Cumulative status
    127     FPSR_CSUM = 0x1F;
    128 
    129 AARCH64REG_READ_INLINE(nzcv)		// condition codes
    130 AARCH64REG_WRITE_INLINE(nzcv)
    131 
    132 static const uintmax_t
    133     NZCV_N = __BIT(31), // Negative
    134     NZCV_Z = __BIT(30), // Zero
    135     NZCV_C = __BIT(29), // Carry
    136     NZCV_V = __BIT(28); // Overflow
    137 
    138 AARCH64REG_READ_INLINE(tpidr_el0)	// Thread Pointer ID Register (RW)
    139 AARCH64REG_WRITE_INLINE(tpidr_el0)
    140 
    141 AARCH64REG_READ_INLINE(tpidrro_el0)	// Thread Pointer ID Register (RO)
    142 
    143 /*
    144  * From here on, these can only be accessed at EL1 (kernel)
    145  */
    146 
    147 /*
    148  * These are readonly registers
    149  */
    150 AARCH64REG_READ_INLINE(aidr_el1)
    151 
    152 AARCH64REG_READ_INLINE2(cbar_el1, s3_1_c15_c3_0)	 // Cortex-A57
    153 
    154 static const uintmax_t CBAR_PA = __BITS(47,18);
    155 
    156 AARCH64REG_READ_INLINE(ccsidr_el1)
    157 
    158 static const uintmax_t
    159     CCSIDR_WT		= __BIT(31),	// Write-through supported
    160     CCSIDR_WB		= __BIT(30),	// Write-back supported
    161     CCSIDR_RA		= __BIT(29),	// Read-allocation supported
    162     CCSIDR_WA		= __BIT(28),	// Write-allocation supported
    163     CCSIDR_NUMSET	= __BITS(27,13),// (Number of sets in cache) - 1
    164     CCSIDR_ASSOC	= __BITS(12,3),	// (Associativity of cache) - 1
    165     CCSIDR_LINESIZE	= __BITS(2,0);	// Number of bytes in cache line
    166 
    167 AARCH64REG_READ_INLINE(clidr_el1)
    168 
    169 static const uintmax_t
    170     CLIDR_LOUU   = __BITS(29,27),	// Level of Unification Uniprocessor
    171     CLIDR_LOC    = __BITS(26,24),	// Level of Coherency
    172     CLIDR_LOUIS  = __BITS(23,21),	// Level of Unification InnerShareable*/
    173     CLIDR_CTYPE7 = __BITS(20,18),	// Cache Type field for level7
    174     CLIDR_CTYPE6 = __BITS(17,15),	// Cache Type field for level6
    175     CLIDR_CTYPE5 = __BITS(14,12),	// Cache Type field for level5
    176     CLIDR_CTYPE4 = __BITS(11,9),	// Cache Type field for level4
    177     CLIDR_CTYPE3 = __BITS(8,6),		// Cache Type field for level3
    178     CLIDR_CTYPE2 = __BITS(5,3),		// Cache Type field for level2
    179     CLIDR_CTYPE1 = __BITS(2,0),		// Cache Type field for level1
    180      CLIDR_TYPE_NOCACHE		= 0,	// No cache
    181      CLIDR_TYPE_ICACHE		= 1,	// Instruction cache only
    182      CLIDR_TYPE_DCACHE		= 2,	// Data cache only
    183      CLIDR_TYPE_IDCACHE		= 3,	// Separate inst and data caches
    184      CLIDR_TYPE_UNIFIEDCACHE	= 4;	// Unified cache
    185 
    186 AARCH64REG_READ_INLINE(currentel)
    187 AARCH64REG_READ_INLINE(id_aa64afr0_el1)
    188 AARCH64REG_READ_INLINE(id_aa64afr1_el1)
    189 AARCH64REG_READ_INLINE(id_aa64dfr0_el1)
    190 
    191 static const uintmax_t
    192     ID_AA64DFR0_EL1_CTX_CMPS	= __BITS(31,28),
    193     ID_AA64DFR0_EL1_WRPS	= __BITS(20,23),
    194     ID_AA64DFR0_EL1_BRPS	= __BITS(12,15),
    195     ID_AA64DFR0_EL1_PMUVER	= __BITS(8,11),
    196      ID_AA64DFR0_EL1_PMUVER_NONE	= 0,
    197      ID_AA64DFR0_EL1_PMUVER_V3		= 1,
    198      ID_AA64DFR0_EL1_PMUVER_NOV3	= 2,
    199     ID_AA64DFR0_EL1_TRACEVER	= __BITS(4,7),
    200      ID_AA64DFR0_EL1_TRACEVER_NONE	= 0,
    201      ID_AA64DFR0_EL1_TRACEVER_IMPL	= 1,
    202     ID_AA64DFR0_EL1_DEBUGVER	= __BITS(0,3),
    203      ID_AA64DFR0_EL1_DEBUGVER_V8A	= 6;
    204 
    205 AARCH64REG_READ_INLINE(id_aa64dfr1_el1)
    206 
    207 AARCH64REG_READ_INLINE(id_aa64isar0_el1)
    208 
    209 static const uintmax_t
    210     ID_AA64ISAR0_EL1_CRC32	= __BITS(19,16),
    211      ID_AA64ISAR0_EL1_CRC32_NONE	= 0,
    212      ID_AA64ISAR0_EL1_CRC32_CRC32X	= 1,
    213     ID_AA64ISAR0_EL1_SHA2	= __BITS(15,12),
    214      ID_AA64ISAR0_EL1_SHA2_NONE		= 0,
    215      ID_AA64ISAR0_EL1_SHA2_SHA256HSU	= 1,
    216     ID_AA64ISAR0_EL1_SHA1	= __BITS(11,8),
    217      ID_AA64ISAR0_EL1_SHA1_NONE		= 0,
    218      ID_AA64ISAR0_EL1_SHA1_SHA1CPMHSU	= 1,
    219     ID_AA64ISAR0_EL1_AES	= __BITS(7,4),
    220      ID_AA64ISAR0_EL1_AES_NONE		= 0,
    221      ID_AA64ISAR0_EL1_AES_AES		= 1,
    222      ID_AA64ISAR0_EL1_AES_PMUL		= 2;
    223 
    224 AARCH64REG_READ_INLINE(id_aa64isar1_el1)
    225 AARCH64REG_READ_INLINE(id_aa64mmfr0_el1)
    226 
    227 static const uintmax_t
    228     ID_AA64MMFR0_EL1_TGRAN4	= __BITS(31,28),
    229      ID_AA64MMFR0_EL1_TGRAN4_4KB	= 0,
    230      ID_AA64MMFR0_EL1_TGRAN4_NONE	= 15,
    231     ID_AA64MMFR0_EL1_TGRAN64	= __BITS(24,27),
    232      ID_AA64MMFR0_EL1_TGRAN64_64KB	= 0,
    233      ID_AA64MMFR0_EL1_TGRAN64_NONE	= 15,
    234     ID_AA64MMFR0_EL1_TGRAN16	= __BITS(20,23),
    235      ID_AA64MMFR0_EL1_TGRAN16_NONE	= 0,
    236      ID_AA64MMFR0_EL1_TGRAN16_16KB	= 1,
    237     ID_AA64MMFR0_EL1_BIGENDEL0	= __BITS(16,19),
    238      ID_AA64MMFR0_EL1_BIGENDEL0_NONE	= 0,
    239      ID_AA64MMFR0_EL1_BIGENDEL0_MIX	= 1,
    240     ID_AA64MMFR0_EL1_SNSMEM	= __BITS(12,15),
    241      ID_AA64MMFR0_EL1_SNSMEM_NONE	= 0,
    242      ID_AA64MMFR0_EL1_SNSMEM_SNSMEM	= 1,
    243     ID_AA64MMFR0_EL1_BIGEND	= __BITS(8,11),
    244      ID_AA64MMFR0_EL1_BIGEND_NONE	= 0,
    245      ID_AA64MMFR0_EL1_BIGEND_MIX	= 1,
    246     ID_AA64MMFR0_EL1_ASIDBITS	= __BITS(4,7),
    247      ID_AA64MMFR0_EL1_ASIDBITS_8BIT	= 0,
    248      ID_AA64MMFR0_EL1_ASIDBITS_16BIT	= 2,
    249     ID_AA64MMFR0_EL1_PARANGE	= __BITS(0,3),
    250      ID_AA64MMFR0_EL1_PARANGE_4G	= 0,
    251      ID_AA64MMFR0_EL1_PARANGE_64G	= 1,
    252      ID_AA64MMFR0_EL1_PARANGE_1T	= 2,
    253      ID_AA64MMFR0_EL1_PARANGE_4T	= 3,
    254      ID_AA64MMFR0_EL1_PARANGE_16T	= 4,
    255      ID_AA64MMFR0_EL1_PARANGE_256T	= 5;
    256 
    257 AARCH64REG_READ_INLINE(id_aa64mmfr1_el1)
    258 AARCH64REG_READ_INLINE(id_aa64pfr0_el1)
    259 AARCH64REG_READ_INLINE(id_aa64pfr1_el1)
    260 AARCH64REG_READ_INLINE(id_pfr1_el1)
    261 AARCH64REG_READ_INLINE(isr_el1)
    262 AARCH64REG_READ_INLINE(midr_el1)
    263 AARCH64REG_READ_INLINE(mpidr_el1)
    264 
    265 static const uintmax_t
    266     MPIDR_AFF3		= __BITS(32,39),
    267     MPIDR_U		= __BIT(30),		// 1 = Uni-Processor System
    268     MPIDR_MT		= __BIT(24),		// 1 = SMT(AFF0 is logical)
    269     MPIDR_AFF2		= __BITS(16,23),
    270     MPIDR_AFF1		= __BITS(8,15),
    271     MPIDR_AFF0		= __BITS(0,7);
    272 
    273 AARCH64REG_READ_INLINE(mvfr0_el1)
    274 
    275 static const uintmax_t
    276     MVFR0_FPROUND	= __BITS(31,28),
    277      MVFR0_FPROUND_NEAREST	= 0,
    278      MVFR0_FPROUND_ALL		= 1,
    279     MVFR0_FPSHVEC	= __BITS(27,24),
    280      MVFR0_FPSHVEC_NONE		= 0,
    281      MVFR0_FPSHVEC_SHVEC	= 1,
    282     MVFR0_FPSQRT	= __BITS(23,20),
    283      MVFR0_FPSQRT_NONE		= 0,
    284      MVFR0_FPSQRT_VSQRT		= 1,
    285     MVFR0_FPDIVIDE	= __BITS(19,16),
    286      MVFR0_FPDIVIDE_NONE	= 0,
    287      MVFR0_FPDIVIDE_VDIV	= 1,
    288     MVFR0_FPTRAP	= __BITS(15,12),
    289      MVFR0_FPTRAP_NONE		= 0,
    290      MVFR0_FPTRAP_TRAP		= 1,
    291     MVFR0_FPDP		= __BITS(11,8),
    292      MVFR0_FPDP_NONE		= 0,
    293      MVFR0_FPDP_VFPV2		= 1,
    294      MVFR0_FPDP_VFPV3		= 2,
    295     MVFR0_FPSP		= __BITS(7,4),
    296      MVFR0_FPSP_NONE		= 0,
    297      MVFR0_FPSP_VFPV2		= 1,
    298      MVFR0_FPSP_VFPV3		= 2,
    299     MVFR0_SIMDREG	= __BITS(3,0),
    300      MVFR0_SIMDREG_NONE		= 0,
    301      MVFR0_SIMDREG_16x64	= 1,
    302      MVFR0_SIMDREG_32x64	= 2;
    303 
    304 AARCH64REG_READ_INLINE(mvfr1_el1)
    305 
    306 static const uintmax_t
    307     MVFR1_SIMDFMAC	= __BITS(31,28),
    308      MVFR1_SIMDFMAC_NONE	= 0,
    309      MVFR1_SIMDFMAC_FMAC	= 1,
    310     MVFR1_FPHP		= __BITS(27,24),
    311      MVFR1_FPHP_NONE		= 0,
    312      MVFR1_FPHP_HALF_SINGLE	= 1,
    313      MVFR1_FPHP_HALF_DOUBLE	= 2,
    314     MVFR1_SIMDHP	= __BITS(23,20),
    315      MVFR1_SIMDHP_NONE		= 0,
    316      MVFR1_SIMDHP_HALF		= 1,
    317     MVFR1_SIMDSP	= __BITS(19,16),
    318      MVFR1_SIMDSP_NONE		= 0,
    319      MVFR1_SIMDSP_SINGLE	= 1,
    320     MVFR1_SIMDINT	= __BITS(15,12),
    321      MVFR1_SIMDINT_NONE		= 0,
    322      MVFR1_SIMDINT_INTEGER	= 1,
    323     MVFR1_SIMDLS	= __BITS(11,8),
    324      MVFR1_SIMDLS_NONE		= 0,
    325      MVFR1_SIMDLS_LOADSTORE	= 1,
    326     MVFR1_FPDNAN	= __BITS(7,4),
    327      MVFR1_FPDNAN_NONE		= 0,
    328      MVFR1_FPDNAN_NAN		= 1,
    329     MVFR1_FPFTZ		= __BITS(3,0),
    330      MVFR1_FPFTZ_NONE		= 0,
    331      MVFR1_FPFTZ_DENORMAL	= 1;
    332 
    333 AARCH64REG_READ_INLINE(mvfr2_el1)
    334 
    335 static const uintmax_t
    336     MVFR2_FPMISC	= __BITS(7,4),
    337      MVFR2_FPMISC_NONE		= 0,
    338      MVFR2_FPMISC_SEL		= 1,
    339      MVFR2_FPMISC_DROUND	= 2,
    340      MVFR2_FPMISC_ROUNDINT	= 3,
    341      MVFR2_FPMISC_MAXMIN	= 4,
    342     MVFR2_SIMDMISC	= __BITS(3,0),
    343      MVFR2_SIMDMISC_NONE	= 0,
    344      MVFR2_SIMDMISC_DROUND	= 1,
    345      MVFR2_SIMDMISC_ROUNDINT	= 2,
    346      MVFR2_SIMDMISC_MAXMIN	= 3;
    347 
    348 AARCH64REG_READ_INLINE(revidr_el1)
    349 
    350 /*
    351  * These are read/write registers
    352  */
    353 AARCH64REG_READ_INLINE(cpacr_el1)	// Coprocessor Access Control Regiser
    354 AARCH64REG_WRITE_INLINE(cpacr_el1)
    355 
    356 static const uintmax_t
    357     CPACR_TTA		= __BIT(28),	 // System Register Access Traps
    358     CPACR_FPEN		= __BITS(21,20),
    359     CPACR_FPEN_NONE	= __SHIFTIN(0, CPACR_FPEN),
    360     CPACR_FPEN_EL1	= __SHIFTIN(1, CPACR_FPEN),
    361     CPACR_FPEN_NONE_2	= __SHIFTIN(2, CPACR_FPEN),
    362     CPACR_FPEN_ALL	= __SHIFTIN(3, CPACR_FPEN);
    363 
    364 AARCH64REG_READ_INLINE(csselr_el1)	// Cache Size Selection Register
    365 AARCH64REG_WRITE_INLINE(csselr_el1)
    366 
    367 static const uintmax_t
    368     CSSELR_LEVEL	= __BITS(3,1),	// Cache level of required cache
    369     CSSELR_IND		= __BIT(0);	// Instruction not Data bit
    370 
    371 AARCH64REG_READ_INLINE(daif)		// Debug Async Irq Fiq mask register
    372 AARCH64REG_WRITE_INLINE(daif)
    373 AARCH64REG_WRITEIMM_INLINE(daifclr)
    374 AARCH64REG_WRITEIMM_INLINE(daifset)
    375 
    376 static const uintmax_t
    377     DAIF_D		= __BIT(9),	// Debug Exception Mask
    378     DAIF_A		= __BIT(8),	// SError Abort Mask
    379     DAIF_I		= __BIT(7),	// IRQ Mask
    380     DAIF_F		= __BIT(6),	// FIQ Mask
    381     DAIF_SETCLR_SHIFT	= 6;		// for daifset/daifclr #imm shift
    382 
    383 AARCH64REG_READ_INLINE(elr_el1)		// Exception Link Register
    384 AARCH64REG_WRITE_INLINE(elr_el1)
    385 
    386 AARCH64REG_READ_INLINE(esr_el1)		// Exception Symdrone Register
    387 AARCH64REG_WRITE_INLINE(esr_el1)
    388 
    389 static const uintmax_t
    390     ESR_EC = 		__BITS(31,26), // Exception Cause
    391      ESR_EC_UNKNOWN		= 0x00,	// AXX: Unknown Reason
    392      ESR_EC_WFX			= 0x01,	// AXX: WFI or WFE instruction execution
    393      ESR_EC_CP15_RT		= 0x03,	// A32: MCR/MRC access to CP15 !EC=0
    394      ESR_EC_CP15_RRT		= 0x04,	// A32: MCRR/MRRC access to CP15 !EC=0
    395      ESR_EC_CP14_RT		= 0x05,	// A32: MCR/MRC access to CP14
    396      ESR_EC_CP14_DT		= 0x06,	// A32: LDC/STC access to CP14
    397      ESR_EC_FP_ACCESS		= 0x07,	// AXX: Access to SIMD/FP Registers
    398      ESR_EC_FPID		= 0x08,	// A32: MCR/MRC access to CP10 !EC=7
    399      ESR_EC_CP14_RRT		= 0x0c,	// A32: MRRC access to CP14
    400      ESR_EC_ILL_STATE		= 0x0e,	// AXX: Illegal Execution State
    401      ESR_EC_SVC_A32		= 0x11,	// A32: SVC Instruction Execution
    402      ESR_EC_HVC_A32		= 0x12,	// A32: HVC Instruction Execution
    403      ESR_EC_SMC_A32		= 0x13,	// A32: SMC Instruction Execution
    404      ESR_EC_SVC_A64		= 0x15,	// A64: SVC Instruction Execution
    405      ESR_EC_HVC_A64		= 0x16,	// A64: HVC Instruction Execution
    406      ESR_EC_SMC_A64		= 0x17,	// A64: SMC Instruction Execution
    407      ESR_EC_SYS_REG		= 0x18,	// A64: MSR/MRS/SYS instruction (!EC0/1/7)
    408      ESR_EC_INSN_ABT_EL0	= 0x20, // AXX: Instruction Abort (EL0)
    409      ESR_EC_INSN_ABT_EL1	= 0x21, // AXX: Instruction Abort (EL1)
    410      ESR_EC_PC_ALIGNMENT	= 0x22, // AXX: Misaligned PC
    411      ESR_EC_DATA_ABT_EL0	= 0x24, // AXX: Data Abort (EL0)
    412      ESR_EC_DATA_ABT_EL1	= 0x25, // AXX: Data Abort (EL1)
    413      ESR_EC_SP_ALIGNMENT	= 0x26, // AXX: Misaligned SP
    414      ESR_EC_FP_TRAP_A32		= 0x28,	// A32: FP Exception
    415      ESR_EC_FP_TRAP_A64		= 0x2c,	// A64: FP Exception
    416      ESR_EC_SERROR		= 0x2f,	// AXX: SError Interrupt
    417      ESR_EC_BRKPNT_EL0		= 0x30,	// AXX: Breakpoint Exception (EL0)
    418      ESR_EC_BRKPNT_EL1		= 0x31,	// AXX: Breakpoint Exception (EL1)
    419      ESR_EC_SW_STEP_EL0		= 0x32,	// AXX: Software Step (EL0)
    420      ESR_EC_SW_STEP_EL1		= 0x33,	// AXX: Software Step (EL1)
    421      ESR_EC_WTCHPNT_EL0		= 0x34,	// AXX: Watchpoint (EL0)
    422      ESR_EC_WTCHPNT_EL1		= 0x35,	// AXX: Watchpoint (EL1)
    423      ESR_EC_BKPT_INSN_A32 = 0x38,	// A32: BKPT Instruction Execution
    424      ESR_EC_VECTOR_CATCH = 0x3a,	// A32: Vector Catch Exception
    425      ESR_EC_BKPT_INSN_A64 = 0x3c,	// A64: BKPT Instruction Execution
    426     ESR_IL = 		__BIT(25), // Instruction Length (1=32-bit)
    427     ESR_ISS = 		__BITS(24,0), // Instruction Specific Syndrome
    428     ESR_ISS_CV =		__BIT(24),	// common
    429     ESR_ISS_COND =		__BITS(23,20),	// common
    430     ESR_ISS_WFX_TRAP_INSN =	__BIT(0),	// for ESR_EC_WFX
    431     ESR_ISS_MRC_OPC2 =		__BITS(19,17),	// for ESR_EC_CP15_RT
    432     ESR_ISS_MRC_OPC1 =		__BITS(16,14),	// for ESR_EC_CP15_RT
    433     ESR_ISS_MRC_CRN =		__BITS(13,10),	// for ESR_EC_CP15_RT
    434     ESR_ISS_MRC_RT =		__BITS(9,5),	// for ESR_EC_CP15_RT
    435     ESR_ISS_MRC_CRM =		__BITS(4,1),	// for ESR_EC_CP15_RT
    436     ESR_ISS_MRC_DIRECTION =	__BIT(0),	// for ESR_EC_CP15_RT
    437     ESR_ISS_MCRR_OPC1 =		__BITS(19,16),	// for ESR_EC_CP15_RRT
    438     ESR_ISS_MCRR_RT2 =		__BITS(14,10),	// for ESR_EC_CP15_RRT
    439     ESR_ISS_MCRR_RT =		__BITS(9,5),	// for ESR_EC_CP15_RRT
    440     ESR_ISS_MCRR_CRM =		__BITS(4,1),	// for ESR_EC_CP15_RRT
    441     ESR_ISS_MCRR_DIRECTION =	__BIT(0),	// for ESR_EC_CP15_RRT
    442     ESR_ISS_HVC_IMM16 =		__BITS(15,0),	// for ESR_EC_{SVC,HVC}
    443     // ...
    444     ESR_ISS_INSNABORT_EA =	__BIT(9),	// for ESC_RC_INSN_ABT_EL[01]
    445     ESR_ISS_INSNABORT_S1PTW =	__BIT(7),	// for ESC_RC_INSN_ABT_EL[01]
    446     ESR_ISS_INSNABORT_IFSC =	__BITS(0,5),	// for ESC_RC_INSN_ABT_EL[01]
    447     ESR_ISS_DATAABORT_ISV =	__BIT(24),	// for ESC_RC_DATA_ABT_EL[01]
    448     ESR_ISS_DATAABORT_SAS =	__BITS(23,22),	// for ESC_RC_DATA_ABT_EL[01]
    449     ESR_ISS_DATAABORT_SSE =	__BIT(21),	// for ESC_RC_DATA_ABT_EL[01]
    450     ESR_ISS_DATAABORT_SRT =	__BITS(19,16),	// for ESC_RC_DATA_ABT_EL[01]
    451     ESR_ISS_DATAABORT_SF =	__BIT(15),	// for ESC_RC_DATA_ABT_EL[01]
    452     ESR_ISS_DATAABORT_AR =	__BIT(14),	// for ESC_RC_DATA_ABT_EL[01]
    453     ESR_ISS_DATAABORT_EA =	__BIT(9),	// for ESC_RC_DATA_ABT_EL[01]
    454     ESR_ISS_DATAABORT_CM =	__BIT(8),	// for ESC_RC_DATA_ABT_EL[01]
    455     ESR_ISS_DATAABORT_S1PTW =	__BIT(7),	// for ESC_RC_DATA_ABT_EL[01]
    456     ESR_ISS_DATAABORT_WnR =	__BIT(6),	// for ESC_RC_DATA_ABT_EL[01]
    457     ESR_ISS_DATAABORT_DFSC =	__BITS(0,5);	// for ESC_RC_DATA_ABT_EL[01]
    458 
    459 static const uintmax_t	// ESR_ISS_{INSN,DATA}ABORT_FSC
    460     ESR_ISS_FSC_ADDRESS_SIZE_FAULT_0		= 0x00,
    461     ESR_ISS_FSC_ADDRESS_SIZE_FAULT_1		= 0x01,
    462     ESR_ISS_FSC_ADDRESS_SIZE_FAULT_2		= 0x02,
    463     ESR_ISS_FSC_ADDRESS_SIZE_FAULT_3		= 0x03,
    464     ESR_ISS_FSC_TRANSLATION_FAULT_0		= 0x04,
    465     ESR_ISS_FSC_TRANSLATION_FAULT_1		= 0x05,
    466     ESR_ISS_FSC_TRANSLATION_FAULT_2		= 0x06,
    467     ESR_ISS_FSC_TRANSLATION_FAULT_3		= 0x07,
    468     ESR_ISS_FSC_ACCESS_FAULT_0			= 0x08,
    469     ESR_ISS_FSC_ACCESS_FAULT_1			= 0x09,
    470     ESR_ISS_FSC_ACCESS_FAULT_2			= 0x0a,
    471     ESR_ISS_FSC_ACCESS_FAULT_3			= 0x0b,
    472     ESR_ISS_FSC_PERM_FAULT_0			= 0x0c,
    473     ESR_ISS_FSC_PERM_FAULT_1			= 0x0d,
    474     ESR_ISS_FSC_PERM_FAULT_2			= 0x0e,
    475     ESR_ISS_FSC_PERM_FAULT_3			= 0x0f,
    476     ESR_ISS_FSC_SYNC_EXTERNAL_ABORT		= 0x10,
    477     ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_0	= 0x14,
    478     ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_1	= 0x15,
    479     ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_2	= 0x16,
    480     ESR_ISS_FSC_SYNC_EXTERNAL_ABORT_TTWALK_3	= 0x17,
    481     ESR_ISS_FSC_SYNC_PARITY_ERROR		= 0x18,
    482     ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_0	= 0x1c,
    483     ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_1	= 0x1d,
    484     ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_2	= 0x1e,
    485     ESR_ISS_FSC_SYNC_PARITY_ERROR_ON_TTWALK_3	= 0x1f,
    486     ESR_ISS_FSC_ALIGNMENT_FAULT			= 0x21,
    487     ESR_ISS_FSC_TLB_CONFLICT_FAULT		= 0x30,
    488     ESR_ISS_FSC_LOCKDOWN_ABORT			= 0x34,
    489     ESR_ISS_FSC_UNSUPPORTED_EXCLUSIVE		= 0x35,
    490     ESR_ISS_FSC_FIRST_LEVEL_DOMAIN_FAULT	= 0x3d,
    491     ESR_ISS_FSC_SECOND_LEVEL_DOMAIN_FAULT	= 0x3e;
    492 
    493 
    494 AARCH64REG_READ_INLINE(far_el1)		// Fault Address Register
    495 AARCH64REG_WRITE_INLINE(far_el1)
    496 
    497 AARCH64REG_READ_INLINE2(l2ctlr_el1, s3_1_c11_c0_2)  // Cortex-A53,57,72,73
    498 AARCH64REG_WRITE_INLINE2(l2ctlr_el1, s3_1_c11_c0_2) // Cortex-A53,57,72,73
    499 
    500 static const uintmax_t
    501     L2CTLR_NUMOFCORE		= __BITS(25,24),// Number of cores
    502     L2CTLR_CPUCACHEPROT		= __BIT(22),	// CPU Cache Protection
    503     L2CTLR_SCUL2CACHEPROT	= __BIT(21),	// SCU-L2 Cache Protection
    504     L2CTLR_L2_INPUT_LATENCY	= __BIT(5),	// L2 Data RAM input latency
    505     L2CTLR_L2_OUTPUT_LATENCY	= __BIT(0);	// L2 Data RAM output latency
    506 
    507 AARCH64REG_READ_INLINE(mair_el1) // Memory Attribute Indirection Register
    508 AARCH64REG_WRITE_INLINE(mair_el1)
    509 
    510 static const uintmax_t
    511     MAIR_ATTR0		= __BITS(7,0),
    512     MAIR_ATTR1		= __BITS(15,8),
    513     MAIR_ATTR2		= __BITS(23,16),
    514     MAIR_ATTR3		= __BITS(31,24),
    515     MAIR_ATTR4		= __BITS(39,32),
    516     MAIR_ATTR5		= __BITS(47,40),
    517     MAIR_ATTR6		= __BITS(55,48),
    518     MAIR_ATTR7		= __BITS(63,56),
    519     MAIR_DEVICE_nGnRnE	= 0x00,	// NoGathering,NoReordering,NoEarlyWriteAck.
    520     MAIR_NORMAL_NC	= 0x44,
    521     MAIR_NORMAL_WT	= 0xbb,
    522     MAIR_NORMAL_WB	= 0xff;
    523 
    524 AARCH64REG_READ_INLINE(par_el1)		// Physical Address Register
    525 AARCH64REG_WRITE_INLINE(par_el1)
    526 
    527 static const uintmax_t
    528     PAR_ATTR		= __BITS(63,56),// F=0 memory attributes
    529     PAR_PA		= __BITS(47,12),// F=0 physical address
    530     PAR_NS		= __BIT(9),	// F=0 non-secure
    531     PAR_S		= __BIT(9),	// F=1 failure stage
    532     PAR_SHA		= __BITS(8,7),	// F=0 shareability attribute
    533      PAR_SHA_NONE	= 0,
    534      PAR_SHA_OUTER	= 2,
    535      PAR_SHA_INNER	= 3,
    536     PAR_PTW		= __BIT(8),	// F=1 partial table walk
    537     PAR_FST		= __BITS(6,1),	// F=1 fault status code
    538     PAR_F		= __BIT(0);	// translation failed
    539 
    540 AARCH64REG_READ_INLINE(rmr_el1)		// Reset Management Register
    541 AARCH64REG_WRITE_INLINE(rmr_el1)
    542 
    543 AARCH64REG_READ_INLINE(rvbar_el1)	// Reset Vector Base Address Register
    544 AARCH64REG_WRITE_INLINE(rvbar_el1)
    545 
    546 AARCH64REG_READ_INLINE(sctlr_el1)	// System Control Register
    547 AARCH64REG_WRITE_INLINE(sctlr_el1)
    548 
    549 static const uintmax_t
    550     SCTLR_RES0		= 0xc8222400,	// Reserved ARMv8.0, write 0
    551     SCTLR_RES1		= 0x30d00800,	// Reserved ARMv8.0, write 1
    552     SCTLR_M		= __BIT(0),
    553     SCTLR_A		= __BIT(1),
    554     SCTLR_C		= __BIT(2),
    555     SCTLR_SA		= __BIT(3),
    556     SCTLR_SA0		= __BIT(4),
    557     SCTLR_CP15BEN	= __BIT(5),
    558     SCTLR_THEE		= __BIT(6),
    559     SCTLR_ITD		= __BIT(7),
    560     SCTLR_SED		= __BIT(8),
    561     SCTLR_UMA		= __BIT(9),
    562     SCTLR_I		= __BIT(12),
    563     SCTLR_DZE		= __BIT(14),
    564     SCTLR_UCT		= __BIT(15),
    565     SCTLR_nTWI		= __BIT(16),
    566     SCTLR_nTWE		= __BIT(18),
    567     SCTLR_WXN		= __BIT(19),
    568     SCTLR_IESB		= __BIT(21),
    569     SCTLR_SPAN		= __BIT(23),
    570     SCTLR_EOE		= __BIT(24),
    571     SCTLR_EE		= __BIT(25),
    572     SCTLR_UCI		= __BIT(26),
    573     SCTLR_nTLSMD	= __BIT(28),
    574     SCTLR_LSMAOE	= __BIT(29);
    575 
    576 // current EL stack pointer
    577 static uint64_t inline
    578 reg_sp_read(void)
    579 {
    580 	uint64_t __rv;
    581 	__asm __volatile ("mov %0, sp" : "=r"(__rv));
    582 	return __rv;
    583 }
    584 
    585 AARCH64REG_READ_INLINE(sp_el0)		// EL0 Stack Pointer
    586 AARCH64REG_WRITE_INLINE(sp_el0)
    587 
    588 AARCH64REG_READ_INLINE(spsel)		// Stack Pointer Select
    589 AARCH64REG_WRITE_INLINE(spsel)
    590 
    591 static const uintmax_t
    592     SPSEL_SP		= __BIT(0);	// use SP_EL0 at all exception levels
    593 
    594 AARCH64REG_READ_INLINE(spsr_el1)	// Saved Program Status Register
    595 AARCH64REG_WRITE_INLINE(spsr_el1)
    596 
    597 static const uintmax_t
    598     SPSR_NZCV	  = __BITS(31,28),	// mask of N Z C V
    599      SPSR_N	  = __BIT(31),		// Negative
    600      SPSR_Z	  = __BIT(30),		// Zero
    601      SPSR_C	  = __BIT(29),		// Carry
    602      SPSR_V	  = __BIT(28),		// oVerflow
    603     SPSR_A32_Q	  = __BIT(27),		// A32: Overflow
    604     SPSR_A32_J	  = __BIT(24),		// A32: Jazelle Mode
    605     SPSR_A32_IT1  = __BIT(23),		// A32: IT[1]
    606     SPSR_A32_IT0  = __BIT(22),		// A32: IT[0]
    607     SPSR_SS	  = __BIT(21),		// Software Step
    608     SPSR_IL	  = __BIT(20),		// Instruction Length
    609     SPSR_GE	  = __BITS(19,16),	// A32: SIMD GE
    610     SPSR_IT7	  = __BIT(15),		// A32: IT[7]
    611     SPSR_IT6	  = __BIT(14),		// A32: IT[6]
    612     SPSR_IT5	  = __BIT(13),		// A32: IT[5]
    613     SPSR_IT4	  = __BIT(12),		// A32: IT[4]
    614     SPSR_IT3	  = __BIT(11),		// A32: IT[3]
    615     SPSR_IT2	  = __BIT(10),		// A32: IT[2]
    616     SPSR_A64_D	  = __BIT(9),		// A64: Debug Exception Mask
    617     SPSR_A32_E	  = __BIT(9),		// A32: BE Endian Mode
    618     SPSR_A	  = __BIT(8),		// Async abort (SError) Mask
    619     SPSR_I	  = __BIT(7),		// IRQ Mask
    620     SPSR_F	  = __BIT(6),		// FIQ Mask
    621     SPSR_A32_T	  = __BIT(5),		// A32 Thumb Mode
    622     SPSR_M	  = __BITS(4,0),	// Execution State
    623      SPSR_M_EL3H  = 0x0d,
    624      SPSR_M_EL3T  = 0x0c,
    625      SPSR_M_EL2H  = 0x09,
    626      SPSR_M_EL2T  = 0x08,
    627      SPSR_M_EL1H  = 0x05,
    628      SPSR_M_EL1T  = 0x04,
    629      SPSR_M_EL0T  = 0x00,
    630      SPSR_M_SYS32 = 0x1f,
    631      SPSR_M_UND32 = 0x1b,
    632      SPSR_M_ABT32 = 0x17,
    633      SPSR_M_SVC32 = 0x13,
    634      SPSR_M_IRQ32 = 0x12,
    635      SPSR_M_FIQ32 = 0x11,
    636      SPSR_M_USR32 = 0x10;
    637 
    638 AARCH64REG_READ_INLINE(tcr_el1)		// Translation Control Register
    639 AARCH64REG_WRITE_INLINE(tcr_el1)
    640 
    641 #define TCR_PAGE_SIZE1(tcr)	(1L << ((1L << __SHIFTOUT(tcr, TCR_TG1)) + 8))
    642 
    643 AARCH64REG_READ_INLINE(tpidr_el1)	// Thread ID Register (EL1)
    644 AARCH64REG_WRITE_INLINE(tpidr_el1)
    645 
    646 AARCH64REG_WRITE_INLINE(tpidrro_el0)	// Thread ID Register (RO for EL0)
    647 
    648 AARCH64REG_READ_INLINE(ttbr0_el1) // Translation Table Base Register 0 EL1
    649 AARCH64REG_WRITE_INLINE(ttbr0_el1)
    650 
    651 AARCH64REG_READ_INLINE(ttbr1_el1) // Translation Table Base Register 1 EL1
    652 AARCH64REG_WRITE_INLINE(ttbr1_el1)
    653 
    654 AARCH64REG_READ_INLINE(vbar_el1)	// Vector Base Address Register
    655 AARCH64REG_WRITE_INLINE(vbar_el1)
    656 
    657 /*
    658  * From here on, these are DEBUG registers
    659  */
    660 AARCH64REG_READ_INLINE(dbgbcr0_el1) // Debug Breakpoint Control Register 0
    661 AARCH64REG_WRITE_INLINE(dbgbcr0_el1)
    662 AARCH64REG_READ_INLINE(dbgbcr1_el1) // Debug Breakpoint Control Register 1
    663 AARCH64REG_WRITE_INLINE(dbgbcr1_el1)
    664 AARCH64REG_READ_INLINE(dbgbcr2_el1) // Debug Breakpoint Control Register 2
    665 AARCH64REG_WRITE_INLINE(dbgbcr2_el1)
    666 AARCH64REG_READ_INLINE(dbgbcr3_el1) // Debug Breakpoint Control Register 3
    667 AARCH64REG_WRITE_INLINE(dbgbcr3_el1)
    668 AARCH64REG_READ_INLINE(dbgbcr4_el1) // Debug Breakpoint Control Register 4
    669 AARCH64REG_WRITE_INLINE(dbgbcr4_el1)
    670 AARCH64REG_READ_INLINE(dbgbcr5_el1) // Debug Breakpoint Control Register 5
    671 AARCH64REG_WRITE_INLINE(dbgbcr5_el1)
    672 AARCH64REG_READ_INLINE(dbgbcr6_el1) // Debug Breakpoint Control Register 6
    673 AARCH64REG_WRITE_INLINE(dbgbcr6_el1)
    674 AARCH64REG_READ_INLINE(dbgbcr7_el1) // Debug Breakpoint Control Register 7
    675 AARCH64REG_WRITE_INLINE(dbgbcr7_el1)
    676 AARCH64REG_READ_INLINE(dbgbcr8_el1) // Debug Breakpoint Control Register 8
    677 AARCH64REG_WRITE_INLINE(dbgbcr8_el1)
    678 AARCH64REG_READ_INLINE(dbgbcr9_el1) // Debug Breakpoint Control Register 9
    679 AARCH64REG_WRITE_INLINE(dbgbcr9_el1)
    680 AARCH64REG_READ_INLINE(dbgbcr10_el1) // Debug Breakpoint Control Register 10
    681 AARCH64REG_WRITE_INLINE(dbgbcr10_el1)
    682 AARCH64REG_READ_INLINE(dbgbcr11_el1) // Debug Breakpoint Control Register 11
    683 AARCH64REG_WRITE_INLINE(dbgbcr11_el1)
    684 AARCH64REG_READ_INLINE(dbgbcr12_el1) // Debug Breakpoint Control Register 12
    685 AARCH64REG_WRITE_INLINE(dbgbcr12_el1)
    686 AARCH64REG_READ_INLINE(dbgbcr13_el1) // Debug Breakpoint Control Register 13
    687 AARCH64REG_WRITE_INLINE(dbgbcr13_el1)
    688 AARCH64REG_READ_INLINE(dbgbcr14_el1) // Debug Breakpoint Control Register 14
    689 AARCH64REG_WRITE_INLINE(dbgbcr14_el1)
    690 AARCH64REG_READ_INLINE(dbgbcr15_el1) // Debug Breakpoint Control Register 15
    691 AARCH64REG_WRITE_INLINE(dbgbcr15_el1)
    692 
    693 static const uintmax_t
    694     DBGBCR_BT		= __BITS(23,20),
    695     DBGBCR_LBN		= __BITS(19,16),
    696     DBGBCR_SSC		= __BITS(15,14),
    697     DBGBCR_HMC		= __BIT(13),
    698     DBGBCR_BAS		= __BITS(8,5),
    699     DBGBCR_PMC		= __BITS(2,1),
    700     DBGBCR_E		= __BIT(0);
    701 
    702 AARCH64REG_READ_INLINE(dbgbvr0_el1) // Debug Breakpoint Value Register 0
    703 AARCH64REG_WRITE_INLINE(dbgbvr0_el1)
    704 AARCH64REG_READ_INLINE(dbgbvr1_el1) // Debug Breakpoint Value Register 1
    705 AARCH64REG_WRITE_INLINE(dbgbvr1_el1)
    706 AARCH64REG_READ_INLINE(dbgbvr2_el1) // Debug Breakpoint Value Register 2
    707 AARCH64REG_WRITE_INLINE(dbgbvr2_el1)
    708 AARCH64REG_READ_INLINE(dbgbvr3_el1) // Debug Breakpoint Value Register 3
    709 AARCH64REG_WRITE_INLINE(dbgbvr3_el1)
    710 AARCH64REG_READ_INLINE(dbgbvr4_el1) // Debug Breakpoint Value Register 4
    711 AARCH64REG_WRITE_INLINE(dbgbvr4_el1)
    712 AARCH64REG_READ_INLINE(dbgbvr5_el1) // Debug Breakpoint Value Register 5
    713 AARCH64REG_WRITE_INLINE(dbgbvr5_el1)
    714 AARCH64REG_READ_INLINE(dbgbvr6_el1) // Debug Breakpoint Value Register 6
    715 AARCH64REG_WRITE_INLINE(dbgbvr6_el1)
    716 AARCH64REG_READ_INLINE(dbgbvr7_el1) // Debug Breakpoint Value Register 7
    717 AARCH64REG_WRITE_INLINE(dbgbvr7_el1)
    718 AARCH64REG_READ_INLINE(dbgbvr8_el1) // Debug Breakpoint Value Register 8
    719 AARCH64REG_WRITE_INLINE(dbgbvr8_el1)
    720 AARCH64REG_READ_INLINE(dbgbvr9_el1) // Debug Breakpoint Value Register 9
    721 AARCH64REG_WRITE_INLINE(dbgbvr9_el1)
    722 AARCH64REG_READ_INLINE(dbgbvr10_el1) // Debug Breakpoint Value Register 10
    723 AARCH64REG_WRITE_INLINE(dbgbvr10_el1)
    724 AARCH64REG_READ_INLINE(dbgbvr11_el1) // Debug Breakpoint Value Register 11
    725 AARCH64REG_WRITE_INLINE(dbgbvr11_el1)
    726 AARCH64REG_READ_INLINE(dbgbvr12_el1) // Debug Breakpoint Value Register 12
    727 AARCH64REG_WRITE_INLINE(dbgbvr12_el1)
    728 AARCH64REG_READ_INLINE(dbgbvr13_el1) // Debug Breakpoint Value Register 13
    729 AARCH64REG_WRITE_INLINE(dbgbvr13_el1)
    730 AARCH64REG_READ_INLINE(dbgbvr14_el1) // Debug Breakpoint Value Register 14
    731 AARCH64REG_WRITE_INLINE(dbgbvr14_el1)
    732 AARCH64REG_READ_INLINE(dbgbvr15_el1) // Debug Breakpoint Value Register 15
    733 AARCH64REG_WRITE_INLINE(dbgbvr15_el1)
    734 
    735 AARCH64REG_READ_INLINE(dbgwcr0_el1) // Debug Watchpoint Control Register 0
    736 AARCH64REG_WRITE_INLINE(dbgwcr0_el1)
    737 AARCH64REG_READ_INLINE(dbgwcr1_el1) // Debug Watchpoint Control Register 1
    738 AARCH64REG_WRITE_INLINE(dbgwcr1_el1)
    739 AARCH64REG_READ_INLINE(dbgwcr2_el1) // Debug Watchpoint Control Register 2
    740 AARCH64REG_WRITE_INLINE(dbgwcr2_el1)
    741 AARCH64REG_READ_INLINE(dbgwcr3_el1) // Debug Watchpoint Control Register 3
    742 AARCH64REG_WRITE_INLINE(dbgwcr3_el1)
    743 AARCH64REG_READ_INLINE(dbgwcr4_el1) // Debug Watchpoint Control Register 4
    744 AARCH64REG_WRITE_INLINE(dbgwcr4_el1)
    745 AARCH64REG_READ_INLINE(dbgwcr5_el1) // Debug Watchpoint Control Register 5
    746 AARCH64REG_WRITE_INLINE(dbgwcr5_el1)
    747 AARCH64REG_READ_INLINE(dbgwcr6_el1) // Debug Watchpoint Control Register 6
    748 AARCH64REG_WRITE_INLINE(dbgwcr6_el1)
    749 AARCH64REG_READ_INLINE(dbgwcr7_el1) // Debug Watchpoint Control Register 7
    750 AARCH64REG_WRITE_INLINE(dbgwcr7_el1)
    751 AARCH64REG_READ_INLINE(dbgwcr8_el1) // Debug Watchpoint Control Register 8
    752 AARCH64REG_WRITE_INLINE(dbgwcr8_el1)
    753 AARCH64REG_READ_INLINE(dbgwcr9_el1) // Debug Watchpoint Control Register 9
    754 AARCH64REG_WRITE_INLINE(dbgwcr9_el1)
    755 AARCH64REG_READ_INLINE(dbgwcr10_el1) // Debug Watchpoint Control Register 10
    756 AARCH64REG_WRITE_INLINE(dbgwcr10_el1)
    757 AARCH64REG_READ_INLINE(dbgwcr11_el1) // Debug Watchpoint Control Register 11
    758 AARCH64REG_WRITE_INLINE(dbgwcr11_el1)
    759 AARCH64REG_READ_INLINE(dbgwcr12_el1) // Debug Watchpoint Control Register 12
    760 AARCH64REG_WRITE_INLINE(dbgwcr12_el1)
    761 AARCH64REG_READ_INLINE(dbgwcr13_el1) // Debug Watchpoint Control Register 13
    762 AARCH64REG_WRITE_INLINE(dbgwcr13_el1)
    763 AARCH64REG_READ_INLINE(dbgwcr14_el1) // Debug Watchpoint Control Register 14
    764 AARCH64REG_WRITE_INLINE(dbgwcr14_el1)
    765 AARCH64REG_READ_INLINE(dbgwcr15_el1) // Debug Watchpoint Control Register 15
    766 AARCH64REG_WRITE_INLINE(dbgwcr15_el1)
    767 
    768 static const uintmax_t
    769     DBGWCR_MASK		= __BITS(28,24),
    770     DBGWCR_WT		= __BIT(20),
    771     DBGWCR_LBN		= __BITS(19,16),
    772     DBGWCR_SSC		= __BITS(15,14),
    773     DBGWCR_HMC		= __BIT(13),
    774     DBGWCR_BAS		= __BITS(12,5),
    775     DBGWCR_LSC		= __BITS(4,3),
    776     DBGWCR_PAC		= __BITS(2,1),
    777     DBGWCR_E		= __BIT(0);
    778 
    779 AARCH64REG_READ_INLINE(dbgwvr0_el1) // Debug Watchpoint Value Register 0
    780 AARCH64REG_WRITE_INLINE(dbgwvr0_el1)
    781 AARCH64REG_READ_INLINE(dbgwvr1_el1) // Debug Watchpoint Value Register 1
    782 AARCH64REG_WRITE_INLINE(dbgwvr1_el1)
    783 AARCH64REG_READ_INLINE(dbgwvr2_el1) // Debug Watchpoint Value Register 2
    784 AARCH64REG_WRITE_INLINE(dbgwvr2_el1)
    785 AARCH64REG_READ_INLINE(dbgwvr3_el1) // Debug Watchpoint Value Register 3
    786 AARCH64REG_WRITE_INLINE(dbgwvr3_el1)
    787 AARCH64REG_READ_INLINE(dbgwvr4_el1) // Debug Watchpoint Value Register 4
    788 AARCH64REG_WRITE_INLINE(dbgwvr4_el1)
    789 AARCH64REG_READ_INLINE(dbgwvr5_el1) // Debug Watchpoint Value Register 5
    790 AARCH64REG_WRITE_INLINE(dbgwvr5_el1)
    791 AARCH64REG_READ_INLINE(dbgwvr6_el1) // Debug Watchpoint Value Register 6
    792 AARCH64REG_WRITE_INLINE(dbgwvr6_el1)
    793 AARCH64REG_READ_INLINE(dbgwvr7_el1) // Debug Watchpoint Value Register 7
    794 AARCH64REG_WRITE_INLINE(dbgwvr7_el1)
    795 AARCH64REG_READ_INLINE(dbgwvr8_el1) // Debug Watchpoint Value Register 8
    796 AARCH64REG_WRITE_INLINE(dbgwvr8_el1)
    797 AARCH64REG_READ_INLINE(dbgwvr9_el1) // Debug Watchpoint Value Register 9
    798 AARCH64REG_WRITE_INLINE(dbgwvr9_el1)
    799 AARCH64REG_READ_INLINE(dbgwvr10_el1) // Debug Watchpoint Value Register 10
    800 AARCH64REG_WRITE_INLINE(dbgwvr10_el1)
    801 AARCH64REG_READ_INLINE(dbgwvr11_el1) // Debug Watchpoint Value Register 11
    802 AARCH64REG_WRITE_INLINE(dbgwvr11_el1)
    803 AARCH64REG_READ_INLINE(dbgwvr12_el1) // Debug Watchpoint Value Register 12
    804 AARCH64REG_WRITE_INLINE(dbgwvr12_el1)
    805 AARCH64REG_READ_INLINE(dbgwvr13_el1) // Debug Watchpoint Value Register 13
    806 AARCH64REG_WRITE_INLINE(dbgwvr13_el1)
    807 AARCH64REG_READ_INLINE(dbgwvr14_el1) // Debug Watchpoint Value Register 14
    808 AARCH64REG_WRITE_INLINE(dbgwvr14_el1)
    809 AARCH64REG_READ_INLINE(dbgwvr15_el1) // Debug Watchpoint Value Register 15
    810 AARCH64REG_WRITE_INLINE(dbgwvr15_el1)
    811 
    812 static const uintmax_t
    813     DBGWVR_MASK		= __BITS(64,3);
    814 
    815 
    816 AARCH64REG_READ_INLINE(mdscr_el1) // Monitor Debug System Control Register
    817 AARCH64REG_WRITE_INLINE(mdscr_el1)
    818 
    819 AARCH64REG_WRITE_INLINE(oslar_el1)	// OS Lock Access Register
    820 
    821 AARCH64REG_READ_INLINE(oslsr_el1)	// OS Lock Status Register
    822 
    823 /*
    824  * From here on, these are PMC registers
    825  */
    826 
    827 AARCH64REG_READ_INLINE(pmccfiltr_el0)
    828 AARCH64REG_WRITE_INLINE(pmccfiltr_el0)
    829 
    830 static const uintmax_t
    831     PMCCFILTR_P	  = __BIT(31),	 // Don't count cycles in EL1
    832     PMCCFILTR_U	  = __BIT(30),	 // Don't count cycles in EL0
    833     PMCCFILTR_NSK = __BIT(29),	 // Don't count cycles in NS EL1
    834     PMCCFILTR_NSU = __BIT(28),	 // Don't count cycles in NS EL0
    835     PMCCFILTR_NSH = __BIT(27),	 // Don't count cycles in NS EL2
    836     PMCCFILTR_M	  = __BIT(26);	 // Don't count cycles in EL3
    837 
    838 AARCH64REG_READ_INLINE(pmccntr_el0)
    839 
    840 AARCH64REG_READ_INLINE(cntfrq_el0)
    841 
    842 AARCH64REG_READ_INLINE(cnthctl_el2)
    843 AARCH64REG_WRITE_INLINE(cnthctl_el2)
    844 
    845 static const uintmax_t
    846     CNTHCTL_EVNTDIR	= __BIT(3),
    847     CNTHCTL_EVNTEN	= __BIT(2),
    848     CNTHCTL_EL1PCEN	= __BIT(1),
    849     CNTHCTL_EL1PCTEN	= __BIT(0);
    850 
    851 AARCH64REG_READ_INLINE(cntkctl_el1)
    852 AARCH64REG_WRITE_INLINE(cntkctl_el1)
    853 
    854 static const uintmax_t
    855     CNTKCTL_EL0PTEN	= __BIT(9),	// EL0 access for CNTP CVAL/TVAL/CTL
    856     CNTKCTL_PL0PTEN	= CNTKCTL_EL0PTEN,
    857     CNTKCTL_EL0VTEN	= __BIT(8),	// EL0 access for CNTV CVAL/TVAL/CTL
    858     CNTKCTL_PL0VTEN	= CNTKCTL_EL0VTEN,
    859     CNTKCTL_ELNTI	= __BITS(7,4),
    860     CNTKCTL_EVNTDIR	= __BIT(3),
    861     CNTKCTL_EVNTEN	= __BIT(2),
    862     CNTKCTL_EL0VCTEN	= __BIT(1),	// EL0 access for CNTVCT and CNTFRQ
    863     CNTKCTL_PL0VCTEN	= CNTKCTL_EL0VCTEN,
    864     CNTKCTL_EL0PCTEN	= __BIT(0),	// EL0 access for CNTPCT and CNTFRQ
    865     CNTKCTL_PL0PCTEN	= CNTKCTL_EL0PCTEN;
    866 
    867 AARCH64REG_READ_INLINE(cntp_ctl_el0)
    868 AARCH64REG_WRITE_INLINE(cntp_ctl_el0)
    869 AARCH64REG_READ_INLINE(cntp_cval_el0)
    870 AARCH64REG_WRITE_INLINE(cntp_cval_el0)
    871 AARCH64REG_READ_INLINE(cntp_tval_el0)
    872 AARCH64REG_WRITE_INLINE(cntp_tval_el0)
    873 AARCH64REG_READ_INLINE(cntpct_el0)
    874 AARCH64REG_WRITE_INLINE(cntpct_el0)
    875 
    876 AARCH64REG_READ_INLINE(cntps_ctl_el1)
    877 AARCH64REG_WRITE_INLINE(cntps_ctl_el1)
    878 AARCH64REG_READ_INLINE(cntps_cval_el1)
    879 AARCH64REG_WRITE_INLINE(cntps_cval_el1)
    880 AARCH64REG_READ_INLINE(cntps_tval_el1)
    881 AARCH64REG_WRITE_INLINE(cntps_tval_el1)
    882 
    883 AARCH64REG_READ_INLINE(cntv_ctl_el0)
    884 AARCH64REG_WRITE_INLINE(cntv_ctl_el0)
    885 AARCH64REG_READ_INLINE(cntv_cval_el0)
    886 AARCH64REG_WRITE_INLINE(cntv_cval_el0)
    887 AARCH64REG_READ_INLINE(cntv_tval_el0)
    888 AARCH64REG_WRITE_INLINE(cntv_tval_el0)
    889 AARCH64REG_READ_INLINE(cntvct_el0)
    890 AARCH64REG_WRITE_INLINE(cntvct_el0)
    891 
    892 static const uintmax_t
    893     CNTCTL_ISTATUS = __BIT(2),	// Interrupt Asserted
    894     CNTCTL_IMASK   = __BIT(1),	// Timer Interrupt is Masked
    895     CNTCTL_ENABLE  = __BIT(0);	// Timer Enabled
    896 
    897 
    898 // ID_AA64PFR0_EL1: AArch64 Processor Feature Register 0
    899 static const uintmax_t
    900     ID_AA64PFR0_EL1_GIC			= __BITS(24,27), // GIC CPU IF
    901     ID_AA64PFR0_EL1_GIC_SHIFT		= 24,
    902      ID_AA64PFR0_EL1_GIC_CPUIF_EN	= 1,
    903      ID_AA64PFR0_EL1_GIC_CPUIF_NONE	= 0,
    904     ID_AA64PFR0_EL1_ADVSIMD		= __BITS(23,20), // SIMD
    905      ID_AA64PFR0_EL1_ADV_SIMD_IMPL	= 0x0,
    906      ID_AA64PFR0_EL1_ADV_SIMD_NONE	= 0xf,
    907     ID_AA64PFR0_EL1_FP			= __BITS(19,16), // FP
    908      ID_AA64PFR0_EL1_FP_IMPL		= 0x0,
    909      ID_AA64PFR0_EL1_FP_NONE		= 0xf,
    910     ID_AA64PFR0_EL1_EL3			= __BITS(15,12), // EL3 handling
    911      ID_AA64PFR0_EL1_EL3_NONE		= 0,
    912      ID_AA64PFR0_EL1_EL3_64		= 1,
    913      ID_AA64PFR0_EL1_EL3_64_32		= 2,
    914     ID_AA64PFR0_EL1_EL2			= __BITS(11,8), // EL2 handling
    915      ID_AA64PFR0_EL1_EL2_NONE		= 0,
    916      ID_AA64PFR0_EL1_EL2_64		= 1,
    917      ID_AA64PFR0_EL1_EL2_64_32		= 2,
    918     ID_AA64PFR0_EL1_EL1			= __BITS(7,4), // EL1 handling
    919      ID_AA64PFR0_EL1_EL1_64		= 1,
    920      ID_AA64PFR0_EL1_EL1_64_32		= 2,
    921     ID_AA64PFR0_EL1_EL0			= __BITS(3,0), // EL0 handling
    922      ID_AA64PFR0_EL1_EL0_64		= 1,
    923      ID_AA64PFR0_EL1_EL0_64_32		= 2;
    924 
    925 // ICC_SRE_EL1: Interrupt Controller System Register Enable register
    926 static const uintmax_t
    927     ICC_SRE_EL1_SRE			= __BIT(0),
    928     ICC_SRE_EL1_DFB			= __BIT(1),
    929     ICC_SRE_EL1_DIB			= __BIT(2);
    930 
    931 // ICC_SRE_EL2: Interrupt Controller System Register Enable register
    932 static const uintmax_t
    933     ICC_SRE_EL2_SRE			= __BIT(0),
    934     ICC_SRE_EL2_DFB			= __BIT(1),
    935     ICC_SRE_EL2_DIB			= __BIT(2),
    936     ICC_SRE_EL2_EN			= __BIT(3);
    937 
    938 
    939 /*
    940  * GENERIC TIMER REGISTER ACCESS
    941  */
    942 static inline uint32_t
    943 gtmr_cntfrq_read(void)
    944 {
    945 
    946 	return reg_cntfrq_el0_read();
    947 }
    948 
    949 static inline uint32_t
    950 gtmr_cntk_ctl_read(void)
    951 {
    952 
    953 	return reg_cntkctl_el1_read();
    954 }
    955 
    956 static inline void
    957 gtmr_cntk_ctl_write(uint32_t val)
    958 {
    959 
    960 	reg_cntkctl_el1_write(val);
    961 }
    962 
    963 /*
    964  * Counter-timer Virtual Count timer
    965  */
    966 static inline uint64_t
    967 gtmr_cntpct_read(void)
    968 {
    969 
    970 	return reg_cntpct_el0_read();
    971 }
    972 
    973 static inline uint64_t
    974 gtmr_cntvct_read(void)
    975 {
    976 
    977 	return reg_cntvct_el0_read();
    978 }
    979 
    980 /*
    981  * Counter-timer Virtual Timer Control register
    982  */
    983 static inline uint32_t
    984 gtmr_cntv_ctl_read(void)
    985 {
    986 
    987 	return reg_cntv_ctl_el0_read();
    988 }
    989 
    990 static inline void
    991 gtmr_cntv_ctl_write(uint32_t val)
    992 {
    993 
    994 	reg_cntv_ctl_el0_write(val);
    995 }
    996 
    997 static inline void
    998 gtmr_cntp_ctl_write(uint32_t val)
    999 {
   1000 
   1001 
   1002 	reg_cntp_ctl_el0_write(val);
   1003 }
   1004 
   1005 /*
   1006  * Counter-timer Virtual Timer TimerValue register
   1007  */
   1008 static inline uint32_t
   1009 gtmr_cntv_tval_read(void)
   1010 {
   1011 
   1012 	return reg_cntv_tval_el0_read();
   1013 }
   1014 
   1015 static inline void
   1016 gtmr_cntv_tval_write(uint32_t val)
   1017 {
   1018 
   1019 	reg_cntv_tval_el0_write(val);
   1020 }
   1021 
   1022 
   1023 /*
   1024  * Counter-timer Virtual Timer CompareValue register
   1025  */
   1026 static inline uint64_t
   1027 gtmr_cntv_cval_read(void)
   1028 {
   1029 
   1030 	return reg_cntv_cval_el0_read();
   1031 }
   1032 
   1033 #endif /* _AARCH64_ARMREG_H_ */
   1034