Annotation of tme/ic/sparc/sparc-impl.h, revision 1.1.1.1

1.1       root        1: /* $Id: sparc-impl.h,v 1.5 2007/03/29 01:13:33 fredette Exp $ */
                      2: 
                      3: /* ic/sparc/sparc-impl.h - implementation header file for SPARC emulation: */
                      4: 
                      5: /*
                      6:  * Copyright (c) 2005 Matt Fredette
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
                     19:  *      This product includes software developed by Matt Fredette.
                     20:  * 4. The name of the author may not be used to endorse or promote products
                     21:  *    derived from this software without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     25:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     26:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     27:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     28:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     29:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     30:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     31:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     32:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     33:  * POSSIBILITY OF SUCH DAMAGE.
                     34:  */
                     35: 
                     36: #ifndef _IC_SPARC_IMPL_H
                     37: #define _IC_SPARC_IMPL_H
                     38: 
                     39: #include <tme/common.h>
                     40: _TME_RCSID("$Id: sparc-impl.h,v 1.5 2007/03/29 01:13:33 fredette Exp $");
                     41: 
                     42: /* includes: */
                     43: #include <tme/ic/sparc.h>
                     44: #include <tme/ic/ieee754.h>
                     45: #include <tme/generic/ic.h>
                     46: #include <setjmp.h>
                     47: 
                     48: /* macros: */
                     49: 
                     50: /* generic registers: */
                     51: #define tme_sparc_ireg_uint64(x)       tme_sparc_ic.tme_ic_ireg_uint64(x)
                     52: #define tme_sparc_ireg_int64(x)                tme_sparc_ic.tme_ic_ireg_int64(x)
                     53: #define tme_sparc_ireg_uint32(x)       tme_sparc_ic.tme_ic_ireg_uint32(x)
                     54: #define tme_sparc_ireg_int32(x)                tme_sparc_ic.tme_ic_ireg_int32(x)
                     55: #define tme_sparc_ireg_uint8(x)                tme_sparc_ic.tme_ic_ireg_uint8(x)
                     56: 
                     57: /* format 3 instruction fields: */
                     58: #define TME_SPARC_FORMAT3_MASK_RS2     (0x1f <<  0)
                     59: #define TME_SPARC_FORMAT3_MASK_RS1     (0x1f << 14)
                     60: #define TME_SPARC_FORMAT3_MASK_RD      (0x1f << 25)
                     61: 
                     62: /* traps: */
                     63: #define TME_SPARC_TRAP_none                            (0x00)
                     64: #define TME_SPARC_TRAP_reset                           (0x100)
                     65: #define TME_SPARC_TRAP_instruction_access_MMU_miss     (0x3C)
                     66: #define TME_SPARC_TRAP_instruction_access_error                (0x21)
                     67: #define TME_SPARC_TRAP_r_register_access_error         (0x20)
                     68: #define TME_SPARC_TRAP_instruction_access_exception    (0x01)
                     69: #define TME_SPARC_TRAP_privileged_instruction          (0x03)
                     70: #define TME_SPARC_TRAP_illegal_instruction             (0x02)
                     71: #define TME_SPARC_TRAP_fp_disabled                     (0x04)
                     72: #define TME_SPARC_TRAP_cp_disabled                     (0x24)
                     73: #define TME_SPARC_TRAP_unimplemented_FLUSH             (0x25)
                     74: #define TME_SPARC_TRAP_watchpoint_detected             (0x0B)
                     75: #define TME_SPARC_TRAP_window_overflow                 (0x05)
                     76: #define TME_SPARC_TRAP_window_underflow                        (0x06)
                     77: #define TME_SPARC_TRAP_mem_address_not_aligned         (0x07)
                     78: #define TME_SPARC_TRAP_fp_exception                    (0x08)
                     79: #define TME_SPARC_TRAP_cp_exception                    (0x28)
                     80: #define TME_SPARC_TRAP_data_access_error               (0x29)
                     81: #define TME_SPARC_TRAP_data_access_MMU_miss            (0x2C)
                     82: #define TME_SPARC_TRAP_data_access_exception           (0x09)
                     83: #define TME_SPARC_TRAP_tag_overflow                    (0x0A)
                     84: #define TME_SPARC_TRAP_division_by_zero                        (0x2A)
                     85: #define TME_SPARC_TRAP_trap_instruction(x)             (0x80 + (x))
                     86: #define TME_SPARC_TRAP_interrupt_level(il)             (0x10 + (il))
                     87: 
                     88: /* SPARC FPU FSR fields: */
                     89: #define TME_SPARC_FSR_RND              (0xc0000000)
                     90: #define  TME_SPARC_FSR_RND_RN           (0x00000000)
                     91: #define  TME_SPARC_FSR_RND_RZ           (0x40000000)
                     92: #define  TME_SPARC_FSR_RND_RP           (0x80000000)
                     93: #define  TME_SPARC_FSR_RND_RM           (0xc0000000)
                     94: #define TME_SPARC_FSR_TEM              (0x0f800000)
                     95: #define TME_SPARC_FSR_NS               TME_BIT(22)
                     96: #define TME_SPARC_FSR_VER              (0x000e0000)
                     97: #define  TME_SPARC_FSR_VER_missing      (0x000e0000)
                     98: #define TME_SPARC_FSR_FTT              (0x0001c000)
                     99: #define  TME_SPARC_FSR_FTT_none                        (0x00000000)
                    100: #define  TME_SPARC_FSR_FTT_IEEE754_exception   (0x00004000)
                    101: #define  TME_SPARC_FSR_FTT_unfinished_FPop     (0x00008000)
                    102: #define  TME_SPARC_FSR_FTT_unimplemented_FPop  (0x0000c000)
                    103: #define  TME_SPARC_FSR_FTT_sequence_error      (0x00010000)
                    104: #define  TME_SPARC_FSR_FTT_hardware_error      (0x00014000)
                    105: #define  TME_SPARC_FSR_FTT_invalid_fp_register (0x00018000)
                    106: #define TME_SPARC_FSR_QNE              TME_BIT(13)
                    107: #define TME_SPARC_FSR_FCC              (0x00000c00)
                    108: #define  TME_SPARC_FSR_FCC_EQ           (0x00000000)
                    109: #define  TME_SPARC_FSR_FCC_LT           (0x00000400)
                    110: #define  TME_SPARC_FSR_FCC_GT           (0x00000800)
                    111: #define  TME_SPARC_FSR_FCC_UN           (0x00000c00)
                    112: #define TME_SPARC_FSR_AEXC             (0x000003e0)
                    113: #define TME_SPARC_FSR_CEXC             (0x0000001f)
                    114: #define  TME_SPARC_FSR_CEXC_NVC                TME_BIT(4)
                    115: #define  TME_SPARC_FSR_CEXC_OFC                TME_BIT(3)
                    116: #define  TME_SPARC_FSR_CEXC_UFC                TME_BIT(2)
                    117: #define  TME_SPARC_FSR_CEXC_DZC                TME_BIT(1)
                    118: #define  TME_SPARC_FSR_CEXC_NXC                TME_BIT(0)
                    119: 
                    120: /* sparc32 PSR fields: */
                    121: #define TME_SPARC32_PSR_IMPL   (0xf0000000)
                    122: #define TME_SPARC32_PSR_VER    (0x0f000000)
                    123: #define TME_SPARC32_PSR_ICC_N  TME_BIT(23)
                    124: #define TME_SPARC32_PSR_ICC_Z  TME_BIT(22)
                    125: #define TME_SPARC32_PSR_ICC_V  TME_BIT(21)
                    126: #define TME_SPARC32_PSR_ICC_C  TME_BIT(20)
                    127: #define TME_SPARC32_PSR_ICC    (TME_SPARC32_PSR_ICC_N | TME_SPARC32_PSR_ICC_Z | TME_SPARC32_PSR_ICC_V | TME_SPARC32_PSR_ICC_C)
                    128: #define TME_SPARC32_PSR_EC     TME_BIT(13)
                    129: #define TME_SPARC32_PSR_EF     TME_BIT(12)
                    130: #define TME_SPARC32_PSR_PIL    (0x00000f00)
                    131: #define TME_SPARC32_PSR_S      TME_BIT(7)
                    132: #define TME_SPARC32_PSR_PS     TME_BIT(6)
                    133: #define TME_SPARC32_PSR_ET     TME_BIT(5)
                    134: #define TME_SPARC32_PSR_CWP    (0x0000001f)
                    135: 
                    136: /* sparc64 PSTATE flags: */
                    137: #define TME_SPARC64_PSTATE_CLE TME_BIT(9)
                    138: #define TME_SPARC64_PSTATE_PRIV        TME_BIT(2)
                    139: #define TME_SPARC64_PSTATE_PEF TME_BIT(4)
                    140: 
                    141: /* sparc64 CCR flags: */
                    142: #define TME_SPARC64_CCR_XCC_N  TME_BIT(7)
                    143: #define TME_SPARC64_CCR_XCC_Z  TME_BIT(6)
                    144: #define TME_SPARC64_CCR_XCC_V  TME_BIT(5)
                    145: #define TME_SPARC64_CCR_XCC_C  TME_BIT(4)
                    146: #define TME_SPARC64_CCR_ICC_N  TME_BIT(3)
                    147: #define TME_SPARC64_CCR_ICC_Z  TME_BIT(2)
                    148: #define TME_SPARC64_CCR_ICC_V  TME_BIT(1)
                    149: #define TME_SPARC64_CCR_ICC_C  TME_BIT(0)
                    150: #define TME_SPARC64_CCR_ICC    (TME_SPARC64_CCR_ICC_N | TME_SPARC64_CCR_ICC_Z | TME_SPARC64_CCR_ICC_V | TME_SPARC64_CCR_ICC_C)
                    151: 
                    152: /* idle types and idle type state: */
                    153: #define TME_SPARC_IDLE_TYPE_NULL               (0)
                    154: #define TME_SPARC_IDLE_TYPE_NETBSD32_TYPE_0    TME_BIT(0)
                    155: #define TME_SPARC_IDLE_TYPE_SUNOS32_TYPE_0     TME_BIT(1)
                    156: #define TME_SPARC_IDLE_TYPES_SUPPORTED         (((unsigned int) 0) - 1)
                    157: #define TME_SPARC_IDLE_TYPE_IS(ic, x)          \
                    158:   ((TME_SPARC_IDLE_TYPES_SUPPORTED & (x))      \
                    159:    && (ic)->tme_sparc_idle_type == (x))
                    160: #define TME_SPARC_IDLE_TYPE_PC_STATE(x)                ((x) % sizeof(tme_uint32_t))
                    161: 
                    162: /* major modes of the emulator: */
                    163: #define TME_SPARC_MODE_EXECUTION       (0)
                    164: #define TME_SPARC_MODE_STOP            (1)
                    165: #define TME_SPARC_MODE_HALT            (2)
                    166: 
                    167: /* the maximum number of windows: */
                    168: #define TME_SPARC_WINDOWS_MAX          (16)
                    169: 
                    170: /* given a CWP value, this returns the CWP register offset: */
                    171: #define TME_SPARC_CWP_OFFSET(cwp)      ((cwp) * 16)
                    172: 
                    173: /* this converts the given lvalue from a register number into a
                    174:    register set index: */
                    175: #define TME_SPARC_REG_INDEX(ic, reg)                           \
                    176:   do {                                                         \
                    177:     if ((reg) > 7) {                                           \
                    178:       (reg) += ic->tme_sparc_cwp_offset;                       \
                    179:     }                                                          \
                    180:     if ((reg)                                                  \
                    181:        > (TME_SPARC_CWP_OFFSET(TME_SPARC_NWINDOWS(ic)) + 7)) { \
                    182:       (reg) -= TME_SPARC_CWP_OFFSET(TME_SPARC_NWINDOWS(ic));   \
                    183:     }                                                          \
                    184:   } while (/* CONSTCOND */ 0)
                    185: 
                    186: /* given a linear address, this hashes it into a DTLB entry: */
                    187: #define _TME_SPARC_DTLB_HASH_SIZE      (1024)
                    188: #define TME_SPARC_DTLB_ENTRY(ic, address)      \
                    189:   (tme_memory_atomic_pointer_read(struct tme_sparc_tlb *,      \
                    190:                                  (ic)->_tme_sparc_dtlb_array,  \
                    191:                                  &(ic)->_tme_sparc_tlb_rwlock) \
                    192:    + ((address >> 10) & (_TME_SPARC_DTLB_HASH_SIZE - 1)))
                    193: 
                    194: /* the size of the ITLB hash: */
                    195: #define _TME_SPARC_ITLB_HASH_SIZE      (32)
                    196: 
                    197: /* flags for the slow load and store functions: */
                    198: #define TME_SPARC_SLOW_FLAG_A                  TME_BIT(5)
                    199: #define TME_SPARC_SLOW_FLAG_ATOMIC             TME_BIT(6)
                    200: #define TME_SPARC_SLOW_FLAG_INSN               TME_BIT(7)
                    201: #define TME_SPARC_SLOW_FLAG_NO_FAULTS          TME_BIT(8)
                    202: 
                    203: /* flags for FPU features: */
                    204: #define TME_SPARC_FPU_FLAG_NO_QUAD             TME_BIT(0)
                    205: #define TME_SPARC_FPU_FLAG_NO_FSQRT            TME_BIT(1)
                    206: #define TME_SPARC_FPU_FLAG_NO_FMUL_WIDER       TME_BIT(2)
                    207: #define TME_SPARC_FPU_FLAG_OK_REG_MISALIGNED   TME_BIT(3)
                    208: 
                    209: /* FPU modes: */
                    210: #define TME_SPARC_FPU_MODE_EXECUTE             (0)
                    211: #define TME_SPARC_FPU_MODE_EXCEPTION_PENDING   (1)
                    212: #define TME_SPARC_FPU_MODE_EXCEPTION           (2)
                    213: 
                    214: /* instruction handler macros: */
                    215: #define TME_SPARC_FORMAT3_DECL(name, type) void name _TME_P((struct tme_sparc *, const type *, const type *, type *))
                    216: #ifdef __STDC__
                    217: #define TME_SPARC_FORMAT3(name, type) void name(struct tme_sparc *ic, const type *_rs1, const type *_rs2, type *_rd)
                    218: #else  /* !__STDC__ */
                    219: #define TME_SPARC_FORMAT3(name, type) void name(ic, _rs1, _rs2, _rd) struct tme_sparc *ic; const type *_rs1, *_rs2; type *_rd;
                    220: #endif /* !__STDC__ */
                    221: #define TME_SPARC_FORMAT3_RS1          (*_rs1)
                    222: #define TME_SPARC_FORMAT3_RS2          (*_rs2)
                    223: #define TME_SPARC_FORMAT3_RD           (*_rd)
                    224: #define TME_SPARC_FORMAT3_RD_ODD       (*(_rd + (&(((struct tme_ic *) NULL)->tme_ic_ireg_uint32(1)) - &(((struct tme_ic *) NULL)->tme_ic_ireg_uint32(0)))))
                    225: #define TME_SPARC_INSN                 ic->_tme_sparc_insn
                    226: #define TME_SPARC_INSN_OK              return
                    227: #define TME_SPARC_INSN_TRAP(trap)                      \
                    228:   do {                                                 \
                    229:     if (TME_SPARC_VERSION(ic) < 9) {                   \
                    230:       tme_sparc32_trap(ic, trap);                      \
                    231:     }                                                  \
                    232:     else {                                             \
                    233:       tme_sparc64_trap(ic, trap);                      \
                    234:     }                                                  \
                    235:   } while (/* CONSTCOND */ 0)
                    236: #define TME_SPARC_INSN_PRIV                            \
                    237:   do {                                                 \
                    238:     if (__tme_predict_false(!TME_SPARC_PRIV(ic))) {    \
                    239:       TME_SPARC_INSN_TRAP(TME_SPARC_TRAP_privileged_instruction);\
                    240:     }                                                  \
                    241:   } while (/* CONSTCOND */ 0)
                    242: #define TME_SPARC_INSN_FPU                             \
                    243:   do {                                                 \
                    244:     if (__tme_predict_false((TME_SPARC_VERSION(ic) < 9)        \
                    245:                            ? ((ic)->tme_sparc32_ireg_psr & TME_SPARC32_PSR_EF) == 0 \
                    246:                            : ((ic)->tme_sparc64_ireg_pstate & TME_SPARC64_PSTATE_PEF) == 0)) { \
                    247:       TME_SPARC_INSN_TRAP(TME_SPARC_TRAP_fp_disabled); \
                    248:     }                                                  \
                    249:     if (__tme_predict_false((ic)->tme_sparc_fpu_mode   \
                    250:                            != TME_SPARC_FPU_MODE_EXECUTE)) { \
                    251:       tme_sparc_fpu_exception_check(ic);               \
                    252:     }                                                  \
                    253:   } while (/* CONSTCOND */ 0)
                    254: #define TME_SPARC_INSN_FPU_STORE(size)                 \
                    255:   do {                                                 \
                    256:     if (__tme_predict_false((TME_SPARC_VERSION(ic) < 9)        \
                    257:                            ? ((ic)->tme_sparc32_ireg_psr & TME_SPARC32_PSR_EF) == 0 \
                    258:                            : ((ic)->tme_sparc64_ireg_pstate & TME_SPARC64_PSTATE_PEF) == 0)) { \
                    259:       TME_SPARC_INSN_TRAP(TME_SPARC_TRAP_fp_disabled); \
                    260:     }                                                  \
                    261:     if (__tme_predict_false(((TME_SPARC_FORMAT3_RS1    \
                    262:                              + TME_SPARC_FORMAT3_RS2)  \
                    263:                            % (size)) != 0)) {          \
                    264:       TME_SPARC_INSN_TRAP(TME_SPARC_TRAP_mem_address_not_aligned); \
                    265:     }                                                  \
                    266:     if (__tme_predict_false((ic)->tme_sparc_fpu_mode   \
                    267:                            == TME_SPARC_FPU_MODE_EXCEPTION_PENDING)) { \
                    268:       tme_sparc_fpu_exception_check(ic);               \
                    269:     }                                                  \
                    270:   } while (/* CONSTCOND */ 0)
                    271: 
                    272: #define TME_SPARC_INSN_ILL                             \
                    273:   TME_SPARC_INSN_TRAP(TME_SPARC_TRAP_illegal_instruction)
                    274: 
                    275: /* logging: */
                    276: #define TME_SPARC_LOG_HANDLE(ic)                               \
                    277:   (&(ic)->tme_sparc_element->tme_element_log_handle)
                    278: #define tme_sparc_log_start(ic, level, rc)                     \
                    279:   do {                                                         \
                    280:     tme_log_start(TME_SPARC_LOG_HANDLE(ic), level, rc) {       \
                    281:       if ((ic)->_tme_sparc_mode != TME_SPARC_MODE_EXECUTION) { \
                    282:         tme_log_part(TME_SPARC_LOG_HANDLE(ic),                 \
                    283:                      "mode=%d ",                               \
                    284:                      (ic)->_tme_sparc_mode);                   \
                    285:       }                                                                \
                    286:       else {                                                   \
                    287:         tme_log_part(TME_SPARC_LOG_HANDLE(ic),                 \
                    288:                     "pc=%c/0x%08x ",                           \
                    289:                     (TME_SPARC_PRIV(ic)                        \
                    290:                      ? 'S'                                     \
                    291:                      : 'U'),                                   \
                    292:                     ((TME_SPARC_VERSION(ic) < 9)               \
                    293:                      ? ic->tme_sparc_ireg_uint32(TME_SPARC_IREG_PC)\
                    294:                      : (tme_uint32_t) ic->tme_sparc_ireg_uint64(TME_SPARC_IREG_PC)));\
                    295:       }                                                                \
                    296:       do
                    297: #define tme_sparc_log_finish(ic)                               \
                    298:       while (/* CONSTCOND */ 0);                               \
                    299:     } tme_log_finish(TME_SPARC_LOG_HANDLE(ic));                        \
                    300:   } while (/* CONSTCOND */ 0)
                    301: #define tme_sparc_log(ic, level, rc, x)                \
                    302:   do {                                         \
                    303:     tme_sparc_log_start(ic, level, rc) {       \
                    304:       tme_log_part x;                          \
                    305:     } tme_sparc_log_finish(ic);                        \
                    306:   } while (/* CONSTCOND */ 0)
                    307: 
                    308: /* miscellaneous: */
                    309: #define _TME_SPARC_VERSION(ic) ((ic)->tme_sparc_version)
                    310: #define _TME_SPARC_NWINDOWS(ic) ((ic)->tme_sparc_nwindows)
                    311: #define _TME_SPARC32_PRIV(ic)   (((ic)->tme_sparc32_ireg_psr & TME_SPARC32_PSR_S) != 0)
                    312: #define _TME_SPARC64_PRIV(ic)   (((ic)->tme_sparc64_ireg_pstate & TME_SPARC64_PSTATE_PRIV) != 0)
                    313: #define TME_SPARC_VERSION(ic)  _TME_SPARC_VERSION(ic)
                    314: #define TME_SPARC_NWINDOWS(ic) _TME_SPARC_NWINDOWS(ic)
                    315: #define TME_SPARC_PRIV(ic)             \
                    316:   ((TME_SPARC_VERSION(ic) < 9)         \
                    317:    ? _TME_SPARC32_PRIV(ic)             \
                    318:    : _TME_SPARC64_PRIV(ic))
                    319: #define TME_SPARC_ASI_DATA(ic)         \
                    320:   ((TME_SPARC_VERSION(ic) < 9)         \
                    321:    ? (_TME_SPARC32_PRIV(ic)            \
                    322:       ? TME_SPARC32_ASI_SD             \
                    323:       : TME_SPARC32_ASI_UD)            \
                    324:    : ((ic->tme_sparc64_ireg_pstate & TME_SPARC64_PSTATE_CLE)\
                    325:       ? TME_SPARC64_ASI_PRIMARY_LITTLE \
                    326:       : TME_SPARC64_ASI_PRIMARY))
                    327: 
                    328: /* structures: */
                    329: struct tme_sparc;
                    330: 
                    331: /* format 3 instruction functions: */
                    332: typedef TME_SPARC_FORMAT3_DECL((*_tme_sparc32_format3), tme_uint32_t);
                    333: 
                    334: /* a sparc deferred-trap queue: */
                    335: struct tme_sparc_trapqueue {
                    336: #ifdef TME_HAVE_INT64_T
                    337:   tme_uint64_t tme_sparc_trapqueue_address;
                    338: #else  /* !TME_HAVE_INT64_T */
                    339:   tme_uint32_t tme_sparc_trapqueue_address;
                    340: #endif /* !TME_HAVE_INT64_T */
                    341:   tme_uint32_t tme_sparc_trapqueue_insn;
                    342: };
                    343: 
                    344: /* the sparc state: */
                    345: struct tme_sparc {
                    346: 
                    347:   /* the IC data structure.  it is beneficial to have this structure
                    348:      first, since register numbers can often simply be scaled and 
                    349:      added without an offset to the struct tme_sparc pointer to get
                    350:      to their contents: */
                    351:   struct tme_ic tme_sparc_ic;
                    352: 
                    353:   /* the current window pointer register offset: */
                    354:   unsigned int tme_sparc_cwp_offset;
                    355: 
                    356:   /* the architecture version, and number of windows: */
                    357:   unsigned int tme_sparc_version;
                    358:   unsigned int tme_sparc_nwindows;
                    359: 
                    360:   /* the backpointer to our element: */
                    361:   struct tme_element *tme_sparc_element;
                    362: 
                    363:   /* our bus connection.  if both are defined, the sparc bus connection
                    364:      is an adaptation layer for the generic bus connection: */
                    365:   struct tme_sparc_bus_connection *_tme_sparc_bus_connection;
                    366:   struct tme_bus_connection *_tme_sparc_bus_generic;
                    367: 
                    368:   /* a jmp_buf back to the dispatcher: */
                    369:   jmp_buf _tme_sparc_dispatcher;
                    370: 
                    371:   /* the current mode of the CPU: */
                    372:   int _tme_sparc_mode;
                    373: 
                    374:   /* address space identifiers and masks: */
                    375:   tme_uint32_t tme_sparc_asi_mask_insn;
                    376:   tme_uint32_t tme_sparc_asi_mask_data;
                    377: 
                    378:   /* the implementation-dependent functions: */
                    379:   void (*_tme_sparc_execute) _TME_P((struct tme_sparc *));
                    380:   tme_uint32_t (*_tme_sparc_bus_fault) _TME_P((struct tme_sparc *, const struct tme_bus_cycle *, unsigned int, int));
                    381:   tme_uint32_t (*_tme_sparc_fetch_slow) _TME_P((struct tme_sparc *, int));
                    382:   tme_uint32_t (*_tme_sparc_fpu_ver) _TME_P((struct tme_sparc *, const char *, char **));
                    383: 
                    384:   /* the instruction burst count, and the remaining burst: */
                    385:   unsigned int _tme_sparc_instruction_burst;
                    386:   unsigned int _tme_sparc_instruction_burst_remaining;
                    387: 
                    388:   /* any currently busy instruction TLB entry: */
                    389:   struct tme_sparc_tlb *_tme_sparc_itlb_busy;
                    390: 
                    391:   /* instruction information: */
                    392:   tme_uint32_t _tme_sparc_insn;
                    393:   
                    394:   /* the data and instruction TLB entry sets: */
                    395:   union {
                    396:     struct tme_sparc_tlb * tme_shared _tme_sparc_dtlb_array_u_sparc;
                    397:     struct tme_bus_tlb * tme_shared _tme_sparc_dtlb_array_u_bus;
                    398:   } _tme_sparc_dtlb_array_u;
                    399: #define _tme_sparc_dtlb_array _tme_sparc_dtlb_array_u._tme_sparc_dtlb_array_u_sparc
                    400: #define _tme_sparc_dtlb_array_bus _tme_sparc_dtlb_array_u._tme_sparc_dtlb_array_u_bus
                    401:   union {
                    402:     struct tme_sparc_tlb * tme_shared _tme_sparc_itlb_array_u_sparc;
                    403:     struct tme_bus_tlb * tme_shared _tme_sparc_itlb_array_u_bus;
                    404:   } _tme_sparc_itlb_array_u;
                    405: #define _tme_sparc_itlb_array _tme_sparc_itlb_array_u._tme_sparc_itlb_array_u_sparc
                    406: #define _tme_sparc_itlb_array_bus _tme_sparc_itlb_array_u._tme_sparc_itlb_array_u_bus
                    407:   tme_rwlock_t _tme_sparc_tlb_rwlock;
                    408: 
                    409:   /* the external request lines: */
                    410:   tme_mutex_t tme_sparc_external_mutex;
                    411:   tme_cond_t tme_sparc_external_cond;
                    412:   unsigned int tme_sparc_external_reset;
                    413:   unsigned int tme_sparc_external_halt;
                    414:   unsigned int tme_sparc_external_ipl;
                    415: 
                    416:   /* the slow load/store buffer: */
                    417:   tme_uint8_t tme_sparc_memory_buffer[sizeof(tme_uint32_t) * 2];
                    418: 
                    419:   /* any FPU state: */
                    420:   struct tme_ieee754_ctl tme_sparc_fpu_ieee754_ctl;
                    421:   _tme_const struct tme_ieee754_ops *tme_sparc_fpu_ieee754_ops;
                    422:   _tme_const struct tme_ieee754_ops *tme_sparc_fpu_ieee754_ops_user;
                    423:   _tme_const struct tme_ieee754_ops *tme_sparc_fpu_ieee754_ops_strict;
                    424:   struct tme_float tme_sparc_fpu_fpregs[32];
                    425:   unsigned int tme_sparc_fpu_fpreg_sizes[32];
                    426:   tme_uint32_t tme_sparc_fpu_fsr;
                    427:   struct tme_sparc_trapqueue tme_sparc_fpu_fq[1];
                    428:   unsigned int tme_sparc_fpu_mode;
                    429:   unsigned int tme_sparc_fpu_flags;
                    430:   int tme_sparc_fpu_incomplete_abort;
                    431: 
                    432:   /* any idle type, and idle type state: */
                    433:   unsigned int tme_sparc_idle_type;
                    434:   tme_uint32_t tme_sparc_idle_type_pc32;
                    435:   tme_uint32_t tme_sparc_idle_type_pc64;
                    436: 
                    437: #ifdef _TME_SPARC_STATS
                    438:   /* statistics: */
                    439:   struct {
                    440: 
                    441:     /* the total number of instructions executed: */
                    442:     tme_uint64_t tme_sparc_stats_insns_total;
                    443: 
                    444:     /* the total number of instructions fetched slowly: */
                    445:     tme_uint64_t tme_sparc_stats_fetch_slow;
                    446: 
                    447:     /* the total number of redispatches: */
                    448:     tme_uint64_t tme_sparc_stats_redispatches;
                    449: 
                    450:     /* the total number of data memory operations: */
                    451:     tme_uint64_t tme_sparc_stats_memory_total;
                    452: 
                    453:     /* the total number of ITLB fills: */
                    454:     tme_uint64_t tme_sparc_stats_itlb_fill;
                    455: 
                    456:     /* the total number of DTLB fills: */
                    457:     tme_uint64_t tme_sparc_stats_dtlb_fill;
                    458: 
                    459:   } tme_sparc_stats;
                    460: #endif /* _TME_SPARC_STATS */
                    461: };
                    462: 
                    463: /* globals: */
                    464: extern const tme_uint8_t _tme_sparc_conds_icc[16];
                    465: extern const tme_uint8_t _tme_sparc_conds_fcc[4];
                    466: 
                    467: /* prototypes: */
                    468: int tme_sparc_new _TME_P((struct tme_sparc *, const char * const *, const void *, char **));
                    469: void tme_sparc_redispatch _TME_P((struct tme_sparc *));
                    470: void tme_sparc_do_reset _TME_P((struct tme_sparc *));
                    471: void tme_sparc_do_idle _TME_P((struct tme_sparc *));
                    472: void tme_sparc32_external_check _TME_P((struct tme_sparc *));
                    473: tme_uint32_t tme_sparc32_fetch_slow _TME_P((struct tme_sparc *, int));
                    474: tme_uint32_t tme_sparc_fetch_nearby _TME_P((struct tme_sparc *, long));
                    475: void tme_sparc_callout_unlock _TME_P((struct tme_sparc *));
                    476: void tme_sparc_callout_relock _TME_P((struct tme_sparc *));
                    477: 
                    478: /* trap support: */
                    479: void tme_sparc32_trap_preinstruction _TME_P((struct tme_sparc *, unsigned int));
                    480: void tme_sparc32_trap _TME_P((struct tme_sparc *, tme_uint32_t));
                    481: tme_uint32_t tme_sparc32_bus_fault _TME_P((struct tme_sparc *, const struct tme_bus_cycle *, unsigned int, int));
                    482: void tme_sparc64_trap _TME_P((struct tme_sparc *, tme_uint32_t));
                    483: 
                    484: /* FPU support: */
                    485: int tme_sparc_fpu_new _TME_P((struct tme_sparc *, const char * const *, int *, int *, char **));
                    486: void tme_sparc_fpu_reset _TME_P((struct tme_sparc *));
                    487: void tme_sparc_fpu_usage _TME_P((struct tme_sparc *, char **));
                    488: void tme_sparc_fpu_strict _TME_P((struct tme_sparc_bus_connection *, unsigned int));
                    489: void tme_sparc_fpu_exception_check _TME_P((struct tme_sparc *));
                    490: int tme_sparc_fpu_fpreg_aligned _TME_P((struct tme_sparc *, unsigned int, unsigned int));
                    491: void tme_sparc_fpu_fpreg_format _TME_P((struct tme_sparc *, unsigned int, unsigned int));
                    492: void tme_sparc_fpu_fpop1 _TME_P((struct tme_sparc *));
                    493: void tme_sparc_fpu_fpop2 _TME_P((struct tme_sparc *));
                    494: 
                    495: /* verification: */
                    496: void tme_sparc_verify_hook _TME_P((void));
                    497: #ifdef _TME_SPARC_VERIFY
                    498: void tme_sparc_verify_init _TME_P((void));
                    499: void tme_sparc_verify_begin _TME_P((const struct tme_sparc *, const tme_uint8_t *));
                    500: void tme_sparc_verify_mem_any _TME_P((const struct tme_sparc *,
                    501:                                     unsigned int, tme_uint32_t,
                    502:                                     tme_uint8_t *, int, int));
                    503: void tme_sparc_verify_end_branch _TME_P((const struct tme_sparc *, tme_uint32_t));
                    504: void tme_sparc_verify_end _TME_P((const struct tme_sparc *,
                    505:                                 void (*)(struct tme_sparc *, void *, void *)));
                    506: #else  /* _TME_SPARC_VERIFY */
                    507: #define tme_sparc_verify_init() do { } while (/* CONSTCOND */ 0)
                    508: #define tme_sparc_verify_begin(ic, s) do { } while (/* CONSTCOND */ 0)
                    509: #define tme_sparc_verify_mem_any(ic, fc, a, v, c, rw) do { } while (/* CONSTCOND */ 0)
                    510: #define tme_sparc_verify_end_branch(ic, pc) do { } while (/* CONSTCOND */ 0)
                    511: #define tme_sparc_verify_end(ic, f) do { } while (/* CONSTCOND */ 0)
                    512: #define tme_sparc_verify_hook() do { } while (/* CONSTCOND */ 0)
                    513: #endif /* _TME_SPARC_VERIFY */
                    514: #define tme_sparc_verify_mem8(ic, fc, a, v, rw) tme_sparc_verify_mem_any(ic, fc, a, (tme_uint8_t *) &(v), -sizeof(tme_uint8_t), rw)
                    515: #define tme_sparc_verify_mem16(ic, fc, a, v, rw) tme_sparc_verify_mem_any(ic, fc, a, (tme_uint8_t *) &(v), -sizeof(tme_uint16_t), rw)
                    516: #define tme_sparc_verify_mem32(ic, fc, a, v, rw) tme_sparc_verify_mem_any(ic, fc, a, (tme_uint8_t *) &(v), -sizeof(tme_uint32_t), rw)
                    517: 
                    518: /* instruction functions: */
                    519: TME_SPARC_FORMAT3_DECL(tme_sparc32_illegal, tme_uint32_t);
                    520: TME_SPARC_FORMAT3_DECL(tme_sparc32_cpop1, tme_uint32_t);
                    521: TME_SPARC_FORMAT3_DECL(tme_sparc32_cpop2, tme_uint32_t);
                    522: TME_SPARC_FORMAT3_DECL(tme_sparc32_ldc, tme_uint32_t);
                    523: TME_SPARC_FORMAT3_DECL(tme_sparc32_ldcsr, tme_uint32_t);
                    524: TME_SPARC_FORMAT3_DECL(tme_sparc32_lddc, tme_uint32_t);
                    525: TME_SPARC_FORMAT3_DECL(tme_sparc32_stc, tme_uint32_t);
                    526: TME_SPARC_FORMAT3_DECL(tme_sparc32_stcsr, tme_uint32_t);
                    527: TME_SPARC_FORMAT3_DECL(tme_sparc32_stdc, tme_uint32_t);
                    528: TME_SPARC_FORMAT3_DECL(tme_sparc32_stdcq, tme_uint32_t);
                    529: TME_SPARC_FORMAT3_DECL(tme_sparc32_rdasr, tme_uint32_t);
                    530: TME_SPARC_FORMAT3_DECL(tme_sparc32_rdpsr, tme_uint32_t);
                    531: TME_SPARC_FORMAT3_DECL(tme_sparc32_rdwim, tme_uint32_t);
                    532: TME_SPARC_FORMAT3_DECL(tme_sparc32_rdtbr, tme_uint32_t);
                    533: TME_SPARC_FORMAT3_DECL(tme_sparc32_wrasr, tme_uint32_t);
                    534: TME_SPARC_FORMAT3_DECL(tme_sparc32_wrpsr, tme_uint32_t);
                    535: TME_SPARC_FORMAT3_DECL(tme_sparc32_wrwim, tme_uint32_t);
                    536: TME_SPARC_FORMAT3_DECL(tme_sparc32_wrtbr, tme_uint32_t);
                    537: TME_SPARC_FORMAT3_DECL(tme_sparc32_flush, tme_uint32_t);
                    538: TME_SPARC_FORMAT3_DECL(tme_sparc32_rett, tme_uint32_t);
                    539: TME_SPARC_FORMAT3_DECL(tme_sparc32_save_restore, tme_uint32_t);
                    540: TME_SPARC_FORMAT3_DECL(tme_sparc32_ticc, tme_uint32_t);
                    541: TME_SPARC_FORMAT3_DECL(tme_sparc32_stdfq, tme_uint32_t);
                    542: TME_SPARC_FORMAT3_DECL(tme_sparc32_fpop1, tme_uint32_t);
                    543: TME_SPARC_FORMAT3_DECL(tme_sparc32_fpop2, tme_uint32_t);
                    544: 
                    545: /* the automatically-generated header information: */
                    546: #include <sparc-auto.h>
                    547: 
                    548: #endif /* !_IC_SPARC_IMPL_H */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.