Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ 8ecc7913

History | View | Annotate | Download (124.9 kB)

1
/*
2
 *  PowerPC CPU initialization for qemu.
3
 * 
4
 *  Copyright (c) 2003-2007 Jocelyn Mayer
5
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
 */
20

    
21
/* A lot of PowerPC definition have been included here.
22
 * Most of them are not usable for now but have been kept
23
 * inside "#if defined(TODO) ... #endif" statements to make tests easier.
24
 */
25

    
26
//#define PPC_DUMP_CPU
27
//#define PPC_DEBUG_SPR
28
//#define PPC_DEBUG_IRQ
29

    
30
struct ppc_def_t {
31
    const unsigned char *name;
32
    uint32_t pvr;
33
    uint32_t pvr_mask;
34
    uint64_t insns_flags;
35
    uint32_t flags;
36
    uint64_t msr_mask;
37
};
38

    
39
/* For user-mode emulation, we don't emulate any IRQ controller */
40
#if defined(CONFIG_USER_ONLY)
41
#define PPC_IRQ_INIT_FN(name)                                         \
42
static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \
43
{                                                                     \
44
}
45
#else
46
#define PPC_IRQ_INIT_FN(name)                                         \
47
void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
48
#endif
49
PPC_IRQ_INIT_FN(405);
50
PPC_IRQ_INIT_FN(6xx);
51
PPC_IRQ_INIT_FN(970);
52

    
53
/* Generic callbacks:
54
 * do nothing but store/retrieve spr value
55
 */
56
static void spr_read_generic (void *opaque, int sprn)
57
{
58
    gen_op_load_spr(sprn);
59
}
60

    
61
static void spr_write_generic (void *opaque, int sprn)
62
{
63
    gen_op_store_spr(sprn);
64
}
65

    
66
static void spr_read_dump (void *opaque, int sprn)
67
{
68
    gen_op_load_dump_spr(sprn);
69
}
70

    
71
static void spr_write_dump (void *opaque, int sprn)
72
{
73
    gen_op_store_dump_spr(sprn);
74
}
75

    
76
#if !defined(CONFIG_USER_ONLY)
77
static void spr_write_clear (void *opaque, int sprn)
78
{
79
    gen_op_mask_spr(sprn);
80
}
81
#endif
82

    
83
/* SPR common to all PowerPC */
84
/* XER */
85
static void spr_read_xer (void *opaque, int sprn)
86
{
87
    gen_op_load_xer();
88
}
89

    
90
static void spr_write_xer (void *opaque, int sprn)
91
{
92
    gen_op_store_xer();
93
}
94

    
95
/* LR */
96
static void spr_read_lr (void *opaque, int sprn)
97
{
98
    gen_op_load_lr();
99
}
100

    
101
static void spr_write_lr (void *opaque, int sprn)
102
{
103
    gen_op_store_lr();
104
}
105

    
106
/* CTR */
107
static void spr_read_ctr (void *opaque, int sprn)
108
{
109
    gen_op_load_ctr();
110
}
111

    
112
static void spr_write_ctr (void *opaque, int sprn)
113
{
114
    gen_op_store_ctr();
115
}
116

    
117
/* User read access to SPR */
118
/* USPRx */
119
/* UMMCRx */
120
/* UPMCx */
121
/* USIA */
122
/* UDECR */
123
static void spr_read_ureg (void *opaque, int sprn)
124
{
125
    gen_op_load_spr(sprn + 0x10);
126
}
127

    
128
/* SPR common to all non-embedded PowerPC */
129
/* DECR */
130
#if !defined(CONFIG_USER_ONLY)
131
static void spr_read_decr (void *opaque, int sprn)
132
{
133
    gen_op_load_decr();
134
}
135

    
136
static void spr_write_decr (void *opaque, int sprn)
137
{
138
    gen_op_store_decr();
139
}
140
#endif
141

    
142
/* SPR common to all non-embedded PowerPC, except 601 */
143
/* Time base */
144
static void spr_read_tbl (void *opaque, int sprn)
145
{
146
    gen_op_load_tbl();
147
}
148

    
149
static void spr_read_tbu (void *opaque, int sprn)
150
{
151
    gen_op_load_tbu();
152
}
153

    
154
#if !defined(CONFIG_USER_ONLY)
155
static void spr_write_tbl (void *opaque, int sprn)
156
{
157
    gen_op_store_tbl();
158
}
159

    
160
static void spr_write_tbu (void *opaque, int sprn)
161
{
162
    gen_op_store_tbu();
163
}
164
#endif
165

    
166
#if !defined(CONFIG_USER_ONLY)
167
/* IBAT0U...IBAT0U */
168
/* IBAT0L...IBAT7L */
169
static void spr_read_ibat (void *opaque, int sprn)
170
{
171
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
172
}
173

    
174
static void spr_read_ibat_h (void *opaque, int sprn)
175
{
176
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);
177
}
178

    
179
static void spr_write_ibatu (void *opaque, int sprn)
180
{
181
    DisasContext *ctx = opaque;
182

    
183
    gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);
184
    RET_STOP(ctx);
185
}
186

    
187
static void spr_write_ibatu_h (void *opaque, int sprn)
188
{
189
    DisasContext *ctx = opaque;
190

    
191
    gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);
192
    RET_STOP(ctx);
193
}
194

    
195
static void spr_write_ibatl (void *opaque, int sprn)
196
{
197
    DisasContext *ctx = opaque;
198

    
199
    gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);
200
    RET_STOP(ctx);
201
}
202

    
203
static void spr_write_ibatl_h (void *opaque, int sprn)
204
{
205
    DisasContext *ctx = opaque;
206

    
207
    gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);
208
    RET_STOP(ctx);
209
}
210

    
211
/* DBAT0U...DBAT7U */
212
/* DBAT0L...DBAT7L */
213
static void spr_read_dbat (void *opaque, int sprn)
214
{
215
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);
216
}
217

    
218
static void spr_read_dbat_h (void *opaque, int sprn)
219
{
220
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);
221
}
222

    
223
static void spr_write_dbatu (void *opaque, int sprn)
224
{
225
    DisasContext *ctx = opaque;
226

    
227
    gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);
228
    RET_STOP(ctx);
229
}
230

    
231
static void spr_write_dbatu_h (void *opaque, int sprn)
232
{
233
    DisasContext *ctx = opaque;
234

    
235
    gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);
236
    RET_STOP(ctx);
237
}
238

    
239
static void spr_write_dbatl (void *opaque, int sprn)
240
{
241
    DisasContext *ctx = opaque;
242

    
243
    gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);
244
    RET_STOP(ctx);
245
}
246

    
247
static void spr_write_dbatl_h (void *opaque, int sprn)
248
{
249
    DisasContext *ctx = opaque;
250

    
251
    gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);
252
    RET_STOP(ctx);
253
}
254

    
255
/* SDR1 */
256
static void spr_read_sdr1 (void *opaque, int sprn)
257
{
258
    gen_op_load_sdr1();
259
}
260

    
261
static void spr_write_sdr1 (void *opaque, int sprn)
262
{
263
    DisasContext *ctx = opaque;
264

    
265
    gen_op_store_sdr1();
266
    RET_STOP(ctx);
267
}
268

    
269
/* 64 bits PowerPC specific SPRs */
270
/* ASR */
271
#if defined(TARGET_PPC64)
272
static void spr_read_asr (void *opaque, int sprn)
273
{
274
    gen_op_load_asr();
275
}
276

    
277
static void spr_write_asr (void *opaque, int sprn)
278
{
279
    DisasContext *ctx = opaque;
280

    
281
    gen_op_store_asr();
282
    RET_STOP(ctx);
283
}
284
#endif
285
#endif /* !defined(CONFIG_USER_ONLY) */
286

    
287
/* PowerPC 601 specific registers */
288
/* RTC */
289
static void spr_read_601_rtcl (void *opaque, int sprn)
290
{
291
    gen_op_load_601_rtcl();
292
}
293

    
294
static void spr_read_601_rtcu (void *opaque, int sprn)
295
{
296
    gen_op_load_601_rtcu();
297
}
298

    
299
#if !defined(CONFIG_USER_ONLY)
300
static void spr_write_601_rtcu (void *opaque, int sprn)
301
{
302
    gen_op_store_601_rtcu();
303
}
304

    
305
static void spr_write_601_rtcl (void *opaque, int sprn)
306
{
307
    gen_op_store_601_rtcl();
308
}
309
#endif
310

    
311
/* Unified bats */
312
#if !defined(CONFIG_USER_ONLY)
313
static void spr_read_601_ubat (void *opaque, int sprn)
314
{
315
    gen_op_load_601_bat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
316
}
317

    
318
static void spr_write_601_ubatu (void *opaque, int sprn)
319
{
320
    DisasContext *ctx = opaque;
321

    
322
    gen_op_store_601_batu((sprn - SPR_IBAT0U) / 2);
323
    RET_STOP(ctx);
324
}
325

    
326
static void spr_write_601_ubatl (void *opaque, int sprn)
327
{
328
    DisasContext *ctx = opaque;
329

    
330
    gen_op_store_601_batl((sprn - SPR_IBAT0L) / 2);
331
    RET_STOP(ctx);
332
}
333
#endif
334

    
335
/* PowerPC 40x specific registers */
336
#if !defined(CONFIG_USER_ONLY)
337
static void spr_read_40x_pit (void *opaque, int sprn)
338
{
339
    gen_op_load_40x_pit();
340
}
341

    
342
static void spr_write_40x_pit (void *opaque, int sprn)
343
{
344
    gen_op_store_40x_pit();
345
}
346

    
347
static void spr_write_40x_dbcr0 (void *opaque, int sprn)
348
{
349
    DisasContext *ctx = opaque;
350

    
351
    gen_op_store_40x_dbcr0();
352
    /* We must stop translation as we may have rebooted */
353
    RET_STOP(ctx);
354
}
355

    
356
static void spr_write_booke_tcr (void *opaque, int sprn)
357
{
358
    gen_op_store_booke_tcr();
359
}
360

    
361
static void spr_write_booke_tsr (void *opaque, int sprn)
362
{
363
    gen_op_store_booke_tsr();
364
}
365
#endif
366

    
367
/* PowerPC 403 specific registers */
368
/* PBL1 / PBU1 / PBL2 / PBU2 */
369
#if !defined(CONFIG_USER_ONLY)
370
static void spr_read_403_pbr (void *opaque, int sprn)
371
{
372
    gen_op_load_403_pb(sprn - SPR_403_PBL1);
373
}
374

    
375
static void spr_write_403_pbr (void *opaque, int sprn)
376
{
377
    DisasContext *ctx = opaque;
378

    
379
    gen_op_store_403_pb(sprn - SPR_403_PBL1);
380
    RET_STOP(ctx);
381
}
382

    
383
static void spr_write_pir (void *opaque, int sprn)
384
{
385
    gen_op_store_pir();
386
}
387
#endif
388

    
389
#if defined(CONFIG_USER_ONLY)
390
#define spr_register(env, num, name, uea_read, uea_write,                     \
391
                     oea_read, oea_write, initial_value)                      \
392
do {                                                                          \
393
     _spr_register(env, num, name, uea_read, uea_write, initial_value);       \
394
} while (0)
395
static inline void _spr_register (CPUPPCState *env, int num,
396
                                  const unsigned char *name,
397
                                  void (*uea_read)(void *opaque, int sprn),
398
                                  void (*uea_write)(void *opaque, int sprn),
399
                                  target_ulong initial_value)
400
#else
401
static inline void spr_register (CPUPPCState *env, int num,
402
                                 const unsigned char *name,
403
                                 void (*uea_read)(void *opaque, int sprn),
404
                                 void (*uea_write)(void *opaque, int sprn),
405
                                 void (*oea_read)(void *opaque, int sprn),
406
                                 void (*oea_write)(void *opaque, int sprn),
407
                                 target_ulong initial_value)
408
#endif
409
{
410
    ppc_spr_t *spr;
411

    
412
    spr = &env->spr_cb[num];
413
    if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
414
#if !defined(CONFIG_USER_ONLY)
415
        spr->oea_read != NULL || spr->oea_write != NULL ||
416
#endif
417
        spr->uea_read != NULL || spr->uea_write != NULL) {
418
        printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
419
        exit(1);
420
    }
421
#if defined(PPC_DEBUG_SPR)
422
    printf("*** register spr %d (%03x) %s val " ADDRX "\n", num, num, name,
423
           initial_value);
424
#endif
425
    spr->name = name;
426
    spr->uea_read = uea_read;
427
    spr->uea_write = uea_write;
428
#if !defined(CONFIG_USER_ONLY)
429
    spr->oea_read = oea_read;
430
    spr->oea_write = oea_write;
431
#endif
432
    env->spr[num] = initial_value;
