|
|
1.1 ! root 1: #if !defined (__MIPS_CPU_H__) ! 2: #define __MIPS_CPU_H__ ! 3: ! 4: #include "mips-defs.h" ! 5: #include "cpu-defs.h" ! 6: #include "config.h" ! 7: #include "softfloat.h" ! 8: ! 9: typedef union fpr_t fpr_t; ! 10: union fpr_t { ! 11: double d; ! 12: float f; ! 13: uint32_t u[2]; ! 14: }; ! 15: ! 16: #if defined(MIPS_USES_R4K_TLB) ! 17: typedef struct tlb_t tlb_t; ! 18: struct tlb_t { ! 19: target_ulong VPN; ! 20: target_ulong end; ! 21: uint8_t ASID; ! 22: uint8_t G; ! 23: uint8_t C[2]; ! 24: uint8_t V[2]; ! 25: uint8_t D[2]; ! 26: target_ulong PFN[2]; ! 27: }; ! 28: #endif ! 29: ! 30: typedef struct CPUMIPSState CPUMIPSState; ! 31: struct CPUMIPSState { ! 32: /* General integer registers */ ! 33: target_ulong gpr[32]; ! 34: /* Special registers */ ! 35: target_ulong PC; ! 36: uint32_t HI, LO; ! 37: uint32_t DCR; /* ? */ ! 38: #if defined(MIPS_USES_FPU) ! 39: /* Floating point registers */ ! 40: fpr_t fpr[16]; ! 41: /* Floating point special purpose registers */ ! 42: uint32_t fcr0; ! 43: uint32_t fcr25; ! 44: uint32_t fcr26; ! 45: uint32_t fcr28; ! 46: uint32_t fcsr; ! 47: #endif ! 48: #if defined(MIPS_USES_R4K_TLB) ! 49: tlb_t tlb[16]; ! 50: #endif ! 51: uint32_t CP0_index; ! 52: uint32_t CP0_random; ! 53: uint32_t CP0_EntryLo0; ! 54: uint32_t CP0_EntryLo1; ! 55: uint32_t CP0_Context; ! 56: uint32_t CP0_PageMask; ! 57: uint32_t CP0_Wired; ! 58: uint32_t CP0_BadVAddr; ! 59: uint32_t CP0_Count; ! 60: uint32_t CP0_EntryHi; ! 61: uint32_t CP0_Compare; ! 62: uint32_t CP0_Status; ! 63: #define CP0St_CU3 31 ! 64: #define CP0St_CU2 30 ! 65: #define CP0St_CU1 29 ! 66: #define CP0St_CU0 28 ! 67: #define CP0St_RP 27 ! 68: #define CP0St_RE 25 ! 69: #define CP0St_BEV 22 ! 70: #define CP0St_TS 21 ! 71: #define CP0St_SR 20 ! 72: #define CP0St_NMI 19 ! 73: #define CP0St_IM 8 ! 74: #define CP0St_UM 4 ! 75: #define CP0St_ERL 2 ! 76: #define CP0St_EXL 1 ! 77: #define CP0St_IE 0 ! 78: uint32_t CP0_Cause; ! 79: #define CP0Ca_IV 23 ! 80: uint32_t CP0_EPC; ! 81: uint32_t CP0_PRid; ! 82: uint32_t CP0_Config0; ! 83: #define CP0C0_M 31 ! 84: #define CP0C0_K23 28 ! 85: #define CP0C0_KU 25 ! 86: #define CP0C0_MDU 20 ! 87: #define CP0C0_MM 17 ! 88: #define CP0C0_BM 16 ! 89: #define CP0C0_BE 15 ! 90: #define CP0C0_AT 13 ! 91: #define CP0C0_AR 10 ! 92: #define CP0C0_MT 7 ! 93: #define CP0C0_K0 0 ! 94: uint32_t CP0_Config1; ! 95: #define CP0C1_MMU 25 ! 96: #define CP0C1_IS 22 ! 97: #define CP0C1_IL 19 ! 98: #define CP0C1_IA 16 ! 99: #define CP0C1_DS 13 ! 100: #define CP0C1_DL 10 ! 101: #define CP0C1_DA 7 ! 102: #define CP0C1_PC 4 ! 103: #define CP0C1_WR 3 ! 104: #define CP0C1_CA 2 ! 105: #define CP0C1_EP 1 ! 106: #define CP0C1_FP 0 ! 107: uint32_t CP0_LLAddr; ! 108: uint32_t CP0_WatchLo; ! 109: uint32_t CP0_WatchHi; ! 110: uint32_t CP0_Debug; ! 111: #define CPDB_DBD 31 ! 112: #define CP0DB_DM 30 ! 113: #define CP0DB_LSNM 28 ! 114: #define CP0DB_Doze 27 ! 115: #define CP0DB_Halt 26 ! 116: #define CP0DB_CNT 25 ! 117: #define CP0DB_IBEP 24 ! 118: #define CP0DB_DBEP 21 ! 119: #define CP0DB_IEXI 20 ! 120: #define CP0DB_VER 15 ! 121: #define CP0DB_DEC 10 ! 122: #define CP0DB_SSt 8 ! 123: #define CP0DB_DINT 5 ! 124: #define CP0DB_DIB 4 ! 125: #define CP0DB_DDBS 3 ! 126: #define CP0DB_DDBL 2 ! 127: #define CP0DB_DBp 1 ! 128: #define CP0DB_DSS 0 ! 129: uint32_t CP0_DEPC; ! 130: uint32_t CP0_TagLo; ! 131: uint32_t CP0_DataLo; ! 132: uint32_t CP0_ErrorEPC; ! 133: uint32_t CP0_DESAVE; ! 134: /* Qemu */ ! 135: #if defined (USE_HOST_FLOAT_REGS) && defined(MIPS_USES_FPU) ! 136: double ft0, ft1, ft2; ! 137: #endif ! 138: struct QEMUTimer *timer; /* Internal timer */ ! 139: int interrupt_request; ! 140: jmp_buf jmp_env; ! 141: int exception_index; ! 142: int error_code; ! 143: int user_mode_only; /* user mode only simulation */ ! 144: uint32_t hflags; /* CPU State */ ! 145: /* TMASK defines different execution modes */ ! 146: #define MIPS_HFLAGS_TMASK 0x00FF ! 147: #define MIPS_HFLAG_MODE 0x001F /* execution modes */ ! 148: #define MIPS_HFLAG_UM 0x0001 /* user mode */ ! 149: #define MIPS_HFLAG_ERL 0x0002 /* Error mode */ ! 150: #define MIPS_HFLAG_EXL 0x0004 /* Exception mode */ ! 151: #define MIPS_HFLAG_DM 0x0008 /* Debug mode */ ! 152: #define MIPS_HFLAG_SM 0x0010 /* Supervisor mode */ ! 153: #define MIPS_HFLAG_RE 0x0040 /* Reversed endianness */ ! 154: #define MIPS_HFLAG_DS 0x0080 /* In / out of delay slot */ ! 155: /* Those flags keep the branch state if the translation is interrupted ! 156: * between the branch instruction and the delay slot ! 157: */ ! 158: #define MIPS_HFLAG_BMASK 0x0F00 ! 159: #define MIPS_HFLAG_B 0x0100 /* Unconditional branch */ ! 160: #define MIPS_HFLAG_BC 0x0200 /* Conditional branch */ ! 161: #define MIPS_HFLAG_BL 0x0400 /* Likely branch */ ! 162: #define MIPS_HFLAG_BR 0x0800 /* branch to register (can't link TB) */ ! 163: target_ulong btarget; /* Jump / branch target */ ! 164: int bcond; /* Branch condition (if needed) */ ! 165: struct TranslationBlock *current_tb; /* currently executing TB */ ! 166: /* soft mmu support */ ! 167: /* in order to avoid passing too many arguments to the memory ! 168: write helpers, we store some rarely used information in the CPU ! 169: context) */ ! 170: target_ulong mem_write_pc; /* host pc at which the memory was ! 171: written */ ! 172: unsigned long mem_write_vaddr; /* target virtual addr at which the ! 173: memory was written */ ! 174: /* 0 = kernel, 1 = user (may have 2 = kernel code, 3 = user code ?) */ ! 175: CPUTLBEntry tlb_read[2][CPU_TLB_SIZE]; ! 176: CPUTLBEntry tlb_write[2][CPU_TLB_SIZE]; ! 177: /* ice debug support */ ! 178: target_ulong breakpoints[MAX_BREAKPOINTS]; ! 179: int nb_breakpoints; ! 180: int singlestep_enabled; /* XXX: should use CPU single step mode instead */ ! 181: /* user data */ ! 182: void *opaque; ! 183: }; ! 184: ! 185: #include "cpu-all.h" ! 186: ! 187: /* Memory access type : ! 188: * may be needed for precise access rights control and precise exceptions. ! 189: */ ! 190: enum { ! 191: /* 1 bit to define user level / supervisor access */ ! 192: ACCESS_USER = 0x00, ! 193: ACCESS_SUPER = 0x01, ! 194: /* 1 bit to indicate direction */ ! 195: ACCESS_STORE = 0x02, ! 196: /* Type of instruction that generated the access */ ! 197: ACCESS_CODE = 0x10, /* Code fetch access */ ! 198: ACCESS_INT = 0x20, /* Integer load/store access */ ! 199: ACCESS_FLOAT = 0x30, /* floating point load/store access */ ! 200: }; ! 201: ! 202: /* Exceptions */ ! 203: enum { ! 204: EXCP_NONE = -1, ! 205: EXCP_RESET = 0, ! 206: EXCP_SRESET, ! 207: EXCP_DSS, ! 208: EXCP_DINT, ! 209: EXCP_NMI, ! 210: EXCP_MCHECK, ! 211: EXCP_EXT_INTERRUPT, ! 212: EXCP_DFWATCH, ! 213: EXCP_DIB, /* 8 */ ! 214: EXCP_IWATCH, ! 215: EXCP_AdEL, ! 216: EXCP_AdES, ! 217: EXCP_TLBF, ! 218: EXCP_IBE, ! 219: EXCP_DBp, ! 220: EXCP_SYSCALL, ! 221: EXCP_BREAK, ! 222: EXCP_CpU, /* 16 */ ! 223: EXCP_RI, ! 224: EXCP_OVERFLOW, ! 225: EXCP_TRAP, ! 226: EXCP_DDBS, ! 227: EXCP_DWATCH, ! 228: EXCP_LAE, /* 22 */ ! 229: EXCP_SAE, ! 230: EXCP_LTLBL, ! 231: EXCP_TLBL, ! 232: EXCP_TLBS, ! 233: EXCP_DBE, ! 234: EXCP_DDBL, ! 235: EXCP_MTCP0 = 0x104, /* mtmsr instruction: */ ! 236: /* may change privilege level */ ! 237: EXCP_BRANCH = 0x108, /* branch instruction */ ! 238: EXCP_ERET = 0x10C, /* return from interrupt */ ! 239: EXCP_SYSCALL_USER = 0x110, /* System call in user mode only */ ! 240: EXCP_FLUSH = 0x109, ! 241: }; ! 242: ! 243: int cpu_mips_exec(CPUMIPSState *s); ! 244: CPUMIPSState *cpu_mips_init(void); ! 245: uint32_t cpu_mips_get_clock (void); ! 246: ! 247: #endif /* !defined (__MIPS_CPU_H__) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.