Annotation of cf/mips64.h, revision 1.1.1.2

1.1       root        1: /*
                      2:  * Cisco 7200 (Predator) simulation platform.
                      3:  * Copyright (c) 2005,2006 Christophe Fillot ([email protected])
                      4:  */
                      5: 
                      6: #ifndef __MIPS_64_H__
                      7: #define __MIPS_64_H__
                      8: 
                      9: #include <pthread.h>
                     10: 
                     11: #include "utils.h" 
                     12: #include "rbtree.h"
                     13: 
                     14: /* MIPS General Purpose Registers */
                     15: #define MIPS_GPR_ZERO           0               /*  zero  */
                     16: #define MIPS_GPR_AT             1               /*  at  */
                     17: #define MIPS_GPR_V0             2               /*  v0  */
                     18: #define MIPS_GPR_V1             3               /*  v1  */
                     19: #define MIPS_GPR_A0             4               /*  a0  */
                     20: #define MIPS_GPR_A1             5               /*  a1  */
                     21: #define MIPS_GPR_A2             6               /*  a2  */
                     22: #define MIPS_GPR_A3             7               /*  a3  */
                     23: #define MIPS_GPR_T0             8               /*  t0  */
                     24: #define MIPS_GPR_T1             9               /*  t1  */
                     25: #define MIPS_GPR_T2             10              /*  t2  */
                     26: #define MIPS_GPR_T3             11              /*  t3  */
                     27: #define MIPS_GPR_T4             12              /*  t4  */
                     28: #define MIPS_GPR_T5             13              /*  t5  */
                     29: #define MIPS_GPR_T6             14              /*  t6  */
                     30: #define MIPS_GPR_T7             15              /*  t7  */
                     31: #define MIPS_GPR_S0             16              /*  s0  */
                     32: #define MIPS_GPR_S1             17              /*  s1  */
                     33: #define MIPS_GPR_S2             18              /*  s2  */
                     34: #define MIPS_GPR_S3             19              /*  s3  */
                     35: #define MIPS_GPR_S4             20              /*  s4  */
                     36: #define MIPS_GPR_S5             21              /*  s5  */
                     37: #define MIPS_GPR_S6             22              /*  s6  */
                     38: #define MIPS_GPR_S7             23              /*  s7  */
                     39: #define MIPS_GPR_T8             24              /*  t8  */
                     40: #define MIPS_GPR_T9             25              /*  t9  */
                     41: #define MIPS_GPR_K0             26              /*  k0  */
                     42: #define MIPS_GPR_K1             27              /*  k1  */
                     43: #define MIPS_GPR_GP             28              /*  gp  */
                     44: #define MIPS_GPR_SP             29              /*  sp  */
                     45: #define MIPS_GPR_FP             30              /*  fp  */
                     46: #define MIPS_GPR_RA             31              /*  ra  */
                     47: 
                     48: /*
                     49:  * Coprocessor 0 (System Coprocessor) Register definitions
                     50:  */
                     51: #define MIPS_CP0_INDEX      0             /* TLB Index           */
                     52: #define MIPS_CP0_RANDOM     1             /* TLB Random          */
                     53: #define MIPS_CP0_TLB_LO_0   2             /* TLB Entry Lo0       */
                     54: #define MIPS_CP0_TLB_LO_1   3             /* TLB Entry Lo1       */
                     55: #define MIPS_CP0_CONTEXT    4             /* Kernel PTE pointer  */
                     56: #define MIPS_CP0_PAGEMASK   5             /* TLB Page Mask       */
                     57: #define MIPS_CP0_WIRED      6             /* TLB Wired           */
                     58: #define MIPS_CP0_BADVADDR   8             /* Bad Virtual Address */
                     59: #define MIPS_CP0_COUNT      9             /* Count               */
                     60: #define MIPS_CP0_TLB_HI     10            /* TLB Entry Hi        */
                     61: #define MIPS_CP0_COMPARE    11            /* Timer Compare       */
                     62: #define MIPS_CP0_STATUS     12            /* Status              */
                     63: #define MIPS_CP0_CAUSE      13            /* Cause               */
                     64: #define MIPS_CP0_EPC        14            /* Exception PC        */
                     65: #define MIPS_CP0_PRID       15            /* Proc Rev ID         */
                     66: #define MIPS_CP0_CONFIG     16            /* Configuration       */
                     67: #define MIPS_CP0_LLADDR     17            /* Load/Link address   */
                     68: #define MIPS_CP0_WATCHLO    18            /* Low Watch address   */
                     69: #define MIPS_CP0_WATCHHI    19            /* High Watch address  */
                     70: #define MIPS_CP0_XCONTEXT   20            /* Extended context    */
                     71: #define MIPS_CP0_ECC        26            /* ECC and parity      */
                     72: #define MIPS_CP0_CACHERR    27            /* Cache Err/Status    */
                     73: #define MIPS_CP0_TAGLO      28            /* Cache Tag Lo        */
                     74: #define MIPS_CP0_TAGHI      29            /* Cache Tag Hi        */
                     75: #define MIPS_CP0_ERR_EPC    30            /* Error exception PC  */
                     76: 
                     77: /*
                     78:  * CP0 Status Register
                     79:  */
                     80: #define MIPS_CP0_STATUS_CU0        0x10000000
                     81: #define MIPS_CP0_STATUS_CU1        0x20000000
                     82: #define MIPS_CP0_STATUS_BEV        0x00400000
                     83: #define MIPS_CP0_STATUS_TS         0x00200000
                     84: #define MIPS_CP0_STATUS_SR         0x00100000
                     85: #define MIPS_CP0_STATUS_CH         0x00040000
                     86: #define MIPS_CP0_STATUS_CE         0x00020000
                     87: #define MIPS_CP0_STATUS_DE         0x00010000
                     88: #define MIPS_CP0_STATUS_RP         0x08000000
                     89: #define MIPS_CP0_STATUS_FR         0x04000000
                     90: #define MIPS_CP0_STATUS_RE         0x02000000
                     91: #define MIPS_CP0_STATUS_KX         0x00000080
                     92: #define MIPS_CP0_STATUS_SX         0x00000040
                     93: #define MIPS_CP0_STATUS_UX         0x00000020
                     94: #define MIPS_CP0_STATUS_KSU        0x00000018
                     95: #define MIPS_CP0_STATUS_ERL        0x00000004
                     96: #define MIPS_CP0_STATUS_EXL        0x00000002
                     97: #define MIPS_CP0_STATUS_IE         0x00000001
                     98: #define MIPS_CP0_STATUS_IMASK8     0x00000000
                     99: #define MIPS_CP0_STATUS_IMASK7     0x00008000
                    100: #define MIPS_CP0_STATUS_IMASK6     0x00004000
                    101: #define MIPS_CP0_STATUS_IMASK5     0x00002000
                    102: #define MIPS_CP0_STATUS_IMASK4     0x00001000
                    103: #define MIPS_CP0_STATUS_IMASK3     0x00000800
                    104: #define MIPS_CP0_STATUS_IMASK2     0x00000400
                    105: #define MIPS_CP0_STATUS_IMASK1     0x00000200
                    106: #define MIPS_CP0_STATUS_IMASK0     0x00000100
                    107: 
                    108: #define MIPS_CP0_STATUS_DS_MASK    0x00770000
                    109: #define MIPS_CP0_STATUS_CU_MASK    0xF0000000
                    110: #define MIPS_CP0_STATUS_IMASK      0x0000FF00
                    111: 
                    112: /* Addressing mode: Kernel, Supervisor and User */
                    113: #define MIPS_CP0_STATUS_KSU_SHIFT  0x03
                    114: #define MIPS_CP0_STATUS_KSU_MASK   0x03
                    115: 
                    116: #define MIPS_CP0_STATUS_KM  0x00
                    117: #define MIPS_CP0_STATUS_SM  0x01
                    118: #define MIPS_CP0_STATUS_UM  0x10
                    119: 
                    120: 
                    121: /*
                    122:  * CP0 Cause register
                    123:  */
                    124: #define MIPS_CP0_CAUSE_BD_SLOT        0x80000000
                    125: 
                    126: #define MIPS_CP0_CAUSE_MASK           0x0000007C
                    127: #define MIPS_CP0_CAUSE_CEMASK         0x30000000
                    128: #define MIPS_CP0_CAUSE_IMASK          0x0000FF00
                    129: 
                    130: #define MIPS_CP0_CAUSE_SHIFT          2
                    131: #define MIPS_CP0_CAUSE_CESHIFT        28
                    132: #define MIPS_CP0_CAUSE_ISHIFT         8
                    133: 
                    134: #define MIPS_CP0_CAUSE_INTERRUPT      0
                    135: #define MIPS_CP0_CAUSE_TLB_MOD        1
                    136: #define MIPS_CP0_CAUSE_TLB_LOAD       2
                    137: #define MIPS_CP0_CAUSE_TLB_SAVE       3
                    138: #define MIPS_CP0_CAUSE_ADDR_LOAD      4    /* ADEL */
                    139: #define MIPS_CP0_CAUSE_ADDR_SAVE      5    /* ADES */
                    140: #define MIPS_CP0_CAUSE_BUS_INSTR      6
                    141: #define MIPS_CP0_CAUSE_BUS_DATA       7
                    142: #define MIPS_CP0_CAUSE_SYSCALL        8
                    143: #define MIPS_CP0_CAUSE_BP             9
                    144: #define MIPS_CP0_CAUSE_ILLOP          10
                    145: #define MIPS_CP0_CAUSE_CP_UNUSABLE    11
                    146: #define MIPS_CP0_CAUSE_OVFLW          12
                    147: #define MIPS_CP0_CAUSE_TRAP           13
                    148: #define MIPS_CP0_CAUSE_VC_INSTR       14   /* Virtual Coherency */
                    149: #define MIPS_CP0_CAUSE_FPE            15
                    150: #define MIPS_CP0_CAUSE_WATCH          23
                    151: #define MIPS_CP0_CAUSE_VC_DATA        31   /* Virtual Coherency */
                    152: 
                    153: #define MIPS_CP0_CAUSE_IBIT7     0x00008000
                    154: #define MIPS_CP0_CAUSE_IBIT6     0x00004000
                    155: #define MIPS_CP0_CAUSE_IBIT5     0x00002000
                    156: #define MIPS_CP0_CAUSE_IBIT4     0x00001000
                    157: #define MIPS_CP0_CAUSE_IBIT3     0x00000800
                    158: #define MIPS_CP0_CAUSE_IBIT2     0x00000400
                    159: #define MIPS_CP0_CAUSE_IBIT1     0x00000200
                    160: #define MIPS_CP0_CAUSE_IBIT0     0x00000100
                    161: 
                    162: 
                    163: /* TLB masks and shifts */
                    164: #define MIPS_TLB_PAGE_MASK     0x01ffe000
                    165: #define MIPS_TLB_PAGE_SHIFT    13
                    166: #define MIPS_TLB_VPN2_MASK     0xffffffffffffe000ULL
                    167: #define MIPS_TLB_PFN_MASK      0x3fffffc0
                    168: #define MIPS_TLB_ASID_MASK     0x000000ff       /* "asid" in EntryHi */
                    169: #define MIPS_TLB_G_MASK        0x00001000       /* "Global" in EntryHi */
                    170: #define MIPS_TLB_V_MASK        0x2              /* "Valid" in EntryLo */
                    171: #define MIPS_TLB_D_MASK        0x4              /* "Dirty" in EntryLo */
                    172: 
                    173: #define MIPS_CP0_LO_G_MASK     0x00000001     /* "Global" in Lo0/1 reg */
                    174: #define MIPS_CP0_HI_SAFE_MASK  0xffffe0ff     /* Safety mask for Hi reg */
                    175: #define MIPS_CP0_LO_SAFE_MASK  0x7fffffff     /* Safety mask for Lo reg */
                    176: 
                    177: /* MIPS "jr ra" instruction */
                    178: #define MIPS_INSN_JR_RA   0x03e00008
                    179: 
                    180: /* Minimum page size: 4 Kb */
                    181: #define MIPS_MIN_PAGE_SIZE  (1 << 12)
                    182: 
                    183: /* Addressing mode: Kernel, Supervisor and User */
                    184: #define MIPS_MODE_KERNEL  00
                    185: 
                    186: /* Segments in 32-bit User mode */
                    187: #define MIPS_USEG_BASE    0x00000000
                    188: #define MIPS_USEG_SIZE    0x80000000
                    189: 
                    190: /* Segments in 32-bit Supervisor mode */
                    191: #define MIPS_SUSEG_BASE   0x00000000
                    192: #define MIPS_SUSEG_SIZE   0x80000000
                    193: #define MIPS_SSEG_BASE    0xc0000000
                    194: #define MIPS_SSEG_SIZE    0x20000000
                    195: 
                    196: /* Segments in 32-bit Kernel mode */
                    197: #define MIPS_KUSEG_BASE   0x00000000
                    198: #define MIPS_KUSEG_SIZE   0x80000000
                    199: 
                    200: #define MIPS_KSEG0_BASE   0x80000000
                    201: #define MIPS_KSEG0_SIZE   0x20000000
                    202: 
                    203: #define MIPS_KSEG1_BASE   0xa0000000
                    204: #define MIPS_KSEG1_SIZE   0x20000000
                    205: 
                    206: #define MIPS_KSSEG_BASE   0xc0000000
                    207: #define MIPS_KSSEG_SIZE   0x20000000
                    208: 
                    209: #define MIPS_KSEG3_BASE   0xe0000000
                    210: #define MIPS_KSEG3_SIZE   0x20000000
                    211: 
                    212: /* Macros for CPU structure access */
                    213: #define REG_OFFSET(reg)       (OFFSET(cpu_mips_t,gpr[(reg)]))
                    214: #define CP0_REG_OFFSET(c0reg) (OFFSET(cpu_mips_t,cp0.reg[(c0reg)]))
                    215: #define MEMOP_OFFSET(op)      (OFFSET(cpu_mips_t,mem_op_fn[(op)]))
                    216: 
                    217: /* Initial Program Counter and Stack pointer for ROM */
                    218: #define MIPS_ROM_PC  0xffffffffbfc00000ULL
                    219: #define MIPS_ROM_SP  0xffffffff80004000ULL
                    220: 
                    221: /* Number of GPR (general purpose registers) */
                    222: #define MIPS64_GPR_NR  32
                    223: 
                    224: /* Number of registers in CP0 */
                    225: #define MIPS64_CP0_REG_NR   32
                    226: 
                    227: /* Number of registers in CP1 */
                    228: #define MIPS64_CP1_REG_NR   32
                    229: 
                    230: /* Number of TLB entries */
                    231: #define MIPS64_TLB_ENTRIES    64
                    232: #define MIPS64_TLB_IDX_MASK   0x3f   /* 6 bits */
                    233: 
                    234: /* Virtual CPU states */
                    235: enum {
                    236:    MIPS_CPU_RUNNING = 0,
                    237:    MIPS_CPU_HALTED,
                    238:    MIPS_CPU_SUSPENDED,
                    239: };
                    240: 
                    241: /* Memory operations */
                    242: enum {
                    243:    MIPS_MEMOP_LB = 0,
                    244:    MIPS_MEMOP_LBU,
                    245:    MIPS_MEMOP_LH,
                    246:    MIPS_MEMOP_LHU,
                    247:    MIPS_MEMOP_LW,
                    248:    MIPS_MEMOP_LWU,
                    249:    MIPS_MEMOP_LD,
                    250:    MIPS_MEMOP_SB,
                    251:    MIPS_MEMOP_SH,
                    252:    MIPS_MEMOP_SW,
                    253:    MIPS_MEMOP_SD, 
                    254: 
                    255:    MIPS_MEMOP_LWL,
                    256:    MIPS_MEMOP_LWR,
                    257:    MIPS_MEMOP_LDL,
                    258:    MIPS_MEMOP_LDR,
                    259:    MIPS_MEMOP_SWL,
                    260:    MIPS_MEMOP_SWR,
                    261:    MIPS_MEMOP_SDL,
                    262:    MIPS_MEMOP_SDR,
                    263: 
                    264:    MIPS_MEMOP_LL,
                    265:    MIPS_MEMOP_SC,
                    266: 
                    267:    MIPS_MEMOP_LDC1,
                    268:    MIPS_MEMOP_SDC1,
                    269: 
                    270:    MIPS_MEMOP_CACHE,
                    271: 
                    272:    MIPS_MEMOP_MAX,
                    273: };
                    274: 
                    275: /* 6 bits are reserved for device ID (see the memory subsystem) */
                    276: #define MIPS64_DEVICE_MAX  (1 << 6)
                    277: 
                    278: /* Number of recorded memory accesses (power of two) */
                    279: #define MEMLOG_COUNT   16
                    280: 
                    281: /* Maximum number of breakpoints */
                    282: #define MIPS64_MAX_BREAKPOINTS  8
                    283: 
                    284: typedef struct memlog_access memlog_access_t;
                    285: struct memlog_access {
                    286:    m_uint64_t pc;
                    287:    m_uint64_t vaddr;
                    288:    m_uint64_t data;
                    289:    m_uint32_t data_valid;
                    290:    m_uint32_t op_size;
                    291:    m_uint32_t op_type;
                    292: };
                    293: 
                    294: /* MIPS CPU type */
                    295: typedef struct cpu_mips cpu_mips_t;
                    296: 
                    297: /* Memory operation function prototype */
                    298: typedef fastcall u_int (*mips_memop_fn)(cpu_mips_t *cpu,m_uint64_t vaddr,
                    299:                                         u_int reg);
                    300: 
                    301: /* TLB entry definition */
                    302: typedef struct {
                    303:    m_uint64_t mask;
                    304:    m_uint64_t hi;
                    305:    m_uint64_t lo0;
                    306:    m_uint64_t lo1;
                    307: }tlb_entry_t;
                    308: 
                    309: /* System Coprocessor (CP0) definition */
                    310: typedef struct {
                    311:    m_uint64_t reg[MIPS64_CP0_REG_NR];
                    312:    tlb_entry_t tlb[MIPS64_TLB_ENTRIES];
                    313: }mips_cp0_t;
                    314: 
                    315: /* FPU Coprocessor (CP1) definition */
                    316: typedef struct {
                    317:    m_uint64_t reg[MIPS64_CP1_REG_NR];
                    318: }mips_cp1_t;
                    319: 
                    320: /* CPU definition */
                    321: struct cpu_mips {
                    322:    m_uint64_t gpr[MIPS64_GPR_NR];
                    323:    m_uint64_t pc;
                    324:    m_uint64_t lo,hi;
                    325:    m_uint32_t irq_pending;
                    326: 
                    327:    /* Red-Black tree to locate PC */
                    328:    rbtree_tree *insn_block_tree;
                    329: 
1.1.1.2 ! root      330:    /* Instruction block hash table */
        !           331:    void **insn_block_hash;
        !           332: 
1.1       root      333:    /* MTS 1st level array */
                    334:    void *mts_l1_ptr;
                    335: 
                    336:    /* MTS32 array free list */
                    337:    void *mts32_l2_free_list;
                    338:    
                    339:    /* Memory lookup function (to load ELF image,...) */
                    340:    void *(*mem_op_lookup)(cpu_mips_t *cpu,m_uint64_t vaddr);
                    341:    
                    342:    /* Memory access functions */
                    343:    mips_memop_fn mem_op_fn[MIPS_MEMOP_MAX];
                    344: 
                    345:    /* Virtual version of CP0 Compare Register */
                    346:    m_uint32_t cp0_virt_cmp_reg;
                    347:    m_uint32_t cp0_virt_cnt_reg;
                    348: 
                    349:    /* Address bus mask */
                    350:    m_uint64_t addr_bus_mask;
                    351: 
                    352:    /* System coprocessor (CP0) */
                    353:    mips_cp0_t cp0;
                    354:    
                    355:    /* FPU (CP1) */
                    356:    mips_cp1_t fpu;
                    357: 
1.1.1.2 ! root      358:    /* LL/SC information */
        !           359:    u_int ll_bit;
        !           360: 
1.1       root      361:    /* CPU identifier for MP systems and CPU state */
                    362:    u_int id,state;
                    363: 
                    364:    /* Next CPU in group */
                    365:    cpu_mips_t *next;
1.1.1.2 ! root      366:    
1.1       root      367:    /* Memory mapped devices */
                    368:    struct vdevice *dev_array[MIPS64_DEVICE_MAX];
                    369: 
                    370:    /* Thread running this CPU */
                    371:    pthread_t cpu_thread;
                    372: 
                    373:    /* Memory access log for fault debugging */
                    374:    u_int memlog_pos;
                    375:    memlog_access_t memlog_array[MEMLOG_COUNT];
                    376: 
                    377:    /* Breakpoints */
                    378:    m_uint64_t breakpoints[MIPS64_MAX_BREAKPOINTS];
                    379:    u_int breakpoint_enabled;
                    380: 
                    381:    /* non-JIT mode instruction counter */
                    382:    m_uint64_t insn_exec_count;
1.1.1.2 ! root      383: 
        !           384:    /* Instruction block hash table statistics */
        !           385:    m_uint64_t hash_misses,hash_lookups;
1.1       root      386: };
                    387: 
                    388: /* Register names */
                    389: extern char *mips64_gpr_reg_names[];
                    390: 
                    391: /* Initialize a MIPS64 processor */
                    392: void mips64_init(cpu_mips_t *cpu);
                    393: 
                    394: /* Update the IRQ flag */
                    395: void mips64_update_irq_flag(cpu_mips_t *cpu);
                    396: 
                    397: /* Generate an exception */
                    398: void mips64_trigger_exception(cpu_mips_t *cpu,u_int exc_code,int bd_slot);
                    399: 
                    400: /*
                    401:  * Increment count register and trigger the timer IRQ if value in compare 
                    402:  * register is the same.
                    403:  */
                    404: fastcall void mips64_exec_inc_cp0_cnt(cpu_mips_t *cpu);
                    405: 
                    406: /* Trigger the Timer IRQ */
                    407: fastcall void mips64_trigger_timer_irq(cpu_mips_t *cpu);
                    408: 
                    409: /* Execute ERET instruction */
                    410: fastcall void mips64_exec_eret(cpu_mips_t *cpu);
                    411: 
                    412: /* Execute SYSCALL instruction */
                    413: fastcall void mips64_exec_syscall(cpu_mips_t *cpu);
                    414: 
                    415: /* Execute BREAK instruction */
                    416: fastcall void mips64_exec_break(cpu_mips_t *cpu,u_int code);
                    417: 
                    418: /* Trigger a Trap Exception */
                    419: asmlinkage void mips64_trigger_trap_exception(cpu_mips_t *cpu);
                    420: 
                    421: /* Trigger IRQs */
                    422: fastcall void mips64_trigger_irq(cpu_mips_t *cpu);
                    423: 
                    424: /* Set an IRQ */
                    425: void mips64_set_irq(cpu_mips_t *cpu,u_int irq);
                    426: 
                    427: /* Clear an IRQ */
                    428: void mips64_clear_irq(cpu_mips_t *cpu,u_int irq);
                    429: 
                    430: /* DMFC1 */
                    431: fastcall void mips64_exec_dmfc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg);
                    432: 
                    433: /* DMTC1 */
                    434: fastcall void mips64_exec_dmtc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg);
                    435: 
                    436: /* MFC1 */
                    437: fastcall void mips64_exec_mfc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg);
                    438: 
                    439: /* MTC1 */
                    440: fastcall void mips64_exec_mtc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg);
                    441: 
                    442: /* Virtual breakpoint */
                    443: fastcall void mips64_run_breakpoint(cpu_mips_t *cpu);
                    444: 
                    445: /* Dump registers of a MIPS64 processor */
                    446: void mips64_dump_regs(cpu_mips_t *cpu);
                    447: 
                    448: /* Dump a memory block */
                    449: void mips64_dump_memory(cpu_mips_t *cpu,m_uint64_t vaddr,u_int count);
                    450: 
                    451: /* Dump the stack */
                    452: void mips64_dump_stack(cpu_mips_t *cpu,u_int count);
                    453: 
                    454: /* Save the CPU state into a file */
                    455: int mips64_save_state(cpu_mips_t *cpu,char *filename);
                    456: 
                    457: #endif

unix.superglobalmegacorp.com

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