#ifndef MACHINE_ARMREG_H
#define MACHINE_ARMREG_H
#define PSR_MODE 0x0000001f
#define PSR_USR32_MODE 0x00000010
#define PSR_FIQ32_MODE 0x00000011
#define PSR_IRQ32_MODE 0x00000012
#define PSR_SVC32_MODE 0x00000013
#define PSR_MON32_MODE 0x00000016
#define PSR_ABT32_MODE 0x00000017
#define PSR_HYP32_MODE 0x0000001a
#define PSR_UND32_MODE 0x0000001b
#define PSR_SYS32_MODE 0x0000001f
#define PSR_32_MODE 0x00000010
#define PSR_T 0x00000020
#define PSR_F 0x00000040
#define PSR_I 0x00000080
#define PSR_A 0x00000100
#define PSR_E 0x00000200
#define PSR_GE 0x000f0000
#define PSR_J 0x01000000
#define PSR_Q 0x08000000
#define PSR_V 0x10000000
#define PSR_C 0x20000000
#define PSR_Z 0x40000000
#define PSR_N 0x80000000
#define PSR_FLAGS 0xf0000000
#define CPU_ID_IMPLEMENTOR_MASK 0xff000000
#define CPU_ID_ARM_LTD 0x41000000
#define CPU_ID_DEC 0x44000000
#define CPU_ID_MOTOROLA 0x4D000000
#define CPU_ID_QUALCOM 0x51000000
#define CPU_ID_TI 0x54000000
#define CPU_ID_MARVELL 0x56000000
#define CPU_ID_INTEL 0x69000000
#define CPU_ID_FARADAY 0x66000000
#define CPU_ID_VARIANT_SHIFT 20
#define CPU_ID_VARIANT_MASK 0x00f00000
#define CPU_ID_ISOLD(x) (((x) & 0x0000f000) == 0x00000000)
#define CPU_ID_IS7(x) (((x) & 0x0000f000) == 0x00007000)
#define CPU_ID_ISNEW(x) (!CPU_ID_ISOLD(x) && !CPU_ID_IS7(x))
#define CPU_ID_ARCH_MASK 0x000f0000
#define CPU_ID_ARCH_V3 0x00000000
#define CPU_ID_ARCH_V4 0x00010000
#define CPU_ID_ARCH_V4T 0x00020000
#define CPU_ID_ARCH_V5 0x00030000
#define CPU_ID_ARCH_V5T 0x00040000
#define CPU_ID_ARCH_V5TE 0x00050000
#define CPU_ID_ARCH_V5TEJ 0x00060000
#define CPU_ID_ARCH_V6 0x00070000
#define CPU_ID_CPUID_SCHEME 0x000f0000
#define CPU_ID_PARTNO_MASK 0x0000fff0
#define CPU_ID_XSCALE_COREGEN_MASK 0x0000e000
#define CPU_ID_XSCALE_COREREV_MASK 0x00001c00
#define CPU_ID_XSCALE_PRODUCT_MASK 0x000003f0
#define CPU_ID_REVISION_MASK 0x0000000f
#define CPU_ID_CPU_MASK 0xfffffff0
#define CPU_ID_ARM920T 0x41129200
#define CPU_ID_ARM920T_ALT 0x41009200
#define CPU_ID_ARM922T 0x41029220
#define CPU_ID_ARM926EJS 0x41069260
#define CPU_ID_ARM940T 0x41029400
#define CPU_ID_ARM946ES 0x41049460
#define CPU_ID_ARM966ES 0x41049660
#define CPU_ID_ARM966ESR1 0x41059660
#define CPU_ID_ARM1020E 0x4115a200
#define CPU_ID_ARM1022ES 0x4105a220
#define CPU_ID_ARM1026EJS 0x4106a260
#define CPU_ID_ARM1136JS 0x4107b360
#define CPU_ID_ARM1136JSR1 0x4117b360
#define CPU_ID_ARM1176JZS 0x410fb760
#define CPU_ID_SCHEME_MASK \
(CPU_ID_IMPLEMENTOR_MASK | CPU_ID_ARCH_MASK | CPU_ID_PARTNO_MASK)
#define CPU_ID_CORTEXA5 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xc050)
#define CPU_ID_CORTEXA7 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xc070)
#define CPU_ID_CORTEXA8 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xc080)
#define CPU_ID_CORTEXA8R1 (CPU_ID_CORTEXA8 | (1 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA8R2 (CPU_ID_CORTEXA8 | (2 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA8R3 (CPU_ID_CORTEXA8 | (3 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA9 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xc090)
#define CPU_ID_CORTEXA9R1 (CPU_ID_CORTEXA9 | (1 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA9R2 (CPU_ID_CORTEXA9 | (2 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA9R3 (CPU_ID_CORTEXA9 | (3 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA9R4 (CPU_ID_CORTEXA9 | (4 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA12 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xc0d0)
#define CPU_ID_CORTEXA12R0 (CPU_ID_CORTEXA12 | (0 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA15 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xc0f0)
#define CPU_ID_CORTEXA15R0 (CPU_ID_CORTEXA15 | (0 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA15R1 (CPU_ID_CORTEXA15 | (1 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA15R2 (CPU_ID_CORTEXA15 | (2 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA15R3 (CPU_ID_CORTEXA15 | (3 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_CORTEXA53 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xd030)
#define CPU_ID_CORTEXA57 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xd070)
#define CPU_ID_CORTEXA72 (CPU_ID_ARM_LTD | CPU_ID_CPUID_SCHEME | 0xd080)
#define CPU_ID_KRAIT300 (CPU_ID_QUALCOM | CPU_ID_CPUID_SCHEME | 0x06f0)
#define CPU_ID_KRAIT300R0 (CPU_ID_KRAIT300 | (0 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_KRAIT300R1 (CPU_ID_KRAIT300 | (1 << CPU_ID_VARIANT_SHIFT))
#define CPU_ID_TI925T 0x54029250
#define CPU_ID_MV88FR131 0x56251310
#define CPU_ID_MV88FR331 0x56153310
#define CPU_ID_MV88FR571_VD 0x56155710
#ifdef SOC_MV_LOKIPLUS
#define CPU_ID_MV88FR571_41 0x00000000
#else
#define CPU_ID_MV88FR571_41 0x41159260
#endif
#define CPU_ID_MV88SV581X_V7 0x561F5810
#define CPU_ID_MV88SV584X_V7 0x562F5840
#define CPU_ID_ARM_88SV581X_V7 0x413FC080
#define CPU_ID_FA526 0x66015260
#define CPU_ID_FA626TE 0x66056260
#define CPU_ID_80200 0x69052000
#define CPU_ID_PXA250 0x69052100
#define CPU_ID_PXA210 0x69052120
#define CPU_ID_PXA250A 0x69052100
#define CPU_ID_PXA210A 0x69052120
#define CPU_ID_PXA250B 0x69052900
#define CPU_ID_PXA210B 0x69052920
#define CPU_ID_PXA250C 0x69052d00
#define CPU_ID_PXA210C 0x69052d20
#define CPU_ID_PXA27X 0x69054110
#define CPU_ID_80321_400 0x69052420
#define CPU_ID_80321_600 0x69052430
#define CPU_ID_80321_400_B0 0x69052c20
#define CPU_ID_80321_600_B0 0x69052c30
#define CPU_ID_80219_400 0x69052e20
#define CPU_ID_80219_600 0x69052e30
#define CPU_ID_81342 0x69056810
#define CPU_ID_IXP425 0x690541c0
#define CPU_ID_IXP425_533 0x690541c0
#define CPU_ID_IXP425_400 0x690541d0
#define CPU_ID_IXP425_266 0x690541f0
#define CPU_ID_IXP435 0x69054040
#define CPU_ID_IXP465 0x69054200
#define ARM_PFR0_ARM_ISA_MASK 0x0000000f
#define ARM_PFR0_THUMB_MASK 0x000000f0
#define ARM_PFR0_THUMB 0x10
#define ARM_PFR0_THUMB2 0x30
#define ARM_PFR0_JAZELLE_MASK 0x00000f00
#define ARM_PFR0_THUMBEE_MASK 0x0000f000
#define ARM_PFR1_ARMV4_MASK 0x0000000f
#define ARM_PFR1_SEC_EXT_MASK 0x000000f0
#define ARM_PFR1_MICROCTRL_MASK 0x00000f00
#define CPU_CONTROL_MMU_ENABLE 0x00000001
#define CPU_CONTROL_AFLT_ENABLE 0x00000002
#define CPU_CONTROL_DC_ENABLE 0x00000004
#define CPU_CONTROL_WBUF_ENABLE 0x00000008
#define CPU_CONTROL_32BP_ENABLE 0x00000010
#define CPU_CONTROL_32BD_ENABLE 0x00000020
#define CPU_CONTROL_LABT_ENABLE 0x00000040
#define CPU_CONTROL_BEND_ENABLE 0x00000080
#define CPU_CONTROL_SYST_ENABLE 0x00000100
#define CPU_CONTROL_ROM_ENABLE 0x00000200
#define CPU_CONTROL_CPCLK 0x00000400
#define CPU_CONTROL_SW_ENABLE 0x00000400
#define CPU_CONTROL_BPRD_ENABLE 0x00000800
#define CPU_CONTROL_IC_ENABLE 0x00001000
#define CPU_CONTROL_VECRELOC 0x00002000
#define CPU_CONTROL_ROUNDROBIN 0x00004000
#define CPU_CONTROL_V4COMPAT 0x00008000
#define CPU_CONTROL_HAF_ENABLE 0x00020000
#define CPU_CONTROL_FI_ENABLE 0x00200000
#define CPU_CONTROL_UNAL_ENABLE 0x00400000
#define CPU_CONTROL_V6_EXTPAGE 0x00800000
#define CPU_CONTROL_V_ENABLE 0x01000000
#define CPU_CONTROL_EX_BEND 0x02000000
#define CPU_CONTROL_L2_ENABLE 0x04000000
#define CPU_CONTROL_NMFI 0x08000000
#define CPU_CONTROL_TR_ENABLE 0x10000000
#define CPU_CONTROL_AF_ENABLE 0x20000000
#define CPU_CONTROL_TE_ENABLE 0x40000000
#define CPU_CONTROL_IDC_ENABLE CPU_CONTROL_DC_ENABLE
#define ARM11X6_AUXCTL_RS 0x00000001
#define ARM11X6_AUXCTL_DB 0x00000002
#define ARM11X6_AUXCTL_SB 0x00000004
#define ARM11X6_AUXCTL_TR 0x00000008
#define ARM11X6_AUXCTL_EX 0x00000010
#define ARM11X6_AUXCTL_RA 0x00000020
#define ARM11X6_AUXCTL_RV 0x00000040
#define ARM11X6_AUXCTL_CZ 0x00000080
#define ARM1136_AUXCTL_PFI 0x80000000
#define ARM1176_AUXCTL_PHD 0x10000000
#define ARM1176_AUXCTL_BFD 0x20000000
#define ARM1176_AUXCTL_FSD 0x40000000
#define ARM1176_AUXCTL_FIO 0x80000000
#define XSCALE_AUXCTL_K 0x00000001
#define XSCALE_AUXCTL_P 0x00000002
#define XSCALE_AUXCTL_MD_WB_RA 0x00000000
#define XSCALE_AUXCTL_MD_WB_RWA 0x00000010
#define XSCALE_AUXCTL_MD_WT 0x00000020
#define XSCALE_AUXCTL_MD_MASK 0x00000030
#define XSCALE_AUXCTL_LLR 0x00000400
#define MV_DC_REPLACE_LOCK 0x80000000
#define MV_DC_STREAM_ENABLE 0x20000000
#define MV_WA_ENABLE 0x10000000
#define MV_L2_PREFETCH_DISABLE 0x01000000
#define MV_L2_INV_EVICT_ERR 0x00800000
#define MV_L2_ENABLE 0x00400000
#define MV_IC_REPLACE_LOCK 0x00080000
#define MV_BGH_ENABLE 0x00040000
#define MV_BTB_DISABLE 0x00020000
#define MV_L1_PARERR_ENABLE 0x00010000
#define CPU_CT_ISIZE(x) ((x) & 0xfff)
#define CPU_CT_DSIZE(x) (((x) >> 12) & 0xfff)
#define CPU_CT_S (1U << 24)
#define CPU_CT_CTYPE(x) (((x) >> 25) & 0xf)
#define CPU_CT_FORMAT(x) ((x) >> 29)
#define CPU_CT_IMINLINE(x) ((x) & 0xf)
#define CPU_CT_DMINLINE(x) (((x) >> 16) & 0xf)
#define CPU_CT_CTYPE_WT 0
#define CPU_CT_CTYPE_WB1 1
#define CPU_CT_CTYPE_WB2 2
#define CPU_CT_CTYPE_WB6 6
#define CPU_CT_CTYPE_WB7 7
#define CPU_CT_xSIZE_LEN(x) ((x) & 0x3)
#define CPU_CT_xSIZE_M (1U << 2)
#define CPU_CT_xSIZE_ASSOC(x) (((x) >> 3) & 0x7)
#define CPU_CT_xSIZE_SIZE(x) (((x) >> 6) & 0x7)
#define CPU_CT_ARMV7 0x4
#define CPUV7_CT_CTYPE_WT (1U << 31)
#define CPUV7_CT_CTYPE_WB (1 << 30)
#define CPUV7_CT_CTYPE_RA (1 << 29)
#define CPUV7_CT_CTYPE_WA (1 << 28)
#define CPUV7_CT_xSIZE_LEN(x) ((x) & 0x7)
#define CPUV7_CT_xSIZE_ASSOC(x) (((x) >> 3) & 0x3ff)
#define CPUV7_CT_xSIZE_SET(x) (((x) >> 13) & 0x7fff)
#define CPUV7_L2CTLR_NPROC_SHIFT 24
#define CPUV7_L2CTLR_NPROC(r) ((((r) >> CPUV7_L2CTLR_NPROC_SHIFT) & 3) + 1)
#define CPU_CLIDR_CTYPE(reg,x) (((reg) >> ((x) * 3)) & 0x7)
#define CPU_CLIDR_LOUIS(reg) (((reg) >> 21) & 0x7)
#define CPU_CLIDR_LOC(reg) (((reg) >> 24) & 0x7)
#define CPU_CLIDR_LOUU(reg) (((reg) >> 27) & 0x7)
#define CACHE_ICACHE 1
#define CACHE_DCACHE 2
#define CACHE_SEP_CACHE 3
#define CACHE_UNI_CACHE 4
#define FAULT_USER 0x10
#define FAULT_ALIGN 0x001
#define FAULT_DEBUG 0x002
#define FAULT_ACCESS_L1 0x003
#define FAULT_ICACHE 0x004
#define FAULT_TRAN_L1 0x005
#define FAULT_ACCESS_L2 0x006
#define FAULT_TRAN_L2 0x007
#define FAULT_EA_PREC 0x008
#define FAULT_DOMAIN_L1 0x009
#define FAULT_DOMAIN_L2 0x00B
#define FAULT_EA_TRAN_L1 0x00C
#define FAULT_PERM_L1 0x00D
#define FAULT_EA_TRAN_L2 0x00E
#define FAULT_PERM_L2 0x00F
#define FAULT_TLB_CONFLICT 0x010
#define FAULT_EA_IMPREC 0x016
#define FAULT_PE_IMPREC 0x018
#define FAULT_PARITY 0x019
#define FAULT_PE_TRAN_L1 0x01C
#define FAULT_PE_TRAN_L2 0x01E
#define FSR_TO_FAULT(fsr) (((fsr) & 0xF) | \
((((fsr) & (1 << 10)) >> (10 - 4))))
#define FSR_LPAE (1 << 9)
#define FSR_WNR (1 << 11)
#define FSR_EXT (1 << 12)
#define FSR_CM (1 << 13)
#ifndef __ASSEMBLER__
#define ARM_VECTORS_LOW 0x00000000U
#define ARM_VECTORS_HIGH 0xffff0000U
#else
#define ARM_VECTORS_LOW 0
#define ARM_VECTORS_HIGH 0xffff0000
#endif
#define INSN_SIZE 4
#define INSN_COND_MASK 0xf0000000
#define INSN_COND_AL 0xe0000000
#define ARM_REG_SIZE 4
#define ARM_REG_NUM_PC 15
#define ARM_REG_NUM_LR 14
#define ARM_REG_NUM_SP 13
#define THUMB_INSN_SIZE 2
#define ARM_CP15_HDCR_HPMN 0x0000001f
#endif