~vcs-imports/qemu/git

« back to all changes in this revision

Viewing changes to target-mips/translate_init.c

  • Committer: Blue Swirl
  • Date: 2009-08-31 15:14:40 UTC
  • Revision ID: git-v1:528e93a9787ccfc59582a44035f5f342caf5b84f
Fix breakage due to __thread

Thread-local storage is not supported on all hosts.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
 * Lesser General Public License for more details.
16
16
 *
17
17
 * You should have received a copy of the GNU Lesser General Public
18
 
 * License along with this library; if not, write to the Free Software
19
 
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20
19
 */
21
20
 
22
21
/* CPU / CPU family specific config register values. */
63
62
};
64
63
 
65
64
struct mips_def_t {
66
 
    const unsigned char *name;
 
65
    const char *name;
67
66
    int32_t CP0_PRid;
68
67
    int32_t CP0_Config0;
69
68
    int32_t CP0_Config1;
95
94
 
96
95
/*****************************************************************************/
97
96
/* MIPS CPU definitions */
98
 
static mips_def_t mips_defs[] =
 
97
static const mips_def_t mips_defs[] =
99
98
{
100
99
    {
101
100
        .name = "4Kc",
102
101
        .CP0_PRid = 0x00018000,
103
102
        .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT),
104
103
        .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
105
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
106
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
104
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
105
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
107
106
        .CP0_Config2 = MIPS_CONFIG2,
108
107
        .CP0_Config3 = MIPS_CONFIG3,
109
108
        .SYNCI_Step = 32,
121
120
           no virtual icache, uncached coherency. */
122
121
        .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT),
123
122
        .CP0_Config1 = MIPS_CONFIG1 |
124
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
125
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
123
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
124
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
126
125
        .CP0_Config2 = MIPS_CONFIG2,
127
126
        .CP0_Config3 = MIPS_CONFIG3,
128
127
        .SYNCI_Step = 32,
138
137
        .CP0_PRid = 0x00018400,
139
138
        .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT),
140
139
        .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
141
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
142
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
140
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
141
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
143
142
        .CP0_Config2 = MIPS_CONFIG2,
144
143
        .CP0_Config3 = MIPS_CONFIG3,
145
144
        .SYNCI_Step = 32,
155
154
        .CP0_PRid = 0x00018500,
156
155
        .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT),
157
156
        .CP0_Config1 = MIPS_CONFIG1 |
158
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
159
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
157
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
158
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
160
159
        .CP0_Config2 = MIPS_CONFIG2,
161
160
        .CP0_Config3 = MIPS_CONFIG3,
162
161
        .SYNCI_Step = 32,
173
172
        .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
174
173
                    (MMU_TYPE_R4000 << CP0C0_MT),
175
174
        .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
176
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
177
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
175
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
176
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
178
177
        .CP0_Config2 = MIPS_CONFIG2,
179
178
        .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt),
180
179
        .SYNCI_Step = 32,
189
188
        .name = "4KEm",
190
189
        .CP0_PRid = 0x00019100,
191
190
        .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
192
 
                    (MMU_TYPE_FMT << CP0C0_MT),
 
191
                       (MMU_TYPE_FMT << CP0C0_MT),
193
192
        .CP0_Config1 = MIPS_CONFIG1 |
194
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
195
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
193
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
194
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
196
195
        .CP0_Config2 = MIPS_CONFIG2,
197
196
        .CP0_Config3 = MIPS_CONFIG3,
198
197
        .SYNCI_Step = 32,
207
206
        .name = "24Kc",
208
207
        .CP0_PRid = 0x00019300,
209
208
        .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
210
 
                    (MMU_TYPE_R4000 << CP0C0_MT),
 
209
                       (MMU_TYPE_R4000 << CP0C0_MT),
211
210
        .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
212
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
213
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
211
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
212
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
214
213
        .CP0_Config2 = MIPS_CONFIG2,
215
214
        .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt),
216
215
        .SYNCI_Step = 32,
228
227
        .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
229
228
                    (MMU_TYPE_R4000 << CP0C0_MT),
230
229
        .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) |
231
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
232
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
230
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
231
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
233
232
        .CP0_Config2 = MIPS_CONFIG2,
234
233
        .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt),
235
234
        .SYNCI_Step = 32,
247
246
        .name = "34Kf",
248
247
        .CP0_PRid = 0x00019500,
249
248
        .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
250
 
                    (MMU_TYPE_R4000 << CP0C0_MT),
 
249
                       (MMU_TYPE_R4000 << CP0C0_MT),
251
250
        .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) |
