Annotation of qemu/target-sparc/cpu.h, revision 1.1.1.5

1.1       root        1: #ifndef CPU_SPARC_H
                      2: #define CPU_SPARC_H
                      3: 
                      4: #include "config.h"
                      5: 
                      6: #if !defined(TARGET_SPARC64)
                      7: #define TARGET_LONG_BITS 32
                      8: #define TARGET_FPREGS 32
                      9: #define TARGET_PAGE_BITS 12 /* 4k */
                     10: #else
                     11: #define TARGET_LONG_BITS 64
                     12: #define TARGET_FPREGS 64
1.1.1.5 ! root       13: #define TARGET_PAGE_BITS 13 /* 8k */
1.1       root       14: #endif
                     15: 
1.1.1.5 ! root       16: #define TARGET_PHYS_ADDR_BITS 64
        !            17: 
1.1       root       18: #include "cpu-defs.h"
                     19: 
                     20: #include "softfloat.h"
                     21: 
                     22: #define TARGET_HAS_ICE 1
                     23: 
1.1.1.4   root       24: #if !defined(TARGET_SPARC64)
1.1.1.5 ! root       25: #define ELF_MACHINE     EM_SPARC
1.1.1.4   root       26: #else
1.1.1.5 ! root       27: #define ELF_MACHINE     EM_SPARCV9
1.1.1.4   root       28: #endif
                     29: 
1.1       root       30: /*#define EXCP_INTERRUPT 0x100*/
                     31: 
                     32: /* trap definitions */
                     33: #ifndef TARGET_SPARC64
                     34: #define TT_TFAULT   0x01
                     35: #define TT_ILL_INSN 0x02
                     36: #define TT_PRIV_INSN 0x03
                     37: #define TT_NFPU_INSN 0x04
                     38: #define TT_WIN_OVF  0x05
1.1.1.5 ! root       39: #define TT_WIN_UNF  0x06
        !            40: #define TT_UNALIGNED 0x07
1.1       root       41: #define TT_FP_EXCP  0x08
                     42: #define TT_DFAULT   0x09
1.1.1.5 ! root       43: #define TT_TOVF     0x0a
1.1       root       44: #define TT_EXTINT   0x10
1.1.1.5 ! root       45: #define TT_CODE_ACCESS 0x21
        !            46: #define TT_DATA_ACCESS 0x29
1.1       root       47: #define TT_DIV_ZERO 0x2a
1.1.1.5 ! root       48: #define TT_NCP_INSN 0x24
1.1       root       49: #define TT_TRAP     0x80
                     50: #else
                     51: #define TT_TFAULT   0x08
                     52: #define TT_TMISS    0x09
1.1.1.5 ! root       53: #define TT_CODE_ACCESS 0x0a
1.1       root       54: #define TT_ILL_INSN 0x10
                     55: #define TT_PRIV_INSN 0x11
                     56: #define TT_NFPU_INSN 0x20
                     57: #define TT_FP_EXCP  0x21
1.1.1.5 ! root       58: #define TT_TOVF     0x23
1.1       root       59: #define TT_CLRWIN   0x24
                     60: #define TT_DIV_ZERO 0x28
                     61: #define TT_DFAULT   0x30
                     62: #define TT_DMISS    0x31
1.1.1.5 ! root       63: #define TT_DATA_ACCESS 0x32
        !            64: #define TT_DPROT    0x33
        !            65: #define TT_UNALIGNED 0x34
