1fcf5ef2aSThomas Huth #ifndef MIPS_CPU_H
2fcf5ef2aSThomas Huth #define MIPS_CPU_H
3fcf5ef2aSThomas Huth
4fcf5ef2aSThomas Huth #include "cpu-qom.h"
5fcf5ef2aSThomas Huth #include "exec/cpu-defs.h"
603afdc28SJiaxun Yang #ifndef CONFIG_USER_ONLY
703afdc28SJiaxun Yang #include "exec/memory.h"
803afdc28SJiaxun Yang #endif
9502700d0SAlex Bennée #include "fpu/softfloat-types.h"
10a0713e85SPhilippe Mathieu-Daudé #include "hw/clock.h"
1174433bf0SRichard Henderson #include "mips-defs.h"
12fcf5ef2aSThomas Huth
13fcf5ef2aSThomas Huth typedef struct CPUMIPSTLBContext CPUMIPSTLBContext;
14fcf5ef2aSThomas Huth
15fcf5ef2aSThomas Huth /* MSA Context */
16fcf5ef2aSThomas Huth #define MSA_WRLEN (128)
17fcf5ef2aSThomas Huth
18fcf5ef2aSThomas Huth typedef union wr_t wr_t;
19fcf5ef2aSThomas Huth union wr_t {
20fcf5ef2aSThomas Huth int8_t b[MSA_WRLEN / 8];
21fcf5ef2aSThomas Huth int16_t h[MSA_WRLEN / 16];
22fcf5ef2aSThomas Huth int32_t w[MSA_WRLEN / 32];
23fcf5ef2aSThomas Huth int64_t d[MSA_WRLEN / 64];
24fcf5ef2aSThomas Huth };
25fcf5ef2aSThomas Huth
26fcf5ef2aSThomas Huth typedef union fpr_t fpr_t;
27fcf5ef2aSThomas Huth union fpr_t {
28fcf5ef2aSThomas Huth float64 fd; /* ieee double precision */
29fcf5ef2aSThomas Huth float32 fs[2];/* ieee single precision */
30fcf5ef2aSThomas Huth uint64_t d; /* binary double fixed-point */
31fcf5ef2aSThomas Huth uint32_t w[2]; /* binary single fixed-point */
32fcf5ef2aSThomas Huth /* FPU/MSA register mapping is not tested on big-endian hosts. */
33fcf5ef2aSThomas Huth wr_t wr; /* vector data */
34fcf5ef2aSThomas Huth };
359e72f33dSJules Irenge /*
369e72f33dSJules Irenge *define FP_ENDIAN_IDX to access the same location
37fcf5ef2aSThomas Huth * in the fpr_t union regardless of the host endianness
38fcf5ef2aSThomas Huth */
39e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN
40fcf5ef2aSThomas Huth # define FP_ENDIAN_IDX 1
41fcf5ef2aSThomas Huth #else
42fcf5ef2aSThomas Huth # define FP_ENDIAN_IDX 0
43fcf5ef2aSThomas Huth #endif
44fcf5ef2aSThomas Huth
45fcf5ef2aSThomas Huth typedef struct CPUMIPSFPUContext CPUMIPSFPUContext;
46fcf5ef2aSThomas Huth struct CPUMIPSFPUContext {
47fcf5ef2aSThomas Huth /* Floating point registers */
48fcf5ef2aSThomas Huth fpr_t fpr[32];
49fcf5ef2aSThomas Huth float_status fp_status;
50fcf5ef2aSThomas Huth /* fpu implementation/revision register (fir) */
51fcf5ef2aSThomas Huth uint32_t fcr0;
52fcf5ef2aSThomas Huth #define FCR0_FREP 29
53fcf5ef2aSThomas Huth #define FCR0_UFRP 28
54fcf5ef2aSThomas Huth #define FCR0_HAS2008 23
55fcf5ef2aSThomas Huth #define FCR0_F64 22
56fcf5ef2aSThomas Huth #define FCR0_L 21
57fcf5ef2aSThomas Huth #define FCR0_W 20
58fcf5ef2aSThomas Huth #define FCR0_3D 19
59fcf5ef2aSThomas Huth #define FCR0_PS 18
60fcf5ef2aSThomas Huth #define FCR0_D 17
61fcf5ef2aSThomas Huth #define FCR0_S 16
62fcf5ef2aSThomas Huth #define FCR0_PRID 8
63fcf5ef2aSThomas Huth #define FCR0_REV 0
64fcf5ef2aSThomas Huth /* fcsr */
65fcf5ef2aSThomas Huth uint32_t fcr31_rw_bitmask;
66fcf5ef2aSThomas Huth uint32_t fcr31;
67fcf5ef2aSThomas Huth #define FCR31_FS 24
68fcf5ef2aSThomas Huth #define FCR31_ABS2008 19
69fcf5ef2aSThomas Huth #define FCR31_NAN2008 18
708ebf2e1aSJules Irenge #define SET_FP_COND(num, env) do { ((env).fcr31) |= \
718ebf2e1aSJules Irenge ((num) ? (1 << ((num) + 24)) : \
728ebf2e1aSJules Irenge (1 << 23)); \
738ebf2e1aSJules Irenge } while (0)
748ebf2e1aSJules Irenge #define CLEAR_FP_COND(num, env) do { ((env).fcr31) &= \
758ebf2e1aSJules Irenge ~((num) ? (1 << ((num) + 24)) : \
768ebf2e1aSJules Irenge (1 << 23)); \
778ebf2e1aSJules Irenge } while (0)
788ebf2e1aSJules Irenge #define GET_FP_COND(env) ((((env).fcr31 >> 24) & 0xfe) | \
798ebf2e1aSJules Irenge (((env).fcr31 >> 23) & 0x1))
80fcf5ef2aSThomas Huth #define GET_FP_CAUSE(reg) (((reg) >> 12) & 0x3f)
81fcf5ef2aSThomas Huth #define GET_FP_ENABLE(reg) (((reg) >> 7) & 0x1f)
82fcf5ef2aSThomas Huth #define GET_FP_FLAGS(reg) (((reg) >> 2) & 0x1f)
838ebf2e1aSJules Irenge #define SET_FP_CAUSE(reg, v) do { (reg) = ((reg) & ~(0x3f << 12)) | \
848ebf2e1aSJules Irenge ((v & 0x3f) << 12); \
858ebf2e1aSJules Irenge } while (0)
868ebf2e1aSJules Irenge #define SET_FP_ENABLE(reg, v) do { (reg) = ((reg) & ~(0x1f << 7)) | \
878ebf2e1aSJules Irenge ((v & 0x1f) << 7); \
888ebf2e1aSJules Irenge } while (0)
898ebf2e1aSJules Irenge #define SET_FP_FLAGS(reg, v) do { (reg) = ((reg) & ~(0x1f << 2)) | \
908ebf2e1aSJules Irenge ((v & 0x1f) << 2); \
918ebf2e1aSJules Irenge } while (0)
92fcf5ef2aSThomas Huth #define UPDATE_FP_FLAGS(reg, v) do { (reg) |= ((v & 0x1f) << 2); } while (0)
93fcf5ef2aSThomas Huth #define FP_INEXACT 1
94fcf5ef2aSThomas Huth #define FP_UNDERFLOW 2
95fcf5ef2aSThomas Huth #define FP_OVERFLOW 4
96fcf5ef2aSThomas Huth #define FP_DIV0 8
97fcf5ef2aSThomas Huth #define FP_INVALID 16
98fcf5ef2aSThomas Huth #define FP_UNIMPLEMENTED 32
99fcf5ef2aSThomas Huth };
100fcf5ef2aSThomas Huth
101fcf5ef2aSThomas Huth #define TARGET_INSN_START_EXTRA_WORDS 2
102fcf5ef2aSThomas Huth
103fcf5ef2aSThomas Huth typedef struct CPUMIPSMVPContext CPUMIPSMVPContext;
104fcf5ef2aSThomas Huth struct CPUMIPSMVPContext {
105fcf5ef2aSThomas Huth int32_t CP0_MVPControl;
106fcf5ef2aSThomas Huth #define CP0MVPCo_CPA 3
107fcf5ef2aSThomas Huth #define CP0MVPCo_STLB 2
108fcf5ef2aSThomas Huth #define CP0MVPCo_VPC 1
109fcf5ef2aSThomas Huth #define CP0MVPCo_EVP 0
110fcf5ef2aSThomas Huth int32_t CP0_MVPConf0;
111fcf5ef2aSThomas Huth #define CP0MVPC0_M 31
112fcf5ef2aSThomas Huth #define CP0MVPC0_TLBS 29
113fcf5ef2aSThomas Huth #define CP0MVPC0_GS 28
114fcf5ef2aSThomas Huth #define CP0MVPC0_PCP 27
115fcf5ef2aSThomas Huth #define CP0MVPC0_PTLBE 16
116fcf5ef2aSThomas Huth #define CP0MVPC0_TCA 15
117fcf5ef2aSThomas Huth #define CP0MVPC0_PVPE 10
118fcf5ef2aSThomas Huth #define CP0MVPC0_PTC 0
119fcf5ef2aSThomas Huth int32_t CP0_MVPConf1;
120fcf5ef2aSThomas Huth #define CP0MVPC1_CIM 31
121fcf5ef2aSThomas Huth #define CP0MVPC1_CIF 30
122fcf5ef2aSThomas Huth #define CP0MVPC1_PCX 20
123fcf5ef2aSThomas Huth #define CP0MVPC1_PCP2 10
124fcf5ef2aSThomas Huth #define CP0MVPC1_PCP1 0
125fcf5ef2aSThomas Huth };
126fcf5ef2aSThomas Huth
127fcf5ef2aSThomas Huth typedef struct mips_def_t mips_def_t;
128fcf5ef2aSThomas Huth
129fcf5ef2aSThomas Huth #define MIPS_SHADOW_SET_MAX 16
130fcf5ef2aSThomas Huth #define MIPS_TC_MAX 5
131fcf5ef2aSThomas Huth #define MIPS_FPU_MAX 1
132fcf5ef2aSThomas Huth #define MIPS_DSP_ACC 4
133fcf5ef2aSThomas Huth #define MIPS_KSCRATCH_NUM 6
134fcf5ef2aSThomas Huth #define MIPS_MAAR_MAX 16 /* Must be an even number. */
135fcf5ef2aSThomas Huth
136fcf5ef2aSThomas Huth
137a86d421eSAleksandar Markovic /*
138a86d421eSAleksandar Markovic * Summary of CP0 registers
139a86d421eSAleksandar Markovic * ========================
140a86d421eSAleksandar Markovic *
141a86d421eSAleksandar Markovic *
142a86d421eSAleksandar Markovic * Register 0 Register 1 Register 2 Register 3
143a86d421eSAleksandar Markovic * ---------- ---------- ---------- ----------
144a86d421eSAleksandar Markovic *
145a86d421eSAleksandar Markovic * 0 Index Random EntryLo0 EntryLo1
146a86d421eSAleksandar Markovic * 1 MVPControl VPEControl TCStatus GlobalNumber
147a86d421eSAleksandar Markovic * 2 MVPConf0 VPEConf0 TCBind
148a86d421eSAleksandar Markovic * 3 MVPConf1 VPEConf1 TCRestart
149a86d421eSAleksandar Markovic * 4 VPControl YQMask TCHalt
150a86d421eSAleksandar Markovic * 5 VPESchedule TCContext
151a86d421eSAleksandar Markovic * 6 VPEScheFBack TCSchedule
152a86d421eSAleksandar Markovic * 7 VPEOpt TCScheFBack TCOpt
153a86d421eSAleksandar Markovic *
154a86d421eSAleksandar Markovic *
155a86d421eSAleksandar Markovic * Register 4 Register 5 Register 6 Register 7
156a86d421eSAleksandar Markovic * ---------- ---------- ---------- ----------
157a86d421eSAleksandar Markovic *
158a86d421eSAleksandar Markovic * 0 Context PageMask Wired HWREna
159a86d421eSAleksandar Markovic * 1 ContextConfig PageGrain SRSConf0
160a86d421eSAleksandar Markovic * 2 UserLocal SegCtl0 SRSConf1
161a86d421eSAleksandar Markovic * 3 XContextConfig SegCtl1 SRSConf2
162a86d421eSAleksandar Markovic * 4 DebugContextID SegCtl2 SRSConf3
163a86d421eSAleksandar Markovic * 5 MemoryMapID PWBase SRSConf4
164a86d421eSAleksandar Markovic * 6 PWField PWCtl
165a86d421eSAleksandar Markovic * 7 PWSize
166a86d421eSAleksandar Markovic *
167a86d421eSAleksandar Markovic *
168a86d421eSAleksandar Markovic * Register 8 Register 9 Register 10 Register 11
169a86d421eSAleksandar Markovic * ---------- ---------- ----------- -----------
170a86d421eSAleksandar Markovic *
171a86d421eSAleksandar Markovic * 0 BadVAddr Count EntryHi Compare
172a86d421eSAleksandar Markovic * 1 BadInstr
173a86d421eSAleksandar Markovic * 2 BadInstrP
174a86d421eSAleksandar Markovic * 3 BadInstrX
175a86d421eSAleksandar Markovic * 4 GuestCtl1 GuestCtl0Ext
176a86d421eSAleksandar Markovic * 5 GuestCtl2
177167db30eSYongbok Kim * 6 SAARI GuestCtl3
178167db30eSYongbok Kim * 7 SAAR
179a86d421eSAleksandar Markovic *
180a86d421eSAleksandar Markovic *
181a86d421eSAleksandar Markovic * Register 12 Register 13 Register 14 Register 15
182a86d421eSAleksandar Markovic * ----------- ----------- ----------- -----------
183a86d421eSAleksandar Markovic *
184a86d421eSAleksandar Markovic * 0 Status Cause EPC PRId
185a86d421eSAleksandar Markovic * 1 IntCtl EBase
186a86d421eSAleksandar Markovic * 2 SRSCtl NestedEPC CDMMBase
187a86d421eSAleksandar Markovic * 3 SRSMap CMGCRBase
188a86d421eSAleksandar Markovic * 4 View_IPL View_RIPL BEVVA
189a86d421eSAleksandar Markovic * 5 SRSMap2 NestedExc
190a86d421eSAleksandar Markovic * 6 GuestCtl0
191a86d421eSAleksandar Markovic * 7 GTOffset
192a86d421eSAleksandar Markovic *
193a86d421eSAleksandar Markovic *
194a86d421eSAleksandar Markovic * Register 16 Register 17 Register 18 Register 19
195a86d421eSAleksandar Markovic * ----------- ----------- ----------- -----------
196a86d421eSAleksandar Markovic *
197e8dcfe82SAleksandar Markovic * 0 Config LLAddr WatchLo0 WatchHi
198e8dcfe82SAleksandar Markovic * 1 Config1 MAAR WatchLo1 WatchHi
199e8dcfe82SAleksandar Markovic * 2 Config2 MAARI WatchLo2 WatchHi
200e8dcfe82SAleksandar Markovic * 3 Config3 WatchLo3 WatchHi
201e8dcfe82SAleksandar Markovic * 4 Config4 WatchLo4 WatchHi
202e8dcfe82SAleksandar Markovic * 5 Config5 WatchLo5 WatchHi
203af868995SHuacai Chen * 6 Config6 WatchLo6 WatchHi
204af868995SHuacai Chen * 7 Config7 WatchLo7 WatchHi
205a86d421eSAleksandar Markovic *
206a86d421eSAleksandar Markovic *
207a86d421eSAleksandar Markovic * Register 20 Register 21 Register 22 Register 23
208a86d421eSAleksandar Markovic * ----------- ----------- ----------- -----------
209a86d421eSAleksandar Markovic *
210a86d421eSAleksandar Markovic * 0 XContext Debug
211a86d421eSAleksandar Markovic * 1 TraceControl
212a86d421eSAleksandar Markovic * 2 TraceControl2
213a86d421eSAleksandar Markovic * 3 UserTraceData1
214a86d421eSAleksandar Markovic * 4 TraceIBPC
215a86d421eSAleksandar Markovic * 5 TraceDBPC
216a86d421eSAleksandar Markovic * 6 Debug2
217a86d421eSAleksandar Markovic * 7
218a86d421eSAleksandar Markovic *
219a86d421eSAleksandar Markovic *
220a86d421eSAleksandar Markovic * Register 24 Register 25 Register 26 Register 27
221a86d421eSAleksandar Markovic * ----------- ----------- ----------- -----------
222a86d421eSAleksandar Markovic *
223a86d421eSAleksandar Markovic * 0 DEPC PerfCnt ErrCtl CacheErr
224a86d421eSAleksandar Markovic * 1 PerfCnt
225a86d421eSAleksandar Markovic * 2 TraceControl3 PerfCnt
226a86d421eSAleksandar Markovic * 3 UserTraceData2 PerfCnt
227a86d421eSAleksandar Markovic * 4 PerfCnt
228a86d421eSAleksandar Markovic * 5 PerfCnt
229a86d421eSAleksandar Markovic * 6 PerfCnt
230a86d421eSAleksandar Markovic * 7 PerfCnt
231a86d421eSAleksandar Markovic *
232a86d421eSAleksandar Markovic *
233a86d421eSAleksandar Markovic * Register 28 Register 29 Register 30 Register 31
234a86d421eSAleksandar Markovic * ----------- ----------- ----------- -----------
235a86d421eSAleksandar Markovic *
236a86d421eSAleksandar Markovic * 0 DataLo DataHi ErrorEPC DESAVE
237a86d421eSAleksandar Markovic * 1 TagLo TagHi
238af4bb6daSAleksandar Markovic * 2 DataLo1 DataHi1 KScratch<n>
239af4bb6daSAleksandar Markovic * 3 TagLo1 TagHi1 KScratch<n>
240af4bb6daSAleksandar Markovic * 4 DataLo2 DataHi2 KScratch<n>
241af4bb6daSAleksandar Markovic * 5 TagLo2 TagHi2 KScratch<n>
242af4bb6daSAleksandar Markovic * 6 DataLo3 DataHi3 KScratch<n>
243af4bb6daSAleksandar Markovic * 7 TagLo3 TagHi3 KScratch<n>
244a86d421eSAleksandar Markovic *
245a86d421eSAleksandar Markovic */
24604992c8cSAleksandar Markovic #define CP0_REGISTER_00 0
24704992c8cSAleksandar Markovic #define CP0_REGISTER_01 1
24804992c8cSAleksandar Markovic #define CP0_REGISTER_02 2
24904992c8cSAleksandar Markovic #define CP0_REGISTER_03 3
25004992c8cSAleksandar Markovic #define CP0_REGISTER_04 4
25104992c8cSAleksandar Markovic #define CP0_REGISTER_05 5
25204992c8cSAleksandar Markovic #define CP0_REGISTER_06 6
25304992c8cSAleksandar Markovic #define CP0_REGISTER_07 7
25404992c8cSAleksandar Markovic #define CP0_REGISTER_08 8
25504992c8cSAleksandar Markovic #define CP0_REGISTER_09 9
25604992c8cSAleksandar Markovic #define CP0_REGISTER_10 10
25704992c8cSAleksandar Markovic #define CP0_REGISTER_11 11
25804992c8cSAleksandar Markovic #define CP0_REGISTER_12 12
25904992c8cSAleksandar Markovic #define CP0_REGISTER_13 13
26004992c8cSAleksandar Markovic #define CP0_REGISTER_14 14
26104992c8cSAleksandar Markovic #define CP0_REGISTER_15 15
26204992c8cSAleksandar Markovic #define CP0_REGISTER_16 16
26304992c8cSAleksandar Markovic #define CP0_REGISTER_17 17
26404992c8cSAleksandar Markovic #define CP0_REGISTER_18 18
26504992c8cSAleksandar Markovic #define CP0_REGISTER_19 19
26604992c8cSAleksandar Markovic #define CP0_REGISTER_20 20
26704992c8cSAleksandar Markovic #define CP0_REGISTER_21 21
26804992c8cSAleksandar Markovic #define CP0_REGISTER_22 22
26904992c8cSAleksandar Markovic #define CP0_REGISTER_23 23
27004992c8cSAleksandar Markovic #define CP0_REGISTER_24 24
27104992c8cSAleksandar Markovic #define CP0_REGISTER_25 25
27204992c8cSAleksandar Markovic #define CP0_REGISTER_26 26
27304992c8cSAleksandar Markovic #define CP0_REGISTER_27 27
27404992c8cSAleksandar Markovic #define CP0_REGISTER_28 28
27504992c8cSAleksandar Markovic #define CP0_REGISTER_29 29
27604992c8cSAleksandar Markovic #define CP0_REGISTER_30 30
27704992c8cSAleksandar Markovic #define CP0_REGISTER_31 31
27804992c8cSAleksandar Markovic
27904992c8cSAleksandar Markovic
28004992c8cSAleksandar Markovic /* CP0 Register 00 */
28104992c8cSAleksandar Markovic #define CP0_REG00__INDEX 0
2821b142da5SAleksandar Markovic #define CP0_REG00__MVPCONTROL 1
2831b142da5SAleksandar Markovic #define CP0_REG00__MVPCONF0 2
2841b142da5SAleksandar Markovic #define CP0_REG00__MVPCONF1 3
28504992c8cSAleksandar Markovic #define CP0_REG00__VPCONTROL 4
28604992c8cSAleksandar Markovic /* CP0 Register 01 */
28730deb460SAleksandar Markovic #define CP0_REG01__RANDOM 0
28830deb460SAleksandar Markovic #define CP0_REG01__VPECONTROL 1
28930deb460SAleksandar Markovic #define CP0_REG01__VPECONF0 2
29030deb460SAleksandar Markovic #define CP0_REG01__VPECONF1 3
29130deb460SAleksandar Markovic #define CP0_REG01__YQMASK 4
29230deb460SAleksandar Markovic #define CP0_REG01__VPESCHEDULE 5
29330deb460SAleksandar Markovic #define CP0_REG01__VPESCHEFBACK 6
29430deb460SAleksandar Markovic #define CP0_REG01__VPEOPT 7
29504992c8cSAleksandar Markovic /* CP0 Register 02 */
29604992c8cSAleksandar Markovic #define CP0_REG02__ENTRYLO0 0
2976d27d5bdSAleksandar Markovic #define CP0_REG02__TCSTATUS 1
2986d27d5bdSAleksandar Markovic #define CP0_REG02__TCBIND 2
2996d27d5bdSAleksandar Markovic #define CP0_REG02__TCRESTART 3
3006d27d5bdSAleksandar Markovic #define CP0_REG02__TCHALT 4
3016d27d5bdSAleksandar Markovic #define CP0_REG02__TCCONTEXT 5
3026d27d5bdSAleksandar Markovic #define CP0_REG02__TCSCHEDULE 6
3036d27d5bdSAleksandar Markovic #define CP0_REG02__TCSCHEFBACK 7
30404992c8cSAleksandar Markovic /* CP0 Register 03 */
30504992c8cSAleksandar Markovic #define CP0_REG03__ENTRYLO1 0
30604992c8cSAleksandar Markovic #define CP0_REG03__GLOBALNUM 1
307acd37316SAleksandar Markovic #define CP0_REG03__TCOPT 7
30804992c8cSAleksandar Markovic /* CP0 Register 04 */
30904992c8cSAleksandar Markovic #define CP0_REG04__CONTEXT 0
310020fe379SAleksandar Markovic #define CP0_REG04__CONTEXTCONFIG 1
31104992c8cSAleksandar Markovic #define CP0_REG04__USERLOCAL 2
312020fe379SAleksandar Markovic #define CP0_REG04__XCONTEXTCONFIG 3
31304992c8cSAleksandar Markovic #define CP0_REG04__DBGCONTEXTID 4
31499029be1SYongbok Kim #define CP0_REG04__MMID 5
31504992c8cSAleksandar Markovic /* CP0 Register 05 */
31604992c8cSAleksandar Markovic #define CP0_REG05__PAGEMASK 0
31704992c8cSAleksandar Markovic #define CP0_REG05__PAGEGRAIN 1
318a1e76353SAleksandar Markovic #define CP0_REG05__SEGCTL0 2
319a1e76353SAleksandar Markovic #define CP0_REG05__SEGCTL1 3
320a1e76353SAleksandar Markovic #define CP0_REG05__SEGCTL2 4
321a1e76353SAleksandar Markovic #define CP0_REG05__PWBASE 5
322a1e76353SAleksandar Markovic #define CP0_REG05__PWFIELD 6
323a1e76353SAleksandar Markovic #define CP0_REG05__PWSIZE 7
32404992c8cSAleksandar Markovic /* CP0 Register 06 */
32504992c8cSAleksandar Markovic #define CP0_REG06__WIRED 0
3269023594bSAleksandar Markovic #define CP0_REG06__SRSCONF0 1
3279023594bSAleksandar Markovic #define CP0_REG06__SRSCONF1 2
3289023594bSAleksandar Markovic #define CP0_REG06__SRSCONF2 3
3299023594bSAleksandar Markovic #define CP0_REG06__SRSCONF3 4
3309023594bSAleksandar Markovic #define CP0_REG06__SRSCONF4 5
3319023594bSAleksandar Markovic #define CP0_REG06__PWCTL 6
33204992c8cSAleksandar Markovic /* CP0 Register 07 */
33304992c8cSAleksandar Markovic #define CP0_REG07__HWRENA 0
33404992c8cSAleksandar Markovic /* CP0 Register 08 */
33504992c8cSAleksandar Markovic #define CP0_REG08__BADVADDR 0
33604992c8cSAleksandar Markovic #define CP0_REG08__BADINSTR 1
33704992c8cSAleksandar Markovic #define CP0_REG08__BADINSTRP 2
33867d167d2SAleksandar Markovic #define CP0_REG08__BADINSTRX 3
33904992c8cSAleksandar Markovic /* CP0 Register 09 */
34004992c8cSAleksandar Markovic #define CP0_REG09__COUNT 0
34104992c8cSAleksandar Markovic #define CP0_REG09__SAARI 6
34204992c8cSAleksandar Markovic #define CP0_REG09__SAAR 7
34304992c8cSAleksandar Markovic /* CP0 Register 10 */
34404992c8cSAleksandar Markovic #define CP0_REG10__ENTRYHI 0
34504992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL1 4
34604992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL2 5
347860ffef0SAleksandar Markovic #define CP0_REG10__GUESTCTL3 6
34804992c8cSAleksandar Markovic /* CP0 Register 11 */
34904992c8cSAleksandar Markovic #define CP0_REG11__COMPARE 0
35004992c8cSAleksandar Markovic #define CP0_REG11__GUESTCTL0EXT 4
35104992c8cSAleksandar Markovic /* CP0 Register 12 */
35204992c8cSAleksandar Markovic #define CP0_REG12__STATUS 0
35304992c8cSAleksandar Markovic #define CP0_REG12__INTCTL 1
35404992c8cSAleksandar Markovic #define CP0_REG12__SRSCTL 2
3552b084867SAleksandar Markovic #define CP0_REG12__SRSMAP 3
3562b084867SAleksandar Markovic #define CP0_REG12__VIEW_IPL 4
3572b084867SAleksandar Markovic #define CP0_REG12__SRSMAP2 5
35804992c8cSAleksandar Markovic #define CP0_REG12__GUESTCTL0 6
35904992c8cSAleksandar Markovic #define CP0_REG12__GTOFFSET 7
36004992c8cSAleksandar Markovic /* CP0 Register 13 */
36104992c8cSAleksandar Markovic #define CP0_REG13__CAUSE 0
362e3c7559dSAleksandar Markovic #define CP0_REG13__VIEW_RIPL 4
363e3c7559dSAleksandar Markovic #define CP0_REG13__NESTEDEXC 5
36404992c8cSAleksandar Markovic /* CP0 Register 14 */
36504992c8cSAleksandar Markovic #define CP0_REG14__EPC 0
36635e4b54dSAleksandar Markovic #define CP0_REG14__NESTEDEPC 2
36704992c8cSAleksandar Markovic /* CP0 Register 15 */
36804992c8cSAleksandar Markovic #define CP0_REG15__PRID 0
36904992c8cSAleksandar Markovic #define CP0_REG15__EBASE 1
37004992c8cSAleksandar Markovic #define CP0_REG15__CDMMBASE 2
37104992c8cSAleksandar Markovic #define CP0_REG15__CMGCRBASE 3
3724466cd49SAleksandar Markovic #define CP0_REG15__BEVVA 4
37304992c8cSAleksandar Markovic /* CP0 Register 16 */
37404992c8cSAleksandar Markovic #define CP0_REG16__CONFIG 0
37504992c8cSAleksandar Markovic #define CP0_REG16__CONFIG1 1
37604992c8cSAleksandar Markovic #define CP0_REG16__CONFIG2 2
37704992c8cSAleksandar Markovic #define CP0_REG16__CONFIG3 3
37804992c8cSAleksandar Markovic #define CP0_REG16__CONFIG4 4
37904992c8cSAleksandar Markovic #define CP0_REG16__CONFIG5 5
380433efb4cSAleksandar Markovic #define CP0_REG16__CONFIG6 6
381433efb4cSAleksandar Markovic #define CP0_REG16__CONFIG7 7
38204992c8cSAleksandar Markovic /* CP0 Register 17 */
38304992c8cSAleksandar Markovic #define CP0_REG17__LLADDR 0
38404992c8cSAleksandar Markovic #define CP0_REG17__MAAR 1
38504992c8cSAleksandar Markovic #define CP0_REG17__MAARI 2
38604992c8cSAleksandar Markovic /* CP0 Register 18 */
38704992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO0 0
38804992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO1 1
38904992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO2 2
39004992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO3 3
391e8dcfe82SAleksandar Markovic #define CP0_REG18__WATCHLO4 4
392e8dcfe82SAleksandar Markovic #define CP0_REG18__WATCHLO5 5
393e8dcfe82SAleksandar Markovic #define CP0_REG18__WATCHLO6 6
394e8dcfe82SAleksandar Markovic #define CP0_REG18__WATCHLO7 7
39504992c8cSAleksandar Markovic /* CP0 Register 19 */
39604992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI0 0
39704992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI1 1
39804992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI2 2
39904992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI3 3
400be274dc1SAleksandar Markovic #define CP0_REG19__WATCHHI4 4
401be274dc1SAleksandar Markovic #define CP0_REG19__WATCHHI5 5
402be274dc1SAleksandar Markovic #define CP0_REG19__WATCHHI6 6
403be274dc1SAleksandar Markovic #define CP0_REG19__WATCHHI7 7
40404992c8cSAleksandar Markovic /* CP0 Register 20 */
40504992c8cSAleksandar Markovic #define CP0_REG20__XCONTEXT 0
40604992c8cSAleksandar Markovic /* CP0 Register 21 */
40704992c8cSAleksandar Markovic /* CP0 Register 22 */
40804992c8cSAleksandar Markovic /* CP0 Register 23 */
40904992c8cSAleksandar Markovic #define CP0_REG23__DEBUG 0
4104cbf4b6dSAleksandar Markovic #define CP0_REG23__TRACECONTROL 1
4114cbf4b6dSAleksandar Markovic #define CP0_REG23__TRACECONTROL2 2
4124cbf4b6dSAleksandar Markovic #define CP0_REG23__USERTRACEDATA1 3
4134cbf4b6dSAleksandar Markovic #define CP0_REG23__TRACEIBPC 4
4144cbf4b6dSAleksandar Markovic #define CP0_REG23__TRACEDBPC 5
4154cbf4b6dSAleksandar Markovic #define CP0_REG23__DEBUG2 6
41604992c8cSAleksandar Markovic /* CP0 Register 24 */
41704992c8cSAleksandar Markovic #define CP0_REG24__DEPC 0
41804992c8cSAleksandar Markovic /* CP0 Register 25 */
41904992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL0 0
42004992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT0 1
42104992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL1 2
42204992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT1 3
42304992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL2 4
42404992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT2 5
42504992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL3 6
42604992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT3 7
42704992c8cSAleksandar Markovic /* CP0 Register 26 */
428dbbf08b2SAleksandar Markovic #define CP0_REG26__ERRCTL 0
42904992c8cSAleksandar Markovic /* CP0 Register 27 */
43004992c8cSAleksandar Markovic #define CP0_REG27__CACHERR 0
43104992c8cSAleksandar Markovic /* CP0 Register 28 */
432a30e2f21SAleksandar Markovic #define CP0_REG28__TAGLO 0
433a30e2f21SAleksandar Markovic #define CP0_REG28__DATALO 1
434a30e2f21SAleksandar Markovic #define CP0_REG28__TAGLO1 2
435a30e2f21SAleksandar Markovic #define CP0_REG28__DATALO1 3
436a30e2f21SAleksandar Markovic #define CP0_REG28__TAGLO2 4
437a30e2f21SAleksandar Markovic #define CP0_REG28__DATALO2 5
438a30e2f21SAleksandar Markovic #define CP0_REG28__TAGLO3 6
439a30e2f21SAleksandar Markovic #define CP0_REG28__DATALO3 7
44004992c8cSAleksandar Markovic /* CP0 Register 29 */
441af4bb6daSAleksandar Markovic #define CP0_REG29__TAGHI 0
442af4bb6daSAleksandar Markovic #define CP0_REG29__DATAHI 1
443af4bb6daSAleksandar Markovic #define CP0_REG29__TAGHI1 2
444af4bb6daSAleksandar Markovic #define CP0_REG29__DATAHI1 3
445af4bb6daSAleksandar Markovic #define CP0_REG29__TAGHI2 4
446af4bb6daSAleksandar Markovic #define CP0_REG29__DATAHI2 5
447af4bb6daSAleksandar Markovic #define CP0_REG29__TAGHI3 6
448af4bb6daSAleksandar Markovic #define CP0_REG29__DATAHI3 7
44904992c8cSAleksandar Markovic /* CP0 Register 30 */
45004992c8cSAleksandar Markovic #define CP0_REG30__ERROREPC 0
45104992c8cSAleksandar Markovic /* CP0 Register 31 */
45204992c8cSAleksandar Markovic #define CP0_REG31__DESAVE 0
45304992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH1 2
45404992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH2 3
45504992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH3 4
45604992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH4 5
45704992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH5 6
45804992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH6 7
459ea9c5e83SAleksandar Markovic
460ea9c5e83SAleksandar Markovic
461ea9c5e83SAleksandar Markovic typedef struct TCState TCState;
462ea9c5e83SAleksandar Markovic struct TCState {
463ea9c5e83SAleksandar Markovic target_ulong gpr[32];
464cefd68f6SPhilippe Mathieu-Daudé #if defined(TARGET_MIPS64)
465cefd68f6SPhilippe Mathieu-Daudé /*
466cefd68f6SPhilippe Mathieu-Daudé * For CPUs using 128-bit GPR registers, we put the lower halves in gpr[])
467cefd68f6SPhilippe Mathieu-Daudé * and the upper halves in gpr_hi[].
468cefd68f6SPhilippe Mathieu-Daudé */
469cefd68f6SPhilippe Mathieu-Daudé uint64_t gpr_hi[32];
470cefd68f6SPhilippe Mathieu-Daudé #endif /* TARGET_MIPS64 */
471ea9c5e83SAleksandar Markovic target_ulong PC;
472ea9c5e83SAleksandar Markovic target_ulong HI[MIPS_DSP_ACC];
473ea9c5e83SAleksandar Markovic target_ulong LO[MIPS_DSP_ACC];
474ea9c5e83SAleksandar Markovic target_ulong ACX[MIPS_DSP_ACC];
475ea9c5e83SAleksandar Markovic target_ulong DSPControl;
476ea9c5e83SAleksandar Markovic int32_t CP0_TCStatus;
477ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU3 31
478ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU2 30
479ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU1 29
480ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU0 28
481ea9c5e83SAleksandar Markovic #define CP0TCSt_TMX 27
482ea9c5e83SAleksandar Markovic #define CP0TCSt_RNST 23
483ea9c5e83SAleksandar Markovic #define CP0TCSt_TDS 21
484ea9c5e83SAleksandar Markovic #define CP0TCSt_DT 20
485ea9c5e83SAleksandar Markovic #define CP0TCSt_DA 15
486ea9c5e83SAleksandar Markovic #define CP0TCSt_A 13
487ea9c5e83SAleksandar Markovic #define CP0TCSt_TKSU 11
488ea9c5e83SAleksandar Markovic #define CP0TCSt_IXMT 10
489ea9c5e83SAleksandar Markovic #define CP0TCSt_TASID 0
490ea9c5e83SAleksandar Markovic int32_t CP0_TCBind;
491ea9c5e83SAleksandar Markovic #define CP0TCBd_CurTC 21
492ea9c5e83SAleksandar Markovic #define CP0TCBd_TBE 17
493ea9c5e83SAleksandar Markovic #define CP0TCBd_CurVPE 0
494ea9c5e83SAleksandar Markovic target_ulong CP0_TCHalt;
495ea9c5e83SAleksandar Markovic target_ulong CP0_TCContext;
496ea9c5e83SAleksandar Markovic target_ulong CP0_TCSchedule;
497ea9c5e83SAleksandar Markovic target_ulong CP0_TCScheFBack;
498ea9c5e83SAleksandar Markovic int32_t CP0_Debug_tcstatus;
499ea9c5e83SAleksandar Markovic target_ulong CP0_UserLocal;
500ea9c5e83SAleksandar Markovic
501ea9c5e83SAleksandar Markovic int32_t msacsr;
502ea9c5e83SAleksandar Markovic
503ea9c5e83SAleksandar Markovic #define MSACSR_FS 24
504ea9c5e83SAleksandar Markovic #define MSACSR_FS_MASK (1 << MSACSR_FS)
505ea9c5e83SAleksandar Markovic #define MSACSR_NX 18
506ea9c5e83SAleksandar Markovic #define MSACSR_NX_MASK (1 << MSACSR_NX)
507ea9c5e83SAleksandar Markovic #define MSACSR_CEF 2
508ea9c5e83SAleksandar Markovic #define MSACSR_CEF_MASK (0xffff << MSACSR_CEF)
509ea9c5e83SAleksandar Markovic #define MSACSR_RM 0
510ea9c5e83SAleksandar Markovic #define MSACSR_RM_MASK (0x3 << MSACSR_RM)
511ea9c5e83SAleksandar Markovic #define MSACSR_MASK (MSACSR_RM_MASK | MSACSR_CEF_MASK | MSACSR_NX_MASK | \
512ea9c5e83SAleksandar Markovic MSACSR_FS_MASK)
513ea9c5e83SAleksandar Markovic
514ea9c5e83SAleksandar Markovic float_status msa_fp_status;
515ea9c5e83SAleksandar Markovic
516ea9c5e83SAleksandar Markovic #define NUMBER_OF_MXU_REGISTERS 16
517ea9c5e83SAleksandar Markovic target_ulong mxu_gpr[NUMBER_OF_MXU_REGISTERS - 1];
518ea9c5e83SAleksandar Markovic target_ulong mxu_cr;
519ea9c5e83SAleksandar Markovic #define MXU_CR_LC 31
520ea9c5e83SAleksandar Markovic #define MXU_CR_RC 30
521ea9c5e83SAleksandar Markovic #define MXU_CR_BIAS 2
522ea9c5e83SAleksandar Markovic #define MXU_CR_RD_EN 1
523ea9c5e83SAleksandar Markovic #define MXU_CR_MXU_EN 0
524ea9c5e83SAleksandar Markovic
525ea9c5e83SAleksandar Markovic };
526ea9c5e83SAleksandar Markovic
527043715d1SYongbok Kim struct MIPSITUState;
5281ea4a06aSPhilippe Mathieu-Daudé typedef struct CPUArchState {
529ea9c5e83SAleksandar Markovic TCState active_tc;
530ea9c5e83SAleksandar Markovic CPUMIPSFPUContext active_fpu;
531ea9c5e83SAleksandar Markovic
532ea9c5e83SAleksandar Markovic uint32_t current_tc;
533ea9c5e83SAleksandar Markovic
534ea9c5e83SAleksandar Markovic uint32_t SEGBITS;
535ea9c5e83SAleksandar Markovic uint32_t PABITS;
536ea9c5e83SAleksandar Markovic #if defined(TARGET_MIPS64)
537ea9c5e83SAleksandar Markovic # define PABITS_BASE 36
538ea9c5e83SAleksandar Markovic #else
539ea9c5e83SAleksandar Markovic # define PABITS_BASE 32
540ea9c5e83SAleksandar Markovic #endif
541ea9c5e83SAleksandar Markovic target_ulong SEGMask;
542ea9c5e83SAleksandar Markovic uint64_t PAMask;
543ea9c5e83SAleksandar Markovic #define PAMASK_BASE ((1ULL << PABITS_BASE) - 1)
544ea9c5e83SAleksandar Markovic
545ea9c5e83SAleksandar Markovic int32_t msair;
546ea9c5e83SAleksandar Markovic #define MSAIR_ProcID 8
547ea9c5e83SAleksandar Markovic #define MSAIR_Rev 0
548ea9c5e83SAleksandar Markovic
54950e7edc5SAleksandar Markovic /*
55050e7edc5SAleksandar Markovic * CP0 Register 0
55150e7edc5SAleksandar Markovic */
552fcf5ef2aSThomas Huth int32_t CP0_Index;
553fcf5ef2aSThomas Huth /* CP0_MVP* are per MVP registers. */
554fcf5ef2aSThomas Huth int32_t CP0_VPControl;
555fcf5ef2aSThomas Huth #define CP0VPCtl_DIS 0
55650e7edc5SAleksandar Markovic /*
55750e7edc5SAleksandar Markovic * CP0 Register 1
55850e7edc5SAleksandar Markovic */
559fcf5ef2aSThomas Huth int32_t CP0_Random;
560fcf5ef2aSThomas Huth int32_t CP0_VPEControl;
561fcf5ef2aSThomas Huth #define CP0VPECo_YSI 21
562fcf5ef2aSThomas Huth #define CP0VPECo_GSI 20
563fcf5ef2aSThomas Huth #define CP0VPECo_EXCPT 16
564fcf5ef2aSThomas Huth #define CP0VPECo_TE 15
565fcf5ef2aSThomas Huth #define CP0VPECo_TargTC 0
566fcf5ef2aSThomas Huth int32_t CP0_VPEConf0;
567fcf5ef2aSThomas Huth #define CP0VPEC0_M 31
568fcf5ef2aSThomas Huth #define CP0VPEC0_XTC 21
569fcf5ef2aSThomas Huth #define CP0VPEC0_TCS 19
570fcf5ef2aSThomas Huth #define CP0VPEC0_SCS 18
571fcf5ef2aSThomas Huth #define CP0VPEC0_DSC 17
572fcf5ef2aSThomas Huth #define CP0VPEC0_ICS 16
573fcf5ef2aSThomas Huth #define CP0VPEC0_MVP 1
574fcf5ef2aSThomas Huth #define CP0VPEC0_VPA 0
575fcf5ef2aSThomas Huth int32_t CP0_VPEConf1;
576fcf5ef2aSThomas Huth #define CP0VPEC1_NCX 20
577fcf5ef2aSThomas Huth #define CP0VPEC1_NCP2 10
578fcf5ef2aSThomas Huth #define CP0VPEC1_NCP1 0
579fcf5ef2aSThomas Huth target_ulong CP0_YQMask;
580fcf5ef2aSThomas Huth target_ulong CP0_VPESchedule;
581fcf5ef2aSThomas Huth target_ulong CP0_VPEScheFBack;
582fcf5ef2aSThomas Huth int32_t CP0_VPEOpt;
583fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX7 15
584fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX6 14
585fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX5 13
586fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX4 12
587fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX3 11
588fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX2 10
589fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX1 9
590fcf5ef2aSThomas Huth #define CP0VPEOpt_IWX0 8
591fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX7 7
592fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX6 6
593fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX5 5
594fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX4 4
595fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX3 3
596fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX2 2
597fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX1 1
598fcf5ef2aSThomas Huth #define CP0VPEOpt_DWX0 0
59950e7edc5SAleksandar Markovic /*
60050e7edc5SAleksandar Markovic * CP0 Register 2
60150e7edc5SAleksandar Markovic */
602fcf5ef2aSThomas Huth uint64_t CP0_EntryLo0;
60350e7edc5SAleksandar Markovic /*
60450e7edc5SAleksandar Markovic * CP0 Register 3
60550e7edc5SAleksandar Markovic */
606fcf5ef2aSThomas Huth uint64_t CP0_EntryLo1;
607fcf5ef2aSThomas Huth #if defined(TARGET_MIPS64)
608fcf5ef2aSThomas Huth # define CP0EnLo_RI 63
609fcf5ef2aSThomas Huth # define CP0EnLo_XI 62
610fcf5ef2aSThomas Huth #else
611fcf5ef2aSThomas Huth # define CP0EnLo_RI 31
612fcf5ef2aSThomas Huth # define CP0EnLo_XI 30
613fcf5ef2aSThomas Huth #endif
614fcf5ef2aSThomas Huth int32_t CP0_GlobalNumber;
615fcf5ef2aSThomas Huth #define CP0GN_VPId 0
61650e7edc5SAleksandar Markovic /*
61750e7edc5SAleksandar Markovic * CP0 Register 4
61850e7edc5SAleksandar Markovic */
619fcf5ef2aSThomas Huth target_ulong CP0_Context;
6203ef521eeSAleksandar Markovic int32_t CP0_MemoryMapID;
62150e7edc5SAleksandar Markovic /*
62250e7edc5SAleksandar Markovic * CP0 Register 5
62350e7edc5SAleksandar Markovic */
624fcf5ef2aSThomas Huth int32_t CP0_PageMask;
625d40b55bcSJiaxun Yang #define CP0PM_MASK 13
626fcf5ef2aSThomas Huth int32_t CP0_PageGrain_rw_bitmask;
627fcf5ef2aSThomas Huth int32_t CP0_PageGrain;
628fcf5ef2aSThomas Huth #define CP0PG_RIE 31
629fcf5ef2aSThomas Huth #define CP0PG_XIE 30
630fcf5ef2aSThomas Huth #define CP0PG_ELPA 29
631fcf5ef2aSThomas Huth #define CP0PG_IEC 27
632cec56a73SJames Hogan target_ulong CP0_SegCtl0;
633cec56a73SJames Hogan target_ulong CP0_SegCtl1;
634cec56a73SJames Hogan target_ulong CP0_SegCtl2;
635cec56a73SJames Hogan #define CP0SC_PA 9
636cec56a73SJames Hogan #define CP0SC_PA_MASK (0x7FULL << CP0SC_PA)
637cec56a73SJames Hogan #define CP0SC_PA_1GMASK (0x7EULL << CP0SC_PA)
638cec56a73SJames Hogan #define CP0SC_AM 4
639cec56a73SJames Hogan #define CP0SC_AM_MASK (0x7ULL << CP0SC_AM)
640cec56a73SJames Hogan #define CP0SC_AM_UK 0ULL
641cec56a73SJames Hogan #define CP0SC_AM_MK 1ULL
642cec56a73SJames Hogan #define CP0SC_AM_MSK 2ULL
643cec56a73SJames Hogan #define CP0SC_AM_MUSK 3ULL
644cec56a73SJames Hogan #define CP0SC_AM_MUSUK 4ULL
645cec56a73SJames Hogan #define CP0SC_AM_USK 5ULL
646cec56a73SJames Hogan #define CP0SC_AM_UUSK 7ULL
647cec56a73SJames Hogan #define CP0SC_EU 3
648cec56a73SJames Hogan #define CP0SC_EU_MASK (1ULL << CP0SC_EU)
649cec56a73SJames Hogan #define CP0SC_C 0
650cec56a73SJames Hogan #define CP0SC_C_MASK (0x7ULL << CP0SC_C)
651cec56a73SJames Hogan #define CP0SC_MASK (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \
652cec56a73SJames Hogan CP0SC_PA_MASK)
653cec56a73SJames Hogan #define CP0SC_1GMASK (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \
654cec56a73SJames Hogan CP0SC_PA_1GMASK)
655cec56a73SJames Hogan #define CP0SC0_MASK (CP0SC_MASK | (CP0SC_MASK << 16))
656cec56a73SJames Hogan #define CP0SC1_XAM 59
657cec56a73SJames Hogan #define CP0SC1_XAM_MASK (0x7ULL << CP0SC1_XAM)
658cec56a73SJames Hogan #define CP0SC1_MASK (CP0SC_MASK | (CP0SC_MASK << 16) | CP0SC1_XAM_MASK)
659cec56a73SJames Hogan #define CP0SC2_XR 56
660cec56a73SJames Hogan #define CP0SC2_XR_MASK (0xFFULL << CP0SC2_XR)
661cec56a73SJames Hogan #define CP0SC2_MASK (CP0SC_1GMASK | (CP0SC_1GMASK << 16) | CP0SC2_XR_MASK)
6625e31fdd5SYongbok Kim target_ulong CP0_PWBase;
663fa75ad14SYongbok Kim target_ulong CP0_PWField;
664fa75ad14SYongbok Kim #if defined(TARGET_MIPS64)
665fa75ad14SYongbok Kim #define CP0PF_BDI 32 /* 37..32 */
666fa75ad14SYongbok Kim #define CP0PF_GDI 24 /* 29..24 */
667fa75ad14SYongbok Kim #define CP0PF_UDI 18 /* 23..18 */
668fa75ad14SYongbok Kim #define CP0PF_MDI 12 /* 17..12 */
669fa75ad14SYongbok Kim #define CP0PF_PTI 6 /* 11..6 */
670fa75ad14SYongbok Kim #define CP0PF_PTEI 0 /* 5..0 */
671fa75ad14SYongbok Kim #else
672fa75ad14SYongbok Kim #define CP0PF_GDW 24 /* 29..24 */
673fa75ad14SYongbok Kim #define CP0PF_UDW 18 /* 23..18 */
674fa75ad14SYongbok Kim #define CP0PF_MDW 12 /* 17..12 */
675fa75ad14SYongbok Kim #define CP0PF_PTW 6 /* 11..6 */
676fa75ad14SYongbok Kim #define CP0PF_PTEW 0 /* 5..0 */
677fa75ad14SYongbok Kim #endif
67820b28ebcSYongbok Kim target_ulong CP0_PWSize;
67920b28ebcSYongbok Kim #if defined(TARGET_MIPS64)
68020b28ebcSYongbok Kim #define CP0PS_BDW 32 /* 37..32 */
68120b28ebcSYongbok Kim #endif
68220b28ebcSYongbok Kim #define CP0PS_PS 30
68320b28ebcSYongbok Kim #define CP0PS_GDW 24 /* 29..24 */
68420b28ebcSYongbok Kim #define CP0PS_UDW 18 /* 23..18 */
68520b28ebcSYongbok Kim #define CP0PS_MDW 12 /* 17..12 */
68620b28ebcSYongbok Kim #define CP0PS_PTW 6 /* 11..6 */
68720b28ebcSYongbok Kim #define CP0PS_PTEW 0 /* 5..0 */
68850e7edc5SAleksandar Markovic /*
68950e7edc5SAleksandar Markovic * CP0 Register 6
69050e7edc5SAleksandar Markovic */
691fcf5ef2aSThomas Huth int32_t CP0_Wired;
692103be64cSYongbok Kim int32_t CP0_PWCtl;
693103be64cSYongbok Kim #define CP0PC_PWEN 31
694103be64cSYongbok Kim #if defined(TARGET_MIPS64)
695103be64cSYongbok Kim #define CP0PC_PWDIREXT 30
696103be64cSYongbok Kim #define CP0PC_XK 28
697103be64cSYongbok Kim #define CP0PC_XS 27
698103be64cSYongbok Kim #define CP0PC_XU 26
699103be64cSYongbok Kim #endif
700103be64cSYongbok Kim #define CP0PC_DPH 7
701103be64cSYongbok Kim #define CP0PC_HUGEPG 6
702103be64cSYongbok Kim #define CP0PC_PSN 0 /* 5..0 */
703fcf5ef2aSThomas Huth int32_t CP0_SRSConf0_rw_bitmask;
704fcf5ef2aSThomas Huth int32_t CP0_SRSConf0;
705fcf5ef2aSThomas Huth #define CP0SRSC0_M 31
706fcf5ef2aSThomas Huth #define CP0SRSC0_SRS3 20
707fcf5ef2aSThomas Huth #define CP0SRSC0_SRS2 10
708fcf5ef2aSThomas Huth #define CP0SRSC0_SRS1 0
709fcf5ef2aSThomas Huth int32_t CP0_SRSConf1_rw_bitmask;
710fcf5ef2aSThomas Huth int32_t CP0_SRSConf1;
711fcf5ef2aSThomas Huth #define CP0SRSC1_M 31
712fcf5ef2aSThomas Huth #define CP0SRSC1_SRS6 20
713fcf5ef2aSThomas Huth #define CP0SRSC1_SRS5 10
714fcf5ef2aSThomas Huth #define CP0SRSC1_SRS4 0
715fcf5ef2aSThomas Huth int32_t CP0_SRSConf2_rw_bitmask;
716fcf5ef2aSThomas Huth int32_t CP0_SRSConf2;
717fcf5ef2aSThomas Huth #define CP0SRSC2_M 31
718fcf5ef2aSThomas Huth #define CP0SRSC2_SRS9 20
719fcf5ef2aSThomas Huth #define CP0SRSC2_SRS8 10
720fcf5ef2aSThomas Huth #define CP0SRSC2_SRS7 0
721fcf5ef2aSThomas Huth int32_t CP0_SRSConf3_rw_bitmask;
722fcf5ef2aSThomas Huth int32_t CP0_SRSConf3;
723fcf5ef2aSThomas Huth #define CP0SRSC3_M 31
724fcf5ef2aSThomas Huth #define CP0SRSC3_SRS12 20
725fcf5ef2aSThomas Huth #define CP0SRSC3_SRS11 10
726fcf5ef2aSThomas Huth #define CP0SRSC3_SRS10 0
727fcf5ef2aSThomas Huth int32_t CP0_SRSConf4_rw_bitmask;
728fcf5ef2aSThomas Huth int32_t CP0_SRSConf4;
729fcf5ef2aSThomas Huth #define CP0SRSC4_SRS15 20
730fcf5ef2aSThomas Huth #define CP0SRSC4_SRS14 10
731fcf5ef2aSThomas Huth #define CP0SRSC4_SRS13 0
73250e7edc5SAleksandar Markovic /*
73350e7edc5SAleksandar Markovic * CP0 Register 7
73450e7edc5SAleksandar Markovic */
735fcf5ef2aSThomas Huth int32_t CP0_HWREna;
73650e7edc5SAleksandar Markovic /*
73750e7edc5SAleksandar Markovic * CP0 Register 8
73850e7edc5SAleksandar Markovic */
739fcf5ef2aSThomas Huth target_ulong CP0_BadVAddr;
740fcf5ef2aSThomas Huth uint32_t CP0_BadInstr;
741fcf5ef2aSThomas Huth uint32_t CP0_BadInstrP;
74225beba9bSStefan Markovic uint32_t CP0_BadInstrX;
74350e7edc5SAleksandar Markovic /*
74450e7edc5SAleksandar Markovic * CP0 Register 9
74550e7edc5SAleksandar Markovic */
746fcf5ef2aSThomas Huth int32_t CP0_Count;
747167db30eSYongbok Kim #define CP0SAARI_TARGET 0 /* 5..0 */
748167db30eSYongbok Kim #define CP0SAAR_BASE 12 /* 43..12 */
749167db30eSYongbok Kim #define CP0SAAR_SIZE 1 /* 5..1 */
750167db30eSYongbok Kim #define CP0SAAR_EN 0
75150e7edc5SAleksandar Markovic /*
75250e7edc5SAleksandar Markovic * CP0 Register 10
75350e7edc5SAleksandar Markovic */
754fcf5ef2aSThomas Huth target_ulong CP0_EntryHi;
755fcf5ef2aSThomas Huth #define CP0EnHi_EHINV 10
756fcf5ef2aSThomas Huth target_ulong CP0_EntryHi_ASID_mask;
75750e7edc5SAleksandar Markovic /*
75850e7edc5SAleksandar Markovic * CP0 Register 11
75950e7edc5SAleksandar Markovic */
760fcf5ef2aSThomas Huth int32_t CP0_Compare;
76150e7edc5SAleksandar Markovic /*
76250e7edc5SAleksandar Markovic * CP0 Register 12
76350e7edc5SAleksandar Markovic */
764fcf5ef2aSThomas Huth int32_t CP0_Status;
765fcf5ef2aSThomas Huth #define CP0St_CU3 31
766fcf5ef2aSThomas Huth #define CP0St_CU2 30
767fcf5ef2aSThomas Huth #define CP0St_CU1 29
768fcf5ef2aSThomas Huth #define CP0St_CU0 28
769fcf5ef2aSThomas Huth #define CP0St_RP 27
770fcf5ef2aSThomas Huth #define CP0St_FR 26
771fcf5ef2aSThomas Huth #define CP0St_RE 25
772fcf5ef2aSThomas Huth #define CP0St_MX 24
773fcf5ef2aSThomas Huth #define CP0St_PX 23
774fcf5ef2aSThomas Huth #define CP0St_BEV 22
775fcf5ef2aSThomas Huth #define CP0St_TS 21
776fcf5ef2aSThomas Huth #define CP0St_SR 20
777fcf5ef2aSThomas Huth #define CP0St_NMI 19
778fcf5ef2aSThomas Huth #define CP0St_IM 8
779fcf5ef2aSThomas Huth #define CP0St_KX 7
780fcf5ef2aSThomas Huth #define CP0St_SX 6
781fcf5ef2aSThomas Huth #define CP0St_UX 5
782fcf5ef2aSThomas Huth #define CP0St_KSU 3
783fcf5ef2aSThomas Huth #define CP0St_ERL 2
784fcf5ef2aSThomas Huth #define CP0St_EXL 1
785fcf5ef2aSThomas Huth #define CP0St_IE 0
786fcf5ef2aSThomas Huth int32_t CP0_IntCtl;
787fcf5ef2aSThomas Huth #define CP0IntCtl_IPTI 29
788fcf5ef2aSThomas Huth #define CP0IntCtl_IPPCI 26
789fcf5ef2aSThomas Huth #define CP0IntCtl_VS 5
790fcf5ef2aSThomas Huth int32_t CP0_SRSCtl;
791fcf5ef2aSThomas Huth #define CP0SRSCtl_HSS 26
792fcf5ef2aSThomas Huth #define CP0SRSCtl_EICSS 18
793fcf5ef2aSThomas Huth #define CP0SRSCtl_ESS 12
794fcf5ef2aSThomas Huth #define CP0SRSCtl_PSS 6
795fcf5ef2aSThomas Huth #define CP0SRSCtl_CSS 0
796fcf5ef2aSThomas Huth int32_t CP0_SRSMap;
797fcf5ef2aSThomas Huth #define CP0SRSMap_SSV7 28
798fcf5ef2aSThomas Huth #define CP0SRSMap_SSV6 24
799fcf5ef2aSThomas Huth #define CP0SRSMap_SSV5 20
800fcf5ef2aSThomas Huth #define CP0SRSMap_SSV4 16
801fcf5ef2aSThomas Huth #define CP0SRSMap_SSV3 12
802fcf5ef2aSThomas Huth #define CP0SRSMap_SSV2 8
803fcf5ef2aSThomas Huth #define CP0SRSMap_SSV1 4
804fcf5ef2aSThomas Huth #define CP0SRSMap_SSV0 0
80550e7edc5SAleksandar Markovic /*
80650e7edc5SAleksandar Markovic * CP0 Register 13
80750e7edc5SAleksandar Markovic */
808fcf5ef2aSThomas Huth int32_t CP0_Cause;
809fcf5ef2aSThomas Huth #define CP0Ca_BD 31
810fcf5ef2aSThomas Huth #define CP0Ca_TI 30
811fcf5ef2aSThomas Huth #define CP0Ca_CE 28
812fcf5ef2aSThomas Huth #define CP0Ca_DC 27
813fcf5ef2aSThomas Huth #define CP0Ca_PCI 26
814fcf5ef2aSThomas Huth #define CP0Ca_IV 23
815fcf5ef2aSThomas Huth #define CP0Ca_WP 22
816fcf5ef2aSThomas Huth #define CP0Ca_IP 8
817fcf5ef2aSThomas Huth #define CP0Ca_IP_mask 0x0000FF00
818fcf5ef2aSThomas Huth #define CP0Ca_EC 2
81950e7edc5SAleksandar Markovic /*
82050e7edc5SAleksandar Markovic * CP0 Register 14
82150e7edc5SAleksandar Markovic */
822fcf5ef2aSThomas Huth target_ulong CP0_EPC;
82350e7edc5SAleksandar Markovic /*
82450e7edc5SAleksandar Markovic * CP0 Register 15
82550e7edc5SAleksandar Markovic */
826fcf5ef2aSThomas Huth int32_t CP0_PRid;
82774dbf824SJames Hogan target_ulong CP0_EBase;
82874dbf824SJames Hogan target_ulong CP0_EBaseWG_rw_bitmask;
82974dbf824SJames Hogan #define CP0EBase_WG 11
830fcf5ef2aSThomas Huth target_ulong CP0_CMGCRBase;
83150e7edc5SAleksandar Markovic /*
8328cd0b410SPhilippe Mathieu-Daudé * CP0 Register 16 (after Release 1)
83350e7edc5SAleksandar Markovic */
834fcf5ef2aSThomas Huth int32_t CP0_Config0;
835fcf5ef2aSThomas Huth #define CP0C0_M 31
8360413d7a5SAleksandar Markovic #define CP0C0_K23 28 /* 30..28 */
8370413d7a5SAleksandar Markovic #define CP0C0_KU 25 /* 27..25 */
838fcf5ef2aSThomas Huth #define CP0C0_MDU 20
839fcf5ef2aSThomas Huth #define CP0C0_MM 18
840fcf5ef2aSThomas Huth #define CP0C0_BM 16
8410413d7a5SAleksandar Markovic #define CP0C0_Impl 16 /* 24..16 */
842fcf5ef2aSThomas Huth #define CP0C0_BE 15
8430413d7a5SAleksandar Markovic #define CP0C0_AT 13 /* 14..13 */
8440413d7a5SAleksandar Markovic #define CP0C0_AR 10 /* 12..10 */
8450413d7a5SAleksandar Markovic #define CP0C0_MT 7 /* 9..7 */
846fcf5ef2aSThomas Huth #define CP0C0_VI 3
8470413d7a5SAleksandar Markovic #define CP0C0_K0 0 /* 2..0 */
848ce543844SPhilippe Mathieu-Daudé #define CP0C0_AR_LENGTH 3
8498cd0b410SPhilippe Mathieu-Daudé /*
8508cd0b410SPhilippe Mathieu-Daudé * CP0 Register 16 (before Release 1)
8518cd0b410SPhilippe Mathieu-Daudé */
8528cd0b410SPhilippe Mathieu-Daudé #define CP0C0_Impl 16 /* 24..16 */
8538cd0b410SPhilippe Mathieu-Daudé #define CP0C0_IC 9 /* 11..9 */
8548cd0b410SPhilippe Mathieu-Daudé #define CP0C0_DC 6 /* 8..6 */
8558cd0b410SPhilippe Mathieu-Daudé #define CP0C0_IB 5
8568cd0b410SPhilippe Mathieu-Daudé #define CP0C0_DB 4
857fcf5ef2aSThomas Huth int32_t CP0_Config1;
858fcf5ef2aSThomas Huth #define CP0C1_M 31
8590413d7a5SAleksandar Markovic #define CP0C1_MMU 25 /* 30..25 */
8600413d7a5SAleksandar Markovic #define CP0C1_IS 22 /* 24..22 */
8610413d7a5SAleksandar Markovic #define CP0C1_IL 19 /* 21..19 */
8620413d7a5SAleksandar Markovic #define CP0C1_IA 16 /* 18..16 */
8630413d7a5SAleksandar Markovic #define CP0C1_DS 13 /* 15..13 */
8640413d7a5SAleksandar Markovic #define CP0C1_DL 10 /* 12..10 */
8650413d7a5SAleksandar Markovic #define CP0C1_DA 7 /* 9..7 */
866fcf5ef2aSThomas Huth #define CP0C1_C2 6
867fcf5ef2aSThomas Huth #define CP0C1_MD 5
868fcf5ef2aSThomas Huth #define CP0C1_PC 4
869fcf5ef2aSThomas Huth #define CP0C1_WR 3
870fcf5ef2aSThomas Huth #define CP0C1_CA 2
871fcf5ef2aSThomas Huth #define CP0C1_EP 1
872fcf5ef2aSThomas Huth #define CP0C1_FP 0
873fcf5ef2aSThomas Huth int32_t CP0_Config2;
874fcf5ef2aSThomas Huth #define CP0C2_M 31
8750413d7a5SAleksandar Markovic #define CP0C2_TU 28 /* 30..28 */
8760413d7a5SAleksandar Markovic #define CP0C2_TS 24 /* 27..24 */
8770413d7a5SAleksandar Markovic #define CP0C2_TL 20 /* 23..20 */
8780413d7a5SAleksandar Markovic #define CP0C2_TA 16 /* 19..16 */
8790413d7a5SAleksandar Markovic #define CP0C2_SU 12 /* 15..12 */
8800413d7a5SAleksandar Markovic #define CP0C2_SS 8 /* 11..8 */
8810413d7a5SAleksandar Markovic #define CP0C2_SL 4 /* 7..4 */
8820413d7a5SAleksandar Markovic #define CP0C2_SA 0 /* 3..0 */
883fcf5ef2aSThomas Huth int32_t CP0_Config3;
884fcf5ef2aSThomas Huth #define CP0C3_M 31
885fcf5ef2aSThomas Huth #define CP0C3_BPG 30
886fcf5ef2aSThomas Huth #define CP0C3_CMGCR 29
887fcf5ef2aSThomas Huth #define CP0C3_MSAP 28
888fcf5ef2aSThomas Huth #define CP0C3_BP 27
889fcf5ef2aSThomas Huth #define CP0C3_BI 26
89074dbf824SJames Hogan #define CP0C3_SC 25
8910413d7a5SAleksandar Markovic #define CP0C3_PW 24
8920413d7a5SAleksandar Markovic #define CP0C3_VZ 23
8930413d7a5SAleksandar Markovic #define CP0C3_IPLV 21 /* 22..21 */
8940413d7a5SAleksandar Markovic #define CP0C3_MMAR 18 /* 20..18 */
895fcf5ef2aSThomas Huth #define CP0C3_MCU 17
896fcf5ef2aSThomas Huth #define CP0C3_ISA_ON_EXC 16
8970413d7a5SAleksandar Markovic #define CP0C3_ISA 14 /* 15..14 */
898fcf5ef2aSThomas Huth #define CP0C3_ULRI 13
899fcf5ef2aSThomas Huth #define CP0C3_RXI 12
900fcf5ef2aSThomas Huth #define CP0C3_DSP2P 11
901fcf5ef2aSThomas Huth #define CP0C3_DSPP 10
9020413d7a5SAleksandar Markovic #define CP0C3_CTXTC 9
9030413d7a5SAleksandar Markovic #define CP0C3_ITL 8
904fcf5ef2aSThomas Huth #define CP0C3_LPA 7
905fcf5ef2aSThomas Huth #define CP0C3_VEIC 6
906fcf5ef2aSThomas Huth #define CP0C3_VInt 5
907fcf5ef2aSThomas Huth #define CP0C3_SP 4
908fcf5ef2aSThomas Huth #define CP0C3_CDMM 3
909fcf5ef2aSThomas Huth #define CP0C3_MT 2
910fcf5ef2aSThomas Huth #define CP0C3_SM 1
911fcf5ef2aSThomas Huth #define CP0C3_TL 0
912fcf5ef2aSThomas Huth int32_t CP0_Config4;
913fcf5ef2aSThomas Huth int32_t CP0_Config4_rw_bitmask;
914fcf5ef2aSThomas Huth #define CP0C4_M 31
9150413d7a5SAleksandar Markovic #define CP0C4_IE 29 /* 30..29 */
916fcf5ef2aSThomas Huth #define CP0C4_AE 28
9170413d7a5SAleksandar Markovic #define CP0C4_VTLBSizeExt 24 /* 27..24 */
918fcf5ef2aSThomas Huth #define CP0C4_KScrExist 16
919fcf5ef2aSThomas Huth #define CP0C4_MMUExtDef 14
9200413d7a5SAleksandar Markovic #define CP0C4_FTLBPageSize 8 /* 12..8 */
9210413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=1 */
9220413d7a5SAleksandar Markovic #define CP0C4_MMUSizeExt 0 /* 7..0 */
9230413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=2 */
9240413d7a5SAleksandar Markovic #define CP0C4_FTLBWays 4 /* 7..4 */
9250413d7a5SAleksandar Markovic #define CP0C4_FTLBSets 0 /* 3..0 */
926fcf5ef2aSThomas Huth int32_t CP0_Config5;
927fcf5ef2aSThomas Huth int32_t CP0_Config5_rw_bitmask;
928fcf5ef2aSThomas Huth #define CP0C5_M 31
929fcf5ef2aSThomas Huth #define CP0C5_K 30
930fcf5ef2aSThomas Huth #define CP0C5_CV 29
931fcf5ef2aSThomas Huth #define CP0C5_EVA 28
932fcf5ef2aSThomas Huth #define CP0C5_MSAEn 27
9330413d7a5SAleksandar Markovic #define CP0C5_PMJ 23 /* 25..23 */
9340413d7a5SAleksandar Markovic #define CP0C5_WR2 22
9350413d7a5SAleksandar Markovic #define CP0C5_NMS 21
9360413d7a5SAleksandar Markovic #define CP0C5_ULS 20
9370413d7a5SAleksandar Markovic #define CP0C5_XPA 19
9380413d7a5SAleksandar Markovic #define CP0C5_CRCP 18
9390413d7a5SAleksandar Markovic #define CP0C5_MI 17
9400413d7a5SAleksandar Markovic #define CP0C5_GI 15 /* 16..15 */
9410413d7a5SAleksandar Markovic #define CP0C5_CA2 14
942fcf5ef2aSThomas Huth #define CP0C5_XNP 13
9430413d7a5SAleksandar Markovic #define CP0C5_DEC 11
9440413d7a5SAleksandar Markovic #define CP0C5_L2C 10
945fcf5ef2aSThomas Huth #define CP0C5_UFE 9
946fcf5ef2aSThomas Huth #define CP0C5_FRE 8
947fcf5ef2aSThomas Huth #define CP0C5_VP 7
948fcf5ef2aSThomas Huth #define CP0C5_SBRI 6
949fcf5ef2aSThomas Huth #define CP0C5_MVH 5
950fcf5ef2aSThomas Huth #define CP0C5_LLB 4
951fcf5ef2aSThomas Huth #define CP0C5_MRP 3
952fcf5ef2aSThomas Huth #define CP0C5_UFR 2
953fcf5ef2aSThomas Huth #define CP0C5_NFExists 0
954fcf5ef2aSThomas Huth int32_t CP0_Config6;
955af868995SHuacai Chen int32_t CP0_Config6_rw_bitmask;
956af868995SHuacai Chen #define CP0C6_BPPASS 31
957af868995SHuacai Chen #define CP0C6_KPOS 24
958af868995SHuacai Chen #define CP0C6_KE 23
959af868995SHuacai Chen #define CP0C6_VTLBONLY 22
960af868995SHuacai Chen #define CP0C6_LASX 21
961af868995SHuacai Chen #define CP0C6_SSEN 20
962af868995SHuacai Chen #define CP0C6_DISDRTIME 19
963af868995SHuacai Chen #define CP0C6_PIXNUEN 18
964af868995SHuacai Chen #define CP0C6_SCRAND 17
965af868995SHuacai Chen #define CP0C6_LLEXCEN 16
966af868995SHuacai Chen #define CP0C6_DISVC 15
967af868995SHuacai Chen #define CP0C6_VCLRU 14
968af868995SHuacai Chen #define CP0C6_DCLRU 13
969af868995SHuacai Chen #define CP0C6_PIXUEN 12
970af868995SHuacai Chen #define CP0C6_DISBLKLYEN 11
971af868995SHuacai Chen #define CP0C6_UMEMUALEN 10
972af868995SHuacai Chen #define CP0C6_SFBEN 8
973af868995SHuacai Chen #define CP0C6_FLTINT 7
974af868995SHuacai Chen #define CP0C6_VLTINT 6
975af868995SHuacai Chen #define CP0C6_DISBTB 5
976af868995SHuacai Chen #define CP0C6_STPREFCTL 2
977af868995SHuacai Chen #define CP0C6_INSTPREF 1
978af868995SHuacai Chen #define CP0C6_DATAPREF 0
979fcf5ef2aSThomas Huth int32_t CP0_Config7;
980af868995SHuacai Chen int64_t CP0_Config7_rw_bitmask;
98136b84f85SMarcin Nowakowski #define CP0C7_WII 31
982af868995SHuacai Chen #define CP0C7_NAPCGEN 2
983af868995SHuacai Chen #define CP0C7_UNIMUEN 1
984af868995SHuacai Chen #define CP0C7_VFPUCGEN 0
985c7c7e1e9SLeon Alrae uint64_t CP0_LLAddr;
986fcf5ef2aSThomas Huth uint64_t CP0_MAAR[MIPS_MAAR_MAX];
987fcf5ef2aSThomas Huth int32_t CP0_MAARI;
988fcf5ef2aSThomas Huth /* XXX: Maybe make LLAddr per-TC? */
98950e7edc5SAleksandar Markovic /*
99050e7edc5SAleksandar Markovic * CP0 Register 17
99150e7edc5SAleksandar Markovic */
992c7c7e1e9SLeon Alrae target_ulong lladdr; /* LL virtual address compared against SC */
993fcf5ef2aSThomas Huth target_ulong llval;
9940b16dcd1SAleksandar Rikalo uint64_t llval_wp;
9950b16dcd1SAleksandar Rikalo uint32_t llnewval_wp;
996fcf5ef2aSThomas Huth uint64_t CP0_LLAddr_rw_bitmask;
997fcf5ef2aSThomas Huth int CP0_LLAddr_shift;
99850e7edc5SAleksandar Markovic /*
99950e7edc5SAleksandar Markovic * CP0 Register 18
100050e7edc5SAleksandar Markovic */
1001fcf5ef2aSThomas Huth target_ulong CP0_WatchLo[8];
100250e7edc5SAleksandar Markovic /*
100350e7edc5SAleksandar Markovic * CP0 Register 19
100450e7edc5SAleksandar Markovic */
1005feafe82cSYongbok Kim uint64_t CP0_WatchHi[8];
1006fcf5ef2aSThomas Huth #define CP0WH_ASID 16
1007a6bc80f7SMarcin Nowakowski #define CP0WH_M 31
100850e7edc5SAleksandar Markovic /*
100950e7edc5SAleksandar Markovic * CP0 Register 20
101050e7edc5SAleksandar Markovic */
1011fcf5ef2aSThomas Huth target_ulong CP0_XContext;
1012fcf5ef2aSThomas Huth int32_t CP0_Framemask;
101350e7edc5SAleksandar Markovic /*
101450e7edc5SAleksandar Markovic * CP0 Register 23
101550e7edc5SAleksandar Markovic */
1016fcf5ef2aSThomas Huth int32_t CP0_Debug;
1017fcf5ef2aSThomas Huth #define CP0DB_DBD 31
1018fcf5ef2aSThomas Huth #define CP0DB_DM 30
1019fcf5ef2aSThomas Huth #define CP0DB_LSNM 28
1020fcf5ef2aSThomas Huth #define CP0DB_Doze 27
1021fcf5ef2aSThomas Huth #define CP0DB_Halt 26
1022fcf5ef2aSThomas Huth #define CP0DB_CNT 25
1023fcf5ef2aSThomas Huth #define CP0DB_IBEP 24
1024fcf5ef2aSThomas Huth #define CP0DB_DBEP 21
1025fcf5ef2aSThomas Huth #define CP0DB_IEXI 20
1026fcf5ef2aSThomas Huth #define CP0DB_VER 15
1027fcf5ef2aSThomas Huth #define CP0DB_DEC 10
1028fcf5ef2aSThomas Huth #define CP0DB_SSt 8
1029fcf5ef2aSThomas Huth #define CP0DB_DINT 5
1030fcf5ef2aSThomas Huth #define CP0DB_DIB 4
1031fcf5ef2aSThomas Huth #define CP0DB_DDBS 3
1032fcf5ef2aSThomas Huth #define CP0DB_DDBL 2
1033fcf5ef2aSThomas Huth #define CP0DB_DBp 1
1034fcf5ef2aSThomas Huth #define CP0DB_DSS 0
103550e7edc5SAleksandar Markovic /*
103650e7edc5SAleksandar Markovic * CP0 Register 24
103750e7edc5SAleksandar Markovic */
1038fcf5ef2aSThomas Huth target_ulong CP0_DEPC;
103950e7edc5SAleksandar Markovic /*
104050e7edc5SAleksandar Markovic * CP0 Register 25
104150e7edc5SAleksandar Markovic */
1042fcf5ef2aSThomas Huth int32_t CP0_Performance0;
104350e7edc5SAleksandar Markovic /*
104450e7edc5SAleksandar Markovic * CP0 Register 26
104550e7edc5SAleksandar Markovic */
1046fcf5ef2aSThomas Huth int32_t CP0_ErrCtl;
1047fcf5ef2aSThomas Huth #define CP0EC_WST 29
1048fcf5ef2aSThomas Huth #define CP0EC_SPR 28
1049fcf5ef2aSThomas Huth #define CP0EC_ITC 26
105050e7edc5SAleksandar Markovic /*
105150e7edc5SAleksandar Markovic * CP0 Register 28
105250e7edc5SAleksandar Markovic */
1053fcf5ef2aSThomas Huth uint64_t CP0_TagLo;
1054fcf5ef2aSThomas Huth int32_t CP0_DataLo;
105550e7edc5SAleksandar Markovic /*
105650e7edc5SAleksandar Markovic * CP0 Register 29
105750e7edc5SAleksandar Markovic */
1058fcf5ef2aSThomas Huth int32_t CP0_TagHi;
1059fcf5ef2aSThomas Huth int32_t CP0_DataHi;
106050e7edc5SAleksandar Markovic /*
106150e7edc5SAleksandar Markovic * CP0 Register 30
106250e7edc5SAleksandar Markovic */
1063fcf5ef2aSThomas Huth target_ulong CP0_ErrorEPC;
106450e7edc5SAleksandar Markovic /*
106550e7edc5SAleksandar Markovic * CP0 Register 31
106650e7edc5SAleksandar Markovic */
1067fcf5ef2aSThomas Huth int32_t CP0_DESAVE;
106814d92efdSAleksandar Markovic target_ulong CP0_KScratch[MIPS_KSCRATCH_NUM];
106903afdc28SJiaxun Yang /*
107003afdc28SJiaxun Yang * Loongson CSR CPUCFG registers
107103afdc28SJiaxun Yang */
107203afdc28SJiaxun Yang uint32_t lcsr_cpucfg1;
107303afdc28SJiaxun Yang #define CPUCFG1_FP 0
107403afdc28SJiaxun Yang #define CPUCFG1_FPREV 1
107503afdc28SJiaxun Yang #define CPUCFG1_MMI 4
107603afdc28SJiaxun Yang #define CPUCFG1_MSA1 5
107703afdc28SJiaxun Yang #define CPUCFG1_MSA2 6
107803afdc28SJiaxun Yang #define CPUCFG1_LSLDR0 16
107903afdc28SJiaxun Yang #define CPUCFG1_LSPERF 17
108003afdc28SJiaxun Yang #define CPUCFG1_LSPERFX 18
108103afdc28SJiaxun Yang #define CPUCFG1_LSSYNCI 19
108203afdc28SJiaxun Yang #define CPUCFG1_LLEXC 20
108303afdc28SJiaxun Yang #define CPUCFG1_SCRAND 21
108403afdc28SJiaxun Yang #define CPUCFG1_MUALP 25
108503afdc28SJiaxun Yang #define CPUCFG1_KMUALEN 26
108603afdc28SJiaxun Yang #define CPUCFG1_ITLBT 27
108703afdc28SJiaxun Yang #define CPUCFG1_SFBP 29
108803afdc28SJiaxun Yang #define CPUCFG1_CDMAP 30
108903afdc28SJiaxun Yang uint32_t lcsr_cpucfg2;
109003afdc28SJiaxun Yang #define CPUCFG2_LEXT1 0
109103afdc28SJiaxun Yang #define CPUCFG2_LEXT2 1
109203afdc28SJiaxun Yang #define CPUCFG2_LEXT3 2
109303afdc28SJiaxun Yang #define CPUCFG2_LSPW 3
109403afdc28SJiaxun Yang #define CPUCFG2_LCSRP 27
109503afdc28SJiaxun Yang #define CPUCFG2_LDISBLIKELY 28
109650e7edc5SAleksandar Markovic
1097fcf5ef2aSThomas Huth /* We waste some space so we can handle shadow registers like TCs. */
1098fcf5ef2aSThomas Huth TCState tcs[MIPS_SHADOW_SET_MAX];
1099fcf5ef2aSThomas Huth CPUMIPSFPUContext fpus[MIPS_FPU_MAX];
1100fcf5ef2aSThomas Huth /* QEMU */
1101fcf5ef2aSThomas Huth int error_code;
1102fcf5ef2aSThomas Huth #define EXCP_TLB_NOMATCH 0x1
1103fcf5ef2aSThomas Huth #define EXCP_INST_NOTAVAIL 0x2 /* No valid instruction word for BadInstr */
1104fcf5ef2aSThomas Huth uint32_t hflags; /* CPU State */
1105fcf5ef2aSThomas Huth /* TMASK defines different execution modes */
11065de4359bSDragan Mladjenovic #define MIPS_HFLAG_TMASK 0x3F5807FF
1107fcf5ef2aSThomas Huth #define MIPS_HFLAG_MODE 0x00007 /* execution modes */
11089e72f33dSJules Irenge /*
11099e72f33dSJules Irenge * The KSU flags must be the lowest bits in hflags. The flag order
11109e72f33dSJules Irenge * must be the same as defined for CP0 Status. This allows to use
11119e72f33dSJules Irenge * the bits as the value of mmu_idx.
11129e72f33dSJules Irenge */
1113fcf5ef2aSThomas Huth #define MIPS_HFLAG_KSU 0x00003 /* kernel/supervisor/user mode mask */
1114fcf5ef2aSThomas Huth #define MIPS_HFLAG_UM 0x00002 /* user mode flag */
1115fcf5ef2aSThomas Huth #define MIPS_HFLAG_SM 0x00001 /* supervisor mode flag */
1116fcf5ef2aSThomas Huth #define MIPS_HFLAG_KM 0x00000 /* kernel mode flag */
1117fcf5ef2aSThomas Huth #define MIPS_HFLAG_DM 0x00004 /* Debug mode */
1118fcf5ef2aSThomas Huth #define MIPS_HFLAG_64 0x00008 /* 64-bit instructions enabled */
1119fcf5ef2aSThomas Huth #define MIPS_HFLAG_CP0 0x00010 /* CP0 enabled */
1120fcf5ef2aSThomas Huth #define MIPS_HFLAG_FPU 0x00020 /* FPU enabled */
1121fcf5ef2aSThomas Huth #define MIPS_HFLAG_F64 0x00040 /* 64-bit FPU enabled */
11229e72f33dSJules Irenge /*
11239e72f33dSJules Irenge * True if the MIPS IV COP1X instructions can be used. This also
11249e72f33dSJules Irenge * controls the non-COP1X instructions RECIP.S, RECIP.D, RSQRT.S
11259e72f33dSJules Irenge * and RSQRT.D.
11269e72f33dSJules Irenge */
1127fcf5ef2aSThomas Huth #define MIPS_HFLAG_COP1X 0x00080 /* COP1X instructions enabled */
1128fcf5ef2aSThomas Huth #define MIPS_HFLAG_RE 0x00100 /* Reversed endianness */
1129fcf5ef2aSThomas Huth #define MIPS_HFLAG_AWRAP 0x00200 /* 32-bit compatibility address wrapping */
1130fcf5ef2aSThomas Huth #define MIPS_HFLAG_M16 0x00400 /* MIPS16 mode flag */
1131fcf5ef2aSThomas Huth #define MIPS_HFLAG_M16_SHIFT 10
11329e72f33dSJules Irenge /*
11339e72f33dSJules Irenge * If translation is interrupted between the branch instruction and
1134fcf5ef2aSThomas Huth * the delay slot, record what type of branch it is so that we can
1135fcf5ef2aSThomas Huth * resume translation properly. It might be possible to reduce
11369e72f33dSJules Irenge * this from three bits to two.
11379e72f33dSJules Irenge */
1138fcf5ef2aSThomas Huth #define MIPS_HFLAG_BMASK_BASE 0x803800
1139fcf5ef2aSThomas Huth #define MIPS_HFLAG_B 0x00800 /* Unconditional branch */
1140fcf5ef2aSThomas Huth #define MIPS_HFLAG_BC 0x01000 /* Conditional branch */
1141fcf5ef2aSThomas Huth #define MIPS_HFLAG_BL 0x01800 /* Likely branch */
1142fcf5ef2aSThomas Huth #define MIPS_HFLAG_BR 0x02000 /* branch to register (can't link TB) */
1143fcf5ef2aSThomas Huth /* Extra flags about the current pending branch. */
1144fcf5ef2aSThomas Huth #define MIPS_HFLAG_BMASK_EXT 0x7C000
1145fcf5ef2aSThomas Huth #define MIPS_HFLAG_B16 0x04000 /* branch instruction was 16 bits */
1146fcf5ef2aSThomas Huth #define MIPS_HFLAG_BDS16 0x08000 /* branch requires 16-bit delay slot */
1147fcf5ef2aSThomas Huth #define MIPS_HFLAG_BDS32 0x10000 /* branch requires 32-bit delay slot */
1148fcf5ef2aSThomas Huth #define MIPS_HFLAG_BDS_STRICT 0x20000 /* Strict delay slot size */
1149fcf5ef2aSThomas Huth #define MIPS_HFLAG_BX 0x40000 /* branch exchanges execution mode */
1150fcf5ef2aSThomas Huth #define MIPS_HFLAG_BMASK (MIPS_HFLAG_BMASK_BASE | MIPS_HFLAG_BMASK_EXT)
1151fcf5ef2aSThomas Huth /* MIPS DSP resources access. */
1152908f6be1SStefan Markovic #define MIPS_HFLAG_DSP 0x080000 /* Enable access to DSP resources. */
1153908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R2 0x100000 /* Enable access to DSP R2 resources. */
1154908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R3 0x20000000 /* Enable access to DSP R3 resources. */
1155fcf5ef2aSThomas Huth /* Extra flag about HWREna register. */
1156fcf5ef2aSThomas Huth #define MIPS_HFLAG_HWRENA_ULR 0x200000 /* ULR bit from HWREna is set. */
1157fcf5ef2aSThomas Huth #define MIPS_HFLAG_SBRI 0x400000 /* R6 SDBBP causes RI excpt. in user mode */
1158fcf5ef2aSThomas Huth #define MIPS_HFLAG_FBNSLOT 0x800000 /* Forbidden slot */
1159fcf5ef2aSThomas Huth #define MIPS_HFLAG_MSA 0x1000000
1160fcf5ef2aSThomas Huth #define MIPS_HFLAG_FRE 0x2000000 /* FRE enabled */
1161fcf5ef2aSThomas Huth #define MIPS_HFLAG_ELPA 0x4000000
1162fcf5ef2aSThomas Huth #define MIPS_HFLAG_ITC_CACHE 0x8000000 /* CACHE instr. operates on ITC tag */
116342c86612SJames Hogan #define MIPS_HFLAG_ERL 0x10000000 /* error level flag */
1164fcf5ef2aSThomas Huth target_ulong btarget; /* Jump / branch target */
1165fcf5ef2aSThomas Huth target_ulong bcond; /* Branch condition (if needed) */
1166fcf5ef2aSThomas Huth
1167fcf5ef2aSThomas Huth int SYNCI_Step; /* Address step size for SYNCI */
1168fcf5ef2aSThomas Huth int CCRes; /* Cycle count resolution/divisor */
1169fcf5ef2aSThomas Huth uint32_t CP0_Status_rw_bitmask; /* Read/write bits in CP0_Status */
1170fcf5ef2aSThomas Huth uint32_t CP0_TCStatus_rw_bitmask; /* Read/write bits in CP0_TCStatus */
1171f9c9cd63SPhilippe Mathieu-Daudé uint64_t insn_flags; /* Supported instruction set */
1172fcf5ef2aSThomas Huth
11731f5c00cfSAlex Bennée /* Fields up to this point are cleared by a CPU reset */
11741f5c00cfSAlex Bennée struct {} end_reset_fields;
11751f5c00cfSAlex Bennée
1176fcf5ef2aSThomas Huth /* Fields from here on are preserved across CPU reset. */
1177fcf5ef2aSThomas Huth CPUMIPSMVPContext *mvp;
1178fcf5ef2aSThomas Huth #if !defined(CONFIG_USER_ONLY)
1179fcf5ef2aSThomas Huth CPUMIPSTLBContext *tlb;
118086468930SPhilippe Mathieu-Daudé qemu_irq irq[8];
118185ccd962SPhilippe Mathieu-Daudé MemoryRegion *itc_tag; /* ITC Configuration Tags */
118203afdc28SJiaxun Yang
118303afdc28SJiaxun Yang /* Loongson IOCSR memory */
118403afdc28SJiaxun Yang struct {
118503afdc28SJiaxun Yang AddressSpace as;
118603afdc28SJiaxun Yang MemoryRegion mr;
118703afdc28SJiaxun Yang } iocsr;
1188fcf5ef2aSThomas Huth #endif
1189fcf5ef2aSThomas Huth
1190fcf5ef2aSThomas Huth const mips_def_t *cpu_model;
1191fcf5ef2aSThomas Huth QEMUTimer *timer; /* Internal timer */
1192b263688dSJiaxun Yang Clock *count_clock; /* CP0_Count clock */
1193fcf5ef2aSThomas Huth target_ulong exception_base; /* ExceptionBase input to the core */
11941ea4a06aSPhilippe Mathieu-Daudé } CPUMIPSState;
1195fcf5ef2aSThomas Huth
1196fcf5ef2aSThomas Huth /**
1197fcf5ef2aSThomas Huth * MIPSCPU:
1198fcf5ef2aSThomas Huth * @env: #CPUMIPSState
1199a0713e85SPhilippe Mathieu-Daudé * @clock: this CPU input clock (may be connected
1200a0713e85SPhilippe Mathieu-Daudé * to an output clock from another device).
1201fcf5ef2aSThomas Huth *
1202fcf5ef2aSThomas Huth * A MIPS CPU.
1203fcf5ef2aSThomas Huth */
1204b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
1205fcf5ef2aSThomas Huth CPUState parent_obj;
1206fcf5ef2aSThomas Huth
12073b3d7df5SRichard Henderson CPUMIPSState env;
12083b3d7df5SRichard Henderson
1209a0713e85SPhilippe Mathieu-Daudé Clock *clock;
1210b263688dSJiaxun Yang Clock *count_div; /* Divider for CP0_Count clock */
1211d70e5895SPhilippe Mathieu-Daudé
1212d70e5895SPhilippe Mathieu-Daudé /* Properties */
1213d70e5895SPhilippe Mathieu-Daudé bool is_big_endian;
1214fcf5ef2aSThomas Huth };
1215fcf5ef2aSThomas Huth
12169348028eSPhilippe Mathieu-Daudé /**
12179348028eSPhilippe Mathieu-Daudé * MIPSCPUClass:
12189348028eSPhilippe Mathieu-Daudé * @parent_realize: The parent class' realize handler.
12199348028eSPhilippe Mathieu-Daudé * @parent_phases: The parent class' reset phase handlers.
12209348028eSPhilippe Mathieu-Daudé *
12219348028eSPhilippe Mathieu-Daudé * A MIPS CPU model.
12229348028eSPhilippe Mathieu-Daudé */
12239348028eSPhilippe Mathieu-Daudé struct MIPSCPUClass {
12249348028eSPhilippe Mathieu-Daudé CPUClass parent_class;
12259348028eSPhilippe Mathieu-Daudé
12269348028eSPhilippe Mathieu-Daudé DeviceRealize parent_realize;
12279348028eSPhilippe Mathieu-Daudé ResettablePhases parent_phases;
12289348028eSPhilippe Mathieu-Daudé const struct mips_def_t *cpu_def;
12299348028eSPhilippe Mathieu-Daudé
12309348028eSPhilippe Mathieu-Daudé /* Used for the jazz board to modify mips_cpu_do_transaction_failed. */
12319348028eSPhilippe Mathieu-Daudé bool no_data_aborts;
12329348028eSPhilippe Mathieu-Daudé };
1233fcf5ef2aSThomas Huth
1234f703f1efSPhilippe Mathieu-Daudé void cpu_wrdsp(uint32_t rs, uint32_t mask_num, CPUMIPSState *env);
1235f703f1efSPhilippe Mathieu-Daudé uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env);
1236fcf5ef2aSThomas Huth
12379e72f33dSJules Irenge /*
12389e72f33dSJules Irenge * MMU modes definitions. We carefully match the indices with our
12399e72f33dSJules Irenge * hflags layout.
12409e72f33dSJules Irenge */
12414e999bf4SRichard Henderson #define MMU_KERNEL_IDX 0
1242fcf5ef2aSThomas Huth #define MMU_USER_IDX 2
12434e999bf4SRichard Henderson #define MMU_ERL_IDX 3
1244b0fc6003SJames Hogan
hflags_mmu_index(uint32_t hflags)1245b0fc6003SJames Hogan static inline int hflags_mmu_index(uint32_t hflags)
1246b0fc6003SJames Hogan {
124742c86612SJames Hogan if (hflags & MIPS_HFLAG_ERL) {
12484e999bf4SRichard Henderson return MMU_ERL_IDX;
124942c86612SJames Hogan } else {
1250b0fc6003SJames Hogan return hflags & MIPS_HFLAG_KSU;
1251b0fc6003SJames Hogan }
125242c86612SJames Hogan }
1253b0fc6003SJames Hogan
mips_env_mmu_index(CPUMIPSState * env)12546ebf33c5SRichard Henderson static inline int mips_env_mmu_index(CPUMIPSState *env)
1255fcf5ef2aSThomas Huth {
1256b0fc6003SJames Hogan return hflags_mmu_index(env->hflags);
1257fcf5ef2aSThomas Huth }
1258fcf5ef2aSThomas Huth
1259fcf5ef2aSThomas Huth #include "exec/cpu-all.h"
1260fcf5ef2aSThomas Huth
1261fcf5ef2aSThomas Huth /* Exceptions */
1262fcf5ef2aSThomas Huth enum {
1263fcf5ef2aSThomas Huth EXCP_NONE = -1,
1264fcf5ef2aSThomas Huth EXCP_RESET = 0,
1265fcf5ef2aSThomas Huth EXCP_SRESET,
1266fcf5ef2aSThomas Huth EXCP_DSS,
1267fcf5ef2aSThomas Huth EXCP_DINT,
1268fcf5ef2aSThomas Huth EXCP_DDBL,
1269fcf5ef2aSThomas Huth EXCP_DDBS,
1270fcf5ef2aSThomas Huth EXCP_NMI,
1271fcf5ef2aSThomas Huth EXCP_MCHECK,
1272fcf5ef2aSThomas Huth EXCP_EXT_INTERRUPT, /* 8 */
1273fcf5ef2aSThomas Huth EXCP_DFWATCH,
1274fcf5ef2aSThomas Huth EXCP_DIB,
1275fcf5ef2aSThomas Huth EXCP_IWATCH,
1276fcf5ef2aSThomas Huth EXCP_AdEL,
1277fcf5ef2aSThomas Huth EXCP_AdES,
1278fcf5ef2aSThomas Huth EXCP_TLBF,
1279fcf5ef2aSThomas Huth EXCP_IBE,
1280fcf5ef2aSThomas Huth EXCP_DBp, /* 16 */
1281fcf5ef2aSThomas Huth EXCP_SYSCALL,
1282fcf5ef2aSThomas Huth EXCP_BREAK,
1283fcf5ef2aSThomas Huth EXCP_CpU,
1284fcf5ef2aSThomas Huth EXCP_RI,
1285fcf5ef2aSThomas Huth EXCP_OVERFLOW,
1286fcf5ef2aSThomas Huth EXCP_TRAP,
1287fcf5ef2aSThomas Huth EXCP_FPE,
1288fcf5ef2aSThomas Huth EXCP_DWATCH, /* 24 */
1289fcf5ef2aSThomas Huth EXCP_LTLBL,
1290fcf5ef2aSThomas Huth EXCP_TLBL,
1291fcf5ef2aSThomas Huth EXCP_TLBS,
1292fcf5ef2aSThomas Huth EXCP_DBE,
1293fcf5ef2aSThomas Huth EXCP_THREAD,
1294fcf5ef2aSThomas Huth EXCP_MDMX,
1295fcf5ef2aSThomas Huth EXCP_C2E,
1296fcf5ef2aSThomas Huth EXCP_CACHE, /* 32 */
1297fcf5ef2aSThomas Huth EXCP_DSPDIS,
1298fcf5ef2aSThomas Huth EXCP_MSADIS,
1299fcf5ef2aSThomas Huth EXCP_MSAFPE,
1300fcf5ef2aSThomas Huth EXCP_TLBXI,
1301fcf5ef2aSThomas Huth EXCP_TLBRI,
13028ec7e3c5SRichard Henderson EXCP_SEMIHOST,
1303fcf5ef2aSThomas Huth
13048ec7e3c5SRichard Henderson EXCP_LAST = EXCP_SEMIHOST,
1305fcf5ef2aSThomas Huth };
1306fcf5ef2aSThomas Huth
1307fcf5ef2aSThomas Huth /*
130826aa3d9aSPhilippe Mathieu-Daudé * This is an internally generated WAKE request line.
1309fcf5ef2aSThomas Huth * It is driven by the CPU itself. Raised when the MT
1310fcf5ef2aSThomas Huth * block wants to wake a VPE from an inactive state and
1311fcf5ef2aSThomas Huth * cleared when VPE goes from active to inactive.
1312fcf5ef2aSThomas Huth */
1313fcf5ef2aSThomas Huth #define CPU_INTERRUPT_WAKE CPU_INTERRUPT_TGT_INT_0
1314fcf5ef2aSThomas Huth
13150dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_MIPS_CPU
1316a7519f2bSIgor Mammedov
1317ac70f976SPhilippe Mathieu-Daudé bool cpu_type_supports_cps_smp(const char *cpu_type);
1318df6adb68SPhilippe Mathieu-Daudé bool cpu_supports_isa(const CPUMIPSState *env, uint64_t isa_mask);
1319ac70f976SPhilippe Mathieu-Daudé bool cpu_type_supports_isa(const char *cpu_type, uint64_t isa);
132017c2c320SPhilippe Mathieu-Daudé
1321*09968fc9SPhilippe Mathieu-Daudé /* Check presence of MIPS-3D ASE */
ase_3d_available(const CPUMIPSState * env)1322*09968fc9SPhilippe Mathieu-Daudé static inline bool ase_3d_available(const CPUMIPSState *env)
1323*09968fc9SPhilippe Mathieu-Daudé {
1324*09968fc9SPhilippe Mathieu-Daudé return env->active_fpu.fcr0 & (1 << FCR0_3D);
1325*09968fc9SPhilippe Mathieu-Daudé }
1326*09968fc9SPhilippe Mathieu-Daudé
132725a13628SPhilippe Mathieu-Daudé /* Check presence of MSA implementation */
ase_msa_available(CPUMIPSState * env)132825a13628SPhilippe Mathieu-Daudé static inline bool ase_msa_available(CPUMIPSState *env)
132925a13628SPhilippe Mathieu-Daudé {
133025a13628SPhilippe Mathieu-Daudé return env->CP0_Config3 & (1 << CP0C3_MSAP);
133125a13628SPhilippe Mathieu-Daudé }
133225a13628SPhilippe Mathieu-Daudé
133303afdc28SJiaxun Yang /* Check presence of Loongson CSR instructions */
ase_lcsr_available(CPUMIPSState * env)133403afdc28SJiaxun Yang static inline bool ase_lcsr_available(CPUMIPSState *env)
133503afdc28SJiaxun Yang {
133603afdc28SJiaxun Yang return env->lcsr_cpucfg2 & (1 << CPUCFG2_LCSRP);
133703afdc28SJiaxun Yang }
133803afdc28SJiaxun Yang
133917c2c320SPhilippe Mathieu-Daudé /* Check presence of multi-threading ASE implementation */
ase_mt_available(CPUMIPSState * env)134017c2c320SPhilippe Mathieu-Daudé static inline bool ase_mt_available(CPUMIPSState *env)
134117c2c320SPhilippe Mathieu-Daudé {
134217c2c320SPhilippe Mathieu-Daudé return env->CP0_Config3 & (1 << CP0C3_MT);
134317c2c320SPhilippe Mathieu-Daudé }
134417c2c320SPhilippe Mathieu-Daudé
cpu_type_is_64bit(const char * cpu_type)1345b0586b38SPhilippe Mathieu-Daudé static inline bool cpu_type_is_64bit(const char *cpu_type)
1346b0586b38SPhilippe Mathieu-Daudé {
1347b0586b38SPhilippe Mathieu-Daudé return cpu_type_supports_isa(cpu_type, CPU_MIPS64);
1348b0586b38SPhilippe Mathieu-Daudé }
1349b0586b38SPhilippe Mathieu-Daudé
1350fcf5ef2aSThomas Huth void cpu_set_exception_base(int vp_index, target_ulong address);
1351fcf5ef2aSThomas Huth
13522fd9c5adSPhilippe Mathieu-Daudé /* addr.c */
13532fd9c5adSPhilippe Mathieu-Daudé uint64_t cpu_mips_kseg0_to_phys(void *opaque, uint64_t addr);
13542fd9c5adSPhilippe Mathieu-Daudé uint64_t cpu_mips_phys_to_kseg0(void *opaque, uint64_t addr);
13552fd9c5adSPhilippe Mathieu-Daudé
135607ae8ccdSJiaxun Yang uint64_t cpu_mips_kseg1_to_phys(void *opaque, uint64_t addr);
135707ae8ccdSJiaxun Yang uint64_t cpu_mips_phys_to_kseg1(void *opaque, uint64_t addr);
13582fd9c5adSPhilippe Mathieu-Daudé
135985ccd962SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
136085ccd962SPhilippe Mathieu-Daudé
136130a8d3a1SPhilippe Mathieu-Daudé /* HW declaration specific to the MIPS target */
1362fcf5ef2aSThomas Huth void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level);
136330a8d3a1SPhilippe Mathieu-Daudé void cpu_mips_irq_init_cpu(MIPSCPU *cpu);
136430a8d3a1SPhilippe Mathieu-Daudé void cpu_mips_clock_init(MIPSCPU *cpu);
1365fcf5ef2aSThomas Huth
136685ccd962SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */
136785ccd962SPhilippe Mathieu-Daudé
1368fcf5ef2aSThomas Huth /* helper.c */
1369fcf5ef2aSThomas Huth target_ulong exception_resume_pc(CPUMIPSState *env);
1370fcf5ef2aSThomas Huth
cpu_get_tb_cpu_state(CPUMIPSState * env,vaddr * pc,uint64_t * cs_base,uint32_t * flags)1371bb5de525SAnton Johansson static inline void cpu_get_tb_cpu_state(CPUMIPSState *env, vaddr *pc,
1372bb5de525SAnton Johansson uint64_t *cs_base, uint32_t *flags)
1373fcf5ef2aSThomas Huth {
1374fcf5ef2aSThomas Huth *pc = env->active_tc.PC;
1375fcf5ef2aSThomas Huth *cs_base = 0;
1376fcf5ef2aSThomas Huth *flags = env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK |
1377fcf5ef2aSThomas Huth MIPS_HFLAG_HWRENA_ULR);
1378fcf5ef2aSThomas Huth }
1379fcf5ef2aSThomas Huth
13807aaab96aSPhilippe Mathieu-Daudé /**
13817aaab96aSPhilippe Mathieu-Daudé * mips_cpu_create_with_clock:
13827aaab96aSPhilippe Mathieu-Daudé * @typename: a MIPS CPU type.
13837aaab96aSPhilippe Mathieu-Daudé * @cpu_refclk: this cpu input clock (an output clock of another device)
13843e8f019bSPhilippe Mathieu-Daudé * @is_big_endian: whether this CPU is configured in big endianness
13857aaab96aSPhilippe Mathieu-Daudé *
13867aaab96aSPhilippe Mathieu-Daudé * Instantiates a MIPS CPU, set the input clock of the CPU to @cpu_refclk,
13877aaab96aSPhilippe Mathieu-Daudé * then realizes the CPU.
13887aaab96aSPhilippe Mathieu-Daudé *
13897aaab96aSPhilippe Mathieu-Daudé * Returns: A #CPUState or %NULL if an error occurred.
13907aaab96aSPhilippe Mathieu-Daudé */
13913e8f019bSPhilippe Mathieu-Daudé MIPSCPU *mips_cpu_create_with_clock(const char *cpu_type, Clock *cpu_refclk,
13923e8f019bSPhilippe Mathieu-Daudé bool is_big_endian);
13937aaab96aSPhilippe Mathieu-Daudé
1394fcf5ef2aSThomas Huth #endif /* MIPS_CPU_H */
1395