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

1.1       root        1: #if !defined (__MIPS_CPU_H__)
                      2: #define __MIPS_CPU_H__
                      3: 
1.1.1.2   root        4: #define TARGET_HAS_ICE 1
                      5: 
1.1.1.5 ! root        6: #define ELF_MACHINE    EM_MIPS
        !             7: 
1.1.1.4   root        8: #include "config.h"
1.1       root        9: #include "mips-defs.h"
                     10: #include "cpu-defs.h"
                     11: #include "softfloat.h"
                     12: 
1.1.1.4   root       13: // uint_fast8_t and uint_fast16_t not in <sys/int_types.h>
                     14: // XXX: move that elsewhere
                     15: #if defined(HOST_SOLARIS) && SOLARISREV < 10
                     16: typedef unsigned char           uint_fast8_t;
                     17: typedef unsigned int            uint_fast16_t;
                     18: #endif
                     19: 
1.1.1.5 ! root       20: /* target_ulong size spec */
        !            21: #ifdef MIPS_HAS_MIPS64
        !            22: #define TLSZ "%016llx"
        !            23: #else
        !            24: #define TLSZ "%08x"
        !            25: #endif
        !            26: 
1.1       root       27: typedef union fpr_t fpr_t;
                     28: union fpr_t {
1.1.1.4   root       29:     float64  fd;   /* ieee double precision */
                     30:     float32  fs[2];/* ieee single precision */
                     31:     uint64_t d;    /* binary single fixed-point */
                     32:     uint32_t w[2]; /* binary single fixed-point */
1.1       root       33: };
1.1.1.4   root       34: /* define FP_ENDIAN_IDX to access the same location
                     35:  * in the fpr_t union regardless of the host endianess
                     36:  */
                     37: #if defined(WORDS_BIGENDIAN)
                     38: #  define FP_ENDIAN_IDX 1
                     39: #else
                     40: #  define FP_ENDIAN_IDX 0
                     41: #endif