433
}
434

    
435
/* Generic PowerPC SPRs */
436
static void gen_spr_generic (CPUPPCState *env)
437
{
438
    /* Integer processing */
439
    spr_register(env, SPR_XER, "XER",
440
                 &spr_read_xer, &spr_write_xer,
441
                 &spr_read_xer, &spr_write_xer,
442
                 0x00000000);
443
    /* Branch contol */
444
    spr_register(env, SPR_LR, "LR",
445
                 &spr_read_lr, &spr_write_lr,
446
                 &spr_read_lr, &spr_write_lr,
447
                 0x00000000);
448
    spr_register(env, SPR_CTR, "CTR",
449
                 &spr_read_ctr, &spr_write_ctr,
450
                 &spr_read_ctr, &spr_write_ctr,
451
                 0x00000000);
452
    /* Interrupt processing */
453
    spr_register(env, SPR_SRR0, "SRR0",
454
                 SPR_NOACCESS, SPR_NOACCESS,
455
                 &spr_read_generic, &spr_write_generic,
456
                 0x00000000);
457
    spr_register(env, SPR_SRR1, "SRR1",
458
                 SPR_NOACCESS, SPR_NOACCESS,
459
                 &spr_read_generic, &spr_write_generic,
460
                 0x00000000);
461
    /* Processor control */
462
    spr_register(env, SPR_SPRG0, "SPRG0",
463
                 SPR_NOACCESS, SPR_NOACCESS,
464
                 &spr_read_generic, &spr_write_generic,
465
                 0x00000000);
466
    spr_register(env, SPR_SPRG1, "SPRG1",
467
                 SPR_NOACCESS, SPR_NOACCESS,
468
                 &spr_read_generic, &spr_write_generic,
469
                 0x00000000);
470
    spr_register(env, SPR_SPRG2, "SPRG2",
471
                 SPR_NOACCESS, SPR_NOACCESS,
472
                 &spr_read_generic, &spr_write_generic,
473
                 0x00000000);
474
    spr_register(env, SPR_SPRG3, "SPRG3",
475
                 SPR_NOACCESS, SPR_NOACCESS,
476
                 &spr_read_generic, &spr_write_generic,
477
                 0x00000000);
478
}
479

    
480
/* SPR common to all non-embedded PowerPC, including 601 */
481
static void gen_spr_ne_601 (CPUPPCState *env)
482
{
483
    /* Exception processing */
484
    spr_register(env, SPR_DSISR, "DSISR",
485
                 SPR_NOACCESS, SPR_NOACCESS,
486
                 &spr_read_generic, &spr_write_generic,
487
                 0x00000000);
488
    spr_register(env, SPR_DAR, "DAR",
489
                 SPR_NOACCESS, SPR_NOACCESS,
490
                 &spr_read_generic, &spr_write_generic,
491
                 0x00000000);
492
    /* Timer */
493
    spr_register(env, SPR_DECR, "DECR",
494
                 SPR_NOACCESS, SPR_NOACCESS,
495
                 &spr_read_decr, &spr_write_decr,
496
                 0x00000000);
497
    /* Memory management */
498
    spr_register(env, SPR_SDR1, "SDR1",
499
                 SPR_NOACCESS, SPR_NOACCESS,
500
                 &spr_read_sdr1, &spr_write_sdr1,
501
                 0x00000000);
502
}
503

    
504
/* BATs 0-3 */
505
static void gen_low_BATs (CPUPPCState *env)
506
{
507
    spr_register(env, SPR_IBAT0U, "IBAT0U",
508
                 SPR_NOACCESS, SPR_NOACCESS,
509
                 &spr_read_ibat, &spr_write_ibatu,
510
                 0x00000000);
511
    spr_register(env, SPR_IBAT0L, "IBAT0L",
512
                 SPR_NOACCESS, SPR_NOACCESS,
513
                 &spr_read_ibat, &spr_write_ibatl,
514
                 0x00000000);
515
    spr_register(env, SPR_IBAT1U, "IBAT1U",
516
                 SPR_NOACCESS, SPR_NOACCESS,
517
                 &spr_read_ibat, &spr_write_ibatu,
518
                 0x00000000);
519
    spr_register(env, SPR_IBAT1L, "IBAT1L",
520
                 SPR_NOACCESS, SPR_NOACCESS,
521
                 &spr_read_ibat, &spr_write_ibatl,
522
                 0x00000000);
523
    spr_register(env, SPR_IBAT2U, "IBAT2U",
524
                 SPR_NOACCESS, SPR_NOACCESS,
525
                 &spr_read_ibat, &spr_write_ibatu,
526
                 0x00000000);
527
    spr_register(env, SPR_IBAT2L, "IBAT2L",
528
                 SPR_NOACCESS, SPR_NOACCESS,
529
                 &spr_read_ibat, &spr_write_ibatl,
530
                 0x00000000);
531
    spr_register(env, SPR_IBAT3U, "IBAT3U",
532
                 SPR_NOACCESS, SPR_NOACCESS,
533
                 &spr_read_ibat, &spr_write_ibatu,
534
                 0x00000000);
535
    spr_register(env, SPR_IBAT3L, "IBAT3L",
536
                 SPR_NOACCESS, SPR_NOACCESS,
537
                 &spr_read_ibat, &spr_write_ibatl,
538
                 0x00000000);
539
    spr_register(env, SPR_DBAT0U, "DBAT0U",
540
                 SPR_NOACCESS, SPR_NOACCESS,
541
                 &spr_read_dbat, &spr_write_dbatu,
542
                 0x00000000);
543
    spr_register(env, SPR_DBAT0L, "DBAT0L",
544
                 SPR_NOACCESS, SPR_NOACCESS,
545
                 &spr_read_dbat, &spr_write_dbatl,
546
                 0x00000000);
547
    spr_register(env, SPR_DBAT1U, "DBAT1U",
548
                 SPR_NOACCESS, SPR_NOACCESS,
549
                 &spr_read_dbat, &spr_write_dbatu,
550
                 0x00000000);
551
    spr_register(env, SPR_DBAT1L, "DBAT1L",
552
                 SPR_NOACCESS, SPR_NOACCESS,
553
                 &spr_read_dbat, &spr_write_dbatl,
554
                 0x00000000);
555
    spr_register(env, SPR_DBAT2U, "DBAT2U",
556
                 SPR_NOACCESS, SPR_NOACCESS,
557
                 &spr_read_dbat, &spr_write_dbatu,
558
                 0x00000000);
559
    spr_register(env, SPR_DBAT2L, "DBAT2L",
560
                 SPR_NOACCESS, SPR_NOACCESS,
561
                 &spr_read_dbat, &spr_write_dbatl,
562
                 0x00000000);
563
    spr_register(env, SPR_DBAT3U, "DBAT3U",
564
                 SPR_NOACCESS, SPR_NOACCESS,
565
                 &spr_read_dbat, &spr_write_dbatu,
566
                 0x00000000);
567
    spr_register(env, SPR_DBAT3L, "DBAT3L",
568
                 SPR_NOACCESS, SPR_NOACCESS,
569
                 &spr_read_dbat, &spr_write_dbatl,
570
                 0x00000000);
571
    env->nb_BATs = 4;
572
}
573

    
574
/* BATs 4-7 */
575
static void gen_high_BATs (CPUPPCState *env)
576
{
577
    spr_register(env, SPR_IBAT4U, "IBAT4U",
578
                 SPR_NOACCESS, SPR_NOACCESS,
579
                 &spr_read_ibat_h, &spr_write_ibatu_h,
580
                 0x00000000);
581
    spr_register(env, SPR_IBAT4L, "IBAT4L",
582
                 SPR_NOACCESS, SPR_NOACCESS,
583
                 &spr_read_ibat_h, &spr_write_ibatl_h,
584
                 0x00000000);
585
    spr_register(env, SPR_IBAT5U, "IBAT5U",
586
                 SPR_NOACCESS, SPR_NOACCESS,
587
                 &spr_read_ibat_h, &spr_write_ibatu_h,
588
                 0x00000000);
589
    spr_register(env, SPR_IBAT5L, "IBAT5L",
590
                 SPR_NOACCESS, SPR_NOACCESS,
591
                 &spr_read_ibat_h, &spr_write_ibatl_h,
592
                 0x00000000);
593
    spr_register(env, SPR_IBAT6U, "IBAT6U",
594
                 SPR_NOACCESS, SPR_NOACCESS,
595
                 &spr_read_ibat_h, &spr_write_ibatu_h,
596
                 0x00000000);
597
    spr_register(env, SPR_IBAT6L, "IBAT6L",
598
                 SPR_NOACCESS, SPR_NOACCESS,
599
                 &spr_read_ibat_h, &spr_write_ibatl_h,
600
                 0x00000000);
601
    spr_register(env, SPR_IBAT7U, "IBAT7U",
602
                 SPR_NOACCESS, SPR_NOACCESS,
603
                 &spr_read_ibat_h, &spr_write_ibatu_h,
604
                 0x00000000);
605
    spr_register(env, SPR_IBAT7L, "IBAT7L",
606
                 SPR_NOACCESS, SPR_NOACCESS,
607
                 &spr_read_ibat_h, &spr_write_ibatl_h,
608
                 0x00000000);
609
    spr_register(env, SPR_DBAT4U, "DBAT4U",
610
                 SPR_NOACCESS, SPR_NOACCESS,
611
                 &spr_read_dbat_h, &spr_write_dbatu_h,
612
                 0x00000000);
613
    spr_register(env, SPR_DBAT4L, "DBAT4L",
614
                 SPR_NOACCESS, SPR_NOACCESS,
615
                 &spr_read_dbat_h, &spr_write_dbatl_h,
616
                 0x00000000);
617
    spr_register(env, SPR_DBAT5U, "DBAT5U",
618
                 SPR_NOACCESS, SPR_NOACCESS,
619
                 &spr_read_dbat_h, &spr_write_dbatu_h,
620
                 0x00000000);
621
    spr_register(env, SPR_DBAT5L, "DBAT5L",
622
                 SPR_NOACCESS, SPR_NOACCESS,
623
                 &spr_read_dbat_h, &spr_write_dbatl_h,
624
                 0x00000000);
625
    spr_register(env, SPR_DBAT6U, "DBAT6U",
626
                 SPR_NOACCESS, SPR_NOACCESS,
627
                 &spr_read_dbat_h, &spr_write_dbatu_h,
628
                 0x00000000);
629
    spr_register(env, SPR_DBAT6L, "DBAT6L",
630
                 SPR_NOACCESS, SPR_NOACCESS,
631
                 &spr_read_dbat_h, &spr_write_dbatl_h,
632
                 0x00000000);
633
    spr_register(env, SPR_DBAT7U, "DBAT7U",
634
                 SPR_NOACCESS, SPR_NOACCESS,
635
                 &spr_read_dbat_h, &spr_write_dbatu_h,
636
                 0x00000000);
637
    spr_register(env, SPR_DBAT7L, "DBAT7L",
638
                 SPR_NOACCESS, SPR_NOACCESS,
639
                 &spr_read_dbat_h, &spr_write_dbatl_h,
640
                 0x00000000);
641
    env->nb_BATs = 8;
642
}
643

    
644
/* Generic PowerPC time base */
645
static void gen_tbl (CPUPPCState *env)
646
{
647
    spr_register(env, SPR_VTBL,  "TBL",
648
                 &spr_read_tbl, SPR_NOACCESS,
649
                 &spr_read_tbl, SPR_NOACCESS,
650
                 0x00000000);
651
    spr_register(env, SPR_TBL,   "TBL",
652
                 SPR_NOACCESS, SPR_NOACCESS,
653
                 SPR_NOACCESS, &spr_write_tbl,
654
                 0x00000000);
655
    spr_register(env, SPR_VTBU,  "TBU",
656
                 &spr_read_tbu, SPR_NOACCESS,
657
                 &spr_read_tbu, SPR_NOACCESS,
658
                 0x00000000);
659
    spr_register(env, SPR_TBU,   "TBU",
660
                 SPR_NOACCESS, SPR_NOACCESS,
661
                 SPR_NOACCESS, &spr_write_tbu,
662
                 0x00000000);
663
}
664

    
665
/* Softare table search registers */
666
static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
667
{
668
    env->nb_tlb = nb_tlbs;
669
    env->nb_ways = nb_ways;
670
    env->id_tlbs = 1;
671
    spr_register(env, SPR_DMISS, "DMISS",
672
                 SPR_NOACCESS, SPR_NOACCESS,
673
                 &spr_read_generic, SPR_NOACCESS,
674
                 0x00000000);
675
    spr_register(env, SPR_DCMP, "DCMP",
676
                 SPR_NOACCESS, SPR_NOACCESS,
677
                 &spr_read_generic, SPR_NOACCESS,
678
                 0x00000000);
679
    spr_register(env, SPR_HASH1, "HASH1",
680
                 SPR_NOACCESS, SPR_NOACCESS,
681
                 &spr_read_generic, SPR_NOACCESS,
682
                 0x00000000);
683
    spr_register(env, SPR_HASH2, "HASH2",
684
                 SPR_NOACCESS, SPR_NOACCESS,
685
                 &spr_read_generic, SPR_NOACCESS,
686
                 0x00000000);
687
    spr_register(env, SPR_IMISS, "IMISS",
688
                 SPR_NOACCESS, SPR_NOACCESS,
689
                 &spr_read_generic, SPR_NOACCESS,
690
                 0x00000000);
691
    spr_register(env, SPR_ICMP, "ICMP",
692
                 SPR_NOACCESS, SPR_NOACCESS,
693
                 &spr_read_generic, SPR_NOACCESS,
694
                 0x00000000);
695
    spr_register(env, SPR_RPA, "RPA",
696
                 SPR_NOACCESS, SPR_NOACCESS,
697
                 &spr_read_generic, &spr_write_generic,
698
                 0x00000000);
699
}
700

    
701
/* SPR common to MPC755 and G2 */
702
static void gen_spr_G2_755 (CPUPPCState *env)
703
{
704
    /* SGPRs */
705
    spr_register(env, SPR_SPRG4, "SPRG4",
706
                 SPR_NOACCESS, SPR_NOACCESS,
707
                 &spr_read_generic, &spr_write_generic,
708
                 0x00000000);
709
    spr_register(env, SPR_SPRG5, "SPRG5",
710
                 SPR_NOACCESS, SPR_NOACCESS,
711
                 &spr_read_generic, &spr_write_generic,
712
                 0x00000000);
713
    spr_register(env, SPR_SPRG6, "SPRG6",
714
                 SPR_NOACCESS, SPR_NOACCESS,
715
                 &spr_read_generic, &spr_write_generic,
716
                 0x00000000);
717
    spr_register(env, SPR_SPRG7, "SPRG7",
718
                 SPR_NOACCESS, SPR_NOACCESS,
719
                 &spr_read_generic, &spr_write_generic,
720
                 0x00000000);
721
    /* External access control */
722
    /* XXX : not implemented */
723
    spr_register(env, SPR_EAR, "EAR",
724
                 SPR_NOACCESS, SPR_NOACCESS,
725
                 &spr_read_generic, &spr_write_generic,
726
                 0x00000000);
727
}
728

    
729
/* SPR common to all 7xx PowerPC implementations */
730
static void gen_spr_7xx (CPUPPCState *env)
731
{
732
    /* Breakpoints */
733
    /* XXX : not implemented */
734
    spr_register(env, SPR_DABR, "DABR",
735
                 SPR_NOACCESS, SPR_NOACCESS,
736
                 &spr_read_generic, &spr_write_generic,
737
                 0x00000000);
738
    /* XXX : not implemented */
739
    spr_register(env, SPR_IABR, "IABR",
740
                 SPR_NOACCESS, SPR_NOACCESS,
741
                 &spr_read_generic, &spr_write_generic,
742
                 0x00000000);
743
    /* Cache management */
744
    /* XXX : not implemented */
745
    spr_register(env, SPR_ICTC, "ICTC",
746
                 SPR_NOACCESS, SPR_NOACCESS,
747
                 &spr_read_generic, &spr_write_generic,
748
                 0x00000000);
749
    /* XXX : not implemented */
750
    spr_register(env, SPR_L2CR, "L2CR",
751
                 SPR_NOACCESS, SPR_NOACCESS,
752
                 &spr_read_generic, &spr_write_generic,
753
                 0x00000000);
754
    /* Performance monitors */
755
    /* XXX : not implemented */
756
    spr_register(env, SPR_MMCR0, "MMCR0",
757
                 SPR_NOACCESS, SPR_NOACCESS,
758
                 &spr_read_generic, &spr_write_generic,
759
                 0x00000000);
760
    /* XXX : not implemented */
761
    spr_register(env, SPR_MMCR1, "MMCR1",
762
                 SPR_NOACCESS, SPR_NOACCESS,
763
                 &spr_read_generic, &spr_write_generic,
764
                 0x00000000);
765
    /* XXX : not implemented */
766
    spr_register(env, SPR_PMC1, "PMC1",
767
                 SPR_NOACCESS, SPR_NOACCESS,
768
                 &spr_read_generic, &spr_write_generic,
769
                 0x00000000);
770
    /* XXX : not implemented */
771
    spr_register(env, SPR_PMC2, "PMC2",
772
                 SPR_NOACCESS, SPR_NOACCESS,
773
                 &spr_read_generic, &spr_write_generic,
774
                 0x00000000);
775
    /* XXX : not implemented */
776
    spr_register(env, SPR_PMC3, "PMC3",
777
                 SPR_NOACCESS, SPR_NOACCESS,
778
                 &spr_read_generic, &spr_write_generic,
779
                 0x00000000);
780
    /* XXX : not implemented */
781
    spr_register(env, SPR_PMC4, "PMC4",
782
                 SPR_NOACCESS, SPR_NOACCESS,
783
                 &spr_read_generic, &spr_write_generic,
784
                 0x00000000);
785
    /* XXX : not implemented */
786
    spr_register(env, SPR_SIA, "SIA",
787
                 SPR_NOACCESS, SPR_NOACCESS,
788
                 &spr_read_generic, SPR_NOACCESS,
789
                 0x00000000);
790
    spr_register(env, SPR_UMMCR0, "UMMCR0",
791
                 &spr_read_ureg, SPR_NOACCESS,
792
                 &spr_read_ureg, SPR_NOACCESS,
793
                 0x00000000);
794
    spr_register(env, SPR_UMMCR1, "UMMCR1",
795
                 &spr_read_ureg, SPR_NOACCESS,
796
                 &spr_read_ureg, SPR_NOACCESS,
797
                 0x00000000);
798
    spr_register(env, SPR_UPMC1, "UPMC1",
799
                 &spr_read_ureg, SPR_NOACCESS,
800
                 &spr_read_ureg, SPR_NOACCESS,
801
                 0x00000000);
802
    spr_register(env, SPR_UPMC2, "UPMC2",
803
                 &spr_read_ureg, SPR_NOACCESS,
804
                 &spr_read_ureg, SPR_NOACCESS,
805
                 0x00000000);
806
    spr_register(env, SPR_UPMC3, "UPMC3",
807
                 &spr_read_ureg, SPR_NOACCESS,
808
                 &spr_read_ureg, SPR_NOACCESS,
809
                 0x00000000);
810
    spr_register(env, SPR_UPMC4, "UPMC4",
811
                 &spr_read_ureg, SPR_NOACCESS,
812
                 &spr_read_ureg, SPR_NOACCESS,
813
                 0x00000000);
814
    spr_register(env, SPR_USIA, "USIA",
815
                 &spr_read_ureg, SPR_NOACCESS,
816
                 &spr_read_ureg, SPR_NOACCESS,
817
                 0x00000000);
818
    /* Thermal management */
819
    /* XXX : not implemented */
820
    spr_register(env, SPR_THRM1, "THRM1",
821
                 SPR_NOACCESS, SPR_NOACCESS,
822
                 &spr_read_generic, &spr_write_generic,
823
                 0x00000000);
824
    /* XXX : not implemented */
825
    spr_register(env, SPR_THRM2, "THRM2",
826
                 SPR_NOACCESS, SPR_NOACCESS,
827
                 &spr_read_generic, &spr_write_generic,
828
                 0x00000000);
829
    /* XXX : not implemented */
830
    spr_register(env, SPR_THRM3, "THRM3",
831
                 SPR_NOACCESS, SPR_NOACCESS,
832
                 &spr_read_generic, &spr_write_generic,
833
                 0x00000000);
834
    /* External access control */
835
    /* XXX : not implemented */
836
    spr_register(env, SPR_EAR, "EAR",
837
                 SPR_NOACCESS, SPR_NOACCESS,
838
                 &spr_read_generic, &spr_write_generic,
839
                 0x00000000);
840
}
841

    
842
/* SPR specific to PowerPC 604 implementation */
843
static void gen_spr_604 (CPUPPCState *env)
844
{
845
    /* Processor identification */
846
    spr_register(env, SPR_PIR, "PIR",
847
                 SPR_NOACCESS, SPR_NOACCESS,
848
                 &spr_read_generic, &spr_write_pir,
849
                 0x00000000);
850
    /* Breakpoints */
851
    /* XXX : not implemented */
852
    spr_register(env, SPR_IABR, "IABR",
853
                 SPR_NOACCESS, SPR_NOACCESS,
854
                 &spr_read_generic, &spr_write_generic,
855
                 0x00000000);
856
    /* XXX : not implemented */
857
    spr_register(env, SPR_DABR, "DABR",
858
                 SPR_NOACCESS, SPR_NOACCESS,
859
                 &spr_read_generic, &spr_write_generic,
860
                 0x00000000);
861
    /* Performance counters */
862
    /* XXX : not implemented */
863
    spr_register(env, SPR_MMCR0, "MMCR0",
864
                 SPR_NOACCESS, SPR_NOACCESS,
865
                 &spr_read_generic, &spr_write_generic,
866
                 0x00000000);
867
    /* XXX : not implemented */
868
    spr_register(env, SPR_MMCR1, "MMCR1",
869
                 SPR_NOACCESS, SPR_NOACCESS,
870
                 &spr_read_generic, &spr_write_generic,
871
                 0x00000000);
872
    /* XXX : not implemented */
873
    spr_register(env, SPR_PMC1, "PMC1",
874
                 SPR_NOACCESS, SPR_NOACCESS,
875
                 &spr_read_generic, &spr_write_generic,
876
                 0x00000000);
877
    /* XXX : not implemented */
878
    spr_register(env, SPR_PMC2, "PMC2",
879
                 SPR_NOACCESS, SPR_NOACCESS,
880
                 &spr_read_generic, &spr_write_generic,
881
                 0x00000000);
882
    /* XXX : not implemented */
883
    spr_register(env, SPR_PMC3, "PMC3",
884
                 SPR_NOACCESS, SPR_NOACCESS,
885
                 &spr_read_generic, &spr_write_generic,
886
                 0x00000000);
887
    /* XXX : not implemented */
888
    spr_register(env, SPR_PMC4, "PMC4",
889
                 SPR_NOACCESS, SPR_NOACCESS,
890
                 &spr_read_generic, &spr_write_generic,
891
                 0x00000000);
892
    /* XXX : not implemented */
893
    spr_register(env, SPR_SIA, "SIA",
894
                 SPR_NOACCESS, SPR_NOACCESS,
895
                 &spr_read_generic, SPR_NOACCESS,
896
                 0x00000000);
897
    /* XXX : not implemented */
898
    spr_register(env, SPR_SDA, "SDA",
899
                 SPR_NOACCESS, SPR_NOACCESS,
900
                 &spr_read_generic, SPR_NOACCESS,
901
                 0x00000000);
902
    /* External access control */
903
    /* XXX : not implemented */
904
    spr_register(env, SPR_EAR, "EAR",
905
                 SPR_NOACCESS, SPR_NOACCESS,
906
                 &spr_read_generic, &spr_write_generic,
907
                 0x00000000);
908
}
909

    
910
/* SPR specific to PowerPC 603 implementation */
911
static void gen_spr_603 (CPUPPCState *env)
912
{
913
    /* External access control */
914
    /* XXX : not implemented */
915
    spr_register(env, SPR_EAR, "EAR",
916
                 SPR_NOACCESS, SPR_NOACCESS,
917
                 &spr_read_generic, &spr_write_generic,
918
                 0x00000000);
919
}
920

    
921
/* SPR specific to PowerPC G2 implementation */
922
static void gen_spr_G2 (CPUPPCState *env)
923
{
924
    /* Memory base address */
925
    /* MBAR */
926
    spr_register(env, SPR_MBAR, "MBAR",
927
                 SPR_NOACCESS, SPR_NOACCESS,
928
                 &spr_read_generic, &spr_write_generic,
929
                 0x00000000);
930
    /* System version register */
931
    /* SVR */
932
    spr_register(env, SPR_SVR, "SVR",
933
                 SPR_NOACCESS, SPR_NOACCESS,
934
                 &spr_read_generic, SPR_NOACCESS,
935
                 0x00000000);
936
    /* Exception processing */
937
    spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
938
                 SPR_NOACCESS, SPR_NOACCESS,
939
                 &spr_read_generic, &spr_write_generic,
940
                 0x00000000);
941
    spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
942
                 SPR_NOACCESS, SPR_NOACCESS,
943
                 &spr_read_generic, &spr_write_generic,
944
                 0x00000000);
945
    /* Breakpoints */
946
    /* XXX : not implemented */
947
    spr_register(env, SPR_DABR, "DABR",
948
                 SPR_NOACCESS, SPR_NOACCESS,
949
                 &spr_read_generic, &spr_write_generic,
950
                 0x00000000);
951
    /* XXX : not implemented */
952
    spr_register(env, SPR_DABR2, "DABR2",
953
                 SPR_NOACCESS, SPR_NOACCESS,
954
                 &spr_read_generic, &spr_write_generic,
955
                 0x00000000);
956
    /* XXX : not implemented */
957
    spr_register(env, SPR_IABR, "IABR",
958
                 SPR_NOACCESS, SPR_NOACCESS,
959
                 &spr_read_generic, &spr_write_generic,
960
                 0x00000000);
961
    /* XXX : not implemented */
962
    spr_register(env, SPR_IABR2, "IABR2",
963
                 SPR_NOACCESS, SPR_NOACCESS,
964
                 &spr_read_generic, &spr_write_generic,
965
                 0x00000000);
966
    /* XXX : not implemented */
967
    spr_register(env, SPR_IBCR, "IBCR",
968
                 SPR_NOACCESS, SPR_NOACCESS,
969
                 &spr_read_generic, &spr_write_generic,
970
                 0x00000000);
971
    /* XXX : not implemented */
972
    spr_register(env, SPR_DBCR, "DBCR",
973
                 SPR_NOACCESS, SPR_NOACCESS,
974
                 &spr_read_generic, &spr_write_generic,
975
                 0x00000000);