252
 
                    (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
253
 
                    (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
 
251
                       (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
 
252
                       (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
254
253
        .CP0_Config2 = MIPS_CONFIG2,
255
254
        .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt) | (1 << CP0C3_MT),
256
255
        .SYNCI_Step = 32,
293
292
        .CP0_PRid = 0x00000400,
294
293
        /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */
295
294
        .CP0_Config0 = (1 << 17) | (0x1 << 9) | (0x1 << 6) | (0x2 << CP0C0_K0),
296
 
        /* Note: Config1 is only used internally, the R4000 has only Config0. */
 
295
        /* Note: Config1 is only used internally, the R4000 has only Config0. */
297
296
        .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU),
298
297
        .SYNCI_Step = 16,
299
298
        .CCRes = 2,
300
299
        .CP0_Status_rw_bitmask = 0x3678FFFF,
301
 
        /* The R4000 has a full 64bit FPU but doesn't use the fcr0 bits. */
 
300
        /* The R4000 has a full 64bit FPU but doesn't use the fcr0 bits. */
302
301
        .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x0 << FCR0_REV),
303
302
        .SEGBITS = 40,
304
303
        .PABITS = 36,
325
324
        .name = "5Kc",
326
325
        .CP0_PRid = 0x00018100,
327
326
        .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) |
328
 
                    (MMU_TYPE_R4000 << CP0C0_MT),
 
327
                       (MMU_TYPE_R4000 << CP0C0_MT),
329
328
        .CP0_Config1 = MIPS_CONFIG1 | (31 << CP0C1_MMU) |