1.1       root       66: #define TT_PRIV_ACT 0x37
                     67: #define TT_EXTINT   0x40
                     68: #define TT_SPILL    0x80
                     69: #define TT_FILL     0xc0
                     70: #define TT_WOTHER   0x10
                     71: #define TT_TRAP     0x100
                     72: #endif
                     73: 
                     74: #define PSR_NEG   (1<<23)
                     75: #define PSR_ZERO  (1<<22)
                     76: #define PSR_OVF   (1<<21)
                     77: #define PSR_CARRY (1<<20)
                     78: #define PSR_ICC   (PSR_NEG|PSR_ZERO|PSR_OVF|PSR_CARRY)
                     79: #define PSR_EF    (1<<12)
                     80: #define PSR_PIL   0xf00
                     81: #define PSR_S     (1<<7)
                     82: #define PSR_PS    (1<<6)
                     83: #define PSR_ET    (1<<5)
                     84: #define PSR_CWP   0x1f
                     85: 
                     86: /* Trap base register */
                     87: #define TBR_BASE_MASK 0xfffff000
                     88: 
                     89: #if defined(TARGET_SPARC64)
                     90: #define PS_IG    (1<<11)
                     91: #define PS_MG    (1<<10)
1.1.1.5 ! root       92: #define PS_RMO   (1<<7)
1.1       root       93: #define PS_RED   (1<<5)
                     94: #define PS_PEF   (1<<4)
                     95: #define PS_AM    (1<<3)
                     96: #define PS_PRIV  (1<<2)
                     97: #define PS_IE    (1<<1)
                     98: #define PS_AG    (1<<0)
1.1.1.3   root       99: 
                    100: #define FPRS_FEF (1<<2)
1.1.1.5 ! root      101: 
        !           102: #define HS_PRIV  (1<<2)
1.1       root      103: #endif
                    104: 
                    105: /* Fcc */
                    106: #define FSR_RD1        (1<<31)
                    107: #define FSR_RD0        (1<<30)
                    108: #define FSR_RD_MASK    (FSR_RD1 | FSR_RD0)
                    109: #define FSR_RD_NEAREST 0
                    110: #define FSR_RD_ZERO    FSR_RD0
                    111: #define FSR_RD_POS     FSR_RD1
                    112: #define FSR_RD_NEG     (FSR_RD1 | FSR_RD0)
                    113: 
                    114: #define FSR_NVM   (1<<27)
                    115: #define FSR_OFM   (1<<26)
                    116: #define FSR_UFM   (1<<25)
                    117: #define FSR_DZM   (1<<24)
                    118: #define FSR_NXM   (1<<23)
                    119: #define FSR_TEM_MASK (FSR_NVM | FSR_OFM | FSR_UFM | FSR_DZM | FSR_NXM)
                    120: 
                    121: #define FSR_NVA   (1<<9)
                    122: #define FSR_OFA   (1<<8)
                    123: #define FSR_UFA   (1<<7)
                    124: #define FSR_DZA   (1<<6)
                    125: #define FSR_NXA   (1<<5)
                    126: #define FSR_AEXC_MASK (FSR_NVA | FSR_OFA | FSR_UFA | FSR_DZA | FSR_NXA)
                    127: 
                    128: #define FSR_NVC   (1<<4)
                    129: #define FSR_OFC   (1<<3)
                    130: #define FSR_UFC   (1<<2)
                    131: #define FSR_DZC   (1<<1)
                    132: #define FSR_NXC   (1<<0)
                    133: #define FSR_CEXC_MASK (FSR_NVC | FSR_OFC | FSR_UFC | FSR_DZC | FSR_NXC)
                    134: 
                    135: #define FSR_FTT2   (1<<16)
                    136: #define FSR_FTT1   (1<<15)
                    137: #define FSR_FTT0   (1<<14)
                    138: #define FSR_FTT_MASK (FSR_FTT2 | FSR_FTT1 | FSR_FTT0)
                    139: #define FSR_FTT_IEEE_EXCP (1 << 14)
                    140: #define FSR_FTT_UNIMPFPOP (3 << 14)
1.1.1.5 ! root      141: #define FSR_FTT_SEQ_ERROR (4 << 14)
1.1       root      142: #define FSR_FTT_INVAL_FPR (6 << 14)
                    143: 
                    144: #define FSR_FCC1  (1<<11)
                    145: #define FSR_FCC0  (1<<10)
                    146: 
                    147: /* MMU */
1.1.1.5 ! root      148: #define MMU_E     (1<<0)
        !           149: #define MMU_NF    (1<<1)