976
}
977

    
978
/* SPR specific to PowerPC 602 implementation */
979
static void gen_spr_602 (CPUPPCState *env)
980
{
981
    /* ESA registers */
982
    /* XXX : not implemented */
983
    spr_register(env, SPR_SER, "SER",
984
                 SPR_NOACCESS, SPR_NOACCESS,
985
                 &spr_read_generic, &spr_write_generic,
986
                 0x00000000);
987
    /* XXX : not implemented */
988
    spr_register(env, SPR_SEBR, "SEBR",
989
                 SPR_NOACCESS, SPR_NOACCESS,
990
                 &spr_read_generic, &spr_write_generic,
991
                 0x00000000);
992
    /* XXX : not implemented */
993
    spr_register(env, SPR_ESASR, "ESASR",
994
                 SPR_NOACCESS, SPR_NOACCESS,
995
                 &spr_read_generic, &spr_write_generic,
996
                 0x00000000);
997
    /* Floating point status */
998
    /* XXX : not implemented */
999
    spr_register(env, SPR_SP, "SP",
1000
                 SPR_NOACCESS, SPR_NOACCESS,
1001
                 &spr_read_generic, &spr_write_generic,
1002
                 0x00000000);
1003
    /* XXX : not implemented */
1004
    spr_register(env, SPR_LT, "LT",
1005
                 SPR_NOACCESS, SPR_NOACCESS,
1006
                 &spr_read_generic, &spr_write_generic,
1007
                 0x00000000);
1008
    /* Watchdog timer */
1009
    /* XXX : not implemented */
1010
    spr_register(env, SPR_TCR, "TCR",
1011
                 SPR_NOACCESS, SPR_NOACCESS,
1012
                 &spr_read_generic, &spr_write_generic,
1013
                 0x00000000);
1014
    /* Interrupt base */
1015
    spr_register(env, SPR_IBR, "IBR",
1016
                 SPR_NOACCESS, SPR_NOACCESS,
1017
                 &spr_read_generic, &spr_write_generic,
1018
                 0x00000000);
1019
}
1020

    
1021
/* SPR specific to PowerPC 601 implementation */
1022
static void gen_spr_601 (CPUPPCState *env)
1023
{
1024
    /* Multiplication/division register */
1025
    /* MQ */
1026
    spr_register(env, SPR_MQ, "MQ",
1027
                 &spr_read_generic, &spr_write_generic,
1028
                 &spr_read_generic, &spr_write_generic,
1029
                 0x00000000);
1030
    /* RTC registers */
1031
    spr_register(env, SPR_601_RTCU, "RTCU",
1032
                 SPR_NOACCESS, SPR_NOACCESS,
1033
                 SPR_NOACCESS, &spr_write_601_rtcu,
1034
                 0x00000000);
1035
    spr_register(env, SPR_601_VRTCU, "RTCU",
1036
                 &spr_read_601_rtcu, SPR_NOACCESS,
1037
                 &spr_read_601_rtcu, SPR_NOACCESS,
1038
                 0x00000000);
1039
    spr_register(env, SPR_601_RTCL, "RTCL",
1040
                 SPR_NOACCESS, SPR_NOACCESS,
1041
                 SPR_NOACCESS, &spr_write_601_rtcl,
1042
                 0x00000000);
1043
    spr_register(env, SPR_601_VRTCL, "RTCL",
1044
                 &spr_read_601_rtcl, SPR_NOACCESS,
1045
                 &spr_read_601_rtcl, SPR_NOACCESS,
1046
                 0x00000000);
1047
    /* Timer */
1048
#if 0 /* ? */
1049
    spr_register(env, SPR_601_UDECR, "UDECR",
1050
                 &spr_read_decr, SPR_NOACCESS,
1051
                 &spr_read_decr, SPR_NOACCESS,
1052
                 0x00000000);
1053
#endif
1054
    /* External access control */
1055
    /* XXX : not implemented */
1056
    spr_register(env, SPR_EAR, "EAR",
1057
                 SPR_NOACCESS, SPR_NOACCESS,
1058
                 &spr_read_generic, &spr_write_generic,
1059
                 0x00000000);
1060
    /* Memory management */
1061
    spr_register(env, SPR_IBAT0U, "IBAT0U",
1062
                 SPR_NOACCESS, SPR_NOACCESS,
1063
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1064
                 0x00000000);
1065
    spr_register(env, SPR_IBAT0L, "IBAT0L",
1066
                 SPR_NOACCESS, SPR_NOACCESS,
1067
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1068
                 0x00000000);
1069
    spr_register(env, SPR_IBAT1U, "IBAT1U",
1070
                 SPR_NOACCESS, SPR_NOACCESS,
1071
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1072
                 0x00000000);
1073
    spr_register(env, SPR_IBAT1L, "IBAT1L",
1074
                 SPR_NOACCESS, SPR_NOACCESS,
1075
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1076
                 0x00000000);
1077
    spr_register(env, SPR_IBAT2U, "IBAT2U",
1078
                 SPR_NOACCESS, SPR_NOACCESS,
1079
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1080
                 0x00000000);
1081
    spr_register(env, SPR_IBAT2L, "IBAT2L",
1082
                 SPR_NOACCESS, SPR_NOACCESS,
1083
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1084
                 0x00000000);
1085
    spr_register(env, SPR_IBAT3U, "IBAT3U",
1086
                 SPR_NOACCESS, SPR_NOACCESS,
1087
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1088
                 0x00000000);
1089
    spr_register(env, SPR_IBAT3L, "IBAT3L",
1090
                 SPR_NOACCESS, SPR_NOACCESS,
1091
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1092
                 0x00000000);
1093
}
1094

    
1095
/* PowerPC BookE SPR */
1096
static void gen_spr_BookE (CPUPPCState *env)
1097
{
1098
    /* Processor identification */
1099
    spr_register(env, SPR_BOOKE_PIR, "PIR",
1100
                 SPR_NOACCESS, SPR_NOACCESS,
1101
                 &spr_read_generic, &spr_write_pir,
1102
                 0x00000000);
1103
    /* Interrupt processing */
1104
    spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1105
                 SPR_NOACCESS, SPR_NOACCESS,
1106
                 &spr_read_generic, &spr_write_generic,
1107
                 0x00000000);
1108
    spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1109
                 SPR_NOACCESS, SPR_NOACCESS,
1110
                 &spr_read_generic, &spr_write_generic,
1111
                 0x00000000);
1112
    spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1113
                 SPR_NOACCESS, SPR_NOACCESS,
1114
                 &spr_read_generic, &spr_write_generic,
1115
                 0x00000000);
1116
    spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1117
                 SPR_NOACCESS, SPR_NOACCESS,
1118
                 &spr_read_generic, &spr_write_generic,
1119
                 0x00000000);
1120
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
1121
                 SPR_NOACCESS, SPR_NOACCESS,
1122
                 &spr_read_generic, &spr_write_generic,
1123
                 0x00000000);
1124
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
1125
                 SPR_NOACCESS, SPR_NOACCESS,
1126
                 &spr_read_generic, &spr_write_generic,
1127
                 0x00000000);
1128
    /* Debug */
1129
    /* XXX : not implemented */
1130
    spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1131
                 SPR_NOACCESS, SPR_NOACCESS,
1132
                 &spr_read_generic, &spr_write_generic,
1133
                 0x00000000);
1134
    /* XXX : not implemented */
1135
    spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1136
                 SPR_NOACCESS, SPR_NOACCESS,
1137
                 &spr_read_generic, &spr_write_generic,
1138
                 0x00000000);
1139
    /* XXX : not implemented */
1140
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1141
                 SPR_NOACCESS, SPR_NOACCESS,
1142
                 &spr_read_generic, &spr_write_generic,
1143
                 0x00000000);
1144
    /* XXX : not implemented */
1145
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1146
                 SPR_NOACCESS, SPR_NOACCESS,
1147
                 &spr_read_generic, &spr_write_generic,
1148
                 0x00000000);
1149
    /* XXX : not implemented */
1150
    spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1151
                 SPR_NOACCESS, SPR_NOACCESS,
1152
                 &spr_read_generic, &spr_write_generic,
1153
                 0x00000000);
1154
    /* XXX : not implemented */
1155
    spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1156
                 SPR_NOACCESS, SPR_NOACCESS,
1157
                 &spr_read_generic, &spr_write_generic,
1158
                 0x00000000);
1159
    /* XXX : not implemented */
1160
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1161
                 SPR_NOACCESS, SPR_NOACCESS,
1162
                 &spr_read_generic, &spr_write_generic,
1163
                 0x00000000);
1164
    /* XXX : not implemented */
1165
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1166
                 SPR_NOACCESS, SPR_NOACCESS,
1167
                 &spr_read_generic, &spr_write_generic,
1168
                 0x00000000);
1169
    /* XXX : not implemented */
1170
    spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1171
                 SPR_NOACCESS, SPR_NOACCESS,
1172
                 &spr_read_generic, &spr_write_generic,
1173
                 0x00000000);
1174
    /* XXX : not implemented */
1175
    spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1176
                 SPR_NOACCESS, SPR_NOACCESS,
1177
                 &spr_read_generic, &spr_write_generic,
1178
                 0x00000000);
1179
    /* XXX : not implemented */
1180
    spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1181
                 SPR_NOACCESS, SPR_NOACCESS,
1182
                 &spr_read_generic, &spr_write_generic,
1183
                 0x00000000);
1184
    /* XXX : not implemented */
1185
    spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1186
                 SPR_NOACCESS, SPR_NOACCESS,
1187
                 &spr_read_generic, &spr_write_clear,
1188
                 0x00000000);
1189
    spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1190
                 SPR_NOACCESS, SPR_NOACCESS,
1191
                 &spr_read_generic, &spr_write_generic,
1192
                 0x00000000);
1193
    spr_register(env, SPR_BOOKE_ESR, "ESR",
1194
                 SPR_NOACCESS, SPR_NOACCESS,
1195
                 &spr_read_generic, &spr_write_generic,
1196
                 0x00000000);
1197
    spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1198
                 SPR_NOACCESS, SPR_NOACCESS,
1199
                 &spr_read_generic, &spr_write_generic,
1200
                 0x00000000);
1201
    /* Exception vectors */
1202
    spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1203
                 SPR_NOACCESS, SPR_NOACCESS,
1204
                 &spr_read_generic, &spr_write_generic,
1205
                 0x00000000);
1206
    spr_register(env, SPR_BOOKE_IVOR0, "IVOR0",
1207
                 SPR_NOACCESS, SPR_NOACCESS,
1208
                 &spr_read_generic, &spr_write_generic,
1209
                 0x00000000);
1210
    spr_register(env, SPR_BOOKE_IVOR1, "IVOR1",
1211
                 SPR_NOACCESS, SPR_NOACCESS,
1212
                 &spr_read_generic, &spr_write_generic,
1213
                 0x00000000);
1214
    spr_register(env, SPR_BOOKE_IVOR2, "IVOR2",
1215
                 SPR_NOACCESS, SPR_NOACCESS,
1216
                 &spr_read_generic, &spr_write_generic,
1217
                 0x00000000);
1218
    spr_register(env, SPR_BOOKE_IVOR3, "IVOR3",
1219
                 SPR_NOACCESS, SPR_NOACCESS,
1220
                 &spr_read_generic, &spr_write_generic,
1221
                 0x00000000);
1222
    spr_register(env, SPR_BOOKE_IVOR4, "IVOR4",
1223
                 SPR_NOACCESS, SPR_NOACCESS,
1224
                 &spr_read_generic, &spr_write_generic,
1225
                 0x00000000);
1226
    spr_register(env, SPR_BOOKE_IVOR5, "IVOR5",
1227
                 SPR_NOACCESS, SPR_NOACCESS,
1228
                 &spr_read_generic, &spr_write_generic,
1229
                 0x00000000);
1230
    spr_register(env, SPR_BOOKE_IVOR6, "IVOR6",
1231
                 SPR_NOACCESS, SPR_NOACCESS,
1232
                 &spr_read_generic, &spr_write_generic,
1233
                 0x00000000);
1234
    spr_register(env, SPR_BOOKE_IVOR7, "IVOR7",
1235
                 SPR_NOACCESS, SPR_NOACCESS,
1236
                 &spr_read_generic, &spr_write_generic,
1237
                 0x00000000);
1238
    spr_register(env, SPR_BOOKE_IVOR8, "IVOR8",
1239
                 SPR_NOACCESS, SPR_NOACCESS,
1240
                 &spr_read_generic, &spr_write_generic,
1241
                 0x00000000);
1242
    spr_register(env, SPR_BOOKE_IVOR9, "IVOR9",
1243
                 SPR_NOACCESS, SPR_NOACCESS,
1244
                 &spr_read_generic, &spr_write_generic,
1245
                 0x00000000);
1246
    spr_register(env, SPR_BOOKE_IVOR10, "IVOR10",
1247
                 SPR_NOACCESS, SPR_NOACCESS,
1248
                 &spr_read_generic, &spr_write_generic,
1249
                 0x00000000);
1250
    spr_register(env, SPR_BOOKE_IVOR11, "IVOR11",
1251
                 SPR_NOACCESS, SPR_NOACCESS,
1252
                 &spr_read_generic, &spr_write_generic,
1253
                 0x00000000);
1254
    spr_register(env, SPR_BOOKE_IVOR12, "IVOR12",
1255
                 SPR_NOACCESS, SPR_NOACCESS,
1256
                 &spr_read_generic, &spr_write_generic,
1257
                 0x00000000);
1258
    spr_register(env, SPR_BOOKE_IVOR13, "IVOR13",
1259
                 SPR_NOACCESS, SPR_NOACCESS,
1260
                 &spr_read_generic, &spr_write_generic,
1261
                 0x00000000);
1262
    spr_register(env, SPR_BOOKE_IVOR14, "IVOR14",
1263
                 SPR_NOACCESS, SPR_NOACCESS,
1264
                 &spr_read_generic, &spr_write_generic,
1265
                 0x00000000);
1266
    spr_register(env, SPR_BOOKE_IVOR15, "IVOR15",
1267
                 SPR_NOACCESS, SPR_NOACCESS,
1268
                 &spr_read_generic, &spr_write_generic,
1269
                 0x00000000);
1270
    spr_register(env, SPR_BOOKE_IVOR32, "IVOR32",
1271
                 SPR_NOACCESS, SPR_NOACCESS,
1272
                 &spr_read_generic, &spr_write_generic,
1273
                 0x00000000);
1274
    spr_register(env, SPR_BOOKE_IVOR33, "IVOR33",
1275
                 SPR_NOACCESS, SPR_NOACCESS,
1276
                 &spr_read_generic, &spr_write_generic,
1277
                 0x00000000);
1278
    spr_register(env, SPR_BOOKE_IVOR34, "IVOR34",
1279
                 SPR_NOACCESS, SPR_NOACCESS,
1280
                 &spr_read_generic, &spr_write_generic,
1281
                 0x00000000);
1282
    spr_register(env, SPR_BOOKE_IVOR35, "IVOR35",
1283
                 SPR_NOACCESS, SPR_NOACCESS,
1284
                 &spr_read_generic, &spr_write_generic,
1285
                 0x00000000);
1286
    spr_register(env, SPR_BOOKE_IVOR36, "IVOR36",
1287
                 SPR_NOACCESS, SPR_NOACCESS,
1288
                 &spr_read_generic, &spr_write_generic,
1289
                 0x00000000);
1290
    spr_register(env, SPR_BOOKE_IVOR37, "IVOR37",
1291
                 SPR_NOACCESS, SPR_NOACCESS,
1292
                 &spr_read_generic, &spr_write_generic,
1293
                 0x00000000);
1294
    spr_register(env, SPR_BOOKE_PID, "PID",
1295
                 SPR_NOACCESS, SPR_NOACCESS,
1296
                 &spr_read_generic, &spr_write_generic,
1297
                 0x00000000);
1298
    spr_register(env, SPR_BOOKE_TCR, "TCR",
1299
                 SPR_NOACCESS, SPR_NOACCESS,
1300
                 &spr_read_generic, &spr_write_booke_tcr,
1301
                 0x00000000);
1302
    spr_register(env, SPR_BOOKE_TSR, "TSR",
1303
                 SPR_NOACCESS, SPR_NOACCESS,
1304
                 &spr_read_generic, &spr_write_booke_tsr,
1305
                 0x00000000);
1306
    /* Timer */
1307
    spr_register(env, SPR_DECR, "DECR",
1308
                 SPR_NOACCESS, SPR_NOACCESS,
1309
                 &spr_read_decr, &spr_write_decr,
1310
                 0x00000000);
1311
    spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1312
                 SPR_NOACCESS, SPR_NOACCESS,
1313
                 SPR_NOACCESS, &spr_write_generic,
1314
                 0x00000000);
1315
    /* SPRGs */
1316
    spr_register(env, SPR_USPRG0, "USPRG0",
1317
                 &spr_read_generic, &spr_write_generic,
1318
                 &spr_read_generic, &spr_write_generic,
1319
                 0x00000000);
1320
    spr_register(env, SPR_SPRG4, "SPRG4",
1321
                 SPR_NOACCESS, SPR_NOACCESS,
1322
                 &spr_read_generic, &spr_write_generic,
1323
                 0x00000000);
1324
    spr_register(env, SPR_USPRG4, "USPRG4",
1325
                 &spr_read_ureg, SPR_NOACCESS,
1326
                 &spr_read_ureg, SPR_NOACCESS,
1327
                 0x00000000);
1328
    spr_register(env, SPR_SPRG5, "SPRG5",
1329
                 SPR_NOACCESS, SPR_NOACCESS,
1330
                 &spr_read_generic, &spr_write_generic,
1331
                 0x00000000);
1332
    spr_register(env, SPR_USPRG5, "USPRG5",
1333
                 &spr_read_ureg, SPR_NOACCESS,
1334
                 &spr_read_ureg, SPR_NOACCESS,
1335
                 0x00000000);
1336
    spr_register(env, SPR_SPRG6, "SPRG6",
1337
                 SPR_NOACCESS, SPR_NOACCESS,
1338
                 &spr_read_generic, &spr_write_generic,
1339
                 0x00000000);
1340
    spr_register(env, SPR_USPRG6, "USPRG6",
1341
                 &spr_read_ureg, SPR_NOACCESS,
1342
                 &spr_read_ureg, SPR_NOACCESS,
1343
                 0x00000000);
1344
    spr_register(env, SPR_SPRG7, "SPRG7",
1345
                 SPR_NOACCESS, SPR_NOACCESS,
1346
                 &spr_read_generic, &spr_write_generic,
1347
                 0x00000000);
1348
    spr_register(env, SPR_USPRG7, "USPRG7",
1349
                 &spr_read_ureg, SPR_NOACCESS,
1350
                 &spr_read_ureg, SPR_NOACCESS,
1351
                 0x00000000);
1352
}
1353

    
1354
/* FSL storage control registers */
1355
static void gen_spr_BookE_FSL (CPUPPCState *env)
1356
{
1357
    /* TLB assist registers */
1358
    spr_register(env, SPR_BOOKE_MAS0, "MAS0",
1359
                 SPR_NOACCESS, SPR_NOACCESS,
1360
                 &spr_read_generic, &spr_write_generic,
1361
                 0x00000000);
1362
    spr_register(env, SPR_BOOKE_MAS1, "MAS2",
1363
                 SPR_NOACCESS, SPR_NOACCESS,
1364
                 &spr_read_generic, &spr_write_generic,
1365
                 0x00000000);
1366
    spr_register(env, SPR_BOOKE_MAS2, "MAS3",
1367
                 SPR_NOACCESS, SPR_NOACCESS,
1368
                 &spr_read_generic, &spr_write_generic,
1369
                 0x00000000);
1370
    spr_register(env, SPR_BOOKE_MAS3, "MAS4",
1371
                 SPR_NOACCESS, SPR_NOACCESS,
1372
                 &spr_read_generic, &spr_write_generic,
1373
                 0x00000000);
1374
    spr_register(env, SPR_BOOKE_MAS4, "MAS5",
1375
                 SPR_NOACCESS, SPR_NOACCESS,
1376
                 &spr_read_generic, &spr_write_generic,
1377
                 0x00000000);
1378
    spr_register(env, SPR_BOOKE_MAS6, "MAS6",
1379
                 SPR_NOACCESS, SPR_NOACCESS,
1380
                 &spr_read_generic, &spr_write_generic,
1381
                 0x00000000);
1382
    spr_register(env, SPR_BOOKE_MAS7, "MAS7",
1383
                 SPR_NOACCESS, SPR_NOACCESS,
1384
                 &spr_read_generic, &spr_write_generic,
1385
                 0x00000000);
1386
    if (env->nb_pids > 1) {
1387
        spr_register(env, SPR_BOOKE_PID1, "PID1",
1388
                     SPR_NOACCESS, SPR_NOACCESS,
1389
                     &spr_read_generic, &spr_write_generic,
1390
                     0x00000000);
1391
    }
1392
    if (env->nb_pids > 2) {
1393
        spr_register(env, SPR_BOOKE_PID2, "PID2",
1394
                     SPR_NOACCESS, SPR_NOACCESS,
1395
                     &spr_read_generic, &spr_write_generic,
1396
                     0x00000000);
1397
    }
1398
    spr_register(env, SPR_BOOKE_MMUCFG, "MMUCFG",
1399
                 SPR_NOACCESS, SPR_NOACCESS,
1400
                 &spr_read_generic, SPR_NOACCESS,
1401
                 0x00000000); /* TOFIX */
1402
    spr_register(env, SPR_BOOKE_MMUCSR0, "MMUCSR0",
1403
                 SPR_NOACCESS, SPR_NOACCESS,
1404
                 &spr_read_generic, &spr_write_generic,
1405
                 0x00000000); /* TOFIX */
1406
    switch (env->nb_ways) {
1407
    case 4:
1408
        spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1409
                     SPR_NOACCESS, SPR_NOACCESS,
1410
                     &spr_read_generic, SPR_NOACCESS,
1411
                     0x00000000); /* TOFIX */
1412
        /* Fallthru */
1413
    case 3:
1414
        spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1415
                     SPR_NOACCESS, SPR_NOACCESS,
1416
                     &spr_read_generic, SPR_NOACCESS,
1417
                     0x00000000); /* TOFIX */
1418
        /* Fallthru */
1419
    case 2:
1420
        spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1421
                     SPR_NOACCESS, SPR_NOACCESS,
1422
                     &spr_read_generic, SPR_NOACCESS,
1423
                     0x00000000); /* TOFIX */
1424
        /* Fallthru */
1425
    case 1:
1426
        spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1427
                     SPR_NOACCESS, SPR_NOACCESS,
1428
                     &spr_read_generic, SPR_NOACCESS,
1429
                     0x00000000); /* TOFIX */
1430
        /* Fallthru */
1431
    case 0:
1432
    default:
1433
        break;
1434
    }
