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

Annotation of sys/arch/sparc64/include/ctlreg.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ctlreg.h,v 1.11 2007/03/13 19:27:50 kettenis Exp $    */
                      2: /*     $NetBSD: ctlreg.h,v 1.28 2001/08/06 23:55:34 eeh Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1996-2001 Eduardo Horvath
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  *
                     13:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND
                     14:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     15:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     16:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR  BE LIABLE
                     17:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     18:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     19:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     20:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     21:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     22:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     23:  * SUCH DAMAGE.
                     24:  *
                     25:  */
                     26: /*
                     27:  * Copyright (c) 2001 Jake Burkholder.
                     28:  * All rights reserved.
                     29:  *
                     30:  * Redistribution and use in source and binary forms, with or without
                     31:  * modification, are permitted provided that the following conditions
                     32:  * are met:
                     33:  * 1. Redistributions of source code must retain the above copyright
                     34:  *    notice, this list of conditions and the following disclaimer.
                     35:  * 2. Redistributions in binary form must reproduce the above copyright
                     36:  *    notice, this list of conditions and the following disclaimer in the
                     37:  *    documentation and/or other materials provided with the distribution.
                     38:  *
                     39:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     40:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     41:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     42:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     43:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     44:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     45:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     46:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     47:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     48:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     49:  * SUCH DAMAGE.
                     50:  */
                     51:
                     52: #ifndef _SPARC64_CTLREG_
                     53: #define _SPARC64_CTLREG_
                     54:
                     55: /*
                     56:  * Sun 4u control registers. (includes address space definitions
                     57:  * and some registers in control space).
                     58:  */
                     59:
                     60: /*
                     61:  * membar operand macros for use in other macros when # is a special
                     62:  * character.  Keep these in sync with what the hardware expects.
                     63:  */
                     64: #define C_Lookaside     (0)
                     65: #define C_MemIssue      (1)
                     66: #define C_Sync          (2)
                     67: #define M_LoadLoad      (0)
                     68: #define M_StoreLoad     (1)
                     69: #define M_LoadStore     (2)
                     70: #define M_StoreStore    (3)
                     71:
                     72: #define CMASK_SHIFT     (4)
                     73: #define MMASK_SHIFT     (0)
                     74:
                     75: #define CMASK_GEN(bit)  ((1 << (bit)) << CMASK_SHIFT)
                     76: #define MMASK_GEN(bit)  ((1 << (bit)) << MMASK_SHIFT)
                     77:
                     78: /*
                     79:  * The Alternate address spaces.
                     80:  *
                     81:  * 0x00-0x7f are privileged
                     82:  * 0x80-0xff can be used by users
                     83:  */
                     84:
                     85: #define        ASI_LITTLE      0x08            /* This bit should make an ASI little endian */
                     86:
                     87: #define        ASI_NUCLEUS                     0x04    /* [4u] kernel address space */
                     88: #define        ASI_NUCLEUS_LITTLE              0x0c    /* [4u] kernel address space, little endian */
                     89:
                     90: #define        ASI_AS_IF_USER_PRIMARY          0x10    /* [4u] primary user address space */
                     91: #define        ASI_AS_IF_USER_SECONDARY        0x11    /* [4u] secondary user address space */
                     92:
                     93: #define        ASI_PHYS_CACHED                 0x14    /* [4u] MMU bypass to main memory */
                     94: #define        ASI_PHYS_NON_CACHED             0x15    /* [4u] MMU bypass to I/O location */
                     95:
                     96: #define        ASI_AS_IF_USER_PRIMARY_LITTLE   0x18    /* [4u] primary user address space, little endian  */
                     97: #define        ASI_AS_IF_USER_SECONDARY_LITTIE 0x19    /* [4u] secondary user address space, little endian  */
                     98:
                     99: #define        ASI_PHYS_CACHED_LITTLE          0x1c    /* [4u] MMU bypass to main memory, little endian */
                    100: #define        ASI_PHYS_NON_CACHED_LITTLE      0x1d    /* [4u] MMU bypass to I/O location, little endian */
                    101:
                    102: #define        ASI_NUCLEUS_QUAD_LDD            0x24    /* [4u] use w/LDDA to load 128-bit item */
                    103: #define        ASI_NUCLEUS_QUAD_LDD_LITTLE     0x2c    /* [4u] use w/LDDA to load 128-bit item, little endian */
                    104:
                    105: #define        ASI_FLUSH_D_PAGE_PRIMARY        0x38    /* [4u] flush D-cache page using primary context */
                    106: #define        ASI_FLUSH_D_PAGE_SECONDARY      0x39    /* [4u] flush D-cache page using secondary context */
                    107: #define        ASI_FLUSH_D_CTX_PRIMARY         0x3a    /* [4u] flush D-cache context using primary context */
                    108: #define        ASI_FLUSH_D_CTX_SECONDARY       0x3b    /* [4u] flush D-cache context using secondary context */
                    109:
                    110: #define ASI_DCACHE_INVALIDATE          0x42    /* [III] invalidate D-cache */
                    111: #define ASI_DCACHE_UTAG                        0x43    /* [III] diagnostic access to D-cache micro tag */
                    112: #define ASI_DCACHE_SNOOP_TAG           0x44    /* [III] diagnostic access to D-cache snoop tag RAM */
                    113:
                    114: #define        ASI_LSU_CONTROL_REGISTER        0x45    /* [4u] load/store unit control register */
                    115:
                    116: #define        ASI_DCACHE_DATA                 0x46    /* [4u] diagnostic access to D-cache data RAM */
                    117: #define        ASI_DCACHE_TAG                  0x47    /* [4u] diagnostic access to D-cache tag RAM */
                    118:
                    119: #define        ASI_INTR_DISPATCH_STATUS        0x48    /* [4u] interrupt dispatch status register */
                    120: #define        ASI_INTR_RECEIVE                0x49    /* [4u] interrupt receive status register */
                    121: #define        ASI_MID_REG                     0x4a    /* [4u] hardware config and MID */
                    122: #define        ASI_ERROR_EN_REG                0x4b    /* [4u] asynchronous error enables */
                    123: #define        ASI_AFSR                        0x4c    /* [4u] asynchronous fault status register */
                    124: #define        ASI_AFAR                        0x4d    /* [4u] asynchronous fault address register */
                    125:
                    126: #define        ASI_ICACHE_DATA                 0x66    /* [4u] diagnostic access to D-cache data RAM */
                    127: #define        ASI_ICACHE_TAG                  0x67    /* [4u] diagnostic access to D-cache tag RAM */
                    128: #define        ASI_FLUSH_I_PAGE_PRIMARY        0x68    /* [4u] flush D-cache page using primary context */
                    129: #define        ASI_FLUSH_I_PAGE_SECONDARY      0x69    /* [4u] flush D-cache page using secondary context */
                    130: #define        ASI_FLUSH_I_CTX_PRIMARY         0x6a    /* [4u] flush D-cache context using primary context */
                    131: #define        ASI_FLUSH_I_CTX_SECONDARY       0x6b    /* [4u] flush D-cache context using secondary context */
                    132:
                    133: #define        ASI_BLOCK_AS_IF_USER_PRIMARY    0x70    /* [4u] primary user address space, block loads/stores */
                    134: #define        ASI_BLOCK_AS_IF_USER_SECONDARY  0x71    /* [4u] secondary user address space, block loads/stores */
                    135:
                    136: #define        ASI_ECACHE_DIAG                 0x76    /* [4u] diag access to E-cache tag and data */
                    137: #define        ASI_DATAPATH_ERR_REG_WRITE      0x77    /* [4u] ASI is reused */
                    138:
                    139: #define        ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE     0x78    /* [4u] primary user address space, block loads/stores */
                    140: #define        ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE   0x79    /* [4u] secondary user address space, block loads/stores */
                    141:
                    142: #define        ASI_INTERRUPT_RECEIVE_DATA      0x7f    /* [4u] interrupt receive data registers {0,1,2} */
                    143: #define        ASI_DATAPATH_ERR_REG_READ       0x7f    /* [4u] read access to datapath error registers (ASI reused) */
                    144:
                    145: #define        ASI_PRIMARY                     0x80    /* [4u] primary address space */
                    146: #define        ASI_SECONDARY                   0x81    /* [4u] secondary address space */
                    147: #define        ASI_PRIMARY_NOFAULT             0x82    /* [4u] primary address space, no fault */
                    148: #define        ASI_SECONDARY_NOFAULT           0x83    /* [4u] secondary address space, no fault */
                    149:
                    150: #define        ASI_PRIMARY_LITTLE              0x88    /* [4u] primary address space, little endian */
                    151: #define        ASI_SECONDARY_LITTLE            0x89    /* [4u] secondary address space, little endian */
                    152: #define        ASI_PRIMARY_NOFAULT_LITTLE      0x8a    /* [4u] primary address space, no fault, little endian */
                    153: #define        ASI_SECONDARY_NOFAULT_LITTLE    0x8b    /* [4u] secondary address space, no fault, little endian */
                    154:
                    155: #define        ASI_PST8_PRIMARY                0xc0    /* [VIS] Eight 8-bit partial store, primary */
                    156: #define        ASI_PST8_SECONDARY              0xc1    /* [VIS] Eight 8-bit partial store, secondary */
                    157: #define        ASI_PST16_PRIMARY               0xc2    /* [VIS] Four 16-bit partial store, primary */
                    158: #define        ASI_PST16_SECONDARY             0xc3    /* [VIS] Fout 16-bit partial store, secondary */
                    159: #define        ASI_PST32_PRIMARY               0xc4    /* [VIS] Two 32-bit partial store, primary */
                    160: #define        ASI_PST32_SECONDARY             0xc5    /* [VIS] Two 32-bit partial store, secondary */
                    161:
                    162: #define        ASI_PST8_PRIMARY_LITTLE         0xc8    /* [VIS] Eight 8-bit partial store, primary, little endian */
                    163: #define        ASI_PST8_SECONDARY_LITTLE       0xc9    /* [VIS] Eight 8-bit partial store, secondary, little endian */
                    164: #define        ASI_PST16_PRIMARY_LITTLE        0xca    /* [VIS] Four 16-bit partial store, primary, little endian */
                    165: #define        ASI_PST16_SECONDARY_LITTLE      0xcb    /* [VIS] Fout 16-bit partial store, secondary, little endian */
                    166: #define        ASI_PST32_PRIMARY_LITTLE        0xcc    /* [VIS] Two 32-bit partial store, primary, little endian */
                    167: #define        ASI_PST32_SECONDARY_LITTLE      0xcd    /* [VIS] Two 32-bit partial store, secondary, little endian */
                    168:
                    169: #define        ASI_FL8_PRIMARY                 0xd0    /* [VIS] One 8-bit load/store floating, primary */
                    170: #define        ASI_FL8_SECONDARY               0xd1    /* [VIS] One 8-bit load/store floating, secondary */
                    171: #define        ASI_FL16_PRIMARY                0xd2    /* [VIS] One 16-bit load/store floating, primary */
                    172: #define        ASI_FL16_SECONDARY              0xd3    /* [VIS] One 16-bit load/store floating, secondary */
                    173:
                    174: #define        ASI_FL8_PRIMARY_LITTLE          0xd8    /* [VIS] One 8-bit load/store floating, primary, little endian */
                    175: #define        ASI_FL8_SECONDARY_LITTLE        0xd9    /* [VIS] One 8-bit load/store floating, secondary, little endian */
                    176: #define        ASI_FL16_PRIMARY_LITTLE         0xda    /* [VIS] One 16-bit load/store floating, primary, little endian */
                    177: #define        ASI_FL16_SECONDARY_LITTLE       0xdb    /* [VIS] One 16-bit load/store floating, secondary, little endian */
                    178:
                    179: #define        ASI_BLOCK_COMMIT_PRIMARY        0xe0    /* [4u] block store with commit, primary */
                    180: #define        ASI_BLOCK_COMMIT_SECONDARY      0xe1    /* [4u] block store with commit, secondary */
                    181: #define        ASI_BLOCK_PRIMARY               0xf0    /* [4u] block load/store, primary */
                    182: #define        ASI_BLOCK_SECONDARY             0xf1    /* [4u] block load/store, secondary */
                    183: #define        ASI_BLOCK_PRIMARY_LITTLE        0xf8    /* [4u] block load/store, primary, little endian */
                    184: #define        ASI_BLOCK_SECONDARY_LITTLE      0xf9    /* [4u] block load/store, secondary, little endian */
                    185:
                    186:
                    187: /*
                    188:  * These are the shorter names used by Solaris
                    189:  */
                    190:
                    191: #define        ASI_N           ASI_NUCLEUS
                    192: #define        ASI_NL          ASI_NUCLEUS_LITTLE
                    193: #define        ASI_AIUP        ASI_AS_IF_USER_PRIMARY
                    194: #define        ASI_AIUS        ASI_AS_IF_USER_SECONDARY
                    195: #define        ASI_AIUPL       ASI_AS_IF_USER_PRIMARY_LITTLE
                    196: #define        ASI_AIUSL       ASI_AS_IF_USER_SECONDARY_LITTLE
                    197: #define        ASI_P           ASI_PRIMARY
                    198: #define        ASI_S           ASI_SECONDARY
                    199: #define        ASI_PNF         ASI_PRIMARY_NOFAULT
                    200: #define        ASI_SNF         ASI_SECONDARY_NOFAULT
                    201: #define        ASI_PL          ASI_PRIMARY_LITTLE
                    202: #define        ASI_SL          ASI_SECONDARY_LITTLE
                    203: #define        ASI_PNFL        ASI_PRIMARY_NOFAULT_LITTLE
                    204: #define        ASI_SNFL        ASI_SECONDARY_NOFAULT_LITTLE
                    205: #define        ASI_FL8_P       ASI_FL8_PRIMARY
                    206: #define        ASI_FL8_S       ASI_FL8_SECONDARY
                    207: #define        ASI_FL16_P      ASI_FL16_PRIMARY
                    208: #define        ASI_FL16_S      ASI_FL16_SECONDARY
                    209: #define        ASI_FL8_PL      ASI_FL8_PRIMARY_LITTLE
                    210: #define        ASI_FL8_SL      ASI_FL8_SECONDARY_LITTLE
                    211: #define        ASI_FL16_PL     ASI_FL16_PRIMARY_LITTLE
                    212: #define        ASI_FL16_SL     ASI_FL16_SECONDARY_LITTLE
                    213: #define        ASI_BLK_AIUP    ASI_BLOCK_AS_IF_USER_PRIMARY
                    214: #define        ASI_BLK_AIUPL   ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE
                    215: #define        ASI_BLK_AIUS    ASI_BLOCK_AS_IF_USER_SECONDARY
                    216: #define        ASI_BLK_AIUSL   ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE
                    217: #define        ASI_BLK_COMMIT_P                ASI_BLOCK_COMMIT_PRIMARY
                    218: #define        ASI_BLK_COMMIT_PRIMARY          ASI_BLOCK_COMMIT_PRIMARY
                    219: #define        ASI_BLK_COMMIT_S                ASI_BLOCK_COMMIT_SECONDARY
                    220: #define        ASI_BLK_COMMIT_SECONDARY        ASI_BLOCK_COMMIT_SECONDARY
                    221: #define        ASI_BLK_P                       ASI_BLOCK_PRIMARY
                    222: #define        ASI_BLK_PL                      ASI_BLOCK_PRIMARY_LITTLE
                    223: #define        ASI_BLK_S                       ASI_BLOCK_SECONDARY
                    224: #define        ASI_BLK_SL                      ASI_BLOCK_SECONDARY_LITTLE
                    225:
                    226: /* Alternative spellings */
                    227: #define ASI_PRIMARY_NO_FAULT           ASI_PRIMARY_NOFAULT
                    228: #define ASI_PRIMARY_NO_FAULT_LITTLE    ASI_PRIMARY_NOFAULT_LITTLE
                    229: #define ASI_SECONDARY_NO_FAULT         ASI_SECONDARY_NOFAULT
                    230: #define ASI_SECONDARY_NO_FAULT_LITTLE  ASI_SECONDARY_NOFAULT_LITTLE
                    231:
                    232: #define        PHYS_ASI(x)     (((x) | 0x09) == 0x1d)
                    233: #define        LITTLE_ASI(x)   ((x) & ASI_LITTLE)
                    234:
                    235: /*
                    236:  * %tick: cpu cycle counter
                    237:  */
                    238: #define        TICK_NPT        0x8000000000000000      /* trap on non priv access */
                    239: #define        TICK_TICKS      0x7fffffffffffffff      /* counter bits */
                    240:
                    241: /*
                    242:  * The following are 4u control registers
                    243:  */
                    244:
                    245:
                    246: /* Get the CPU's UPAID */
                    247: #define        UPA_CR_MID(x)   (((x)>>17)&0x1f)
                    248: #define        CPU_UPAID       UPA_CR_MID(ldxa(0, ASI_MID_REG))
                    249:
                    250: /*
                    251:  * [4u] MMU and Cache Control Register (MCCR)
                    252:  * use ASI = 0x45
                    253:  */
                    254: #define        ASI_MCCR        ASI_LSU_CONTROL_REGISTER
                    255: #define        MCCR            0x00
                    256:
                    257: /* MCCR Bits and their meanings */
                    258: #define        MCCR_DMMU_EN    0x08
                    259: #define        MCCR_IMMU_EN    0x04
                    260: #define        MCCR_DCACHE_EN  0x02
                    261: #define        MCCR_ICACHE_EN  0x01
                    262:
                    263:
                    264: /*
                    265:  * MMU control registers
                    266:  */
                    267:
                    268: /* Choose an MMU */
                    269: #define        ASI_DMMU                0x58
                    270: #define        ASI_IMMU                0x50
                    271:
                    272: /* Other assorted MMU ASIs */
                    273: #define        ASI_IMMU_8KPTR          0x51
                    274: #define        ASI_IMMU_64KPTR         0x52
                    275: #define        ASI_IMMU_DATA_IN        0x54
                    276: #define        ASI_IMMU_TLB_DATA       0x55
                    277: #define        ASI_IMMU_TLB_TAG        0x56
                    278: #define        ASI_DMMU_8KPTR          0x59
                    279: #define        ASI_DMMU_64KPTR         0x5a
                    280: #define        ASI_DMMU_DATA_IN        0x5c
                    281: #define        ASI_DMMU_TLB_DATA       0x5d
                    282: #define        ASI_DMMU_TLB_TAG        0x5e
                    283:
                    284: /*
                    285:  * The following are the control registers
                    286:  * They work on both MMUs unless noted.
                    287:  * III = cheetah only
                    288:  *
                    289:  * Register contents are defined later on individual registers.
                    290:  */
                    291: #define        TSB_TAG_TARGET          0x0
                    292: #define        TLB_DATA_IN             0x0
                    293: #define        CTX_PRIMARY             0x08    /* primary context -- DMMU only */
                    294: #define        CTX_SECONDARY           0x10    /* secondary context -- DMMU only */
                    295: #define        SFSR                    0x18
                    296: #define        SFAR                    0x20    /* fault address -- DMMU only */
                    297: #define        TSB                     0x28
                    298: #define        TLB_TAG_ACCESS          0x30
                    299: #define        VIRTUAL_WATCHPOINT      0x38
                    300: #define        PHYSICAL_WATCHPOINT     0x40
                    301: #define TSB_PEXT               0x48    /* III primary ext */
                    302: #define TSB_SEXT               0x50    /* III 2ndary ext -- DMMU only */
                    303: #define TSB_NEXT               0x58    /* III nucleus ext */
                    304:
                    305: /* Tag Target bits */
                    306: #define        TAG_TARGET_VA_MASK      0x03ffffffffffffffffLL
                    307: #define        TAG_TARGET_VA(x)        (((x)<<22)&TAG_TARGET_VA_MASK)
                    308: #define        TAG_TARGET_CONTEXT(x)   ((x)>>48)
                    309: #define        TAG_TARGET(c,v)         ((((uint64_t)c)<<48)|(((uint64_t)v)&TAG_TARGET_VA_MASK))
                    310:
                    311: /* SFSR bits for both D_SFSR and I_SFSR */
                    312: #define        SFSR_NF                 0x1000000       /* Non-faulting load */
                    313: #define        SFSR_ASI(x)             ((x)>>16)
                    314: #define        SFSR_TM                 0x0008000       /* TLB miss  */
                    315: #define        SFSR_FT_VA_OOR_2        0x0002000       /* IMMU: jumpl or return to unsupportd VA */
                    316: #define        SFSR_FT_VA_OOR_1        0x0001000       /* fault at unsupported VA */
                    317: #define        SFSR_FT_NFO             0x0000800       /* DMMU: Access to page marked NFO */
                    318: #define        SFSR_ILL_ASI            0x0000400       /* DMMU: Illegal (unsupported) ASI */
                    319: #define        SFSR_FT_IO_ATOMIC       0x0000200       /* DMMU: Atomic access to noncacheable page */
                    320: #define        SFSR_FT_ILL_NF          0x0000100       /* DMMU: NF load or flush to page marked E (has side effects) */
                    321: #define        SFSR_FT_PRIV            0x0000080       /* Privilege violation */
                    322: #define        SFSR_FT_E               0x0000040       /* DMUU: value of E bit associated address */
                    323: #define        SFSR_CTXT(x)            (((x)>>4)&0x3)
                    324: #define        SFSR_CTXT_IS_PRIM(x)    (SFSR_CTXT(x)==0x00)
                    325: #define        SFSR_CTXT_IS_SECOND(x)  (SFSR_CTXT(x)==0x01)
                    326: #define        SFSR_CTXT_IS_NUCLEUS(x) (SFSR_CTXT(x)==0x02)
                    327: #define        SFSR_PRIV               0x0000008       /* value of PSTATE.PRIV for faulting access */
                    328: #define        SFSR_W                  0x0000004       /* DMMU: attempted write */
                    329: #define        SFSR_OW                 0x0000002       /* Overwrite; prev fault was still valid */
                    330: #define        SFSR_FV                 0x0000001       /* Fault is valid */
                    331: #define        SFSR_FT (SFSR_FT_VA_OOR_2|SFSR_FT_VA_OOR_1|SFSR_FT_NFO|SFSR_ILL_ASI|SFSR_FT_IO_ATOMIC|SFSR_FT_ILL_NF|SFSR_FT_PRIV)
                    332:
                    333: #define        SFSR_BITS "\20\31NF\20TM\16VAT\15VAD\14NFO\13ASI\12A\11NF\10PRIV\7E\6NUCLEUS\5SECONDCTX\4PRIV\3W\2OW\1FV"
                    334:
                    335: /* ASFR bits */
                    336: #define        ASFR_ME                 0x100000000LL
                    337: #define        ASFR_PRIV               0x080000000LL
                    338: #define        ASFR_ISAP               0x040000000LL
                    339: #define        ASFR_ETP                0x020000000LL
                    340: #define        ASFR_IVUE               0x010000000LL
                    341: #define        ASFR_TO                 0x008000000LL
                    342: #define        ASFR_BERR               0x004000000LL
                    343: #define        ASFR_LDP                0x002000000LL
                    344: #define        ASFR_CP                 0x001000000LL
                    345: #define        ASFR_WP                 0x000800000LL
                    346: #define        ASFR_EDP                0x000400000LL
                    347: #define        ASFR_UE                 0x000200000LL
                    348: #define        ASFR_CE                 0x000100000LL
                    349: #define        ASFR_ETS                0x0000f0000LL
                    350: #define        ASFT_P_SYND             0x00000ffffLL
                    351:
                    352: #define        AFSR_BITS "\20" \
                    353:     "\20ME\37PRIV\36ISAP\35ETP\34IVUE\33TO\32BERR\31LDP\30CP\27WP\26EDP" \
                    354:     "\25UE\24CE"
                    355:
                    356: /*
                    357:  * Here's the spitfire TSB control register bits.
                    358:  *
                    359:  * Each TSB entry is 16-bytes wide.  The TSB must be size aligned
                    360:  */
                    361: #define        TSB_SIZE_512            0x0     /* 8kB, etc. */
                    362: #define        TSB_SIZE_1K             0x01
                    363: #define        TSB_SIZE_2K             0x02
                    364: #define        TSB_SIZE_4K             0x03
                    365: #define        TSB_SIZE_8K             0x04
                    366: #define        TSB_SIZE_16K            0x05
                    367: #define        TSB_SIZE_32K            0x06
                    368: #define        TSB_SIZE_64K            0x07
                    369: #define        TSB_SPLIT               0x1000
                    370: #define        TSB_BASE                0xffffffffffffe000
                    371:
                    372: /*  TLB Tag Access bits */
                    373: #define        TLB_TAG_ACCESS_VA       0xffffffffffffe000
                    374: #define        TLB_TAG_ACCESS_CTX      0x0000000000001fff
                    375:
                    376: /*
                    377:  * TLB demap registers.  TTEs are defined in v9pte.h
                    378:  *
                    379:  * Use the address space to select between IMMU and DMMU.
                    380:  * The address of the register selects which context register
                    381:  * to read the ASI from.
                    382:  *
                    383:  * The data stored in the register is interpreted as the VA to
                    384:  * use.  The DEMAP_CTX_<> registers ignore the address and demap the
                    385:  * entire ASI.
                    386:  *
                    387:  */
                    388: #define        ASI_IMMU_DEMAP                  0x57    /* [4u] IMMU TLB demap */
                    389: #define        ASI_DMMU_DEMAP                  0x5f    /* [4u] IMMU TLB demap */
                    390:
                    391: #define        DEMAP_PAGE_NUCLEUS              ((0x02)<<4)     /* Demap page from kernel AS */
                    392: #define        DEMAP_PAGE_PRIMARY              ((0x00)<<4)     /* Demap a page from primary CTXT */
                    393: #define        DEMAP_PAGE_SECONDARY            ((0x01)<<4)     /* Demap page from secondary CTXT (DMMU only) */
                    394: #define        DEMAP_CTX_NUCLEUS               ((0x06)<<4)     /* Demap all of kernel CTXT */
                    395: #define        DEMAP_CTX_PRIMARY               ((0x04)<<4)     /* Demap all of primary CTXT */
                    396: #define        DEMAP_CTX_SECONDARY             ((0x05)<<4)     /* Demap all of secondary CTXT */
                    397:
                    398: /*
                    399:  * Interrupt registers.  This really gets hairy.
                    400:  */
                    401:
                    402: /* IRSR -- Interrupt Receive Status Ragister */
                    403: #define        ASI_IRSR        0x49
                    404: #define        IRSR            0x00
                    405: #define        IRSR_BUSY       0x020
                    406: #define        IRSR_MID(x)     (x&0x1f)
                    407:
                    408: /* IRDR -- Interrupt Receive Data Registers */
                    409: #define        ASI_IRDR        0x7f
                    410: #define        IRDR_0H         0x40
                    411: #define        IRDR_0L         0x48    /* unimplemented */
                    412: #define        IRDR_1H         0x50
                    413: #define        IRDR_1L         0x58    /* unimplemented */
                    414: #define        IRDR_2H         0x60
                    415: #define        IRDR_2L         0x68    /* unimplemented */
                    416: #define        IRDR_3H         0x70    /* unimplemented */
                    417: #define        IRDR_3L         0x78    /* unimplemented */
                    418:
                    419: /* SOFTINT ASRs */
                    420: #define        SET_SOFTINT     %asr20  /* Sets these bits */
                    421: #define        CLEAR_SOFTINT   %asr21  /* Clears these bits */
                    422: #define        SOFTINT         %asr22  /* Reads the register */
                    423: #define        TICK_CMPR       %asr23
                    424:
                    425: #define        TICK_INT        0x01    /* level-14 clock tick */
                    426: #define        SOFTINT1        (0x1<<1)
                    427: #define        SOFTINT2        (0x1<<2)
                    428: #define        SOFTINT3        (0x1<<3)
                    429: #define        SOFTINT4        (0x1<<4)
                    430: #define        SOFTINT5        (0x1<<5)
                    431: #define        SOFTINT6        (0x1<<6)
                    432: #define        SOFTINT7        (0x1<<7)
                    433: #define        SOFTINT8        (0x1<<8)
                    434: #define        SOFTINT9        (0x1<<9)
                    435: #define        SOFTINT10       (0x1<<10)
                    436: #define        SOFTINT11       (0x1<<11)
                    437: #define        SOFTINT12       (0x1<<12)
                    438: #define        SOFTINT13       (0x1<<13)
                    439: #define        SOFTINT14       (0x1<<14)
                    440: #define        SOFTINT15       (0x1<<15)
                    441:
                    442: /* Interrupt Dispatch -- usually reserved for cross-calls */
                    443: #define        ASR_IDSR        0x48 /* Interrupt dispatch status reg */
                    444: #define        IDSR            0x00
                    445: #define        IDSR_NACK       0x02
                    446: #define        IDSR_BUSY       0x01
                    447:
                    448: #define        ASI_INTERRUPT_DISPATCH          0x77    /* [4u] spitfire interrupt dispatch regs */
                    449: #define        IDCR(x)         (((x)<<14)&0x70)        /* Store anything to this address to dispatch crosscall to CPU (x) */
                    450: #define        IDDR_0H         0x40                    /* Store data to send in these regs */
                    451: #define        IDDR_0L         0x48    /* unimplemented */
                    452: #define        IDDR_1H         0x50
                    453: #define        IDDR_1L         0x58    /* unimplemented */
                    454: #define        IDDR_2H         0x60
                    455: #define        IDDR_2L         0x68    /* unimplemented */
                    456: #define        IDDR_3H         0x70    /* unimplemented */
                    457: #define        IDDR_3L         0x78    /* unimplemented */
                    458:
                    459: /*
                    460:  * Error registers
                    461:  */
                    462:
                    463: /* Since we won't try to fix async errs, we don't care about the bits in the regs */
                    464: #define        ASI_AFAR        0x4d    /* Asynchronous fault address register */
                    465: #define        AFAR            0x00
                    466: #define        ASI_AFSR        0x4c    /* Asynchronous fault status register */
                    467: #define        AFSR            0x00
                    468:
                    469: #define        ASI_P_EER       0x4b    /* Error enable register */
                    470: #define        P_EER           0x00
                    471: #define        P_EER_ISAPEN    0x04    /* Enable fatal on ISAP */
                    472: #define        P_EER_NCEEN     0x02    /* Enable trap on uncorrectable errs */
                    473: #define        P_EER_CEEN      0x01    /* Enable trap on correctable errs */
                    474:
                    475: #define        ASI_DATAPATH_READ       0x7f /* Read the regs */
                    476: #define        ASI_DATAPATH_WRITE      0x77 /* Write to the regs */
                    477: #define        P_DPER_0        0x00    /* Datapath err reg 0 */
                    478: #define        P_DPER_1        0x18    /* Datapath err reg 1 */
                    479: #define        P_DCR_0         0x20    /* Datapath control reg 0 */
                    480: #define        P_DCR_1         0x38    /* Datapath control reg 0 */
                    481:
                    482:
                    483: /* From sparc64/asm.h which I think I'll deprecate since it makes bus.h a pain. */
                    484:
                    485: #ifndef _LOCORE
                    486: /*
                    487:  * GCC __asm constructs for doing assembly stuff.
                    488:  */
                    489:
                    490: /*
                    491:  * ``Routines'' to load and store from/to alternate address space.
                    492:  * The location can be a variable, the asi value (address space indicator)
                    493:  * must be a constant.
                    494:  *
                    495:  * N.B.: You can put as many special functions here as you like, since
                    496:  * they cost no kernel space or time if they are not used.
                    497:  *
                    498:  * These were static inline functions, but gcc screws up the constraints
                    499:  * on the address space identifiers (the "n"umeric value part) because
                    500:  * it inlines too late, so we have to use the funny valued-macro syntax.
                    501:  */
                    502:
                    503: /*
                    504:  * Apparently the definition of bypass ASIs is that they all use the
                    505:  * D$ so we need to flush the D$ to make sure we don't get data pollution.
                    506:  */
                    507:
                    508: extern __inline u_int32_t sparc_cas(u_int32_t *, u_int32_t, u_int32_t);
                    509: extern __inline u_int32_t
                    510: sparc_cas(u_int32_t *rs1, u_int32_t rs2, u_int32_t rd)
                    511: {
                    512:        __asm __volatile("casa [%1] ASI_PRIMARY, %2, %0"
                    513:            : "+r" (rd)
                    514:            : "r" (rs1), "r" (rs2)
                    515:            : "memory" );
                    516:        return (rd);
                    517: }
                    518:
                    519: extern __inline u_int64_t sparc_casx(u_int64_t *, u_int64_t, u_int64_t);
                    520: extern __inline u_int64_t
                    521: sparc_casx(u_int64_t *rs1, u_int64_t rs2, u_int64_t rd)
                    522: {
                    523:        __asm __volatile("casxa [%1] ASI_PRIMARY, %3, %0"
                    524:            : "+r" (rd)
                    525:            : "r" (rs1), "r" (rs2)
                    526:            : "memory" );
                    527:        return (rd);
                    528: }
                    529:
                    530: #define sparc_membar(mask) do {                                         \
                    531:         if (mask)                                                       \
                    532:                 __asm __volatile("membar %0" : : "n" (mask) : "memory");\
                    533:         else                                                            \
                    534:                 __asm __volatile("" : : : "memory");                    \
                    535: } while(0)
                    536:
                    537: #define membar sparc_membar
                    538: #define Lookaside       CMASK_GEN(C_Lookaside)
                    539: #define MemIssue        CMASK_GEN(C_MemIssue)
                    540: #define Sync            CMASK_GEN(C_Sync)
                    541: #define LoadLoad        MMASK_GEN(M_LoadLoad)
                    542: #define StoreLoad       MMASK_GEN(M_StoreLoad)
                    543: #define LoadStore       MMASK_GEN(M_LoadStore)
                    544: #define StoreStore      MMASK_GEN(M_StoreStore)
                    545:
                    546: #define sparc_wr(name, val, xor)                                       \
                    547: do {                                                                   \
                    548:        if (__builtin_constant_p(xor))                                  \
                    549:                __asm __volatile("wr %%g0, %0, %%" #name                \
                    550:                    : : "rI" ((val) ^ (xor)) : "%g0");                  \
                    551:        else                                                            \
                    552:                __asm __volatile("wr %0, %1, %%" #name                  \
                    553:                    : : "r" (val), "rI" (xor) : "%g0");                 \
                    554: } while(0)
                    555:
                    556: #define sparc_wrpr(name, val, xor)                                     \
                    557: do {                                                                   \
                    558:        if (__builtin_constant_p(xor))                                  \
                    559:                __asm __volatile("wrpr %%g0, %0, %%" #name              \
                    560:                    : : "rI" ((val) ^ (xor)) : "%g0");                  \
                    561:        else                                                            \
                    562:                __asm __volatile("wrpr %0, %1, %%" #name                \
                    563:                    : : "r" (val), "rI" (xor) : "%g0");                 \
                    564: } while(0)
                    565:
                    566:
                    567: #define sparc_rd(name) sparc_rd_ ## name()
                    568: #define GEN_RD(name)                                                   \
                    569: extern __inline u_int64_t sparc_rd_ ## name(void);                     \
                    570: extern __inline u_int64_t                                              \
                    571: sparc_rd_ ## name()                                                    \
                    572: {                                                                      \
                    573:        u_int64_t r;                                                    \
                    574:        __asm __volatile("rd %%" #name ", %0" :                         \
                    575:            "=r" (r) : : "%g0");                                        \
                    576:        return (r);                                                     \
                    577: }
                    578:
                    579: #define sparc_rdpr(name) sparc_rdpr_ ## name()
                    580: #define GEN_RDPR(name)                                                 \
                    581: extern __inline u_int64_t sparc_rdpr_ ## name(void);                   \
                    582: extern __inline u_int64_t                                              \
                    583: sparc_rdpr_ ## name()                                                  \
                    584: {                                                                      \
                    585:        u_int64_t r;                                                    \
                    586:        __asm __volatile("rdpr %%" #name ", %0" :                       \
                    587:            "=r" (r) : : "%g0");                                        \
                    588:        return (r);                                                     \
                    589: }
                    590:
                    591: GEN_RD(asi);
                    592: GEN_RD(asr22);
                    593: GEN_RDPR(cwp);
                    594: GEN_RDPR(tick);
                    595: GEN_RDPR(pstate);
                    596: GEN_RDPR(pil);
                    597: GEN_RDPR(ver);
                    598: /*
                    599:  * Before adding GEN_RDPRs for other registers, see Errata 50 (E.g,. in
                    600:  * the US-IIi manual) regarding tstate, pc and npc reads.
                    601:  */
                    602:
                    603: /* Generate ld*a/st*a functions for non-constant ASI's. */
                    604: #define LDNC_GEN(tp, o)                                                        \
                    605:        extern __inline tp o ## _asi(paddr_t);                          \
                    606:        extern __inline tp                                              \
                    607:        o ## _asi(paddr_t va)                                           \
                    608:        {                                                               \
                    609:                tp r;                                                   \
                    610:                __asm __volatile(                                       \
                    611:                    #o " [%1] %%asi, %0"                                \
                    612:                    : "=r" (r)                                          \
                    613:                    : "r" ((volatile tp *)va)                           \
                    614:                    : "%g0");                                           \
                    615:                return (r);                                             \
                    616:        }                                                               \
                    617:        extern __inline tp o ## _nc(paddr_t, int);                      \
                    618:        extern __inline tp                                              \
                    619:        o ## _nc(paddr_t va, int asi)                                   \
                    620:        {                                                               \
                    621:                sparc_wr(asi, asi, 0);                                  \
                    622:                return (o ## _asi(va));                                 \
                    623:        }
                    624:
                    625: LDNC_GEN(u_char, lduba);
                    626: LDNC_GEN(u_short, lduha);
                    627: LDNC_GEN(u_int, lduwa);
                    628: LDNC_GEN(u_int64_t, ldxa);
                    629:
                    630: LDNC_GEN(int, lda);
                    631:
                    632: #define LDC_GEN(va, asi, op, opa, type) ({                             \
                    633:        type __r ## op ## type;                                         \
                    634:        if(asi == ASI_PRIMARY  ||                                       \
                    635:            (sizeof(type) == 1 && asi == ASI_PRIMARY_LITTLE))           \
                    636:                __r ## op ## type = *((volatile type *)va);             \
                    637:        else                                                            \
                    638:                __asm __volatile(#opa " [%1] " #asi ", %0"              \
                    639:                    : "=r" (__r ## op ## type)                          \
                    640:                    : "r" ((volatile type *)va)                         \
                    641:                    : "%g0");                                           \
                    642:        __r ## op ## type;                                              \
                    643: })
                    644:
                    645: #ifdef __OPTIMIZE__
                    646: #define LD_GENERIC(va, asi, op, type) (__builtin_constant_p(asi) ?     \
                    647:        LDC_GEN((va), asi, op, op ## a, type) : op ## a_nc((va), asi))
                    648: #else /* __OPTIMIZE */
                    649: #define LD_GENERIC(va, asi, op, type) (op ## a_nc((va), asi))
                    650: #endif /* __OPTIMIZE__ */
                    651:
                    652: #define lduba(va, asi) LD_GENERIC(va, asi, ldub, u_int8_t)
                    653: #define lduha(va, asi) LD_GENERIC(va, asi, lduh, u_int16_t)
                    654: #define lduwa(va, asi) LD_GENERIC(va, asi, lduw, u_int32_t)
                    655: #define ldxa(va, asi)  LD_GENERIC(va, asi, ldx, u_int64_t)
                    656:
                    657: #define STNC_GEN(tp, o)                                                        \
                    658:        extern __inline void o ## _asi(paddr_t, tp);                    \
                    659:        extern __inline void                                            \
                    660:        o ## _asi(paddr_t va, tp val)                                   \
                    661:        {                                                               \
                    662:                __asm __volatile(                                       \
                    663:                    #o " %0, [%1] %%asi"                                \
                    664:                    :                                                   \
                    665:                    : "r" (val), "r" ((volatile tp *)va)                \
                    666:                    : "memory");                                        \
                    667:        }                                                               \
                    668:        extern __inline void o ## _nc(paddr_t, int, tp);                \
                    669:        extern __inline void                                            \
                    670:        o ## _nc(paddr_t va, int asi, tp val)                           \
                    671:        {                                                               \
                    672:                sparc_wr(asi, asi, 0);                                  \
                    673:                o ## _asi(va, val);                                     \
                    674:        }
                    675:
                    676: STNC_GEN(u_int8_t, stba);
                    677: STNC_GEN(u_int16_t, stha);
                    678: STNC_GEN(u_int32_t, stwa);
                    679: STNC_GEN(u_int64_t, stxa);
                    680:
                    681: STNC_GEN(u_int, sta);
                    682:
                    683: #define STC_GEN(va, asi, val, op, opa, type) ({                                \
                    684:        if(asi == ASI_PRIMARY ||                                        \
                    685:            (sizeof(type) == 1 && asi == ASI_PRIMARY_LITTLE))           \
                    686:                *((volatile type *)va) = val;                           \
                    687:        else                                                            \
                    688:                __asm __volatile(#opa " %0, [%1] " #asi                 \
                    689:                    : : "r" (val), "r" ((volatile type *)va)            \
                    690:                    : "memory");                                        \
                    691:        })
                    692:
                    693: #ifdef __OPTIMIZE__
                    694: #define ST_GENERIC(va, asi, val, op, type) (__builtin_constant_p(asi) ?        \
                    695:        STC_GEN((va), (asi), (val), op, op ## a, type) :                \
                    696:        op ## a_nc((va), asi, (val)))
                    697: #else /* __OPTIMIZE__ */
                    698: #define ST_GENERIC(va, asi, val, op, type) (op ## a_nc((va), asi, (val)))
                    699: #endif /* __OPTIMIZE__ */
                    700:
                    701: #define stba(va, asi, val)     ST_GENERIC(va, asi, val, stb, u_int8_t)
                    702: #define stha(va, asi, val)     ST_GENERIC(va, asi, val, sth, u_int16_t)
                    703: #define stwa(va, asi, val)     ST_GENERIC(va, asi, val, stw, u_int32_t)
                    704: #define stxa(va, asi, val)     ST_GENERIC(va, asi, val, stx, u_int64_t)
                    705:
                    706:
                    707: extern __inline void asi_set(int);
                    708: extern __inline
                    709: void asi_set(int asi)
                    710: {
                    711:        sparc_wr(asi, asi, 0);
                    712: }
                    713:
                    714: extern __inline u_int8_t asi_get(void);
                    715: extern __inline
                    716: u_int8_t asi_get()
                    717: {
                    718:        return sparc_rd(asi);
                    719: }
                    720:
                    721: /* flush address from instruction cache */
                    722: extern __inline void flush(void *);
                    723: extern __inline
                    724: void flush(void *p)
                    725: {
                    726:        __asm __volatile("flush %0"
                    727:            : : "r" (p)
                    728:            : "memory");
                    729: }
                    730:
                    731: /* read 64-bit %tick register */
                    732: #define tick() (sparc_rdpr(tick) & TICK_TICKS)
                    733:
                    734: extern void next_tick(long);
                    735:
                    736: #endif /* _LOCORE */
                    737: #endif /* _SPARC64_CTLREG_ */

CVSweb