|
|
1.1 root 1: /* 1.1.1.8 root 2: * Cisco router simulation platform. 1.1 root 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: 1.1.1.4 root 14: /* 15: * MIPS General Purpose Registers 16: */ 17: #define MIPS_GPR_ZERO 0 /* zero */ 18: #define MIPS_GPR_AT 1 /* at */ 19: #define MIPS_GPR_V0 2 /* v0 */ 20: #define MIPS_GPR_V1 3 /* v1 */ 21: #define MIPS_GPR_A0 4 /* a0 */ 22: #define MIPS_GPR_A1 5 /* a1 */ 23: #define MIPS_GPR_A2 6 /* a2 */ 24: #define MIPS_GPR_A3 7 /* a3 */ 25: #define MIPS_GPR_T0 8 /* t0 */ 26: #define MIPS_GPR_T1 9 /* t1 */ 27: #define MIPS_GPR_T2 10 /* t2 */ 28: #define MIPS_GPR_T3 11 /* t3 */ 29: #define MIPS_GPR_T4 12 /* t4 */ 30: #define MIPS_GPR_T5 13 /* t5 */ 31: #define MIPS_GPR_T6 14 /* t6 */ 32: #define MIPS_GPR_T7 15 /* t7 */ 33: #define MIPS_GPR_S0 16 /* s0 */ 34: #define MIPS_GPR_S1 17 /* s1 */ 35: #define MIPS_GPR_S2 18 /* s2 */ 36: #define MIPS_GPR_S3 19 /* s3 */ 37: #define MIPS_GPR_S4 20 /* s4 */ 38: #define MIPS_GPR_S5 21 /* s5 */ 39: #define MIPS_GPR_S6 22 /* s6 */ 40: #define MIPS_GPR_S7 23 /* s7 */ 41: #define MIPS_GPR_T8 24 /* t8 */ 42: #define MIPS_GPR_T9 25 /* t9 */ 43: #define MIPS_GPR_K0 26 /* k0 */ 44: #define MIPS_GPR_K1 27 /* k1 */ 45: #define MIPS_GPR_GP 28 /* gp */ 46: #define MIPS_GPR_SP 29 /* sp */ 47: #define MIPS_GPR_FP 30 /* fp */ 48: #define MIPS_GPR_RA 31 /* ra */ 1.1 root 49: 50: /* 51: * Coprocessor 0 (System Coprocessor) Register definitions 52: */ 1.1.1.4 root 53: #define MIPS_CP0_INDEX 0 /* TLB Index */ 54: #define MIPS_CP0_RANDOM 1 /* TLB Random */ 55: #define MIPS_CP0_TLB_LO_0 2 /* TLB Entry Lo0 */ 56: #define MIPS_CP0_TLB_LO_1 3 /* TLB Entry Lo1 */ 57: #define MIPS_CP0_CONTEXT 4 /* Kernel PTE pointer */ 58: #define MIPS_CP0_PAGEMASK 5 /* TLB Page Mask */ 59: #define MIPS_CP0_WIRED 6 /* TLB Wired */ 60: #define MIPS_CP0_INFO 7 /* Info (RM7000) */ 61: #define MIPS_CP0_BADVADDR 8 /* Bad Virtual Address */ 62: #define MIPS_CP0_COUNT 9 /* Count */ 63: #define MIPS_CP0_TLB_HI 10 /* TLB Entry Hi */ 64: #define MIPS_CP0_COMPARE 11 /* Timer Compare */ 65: #define MIPS_CP0_STATUS 12 /* Status */ 66: #define MIPS_CP0_CAUSE 13 /* Cause */ 67: #define MIPS_CP0_EPC 14 /* Exception PC */ 68: #define MIPS_CP0_PRID 15 /* Proc Rev ID */ 69: #define MIPS_CP0_CONFIG 16 /* Configuration */ 70: #define MIPS_CP0_LLADDR 17 /* Load/Link address */ 71: #define MIPS_CP0_WATCHLO 18 /* Low Watch address */ 72: #define MIPS_CP0_WATCHHI 19 /* High Watch address */ 73: #define MIPS_CP0_XCONTEXT 20 /* Extended context */ 74: #define MIPS_CP0_ECC 26 /* ECC and parity */ 75: #define MIPS_CP0_CACHERR 27 /* Cache Err/Status */ 76: #define MIPS_CP0_TAGLO 28 /* Cache Tag Lo */ 77: #define MIPS_CP0_TAGHI 29 /* Cache Tag Hi */ 78: #define MIPS_CP0_ERR_EPC 30 /* Error exception PC */ 79: 80: /* 81: * CP0 Set 1 Registers (R7000) 82: */ 83: #define MIPS_CP0_S1_CONFIG 16 /* Configuration Register */ 84: #define MIPS_CP0_S1_IPLLO 18 /* Priority level for IRQ [7:0] */ 85: #define MIPS_CP0_S1_IPLHI 19 /* Priority level for IRQ [15:8] */ 86: #define MIPS_CP0_S1_INTCTL 20 /* Interrupt Control */ 87: #define MIPS_CP0_S1_DERRADDR0 26 /* Imprecise Error Address */ 88: #define MIPS_CP0_S1_DERRADDR1 27 /* Imprecise Error Address */ 1.1 root 89: 90: /* 91: * CP0 Status Register 92: */ 93: #define MIPS_CP0_STATUS_CU0 0x10000000 94: #define MIPS_CP0_STATUS_CU1 0x20000000 95: #define MIPS_CP0_STATUS_BEV 0x00400000 96: #define MIPS_CP0_STATUS_TS 0x00200000 97: #define MIPS_CP0_STATUS_SR 0x00100000 98: #define MIPS_CP0_STATUS_CH 0x00040000 99: #define MIPS_CP0_STATUS_CE 0x00020000 100: #define MIPS_CP0_STATUS_DE 0x00010000 101: #define MIPS_CP0_STATUS_RP 0x08000000 102: #define MIPS_CP0_STATUS_FR 0x04000000 103: #define MIPS_CP0_STATUS_RE 0x02000000 104: #define MIPS_CP0_STATUS_KX 0x00000080 105: #define MIPS_CP0_STATUS_SX 0x00000040 106: #define MIPS_CP0_STATUS_UX 0x00000020 107: #define MIPS_CP0_STATUS_KSU 0x00000018 108: #define MIPS_CP0_STATUS_ERL 0x00000004 109: #define MIPS_CP0_STATUS_EXL 0x00000002 110: #define MIPS_CP0_STATUS_IE 0x00000001 111: #define MIPS_CP0_STATUS_IMASK7 0x00008000 112: #define MIPS_CP0_STATUS_IMASK6 0x00004000 113: #define MIPS_CP0_STATUS_IMASK5 0x00002000 114: #define MIPS_CP0_STATUS_IMASK4 0x00001000 115: #define MIPS_CP0_STATUS_IMASK3 0x00000800 116: #define MIPS_CP0_STATUS_IMASK2 0x00000400 117: #define MIPS_CP0_STATUS_IMASK1 0x00000200 118: #define MIPS_CP0_STATUS_IMASK0 0x00000100 119: 120: #define MIPS_CP0_STATUS_DS_MASK 0x00770000 121: #define MIPS_CP0_STATUS_CU_MASK 0xF0000000 122: #define MIPS_CP0_STATUS_IMASK 0x0000FF00 123: 124: /* Addressing mode: Kernel, Supervisor and User */ 125: #define MIPS_CP0_STATUS_KSU_SHIFT 0x03 126: #define MIPS_CP0_STATUS_KSU_MASK 0x03 127: 128: #define MIPS_CP0_STATUS_KM 0x00 129: #define MIPS_CP0_STATUS_SM 0x01 130: #define MIPS_CP0_STATUS_UM 0x10 131: 132: 133: /* 134: * CP0 Cause register 135: */ 136: #define MIPS_CP0_CAUSE_BD_SLOT 0x80000000 137: 138: #define MIPS_CP0_CAUSE_MASK 0x0000007C 139: #define MIPS_CP0_CAUSE_CEMASK 0x30000000 140: #define MIPS_CP0_CAUSE_IMASK 0x0000FF00 141: 142: #define MIPS_CP0_CAUSE_SHIFT 2 143: #define MIPS_CP0_CAUSE_CESHIFT 28 144: #define MIPS_CP0_CAUSE_ISHIFT 8 145: 146: #define MIPS_CP0_CAUSE_INTERRUPT 0 147: #define MIPS_CP0_CAUSE_TLB_MOD 1 148: #define MIPS_CP0_CAUSE_TLB_LOAD 2 149: #define MIPS_CP0_CAUSE_TLB_SAVE 3 150: #define MIPS_CP0_CAUSE_ADDR_LOAD 4 /* ADEL */ 151: #define MIPS_CP0_CAUSE_ADDR_SAVE 5 /* ADES */ 152: #define MIPS_CP0_CAUSE_BUS_INSTR 6 153: #define MIPS_CP0_CAUSE_BUS_DATA 7 154: #define MIPS_CP0_CAUSE_SYSCALL 8 155: #define MIPS_CP0_CAUSE_BP 9 156: #define MIPS_CP0_CAUSE_ILLOP 10 157: #define MIPS_CP0_CAUSE_CP_UNUSABLE 11 158: #define MIPS_CP0_CAUSE_OVFLW 12 159: #define MIPS_CP0_CAUSE_TRAP 13 160: #define MIPS_CP0_CAUSE_VC_INSTR 14 /* Virtual Coherency */ 161: #define MIPS_CP0_CAUSE_FPE 15 162: #define MIPS_CP0_CAUSE_WATCH 23 163: #define MIPS_CP0_CAUSE_VC_DATA 31 /* Virtual Coherency */ 164: 165: #define MIPS_CP0_CAUSE_IBIT7 0x00008000 166: #define MIPS_CP0_CAUSE_IBIT6 0x00004000 167: #define MIPS_CP0_CAUSE_IBIT5 0x00002000 168: #define MIPS_CP0_CAUSE_IBIT4 0x00001000 169: #define MIPS_CP0_CAUSE_IBIT3 0x00000800 170: #define MIPS_CP0_CAUSE_IBIT2 0x00000400 171: #define MIPS_CP0_CAUSE_IBIT1 0x00000200 172: #define MIPS_CP0_CAUSE_IBIT0 0x00000100 173: 1.1.1.11! root 174: /* CP0 Context register */ ! 175: #define MIPS_CP0_CONTEXT_VPN2_MASK 0xffffe000ULL /* applied to addr */ ! 176: #define MIPS_CP0_CONTEXT_BADVPN2_MASK 0x7fffffULL ! 177: #define MIPS_CP0_CONTEXT_BADVPN2_SHIFT 4 ! 178: ! 179: /* CP0 XContext register */ ! 180: #define MIPS_CP0_XCONTEXT_VPN2_MASK 0xffffffe000ULL ! 181: #define MIPS_CP0_XCONTEXT_RBADVPN2_MASK 0x1ffffffffULL ! 182: #define MIPS_CP0_XCONTEXT_BADVPN2_SHIFT 4 ! 183: #define MIPS_CP0_XCONTEXT_R_SHIFT 31 1.1 root 184: 185: /* TLB masks and shifts */ 1.1.1.11! root 186: #define MIPS_TLB_PAGE_MASK 0x01ffe000ULL 1.1 root 187: #define MIPS_TLB_PAGE_SHIFT 13 1.1.1.7 root 188: #define MIPS_TLB_VPN2_MASK_32 0xffffe000ULL 189: #define MIPS_TLB_VPN2_MASK_64 0xc00000ffffffe000ULL 1.1.1.11! root 190: #define MIPS_TLB_PFN_MASK 0x3fffffc0ULL 1.1.1.4 root 191: #define MIPS_TLB_ASID_MASK 0x000000ff /* "asid" in EntryHi */ 1.1.1.11! root 192: #define MIPS_TLB_G_MASK 0x00001000ULL /* "Global" in EntryHi */ ! 193: #define MIPS_TLB_V_MASK 0x2ULL /* "Valid" in EntryLo */ ! 194: #define MIPS_TLB_D_MASK 0x4ULL /* "Dirty" in EntryLo */ ! 195: #define MIPS_TLB_C_MASK 0x38ULL /* Page Coherency Attribute */ 1.1.1.4 root 196: #define MIPS_TLB_C_SHIFT 3 1.1 root 197: 1.1.1.11! root 198: #define MIPS_CP0_LO_G_MASK 0x00000001ULL /* "Global" in Lo0/1 reg */ ! 199: #define MIPS_CP0_LO_SAFE_MASK 0x3fffffffULL /* Safety mask for Lo reg */ ! 200: #define MIPS_CP0_HI_SAFE_MASK 0xc00000ffffffe0ffULL /* Same for EntryHi */ ! 201: ! 202: /* results for TLB lookups */ ! 203: enum { ! 204: MIPS_TLB_LOOKUP_OK = 0, /* Entry found */ ! 205: MIPS_TLB_LOOKUP_INVALID, /* Invalid entry found */ ! 206: MIPS_TLB_LOOKUP_MISS, /* No matching entry found */ ! 207: MIPS_TLB_LOOKUP_MOD, /* Read-only */ ! 208: }; ! 209: ! 210: /* Exceptions vectors */ ! 211: enum { ! 212: MIPS_EXCVECT_RST = 0, /* Soft Reset, Reset, NMI */ ! 213: MIPS_EXCVECT_TLB_REFILL, /* TLB Refill (32-bit) */ ! 214: MIPS_EXCVECT_XTLB_REFILL, /* TLB Refill (64-bit) */ ! 215: MIPS_EXCVECT_CACHE_ERR, /* Cache Error */ ! 216: MIPS_EXCVECT_INT_IV0, /* Interrupt, IV=0 */ ! 217: MIPS_EXCVECT_INT_IV1, /* Interrupt, IV=1 */ ! 218: MIPS_EXCVECT_OTHERS, /* Other exceptions */ ! 219: }; 1.1 root 220: 221: /* MIPS "jr ra" instruction */ 1.1.1.4 root 222: #define MIPS_INSN_JR_RA 0x03e00008 1.1 root 223: 224: /* Minimum page size: 4 Kb */ 1.1.1.4 root 225: #define MIPS_MIN_PAGE_SHIFT 12 226: #define MIPS_MIN_PAGE_SIZE (1 << MIPS_MIN_PAGE_SHIFT) 227: #define MIPS_MIN_PAGE_IMASK (MIPS_MIN_PAGE_SIZE - 1) 1.1.1.8 root 228: #define MIPS_MIN_PAGE_MASK 0xfffffffffffff000ULL 1.1 root 229: 230: /* Addressing mode: Kernel, Supervisor and User */ 231: #define MIPS_MODE_KERNEL 00 232: 233: /* Segments in 32-bit User mode */ 234: #define MIPS_USEG_BASE 0x00000000 235: #define MIPS_USEG_SIZE 0x80000000 236: 237: /* Segments in 32-bit Supervisor mode */ 238: #define MIPS_SUSEG_BASE 0x00000000 239: #define MIPS_SUSEG_SIZE 0x80000000 240: #define MIPS_SSEG_BASE 0xc0000000 241: #define MIPS_SSEG_SIZE 0x20000000 242: 243: /* Segments in 32-bit Kernel mode */ 244: #define MIPS_KUSEG_BASE 0x00000000 245: #define MIPS_KUSEG_SIZE 0x80000000 246: 247: #define MIPS_KSEG0_BASE 0x80000000 248: #define MIPS_KSEG0_SIZE 0x20000000 249: 250: #define MIPS_KSEG1_BASE 0xa0000000 251: #define MIPS_KSEG1_SIZE 0x20000000 252: 253: #define MIPS_KSSEG_BASE 0xc0000000 254: #define MIPS_KSSEG_SIZE 0x20000000 255: 256: #define MIPS_KSEG3_BASE 0xe0000000 257: #define MIPS_KSEG3_SIZE 0x20000000 258: 1.1.1.4 root 259: /* xkphys mask (36-bit physical address) */ 260: #define MIPS64_XKPHYS_ZONE_MASK 0xF800000000000000ULL 261: #define MIPS64_XKPHYS_PHYS_SIZE (1ULL << 36) 262: #define MIPS64_XKPHYS_PHYS_MASK (MIPS64_XKPHYS_PHYS_SIZE - 1) 263: #define MIPS64_XKPHYS_CCA_SHIFT 59 264: 1.1 root 265: /* Initial Program Counter and Stack pointer for ROM */ 266: #define MIPS_ROM_PC 0xffffffffbfc00000ULL 267: #define MIPS_ROM_SP 0xffffffff80004000ULL 268: 269: /* Number of GPR (general purpose registers) */ 270: #define MIPS64_GPR_NR 32 271: 272: /* Number of registers in CP0 */ 273: #define MIPS64_CP0_REG_NR 32 274: 275: /* Number of registers in CP1 */ 276: #define MIPS64_CP1_REG_NR 32 277: 278: /* Number of TLB entries */ 1.1.1.4 root 279: #define MIPS64_TLB_STD_ENTRIES 48 280: #define MIPS64_TLB_MAX_ENTRIES 64 281: #define MIPS64_TLB_IDX_MASK 0x3f /* 6 bits */ 282: 283: /* Enable the 64 TLB entries for R7000 CPU */ 284: #define MIPS64_R7000_TLB64_ENABLE 0x20000000 285: 1.1.1.8 root 286: /* Number of instructions per page */ 287: #define MIPS_INSN_PER_PAGE (MIPS_MIN_PAGE_SIZE/sizeof(mips_insn_t)) 288: 1.1.1.4 root 289: /* MIPS CPU Identifiers */ 290: #define MIPS_PRID_R4600 0x00002012 291: #define MIPS_PRID_R4700 0x00002112 292: #define MIPS_PRID_R5000 0x00002312 293: #define MIPS_PRID_R7000 0x00002721 294: #define MIPS_PRID_R527x 0x00002812 295: #define MIPS_PRID_BCM1250 0x00040102 1.1 root 296: 297: /* Memory operations */ 298: enum { 1.1.1.4 root 299: MIPS_MEMOP_LOOKUP = 0, 1.1.1.11! root 300: MIPS_MEMOP_IFETCH, 1.1.1.4 root 301: 302: MIPS_MEMOP_LB, 1.1 root 303: MIPS_MEMOP_LBU, 304: MIPS_MEMOP_LH, 305: MIPS_MEMOP_LHU, 306: MIPS_MEMOP_LW, 307: MIPS_MEMOP_LWU, 308: MIPS_MEMOP_LD, 309: MIPS_MEMOP_SB, 310: MIPS_MEMOP_SH, 311: MIPS_MEMOP_SW, 312: MIPS_MEMOP_SD, 313: 314: MIPS_MEMOP_LWL, 315: MIPS_MEMOP_LWR, 316: MIPS_MEMOP_LDL, 317: MIPS_MEMOP_LDR, 318: MIPS_MEMOP_SWL, 319: MIPS_MEMOP_SWR, 320: MIPS_MEMOP_SDL, 321: MIPS_MEMOP_SDR, 322: 323: MIPS_MEMOP_LL, 324: MIPS_MEMOP_SC, 325: 326: MIPS_MEMOP_LDC1, 327: MIPS_MEMOP_SDC1, 328: 329: MIPS_MEMOP_CACHE, 330: 331: MIPS_MEMOP_MAX, 332: }; 333: 334: /* Maximum number of breakpoints */ 335: #define MIPS64_MAX_BREAKPOINTS 8 336: 337: /* MIPS CPU type */ 338: typedef struct cpu_mips cpu_mips_t; 339: 340: /* Memory operation function prototype */ 1.1.1.10 root 341: typedef fastcall void (*mips_memop_fn)(cpu_mips_t *cpu,m_uint64_t vaddr, 342: u_int reg); 1.1 root 343: 344: /* TLB entry definition */ 345: typedef struct { 346: m_uint64_t mask; 347: m_uint64_t hi; 348: m_uint64_t lo0; 349: m_uint64_t lo1; 350: }tlb_entry_t; 351: 352: /* System Coprocessor (CP0) definition */ 353: typedef struct { 354: m_uint64_t reg[MIPS64_CP0_REG_NR]; 1.1.1.4 root 355: tlb_entry_t tlb[MIPS64_TLB_MAX_ENTRIES]; 356: 357: /* Number of TLB entries */ 358: u_int tlb_entries; 359: 360: /* Extensions for R7000 CP0 Set1 */ 361: m_uint32_t ipl_lo,ipl_hi,int_ctl; 362: m_uint32_t derraddr0,derraddr1; 1.1 root 363: }mips_cp0_t; 364: 365: /* FPU Coprocessor (CP1) definition */ 366: typedef struct { 367: m_uint64_t reg[MIPS64_CP1_REG_NR]; 368: }mips_cp1_t; 369: 1.1.1.4 root 370: /* MIPS CPU definition */ 1.1.1.8 root 371: struct cpu_mips { 1.1.1.7 root 372: /* MTS32/MTS64 caches */ 1.1.1.8 root 373: union { 374: mts32_entry_t *mts32_cache; 375: mts64_entry_t *mts64_cache; 376: }mts_u; 1.1.1.4 root 377: 378: /* Virtual version of CP0 Compare Register */ 379: m_uint32_t cp0_virt_cnt_reg,cp0_virt_cmp_reg; 380: 381: /* General Purpose Registers, Pointer Counter, LO/HI, IRQ */ 382: m_uint32_t irq_pending,irq_cause,ll_bit; 383: m_uint64_t pc,gpr[MIPS64_GPR_NR]; 384: m_uint64_t lo,hi,ret_pc; 1.1.1.11! root 385: m_uint32_t exec_state; ! 386: u_int bd_slot; 1.1 root 387: 1.1.1.4 root 388: /* Virtual address to physical page translation */ 389: fastcall int (*translate)(cpu_mips_t *cpu,m_uint64_t vaddr, 390: m_uint32_t *phys_page); 391: 1.1 root 392: /* Memory access functions */ 393: mips_memop_fn mem_op_fn[MIPS_MEMOP_MAX]; 394: 1.1.1.11! root 395: /* Memory lookup function (to load ELF image,...) and instruction fetch */ 1.1.1.4 root 396: void *(*mem_op_lookup)(cpu_mips_t *cpu,m_uint64_t vaddr); 1.1.1.11! root 397: void *(*mem_op_ifetch)(cpu_mips_t *cpu,m_uint64_t vaddr); 1.1 root 398: 399: /* System coprocessor (CP0) */ 400: mips_cp0_t cp0; 401: 402: /* FPU (CP1) */ 403: mips_cp1_t fpu; 404: 1.1.1.7 root 405: /* Address bus mask for physical addresses */ 1.1.1.4 root 406: m_uint64_t addr_bus_mask; 407: 408: /* IRQ counters and cause */ 409: m_uint64_t irq_count,timer_irq_count,irq_fp_count; 410: pthread_mutex_t irq_lock; 411: 1.1.1.8 root 412: /* Current and free lists of translated code blocks */ 413: mips64_jit_tcb_t *tcb_list,*tcb_last,*tcb_free_list; 1.1.1.4 root 414: 415: /* Executable page area */ 416: void *exec_page_area; 417: size_t exec_page_area_size; 418: size_t exec_page_count,exec_page_alloc; 419: insn_exec_page_t *exec_page_free_list; 420: insn_exec_page_t *exec_page_array; 421: 1.1.1.8 root 422: /* Idle PC value */ 1.1.1.4 root 423: volatile m_uint64_t idle_pc; 424: 425: /* Timer IRQs */ 426: volatile u_int timer_irq_pending; 427: u_int timer_irq_freq; 428: u_int timer_irq_check_itv; 429: u_int timer_drift; 430: 1.1.1.8 root 431: /* IRQ disable flag */ 432: volatile u_int irq_disable; 433: 1.1.1.4 root 434: /* IRQ idling preemption */ 435: u_int irq_idle_preempt[8]; 436: 1.1.1.8 root 437: /* Generic CPU instance pointer */ 438: cpu_gen_t *gen; 1.1.1.4 root 439: 440: /* VM instance */ 441: vm_instance_t *vm; 442: 443: /* non-JIT mode instruction counter */ 444: m_uint64_t insn_exec_count; 445: 1.1.1.11! root 446: /* MTS invalidate/shutdown operations */ ! 447: void (*mts_invalidate)(cpu_mips_t *cpu); 1.1.1.7 root 448: void (*mts_shutdown)(cpu_mips_t *cpu); 449: 450: /* MTS cache statistics */ 451: m_uint64_t mts_misses,mts_lookups; 1.1.1.4 root 452: 453: /* JIT flush method */ 454: u_int jit_flush_method; 455: 456: /* Number of compiled pages */ 457: u_int compiled_pages; 458: 459: /* Fast memory operations use */ 460: u_int fast_memop; 461: 1.1.1.9 root 462: /* Direct block jump */ 463: u_int exec_blk_direct_jump; 464: 1.1.1.7 root 465: /* Address mode (32 or 64 bits) */ 466: u_int addr_mode; 467: 1.1.1.4 root 468: /* Current exec page (non-JIT) info */ 469: m_uint64_t njm_exec_page; 470: mips_insn_t *njm_exec_ptr; 471: 472: /* Performance counter (number of instructions executed by CPU) */ 1.1.1.10 root 473: m_uint32_t perf_counter; 1.1 root 474: 475: /* Breakpoints */ 476: m_uint64_t breakpoints[MIPS64_MAX_BREAKPOINTS]; 1.1.1.3 root 477: u_int breakpoints_enabled; 1.1 root 478: 1.1.1.4 root 479: /* Symtrace */ 480: int sym_trace; 481: rbtree_tree *sym_tree; 1.1.1.11! root 482: ! 483: /* XXX */ ! 484: cpu_tb_t *current_tb; 1.1 root 485: }; 486: 1.1.1.4 root 487: #define MIPS64_IRQ_LOCK(cpu) pthread_mutex_lock(&(cpu)->irq_lock) 488: #define MIPS64_IRQ_UNLOCK(cpu) pthread_mutex_unlock(&(cpu)->irq_lock) 489: 1.1 root 490: /* Register names */ 491: extern char *mips64_gpr_reg_names[]; 492: 1.1.1.4 root 493: /* Get cacheability info */ 494: int mips64_cca_cached(m_uint8_t val); 495: 496: /* Reset a MIPS64 CPU */ 497: int mips64_reset(cpu_mips_t *cpu); 498: 1.1 root 499: /* Initialize a MIPS64 processor */ 1.1.1.4 root 500: int mips64_init(cpu_mips_t *cpu); 501: 502: /* Delete a MIPS64 processor */ 503: void mips64_delete(cpu_mips_t *cpu); 504: 505: /* Set the CPU PRID register */ 506: void mips64_set_prid(cpu_mips_t *cpu,m_uint32_t prid); 507: 1.1.1.8 root 508: /* Set idle PC value */ 509: void mips64_set_idle_pc(cpu_gen_t *cpu,m_uint64_t addr); 1.1.1.4 root 510: 511: /* Timer IRQ */ 512: void *mips64_timer_irq_run(cpu_mips_t *cpu); 513: 514: /* Determine an "idling" PC */ 1.1.1.8 root 515: int mips64_get_idling_pc(cpu_gen_t *cpu); 516: 517: /* Set an IRQ (VM IRQ standard routing) */ 518: void mips64_vm_set_irq(vm_instance_t *vm,u_int irq); 519: 520: /* Clear an IRQ (VM IRQ standard routing) */ 521: void mips64_vm_clear_irq(vm_instance_t *vm,u_int irq); 1.1 root 522: 523: /* Update the IRQ flag */ 524: void mips64_update_irq_flag(cpu_mips_t *cpu); 525: 1.1.1.11! root 526: /* Generate a general exception */ ! 527: void mips64_general_exception(cpu_mips_t *cpu,u_int exc_code); ! 528: ! 529: /* Generate a general exception that updates BadVaddr */ ! 530: void mips64_gen_exception_badva(cpu_mips_t *cpu,u_int exc_code, ! 531: m_uint64_t bad_vaddr); ! 532: ! 533: /* Generate a TLB/XTLB exception */ ! 534: void mips64_tlb_miss_exception(cpu_mips_t *cpu,u_int exc_code, ! 535: m_uint64_t bad_vaddr); ! 536: ! 537: /* Prepare a TLB exception */ ! 538: void mips64_prepare_tlb_exception(cpu_mips_t *cpu,m_uint64_t vaddr); 1.1 root 539: 540: /* 541: * Increment count register and trigger the timer IRQ if value in compare 542: * register is the same. 543: */ 544: fastcall void mips64_exec_inc_cp0_cnt(cpu_mips_t *cpu); 545: 546: /* Trigger the Timer IRQ */ 547: fastcall void mips64_trigger_timer_irq(cpu_mips_t *cpu); 548: 549: /* Execute ERET instruction */ 550: fastcall void mips64_exec_eret(cpu_mips_t *cpu); 551: 552: /* Execute SYSCALL instruction */ 553: fastcall void mips64_exec_syscall(cpu_mips_t *cpu); 554: 555: /* Execute BREAK instruction */ 556: fastcall void mips64_exec_break(cpu_mips_t *cpu,u_int code); 557: 558: /* Trigger a Trap Exception */ 1.1.1.4 root 559: fastcall void mips64_trigger_trap_exception(cpu_mips_t *cpu); 1.1 root 560: 561: /* Trigger IRQs */ 562: fastcall void mips64_trigger_irq(cpu_mips_t *cpu); 563: 564: /* Set an IRQ */ 1.1.1.4 root 565: void mips64_set_irq(cpu_mips_t *cpu,m_uint8_t irq); 1.1 root 566: 567: /* Clear an IRQ */ 1.1.1.4 root 568: void mips64_clear_irq(cpu_mips_t *cpu,m_uint8_t irq); 1.1 root 569: 570: /* DMFC1 */ 571: fastcall void mips64_exec_dmfc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg); 572: 573: /* DMTC1 */ 574: fastcall void mips64_exec_dmtc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg); 575: 576: /* MFC1 */ 577: fastcall void mips64_exec_mfc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg); 578: 579: /* MTC1 */ 580: fastcall void mips64_exec_mtc1(cpu_mips_t *cpu,u_int gp_reg,u_int cp1_reg); 581: 582: /* Virtual breakpoint */ 583: fastcall void mips64_run_breakpoint(cpu_mips_t *cpu); 584: 1.1.1.5 root 585: /* Add a virtual breakpoint */ 1.1.1.8 root 586: int mips64_add_breakpoint(cpu_gen_t *cpu,m_uint64_t pc); 1.1.1.5 root 587: 588: /* Remove a virtual breakpoint */ 1.1.1.8 root 589: void mips64_remove_breakpoint(cpu_gen_t *cpu,m_uint64_t pc); 1.1.1.5 root 590: 1.1.1.4 root 591: /* Debugging for register-jump to address 0 */ 592: fastcall void mips64_debug_jr0(cpu_mips_t *cpu); 593: 1.1.1.8 root 594: /* Set a register */ 595: void mips64_reg_set(cpu_gen_t *cpu,u_int reg,m_uint64_t val); 596: 1.1 root 597: /* Dump registers of a MIPS64 processor */ 1.1.1.8 root 598: void mips64_dump_regs(cpu_gen_t *cpu); 1.1 root 599: 600: /* Dump a memory block */ 601: void mips64_dump_memory(cpu_mips_t *cpu,m_uint64_t vaddr,u_int count); 602: 603: /* Dump the stack */ 604: void mips64_dump_stack(cpu_mips_t *cpu,u_int count); 605: 606: /* Save the CPU state into a file */ 607: int mips64_save_state(cpu_mips_t *cpu,char *filename); 608: 1.1.1.4 root 609: /* Load a raw image into the simulated memory */ 610: int mips64_load_raw_image(cpu_mips_t *cpu,char *filename,m_uint64_t vaddr); 611: 612: /* Load an ELF image into the simulated memory */ 1.1.1.7 root 613: int mips64_load_elf_image(cpu_mips_t *cpu,char *filename,int skip_load, 1.1.1.4 root 614: m_uint32_t *entry_point); 615: 616: /* Symbol lookup */ 617: struct symbol *mips64_sym_lookup(cpu_mips_t *cpu,m_uint64_t addr); 618: 619: /* Insert a new symbol */ 620: struct symbol *mips64_sym_insert(cpu_mips_t *cpu,char *name,m_uint64_t addr); 621: 622: /* Create the symbol tree */ 623: int mips64_sym_create_tree(cpu_mips_t *cpu); 624: 625: /* Load a symbol file */ 626: int mips64_sym_load_file(cpu_mips_t *cpu,char *filename); 627: 1.1 root 628: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.