1435
}
1436

    
1437
/* SPR specific to PowerPC 440 implementation */
1438
static void gen_spr_440 (CPUPPCState *env)
1439
{
1440
    /* Cache control */
1441
    /* XXX : not implemented */
1442
    spr_register(env, SPR_440_DNV0, "DNV0",
1443
                 SPR_NOACCESS, SPR_NOACCESS,
1444
                 &spr_read_generic, &spr_write_generic,
1445
                 0x00000000);
1446
    /* XXX : not implemented */
1447
    spr_register(env, SPR_440_DNV1, "DNV1",
1448
                 SPR_NOACCESS, SPR_NOACCESS,
1449
                 &spr_read_generic, &spr_write_generic,
1450
                 0x00000000);
1451
    /* XXX : not implemented */
1452
    spr_register(env, SPR_440_DNV2, "DNV2",
1453
                 SPR_NOACCESS, SPR_NOACCESS,
1454
                 &spr_read_generic, &spr_write_generic,
1455
                 0x00000000);
1456
    /* XXX : not implemented */
1457
    spr_register(env, SPR_440_DNV3, "DNV3",
1458
                 SPR_NOACCESS, SPR_NOACCESS,
1459
                 &spr_read_generic, &spr_write_generic,
1460
                 0x00000000);
1461
    /* XXX : not implemented */
1462
    spr_register(env, SPR_440_DVT0, "DVT0",
1463
                 SPR_NOACCESS, SPR_NOACCESS,
1464
                 &spr_read_generic, &spr_write_generic,
1465
                 0x00000000);
1466
    /* XXX : not implemented */
1467
    spr_register(env, SPR_440_DVT1, "DVT1",
1468
                 SPR_NOACCESS, SPR_NOACCESS,
1469
                 &spr_read_generic, &spr_write_generic,
1470
                 0x00000000);
1471
    /* XXX : not implemented */
1472
    spr_register(env, SPR_440_DVT2, "DVT2",
1473
                 SPR_NOACCESS, SPR_NOACCESS,
1474
                 &spr_read_generic, &spr_write_generic,
1475
                 0x00000000);
1476
    /* XXX : not implemented */
1477
    spr_register(env, SPR_440_DVT3, "DVT3",
1478
                 SPR_NOACCESS, SPR_NOACCESS,
1479
                 &spr_read_generic, &spr_write_generic,
1480
                 0x00000000);
1481
    /* XXX : not implemented */
1482
    spr_register(env, SPR_440_DVLIM, "DVLIM",
1483
                 SPR_NOACCESS, SPR_NOACCESS,
1484
                 &spr_read_generic, &spr_write_generic,
1485
                 0x00000000);
1486
    /* XXX : not implemented */
1487
    spr_register(env, SPR_440_INV0, "INV0",
1488
                 SPR_NOACCESS, SPR_NOACCESS,
1489
                 &spr_read_generic, &spr_write_generic,
1490
                 0x00000000);
1491
    /* XXX : not implemented */
1492
    spr_register(env, SPR_440_INV1, "INV1",
1493
                 SPR_NOACCESS, SPR_NOACCESS,
1494
                 &spr_read_generic, &spr_write_generic,
1495
                 0x00000000);
1496
    /* XXX : not implemented */
1497
    spr_register(env, SPR_440_INV2, "INV2",
1498
                 SPR_NOACCESS, SPR_NOACCESS,
1499
                 &spr_read_generic, &spr_write_generic,
1500
                 0x00000000);
1501
    /* XXX : not implemented */
1502
    spr_register(env, SPR_440_INV3, "INV3",
1503
                 SPR_NOACCESS, SPR_NOACCESS,
1504
                 &spr_read_generic, &spr_write_generic,
1505
                 0x00000000);
1506
    /* XXX : not implemented */
1507
    spr_register(env, SPR_440_IVT0, "IVT0",
1508
                 SPR_NOACCESS, SPR_NOACCESS,
1509
                 &spr_read_generic, &spr_write_generic,
1510
                 0x00000000);
1511
    /* XXX : not implemented */
1512
    spr_register(env, SPR_440_IVT1, "IVT1",
1513
                 SPR_NOACCESS, SPR_NOACCESS,
1514
                 &spr_read_generic, &spr_write_generic,
1515
                 0x00000000);
1516
    /* XXX : not implemented */
1517
    spr_register(env, SPR_440_IVT2, "IVT2",
1518
                 SPR_NOACCESS, SPR_NOACCESS,
1519
                 &spr_read_generic, &spr_write_generic,
1520
                 0x00000000);
1521
    /* XXX : not implemented */
1522
    spr_register(env, SPR_440_IVT3, "IVT3",
1523
                 SPR_NOACCESS, SPR_NOACCESS,
1524
                 &spr_read_generic, &spr_write_generic,
1525
                 0x00000000);
1526
    /* XXX : not implemented */
1527
    spr_register(env, SPR_440_IVLIM, "IVLIM",
1528
                 SPR_NOACCESS, SPR_NOACCESS,
1529
                 &spr_read_generic, &spr_write_generic,
1530
                 0x00000000);
1531
    /* Cache debug */
1532
    /* XXX : not implemented */
1533
    spr_register(env, SPR_BOOKE_DCBTRH, "DCBTRH",
1534
                 SPR_NOACCESS, SPR_NOACCESS,
1535
                 &spr_read_generic, SPR_NOACCESS,
1536
                 0x00000000);
1537
    /* XXX : not implemented */
1538
    spr_register(env, SPR_BOOKE_DCBTRL, "DCBTRL",
1539
                 SPR_NOACCESS, SPR_NOACCESS,
1540
                 &spr_read_generic, SPR_NOACCESS,
1541
                 0x00000000);
1542
    /* XXX : not implemented */
1543
    spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1544
                 SPR_NOACCESS, SPR_NOACCESS,
1545
                 &spr_read_generic, SPR_NOACCESS,
1546
                 0x00000000);
1547
    /* XXX : not implemented */
1548
    spr_register(env, SPR_BOOKE_ICBTRH, "ICBTRH",
1549
                 SPR_NOACCESS, SPR_NOACCESS,
1550
                 &spr_read_generic, SPR_NOACCESS,
1551
                 0x00000000);
1552
    /* XXX : not implemented */
1553
    spr_register(env, SPR_BOOKE_ICBTRL, "ICBTRL",
1554
                 SPR_NOACCESS, SPR_NOACCESS,
1555
                 &spr_read_generic, SPR_NOACCESS,
1556
                 0x00000000);
1557
    /* XXX : not implemented */
1558
    spr_register(env, SPR_440_DBDR, "DBDR",
1559
                 SPR_NOACCESS, SPR_NOACCESS,
1560
                 &spr_read_generic, &spr_write_generic,
1561
                 0x00000000);
1562
    /* Processor control */
1563
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1564
                 SPR_NOACCESS, SPR_NOACCESS,
1565
                 &spr_read_generic, &spr_write_generic,
1566
                 0x00000000);
1567
    spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1568
                 SPR_NOACCESS, SPR_NOACCESS,
1569
                 &spr_read_generic, SPR_NOACCESS,
1570
                 0x00000000);
1571
    /* Storage control */
1572
    spr_register(env, SPR_440_MMUCR, "MMUCR",
1573
                 SPR_NOACCESS, SPR_NOACCESS,
1574
                 &spr_read_generic, &spr_write_generic,
1575
                 0x00000000);
1576
}
1577

    
1578
/* SPR shared between PowerPC 40x implementations */
1579
static void gen_spr_40x (CPUPPCState *env)
1580
{
1581
    /* Cache */
1582
    /* XXX : not implemented */
1583
    spr_register(env, SPR_40x_DCCR, "DCCR",
1584
                 SPR_NOACCESS, SPR_NOACCESS,
1585
                 &spr_read_generic, &spr_write_generic,
1586
                 0x00000000);
1587
    /* XXX : not implemented */
1588
    spr_register(env, SPR_40x_DCWR, "DCWR",
1589
                 SPR_NOACCESS, SPR_NOACCESS,
1590
                 &spr_read_generic, &spr_write_generic,
1591
                 0x00000000);
1592
    /* XXX : not implemented */
1593
    spr_register(env, SPR_40x_ICCR, "ICCR",
1594
                 SPR_NOACCESS, SPR_NOACCESS,
1595
                 &spr_read_generic, &spr_write_generic,
1596
                 0x00000000);
1597
    /* XXX : not implemented */
1598
    spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1599
                 SPR_NOACCESS, SPR_NOACCESS,
1600
                 &spr_read_generic, SPR_NOACCESS,
1601
                 0x00000000);
1602
    /* Bus access control */
1603
    spr_register(env, SPR_40x_SGR, "SGR",
1604
                 SPR_NOACCESS, SPR_NOACCESS,
1605
                 &spr_read_generic, &spr_write_generic,
1606
                 0xFFFFFFFF);
1607
    spr_register(env, SPR_40x_ZPR, "ZPR",
1608
                 SPR_NOACCESS, SPR_NOACCESS,
1609
                 &spr_read_generic, &spr_write_generic,
1610
                 0x00000000);
1611
    /* MMU */
1612
    spr_register(env, SPR_40x_PID, "PID",
1613
                 SPR_NOACCESS, SPR_NOACCESS,
1614
                 &spr_read_generic, &spr_write_generic,
1615
                 0x00000000);
1616
    /* Exception */
1617
    spr_register(env, SPR_40x_DEAR, "DEAR",
1618
                 SPR_NOACCESS, SPR_NOACCESS,
1619
                 &spr_read_generic, &spr_write_generic,
1620
                 0x00000000);
1621
    spr_register(env, SPR_40x_ESR, "ESR",
1622
                 SPR_NOACCESS, SPR_NOACCESS,
1623
                 &spr_read_generic, &spr_write_generic,
1624
                 0x00000000);
1625
    spr_register(env, SPR_40x_EVPR, "EVPR",
1626
                 SPR_NOACCESS, SPR_NOACCESS,
1627
                 &spr_read_generic, &spr_write_generic,
1628
                 0x00000000);
1629
    spr_register(env, SPR_40x_SRR2, "SRR2",
1630
                 &spr_read_generic, &spr_write_generic,
1631
                 &spr_read_generic, &spr_write_generic,
1632
                 0x00000000);
1633
    spr_register(env, SPR_40x_SRR3, "SRR3",
1634
                 &spr_read_generic, &spr_write_generic,
1635
                 &spr_read_generic, &spr_write_generic,
1636
                 0x00000000);
1637
    /* Timers */
1638
    spr_register(env, SPR_40x_PIT, "PIT",
1639
                 SPR_NOACCESS, SPR_NOACCESS,
1640
                 &spr_read_40x_pit, &spr_write_40x_pit,
1641
                 0x00000000);
1642
    spr_register(env, SPR_40x_TCR, "TCR",
1643
                 SPR_NOACCESS, SPR_NOACCESS,
1644
                 &spr_read_generic, &spr_write_booke_tcr,
1645
                 0x00000000);
1646
    spr_register(env, SPR_40x_TSR, "TSR",
1647
                 SPR_NOACCESS, SPR_NOACCESS,
1648
                 &spr_read_generic, &spr_write_booke_tsr,
1649
                 0x00000000);
1650
    /* Debug interface */
1651
    /* XXX : not implemented */
1652
    spr_register(env, SPR_40x_DAC1, "DAC1",
1653
                 SPR_NOACCESS, SPR_NOACCESS,
1654
                 &spr_read_generic, &spr_write_generic,
1655
                 0x00000000);
1656
    spr_register(env, SPR_40x_DAC2, "DAC2",
1657
                 SPR_NOACCESS, SPR_NOACCESS,
1658
                 &spr_read_generic, &spr_write_generic,
1659
                 0x00000000);
1660
    /* XXX : not implemented */
1661
    spr_register(env, SPR_40x_DBCR0, "DBCR0",
1662
                 SPR_NOACCESS, SPR_NOACCESS,
1663
                 &spr_read_generic, &spr_write_40x_dbcr0,
1664
                 0x00000000);
1665
    /* XXX : not implemented */
1666
    spr_register(env, SPR_40x_DBSR, "DBSR",
1667
                 SPR_NOACCESS, SPR_NOACCESS,
1668
                 &spr_read_generic, &spr_write_clear,
1669
                 /* Last reset was system reset */
1670
                 0x00000300);
1671
    /* XXX : not implemented */
1672
    spr_register(env, SPR_40x_IAC1, "IAC1",
1673
                 SPR_NOACCESS, SPR_NOACCESS,
1674
                 &spr_read_generic, &spr_write_generic,
1675
                 0x00000000);
1676
    spr_register(env, SPR_40x_IAC2, "IAC2",
1677
                 SPR_NOACCESS, SPR_NOACCESS,
1678
                 &spr_read_generic, &spr_write_generic,
1679
                 0x00000000);
1680
}
1681

    
1682
/* SPR specific to PowerPC 405 implementation */
1683
static void gen_spr_405 (CPUPPCState *env)
1684
{
1685
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1686
                 SPR_NOACCESS, SPR_NOACCESS,
1687
                 &spr_read_generic, &spr_write_generic,
1688
                 0x00700000);
1689
    /* Debug */
1690
    /* XXX : not implemented */
1691
    spr_register(env, SPR_405_DBCR1, "DBCR1",
1692
                 SPR_NOACCESS, SPR_NOACCESS,
1693
                 &spr_read_generic, &spr_write_generic,
1694
                 0x00000000);
1695
    /* XXX : not implemented */
1696
    spr_register(env, SPR_405_DVC1, "DVC1",
1697
                 SPR_NOACCESS, SPR_NOACCESS,
1698
                 &spr_read_generic, &spr_write_generic,
1699
                 0x00000000);
1700
    /* XXX : not implemented */
1701
    spr_register(env, SPR_405_DVC2, "DVC2",
1702
                 SPR_NOACCESS, SPR_NOACCESS,
1703
                 &spr_read_generic, &spr_write_generic,
1704
                 0x00000000);
1705
    /* XXX : not implemented */
1706
    spr_register(env, SPR_405_IAC3, "IAC3",
1707
                 SPR_NOACCESS, SPR_NOACCESS,
1708
                 &spr_read_generic, &spr_write_generic,
1709
                 0x00000000);
1710
    /* XXX : not implemented */
1711
    spr_register(env, SPR_405_IAC4, "IAC4",
1712
                 SPR_NOACCESS, SPR_NOACCESS,
1713
                 &spr_read_generic, &spr_write_generic,
1714
                 0x00000000);
1715
    /* Storage control */
1716
    /* XXX : not implemented */
1717
    spr_register(env, SPR_405_SLER, "SLER",
1718
                 SPR_NOACCESS, SPR_NOACCESS,
1719
                 &spr_read_generic, &spr_write_generic,
1720
                 0x00000000);
1721
    /* XXX : not implemented */
1722
    spr_register(env, SPR_405_SU0R, "SU0R",
1723
                 SPR_NOACCESS, SPR_NOACCESS,
1724
                 &spr_read_generic, &spr_write_generic,
1725
                 0x00000000);
1726
    /* SPRG */
1727
    spr_register(env, SPR_USPRG0, "USPRG0",
1728
                 &spr_read_ureg, SPR_NOACCESS,
1729
                 &spr_read_ureg, SPR_NOACCESS,
1730
                 0x00000000);
1731
    spr_register(env, SPR_SPRG4, "SPRG4",
1732
                 SPR_NOACCESS, SPR_NOACCESS,
1733
                 SPR_NOACCESS, &spr_write_generic,
1734
                 0x00000000);
1735
    spr_register(env, SPR_USPRG4, "USPRG4",
1736
                 &spr_read_ureg, SPR_NOACCESS,
1737
                 &spr_read_ureg, SPR_NOACCESS,
1738
                 0x00000000);
1739
    spr_register(env, SPR_SPRG5, "SPRG5",
1740
                 SPR_NOACCESS, SPR_NOACCESS,
1741
                 SPR_NOACCESS, &spr_write_generic,
1742
                 0x00000000);
1743
    spr_register(env, SPR_USPRG5, "USPRG5",
1744
                 &spr_read_ureg, SPR_NOACCESS,
1745
                 &spr_read_ureg, SPR_NOACCESS,
1746
                 0x00000000);
1747
    spr_register(env, SPR_SPRG6, "SPRG6",
1748
                 SPR_NOACCESS, SPR_NOACCESS,
1749
                 SPR_NOACCESS, &spr_write_generic,
1750
                 0x00000000);
1751
    spr_register(env, SPR_USPRG6, "USPRG6",
1752
                 &spr_read_ureg, SPR_NOACCESS,
1753
                 &spr_read_ureg, SPR_NOACCESS,
1754
                 0x00000000);
1755
    spr_register(env, SPR_SPRG7, "SPRG7",
1756
                 SPR_NOACCESS, SPR_NOACCESS,
1757
                 SPR_NOACCESS, &spr_write_generic,
1758
                 0x00000000);
1759
    spr_register(env, SPR_USPRG7, "USPRG7",
1760
                 &spr_read_ureg, SPR_NOACCESS,
1761
                 &spr_read_ureg, SPR_NOACCESS,
1762
                 0x00000000);
1763
}
1764

    
1765
/* SPR shared between PowerPC 401 & 403 implementations */
1766
static void gen_spr_401_403 (CPUPPCState *env)
1767
{
1768
    /* Time base */
1769
    spr_register(env, SPR_403_VTBL,  "TBL",
1770
                 &spr_read_tbl, SPR_NOACCESS,
1771
                 &spr_read_tbl, SPR_NOACCESS,
1772
                 0x00000000);
1773
    spr_register(env, SPR_403_TBL,   "TBL",
1774
                 SPR_NOACCESS, SPR_NOACCESS,
1775
                 SPR_NOACCESS, &spr_write_tbl,
1776
                 0x00000000);
1777
    spr_register(env, SPR_403_VTBU,  "TBU",
1778
                 &spr_read_tbu, SPR_NOACCESS,
1779
                 &spr_read_tbu, SPR_NOACCESS,
1780
                 0x00000000);
1781
    spr_register(env, SPR_403_TBU,   "TBU",
1782
                 SPR_NOACCESS, SPR_NOACCESS,
1783
                 SPR_NOACCESS, &spr_write_tbu,
1784
                 0x00000000);
1785
    /* Debug */
1786
    /* XXX: not implemented */
1787
    spr_register(env, SPR_403_CDBCR, "CDBCR",
1788
                 SPR_NOACCESS, SPR_NOACCESS,
1789
                 &spr_read_generic, &spr_write_generic,
1790
                 0x00000000);
1791
}
1792

    
1793
/* SPR specific to PowerPC 403 implementation */
1794
static void gen_spr_403 (CPUPPCState *env)
1795
{
1796
    /* MMU */
1797
    spr_register(env, SPR_403_PBL1,  "PBL1",
1798
                 SPR_NOACCESS, SPR_NOACCESS,
1799
                 &spr_read_403_pbr, &spr_write_403_pbr,
1800
                 0x00000000);
1801
    spr_register(env, SPR_403_PBU1,  "PBU1",
1802
                 SPR_NOACCESS, SPR_NOACCESS,
1803
                 &spr_read_403_pbr, &spr_write_403_pbr,
1804
                 0x00000000);
1805
    spr_register(env, SPR_403_PBL2,  "PBL2",
1806
                 SPR_NOACCESS, SPR_NOACCESS,
1807
                 &spr_read_403_pbr, &spr_write_403_pbr,
1808
                 0x00000000);
1809
    spr_register(env, SPR_403_PBU2,  "PBU2",
1810
                 SPR_NOACCESS, SPR_NOACCESS,
1811
                 &spr_read_403_pbr, &spr_write_403_pbr,
1812
                 0x00000000);
1813
    /* Debug */
1814
    /* XXX : not implemented */
1815
    spr_register(env, SPR_40x_DAC2, "DAC2",
1816
                 SPR_NOACCESS, SPR_NOACCESS,
1817
                 &spr_read_generic, &spr_write_generic,
1818
                 0x00000000);
1819
    /* XXX : not implemented */
1820
    spr_register(env, SPR_40x_IAC2, "IAC2",
1821
                 SPR_NOACCESS, SPR_NOACCESS,
1822
                 &spr_read_generic, &spr_write_generic,
1823
                 0x00000000);
1824
}
1825

    
1826
/* SPR specific to PowerPC compression coprocessor extension */
1827
#if defined (TODO)
1828
static void gen_spr_compress (CPUPPCState *env)
1829
{
1830
    spr_register(env, SPR_401_SKR, "SKR",
1831
                 SPR_NOACCESS, SPR_NOACCESS,
1832
                 &spr_read_generic, &spr_write_generic,
1833
                 0x00000000);
1834
}
1835
#endif
1836

    
1837
// XXX: TODO (64 bits PowerPC SPRs)
1838
/*
1839
 * ASR => SPR 280 (64 bits)
1840
 * FPECR => SPR 1022 (?)
1841
 * VRSAVE => SPR 256 (Altivec)
1842
 * SCOMC => SPR 276 (64 bits ?)
1843
 * SCOMD => SPR 277 (64 bits ?)
1844
 * HSPRG0 => SPR 304 (hypervisor)
1845
 * HSPRG1 => SPR 305 (hypervisor)
1846
 * HDEC => SPR 310 (hypervisor)
1847
 * HIOR => SPR 311 (hypervisor)
1848
 * RMOR => SPR 312 (970)
1849
 * HRMOR => SPR 313 (hypervisor)
1850
 * HSRR0 => SPR 314 (hypervisor)
1851
 * HSRR1 => SPR 315 (hypervisor)
1852
 * LPCR => SPR 316 (970)
1853
 * LPIDR => SPR 317 (970)
1854
 * ... and more (thermal management, performance counters, ...)
1855
 */
