107f5a258SMarkus Armbruster #ifndef MIPS_CPU_H 207f5a258SMarkus Armbruster #define MIPS_CPU_H 36af0bf9cSbellard 4d94f0a8eSPaolo Bonzini #define ALIGNED_ONLY 54ad40f36Sbellard 69a78eeadSStefan Weil #include "qemu-common.h" 7416bf936SPaolo Bonzini #include "cpu-qom.h" 8022c62cbSPaolo Bonzini #include "exec/cpu-defs.h" 96b4c305cSPaolo Bonzini #include "fpu/softfloat.h" 1074433bf0SRichard Henderson #include "mips-defs.h" 116af0bf9cSbellard 120454728cSAleksandar Markovic #define TCG_GUEST_DEFAULT_MO (0) 130454728cSAleksandar Markovic 14ead9360eSths typedef struct CPUMIPSTLBContext CPUMIPSTLBContext; 1551b2772fSths 16e97a391dSYongbok Kim /* MSA Context */ 17e97a391dSYongbok Kim #define MSA_WRLEN (128) 18e97a391dSYongbok Kim 19e97a391dSYongbok Kim typedef union wr_t wr_t; 20e97a391dSYongbok Kim union wr_t { 21e97a391dSYongbok Kim int8_t b[MSA_WRLEN / 8]; 22e97a391dSYongbok Kim int16_t h[MSA_WRLEN / 16]; 23e97a391dSYongbok Kim int32_t w[MSA_WRLEN / 32]; 24e97a391dSYongbok Kim int64_t d[MSA_WRLEN / 64]; 25e97a391dSYongbok Kim }; 26e97a391dSYongbok Kim 27c227f099SAnthony Liguori typedef union fpr_t fpr_t; 28c227f099SAnthony Liguori union fpr_t { 29ead9360eSths float64 fd; /* ieee double precision */ 30ead9360eSths float32 fs[2];/* ieee single precision */ 31ead9360eSths uint64_t d; /* binary double fixed-point */ 32ead9360eSths uint32_t w[2]; /* binary single fixed-point */ 33e97a391dSYongbok Kim /* FPU/MSA register mapping is not tested on big-endian hosts. */ 34e97a391dSYongbok Kim wr_t wr; /* vector data */ 35ead9360eSths }; 369e72f33dSJules Irenge /* 379e72f33dSJules Irenge *define FP_ENDIAN_IDX to access the same location 384ff9786cSStefan Weil * in the fpr_t union regardless of the host endianness 39ead9360eSths */ 40e2542fe2SJuan Quintela #if defined(HOST_WORDS_BIGENDIAN) 41ead9360eSths # define FP_ENDIAN_IDX 1 42ead9360eSths #else 43ead9360eSths # define FP_ENDIAN_IDX 0 44c570fd16Sths #endif 45ead9360eSths 46ead9360eSths typedef struct CPUMIPSFPUContext CPUMIPSFPUContext; 47ead9360eSths struct CPUMIPSFPUContext { 486af0bf9cSbellard /* Floating point registers */ 49c227f099SAnthony Liguori fpr_t fpr[32]; 506ea83fedSbellard float_status fp_status; 515a5012ecSths /* fpu implementation/revision register (fir) */ 526af0bf9cSbellard uint32_t fcr0; 537c979afdSLeon Alrae #define FCR0_FREP 29 54b4dd99a3SPetar Jovanovic #define FCR0_UFRP 28 55ba5c79f2SLeon Alrae #define FCR0_HAS2008 23 565a5012ecSths #define FCR0_F64 22 575a5012ecSths #define FCR0_L 21 585a5012ecSths #define FCR0_W 20 595a5012ecSths #define FCR0_3D 19 605a5012ecSths #define FCR0_PS 18 615a5012ecSths #define FCR0_D 17 625a5012ecSths #define FCR0_S 16 635a5012ecSths #define FCR0_PRID 8 645a5012ecSths #define FCR0_REV 0 656ea83fedSbellard /* fcsr */ 66599bc5e8SAleksandar Markovic uint32_t fcr31_rw_bitmask; 676ea83fedSbellard uint32_t fcr31; 6877be4199SAleksandar Markovic #define FCR31_FS 24 69ba5c79f2SLeon Alrae #define FCR31_ABS2008 19 70ba5c79f2SLeon Alrae #define FCR31_NAN2008 18 718ebf2e1aSJules Irenge #define SET_FP_COND(num, env) do { ((env).fcr31) |= \ 728ebf2e1aSJules Irenge ((num) ? (1 << ((num) + 24)) : \ 738ebf2e1aSJules Irenge (1 << 23)); \ 748ebf2e1aSJules Irenge } while (0) 758ebf2e1aSJules Irenge #define CLEAR_FP_COND(num, env) do { ((env).fcr31) &= \ 768ebf2e1aSJules Irenge ~((num) ? (1 << ((num) + 24)) : \ 778ebf2e1aSJules Irenge (1 << 23)); \ 788ebf2e1aSJules Irenge } while (0) 798ebf2e1aSJules Irenge #define GET_FP_COND(env) ((((env).fcr31 >> 24) & 0xfe) | \ 808ebf2e1aSJules Irenge (((env).fcr31 >> 23) & 0x1)) 816ea83fedSbellard #define GET_FP_CAUSE(reg) (((reg) >> 12) & 0x3f) 826ea83fedSbellard #define GET_FP_ENABLE(reg) (((reg) >> 7) & 0x1f) 836ea83fedSbellard #define GET_FP_FLAGS(reg) (((reg) >> 2) & 0x1f) 848ebf2e1aSJules Irenge #define SET_FP_CAUSE(reg, v) do { (reg) = ((reg) & ~(0x3f << 12)) | \ 858ebf2e1aSJules Irenge ((v & 0x3f) << 12); \ 868ebf2e1aSJules Irenge } while (0) 878ebf2e1aSJules Irenge #define SET_FP_ENABLE(reg, v) do { (reg) = ((reg) & ~(0x1f << 7)) | \ 888ebf2e1aSJules Irenge ((v & 0x1f) << 7); \ 898ebf2e1aSJules Irenge } while (0) 908ebf2e1aSJules Irenge #define SET_FP_FLAGS(reg, v) do { (reg) = ((reg) & ~(0x1f << 2)) | \ 918ebf2e1aSJules Irenge ((v & 0x1f) << 2); \ 928ebf2e1aSJules Irenge } while (0) 935a5012ecSths #define UPDATE_FP_FLAGS(reg, v) do { (reg) |= ((v & 0x1f) << 2); } while (0) 946ea83fedSbellard #define FP_INEXACT 1 956ea83fedSbellard #define FP_UNDERFLOW 2 966ea83fedSbellard #define FP_OVERFLOW 4 976ea83fedSbellard #define FP_DIV0 8 986ea83fedSbellard #define FP_INVALID 16 996ea83fedSbellard #define FP_UNIMPLEMENTED 32 100ead9360eSths }; 1016ea83fedSbellard 102c20d594eSRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 2 1036ebbf390Sj_mayer 104ead9360eSths typedef struct CPUMIPSMVPContext CPUMIPSMVPContext; 105ead9360eSths struct CPUMIPSMVPContext { 106ead9360eSths int32_t CP0_MVPControl; 107ead9360eSths #define CP0MVPCo_CPA 3 108ead9360eSths #define CP0MVPCo_STLB 2 109ead9360eSths #define CP0MVPCo_VPC 1 110ead9360eSths #define CP0MVPCo_EVP 0 111ead9360eSths int32_t CP0_MVPConf0; 112ead9360eSths #define CP0MVPC0_M 31 113ead9360eSths #define CP0MVPC0_TLBS 29 114ead9360eSths #define CP0MVPC0_GS 28 115ead9360eSths #define CP0MVPC0_PCP 27 116ead9360eSths #define CP0MVPC0_PTLBE 16 117ead9360eSths #define CP0MVPC0_TCA 15 118ead9360eSths #define CP0MVPC0_PVPE 10 119ead9360eSths #define CP0MVPC0_PTC 0 120ead9360eSths int32_t CP0_MVPConf1; 121ead9360eSths #define CP0MVPC1_CIM 31 122ead9360eSths #define CP0MVPC1_CIF 30 123ead9360eSths #define CP0MVPC1_PCX 20 124ead9360eSths #define CP0MVPC1_PCP2 10 125ead9360eSths #define CP0MVPC1_PCP1 0 126ead9360eSths }; 127ead9360eSths 128c227f099SAnthony Liguori typedef struct mips_def_t mips_def_t; 129ead9360eSths 130ead9360eSths #define MIPS_SHADOW_SET_MAX 16 131ead9360eSths #define MIPS_TC_MAX 5 132f01be154Sths #define MIPS_FPU_MAX 1 133ead9360eSths #define MIPS_DSP_ACC 4 134e98c0d17SLeon Alrae #define MIPS_KSCRATCH_NUM 6 135f6d4dd81SYongbok Kim #define MIPS_MAAR_MAX 16 /* Must be an even number. */ 136ead9360eSths 137e97a391dSYongbok Kim 138a86d421eSAleksandar Markovic /* 139a86d421eSAleksandar Markovic * Summary of CP0 registers 140a86d421eSAleksandar Markovic * ======================== 141a86d421eSAleksandar Markovic * 142a86d421eSAleksandar Markovic * 143a86d421eSAleksandar Markovic * Register 0 Register 1 Register 2 Register 3 144a86d421eSAleksandar Markovic * ---------- ---------- ---------- ---------- 145a86d421eSAleksandar Markovic * 146a86d421eSAleksandar Markovic * 0 Index Random EntryLo0 EntryLo1 147a86d421eSAleksandar Markovic * 1 MVPControl VPEControl TCStatus GlobalNumber 148a86d421eSAleksandar Markovic * 2 MVPConf0 VPEConf0 TCBind 149a86d421eSAleksandar Markovic * 3 MVPConf1 VPEConf1 TCRestart 150a86d421eSAleksandar Markovic * 4 VPControl YQMask TCHalt 151a86d421eSAleksandar Markovic * 5 VPESchedule TCContext 152a86d421eSAleksandar Markovic * 6 VPEScheFBack TCSchedule 153a86d421eSAleksandar Markovic * 7 VPEOpt TCScheFBack TCOpt 154a86d421eSAleksandar Markovic * 155a86d421eSAleksandar Markovic * 156a86d421eSAleksandar Markovic * Register 4 Register 5 Register 6 Register 7 157a86d421eSAleksandar Markovic * ---------- ---------- ---------- ---------- 158a86d421eSAleksandar Markovic * 159a86d421eSAleksandar Markovic * 0 Context PageMask Wired HWREna 160a86d421eSAleksandar Markovic * 1 ContextConfig PageGrain SRSConf0 161a86d421eSAleksandar Markovic * 2 UserLocal SegCtl0 SRSConf1 162a86d421eSAleksandar Markovic * 3 XContextConfig SegCtl1 SRSConf2 163a86d421eSAleksandar Markovic * 4 DebugContextID SegCtl2 SRSConf3 164a86d421eSAleksandar Markovic * 5 MemoryMapID PWBase SRSConf4 165a86d421eSAleksandar Markovic * 6 PWField PWCtl 166a86d421eSAleksandar Markovic * 7 PWSize 167a86d421eSAleksandar Markovic * 168a86d421eSAleksandar Markovic * 169a86d421eSAleksandar Markovic * Register 8 Register 9 Register 10 Register 11 170a86d421eSAleksandar Markovic * ---------- ---------- ----------- ----------- 171a86d421eSAleksandar Markovic * 172a86d421eSAleksandar Markovic * 0 BadVAddr Count EntryHi Compare 173a86d421eSAleksandar Markovic * 1 BadInstr 174a86d421eSAleksandar Markovic * 2 BadInstrP 175a86d421eSAleksandar Markovic * 3 BadInstrX 176a86d421eSAleksandar Markovic * 4 GuestCtl1 GuestCtl0Ext 177a86d421eSAleksandar Markovic * 5 GuestCtl2 178167db30eSYongbok Kim * 6 SAARI GuestCtl3 179167db30eSYongbok Kim * 7 SAAR 180a86d421eSAleksandar Markovic * 181a86d421eSAleksandar Markovic * 182a86d421eSAleksandar Markovic * Register 12 Register 13 Register 14 Register 15 183a86d421eSAleksandar Markovic * ----------- ----------- ----------- ----------- 184a86d421eSAleksandar Markovic * 185a86d421eSAleksandar Markovic * 0 Status Cause EPC PRId 186a86d421eSAleksandar Markovic * 1 IntCtl EBase 187a86d421eSAleksandar Markovic * 2 SRSCtl NestedEPC CDMMBase 188a86d421eSAleksandar Markovic * 3 SRSMap CMGCRBase 189a86d421eSAleksandar Markovic * 4 View_IPL View_RIPL BEVVA 190a86d421eSAleksandar Markovic * 5 SRSMap2 NestedExc 191a86d421eSAleksandar Markovic * 6 GuestCtl0 192a86d421eSAleksandar Markovic * 7 GTOffset 193a86d421eSAleksandar Markovic * 194a86d421eSAleksandar Markovic * 195a86d421eSAleksandar Markovic * Register 16 Register 17 Register 18 Register 19 196a86d421eSAleksandar Markovic * ----------- ----------- ----------- ----------- 197a86d421eSAleksandar Markovic * 198a86d421eSAleksandar Markovic * 0 Config LLAddr WatchLo WatchHi 199a86d421eSAleksandar Markovic * 1 Config1 MAAR WatchLo WatchHi 200a86d421eSAleksandar Markovic * 2 Config2 MAARI WatchLo WatchHi 201a86d421eSAleksandar Markovic * 3 Config3 WatchLo WatchHi 202a86d421eSAleksandar Markovic * 4 Config4 WatchLo WatchHi 203a86d421eSAleksandar Markovic * 5 Config5 WatchLo WatchHi 204a86d421eSAleksandar Markovic * 6 WatchLo WatchHi 205a86d421eSAleksandar Markovic * 7 WatchLo WatchHi 206a86d421eSAleksandar Markovic * 207a86d421eSAleksandar Markovic * 208a86d421eSAleksandar Markovic * Register 20 Register 21 Register 22 Register 23 209a86d421eSAleksandar Markovic * ----------- ----------- ----------- ----------- 210a86d421eSAleksandar Markovic * 211a86d421eSAleksandar Markovic * 0 XContext Debug 212a86d421eSAleksandar Markovic * 1 TraceControl 213a86d421eSAleksandar Markovic * 2 TraceControl2 214a86d421eSAleksandar Markovic * 3 UserTraceData1 215a86d421eSAleksandar Markovic * 4 TraceIBPC 216a86d421eSAleksandar Markovic * 5 TraceDBPC 217a86d421eSAleksandar Markovic * 6 Debug2 218a86d421eSAleksandar Markovic * 7 219a86d421eSAleksandar Markovic * 220a86d421eSAleksandar Markovic * 221a86d421eSAleksandar Markovic * Register 24 Register 25 Register 26 Register 27 222a86d421eSAleksandar Markovic * ----------- ----------- ----------- ----------- 223a86d421eSAleksandar Markovic * 224a86d421eSAleksandar Markovic * 0 DEPC PerfCnt ErrCtl CacheErr 225a86d421eSAleksandar Markovic * 1 PerfCnt 226a86d421eSAleksandar Markovic * 2 TraceControl3 PerfCnt 227a86d421eSAleksandar Markovic * 3 UserTraceData2 PerfCnt 228a86d421eSAleksandar Markovic * 4 PerfCnt 229a86d421eSAleksandar Markovic * 5 PerfCnt 230a86d421eSAleksandar Markovic * 6 PerfCnt 231a86d421eSAleksandar Markovic * 7 PerfCnt 232a86d421eSAleksandar Markovic * 233a86d421eSAleksandar Markovic * 234a86d421eSAleksandar Markovic * Register 28 Register 29 Register 30 Register 31 235a86d421eSAleksandar Markovic * ----------- ----------- ----------- ----------- 236a86d421eSAleksandar Markovic * 237a86d421eSAleksandar Markovic * 0 DataLo DataHi ErrorEPC DESAVE 238a86d421eSAleksandar Markovic * 1 TagLo TagHi 239a86d421eSAleksandar Markovic * 2 DataLo DataHi KScratch<n> 240a86d421eSAleksandar Markovic * 3 TagLo TagHi KScratch<n> 241a86d421eSAleksandar Markovic * 4 DataLo DataHi KScratch<n> 242a86d421eSAleksandar Markovic * 5 TagLo TagHi KScratch<n> 243a86d421eSAleksandar Markovic * 6 DataLo DataHi KScratch<n> 244a86d421eSAleksandar Markovic * 7 TagLo TagHi KScratch<n> 245a86d421eSAleksandar Markovic * 246a86d421eSAleksandar Markovic */ 24704992c8cSAleksandar Markovic #define CP0_REGISTER_00 0 24804992c8cSAleksandar Markovic #define CP0_REGISTER_01 1 24904992c8cSAleksandar Markovic #define CP0_REGISTER_02 2 25004992c8cSAleksandar Markovic #define CP0_REGISTER_03 3 25104992c8cSAleksandar Markovic #define CP0_REGISTER_04 4 25204992c8cSAleksandar Markovic #define CP0_REGISTER_05 5 25304992c8cSAleksandar Markovic #define CP0_REGISTER_06 6 25404992c8cSAleksandar Markovic #define CP0_REGISTER_07 7 25504992c8cSAleksandar Markovic #define CP0_REGISTER_08 8 25604992c8cSAleksandar Markovic #define CP0_REGISTER_09 9 25704992c8cSAleksandar Markovic #define CP0_REGISTER_10 10 25804992c8cSAleksandar Markovic #define CP0_REGISTER_11 11 25904992c8cSAleksandar Markovic #define CP0_REGISTER_12 12 26004992c8cSAleksandar Markovic #define CP0_REGISTER_13 13 26104992c8cSAleksandar Markovic #define CP0_REGISTER_14 14 26204992c8cSAleksandar Markovic #define CP0_REGISTER_15 15 26304992c8cSAleksandar Markovic #define CP0_REGISTER_16 16 26404992c8cSAleksandar Markovic #define CP0_REGISTER_17 17 26504992c8cSAleksandar Markovic #define CP0_REGISTER_18 18 26604992c8cSAleksandar Markovic #define CP0_REGISTER_19 19 26704992c8cSAleksandar Markovic #define CP0_REGISTER_20 20 26804992c8cSAleksandar Markovic #define CP0_REGISTER_21 21 26904992c8cSAleksandar Markovic #define CP0_REGISTER_22 22 27004992c8cSAleksandar Markovic #define CP0_REGISTER_23 23 27104992c8cSAleksandar Markovic #define CP0_REGISTER_24 24 27204992c8cSAleksandar Markovic #define CP0_REGISTER_25 25 27304992c8cSAleksandar Markovic #define CP0_REGISTER_26 26 27404992c8cSAleksandar Markovic #define CP0_REGISTER_27 27 27504992c8cSAleksandar Markovic #define CP0_REGISTER_28 28 27604992c8cSAleksandar Markovic #define CP0_REGISTER_29 29 27704992c8cSAleksandar Markovic #define CP0_REGISTER_30 30 27804992c8cSAleksandar Markovic #define CP0_REGISTER_31 31 27904992c8cSAleksandar Markovic 28004992c8cSAleksandar Markovic 28104992c8cSAleksandar Markovic /* CP0 Register 00 */ 28204992c8cSAleksandar Markovic #define CP0_REG00__INDEX 0 28304992c8cSAleksandar Markovic #define CP0_REG00__VPCONTROL 4 28404992c8cSAleksandar Markovic /* CP0 Register 01 */ 28504992c8cSAleksandar Markovic /* CP0 Register 02 */ 28604992c8cSAleksandar Markovic #define CP0_REG02__ENTRYLO0 0 28704992c8cSAleksandar Markovic /* CP0 Register 03 */ 28804992c8cSAleksandar Markovic #define CP0_REG03__ENTRYLO1 0 28904992c8cSAleksandar Markovic #define CP0_REG03__GLOBALNUM 1 29004992c8cSAleksandar Markovic /* CP0 Register 04 */ 29104992c8cSAleksandar Markovic #define CP0_REG04__CONTEXT 0 29204992c8cSAleksandar Markovic #define CP0_REG04__USERLOCAL 2 29304992c8cSAleksandar Markovic #define CP0_REG04__DBGCONTEXTID 4 29404992c8cSAleksandar Markovic #define CP0_REG00__MMID 5 29504992c8cSAleksandar Markovic /* CP0 Register 05 */ 29604992c8cSAleksandar Markovic #define CP0_REG05__PAGEMASK 0 29704992c8cSAleksandar Markovic #define CP0_REG05__PAGEGRAIN 1 29804992c8cSAleksandar Markovic /* CP0 Register 06 */ 29904992c8cSAleksandar Markovic #define CP0_REG06__WIRED 0 30004992c8cSAleksandar Markovic /* CP0 Register 07 */ 30104992c8cSAleksandar Markovic #define CP0_REG07__HWRENA 0 30204992c8cSAleksandar Markovic /* CP0 Register 08 */ 30304992c8cSAleksandar Markovic #define CP0_REG08__BADVADDR 0 30404992c8cSAleksandar Markovic #define CP0_REG08__BADINSTR 1 30504992c8cSAleksandar Markovic #define CP0_REG08__BADINSTRP 2 30604992c8cSAleksandar Markovic /* CP0 Register 09 */ 30704992c8cSAleksandar Markovic #define CP0_REG09__COUNT 0 30804992c8cSAleksandar Markovic #define CP0_REG09__SAARI 6 30904992c8cSAleksandar Markovic #define CP0_REG09__SAAR 7 31004992c8cSAleksandar Markovic /* CP0 Register 10 */ 31104992c8cSAleksandar Markovic #define CP0_REG10__ENTRYHI 0 31204992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL1 4 31304992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL2 5 31404992c8cSAleksandar Markovic /* CP0 Register 11 */ 31504992c8cSAleksandar Markovic #define CP0_REG11__COMPARE 0 31604992c8cSAleksandar Markovic #define CP0_REG11__GUESTCTL0EXT 4 31704992c8cSAleksandar Markovic /* CP0 Register 12 */ 31804992c8cSAleksandar Markovic #define CP0_REG12__STATUS 0 31904992c8cSAleksandar Markovic #define CP0_REG12__INTCTL 1 32004992c8cSAleksandar Markovic #define CP0_REG12__SRSCTL 2 32104992c8cSAleksandar Markovic #define CP0_REG12__GUESTCTL0 6 32204992c8cSAleksandar Markovic #define CP0_REG12__GTOFFSET 7 32304992c8cSAleksandar Markovic /* CP0 Register 13 */ 32404992c8cSAleksandar Markovic #define CP0_REG13__CAUSE 0 32504992c8cSAleksandar Markovic /* CP0 Register 14 */ 32604992c8cSAleksandar Markovic #define CP0_REG14__EPC 0 32704992c8cSAleksandar Markovic /* CP0 Register 15 */ 32804992c8cSAleksandar Markovic #define CP0_REG15__PRID 0 32904992c8cSAleksandar Markovic #define CP0_REG15__EBASE 1 33004992c8cSAleksandar Markovic #define CP0_REG15__CDMMBASE 2 33104992c8cSAleksandar Markovic #define CP0_REG15__CMGCRBASE 3 33204992c8cSAleksandar Markovic /* CP0 Register 16 */ 33304992c8cSAleksandar Markovic #define CP0_REG16__CONFIG 0 33404992c8cSAleksandar Markovic #define CP0_REG16__CONFIG1 1 33504992c8cSAleksandar Markovic #define CP0_REG16__CONFIG2 2 33604992c8cSAleksandar Markovic #define CP0_REG16__CONFIG3 3 33704992c8cSAleksandar Markovic #define CP0_REG16__CONFIG4 4 33804992c8cSAleksandar Markovic #define CP0_REG16__CONFIG5 5 33904992c8cSAleksandar Markovic #define CP0_REG00__CONFIG7 7 34004992c8cSAleksandar Markovic /* CP0 Register 17 */ 34104992c8cSAleksandar Markovic #define CP0_REG17__LLADDR 0 34204992c8cSAleksandar Markovic #define CP0_REG17__MAAR 1 34304992c8cSAleksandar Markovic #define CP0_REG17__MAARI 2 34404992c8cSAleksandar Markovic /* CP0 Register 18 */ 34504992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO0 0 34604992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO1 1 34704992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO2 2 34804992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO3 3 34904992c8cSAleksandar Markovic /* CP0 Register 19 */ 35004992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI0 0 35104992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI1 1 35204992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI2 2 35304992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI3 3 35404992c8cSAleksandar Markovic /* CP0 Register 20 */ 35504992c8cSAleksandar Markovic #define CP0_REG20__XCONTEXT 0 35604992c8cSAleksandar Markovic /* CP0 Register 21 */ 35704992c8cSAleksandar Markovic /* CP0 Register 22 */ 35804992c8cSAleksandar Markovic /* CP0 Register 23 */ 35904992c8cSAleksandar Markovic #define CP0_REG23__DEBUG 0 36004992c8cSAleksandar Markovic /* CP0 Register 24 */ 36104992c8cSAleksandar Markovic #define CP0_REG24__DEPC 0 36204992c8cSAleksandar Markovic /* CP0 Register 25 */ 36304992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL0 0 36404992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT0 1 36504992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL1 2 36604992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT1 3 36704992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL2 4 36804992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT2 5 36904992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL3 6 37004992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT3 7 37104992c8cSAleksandar Markovic /* CP0 Register 26 */ 37204992c8cSAleksandar Markovic #define CP0_REG00__ERRCTL 0 37304992c8cSAleksandar Markovic /* CP0 Register 27 */ 37404992c8cSAleksandar Markovic #define CP0_REG27__CACHERR 0 37504992c8cSAleksandar Markovic /* CP0 Register 28 */ 37604992c8cSAleksandar Markovic #define CP0_REG28__ITAGLO 0 37704992c8cSAleksandar Markovic #define CP0_REG28__IDATALO 1 37804992c8cSAleksandar Markovic #define CP0_REG28__DTAGLO 2 37904992c8cSAleksandar Markovic #define CP0_REG28__DDATALO 3 38004992c8cSAleksandar Markovic /* CP0 Register 29 */ 38104992c8cSAleksandar Markovic #define CP0_REG29__IDATAHI 1 38204992c8cSAleksandar Markovic #define CP0_REG29__DDATAHI 3 38304992c8cSAleksandar Markovic /* CP0 Register 30 */ 38404992c8cSAleksandar Markovic #define CP0_REG30__ERROREPC 0 38504992c8cSAleksandar Markovic /* CP0 Register 31 */ 38604992c8cSAleksandar Markovic #define CP0_REG31__DESAVE 0 38704992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH1 2 38804992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH2 3 38904992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH3 4 39004992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH4 5 39104992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH5 6 39204992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH6 7 393ea9c5e83SAleksandar Markovic 394ea9c5e83SAleksandar Markovic 395ea9c5e83SAleksandar Markovic typedef struct TCState TCState; 396ea9c5e83SAleksandar Markovic struct TCState { 397ea9c5e83SAleksandar Markovic target_ulong gpr[32]; 398ea9c5e83SAleksandar Markovic target_ulong PC; 399ea9c5e83SAleksandar Markovic target_ulong HI[MIPS_DSP_ACC]; 400ea9c5e83SAleksandar Markovic target_ulong LO[MIPS_DSP_ACC]; 401ea9c5e83SAleksandar Markovic target_ulong ACX[MIPS_DSP_ACC]; 402ea9c5e83SAleksandar Markovic target_ulong DSPControl; 403ea9c5e83SAleksandar Markovic int32_t CP0_TCStatus; 404ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU3 31 405ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU2 30 406ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU1 29 407ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU0 28 408ea9c5e83SAleksandar Markovic #define CP0TCSt_TMX 27 409ea9c5e83SAleksandar Markovic #define CP0TCSt_RNST 23 410ea9c5e83SAleksandar Markovic #define CP0TCSt_TDS 21 411ea9c5e83SAleksandar Markovic #define CP0TCSt_DT 20 412ea9c5e83SAleksandar Markovic #define CP0TCSt_DA 15 413ea9c5e83SAleksandar Markovic #define CP0TCSt_A 13 414ea9c5e83SAleksandar Markovic #define CP0TCSt_TKSU 11 415ea9c5e83SAleksandar Markovic #define CP0TCSt_IXMT 10 416ea9c5e83SAleksandar Markovic #define CP0TCSt_TASID 0 417ea9c5e83SAleksandar Markovic int32_t CP0_TCBind; 418ea9c5e83SAleksandar Markovic #define CP0TCBd_CurTC 21 419ea9c5e83SAleksandar Markovic #define CP0TCBd_TBE 17 420ea9c5e83SAleksandar Markovic #define CP0TCBd_CurVPE 0 421ea9c5e83SAleksandar Markovic target_ulong CP0_TCHalt; 422ea9c5e83SAleksandar Markovic target_ulong CP0_TCContext; 423ea9c5e83SAleksandar Markovic target_ulong CP0_TCSchedule; 424ea9c5e83SAleksandar Markovic target_ulong CP0_TCScheFBack; 425ea9c5e83SAleksandar Markovic int32_t CP0_Debug_tcstatus; 426ea9c5e83SAleksandar Markovic target_ulong CP0_UserLocal; 427ea9c5e83SAleksandar Markovic 428ea9c5e83SAleksandar Markovic int32_t msacsr; 429ea9c5e83SAleksandar Markovic 430ea9c5e83SAleksandar Markovic #define MSACSR_FS 24 431ea9c5e83SAleksandar Markovic #define MSACSR_FS_MASK (1 << MSACSR_FS) 432ea9c5e83SAleksandar Markovic #define MSACSR_NX 18 433ea9c5e83SAleksandar Markovic #define MSACSR_NX_MASK (1 << MSACSR_NX) 434ea9c5e83SAleksandar Markovic #define MSACSR_CEF 2 435ea9c5e83SAleksandar Markovic #define MSACSR_CEF_MASK (0xffff << MSACSR_CEF) 436ea9c5e83SAleksandar Markovic #define MSACSR_RM 0 437ea9c5e83SAleksandar Markovic #define MSACSR_RM_MASK (0x3 << MSACSR_RM) 438ea9c5e83SAleksandar Markovic #define MSACSR_MASK (MSACSR_RM_MASK | MSACSR_CEF_MASK | MSACSR_NX_MASK | \ 439ea9c5e83SAleksandar Markovic MSACSR_FS_MASK) 440ea9c5e83SAleksandar Markovic 441ea9c5e83SAleksandar Markovic float_status msa_fp_status; 442ea9c5e83SAleksandar Markovic 443a168a796SFredrik Noring /* Upper 64-bit MMRs (multimedia registers); the lower 64-bit are GPRs */ 444a168a796SFredrik Noring uint64_t mmr[32]; 445a168a796SFredrik Noring 446ea9c5e83SAleksandar Markovic #define NUMBER_OF_MXU_REGISTERS 16 447ea9c5e83SAleksandar Markovic target_ulong mxu_gpr[NUMBER_OF_MXU_REGISTERS - 1]; 448ea9c5e83SAleksandar Markovic target_ulong mxu_cr; 449ea9c5e83SAleksandar Markovic #define MXU_CR_LC 31 450ea9c5e83SAleksandar Markovic #define MXU_CR_RC 30 451ea9c5e83SAleksandar Markovic #define MXU_CR_BIAS 2 452ea9c5e83SAleksandar Markovic #define MXU_CR_RD_EN 1 453ea9c5e83SAleksandar Markovic #define MXU_CR_MXU_EN 0 454ea9c5e83SAleksandar Markovic 455ea9c5e83SAleksandar Markovic }; 456ea9c5e83SAleksandar Markovic 457043715d1SYongbok Kim struct MIPSITUState; 458ea9c5e83SAleksandar Markovic typedef struct CPUMIPSState CPUMIPSState; 459ea9c5e83SAleksandar Markovic struct CPUMIPSState { 460ea9c5e83SAleksandar Markovic TCState active_tc; 461ea9c5e83SAleksandar Markovic CPUMIPSFPUContext active_fpu; 462ea9c5e83SAleksandar Markovic 463ea9c5e83SAleksandar Markovic uint32_t current_tc; 464ea9c5e83SAleksandar Markovic uint32_t current_fpu; 465ea9c5e83SAleksandar Markovic 466ea9c5e83SAleksandar Markovic uint32_t SEGBITS; 467ea9c5e83SAleksandar Markovic uint32_t PABITS; 468ea9c5e83SAleksandar Markovic #if defined(TARGET_MIPS64) 469ea9c5e83SAleksandar Markovic # define PABITS_BASE 36 470ea9c5e83SAleksandar Markovic #else 471ea9c5e83SAleksandar Markovic # define PABITS_BASE 32 472ea9c5e83SAleksandar Markovic #endif 473ea9c5e83SAleksandar Markovic target_ulong SEGMask; 474ea9c5e83SAleksandar Markovic uint64_t PAMask; 475ea9c5e83SAleksandar Markovic #define PAMASK_BASE ((1ULL << PABITS_BASE) - 1) 476ea9c5e83SAleksandar Markovic 477ea9c5e83SAleksandar Markovic int32_t msair; 478ea9c5e83SAleksandar Markovic #define MSAIR_ProcID 8 479ea9c5e83SAleksandar Markovic #define MSAIR_Rev 0 480ea9c5e83SAleksandar Markovic 48150e7edc5SAleksandar Markovic /* 48250e7edc5SAleksandar Markovic * CP0 Register 0 48350e7edc5SAleksandar Markovic */ 4849c2149c8Sths int32_t CP0_Index; 485ead9360eSths /* CP0_MVP* are per MVP registers. */ 48601bc435bSYongbok Kim int32_t CP0_VPControl; 48701bc435bSYongbok Kim #define CP0VPCtl_DIS 0 48850e7edc5SAleksandar Markovic /* 48950e7edc5SAleksandar Markovic * CP0 Register 1 49050e7edc5SAleksandar Markovic */ 4919c2149c8Sths int32_t CP0_Random; 492ead9360eSths int32_t CP0_VPEControl; 493ead9360eSths #define CP0VPECo_YSI 21 494ead9360eSths #define CP0VPECo_GSI 20 495ead9360eSths #define CP0VPECo_EXCPT 16 496ead9360eSths #define CP0VPECo_TE 15 497ead9360eSths #define CP0VPECo_TargTC 0 498ead9360eSths int32_t CP0_VPEConf0; 499ead9360eSths #define CP0VPEC0_M 31 500ead9360eSths #define CP0VPEC0_XTC 21 501ead9360eSths #define CP0VPEC0_TCS 19 502ead9360eSths #define CP0VPEC0_SCS 18 503ead9360eSths #define CP0VPEC0_DSC 17 504ead9360eSths #define CP0VPEC0_ICS 16 505ead9360eSths #define CP0VPEC0_MVP 1 506ead9360eSths #define CP0VPEC0_VPA 0 507ead9360eSths int32_t CP0_VPEConf1; 508ead9360eSths #define CP0VPEC1_NCX 20 509ead9360eSths #define CP0VPEC1_NCP2 10 510ead9360eSths #define CP0VPEC1_NCP1 0 511ead9360eSths target_ulong CP0_YQMask; 512ead9360eSths target_ulong CP0_VPESchedule; 513ead9360eSths target_ulong CP0_VPEScheFBack; 514ead9360eSths int32_t CP0_VPEOpt; 515ead9360eSths #define CP0VPEOpt_IWX7 15 516ead9360eSths #define CP0VPEOpt_IWX6 14 517ead9360eSths #define CP0VPEOpt_IWX5 13 518ead9360eSths #define CP0VPEOpt_IWX4 12 519ead9360eSths #define CP0VPEOpt_IWX3 11 520ead9360eSths #define CP0VPEOpt_IWX2 10 521ead9360eSths #define CP0VPEOpt_IWX1 9 522ead9360eSths #define CP0VPEOpt_IWX0 8 523ead9360eSths #define CP0VPEOpt_DWX7 7 524ead9360eSths #define CP0VPEOpt_DWX6 6 525ead9360eSths #define CP0VPEOpt_DWX5 5 526ead9360eSths #define CP0VPEOpt_DWX4 4 527ead9360eSths #define CP0VPEOpt_DWX3 3 528ead9360eSths #define CP0VPEOpt_DWX2 2 529ead9360eSths #define CP0VPEOpt_DWX1 1 530ead9360eSths #define CP0VPEOpt_DWX0 0 53150e7edc5SAleksandar Markovic /* 53250e7edc5SAleksandar Markovic * CP0 Register 2 53350e7edc5SAleksandar Markovic */ 534284b731aSLeon Alrae uint64_t CP0_EntryLo0; 53550e7edc5SAleksandar Markovic /* 53650e7edc5SAleksandar Markovic * CP0 Register 3 53750e7edc5SAleksandar Markovic */ 538284b731aSLeon Alrae uint64_t CP0_EntryLo1; 5392fb58b73SLeon Alrae #if defined(TARGET_MIPS64) 5402fb58b73SLeon Alrae # define CP0EnLo_RI 63 5412fb58b73SLeon Alrae # define CP0EnLo_XI 62 5422fb58b73SLeon Alrae #else 5432fb58b73SLeon Alrae # define CP0EnLo_RI 31 5442fb58b73SLeon Alrae # define CP0EnLo_XI 30 5452fb58b73SLeon Alrae #endif 54601bc435bSYongbok Kim int32_t CP0_GlobalNumber; 54701bc435bSYongbok Kim #define CP0GN_VPId 0 54850e7edc5SAleksandar Markovic /* 54950e7edc5SAleksandar Markovic * CP0 Register 4 55050e7edc5SAleksandar Markovic */ 5519c2149c8Sths target_ulong CP0_Context; 552e98c0d17SLeon Alrae target_ulong CP0_KScratch[MIPS_KSCRATCH_NUM]; 5533ef521eeSAleksandar Markovic int32_t CP0_MemoryMapID; 55450e7edc5SAleksandar Markovic /* 55550e7edc5SAleksandar Markovic * CP0 Register 5 55650e7edc5SAleksandar Markovic */ 5579c2149c8Sths int32_t CP0_PageMask; 5587207c7f9SLeon Alrae int32_t CP0_PageGrain_rw_bitmask; 5599c2149c8Sths int32_t CP0_PageGrain; 5607207c7f9SLeon Alrae #define CP0PG_RIE 31 5617207c7f9SLeon Alrae #define CP0PG_XIE 30 562e117f526SLeon Alrae #define CP0PG_ELPA 29 56392ceb440SLeon Alrae #define CP0PG_IEC 27 564cec56a73SJames Hogan target_ulong CP0_SegCtl0; 565cec56a73SJames Hogan target_ulong CP0_SegCtl1; 566cec56a73SJames Hogan target_ulong CP0_SegCtl2; 567cec56a73SJames Hogan #define CP0SC_PA 9 568cec56a73SJames Hogan #define CP0SC_PA_MASK (0x7FULL << CP0SC_PA) 569cec56a73SJames Hogan #define CP0SC_PA_1GMASK (0x7EULL << CP0SC_PA) 570cec56a73SJames Hogan #define CP0SC_AM 4 571cec56a73SJames Hogan #define CP0SC_AM_MASK (0x7ULL << CP0SC_AM) 572cec56a73SJames Hogan #define CP0SC_AM_UK 0ULL 573cec56a73SJames Hogan #define CP0SC_AM_MK 1ULL 574cec56a73SJames Hogan #define CP0SC_AM_MSK 2ULL 575cec56a73SJames Hogan #define CP0SC_AM_MUSK 3ULL 576cec56a73SJames Hogan #define CP0SC_AM_MUSUK 4ULL 577cec56a73SJames Hogan #define CP0SC_AM_USK 5ULL 578cec56a73SJames Hogan #define CP0SC_AM_UUSK 7ULL 579cec56a73SJames Hogan #define CP0SC_EU 3 580cec56a73SJames Hogan #define CP0SC_EU_MASK (1ULL << CP0SC_EU) 581cec56a73SJames Hogan #define CP0SC_C 0 582cec56a73SJames Hogan #define CP0SC_C_MASK (0x7ULL << CP0SC_C) 583cec56a73SJames Hogan #define CP0SC_MASK (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \ 584cec56a73SJames Hogan CP0SC_PA_MASK) 585cec56a73SJames Hogan #define CP0SC_1GMASK (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \ 586cec56a73SJames Hogan CP0SC_PA_1GMASK) 587cec56a73SJames Hogan #define CP0SC0_MASK (CP0SC_MASK | (CP0SC_MASK << 16)) 588cec56a73SJames Hogan #define CP0SC1_XAM 59 589cec56a73SJames Hogan #define CP0SC1_XAM_MASK (0x7ULL << CP0SC1_XAM) 590cec56a73SJames Hogan #define CP0SC1_MASK (CP0SC_MASK | (CP0SC_MASK << 16) | CP0SC1_XAM_MASK) 591cec56a73SJames Hogan #define CP0SC2_XR 56 592cec56a73SJames Hogan #define CP0SC2_XR_MASK (0xFFULL << CP0SC2_XR) 593cec56a73SJames Hogan #define CP0SC2_MASK (CP0SC_1GMASK | (CP0SC_1GMASK << 16) | CP0SC2_XR_MASK) 5945e31fdd5SYongbok Kim target_ulong CP0_PWBase; 595fa75ad14SYongbok Kim target_ulong CP0_PWField; 596fa75ad14SYongbok Kim #if defined(TARGET_MIPS64) 597fa75ad14SYongbok Kim #define CP0PF_BDI 32 /* 37..32 */ 598fa75ad14SYongbok Kim #define CP0PF_GDI 24 /* 29..24 */ 599fa75ad14SYongbok Kim #define CP0PF_UDI 18 /* 23..18 */ 600fa75ad14SYongbok Kim #define CP0PF_MDI 12 /* 17..12 */ 601fa75ad14SYongbok Kim #define CP0PF_PTI 6 /* 11..6 */ 602fa75ad14SYongbok Kim #define CP0PF_PTEI 0 /* 5..0 */ 603fa75ad14SYongbok Kim #else 604fa75ad14SYongbok Kim #define CP0PF_GDW 24 /* 29..24 */ 605fa75ad14SYongbok Kim #define CP0PF_UDW 18 /* 23..18 */ 606fa75ad14SYongbok Kim #define CP0PF_MDW 12 /* 17..12 */ 607fa75ad14SYongbok Kim #define CP0PF_PTW 6 /* 11..6 */ 608fa75ad14SYongbok Kim #define CP0PF_PTEW 0 /* 5..0 */ 609fa75ad14SYongbok Kim #endif 61020b28ebcSYongbok Kim target_ulong CP0_PWSize; 61120b28ebcSYongbok Kim #if defined(TARGET_MIPS64) 61220b28ebcSYongbok Kim #define CP0PS_BDW 32 /* 37..32 */ 61320b28ebcSYongbok Kim #endif 61420b28ebcSYongbok Kim #define CP0PS_PS 30 61520b28ebcSYongbok Kim #define CP0PS_GDW 24 /* 29..24 */ 61620b28ebcSYongbok Kim #define CP0PS_UDW 18 /* 23..18 */ 61720b28ebcSYongbok Kim #define CP0PS_MDW 12 /* 17..12 */ 61820b28ebcSYongbok Kim #define CP0PS_PTW 6 /* 11..6 */ 61920b28ebcSYongbok Kim #define CP0PS_PTEW 0 /* 5..0 */ 62050e7edc5SAleksandar Markovic /* 62150e7edc5SAleksandar Markovic * CP0 Register 6 62250e7edc5SAleksandar Markovic */ 6239c2149c8Sths int32_t CP0_Wired; 624103be64cSYongbok Kim int32_t CP0_PWCtl; 625103be64cSYongbok Kim #define CP0PC_PWEN 31 626103be64cSYongbok Kim #if defined(TARGET_MIPS64) 627103be64cSYongbok Kim #define CP0PC_PWDIREXT 30 628103be64cSYongbok Kim #define CP0PC_XK 28 629103be64cSYongbok Kim #define CP0PC_XS 27 630103be64cSYongbok Kim #define CP0PC_XU 26 631103be64cSYongbok Kim #endif 632103be64cSYongbok Kim #define CP0PC_DPH 7 633103be64cSYongbok Kim #define CP0PC_HUGEPG 6 634103be64cSYongbok Kim #define CP0PC_PSN 0 /* 5..0 */ 635ead9360eSths int32_t CP0_SRSConf0_rw_bitmask; 636ead9360eSths int32_t CP0_SRSConf0; 637ead9360eSths #define CP0SRSC0_M 31 638ead9360eSths #define CP0SRSC0_SRS3 20 639ead9360eSths #define CP0SRSC0_SRS2 10 640ead9360eSths #define CP0SRSC0_SRS1 0 641ead9360eSths int32_t CP0_SRSConf1_rw_bitmask; 642ead9360eSths int32_t CP0_SRSConf1; 643ead9360eSths #define CP0SRSC1_M 31 644ead9360eSths #define CP0SRSC1_SRS6 20 645ead9360eSths #define CP0SRSC1_SRS5 10 646ead9360eSths #define CP0SRSC1_SRS4 0 647ead9360eSths int32_t CP0_SRSConf2_rw_bitmask; 648ead9360eSths int32_t CP0_SRSConf2; 649ead9360eSths #define CP0SRSC2_M 31 650ead9360eSths #define CP0SRSC2_SRS9 20 651ead9360eSths #define CP0SRSC2_SRS8 10 652ead9360eSths #define CP0SRSC2_SRS7 0 653ead9360eSths int32_t CP0_SRSConf3_rw_bitmask; 654ead9360eSths int32_t CP0_SRSConf3; 655ead9360eSths #define CP0SRSC3_M 31 656ead9360eSths #define CP0SRSC3_SRS12 20 657ead9360eSths #define CP0SRSC3_SRS11 10 658ead9360eSths #define CP0SRSC3_SRS10 0 659ead9360eSths int32_t CP0_SRSConf4_rw_bitmask; 660ead9360eSths int32_t CP0_SRSConf4; 661ead9360eSths #define CP0SRSC4_SRS15 20 662ead9360eSths #define CP0SRSC4_SRS14 10 663ead9360eSths #define CP0SRSC4_SRS13 0 66450e7edc5SAleksandar Markovic /* 66550e7edc5SAleksandar Markovic * CP0 Register 7 66650e7edc5SAleksandar Markovic */ 6679c2149c8Sths int32_t CP0_HWREna; 66850e7edc5SAleksandar Markovic /* 66950e7edc5SAleksandar Markovic * CP0 Register 8 67050e7edc5SAleksandar Markovic */ 671c570fd16Sths target_ulong CP0_BadVAddr; 672aea14095SLeon Alrae uint32_t CP0_BadInstr; 673aea14095SLeon Alrae uint32_t CP0_BadInstrP; 67425beba9bSStefan Markovic uint32_t CP0_BadInstrX; 67550e7edc5SAleksandar Markovic /* 67650e7edc5SAleksandar Markovic * CP0 Register 9 67750e7edc5SAleksandar Markovic */ 6789c2149c8Sths int32_t CP0_Count; 679167db30eSYongbok Kim uint32_t CP0_SAARI; 680167db30eSYongbok Kim #define CP0SAARI_TARGET 0 /* 5..0 */ 681167db30eSYongbok Kim uint64_t CP0_SAAR[2]; 682167db30eSYongbok Kim #define CP0SAAR_BASE 12 /* 43..12 */ 683167db30eSYongbok Kim #define CP0SAAR_SIZE 1 /* 5..1 */ 684167db30eSYongbok Kim #define CP0SAAR_EN 0 68550e7edc5SAleksandar Markovic /* 68650e7edc5SAleksandar Markovic * CP0 Register 10 68750e7edc5SAleksandar Markovic */ 6889c2149c8Sths target_ulong CP0_EntryHi; 6899456c2fbSLeon Alrae #define CP0EnHi_EHINV 10 6906ec98bd7SPaul Burton target_ulong CP0_EntryHi_ASID_mask; 69150e7edc5SAleksandar Markovic /* 69250e7edc5SAleksandar Markovic * CP0 Register 11 69350e7edc5SAleksandar Markovic */ 6949c2149c8Sths int32_t CP0_Compare; 69550e7edc5SAleksandar Markovic /* 69650e7edc5SAleksandar Markovic * CP0 Register 12 69750e7edc5SAleksandar Markovic */ 6989c2149c8Sths int32_t CP0_Status; 6996af0bf9cSbellard #define CP0St_CU3 31 7006af0bf9cSbellard #define CP0St_CU2 30 7016af0bf9cSbellard #define CP0St_CU1 29 7026af0bf9cSbellard #define CP0St_CU0 28 7036af0bf9cSbellard #define CP0St_RP 27 7046ea83fedSbellard #define CP0St_FR 26 7056af0bf9cSbellard #define CP0St_RE 25 7067a387fffSths #define CP0St_MX 24 7077a387fffSths #define CP0St_PX 23 7086af0bf9cSbellard #define CP0St_BEV 22 7096af0bf9cSbellard #define CP0St_TS 21 7106af0bf9cSbellard #define CP0St_SR 20 7116af0bf9cSbellard #define CP0St_NMI 19 7126af0bf9cSbellard #define CP0St_IM 8 7137a387fffSths #define CP0St_KX 7 7147a387fffSths #define CP0St_SX 6 7157a387fffSths #define CP0St_UX 5 716623a930eSths #define CP0St_KSU 3 7176af0bf9cSbellard #define CP0St_ERL 2 7186af0bf9cSbellard #define CP0St_EXL 1 7196af0bf9cSbellard #define CP0St_IE 0 7209c2149c8Sths int32_t CP0_IntCtl; 721ead9360eSths #define CP0IntCtl_IPTI 29 72288991299SDongxue Zhang #define CP0IntCtl_IPPCI 26 723ead9360eSths #define CP0IntCtl_VS 5 7249c2149c8Sths int32_t CP0_SRSCtl; 725ead9360eSths #define CP0SRSCtl_HSS 26 726ead9360eSths #define CP0SRSCtl_EICSS 18 727ead9360eSths #define CP0SRSCtl_ESS 12 728ead9360eSths #define CP0SRSCtl_PSS 6 729ead9360eSths #define CP0SRSCtl_CSS 0 7309c2149c8Sths int32_t CP0_SRSMap; 731ead9360eSths #define CP0SRSMap_SSV7 28 732ead9360eSths #define CP0SRSMap_SSV6 24 733ead9360eSths #define CP0SRSMap_SSV5 20 734ead9360eSths #define CP0SRSMap_SSV4 16 735ead9360eSths #define CP0SRSMap_SSV3 12 736ead9360eSths #define CP0SRSMap_SSV2 8 737ead9360eSths #define CP0SRSMap_SSV1 4 738ead9360eSths #define CP0SRSMap_SSV0 0 73950e7edc5SAleksandar Markovic /* 74050e7edc5SAleksandar Markovic * CP0 Register 13 74150e7edc5SAleksandar Markovic */ 7429c2149c8Sths int32_t CP0_Cause; 7437a387fffSths #define CP0Ca_BD 31 7447a387fffSths #define CP0Ca_TI 30 7457a387fffSths #define CP0Ca_CE 28 7467a387fffSths #define CP0Ca_DC 27 7477a387fffSths #define CP0Ca_PCI 26 7486af0bf9cSbellard #define CP0Ca_IV 23 7497a387fffSths #define CP0Ca_WP 22 7507a387fffSths #define CP0Ca_IP 8 7514de9b249Sths #define CP0Ca_IP_mask 0x0000FF00 7527a387fffSths #define CP0Ca_EC 2 75350e7edc5SAleksandar Markovic /* 75450e7edc5SAleksandar Markovic * CP0 Register 14 75550e7edc5SAleksandar Markovic */ 756c570fd16Sths target_ulong CP0_EPC; 75750e7edc5SAleksandar Markovic /* 75850e7edc5SAleksandar Markovic * CP0 Register 15 75950e7edc5SAleksandar Markovic */ 7609c2149c8Sths int32_t CP0_PRid; 76174dbf824SJames Hogan target_ulong CP0_EBase; 76274dbf824SJames Hogan target_ulong CP0_EBaseWG_rw_bitmask; 76374dbf824SJames Hogan #define CP0EBase_WG 11 764c870e3f5SYongbok Kim target_ulong CP0_CMGCRBase; 76550e7edc5SAleksandar Markovic /* 76650e7edc5SAleksandar Markovic * CP0 Register 16 76750e7edc5SAleksandar Markovic */ 7689c2149c8Sths int32_t CP0_Config0; 7696af0bf9cSbellard #define CP0C0_M 31 7700413d7a5SAleksandar Markovic #define CP0C0_K23 28 /* 30..28 */ 7710413d7a5SAleksandar Markovic #define CP0C0_KU 25 /* 27..25 */ 7726af0bf9cSbellard #define CP0C0_MDU 20 773aff2bc6dSYongbok Kim #define CP0C0_MM 18 7746af0bf9cSbellard #define CP0C0_BM 16 7750413d7a5SAleksandar Markovic #define CP0C0_Impl 16 /* 24..16 */ 7766af0bf9cSbellard #define CP0C0_BE 15 7770413d7a5SAleksandar Markovic #define CP0C0_AT 13 /* 14..13 */ 7780413d7a5SAleksandar Markovic #define CP0C0_AR 10 /* 12..10 */ 7790413d7a5SAleksandar Markovic #define CP0C0_MT 7 /* 9..7 */ 7807a387fffSths #define CP0C0_VI 3 7810413d7a5SAleksandar Markovic #define CP0C0_K0 0 /* 2..0 */ 7829c2149c8Sths int32_t CP0_Config1; 7837a387fffSths #define CP0C1_M 31 7840413d7a5SAleksandar Markovic #define CP0C1_MMU 25 /* 30..25 */ 7850413d7a5SAleksandar Markovic #define CP0C1_IS 22 /* 24..22 */ 7860413d7a5SAleksandar Markovic #define CP0C1_IL 19 /* 21..19 */ 7870413d7a5SAleksandar Markovic #define CP0C1_IA 16 /* 18..16 */ 7880413d7a5SAleksandar Markovic #define CP0C1_DS 13 /* 15..13 */ 7890413d7a5SAleksandar Markovic #define CP0C1_DL 10 /* 12..10 */ 7900413d7a5SAleksandar Markovic #define CP0C1_DA 7 /* 9..7 */ 7917a387fffSths #define CP0C1_C2 6 7927a387fffSths #define CP0C1_MD 5 7936af0bf9cSbellard #define CP0C1_PC 4 7946af0bf9cSbellard #define CP0C1_WR 3 7956af0bf9cSbellard #define CP0C1_CA 2 7966af0bf9cSbellard #define CP0C1_EP 1 7976af0bf9cSbellard #define CP0C1_FP 0 7989c2149c8Sths int32_t CP0_Config2; 7997a387fffSths #define CP0C2_M 31 8000413d7a5SAleksandar Markovic #define CP0C2_TU 28 /* 30..28 */ 8010413d7a5SAleksandar Markovic #define CP0C2_TS 24 /* 27..24 */ 8020413d7a5SAleksandar Markovic #define CP0C2_TL 20 /* 23..20 */ 8030413d7a5SAleksandar Markovic #define CP0C2_TA 16 /* 19..16 */ 8040413d7a5SAleksandar Markovic #define CP0C2_SU 12 /* 15..12 */ 8050413d7a5SAleksandar Markovic #define CP0C2_SS 8 /* 11..8 */ 8060413d7a5SAleksandar Markovic #define CP0C2_SL 4 /* 7..4 */ 8070413d7a5SAleksandar Markovic #define CP0C2_SA 0 /* 3..0 */ 8089c2149c8Sths int32_t CP0_Config3; 8097a387fffSths #define CP0C3_M 31 81070409e67SMaciej W. Rozycki #define CP0C3_BPG 30 811c870e3f5SYongbok Kim #define CP0C3_CMGCR 29 812e97a391dSYongbok Kim #define CP0C3_MSAP 28 813aea14095SLeon Alrae #define CP0C3_BP 27 814aea14095SLeon Alrae #define CP0C3_BI 26 81574dbf824SJames Hogan #define CP0C3_SC 25 8160413d7a5SAleksandar Markovic #define CP0C3_PW 24 8170413d7a5SAleksandar Markovic #define CP0C3_VZ 23 8180413d7a5SAleksandar Markovic #define CP0C3_IPLV 21 /* 22..21 */ 8190413d7a5SAleksandar Markovic #define CP0C3_MMAR 18 /* 20..18 */ 82070409e67SMaciej W. Rozycki #define CP0C3_MCU 17 821bbfa8f72SNathan Froyd #define CP0C3_ISA_ON_EXC 16 8220413d7a5SAleksandar Markovic #define CP0C3_ISA 14 /* 15..14 */ 823d279279eSPetar Jovanovic #define CP0C3_ULRI 13 8247207c7f9SLeon Alrae #define CP0C3_RXI 12 82570409e67SMaciej W. Rozycki #define CP0C3_DSP2P 11 8267a387fffSths #define CP0C3_DSPP 10 8270413d7a5SAleksandar Markovic #define CP0C3_CTXTC 9 8280413d7a5SAleksandar Markovic #define CP0C3_ITL 8 8297a387fffSths #define CP0C3_LPA 7 8307a387fffSths #define CP0C3_VEIC 6 8317a387fffSths #define CP0C3_VInt 5 8327a387fffSths #define CP0C3_SP 4 83370409e67SMaciej W. Rozycki #define CP0C3_CDMM 3 8347a387fffSths #define CP0C3_MT 2 8357a387fffSths #define CP0C3_SM 1 8367a387fffSths #define CP0C3_TL 0 8378280b12cSMaciej W. Rozycki int32_t CP0_Config4; 8388280b12cSMaciej W. Rozycki int32_t CP0_Config4_rw_bitmask; 839b4160af1SPetar Jovanovic #define CP0C4_M 31 8400413d7a5SAleksandar Markovic #define CP0C4_IE 29 /* 30..29 */ 841a0c80608SPaul Burton #define CP0C4_AE 28 8420413d7a5SAleksandar Markovic #define CP0C4_VTLBSizeExt 24 /* 27..24 */ 843e98c0d17SLeon Alrae #define CP0C4_KScrExist 16 84470409e67SMaciej W. Rozycki #define CP0C4_MMUExtDef 14 8450413d7a5SAleksandar Markovic #define CP0C4_FTLBPageSize 8 /* 12..8 */ 8460413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=1 */ 8470413d7a5SAleksandar Markovic #define CP0C4_MMUSizeExt 0 /* 7..0 */ 8480413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=2 */ 8490413d7a5SAleksandar Markovic #define CP0C4_FTLBWays 4 /* 7..4 */ 8500413d7a5SAleksandar Markovic #define CP0C4_FTLBSets 0 /* 3..0 */ 8518280b12cSMaciej W. Rozycki int32_t CP0_Config5; 8528280b12cSMaciej W. Rozycki int32_t CP0_Config5_rw_bitmask; 853b4dd99a3SPetar Jovanovic #define CP0C5_M 31 854b4dd99a3SPetar Jovanovic #define CP0C5_K 30 855b4dd99a3SPetar Jovanovic #define CP0C5_CV 29 856b4dd99a3SPetar Jovanovic #define CP0C5_EVA 28 857b4dd99a3SPetar Jovanovic #define CP0C5_MSAEn 27 8580413d7a5SAleksandar Markovic #define CP0C5_PMJ 23 /* 25..23 */ 8590413d7a5SAleksandar Markovic #define CP0C5_WR2 22 8600413d7a5SAleksandar Markovic #define CP0C5_NMS 21 8610413d7a5SAleksandar Markovic #define CP0C5_ULS 20 8620413d7a5SAleksandar Markovic #define CP0C5_XPA 19 8630413d7a5SAleksandar Markovic #define CP0C5_CRCP 18 8640413d7a5SAleksandar Markovic #define CP0C5_MI 17 8650413d7a5SAleksandar Markovic #define CP0C5_GI 15 /* 16..15 */ 8660413d7a5SAleksandar Markovic #define CP0C5_CA2 14 867b00c7218SYongbok Kim #define CP0C5_XNP 13 8680413d7a5SAleksandar Markovic #define CP0C5_DEC 11 8690413d7a5SAleksandar Markovic #define CP0C5_L2C 10 8707c979afdSLeon Alrae #define CP0C5_UFE 9 8717c979afdSLeon Alrae #define CP0C5_FRE 8 87201bc435bSYongbok Kim #define CP0C5_VP 7 873faf1f68bSLeon Alrae #define CP0C5_SBRI 6 8745204ea79SLeon Alrae #define CP0C5_MVH 5 875ce9782f4SLeon Alrae #define CP0C5_LLB 4 876f6d4dd81SYongbok Kim #define CP0C5_MRP 3 877b4dd99a3SPetar Jovanovic #define CP0C5_UFR 2 878b4dd99a3SPetar Jovanovic #define CP0C5_NFExists 0 879e397ee33Sths int32_t CP0_Config6; 880e397ee33Sths int32_t CP0_Config7; 881c7c7e1e9SLeon Alrae uint64_t CP0_LLAddr; 882f6d4dd81SYongbok Kim uint64_t CP0_MAAR[MIPS_MAAR_MAX]; 883f6d4dd81SYongbok Kim int32_t CP0_MAARI; 884ead9360eSths /* XXX: Maybe make LLAddr per-TC? */ 88550e7edc5SAleksandar Markovic /* 88650e7edc5SAleksandar Markovic * CP0 Register 17 88750e7edc5SAleksandar Markovic */ 888c7c7e1e9SLeon Alrae target_ulong lladdr; /* LL virtual address compared against SC */ 889590bc601SPaul Brook target_ulong llval; 8900b16dcd1SAleksandar Rikalo uint64_t llval_wp; 8910b16dcd1SAleksandar Rikalo uint32_t llnewval_wp; 892284b731aSLeon Alrae uint64_t CP0_LLAddr_rw_bitmask; 8932a6e32ddSAurelien Jarno int CP0_LLAddr_shift; 89450e7edc5SAleksandar Markovic /* 89550e7edc5SAleksandar Markovic * CP0 Register 18 89650e7edc5SAleksandar Markovic */ 897fd88b6abSths target_ulong CP0_WatchLo[8]; 89850e7edc5SAleksandar Markovic /* 89950e7edc5SAleksandar Markovic * CP0 Register 19 90050e7edc5SAleksandar Markovic */ 901fd88b6abSths int32_t CP0_WatchHi[8]; 9026ec98bd7SPaul Burton #define CP0WH_ASID 16 90350e7edc5SAleksandar Markovic /* 90450e7edc5SAleksandar Markovic * CP0 Register 20 90550e7edc5SAleksandar Markovic */ 9069c2149c8Sths target_ulong CP0_XContext; 9079c2149c8Sths int32_t CP0_Framemask; 90850e7edc5SAleksandar Markovic /* 90950e7edc5SAleksandar Markovic * CP0 Register 23 91050e7edc5SAleksandar Markovic */ 9119c2149c8Sths int32_t CP0_Debug; 912ead9360eSths #define CP0DB_DBD 31 9136af0bf9cSbellard #define CP0DB_DM 30 9146af0bf9cSbellard #define CP0DB_LSNM 28 9156af0bf9cSbellard #define CP0DB_Doze 27 9166af0bf9cSbellard #define CP0DB_Halt 26 9176af0bf9cSbellard #define CP0DB_CNT 25 9186af0bf9cSbellard #define CP0DB_IBEP 24 9196af0bf9cSbellard #define CP0DB_DBEP 21 9206af0bf9cSbellard #define CP0DB_IEXI 20 9216af0bf9cSbellard #define CP0DB_VER 15 9226af0bf9cSbellard #define CP0DB_DEC 10 9236af0bf9cSbellard #define CP0DB_SSt 8 9246af0bf9cSbellard #define CP0DB_DINT 5 9256af0bf9cSbellard #define CP0DB_DIB 4 9266af0bf9cSbellard #define CP0DB_DDBS 3 9276af0bf9cSbellard #define CP0DB_DDBL 2 9286af0bf9cSbellard #define CP0DB_DBp 1 9296af0bf9cSbellard #define CP0DB_DSS 0 93050e7edc5SAleksandar Markovic /* 93150e7edc5SAleksandar Markovic * CP0 Register 24 93250e7edc5SAleksandar Markovic */ 933c570fd16Sths target_ulong CP0_DEPC; 93450e7edc5SAleksandar Markovic /* 93550e7edc5SAleksandar Markovic * CP0 Register 25 93650e7edc5SAleksandar Markovic */ 9379c2149c8Sths int32_t CP0_Performance0; 93850e7edc5SAleksandar Markovic /* 93950e7edc5SAleksandar Markovic * CP0 Register 26 94050e7edc5SAleksandar Markovic */ 9410d74a222SLeon Alrae int32_t CP0_ErrCtl; 9420d74a222SLeon Alrae #define CP0EC_WST 29 9430d74a222SLeon Alrae #define CP0EC_SPR 28 9440d74a222SLeon Alrae #define CP0EC_ITC 26 94550e7edc5SAleksandar Markovic /* 94650e7edc5SAleksandar Markovic * CP0 Register 28 94750e7edc5SAleksandar Markovic */ 948284b731aSLeon Alrae uint64_t CP0_TagLo; 9499c2149c8Sths int32_t CP0_DataLo; 95050e7edc5SAleksandar Markovic /* 95150e7edc5SAleksandar Markovic * CP0 Register 29 95250e7edc5SAleksandar Markovic */ 9539c2149c8Sths int32_t CP0_TagHi; 9549c2149c8Sths int32_t CP0_DataHi; 95550e7edc5SAleksandar Markovic /* 95650e7edc5SAleksandar Markovic * CP0 Register 30 95750e7edc5SAleksandar Markovic */ 958c570fd16Sths target_ulong CP0_ErrorEPC; 95950e7edc5SAleksandar Markovic /* 96050e7edc5SAleksandar Markovic * CP0 Register 31 96150e7edc5SAleksandar Markovic */ 9629c2149c8Sths int32_t CP0_DESAVE; 96350e7edc5SAleksandar Markovic 964b5dc7732Sths /* We waste some space so we can handle shadow registers like TCs. */ 965b5dc7732Sths TCState tcs[MIPS_SHADOW_SET_MAX]; 966f01be154Sths CPUMIPSFPUContext fpus[MIPS_FPU_MAX]; 9675cbdb3a3SStefan Weil /* QEMU */ 9686af0bf9cSbellard int error_code; 969aea14095SLeon Alrae #define EXCP_TLB_NOMATCH 0x1 970aea14095SLeon Alrae #define EXCP_INST_NOTAVAIL 0x2 /* No valid instruction word for BadInstr */ 9716af0bf9cSbellard uint32_t hflags; /* CPU State */ 9726af0bf9cSbellard /* TMASK defines different execution modes */ 97342c86612SJames Hogan #define MIPS_HFLAG_TMASK 0x1F5807FF 97479ef2c4cSNathan Froyd #define MIPS_HFLAG_MODE 0x00007 /* execution modes */ 9759e72f33dSJules Irenge /* 9769e72f33dSJules Irenge * The KSU flags must be the lowest bits in hflags. The flag order 9779e72f33dSJules Irenge * must be the same as defined for CP0 Status. This allows to use 9789e72f33dSJules Irenge * the bits as the value of mmu_idx. 9799e72f33dSJules Irenge */ 98079ef2c4cSNathan Froyd #define MIPS_HFLAG_KSU 0x00003 /* kernel/supervisor/user mode mask */ 98179ef2c4cSNathan Froyd #define MIPS_HFLAG_UM 0x00002 /* user mode flag */ 98279ef2c4cSNathan Froyd #define MIPS_HFLAG_SM 0x00001 /* supervisor mode flag */ 98379ef2c4cSNathan Froyd #define MIPS_HFLAG_KM 0x00000 /* kernel mode flag */ 98479ef2c4cSNathan Froyd #define MIPS_HFLAG_DM 0x00004 /* Debug mode */ 98579ef2c4cSNathan Froyd #define MIPS_HFLAG_64 0x00008 /* 64-bit instructions enabled */ 98679ef2c4cSNathan Froyd #define MIPS_HFLAG_CP0 0x00010 /* CP0 enabled */ 98779ef2c4cSNathan Froyd #define MIPS_HFLAG_FPU 0x00020 /* FPU enabled */ 98879ef2c4cSNathan Froyd #define MIPS_HFLAG_F64 0x00040 /* 64-bit FPU enabled */ 9899e72f33dSJules Irenge /* 9909e72f33dSJules Irenge * True if the MIPS IV COP1X instructions can be used. This also 9919e72f33dSJules Irenge * controls the non-COP1X instructions RECIP.S, RECIP.D, RSQRT.S 9929e72f33dSJules Irenge * and RSQRT.D. 9939e72f33dSJules Irenge */ 99479ef2c4cSNathan Froyd #define MIPS_HFLAG_COP1X 0x00080 /* COP1X instructions enabled */ 99579ef2c4cSNathan Froyd #define MIPS_HFLAG_RE 0x00100 /* Reversed endianness */ 99601f72885SLeon Alrae #define MIPS_HFLAG_AWRAP 0x00200 /* 32-bit compatibility address wrapping */ 99779ef2c4cSNathan Froyd #define MIPS_HFLAG_M16 0x00400 /* MIPS16 mode flag */ 99879ef2c4cSNathan Froyd #define MIPS_HFLAG_M16_SHIFT 10 9999e72f33dSJules Irenge /* 10009e72f33dSJules Irenge * If translation is interrupted between the branch instruction and 10014ad40f36Sbellard * the delay slot, record what type of branch it is so that we can 10024ad40f36Sbellard * resume translation properly. It might be possible to reduce 10039e72f33dSJules Irenge * this from three bits to two. 10049e72f33dSJules Irenge */ 1005339cd2a8SLeon Alrae #define MIPS_HFLAG_BMASK_BASE 0x803800 100679ef2c4cSNathan Froyd #define MIPS_HFLAG_B 0x00800 /* Unconditional branch */ 100779ef2c4cSNathan Froyd #define MIPS_HFLAG_BC 0x01000 /* Conditional branch */ 100879ef2c4cSNathan Froyd #define MIPS_HFLAG_BL 0x01800 /* Likely branch */ 100979ef2c4cSNathan Froyd #define MIPS_HFLAG_BR 0x02000 /* branch to register (can't link TB) */ 101079ef2c4cSNathan Froyd /* Extra flags about the current pending branch. */ 1011b231c103SYongbok Kim #define MIPS_HFLAG_BMASK_EXT 0x7C000 101279ef2c4cSNathan Froyd #define MIPS_HFLAG_B16 0x04000 /* branch instruction was 16 bits */ 101379ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS16 0x08000 /* branch requires 16-bit delay slot */ 101479ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS32 0x10000 /* branch requires 32-bit delay slot */ 1015b231c103SYongbok Kim #define MIPS_HFLAG_BDS_STRICT 0x20000 /* Strict delay slot size */ 1016b231c103SYongbok Kim #define MIPS_HFLAG_BX 0x40000 /* branch exchanges execution mode */ 101779ef2c4cSNathan Froyd #define MIPS_HFLAG_BMASK (MIPS_HFLAG_BMASK_BASE | MIPS_HFLAG_BMASK_EXT) 1018853c3240SJia Liu /* MIPS DSP resources access. */ 1019908f6be1SStefan Markovic #define MIPS_HFLAG_DSP 0x080000 /* Enable access to DSP resources. */ 1020908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R2 0x100000 /* Enable access to DSP R2 resources. */ 1021908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R3 0x20000000 /* Enable access to DSP R3 resources. */ 1022d279279eSPetar Jovanovic /* Extra flag about HWREna register. */ 1023b231c103SYongbok Kim #define MIPS_HFLAG_HWRENA_ULR 0x200000 /* ULR bit from HWREna is set. */ 1024faf1f68bSLeon Alrae #define MIPS_HFLAG_SBRI 0x400000 /* R6 SDBBP causes RI excpt. in user mode */ 1025339cd2a8SLeon Alrae #define MIPS_HFLAG_FBNSLOT 0x800000 /* Forbidden slot */ 1026e97a391dSYongbok Kim #define MIPS_HFLAG_MSA 0x1000000 10277c979afdSLeon Alrae #define MIPS_HFLAG_FRE 0x2000000 /* FRE enabled */ 1028e117f526SLeon Alrae #define MIPS_HFLAG_ELPA 0x4000000 10290d74a222SLeon Alrae #define MIPS_HFLAG_ITC_CACHE 0x8000000 /* CACHE instr. operates on ITC tag */ 103042c86612SJames Hogan #define MIPS_HFLAG_ERL 0x10000000 /* error level flag */ 10316af0bf9cSbellard target_ulong btarget; /* Jump / branch target */ 10321ba74fb8Saurel32 target_ulong bcond; /* Branch condition (if needed) */ 1033a316d335Sbellard 10347a387fffSths int SYNCI_Step; /* Address step size for SYNCI */ 10357a387fffSths int CCRes; /* Cycle count resolution/divisor */ 1036ead9360eSths uint32_t CP0_Status_rw_bitmask; /* Read/write bits in CP0_Status */ 1037ead9360eSths uint32_t CP0_TCStatus_rw_bitmask; /* Read/write bits in CP0_TCStatus */ 1038f9c9cd63SPhilippe Mathieu-Daudé uint64_t insn_flags; /* Supported instruction set */ 10395fb2dcd1SYongbok Kim int saarp; 10407a387fffSths 10411f5c00cfSAlex Bennée /* Fields up to this point are cleared by a CPU reset */ 10421f5c00cfSAlex Bennée struct {} end_reset_fields; 10431f5c00cfSAlex Bennée 1044a316d335Sbellard CPU_COMMON 10456ae81775Sths 1046f0c3c505SAndreas Färber /* Fields from here on are preserved across CPU reset. */ 104751cc2e78SBlue Swirl CPUMIPSMVPContext *mvp; 10483c7b48b7SPaul Brook #if !defined(CONFIG_USER_ONLY) 104951cc2e78SBlue Swirl CPUMIPSTLBContext *tlb; 10503c7b48b7SPaul Brook #endif 105151cc2e78SBlue Swirl 1052c227f099SAnthony Liguori const mips_def_t *cpu_model; 105333ac7f16Sths void *irq[8]; 10541246b259SStefan Weil QEMUTimer *timer; /* Internal timer */ 1055043715d1SYongbok Kim struct MIPSITUState *itu; 105634fa7e83SLeon Alrae MemoryRegion *itc_tag; /* ITC Configuration Tags */ 105789777fd1SLeon Alrae target_ulong exception_base; /* ExceptionBase input to the core */ 10586af0bf9cSbellard }; 10596af0bf9cSbellard 1060416bf936SPaolo Bonzini /** 1061416bf936SPaolo Bonzini * MIPSCPU: 1062416bf936SPaolo Bonzini * @env: #CPUMIPSState 1063416bf936SPaolo Bonzini * 1064416bf936SPaolo Bonzini * A MIPS CPU. 1065416bf936SPaolo Bonzini */ 1066416bf936SPaolo Bonzini struct MIPSCPU { 1067416bf936SPaolo Bonzini /*< private >*/ 1068416bf936SPaolo Bonzini CPUState parent_obj; 1069416bf936SPaolo Bonzini /*< public >*/ 1070416bf936SPaolo Bonzini 1071*5b146dc7SRichard Henderson CPUNegativeOffsetState neg; 1072416bf936SPaolo Bonzini CPUMIPSState env; 1073416bf936SPaolo Bonzini }; 1074416bf936SPaolo Bonzini 1075416bf936SPaolo Bonzini 10760442428aSMarkus Armbruster void mips_cpu_list(void); 1077647de6caSths 10789467d44cSths #define cpu_signal_handler cpu_mips_signal_handler 1079c732abe2Sj_mayer #define cpu_list mips_cpu_list 10809467d44cSths 1081084d0497SRichard Henderson extern void cpu_wrdsp(uint32_t rs, uint32_t mask_num, CPUMIPSState *env); 1082084d0497SRichard Henderson extern uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env); 1083084d0497SRichard Henderson 10849e72f33dSJules Irenge /* 10859e72f33dSJules Irenge * MMU modes definitions. We carefully match the indices with our 10869e72f33dSJules Irenge * hflags layout. 10879e72f33dSJules Irenge */ 10886ebbf390Sj_mayer #define MMU_MODE0_SUFFIX _kernel 1089623a930eSths #define MMU_MODE1_SUFFIX _super 1090623a930eSths #define MMU_MODE2_SUFFIX _user 109142c86612SJames Hogan #define MMU_MODE3_SUFFIX _error 1092623a930eSths #define MMU_USER_IDX 2 1093b0fc6003SJames Hogan 1094b0fc6003SJames Hogan static inline int hflags_mmu_index(uint32_t hflags) 1095b0fc6003SJames Hogan { 109642c86612SJames Hogan if (hflags & MIPS_HFLAG_ERL) { 109742c86612SJames Hogan return 3; /* ERL */ 109842c86612SJames Hogan } else { 1099b0fc6003SJames Hogan return hflags & MIPS_HFLAG_KSU; 1100b0fc6003SJames Hogan } 110142c86612SJames Hogan } 1102b0fc6003SJames Hogan 110397ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch) 11046ebbf390Sj_mayer { 1105b0fc6003SJames Hogan return hflags_mmu_index(env->hflags); 11066ebbf390Sj_mayer } 11076ebbf390Sj_mayer 11084f7c64b3SRichard Henderson typedef CPUMIPSState CPUArchState; 11092161a612SRichard Henderson typedef MIPSCPU ArchCPU; 11104f7c64b3SRichard Henderson 1111022c62cbSPaolo Bonzini #include "exec/cpu-all.h" 11126af0bf9cSbellard 11139e72f33dSJules Irenge /* 11149e72f33dSJules Irenge * Memory access type : 11156af0bf9cSbellard * may be needed for precise access rights control and precise exceptions. 11166af0bf9cSbellard */ 11176af0bf9cSbellard enum { 11186af0bf9cSbellard /* 1 bit to define user level / supervisor access */ 11196af0bf9cSbellard ACCESS_USER = 0x00, 11206af0bf9cSbellard ACCESS_SUPER = 0x01, 11216af0bf9cSbellard /* 1 bit to indicate direction */ 11226af0bf9cSbellard ACCESS_STORE = 0x02, 11236af0bf9cSbellard /* Type of instruction that generated the access */ 11246af0bf9cSbellard ACCESS_CODE = 0x10, /* Code fetch access */ 11256af0bf9cSbellard ACCESS_INT = 0x20, /* Integer load/store access */ 11266af0bf9cSbellard ACCESS_FLOAT = 0x30, /* floating point load/store access */ 11276af0bf9cSbellard }; 11286af0bf9cSbellard 11296af0bf9cSbellard /* Exceptions */ 11306af0bf9cSbellard enum { 11316af0bf9cSbellard EXCP_NONE = -1, 11326af0bf9cSbellard EXCP_RESET = 0, 11336af0bf9cSbellard EXCP_SRESET, 11346af0bf9cSbellard EXCP_DSS, 11356af0bf9cSbellard EXCP_DINT, 113614e51cc7Sths EXCP_DDBL, 113714e51cc7Sths EXCP_DDBS, 11386af0bf9cSbellard EXCP_NMI, 11396af0bf9cSbellard EXCP_MCHECK, 114014e51cc7Sths EXCP_EXT_INTERRUPT, /* 8 */ 11416af0bf9cSbellard EXCP_DFWATCH, 114214e51cc7Sths EXCP_DIB, 11436af0bf9cSbellard EXCP_IWATCH, 11446af0bf9cSbellard EXCP_AdEL, 11456af0bf9cSbellard EXCP_AdES, 11466af0bf9cSbellard EXCP_TLBF, 11476af0bf9cSbellard EXCP_IBE, 114814e51cc7Sths EXCP_DBp, /* 16 */ 11496af0bf9cSbellard EXCP_SYSCALL, 115014e51cc7Sths EXCP_BREAK, 11514ad40f36Sbellard EXCP_CpU, 11526af0bf9cSbellard EXCP_RI, 11536af0bf9cSbellard EXCP_OVERFLOW, 11546af0bf9cSbellard EXCP_TRAP, 11555a5012ecSths EXCP_FPE, 115614e51cc7Sths EXCP_DWATCH, /* 24 */ 11576af0bf9cSbellard EXCP_LTLBL, 11586af0bf9cSbellard EXCP_TLBL, 11596af0bf9cSbellard EXCP_TLBS, 11606af0bf9cSbellard EXCP_DBE, 1161ead9360eSths EXCP_THREAD, 116214e51cc7Sths EXCP_MDMX, 116314e51cc7Sths EXCP_C2E, 116414e51cc7Sths EXCP_CACHE, /* 32 */ 1165853c3240SJia Liu EXCP_DSPDIS, 1166e97a391dSYongbok Kim EXCP_MSADIS, 1167e97a391dSYongbok Kim EXCP_MSAFPE, 116892ceb440SLeon Alrae EXCP_TLBXI, 116992ceb440SLeon Alrae EXCP_TLBRI, 117014e51cc7Sths 117192ceb440SLeon Alrae EXCP_LAST = EXCP_TLBRI, 11726af0bf9cSbellard }; 11736af0bf9cSbellard 1174f249412cSEdgar E. Iglesias /* 117526aa3d9aSPhilippe Mathieu-Daudé * This is an internally generated WAKE request line. 1176f249412cSEdgar E. Iglesias * It is driven by the CPU itself. Raised when the MT 1177f249412cSEdgar E. Iglesias * block wants to wake a VPE from an inactive state and 1178f249412cSEdgar E. Iglesias * cleared when VPE goes from active to inactive. 1179f249412cSEdgar E. Iglesias */ 1180f249412cSEdgar E. Iglesias #define CPU_INTERRUPT_WAKE CPU_INTERRUPT_TGT_INT_0 1181f249412cSEdgar E. Iglesias 1182388bb21aSths int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc); 11836af0bf9cSbellard 1184a7519f2bSIgor Mammedov #define MIPS_CPU_TYPE_SUFFIX "-" TYPE_MIPS_CPU 1185a7519f2bSIgor Mammedov #define MIPS_CPU_TYPE_NAME(model) model MIPS_CPU_TYPE_SUFFIX 11860dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_MIPS_CPU 1187a7519f2bSIgor Mammedov 1188a7519f2bSIgor Mammedov bool cpu_supports_cps_smp(const char *cpu_type); 11895b1e0981SAleksandar Markovic bool cpu_supports_isa(const char *cpu_type, uint64_t isa); 119089777fd1SLeon Alrae void cpu_set_exception_base(int vp_index, target_ulong address); 119130bf942dSAndreas Färber 11925dc5d9f0SAurelien Jarno /* mips_int.c */ 11937db13faeSAndreas Färber void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level); 11945dc5d9f0SAurelien Jarno 1195043715d1SYongbok Kim /* mips_itu.c */ 1196043715d1SYongbok Kim void itc_reconfigure(struct MIPSITUState *tag); 1197043715d1SYongbok Kim 1198f9480ffcSths /* helper.c */ 11991239b472SKwok Cheung Yeung target_ulong exception_resume_pc(CPUMIPSState *env); 1200f9480ffcSths 1201599bc5e8SAleksandar Markovic static inline void restore_snan_bit_mode(CPUMIPSState *env) 1202599bc5e8SAleksandar Markovic { 1203599bc5e8SAleksandar Markovic set_snan_bit_is_one((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) == 0, 1204599bc5e8SAleksandar Markovic &env->active_fpu.fp_status); 1205599bc5e8SAleksandar Markovic } 1206599bc5e8SAleksandar Markovic 12077db13faeSAndreas Färber static inline void cpu_get_tb_cpu_state(CPUMIPSState *env, target_ulong *pc, 120889fee74aSEmilio G. Cota target_ulong *cs_base, uint32_t *flags) 12096b917547Saliguori { 12106b917547Saliguori *pc = env->active_tc.PC; 12116b917547Saliguori *cs_base = 0; 1212d279279eSPetar Jovanovic *flags = env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK | 1213d279279eSPetar Jovanovic MIPS_HFLAG_HWRENA_ULR); 12146b917547Saliguori } 12156b917547Saliguori 121607f5a258SMarkus Armbruster #endif /* MIPS_CPU_H */ 1217