Revision ead9360e target-mips/cpu.h

b/target-mips/cpu.h
17 17
typedef unsigned int            uint_fast16_t;
18 18
#endif
19 19

  
20
typedef union fpr_t fpr_t;
21
union fpr_t {
22
    float64  fd;   /* ieee double precision */
23
    float32  fs[2];/* ieee single precision */
24
    uint64_t d;    /* binary double fixed-point */
25
    uint32_t w[2]; /* binary single fixed-point */
26
};
27
/* define FP_ENDIAN_IDX to access the same location
28
 * in the fpr_t union regardless of the host endianess
29
 */
30
#if defined(WORDS_BIGENDIAN)
31
#  define FP_ENDIAN_IDX 1
32
#else
33
#  define FP_ENDIAN_IDX 0
34
#endif
20
struct CPUMIPSState;
35 21

  
36 22
typedef struct r4k_tlb_t r4k_tlb_t;
37 23
struct r4k_tlb_t {
......
48 34
    target_ulong PFN[2];
49 35
};
50 36

  
51
typedef struct mips_def_t mips_def_t;
37
typedef struct CPUMIPSTLBContext CPUMIPSTLBContext;
38
struct CPUMIPSTLBContext {
39
    uint32_t nb_tlb;
40
    uint32_t tlb_in_use;
41
    int (*map_address) (struct CPUMIPSState *env, target_ulong *physical, int *prot, target_ulong address, int rw, int access_type);
42
    void (*do_tlbwi) (void);
43
    void (*do_tlbwr) (void);
44
    void (*do_tlbp) (void);
45
    void (*do_tlbr) (void);
46
    union {
47
        struct {
48
            r4k_tlb_t tlb[MIPS_TLB_MAX];
49
        } r4k;
50
    } mmu;
51
};
52 52

  
53
typedef struct CPUMIPSState CPUMIPSState;
54
struct CPUMIPSState {
55
    /* General integer registers */
56
    target_ulong gpr[32];
57
    /* Special registers */
58
    target_ulong PC;
59
#if TARGET_LONG_BITS > HOST_LONG_BITS
60
    target_ulong t0;
61
    target_ulong t1;
62
    target_ulong t2;
53
typedef union fpr_t fpr_t;
54
union fpr_t {
55
    float64  fd;   /* ieee double precision */
56
    float32  fs[2];/* ieee single precision */
57
    uint64_t d;    /* binary double fixed-point */
58
    uint32_t w[2]; /* binary single fixed-point */
59
};
60
/* define FP_ENDIAN_IDX to access the same location
61
 * in the fpr_t union regardless of the host endianess
62
 */
63
#if defined(WORDS_BIGENDIAN)
64
#  define FP_ENDIAN_IDX 1
65
#else
66
#  define FP_ENDIAN_IDX 0
63 67
#endif
64
    target_ulong HI, LO;
68

  
69
typedef struct CPUMIPSFPUContext CPUMIPSFPUContext;
70
struct CPUMIPSFPUContext {
65 71
    /* Floating point registers */
66 72
    fpr_t fpr[32];
67 73
#ifndef USE_HOST_FLOAT_REGS
......
99 105
#define FP_DIV0           8
100 106
#define FP_INVALID        16
101 107
#define FP_UNIMPLEMENTED  32
108
};
109

  
110
typedef struct CPUMIPSMVPContext CPUMIPSMVPContext;
111
struct CPUMIPSMVPContext {
112
    int32_t CP0_MVPControl;
113
#define CP0MVPCo_CPA	3
114
#define CP0MVPCo_STLB	2
115
#define CP0MVPCo_VPC	1
116
#define CP0MVPCo_EVP	0
117
    int32_t CP0_MVPConf0;
118
#define CP0MVPC0_M	31
119
#define CP0MVPC0_TLBS	29
120
#define CP0MVPC0_GS	28
121
#define CP0MVPC0_PCP	27
122
#define CP0MVPC0_PTLBE	16
123
#define CP0MVPC0_TCA	15
124
#define CP0MVPC0_PVPE	10
125
#define CP0MVPC0_PTC	0
126
    int32_t CP0_MVPConf1;
127
#define CP0MVPC1_CIM	31
128
#define CP0MVPC1_CIF	30
129
#define CP0MVPC1_PCX	20
130
#define CP0MVPC1_PCP2	10
131
#define CP0MVPC1_PCP1	0
132
};
133

  
134
typedef struct mips_def_t mips_def_t;
135

  
136
#define MIPS_SHADOW_SET_MAX 16
137
#define MIPS_TC_MAX 5
138
#define MIPS_DSP_ACC 4
139

  
140
typedef struct CPUMIPSState CPUMIPSState;
141
struct CPUMIPSState {
142
    /* General integer registers */
143
    target_ulong gpr[32][MIPS_SHADOW_SET_MAX];
144
    /* Special registers */
145
    target_ulong PC[MIPS_TC_MAX];
146
#if TARGET_LONG_BITS > HOST_LONG_BITS
147
    target_ulong t0;
148
    target_ulong t1;
149
    target_ulong t2;
150
#endif
151
    target_ulong HI[MIPS_DSP_ACC][MIPS_TC_MAX];
152
    target_ulong LO[MIPS_DSP_ACC][MIPS_TC_MAX];
153
    target_ulong ACX[MIPS_DSP_ACC][MIPS_TC_MAX];
154
    target_ulong DSPControl[MIPS_TC_MAX];
155

  
156
    CPUMIPSMVPContext *mvp;
157
    CPUMIPSTLBContext *tlb;
158
    CPUMIPSFPUContext *fpu;
159
    uint32_t current_tc;
102 160

  
103
    uint32_t nb_tlb;
104
    uint32_t tlb_in_use;
105 161
    uint32_t SEGBITS;
106 162
    target_ulong SEGMask;
107
    int (*map_address) (CPUMIPSState *env, target_ulong *physical, int *prot, target_ulong address, int rw, int access_type);
108
    void (*do_tlbwi) (void);
109
    void (*do_tlbwr) (void);
110
    void (*do_tlbp) (void);
111
    void (*do_tlbr) (void);
112
    union {
113
        struct {
114
            r4k_tlb_t tlb[MIPS_TLB_MAX];
115
        } r4k;
116
    } mmu;
117 163

  
118 164
    int32_t CP0_Index;
165
    /* CP0_MVP* are per MVP registers. */
119 166
    int32_t CP0_Random;
167
    int32_t CP0_VPEControl;
168
#define CP0VPECo_YSI	21
169
#define CP0VPECo_GSI	20
170
#define CP0VPECo_EXCPT	16
171
#define CP0VPECo_TE	15
172
#define CP0VPECo_TargTC	0
173
    int32_t CP0_VPEConf0;
174
#define CP0VPEC0_M	31
175
#define CP0VPEC0_XTC	21
176
#define CP0VPEC0_TCS	19
177
#define CP0VPEC0_SCS	18
178
#define CP0VPEC0_DSC	17
179
#define CP0VPEC0_ICS	16
180
#define CP0VPEC0_MVP	1
181
#define CP0VPEC0_VPA	0
182
    int32_t CP0_VPEConf1;
183
#define CP0VPEC1_NCX	20
184
#define CP0VPEC1_NCP2	10
185
#define CP0VPEC1_NCP1	0
186
    target_ulong CP0_YQMask;
187
    target_ulong CP0_VPESchedule;
188
    target_ulong CP0_VPEScheFBack;
189
    int32_t CP0_VPEOpt;
190
#define CP0VPEOpt_IWX7	15
191
#define CP0VPEOpt_IWX6	14
192
#define CP0VPEOpt_IWX5	13
193
#define CP0VPEOpt_IWX4	12
194
#define CP0VPEOpt_IWX3	11
195
#define CP0VPEOpt_IWX2	10
196
#define CP0VPEOpt_IWX1	9
197
#define CP0VPEOpt_IWX0	8
198
#define CP0VPEOpt_DWX7	7
199
#define CP0VPEOpt_DWX6	6
200
#define CP0VPEOpt_DWX5	5
201
#define CP0VPEOpt_DWX4	4
202
#define CP0VPEOpt_DWX3	3
203
#define CP0VPEOpt_DWX2	2
204
#define CP0VPEOpt_DWX1	1
205
#define CP0VPEOpt_DWX0	0
120 206
    target_ulong CP0_EntryLo0;
207
    int32_t CP0_TCStatus[MIPS_TC_MAX];
208
#define CP0TCSt_TCU3	31
209
#define CP0TCSt_TCU2	30
210
#define CP0TCSt_TCU1	29
211
#define CP0TCSt_TCU0	28
212
#define CP0TCSt_TMX	27
213
#define CP0TCSt_RNST	23
214
#define CP0TCSt_TDS	21
215
#define CP0TCSt_DT	20
216
#define CP0TCSt_DA	15
217
#define CP0TCSt_A	13
218
#define CP0TCSt_TKSU	11
219
#define CP0TCSt_IXMT	10
220
#define CP0TCSt_TASID	0
221
    int32_t CP0_TCBind[MIPS_TC_MAX];
222
#define CP0TCBd_CurTC	21
223
#define CP0TCBd_TBE	17
224
#define CP0TCBd_CurVPE	0
225
    target_ulong CP0_TCHalt[MIPS_TC_MAX];
226
    target_ulong CP0_TCContext[MIPS_TC_MAX];
227
    target_ulong CP0_TCSchedule[MIPS_TC_MAX];
228
    target_ulong CP0_TCScheFBack[MIPS_TC_MAX];
121 229
    target_ulong CP0_EntryLo1;
122 230
    target_ulong CP0_Context;
123 231
    int32_t CP0_PageMask;
124 232
    int32_t CP0_PageGrain;
125 233
    int32_t CP0_Wired;
234
    int32_t CP0_SRSConf0_rw_bitmask;
235
    int32_t CP0_SRSConf0;
236
#define CP0SRSC0_M	31
237
#define CP0SRSC0_SRS3	20
238
#define CP0SRSC0_SRS2	10
239
#define CP0SRSC0_SRS1	0
240
    int32_t CP0_SRSConf1_rw_bitmask;
241
    int32_t CP0_SRSConf1;
242
#define CP0SRSC1_M	31
243
#define CP0SRSC1_SRS6	20
244
#define CP0SRSC1_SRS5	10
245
#define CP0SRSC1_SRS4	0
246
    int32_t CP0_SRSConf2_rw_bitmask;
247
    int32_t CP0_SRSConf2;
248
#define CP0SRSC2_M	31
249
#define CP0SRSC2_SRS9	20
250
#define CP0SRSC2_SRS8	10
251
#define CP0SRSC2_SRS7	0
252
    int32_t CP0_SRSConf3_rw_bitmask;
253
    int32_t CP0_SRSConf3;
254
#define CP0SRSC3_M	31
255
#define CP0SRSC3_SRS12	20
256
#define CP0SRSC3_SRS11	10
257
#define CP0SRSC3_SRS10	0
258
    int32_t CP0_SRSConf4_rw_bitmask;
259
    int32_t CP0_SRSConf4;
260
#define CP0SRSC4_SRS15	20
261
#define CP0SRSC4_SRS14	10
262
#define CP0SRSC4_SRS13	0
126 263
    int32_t CP0_HWREna;
127 264
    target_ulong CP0_BadVAddr;
128 265
    int32_t CP0_Count;
......
152 289
#define CP0St_EXL   1
153 290
#define CP0St_IE    0
154 291
    int32_t CP0_IntCtl;
292
#define CP0IntCtl_IPTI 29
293
#define CP0IntCtl_IPPC1 26
294
#define CP0IntCtl_VS 5
155 295
    int32_t CP0_SRSCtl;
296
#define CP0SRSCtl_HSS 26
297
#define CP0SRSCtl_EICSS 18
298
#define CP0SRSCtl_ESS 12
299
#define CP0SRSCtl_PSS 6
300
#define CP0SRSCtl_CSS 0
156 301
    int32_t CP0_SRSMap;
302
#define CP0SRSMap_SSV7 28
303
#define CP0SRSMap_SSV6 24
304
#define CP0SRSMap_SSV5 20
305
#define CP0SRSMap_SSV4 16
306
#define CP0SRSMap_SSV3 12
307
#define CP0SRSMap_SSV2 8
308
#define CP0SRSMap_SSV1 4
309
#define CP0SRSMap_SSV0 0
157 310
    int32_t CP0_Cause;
158 311
#define CP0Ca_BD   31
159 312
#define CP0Ca_TI   30
......
219 372
#define CP0C3_TL   0
220 373
    int32_t CP0_Config6;
221 374
    int32_t CP0_Config7;
375
    /* XXX: Maybe make LLAddr per-TC? */
222 376
    target_ulong CP0_LLAddr;
223 377
    target_ulong CP0_WatchLo[8];
224 378
    int32_t CP0_WatchHi[8];
225 379
    target_ulong CP0_XContext;
226 380
    int32_t CP0_Framemask;
227 381
    int32_t CP0_Debug;
228
#define CPDB_DBD   31
382
#define CP0DB_DBD  31
229 383
#define CP0DB_DM   30
230 384
#define CP0DB_LSNM 28
231 385
#define CP0DB_Doze 27
......
243 397
#define CP0DB_DDBL 2
244 398
#define CP0DB_DBp  1
245 399
#define CP0DB_DSS  0
400
    int32_t CP0_Debug_tcstatus[MIPS_TC_MAX];
246 401
    target_ulong CP0_DEPC;
247 402
    int32_t CP0_Performance0;
248 403
    int32_t CP0_TagLo;
......
284 439

  
285 440
    int SYNCI_Step; /* Address step size for SYNCI */
286 441
    int CCRes; /* Cycle count resolution/divisor */
287
    int Status_rw_bitmask; /* Read/write bits in CP0_Status */
442
    uint32_t CP0_Status_rw_bitmask; /* Read/write bits in CP0_Status */
443
    uint32_t CP0_TCStatus_rw_bitmask; /* Read/write bits in CP0_TCStatus */
288 444

  
289 445
#ifdef CONFIG_USER_ONLY
290 446
    target_ulong tls_value;
......
376 532
    EXCP_TLBS,
377 533
    EXCP_DBE,
378 534
    EXCP_DDBL,
535
    EXCP_THREAD,
379 536
    EXCP_MTCP0         = 0x104, /* mtmsr instruction:               */
380 537
                                /* may change privilege level       */
381 538
    EXCP_BRANCH        = 0x108, /* branch instruction               */

Also available in: Unified diff