1856

    
1857
static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
1858
{
1859
    env->reserve = -1;
1860
    /* Default MMU definitions */
1861
    env->nb_BATs = -1;
1862
    env->nb_tlb = 0;
1863
    env->nb_ways = 0;
1864
    /* XXX: missing:
1865
     * 32 bits PowerPC:
1866
     * - MPC5xx(x)
1867
     * - MPC8xx(x)
1868
     * - RCPU (same as MPC5xx ?)
1869
     */
1870
    spr_register(env, SPR_PVR, "PVR",
1871
                 SPR_NOACCESS, SPR_NOACCESS,
1872
                 &spr_read_generic, SPR_NOACCESS,
1873
                 def->pvr);
1874
    printf("%s: PVR %08x mask %08x => %08x\n", __func__,
1875
           def->pvr, def->pvr_mask, def->pvr & def->pvr_mask);
1876
    switch (def->pvr) {
1877
    /* Embedded PowerPC from IBM                           */
1878
    case CPU_PPC_401A1:   /* 401 A1 family                 */
1879
    case CPU_PPC_401B2:   /* 401 B2 family                 */
1880
    case CPU_PPC_401C2:   /* 401 C2 family                 */
1881
    case CPU_PPC_401D2:   /* 401 D2 family                 */
1882
    case CPU_PPC_401E2:   /* 401 E2 family                 */
1883
    case CPU_PPC_401F2:   /* 401 F2 family                 */
1884
    case CPU_PPC_401G2:   /* 401 G2 family                 */
1885
    case CPU_PPC_IOP480:  /* IOP 480 family                */
1886
    case CPU_PPC_COBRA:   /* IBM Processor for Network Resources */
1887
        gen_spr_generic(env);
1888
        gen_spr_40x(env);
1889
        gen_spr_401_403(env);
1890
#if defined (TODO)
1891
        /* XXX: optional ? */
1892
        gen_spr_compress(env);
1893
#endif
1894
        env->nb_BATs = 0;
1895
        env->nb_tlb = 64;
1896
        env->nb_ways = 1;
1897
        env->id_tlbs = 0;
1898
        /* XXX: TODO: allocate internal IRQ controller */
1899
        break;
1900

    
1901
    case CPU_PPC_403GA:   /* 403 GA family                 */
1902
    case CPU_PPC_403GB:   /* 403 GB family                 */
1903
    case CPU_PPC_403GC:   /* 403 GC family                 */
1904
    case CPU_PPC_403GCX:  /* 403 GCX family                */
1905
        gen_spr_generic(env);
1906
        gen_spr_40x(env);
1907
        gen_spr_401_403(env);
1908
        gen_spr_403(env);
1909
        env->nb_BATs = 0;
1910
        env->nb_tlb = 64;
1911
        env->nb_ways = 1;
1912
        env->id_tlbs = 0;
1913
        /* XXX: TODO: allocate internal IRQ controller */
1914
        break;
1915

    
1916
    case CPU_PPC_405CR:   /* 405 GP/CR family              */
1917
    case CPU_PPC_405EP:   /* 405 EP family                 */
1918
    case CPU_PPC_405GPR:  /* 405 GPR family                */
1919
    case CPU_PPC_405D2:   /* 405 D2 family                 */
1920
    case CPU_PPC_405D4:   /* 405 D4 family                 */
1921
        gen_spr_generic(env);
1922
        /* Time base */
1923
        gen_tbl(env);
1924
        gen_spr_40x(env);
1925
        gen_spr_405(env);
1926
        env->nb_BATs = 0;
1927
        env->nb_tlb = 64;
1928
        env->nb_ways = 1;
1929
        env->id_tlbs = 0;
1930
        /* Allocate hardware IRQ controller */
1931
        ppc405_irq_init(env);
1932
        break;
1933

    
1934
    case CPU_PPC_NPE405H: /* NPe405 H family               */
1935
    case CPU_PPC_NPE405H2:
1936
    case CPU_PPC_NPE405L: /* Npe405 L family               */
1937
        gen_spr_generic(env);
1938
        /* Time base */
1939
        gen_tbl(env);
1940
        gen_spr_40x(env);
1941
        gen_spr_405(env);
1942
        env->nb_BATs = 0;
1943
        env->nb_tlb = 64;
1944
        env->nb_ways = 1;
1945
        env->id_tlbs = 0;
1946
        /* Allocate hardware IRQ controller */
1947
        ppc405_irq_init(env);
1948
        break;
1949

    
1950
#if defined (TODO)
1951
    case CPU_PPC_STB01000:
1952
#endif
1953
#if defined (TODO)
1954
    case CPU_PPC_STB01010:
1955
#endif
1956
#if defined (TODO)
1957
    case CPU_PPC_STB0210:
1958
#endif
1959
    case CPU_PPC_STB03:   /* STB03 family                  */
1960
#if defined (TODO)
1961
    case CPU_PPC_STB043:  /* STB043 family                  */
1962
#endif
1963
#if defined (TODO)
1964
    case CPU_PPC_STB045:  /* STB045 family                  */
1965
#endif
1966
    case CPU_PPC_STB25:   /* STB25 family                  */
1967
#if defined (TODO)
1968
    case CPU_PPC_STB130:  /* STB130 family                 */
1969
#endif
1970
        gen_spr_generic(env);
1971
        /* Time base */
1972
        gen_tbl(env);
1973
        gen_spr_40x(env);
1974
        gen_spr_405(env);
1975
        env->nb_BATs = 0;
1976
        env->nb_tlb = 64;
1977
        env->nb_ways = 1;
1978
        env->id_tlbs = 0;
1979
        /* Allocate hardware IRQ controller */
1980
        ppc405_irq_init(env);
1981
        break;
1982

    
1983
    case CPU_PPC_440EP:   /* 440 EP family                 */
1984
    case CPU_PPC_440GP:   /* 440 GP family                 */
1985
    case CPU_PPC_440GX:   /* 440 GX family                 */
1986
    case CPU_PPC_440GXc:  /* 440 GXc family                */
1987
    case CPU_PPC_440GXf:  /* 440 GXf family                */
1988
    case CPU_PPC_440SP:   /* 440 SP family                 */
1989
    case CPU_PPC_440SP2:
1990
    case CPU_PPC_440SPE:  /* 440 SPE family                */
1991
        gen_spr_generic(env);
1992
        /* Time base */
1993
        gen_tbl(env);
1994
        gen_spr_BookE(env);
1995
        gen_spr_440(env);
1996
        env->nb_BATs = 0;
1997
        env->nb_tlb = 64;
1998
        env->nb_ways = 1;
1999
        env->id_tlbs = 0;
2000
        /* XXX: TODO: allocate internal IRQ controller */
2001
        break;
2002

    
2003
    /* Embedded PowerPC from Freescale                     */
2004
#if defined (TODO)
2005
    case CPU_PPC_5xx:
2006
        break;
2007
#endif
2008
#if defined (TODO)
2009
    case CPU_PPC_8xx:     /* MPC821 / 823 / 850 / 860      */
2010
        break;
2011
#endif
2012
#if defined (TODO)
2013
    case CPU_PPC_82xx_HIP3:    /* MPC8240 / 8260                */
2014
    case CPU_PPC_82xx_HIP4:    /* MPC8240 / 8260                */
2015
        break;
2016
#endif
2017
#if defined (TODO)
2018
    case CPU_PPC_827x:    /* MPC 827x / 828x               */
2019
        break;
2020
#endif
2021

    
2022
    /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
2023
    case CPU_PPC_e500v110:
2024
    case CPU_PPC_e500v120:
2025
    case CPU_PPC_e500v210:
2026
    case CPU_PPC_e500v220:
2027
        gen_spr_generic(env);
2028
        /* Time base */
2029
        gen_tbl(env);
2030
        gen_spr_BookE(env);
2031
        gen_spr_BookE_FSL(env);
2032
        env->nb_BATs = 0;
2033
        env->nb_tlb = 64;
2034
        env->nb_ways = 1;
2035
        env->id_tlbs = 0;
2036
        /* XXX: TODO: allocate internal IRQ controller */
2037
        break;
2038

    
2039
#if defined (TODO)
2040
    case CPU_PPC_e600:
2041
        break;
2042
#endif
2043

    
2044
    /* 32 bits PowerPC                                     */
2045
    case CPU_PPC_601:     /* PowerPC 601                   */
2046
        gen_spr_generic(env);
2047
        gen_spr_ne_601(env);
2048
        gen_spr_601(env);
2049
        /* Hardware implementation registers */
2050
        /* XXX : not implemented */
2051
        spr_register(env, SPR_HID0, "HID0",
2052
                     SPR_NOACCESS, SPR_NOACCESS,
2053
                     &spr_read_generic, &spr_write_generic,
2054
                     0x00000000);
2055
        /* XXX : not implemented */
2056
        spr_register(env, SPR_HID1, "HID1",
2057
                     SPR_NOACCESS, SPR_NOACCESS,
2058
                     &spr_read_generic, &spr_write_generic,
2059
                     0x00000000);
2060
        /* XXX : not implemented */
2061
        spr_register(env, SPR_601_HID2, "HID2",
2062
                     SPR_NOACCESS, SPR_NOACCESS,
2063
                     &spr_read_generic, &spr_write_generic,
2064
                     0x00000000);
2065
        /* XXX : not implemented */
2066
        spr_register(env, SPR_601_HID5, "HID5",
2067
                     SPR_NOACCESS, SPR_NOACCESS,
2068
                     &spr_read_generic, &spr_write_generic,
2069
                     0x00000000);
2070
        /* XXX : not implemented */
2071
#if 0 /* ? */
2072
        spr_register(env, SPR_601_HID15, "HID15",
2073
                     SPR_NOACCESS, SPR_NOACCESS,
2074
                     &spr_read_generic, &spr_write_generic,
2075
                     0x00000000);
2076
#endif
2077
        env->nb_tlb = 64;
2078
        env->nb_ways = 2;
2079
        env->id_tlbs = 0;
2080
        env->id_tlbs = 0;
2081
        /* XXX: TODO: allocate internal IRQ controller */
2082
        break;
2083

    
2084
    case CPU_PPC_602:     /* PowerPC 602                   */
2085
        gen_spr_generic(env);
2086
        gen_spr_ne_601(env);
2087
        /* Memory management */
2088
        gen_low_BATs(env);
2089
        /* Time base */
2090
        gen_tbl(env);
2091
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2092
        gen_spr_602(env);
2093
        /* hardware implementation registers */
2094
        /* XXX : not implemented */
2095
        spr_register(env, SPR_HID0, "HID0",
2096
                     SPR_NOACCESS, SPR_NOACCESS,
2097
                     &spr_read_generic, &spr_write_generic,
2098
                     0x00000000);
2099
        /* XXX : not implemented */
2100
        spr_register(env, SPR_HID1, "HID1",
2101
                     SPR_NOACCESS, SPR_NOACCESS,
2102
                     &spr_read_generic, &spr_write_generic,
2103
                     0x00000000);
2104
        /* Allocate hardware IRQ controller */
2105
        ppc6xx_irq_init(env);
2106
        break;
2107

    
2108
    case CPU_PPC_603:     /* PowerPC 603                   */
2109
    case CPU_PPC_603E:    /* PowerPC 603e                  */
2110
    case CPU_PPC_603E7v:
2111
    case CPU_PPC_603E7v2:
2112
    case CPU_PPC_603P:    /* PowerPC 603p                  */
2113
    case CPU_PPC_603R:    /* PowerPC 603r                  */
2114
        gen_spr_generic(env);
2115
        gen_spr_ne_601(env);
2116
        /* Memory management */
2117
        gen_low_BATs(env);
2118
        /* Time base */
2119
        gen_tbl(env);
2120
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2121
        gen_spr_603(env);
2122
        /* hardware implementation registers */
2123
        /* XXX : not implemented */
2124
        spr_register(env, SPR_HID0, "HID0",
2125
                     SPR_NOACCESS, SPR_NOACCESS,
2126
                     &spr_read_generic, &spr_write_generic,
2127
                     0x00000000);
2128
        /* XXX : not implemented */
2129
        spr_register(env, SPR_HID1, "HID1",
2130
                     SPR_NOACCESS, SPR_NOACCESS,
2131
                     &spr_read_generic, &spr_write_generic,
2132
                     0x00000000);
2133
        /* Allocate hardware IRQ controller */
2134
        ppc6xx_irq_init(env);
2135
        break;
2136
        
2137
    case CPU_PPC_G2:      /* PowerPC G2 family             */
2138
    case CPU_PPC_G2H4:
2139
    case CPU_PPC_G2gp:
2140
    case CPU_PPC_G2ls:
2141
    case CPU_PPC_G2LE:    /* PowerPC G2LE family           */
2142
    case CPU_PPC_G2LEgp:
2143
    case CPU_PPC_G2LEls:
2144
        gen_spr_generic(env);
2145
        gen_spr_ne_601(env);
2146
        /* Memory management */
2147
        gen_low_BATs(env);
2148
        /* Time base */
2149
        gen_tbl(env);
2150
        /* Memory management */
2151
        gen_high_BATs(env);
2152
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2153
        gen_spr_G2_755(env);
2154
        gen_spr_G2(env);
2155
        /* Hardware implementation register */
2156
        /* XXX : not implemented */
2157
        spr_register(env, SPR_HID0, "HID0",
2158
                     SPR_NOACCESS, SPR_NOACCESS,
2159
                     &spr_read_generic, &spr_write_generic,
2160
                     0x00000000);
2161
        /* XXX : not implemented */
2162
        spr_register(env, SPR_HID1, "HID1",
2163
                     SPR_NOACCESS, SPR_NOACCESS,
2164
                     &spr_read_generic, &spr_write_generic,
2165
                     0x00000000);
2166
        /* XXX : not implemented */
2167
        spr_register(env, SPR_HID2, "HID2",
2168
                     SPR_NOACCESS, SPR_NOACCESS,
2169
                     &spr_read_generic, &spr_write_generic,
2170
                     0x00000000);
2171
        /* Allocate hardware IRQ controller */
2172
        ppc6xx_irq_init(env);
2173
        break;
2174

    
2175
    case CPU_PPC_604:     /* PowerPC 604                   */
2176
    case CPU_PPC_604E:    /* PowerPC 604e                  */
2177
    case CPU_PPC_604R:    /* PowerPC 604r                  */
2178
        gen_spr_generic(env);
2179
        gen_spr_ne_601(env);
2180
        /* Memory management */
2181
        gen_low_BATs(env);
2182
        /* Time base */
2183
        gen_tbl(env);
2184
        gen_spr_604(env);
2185
        /* Hardware implementation registers */
2186
        /* XXX : not implemented */
2187
        spr_register(env, SPR_HID0, "HID0",
2188
                     SPR_NOACCESS, SPR_NOACCESS,
2189
                     &spr_read_generic, &spr_write_generic,
2190
                     0x00000000);
2191
        /* XXX : not implemented */
2192
        spr_register(env, SPR_HID1, "HID1",
2193
                     SPR_NOACCESS, SPR_NOACCESS,
2194
                     &spr_read_generic, &spr_write_generic,
2195
                     0x00000000);
2196
        /* Allocate hardware IRQ controller */
2197
        ppc6xx_irq_init(env);
2198
        break;
2199

    
2200
    case CPU_PPC_74x:     /* PowerPC 740 / 750             */
2201
    case CPU_PPC_740E:
2202
    case CPU_PPC_750E:
2203
    case CPU_PPC_74xP:    /* PowerPC 740P / 750P           */
2204
    case CPU_PPC_750CXE21: /* IBM PowerPC 750cxe            */
2205
    case CPU_PPC_750CXE22:
2206
    case CPU_PPC_750CXE23:
2207
    case CPU_PPC_750CXE24:
2208
    case CPU_PPC_750CXE24b:
2209
    case CPU_PPC_750CXE31:
2210
    case CPU_PPC_750CXE31b:
2211
    case CPU_PPC_750CXR:
2212
        gen_spr_generic(env);
2213
        gen_spr_ne_601(env);
2214
        /* Memory management */
2215
        gen_low_BATs(env);
2216
        /* Time base */
2217
        gen_tbl(env);
2218
        gen_spr_7xx(env);
2219
        /* Hardware implementation registers */
2220
        /* XXX : not implemented */
2221
        spr_register(env, SPR_HID0, "HID0",
2222
                     SPR_NOACCESS, SPR_NOACCESS,
2223
                     &spr_read_generic, &spr_write_generic,
2224
                     0x00000000);
2225
        /* XXX : not implemented */
2226
        spr_register(env, SPR_HID1, "HID1",
2227
                     SPR_NOACCESS, SPR_NOACCESS,
2228
                     &spr_read_generic, &spr_write_generic,
2229
                     0x00000000);
2230
        /* Allocate hardware IRQ controller */
2231
        ppc6xx_irq_init(env);
2232
        break;
2233

    
2234
    case CPU_PPC_750FX10: /* IBM PowerPC 750 FX            */
2235
    case CPU_PPC_750FX20:
2236
    case CPU_PPC_750FX21:
2237
    case CPU_PPC_750FX22:
2238
    case CPU_PPC_750FX23:
2239
    case CPU_PPC_750GX10: /* IBM PowerPC 750 GX            */
2240
    case CPU_PPC_750GX11:
2241
    case CPU_PPC_750GX12:
2242
        gen_spr_generic(env);
2243
        gen_spr_ne_601(env);
2244
        /* Memory management */
2245
        gen_low_BATs(env);
2246
        /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2247
        gen_high_BATs(env);
2248
        /* Time base */
2249
        gen_tbl(env);
2250
        gen_spr_7xx(env);
2251
        /* Hardware implementation registers */
2252
        /* XXX : not implemented */
2253
        spr_register(env, SPR_HID0, "HID0",
2254
                     SPR_NOACCESS, SPR_NOACCESS,
2255
                     &spr_read_generic, &spr_write_generic,
2256
                     0x00000000);
2257
        /* XXX : not implemented */
2258
        spr_register(env, SPR_HID1, "HID1",
2259
                     SPR_NOACCESS, SPR_NOACCESS,
2260
                     &spr_read_generic, &spr_write_generic,
2261
                     0x00000000);
2262
        /* XXX : not implemented */
2263
        spr_register(env, SPR_750_HID2, "HID2",
2264
                     SPR_NOACCESS, SPR_NOACCESS,
2265
                     &spr_read_generic, &spr_write_generic,
2266
                     0x00000000);
2267
        /* Allocate hardware IRQ controller */
2268
        ppc6xx_irq_init(env);
2269
        break;
2270

    
2271
    case CPU_PPC_755_10:  /* PowerPC 755                   */
2272
    case CPU_PPC_755_11:
2273
    case CPU_PPC_755_20:
2274
    case CPU_PPC_755D:
2275
    case CPU_PPC_755E:
2276
        gen_spr_generic(env);
2277
        gen_spr_ne_601(env);
2278
        /* Memory management */
2279
        gen_low_BATs(env);
2280
        /* Time base */
2281
        gen_tbl(env);
2282
        /* Memory management */
2283
        gen_high_BATs(env);
2284
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2285
        gen_spr_G2_755(env);
2286
        /* L2 cache control */
2287
        /* XXX : not implemented */
2288
        spr_register(env, SPR_ICTC, "ICTC",
2289
                     SPR_NOACCESS, SPR_NOACCESS,
2290
                     &spr_read_generic, &spr_write_generic,
2291
                     0x00000000);
2292
        /* XXX : not implemented */
2293
        spr_register(env, SPR_L2PM, "L2PM",
2294
                     SPR_NOACCESS, SPR_NOACCESS,
2295
                     &spr_read_generic, &spr_write_generic,
2296
                     0x00000000);
2297
        /* Hardware implementation registers */
2298
        /* XXX : not implemented */
2299
        spr_register(env, SPR_HID0, "HID0",
2300
                     SPR_NOACCESS, SPR_NOACCESS,
2301
                     &spr_read_generic, &spr_write_generic,
2302
                     0x00000000);
2303
        /* XXX : not implemented */
2304
        spr_register(env, SPR_HID1, "HID1",
2305
                     SPR_NOACCESS, SPR_NOACCESS,
2306
                     &spr_read_generic, &spr_write_generic,
2307
                     0x00000000);
2308
        /* XXX : not implemented */
2309
        spr_register(env, SPR_HID2, "HID2",
2310
                     SPR_NOACCESS, SPR_NOACCESS,
2311
                     &spr_read_generic, &spr_write_generic,
2312
                     0x00000000);
2313
        /* Allocate hardware IRQ controller */
2314
        ppc6xx_irq_init(env);
2315
        break;
2316

    
2317
#if defined (TODO)
2318
    /* G4 family */
2319
    case CPU_PPC_7400:    /* PowerPC 7400                  */
2320
    case CPU_PPC_7410C:   /* PowerPC 7410                  */
2321
    case CPU_PPC_7410D:
2322
    case CPU_PPC_7410E:
2323
    case CPU_PPC_7441:    /* PowerPC 7441                  */
2324
    case CPU_PPC_7445:    /* PowerPC 7445                  */
2325
    case CPU_PPC_7447:    /* PowerPC 7447                  */
2326
    case CPU_PPC_7447A:   /* PowerPC 7447A                 */
2327
    case CPU_PPC_7448:    /* PowerPC 7448                  */
2328
    case CPU_PPC_7450:    /* PowerPC 7450                  */
2329
    case CPU_PPC_7450b:
2330
    case CPU_PPC_7451:    /* PowerPC 7451                  */
2331
    case CPU_PPC_7451G:
2332
    case CPU_PPC_7455:    /* PowerPC 7455                  */
2333
    case CPU_PPC_7455F:
2334
    case CPU_PPC_7455G:
2335
    case CPU_PPC_7457:    /* PowerPC 7457                  */
2336
    case CPU_PPC_7457C:
2337
    case CPU_PPC_7457A:   /* PowerPC 7457A                 */
2338
        break;
2339
#endif
2340

    
2341
    /* 64 bits PowerPC                                     */
2342
#if defined (TARGET_PPC64)
2343
#if defined (TODO)
2344
    case CPU_PPC_620:     /* PowerPC 620                   */
2345
    case CPU_PPC_630:     /* PowerPC 630 (Power 3)         */
2346
    case CPU_PPC_631:     /* PowerPC 631 (Power 3+)        */
2347
    case CPU_PPC_POWER4:  /* Power 4                       */
2348
    case CPU_PPC_POWER4P: /* Power 4+                      */
2349
    case CPU_PPC_POWER5:  /* Power 5                       */
2350
    case CPU_PPC_POWER5P: /* Power 5+                      */
2351
#endif
2352
        break;
2353

    
2354
    case CPU_PPC_970:     /* PowerPC 970                   */
2355
    case CPU_PPC_970FX10: /* PowerPC 970 FX                */
2356
    case CPU_PPC_970FX20:
2357
    case CPU_PPC_970FX21:
2358
    case CPU_PPC_970FX30:
2359
    case CPU_PPC_970FX31:
2360
    case CPU_PPC_970MP10: /* PowerPC 970 MP                */
2361
    case CPU_PPC_970MP11:
2362
        gen_spr_generic(env);
2363
        gen_spr_ne_601(env);
2364
        /* XXX: not correct */
2365
        gen_low_BATs(env);
2366
        /* Time base */
2367
        gen_tbl(env);
2368
        gen_spr_7xx(env);
2369
        /* Hardware implementation registers */
2370
        /* XXX : not implemented */
2371
        spr_register(env, SPR_HID0, "HID0",
2372
                     SPR_NOACCESS, SPR_NOACCESS,
2373
                     &spr_read_generic, &spr_write_generic,
2374
                     0x00000000);
2375
        /* XXX : not implemented */
2376
        spr_register(env, SPR_HID1, "HID1",
2377
                     SPR_NOACCESS, SPR_NOACCESS,
2378
                     &spr_read_generic, &spr_write_generic,
2379
                     0x00000000);
2380
        /* XXX : not implemented */
2381
        spr_register(env, SPR_750_HID2, "HID2",
2382
                     SPR_NOACCESS, SPR_NOACCESS,
2383
                     &spr_read_generic, &spr_write_generic,
2384
                     0x00000000);
2385
        /* Allocate hardware IRQ controller */
2386
        ppc970_irq_init(env);
2387
        break;
2388

    
2389
#if defined (TODO)
2390
    case CPU_PPC_CELL10:  /* Cell family                   */
2391
    case CPU_PPC_CELL20:
2392
    case CPU_PPC_CELL30:
2393
    case CPU_PPC_CELL31:
2394
#endif
2395
        break;
2396

    
2397
#if defined (TODO)
2398
    case CPU_PPC_RS64:    /* Apache (RS64/A35)             */
2399
    case CPU_PPC_RS64II:  /* NorthStar (RS64-II/A50)       */
2400
    case CPU_PPC_RS64III: /* Pulsar (RS64-III)             */
2401
    case CPU_PPC_RS64IV:  /* IceStar/IStar/SStar (RS64-IV) */
2402
#endif
2403
        break;
2404
#endif /* defined (TARGET_PPC64) */
2405

    
2406
#if defined (TODO)
2407
        /* POWER                                               */
2408
    case CPU_POWER:       /* POWER                         */
2409
    case CPU_POWER2:      /* POWER2                        */
2410
        break;
2411
#endif
2412

    
2413
    default:
2414
        gen_spr_generic(env);
2415
        /* XXX: TODO: allocate internal IRQ controller */
2416
        break;
2417
    }
2418
    if (env->nb_BATs == -1)
2419
        env->nb_BATs = 4;
2420
    /* Allocate TLBs buffer when needed */
2421
    if (env->nb_tlb != 0) {
2422
        int nb_tlb = env->nb_tlb;
2423
        if (env->id_tlbs != 0)
2424
            nb_tlb *= 2;
2425
        env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
2426
        /* Pre-compute some useful values */
2427
        env->tlb_per_way = env->nb_tlb / env->nb_ways;
2428
    }
2429
}
2430

    
2431
#if defined(PPC_DUMP_CPU)
2432
static void dump_sprs (CPUPPCState *env)
2433
{
2434
    ppc_spr_t *spr;
2435
    uint32_t pvr = env->spr[SPR_PVR];
2436
    uint32_t sr, sw, ur, uw;
2437
    int i, j, n;
2438

    
2439
    printf("* SPRs for PVR=%08x\n", pvr);
2440
    for (i = 0; i < 32; i++) {
2441
        for (j = 0; j < 32; j++) {
2442
            n = (i << 5) | j;
2443
            spr = &env->spr_cb[n];
2444
#if !defined(CONFIG_USER_ONLY)
2445
            sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
2446
            sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
2447
#else
2448
            sw = 0;
2449
            sr = 0;
2450
#endif
2451
            uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
2452
            ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
2453
            if (sw || sr || uw || ur) {
2454
                printf("%4d (%03x) %8s s%c%c u%c%c\n",
2455
                       (i << 5) | j, (i << 5) | j, spr->name,
2456
                       sw ? 'w' : '-', sr ? 'r' : '-',
2457
                       uw ? 'w' : '-', ur ? 'r' : '-');
2458
            }
2459
        }
2460
    }
2461
    fflush(stdout);
2462
    fflush(stderr);
2463
}
2464
#endif
2465

    
2466
/*****************************************************************************/
2467
#include <stdlib.h>
2468
#include <string.h>
2469

    
2470
int fflush (FILE *stream);
2471

    
2472
/* Opcode types */
2473
enum {
2474
    PPC_DIRECT   = 0, /* Opcode routine        */
2475
    PPC_INDIRECT = 1, /* Indirect opcode table */
2476
};
2477

    
2478
static inline int is_indirect_opcode (void *handler)
2479
{
2480
    return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
2481
}
2482

    
2483
static inline opc_handler_t **ind_table(void *handler)
2484
{
2485
    return (opc_handler_t **)((unsigned long)handler & ~3);
2486
}
2487

    
2488
/* Instruction table creation */
2489
/* Opcodes tables creation */
2490
static void fill_new_table (opc_handler_t **table, int len)
2491
{
2492
    int i;
2493

    
2494
    for (i = 0; i < len; i++)
2495
        table[i] = &invalid_handler;
2496
}
2497

    
2498
static int create_new_table (opc_handler_t **table, unsigned char idx)
2499
{
2500
    opc_handler_t **tmp;
2501

    
2502
    tmp = malloc(0x20 * sizeof(opc_handler_t));
2503
    if (tmp == NULL)
2504
        return -1;
2505
    fill_new_table(tmp, 0x20);
2506
    table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
2507

    
2508
    return 0;
2509
}
2510

    
2511
static int insert_in_table (opc_handler_t **table, unsigned char idx,
2512
                            opc_handler_t *handler)
