xref: /qemu/target/mips/cpu.h (revision 8ebf2e1a68408068c0bcd0d02a783fd12f6a9cb5)
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 };
40ead9360eSths /* define FP_ENDIAN_IDX to access the same location
414ff9786cSStefan Weil  * in the fpr_t union regardless of the host endianness
42ead9360eSths  */
43e2542fe2SJuan Quintela #if defined(HOST_WORDS_BIGENDIAN)
44ead9360eSths #  define FP_ENDIAN_IDX 1
45ead9360eSths #else
46ead9360eSths #  define FP_ENDIAN_IDX 0
47c570fd16Sths #endif
48ead9360eSths 
49ead9360eSths typedef struct CPUMIPSFPUContext CPUMIPSFPUContext;
50ead9360eSths struct CPUMIPSFPUContext {
516af0bf9cSbellard     /* Floating point registers */
52c227f099SAnthony Liguori     fpr_t fpr[32];
536ea83fedSbellard     float_status fp_status;
545a5012ecSths     /* fpu implementation/revision register (fir) */
556af0bf9cSbellard     uint32_t fcr0;
567c979afdSLeon Alrae #define FCR0_FREP 29
57b4dd99a3SPetar Jovanovic #define FCR0_UFRP 28
58ba5c79f2SLeon Alrae #define FCR0_HAS2008 23
595a5012ecSths #define FCR0_F64 22
605a5012ecSths #define FCR0_L 21
615a5012ecSths #define FCR0_W 20
625a5012ecSths #define FCR0_3D 19
635a5012ecSths #define FCR0_PS 18
645a5012ecSths #define FCR0_D 17
655a5012ecSths #define FCR0_S 16
665a5012ecSths #define FCR0_PRID 8
675a5012ecSths #define FCR0_REV 0
686ea83fedSbellard     /* fcsr */
69599bc5e8SAleksandar Markovic     uint32_t fcr31_rw_bitmask;
706ea83fedSbellard     uint32_t fcr31;
7177be4199SAleksandar Markovic #define FCR31_FS 24
72ba5c79f2SLeon Alrae #define FCR31_ABS2008 19
73ba5c79f2SLeon Alrae #define FCR31_NAN2008 18
74*8ebf2e1aSJules Irenge #define SET_FP_COND(num, env)     do { ((env).fcr31) |=                 \
75*8ebf2e1aSJules Irenge                                        ((num) ? (1 << ((num) + 24)) :   \
76*8ebf2e1aSJules Irenge                                                 (1 << 23));             \
77*8ebf2e1aSJules Irenge                                      } while (0)
78*8ebf2e1aSJules Irenge #define CLEAR_FP_COND(num, env)   do { ((env).fcr31) &=                 \
79*8ebf2e1aSJules Irenge                                        ~((num) ? (1 << ((num) + 24)) :  \
80*8ebf2e1aSJules Irenge                                                  (1 << 23));            \
81*8ebf2e1aSJules Irenge                                      } while (0)
82*8ebf2e1aSJules Irenge #define GET_FP_COND(env)         ((((env).fcr31 >> 24) & 0xfe) |        \
83*8ebf2e1aSJules Irenge                                  (((env).fcr31 >> 23) & 0x1))
846ea83fedSbellard #define GET_FP_CAUSE(reg)        (((reg) >> 12) & 0x3f)
856ea83fedSbellard #define GET_FP_ENABLE(reg)       (((reg) >>  7) & 0x1f)
866ea83fedSbellard #define GET_FP_FLAGS(reg)        (((reg) >>  2) & 0x1f)
87*8ebf2e1aSJules Irenge #define SET_FP_CAUSE(reg, v)      do { (reg) = ((reg) & ~(0x3f << 12)) | \
88*8ebf2e1aSJules Irenge                                                ((v & 0x3f) << 12);       \
89*8ebf2e1aSJules Irenge                                      } while (0)
90*8ebf2e1aSJules Irenge #define SET_FP_ENABLE(reg, v)     do { (reg) = ((reg) & ~(0x1f <<  7)) | \
91*8ebf2e1aSJules Irenge                                                ((v & 0x1f) << 7);        \
92*8ebf2e1aSJules Irenge                                      } while (0)
93*8ebf2e1aSJules Irenge #define SET_FP_FLAGS(reg, v)      do { (reg) = ((reg) & ~(0x1f <<  2)) | \
94*8ebf2e1aSJules Irenge                                                ((v & 0x1f) << 2);        \
95*8ebf2e1aSJules Irenge                                      } while (0)
965a5012ecSths #define UPDATE_FP_FLAGS(reg, v)   do { (reg) |= ((v & 0x1f) << 2); } while (0)
976ea83fedSbellard #define FP_INEXACT        1
986ea83fedSbellard #define FP_UNDERFLOW      2
996ea83fedSbellard #define FP_OVERFLOW       4
1006ea83fedSbellard #define FP_DIV0           8
1016ea83fedSbellard #define FP_INVALID        16
1026ea83fedSbellard #define FP_UNIMPLEMENTED  32
103ead9360eSths };
1046ea83fedSbellard 
10542c86612SJames Hogan #define NB_MMU_MODES 4
106c20d594eSRichard Henderson #define TARGET_INSN_START_EXTRA_WORDS 2
1076ebbf390Sj_mayer 
108ead9360eSths typedef struct CPUMIPSMVPContext CPUMIPSMVPContext;
109ead9360eSths struct CPUMIPSMVPContext {
110ead9360eSths     int32_t CP0_MVPControl;
111ead9360eSths #define CP0MVPCo_CPA    3
112ead9360eSths #define CP0MVPCo_STLB   2
113ead9360eSths #define CP0MVPCo_VPC    1
114ead9360eSths #define CP0MVPCo_EVP    0
115ead9360eSths     int32_t CP0_MVPConf0;
116ead9360eSths #define CP0MVPC0_M      31
117ead9360eSths #define CP0MVPC0_TLBS   29
118ead9360eSths #define CP0MVPC0_GS     28
119ead9360eSths #define CP0MVPC0_PCP    27
120ead9360eSths #define CP0MVPC0_PTLBE  16
121ead9360eSths #define CP0MVPC0_TCA    15
122ead9360eSths #define CP0MVPC0_PVPE   10
123ead9360eSths #define CP0MVPC0_PTC    0
124ead9360eSths     int32_t CP0_MVPConf1;
125ead9360eSths #define CP0MVPC1_CIM    31
126ead9360eSths #define CP0MVPC1_CIF    30
127ead9360eSths #define CP0MVPC1_PCX    20
128ead9360eSths #define CP0MVPC1_PCP2   10
129ead9360eSths #define CP0MVPC1_PCP1   0
130ead9360eSths };
131ead9360eSths 
132c227f099SAnthony Liguori typedef struct mips_def_t mips_def_t;
133ead9360eSths 
134ead9360eSths #define MIPS_SHADOW_SET_MAX 16
135ead9360eSths #define MIPS_TC_MAX 5
136f01be154Sths #define MIPS_FPU_MAX 1
137ead9360eSths #define MIPS_DSP_ACC 4
138e98c0d17SLeon Alrae #define MIPS_KSCRATCH_NUM 6
139f6d4dd81SYongbok Kim #define MIPS_MAAR_MAX 16 /* Must be an even number. */
140ead9360eSths 
141e97a391dSYongbok Kim 
142a86d421eSAleksandar Markovic /*
143a86d421eSAleksandar Markovic  *     Summary of CP0 registers
144a86d421eSAleksandar Markovic  *     ========================
145a86d421eSAleksandar Markovic  *
146a86d421eSAleksandar Markovic  *
147a86d421eSAleksandar Markovic  *     Register 0        Register 1        Register 2        Register 3
148a86d421eSAleksandar Markovic  *     ----------        ----------        ----------        ----------
149a86d421eSAleksandar Markovic  *
150a86d421eSAleksandar Markovic  * 0   Index             Random            EntryLo0          EntryLo1
151a86d421eSAleksandar Markovic  * 1   MVPControl        VPEControl        TCStatus          GlobalNumber
152a86d421eSAleksandar Markovic  * 2   MVPConf0          VPEConf0          TCBind
153a86d421eSAleksandar Markovic  * 3   MVPConf1          VPEConf1          TCRestart
154a86d421eSAleksandar Markovic  * 4   VPControl         YQMask            TCHalt
155a86d421eSAleksandar Markovic  * 5                     VPESchedule       TCContext
156a86d421eSAleksandar Markovic  * 6                     VPEScheFBack      TCSchedule
157a86d421eSAleksandar Markovic  * 7                     VPEOpt            TCScheFBack       TCOpt
158a86d421eSAleksandar Markovic  *
159a86d421eSAleksandar Markovic  *
160a86d421eSAleksandar Markovic  *     Register 4        Register 5        Register 6        Register 7
161a86d421eSAleksandar Markovic  *     ----------        ----------        ----------        ----------
162a86d421eSAleksandar Markovic  *
163a86d421eSAleksandar Markovic  * 0   Context           PageMask          Wired             HWREna
164a86d421eSAleksandar Markovic  * 1   ContextConfig     PageGrain         SRSConf0
165a86d421eSAleksandar Markovic  * 2   UserLocal         SegCtl0           SRSConf1
166a86d421eSAleksandar Markovic  * 3   XContextConfig    SegCtl1           SRSConf2
167a86d421eSAleksandar Markovic  * 4   DebugContextID    SegCtl2           SRSConf3
168a86d421eSAleksandar Markovic  * 5   MemoryMapID       PWBase            SRSConf4
169a86d421eSAleksandar Markovic  * 6                     PWField           PWCtl
170a86d421eSAleksandar Markovic  * 7                     PWSize
171a86d421eSAleksandar Markovic  *
172a86d421eSAleksandar Markovic  *
173a86d421eSAleksandar Markovic  *     Register 8        Register 9        Register 10       Register 11
174a86d421eSAleksandar Markovic  *     ----------        ----------        -----------       -----------
175a86d421eSAleksandar Markovic  *
176a86d421eSAleksandar Markovic  * 0   BadVAddr          Count             EntryHi           Compare
177a86d421eSAleksandar Markovic  * 1   BadInstr
178a86d421eSAleksandar Markovic  * 2   BadInstrP
179a86d421eSAleksandar Markovic  * 3   BadInstrX
180a86d421eSAleksandar Markovic  * 4                                       GuestCtl1         GuestCtl0Ext
181a86d421eSAleksandar Markovic  * 5                                       GuestCtl2
182167db30eSYongbok Kim  * 6                     SAARI             GuestCtl3
183167db30eSYongbok Kim  * 7                     SAAR
184a86d421eSAleksandar Markovic  *
185a86d421eSAleksandar Markovic  *
186a86d421eSAleksandar Markovic  *     Register 12       Register 13       Register 14       Register 15
187a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
188a86d421eSAleksandar Markovic  *
189a86d421eSAleksandar Markovic  * 0   Status            Cause             EPC               PRId
190a86d421eSAleksandar Markovic  * 1   IntCtl                                                EBase
191a86d421eSAleksandar Markovic  * 2   SRSCtl                              NestedEPC         CDMMBase
192a86d421eSAleksandar Markovic  * 3   SRSMap                                                CMGCRBase
193a86d421eSAleksandar Markovic  * 4   View_IPL          View_RIPL                           BEVVA
194a86d421eSAleksandar Markovic  * 5   SRSMap2           NestedExc
195a86d421eSAleksandar Markovic  * 6   GuestCtl0
196a86d421eSAleksandar Markovic  * 7   GTOffset
197a86d421eSAleksandar Markovic  *
198a86d421eSAleksandar Markovic  *
199a86d421eSAleksandar Markovic  *     Register 16       Register 17       Register 18       Register 19
200a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
201a86d421eSAleksandar Markovic  *
202a86d421eSAleksandar Markovic  * 0   Config            LLAddr            WatchLo           WatchHi
203a86d421eSAleksandar Markovic  * 1   Config1           MAAR              WatchLo           WatchHi
204a86d421eSAleksandar Markovic  * 2   Config2           MAARI             WatchLo           WatchHi
205a86d421eSAleksandar Markovic  * 3   Config3                             WatchLo           WatchHi
206a86d421eSAleksandar Markovic  * 4   Config4                             WatchLo           WatchHi
207a86d421eSAleksandar Markovic  * 5   Config5                             WatchLo           WatchHi
208a86d421eSAleksandar Markovic  * 6                                       WatchLo           WatchHi
209a86d421eSAleksandar Markovic  * 7                                       WatchLo           WatchHi
210a86d421eSAleksandar Markovic  *
211a86d421eSAleksandar Markovic  *
212a86d421eSAleksandar Markovic  *     Register 20       Register 21       Register 22       Register 23
213a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
214a86d421eSAleksandar Markovic  *
215a86d421eSAleksandar Markovic  * 0   XContext                                              Debug
216a86d421eSAleksandar Markovic  * 1                                                         TraceControl
217a86d421eSAleksandar Markovic  * 2                                                         TraceControl2
218a86d421eSAleksandar Markovic  * 3                                                         UserTraceData1
219a86d421eSAleksandar Markovic  * 4                                                         TraceIBPC
220a86d421eSAleksandar Markovic  * 5                                                         TraceDBPC
221a86d421eSAleksandar Markovic  * 6                                                         Debug2
222a86d421eSAleksandar Markovic  * 7
223a86d421eSAleksandar Markovic  *
224a86d421eSAleksandar Markovic  *
225a86d421eSAleksandar Markovic  *     Register 24       Register 25       Register 26       Register 27
226a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
227a86d421eSAleksandar Markovic  *
228a86d421eSAleksandar Markovic  * 0   DEPC              PerfCnt            ErrCtl          CacheErr
229a86d421eSAleksandar Markovic  * 1                     PerfCnt
230a86d421eSAleksandar Markovic  * 2   TraceControl3     PerfCnt
231a86d421eSAleksandar Markovic  * 3   UserTraceData2    PerfCnt
232a86d421eSAleksandar Markovic  * 4                     PerfCnt
233a86d421eSAleksandar Markovic  * 5                     PerfCnt
234a86d421eSAleksandar Markovic  * 6                     PerfCnt
235a86d421eSAleksandar Markovic  * 7                     PerfCnt
236a86d421eSAleksandar Markovic  *
237a86d421eSAleksandar Markovic  *
238a86d421eSAleksandar Markovic  *     Register 28       Register 29       Register 30       Register 31
239a86d421eSAleksandar Markovic  *     -----------       -----------       -----------       -----------
240a86d421eSAleksandar Markovic  *
241a86d421eSAleksandar Markovic  * 0   DataLo            DataHi            ErrorEPC          DESAVE
242a86d421eSAleksandar Markovic  * 1   TagLo             TagHi
243a86d421eSAleksandar Markovic  * 2   DataLo            DataHi                              KScratch<n>
244a86d421eSAleksandar Markovic  * 3   TagLo             TagHi                               KScratch<n>
245a86d421eSAleksandar Markovic  * 4   DataLo            DataHi                              KScratch<n>
246a86d421eSAleksandar Markovic  * 5   TagLo             TagHi                               KScratch<n>
247a86d421eSAleksandar Markovic  * 6   DataLo            DataHi                              KScratch<n>
248a86d421eSAleksandar Markovic  * 7   TagLo             TagHi                               KScratch<n>
249a86d421eSAleksandar Markovic  *
250a86d421eSAleksandar Markovic  */
25104992c8cSAleksandar Markovic #define CP0_REGISTER_00     0
25204992c8cSAleksandar Markovic #define CP0_REGISTER_01     1
25304992c8cSAleksandar Markovic #define CP0_REGISTER_02     2
25404992c8cSAleksandar Markovic #define CP0_REGISTER_03     3
25504992c8cSAleksandar Markovic #define CP0_REGISTER_04     4
25604992c8cSAleksandar Markovic #define CP0_REGISTER_05     5
25704992c8cSAleksandar Markovic #define CP0_REGISTER_06     6
25804992c8cSAleksandar Markovic #define CP0_REGISTER_07     7
25904992c8cSAleksandar Markovic #define CP0_REGISTER_08     8
26004992c8cSAleksandar Markovic #define CP0_REGISTER_09     9
26104992c8cSAleksandar Markovic #define CP0_REGISTER_10    10
26204992c8cSAleksandar Markovic #define CP0_REGISTER_11    11
26304992c8cSAleksandar Markovic #define CP0_REGISTER_12    12
26404992c8cSAleksandar Markovic #define CP0_REGISTER_13    13
26504992c8cSAleksandar Markovic #define CP0_REGISTER_14    14
26604992c8cSAleksandar Markovic #define CP0_REGISTER_15    15
26704992c8cSAleksandar Markovic #define CP0_REGISTER_16    16
26804992c8cSAleksandar Markovic #define CP0_REGISTER_17    17
26904992c8cSAleksandar Markovic #define CP0_REGISTER_18    18
27004992c8cSAleksandar Markovic #define CP0_REGISTER_19    19
27104992c8cSAleksandar Markovic #define CP0_REGISTER_20    20
27204992c8cSAleksandar Markovic #define CP0_REGISTER_21    21
27304992c8cSAleksandar Markovic #define CP0_REGISTER_22    22
27404992c8cSAleksandar Markovic #define CP0_REGISTER_23    23
27504992c8cSAleksandar Markovic #define CP0_REGISTER_24    24
27604992c8cSAleksandar Markovic #define CP0_REGISTER_25    25
27704992c8cSAleksandar Markovic #define CP0_REGISTER_26    26
27804992c8cSAleksandar Markovic #define CP0_REGISTER_27    27
27904992c8cSAleksandar Markovic #define CP0_REGISTER_28    28
28004992c8cSAleksandar Markovic #define CP0_REGISTER_29    29
28104992c8cSAleksandar Markovic #define CP0_REGISTER_30    30
28204992c8cSAleksandar Markovic #define CP0_REGISTER_31    31
28304992c8cSAleksandar Markovic 
28404992c8cSAleksandar Markovic 
28504992c8cSAleksandar Markovic /* CP0 Register 00 */
28604992c8cSAleksandar Markovic #define CP0_REG00__INDEX           0
28704992c8cSAleksandar Markovic #define CP0_REG00__VPCONTROL       4
28804992c8cSAleksandar Markovic /* CP0 Register 01 */
28904992c8cSAleksandar Markovic /* CP0 Register 02 */
29004992c8cSAleksandar Markovic #define CP0_REG02__ENTRYLO0        0
29104992c8cSAleksandar Markovic /* CP0 Register 03 */
29204992c8cSAleksandar Markovic #define CP0_REG03__ENTRYLO1        0
29304992c8cSAleksandar Markovic #define CP0_REG03__GLOBALNUM       1
29404992c8cSAleksandar Markovic /* CP0 Register 04 */
29504992c8cSAleksandar Markovic #define CP0_REG04__CONTEXT         0
29604992c8cSAleksandar Markovic #define CP0_REG04__USERLOCAL       2
29704992c8cSAleksandar Markovic #define CP0_REG04__DBGCONTEXTID    4
29804992c8cSAleksandar Markovic #define CP0_REG00__MMID            5
29904992c8cSAleksandar Markovic /* CP0 Register 05 */
30004992c8cSAleksandar Markovic #define CP0_REG05__PAGEMASK        0
30104992c8cSAleksandar Markovic #define CP0_REG05__PAGEGRAIN       1
30204992c8cSAleksandar Markovic /* CP0 Register 06 */
30304992c8cSAleksandar Markovic #define CP0_REG06__WIRED           0
30404992c8cSAleksandar Markovic /* CP0 Register 07 */
30504992c8cSAleksandar Markovic #define CP0_REG07__HWRENA          0
30604992c8cSAleksandar Markovic /* CP0 Register 08 */
30704992c8cSAleksandar Markovic #define CP0_REG08__BADVADDR        0
30804992c8cSAleksandar Markovic #define CP0_REG08__BADINSTR        1
30904992c8cSAleksandar Markovic #define CP0_REG08__BADINSTRP       2
31004992c8cSAleksandar Markovic /* CP0 Register 09 */
31104992c8cSAleksandar Markovic #define CP0_REG09__COUNT           0
31204992c8cSAleksandar Markovic #define CP0_REG09__SAARI           6
31304992c8cSAleksandar Markovic #define CP0_REG09__SAAR            7
31404992c8cSAleksandar Markovic /* CP0 Register 10 */
31504992c8cSAleksandar Markovic #define CP0_REG10__ENTRYHI         0
31604992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL1       4
31704992c8cSAleksandar Markovic #define CP0_REG10__GUESTCTL2       5
31804992c8cSAleksandar Markovic /* CP0 Register 11 */
31904992c8cSAleksandar Markovic #define CP0_REG11__COMPARE         0
32004992c8cSAleksandar Markovic #define CP0_REG11__GUESTCTL0EXT    4
32104992c8cSAleksandar Markovic /* CP0 Register 12 */
32204992c8cSAleksandar Markovic #define CP0_REG12__STATUS          0
32304992c8cSAleksandar Markovic #define CP0_REG12__INTCTL          1
32404992c8cSAleksandar Markovic #define CP0_REG12__SRSCTL          2
32504992c8cSAleksandar Markovic #define CP0_REG12__GUESTCTL0       6
32604992c8cSAleksandar Markovic #define CP0_REG12__GTOFFSET        7
32704992c8cSAleksandar Markovic /* CP0 Register 13 */
32804992c8cSAleksandar Markovic #define CP0_REG13__CAUSE           0
32904992c8cSAleksandar Markovic /* CP0 Register 14 */
33004992c8cSAleksandar Markovic #define CP0_REG14__EPC             0
33104992c8cSAleksandar Markovic /* CP0 Register 15 */
33204992c8cSAleksandar Markovic #define CP0_REG15__PRID            0
33304992c8cSAleksandar Markovic #define CP0_REG15__EBASE           1
33404992c8cSAleksandar Markovic #define CP0_REG15__CDMMBASE        2
33504992c8cSAleksandar Markovic #define CP0_REG15__CMGCRBASE       3
33604992c8cSAleksandar Markovic /* CP0 Register 16 */
33704992c8cSAleksandar Markovic #define CP0_REG16__CONFIG          0
33804992c8cSAleksandar Markovic #define CP0_REG16__CONFIG1         1
33904992c8cSAleksandar Markovic #define CP0_REG16__CONFIG2         2
34004992c8cSAleksandar Markovic #define CP0_REG16__CONFIG3         3
34104992c8cSAleksandar Markovic #define CP0_REG16__CONFIG4         4
34204992c8cSAleksandar Markovic #define CP0_REG16__CONFIG5         5
34304992c8cSAleksandar Markovic #define CP0_REG00__CONFIG7         7
34404992c8cSAleksandar Markovic /* CP0 Register 17 */
34504992c8cSAleksandar Markovic #define CP0_REG17__LLADDR          0
34604992c8cSAleksandar Markovic #define CP0_REG17__MAAR            1
34704992c8cSAleksandar Markovic #define CP0_REG17__MAARI           2
34804992c8cSAleksandar Markovic /* CP0 Register 18 */
34904992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO0        0
35004992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO1        1
35104992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO2        2
35204992c8cSAleksandar Markovic #define CP0_REG18__WATCHLO3        3
35304992c8cSAleksandar Markovic /* CP0 Register 19 */
35404992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI0        0
35504992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI1        1
35604992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI2        2
35704992c8cSAleksandar Markovic #define CP0_REG19__WATCHHI3        3
35804992c8cSAleksandar Markovic /* CP0 Register 20 */
35904992c8cSAleksandar Markovic #define CP0_REG20__XCONTEXT        0
36004992c8cSAleksandar Markovic /* CP0 Register 21 */
36104992c8cSAleksandar Markovic /* CP0 Register 22 */
36204992c8cSAleksandar Markovic /* CP0 Register 23 */
36304992c8cSAleksandar Markovic #define CP0_REG23__DEBUG           0
36404992c8cSAleksandar Markovic /* CP0 Register 24 */
36504992c8cSAleksandar Markovic #define CP0_REG24__DEPC            0
36604992c8cSAleksandar Markovic /* CP0 Register 25 */
36704992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL0        0
36804992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT0        1
36904992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL1        2
37004992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT1        3
37104992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL2        4
37204992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT2        5
37304992c8cSAleksandar Markovic #define CP0_REG25__PERFCTL3        6
37404992c8cSAleksandar Markovic #define CP0_REG25__PERFCNT3        7
37504992c8cSAleksandar Markovic /* CP0 Register 26 */
37604992c8cSAleksandar Markovic #define CP0_REG00__ERRCTL          0
37704992c8cSAleksandar Markovic /* CP0 Register 27 */
37804992c8cSAleksandar Markovic #define CP0_REG27__CACHERR         0
37904992c8cSAleksandar Markovic /* CP0 Register 28 */
38004992c8cSAleksandar Markovic #define CP0_REG28__ITAGLO          0
38104992c8cSAleksandar Markovic #define CP0_REG28__IDATALO         1
38204992c8cSAleksandar Markovic #define CP0_REG28__DTAGLO          2
38304992c8cSAleksandar Markovic #define CP0_REG28__DDATALO         3
38404992c8cSAleksandar Markovic /* CP0 Register 29 */
38504992c8cSAleksandar Markovic #define CP0_REG29__IDATAHI         1
38604992c8cSAleksandar Markovic #define CP0_REG29__DDATAHI         3
38704992c8cSAleksandar Markovic /* CP0 Register 30 */
38804992c8cSAleksandar Markovic #define CP0_REG30__ERROREPC        0
38904992c8cSAleksandar Markovic /* CP0 Register 31 */
39004992c8cSAleksandar Markovic #define CP0_REG31__DESAVE          0
39104992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH1       2
39204992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH2       3
39304992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH3       4
39404992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH4       5
39504992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH5       6
39604992c8cSAleksandar Markovic #define CP0_REG31__KSCRATCH6       7
397ea9c5e83SAleksandar Markovic 
398ea9c5e83SAleksandar Markovic 
399ea9c5e83SAleksandar Markovic typedef struct TCState TCState;
400ea9c5e83SAleksandar Markovic struct TCState {
401ea9c5e83SAleksandar Markovic     target_ulong gpr[32];
402ea9c5e83SAleksandar Markovic     target_ulong PC;
403ea9c5e83SAleksandar Markovic     target_ulong HI[MIPS_DSP_ACC];
404ea9c5e83SAleksandar Markovic     target_ulong LO[MIPS_DSP_ACC];
405ea9c5e83SAleksandar Markovic     target_ulong ACX[MIPS_DSP_ACC];
406ea9c5e83SAleksandar Markovic     target_ulong DSPControl;
407ea9c5e83SAleksandar Markovic     int32_t CP0_TCStatus;
408ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU3    31
409ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU2    30
410ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU1    29
411ea9c5e83SAleksandar Markovic #define CP0TCSt_TCU0    28
412ea9c5e83SAleksandar Markovic #define CP0TCSt_TMX     27
413ea9c5e83SAleksandar Markovic #define CP0TCSt_RNST    23
414ea9c5e83SAleksandar Markovic #define CP0TCSt_TDS     21
415ea9c5e83SAleksandar Markovic #define CP0TCSt_DT      20
416ea9c5e83SAleksandar Markovic #define CP0TCSt_DA      15
417ea9c5e83SAleksandar Markovic #define CP0TCSt_A       13
418ea9c5e83SAleksandar Markovic #define CP0TCSt_TKSU    11
419ea9c5e83SAleksandar Markovic #define CP0TCSt_IXMT    10
420ea9c5e83SAleksandar Markovic #define CP0TCSt_TASID   0
421ea9c5e83SAleksandar Markovic     int32_t CP0_TCBind;
422ea9c5e83SAleksandar Markovic #define CP0TCBd_CurTC   21
423ea9c5e83SAleksandar Markovic #define CP0TCBd_TBE     17
424ea9c5e83SAleksandar Markovic #define CP0TCBd_CurVPE  0
425ea9c5e83SAleksandar Markovic     target_ulong CP0_TCHalt;
426ea9c5e83SAleksandar Markovic     target_ulong CP0_TCContext;
427ea9c5e83SAleksandar Markovic     target_ulong CP0_TCSchedule;
428ea9c5e83SAleksandar Markovic     target_ulong CP0_TCScheFBack;
429ea9c5e83SAleksandar Markovic     int32_t CP0_Debug_tcstatus;
430ea9c5e83SAleksandar Markovic     target_ulong CP0_UserLocal;
431ea9c5e83SAleksandar Markovic 
432ea9c5e83SAleksandar Markovic     int32_t msacsr;
433ea9c5e83SAleksandar Markovic 
434ea9c5e83SAleksandar Markovic #define MSACSR_FS       24
435ea9c5e83SAleksandar Markovic #define MSACSR_FS_MASK  (1 << MSACSR_FS)
436ea9c5e83SAleksandar Markovic #define MSACSR_NX       18
437ea9c5e83SAleksandar Markovic #define MSACSR_NX_MASK  (1 << MSACSR_NX)
438ea9c5e83SAleksandar Markovic #define MSACSR_CEF      2
439ea9c5e83SAleksandar Markovic #define MSACSR_CEF_MASK (0xffff << MSACSR_CEF)
440ea9c5e83SAleksandar Markovic #define MSACSR_RM       0
441ea9c5e83SAleksandar Markovic #define MSACSR_RM_MASK  (0x3 << MSACSR_RM)
442ea9c5e83SAleksandar Markovic #define MSACSR_MASK     (MSACSR_RM_MASK | MSACSR_CEF_MASK | MSACSR_NX_MASK | \
443ea9c5e83SAleksandar Markovic         MSACSR_FS_MASK)
444ea9c5e83SAleksandar Markovic 
445ea9c5e83SAleksandar Markovic     float_status msa_fp_status;
446ea9c5e83SAleksandar Markovic 
447a168a796SFredrik Noring     /* Upper 64-bit MMRs (multimedia registers); the lower 64-bit are GPRs */
448a168a796SFredrik Noring     uint64_t mmr[32];
449a168a796SFredrik Noring 
450ea9c5e83SAleksandar Markovic #define NUMBER_OF_MXU_REGISTERS 16
451ea9c5e83SAleksandar Markovic     target_ulong mxu_gpr[NUMBER_OF_MXU_REGISTERS - 1];
452ea9c5e83SAleksandar Markovic     target_ulong mxu_cr;
453ea9c5e83SAleksandar Markovic #define MXU_CR_LC       31
454ea9c5e83SAleksandar Markovic #define MXU_CR_RC       30
455ea9c5e83SAleksandar Markovic #define MXU_CR_BIAS     2
456ea9c5e83SAleksandar Markovic #define MXU_CR_RD_EN    1
457ea9c5e83SAleksandar Markovic #define MXU_CR_MXU_EN   0
458ea9c5e83SAleksandar Markovic 
459ea9c5e83SAleksandar Markovic };
460ea9c5e83SAleksandar Markovic 
461043715d1SYongbok Kim struct MIPSITUState;
462ea9c5e83SAleksandar Markovic typedef struct CPUMIPSState CPUMIPSState;
463ea9c5e83SAleksandar Markovic struct CPUMIPSState {
464ea9c5e83SAleksandar Markovic     TCState active_tc;
465ea9c5e83SAleksandar Markovic     CPUMIPSFPUContext active_fpu;
466ea9c5e83SAleksandar Markovic 
467ea9c5e83SAleksandar Markovic     uint32_t current_tc;
468ea9c5e83SAleksandar Markovic     uint32_t current_fpu;
469ea9c5e83SAleksandar Markovic 
470ea9c5e83SAleksandar Markovic     uint32_t SEGBITS;
471ea9c5e83SAleksandar Markovic     uint32_t PABITS;
472ea9c5e83SAleksandar Markovic #if defined(TARGET_MIPS64)
473ea9c5e83SAleksandar Markovic # define PABITS_BASE 36
474ea9c5e83SAleksandar Markovic #else
475ea9c5e83SAleksandar Markovic # define PABITS_BASE 32
476ea9c5e83SAleksandar Markovic #endif
477ea9c5e83SAleksandar Markovic     target_ulong SEGMask;
478ea9c5e83SAleksandar Markovic     uint64_t PAMask;
479ea9c5e83SAleksandar Markovic #define PAMASK_BASE ((1ULL << PABITS_BASE) - 1)
480ea9c5e83SAleksandar Markovic 
481ea9c5e83SAleksandar Markovic     int32_t msair;
482ea9c5e83SAleksandar Markovic #define MSAIR_ProcID    8
483ea9c5e83SAleksandar Markovic #define MSAIR_Rev       0
484ea9c5e83SAleksandar Markovic 
48550e7edc5SAleksandar Markovic /*
48650e7edc5SAleksandar Markovic  * CP0 Register 0
48750e7edc5SAleksandar Markovic  */
4889c2149c8Sths     int32_t CP0_Index;
489ead9360eSths     /* CP0_MVP* are per MVP registers. */
49001bc435bSYongbok Kim     int32_t CP0_VPControl;
49101bc435bSYongbok Kim #define CP0VPCtl_DIS    0
49250e7edc5SAleksandar Markovic /*
49350e7edc5SAleksandar Markovic  * CP0 Register 1
49450e7edc5SAleksandar Markovic  */
4959c2149c8Sths     int32_t CP0_Random;
496ead9360eSths     int32_t CP0_VPEControl;
497ead9360eSths #define CP0VPECo_YSI    21
498ead9360eSths #define CP0VPECo_GSI    20
499ead9360eSths #define CP0VPECo_EXCPT  16
500ead9360eSths #define CP0VPECo_TE     15
501ead9360eSths #define CP0VPECo_TargTC 0
502ead9360eSths     int32_t CP0_VPEConf0;
503ead9360eSths #define CP0VPEC0_M      31
504ead9360eSths #define CP0VPEC0_XTC    21
505ead9360eSths #define CP0VPEC0_TCS    19
506ead9360eSths #define CP0VPEC0_SCS    18
507ead9360eSths #define CP0VPEC0_DSC    17
508ead9360eSths #define CP0VPEC0_ICS    16
509ead9360eSths #define CP0VPEC0_MVP    1
510ead9360eSths #define CP0VPEC0_VPA    0
511ead9360eSths     int32_t CP0_VPEConf1;
512ead9360eSths #define CP0VPEC1_NCX    20
513ead9360eSths #define CP0VPEC1_NCP2   10
514ead9360eSths #define CP0VPEC1_NCP1   0
515ead9360eSths     target_ulong CP0_YQMask;
516ead9360eSths     target_ulong CP0_VPESchedule;
517ead9360eSths     target_ulong CP0_VPEScheFBack;
518ead9360eSths     int32_t CP0_VPEOpt;
519ead9360eSths #define CP0VPEOpt_IWX7  15
520ead9360eSths #define CP0VPEOpt_IWX6  14
521ead9360eSths #define CP0VPEOpt_IWX5  13
522ead9360eSths #define CP0VPEOpt_IWX4  12
523ead9360eSths #define CP0VPEOpt_IWX3  11
524ead9360eSths #define CP0VPEOpt_IWX2  10
525ead9360eSths #define CP0VPEOpt_IWX1  9
526ead9360eSths #define CP0VPEOpt_IWX0  8
527ead9360eSths #define CP0VPEOpt_DWX7  7
528ead9360eSths #define CP0VPEOpt_DWX6  6
529ead9360eSths #define CP0VPEOpt_DWX5  5
530ead9360eSths #define CP0VPEOpt_DWX4  4
531ead9360eSths #define CP0VPEOpt_DWX3  3
532ead9360eSths #define CP0VPEOpt_DWX2  2
533ead9360eSths #define CP0VPEOpt_DWX1  1
534ead9360eSths #define CP0VPEOpt_DWX0  0
53550e7edc5SAleksandar Markovic /*
53650e7edc5SAleksandar Markovic  * CP0 Register 2
53750e7edc5SAleksandar Markovic  */
538284b731aSLeon Alrae     uint64_t CP0_EntryLo0;
53950e7edc5SAleksandar Markovic /*
54050e7edc5SAleksandar Markovic  * CP0 Register 3
54150e7edc5SAleksandar Markovic  */
542284b731aSLeon Alrae     uint64_t CP0_EntryLo1;
5432fb58b73SLeon Alrae #if defined(TARGET_MIPS64)
5442fb58b73SLeon Alrae # define CP0EnLo_RI 63
5452fb58b73SLeon Alrae # define CP0EnLo_XI 62
5462fb58b73SLeon Alrae #else
5472fb58b73SLeon Alrae # define CP0EnLo_RI 31
5482fb58b73SLeon Alrae # define CP0EnLo_XI 30
5492fb58b73SLeon Alrae #endif
55001bc435bSYongbok Kim     int32_t CP0_GlobalNumber;
55101bc435bSYongbok Kim #define CP0GN_VPId 0
55250e7edc5SAleksandar Markovic /*
55350e7edc5SAleksandar Markovic  * CP0 Register 4
55450e7edc5SAleksandar Markovic  */
5559c2149c8Sths     target_ulong CP0_Context;
556e98c0d17SLeon Alrae     target_ulong CP0_KScratch[MIPS_KSCRATCH_NUM];
5573ef521eeSAleksandar Markovic     int32_t CP0_MemoryMapID;
55850e7edc5SAleksandar Markovic /*
55950e7edc5SAleksandar Markovic  * CP0 Register 5
56050e7edc5SAleksandar Markovic  */
5619c2149c8Sths     int32_t CP0_PageMask;
5627207c7f9SLeon Alrae     int32_t CP0_PageGrain_rw_bitmask;
5639c2149c8Sths     int32_t CP0_PageGrain;
5647207c7f9SLeon Alrae #define CP0PG_RIE 31
5657207c7f9SLeon Alrae #define CP0PG_XIE 30
566e117f526SLeon Alrae #define CP0PG_ELPA 29
56792ceb440SLeon Alrae #define CP0PG_IEC 27
568cec56a73SJames Hogan     target_ulong CP0_SegCtl0;
569cec56a73SJames Hogan     target_ulong CP0_SegCtl1;
570cec56a73SJames Hogan     target_ulong CP0_SegCtl2;
571cec56a73SJames Hogan #define CP0SC_PA        9
572cec56a73SJames Hogan #define CP0SC_PA_MASK   (0x7FULL << CP0SC_PA)
573cec56a73SJames Hogan #define CP0SC_PA_1GMASK (0x7EULL << CP0SC_PA)
574cec56a73SJames Hogan #define CP0SC_AM        4
575cec56a73SJames Hogan #define CP0SC_AM_MASK   (0x7ULL << CP0SC_AM)
576cec56a73SJames Hogan #define CP0SC_AM_UK     0ULL
577cec56a73SJames Hogan #define CP0SC_AM_MK     1ULL
578cec56a73SJames Hogan #define CP0SC_AM_MSK    2ULL
579cec56a73SJames Hogan #define CP0SC_AM_MUSK   3ULL
580cec56a73SJames Hogan #define CP0SC_AM_MUSUK  4ULL
581cec56a73SJames Hogan #define CP0SC_AM_USK    5ULL
582cec56a73SJames Hogan #define CP0SC_AM_UUSK   7ULL
583cec56a73SJames Hogan #define CP0SC_EU        3
584cec56a73SJames Hogan #define CP0SC_EU_MASK   (1ULL << CP0SC_EU)
585cec56a73SJames Hogan #define CP0SC_C         0
586cec56a73SJames Hogan #define CP0SC_C_MASK    (0x7ULL << CP0SC_C)
587cec56a73SJames Hogan #define CP0SC_MASK      (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \
588cec56a73SJames Hogan                          CP0SC_PA_MASK)
589cec56a73SJames Hogan #define CP0SC_1GMASK    (CP0SC_C_MASK | CP0SC_EU_MASK | CP0SC_AM_MASK | \
590cec56a73SJames Hogan                          CP0SC_PA_1GMASK)
591cec56a73SJames Hogan #define CP0SC0_MASK     (CP0SC_MASK | (CP0SC_MASK << 16))
592cec56a73SJames Hogan #define CP0SC1_XAM      59
593cec56a73SJames Hogan #define CP0SC1_XAM_MASK (0x7ULL << CP0SC1_XAM)
594cec56a73SJames Hogan #define CP0SC1_MASK     (CP0SC_MASK | (CP0SC_MASK << 16) | CP0SC1_XAM_MASK)
595cec56a73SJames Hogan #define CP0SC2_XR       56
596cec56a73SJames Hogan #define CP0SC2_XR_MASK  (0xFFULL << CP0SC2_XR)
597cec56a73SJames Hogan #define CP0SC2_MASK     (CP0SC_1GMASK | (CP0SC_1GMASK << 16) | CP0SC2_XR_MASK)
5985e31fdd5SYongbok Kim     target_ulong CP0_PWBase;
599fa75ad14SYongbok Kim     target_ulong CP0_PWField;
600fa75ad14SYongbok Kim #if defined(TARGET_MIPS64)
601fa75ad14SYongbok Kim #define CP0PF_BDI  32    /* 37..32 */
602fa75ad14SYongbok Kim #define CP0PF_GDI  24    /* 29..24 */
603fa75ad14SYongbok Kim #define CP0PF_UDI  18    /* 23..18 */
604fa75ad14SYongbok Kim #define CP0PF_MDI  12    /* 17..12 */
605fa75ad14SYongbok Kim #define CP0PF_PTI  6     /* 11..6  */
606fa75ad14SYongbok Kim #define CP0PF_PTEI 0     /*  5..0  */
607fa75ad14SYongbok Kim #else
608fa75ad14SYongbok Kim #define CP0PF_GDW  24    /* 29..24 */
609fa75ad14SYongbok Kim #define CP0PF_UDW  18    /* 23..18 */
610fa75ad14SYongbok Kim #define CP0PF_MDW  12    /* 17..12 */
611fa75ad14SYongbok Kim #define CP0PF_PTW  6     /* 11..6  */
612fa75ad14SYongbok Kim #define CP0PF_PTEW 0     /*  5..0  */
613fa75ad14SYongbok Kim #endif
61420b28ebcSYongbok Kim     target_ulong CP0_PWSize;
61520b28ebcSYongbok Kim #if defined(TARGET_MIPS64)
61620b28ebcSYongbok Kim #define CP0PS_BDW  32    /* 37..32 */
61720b28ebcSYongbok Kim #endif
61820b28ebcSYongbok Kim #define CP0PS_PS   30
61920b28ebcSYongbok Kim #define CP0PS_GDW  24    /* 29..24 */
62020b28ebcSYongbok Kim #define CP0PS_UDW  18    /* 23..18 */
62120b28ebcSYongbok Kim #define CP0PS_MDW  12    /* 17..12 */
62220b28ebcSYongbok Kim #define CP0PS_PTW  6     /* 11..6  */
62320b28ebcSYongbok Kim #define CP0PS_PTEW 0     /*  5..0  */
62450e7edc5SAleksandar Markovic /*
62550e7edc5SAleksandar Markovic  * CP0 Register 6
62650e7edc5SAleksandar Markovic  */
6279c2149c8Sths     int32_t CP0_Wired;
628103be64cSYongbok Kim     int32_t CP0_PWCtl;
629103be64cSYongbok Kim #define CP0PC_PWEN      31
630103be64cSYongbok Kim #if defined(TARGET_MIPS64)
631103be64cSYongbok Kim #define CP0PC_PWDIREXT  30
632103be64cSYongbok Kim #define CP0PC_XK        28
633103be64cSYongbok Kim #define CP0PC_XS        27
634103be64cSYongbok Kim #define CP0PC_XU        26
635103be64cSYongbok Kim #endif
636103be64cSYongbok Kim #define CP0PC_DPH       7
637103be64cSYongbok Kim #define CP0PC_HUGEPG    6
638103be64cSYongbok Kim #define CP0PC_PSN       0     /*  5..0  */
639ead9360eSths     int32_t CP0_SRSConf0_rw_bitmask;
640ead9360eSths     int32_t CP0_SRSConf0;
641ead9360eSths #define CP0SRSC0_M      31
642ead9360eSths #define CP0SRSC0_SRS3   20
643ead9360eSths #define CP0SRSC0_SRS2   10
644ead9360eSths #define CP0SRSC0_SRS1   0
645ead9360eSths     int32_t CP0_SRSConf1_rw_bitmask;
646ead9360eSths     int32_t CP0_SRSConf1;
647ead9360eSths #define CP0SRSC1_M      31
648ead9360eSths #define CP0SRSC1_SRS6   20
649ead9360eSths #define CP0SRSC1_SRS5   10
650ead9360eSths #define CP0SRSC1_SRS4   0
651ead9360eSths     int32_t CP0_SRSConf2_rw_bitmask;
652ead9360eSths     int32_t CP0_SRSConf2;
653ead9360eSths #define CP0SRSC2_M      31
654ead9360eSths #define CP0SRSC2_SRS9   20
655ead9360eSths #define CP0SRSC2_SRS8   10
656ead9360eSths #define CP0SRSC2_SRS7   0
657ead9360eSths     int32_t CP0_SRSConf3_rw_bitmask;
658ead9360eSths     int32_t CP0_SRSConf3;
659ead9360eSths #define CP0SRSC3_M      31
660ead9360eSths #define CP0SRSC3_SRS12  20
661ead9360eSths #define CP0SRSC3_SRS11  10
662ead9360eSths #define CP0SRSC3_SRS10  0
663ead9360eSths     int32_t CP0_SRSConf4_rw_bitmask;
664ead9360eSths     int32_t CP0_SRSConf4;
665ead9360eSths #define CP0SRSC4_SRS15  20
666ead9360eSths #define CP0SRSC4_SRS14  10
667ead9360eSths #define CP0SRSC4_SRS13  0
66850e7edc5SAleksandar Markovic /*
66950e7edc5SAleksandar Markovic  * CP0 Register 7
67050e7edc5SAleksandar Markovic  */
6719c2149c8Sths     int32_t CP0_HWREna;
67250e7edc5SAleksandar Markovic /*
67350e7edc5SAleksandar Markovic  * CP0 Register 8
67450e7edc5SAleksandar Markovic  */
675c570fd16Sths     target_ulong CP0_BadVAddr;
676aea14095SLeon Alrae     uint32_t CP0_BadInstr;
677aea14095SLeon Alrae     uint32_t CP0_BadInstrP;
67825beba9bSStefan Markovic     uint32_t CP0_BadInstrX;
67950e7edc5SAleksandar Markovic /*
68050e7edc5SAleksandar Markovic  * CP0 Register 9
68150e7edc5SAleksandar Markovic  */
6829c2149c8Sths     int32_t CP0_Count;
683167db30eSYongbok Kim     uint32_t CP0_SAARI;
684167db30eSYongbok Kim #define CP0SAARI_TARGET 0    /*  5..0  */
685167db30eSYongbok Kim     uint64_t CP0_SAAR[2];
686167db30eSYongbok Kim #define CP0SAAR_BASE    12   /* 43..12 */
687167db30eSYongbok Kim #define CP0SAAR_SIZE    1    /*  5..1  */
688167db30eSYongbok Kim #define CP0SAAR_EN      0
68950e7edc5SAleksandar Markovic /*
69050e7edc5SAleksandar Markovic  * CP0 Register 10
69150e7edc5SAleksandar Markovic  */
6929c2149c8Sths     target_ulong CP0_EntryHi;
6939456c2fbSLeon Alrae #define CP0EnHi_EHINV 10
6946ec98bd7SPaul Burton     target_ulong CP0_EntryHi_ASID_mask;
69550e7edc5SAleksandar Markovic /*
69650e7edc5SAleksandar Markovic  * CP0 Register 11
69750e7edc5SAleksandar Markovic  */
6989c2149c8Sths     int32_t CP0_Compare;
69950e7edc5SAleksandar Markovic /*
70050e7edc5SAleksandar Markovic  * CP0 Register 12
70150e7edc5SAleksandar Markovic  */
7029c2149c8Sths     int32_t CP0_Status;
7036af0bf9cSbellard #define CP0St_CU3   31
7046af0bf9cSbellard #define CP0St_CU2   30
7056af0bf9cSbellard #define CP0St_CU1   29
7066af0bf9cSbellard #define CP0St_CU0   28
7076af0bf9cSbellard #define CP0St_RP    27
7086ea83fedSbellard #define CP0St_FR    26
7096af0bf9cSbellard #define CP0St_RE    25
7107a387fffSths #define CP0St_MX    24
7117a387fffSths #define CP0St_PX    23
7126af0bf9cSbellard #define CP0St_BEV   22
7136af0bf9cSbellard #define CP0St_TS    21
7146af0bf9cSbellard #define CP0St_SR    20
7156af0bf9cSbellard #define CP0St_NMI   19
7166af0bf9cSbellard #define CP0St_IM    8
7177a387fffSths #define CP0St_KX    7
7187a387fffSths #define CP0St_SX    6
7197a387fffSths #define CP0St_UX    5
720623a930eSths #define CP0St_KSU   3
7216af0bf9cSbellard #define CP0St_ERL   2
7226af0bf9cSbellard #define CP0St_EXL   1
7236af0bf9cSbellard #define CP0St_IE    0
7249c2149c8Sths     int32_t CP0_IntCtl;
725ead9360eSths #define CP0IntCtl_IPTI 29
72688991299SDongxue Zhang #define CP0IntCtl_IPPCI 26
727ead9360eSths #define CP0IntCtl_VS 5
7289c2149c8Sths     int32_t CP0_SRSCtl;
729ead9360eSths #define CP0SRSCtl_HSS 26
730ead9360eSths #define CP0SRSCtl_EICSS 18
731ead9360eSths #define CP0SRSCtl_ESS 12
732ead9360eSths #define CP0SRSCtl_PSS 6
733ead9360eSths #define CP0SRSCtl_CSS 0
7349c2149c8Sths     int32_t CP0_SRSMap;
735ead9360eSths #define CP0SRSMap_SSV7 28
736ead9360eSths #define CP0SRSMap_SSV6 24
737ead9360eSths #define CP0SRSMap_SSV5 20
738ead9360eSths #define CP0SRSMap_SSV4 16
739ead9360eSths #define CP0SRSMap_SSV3 12
740ead9360eSths #define CP0SRSMap_SSV2 8
741ead9360eSths #define CP0SRSMap_SSV1 4
742ead9360eSths #define CP0SRSMap_SSV0 0
74350e7edc5SAleksandar Markovic /*
74450e7edc5SAleksandar Markovic  * CP0 Register 13
74550e7edc5SAleksandar Markovic  */
7469c2149c8Sths     int32_t CP0_Cause;
7477a387fffSths #define CP0Ca_BD   31
7487a387fffSths #define CP0Ca_TI   30
7497a387fffSths #define CP0Ca_CE   28
7507a387fffSths #define CP0Ca_DC   27
7517a387fffSths #define CP0Ca_PCI  26
7526af0bf9cSbellard #define CP0Ca_IV   23
7537a387fffSths #define CP0Ca_WP   22
7547a387fffSths #define CP0Ca_IP    8
7554de9b249Sths #define CP0Ca_IP_mask 0x0000FF00
7567a387fffSths #define CP0Ca_EC    2
75750e7edc5SAleksandar Markovic /*
75850e7edc5SAleksandar Markovic  * CP0 Register 14
75950e7edc5SAleksandar Markovic  */
760c570fd16Sths     target_ulong CP0_EPC;
76150e7edc5SAleksandar Markovic /*
76250e7edc5SAleksandar Markovic  * CP0 Register 15
76350e7edc5SAleksandar Markovic  */
7649c2149c8Sths     int32_t CP0_PRid;
76574dbf824SJames Hogan     target_ulong CP0_EBase;
76674dbf824SJames Hogan     target_ulong CP0_EBaseWG_rw_bitmask;
76774dbf824SJames Hogan #define CP0EBase_WG 11
768c870e3f5SYongbok Kim     target_ulong CP0_CMGCRBase;
76950e7edc5SAleksandar Markovic /*
77050e7edc5SAleksandar Markovic  * CP0 Register 16
77150e7edc5SAleksandar Markovic  */
7729c2149c8Sths     int32_t CP0_Config0;
7736af0bf9cSbellard #define CP0C0_M    31
7740413d7a5SAleksandar Markovic #define CP0C0_K23  28    /* 30..28 */
7750413d7a5SAleksandar Markovic #define CP0C0_KU   25    /* 27..25 */
7766af0bf9cSbellard #define CP0C0_MDU  20
777aff2bc6dSYongbok Kim #define CP0C0_MM   18
7786af0bf9cSbellard #define CP0C0_BM   16
7790413d7a5SAleksandar Markovic #define CP0C0_Impl 16    /* 24..16 */
7806af0bf9cSbellard #define CP0C0_BE   15
7810413d7a5SAleksandar Markovic #define CP0C0_AT   13    /* 14..13 */
7820413d7a5SAleksandar Markovic #define CP0C0_AR   10    /* 12..10 */
7830413d7a5SAleksandar Markovic #define CP0C0_MT   7     /*  9..7  */
7847a387fffSths #define CP0C0_VI   3
7850413d7a5SAleksandar Markovic #define CP0C0_K0   0     /*  2..0  */
7869c2149c8Sths     int32_t CP0_Config1;
7877a387fffSths #define CP0C1_M    31
7880413d7a5SAleksandar Markovic #define CP0C1_MMU  25    /* 30..25 */
7890413d7a5SAleksandar Markovic #define CP0C1_IS   22    /* 24..22 */
7900413d7a5SAleksandar Markovic #define CP0C1_IL   19    /* 21..19 */
7910413d7a5SAleksandar Markovic #define CP0C1_IA   16    /* 18..16 */
7920413d7a5SAleksandar Markovic #define CP0C1_DS   13    /* 15..13 */
7930413d7a5SAleksandar Markovic #define CP0C1_DL   10    /* 12..10 */
7940413d7a5SAleksandar Markovic #define CP0C1_DA   7     /*  9..7  */
7957a387fffSths #define CP0C1_C2   6
7967a387fffSths #define CP0C1_MD   5
7976af0bf9cSbellard #define CP0C1_PC   4
7986af0bf9cSbellard #define CP0C1_WR   3
7996af0bf9cSbellard #define CP0C1_CA   2
8006af0bf9cSbellard #define CP0C1_EP   1
8016af0bf9cSbellard #define CP0C1_FP   0
8029c2149c8Sths     int32_t CP0_Config2;
8037a387fffSths #define CP0C2_M    31
8040413d7a5SAleksandar Markovic #define CP0C2_TU   28    /* 30..28 */
8050413d7a5SAleksandar Markovic #define CP0C2_TS   24    /* 27..24 */
8060413d7a5SAleksandar Markovic #define CP0C2_TL   20    /* 23..20 */
8070413d7a5SAleksandar Markovic #define CP0C2_TA   16    /* 19..16 */
8080413d7a5SAleksandar Markovic #define CP0C2_SU   12    /* 15..12 */
8090413d7a5SAleksandar Markovic #define CP0C2_SS   8     /* 11..8  */
8100413d7a5SAleksandar Markovic #define CP0C2_SL   4     /*  7..4  */
8110413d7a5SAleksandar Markovic #define CP0C2_SA   0     /*  3..0  */
8129c2149c8Sths     int32_t CP0_Config3;
8137a387fffSths #define CP0C3_M            31
81470409e67SMaciej W. Rozycki #define CP0C3_BPG          30
815c870e3f5SYongbok Kim #define CP0C3_CMGCR        29
816e97a391dSYongbok Kim #define CP0C3_MSAP         28
817aea14095SLeon Alrae #define CP0C3_BP           27
818aea14095SLeon Alrae #define CP0C3_BI           26
81974dbf824SJames Hogan #define CP0C3_SC           25
8200413d7a5SAleksandar Markovic #define CP0C3_PW           24
8210413d7a5SAleksandar Markovic #define CP0C3_VZ           23
8220413d7a5SAleksandar Markovic #define CP0C3_IPLV         21    /* 22..21 */
8230413d7a5SAleksandar Markovic #define CP0C3_MMAR         18    /* 20..18 */
82470409e67SMaciej W. Rozycki #define CP0C3_MCU          17
825bbfa8f72SNathan Froyd #define CP0C3_ISA_ON_EXC   16
8260413d7a5SAleksandar Markovic #define CP0C3_ISA          14    /* 15..14 */
827d279279eSPetar Jovanovic #define CP0C3_ULRI         13
8287207c7f9SLeon Alrae #define CP0C3_RXI          12
82970409e67SMaciej W. Rozycki #define CP0C3_DSP2P        11
8307a387fffSths #define CP0C3_DSPP         10
8310413d7a5SAleksandar Markovic #define CP0C3_CTXTC        9
8320413d7a5SAleksandar Markovic #define CP0C3_ITL          8
8337a387fffSths #define CP0C3_LPA          7
8347a387fffSths #define CP0C3_VEIC         6
8357a387fffSths #define CP0C3_VInt         5
8367a387fffSths #define CP0C3_SP           4
83770409e67SMaciej W. Rozycki #define CP0C3_CDMM         3
8387a387fffSths #define CP0C3_MT           2
8397a387fffSths #define CP0C3_SM           1
8407a387fffSths #define CP0C3_TL           0
8418280b12cSMaciej W. Rozycki     int32_t CP0_Config4;
8428280b12cSMaciej W. Rozycki     int32_t CP0_Config4_rw_bitmask;
843b4160af1SPetar Jovanovic #define CP0C4_M            31
8440413d7a5SAleksandar Markovic #define CP0C4_IE           29    /* 30..29 */
845a0c80608SPaul Burton #define CP0C4_AE           28
8460413d7a5SAleksandar Markovic #define CP0C4_VTLBSizeExt  24    /* 27..24 */
847e98c0d17SLeon Alrae #define CP0C4_KScrExist    16
84870409e67SMaciej W. Rozycki #define CP0C4_MMUExtDef    14
8490413d7a5SAleksandar Markovic #define CP0C4_FTLBPageSize 8     /* 12..8  */
8500413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=1 */
8510413d7a5SAleksandar Markovic #define CP0C4_MMUSizeExt   0     /*  7..0  */
8520413d7a5SAleksandar Markovic /* bit layout if MMUExtDef=2 */
8530413d7a5SAleksandar Markovic #define CP0C4_FTLBWays     4     /*  7..4  */
8540413d7a5SAleksandar Markovic #define CP0C4_FTLBSets     0     /*  3..0  */
8558280b12cSMaciej W. Rozycki     int32_t CP0_Config5;
8568280b12cSMaciej W. Rozycki     int32_t CP0_Config5_rw_bitmask;
857b4dd99a3SPetar Jovanovic #define CP0C5_M            31
858b4dd99a3SPetar Jovanovic #define CP0C5_K            30
859b4dd99a3SPetar Jovanovic #define CP0C5_CV           29
860b4dd99a3SPetar Jovanovic #define CP0C5_EVA          28
861b4dd99a3SPetar Jovanovic #define CP0C5_MSAEn        27
8620413d7a5SAleksandar Markovic #define CP0C5_PMJ          23    /* 25..23 */
8630413d7a5SAleksandar Markovic #define CP0C5_WR2          22
8640413d7a5SAleksandar Markovic #define CP0C5_NMS          21
8650413d7a5SAleksandar Markovic #define CP0C5_ULS          20
8660413d7a5SAleksandar Markovic #define CP0C5_XPA          19
8670413d7a5SAleksandar Markovic #define CP0C5_CRCP         18
8680413d7a5SAleksandar Markovic #define CP0C5_MI           17
8690413d7a5SAleksandar Markovic #define CP0C5_GI           15    /* 16..15 */
8700413d7a5SAleksandar Markovic #define CP0C5_CA2          14
871b00c7218SYongbok Kim #define CP0C5_XNP          13
8720413d7a5SAleksandar Markovic #define CP0C5_DEC          11
8730413d7a5SAleksandar Markovic #define CP0C5_L2C          10
8747c979afdSLeon Alrae #define CP0C5_UFE          9
8757c979afdSLeon Alrae #define CP0C5_FRE          8
87601bc435bSYongbok Kim #define CP0C5_VP           7
877faf1f68bSLeon Alrae #define CP0C5_SBRI         6
8785204ea79SLeon Alrae #define CP0C5_MVH          5
879ce9782f4SLeon Alrae #define CP0C5_LLB          4
880f6d4dd81SYongbok Kim #define CP0C5_MRP          3
881b4dd99a3SPetar Jovanovic #define CP0C5_UFR          2
882b4dd99a3SPetar Jovanovic #define CP0C5_NFExists     0
883e397ee33Sths     int32_t CP0_Config6;
884e397ee33Sths     int32_t CP0_Config7;
885c7c7e1e9SLeon Alrae     uint64_t CP0_LLAddr;
886f6d4dd81SYongbok Kim     uint64_t CP0_MAAR[MIPS_MAAR_MAX];
887f6d4dd81SYongbok Kim     int32_t CP0_MAARI;
888ead9360eSths     /* XXX: Maybe make LLAddr per-TC? */
88950e7edc5SAleksandar Markovic /*
89050e7edc5SAleksandar Markovic  * CP0 Register 17
89150e7edc5SAleksandar Markovic  */
892c7c7e1e9SLeon Alrae     target_ulong lladdr; /* LL virtual address compared against SC */
893590bc601SPaul Brook     target_ulong llval;
8940b16dcd1SAleksandar Rikalo     uint64_t llval_wp;
8950b16dcd1SAleksandar Rikalo     uint32_t llnewval_wp;
896284b731aSLeon Alrae     uint64_t CP0_LLAddr_rw_bitmask;
8972a6e32ddSAurelien Jarno     int CP0_LLAddr_shift;
89850e7edc5SAleksandar Markovic /*
89950e7edc5SAleksandar Markovic  * CP0 Register 18
90050e7edc5SAleksandar Markovic  */
901fd88b6abSths     target_ulong CP0_WatchLo[8];
90250e7edc5SAleksandar Markovic /*
90350e7edc5SAleksandar Markovic  * CP0 Register 19
90450e7edc5SAleksandar Markovic  */
905fd88b6abSths     int32_t CP0_WatchHi[8];
9066ec98bd7SPaul Burton #define CP0WH_ASID 16
90750e7edc5SAleksandar Markovic /*
90850e7edc5SAleksandar Markovic  * CP0 Register 20
90950e7edc5SAleksandar Markovic  */
9109c2149c8Sths     target_ulong CP0_XContext;
9119c2149c8Sths     int32_t CP0_Framemask;
91250e7edc5SAleksandar Markovic /*
91350e7edc5SAleksandar Markovic  * CP0 Register 23
91450e7edc5SAleksandar Markovic  */
9159c2149c8Sths     int32_t CP0_Debug;
916ead9360eSths #define CP0DB_DBD  31
9176af0bf9cSbellard #define CP0DB_DM   30
9186af0bf9cSbellard #define CP0DB_LSNM 28
9196af0bf9cSbellard #define CP0DB_Doze 27
9206af0bf9cSbellard #define CP0DB_Halt 26
9216af0bf9cSbellard #define CP0DB_CNT  25
9226af0bf9cSbellard #define CP0DB_IBEP 24
9236af0bf9cSbellard #define CP0DB_DBEP 21
9246af0bf9cSbellard #define CP0DB_IEXI 20
9256af0bf9cSbellard #define CP0DB_VER  15
9266af0bf9cSbellard #define CP0DB_DEC  10
9276af0bf9cSbellard #define CP0DB_SSt  8
9286af0bf9cSbellard #define CP0DB_DINT 5
9296af0bf9cSbellard #define CP0DB_DIB  4
9306af0bf9cSbellard #define CP0DB_DDBS 3
9316af0bf9cSbellard #define CP0DB_DDBL 2
9326af0bf9cSbellard #define CP0DB_DBp  1
9336af0bf9cSbellard #define CP0DB_DSS  0
93450e7edc5SAleksandar Markovic /*
93550e7edc5SAleksandar Markovic  * CP0 Register 24
93650e7edc5SAleksandar Markovic  */
937c570fd16Sths     target_ulong CP0_DEPC;
93850e7edc5SAleksandar Markovic /*
93950e7edc5SAleksandar Markovic  * CP0 Register 25
94050e7edc5SAleksandar Markovic  */
9419c2149c8Sths     int32_t CP0_Performance0;
94250e7edc5SAleksandar Markovic /*
94350e7edc5SAleksandar Markovic  * CP0 Register 26
94450e7edc5SAleksandar Markovic  */
9450d74a222SLeon Alrae     int32_t CP0_ErrCtl;
9460d74a222SLeon Alrae #define CP0EC_WST 29
9470d74a222SLeon Alrae #define CP0EC_SPR 28
9480d74a222SLeon Alrae #define CP0EC_ITC 26
94950e7edc5SAleksandar Markovic /*
95050e7edc5SAleksandar Markovic  * CP0 Register 28
95150e7edc5SAleksandar Markovic  */
952284b731aSLeon Alrae     uint64_t CP0_TagLo;
9539c2149c8Sths     int32_t CP0_DataLo;
95450e7edc5SAleksandar Markovic /*
95550e7edc5SAleksandar Markovic  * CP0 Register 29
95650e7edc5SAleksandar Markovic  */
9579c2149c8Sths     int32_t CP0_TagHi;
9589c2149c8Sths     int32_t CP0_DataHi;
95950e7edc5SAleksandar Markovic /*
96050e7edc5SAleksandar Markovic  * CP0 Register 30
96150e7edc5SAleksandar Markovic  */
962c570fd16Sths     target_ulong CP0_ErrorEPC;
96350e7edc5SAleksandar Markovic /*
96450e7edc5SAleksandar Markovic  * CP0 Register 31
96550e7edc5SAleksandar Markovic  */
9669c2149c8Sths     int32_t CP0_DESAVE;
96750e7edc5SAleksandar Markovic 
968b5dc7732Sths     /* We waste some space so we can handle shadow registers like TCs. */
969b5dc7732Sths     TCState tcs[MIPS_SHADOW_SET_MAX];
970f01be154Sths     CPUMIPSFPUContext fpus[MIPS_FPU_MAX];
9715cbdb3a3SStefan Weil     /* QEMU */
9726af0bf9cSbellard     int error_code;
973aea14095SLeon Alrae #define EXCP_TLB_NOMATCH   0x1
974aea14095SLeon Alrae #define EXCP_INST_NOTAVAIL 0x2 /* No valid instruction word for BadInstr */
9756af0bf9cSbellard     uint32_t hflags;    /* CPU State */
9766af0bf9cSbellard     /* TMASK defines different execution modes */
97742c86612SJames Hogan #define MIPS_HFLAG_TMASK  0x1F5807FF
97879ef2c4cSNathan Froyd #define MIPS_HFLAG_MODE   0x00007 /* execution modes                    */
979623a930eSths     /* The KSU flags must be the lowest bits in hflags. The flag order
980623a930eSths        must be the same as defined for CP0 Status. This allows to use
981623a930eSths        the bits as the value of mmu_idx. */
98279ef2c4cSNathan Froyd #define MIPS_HFLAG_KSU    0x00003 /* kernel/supervisor/user mode mask   */
98379ef2c4cSNathan Froyd #define MIPS_HFLAG_UM     0x00002 /* user mode flag                     */
98479ef2c4cSNathan Froyd #define MIPS_HFLAG_SM     0x00001 /* supervisor mode flag               */
98579ef2c4cSNathan Froyd #define MIPS_HFLAG_KM     0x00000 /* kernel mode flag                   */
98679ef2c4cSNathan Froyd #define MIPS_HFLAG_DM     0x00004 /* Debug mode                         */
98779ef2c4cSNathan Froyd #define MIPS_HFLAG_64     0x00008 /* 64-bit instructions enabled        */
98879ef2c4cSNathan Froyd #define MIPS_HFLAG_CP0    0x00010 /* CP0 enabled                        */
98979ef2c4cSNathan Froyd #define MIPS_HFLAG_FPU    0x00020 /* FPU enabled                        */
99079ef2c4cSNathan Froyd #define MIPS_HFLAG_F64    0x00040 /* 64-bit FPU enabled                 */
991b8aa4598Sths     /* True if the MIPS IV COP1X instructions can be used.  This also
992b8aa4598Sths        controls the non-COP1X instructions RECIP.S, RECIP.D, RSQRT.S
993b8aa4598Sths        and RSQRT.D.  */
99479ef2c4cSNathan Froyd #define MIPS_HFLAG_COP1X  0x00080 /* COP1X instructions enabled         */
99579ef2c4cSNathan Froyd #define MIPS_HFLAG_RE     0x00100 /* Reversed endianness                */
99601f72885SLeon Alrae #define MIPS_HFLAG_AWRAP  0x00200 /* 32-bit compatibility address wrapping */
99779ef2c4cSNathan Froyd #define MIPS_HFLAG_M16    0x00400 /* MIPS16 mode flag                   */
99879ef2c4cSNathan Froyd #define MIPS_HFLAG_M16_SHIFT 10
9994ad40f36Sbellard     /* If translation is interrupted between the branch instruction and
10004ad40f36Sbellard      * the delay slot, record what type of branch it is so that we can
10014ad40f36Sbellard      * resume translation properly.  It might be possible to reduce
10024ad40f36Sbellard      * this from three bits to two.  */
1003339cd2a8SLeon Alrae #define MIPS_HFLAG_BMASK_BASE  0x803800
100479ef2c4cSNathan Froyd #define MIPS_HFLAG_B      0x00800 /* Unconditional branch               */
100579ef2c4cSNathan Froyd #define MIPS_HFLAG_BC     0x01000 /* Conditional branch                 */
100679ef2c4cSNathan Froyd #define MIPS_HFLAG_BL     0x01800 /* Likely branch                      */
100779ef2c4cSNathan Froyd #define MIPS_HFLAG_BR     0x02000 /* branch to register (can't link TB) */
100879ef2c4cSNathan Froyd     /* Extra flags about the current pending branch.  */
1009b231c103SYongbok Kim #define MIPS_HFLAG_BMASK_EXT 0x7C000
101079ef2c4cSNathan Froyd #define MIPS_HFLAG_B16    0x04000 /* branch instruction was 16 bits     */
101179ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS16  0x08000 /* branch requires 16-bit delay slot  */
101279ef2c4cSNathan Froyd #define MIPS_HFLAG_BDS32  0x10000 /* branch requires 32-bit delay slot  */
1013b231c103SYongbok Kim #define MIPS_HFLAG_BDS_STRICT  0x20000 /* Strict delay slot size */
1014b231c103SYongbok Kim #define MIPS_HFLAG_BX     0x40000 /* branch exchanges execution mode    */
101579ef2c4cSNathan Froyd #define MIPS_HFLAG_BMASK  (MIPS_HFLAG_BMASK_BASE | MIPS_HFLAG_BMASK_EXT)
1016853c3240SJia Liu     /* MIPS DSP resources access. */
1017908f6be1SStefan Markovic #define MIPS_HFLAG_DSP    0x080000   /* Enable access to DSP resources.    */
1018908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R2 0x100000   /* Enable access to DSP R2 resources. */
1019908f6be1SStefan Markovic #define MIPS_HFLAG_DSP_R3 0x20000000 /* Enable access to DSP R3 resources. */
1020d279279eSPetar Jovanovic     /* Extra flag about HWREna register. */
1021b231c103SYongbok Kim #define MIPS_HFLAG_HWRENA_ULR 0x200000 /* ULR bit from HWREna is set. */
1022faf1f68bSLeon Alrae #define MIPS_HFLAG_SBRI  0x400000 /* R6 SDBBP causes RI excpt. in user mode */
1023339cd2a8SLeon Alrae #define MIPS_HFLAG_FBNSLOT 0x800000 /* Forbidden slot                   */
1024e97a391dSYongbok Kim #define MIPS_HFLAG_MSA   0x1000000
10257c979afdSLeon Alrae #define MIPS_HFLAG_FRE   0x2000000 /* FRE enabled */
1026e117f526SLeon Alrae #define MIPS_HFLAG_ELPA  0x4000000
10270d74a222SLeon Alrae #define MIPS_HFLAG_ITC_CACHE  0x8000000 /* CACHE instr. operates on ITC tag */
102842c86612SJames Hogan #define MIPS_HFLAG_ERL   0x10000000 /* error level flag */
10296af0bf9cSbellard     target_ulong btarget;        /* Jump / branch target               */
10301ba74fb8Saurel32     target_ulong bcond;          /* Branch condition (if needed)       */
1031a316d335Sbellard 
10327a387fffSths     int SYNCI_Step; /* Address step size for SYNCI */
10337a387fffSths     int CCRes; /* Cycle count resolution/divisor */
1034ead9360eSths     uint32_t CP0_Status_rw_bitmask; /* Read/write bits in CP0_Status */
1035ead9360eSths     uint32_t CP0_TCStatus_rw_bitmask; /* Read/write bits in CP0_TCStatus */
1036f9c9cd63SPhilippe Mathieu-Daudé     uint64_t insn_flags; /* Supported instruction set */
10375fb2dcd1SYongbok Kim     int saarp;
10387a387fffSths 
10391f5c00cfSAlex Bennée     /* Fields up to this point are cleared by a CPU reset */
10401f5c00cfSAlex Bennée     struct {} end_reset_fields;
10411f5c00cfSAlex Bennée 
1042a316d335Sbellard     CPU_COMMON
10436ae81775Sths 
1044f0c3c505SAndreas Färber     /* Fields from here on are preserved across CPU reset. */
104551cc2e78SBlue Swirl     CPUMIPSMVPContext *mvp;
10463c7b48b7SPaul Brook #if !defined(CONFIG_USER_ONLY)
104751cc2e78SBlue Swirl     CPUMIPSTLBContext *tlb;
10483c7b48b7SPaul Brook #endif
104951cc2e78SBlue Swirl 
1050c227f099SAnthony Liguori     const mips_def_t *cpu_model;
105133ac7f16Sths     void *irq[8];
10521246b259SStefan Weil     QEMUTimer *timer; /* Internal timer */
1053043715d1SYongbok Kim     struct MIPSITUState *itu;
105434fa7e83SLeon Alrae     MemoryRegion *itc_tag; /* ITC Configuration Tags */
105589777fd1SLeon Alrae     target_ulong exception_base; /* ExceptionBase input to the core */
10566af0bf9cSbellard };
10576af0bf9cSbellard 
1058416bf936SPaolo Bonzini /**
1059416bf936SPaolo Bonzini  * MIPSCPU:
1060416bf936SPaolo Bonzini  * @env: #CPUMIPSState
1061416bf936SPaolo Bonzini  *
1062416bf936SPaolo Bonzini  * A MIPS CPU.
1063416bf936SPaolo Bonzini  */
1064416bf936SPaolo Bonzini struct MIPSCPU {
1065416bf936SPaolo Bonzini     /*< private >*/
1066416bf936SPaolo Bonzini     CPUState parent_obj;
1067416bf936SPaolo Bonzini     /*< public >*/
1068416bf936SPaolo Bonzini 
1069416bf936SPaolo Bonzini     CPUMIPSState env;
1070416bf936SPaolo Bonzini };
1071416bf936SPaolo Bonzini 
1072416bf936SPaolo Bonzini static inline MIPSCPU *mips_env_get_cpu(CPUMIPSState *env)
1073416bf936SPaolo Bonzini {
1074416bf936SPaolo Bonzini     return container_of(env, MIPSCPU, env);
1075416bf936SPaolo Bonzini }
1076416bf936SPaolo Bonzini 
1077416bf936SPaolo Bonzini #define ENV_GET_CPU(e) CPU(mips_env_get_cpu(e))
1078416bf936SPaolo Bonzini 
1079416bf936SPaolo Bonzini #define ENV_OFFSET offsetof(MIPSCPU, env)
1080416bf936SPaolo Bonzini 
10810442428aSMarkus Armbruster void mips_cpu_list(void);
1082647de6caSths 
10839467d44cSths #define cpu_signal_handler cpu_mips_signal_handler
1084c732abe2Sj_mayer #define cpu_list mips_cpu_list
10859467d44cSths 
1086084d0497SRichard Henderson extern void cpu_wrdsp(uint32_t rs, uint32_t mask_num, CPUMIPSState *env);
1087084d0497SRichard Henderson extern uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env);
1088084d0497SRichard Henderson 
1089623a930eSths /* MMU modes definitions. We carefully match the indices with our
1090623a930eSths    hflags layout. */
10916ebbf390Sj_mayer #define MMU_MODE0_SUFFIX _kernel
1092623a930eSths #define MMU_MODE1_SUFFIX _super
1093623a930eSths #define MMU_MODE2_SUFFIX _user
109442c86612SJames Hogan #define MMU_MODE3_SUFFIX _error
1095623a930eSths #define MMU_USER_IDX 2
1096b0fc6003SJames Hogan 
1097b0fc6003SJames Hogan static inline int hflags_mmu_index(uint32_t hflags)
1098b0fc6003SJames Hogan {
109942c86612SJames Hogan     if (hflags & MIPS_HFLAG_ERL) {
110042c86612SJames Hogan         return 3; /* ERL */
110142c86612SJames Hogan     } else {
1102b0fc6003SJames Hogan         return hflags & MIPS_HFLAG_KSU;
1103b0fc6003SJames Hogan     }
110442c86612SJames Hogan }
1105b0fc6003SJames Hogan 
110697ed5ccdSBenjamin Herrenschmidt static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
11076ebbf390Sj_mayer {
1108b0fc6003SJames Hogan     return hflags_mmu_index(env->hflags);
11096ebbf390Sj_mayer }
11106ebbf390Sj_mayer 
1111022c62cbSPaolo Bonzini #include "exec/cpu-all.h"
11126af0bf9cSbellard 
11136af0bf9cSbellard /* Memory access type :
11146af0bf9cSbellard  * may be needed for precise access rights control and precise exceptions.
11156af0bf9cSbellard  */
11166af0bf9cSbellard enum {
11176af0bf9cSbellard     /* 1 bit to define user level / supervisor access */
11186af0bf9cSbellard     ACCESS_USER  = 0x00,
11196af0bf9cSbellard     ACCESS_SUPER = 0x01,
11206af0bf9cSbellard     /* 1 bit to indicate direction */
11216af0bf9cSbellard     ACCESS_STORE = 0x02,
11226af0bf9cSbellard     /* Type of instruction that generated the access */
11236af0bf9cSbellard     ACCESS_CODE  = 0x10, /* Code fetch access                */
11246af0bf9cSbellard     ACCESS_INT   = 0x20, /* Integer load/store access        */
11256af0bf9cSbellard     ACCESS_FLOAT = 0x30, /* floating point load/store access */
11266af0bf9cSbellard };
11276af0bf9cSbellard 
11286af0bf9cSbellard /* Exceptions */
11296af0bf9cSbellard enum {
11306af0bf9cSbellard     EXCP_NONE          = -1,
11316af0bf9cSbellard     EXCP_RESET         = 0,
11326af0bf9cSbellard     EXCP_SRESET,
11336af0bf9cSbellard     EXCP_DSS,
11346af0bf9cSbellard     EXCP_DINT,
113514e51cc7Sths     EXCP_DDBL,
113614e51cc7Sths     EXCP_DDBS,
11376af0bf9cSbellard     EXCP_NMI,
11386af0bf9cSbellard     EXCP_MCHECK,
113914e51cc7Sths     EXCP_EXT_INTERRUPT, /* 8 */
11406af0bf9cSbellard     EXCP_DFWATCH,
114114e51cc7Sths     EXCP_DIB,
11426af0bf9cSbellard     EXCP_IWATCH,
11436af0bf9cSbellard     EXCP_AdEL,
11446af0bf9cSbellard     EXCP_AdES,
11456af0bf9cSbellard     EXCP_TLBF,
11466af0bf9cSbellard     EXCP_IBE,
114714e51cc7Sths     EXCP_DBp, /* 16 */
11486af0bf9cSbellard     EXCP_SYSCALL,
114914e51cc7Sths     EXCP_BREAK,
11504ad40f36Sbellard     EXCP_CpU,
11516af0bf9cSbellard     EXCP_RI,
11526af0bf9cSbellard     EXCP_OVERFLOW,
11536af0bf9cSbellard     EXCP_TRAP,
11545a5012ecSths     EXCP_FPE,
115514e51cc7Sths     EXCP_DWATCH, /* 24 */
11566af0bf9cSbellard     EXCP_LTLBL,
11576af0bf9cSbellard     EXCP_TLBL,
11586af0bf9cSbellard     EXCP_TLBS,
11596af0bf9cSbellard     EXCP_DBE,
1160ead9360eSths     EXCP_THREAD,
116114e51cc7Sths     EXCP_MDMX,
116214e51cc7Sths     EXCP_C2E,
116314e51cc7Sths     EXCP_CACHE, /* 32 */
1164853c3240SJia Liu     EXCP_DSPDIS,
1165e97a391dSYongbok Kim     EXCP_MSADIS,
1166e97a391dSYongbok Kim     EXCP_MSAFPE,
116792ceb440SLeon Alrae     EXCP_TLBXI,
116892ceb440SLeon Alrae     EXCP_TLBRI,
116914e51cc7Sths 
117092ceb440SLeon Alrae     EXCP_LAST = EXCP_TLBRI,
11716af0bf9cSbellard };
11726af0bf9cSbellard 
1173f249412cSEdgar E. Iglesias /*
117426aa3d9aSPhilippe Mathieu-Daudé  * This is an internally generated WAKE request line.
1175f249412cSEdgar E. Iglesias  * It is driven by the CPU itself. Raised when the MT
1176f249412cSEdgar E. Iglesias  * block wants to wake a VPE from an inactive state and
1177f249412cSEdgar E. Iglesias  * cleared when VPE goes from active to inactive.
1178f249412cSEdgar E. Iglesias  */
1179f249412cSEdgar E. Iglesias #define CPU_INTERRUPT_WAKE CPU_INTERRUPT_TGT_INT_0
1180f249412cSEdgar E. Iglesias 
1181388bb21aSths int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc);
11826af0bf9cSbellard 
1183a7519f2bSIgor Mammedov #define MIPS_CPU_TYPE_SUFFIX "-" TYPE_MIPS_CPU
1184a7519f2bSIgor Mammedov #define MIPS_CPU_TYPE_NAME(model) model MIPS_CPU_TYPE_SUFFIX
11850dacec87SIgor Mammedov #define CPU_RESOLVING_TYPE TYPE_MIPS_CPU
1186a7519f2bSIgor Mammedov 
1187a7519f2bSIgor Mammedov bool cpu_supports_cps_smp(const char *cpu_type);
11885b1e0981SAleksandar Markovic bool cpu_supports_isa(const char *cpu_type, uint64_t isa);
118989777fd1SLeon Alrae void cpu_set_exception_base(int vp_index, target_ulong address);
119030bf942dSAndreas Färber 
11915dc5d9f0SAurelien Jarno /* mips_int.c */
11927db13faeSAndreas Färber void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level);
11935dc5d9f0SAurelien Jarno 
1194043715d1SYongbok Kim /* mips_itu.c */
1195043715d1SYongbok Kim void itc_reconfigure(struct MIPSITUState *tag);
1196043715d1SYongbok Kim 
1197f9480ffcSths /* helper.c */
11981239b472SKwok Cheung Yeung target_ulong exception_resume_pc(CPUMIPSState *env);
1199f9480ffcSths 
1200599bc5e8SAleksandar Markovic static inline void restore_snan_bit_mode(CPUMIPSState *env)
1201599bc5e8SAleksandar Markovic {
1202599bc5e8SAleksandar Markovic     set_snan_bit_is_one((env->active_fpu.fcr31 & (1 << FCR31_NAN2008)) == 0,
1203599bc5e8SAleksandar Markovic                         &env->active_fpu.fp_status);
1204599bc5e8SAleksandar Markovic }
1205599bc5e8SAleksandar Markovic 
12067db13faeSAndreas Färber static inline void cpu_get_tb_cpu_state(CPUMIPSState *env, target_ulong *pc,
120789fee74aSEmilio G. Cota                                         target_ulong *cs_base, uint32_t *flags)
12086b917547Saliguori {
12096b917547Saliguori     *pc = env->active_tc.PC;
12106b917547Saliguori     *cs_base = 0;
1211d279279eSPetar Jovanovic     *flags = env->hflags & (MIPS_HFLAG_TMASK | MIPS_HFLAG_BMASK |
1212d279279eSPetar Jovanovic                             MIPS_HFLAG_HWRENA_ULR);
12136b917547Saliguori }
12146b917547Saliguori 
121507f5a258SMarkus Armbruster #endif /* MIPS_CPU_H */
1216