107f5a258SMarkus Armbruster #ifndef MIPS_CPU_H
207f5a258SMarkus Armbruster #define MIPS_CPU_H
36af0bf9cSbellard
4416bf936SPaolo Bonzini #include "cpu-qom.h"
5*d97c3b06SPierrick Bouvier #include "exec/cpu-common.h"
6022c62cbSPaolo Bonzini #include "exec/cpu-defs.h"
722a7c2f2SPierrick Bouvier #include "exec/cpu-interrupt.h"
803afdc28SJiaxun Yang #ifndef CONFIG_USER_ONLY
98be545baSRichard Henderson #include "system/memory.h"
1003afdc28SJiaxun Yang #endif
11502700d0SAlex Bennée #include "fpu/softfloat-types.h"
12a0713e85SPhilippe Mathieu-Daudé #include "hw/clock.h"
1374433bf0SRichard Henderson #include "mips-defs.h"
146af0bf9cSbellard
15ead9360eSths typedef struct CPUMIPSTLBContext CPUMIPSTLBContext;
1651b2772fSths
17e97a391dSYongbok Kim /* MSA Context */
18e97a391dSYongbok Kim #define MSA_WRLEN (128)
19e97a391dSYongbok Kim
20e97a391dSYongbok Kim typedef union wr_t wr_t;
21e97a391dSYongbok Kim union wr_t {
22e97a391dSYongbok Kim int8_t b[MSA_WRLEN / 8];
23e97a391dSYongbok Kim int16_t h[MSA_WRLEN / 16];
24e97a391dSYongbok Kim int32_t w[MSA_WRLEN / 32];
25e97a391dSYongbok Kim int64_t d[MSA_WRLEN / 64];
26e97a391dSYongbok Kim };
27e97a391dSYongbok Kim
28c227f099SAnthony Liguori typedef union fpr_t fpr_t;
29c227f099SAnthony Liguori union fpr_t {
30ead9360eSths float64 fd; /* ieee double precision */
31ead9360eSths float32 fs[2];/* ieee single precision */
32ead9360eSths uint64_t d; /* binary double fixed-point */
33ead9360eSths uint32_t w[2]; /* binary single fixed-point */
34e97a391dSYongbok Kim /* FPU/MSA register mapping is not tested on big-endian hosts. */
35e97a391dSYongbok Kim wr_t wr; /* vector data */
36ead9360eSths };
379e72f33dSJules Irenge /*
389e72f33dSJules Irenge *define FP_ENDIAN_IDX to access the same location
394ff9786cSStefan Weil * in the fpr_t union regardless of the host endianness
40ead9360eSths */
41e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN
42ead9360eSths # define FP_ENDIAN_IDX 1
43ead9360eSths #else
44ead9360eSths # define FP_ENDIAN_IDX 0
45c570fd16Sths #endif
46ead9360eSths
47ead9360eSths typedef struct CPUMIPSFPUContext CPUMIPSFPUContext;
48ead9360eSths struct CPUMIPSFPUContext {
496af0bf9cSbellard /* Floating point registers */
50c227f099SAnthony Liguori fpr_t fpr[32];
516ea83fedSbellard float_status fp_status;
525a5012ecSths /* fpu implementation/revision register (fir) */
536af0bf9cSbellard uint32_t fcr0;
547c979afdSLeon Alrae #define FCR0_FREP 29
55b4dd99a3SPetar Jovanovic #define FCR0_UFRP 28
56ba5c79f2SLeon Alrae #define FCR0_HAS2008 23
575a5012ecSths #define FCR0_F64 22
585a5012ecSths #define FCR0_L 21
595a5012ecSths #define FCR0_W 20
605a5012ecSths #define FCR0_3D 19
615a5012ecSths #define FCR0_PS 18
625a5012ecSths #define FCR0_D 17
635a5012ecSths #define FCR0_S 16
645a5012ecSths #define FCR0_PRID 8
655a5012ecSths #define FCR0_REV 0
666ea83fedSbellard /* fcsr */
67599bc5e8SAleksandar Markovic uint32_t fcr31_rw_bitmask;
686ea83fedSbellard uint32_t fcr31;
6977be4199SAleksandar Markovic #define FCR31_FS 24
70ba5c79f2SLeon Alrae #define FCR31_ABS2008 19
71ba5c79f2SLeon Alrae #define FCR31_NAN2008 18
728ebf2e1aSJules Irenge #define SET_FP_COND(num, env) do { ((env).fcr31) |= \
738ebf2e1aSJules Irenge ((num) ? (1 << ((num) + 24)) : \
748ebf2e1aSJules Irenge (1 << 23)); \
758ebf2e1aSJules Irenge } while (0)
768ebf2e1aSJules Irenge #define CLEAR_FP_COND(num, env) do { ((env).fcr31) &= \
778ebf2e1aSJules Irenge ~((num) ? (1 << ((num) + 24)) : \
788ebf2e1aSJules Irenge (1 << 23)); \
798ebf2e1aSJules Irenge } while (0)
808ebf2e1aSJules Irenge #define GET_FP_COND(env) ((((env).fcr31 >> 24) & 0xfe) | \
818ebf2e1aSJules Irenge (((env).fcr31 >> 23) & 0x1))
826ea83fedSbellard #define GET_FP_CAUSE(reg) (((reg) >> 12) & 0x3f)
836ea83fedSbellard #define GET_FP_ENABLE(reg) (((reg) >> 7) & 0x1f)
846ea83fedSbellard #define GET_FP_FLAGS(reg) (((reg) >> 2) & 0x1f)
858ebf2e1aSJules Irenge #define SET_FP_CAUSE(reg, v) do { (reg) = ((reg) & ~(0x3f << 12)) | \
868ebf2e1aSJules Irenge ((v & 0x3f) << 12); \
878ebf2e1aSJules Irenge } while (0)
888ebf2e1aSJules Irenge #define SET_FP_ENABLE(reg, v) do { (reg) = ((reg) & ~(0x1f << 7)) | \
898ebf2e1aSJules Irenge ((v & 0x1f) << 7); \
908ebf2e1aSJules Irenge } while (0)
918ebf2e1aSJules Irenge #define SET_FP_FLAGS(reg, v) do { (reg) = ((reg) & ~(0x1f << 2)) | \
928ebf2e1aSJules Irenge ((v & 0x1f) << 2); \
938ebf2e1aSJules Irenge } while (0)
945a5012ecSths #define UPDATE_FP_FLAGS(reg, v) do { (reg) |= ((v & 0x1f) << 2); } while (0)
956ea83fedSbellard #define FP_INEXACT 1
966ea83fedSbellard #define FP_UNDERFLOW 2
976ea83fedSbellard #define FP_OVERFLOW 4
986ea83fedSbellard #define FP_DIV0 8
996ea83fedSbellard #define FP_INVALID 16
1006ea83fedSbellard #define FP_UNIMPLEMENTED 32
101ead9360eSths };
1026ea83fedSbellard
103ead9360eSths typedef struct CPUMIPSMVPContext CPUMIPSMVPContext;
104ead9360eSths struct CPUMIPSMVPContext {
105ead9360eSths int32_t CP0_MVPControl;
106ead9360eSths #define CP0MVPCo_CPA 3
107ead9360eSths #define CP0MVPCo_STLB 2
108ead9360eSths #define CP0MVPCo_VPC 1
109ead9360eSths #define CP0MVPCo_EVP 0
110ead9360eSths int32_t CP0_MVPConf0;
111ead9360eSths #define CP0MVPC0_M 31
112ead9360eSths #define CP0MVPC0_TLBS 29
113ead9360eSths #define CP0MVPC0_GS 28
114ead9360eSths #define CP0MVPC0_PCP 27
115ead9360eSths #define CP0MVPC0_PTLBE 16
116ead9360eSths #define CP0MVPC0_TCA 15
117ead9360eSths #define CP0MVPC0_PVPE 10
118ead9360eSths #define CP0MVPC0_PTC 0
119ead9360eSths int32_t CP0_MVPConf1;
120ead9360eSths #define CP0MVPC1_CIM 31
121ead9360eSths #define CP0MVPC1_CIF 30
122ead9360eSths #define CP0MVPC1_PCX 20
123ead9360eSths #define CP0MVPC1_PCP2 10
124ead9360eSths #define CP0MVPC1_PCP1 0
125ead9360eSths };
126ead9360eSths
127c227f099SAnthony Liguori typedef struct mips_def_t mips_def_t;
128ead9360eSths
129ead9360eSths #define MIPS_SHADOW_SET_MAX 16
130ead9360eSths #define MIPS_TC_MAX 5
131f01be154Sths #define MIPS_FPU_MAX 1
132ead9360eSths #define MIPS_DSP_ACC 4
133e98c0d17SLeon Alrae #define MIPS_KSCRATCH_NUM 6
134f6d4dd81SYongbok Kim #define MIPS_MAAR_MAX 16 /* Must be an even number. */
135ead9360eSths
136e97a391dSYongbok Kim
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 */
5529c2149c8Sths int32_t CP0_Index;
553ead9360eSths /* CP0_MVP* are per MVP registers. */
55401bc435bSYongbok Kim int32_t CP0_VPControl;
55501bc435bSYongbok Kim #define CP0VPCtl_DIS 0
55650e7edc5SAleksandar Markovic /*
55750e7edc5SAleksandar Markovic * CP0 Register 1
55850e7edc5SAleksandar Markovic */
5599c2149c8Sths int32_t CP0_Random;
560ead9360eSths int32_t CP0_VPEControl;
561ead9360eSths #define CP0VPECo_YSI 21
562ead9360eSths #define CP0VPECo_GSI 20
563ead9360eSths #define CP0VPECo_EXCPT 16
564ead9360eSths #define CP0VPECo_TE 15
565ead9360eSths #define CP0VPECo_TargTC 0
566ead9360eSths int32_t CP0_VPEConf0;
567ead9360eSths #define CP0VPEC0_M 31
568ead9360eSths #define CP0VPEC0_XTC 21
569ead9360eSths #define CP0VPEC0_TCS 19
570ead9360eSths #define CP0VPEC0_SCS 18
571ead9360eSths #define CP0VPEC0_DSC 17
572ead9360eSths #define CP0VPEC0_ICS 16
573ead9360eSths #define CP0VPEC0_MVP 1
574ead9360eSths #define CP0VPEC0_VPA 0
575ead9360eSths int32_t CP0_VPEConf1;
576ead9360eSths #define CP0VPEC1_NCX 20
577ead9360eSths #define CP0VPEC1_NCP2 10
578ead9360eSths #define CP0VPEC1_NCP1 0
579ead9360eSths target_ulong CP0_YQMask;
580ead9360eSths target_ulong CP0_VPESchedule;
581ead9360eSths target_ulong CP0_VPEScheFBack;
582ead9360eSths int32_t CP0_VPEOpt;
583ead9360eSths #define CP0VPEOpt_IWX7 15
584ead9360eSths #define CP0VPEOpt_IWX6 14
585ead9360eSths #define CP0VPEOpt_IWX5 13
586ead9360eSths #define CP0VPEOpt_IWX4 12
587ead9360eSths #define CP0VPEOpt_IWX3 11
588ead9360eSths #define CP0VPEOpt_IWX2 10
589ead9360eSths #define CP0VPEOpt_IWX1 9
590ead9360eSths #define CP0VPEOpt_IWX0 8
591ead9360eSths #define CP0VPEOpt_DWX7 7
592ead9360eSths #define CP0VPEOpt_DWX6 6
593ead9360eSths #define CP0VPEOpt_DWX5 5
594ead9360eSths #define CP0VPEOpt_DWX4 4
595ead9360eSths #define CP0VPEOpt_DWX3 3
596ead9360eSths #define CP0VPEOpt_DWX2 2
597ead9360eSths #define CP0VPEOpt_DWX1 1
598ead9360eSths #define CP0VPEOpt_DWX0 0
59950e7edc5SAleksandar Markovic /*
60050e7edc5SAleksandar Markovic * CP0 Register 2
60150e7edc5SAleksandar Markovic */
602284b731aSLeon Alrae uint64_t CP0_EntryLo0;
60350e7edc5SAleksandar Markovic /*
60450e7edc5SAleksandar Markovic * CP0 Register 3
60550e7edc5SAleksandar Markovic */
606284b731aSLeon Alrae uint64_t CP0_EntryLo1;
6072fb58b73SLeon Alrae #if defined(TARGET_MIPS64)
6082fb58b73SLeon Alrae # define CP0EnLo_RI 63
6092fb58b73SLeon Alrae # define CP0EnLo_XI 62
6102fb58b73SLeon Alrae #else
6112fb58b73SLeon Alrae # define CP0EnLo_RI 31
6122fb58b73SLeon Alrae # define CP0EnLo_XI 30
6132fb58b73SLeon Alrae #endif
61401bc435bSYongbok Kim int32_t CP0_GlobalNumber;
61501bc435bSYongbok Kim #define CP0GN_VPId 0
61650e7edc5SAleksandar Markovic /*
61750e7edc5SAleksandar Markovic * CP0 Register 4
61850e7edc5SAleksandar Markovic */
6199c2149c8Sths target_ulong CP0_Context;
6203ef521eeSAleksandar Markovic int32_t CP0_MemoryMapID;
62150e7edc5SAleksandar Markovic /*
62250e7edc5SAleksandar Markovic * CP0 Register 5
62350e7edc5SAleksandar Markovic */
6249c2149c8Sths int32_t CP0_PageMask;
625d40b55bcSJiaxun Yang #define CP0PM_MASK 13
6267207c7f9SLeon Alrae int32_t CP0_PageGrain_rw_bitmask;
6279c2149c8Sths int32_t CP0_PageGrain;
6287207c7f9SLeon Alrae #define CP0PG_RIE 31
6297207c7f9SLeon Alrae #define CP0PG_XIE 30
630e117f526SLeon Alrae #define CP0PG_ELPA 29
63192ceb440SLeon Alrae #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 */
6919c2149c8Sths 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 */
703ead9360eSths int32_t CP0_SRSConf0_rw_bitmask;
704ead9360eSths int32_t CP0_SRSConf0;
705ead9360eSths #define CP0SRSC0_M 31
706ead9360eSths #define CP0SRSC0_SRS3 20
707ead9360eSths #define CP0SRSC0_SRS2 10
708ead9360eSths #define CP0SRSC0_SRS1 0
709ead9360eSths int32_t CP0_SRSConf1_rw_bitmask;
710ead9360eSths int32_t CP0_SRSConf1;
711ead9360eSths #define CP0SRSC1_M 31
712ead9360eSths #define CP0SRSC1_SRS6 20
713ead9360eSths #define CP0SRSC1_SRS5 10
714ead9360eSths #define CP0SRSC1_SRS4 0
715ead9360eSths int32_t CP0_SRSConf2_rw_bitmask;
716ead9360eSths int32_t CP0_SRSConf2;
717ead9360eSths #define CP0SRSC2_M 31
718ead9360eSths #define CP0SRSC2_SRS9 20
719ead9360eSths #define CP0SRSC2_SRS8 10
720ead9360eSths #define CP0SRSC2_SRS7 0
721ead9360eSths int32_t CP0_SRSConf3_rw_bitmask;
722ead9360eSths int32_t CP0_SRSConf3;
723ead9360eSths #define CP0SRSC3_M 31
724ead9360eSths #define CP0SRSC3_SRS12 20
725ead9360eSths #define CP0SRSC3_SRS11 10
726ead9360eSths #define CP0SRSC3_SRS10 0
727ead9360eSths int32_t CP0_SRSConf4_rw_bitmask;
728ead9360eSths int32_t CP0_SRSConf4;
729ead9360eSths #define CP0SRSC4_SRS15 20
730ead9360eSths #define CP0SRSC4_SRS14 10
731ead9360eSths #define CP0SRSC4_SRS13 0
73250e7edc5SAleksandar Markovic /*
73350e7edc5SAleksandar Markovic * CP0 Register 7
73450e7edc5SAleksandar Markovic */
7359c2149c8Sths int32_t CP0_HWREna;
73650e7edc5SAleksandar Markovic /*
73750e7edc5SAleksandar Markovic * CP0 Register 8
73850e7edc5SAleksandar Markovic */
739c570fd16Sths target_ulong CP0_BadVAddr;
740aea14095SLeon Alrae uint32_t CP0_BadInstr;
741aea14095SLeon Alrae uint32_t CP0_BadInstrP;
74225beba9bSStefan Markovic uint32_t CP0_BadInstrX;
74350e7edc5SAleksandar Markovic /*
74450e7edc5SAleksandar Markovic * CP0 Register 9
74550e7edc5SAleksandar Markovic */
7469c2149c8Sths 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 */
7549c2149c8Sths target_ulong CP0_EntryHi;
7559456c2fbSLeon Alrae #define CP0EnHi_EHINV 10
7566ec98bd7SPaul Burton target_ulong CP0_EntryHi_ASID_mask;
75750e7edc5SAleksandar Markovic /*
75850e7edc5SAleksandar Markovic * CP0 Register 11
75950e7edc5SAleksandar Markovic */
7609c2149c8Sths int32_t CP0_Compare;
76150e7edc5SAleksandar Markovic /*
76250e7edc5SAleksandar Markovic * CP0 Register 12
76350e7edc5SAleksandar Markovic */
7649c2149c8Sths int32_t CP0_Status;
7656af0bf9cSbellard #define CP0St_CU3 31
7666af0bf9cSbellard #define CP0St_CU2 30
7676af0bf9cSbellard #define CP0St_CU1 29
7686af0bf9cSbellard #define CP0St_CU0 28
7696af0bf9cSbellard #define CP0St_RP 27
7706ea83fedSbellard #define CP0St_FR 26
7716af0bf9cSbellard #define CP0St_RE 25
7727a387fffSths #define CP0St_MX 24
7737a387fffSths #define CP0St_PX 23
7746af0bf9cSbellard #define CP0St_BEV 22
7756af0bf9cSbellard #define CP0St_TS 21
7766af0bf9cSbellard #define CP0St_SR 20
7776af0bf9cSbellard #define CP0St_NMI 19
7786af0bf9cSbellard #define CP0St_IM 8
7797a387fffSths #define CP0St_KX 7
7807a387fffSths #define CP0St_SX 6
7817a387fffSths #define CP0St_UX 5
782623a930eSths #define CP0St_KSU 3
7836af0bf9cSbellard #define CP0St_ERL 2
7846af0bf9cSbellard #define CP0St_EXL 1
7856af0bf9cSbellard #define CP0St_IE 0
7869c2149c8Sths int32_t CP0_IntCtl;
787ead9360eSths #define CP0IntCtl_IPTI 29
78888991299SDongxue Zhang #define CP0IntCtl_IPPCI 26
789ead9360eSths #define CP0IntCtl_VS 5
7909c2149c8Sths int32_t CP0_SRSCtl;
791ead9360eSths #define CP0SRSCtl_HSS 26
792ead9360eSths #define CP0SRSCtl_EICSS 18
793ead9360eSths #define CP0SRSCtl_ESS 12
794ead9360eSths #define CP0SRSCtl_PSS 6
795ead9360eSths #define CP0SRSCtl_CSS 0
7969c2149c8Sths int32_t CP0_SRSMap;
797ead9360eSths #define CP0SRSMap_SSV7 28
798ead9360eSths #define CP0SRSMap_SSV6 24
799ead9360eSths #define CP0SRSMap_SSV5 20
800ead9360eSths #define CP0SRSMap_SSV4 16
801ead9360eSths #define CP0SRSMap_SSV3 12
802ead9360eSths #define CP0SRSMap_SSV2 8
803ead9360eSths #define CP0SRSMap_SSV1 4
804ead9360eSths #define CP0SRSMap_SSV0 0
80550e7edc5SAleksandar Markovic /*
80650e7edc5SAleksandar Markovic * CP0 Register 13
80750e7edc5SAleksandar Markovic */
8089c2149c8Sths int32_t CP0_Cause;
8097a387fffSths #define CP0Ca_BD 31
8107a387fffSths #define CP0Ca_TI 30
8117a387fffSths #define CP0Ca_CE 28
8127a387fffSths #define CP0Ca_DC 27
8137a387fffSths #define CP0Ca_PCI 26
8146af0bf9cSbellard #define CP0Ca_IV 23
8157a387fffSths #define CP0Ca_WP 22
8167a387fffSths #define CP0Ca_IP 8
8174de9b249Sths #define CP0Ca_IP_mask 0x0000FF00
8187a387fffSths #define CP0Ca_EC 2
81950e7edc5SAleksandar Markovic /*
82050e7edc5SAleksandar Markovic * CP0 Register 14
82150e7edc5SAleksandar Markovic */
822c570fd16Sths target_ulong CP0_EPC;
82350e7edc5SAleksandar Markovic /*
82450e7edc5SAleksandar Markovic * CP0 Register 15
82550e7edc5SAleksandar Markovic */
8269c2149c8Sths int32_t CP0_PRid;
82774dbf824SJames Hogan target_ulong CP0_EBase;
82874dbf824SJames Hogan target_ulong CP0_EBaseWG_rw_bitmask;
82974dbf824SJames Hogan #define CP0EBase_WG 11
830c870e3f5SYongbok Kim target_ulong CP0_CMGCRBase;
83150e7edc5SAleksandar Markovic /*
8328cd0b410SPhilippe Mathieu-Daudé * CP0 Register 16 (after Release 1)
83350e7edc5SAleksandar Markovic */
8349c2149c8Sths int32_t CP0_Config0;
8356af0bf9cSbellard #define CP0C0_M 31
8360413d7a5SAleksandar Markovic #define CP0C0_K23 28 /* 30..28 */
8370413d7a5SAleksandar Markovic #define CP0C0_KU 25 /* 27..25 */
8386af0bf9cSbellard #define CP0C0_MDU 20
839aff2bc6dSYongbok Kim #define CP0C0_MM 18
8406af0bf9cSbellard #define CP0C0_BM 16
8410413d7a5SAleksandar Markovic #define CP0C0_Impl 16 /* 24..16 */
8426af0bf9cSbellard #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 */
8467a387fffSths #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
8579c2149c8Sths int32_t CP0_Config1;
8587a387fffSths #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 */
8667a387fffSths #define CP0C1_C2 6
8677a387fffSths #define CP0C1_MD 5
8686af0bf9cSbellard #define CP0C1_PC 4
8696af0bf9cSbellard #define CP0C1_WR 3
8706af0bf9cSbellard #define CP0C1_CA 2
8716af0bf9cSbellard #define CP0C1_EP 1
8726af0bf9cSbellard #define CP0C1_FP 0
8739c2149c8Sths int32_t CP0_Config2;
8747a387fffSths #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 */
8839c2149c8Sths int32_t CP0_Config3;
8847a387fffSths #define CP0C3_M 31
88570409e67SMaciej W. Rozycki #define CP0C3_BPG 30
886c870e3f5SYongbok Kim #define CP0C3_CMGCR 29
887e97a391dSYongbok Kim #define CP0C3_MSAP 28
888aea14095SLeon Alrae #define CP0C3_BP 27
889aea14095SLeon Alrae #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 */
89570409e67SMaciej W. Rozycki #define CP0C3_MCU 17
896bbfa8f72SNathan Froyd #define CP0C3_ISA_ON_EXC 16
8970413d7a5SAleksandar Markovic #define CP0C3_ISA 14 /* 15..14 */
898d279279eSPetar Jovanovic #define CP0C3_ULRI 13
8997207c7f9SLeon Alrae #define CP0C3_RXI 12
90070409e67SMaciej W. Rozycki #define CP0C3_DSP2P 11
9017a387fffSths #define CP0C3_DSPP 10
9020413d7a5SAleksandar Markovic #define CP0C3_CTXTC 9
9030413d7a5SAleksandar Markovic #define CP0C3_ITL 8
9047a387fffSths #define CP0C3_LPA 7
9057a387fffSths #define CP0C3_VEIC 6
9067a387fffSths #define CP0C3_VInt 5
9077a387fffSths #define CP0C3_SP 4
90870409e67SMaciej W. Rozycki #define CP0C3_CDMM 3
9097a387fffSths #define CP0C3_MT 2
9107a387fffSths #define CP0C3_SM 1
9117a387fffSths #define CP0C3_TL 0
9128280b12cSMaciej W. Rozycki int32_t CP0_Config4;
9138280b12cSMaciej W. Rozycki int32_t CP0_Config4_rw_bitmask;
914b4160af1SPetar Jovanovic #define CP0C4_M 31
9150413d7a5SAleksandar Markovic #define CP0C4_IE 29 /* 30..29 */
916a0c80608SPaul Burton #define CP0C4_AE 28
9170413d7a5SAleksandar Markovic #define CP0C4_VTLBSizeExt 24 /* 27..24 */
918e98c0d17SLeon Alrae #define CP0C4_KScrExist 16
91970409e67SMaciej W. Rozycki #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 */
9268280b12cSMaciej W. Rozycki int32_t CP0_Config5;
9278280b12cSMaciej W. Rozycki int32_t CP0_Config5_rw_bitmask;
928b4dd99a3SPetar Jovanovic #define CP0C5_M 31
929b4dd99a3SPetar Jovanovic #define CP0C5_K 30
930b4dd99a3SPetar Jovanovic #define CP0C5_CV 29
931b4dd99a3SPetar Jovanovic #define CP0C5_EVA 28
932b4dd99a3SPetar Jovanovic #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
942b00c7218SYongbok Kim #define CP0C5_XNP 13
9430413d7a5SAleksandar Markovic #define CP0C5_DEC 11
9440413d7a5SAleksandar Markovic #define CP0C5_L2C 10
9457c979afdSLeon Alrae #define CP0C5_UFE 9
9467c979afdSLeon Alrae #define CP0C5_FRE 8
94701bc435bSYongbok Kim #define CP0C5_VP 7
948faf1f68bSLeon Alrae #define CP0C5_SBRI 6
9495204ea79SLeon Alrae #define CP0C5_MVH 5
950ce9782f4SLeon Alrae #define CP0C5_LLB 4
951f6d4dd81SYongbok Kim #define CP0C5_MRP 3
952b4dd99a3SPetar Jovanovic #define CP0C5_UFR 2
953b4dd99a3SPetar Jovanovic #define CP0C5_NFExists 0
954e397ee33Sths 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
979e397ee33Sths 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;
986f6d4dd81SYongbok Kim uint64_t CP0_MAAR[MIPS_MAAR_MAX];
987f6d4dd81SYongbok Kim int32_t CP0_MAARI;
988ead9360eSths /* 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 */
993590bc601SPaul Brook target_ulong llval;
9940b16dcd1SAleksandar Rikalo uint64_t llval_wp;
9950b16dcd1SAleksandar Rikalo uint32_t llnewval_wp;
996284b731aSLeon Alrae uint64_t CP0_LLAddr_rw_bitmask;
9972a6e32ddSAurelien Jarno int CP0_LLAddr_shift;
99850e7edc5SAleksandar Markovic /*
99950e7edc5SAleksandar Markovic * CP0 Register 18
100050e7edc5SAleksandar Markovic */
1001fd88b6abSths target_ulong CP0_WatchLo[8];
100250e7edc5SAleksandar Markovic /*
100350e7edc5SAleksandar Markovic * CP0 Register 19
100450e7edc5SAleksandar Markovic */
1005feafe82cSYongbok Kim uint64_t CP0_WatchHi[8];
10066ec98bd7SPaul Burton #define CP0WH_ASID 16
1007a6bc80f7SMarcin Nowakowski #define CP0WH_M 31
100850e7edc5SAleksandar Markovic /*
100950e7edc5SAleksandar Markovic * CP0 Register 20
101050e7edc5SAleksandar Markovic */
10119c2149c8Sths target_ulong CP0_XContext;
10129c2149c8Sths int32_t CP0_Framemask;
101350e7edc5SAleksandar Markovic /*
101450e7edc5SAleksandar Markovic * CP0 Register 23
101550e7edc5SAleksandar Markovic */
10169c2149c8Sths int32_t CP0_Debug;
1017ead9360eSths #define CP0DB_DBD 31
10186af0bf9cSbellard #define CP0DB_DM 30
10196af0bf9cSbellard #define CP0DB_LSNM 28
10206af0bf9cSbellard #define CP0DB_Doze 27
10216af0bf9cSbellard #define CP0DB_Halt 26
10226af0bf9cSbellard #define CP0DB_CNT 25
10236af0bf9cSbellard #define CP0DB_IBEP 24
10246af0bf9cSbellard #define CP0DB_DBEP 21
10256af0bf9cSbellard #define CP0DB_IEXI 20
10266af0bf9cSbellard #define CP0DB_VER 15
10276af0bf9cSbellard #define CP0DB_DEC 10
10286af0bf9cSbellard #define CP0DB_SSt 8
10296af0bf9cSbellard #define CP0DB_DINT 5
10306af0bf9cSbellard #define CP0DB_DIB 4
10316af0bf9cSbellard #define CP0DB_DDBS 3
10326af0bf9cSbellard #define CP0DB_DDBL 2
10336af0bf9cSbellard #define CP0DB_DBp 1
10346af0bf9cSbellard #define CP0DB_DSS 0
103550e7edc5SAleksandar Markovic /*
103650e7edc5SAleksandar Markovic * CP0 Register 24
103750e7edc5SAleksandar Markovic */
1038c570fd16Sths target_ulong CP0_DEPC;
103950e7edc5SAleksandar Markovic /*
104050e7edc5SAleksandar Markovic * CP0 Register 25
104150e7edc5SAleksandar Markovic */
10429c2149c8Sths int32_t CP0_Performance0;
104350e7edc5SAleksandar Markovic /*
104450e7edc5SAleksandar Markovic * CP0 Register 26
104550e7edc5SAleksandar Markovic */
10460d74a222SLeon Alrae int32_t CP0_ErrCtl;
10470d74a222SLeon Alrae #define CP0EC_WST 29
10480d74a222SLeon Alrae #define CP0EC_SPR 28
10490d74a222SLeon Alrae #define CP0EC_ITC 26
105050e7edc5SAleksandar Markovic /*
105150e7edc5SAleksandar Markovic * CP0 Register 28
105250e7edc5SAleksandar Markovic */
1053284b731aSLeon Alrae uint64_t CP0_TagLo;
10549c2149c8Sths int32_t CP0_DataLo;
105550e7edc5SAleksandar Markovic /*
105650e7edc5SAleksandar Markovic * CP0 Register 29
105750e7edc5SAleksandar Markovic */
10589c2149c8Sths int32_t CP0_TagHi;
10599c2149c8Sths int32_t CP0_DataHi;
106050e7edc5SAleksandar Markovic /*
106150e7edc5SAleksandar Markovic * CP0 Register 30
106250e7edc5SAleksandar Markovic */
1063c570fd16Sths target_ulong CP0_ErrorEPC;
106450e7edc5SAleksandar Markovic /*
106550e7edc5SAleksandar Markovic * CP0 Register 31
106650e7edc5SAleksandar Markovic */
10679c2149c8Sths 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
1097b5dc7732Sths /* We waste some space so we can handle shadow registers like TCs. */
1098b5dc7732Sths TCState tcs[MIPS_SHADOW_SET_MAX];
1099f01be154Sths CPUMIPSFPUContext fpus[MIPS_FPU_MAX];
11005cbdb3a3SStefan Weil /* QEMU */
11016af0bf9cSbellard int error_code;
1102aea14095SLeon Alrae #define EXCP_TLB_NOMATCH 0x1
1103aea14095SLeon Alrae #define EXCP_INST_NOTAVAIL 0x2 /* No valid instruction word for BadInstr */
11046af0bf9cSbellard uint32_t hflags; /* CPU State */
11056af0bf9cSbellard /* TMASK defines different execution modes */
11065de4359bSDragan Mladjenovic #define MIPS_HFLAG_TMASK 0x3F5807FF
110779ef2c4cSNathan Froyd #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 */
111379ef2c4cSNathan Froyd #define MIPS_HFLAG_KSU 0x00003 /* kernel/supervisor/user mode mask */
111479ef2c4cSNathan Froyd #define MIPS_HFLAG_UM 0x00002 /* user mode flag */
111579ef2c4cSNathan Froyd #define MIPS_HFLAG_SM 0x00001 /* supervisor mode flag */
111679ef2c4cSNathan Froyd #define MIPS_HFLAG_KM 0x00000 /* kernel mode flag */
111779ef2c4cSNathan Froyd #define MIPS_HFLAG_DM 0x00004 /* Debug mode */
111879ef2c4cSNathan Froyd #define MIPS_HFLAG_64 0x00008 /* 64-bit instructions enabled */
111979ef2c4cSNathan Froyd #define MIPS_HFLAG_CP0 0x00010 /* CP0 enabled */
112079ef2c4cSNathan Froyd #define MIPS_HFLAG_FPU 0x00020 /* FPU enabled */
112179ef2c4cSNathan Froyd #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 */
112779ef2c4cSNathan Froyd #define MIPS_HFLAG_COP1X 0x00080 /* COP1X instructions enabled */
112879ef2c4cSNathan Froyd #define MIPS_HFLAG_RE 0x00100 /* Reversed endianness */
112901f72885SLeon Alrae #define MIPS_HFLAG_AWRAP 0x00200 /* 32-bit compatibility address wrapping */
113079ef2c4cSNathan Froyd #define MIPS_HFLAG_M16 0x00400 /* MIPS16 mode flag */
113179ef2c4cSNathan Froyd #define MIPS_HFLAG_M16_SHIFT 10
11329e72f33dSJules Irenge /*
11339e72f33dSJules Irenge * If translation is interrupted between the branch instruction and
11344ad40f36Sbellard * the delay slot, record what type of branch it is so that we can
11354ad40f36Sbellard * resume translation properly. It might be possible to reduce
11369e72f33dSJules Irenge * this from three bits to two.
11379e72f33dSJules Irenge */
1138339cd2a8SLeon Alrae #define MIPS_HFLAG_BMASK_BASE 0x803800
113979ef2c4cSNathan Froyd #define MIPS_HFLAG_B 0x00800 /* Unconditional branch */
114079ef2c4cSNathan Froyd #define MIPS_HFLAG_BC 0x01000 /* Conditional branch */
114179ef2c4cSNathan Froyd #define MIPS_HFLAG_BL 0x01800 /* Likely branch */
114279ef2c4cSNathan Froyd #define MIPS_HFLAG_BR 0x02000 /* branch to register (can't link TB) */
114379ef2c4cSNathan Froyd /* Extra flags about the current pending branch. */
1144b231c103SYongbok Kim #define MIPS_HFLAG_BMASK_EXT 0x7C000
114579ef2c4cSNathan Froyd #define MIPS_HFLAG_B16 0x04000 /* branch instruction was 16 bits */
114679ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS16 0x08000 /* branch requires 16-bit delay slot */
114779ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS32 0x10000 /* branch requires 32-bit delay slot */
1148b231c103SYongbok Kim #define MIPS_HFLAG_BDS_STRICT 0x20000 /* Strict delay slot size */
1149b231c103SYongbok Kim #define MIPS_HFLAG_BX 0x40000 /* branch exchanges execution mode */
115079ef2c4cSNathan Froyd #define MIPS_HFLAG_BMASK (MIPS_HFLAG_BMASK_BASE | MIPS_HFLAG_BMASK_EXT)
1151853c3240SJia Liu /* 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. */
1155d279279eSPetar Jovanovic /* Extra flag about HWREna register. */
1156b231c103SYongbok Kim #define MIPS_HFLAG_HWRENA_ULR 0x200000 /* ULR bit from HWREna is set. */
1157faf1f68bSLeon Alrae #define MIPS_HFLAG_SBRI 0x400000 /* R6 SDBBP causes RI excpt. in user mode */
1158339cd2a8SLeon Alrae #define MIPS_HFLAG_FBNSLOT 0x800000 /* Forbidden slot */
1159e97a391dSYongbok Kim #define MIPS_HFLAG_MSA 0x1000000
11607c979afdSLeon Alrae #define MIPS_HFLAG_FRE 0x2000000 /* FRE enabled */
1161e117f526SLeon Alrae #define MIPS_HFLAG_ELPA 0x4000000
11620d74a222SLeon Alrae #define MIPS_HFLAG_ITC_CACHE 0x8000000 /* CACHE instr. operates on ITC tag */
116342c86612SJames Hogan #define MIPS_HFLAG_ERL 0x10000000 /* error level flag */
11646af0bf9cSbellard target_ulong btarget; /* Jump / branch target */
11651ba74fb8Saurel32 target_ulong bcond; /* Branch condition (if needed) */
1166a316d335Sbellard
11677a387fffSths int SYNCI_Step; /* Address step size for SYNCI */
11687a387fffSths int CCRes; /* Cycle count resolution/divisor */
1169ead9360eSths uint32_t CP0_Status_rw_bitmask; /* Read/write bits in CP0_Status */
1170ead9360eSths uint32_t CP0_TCStatus_rw_bitmask; /* Read/write bits in CP0_TCStatus */
1171f9c9cd63SPhilippe Mathieu-Daudé uint64_t insn_flags; /* Supported instruction set */
11727a387fffSths
11731f5c00cfSAlex Bennée /* Fields up to this point are cleared by a CPU reset */
11741f5c00cfSAlex Bennée struct {} end_reset_fields;
11751f5c00cfSAlex Bennée
1176f0c3c505SAndreas Färber /* Fields from here on are preserved across CPU reset. */
117751cc2e78SBlue Swirl CPUMIPSMVPContext *mvp;
11783c7b48b7SPaul Brook #if !defined(CONFIG_USER_ONLY)
117951cc2e78SBlue Swirl 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;
11883c7b48b7SPaul Brook #endif
118951cc2e78SBlue Swirl
1190c227f099SAnthony Liguori const mips_def_t *cpu_model;
11911246b259SStefan Weil QEMUTimer *timer; /* Internal timer */
1192b263688dSJiaxun Yang Clock *count_clock; /* CP0_Count clock */
119389777fd1SLeon Alrae target_ulong exception_base; /* ExceptionBase input to the core */
11941ea4a06aSPhilippe Mathieu-Daudé } CPUMIPSState;
11956af0bf9cSbellard
1196416bf936SPaolo Bonzini /**
1197416bf936SPaolo Bonzini * MIPSCPU:
1198416bf936SPaolo Bonzini * @env: #CPUMIPSState
1199a0713e85SPhilippe Mathieu-Daudé * @clock: this CPU input clock (may be connected
1200a0713e85SPhilippe Mathieu-Daudé * to an output clock from another device).
1201416bf936SPaolo Bonzini *
1202416bf936SPaolo Bonzini * A MIPS CPU.
1203416bf936SPaolo Bonzini */
1204b36e239eSPhilippe Mathieu-Daudé struct ArchCPU {
1205416bf936SPaolo Bonzini CPUState parent_obj;
1206416bf936SPaolo Bonzini
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;
1214416bf936SPaolo Bonzini };
1215416bf936SPaolo Bonzini
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é };
1233416bf936SPaolo Bonzini
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);
1236084d0497SRichard Henderson
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
1242623a930eSths #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)
12556ebbf390Sj_mayer {
1256b0fc6003SJames Hogan return hflags_mmu_index(env->hflags);
12576ebbf390Sj_mayer }
12586ebbf390Sj_mayer
12596af0bf9cSbellard /* Exceptions */
12606af0bf9cSbellard enum {
12616af0bf9cSbellard EXCP_NONE = -1,
12626af0bf9cSbellard EXCP_RESET = 0,
12636af0bf9cSbellard EXCP_SRESET,
12646af0bf9cSbellard EXCP_DSS,
12656af0bf9cSbellard EXCP_DINT,
126614e51cc7Sths EXCP_DDBL,
126714e51cc7Sths EXCP_DDBS,
12686af0bf9cSbellard EXCP_NMI,
12696af0bf9cSbellard EXCP_MCHECK,
127014e51cc7Sths EXCP_EXT_INTERRUPT, /* 8 */
12716af0bf9cSbellard EXCP_DFWATCH,
127214e51cc7Sths EXCP_DIB,
12736af0bf9cSbellard EXCP_IWATCH,
12746af0bf9cSbellard EXCP_AdEL,
12756af0bf9cSbellard EXCP_AdES,
12766af0bf9cSbellard EXCP_TLBF,
12776af0bf9cSbellard EXCP_IBE,
127814e51cc7Sths EXCP_DBp, /* 16 */
12796af0bf9cSbellard EXCP_SYSCALL,
128014e51cc7Sths EXCP_BREAK,
12814ad40f36Sbellard EXCP_CpU,
12826af0bf9cSbellard EXCP_RI,
12836af0bf9cSbellard EXCP_OVERFLOW,
12846af0bf9cSbellard EXCP_TRAP,
12855a5012ecSths EXCP_FPE,
128614e51cc7Sths EXCP_DWATCH, /* 24 */
12876af0bf9cSbellard EXCP_LTLBL,
12886af0bf9cSbellard EXCP_TLBL,
12896af0bf9cSbellard EXCP_TLBS,
12906af0bf9cSbellard EXCP_DBE,
1291ead9360eSths EXCP_THREAD,
129214e51cc7Sths EXCP_MDMX,
129314e51cc7Sths EXCP_C2E,
129414e51cc7Sths EXCP_CACHE, /* 32 */
1295853c3240SJia Liu EXCP_DSPDIS,
1296e97a391dSYongbok Kim EXCP_MSADIS,
1297e97a391dSYongbok Kim EXCP_MSAFPE,
129892ceb440SLeon Alrae EXCP_TLBXI,
129992ceb440SLeon Alrae EXCP_TLBRI,
13008ec7e3c5SRichard Henderson EXCP_SEMIHOST,
130114e51cc7Sths
13028ec7e3c5SRichard Henderson EXCP_LAST = EXCP_SEMIHOST,
13036af0bf9cSbellard };
13046af0bf9cSbellard
1305f249412cSEdgar E. Iglesias /*
130626aa3d9aSPhilippe Mathieu-Daudé * This is an internally generated WAKE request line.
1307f249412cSEdgar E. Iglesias * It is driven by the CPU itself. Raised when the MT
1308f249412cSEdgar E. Iglesias * block wants to wake a VPE from an inactive state and
1309f249412cSEdgar E. Iglesias * cleared when VPE goes from active to inactive.
1310f249412cSEdgar E. Iglesias */
1311f249412cSEdgar E. Iglesias #define CPU_INTERRUPT_WAKE CPU_INTERRUPT_TGT_INT_0
1312f249412cSEdgar E. Iglesias
13130dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_MIPS_CPU
1314a7519f2bSIgor Mammedov
1315ac70f976SPhilippe Mathieu-Daudé bool cpu_type_supports_cps_smp(const char *cpu_type);
1316df6adb68SPhilippe Mathieu-Daudé bool cpu_supports_isa(const CPUMIPSState *env, uint64_t isa_mask);
1317ac70f976SPhilippe Mathieu-Daudé bool cpu_type_supports_isa(const char *cpu_type, uint64_t isa);
131817c2c320SPhilippe Mathieu-Daudé
131909968fc9SPhilippe Mathieu-Daudé /* Check presence of MIPS-3D ASE */
ase_3d_available(const CPUMIPSState * env)132009968fc9SPhilippe Mathieu-Daudé static inline bool ase_3d_available(const CPUMIPSState *env)
132109968fc9SPhilippe Mathieu-Daudé {
132209968fc9SPhilippe Mathieu-Daudé return env->active_fpu.fcr0 & (1 << FCR0_3D);
132309968fc9SPhilippe Mathieu-Daudé }
132409968fc9SPhilippe Mathieu-Daudé
132525a13628SPhilippe Mathieu-Daudé /* Check presence of MSA implementation */
ase_msa_available(CPUMIPSState * env)132625a13628SPhilippe Mathieu-Daudé static inline bool ase_msa_available(CPUMIPSState *env)
132725a13628SPhilippe Mathieu-Daudé {
132825a13628SPhilippe Mathieu-Daudé return env->CP0_Config3 & (1 << CP0C3_MSAP);
132925a13628SPhilippe Mathieu-Daudé }
133025a13628SPhilippe Mathieu-Daudé
133103afdc28SJiaxun Yang /* Check presence of Loongson CSR instructions */
ase_lcsr_available(CPUMIPSState * env)133203afdc28SJiaxun Yang static inline bool ase_lcsr_available(CPUMIPSState *env)
133303afdc28SJiaxun Yang {
133403afdc28SJiaxun Yang return env->lcsr_cpucfg2 & (1 << CPUCFG2_LCSRP);
133503afdc28SJiaxun Yang }
133603afdc28SJiaxun Yang
133717c2c320SPhilippe Mathieu-Daudé /* Check presence of multi-threading ASE implementation */
ase_mt_available(CPUMIPSState * env)133817c2c320SPhilippe Mathieu-Daudé static inline bool ase_mt_available(CPUMIPSState *env)
133917c2c320SPhilippe Mathieu-Daudé {
134017c2c320SPhilippe Mathieu-Daudé return env->CP0_Config3 & (1 << CP0C3_MT);
134117c2c320SPhilippe Mathieu-Daudé }
134217c2c320SPhilippe Mathieu-Daudé
cpu_type_is_64bit(const char * cpu_type)1343b0586b38SPhilippe Mathieu-Daudé static inline bool cpu_type_is_64bit(const char *cpu_type)
1344b0586b38SPhilippe Mathieu-Daudé {
1345b0586b38SPhilippe Mathieu-Daudé return cpu_type_supports_isa(cpu_type, CPU_MIPS64);
1346b0586b38SPhilippe Mathieu-Daudé }
1347b0586b38SPhilippe Mathieu-Daudé
134889777fd1SLeon Alrae void cpu_set_exception_base(int vp_index, target_ulong address);
134930bf942dSAndreas Färber
13502fd9c5adSPhilippe Mathieu-Daudé /* addr.c */
13512fd9c5adSPhilippe Mathieu-Daudé uint64_t cpu_mips_kseg0_to_phys(void *opaque, uint64_t addr);
13522fd9c5adSPhilippe Mathieu-Daudé uint64_t cpu_mips_phys_to_kseg0(void *opaque, uint64_t addr);
13532fd9c5adSPhilippe Mathieu-Daudé
135407ae8ccdSJiaxun Yang uint64_t cpu_mips_kseg1_to_phys(void *opaque, uint64_t addr);
135507ae8ccdSJiaxun Yang uint64_t cpu_mips_phys_to_kseg1(void *opaque, uint64_t addr);
13562fd9c5adSPhilippe Mathieu-Daudé
135785ccd962SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
135885ccd962SPhilippe Mathieu-Daudé
135930a8d3a1SPhilippe Mathieu-Daudé /* HW declaration specific to the MIPS target */
13607db13faeSAndreas Färber void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level);
136130a8d3a1SPhilippe Mathieu-Daudé void cpu_mips_irq_init_cpu(MIPSCPU *cpu);
136230a8d3a1SPhilippe Mathieu-Daudé void cpu_mips_clock_init(MIPSCPU *cpu);
13635dc5d9f0SAurelien Jarno
136485ccd962SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */
136585ccd962SPhilippe Mathieu-Daudé
1366f9480ffcSths /* helper.c */
13671239b472SKwok Cheung Yeung target_ulong exception_resume_pc(CPUMIPSState *env);
1368f9480ffcSths
13697aaab96aSPhilippe Mathieu-Daudé /**
13707aaab96aSPhilippe Mathieu-Daudé * mips_cpu_create_with_clock:
13717aaab96aSPhilippe Mathieu-Daudé * @typename: a MIPS CPU type.
13727aaab96aSPhilippe Mathieu-Daudé * @cpu_refclk: this cpu input clock (an output clock of another device)
13733e8f019bSPhilippe Mathieu-Daudé * @is_big_endian: whether this CPU is configured in big endianness
13747aaab96aSPhilippe Mathieu-Daudé *
13757aaab96aSPhilippe Mathieu-Daudé * Instantiates a MIPS CPU, set the input clock of the CPU to @cpu_refclk,
13767aaab96aSPhilippe Mathieu-Daudé * then realizes the CPU.
13777aaab96aSPhilippe Mathieu-Daudé *
13787aaab96aSPhilippe Mathieu-Daudé * Returns: A #CPUState or %NULL if an error occurred.
13797aaab96aSPhilippe Mathieu-Daudé */
13803e8f019bSPhilippe Mathieu-Daudé MIPSCPU *mips_cpu_create_with_clock(const char *cpu_type, Clock *cpu_refclk,
13813e8f019bSPhilippe Mathieu-Daudé bool is_big_endian);
13827aaab96aSPhilippe Mathieu-Daudé
138307f5a258SMarkus Armbruster #endif /* MIPS_CPU_H */
1384