2513
{
2514
    if (table[idx] != &invalid_handler)
2515
        return -1;
2516
    table[idx] = handler;
2517

    
2518
    return 0;
2519
}
2520

    
2521
static int register_direct_insn (opc_handler_t **ppc_opcodes,
2522
                                 unsigned char idx, opc_handler_t *handler)
2523
{
2524
    if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
2525
        printf("*** ERROR: opcode %02x already assigned in main "
2526
               "opcode table\n", idx);
2527
        return -1;
2528
    }
2529

    
2530
    return 0;
2531
}
2532

    
2533
static int register_ind_in_table (opc_handler_t **table,
2534
                                  unsigned char idx1, unsigned char idx2,
2535
                                  opc_handler_t *handler)
2536
{
2537
    if (table[idx1] == &invalid_handler) {
2538
        if (create_new_table(table, idx1) < 0) {
2539
            printf("*** ERROR: unable to create indirect table "
2540
                   "idx=%02x\n", idx1);
2541
            return -1;
2542
        }
2543
    } else {
2544
        if (!is_indirect_opcode(table[idx1])) {
2545
            printf("*** ERROR: idx %02x already assigned to a direct "
2546
                   "opcode\n", idx1);
2547
            return -1;
2548
        }
2549
    }
2550
    if (handler != NULL &&
2551
        insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
2552
        printf("*** ERROR: opcode %02x already assigned in "
2553
               "opcode table %02x\n", idx2, idx1);
2554
        return -1;
2555
    }
2556

    
2557
    return 0;
2558
}
2559

    
2560
static int register_ind_insn (opc_handler_t **ppc_opcodes,
2561
                              unsigned char idx1, unsigned char idx2,
2562
                              opc_handler_t *handler)
2563
{
2564
    int ret;
2565

    
2566
    ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
2567

    
2568
    return ret;
2569
}
2570

    
2571
static int register_dblind_insn (opc_handler_t **ppc_opcodes, 
2572
                                 unsigned char idx1, unsigned char idx2,
2573
                                 unsigned char idx3, opc_handler_t *handler)
2574
{
2575
    if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
2576
        printf("*** ERROR: unable to join indirect table idx "
2577
               "[%02x-%02x]\n", idx1, idx2);
2578
        return -1;
2579
    }
2580
    if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
2581
                              handler) < 0) {
2582
        printf("*** ERROR: unable to insert opcode "
2583
               "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
2584
        return -1;
2585
    }
2586

    
2587
    return 0;
2588
}
2589

    
2590
static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
2591
{
2592
    if (insn->opc2 != 0xFF) {
2593
        if (insn->opc3 != 0xFF) {
2594
            if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
2595
                                     insn->opc3, &insn->handler) < 0)
2596
                return -1;
2597
        } else {
2598
            if (register_ind_insn(ppc_opcodes, insn->opc1,
2599
                                  insn->opc2, &insn->handler) < 0)
2600
                return -1;
2601
        }
2602
    } else {
2603
        if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
2604
            return -1;
2605
    }
2606

    
2607
    return 0;
2608
}
2609

    
2610
static int test_opcode_table (opc_handler_t **table, int len)
2611
{
2612
    int i, count, tmp;
2613

    
2614
    for (i = 0, count = 0; i < len; i++) {
2615
        /* Consistency fixup */
2616
        if (table[i] == NULL)
2617
            table[i] = &invalid_handler;
2618
        if (table[i] != &invalid_handler) {
2619
            if (is_indirect_opcode(table[i])) {
2620
                tmp = test_opcode_table(ind_table(table[i]), 0x20);
2621
                if (tmp == 0) {
2622
                    free(table[i]);
2623
                    table[i] = &invalid_handler;
2624
                } else {
2625
                    count++;
2626
                }
2627
            } else {
2628
                count++;
2629
            }
2630
        }
2631
    }
2632

    
2633
    return count;
2634
}
2635

    
2636
static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
2637
{
2638
    if (test_opcode_table(ppc_opcodes, 0x40) == 0)
2639
        printf("*** WARNING: no opcode defined !\n");
2640
}
2641

    
2642
/*****************************************************************************/
2643
static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
2644
{
2645
    opcode_t *opc, *start, *end;
2646

    
2647
    fill_new_table(env->opcodes, 0x40);
2648
#if defined(PPC_DUMP_CPU)
2649
    printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2650
           " %08x\n",
2651
           def->pvr, def->name, def->insns_flags, def->flags);
2652
#endif
2653
    if (&opc_start < &opc_end) {
2654
        start = &opc_start;
2655
        end = &opc_end;
2656
    } else {
2657
        start = &opc_end;
2658
        end = &opc_start;
2659
    }
2660
    for (opc = start + 1; opc != end; opc++) {
2661
        if ((opc->handler.type & def->insns_flags) != 0) {
2662
            if (register_insn(env->opcodes, opc) < 0) {
2663
                printf("*** ERROR initializing PowerPC instruction "
2664
                       "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
2665
                       opc->opc3);
2666
                return -1;
2667
            }
2668
#if defined(PPC_DUMP_CPU)
2669
            if (opc1 != 0x00) {
2670
                if (opc->opc3 == 0xFF) {
2671
                    if (opc->opc2 == 0xFF) {
2672
                        printf(" %02x -- -- (%2d ----) : %s\n",
2673
                               opc->opc1, opc->opc1, opc->oname);
2674
                    } else {
2675
                        printf(" %02x %02x -- (%2d %4d) : %s\n",
2676
                               opc->opc1, opc->opc2, opc->opc1, opc->opc2,
2677
                               opc->oname);
2678
                    }
2679
                } else {
2680
                    printf(" %02x %02x %02x (%2d %4d) : %s\n",
2681
                           opc->opc1, opc->opc2, opc->opc3,
2682
                           opc->opc1, (opc->opc3 << 5) | opc->opc2,
2683
                           opc->oname);
2684
                }
2685
            }
2686
#endif
2687
        }
2688
    }
2689
    fix_opcode_tables(env->opcodes);
2690
    fflush(stdout);
2691
    fflush(stderr);
2692

    
2693
    return 0;