1.1       root      150: 
                    151: #define PTE_ENTRYTYPE_MASK 3
                    152: #define PTE_ACCESS_MASK    0x1c
                    153: #define PTE_ACCESS_SHIFT   2
                    154: #define PTE_PPN_SHIFT      7
                    155: #define PTE_ADDR_MASK      0xffffff00
                    156: 
1.1.1.5 ! root      157: #define PG_ACCESSED_BIT 5
        !           158: #define PG_MODIFIED_BIT 6
1.1       root      159: #define PG_CACHE_BIT    7
                    160: 
                    161: #define PG_ACCESSED_MASK (1 << PG_ACCESSED_BIT)
                    162: #define PG_MODIFIED_MASK (1 << PG_MODIFIED_BIT)
                    163: #define PG_CACHE_MASK    (1 << PG_CACHE_BIT)
                    164: 
                    165: /* 2 <= NWINDOWS <= 32. In QEMU it must also be a power of two. */
                    166: #define NWINDOWS  8
                    167: 
1.1.1.5 ! root      168: #if !defined(TARGET_SPARC64)
        !           169: #define NB_MMU_MODES 2
        !           170: #else
        !           171: #define NB_MMU_MODES 3
        !           172: #endif
        !           173: 
1.1       root      174: typedef struct CPUSPARCState {
                    175:     target_ulong gregs[8]; /* general registers */
                    176:     target_ulong *regwptr; /* pointer to current register window */
1.1.1.3   root      177:     float32 fpr[TARGET_FPREGS];  /* floating point registers */
1.1       root      178:     target_ulong pc;       /* program counter */
                    179:     target_ulong npc;      /* next program counter */
                    180:     target_ulong y;        /* multiply/divide register */
                    181:     uint32_t psr;      /* processor state register */
                    182:     target_ulong fsr;      /* FPU state register */
                    183:     uint32_t cwp;      /* index of current register window (extracted
                    184:                           from PSR) */
                    185:     uint32_t wim;      /* window invalid mask */
                    186:     target_ulong tbr;  /* trap base register */
                    187:     int      psrs;     /* supervisor mode (extracted from PSR) */
                    188:     int      psrps;    /* previous supervisor mode */
                    189:     int      psret;    /* enable traps */
1.1.1.5 ! root      190:     uint32_t psrpil;   /* interrupt blocking level */
        !           191:     uint32_t pil_in;   /* incoming interrupt level bitmap */
1.1       root      192:     int      psref;    /* enable fpu */
1.1.1.5 ! root      193:     target_ulong version;
1.1       root      194:     jmp_buf  jmp_env;
                    195:     int user_mode_only;
                    196:     int exception_index;
                    197:     int interrupt_index;
                    198:     int interrupt_request;
1.1.1.2   root      199:     int halted;
1.1.1.5 ! root      200:     uint32_t mmu_bm;
1.1       root      201:     /* NOTE: we allow 8 more registers to handle wrapping */
                    202:     target_ulong regbase[NWINDOWS * 16 + 8];
                    203: 
1.1.1.2   root      204:     CPU_COMMON
                    205: 
1.1       root      206:     /* MMU regs */
                    207: #if defined(TARGET_SPARC64)
                    208:     uint64_t lsu;
                    209: #define DMMU_E 0x8
                    210: #define IMMU_E 0x4
                    211:     uint64_t immuregs[16];
                    212:     uint64_t dmmuregs[16];
                    213:     uint64_t itlb_tag[64];
                    214:     uint64_t itlb_tte[64];
                    215:     uint64_t dtlb_tag[64];
                    216:     uint64_t dtlb_tte[64];
                    217: #else
1.1.1.5 ! root      218:     uint32_t mmuregs[32];
        !           219:     uint64_t mxccdata[4];
        !           220:     uint64_t mxccregs[8];
        !           221:     uint64_t prom_addr;
1.1       root      222: #endif
                    223:     /* temporary float registers */
1.1.1.3   root      224:     float32 ft0, ft1;
                    225:     float64 dt0, dt1;
1.1.1.5 ! root      226: #if defined(CONFIG_USER_ONLY)
        !           227:     float128 qt0, qt1;
        !           228: #endif
1.1       root      229:     float_status fp_status;
                    230: #if defined(TARGET_SPARC64)
                    231: #define MAXTL 4
                    232:     uint64_t t0, t1, t2;
                    233:     uint64_t tpc[MAXTL];
                    234:     uint64_t tnpc[MAXTL];
                    235:     uint64_t tstate[MAXTL];
                    236:     uint32_t tt[MAXTL];
1.1.1.5 ! root      237:     uint32_t xcc;               /* Extended integer condition codes */
1.1       root      238:     uint32_t asi;
                    239:     uint32_t pstate;
                    240:     uint32_t tl;
                    241:     uint32_t cansave, canrestore, otherwin, wstate, cleanwin;
                    242:     uint64_t agregs[8]; /* alternate general registers */
                    243:     uint64_t bgregs[8]; /* backup for normal global registers */
                    244:     uint64_t igregs[8]; /* interrupt general registers */
                    245:     uint64_t mgregs[8]; /* mmu general registers */
                    246:     uint64_t fprs;
                    247:     uint64_t tick_cmpr, stick_cmpr;
1.1.1.5 ! root      248:     void *tick, *stick;
1.1.1.3   root      249:     uint64_t gsr;
1.1.1.5 ! root      250:     uint32_t gl; // UA2005
        !           251:     /* UA 2005 hyperprivileged registers */
        !           252:     uint64_t hpstate, htstate[MAXTL], hintp, htba, hver, hstick_cmpr, ssr;
        !           253:     void *hstick; // UA 2005
1.1       root      254: #endif
                    255: #if !defined(TARGET_SPARC64) && !defined(reg_T2)
                    256:     target_ulong t2;
                    257: #endif
                    258: } CPUSPARCState;
                    259: #if defined(TARGET_SPARC64)
                    260: #define GET_FSR32(env) (env->fsr & 0xcfc1ffff)
