~jderose/ubuntu/raring/qemu/vde-again

« back to all changes in this revision

Viewing changes to target-mips/translate_init.c

  • Committer: Bazaar Package Importer
  • Author(s): Aurelien Jarno, Aurelien Jarno
  • Date: 2009-03-22 10:13:17 UTC
  • mfrom: (1.2.1 upstream) (6.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20090322101317-iigjtnu5qil35dtb
Tags: 0.10.1-1
[ Aurelien Jarno ]
* New upstream stable release:
  - patches/80_stable-branch.patch: remove.
* debian/control: 
  - Remove depends on proll.
  - Move depends on device-tree-compiler to build-depends.
  - Bump Standards-Version to 3.8.1 (no changes).
* patches/82_qemu-img_decimal.patch: new patch from upstream to make
  qemu-img accept sizes with decimal values (closes: bug#501400).

Show diffs side-by-side

added added

removed removed

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