xref: /qemu/target/mips/cpu.h (revision 9e72f33d854b0a817c0d2fe4bca693b76f0fe776)
107f5a258SMarkus Armbruster #ifndef MIPS_CPU_H
207f5a258SMarkus Armbruster #define MIPS_CPU_H
36af0bf9cSbellard 
4d94f0a8eSPaolo Bonzini #define ALIGNED_ONLY
54ad40f36Sbellard 
69349b4f9SAndreas Färber #define CPUArchState struct CPUMIPSState
7c2764719Spbrook 
89a78eeadSStefan Weil #include "qemu-common.h"
9416bf936SPaolo Bonzini #include "cpu-qom.h"
106af0bf9cSbellard #include "mips-defs.h"
11022c62cbSPaolo Bonzini #include "exec/cpu-defs.h"
126b4c305cSPaolo Bonzini #include "fpu/softfloat.h"
136af0bf9cSbellard 
140454728cSAleksandar Markovic #define TCG_GUEST_DEFAULT_MO (0)
150454728cSAleksandar Markovic 
16ead9360eSths struct CPUMIPSState;
176af0bf9cSbellard 
18ead9360eSths typedef struct CPUMIPSTLBContext CPUMIPSTLBContext;
1951b2772fSths 
20e97a391dSYongbok Kim /* MSA Context */
21e97a391dSYongbok Kim #define MSA_WRLEN (128)
22e97a391dSYongbok Kim 
23e97a391dSYongbok Kim typedef union wr_t wr_t;
24e97a391dSYongbok Kim union wr_t {
25e97a391dSYongbok Kim     int8_t  b[MSA_WRLEN / 8];
26e97a391dSYongbok Kim     int16_t h[MSA_WRLEN / 16];
27e97a391dSYongbok Kim     int32_t w[MSA_WRLEN / 32];
28e97a391dSYongbok Kim     int64_t d[MSA_WRLEN / 64];
29e97a391dSYongbok Kim };
30e97a391dSYongbok Kim 
31c227f099SAnthony Liguori typedef union fpr_t fpr_t;
32c227f099SAnthony Liguori union fpr_t {
33ead9360eSths     float64  fd;   /* ieee double precision */
34ead9360eSths     float32  fs[2];/* ieee single precision */
35ead9360eSths     uint64_t d;    /* binary double fixed-point */
36ead9360eSths     uint32_t w[2]; /* binary single fixed-point */
37e97a391dSYongbok Kim /* FPU/MSA register mapping is not tested on big-endian hosts. */
38e97a391dSYongbok Kim     wr_t     wr;   /* vector data */
39ead9360eSths };
40*9e72f33dSJules Irenge /*
41*9e72f33dSJules Irenge  *define FP_ENDIAN_IDX to access the same location
424ff9786cSStefan Weil  * in the fpr_t union regardless of the host endianness
43ead9360eSths  */
44e2542fe2SJuan Quintela #if defined(HOST_WORDS_BIGENDIAN)
45ead9360eSths #  define FP_ENDIAN_IDX 1
46ead9360eSths #else
47ead9360eSths #  define FP_ENDIAN_IDX 0
48c570fd16Sths #endif
49ead9360eSths 
50ead9360eSths typedef struct CPUMIPSFPUContext CPUMIPSFPUContext;
51ead9360eSths struct CPUMIPSFPUContext {
526af0bf9cSbellard     /* Floating point registers */
53c227f099SAnthony Liguori     fpr_t fpr[32];
546ea83fedSbellard     float_status fp_status;
555a5012ecSths     /* fpu implementation/revision register (fir) */
566af0bf9cSbellard     uint32_t fcr0;
577c979afdSLeon Alrae #define FCR0_FREP 29
58b4dd99a3SPetar Jovanovic #define FCR0_UFRP 28
59ba5c79f2SLeon Alrae #define FCR0_HAS2008 23
605a5012ecSths #define FCR0_F64 22
615a5012ecSths #define FCR0_L 21
625a5012ecSths #define FCR0_W 20
635a5012ecSths #define FCR0_3D 19
645a5012ecSths #define FCR0_PS 18
655a5012ecSths #define FCR0_D 17
665a5012ecSths #define FCR0_S 16
675a5012ecSths #define FCR0_PRID 8
685a5012ecSths #define FCR0_REV 0
696ea83fedSbellard     /* fcsr */
70599bc5e8SAleksandar Markovic     uint32_t fcr31_rw_bitmask;
716ea83fedSbellard     uint32_t fcr31;
7277be4199SAleksandar Markovic #define FCR31_FS 24
73ba5c79f2SLeon Alrae #define FCR31_ABS2008 19
74ba5c79f2SLeon Alrae #define FCR31_NAN2008 18
758ebf2e1aSJules Irenge #define SET_FP_COND(num, env)     do { ((env).fcr31) |=                 \
768ebf2e1aSJules Irenge                                        ((num) ? (1 << ((num) + 24)) :   \
778ebf2e1aSJules Irenge                                                 (1 << 23));             \
788ebf2e1aSJules Irenge                                      } while (0)
798ebf2e1aSJules Irenge #define CLEAR_FP_COND(num, env)   do { ((env).fcr31) &=                 \
808ebf2e1aSJules Irenge                                        ~((num) ? (1 << ((num) + 24)) :  \
818ebf2e1aSJules Irenge                                                  (1 << 23));            \
828ebf2e1aSJules Irenge                                      } while (0)
838ebf2e1aSJules Irenge #define GET_FP_COND(env)         ((((env).fcr31 >> 24) & 0xfe) |        \
848ebf2e1aSJules Irenge                                  (((env).fcr31 >> 23) & 0x1))
856ea83fedSbellard #define GET_FP_CAUSE(reg)        (((reg) >> 12) & 0x3f)
866ea83fedSbellard #define GET_FP_ENABLE(reg)       (((reg) >>  7) & 0x1f)
876ea83fedSbellard #define GET_FP_FLAGS(reg)        (((reg) >>  2) & 0x1f)
888ebf2e1aSJules Irenge #define SET_FP_CAUSE(reg, v)      do { (reg) = ((reg) & ~(0x3f << 12)) | \
898ebf2e1aSJules Irenge                                                ((v & 0x3f) << 12);       \
908ebf2e1aSJules Irenge                                      } while (0)
918ebf2e1aSJules Irenge #define SET_FP_ENABLE(reg, v)     do { (reg) = ((reg) & ~(0x1f <<  7)) | \
928ebf2e1aSJules Irenge                                                ((v & 0x1f) << 7);        \
938ebf2e1aSJules Irenge                                      } while (0)
948ebf2e1aSJules Irenge #define SET_FP_FLAGS(reg, v)      do { (reg) = ((reg) & ~(0x1f <<  2)) | \
958ebf2e1aSJules Irenge                                                ((v & 0x1f) << 2);        \
968ebf2e1aSJules Irenge                                      } while (0)
975a5012ecSths #define UPDATE_FP_FLAGS(reg, v)   do { (reg) |= ((v & 0x1f) << 2); } while (0)
986ea83fedSbellard #define FP_INEXACT        1
996ea83fedSbellard #define FP_UNDERFLOW      2
1006ea83fedSbellard #define FP_OVERFLOW       4
1016ea83fedSbellard #define FP_DIV0           8
1026ea83fedSbellard #define FP_INVALID        16
1036ea83fedSbellard #define FP_UNIMPLEMENTED  32
104ead9360eSths };
1056ea83fedSbellard 
10642c86612SJames Hogan #define NB_MMU_MODES 4
107c20d594eSRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 2
1086ebbf390Sj_mayer 
109ead9360eSths typedef struct CPUMIPSMVPContext CPUMIPSMVPContext;
110ead9360eSths struct CPUMIPSMVPContext {
111ead9360eSths     int32_t CP0_MVPControl;
112ead9360eSths #define CP0MVPCo_CPA    3
113ead9360eSths #define CP0MVPCo_STLB   2
114ead9360eSths #define CP0MVPCo_VPC    1
115ead9360eSths #define CP0MVPCo_EVP    0
116ead9360eSths     int32_t CP0_MVPConf0;
117ead9360eSths #define CP0MVPC0_M      31
118ead9360eSths #define CP0MVPC0_TLBS   29
119ead9360eSths #define CP0MVPC0_GS     28
120ead9360eSths #define CP0MVPC0_PCP    27
121ead9360eSths #define CP0MVPC0_PTLBE  16
122ead9360eSths #define CP0MVPC0_TCA    15
123ead9360eSths #define CP0MVPC0_PVPE   10
124ead9360eSths #define CP0MVPC0_PTC    0
125ead9360eSths     int32_t CP0_MVPConf1;
126ead9360eSths #define CP0MVPC1_CIM    31
127ead9360eSths #define CP0MVPC1_CIF    30
128ead9360eSths #define CP0MVPC1_PCX    20
129ead9360eSths #define CP0MVPC1_PCP2   10
130ead9360eSths #define CP0MVPC1_PCP1   0
131ead9360eSths };
132ead9360eSths 
133c227f099SAnthony Liguori typedef struct mips_def_t mips_def_t;
134ead9360eSths 
135ead9360eSths #define MIPS_SHADOW_SET_MAX 16
136ead9360eSths #define MIPS_TC_MAX 5
137f01be154Sths #define MIPS_FPU_MAX 1
138ead9360eSths #define MIPS_DSP_ACC 4
139e98c0d17SLeon Alrae #define MIPS_KSCRATCH_NUM 6
140f6d4dd81SYongbok Kim #define MIPS_MAAR_MAX 16 /* Must be an even number. */
141ead9360eSths 
142e97a391dSYongbok Kim 
143a86d421eSAleksandar Markovic /*
144a86d421eSAleksandar Markovic  *     Summary of CP0 registers
145a86d421eSAleksandar Markovic  *     ========================
146a86d421eSAleksandar Markovic  *
147a86d421eSAleksandar Markovic  *
148a86d421eSAleksandar Markovic  *     Register 0        Register 1        Register 2        Register 3
149a86d421eSAleksandar Markovic  *     ----------        ----------        ----------        ----------
150a86d421eSAleksandar Markovic  *
151a86d421eSAleksandar Markovic  * 0   Index             Random            EntryLo0          EntryLo1
152a86d421eSAleksandar Markovic  * 1   MVPControl        VPEControl        TCStatus          GlobalNumber
153a86d421eSAleksandar Markovic  * 2   MVPConf0          VPEConf0          TCBind
154a86d421eSAleksandar Markovic  * 3   MVPConf1          VPEConf1          TCRestart
155a86d421eSAleksandar Markovic  * 4   VPControl         YQMask            TCHalt
156a86d421eSAleksandar Markovic  * 5                     VPESchedule       TCContext
157a86d421eSAleksandar Markovic  * 6                     VPEScheFBack      TCSchedule
158a86d421eSAleksandar Markovic  * 7                     VPEOpt            TCScheFBack       TCOpt
159a86d421eSAleksandar Markovic  *
160a86d421eSAleksandar Markovic  *
161a86d421eSAleksandar Markovic  *     Register 4        Register 5        Register 6        Register 7
162a86d421eSAleksandar Markovic  *     ----------        ----------        ----------        ----------
163a86d421eSAleksandar Markovic  *
164a86d421eSAleksandar Markovic  * 0   Context           PageMask          Wired             HWREna
165a86d421eSAleksandar Markovic  * 1   ContextConfig     PageGrain         SRSConf0
166a86d421eSAleksandar Markovic  * 2   UserLocal         SegCtl0           SRSConf1
167a86d421eSAleksandar Markovic  * 3   XContextConfig    SegCtl1           SRSConf2
168a86d421eSAleksandar Markovic  * 4   DebugContextID    SegCtl2           SRSConf3
169a86d421eSAleksandar Markovic  * 5   MemoryMapID       PWBase            SRSConf4
170a86d421eSAleksandar Markovic  * 6                     PWField           PWCtl
171a86d421eSAleksandar Markovic  * 7                     PWSize
172a86d421eSAleksandar Markovic  *
173a86d421eSAleksandar Markovic  *
174a86d421eSAleksandar Markovic  *     Register 8        Register 9        Register 10       Register 11
175a86d421eSAleksandar Markovic  *     ----------        ----------        -----------       -----------
176a86d421eSAleksandar Markovic  *
177a86d421eSAleksandar Markovic  * 0   BadVAddr          Count             EntryHi           Compare
178a86d421eSAleksandar Markovic  * 1   BadInstr
179a86d421eSAleksandar Markovic  * 2   BadInstrP
180a86d421eSAleksandar Markovic  * 3   BadInstrX
181a86d421eSAleksandar Markovic  * 4                                       GuestCtl1         GuestCtl0Ext
182a86d421eSAleksandar Markovic  * 5                                       GuestCtl2
183167db30eSYongbok Kim  * 6                     SAARI             GuestCtl3
184167db30eSYongbok Kim  * 7                     SAAR
185a86d421eSAleksandar Markovic  *
186a86d421eSAleksandar Markovic  *
187a86d421eSAleksandar Markovic  *     Register 12       Register 13       Register 14       Register 15
188a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
189a86d421eSAleksandar Markovic  *
190a86d421eSAleksandar Markovic  * 0   Status            Cause             EPC               PRId
191a86d421eSAleksandar Markovic  * 1   IntCtl                                                EBase
192a86d421eSAleksandar Markovic  * 2   SRSCtl                              NestedEPC         CDMMBase
193a86d421eSAleksandar Markovic  * 3   SRSMap                                                CMGCRBase
194a86d421eSAleksandar Markovic  * 4   View_IPL          View_RIPL                           BEVVA
195a86d421eSAleksandar Markovic  * 5   SRSMap2           NestedExc
196a86d421eSAleksandar Markovic  * 6   GuestCtl0
197a86d421eSAleksandar Markovic  * 7   GTOffset
198a86d421eSAleksandar Markovic  *
199a86d421eSAleksandar Markovic  *
200a86d421eSAleksandar Markovic  *     Register 16       Register 17       Register 18       Register 19
201a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
202a86d421eSAleksandar Markovic  *
203a86d421eSAleksandar Markovic  * 0   Config            LLAddr            WatchLo           WatchHi
204a86d421eSAleksandar Markovic  * 1   Config1           MAAR              WatchLo           WatchHi
205a86d421eSAleksandar Markovic  * 2   Config2           MAARI             WatchLo           WatchHi
206a86d421eSAleksandar Markovic  * 3   Config3                             WatchLo           WatchHi
207a86d421eSAleksandar Markovic  * 4   Config4                             WatchLo           WatchHi
208a86d421eSAleksandar Markovic  * 5   Config5                             WatchLo           WatchHi
209a86d421eSAleksandar Markovic  * 6                                       WatchLo           WatchHi
210a86d421eSAleksandar Markovic  * 7                                       WatchLo           WatchHi
211a86d421eSAleksandar Markovic  *
212a86d421eSAleksandar Markovic  *
213a86d421eSAleksandar Markovic  *     Register 20       Register 21       Register 22       Register 23
214a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
215a86d421eSAleksandar Markovic  *
216a86d421eSAleksandar Markovic  * 0   XContext                                              Debug
217a86d421eSAleksandar Markovic  * 1                                                         TraceControl
218a86d421eSAleksandar Markovic  * 2                                                         TraceControl2
219a86d421eSAleksandar Markovic  * 3                                                         UserTraceData1
220a86d421eSAleksandar Markovic  * 4                                                         TraceIBPC
221a86d421eSAleksandar Markovic  * 5                                                         TraceDBPC
222a86d421eSAleksandar Markovic  * 6                                                         Debug2
223a86d421eSAleksandar Markovic  * 7
224a86d421eSAleksandar Markovic  *
225a86d421eSAleksandar Markovic  *
226a86d421eSAleksandar Markovic  *     Register 24       Register 25       Register 26       Register 27
227a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
228a86d421eSAleksandar Markovic  *
229a86d421eSAleksandar Markovic  * 0   DEPC              PerfCnt            ErrCtl          CacheErr
230a86d421eSAleksandar Markovic  * 1                     PerfCnt
231a86d421eSAleksandar Markovic  * 2   TraceControl3     PerfCnt
232a86d421eSAleksandar Markovic  * 3   UserTraceData2    PerfCnt
233a86d421eSAleksandar Markovic  * 4                     PerfCnt
234a86d421eSAleksandar Markovic  * 5                     PerfCnt
235a86d421eSAleksandar Markovic  * 6                     PerfCnt
236a86d421eSAleksandar Markovic  * 7                     PerfCnt
237a86d421eSAleksandar Markovic  *
238a86d421eSAleksandar Markovic  *
239a86d421eSAleksandar Markovic  *     Register 28       Register 29       Register 30       Register 31
240a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
241a86d421eSAleksandar Markovic  *
242a86d421eSAleksandar Markovic  * 0   DataLo            DataHi            ErrorEPC          DESAVE
243a86d421eSAleksandar Markovic  * 1   TagLo             TagHi
244a86d421eSAleksandar Markovic  * 2   DataLo            DataHi                              KScratch<n>
245a86d421eSAleksandar Markovic  * 3   TagLo             TagHi                               KScratch<n>
246a86d421eSAleksandar Markovic  * 4   DataLo            DataHi                              KScratch<n>
247a86d421eSAleksandar Markovic  * 5   TagLo             TagHi                               KScratch<n>
248a86d421eSAleksandar Markovic  * 6   DataLo            DataHi                              KScratch<n>
249a86d421eSAleksandar Markovic  * 7   TagLo             TagHi                               KScratch<n>
250a86d421eSAleksandar Markovic  *
251a86d421eSAleksandar Markovic  */
25204992c8cSAleksandar Markovic #define CP0_REGISTER_00     0
25304992c8cSAleksandar Markovic #define CP0_REGISTER_01     1
25404992c8cSAleksandar Markovic #define CP0_REGISTER_02     2
25504992c8cSAleksandar Markovic #define CP0_REGISTER_03     3
25604992c8cSAleksandar Markovic #define CP0_REGISTER_04     4
25704992c8cSAleksandar Markovic #define CP0_REGISTER_05     5
25804992c8cSAleksandar Markovic #define CP0_REGISTER_06     6
25904992c8cSAleksandar Markovic #define CP0_REGISTER_07     7
26004992c8cSAleksandar Markovic #define CP0_REGISTER_08     8
26104992c8cSAleksandar Markovic #define CP0_REGISTER_09     9
26204992c8cSAleksandar Markovic #define CP0_REGISTER_10    10
26304992c8cSAleksandar Markovic #define CP0_REGISTER_11    11
26404992c8cSAleksandar Markovic #define CP0_REGISTER_12    12
26504992c8cSAleksandar Markovic #define CP0_REGISTER_13    13
26604992c8cSAleksandar Markovic #define CP0_REGISTER_14    14
26704992c8cSAleksandar Markovic #define CP0_REGISTER_15    15
26804992c8cSAleksandar Markovic #define CP0_REGISTER_16    16
26904992c8cSAleksandar Markovic #define CP0_REGISTER_17    17
27004992c8cSAleksandar Markovic #define CP0_REGISTER_18    18
27104992c8cSAleksandar Markovic #define CP0_REGISTER_19    19
27204992c8cSAleksandar Markovic #define CP0_REGISTER_20    20
27304992c8cSAleksandar Markovic #define CP0_REGISTER_21    21
27404992c8cSAleksandar Markovic #define CP0_REGISTER_22    22
27504992c8cSAleksandar Markovic #define CP0_REGISTER_23    23
27604992c8cSAleksandar Markovic #define CP0_REGISTER_24    24
27704992c8cSAleksandar Markovic #define CP0_REGISTER_25    25
27804992c8cSAleksandar Markovic #define CP0_REGISTER_26    26
27904992c8cSAleksandar Markovic #define CP0_REGISTER_27    27
28004992c8cSAleksandar Markovic #define CP0_REGISTER_28    28
28104992c8cSAleksandar Markovic #define CP0_REGISTER_29    29
28204992c8cSAleksandar Markovic #define CP0_REGISTER_30    30
28304992c8cSAleksandar Markovic #define CP0_REGISTER_31    31
28404992c8cSAleksandar Markovic 
28504992c8cSAleksandar Markovic 
28604992c8cSAleksandar Markovic /* CP0 Register 00 */
28704992c8cSAleksandar Markovic #define CP0_REG00__INDEX           0
28804992c8cSAleksandar Markovic #define CP0_REG00__VPCONTROL       4
28904992c8cSAleksandar Markovic /* CP0 Register 01 */
29004992c8cSAleksandar Markovic /* CP0 Register 02 */
29104992c8cSAleksandar Markovic #define CP0_REG02__ENTRYLO0        0
29204992c8cSAleksandar Markovic /* CP0 Register 03 */
29304992c8cSAleksandar Markovic #define CP0_REG03__ENTRYLO1        0
29404992c8cSAleksandar Markovic #define CP0_REG03__GLOBALNUM       1
29504992c8cSAleksandar Markovic /* CP0 Register 04 */
29604992c8cSAleksandar Markovic #define CP0_REG04__CONTEXT         0
29704992c8cSAleksandar Markovic #define CP0_REG04__USERLOCAL       2
29804992c8cSAleksandar Markovic #define CP0_REG04__DBGCONTEXTID    4
29904992c8cSAleksandar Markovic #define CP0_REG00__MMID            5
30004992c8cSAleksandar Markovic /* CP0 Register 05 */
30104992c8cSAleksandar Markovic #define CP0_REG05__PAGEMASK        0
30204992c8cSAleksandar Markovic #define CP0_REG05__PAGEGRAIN       1
30304992c8cSAleksandar Markovic /* CP0 Register 06 */
30404992c8cSAleksandar Markovic #define CP0_REG06__WIRED           0
30504992c8cSAleksandar Markovic /* CP0 Register 07 */
30604992c8cSAleksandar Markovic #define CP0_REG07__HWRENA          0
30704992c8cSAleksandar Markovic /* CP0 Register 08 */
30804992c8cSAleksandar Markovic #define CP0_REG08__BADVADDR        0
30904992c8cSAleksandar Markovic #define CP0_REG08__BADINSTR        1
31004992c8cSAleksandar Markovic #define CP0_REG08__BADINSTRP       2
31104992c8cSAleksandar Markovic /* CP0 Register 09 */
31204992c8cSAleksandar Markovic #define CP0_REG09__COUNT           0
31304992c8cSAleksandar Markovic #define CP0_REG09__SAARI           6
31404992c8cSAleksandar Markovic #define CP0_REG09__SAAR            7
31504992c8cSAleksandar Markovic /* CP0 Register 10 */
31604992c8cSAleksandar Markovic #define CP0_REG10__ENTRYHI         0
31704992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL1       4
31804992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL2       5
31904992c8cSAleksandar Markovic /* CP0 Register 11 */
32004992c8cSAleksandar Markovic #define CP0_REG11__COMPARE         0
32104992c8cSAleksandar Markovic #define CP0_REG11__GUESTCTL0EXT    4
32204992c8cSAleksandar Markovic /* CP0 Register 12 */
32304992c8cSAleksandar Markovic #define CP0_REG12__STATUS          0
32404992c8cSAleksandar Markovic #define CP0_REG12__INTCTL          1
32504992c8cSAleksandar Markovic #define CP0_REG12__SRSCTL          2
32604992c8cSAleksandar Markovic #define CP0_REG12__GUESTCTL0       6
32704992c8cSAleksandar Markovic #define CP0_REG12__GTOFFSET        7
32804992c8cSAleksandar Markovic /* CP0 Register 13 */
32904992c8cSAleksandar Markovic #define CP0_REG13__CAUSE           0
33004992c8cSAleksandar Markovic /* CP0 Register 14 */
33104992c8cSAleksandar Markovic #define CP0_REG14__EPC             0
33204992c8cSAleksandar Markovic /* CP0 Register 15 */
33304992c8cSAleksandar Markovic #define CP0_REG15__PRID            0
33404992c8cSAleksandar Markovic #define CP0_REG15__EBASE           1
33504992c8cSAleksandar Markovic #define CP0_REG15__CDMMBASE        2
33604992c8cSAleksandar Markovic #define CP0_REG15__CMGCRBASE       3
33704992c8cSAleksandar Markovic /* CP0 Register 16 */
33804992c8cSAleksandar Markovic #define CP0_REG16__CONFIG          0
33904992c8cSAleksandar Markovic #define CP0_REG16__CONFIG1         1
34004992c8cSAleksandar Markovic #define CP0_REG16__CONFIG2         2
34104992c8cSAleksandar Markovic #define CP0_REG16__CONFIG3         3
34204992c8cSAleksandar Markovic #define CP0_REG16__CONFIG4         4
34304992c8cSAleksandar Markovic #define CP0_REG16__CONFIG5         5
34404992c8cSAleksandar Markovic #define CP0_REG00__CONFIG7         7
34504992c8cSAleksandar Markovic /* CP0 Register 17 */
34604992c8cSAleksandar Markovic #define CP0_REG17__LLADDR          0
34704992c8cSAleksandar Markovic #define CP0_REG17__MAAR            1
34804992c8cSAleksandar Markovic #define CP0_REG17__MAARI           2
34904992c8cSAleksandar Markovic /* CP0 Register 18 */
35004992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO0        0
35104992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO1        1
35204992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO2        2
35304992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO3        3
35404992c8cSAleksandar Markovic /* CP0 Register 19 */
35504992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI0        0
35604992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI1        1
35704992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI2        2
35804992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI3        3
35904992c8cSAleksandar Markovic /* CP0 Register 20 */
36004992c8cSAleksandar Markovic #define CP0_REG20__XCONTEXT        0
36104992c8cSAleksandar Markovic /* CP0 Register 21 */
36204992c8cSAleksandar Markovic /* CP0 Register 22 */
36304992c8cSAleksandar Markovic /* CP0 Register 23 */
36404992c8cSAleksandar Markovic #define CP0_REG23__DEBUG           0
36504992c8cSAleksandar Markovic /* CP0 Register 24 */
36604992c8cSAleksandar Markovic #define CP0_REG24__DEPC            0
36704992c8cSAleksandar Markovic /* CP0 Register 25 */
36804992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL0        0
36904992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT0        1
37004992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL1        2
37104992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT1        3
37204992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL2        4
37304992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT2        5
37404992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL3        6
37504992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT3        7
37604992c8cSAleksandar Markovic /* CP0 Register 26 */
37704992c8cSAleksandar Markovic #define CP0_REG00__ERRCTL          0
37804992c8cSAleksandar Markovic /* CP0 Register 27 */
37904992c8cSAleksandar Markovic #define CP0_REG27__CACHERR         0
38004992c8cSAleksandar Markovic /* CP0 Register 28 */
38104992c8cSAleksandar Markovic #define CP0_REG28__ITAGLO          0
38204992c8cSAleksandar Markovic #define CP0_REG28__IDATALO         1
38304992c8cSAleksandar Markovic #define CP0_REG28__DTAGLO          2
38404992c8cSAleksandar Markovic #define CP0_REG28__DDATALO         3
38504992c8cSAleksandar Markovic /* CP0 Register 29 */
38604992c8cSAleksandar Markovic #define CP0_REG29__IDATAHI         1
38704992c8cSAleksandar Markovic #define CP0_REG29__DDATAHI         3
38804992c8cSAleksandar Markovic /* CP0 Register 30 */
38904992c8cSAleksandar Markovic #define CP0_REG30__ERROREPC        0
39004992c8cSAleksandar Markovic /* CP0 Register 31 */
39104992c8cSAleksandar Markovic #define CP0_REG31__DESAVE          0
39204992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH1       2
39304992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH2       3
39404992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH3       4
39504992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH4       5
39604992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH5       6
39704992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH6       7
398ea9c5e83SAleksandar Markovic 
399ea9c5e83SAleksandar Markovic 
400ea9c5e83SAleksandar Markovic typedef struct TCState TCState;
401ea9c5e83SAleksandar Markovic struct TCState {
402ea9c5e83SAleksandar Markovic     target_ulong gpr[32];
403ea9c5e83SAleksandar Markovic     target_ulong PC;
404ea9c5e83SAleksandar Markovic     target_ulong HI[MIPS_DSP_ACC];
405ea9c5e83SAleksandar Markovic     target_ulong LO[MIPS_DSP_ACC];
406ea9c5e83SAleksandar Markovic     target_ulong ACX[MIPS_DSP_ACC];
407ea9c5e83SAleksandar Markovic     target_ulong DSPControl;
408ea9c5e83SAleksandar Markovic     int32_t CP0_TCStatus;
409ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU3    31
410ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU2    30
411ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU1    29
412ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU0    28
413ea9c5e83SAleksandar Markovic #define CP0TCSt_TMX     27
414ea9c5e83SAleksandar Markovic #define CP0TCSt_RNST    23
415ea9c5e83SAleksandar Markovic #define CP0TCSt_TDS     21
416ea9c5e83SAleksandar Markovic #define CP0TCSt_DT      20
417ea9c5e83SAleksandar Markovic #define CP0TCSt_DA      15
418ea9c5e83SAleksandar Markovic #define CP0TCSt_A       13
419ea9c5e83SAleksandar Markovic #define CP0TCSt_TKSU    11
420ea9c5e83SAleksandar Markovic #define CP0TCSt_IXMT    10
421ea9c5e83SAleksandar Markovic #define CP0TCSt_TASID   0
422ea9c5e83SAleksandar Markovic     int32_t CP0_TCBind;
423ea9c5e83SAleksandar Markovic #define CP0TCBd_CurTC   21
424ea9c5e83SAleksandar Markovic #define CP0TCBd_TBE     17
425ea9c5e83SAleksandar Markovic #define CP0TCBd_CurVPE  0
426ea9c5e83SAleksandar Markovic     target_ulong CP0_TCHalt;
427ea9c5e83SAleksandar Markovic     target_ulong CP0_TCContext;
428ea9c5e83SAleksandar Markovic     target_ulong CP0_TCSchedule;
429ea9c5e83SAleksandar Markovic     target_ulong CP0_TCScheFBack;
430ea9c5e83SAleksandar Markovic     int32_t CP0_Debug_tcstatus;
431ea9c5e83SAleksandar Markovic     target_ulong CP0_UserLocal;
432ea9c5e83SAleksandar Markovic 
433ea9c5e83SAleksandar Markovic     int32_t msacsr;
434ea9c5e83SAleksandar Markovic 
435ea9c5e83SAleksandar Markovic #define MSACSR_FS       24
436ea9c5e83SAleksandar Markovic #define MSACSR_FS_MASK  (1 << MSACSR_FS)
437ea9c5e83SAleksandar Markovic #define MSACSR_NX       18
438ea9c5e83SAleksandar Markovic #define MSACSR_NX_MASK  (1 << MSACSR_NX)
439ea9c5e83SAleksandar Markovic #define MSACSR_CEF      2
440ea9c5e83SAleksandar Markovic #define MSACSR_CEF_MASK (0xffff << MSACSR_CEF)
441ea9c5e83SAleksandar Markovic #define MSACSR_RM       0
442ea9c5e83SAleksandar Markovic #define MSACSR_RM_MASK  (0x3 << MSACSR_RM)
443ea9c5e83SAleksandar Markovic #define MSACSR_MASK     (MSACSR_RM_MASK | MSACSR_CEF_MASK | MSACSR_NX_MASK | \
444ea9c5e83SAleksandar Markovic         MSACSR_FS_MASK)
445ea9c5e83SAleksandar Markovic 
446ea9c5e83SAleksandar Markovic     float_status msa_fp_status;
447ea9c5e83SAleksandar Markovic 
448a168a796SFredrik Noring     /* Upper 64-bit MMRs (multimedia registers); the lower 64-bit are GPRs */
449a168a796SFredrik Noring     uint64_t mmr[32];
450a168a796SFredrik Noring 
451ea9c5e83SAleksandar Markovic #define NUMBER_OF_MXU_REGISTERS 16
452ea9c5e83SAleksandar Markovic     target_ulong mxu_gpr[NUMBER_OF_MXU_REGISTERS - 1];
453ea9c5e83SAleksandar Markovic     target_ulong mxu_cr;
454ea9c5e83SAleksandar Markovic #define MXU_CR_LC       31
455ea9c5e83SAleksandar Markovic #define MXU_CR_RC       30
456ea9c5e83SAleksandar Markovic #define MXU_CR_BIAS     2
457ea9c5e83SAleksandar Markovic #define MXU_CR_RD_EN    1
458ea9c5e83SAleksandar Markovic #define MXU_CR_MXU_EN   0
459ea9c5e83SAleksandar Markovic 
460ea9c5e83SAleksandar Markovic };
461ea9c5e83SAleksandar Markovic 
462043715d1SYongbok Kim struct MIPSITUState;
463ea9c5e83SAleksandar Markovic typedef struct CPUMIPSState CPUMIPSState;
464ea9c5e83SAleksandar Markovic struct CPUMIPSState {
465ea9c5e83SAleksandar Markovic     TCState active_tc;
466ea9c5e83SAleksandar Markovic     CPUMIPSFPUContext active_fpu;
467ea9c5e83SAleksandar Markovic 
468ea9c5e83SAleksandar Markovic     uint32_t current_tc;
469ea9c5e83SAleksandar Markovic     uint32_t current_fpu;
470ea9c5e83SAleksandar Markovic 
471ea9c5e83SAleksandar Markovic     uint32_t SEGBITS;
472ea9c5e83SAleksandar Markovic     uint32_t PABITS;
473ea9c5e83SAleksandar Markovic #if defined(TARGET_MIPS64)
474ea9c5e83SAleksandar Markovic # define PABITS_BASE 36
475ea9c5e83SAleksandar Markovic #else
476ea9c5e83SAleksandar Markovic # define PABITS_BASE 32
477ea9c5e83SAleksandar Markovic #endif
478ea9c5e83SAleksandar Markovic     target_ulong SEGMask;
479ea9c5e83SAleksandar Markovic     uint64_t PAMask;
480ea9c5e83SAleksandar Markovic #define PAMASK_BASE ((1ULL << PABITS_BASE) - 1)
481ea9c5e83SAleksandar Markovic 
482ea9c5e83SAleksandar Markovic     int32_t msair;
483ea9c5e83SAleksandar Markovic #define MSAIR_ProcID    8
484ea9c5e83SAleksandar Markovic #define MSAIR_Rev       0
485ea9c5e83SAleksandar Markovic 
48650e7edc5SAleksandar Markovic /*
48750e7edc5SAleksandar Markovic  * CP0 Register 0
48850e7edc5SAleksandar Markovic  */
4899c2149c8Sths     int32_t CP0_Index;
490ead9360eSths     /* CP0_MVP* are per MVP registers. */
49101bc435bSYongbok Kim     int32_t CP0_VPControl;
49201bc435bSYongbok Kim #define CP0VPCtl_DIS    0
49350e7edc5SAleksandar Markovic /*
49450e7edc5SAleksandar Markovic  * CP0 Register 1
49550e7edc5SAleksandar Markovic  */
4969c2149c8Sths     int32_t CP0_Random;
497ead9360eSths     int32_t CP0_VPEControl;
498ead9360eSths #define CP0VPECo_YSI    21
499ead9360eSths #define CP0VPECo_GSI    20
500ead9360eSths #define CP0VPECo_EXCPT  16
501ead9360eSths #define CP0VPECo_TE     15
502ead9360eSths #define CP0VPECo_TargTC 0
503ead9360eSths     int32_t CP0_VPEConf0;
504ead9360eSths #define CP0VPEC0_M      31
505ead9360eSths #define CP0VPEC0_XTC    21
506ead9360eSths #define CP0VPEC0_TCS    19
507ead9360eSths #define CP0VPEC0_SCS    18
508ead9360eSths #define CP0VPEC0_DSC    17
509ead9360eSths #define CP0VPEC0_ICS    16
510ead9360eSths #define CP0VPEC0_MVP    1
511ead9360eSths #define CP0VPEC0_VPA    0
512ead9360eSths     int32_t CP0_VPEConf1;
513ead9360eSths #define CP0VPEC1_NCX    20
514ead9360eSths #define CP0VPEC1_NCP2   10
515ead9360eSths #define CP0VPEC1_NCP1   0
516ead9360eSths     target_ulong CP0_YQMask;
517ead9360eSths     target_ulong CP0_VPESchedule;
518ead9360eSths     target_ulong CP0_VPEScheFBack;
519ead9360eSths     int32_t CP0_VPEOpt;
520ead9360eSths #define CP0VPEOpt_IWX7  15
521ead9360eSths #define CP0VPEOpt_IWX6  14
522ead9360eSths #define CP0VPEOpt_IWX5  13
523ead9360eSths #define CP0VPEOpt_IWX4  12
524ead9360eSths #define CP0VPEOpt_IWX3  11
525ead9360eSths #define CP0VPEOpt_IWX2  10
526ead9360eSths #define CP0VPEOpt_IWX1  9
527ead9360eSths #define CP0VPEOpt_IWX0  8
528ead9360eSths #define CP0VPEOpt_DWX7  7
529ead9360eSths #define CP0VPEOpt_DWX6  6
530ead9360eSths #define CP0VPEOpt_DWX5  5
531ead9360eSths #define CP0VPEOpt_DWX4  4
532ead9360eSths #define CP0VPEOpt_DWX3  3
533ead9360eSths #define CP0VPEOpt_DWX2  2
534ead9360eSths #define CP0VPEOpt_DWX1  1
535ead9360eSths #define CP0VPEOpt_DWX0  0
53650e7edc5SAleksandar Markovic /*
53750e7edc5SAleksandar Markovic  * CP0 Register 2
53850e7edc5SAleksandar Markovic  */
539284b731aSLeon Alrae     uint64_t CP0_EntryLo0;
54050e7edc5SAleksandar Markovic /*
54150e7edc5SAleksandar Markovic  * CP0 Register 3
54250e7edc5SAleksandar Markovic  */
543284b731aSLeon Alrae     uint64_t CP0_EntryLo1;
5442fb58b73SLeon Alrae #if defined(TARGET_MIPS64)
5452fb58b73SLeon Alrae # define CP0EnLo_RI 63
5462fb58b73SLeon Alrae # define CP0EnLo_XI 62
5472fb58b73SLeon Alrae #else
5482fb58b73SLeon Alrae # define CP0EnLo_RI 31
5492fb58b73SLeon Alrae # define CP0EnLo_XI 30
5502fb58b73SLeon Alrae #endif
55101bc435bSYongbok Kim     int32_t CP0_GlobalNumber;
55201bc435bSYongbok Kim #define CP0GN_VPId 0
55350e7edc5SAleksandar Markovic /*
55450e7edc5SAleksandar Markovic  * CP0 Register 4
55550e7edc5SAleksandar Markovic  */
5569c2149c8Sths     target_ulong CP0_Context;
557e98c0d17SLeon Alrae     target_ulong CP0_KScratch[MIPS_KSCRATCH_NUM];
5583ef521eeSAleksandar Markovic     int32_t CP0_MemoryMapID;
55950e7edc5SAleksandar Markovic /*
56050e7edc5SAleksandar Markovic  * CP0 Register 5
56150e7edc5SAleksandar Markovic  */
5629c2149c8Sths     int32_t CP0_PageMask;
5637207c7f9SLeon Alrae     int32_t CP0_PageGrain_rw_bitmask;
5649c2149c8Sths     int32_t CP0_PageGrain;
5657207c7f9SLeon Alrae #define CP0PG_RIE 31
5667207c7f9SLeon Alrae #define CP0PG_XIE 30
567e117f526SLeon Alrae #define CP0PG_ELPA 29
56892ceb440SLeon Alrae #define CP0PG_IEC 27
569cec56a73SJames Hogan     target_ulong CP0_SegCtl0;
570cec56a73SJames Hogan     target_ulong CP0_SegCtl1;
571cec56a73SJames Hogan     target_ulong CP0_SegCtl2;
572cec56a73SJames Hogan #define CP0SC_PA        9
573cec56a73SJames Hogan #define CP0SC_PA_MASK   (0x7FULL << CP0SC_PA)
574cec56a73SJames Hogan #define CP0SC_PA_1GMASK (0x7EULL << CP0SC_PA)
575cec56a73SJames Hogan #define CP0SC_AM        4
576cec56a73SJames Hogan #define CP0SC_AM_MASK   (0x7ULL << CP0SC_AM)
577cec56a73SJames Hogan #define CP0SC_AM_UK     0ULL
578cec56a73SJames Hogan #define CP0SC_AM_MK     1ULL
579cec56a73SJames Hogan #define CP0SC_AM_MSK    2ULL
580cec56a73SJames Hogan #define CP0SC_AM_MUSK   3ULL
581cec56a73SJames Hogan #define CP0SC_AM_MUSUK  4ULL
582cec56a73SJames Hogan #define CP0SC_AM_USK    5ULL
583cec56a73SJames Hogan #define CP0SC_AM_UUSK   7ULL
584cec56a73SJames Hogan #define CP0SC_EU        3
585cec56a73SJames Hogan #define CP0SC_EU_MASK   (1ULL << CP0SC_EU)
586cec56a73SJames Hogan #define CP0SC_C         0
587cec56a73SJames Hogan #define CP0SC_C_MASK    (0x7ULL << CP0SC_C)
588cec56a73SJames Hogan #define CP0SC_MASK      (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \
589cec56a73SJames Hogan                          CP0SC_PA_MASK)
590cec56a73SJames Hogan #define CP0SC_1GMASK    (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \
591cec56a73SJames Hogan                          CP0SC_PA_1GMASK)
592cec56a73SJames Hogan #define CP0SC0_MASK     (CP0SC_MASK | (CP0SC_MASK << 16))
593cec56a73SJames Hogan #define CP0SC1_XAM      59
594cec56a73SJames Hogan #define CP0SC1_XAM_MASK (0x7ULL << CP0SC1_XAM)
595cec56a73SJames Hogan #define CP0SC1_MASK     (CP0SC_MASK | (CP0SC_MASK << 16) | CP0SC1_XAM_MASK)
596cec56a73SJames Hogan #define CP0SC2_XR       56
597cec56a73SJames Hogan #define CP0SC2_XR_MASK  (0xFFULL << CP0SC2_XR)
598cec56a73SJames Hogan #define CP0SC2_MASK     (CP0SC_1GMASK | (CP0SC_1GMASK << 16) | CP0SC2_XR_MASK)
5995e31fdd5SYongbok Kim     target_ulong CP0_PWBase;
600fa75ad14SYongbok Kim     target_ulong CP0_PWField;
601fa75ad14SYongbok Kim #if defined(TARGET_MIPS64)
602fa75ad14SYongbok Kim #define CP0PF_BDI  32    /* 37..32 */
603fa75ad14SYongbok Kim #define CP0PF_GDI  24    /* 29..24 */
604fa75ad14SYongbok Kim #define CP0PF_UDI  18    /* 23..18 */
605fa75ad14SYongbok Kim #define CP0PF_MDI  12    /* 17..12 */
606fa75ad14SYongbok Kim #define CP0PF_PTI  6     /* 11..6  */
607fa75ad14SYongbok Kim #define CP0PF_PTEI 0     /*  5..0  */
608fa75ad14SYongbok Kim #else
609fa75ad14SYongbok Kim #define CP0PF_GDW  24    /* 29..24 */
610fa75ad14SYongbok Kim #define CP0PF_UDW  18    /* 23..18 */
611fa75ad14SYongbok Kim #define CP0PF_MDW  12    /* 17..12 */
612fa75ad14SYongbok Kim #define CP0PF_PTW  6     /* 11..6  */
613fa75ad14SYongbok Kim #define CP0PF_PTEW 0     /*  5..0  */
614fa75ad14SYongbok Kim #endif
61520b28ebcSYongbok Kim     target_ulong CP0_PWSize;
61620b28ebcSYongbok Kim #if defined(TARGET_MIPS64)
61720b28ebcSYongbok Kim #define CP0PS_BDW  32    /* 37..32 */
61820b28ebcSYongbok Kim #endif
61920b28ebcSYongbok Kim #define CP0PS_PS   30
62020b28ebcSYongbok Kim #define CP0PS_GDW  24    /* 29..24 */
62120b28ebcSYongbok Kim #define CP0PS_UDW  18    /* 23..18 */
62220b28ebcSYongbok Kim #define CP0PS_MDW  12    /* 17..12 */
62320b28ebcSYongbok Kim #define CP0PS_PTW  6     /* 11..6  */
62420b28ebcSYongbok Kim #define CP0PS_PTEW 0     /*  5..0  */
62550e7edc5SAleksandar Markovic /*
62650e7edc5SAleksandar Markovic  * CP0 Register 6
62750e7edc5SAleksandar Markovic  */
6289c2149c8Sths     int32_t CP0_Wired;
629103be64cSYongbok Kim     int32_t CP0_PWCtl;
630103be64cSYongbok Kim #define CP0PC_PWEN      31
631103be64cSYongbok Kim #if defined(TARGET_MIPS64)
632103be64cSYongbok Kim #define CP0PC_PWDIREXT  30
633103be64cSYongbok Kim #define CP0PC_XK        28
634103be64cSYongbok Kim #define CP0PC_XS        27
635103be64cSYongbok Kim #define CP0PC_XU        26
636103be64cSYongbok Kim #endif
637103be64cSYongbok Kim #define CP0PC_DPH       7
638103be64cSYongbok Kim #define CP0PC_HUGEPG    6
639103be64cSYongbok Kim #define CP0PC_PSN       0     /*  5..0  */
640ead9360eSths     int32_t CP0_SRSConf0_rw_bitmask;
641ead9360eSths     int32_t CP0_SRSConf0;
642ead9360eSths #define CP0SRSC0_M      31
643ead9360eSths #define CP0SRSC0_SRS3   20
644ead9360eSths #define CP0SRSC0_SRS2   10
645ead9360eSths #define CP0SRSC0_SRS1   0
646ead9360eSths     int32_t CP0_SRSConf1_rw_bitmask;
647ead9360eSths     int32_t CP0_SRSConf1;
648ead9360eSths #define CP0SRSC1_M      31
649ead9360eSths #define CP0SRSC1_SRS6   20
650ead9360eSths #define CP0SRSC1_SRS5   10
651ead9360eSths #define CP0SRSC1_SRS4   0
652ead9360eSths     int32_t CP0_SRSConf2_rw_bitmask;
653ead9360eSths     int32_t CP0_SRSConf2;
654ead9360eSths #define CP0SRSC2_M      31
655ead9360eSths #define CP0SRSC2_SRS9   20
656ead9360eSths #define CP0SRSC2_SRS8   10
657ead9360eSths #define CP0SRSC2_SRS7   0
658ead9360eSths     int32_t CP0_SRSConf3_rw_bitmask;
659ead9360eSths     int32_t CP0_SRSConf3;
660ead9360eSths #define CP0SRSC3_M      31
661ead9360eSths #define CP0SRSC3_SRS12  20
662ead9360eSths #define CP0SRSC3_SRS11  10
663ead9360eSths #define CP0SRSC3_SRS10  0
664ead9360eSths     int32_t CP0_SRSConf4_rw_bitmask;
665ead9360eSths     int32_t CP0_SRSConf4;
666ead9360eSths #define CP0SRSC4_SRS15  20
667ead9360eSths #define CP0SRSC4_SRS14  10
668ead9360eSths #define CP0SRSC4_SRS13  0
66950e7edc5SAleksandar Markovic /*
67050e7edc5SAleksandar Markovic  * CP0 Register 7
67150e7edc5SAleksandar Markovic  */
6729c2149c8Sths     int32_t CP0_HWREna;
67350e7edc5SAleksandar Markovic /*
67450e7edc5SAleksandar Markovic  * CP0 Register 8
67550e7edc5SAleksandar Markovic  */
676c570fd16Sths     target_ulong CP0_BadVAddr;
677aea14095SLeon Alrae     uint32_t CP0_BadInstr;
678aea14095SLeon Alrae     uint32_t CP0_BadInstrP;
67925beba9bSStefan Markovic     uint32_t CP0_BadInstrX;
68050e7edc5SAleksandar Markovic /*
68150e7edc5SAleksandar Markovic  * CP0 Register 9
68250e7edc5SAleksandar Markovic  */
6839c2149c8Sths     int32_t CP0_Count;
684167db30eSYongbok Kim     uint32_t CP0_SAARI;
685167db30eSYongbok Kim #define CP0SAARI_TARGET 0    /*  5..0  */
686167db30eSYongbok Kim     uint64_t CP0_SAAR[2];
687167db30eSYongbok Kim #define CP0SAAR_BASE    12   /* 43..12 */
688167db30eSYongbok Kim #define CP0SAAR_SIZE    1    /*  5..1  */
689167db30eSYongbok Kim #define CP0SAAR_EN      0
69050e7edc5SAleksandar Markovic /*
69150e7edc5SAleksandar Markovic  * CP0 Register 10
69250e7edc5SAleksandar Markovic  */
6939c2149c8Sths     target_ulong CP0_EntryHi;
6949456c2fbSLeon Alrae #define CP0EnHi_EHINV 10
6956ec98bd7SPaul Burton     target_ulong CP0_EntryHi_ASID_mask;
69650e7edc5SAleksandar Markovic /*
69750e7edc5SAleksandar Markovic  * CP0 Register 11
69850e7edc5SAleksandar Markovic  */
6999c2149c8Sths     int32_t CP0_Compare;
70050e7edc5SAleksandar Markovic /*
70150e7edc5SAleksandar Markovic  * CP0 Register 12
70250e7edc5SAleksandar Markovic  */
7039c2149c8Sths     int32_t CP0_Status;
7046af0bf9cSbellard #define CP0St_CU3   31
7056af0bf9cSbellard #define CP0St_CU2   30
7066af0bf9cSbellard #define CP0St_CU1   29
7076af0bf9cSbellard #define CP0St_CU0   28
7086af0bf9cSbellard #define CP0St_RP    27
7096ea83fedSbellard #define CP0St_FR    26
7106af0bf9cSbellard #define CP0St_RE    25
7117a387fffSths #define CP0St_MX    24
7127a387fffSths #define CP0St_PX    23
7136af0bf9cSbellard #define CP0St_BEV   22
7146af0bf9cSbellard #define CP0St_TS    21
7156af0bf9cSbellard #define CP0St_SR    20
7166af0bf9cSbellard #define CP0St_NMI   19
7176af0bf9cSbellard #define CP0St_IM    8
7187a387fffSths #define CP0St_KX    7
7197a387fffSths #define CP0St_SX    6
7207a387fffSths #define CP0St_UX    5
721623a930eSths #define CP0St_KSU   3
7226af0bf9cSbellard #define CP0St_ERL   2
7236af0bf9cSbellard #define CP0St_EXL   1
7246af0bf9cSbellard #define CP0St_IE    0
7259c2149c8Sths     int32_t CP0_IntCtl;
726ead9360eSths #define CP0IntCtl_IPTI 29
72788991299SDongxue Zhang #define CP0IntCtl_IPPCI 26
728ead9360eSths #define CP0IntCtl_VS 5
7299c2149c8Sths     int32_t CP0_SRSCtl;
730ead9360eSths #define CP0SRSCtl_HSS 26
731ead9360eSths #define CP0SRSCtl_EICSS 18
732ead9360eSths #define CP0SRSCtl_ESS 12
733ead9360eSths #define CP0SRSCtl_PSS 6
734ead9360eSths #define CP0SRSCtl_CSS 0
7359c2149c8Sths     int32_t CP0_SRSMap;
736ead9360eSths #define CP0SRSMap_SSV7 28
737ead9360eSths #define CP0SRSMap_SSV6 24
738ead9360eSths #define CP0SRSMap_SSV5 20
739ead9360eSths #define CP0SRSMap_SSV4 16
740ead9360eSths #define CP0SRSMap_SSV3 12
741ead9360eSths #define CP0SRSMap_SSV2 8
742ead9360eSths #define CP0SRSMap_SSV1 4
743ead9360eSths #define CP0SRSMap_SSV0 0
74450e7edc5SAleksandar Markovic /*
74550e7edc5SAleksandar Markovic  * CP0 Register 13
74650e7edc5SAleksandar Markovic  */
7479c2149c8Sths     int32_t CP0_Cause;
7487a387fffSths #define CP0Ca_BD   31
7497a387fffSths #define CP0Ca_TI   30
7507a387fffSths #define CP0Ca_CE   28
7517a387fffSths #define CP0Ca_DC   27
7527a387fffSths #define CP0Ca_PCI  26
7536af0bf9cSbellard #define CP0Ca_IV   23
7547a387fffSths #define CP0Ca_WP   22
7557a387fffSths #define CP0Ca_IP    8
7564de9b249Sths #define CP0Ca_IP_mask 0x0000FF00
7577a387fffSths #define CP0Ca_EC    2
75850e7edc5SAleksandar Markovic /*
75950e7edc5SAleksandar Markovic  * CP0 Register 14
76050e7edc5SAleksandar Markovic  */
761c570fd16Sths     target_ulong CP0_EPC;
76250e7edc5SAleksandar Markovic /*
76350e7edc5SAleksandar Markovic  * CP0 Register 15
76450e7edc5SAleksandar Markovic  */
7659c2149c8Sths     int32_t CP0_PRid;
76674dbf824SJames Hogan     target_ulong CP0_EBase;
76774dbf824SJames Hogan     target_ulong CP0_EBaseWG_rw_bitmask;
76874dbf824SJames Hogan #define CP0EBase_WG 11
769c870e3f5SYongbok Kim     target_ulong CP0_CMGCRBase;
77050e7edc5SAleksandar Markovic /*
77150e7edc5SAleksandar Markovic  * CP0 Register 16
77250e7edc5SAleksandar Markovic  */
7739c2149c8Sths     int32_t CP0_Config0;
7746af0bf9cSbellard #define CP0C0_M    31
7750413d7a5SAleksandar Markovic #define CP0C0_K23  28    /* 30..28 */
7760413d7a5SAleksandar Markovic #define CP0C0_KU   25    /* 27..25 */
7776af0bf9cSbellard #define CP0C0_MDU  20
778aff2bc6dSYongbok Kim #define CP0C0_MM   18
7796af0bf9cSbellard #define CP0C0_BM   16
7800413d7a5SAleksandar Markovic #define CP0C0_Impl 16    /* 24..16 */
7816af0bf9cSbellard #define CP0C0_BE   15
7820413d7a5SAleksandar Markovic #define CP0C0_AT   13    /* 14..13 */
7830413d7a5SAleksandar Markovic #define CP0C0_AR   10    /* 12..10 */
7840413d7a5SAleksandar Markovic #define CP0C0_MT   7     /*  9..7  */
7857a387fffSths #define CP0C0_VI   3
7860413d7a5SAleksandar Markovic #define CP0C0_K0   0     /*  2..0  */
7879c2149c8Sths     int32_t CP0_Config1;
7887a387fffSths #define CP0C1_M    31
7890413d7a5SAleksandar Markovic #define CP0C1_MMU  25    /* 30..25 */
7900413d7a5SAleksandar Markovic #define CP0C1_IS   22    /* 24..22 */
7910413d7a5SAleksandar Markovic #define CP0C1_IL   19    /* 21..19 */
7920413d7a5SAleksandar Markovic #define CP0C1_IA   16    /* 18..16 */
7930413d7a5SAleksandar Markovic #define CP0C1_DS   13    /* 15..13 */
7940413d7a5SAleksandar Markovic #define CP0C1_DL   10    /* 12..10 */
7950413d7a5SAleksandar Markovic #define CP0C1_DA   7     /*  9..7  */
7967a387fffSths #define CP0C1_C2   6
7977a387fffSths #define CP0C1_MD   5
7986af0bf9cSbellard #define CP0C1_PC   4
7996af0bf9cSbellard #define CP0C1_WR   3
8006af0bf9cSbellard #define CP0C1_CA   2
8016af0bf9cSbellard #define CP0C1_EP   1
8026af0bf9cSbellard #define CP0C1_FP   0
8039c2149c8Sths     int32_t CP0_Config2;
8047a387fffSths #define CP0C2_M    31
8050413d7a5SAleksandar Markovic #define CP0C2_TU   28    /* 30..28 */
8060413d7a5SAleksandar Markovic #define CP0C2_TS   24    /* 27..24 */
8070413d7a5SAleksandar Markovic #define CP0C2_TL   20    /* 23..20 */
8080413d7a5SAleksandar Markovic #define CP0C2_TA   16    /* 19..16 */
8090413d7a5SAleksandar Markovic #define CP0C2_SU   12    /* 15..12 */
8100413d7a5SAleksandar Markovic #define CP0C2_SS   8     /* 11..8  */
8110413d7a5SAleksandar Markovic #define CP0C2_SL   4     /*  7..4  */
8120413d7a5SAleksandar Markovic #define CP0C2_SA   0     /*  3..0  */
8139c2149c8Sths     int32_t CP0_Config3;
8147a387fffSths #define CP0C3_M            31
81570409e67SMaciej W. Rozycki #define CP0C3_BPG          30
816c870e3f5SYongbok Kim #define CP0C3_CMGCR        29
817e97a391dSYongbok Kim #define CP0C3_MSAP         28
818aea14095SLeon Alrae #define CP0C3_BP           27
819aea14095SLeon Alrae #define CP0C3_BI           26
82074dbf824SJames Hogan #define CP0C3_SC           25
8210413d7a5SAleksandar Markovic #define CP0C3_PW           24
8220413d7a5SAleksandar Markovic #define CP0C3_VZ           23
8230413d7a5SAleksandar Markovic #define CP0C3_IPLV         21    /* 22..21 */
8240413d7a5SAleksandar Markovic #define CP0C3_MMAR         18    /* 20..18 */
82570409e67SMaciej W. Rozycki #define CP0C3_MCU          17
826bbfa8f72SNathan Froyd #define CP0C3_ISA_ON_EXC   16
8270413d7a5SAleksandar Markovic #define CP0C3_ISA          14    /* 15..14 */
828d279279eSPetar Jovanovic #define CP0C3_ULRI         13
8297207c7f9SLeon Alrae #define CP0C3_RXI          12
83070409e67SMaciej W. Rozycki #define CP0C3_DSP2P        11
8317a387fffSths #define CP0C3_DSPP         10
8320413d7a5SAleksandar Markovic #define CP0C3_CTXTC        9
8330413d7a5SAleksandar Markovic #define CP0C3_ITL          8
8347a387fffSths #define CP0C3_LPA          7
8357a387fffSths #define CP0C3_VEIC         6
8367a387fffSths #define CP0C3_VInt         5
8377a387fffSths #define CP0C3_SP           4
83870409e67SMaciej W. Rozycki #define CP0C3_CDMM         3
8397a387fffSths #define CP0C3_MT           2
8407a387fffSths #define CP0C3_SM           1
8417a387fffSths #define CP0C3_TL           0
8428280b12cSMaciej W. Rozycki     int32_t CP0_Config4;
8438280b12cSMaciej W. Rozycki     int32_t CP0_Config4_rw_bitmask;
844b4160af1SPetar Jovanovic #define CP0C4_M            31
8450413d7a5SAleksandar Markovic #define CP0C4_IE           29    /* 30..29 */
846a0c80608SPaul Burton #define CP0C4_AE           28
8470413d7a5SAleksandar Markovic #define CP0C4_VTLBSizeExt  24    /* 27..24 */
848e98c0d17SLeon Alrae #define CP0C4_KScrExist    16
84970409e67SMaciej W. Rozycki #define CP0C4_MMUExtDef    14
8500413d7a5SAleksandar Markovic #define CP0C4_FTLBPageSize 8     /* 12..8  */
8510413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=1 */
8520413d7a5SAleksandar Markovic #define CP0C4_MMUSizeExt   0     /*  7..0  */
8530413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=2 */
8540413d7a5SAleksandar Markovic #define CP0C4_FTLBWays     4     /*  7..4  */
8550413d7a5SAleksandar Markovic #define CP0C4_FTLBSets     0     /*  3..0  */
8568280b12cSMaciej W. Rozycki     int32_t CP0_Config5;
8578280b12cSMaciej W. Rozycki     int32_t CP0_Config5_rw_bitmask;
858b4dd99a3SPetar Jovanovic #define CP0C5_M            31
859b4dd99a3SPetar Jovanovic #define CP0C5_K            30
860b4dd99a3SPetar Jovanovic #define CP0C5_CV           29
861b4dd99a3SPetar Jovanovic #define CP0C5_EVA          28
862b4dd99a3SPetar Jovanovic #define CP0C5_MSAEn        27
8630413d7a5SAleksandar Markovic #define CP0C5_PMJ          23    /* 25..23 */
8640413d7a5SAleksandar Markovic #define CP0C5_WR2          22
8650413d7a5SAleksandar Markovic #define CP0C5_NMS          21
8660413d7a5SAleksandar Markovic #define CP0C5_ULS          20
8670413d7a5SAleksandar Markovic #define CP0C5_XPA          19
8680413d7a5SAleksandar Markovic #define CP0C5_CRCP         18
8690413d7a5SAleksandar Markovic #define CP0C5_MI           17
8700413d7a5SAleksandar Markovic #define CP0C5_GI           15    /* 16..15 */
8710413d7a5SAleksandar Markovic #define CP0C5_CA2          14
872b00c7218SYongbok Kim #define CP0C5_XNP          13
8730413d7a5SAleksandar Markovic #define CP0C5_DEC          11
8740413d7a5SAleksandar Markovic #define CP0C5_L2C          10
8757c979afdSLeon Alrae #define CP0C5_UFE          9
8767c979afdSLeon Alrae #define CP0C5_FRE          8
87701bc435bSYongbok Kim #define CP0C5_VP           7
878faf1f68bSLeon Alrae #define CP0C5_SBRI         6
8795204ea79SLeon Alrae #define CP0C5_MVH          5
880ce9782f4SLeon Alrae #define CP0C5_LLB          4
881f6d4dd81SYongbok Kim #define CP0C5_MRP          3
882b4dd99a3SPetar Jovanovic #define CP0C5_UFR          2
883b4dd99a3SPetar Jovanovic #define CP0C5_NFExists     0
884e397ee33Sths     int32_t CP0_Config6;
885e397ee33Sths     int32_t CP0_Config7;
886c7c7e1e9SLeon Alrae     uint64_t CP0_LLAddr;
887f6d4dd81SYongbok Kim     uint64_t CP0_MAAR[MIPS_MAAR_MAX];
888f6d4dd81SYongbok Kim     int32_t CP0_MAARI;
889ead9360eSths     /* XXX: Maybe make LLAddr per-TC? */
89050e7edc5SAleksandar Markovic /*
89150e7edc5SAleksandar Markovic  * CP0 Register 17
89250e7edc5SAleksandar Markovic  */
893c7c7e1e9SLeon Alrae     target_ulong lladdr; /* LL virtual address compared against SC */
894590bc601SPaul Brook     target_ulong llval;
8950b16dcd1SAleksandar Rikalo     uint64_t llval_wp;
8960b16dcd1SAleksandar Rikalo     uint32_t llnewval_wp;
897284b731aSLeon Alrae     uint64_t CP0_LLAddr_rw_bitmask;
8982a6e32ddSAurelien Jarno     int CP0_LLAddr_shift;
89950e7edc5SAleksandar Markovic /*
90050e7edc5SAleksandar Markovic  * CP0 Register 18
90150e7edc5SAleksandar Markovic  */
902fd88b6abSths     target_ulong CP0_WatchLo[8];
90350e7edc5SAleksandar Markovic /*
90450e7edc5SAleksandar Markovic  * CP0 Register 19
90550e7edc5SAleksandar Markovic  */
906fd88b6abSths     int32_t CP0_WatchHi[8];
9076ec98bd7SPaul Burton #define CP0WH_ASID 16
90850e7edc5SAleksandar Markovic /*
90950e7edc5SAleksandar Markovic  * CP0 Register 20
91050e7edc5SAleksandar Markovic  */
9119c2149c8Sths     target_ulong CP0_XContext;
9129c2149c8Sths     int32_t CP0_Framemask;
91350e7edc5SAleksandar Markovic /*
91450e7edc5SAleksandar Markovic  * CP0 Register 23
91550e7edc5SAleksandar Markovic  */
9169c2149c8Sths     int32_t CP0_Debug;
917ead9360eSths #define CP0DB_DBD  31
9186af0bf9cSbellard #define CP0DB_DM   30
9196af0bf9cSbellard #define CP0DB_LSNM 28
9206af0bf9cSbellard #define CP0DB_Doze 27
9216af0bf9cSbellard #define CP0DB_Halt 26
9226af0bf9cSbellard #define CP0DB_CNT  25
9236af0bf9cSbellard #define CP0DB_IBEP 24
9246af0bf9cSbellard #define CP0DB_DBEP 21
9256af0bf9cSbellard #define CP0DB_IEXI 20
9266af0bf9cSbellard #define CP0DB_VER  15
9276af0bf9cSbellard #define CP0DB_DEC  10
9286af0bf9cSbellard #define CP0DB_SSt  8
9296af0bf9cSbellard #define CP0DB_DINT 5
9306af0bf9cSbellard #define CP0DB_DIB  4
9316af0bf9cSbellard #define CP0DB_DDBS 3
9326af0bf9cSbellard #define CP0DB_DDBL 2
9336af0bf9cSbellard #define CP0DB_DBp  1
9346af0bf9cSbellard #define CP0DB_DSS  0
93550e7edc5SAleksandar Markovic /*
93650e7edc5SAleksandar Markovic  * CP0 Register 24
93750e7edc5SAleksandar Markovic  */
938c570fd16Sths     target_ulong CP0_DEPC;
93950e7edc5SAleksandar Markovic /*
94050e7edc5SAleksandar Markovic  * CP0 Register 25
94150e7edc5SAleksandar Markovic  */
9429c2149c8Sths     int32_t CP0_Performance0;
94350e7edc5SAleksandar Markovic /*
94450e7edc5SAleksandar Markovic  * CP0 Register 26
94550e7edc5SAleksandar Markovic  */
9460d74a222SLeon Alrae     int32_t CP0_ErrCtl;
9470d74a222SLeon Alrae #define CP0EC_WST 29
9480d74a222SLeon Alrae #define CP0EC_SPR 28
9490d74a222SLeon Alrae #define CP0EC_ITC 26
95050e7edc5SAleksandar Markovic /*
95150e7edc5SAleksandar Markovic  * CP0 Register 28
95250e7edc5SAleksandar Markovic  */
953284b731aSLeon Alrae     uint64_t CP0_TagLo;
9549c2149c8Sths     int32_t CP0_DataLo;
95550e7edc5SAleksandar Markovic /*
95650e7edc5SAleksandar Markovic  * CP0 Register 29
95750e7edc5SAleksandar Markovic  */
9589c2149c8Sths     int32_t CP0_TagHi;
9599c2149c8Sths     int32_t CP0_DataHi;
96050e7edc5SAleksandar Markovic /*
96150e7edc5SAleksandar Markovic  * CP0 Register 30
96250e7edc5SAleksandar Markovic  */
963c570fd16Sths     target_ulong CP0_ErrorEPC;
96450e7edc5SAleksandar Markovic /*
96550e7edc5SAleksandar Markovic  * CP0 Register 31
96650e7edc5SAleksandar Markovic  */
9679c2149c8Sths     int32_t CP0_DESAVE;
96850e7edc5SAleksandar Markovic 
969b5dc7732Sths     /* We waste some space so we can handle shadow registers like TCs. */
970b5dc7732Sths     TCState tcs[MIPS_SHADOW_SET_MAX];
971f01be154Sths     CPUMIPSFPUContext fpus[MIPS_FPU_MAX];
9725cbdb3a3SStefan Weil     /* QEMU */
9736af0bf9cSbellard     int error_code;
974aea14095SLeon Alrae #define EXCP_TLB_NOMATCH   0x1
975aea14095SLeon Alrae #define EXCP_INST_NOTAVAIL 0x2 /* No valid instruction word for BadInstr */
9766af0bf9cSbellard     uint32_t hflags;    /* CPU State */
9776af0bf9cSbellard     /* TMASK defines different execution modes */
97842c86612SJames Hogan #define MIPS_HFLAG_TMASK  0x1F5807FF
97979ef2c4cSNathan Froyd #define MIPS_HFLAG_MODE   0x00007 /* execution modes                    */
980*9e72f33dSJules Irenge     /*
981*9e72f33dSJules Irenge      * The KSU flags must be the lowest bits in hflags. The flag order
982*9e72f33dSJules Irenge      * must be the same as defined for CP0 Status. This allows to use
983*9e72f33dSJules Irenge      * the bits as the value of mmu_idx.
984*9e72f33dSJules Irenge      */
98579ef2c4cSNathan Froyd #define MIPS_HFLAG_KSU    0x00003 /* kernel/supervisor/user mode mask   */
98679ef2c4cSNathan Froyd #define MIPS_HFLAG_UM     0x00002 /* user mode flag                     */
98779ef2c4cSNathan Froyd #define MIPS_HFLAG_SM     0x00001 /* supervisor mode flag               */
98879ef2c4cSNathan Froyd #define MIPS_HFLAG_KM     0x00000 /* kernel mode flag                   */
98979ef2c4cSNathan Froyd #define MIPS_HFLAG_DM     0x00004 /* Debug mode                         */
99079ef2c4cSNathan Froyd #define MIPS_HFLAG_64     0x00008 /* 64-bit instructions enabled        */
99179ef2c4cSNathan Froyd #define MIPS_HFLAG_CP0    0x00010 /* CP0 enabled                        */
99279ef2c4cSNathan Froyd #define MIPS_HFLAG_FPU    0x00020 /* FPU enabled                        */
99379ef2c4cSNathan Froyd #define MIPS_HFLAG_F64    0x00040 /* 64-bit FPU enabled                 */
994*9e72f33dSJules Irenge     /*
995*9e72f33dSJules Irenge      * True if the MIPS IV COP1X instructions can be used.  This also
996*9e72f33dSJules Irenge      * controls the non-COP1X instructions RECIP.S, RECIP.D, RSQRT.S
997*9e72f33dSJules Irenge      * and RSQRT.D.
998*9e72f33dSJules Irenge      */
99979ef2c4cSNathan Froyd #define MIPS_HFLAG_COP1X  0x00080 /* COP1X instructions enabled         */
100079ef2c4cSNathan Froyd #define MIPS_HFLAG_RE     0x00100 /* Reversed endianness                */
100101f72885SLeon Alrae #define MIPS_HFLAG_AWRAP  0x00200 /* 32-bit compatibility address wrapping */
100279ef2c4cSNathan Froyd #define MIPS_HFLAG_M16    0x00400 /* MIPS16 mode flag                   */
100379ef2c4cSNathan Froyd #define MIPS_HFLAG_M16_SHIFT 10
1004*9e72f33dSJules Irenge     /*
1005*9e72f33dSJules Irenge      * If translation is interrupted between the branch instruction and
10064ad40f36Sbellard      * the delay slot, record what type of branch it is so that we can
10074ad40f36Sbellard      * resume translation properly.  It might be possible to reduce
1008*9e72f33dSJules Irenge      * this from three bits to two.
1009*9e72f33dSJules Irenge      */
1010339cd2a8SLeon Alrae #define MIPS_HFLAG_BMASK_BASE  0x803800
101179ef2c4cSNathan Froyd #define MIPS_HFLAG_B      0x00800 /* Unconditional branch               */
101279ef2c4cSNathan Froyd #define MIPS_HFLAG_BC     0x01000 /* Conditional branch                 */
101379ef2c4cSNathan Froyd #define MIPS_HFLAG_BL     0x01800 /* Likely branch                      */
101479ef2c4cSNathan Froyd #define MIPS_HFLAG_BR     0x02000 /* branch to register (can't link TB) */
101579ef2c4cSNathan Froyd     /* Extra flags about the current pending branch.  */
1016b231c103SYongbok Kim #define MIPS_HFLAG_BMASK_EXT 0x7C000
101779ef2c4cSNathan Froyd #define MIPS_HFLAG_B16    0x04000 /* branch instruction was 16 bits     */
101879ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS16  0x08000 /* branch requires 16-bit delay slot  */
101979ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS32  0x10000 /* branch requires 32-bit delay slot  */
1020b231c103SYongbok Kim #define MIPS_HFLAG_BDS_STRICT  0x20000 /* Strict delay slot size */
1021b231c103SYongbok Kim #define MIPS_HFLAG_BX     0x40000 /* branch exchanges execution mode    */
102279ef2c4cSNathan Froyd #define MIPS_HFLAG_BMASK  (MIPS_HFLAG_BMASK_BASE | MIPS_HFLAG_BMASK_EXT)
1023853c3240SJia Liu     /* MIPS DSP resources access. */
1024908f6be1SStefan Markovic #define MIPS_HFLAG_DSP    0x080000   /* Enable access to DSP resources.    */
1025908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R2 0x100000   /* Enable access to DSP R2 resources. */
1026908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R3 0x20000000 /* Enable access to DSP R3 resources. */
1027d279279eSPetar Jovanovic     /* Extra flag about HWREna register. */
1028b231c103SYongbok Kim #define MIPS_HFLAG_HWRENA_ULR 0x200000 /* ULR bit from HWREna is set. */
1029faf1f68bSLeon Alrae #define MIPS_HFLAG_SBRI  0x400000 /* R6 SDBBP causes RI excpt. in user mode */
1030339cd2a8SLeon Alrae #define MIPS_HFLAG_FBNSLOT 0x800000 /* Forbidden slot                   */
1031e97a391dSYongbok Kim #define MIPS_HFLAG_MSA   0x1000000
10327c979afdSLeon Alrae #define MIPS_HFLAG_FRE   0x2000000 /* FRE enabled */
1033e117f526SLeon Alrae #define MIPS_HFLAG_ELPA  0x4000000
10340d74a222SLeon Alrae #define MIPS_HFLAG_ITC_CACHE  0x8000000 /* CACHE instr. operates on ITC tag */
103542c86612SJames Hogan #define MIPS_HFLAG_ERL   0x10000000 /* error level flag */
10366af0bf9cSbellard     target_ulong btarget;        /* Jump / branch target               */
10371ba74fb8Saurel32     target_ulong bcond;          /* Branch condition (if needed)       */
1038a316d335Sbellard 
10397a387fffSths     int SYNCI_Step; /* Address step size for SYNCI */
10407a387fffSths     int CCRes; /* Cycle count resolution/divisor */
1041ead9360eSths     uint32_t CP0_Status_rw_bitmask; /* Read/write bits in CP0_Status */
1042ead9360eSths     uint32_t CP0_TCStatus_rw_bitmask; /* Read/write bits in CP0_TCStatus */
1043f9c9cd63SPhilippe Mathieu-Daudé     uint64_t insn_flags; /* Supported instruction set */
10445fb2dcd1SYongbok Kim     int saarp;
10457a387fffSths 
10461f5c00cfSAlex Bennée     /* Fields up to this point are cleared by a CPU reset */
10471f5c00cfSAlex Bennée     struct {} end_reset_fields;
10481f5c00cfSAlex Bennée 
1049a316d335Sbellard     CPU_COMMON
10506ae81775Sths 
1051f0c3c505SAndreas Färber     /* Fields from here on are preserved across CPU reset. */
105251cc2e78SBlue Swirl     CPUMIPSMVPContext *mvp;
10533c7b48b7SPaul Brook #if !defined(CONFIG_USER_ONLY)
105451cc2e78SBlue Swirl     CPUMIPSTLBContext *tlb;
10553c7b48b7SPaul Brook #endif
105651cc2e78SBlue Swirl 
1057c227f099SAnthony Liguori     const mips_def_t *cpu_model;
105833ac7f16Sths     void *irq[8];
10591246b259SStefan Weil     QEMUTimer *timer; /* Internal timer */
1060043715d1SYongbok Kim     struct MIPSITUState *itu;
106134fa7e83SLeon Alrae     MemoryRegion *itc_tag; /* ITC Configuration Tags */
106289777fd1SLeon Alrae     target_ulong exception_base; /* ExceptionBase input to the core */
10636af0bf9cSbellard };
10646af0bf9cSbellard 
1065416bf936SPaolo Bonzini /**
1066416bf936SPaolo Bonzini  * MIPSCPU:
1067416bf936SPaolo Bonzini  * @env: #CPUMIPSState
1068416bf936SPaolo Bonzini  *
1069416bf936SPaolo Bonzini  * A MIPS CPU.
1070416bf936SPaolo Bonzini  */
1071416bf936SPaolo Bonzini struct MIPSCPU {
1072416bf936SPaolo Bonzini     /*< private >*/
1073416bf936SPaolo Bonzini     CPUState parent_obj;
1074416bf936SPaolo Bonzini     /*< public >*/
1075416bf936SPaolo Bonzini 
1076416bf936SPaolo Bonzini     CPUMIPSState env;
1077416bf936SPaolo Bonzini };
1078416bf936SPaolo Bonzini 
1079416bf936SPaolo Bonzini static inline MIPSCPU *mips_env_get_cpu(CPUMIPSState *env)
1080416bf936SPaolo Bonzini {
1081416bf936SPaolo Bonzini     return container_of(env, MIPSCPU, env);
1082416bf936SPaolo Bonzini }
1083416bf936SPaolo Bonzini 
1084416bf936SPaolo Bonzini #define ENV_GET_CPU(e) CPU(mips_env_get_cpu(e))
1085416bf936SPaolo Bonzini 
1086416bf936SPaolo Bonzini #define ENV_OFFSET offsetof(MIPSCPU, env)
1087416bf936SPaolo Bonzini 
10880442428aSMarkus Armbruster void mips_cpu_list(void);
1089647de6caSths 
10909467d44cSths #define cpu_signal_handler cpu_mips_signal_handler
1091c732abe2Sj_mayer #define cpu_list mips_cpu_list
10929467d44cSths 
1093084d0497SRichard Henderson extern void cpu_wrdsp(uint32_t rs, uint32_t mask_num, CPUMIPSState *env);
1094084d0497SRichard Henderson extern uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env);
1095084d0497SRichard Henderson 
1096*9e72f33dSJules Irenge /*
1097*9e72f33dSJules Irenge  * MMU modes definitions. We carefully match the indices with our
1098*9e72f33dSJules Irenge  * hflags layout.
1099*9e72f33dSJules Irenge  */
11006ebbf390Sj_mayer #define MMU_MODE0_SUFFIX _kernel
1101623a930eSths #define MMU_MODE1_SUFFIX _super
1102623a930eSths #define MMU_MODE2_SUFFIX _user
110342c86612SJames Hogan #define MMU_MODE3_SUFFIX _error
1104623a930eSths #define MMU_USER_IDX 2
1105b0fc6003SJames Hogan 
1106b0fc6003SJames Hogan static inline int hflags_mmu_index(uint32_t hflags)
1107b0fc6003SJames Hogan {
110842c86612SJames Hogan     if (hflags & MIPS_HFLAG_ERL) {
110942c86612SJames Hogan         return 3; /* ERL */
111042c86612SJames Hogan     } else {
1111b0fc6003SJames Hogan         return hflags & MIPS_HFLAG_KSU;
1112b0fc6003SJames Hogan     }
111342c86612SJames Hogan }
1114b0fc6003SJames Hogan 
111597ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
11166ebbf390Sj_mayer {
1117b0fc6003SJames Hogan     return hflags_mmu_index(env->hflags);
11186ebbf390Sj_mayer }
11196ebbf390Sj_mayer 
1120022c62cbSPaolo Bonzini #include "exec/cpu-all.h"
11216af0bf9cSbellard 
1122*9e72f33dSJules Irenge /*
1123*9e72f33dSJules Irenge  * Memory access type :
11246af0bf9cSbellard  * may be needed for precise access rights control and precise exceptions.
11256af0bf9cSbellard  */
11266af0bf9cSbellard enum {
11276af0bf9cSbellard     /* 1 bit to define user level / supervisor access */
11286af0bf9cSbellard     ACCESS_USER  = 0x00,
11296af0bf9cSbellard     ACCESS_SUPER = 0x01,
11306af0bf9cSbellard     /* 1 bit to indicate direction */
11316af0bf9cSbellard     ACCESS_STORE = 0x02,
11326af0bf9cSbellard     /* Type of instruction that generated the access */
11336af0bf9cSbellard     ACCESS_CODE  = 0x10, /* Code fetch access                */
11346af0bf9cSbellard     ACCESS_INT   = 0x20, /* Integer load/store access        */
11356af0bf9cSbellard     ACCESS_FLOAT = 0x30, /* floating point load/store access */
11366af0bf9cSbellard };
11376af0bf9cSbellard 
11386af0bf9cSbellard /* Exceptions */
11396af0bf9cSbellard enum {
11406af0bf9cSbellard     EXCP_NONE          = -1,
11416af0bf9cSbellard     EXCP_RESET         = 0,
11426af0bf9cSbellard     EXCP_SRESET,
11436af0bf9cSbellard     EXCP_DSS,
11446af0bf9cSbellard     EXCP_DINT,
114514e51cc7Sths     EXCP_DDBL,
114614e51cc7Sths     EXCP_DDBS,
11476af0bf9cSbellard     EXCP_NMI,
11486af0bf9cSbellard     EXCP_MCHECK,
114914e51cc7Sths     EXCP_EXT_INTERRUPT, /* 8 */
11506af0bf9cSbellard     EXCP_DFWATCH,
115114e51cc7Sths     EXCP_DIB,
11526af0bf9cSbellard     EXCP_IWATCH,
11536af0bf9cSbellard     EXCP_AdEL,
11546af0bf9cSbellard     EXCP_AdES,
11556af0bf9cSbellard     EXCP_TLBF,
11566af0bf9cSbellard     EXCP_IBE,
115714e51cc7Sths     EXCP_DBp, /* 16 */
11586af0bf9cSbellard     EXCP_SYSCALL,
115914e51cc7Sths     EXCP_BREAK,
11604ad40f36Sbellard     EXCP_CpU,
11616af0bf9cSbellard     EXCP_RI,
11626af0bf9cSbellard     EXCP_OVERFLOW,
11636af0bf9cSbellard     EXCP_TRAP,
11645a5012ecSths     EXCP_FPE,
116514e51cc7Sths     EXCP_DWATCH, /* 24 */
11666af0bf9cSbellard     EXCP_LTLBL,
11676af0bf9cSbellard     EXCP_TLBL,
11686af0bf9cSbellard     EXCP_TLBS,
11696af0bf9cSbellard     EXCP_DBE,
1170ead9360eSths     EXCP_THREAD,
117114e51cc7Sths     EXCP_MDMX,
117214e51cc7Sths     EXCP_C2E,
117314e51cc7Sths     EXCP_CACHE, /* 32 */
1174853c3240SJia Liu     EXCP_DSPDIS,
1175e97a391dSYongbok Kim     EXCP_MSADIS,
1176e97a391dSYongbok Kim     EXCP_MSAFPE,
117792ceb440SLeon Alrae     EXCP_TLBXI,
117892ceb440SLeon Alrae     EXCP_TLBRI,
117914e51cc7Sths 
118092ceb440SLeon Alrae     EXCP_LAST = EXCP_TLBRI,
11816af0bf9cSbellard };
11826af0bf9cSbellard 
1183f249412cSEdgar E. Iglesias /*
118426aa3d9aSPhilippe Mathieu-Daudé  * This is an internally generated WAKE request line.
1185f249412cSEdgar E. Iglesias  * It is driven by the CPU itself. Raised when the MT
1186f249412cSEdgar E. Iglesias  * block wants to wake a VPE from an inactive state and
1187f249412cSEdgar E. Iglesias  * cleared when VPE goes from active to inactive.
1188f249412cSEdgar E. Iglesias  */
1189f249412cSEdgar E. Iglesias #define CPU_INTERRUPT_WAKE CPU_INTERRUPT_TGT_INT_0
1190f249412cSEdgar E. Iglesias 
1191388bb21aSths int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc);
11926af0bf9cSbellard 
1193a7519f2bSIgor Mammedov #define MIPS_CPU_TYPE_SUFFIX "-" TYPE_MIPS_CPU
1194a7519f2bSIgor Mammedov #define MIPS_CPU_TYPE_NAME(model) model MIPS_CPU_TYPE_SUFFIX
11950dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_MIPS_CPU
1196a7519f2bSIgor Mammedov 
1197a7519f2bSIgor Mammedov bool cpu_supports_cps_smp(const char *cpu_type);
11985b1e0981SAleksandar Markovic bool cpu_supports_isa(const char *cpu_type, uint64_t isa);
119989777fd1SLeon Alrae void cpu_set_exception_base(int vp_index, target_ulong address);
120030bf942dSAndreas Färber 
12015dc5d9f0SAurelien Jarno /* mips_int.c */
12027db13faeSAndreas Färber void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level);
12035dc5d9f0SAurelien Jarno 
1204043715d1SYongbok Kim /* mips_itu.c */
1205043715d1SYongbok Kim void itc_reconfigure(struct MIPSITUState *tag);
1206043715d1SYongbok Kim 
1207f9480ffcSths /* helper.c */
12081239b472SKwok Cheung Yeung target_ulong exception_resume_pc(CPUMIPSState *env);
1209f9480ffcSths 
1210599bc5e8SAleksandar Markovic static inline void restore_snan_bit_mode(CPUMIPSState *env)
1211599bc5e8SAleksandar Markovic {
1212599bc5e8SAleksandar Markovic     set_snan_bit_is_one((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) == 0,
1213599bc5e8SAleksandar Markovic                         &env->active_fpu.fp_status);
1214599bc5e8SAleksandar Markovic }
1215599bc5e8SAleksandar Markovic 
12167db13faeSAndreas Färber static inline void cpu_get_tb_cpu_state(CPUMIPSState *env, target_ulong *pc,
121789fee74aSEmilio G. Cota                                         target_ulong *cs_base, uint32_t *flags)
12186b917547Saliguori {
12196b917547Saliguori     *pc = env->active_tc.PC;
12206b917547Saliguori     *cs_base = 0;
1221d279279eSPetar Jovanovic     *flags = env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK |
1222d279279eSPetar Jovanovic                             MIPS_HFLAG_HWRENA_ULR);
12236b917547Saliguori }
12246b917547Saliguori 
122507f5a258SMarkus Armbruster #endif /* MIPS_CPU_H */
1226