1.1.1.5 ! root      261: #define PUT_FSR32(env, val) do { uint32_t _tmp = val;                   \
        !           262:         env->fsr = (_tmp & 0xcfc1c3ff) | (env->fsr & 0x3f00000000ULL);  \
1.1       root      263:     } while (0)
                    264: #define GET_FSR64(env) (env->fsr & 0x3fcfc1ffffULL)
1.1.1.5 ! root      265: #define PUT_FSR64(env, val) do { uint64_t _tmp = val;   \
        !           266:         env->fsr = _tmp & 0x3fcfc1c3ffULL;              \
1.1       root      267:     } while (0)
                    268: #else
                    269: #define GET_FSR32(env) (env->fsr)
1.1.1.5 ! root      270: #define PUT_FSR32(env, val) do { uint32_t _tmp = val;                   \
        !           271:         env->fsr = (_tmp & 0xcfc1dfff) | (env->fsr & 0x000e0000);       \
1.1       root      272:     } while (0)
                    273: #endif
                    274: 
1.1.1.5 ! root      275: CPUSPARCState *cpu_sparc_init(const char *cpu_model);
1.1       root      276: int cpu_sparc_exec(CPUSPARCState *s);
                    277: int cpu_sparc_close(CPUSPARCState *s);
1.1.1.5 ! root      278: void sparc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt,
        !           279:                                                  ...));
        !           280: void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu);
        !           281: 
        !           282: #define GET_PSR(env) (env->version | (env->psr & PSR_ICC) |             \
        !           283:                       (env->psref? PSR_EF : 0) |                        \
        !           284:                       (env->psrpil << 8) |                              \
        !           285:                       (env->psrs? PSR_S : 0) |                          \
        !           286:                       (env->psrps? PSR_PS : 0) |                        \
        !           287:                       (env->psret? PSR_ET : 0) | env->cwp)
1.1       root      288: 
                    289: #ifndef NO_CPU_IO_DEFS
                    290: void cpu_set_cwp(CPUSPARCState *env1, int new_cwp);
                    291: #endif
                    292: 
