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