330
 
                    (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
331
 
                    (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
332
 
                    (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
 
329
                       (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
 
330
                       (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
 
331
                       (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
333
332
        .CP0_Config2 = MIPS_CONFIG2,
334
333
        .CP0_Config3 = MIPS_CONFIG3,
335
334
        .SYNCI_Step = 32,
344
343
        .name = "5Kf",
345
344
        .CP0_PRid = 0x00018100,
346
345
        .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) |
347
 
                    (MMU_TYPE_R4000 << CP0C0_MT),
 
346
                       (MMU_TYPE_R4000 << CP0C0_MT),
348
347
        .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) |
349
 
                    (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
350
 
                    (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
351
 
                    (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
 
348
                       (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
 
349
                       (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
 
350
                       (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
352
351
        .CP0_Config2 = MIPS_CONFIG2,
353
352
        .CP0_Config3 = MIPS_CONFIG3,
354
353
        .SYNCI_Step = 32,
355
354
        .CCRes = 2,
356
355
        .CP0_Status_rw_bitmask = 0x36F8FFFF,
357
 
        /* The 5Kf has F64 / L / W but doesn't use the fcr0 bits. */
 
356
        /* The 5Kf has F64 / L / W but doesn't use the fcr0 bits. */
358
357
        .CP1_fcr0 = (1 << FCR0_D) | (1 << FCR0_S) |
359
358
                    (0x81 << FCR0_PRID) | (0x0 << FCR0_REV),
360
359
        .SEGBITS = 42,
364
363
    },
365
364
    {
366
365
        .name = "20Kc",
367
 
        /* We emulate a later version of the 20Kc, earlier ones had a broken
 
366
        /* We emulate a later version of the 20Kc, earlier ones had a broken
368
367
           WAIT instruction. */
369
368
        .CP0_PRid = 0x000182a0,
370
369
        .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) |
371
370
                    (MMU_TYPE_R4000 << CP0C0_MT) | (1 << CP0C0_VI),
372
371
        .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (47 << CP0C1_MMU) |
373
 
                    (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
374
 
                    (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
375
 
                    (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
 
372
                       (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
 
373
                       (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
 
374
                       (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
376
375
        .CP0_Config2 = MIPS_CONFIG2,
377
376
        .CP0_Config3 = MIPS_CONFIG3,
378
377
        .SYNCI_Step = 32,
379
378
        .CCRes = 1,
380
379
        .CP0_Status_rw_bitmask = 0x36FBFFFF,
381
 
        /* The 20Kc has F64 / L / W but doesn't use the fcr0 bits. */
 
380
        /* The 20Kc has F64 / L / W but doesn't use the fcr0 bits. */
382
381
        .CP1_fcr0 = (1 << FCR0_3D) | (1 << FCR0_PS) |
383
382
                    (1 << FCR0_D) | (1 << FCR0_S) |
384
383
                    (0x82 << FCR0_PRID) | (0x0 << FCR0_REV),
388
387
        .mmu_type = MMU_TYPE_R4000,
389
388
    },
390
389
    {
391
 
        /* A generic CPU providing MIPS64 Release 2 features.
 
390
        /* A generic CPU providing MIPS64 Release 2 features.
392
391
           FIXME: Eventually this should be replaced by a real CPU model. */
393
392
        .name = "MIPS64R2-generic",
394
393
        .CP0_PRid = 0x00010000,
395
394
        .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) |
396
 
                    (MMU_TYPE_R4000 << CP0C0_MT),
 
395
                       (MMU_TYPE_R4000 << CP0C0_MT),
397
396
        .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) |
398
 
                    (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
399
 
                    (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
400
 
                    (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
 
397
                       (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
 
398
                       (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
 
399
                       (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
401
400
        .CP0_Config2 = MIPS_CONFIG2,
402
401
        .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_LPA),
403
402
        .SYNCI_Step = 32,
417
416
#endif
418
417
};
419
418
 
420
 
static const mips_def_t *cpu_mips_find_by_name (const unsigned char *name)
 
419
static const mips_def_t *cpu_mips_find_by_name (const char *name)
421
420
{
422
421
    int i;
423
422
 
424
 
    for (i = 0; i < sizeof(mips_defs) / sizeof(mips_defs[0]); i++) {
 
423
    for (i = 0; i < ARRAY_SIZE(mips_defs); i++) {
425
424
        if (strcasecmp(name, mips_defs[i].name) == 0) {
426
425
            return &mips_defs[i];
427
426
        }
433
432
{
434
433
    int i;
435
434
 
436
 
    for (i = 0; i < sizeof(mips_defs) / sizeof(mips_defs[0]); i++) {
 
435
    for (i = 0; i < ARRAY_SIZE(mips_defs); i++) {
437
436
        (*cpu_fprintf)(f, "MIPS '%s'\n",
438
437
                       mips_defs[i].name);
439
438
    }
456
455
{
457
456
    env->tlb->nb_tlb = 1 + ((def->CP0_Config1 >> CP0C1_MMU) & 63);
458
457
    env->tlb->map_address = &r4k_map_address;
459
 
    env->tlb->do_tlbwi = r4k_do_tlbwi;
460
 
    env->tlb->do_tlbwr = r4k_do_tlbwr;
461
 
    env->tlb->do_tlbp = r4k_do_tlbp;
462
 
    env->tlb->do_tlbr = r4k_do_tlbr;
 
458
    env->tlb->helper_tlbwi = r4k_helper_tlbwi;
 
459
    env->tlb->helper_tlbwr = r4k_helper_tlbwr;
 
460
    env->tlb->helper_tlbp = r4k_helper_tlbp;
 
461
    env->tlb->helper_tlbr = r4k_helper_tlbr;
463
462
}
464
463
 
465
464
static void mmu_init (CPUMIPSState *env, const mips_def_t *def)
489
488
 
490
489
static void fpu_init (CPUMIPSState *env, const mips_def_t *def)
491
490
{
492
 
    env->fpu = qemu_mallocz(sizeof(CPUMIPSFPUContext));
493
 
 
494
 
    env->fpu->fcr0 = def->CP1_fcr0;
495
 
#ifdef CONFIG_USER_ONLY
 
491
    int i;
 
492
 
 
493
    for (i = 0; i < MIPS_FPU_MAX; i++)
 
494
        env->fpus[i].fcr0 = def->CP1_fcr0;
 
495
 
 
496
    memcpy(&env->active_fpu, &env->fpus[0], sizeof(env->active_fpu));
 
497
#if defined(CONFIG_USER_ONLY)
496
498
    if (env->CP0_Config1 & (1 << CP0C1_FP))
497
499
        env->hflags |= MIPS_HFLAG_FPU;
498
500
#ifdef TARGET_MIPS64
499
 
    if (env->fpu->fcr0 & (1 << FCR0_F64))
 
501
    if (env->active_fpu.fcr0 & (1 << FCR0_F64))
500
502
        env->hflags |= MIPS_HFLAG_F64;
501
503
#endif
502
504
#endif
512
514
       implemented, 5 TCs implemented. */
513
515
    env->mvp->CP0_MVPConf0 = (1 << CP0MVPC0_M) | (1 << CP0MVPC0_TLBS) |
514
516
                             (0 << CP0MVPC0_GS) | (1 << CP0MVPC0_PCP) |
515
 
#ifndef CONFIG_USER_ONLY
516
 
                             /* Usermode has no TLB support */
517
 
                             (env->tlb->nb_tlb << CP0MVPC0_PTLBE) |
518
 
#endif
519
517
// TODO: actually do 2 VPEs.
520
518
//                             (1 << CP0MVPC0_TCA) | (0x1 << CP0MVPC0_PVPE) |
521
519
//                             (0x04 << CP0MVPC0_PTC);
522
520
                             (1 << CP0MVPC0_TCA) | (0x0 << CP0MVPC0_PVPE) |
523
521
                             (0x04 << CP0MVPC0_PTC);
 
522
#if !defined(CONFIG_USER_ONLY)
 
523
    /* Usermode has no TLB support */
 
524
    env->mvp->CP0_MVPConf0 |= (env->tlb->nb_tlb << CP0MVPC0_PTLBE);
 
525
#endif
 
526
 
524
527
    /* Allocatable CP1 have media extensions, allocatable CP1 have FP support,
525
528
       no UDI implemented, no CP2 implemented, 1 CP1 implemented. */
526
529
    env->mvp->CP0_MVPConf1 = (1 << CP0MVPC1_CIM) | (1 << CP0MVPC1_CIF) |
546
549
    env->CP0_TCStatus_rw_bitmask = def->CP0_TCStatus_rw_bitmask;
547
550
    env->CP0_SRSCtl = def->CP0_SRSCtl;
548
551
    env->current_tc = 0;
549
 
    env->current_tc_gprs = &env->gpr[env->current_tc][0];
550
 
    env->current_tc_hi = &env->HI[env->current_tc][0];
551
552
    env->SEGBITS = def->SEGBITS;
552
553
    env->SEGMask = (target_ulong)((1ULL << def->SEGBITS) - 1);
553
554
#if defined(TARGET_MIPS64)