1.1.1.5 ! root      293: #define PUT_PSR(env, val) do { int _tmp = val;                          \
        !           294:         env->psr = _tmp & PSR_ICC;                                      \
        !           295:         env->psref = (_tmp & PSR_EF)? 1 : 0;                            \
        !           296:         env->psrpil = (_tmp & PSR_PIL) >> 8;                            \
        !           297:         env->psrs = (_tmp & PSR_S)? 1 : 0;                              \
        !           298:         env->psrps = (_tmp & PSR_PS)? 1 : 0;                            \
        !           299:         env->psret = (_tmp & PSR_ET)? 1 : 0;                            \
        !           300:         cpu_set_cwp(env, _tmp & PSR_CWP);                               \
1.1       root      301:     } while (0)
                    302: 
                    303: #ifdef TARGET_SPARC64
1.1.1.5 ! root      304: #define GET_CCR(env) (((env->xcc >> 20) << 4) | ((env->psr & PSR_ICC) >> 20))
        !           305: #define PUT_CCR(env, val) do { int _tmp = val;                          \
        !           306:         env->xcc = (_tmp >> 4) << 20;                                           \
        !           307:         env->psr = (_tmp & 0xf) << 20;                                  \
1.1       root      308:     } while (0)
1.1.1.5 ! root      309: #define GET_CWP64(env) (NWINDOWS - 1 - (env)->cwp)
        !           310: #define PUT_CWP64(env, val) \
        !           311:     cpu_set_cwp(env, NWINDOWS - 1 - ((val) & (NWINDOWS - 1)))
        !           312: 
1.1       root      313: #endif
                    314: 
1.1.1.4   root      315: int cpu_sparc_signal_handler(int host_signum, void *pinfo, void *puc);
1.1.1.5 ! root      316: void raise_exception(int tt);
        !           317: void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
        !           318:                           int is_asi);
        !           319: void do_tick_set_count(void *opaque, uint64_t count);
        !           320: uint64_t do_tick_get_count(void *opaque);
        !           321: void do_tick_set_limit(void *opaque, uint64_t limit);
        !           322: void cpu_check_irqs(CPUSPARCState *env);
        !           323: 
        !           324: #define CPUState CPUSPARCState
        !           325: #define cpu_init cpu_sparc_init
        !           326: #define cpu_exec cpu_sparc_exec
        !           327: #define cpu_gen_code cpu_sparc_gen_code
        !           328: #define cpu_signal_handler cpu_sparc_signal_handler
        !           329: #define cpu_list sparc_cpu_list
        !           330: 
        !           331: /* MMU modes definitions */
        !           332: #define MMU_MODE0_SUFFIX _user
        !           333: #define MMU_MODE1_SUFFIX _kernel
        !           334: #ifdef TARGET_SPARC64
        !           335: #define MMU_MODE2_SUFFIX _hypv
        !           336: #endif
        !           337: #define MMU_USER_IDX 0
        !           338: static inline int cpu_mmu_index (CPUState *env)
        !           339: {
        !           340: #if defined(CONFIG_USER_ONLY)
        !           341:     return 0;
        !           342: #elif !defined(TARGET_SPARC64)
        !           343:     return env->psrs;
        !           344: #else
        !           345:     if (!env->psrs)
        !           346:         return 0;
        !           347:     else if ((env->hpstate & HS_PRIV) == 0)
        !           348:         return 1;
        !           349:     else
        !           350:         return 2;
        !           351: #endif
        !           352: }
        !           353: 
        !           354: static inline int cpu_fpu_enabled(CPUState *env)
        !           355: {
        !           356: #if defined(CONFIG_USER_ONLY)
        !           357:     return 1;
        !           358: #elif !defined(TARGET_SPARC64)
        !           359:     return env->psref;
        !           360: #else
        !           361:     return ((env->pstate & PS_PEF) != 0) && ((env->fprs & FPRS_FEF) != 0);
        !           362: #endif
        !           363: }
1.1       root      364: 
                    365: #include "cpu-all.h"
                    366: 
                    367: #endif

unix.superglobalmegacorp.com

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