Annotation of sys/arch/arm/include/armreg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: armreg.h,v 1.3 2006/05/29 17:01:42 drahn Exp $ */
! 2: /* $NetBSD: armreg.h,v 1.27 2003/09/06 08:43:02 rearnsha Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1998, 2001 Ben Harris
! 6: * Copyright (c) 1994-1996 Mark Brinicombe.
! 7: * Copyright (c) 1994 Brini.
! 8: * All rights reserved.
! 9: *
! 10: * This code is derived from software written for Brini by Mark Brinicombe
! 11: *
! 12: * Redistribution and use in source and binary forms, with or without
! 13: * modification, are permitted provided that the following conditions
! 14: * are met:
! 15: * 1. Redistributions of source code must retain the above copyright
! 16: * notice, this list of conditions and the following disclaimer.
! 17: * 2. Redistributions in binary form must reproduce the above copyright
! 18: * notice, this list of conditions and the following disclaimer in the
! 19: * documentation and/or other materials provided with the distribution.
! 20: * 3. All advertising materials mentioning features or use of this software
! 21: * must display the following acknowledgement:
! 22: * This product includes software developed by Brini.
! 23: * 4. The name of the company nor the name of the author may be used to
! 24: * endorse or promote products derived from this software without specific
! 25: * prior written permission.
! 26: *
! 27: * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
! 28: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
! 29: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 30: * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
! 31: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 32: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 33: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 34: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 35: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 36: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 37: * SUCH DAMAGE.
! 38: */
! 39:
! 40: #ifndef _ARM_ARMREG_H
! 41: #define _ARM_ARMREG_H
! 42:
! 43: /*
! 44: * ARM Process Status Register
! 45: *
! 46: * The picture in the ARM manuals looks like this:
! 47: * 3 3 2 2 2 2
! 48: * 1 0 9 8 7 6 8 7 6 5 4 0
! 49: * +-+-+-+-+-+-------------------------------------+-+-+-+---------+
! 50: * |N|Z|C|V|Q| reserved |I|F|T|M M M M M|
! 51: * | | | | | | | | | |4 3 2 1 0|
! 52: * +-+-+-+-+-+-------------------------------------+-+-+-+---------+
! 53: */
! 54:
! 55: #define PSR_FLAGS 0xf0000000 /* flags */
! 56: #define PSR_N_bit (1 << 31) /* negative */
! 57: #define PSR_Z_bit (1 << 30) /* zero */
! 58: #define PSR_C_bit (1 << 29) /* carry */
! 59: #define PSR_V_bit (1 << 28) /* overflow */
! 60:
! 61: #define PSR_Q_bit (1 << 27) /* saturation */
! 62:
! 63: #define I32_bit (1 << 7) /* IRQ disable */
! 64: #define F32_bit (1 << 6) /* FIQ disable */
! 65:
! 66: #define PSR_T_bit (1 << 5) /* Thumb state */
! 67: #define PSR_J_bit (1 << 24) /* Java mode */
! 68:
! 69: #define PSR_MODE 0x0000001f /* mode mask */
! 70: #define PSR_USR26_MODE 0x00000000
! 71: #define PSR_FIQ26_MODE 0x00000001
! 72: #define PSR_IRQ26_MODE 0x00000002
! 73: #define PSR_SVC26_MODE 0x00000003
! 74: #define PSR_USR32_MODE 0x00000010
! 75: #define PSR_FIQ32_MODE 0x00000011
! 76: #define PSR_IRQ32_MODE 0x00000012
! 77: #define PSR_SVC32_MODE 0x00000013
! 78: #define PSR_ABT32_MODE 0x00000017
! 79: #define PSR_UND32_MODE 0x0000001b
! 80: #define PSR_SYS32_MODE 0x0000001f
! 81: #define PSR_32_MODE 0x00000010
! 82:
! 83: #define PSR_IN_USR_MODE(psr) (!((psr) & 3)) /* XXX */
! 84: #define PSR_IN_32_MODE(psr) ((psr) & PSR_32_MODE)
! 85:
! 86: /* In 26-bit modes, the PSR is stuffed into R15 along with the PC. */
! 87:
! 88: #define R15_MODE 0x00000003
! 89: #define R15_MODE_USR 0x00000000
! 90: #define R15_MODE_FIQ 0x00000001
! 91: #define R15_MODE_IRQ 0x00000002
! 92: #define R15_MODE_SVC 0x00000003
! 93:
! 94: #define R15_PC 0x03fffffc
! 95:
! 96: #define R15_FIQ_DISABLE 0x04000000
! 97: #define R15_IRQ_DISABLE 0x08000000
! 98:
! 99: #define R15_FLAGS 0xf0000000
! 100: #define R15_FLAG_N 0x80000000
! 101: #define R15_FLAG_Z 0x40000000
! 102: #define R15_FLAG_C 0x20000000
! 103: #define R15_FLAG_V 0x10000000
! 104:
! 105: /*
! 106: * Co-processor 15: The system control co-processor.
! 107: */
! 108:
! 109: #define ARM_CP15_CPU_ID 0
! 110:
! 111: /*
! 112: * The CPU ID register is theoretically structured, but the definitions of
! 113: * the fields keep changing.
! 114: */
! 115:
! 116: /* The high-order byte is always the implementor */
! 117: #define CPU_ID_IMPLEMENTOR_MASK 0xff000000
! 118: #define CPU_ID_ARM_LTD 0x41000000 /* 'A' */
! 119: #define CPU_ID_DEC 0x44000000 /* 'D' */
! 120: #define CPU_ID_INTEL 0x69000000 /* 'i' */
! 121: #define CPU_ID_TI 0x54000000 /* 'T' */
! 122:
! 123: /* How to decide what format the CPUID is in. */
! 124: #define CPU_ID_ISOLD(x) (((x) & 0x0000f000) == 0x00000000)
! 125: #define CPU_ID_IS7(x) (((x) & 0x0000f000) == 0x00007000)
! 126: #define CPU_ID_ISNEW(x) (!CPU_ID_ISOLD(x) && !CPU_ID_IS7(x))
! 127:
! 128: /* On ARM3 and ARM6, this byte holds the foundry ID. */
! 129: #define CPU_ID_FOUNDRY_MASK 0x00ff0000
! 130: #define CPU_ID_FOUNDRY_VLSI 0x00560000
! 131:
! 132: /* On ARM7 it holds the architecture and variant (sub-model) */
! 133: #define CPU_ID_7ARCH_MASK 0x00800000
! 134: #define CPU_ID_7ARCH_V3 0x00000000
! 135: #define CPU_ID_7ARCH_V4T 0x00800000
! 136: #define CPU_ID_7VARIANT_MASK 0x007f0000
! 137:
! 138: /* On more recent ARMs, it does the same, but in a different format */
! 139: #define CPU_ID_ARCH_MASK 0x000f0000
! 140: #define CPU_ID_ARCH_V3 0x00000000
! 141: #define CPU_ID_ARCH_V4 0x00010000
! 142: #define CPU_ID_ARCH_V4T 0x00020000
! 143: #define CPU_ID_ARCH_V5 0x00030000
! 144: #define CPU_ID_ARCH_V5T 0x00040000
! 145: #define CPU_ID_ARCH_V5TE 0x00050000
! 146: #define CPU_ID_VARIANT_MASK 0x00f00000
! 147:
! 148: /* Next three nybbles are part number */
! 149: #define CPU_ID_PARTNO_MASK 0x0000fff0
! 150:
! 151: /* Intel XScale has sub fields in part number */
! 152: #define CPU_ID_XSCALE_COREGEN_MASK 0x0000e000 /* core generation */
! 153: #define CPU_ID_XSCALE_COREREV_MASK 0x00001c00 /* core revision */
! 154: #define CPU_ID_XSCALE_PRODUCT_MASK 0x000003f0 /* product number */
! 155:
! 156: /* And finally, the revision number. */
! 157: #define CPU_ID_REVISION_MASK 0x0000000f
! 158:
! 159: /* Individual CPUs are probably best IDed by everything but the revision. */
! 160: #define CPU_ID_CPU_MASK 0xfffffff0
! 161:
! 162: /* Fake CPU IDs for ARMs without CP15 */
! 163: #define CPU_ID_ARM2 0x41560200
! 164: #define CPU_ID_ARM250 0x41560250
! 165:
! 166: /* Pre-ARM7 CPUs -- [15:12] == 0 */
! 167: #define CPU_ID_ARM3 0x41560300
! 168: #define CPU_ID_ARM600 0x41560600
! 169: #define CPU_ID_ARM610 0x41560610
! 170: #define CPU_ID_ARM620 0x41560620
! 171:
! 172: /* ARM7 CPUs -- [15:12] == 7 */
! 173: #define CPU_ID_ARM700 0x41007000 /* XXX This is a guess. */
! 174: #define CPU_ID_ARM710 0x41007100
! 175: #define CPU_ID_ARM7500 0x41027100 /* XXX This is a guess. */
! 176: #define CPU_ID_ARM710A 0x41047100 /* inc ARM7100 */
! 177: #define CPU_ID_ARM7500FE 0x41077100
! 178: #define CPU_ID_ARM710T 0x41807100
! 179: #define CPU_ID_ARM720T 0x41807200
! 180: #define CPU_ID_ARM740T8K 0x41807400 /* XXX no MMU, 8KB cache */
! 181: #define CPU_ID_ARM740T4K 0x41817400 /* XXX no MMU, 4KB cache */
! 182:
! 183: /* Post-ARM7 CPUs */
! 184: #define CPU_ID_ARM810 0x41018100
! 185: #define CPU_ID_ARM920T 0x41129200
! 186: #define CPU_ID_ARM922T 0x41029220
! 187: #define CPU_ID_ARM940T 0x41029400 /* XXX no MMU */
! 188: #define CPU_ID_ARM946ES 0x41049460 /* XXX no MMU */
! 189: #define CPU_ID_ARM966ES 0x41049660 /* XXX no MMU */
! 190: #define CPU_ID_ARM966ESR1 0x41059660 /* XXX no MMU */
! 191: #define CPU_ID_ARM1020E 0x4115a200 /* (AKA arm10 rev 1) */
! 192: #define CPU_ID_ARM1022ES 0x4105a220
! 193: #define CPU_ID_SA110 0x4401a100
! 194: #define CPU_ID_SA1100 0x4401a110
! 195: #define CPU_ID_TI925T 0x54029250
! 196: #define CPU_ID_SA1110 0x6901b110
! 197: #define CPU_ID_IXP1200 0x6901c120
! 198: #define CPU_ID_80200 0x69052000
! 199: #define CPU_ID_PXA250 0x69052100 /* sans core revision */
! 200: #define CPU_ID_PXA210 0x69052120
! 201: #define CPU_ID_PXA250A 0x69052100 /* 1st version Core */
! 202: #define CPU_ID_PXA210A 0x69052120 /* 1st version Core */
! 203: #define CPU_ID_PXA250B 0x69052900 /* 3rd version Core */
! 204: #define CPU_ID_PXA210B 0x69052920 /* 3rd version Core */
! 205: #define CPU_ID_PXA250C 0x69052d00 /* 4th version Core */
! 206: #define CPU_ID_PXA210C 0x69052d20 /* 4th version Core */
! 207: #define CPU_ID_80219_400 0x69052e20
! 208: #define CPU_ID_80219_600 0x69052e30
! 209: #define CPU_ID_PXA27X 0x69054110
! 210: #define CPU_ID_80321_400 0x69052420
! 211: #define CPU_ID_80321_600 0x69052430
! 212: #define CPU_ID_80321_400_B0 0x69052c20
! 213: #define CPU_ID_80321_600_B0 0x69052c30
! 214: #define CPU_ID_IXP425_533 0x690541c0
! 215: #define CPU_ID_IXP425_400 0x690541d0
! 216: #define CPU_ID_IXP425_266 0x690541f0
! 217:
! 218: /* ARM3-specific coprocessor 15 registers */
! 219: #define ARM3_CP15_FLUSH 1
! 220: #define ARM3_CP15_CONTROL 2
! 221: #define ARM3_CP15_CACHEABLE 3
! 222: #define ARM3_CP15_UPDATEABLE 4
! 223: #define ARM3_CP15_DISRUPTIVE 5
! 224:
! 225: /* ARM3 Control register bits */
! 226: #define ARM3_CTL_CACHE_ON 0x00000001
! 227: #define ARM3_CTL_SHARED 0x00000002
! 228: #define ARM3_CTL_MONITOR 0x00000004
! 229:
! 230: /*
! 231: * Post-ARM3 CP15 registers:
! 232: *
! 233: * 1 Control register
! 234: *
! 235: * 2 Translation Table Base
! 236: *
! 237: * 3 Domain Access Control
! 238: *
! 239: * 4 Reserved
! 240: *
! 241: * 5 Fault Status
! 242: *
! 243: * 6 Fault Address
! 244: *
! 245: * 7 Cache/write-buffer Control
! 246: *
! 247: * 8 TLB Control
! 248: *
! 249: * 9 Cache Lockdown
! 250: *
! 251: * 10 TLB Lockdown
! 252: *
! 253: * 11 Reserved
! 254: *
! 255: * 12 Reserved
! 256: *
! 257: * 13 Process ID (for FCSE)
! 258: *
! 259: * 14 Reserved
! 260: *
! 261: * 15 Implementation Dependent
! 262: */
! 263:
! 264: /* Some of the definitions below need cleaning up for V3/V4 architectures */
! 265:
! 266: /* CPU control register (CP15 register 1) */
! 267: #define CPU_CONTROL_MMU_ENABLE 0x00000001 /* M: MMU/Protection unit enable */
! 268: #define CPU_CONTROL_AFLT_ENABLE 0x00000002 /* A: Alignment fault enable */
! 269: #define CPU_CONTROL_DC_ENABLE 0x00000004 /* C: IDC/DC enable */
! 270: #define CPU_CONTROL_WBUF_ENABLE 0x00000008 /* W: Write buffer enable */
! 271: #define CPU_CONTROL_32BP_ENABLE 0x00000010 /* P: 32-bit exception handlers */
! 272: #define CPU_CONTROL_32BD_ENABLE 0x00000020 /* D: 32-bit addressing */
! 273: #define CPU_CONTROL_LABT_ENABLE 0x00000040 /* L: Late abort enable */
! 274: #define CPU_CONTROL_BEND_ENABLE 0x00000080 /* B: Big-endian mode */
! 275: #define CPU_CONTROL_SYST_ENABLE 0x00000100 /* S: System protection bit */
! 276: #define CPU_CONTROL_ROM_ENABLE 0x00000200 /* R: ROM protection bit */
! 277: #define CPU_CONTROL_CPCLK 0x00000400 /* F: Implementation defined */
! 278: #define CPU_CONTROL_BPRD_ENABLE 0x00000800 /* Z: Branch prediction enable */
! 279: #define CPU_CONTROL_IC_ENABLE 0x00001000 /* I: IC enable */
! 280: #define CPU_CONTROL_VECRELOC 0x00002000 /* V: Vector relocation */
! 281: #define CPU_CONTROL_ROUNDROBIN 0x00004000 /* RR: Predictable replacement */
! 282: #define CPU_CONTROL_V4COMPAT 0x00008000 /* L4: ARMv4 compat LDR R15 etc */
! 283:
! 284: #define CPU_CONTROL_IDC_ENABLE CPU_CONTROL_DC_ENABLE
! 285:
! 286: /* XScale Auxillary Control Register (CP15 register 1, opcode2 1) */
! 287: #define XSCALE_AUXCTL_K 0x00000001 /* dis. write buffer coalescing */
! 288: #define XSCALE_AUXCTL_P 0x00000002 /* ECC protect page table access */
! 289: #define XSCALE_AUXCTL_MD_WB_RA 0x00000000 /* mini-D$ wb, read-allocate */
! 290: #define XSCALE_AUXCTL_MD_WB_RWA 0x00000010 /* mini-D$ wb, read/write-allocate */
! 291: #define XSCALE_AUXCTL_MD_WT 0x00000020 /* mini-D$ wt, read-allocate */
! 292: #define XSCALE_AUXCTL_MD_MASK 0x00000030
! 293:
! 294: /* Cache type register definitions */
! 295: #define CPU_CT_ISIZE(x) ((x) & 0xfff) /* I$ info */
! 296: #define CPU_CT_DSIZE(x) (((x) >> 12) & 0xfff) /* D$ info */
! 297: #define CPU_CT_S (1U << 24) /* split cache */
! 298: #define CPU_CT_CTYPE(x) (((x) >> 25) & 0xf) /* cache type */
! 299:
! 300: #define CPU_CT_CTYPE_WT 0 /* write-through */
! 301: #define CPU_CT_CTYPE_WB1 1 /* write-back, clean w/ read */
! 302: #define CPU_CT_CTYPE_WB2 2 /* w/b, clean w/ cp15,7 */
! 303: #define CPU_CT_CTYPE_WB6 6 /* w/b, cp15,7, lockdown fmt A */
! 304: #define CPU_CT_CTYPE_WB7 7 /* w/b, cp15,7, lockdown fmt B */
! 305:
! 306: #define CPU_CT_xSIZE_LEN(x) ((x) & 0x3) /* line size */
! 307: #define CPU_CT_xSIZE_M (1U << 2) /* multiplier */
! 308: #define CPU_CT_xSIZE_ASSOC(x) (((x) >> 3) & 0x7) /* associativity */
! 309: #define CPU_CT_xSIZE_SIZE(x) (((x) >> 6) & 0x7) /* size */
! 310:
! 311: /* Fault status register definitions */
! 312:
! 313: #define FAULT_TYPE_MASK 0x0f
! 314: #define FAULT_USER 0x10
! 315:
! 316: #define FAULT_WRTBUF_0 0x00 /* Vector Exception */
! 317: #define FAULT_WRTBUF_1 0x02 /* Terminal Exception */
! 318: #define FAULT_BUSERR_0 0x04 /* External Abort on Linefetch -- Section */
! 319: #define FAULT_BUSERR_1 0x06 /* External Abort on Linefetch -- Page */
! 320: #define FAULT_BUSERR_2 0x08 /* External Abort on Non-linefetch -- Section */
! 321: #define FAULT_BUSERR_3 0x0a /* External Abort on Non-linefetch -- Page */
! 322: #define FAULT_BUSTRNL1 0x0c /* External abort on Translation -- Level 1 */
! 323: #define FAULT_BUSTRNL2 0x0e /* External abort on Translation -- Level 2 */
! 324: #define FAULT_ALIGN_0 0x01 /* Alignment */
! 325: #define FAULT_ALIGN_1 0x03 /* Alignment */
! 326: #define FAULT_TRANS_S 0x05 /* Translation -- Section */
! 327: #define FAULT_TRANS_P 0x07 /* Translation -- Page */
! 328: #define FAULT_DOMAIN_S 0x09 /* Domain -- Section */
! 329: #define FAULT_DOMAIN_P 0x0b /* Domain -- Page */
! 330: #define FAULT_PERM_S 0x0d /* Permission -- Section */
! 331: #define FAULT_PERM_P 0x0f /* Permission -- Page */
! 332:
! 333: #define FAULT_IMPRECISE 0x400 /* Imprecise exception (XSCALE) */
! 334:
! 335: /*
! 336: * Address of the vector page, low and high versions.
! 337: */
! 338: #define ARM_VECTORS_LOW 0x00000000U
! 339: #define ARM_VECTORS_HIGH 0xffff0000U
! 340:
! 341: /*
! 342: * ARM Instructions
! 343: *
! 344: * 3 3 2 2 2
! 345: * 1 0 9 8 7 0
! 346: * +-------+-------------------------------------------------------+
! 347: * | cond | instruction dependant |
! 348: * |c c c c| |
! 349: * +-------+-------------------------------------------------------+
! 350: */
! 351:
! 352: #define INSN_SIZE 4 /* Always 4 bytes */
! 353: #define INSN_COND_MASK 0xf0000000 /* Condition mask */
! 354: #define INSN_COND_AL 0xe0000000 /* Always condition */
! 355:
! 356: #endif
CVSweb