1.1       root       42: 
                     43: #if defined(MIPS_USES_R4K_TLB)
                     44: typedef struct tlb_t tlb_t;
                     45: struct tlb_t {
                     46:     target_ulong VPN;
1.1.1.5 ! root       47:     uint32_t PageMask;
1.1.1.3   root       48:     uint_fast8_t ASID;
                     49:     uint_fast16_t G:1;
                     50:     uint_fast16_t C0:3;
                     51:     uint_fast16_t C1:3;
                     52:     uint_fast16_t V0:1;
                     53:     uint_fast16_t V1:1;
                     54:     uint_fast16_t D0:1;
                     55:     uint_fast16_t D1:1;
1.1       root       56:     target_ulong PFN[2];
                     57: };
                     58: #endif
                     59: 
                     60: typedef struct CPUMIPSState CPUMIPSState;
                     61: struct CPUMIPSState {
                     62:     /* General integer registers */
                     63:     target_ulong gpr[32];
                     64:     /* Special registers */
                     65:     target_ulong PC;
1.1.1.5 ! root       66: #if TARGET_LONG_BITS > HOST_LONG_BITS
        !            67:     target_ulong t0;
        !            68:     target_ulong t1;
        !            69:     target_ulong t2;
        !            70: #endif
        !            71:     target_ulong HI, LO;
1.1       root       72:     uint32_t DCR; /* ? */
                     73: #if defined(MIPS_USES_FPU)
                     74:     /* Floating point registers */
                     75:     fpr_t fpr[16];
1.1.1.4   root       76: #define FPR(cpu, n) ((fpr_t*)&(cpu)->fpr[(n) / 2])
                     77: #define FPR_FD(cpu, n) (FPR(cpu, n)->fd)
                     78: #define FPR_FS(cpu, n) (FPR(cpu, n)->fs[((n) & 1) ^ FP_ENDIAN_IDX])
                     79: #define FPR_D(cpu, n)  (FPR(cpu, n)->d)
                     80: #define FPR_W(cpu, n)  (FPR(cpu, n)->w[((n) & 1) ^ FP_ENDIAN_IDX])
                     81: 
                     82: #ifndef USE_HOST_FLOAT_REGS
                     83:     fpr_t ft0;
                     84:     fpr_t ft1;
                     85:     fpr_t ft2;
                     86: #endif
                     87:     float_status fp_status;
                     88:     /* fpu implementation/revision register */
1.1       root       89:     uint32_t fcr0;
1.1.1.4   root       90:     /* fcsr */
                     91:     uint32_t fcr31;
                     92: #define SET_FP_COND(reg)     do { (reg) |= (1<<23); } while(0)
                     93: #define CLEAR_FP_COND(reg)   do { (reg) &= ~(1<<23); } while(0)
                     94: #define IS_FP_COND_SET(reg)  (((reg) & (1<<23)) != 0)
                     95: #define GET_FP_CAUSE(reg)    (((reg) >> 12) & 0x3f)
                     96: #define GET_FP_ENABLE(reg)   (((reg) >>  7) & 0x1f)
                     97: #define GET_FP_FLAGS(reg)    (((reg) >>  2) & 0x1f)
                     98: #define SET_FP_CAUSE(reg,v)  do { (reg) = ((reg) & ~(0x3f << 12)) | ((v) << 12); } while(0)
                     99: #define SET_FP_ENABLE(reg,v) do { (reg) = ((reg) & ~(0x1f <<  7)) | ((v) << 7); } while(0)
                    100: #define SET_FP_FLAGS(reg,v)  do { (reg) = ((reg) & ~(0x1f <<  2)) | ((v) << 2); } while(0)
                    101: #define FP_INEXACT        1
                    102: #define FP_UNDERFLOW      2
                    103: #define FP_OVERFLOW       4
                    104: #define FP_DIV0           8
                    105: #define FP_INVALID        16
                    106: #define FP_UNIMPLEMENTED  32
                    107:                
1.1       root      108: #endif
                    109: #if defined(MIPS_USES_R4K_TLB)
1.1.1.5 ! root      110:     tlb_t tlb[MIPS_TLB_MAX];
        !           111:     uint32_t tlb_in_use;
1.1       root      112: #endif
1.1.1.5 ! root      113:     int32_t CP0_Index;
        !           114:     int32_t CP0_Random;
        !           115:     target_ulong CP0_EntryLo0;
        !           116:     target_ulong CP0_EntryLo1;
        !           117:     target_ulong CP0_Context;
        !           118:     int32_t CP0_PageMask;
        !           119:     int32_t CP0_PageGrain;
        !           120:     int32_t CP0_Wired;
        !           121:     int32_t CP0_HWREna;
        !           122:     target_ulong CP0_BadVAddr;
        !           123:     int32_t CP0_Count;
        !           124:     target_ulong CP0_EntryHi;
        !           125:     int32_t CP0_Compare;
        !           126:     int32_t CP0_Status;
1.1       root      127: #define CP0St_CU3   31
                    128: #define CP0St_CU2   30
                    129: #define CP0St_CU1   29
                    130: #define CP0St_CU0   28
                    131: #define CP0St_RP    27
1.1.1.4   root      132: #define CP0St_FR    26
1.1       root      133: #define CP0St_RE    25
1.1.1.5 ! root      134: #define CP0St_MX    24
        !           135: #define CP0St_PX    23
1.1       root      136: #define CP0St_BEV   22
                    137: #define CP0St_TS    21
                    138: #define CP0St_SR    20
                    139: #define CP0St_NMI   19
                    140: #define CP0St_IM    8
1.1.1.5 ! root      141: #define CP0St_KX    7
        !           142: #define CP0St_SX    6
        !           143: #define CP0St_UX    5
1.1       root      144: #define CP0St_UM    4
1.1.1.5 ! root      145: #define CP0St_R0    3
1.1       root      146: #define CP0St_ERL   2
                    147: #define CP0St_EXL   1
                    148: #define CP0St_IE    0
1.1.1.5 ! root      149:     int32_t CP0_IntCtl;
        !           150:     int32_t CP0_SRSCtl;
        !           151:     int32_t CP0_SRSMap;
        !           152:     int32_t CP0_Cause;
        !           153: #define CP0Ca_BD   31
        !           154: #define CP0Ca_TI   30
        !           155: #define CP0Ca_CE   28
        !           156: #define CP0Ca_DC   27
        !           157: #define CP0Ca_PCI  26
1.1       root      158: #define CP0Ca_IV   23
1.1.1.5 ! root      159: #define CP0Ca_WP   22
        !           160: #define CP0Ca_IP    8
        !           161: #define CP0Ca_IP_mask 0x0000FF00
        !           162: #define CP0Ca_EC    2
        !           163:     target_ulong CP0_EPC;
        !           164:     int32_t CP0_PRid;
        !           165:     int32_t CP0_EBase;
        !           166:     int32_t CP0_Config0;
1.1       root      167: #define CP0C0_M    31
                    168: #define CP0C0_K23  28
                    169: #define CP0C0_KU   25
                    170: #define CP0C0_MDU  20
                    171: #define CP0C0_MM   17
                    172: #define CP0C0_BM   16
                    173: #define CP0C0_BE   15
                    174: #define CP0C0_AT   13
                    175: #define CP0C0_AR   10
                    176: #define CP0C0_MT   7
1.1.1.5 ! root      177: #define CP0C0_VI   3
1.1       root      178: #define CP0C0_K0   0
1.1.1.5 ! root      179:     int32_t CP0_Config1;
        !           180: #define CP0C1_M    31
1.1       root      181: #define CP0C1_MMU  25
                    182: #define CP0C1_IS   22
                    183: #define CP0C1_IL   19
                    184: #define CP0C1_IA   16
                    185: #define CP0C1_DS   13
                    186: #define CP0C1_DL   10
                    187: #define CP0C1_DA   7
1.1.1.5 ! root      188: #define CP0C1_C2   6
        !           189: #define CP0C1_MD   5
1.1       root      190: #define CP0C1_PC   4
                    191: #define CP0C1_WR   3
                    192: #define CP0C1_CA   2
                    193: #define CP0C1_EP   1
                    194: #define CP0C1_FP   0
1.1.1.5 ! root      195:     int32_t CP0_Config2;
        !           196: #define CP0C2_M    31
        !           197: #define CP0C2_TU   28
        !           198: #define CP0C2_TS   24
        !           199: #define CP0C2_TL   20
        !           200: #define CP0C2_TA   16
        !           201: #define CP0C2_SU   12
        !           202: #define CP0C2_SS   8
        !           203: #define CP0C2_SL   4
        !           204: #define CP0C2_SA   0
        !           205:     int32_t CP0_Config3;
        !           206: #define CP0C3_M    31
        !           207: #define CP0C3_DSPP 10
        !           208: #define CP0C3_LPA  7
        !           209: #define CP0C3_VEIC 6
        !           210: #define CP0C3_VInt 5
        !           211: #define CP0C3_SP   4
        !           212: #define CP0C3_MT   2
        !           213: #define CP0C3_SM   1
        !           214: #define CP0C3_TL   0
        !           215:     target_ulong CP0_LLAddr;
        !           216:     target_ulong CP0_WatchLo;
        !           217:     int32_t CP0_WatchHi;
        !           218:     target_ulong CP0_XContext;
        !           219:     int32_t CP0_Framemask;
        !           220:     int32_t CP0_Debug;
1.1       root      221: #define CPDB_DBD   31
                    222: #define CP0DB_DM   30
                    223: #define CP0DB_LSNM 28
                    224: #define CP0DB_Doze 27
                    225: #define CP0DB_Halt 26
                    226: #define CP0DB_CNT  25
                    227: #define CP0DB_IBEP 24
                    228: #define CP0DB_DBEP 21
                    229: #define CP0DB_IEXI 20
                    230: #define CP0DB_VER  15
                    231: #define CP0DB_DEC  10
                    232: #define CP0DB_SSt  8
                    233: #define CP0DB_DINT 5
                    234: #define CP0DB_DIB  4
                    235: #define CP0DB_DDBS 3
                    236: #define CP0DB_DDBL 2
                    237: #define CP0DB_DBp  1
                    238: #define CP0DB_DSS  0
1.1.1.5 ! root      239:     target_ulong CP0_DEPC;
        !           240:     int32_t CP0_Performance0;
        !           241:     int32_t CP0_TagLo;
        !           242:     int32_t CP0_DataLo;
        !           243:     int32_t CP0_TagHi;
        !           244:     int32_t CP0_DataHi;
        !           245:     target_ulong CP0_ErrorEPC;
        !           246:     int32_t CP0_DESAVE;
1.1       root      247:     /* Qemu */
                    248:     int interrupt_request;
                    249:     jmp_buf jmp_env;
                    250:     int exception_index;
                    251:     int error_code;
                    252:     int user_mode_only; /* user mode only simulation */
                    253:     uint32_t hflags;    /* CPU State */
                    254:     /* TMASK defines different execution modes */
1.1.1.3   root      255: #define MIPS_HFLAG_TMASK  0x007F
1.1       root      256: #define MIPS_HFLAG_MODE   0x001F /* execution modes                    */
                    257: #define MIPS_HFLAG_UM     0x0001 /* user mode                          */
                    258: #define MIPS_HFLAG_ERL    0x0002 /* Error mode                         */
                    259: #define MIPS_HFLAG_EXL    0x0004 /* Exception mode                     */
                    260: #define MIPS_HFLAG_DM     0x0008 /* Debug mode                         */
                    261: #define MIPS_HFLAG_SM     0x0010 /* Supervisor mode                    */
                    262: #define MIPS_HFLAG_RE     0x0040 /* Reversed endianness                */
1.1.1.2   root      263:     /* If translation is interrupted between the branch instruction and
                    264:      * the delay slot, record what type of branch it is so that we can
                    265:      * resume translation properly.  It might be possible to reduce
                    266:      * this from three bits to two.  */
                    267: #define MIPS_HFLAG_BMASK  0x0380
                    268: #define MIPS_HFLAG_B      0x0080 /* Unconditional branch               */
                    269: #define MIPS_HFLAG_BC     0x0100 /* Conditional branch                 */
                    270: #define MIPS_HFLAG_BL     0x0180 /* Likely branch                      */
                    271: #define MIPS_HFLAG_BR     0x0200 /* branch to register (can't link TB) */
1.1       root      272:     target_ulong btarget;        /* Jump / branch target               */
                    273:     int bcond;                   /* Branch condition (if needed)       */
1.1.1.2   root      274: 
                    275:     int halted; /* TRUE if the CPU is in suspend state */
                    276: 
1.1.1.5 ! root      277:     int SYNCI_Step; /* Address step size for SYNCI */
        !           278:     int CCRes; /* Cycle count resolution/divisor */
        !           279: 
1.1.1.2   root      280:     CPU_COMMON
1.1.1.5 ! root      281: 
        !           282:     int ram_size;
        !           283:     const char *kernel_filename;
        !           284:     const char *kernel_cmdline;
        !           285:     const char *initrd_filename;
        !           286: 
        !           287:     struct QEMUTimer *timer; /* Internal timer */
1.1       root      288: };
                    289: 
                    290: #include "cpu-all.h"
                    291: 
                    292: /* Memory access type :
                    293:  * may be needed for precise access rights control and precise exceptions.
                    294:  */
                    295: enum {
                    296:     /* 1 bit to define user level / supervisor access */
                    297:     ACCESS_USER  = 0x00,
                    298:     ACCESS_SUPER = 0x01,
                    299:     /* 1 bit to indicate direction */
                    300:     ACCESS_STORE = 0x02,
                    301:     /* Type of instruction that generated the access */
                    302:     ACCESS_CODE  = 0x10, /* Code fetch access                */
                    303:     ACCESS_INT   = 0x20, /* Integer load/store access        */
                    304:     ACCESS_FLOAT = 0x30, /* floating point load/store access */
                    305: };
                    306: 
                    307: /* Exceptions */
                    308: enum {
                    309:     EXCP_NONE          = -1,
                    310:     EXCP_RESET         = 0,
                    311:     EXCP_SRESET,
                    312:     EXCP_DSS,
                    313:     EXCP_DINT,
                    314:     EXCP_NMI,
                    315:     EXCP_MCHECK,
                    316:     EXCP_EXT_INTERRUPT,
                    317:     EXCP_DFWATCH,
                    318:     EXCP_DIB, /* 8 */
                    319:     EXCP_IWATCH,
                    320:     EXCP_AdEL,
                    321:     EXCP_AdES,
                    322:     EXCP_TLBF,
                    323:     EXCP_IBE,
                    324:     EXCP_DBp,
                    325:     EXCP_SYSCALL,
1.1.1.2   root      326:     EXCP_BREAK, /* 16 */
                    327:     EXCP_CpU,
1.1       root      328:     EXCP_RI,
                    329:     EXCP_OVERFLOW,
                    330:     EXCP_TRAP,
                    331:     EXCP_DDBS,
                    332:     EXCP_DWATCH,
1.1.1.2   root      333:     EXCP_LAE,
                    334:     EXCP_SAE, /* 24 */
1.1       root      335:     EXCP_LTLBL,
                    336:     EXCP_TLBL,
                    337:     EXCP_TLBS,
                    338:     EXCP_DBE,
                    339:     EXCP_DDBL,
                    340:     EXCP_MTCP0         = 0x104, /* mtmsr instruction:               */
                    341:                                 /* may change privilege level       */
                    342:     EXCP_BRANCH        = 0x108, /* branch instruction               */
                    343:     EXCP_ERET          = 0x10C, /* return from interrupt            */
                    344:     EXCP_SYSCALL_USER  = 0x110, /* System call in user mode only    */
                    345:     EXCP_FLUSH         = 0x109,
                    346: };
                    347: 
                    348: int cpu_mips_exec(CPUMIPSState *s);
                    349: CPUMIPSState *cpu_mips_init(void);
                    350: uint32_t cpu_mips_get_clock (void);
                    351: 
                    352: #endif /* !defined (__MIPS_CPU_H__) */

unix.superglobalmegacorp.com

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