2694
}
2695

    
2696
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
2697
{
2698
    env->msr_mask = def->msr_mask;
2699
    env->flags = def->flags;
2700
    if (create_ppc_opcodes(env, def) < 0)
2701
        return -1;
2702
    init_ppc_proc(env, def);
2703
#if defined(PPC_DUMP_CPU)
2704
    dump_sprs(env);
2705
    if (env->tlb != NULL) {
2706
        printf("%d %s TLB in %d ways\n", env->nb_tlb,
2707
               env->id_tlbs ? "splitted" : "merged", env->nb_ways);
2708
    }
2709
#endif
2710

    
2711
    return 0;
2712
}
2713

    
2714
/*****************************************************************************/
2715
/* PowerPC CPU definitions */
2716
static ppc_def_t ppc_defs[] = {
2717
    /* Embedded PowerPC */
2718
#if defined (TODO)
2719
    /* PowerPC 401 */
2720
    {
2721
        .name        = "401",
2722
        .pvr         = CPU_PPC_401,
2723
        .pvr_mask    = 0xFFFF0000,
2724
        .insns_flags = PPC_INSNS_401,
2725
        .flags       = PPC_FLAGS_401,
2726
        .msr_mask    = xxx,
2727
    },
2728
#endif
2729
#if defined (TODO)
2730
    /* IOP480 (401 microcontroler) */
2731
    {
2732
        .name        = "iop480",
2733
        .pvr         = CPU_PPC_IOP480,
2734
        .pvr_mask    = 0xFFFF0000,
2735
        .insns_flags = PPC_INSNS_401,
2736
        .flags       = PPC_FLAGS_401,
2737
        .msr_mask    = xxx,
2738
    },
2739
#endif
2740
#if defined (TODO)
2741
    /* IBM Processor for Network Resources */
2742
    {
2743
        .name        = "Cobra",
2744
        .pvr         = CPU_PPC_COBRA,
2745
        .pvr_mask    = 0xFFFF0000,
2746
        .insns_flags = PPC_INSNS_401,
2747
        .flags       = PPC_FLAGS_401,
2748
        .msr_mask    = xxx,
2749
    },
2750
#endif
2751
#if defined (TODO)
2752
    /* Generic PowerPC 403 */
2753
    {
2754
        .name        = "403",
2755
        .pvr         = CPU_PPC_403,
2756
        .pvr_mask    = 0xFFFFFF00,
2757
        .insns_flags = PPC_INSNS_403,
2758
        .flags       = PPC_FLAGS_403,
2759
        .msr_mask    = 0x000000000007D23D,
2760
    },
2761
#endif
2762
#if defined (TODO)
2763
    /* PowerPC 403 GA */
2764
    {
2765
        .name        = "403ga",
2766
        .pvr         = CPU_PPC_403GA,
2767
        .pvr_mask    = 0xFFFFFF00,
2768
        .insns_flags = PPC_INSNS_403,
2769
        .flags       = PPC_FLAGS_403,
2770
        .msr_mask    = 0x000000000007D23D,
2771
    },
2772
#endif
2773
#if defined (TODO)
2774
    /* PowerPC 403 GB */
2775
    {
2776
        .name        = "403gb",
2777
        .pvr         = CPU_PPC_403GB,
2778
        .pvr_mask    = 0xFFFFFF00,
2779
        .insns_flags = PPC_INSNS_403,
2780
        .flags       = PPC_FLAGS_403,
2781
        .msr_mask    = 0x000000000007D23D,
2782
    },
2783
#endif
2784
#if defined (TODO)
2785
    /* PowerPC 403 GC */
2786
    {
2787
        .name        = "403gc",
2788
        .pvr         = CPU_PPC_403GC,
2789
        .pvr_mask    = 0xFFFFFF00,
2790
        .insns_flags = PPC_INSNS_403,
2791
        .flags       = PPC_FLAGS_403,
2792
        .msr_mask    = 0x000000000007D23D,
2793
    },
2794
#endif
2795
#if defined (TODO)
2796
    /* PowerPC 403 GCX */
2797
    {
2798
        .name        = "403gcx",
2799
        .pvr         = CPU_PPC_403GCX,
2800
        .pvr_mask    = 0xFFFFFF00,
2801
        .insns_flags = PPC_INSNS_403,
2802
        .flags       = PPC_FLAGS_403,
2803
        .msr_mask    = 0x000000000007D23D,
2804
    },
2805
#endif
2806
    /* Generic PowerPC 405 */
2807
    {
2808
        .name        = "405",
2809
        .pvr         = CPU_PPC_405,
2810
        .pvr_mask    = 0xFFFF0000,
2811
        .insns_flags = PPC_INSNS_405,
2812
        .flags       = PPC_FLAGS_405,
2813
        .msr_mask    = 0x00000000020EFF30,
2814
    },
2815
    /* PowerPC 405 CR */
2816
    {
2817
        .name        = "405cr",
2818
        .pvr         = CPU_PPC_405,
2819
        .pvr_mask    = 0xFFFFFFFF,
2820
        .insns_flags = PPC_INSNS_405,
2821
        .flags       = PPC_FLAGS_405,
2822
        .msr_mask    = 0x00000000020EFF30,
2823
    },
2824
#if defined (TODO)
2825
    /* PowerPC 405 GP */
2826
    {
2827
        .name        = "405gp",
2828
        .pvr         = CPU_PPC_405,
2829
        .pvr_mask    = 0xFFFFFFFF,
2830
        .insns_flags = PPC_INSNS_405,
2831
        .flags       = PPC_FLAGS_405,
2832
        .msr_mask    = 0x00000000020EFF30,
2833
    },
2834
#endif
2835
    /* PowerPC 405 EP */
2836
    {
2837
        .name        = "405ep",
2838
        .pvr         = CPU_PPC_405EP,
2839
        .pvr_mask    = 0xFFFFFFFF,
2840
        .insns_flags = PPC_INSNS_405,
2841
        .flags       = PPC_FLAGS_405,
2842
        .msr_mask    = 0x00000000020EFF30,
2843
    },
2844
#if defined (TODO)
2845
    /* PowerPC 405 EZ */
2846
    {
2847
        .name        = "405ez",
2848
        .pvr         = CPU_PPC_405EZ,
2849
        .pvr_mask    = 0xFFFFFFFF,
2850
        .insns_flags = PPC_INSNS_405,
2851
        .flags       = PPC_FLAGS_405,
2852
        .msr_mask    = 0x00000000020EFF30,
2853
    },
2854
#endif
2855
#if defined (TODO)
2856
    /* PowerPC 405 GPR */
2857
    {
2858
        .name        = "405gpr",
2859
        .pvr         = CPU_PPC_405GPR,
2860
        .pvr_mask    = 0xFFFFFFFF,
2861
        .insns_flags = PPC_INSNS_405,
2862
        .flags       = PPC_FLAGS_405,
2863
        .msr_mask    = 0x00000000020EFF30,
2864
    },
2865
#endif
2866
#if defined (TODO)
2867
    /* PowerPC 405 D2 */
2868
    {
2869
        .name        = "405d2",
2870
        .pvr         = CPU_PPC_405D2,
2871
        .pvr_mask    = 0xFFFFFFFF,
2872
        .insns_flags = PPC_INSNS_405,
2873
        .flags       = PPC_FLAGS_405,
2874
        .msr_mask    = 0x00000000020EFF30,
2875
    },
2876
#endif
2877
#if defined (TODO)
2878
    /* PowerPC 405 D4 */
2879
    {
2880
        .name        = "405d4",
2881
        .pvr         = CPU_PPC_405D4,
2882
        .pvr_mask    = 0xFFFFFFFF,
2883
        .insns_flags = PPC_INSNS_405,
2884
        .flags       = PPC_FLAGS_405,
2885
        .msr_mask    = 0x00000000020EFF30,
2886
    },
2887
#endif
2888
#if defined (TODO)
2889
    /* Npe405 H */
2890
    {
2891
        .name        = "Npe405H",
2892
        .pvr         = CPU_PPC_NPE405H,
2893
        .pvr_mask    = 0xFFFFFFFF,
2894
            .insns_flags = PPC_INSNS_405,
2895
        .flags       = PPC_FLAGS_405,
2896
        .msr_mask    = 0x00000000020EFF30,
2897
    },
2898
#endif
2899
#if defined (TODO)
2900
    /* Npe405 L */
2901
    {
2902
        .name        = "Npe405L",
2903
        .pvr         = CPU_PPC_NPE405L,
2904
        .pvr_mask    = 0xFFFFFFFF,
2905
        .insns_flags = PPC_INSNS_405,
2906
        .flags       = PPC_FLAGS_405,
2907
        .msr_mask    = 0x00000000020EFF30,
2908
    },
2909
#endif
2910
#if defined (TODO)
2911
    /* STB010000 */
2912
    {
2913
        .name        = "STB01000",
2914
        .pvr         = CPU_PPC_STB01000,
2915
        .pvr_mask    = 0xFFFFFFFF,
2916
        .insns_flags = PPC_INSNS_405,
2917
        .flags       = PPC_FLAGS_405,
2918
        .msr_mask    = 0x00000000020EFF30,
2919
    },
2920
#endif
2921
#if defined (TODO)
2922
    /* STB01010 */
2923
    {
2924
        .name        = "STB01010",
2925
        .pvr         = CPU_PPC_STB01010,
2926
        .pvr_mask    = 0xFFFFFFFF,
2927
        .insns_flags = PPC_INSNS_405,
2928
        .flags       = PPC_FLAGS_405,
2929
        .msr_mask    = 0x00000000020EFF30,
2930
    },
2931
#endif
2932
#if defined (TODO)
2933
    /* STB0210 */
2934
    {
2935
        .name        = "STB0210",
2936
        .pvr         = CPU_PPC_STB0210,
2937
        .pvr_mask    = 0xFFFFFFFF,
2938
        .insns_flags = PPC_INSNS_405,
2939
        .flags       = PPC_FLAGS_405,
2940
        .msr_mask    = 0x00000000020EFF30,
2941
    },
2942
#endif
2943
#if defined (TODO) || 1
2944
    /* STB03xx */
2945
    {
2946
        .name        = "STB03",
2947
        .pvr         = CPU_PPC_STB03,
2948
        .pvr_mask    = 0xFFFFFFFF,
2949
        .insns_flags = PPC_INSNS_405,
2950
        .flags       = PPC_FLAGS_405,
2951
        .msr_mask    = 0x00000000020EFF30,
2952
    },
2953
#endif
2954
#if defined (TODO)
2955
    /* STB043x */
2956
    {
2957
        .name        = "STB043",
2958
        .pvr         = CPU_PPC_STB043,
2959
        .pvr_mask    = 0xFFFFFFFF,
2960
        .insns_flags = PPC_INSNS_405,
2961
        .flags       = PPC_FLAGS_405,
2962
        .msr_mask    = 0x00000000020EFF30,
2963
    },
2964
#endif
2965
#if defined (TODO)
2966
    /* STB045x */
2967
    {
2968
        .name        = "STB045",
2969
        .pvr         = CPU_PPC_STB045,
2970
        .pvr_mask    = 0xFFFFFFFF,
2971
        .insns_flags = PPC_INSNS_405,
2972
        .flags       = PPC_FLAGS_405,
2973
        .msr_mask    = 0x00000000020EFF30,
2974
    },
2975
#endif
2976
#if defined (TODO) || 1
2977
    /* STB25xx */
2978
    {
2979
        .name        = "STB25",
2980
        .pvr         = CPU_PPC_STB25,
2981
        .pvr_mask    = 0xFFFFFFFF,
2982
        .insns_flags = PPC_INSNS_405,
2983
        .flags       = PPC_FLAGS_405,
2984
        .msr_mask    = 0x00000000020EFF30,
2985
    },
2986
#endif
2987
#if defined (TODO)
2988
    /* STB130 */
2989
    {
2990
        .name        = "STB130",
2991
        .pvr         = CPU_PPC_STB130,
2992
        .pvr_mask    = 0xFFFFFFFF,
2993
        .insns_flags = PPC_INSNS_405,
2994
        .flags       = PPC_FLAGS_405,
2995
        .msr_mask    = 0x00000000020EFF30,
2996
    },
2997
#endif
2998
        /* Xilinx PowerPC 405 cores */
2999
#if defined (TODO)
3000
    {
3001
        .name        = "x2vp4",
3002
        .pvr         = CPU_PPC_X2VP4,
3003
        .pvr_mask    = 0xFFFFFFFF,
3004
        .insns_flags = PPC_INSNS_405,
3005
        .flags       = PPC_FLAGS_405,
3006
        .msr_mask    = 0x00000000020EFF30,
3007
    },
3008
    {
3009
        .name        = "x2vp7",
3010
        .pvr         = CPU_PPC_X2VP7,
3011
        .pvr_mask    = 0xFFFFFFFF,
3012
        .insns_flags = PPC_INSNS_405,
3013
        .flags       = PPC_FLAGS_405,
3014
        .msr_mask    = 0x00000000020EFF30,
3015
    },
3016
    {
3017
        .name        = "x2vp20",
3018
        .pvr         = CPU_PPC_X2VP20,
3019
        .pvr_mask    = 0xFFFFFFFF,
3020
        .insns_flags = PPC_INSNS_405,
3021
        .flags       = PPC_FLAGS_405,
3022
        .msr_mask    = 0x00000000020EFF30,
3023
    },
3024
    {
3025
        .name        = "x2vp50",
3026
        .pvr         = CPU_PPC_X2VP50,
3027
        .pvr_mask    = 0xFFFFFFFF,
3028
        .insns_flags = PPC_INSNS_405,
3029
        .flags       = PPC_FLAGS_405,
3030
        .msr_mask    = 0x00000000020EFF30,
3031
    },
3032
#endif
3033
#if defined (TODO)
3034
    /* PowerPC 440 EP */
3035
    {
3036
        .name        = "440ep",
3037
        .pvr         = CPU_PPC_440EP,
3038
        .pvr_mask    = 0xFFFF0000,
3039
        .insns_flags = PPC_INSNS_440,
3040
        .flags       = PPC_FLAGS_440,
3041
        .msr_mask    = 0x000000000006D630,
3042
    },
3043
#endif
3044
#if defined (TODO)
3045
    /* PowerPC 440 GR */
3046
    {
3047
        .name        = "440gr",
3048
        .pvr         = CPU_PPC_440GR,
3049
        .pvr_mask    = 0xFFFF0000,
3050
        .insns_flags = PPC_INSNS_440,
3051
        .flags       = PPC_FLAGS_440,
3052
        .msr_mask    = 0x000000000006D630,
3053
    },
3054
#endif
3055
#if defined (TODO)
3056
    /* PowerPC 440 GP */
3057
    {
3058
        .name        = "440gp",
3059
        .pvr         = CPU_PPC_440GP,
3060
        .pvr_mask    = 0xFFFFFF00,
3061
        .insns_flags = PPC_INSNS_440,
3062
        .flags       = PPC_FLAGS_440,
3063
        .msr_mask    = 0x000000000006D630,
3064
    },
3065
#endif
3066
#if defined (TODO)
3067
    /* PowerPC 440 GX */
3068
    {
3069
        .name        = "440gx",
3070
        .pvr         = CPU_PPC_440GX,
3071
        .pvr_mask    = 0xFFFF0000,
3072
        .insns_flags = PPC_INSNS_405,
3073
        .flags       = PPC_FLAGS_440,
3074
        .msr_mask    = 0x000000000006D630,
3075
    },
3076
#endif
3077
#if defined (TODO)
3078
    /* PowerPC 440 GXc */
3079
    {
3080
        .name        = "440gxc",
3081
        .pvr         = CPU_PPC_440GXC,
3082
        .pvr_mask    = 0xFFFF0000,
3083
        .insns_flags = PPC_INSNS_405,
3084
        .flags       = PPC_FLAGS_440,
3085
        .msr_mask    = 0x000000000006D630,
3086
    },
3087
#endif
3088
#if defined (TODO)
3089
    /* PowerPC 440 GXf */
3090
    {
3091
        .name        = "440gxf",
3092
        .pvr         = CPU_PPC_440GXF,
3093
        .pvr_mask    = 0xFFFF0000,
3094
        .insns_flags = PPC_INSNS_405,
3095
        .flags       = PPC_FLAGS_440,
3096
        .msr_mask    = 0x000000000006D630,
3097
    },
3098
#endif
3099
#if defined (TODO)
3100
    /* PowerPC 440 SP */
3101
    {
3102
        .name        = "440sp",
3103
        .pvr         = CPU_PPC_440SP,
3104
        .pvr_mask    = 0xFFFF0000,
3105
        .insns_flags = PPC_INSNS_405,
3106
        .flags       = PPC_FLAGS_440,
3107
        .msr_mask    = 0x000000000006D630,
3108
    },
3109
#endif
3110
#if defined (TODO)
3111
    /* PowerPC 440 SP2 */
3112
    {
3113
        .name        = "440sp2",
3114
        .pvr         = CPU_PPC_440SP2,
3115
        .pvr_mask    = 0xFFFF0000,
3116
        .insns_flags = PPC_INSNS_405,
3117
        .flags       = PPC_FLAGS_440,
3118
        .msr_mask    = 0x000000000006D630,
3119
    },
3120
#endif
3121
#if defined (TODO)
3122
    /* PowerPC 440 SPE */
3123
    {
3124
        .name        = "440spe",
3125
        .pvr         = CPU_PPC_440SPE,
3126
        .pvr_mask    = 0xFFFF0000,
3127
        .insns_flags = PPC_INSNS_405,
3128
        .flags       = PPC_FLAGS_440,
3129
        .msr_mask    = 0x000000000006D630,
3130
    },
3131
#endif
3132
    /* Fake generic BookE PowerPC */
3133
    {
3134
        .name        = "BookE",
3135
        .pvr         = CPU_PPC_e500,
3136
        .pvr_mask    = 0xFFFFFFFF,
3137
        .insns_flags = PPC_INSNS_BOOKE,
3138
        .flags       = PPC_FLAGS_BOOKE,
3139
        .msr_mask    = 0x000000000006D630,
3140
    },
3141
    /* PowerPC 460 cores - TODO */
3142
    /* PowerPC MPC 5xx cores - TODO */
3143
    /* PowerPC MPC 8xx cores - TODO */
3144
    /* PowerPC MPC 8xxx cores - TODO */
3145
    /* e200 cores - TODO */
3146
    /* e500 cores - TODO */
3147
    /* e600 cores - TODO */
3148

    
3149
    /* 32 bits "classic" PowerPC */
3150
#if defined (TODO)
3151
    /* PowerPC 601 */
3152
    {
3153
        .name        = "601",
3154
        .pvr         = CPU_PPC_601,
3155
        .pvr_mask    = 0xFFFF0000,
3156
        .insns_flags = PPC_INSNS_601,
3157
        .flags       = PPC_FLAGS_601,
3158
        .msr_mask    = 0x000000000000FD70,
3159
    },
3160
#endif
3161
#if defined (TODO)
3162
    /* PowerPC 602 */
3163
    {
3164
        .name        = "602",
3165
        .pvr         = CPU_PPC_602,
3166
        .pvr_mask    = 0xFFFF0000,
3167
        .insns_flags = PPC_INSNS_602,
3168
        .flags       = PPC_FLAGS_602,
3169
        .msr_mask    = 0x0000000000C7FF73,
3170
    },
3171
#endif
3172
    /* PowerPC 603 */
3173
    {
3174
        .name        = "603",
3175
        .pvr         = CPU_PPC_603,
3176
        .pvr_mask    = 0xFFFFFFFF,
3177
        .insns_flags = PPC_INSNS_603,
3178
        .flags       = PPC_FLAGS_603,
3179
        .msr_mask    = 0x000000000007FF73,
3180
    },
3181
    /* PowerPC 603e */
3182
    {
3183
        .name        = "603e",
3184
        .pvr         = CPU_PPC_603E,
3185
        .pvr_mask    = 0xFFFFFFFF,
3186
        .insns_flags = PPC_INSNS_603,
3187
        .flags       = PPC_FLAGS_603,
3188
        .msr_mask    = 0x000000000007FF73,
3189
    },
3190
    {
3191
        .name        = "Stretch",
3192
        .pvr         = CPU_PPC_603E,
3193
        .pvr_mask    = 0xFFFFFFFF,
3194
        .insns_flags = PPC_INSNS_603,
3195
        .flags       = PPC_FLAGS_603,
3196
        .msr_mask    = 0x000000000007FF73,
3197
    },
3198
    /* PowerPC 603p */
3199
    {
3200
        .name        = "603p",
3201
        .pvr         = CPU_PPC_603P,
3202
        .pvr_mask    = 0xFFFFFFFF,
3203
        .insns_flags = PPC_INSNS_603,
3204
        .flags       = PPC_FLAGS_603,
3205
        .msr_mask    = 0x000000000007FF73,
3206
    },
3207
    /* PowerPC 603e7 */
3208
    {
3209
        .name        = "603e7",
3210
        .pvr         = CPU_PPC_603E7,
3211
        .pvr_mask    = 0xFFFFFFFF,
3212
        .insns_flags = PPC_INSNS_603,
3213
        .flags       = PPC_FLAGS_603,
3214
        .msr_mask    = 0x000000000007FF73,
3215
    },
3216
    /* PowerPC 603e7v */
3217
    {
3218
        .name        = "603e7v",
3219
        .pvr         = CPU_PPC_603E7v,
3220
        .pvr_mask    = 0xFFFFFFFF,
3221
        .insns_flags = PPC_INSNS_603,
3222
        .flags       = PPC_FLAGS_603,
3223
        .msr_mask    = 0x000000000007FF73,
3224
    },
3225
    /* PowerPC 603e7v2 */
3226
    {
3227
        .name        = "603e7v2",
3228
        .pvr         = CPU_PPC_603E7v2,
3229
        .pvr_mask    = 0xFFFFFFFF,
3230
        .insns_flags = PPC_INSNS_603,
3231
        .flags       = PPC_FLAGS_603,
3232
        .msr_mask    = 0x000000000007FF73,
3233
    },
3234
    /* PowerPC 603r */
3235
    {
3236
        .name        = "603r",
3237
        .pvr         = CPU_PPC_603R,
3238
        .pvr_mask    = 0xFFFFFFFF,
3239
        .insns_flags = PPC_INSNS_603,
3240
        .flags       = PPC_FLAGS_603,
3241
        .msr_mask    = 0x000000000007FF73,
3242
    },
3243
    {
3244
        .name        = "Goldeneye",
3245
        .pvr         = CPU_PPC_603R,
3246
        .pvr_mask    = 0xFFFFFFFF,
3247
        .insns_flags = PPC_INSNS_603,
3248
        .flags       = PPC_FLAGS_603,
3249
        .msr_mask    = 0x000000000007FF73,
3250
    },
3251
#if defined (TODO)
3252
    /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */
3253
    {
3254
        .name        = "G2",
3255
        .pvr         = CPU_PPC_G2,
3256
        .pvr_mask    = 0xFFFF0000,
3257
        .insns_flags = PPC_INSNS_G2,
3258
        .flags       = PPC_FLAGS_G2,
3259
        .msr_mask    = 0x000000000006FFF2,
3260
    },
3261
    {
3262
        .name        = "G2h4",
3263
        .pvr         = CPU_PPC_G2H4,
3264
        .pvr_mask    = 0xFFFF0000,
3265
        .insns_flags = PPC_INSNS_G2,
3266
        .flags       = PPC_FLAGS_G2,
3267
        .msr_mask    = 0x000000000006FFF2,
3268
    },
3269
    {
3270
        .name        = "G2gp",
3271
        .pvr         = CPU_PPC_G2gp,
3272
        .pvr_mask    = 0xFFFF0000,
3273
        .insns_flags = PPC_INSNS_G2,
3274
        .flags       = PPC_FLAGS_G2,
3275
        .msr_mask    = 0x000000000006FFF2,
3276
    },
3277
    {
3278
        .name        = "G2ls",
3279
        .pvr         = CPU_PPC_G2ls,
3280
        .pvr_mask    = 0xFFFF0000,
3281
        .insns_flags = PPC_INSNS_G2,
3282
        .flags       = PPC_FLAGS_G2,
3283
        .msr_mask    = 0x000000000006FFF2,
3284
    },
3285
    { /* Same as G2, with LE mode support */
3286
        .name        = "G2le",
3287
        .pvr         = CPU_PPC_G2LE,
3288
        .pvr_mask    = 0xFFFF0000,
3289
        .insns_flags = PPC_INSNS_G2,
3290
        .flags       = PPC_FLAGS_G2,
3291
        .msr_mask    = 0x000000000007FFF3,
3292
    },
3293
    {
3294
        .name        = "G2legp",
3295
        .pvr         = CPU_PPC_G2LEgp,
3296
        .pvr_mask    = 0xFFFF0000,
3297
        .insns_flags = PPC_INSNS_G2,
3298
        .flags       = PPC_FLAGS_G2,
3299
        .msr_mask    = 0x000000000007FFF3,
3300
    },
3301
    {
3302
        .name        = "G2lels",
3303
        .pvr         = CPU_PPC_G2LEls,
3304
        .pvr_mask    = 0xFFFF0000,
3305
        .insns_flags = PPC_INSNS_G2,
3306
        .flags       = PPC_FLAGS_G2,
3307
        .msr_mask    = 0x000000000007FFF3,
3308
    },
3309
#endif
3310
    /* PowerPC 604 */
3311
    {
3312
        .name        = "604",
3313
        .pvr         = CPU_PPC_604,
3314
        .pvr_mask    = 0xFFFFFFFF,
3315
        .insns_flags = PPC_INSNS_604,
3316
        .flags       = PPC_FLAGS_604,
3317
        .msr_mask    = 0x000000000005FF77,
3318
    },
3319
    /* PowerPC 604e */
3320
    {
3321
        .name        = "604e",
3322
        .pvr         = CPU_PPC_604E,
3323
        .pvr_mask    = 0xFFFFFFFF,
3324
        .insns_flags = PPC_INSNS_604,
3325
        .flags       = PPC_FLAGS_604,
3326
        .msr_mask    = 0x000000000005FF77,
3327
    },
3328
    /* PowerPC 604r */
3329
    {
3330
        .name        = "604r",
3331
        .pvr         = CPU_PPC_604R,
3332
        .pvr_mask    = 0xFFFFFFFF,
3333
        .insns_flags = PPC_INSNS_604,
3334
        .flags       = PPC_FLAGS_604,
3335
        .msr_mask    = 0x000000000005FF77,
3336
    },
3337
    /* generic G3 */
3338
    {
3339
        .name        = "G3",
3340
        .pvr         = CPU_PPC_74x,
3341
        .pvr_mask    = 0xFFFFFFFF,
3342
        .insns_flags = PPC_INSNS_7x0,
3343
        .flags       = PPC_FLAGS_7x0,
3344
        .msr_mask    = 0x000000000007FF77,
3345
    },
3346
    /* MPC740 (G3) */
3347
    {
3348
        .name        = "740",
3349
        .pvr         = CPU_PPC_74x,
3350
        .pvr_mask    = 0xFFFFFFFF,
3351
        .insns_flags = PPC_INSNS_7x0,
3352
        .flags       = PPC_FLAGS_7x0,
3353
        .msr_mask    = 0x000000000007FF77,
3354
    },
3355
    {
3356
        .name        = "Arthur",
3357
        .pvr         = CPU_PPC_74x,
3358
        .pvr_mask    = 0xFFFFFFFF,
3359
        .insns_flags = PPC_INSNS_7x0,
3360
        .flags       = PPC_FLAGS_7x0,
3361
        .msr_mask    = 0x000000000007FF77,
3362
    },
3363
#if defined (TODO)
3364
    /* MPC745 (G3) */
3365
    {
3366
        .name        = "745",
3367
        .pvr         = CPU_PPC_74x,
3368
        .pvr_mask    = 0xFFFFF000,
3369
        .insns_flags = PPC_INSNS_7x5,
3370
        .flags       = PPC_FLAGS_7x5,
3371
        .msr_mask    = 0x000000000007FF77,
3372
    },
3373
    {
3374
        .name        = "Goldfinger",
3375
        .pvr         = CPU_PPC_74x,
3376
        .pvr_mask    = 0xFFFFF000,
3377
        .insns_flags = PPC_INSNS_7x5,
3378
        .flags       = PPC_FLAGS_7x5,
3379
        .msr_mask    = 0x000000000007FF77,
3380
    },
3381
#endif
3382
    /* MPC750 (G3) */
3383
    {
3384
        .name        = "750",
3385
        .pvr         = CPU_PPC_74x,
3386
        .pvr_mask    = 0xFFFFFFFF,
3387
        .insns_flags = PPC_INSNS_7x0,
3388
        .flags       = PPC_FLAGS_7x0,
3389
        .msr_mask    = 0x000000000007FF77,
3390
    },
3391
#if defined (TODO)
3392
    /* MPC755 (G3) */
3393
    {
3394
        .name        = "755",
3395
        .pvr         = CPU_PPC_755,
3396
        .pvr_mask    = 0xFFFFF000,
3397
        .insns_flags = PPC_INSNS_7x5,
3398
        .flags       = PPC_FLAGS_7x5,
3399
        .msr_mask    = 0x000000000007FF77,
3400
    },
3401
#endif
3402
    /* MPC740P (G3) */
3403
    {
3404
        .name        = "740p",
3405
        .pvr         = CPU_PPC_74xP,
3406
        .pvr_mask    = 0xFFFFFFFF,
3407
        .insns_flags = PPC_INSNS_7x0,
3408
        .flags       = PPC_FLAGS_7x0,
3409
        .msr_mask    = 0x000000000007FF77,
3410
    },
3411
    {
3412
        .name        = "Conan/Doyle",
3413
        .pvr         = CPU_PPC_74xP,
3414
        .pvr_mask    = 0xFFFFFFFF,
3415
        .insns_flags = PPC_INSNS_7x0,
3416
        .flags       = PPC_FLAGS_7x0,
3417
        .msr_mask    = 0x000000000007FF77,
3418
    },
3419
#if defined (TODO)
3420
    /* MPC745P (G3) */
3421
    {
3422
        .name        = "745p",
3423
        .pvr         = CPU_PPC_74xP,
3424
        .pvr_mask    = 0xFFFFF000,
3425
        .insns_flags = PPC_INSNS_7x5,
3426
        .flags       = PPC_FLAGS_7x5,
3427
        .msr_mask    = 0x000000000007FF77,
3428
    },
3429
#endif
3430
    /* MPC750P (G3) */
3431
    {
3432
        .name        = "750p",
3433
        .pvr         = CPU_PPC_74xP,
3434
        .pvr_mask    = 0xFFFFFFFF,
3435
        .insns_flags = PPC_INSNS_7x0,
3436
        .flags       = PPC_FLAGS_7x0,
3437
        .msr_mask    = 0x000000000007FF77,
3438
    },
3439
#if defined (TODO)
3440
    /* MPC755P (G3) */
3441
    {
3442
        .name        = "755p",
3443
        .pvr         = CPU_PPC_74xP,
3444
        .pvr_mask    = 0xFFFFF000,
3445
        .insns_flags = PPC_INSNS_7x5,
3446
        .flags       = PPC_FLAGS_7x5,
3447
        .msr_mask    = 0x000000000007FF77,
3448
    },
3449
#endif
3450
    /* IBM 750CXe (G3 embedded) */
3451
    {
3452
        .name        = "750cxe",
3453
        .pvr         = CPU_PPC_750CXE,
3454
        .pvr_mask    = 0xFFFFFFFF,
3455
        .insns_flags = PPC_INSNS_7x0,
3456
        .flags       = PPC_FLAGS_7x0,
3457
        .msr_mask    = 0x000000000007FF77,
3458
    },
3459
    /* IBM 750FX (G3 embedded) */
3460
    {
3461
        .name        = "750fx",
3462
        .pvr         = CPU_PPC_750FX,
3463
        .pvr_mask    = 0xFFFFFFFF,
3464
        .insns_flags = PPC_INSNS_7x0,
3465
        .flags       = PPC_FLAGS_7x0,
3466
        .msr_mask    = 0x000000000007FF77,
3467
    },
3468
    /* IBM 750GX (G3 embedded) */
3469
    {
3470
        .name        = "750gx",
3471
        .pvr         = CPU_PPC_750GX,
3472
        .pvr_mask    = 0xFFFFFFFF,
3473
        .insns_flags = PPC_INSNS_7x0,
3474
        .flags       = PPC_FLAGS_7x0,
3475
        .msr_mask    = 0x000000000007FF77,
3476
    },
3477
#if defined (TODO)
3478
    /* generic G4 */
3479
    {
3480
        .name        = "G4",
3481
        .pvr         = CPU_PPC_7400,
3482
        .pvr_mask    = 0xFFFF0000,
3483
        .insns_flags = PPC_INSNS_74xx,
3484
        .flags       = PPC_FLAGS_74xx,
3485
        .msr_mask    = 0x000000000205FF77,
3486
    },
3487
#endif
3488
#if defined (TODO)
3489
    /* PowerPC 7400 (G4) */
3490
    {
3491
        .name        = "7400",
3492
        .pvr         = CPU_PPC_7400,
3493
        .pvr_mask    = 0xFFFF0000,
3494
        .insns_flags = PPC_INSNS_74xx,
3495
        .flags       = PPC_FLAGS_74xx,
3496
        .msr_mask    = 0x000000000205FF77,
3497
    },
3498
    {
3499
        .name        = "Max",
3500
        .pvr         = CPU_PPC_7400,
3501
        .pvr_mask    = 0xFFFF0000,
3502
        .insns_flags = PPC_INSNS_74xx,
3503
        .flags       = PPC_FLAGS_74xx,
3504
        .msr_mask    = 0x000000000205FF77,
3505
    },
3506
#endif
3507
#if defined (TODO)
3508
    /* PowerPC 7410 (G4) */
3509
    {
3510
        .name        = "7410",
3511
        .pvr         = CPU_PPC_7410,
3512
        .pvr_mask    = 0xFFFF0000,
3513
        .insns_flags = PPC_INSNS_74xx,
3514
        .flags       = PPC_FLAGS_74xx,
3515
        .msr_mask    = 0x000000000205FF77,
3516
    },
3517
    {
3518
        .name        = "Nitro",
3519
        .pvr         = CPU_PPC_7410,
3520
        .pvr_mask    = 0xFFFF0000,
3521
        .insns_flags = PPC_INSNS_74xx,
3522
        .flags       = PPC_FLAGS_74xx,
3523
        .msr_mask    = 0x000000000205FF77,
3524
    },
3525
#endif
3526
    /* XXX: 7441 */
3527
    /* XXX: 7445 */
3528
    /* XXX: 7447 */
3529
    /* XXX: 7447A */
3530
#if defined (TODO)
3531
    /* PowerPC 7450 (G4) */
3532
    {
3533
        .name        = "7450",
3534
        .pvr         = CPU_PPC_7450,
3535
        .pvr_mask    = 0xFFFF0000,
3536
        .insns_flags = PPC_INSNS_74xx,
3537
        .flags       = PPC_FLAGS_74xx,
3538
        .msr_mask    = 0x000000000205FF77,
3539
    },
3540
    {
3541
        .name        = "Vger",
3542
        .pvr         = CPU_PPC_7450,
3543
        .pvr_mask    = 0xFFFF0000,
3544
        .insns_flags = PPC_INSNS_74xx,
3545
        .flags       = PPC_FLAGS_74xx,
3546
        .msr_mask    = 0x000000000205FF77,
3547
    },
3548
#endif
3549
    /* XXX: 7451 */
3550
#if defined (TODO)
3551
    /* PowerPC 7455 (G4) */
3552
    {
3553
        .name        = "7455",
3554
        .pvr         = CPU_PPC_7455,
3555
        .pvr_mask    = 0xFFFF0000,
3556
        .insns_flags = PPC_INSNS_74xx,
3557
        .flags       = PPC_FLAGS_74xx,
3558
        .msr_mask    = 0x000000000205FF77,
3559
    },
3560
    {
3561
        .name        = "Apollo 6",
3562
        .pvr         = CPU_PPC_7455,
3563
        .pvr_mask    = 0xFFFF0000,
3564
        .insns_flags = PPC_INSNS_74xx,
3565
        .flags       = PPC_FLAGS_74xx,
3566
        .msr_mask    = 0x000000000205FF77,
3567
    },
3568
#endif
3569
#if defined (TODO)
3570
    /* PowerPC 7457 (G4) */
3571
    {
3572
        .name        = "7457",
3573
        .pvr         = CPU_PPC_7457,
3574
        .pvr_mask    = 0xFFFF0000,
3575
        .insns_flags = PPC_INSNS_74xx,
3576
        .flags       = PPC_FLAGS_74xx,
3577
        .msr_mask    = 0x000000000205FF77,
3578
    },
3579
    {
3580
        .name        = "Apollo 7",
3581
        .pvr         = CPU_PPC_7457,
3582
        .pvr_mask    = 0xFFFF0000,
3583
        .insns_flags = PPC_INSNS_74xx,
3584
        .flags       = PPC_FLAGS_74xx,
3585
        .msr_mask    = 0x000000000205FF77,
3586
    },
3587
#endif
3588
#if defined (TODO)
3589
    /* PowerPC 7457A (G4) */
3590
    {
3591
        .name        = "7457A",
3592
        .pvr         = CPU_PPC_7457A,
3593
        .pvr_mask    = 0xFFFF0000,
3594
        .insns_flags = PPC_INSNS_74xx,
3595
        .flags       = PPC_FLAGS_74xx,
3596
        .msr_mask    = 0x000000000205FF77,
3597
    },
3598
    {
3599
        .name        = "Apollo 7 PM",
3600
        .pvr         = CPU_PPC_7457A,
3601
        .pvr_mask    = 0xFFFF0000,
3602
        .insns_flags = PPC_INSNS_74xx,
3603
        .flags       = PPC_FLAGS_74xx,
3604
        .msr_mask    = 0x000000000205FF77,
3605
    },
3606
#endif
3607
    /* 64 bits PowerPC */
3608
#if defined (TARGET_PPC64)
3609
#if defined (TODO)
3610
    /* PowerPC 620 */
3611
    {
3612
        .name        = "620",
3613
        .pvr         = CPU_PPC_620,
3614
        .pvr_mask    = 0xFFFF0000,
3615
        .insns_flags = PPC_INSNS_620,
3616
        .flags       = PPC_FLAGS_620,
3617
        .msr_mask    = 0x800000000005FF73,
3618
    },
3619
#endif
3620
#if defined (TODO)
3621
    /* PowerPC 630 (POWER3) */
3622
    {
3623
        .name        = "630",
3624
        .pvr         = CPU_PPC_630,
3625
        .pvr_mask    = 0xFFFF0000,
3626
        .insns_flags = PPC_INSNS_630,
3627
        .flags       = PPC_FLAGS_630,
3628
        .msr_mask    = xxx,
3629
    }
3630
    {
3631
        .name        = "POWER3",
3632
        .pvr         = CPU_PPC_630,
3633
        .pvr_mask    = 0xFFFF0000,
3634
        .insns_flags = PPC_INSNS_630,
3635
        .flags       = PPC_FLAGS_630,
3636
        .msr_mask    = xxx,
3637
    }
3638
#endif
3639
#if defined (TODO)
3640
    /* PowerPC 631 (Power 3+)*/
3641
    {
3642
        .name        = "631",
3643
        .pvr         = CPU_PPC_631,
3644
        .pvr_mask    = 0xFFFF0000,
3645
        .insns_flags = PPC_INSNS_631,
3646
        .flags       = PPC_FLAGS_631,
3647
        .msr_mask    = xxx,
3648
    },
3649
    {
3650
        .name        = "POWER3+",
3651
        .pvr         = CPU_PPC_631,
3652
        .pvr_mask    = 0xFFFF0000,
3653
        .insns_flags = PPC_INSNS_631,
3654
        .flags       = PPC_FLAGS_631,
3655
        .msr_mask    = xxx,
3656
    },
3657
#endif
3658
#if defined (TODO)
3659
    /* POWER4 */
3660
    {
3661
        .name        = "POWER4",
3662
        .pvr         = CPU_PPC_POWER4,
3663
        .pvr_mask    = 0xFFFF0000,
3664
        .insns_flags = PPC_INSNS_POWER4,
3665
        .flags       = PPC_FLAGS_POWER4,
3666
        .msr_mask    = xxx,
3667
    },
3668
#endif
3669
#if defined (TODO)
3670
    /* POWER4p */
3671
    {
3672
        .name        = "POWER4+",
3673
        .pvr         = CPU_PPC_POWER4P,
3674
        .pvr_mask    = 0xFFFF0000,
3675
        .insns_flags = PPC_INSNS_POWER4,
3676
        .flags       = PPC_FLAGS_POWER4,
3677
        .msr_mask    = xxx,
3678
    },
3679
#endif
3680
#if defined (TODO)
3681
    /* POWER5 */
3682
    {
3683
        .name        = "POWER5",
3684
        .pvr         = CPU_PPC_POWER5,
3685
        .pvr_mask    = 0xFFFF0000,
3686
        .insns_flags = PPC_INSNS_POWER5,
3687
        .flags       = PPC_FLAGS_POWER5,
3688
        .msr_mask    = xxx,
3689
    },
3690
#endif
3691
#if defined (TODO)
3692
    /* POWER5+ */
3693
    {
3694
        .name        = "POWER5+",
3695
        .pvr         = CPU_PPC_POWER5P,
3696
        .pvr_mask    = 0xFFFF0000,
3697
        .insns_flags = PPC_INSNS_POWER5,
3698
        .flags       = PPC_FLAGS_POWER5,
3699
        .msr_mask    = xxx,
3700
    },
3701
#endif
3702
#if defined (TODO) || 1
3703
    /* PowerPC 970 */
3704
    {
3705
        .name        = "970",
3706
        .pvr         = CPU_PPC_970,
3707
        .pvr_mask    = 0xFFFF0000,
3708
        .insns_flags = PPC_INSNS_970,
3709
        .flags       = PPC_FLAGS_970,
3710
        .msr_mask    = 0x900000000204FF36,
3711
    },
3712
#endif
3713
#if defined (TODO)
3714
    /* PowerPC 970FX (G5) */
3715
    {
3716
        .name        = "970fx",
3717
        .pvr         = CPU_PPC_970FX,
3718
        .pvr_mask    = 0xFFFF0000,
3719
        .insns_flags = PPC_INSNS_970FX,
3720
        .flags       = PPC_FLAGS_970FX,
3721
        .msr_mask    = 0x800000000204FF36,
3722
    },
3723
#endif
3724
#if defined (TODO)
3725
    /* RS64 (Apache/A35) */
3726
    /* This one seems to support the whole POWER2 instruction set
3727
     * and the PowerPC 64 one.
3728
     */
3729
    {
3730
        .name        = "RS64",
3731
        .pvr         = CPU_PPC_RS64,
3732
        .pvr_mask    = 0xFFFF0000,
3733
        .insns_flags = PPC_INSNS_RS64,
3734
        .flags       = PPC_FLAGS_RS64,
3735
        .msr_mask    = xxx,
3736
    },
3737
    {
3738
        .name        = "Apache",
3739
        .pvr         = CPU_PPC_RS64,
3740
        .pvr_mask    = 0xFFFF0000,
3741
        .insns_flags = PPC_INSNS_RS64,
3742
        .flags       = PPC_FLAGS_RS64,
3743
        .msr_mask    = xxx,
3744
    },
3745
    {
3746
        .name        = "A35",
3747
        .pvr         = CPU_PPC_RS64,
3748
        .pvr_mask    = 0xFFFF0000,
3749
        .insns_flags = PPC_INSNS_RS64,
3750
        .flags       = PPC_FLAGS_RS64,
3751
        .msr_mask    = xxx,
3752
    },
3753
#endif
3754
#if defined (TODO)
3755
    /* RS64-II (NorthStar/A50) */
3756
    {
3757
        .name        = "RS64-II",
3758
        .pvr         = CPU_PPC_RS64II,
3759
        .pvr_mask    = 0xFFFF0000,
3760
        .insns_flags = PPC_INSNS_RS64,
3761
        .flags       = PPC_FLAGS_RS64,
3762
        .msr_mask    = xxx,
3763
    },
3764
    {
3765
        .name        = "NortStar",
3766
        .pvr         = CPU_PPC_RS64II,
3767
        .pvr_mask    = 0xFFFF0000,
3768
        .insns_flags = PPC_INSNS_RS64,
3769
        .flags       = PPC_FLAGS_RS64,
3770
        .msr_mask    = xxx,
3771
    },
3772
    {
3773
        .name        = "A50",
3774
        .pvr         = CPU_PPC_RS64II,
3775
        .pvr_mask    = 0xFFFF0000,
3776
        .insns_flags = PPC_INSNS_RS64,
3777
        .flags       = PPC_FLAGS_RS64,
3778
        .msr_mask    = xxx,
3779
    },
3780
#endif
3781
#if defined (TODO)
3782
    /* RS64-III (Pulsar) */
3783
    {
3784
        .name        = "RS64-III",
3785
        .pvr         = CPU_PPC_RS64III,
3786
        .pvr_mask    = 0xFFFF0000,
3787
        .insns_flags = PPC_INSNS_RS64,
3788
        .flags       = PPC_FLAGS_RS64,
3789
        .msr_mask    = xxx,
3790
    },
3791
    {
3792
        .name        = "Pulsar",
3793
        .pvr         = CPU_PPC_RS64III,
3794
        .pvr_mask    = 0xFFFF0000,
3795
        .insns_flags = PPC_INSNS_RS64,
3796
        .flags       = PPC_FLAGS_RS64,
3797
        .msr_mask    = xxx,
3798
    },
3799
#endif
3800
#if defined (TODO)
3801
    /* RS64-IV (IceStar/IStar/SStar) */
3802
    {
3803
        .name        = "RS64-IV",
3804
        .pvr         = CPU_PPC_RS64IV,
3805
        .pvr_mask    = 0xFFFF0000,
3806
        .insns_flags = PPC_INSNS_RS64,
3807
        .flags       = PPC_FLAGS_RS64,
3808
        .msr_mask    = xxx,
3809
    },
3810
    {
3811
        .name        = "IceStar",
3812
        .pvr         = CPU_PPC_RS64IV,
3813
        .pvr_mask    = 0xFFFF0000,
3814
        .insns_flags = PPC_INSNS_RS64,
3815
        .flags       = PPC_FLAGS_RS64,
3816
        .msr_mask    = xxx,
3817
    },
3818
    {
3819
        .name        = "IStar",
3820
        .pvr         = CPU_PPC_RS64IV,
3821
        .pvr_mask    = 0xFFFF0000,
3822
        .insns_flags = PPC_INSNS_RS64,
3823
        .flags       = PPC_FLAGS_RS64,
3824
        .msr_mask    = xxx,
3825
    },
3826
    {
3827
        .name        = "SStar",
3828
        .pvr         = CPU_PPC_RS64IV,
3829
        .pvr_mask    = 0xFFFF0000,
3830
        .insns_flags = PPC_INSNS_RS64,
3831
        .flags       = PPC_FLAGS_RS64,
3832
        .msr_mask    = xxx,
3833
    },
3834
#endif
3835
    /* POWER */
3836
#if defined (TODO)
3837
    /* Original POWER */
3838
    {
3839
        .name        = "POWER",
3840
        .pvr         = CPU_POWER,
3841
        .pvr_mask    = 0xFFFF0000,
3842
        .insns_flags = PPC_INSNS_POWER,
3843
        .flags       = PPC_FLAGS_POWER,
3844
        .msr_mask    = xxx,
3845
    },
3846
#endif
3847
#endif /* defined (TARGET_PPC64) */
3848
#if defined (TODO)
3849
    /* POWER2 */
3850
    {
3851
        .name        = "POWER2",
3852
        .pvr         = CPU_POWER2,
3853
        .pvr_mask    = 0xFFFF0000,
3854
        .insns_flags = PPC_INSNS_POWER,
3855
        .flags       = PPC_FLAGS_POWER,
3856
        .msr_mask    = xxx,
3857
    },
3858
#endif
3859
    /* Generic PowerPCs */
3860
#if defined (TODO) || 1
3861
    {
3862
        .name        = "ppc64",
3863
        .pvr         = CPU_PPC_970,
3864
        .pvr_mask    = 0xFFFF0000,
3865
        .insns_flags = PPC_INSNS_PPC64,
3866
        .flags       = PPC_FLAGS_PPC64,
3867
        .msr_mask    = 0xA00000000204FF36,
3868
    },
3869
#endif
3870
    {
3871
        .name        = "ppc32",
3872
        .pvr         = CPU_PPC_604,
3873
        .pvr_mask    = 0xFFFFFFFF,
3874
        .insns_flags = PPC_INSNS_PPC32,
3875
        .flags       = PPC_FLAGS_PPC32,
3876
        .msr_mask    = 0x000000000005FF77,
3877
    },
3878
    /* Fallback */
3879
    {
3880
        .name        = "ppc",
3881
        .pvr         = CPU_PPC_604,
3882
        .pvr_mask    = 0xFFFFFFFF,
3883
        .insns_flags = PPC_INSNS_PPC32,
3884
        .flags       = PPC_FLAGS_PPC32,
3885
        .msr_mask    = 0x000000000005FF77,
3886
    },
3887
};
3888

    
3889
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
3890
{
3891
    int i, ret;
3892

    
3893
    ret = -1;
3894
    *def = NULL;
3895
    for (i = 0; strcmp(ppc_defs[i].name, "ppc") != 0; i++) {
3896
        if (strcasecmp(name, ppc_defs[i].name) == 0) {
3897
            *def = &ppc_defs[i];
3898
            ret = 0;
3899
            break;
3900
        }
3901
    }
3902

    
3903
    return ret;
3904
}
3905

    
3906
int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
3907
{
3908
    int i, ret;
3909

    
3910
    ret = -1;
3911
    *def = NULL;
3912
    for (i = 0; ppc_defs[i].name != NULL; i++) {
3913
        if ((pvr & ppc_defs[i].pvr_mask) ==
3914
            (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
3915
            *def = &ppc_defs[i];
3916
            ret = 0;
3917
            break;
3918
        }
3919
    }
3920

    
3921
    return ret;
3922
}
3923

    
3924
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3925
{
3926
    int i;
3927

    
3928
    for (i = 0; ; i++) {
3929
        (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n",
3930
                       ppc_defs[i].name,
3931
                       ppc_defs[i].pvr, ppc_defs[i].pvr_mask);
3932
        if (strcmp(ppc_defs[i].name, "ppc") == 0)
3933
            break;
3934
    }
3935
}