[BACK]Return to armreg.h CVS log [TXT][DIR] Up to [local] / sys / arch / arm / include

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