Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ 1b9eb036

History | View | Annotate | Download (121.4 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

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

    
38
/* Generic callbacks:
39
 * do nothing but store/retrieve spr value
40
 */
41
static void spr_read_generic (void *opaque, int sprn)
42
{
43
    gen_op_load_spr(sprn);
44
}
45

    
46
static void spr_write_generic (void *opaque, int sprn)
47
{
48
    gen_op_store_spr(sprn);
49
}
50

    
51
/* SPR common to all PowerPC */
52
/* XER */
53
static void spr_read_xer (void *opaque, int sprn)
54
{
55
    gen_op_load_xer();
56
}
57

    
58
static void spr_write_xer (void *opaque, int sprn)
59
{
60
    gen_op_store_xer();
61
}
62

    
63
/* LR */
64
static void spr_read_lr (void *opaque, int sprn)
65
{
66
    gen_op_load_lr();
67
}
68

    
69
static void spr_write_lr (void *opaque, int sprn)
70
{
71
    gen_op_store_lr();
72
}
73

    
74
/* CTR */
75
static void spr_read_ctr (void *opaque, int sprn)
76
{
77
    gen_op_load_ctr();
78
}
79

    
80
static void spr_write_ctr (void *opaque, int sprn)
81
{
82
    gen_op_store_ctr();
83
}
84

    
85
/* User read access to SPR */
86
/* USPRx */
87
/* UMMCRx */
88
/* UPMCx */
89
/* USIA */
90
/* UDECR */
91
static void spr_read_ureg (void *opaque, int sprn)
92
{
93
    gen_op_load_spr(sprn + 0x10);
94
}
95

    
96
/* SPR common to all non-embedded PowerPC */
97
/* DECR */
98
#if !defined(CONFIG_USER_ONLY)
99
static void spr_read_decr (void *opaque, int sprn)
100
{
101
    gen_op_load_decr();
102
}
103

    
104
static void spr_write_decr (void *opaque, int sprn)
105
{
106
    gen_op_store_decr();
107
}
108
#endif
109

    
110
/* SPR common to all non-embedded PowerPC, except 601 */
111
/* Time base */
112
static void spr_read_tbl (void *opaque, int sprn)
113
{
114
    gen_op_load_tbl();
115
}
116

    
117
static void spr_read_tbu (void *opaque, int sprn)
118
{
119
    gen_op_load_tbu();
120
}
121

    
122
#if !defined(CONFIG_USER_ONLY)
123
static void spr_write_tbl (void *opaque, int sprn)
124
{
125
    gen_op_store_tbl();
126
}
127

    
128
static void spr_write_tbu (void *opaque, int sprn)
129
{
130
    gen_op_store_tbu();
131
}
132
#endif
133

    
134
#if !defined(CONFIG_USER_ONLY)
135
/* IBAT0U...IBAT0U */
136
/* IBAT0L...IBAT7L */
137
static void spr_read_ibat (void *opaque, int sprn)
138
{
139
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
140
}
141

    
142
static void spr_read_ibat_h (void *opaque, int sprn)
143
{
144
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);
145
}
146

    
147
static void spr_write_ibatu (void *opaque, int sprn)
148
{
149
    DisasContext *ctx = opaque;
150

    
151
    gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);
152
    RET_STOP(ctx);
153
}
154

    
155
static void spr_write_ibatu_h (void *opaque, int sprn)
156
{
157
    DisasContext *ctx = opaque;
158

    
159
    gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);
160
    RET_STOP(ctx);
161
}
162

    
163
static void spr_write_ibatl (void *opaque, int sprn)
164
{
165
    DisasContext *ctx = opaque;
166

    
167
    gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);
168
    RET_STOP(ctx);
169
}
170

    
171
static void spr_write_ibatl_h (void *opaque, int sprn)
172
{
173
    DisasContext *ctx = opaque;
174

    
175
    gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);
176
    RET_STOP(ctx);
177
}
178

    
179
/* DBAT0U...DBAT7U */
180
/* DBAT0L...DBAT7L */
181
static void spr_read_dbat (void *opaque, int sprn)
182
{
183
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);
184
}
185

    
186
static void spr_read_dbat_h (void *opaque, int sprn)
187
{
188
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);
189
}
190

    
191
static void spr_write_dbatu (void *opaque, int sprn)
192
{
193
    DisasContext *ctx = opaque;
194

    
195
    gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);
196
    RET_STOP(ctx);
197
}
198

    
199
static void spr_write_dbatu_h (void *opaque, int sprn)
200
{
201
    DisasContext *ctx = opaque;
202

    
203
    gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);
204
    RET_STOP(ctx);
205
}
206

    
207
static void spr_write_dbatl (void *opaque, int sprn)
208
{
209
    DisasContext *ctx = opaque;
210

    
211
    gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);
212
    RET_STOP(ctx);
213
}
214

    
215
static void spr_write_dbatl_h (void *opaque, int sprn)
216
{
217
    DisasContext *ctx = opaque;
218

    
219
    gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);
220
    RET_STOP(ctx);
221
}
222

    
223
/* SDR1 */
224
static void spr_read_sdr1 (void *opaque, int sprn)
225
{
226
    gen_op_load_sdr1();
227
}
228

    
229
static void spr_write_sdr1 (void *opaque, int sprn)
230
{
231
    DisasContext *ctx = opaque;
232

    
233
    gen_op_store_sdr1();
234
    RET_STOP(ctx);
235
}
236

    
237
/* 64 bits PowerPC specific SPRs */
238
/* ASR */
239
#if defined(TARGET_PPC64)
240
static void spr_read_asr (void *opaque, int sprn)
241
{
242
    gen_op_load_asr();
243
}
244

    
245
static void spr_write_asr (void *opaque, int sprn)
246
{
247
    DisasContext *ctx = opaque;
248

    
249
    gen_op_store_asr();
250
    RET_STOP(ctx);
251
}
252
#endif
253
#endif /* !defined(CONFIG_USER_ONLY) */
254

    
255
/* PowerPC 601 specific registers */
256
/* RTC */
257
static void spr_read_601_rtcl (void *opaque, int sprn)
258
{
259
    gen_op_load_601_rtcl();
260
}
261

    
262
static void spr_read_601_rtcu (void *opaque, int sprn)
263
{
264
    gen_op_load_601_rtcu();
265
}
266

    
267
#if !defined(CONFIG_USER_ONLY)
268
static void spr_write_601_rtcu (void *opaque, int sprn)
269
{
270
    gen_op_store_601_rtcu();
271
}
272

    
273
static void spr_write_601_rtcl (void *opaque, int sprn)
274
{
275
    gen_op_store_601_rtcl();
276
}
277
#endif
278

    
279
/* Unified bats */
280
#if !defined(CONFIG_USER_ONLY)
281
static void spr_read_601_ubat (void *opaque, int sprn)
282
{
283
    gen_op_load_601_bat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
284
}
285

    
286
static void spr_write_601_ubatu (void *opaque, int sprn)
287
{
288
    DisasContext *ctx = opaque;
289

    
290
    gen_op_store_601_batu((sprn - SPR_IBAT0U) / 2);
291
    RET_STOP(ctx);
292
}
293

    
294
static void spr_write_601_ubatl (void *opaque, int sprn)
295
{
296
    DisasContext *ctx = opaque;
297

    
298
    gen_op_store_601_batl((sprn - SPR_IBAT0L) / 2);
299
    RET_STOP(ctx);
300
}
301
#endif
302

    
303
/* PowerPC 40x specific registers */
304
#if !defined(CONFIG_USER_ONLY)
305
static void spr_read_40x_pit (void *opaque, int sprn)
306
{
307
    gen_op_load_40x_pit();
308
}
309

    
310
static void spr_write_40x_pit (void *opaque, int sprn)
311
{
312
    gen_op_store_40x_pit();
313
}
314

    
315
static void spr_write_booke_tcr (void *opaque, int sprn)
316
{
317
    gen_op_store_booke_tcr();
318
}
319

    
320
static void spr_write_booke_tsr (void *opaque, int sprn)
321
{
322
    gen_op_store_booke_tsr();
323
}
324
#endif
325

    
326
/* PowerPC 403 specific registers */
327
/* PBL1 / PBU1 / PBL2 / PBU2 */
328
#if !defined(CONFIG_USER_ONLY)
329
static void spr_read_403_pbr (void *opaque, int sprn)
330
{
331
    gen_op_load_403_pb(sprn - SPR_403_PBL1);
332
}
333

    
334
static void spr_write_403_pbr (void *opaque, int sprn)
335
{
336
    DisasContext *ctx = opaque;
337

    
338
    gen_op_store_403_pb(sprn - SPR_403_PBL1);
339
    RET_STOP(ctx);
340
}
341

    
342
static void spr_write_pir (void *opaque, int sprn)
343
{
344
    gen_op_store_pir();
345
}
346
#endif
347

    
348
#if defined(CONFIG_USER_ONLY)
349
#define spr_register(env, num, name, uea_read, uea_write,                     \
350
                     oea_read, oea_write, initial_value)                      \
351
do {                                                                          \
352
     _spr_register(env, num, name, uea_read, uea_write, initial_value);       \
353
} while (0)
354
static inline void _spr_register (CPUPPCState *env, int num,
355
                                  const unsigned char *name,
356
                                  void (*uea_read)(void *opaque, int sprn),
357
                                  void (*uea_write)(void *opaque, int sprn),
358
                                  target_ulong initial_value)
359
#else
360
static inline void spr_register (CPUPPCState *env, int num,
361
                                 const unsigned char *name,
362
                                 void (*uea_read)(void *opaque, int sprn),
363
                                 void (*uea_write)(void *opaque, int sprn),
364
                                 void (*oea_read)(void *opaque, int sprn),
365
                                 void (*oea_write)(void *opaque, int sprn),
366
                                 target_ulong initial_value)
367
#endif
368
{
369
    ppc_spr_t *spr;
370

    
371
    spr = &env->spr_cb[num];
372
    if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
373
#if !defined(CONFIG_USER_ONLY)
374
        spr->oea_read != NULL || spr->oea_write != NULL ||
375
#endif
376
        spr->uea_read != NULL || spr->uea_write != NULL) {
377
        printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
378
        exit(1);
379
    }
380
#if defined(PPC_DEBUG_SPR)
381
    printf("*** register spr %d (%03x) %s val " ADDRX "\n", num, num, name,
382
           initial_value);
383
#endif
384
    spr->name = name;
385
    spr->uea_read = uea_read;
386
    spr->uea_write = uea_write;
387
#if !defined(CONFIG_USER_ONLY)
388
    spr->oea_read = oea_read;
389
    spr->oea_write = oea_write;
390
#endif
391
    env->spr[num] = initial_value;
392
}
393

    
394
/* Generic PowerPC SPRs */
395
static void gen_spr_generic (CPUPPCState *env)
396
{
397
    /* Integer processing */
398
    spr_register(env, SPR_XER, "XER",
399
                 &spr_read_xer, &spr_write_xer,
400
                 &spr_read_xer, &spr_write_xer,
401
                 0x00000000);
402
    /* Branch contol */
403
    spr_register(env, SPR_LR, "LR",
404
                 &spr_read_lr, &spr_write_lr,
405
                 &spr_read_lr, &spr_write_lr,
406
                 0x00000000);
407
    spr_register(env, SPR_CTR, "CTR",
408
                 &spr_read_ctr, &spr_write_ctr,
409
                 &spr_read_ctr, &spr_write_ctr,
410
                 0x00000000);
411
    /* Interrupt processing */
412
    spr_register(env, SPR_SRR0, "SRR0",
413
                 SPR_NOACCESS, SPR_NOACCESS,
414
                 &spr_read_generic, &spr_write_generic,
415
                 0x00000000);
416
    spr_register(env, SPR_SRR1, "SRR1",
417
                 SPR_NOACCESS, SPR_NOACCESS,
418
                 &spr_read_generic, &spr_write_generic,
419
                 0x00000000);
420
    /* Processor control */
421
    spr_register(env, SPR_SPRG0, "SPRG0",
422
                 SPR_NOACCESS, SPR_NOACCESS,
423
                 &spr_read_generic, &spr_write_generic,
424
                 0x00000000);
425
    spr_register(env, SPR_SPRG1, "SPRG1",
426
                 SPR_NOACCESS, SPR_NOACCESS,
427
                 &spr_read_generic, &spr_write_generic,
428
                 0x00000000);
429
    spr_register(env, SPR_SPRG2, "SPRG2",
430
                 SPR_NOACCESS, SPR_NOACCESS,
431
                 &spr_read_generic, &spr_write_generic,
432
                 0x00000000);
433
    spr_register(env, SPR_SPRG3, "SPRG3",
434
                 SPR_NOACCESS, SPR_NOACCESS,
435
                 &spr_read_generic, &spr_write_generic,
436
                 0x00000000);
437
}
438

    
439
/* SPR common to all non-embedded PowerPC, including 601 */
440
static void gen_spr_ne_601 (CPUPPCState *env)
441
{
442
    /* Exception processing */
443
    spr_register(env, SPR_DSISR, "DSISR",
444
                 SPR_NOACCESS, SPR_NOACCESS,
445
                 &spr_read_generic, &spr_write_generic,
446
                 0x00000000);
447
    spr_register(env, SPR_DAR, "DAR",
448
                 SPR_NOACCESS, SPR_NOACCESS,
449
                 &spr_read_generic, &spr_write_generic,
450
                 0x00000000);
451
    /* Timer */
452
    spr_register(env, SPR_DECR, "DECR",
453
                 SPR_NOACCESS, SPR_NOACCESS,
454
                 &spr_read_decr, &spr_write_decr,
455
                 0x00000000);
456
    /* Memory management */
457
    spr_register(env, SPR_SDR1, "SDR1",
458
                 SPR_NOACCESS, SPR_NOACCESS,
459
                 &spr_read_sdr1, &spr_write_sdr1,
460
                 0x00000000);
461
}
462

    
463
/* BATs 0-3 */
464
static void gen_low_BATs (CPUPPCState *env)
465
{
466
    spr_register(env, SPR_IBAT0U, "IBAT0U",
467
                 SPR_NOACCESS, SPR_NOACCESS,
468
                 &spr_read_ibat, &spr_write_ibatu,
469
                 0x00000000);
470
    spr_register(env, SPR_IBAT0L, "IBAT0L",
471
                 SPR_NOACCESS, SPR_NOACCESS,
472
                 &spr_read_ibat, &spr_write_ibatl,
473
                 0x00000000);
474
    spr_register(env, SPR_IBAT1U, "IBAT1U",
475
                 SPR_NOACCESS, SPR_NOACCESS,
476
                 &spr_read_ibat, &spr_write_ibatu,
477
                 0x00000000);
478
    spr_register(env, SPR_IBAT1L, "IBAT1L",
479
                 SPR_NOACCESS, SPR_NOACCESS,
480
                 &spr_read_ibat, &spr_write_ibatl,
481
                 0x00000000);
482
    spr_register(env, SPR_IBAT2U, "IBAT2U",
483
                 SPR_NOACCESS, SPR_NOACCESS,
484
                 &spr_read_ibat, &spr_write_ibatu,
485
                 0x00000000);
486
    spr_register(env, SPR_IBAT2L, "IBAT2L",
487
                 SPR_NOACCESS, SPR_NOACCESS,
488
                 &spr_read_ibat, &spr_write_ibatl,
489
                 0x00000000);
490
    spr_register(env, SPR_IBAT3U, "IBAT3U",
491
                 SPR_NOACCESS, SPR_NOACCESS,
492
                 &spr_read_ibat, &spr_write_ibatu,
493
                 0x00000000);
494
    spr_register(env, SPR_IBAT3L, "IBAT3L",
495
                 SPR_NOACCESS, SPR_NOACCESS,
496
                 &spr_read_ibat, &spr_write_ibatl,
497
                 0x00000000);
498
    spr_register(env, SPR_DBAT0U, "DBAT0U",
499
                 SPR_NOACCESS, SPR_NOACCESS,
500
                 &spr_read_dbat, &spr_write_dbatu,
501
                 0x00000000);
502
    spr_register(env, SPR_DBAT0L, "DBAT0L",
503
                 SPR_NOACCESS, SPR_NOACCESS,
504
                 &spr_read_dbat, &spr_write_dbatl,
505
                 0x00000000);
506
    spr_register(env, SPR_DBAT1U, "DBAT1U",
507
                 SPR_NOACCESS, SPR_NOACCESS,
508
                 &spr_read_dbat, &spr_write_dbatu,
509
                 0x00000000);
510
    spr_register(env, SPR_DBAT1L, "DBAT1L",
511
                 SPR_NOACCESS, SPR_NOACCESS,
512
                 &spr_read_dbat, &spr_write_dbatl,
513
                 0x00000000);
514
    spr_register(env, SPR_DBAT2U, "DBAT2U",
515
                 SPR_NOACCESS, SPR_NOACCESS,
516
                 &spr_read_dbat, &spr_write_dbatu,
517
                 0x00000000);
518
    spr_register(env, SPR_DBAT2L, "DBAT2L",
519
                 SPR_NOACCESS, SPR_NOACCESS,
520
                 &spr_read_dbat, &spr_write_dbatl,
521
                 0x00000000);
522
    spr_register(env, SPR_DBAT3U, "DBAT3U",
523
                 SPR_NOACCESS, SPR_NOACCESS,
524
                 &spr_read_dbat, &spr_write_dbatu,
525
                 0x00000000);
526
    spr_register(env, SPR_DBAT3L, "DBAT3L",
527
                 SPR_NOACCESS, SPR_NOACCESS,
528
                 &spr_read_dbat, &spr_write_dbatl,
529
                 0x00000000);
530
    env->nb_BATs = 4;
531
}
532

    
533
/* BATs 4-7 */
534
static void gen_high_BATs (CPUPPCState *env)
535
{
536
    spr_register(env, SPR_IBAT4U, "IBAT4U",
537
                 SPR_NOACCESS, SPR_NOACCESS,
538
                 &spr_read_ibat_h, &spr_write_ibatu_h,
539
                 0x00000000);
540
    spr_register(env, SPR_IBAT4L, "IBAT4L",
541
                 SPR_NOACCESS, SPR_NOACCESS,
542
                 &spr_read_ibat_h, &spr_write_ibatl_h,
543
                 0x00000000);
544
    spr_register(env, SPR_IBAT5U, "IBAT5U",
545
                 SPR_NOACCESS, SPR_NOACCESS,
546
                 &spr_read_ibat_h, &spr_write_ibatu_h,
547
                 0x00000000);
548
    spr_register(env, SPR_IBAT5L, "IBAT5L",
549
                 SPR_NOACCESS, SPR_NOACCESS,
550
                 &spr_read_ibat_h, &spr_write_ibatl_h,
551
                 0x00000000);
552
    spr_register(env, SPR_IBAT6U, "IBAT6U",
553
                 SPR_NOACCESS, SPR_NOACCESS,
554
                 &spr_read_ibat_h, &spr_write_ibatu_h,
555
                 0x00000000);
556
    spr_register(env, SPR_IBAT6L, "IBAT6L",
557
                 SPR_NOACCESS, SPR_NOACCESS,
558
                 &spr_read_ibat_h, &spr_write_ibatl_h,
559
                 0x00000000);
560
    spr_register(env, SPR_IBAT7U, "IBAT7U",
561
                 SPR_NOACCESS, SPR_NOACCESS,
562
                 &spr_read_ibat_h, &spr_write_ibatu_h,
563
                 0x00000000);
564
    spr_register(env, SPR_IBAT7L, "IBAT7L",
565
                 SPR_NOACCESS, SPR_NOACCESS,
566
                 &spr_read_ibat_h, &spr_write_ibatl_h,
567
                 0x00000000);
568
    spr_register(env, SPR_DBAT4U, "DBAT4U",
569
                 SPR_NOACCESS, SPR_NOACCESS,
570
                 &spr_read_dbat_h, &spr_write_dbatu_h,
571
                 0x00000000);
572
    spr_register(env, SPR_DBAT4L, "DBAT4L",
573
                 SPR_NOACCESS, SPR_NOACCESS,
574
                 &spr_read_dbat_h, &spr_write_dbatl_h,
575
                 0x00000000);
576
    spr_register(env, SPR_DBAT5U, "DBAT5U",
577
                 SPR_NOACCESS, SPR_NOACCESS,
578
                 &spr_read_dbat_h, &spr_write_dbatu_h,
579
                 0x00000000);
580
    spr_register(env, SPR_DBAT5L, "DBAT5L",
581
                 SPR_NOACCESS, SPR_NOACCESS,
582
                 &spr_read_dbat_h, &spr_write_dbatl_h,
583
                 0x00000000);
584
    spr_register(env, SPR_DBAT6U, "DBAT6U",
585
                 SPR_NOACCESS, SPR_NOACCESS,
586
                 &spr_read_dbat_h, &spr_write_dbatu_h,
587
                 0x00000000);
588
    spr_register(env, SPR_DBAT6L, "DBAT6L",
589
                 SPR_NOACCESS, SPR_NOACCESS,
590
                 &spr_read_dbat_h, &spr_write_dbatl_h,
591
                 0x00000000);
592
    spr_register(env, SPR_DBAT7U, "DBAT7U",
593
                 SPR_NOACCESS, SPR_NOACCESS,
594
                 &spr_read_dbat_h, &spr_write_dbatu_h,
595
                 0x00000000);
596
    spr_register(env, SPR_DBAT7L, "DBAT7L",
597
                 SPR_NOACCESS, SPR_NOACCESS,
598
                 &spr_read_dbat_h, &spr_write_dbatl_h,
599
                 0x00000000);
600
    env->nb_BATs = 8;
601
}
602

    
603
/* Generic PowerPC time base */
604
static void gen_tbl (CPUPPCState *env)
605
{
606
    spr_register(env, SPR_VTBL,  "TBL",
607
                 &spr_read_tbl, SPR_NOACCESS,
608
                 &spr_read_tbl, SPR_NOACCESS,
609
                 0x00000000);
610
    spr_register(env, SPR_TBL,   "TBL",
611
                 SPR_NOACCESS, SPR_NOACCESS,
612
                 SPR_NOACCESS, &spr_write_tbl,
613
                 0x00000000);
614
    spr_register(env, SPR_VTBU,  "TBU",
615
                 &spr_read_tbu, SPR_NOACCESS,
616
                 &spr_read_tbu, SPR_NOACCESS,
617
                 0x00000000);
618
    spr_register(env, SPR_TBU,   "TBU",
619
                 SPR_NOACCESS, SPR_NOACCESS,
620
                 SPR_NOACCESS, &spr_write_tbu,
621
                 0x00000000);
622
}
623

    
624
/* Softare table search registers */
625
static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
626
{
627
    env->nb_tlb = nb_tlbs;
628
    env->nb_ways = nb_ways;
629
    env->id_tlbs = 1;
630
    spr_register(env, SPR_DMISS, "DMISS",
631
                 SPR_NOACCESS, SPR_NOACCESS,
632
                 &spr_read_generic, SPR_NOACCESS,
633
                 0x00000000);
634
    spr_register(env, SPR_DCMP, "DCMP",
635
                 SPR_NOACCESS, SPR_NOACCESS,
636
                 &spr_read_generic, SPR_NOACCESS,
637
                 0x00000000);
638
    spr_register(env, SPR_HASH1, "HASH1",
639
                 SPR_NOACCESS, SPR_NOACCESS,
640
                 &spr_read_generic, SPR_NOACCESS,
641
                 0x00000000);
642
    spr_register(env, SPR_HASH2, "HASH2",
643
                 SPR_NOACCESS, SPR_NOACCESS,
644
                 &spr_read_generic, SPR_NOACCESS,
645
                 0x00000000);
646
    spr_register(env, SPR_IMISS, "IMISS",
647
                 SPR_NOACCESS, SPR_NOACCESS,
648
                 &spr_read_generic, SPR_NOACCESS,
649
                 0x00000000);
650
    spr_register(env, SPR_ICMP, "ICMP",
651
                 SPR_NOACCESS, SPR_NOACCESS,
652
                 &spr_read_generic, SPR_NOACCESS,
653
                 0x00000000);
654
    spr_register(env, SPR_RPA, "RPA",
655
                 SPR_NOACCESS, SPR_NOACCESS,
656
                 &spr_read_generic, &spr_write_generic,
657
                 0x00000000);
658
}
659

    
660
/* SPR common to MPC755 and G2 */
661
static void gen_spr_G2_755 (CPUPPCState *env)
662
{
663
    /* SGPRs */
664
    spr_register(env, SPR_SPRG4, "SPRG4",
665
                 SPR_NOACCESS, SPR_NOACCESS,
666
                 &spr_read_generic, &spr_write_generic,
667
                 0x00000000);
668
    spr_register(env, SPR_SPRG5, "SPRG5",
669
                 SPR_NOACCESS, SPR_NOACCESS,
670
                 &spr_read_generic, &spr_write_generic,
671
                 0x00000000);
672
    spr_register(env, SPR_SPRG6, "SPRG6",
673
                 SPR_NOACCESS, SPR_NOACCESS,
674
                 &spr_read_generic, &spr_write_generic,
675
                 0x00000000);
676
    spr_register(env, SPR_SPRG7, "SPRG7",
677
                 SPR_NOACCESS, SPR_NOACCESS,
678
                 &spr_read_generic, &spr_write_generic,
679
                 0x00000000);
680
    /* External access control */
681
    /* XXX : not implemented */
682
    spr_register(env, SPR_EAR, "EAR",
683
                 SPR_NOACCESS, SPR_NOACCESS,
684
                 &spr_read_generic, &spr_write_generic,
685
                 0x00000000);
686
}
687

    
688
/* SPR common to all 7xx PowerPC implementations */
689
static void gen_spr_7xx (CPUPPCState *env)
690
{
691
    /* Breakpoints */
692
    /* XXX : not implemented */
693
    spr_register(env, SPR_DABR, "DABR",
694
                 SPR_NOACCESS, SPR_NOACCESS,
695
                 &spr_read_generic, &spr_write_generic,
696
                 0x00000000);
697
    /* XXX : not implemented */
698
    spr_register(env, SPR_IABR, "IABR",
699
                 SPR_NOACCESS, SPR_NOACCESS,
700
                 &spr_read_generic, &spr_write_generic,
701
                 0x00000000);
702
    /* Cache management */
703
    /* XXX : not implemented */
704
    spr_register(env, SPR_ICTC, "ICTC",
705
                 SPR_NOACCESS, SPR_NOACCESS,
706
                 &spr_read_generic, &spr_write_generic,
707
                 0x00000000);
708
    /* XXX : not implemented */
709
    spr_register(env, SPR_L2CR, "L2CR",
710
                 SPR_NOACCESS, SPR_NOACCESS,
711
                 &spr_read_generic, &spr_write_generic,
712
                 0x00000000);
713
    /* Performance monitors */
714
    /* XXX : not implemented */
715
    spr_register(env, SPR_MMCR0, "MMCR0",
716
                 SPR_NOACCESS, SPR_NOACCESS,
717
                 &spr_read_generic, &spr_write_generic,
718
                 0x00000000);
719
    /* XXX : not implemented */
720
    spr_register(env, SPR_MMCR1, "MMCR1",
721
                 SPR_NOACCESS, SPR_NOACCESS,
722
                 &spr_read_generic, &spr_write_generic,
723
                 0x00000000);
724
    /* XXX : not implemented */
725
    spr_register(env, SPR_PMC1, "PMC1",
726
                 SPR_NOACCESS, SPR_NOACCESS,
727
                 &spr_read_generic, &spr_write_generic,
728
                 0x00000000);
729
    /* XXX : not implemented */
730
    spr_register(env, SPR_PMC2, "PMC2",
731
                 SPR_NOACCESS, SPR_NOACCESS,
732
                 &spr_read_generic, &spr_write_generic,
733
                 0x00000000);
734
    /* XXX : not implemented */
735
    spr_register(env, SPR_PMC3, "PMC3",
736
                 SPR_NOACCESS, SPR_NOACCESS,
737
                 &spr_read_generic, &spr_write_generic,
738
                 0x00000000);
739
    /* XXX : not implemented */
740
    spr_register(env, SPR_PMC4, "PMC4",
741
                 SPR_NOACCESS, SPR_NOACCESS,
742
                 &spr_read_generic, &spr_write_generic,
743
                 0x00000000);
744
    /* XXX : not implemented */
745
    spr_register(env, SPR_SIA, "SIA",
746
                 SPR_NOACCESS, SPR_NOACCESS,
747
                 &spr_read_generic, SPR_NOACCESS,
748
                 0x00000000);
749
    spr_register(env, SPR_UMMCR0, "UMMCR0",
750
                 &spr_read_ureg, SPR_NOACCESS,
751
                 &spr_read_ureg, SPR_NOACCESS,
752
                 0x00000000);
753
    spr_register(env, SPR_UMMCR1, "UMMCR1",
754
                 &spr_read_ureg, SPR_NOACCESS,
755
                 &spr_read_ureg, SPR_NOACCESS,
756
                 0x00000000);
757
    spr_register(env, SPR_UPMC1, "UPMC1",
758
                 &spr_read_ureg, SPR_NOACCESS,
759
                 &spr_read_ureg, SPR_NOACCESS,
760
                 0x00000000);
761
    spr_register(env, SPR_UPMC2, "UPMC2",
762
                 &spr_read_ureg, SPR_NOACCESS,
763
                 &spr_read_ureg, SPR_NOACCESS,
764
                 0x00000000);
765
    spr_register(env, SPR_UPMC3, "UPMC3",
766
                 &spr_read_ureg, SPR_NOACCESS,
767
                 &spr_read_ureg, SPR_NOACCESS,
768
                 0x00000000);
769
    spr_register(env, SPR_UPMC4, "UPMC4",
770
                 &spr_read_ureg, SPR_NOACCESS,
771
                 &spr_read_ureg, SPR_NOACCESS,
772
                 0x00000000);
773
    spr_register(env, SPR_USIA, "USIA",
774
                 &spr_read_ureg, SPR_NOACCESS,
775
                 &spr_read_ureg, SPR_NOACCESS,
776
                 0x00000000);
777
    /* Thermal management */
778
    /* XXX : not implemented */
779
    spr_register(env, SPR_THRM1, "THRM1",
780
                 SPR_NOACCESS, SPR_NOACCESS,
781
                 &spr_read_generic, &spr_write_generic,
782
                 0x00000000);
783
    /* XXX : not implemented */
784
    spr_register(env, SPR_THRM2, "THRM2",
785
                 SPR_NOACCESS, SPR_NOACCESS,
786
                 &spr_read_generic, &spr_write_generic,
787
                 0x00000000);
788
    /* XXX : not implemented */
789
    spr_register(env, SPR_THRM3, "THRM3",
790
                 SPR_NOACCESS, SPR_NOACCESS,
791
                 &spr_read_generic, &spr_write_generic,
792
                 0x00000000);
793
    /* External access control */
794
    /* XXX : not implemented */
795
    spr_register(env, SPR_EAR, "EAR",
796
                 SPR_NOACCESS, SPR_NOACCESS,
797
                 &spr_read_generic, &spr_write_generic,
798
                 0x00000000);
799
}
800

    
801
/* SPR specific to PowerPC 604 implementation */
802
static void gen_spr_604 (CPUPPCState *env)
803
{
804
    /* Processor identification */
805
    spr_register(env, SPR_PIR, "PIR",
806
                 SPR_NOACCESS, SPR_NOACCESS,
807
                 &spr_read_generic, &spr_write_pir,
808
                 0x00000000);
809
    /* Breakpoints */
810
    /* XXX : not implemented */
811
    spr_register(env, SPR_IABR, "IABR",
812
                 SPR_NOACCESS, SPR_NOACCESS,
813
                 &spr_read_generic, &spr_write_generic,
814
                 0x00000000);
815
    /* XXX : not implemented */
816
    spr_register(env, SPR_DABR, "DABR",
817
                 SPR_NOACCESS, SPR_NOACCESS,
818
                 &spr_read_generic, &spr_write_generic,
819
                 0x00000000);
820
    /* Performance counters */
821
    /* XXX : not implemented */
822
    spr_register(env, SPR_MMCR0, "MMCR0",
823
                 SPR_NOACCESS, SPR_NOACCESS,
824
                 &spr_read_generic, &spr_write_generic,
825
                 0x00000000);
826
    /* XXX : not implemented */
827
    spr_register(env, SPR_MMCR1, "MMCR1",
828
                 SPR_NOACCESS, SPR_NOACCESS,
829
                 &spr_read_generic, &spr_write_generic,
830
                 0x00000000);
831
    /* XXX : not implemented */
832
    spr_register(env, SPR_PMC1, "PMC1",
833
                 SPR_NOACCESS, SPR_NOACCESS,
834
                 &spr_read_generic, &spr_write_generic,
835
                 0x00000000);
836
    /* XXX : not implemented */
837
    spr_register(env, SPR_PMC2, "PMC2",
838
                 SPR_NOACCESS, SPR_NOACCESS,
839
                 &spr_read_generic, &spr_write_generic,
840
                 0x00000000);
841
    /* XXX : not implemented */
842
    spr_register(env, SPR_PMC3, "PMC3",
843
                 SPR_NOACCESS, SPR_NOACCESS,
844
                 &spr_read_generic, &spr_write_generic,
845
                 0x00000000);
846
    /* XXX : not implemented */
847
    spr_register(env, SPR_PMC4, "PMC4",
848
                 SPR_NOACCESS, SPR_NOACCESS,
849
                 &spr_read_generic, &spr_write_generic,
850
                 0x00000000);
851
    /* XXX : not implemented */
852
    spr_register(env, SPR_SIA, "SIA",
853
                 SPR_NOACCESS, SPR_NOACCESS,
854
                 &spr_read_generic, SPR_NOACCESS,
855
                 0x00000000);
856
    /* XXX : not implemented */
857
    spr_register(env, SPR_SDA, "SDA",
858
                 SPR_NOACCESS, SPR_NOACCESS,
859
                 &spr_read_generic, SPR_NOACCESS,
860
                 0x00000000);
861
    /* External access control */
862
    /* XXX : not implemented */
863
    spr_register(env, SPR_EAR, "EAR",
864
                 SPR_NOACCESS, SPR_NOACCESS,
865
                 &spr_read_generic, &spr_write_generic,
866
                 0x00000000);
867
}
868

    
869
/* SPR specific to PowerPC 603 implementation */
870
static void gen_spr_603 (CPUPPCState *env)
871
{
872
    /* External access control */
873
    /* XXX : not implemented */
874
    spr_register(env, SPR_EAR, "EAR",
875
                 SPR_NOACCESS, SPR_NOACCESS,
876
                 &spr_read_generic, &spr_write_generic,
877
                 0x00000000);
878
}
879

    
880
/* SPR specific to PowerPC G2 implementation */
881
static void gen_spr_G2 (CPUPPCState *env)
882
{
883
    /* Memory base address */
884
    /* MBAR */
885
    spr_register(env, SPR_MBAR, "MBAR",
886
                 SPR_NOACCESS, SPR_NOACCESS,
887
                 &spr_read_generic, &spr_write_generic,
888
                 0x00000000);
889
    /* System version register */
890
    /* SVR */
891
    spr_register(env, SPR_SVR, "SVR",
892
                 SPR_NOACCESS, SPR_NOACCESS,
893
                 &spr_read_generic, SPR_NOACCESS,
894
                 0x00000000);
895
    /* Exception processing */
896
    spr_register(env, SPR_CSRR0, "CSRR0",
897
                 SPR_NOACCESS, SPR_NOACCESS,
898
                 &spr_read_generic, &spr_write_generic,
899
                 0x00000000);
900
    spr_register(env, SPR_CSRR1, "CSRR1",
901
                 SPR_NOACCESS, SPR_NOACCESS,
902
                 &spr_read_generic, &spr_write_generic,
903
                 0x00000000);
904
    /* Breakpoints */
905
    /* XXX : not implemented */
906
    spr_register(env, SPR_DABR, "DABR",
907
                 SPR_NOACCESS, SPR_NOACCESS,
908
                 &spr_read_generic, &spr_write_generic,
909
                 0x00000000);
910
    /* XXX : not implemented */
911
    spr_register(env, SPR_DABR2, "DABR2",
912
                 SPR_NOACCESS, SPR_NOACCESS,
913
                 &spr_read_generic, &spr_write_generic,
914
                 0x00000000);
915
    /* XXX : not implemented */
916
    spr_register(env, SPR_IABR, "IABR",
917
                 SPR_NOACCESS, SPR_NOACCESS,
918
                 &spr_read_generic, &spr_write_generic,
919
                 0x00000000);
920
    /* XXX : not implemented */
921
    spr_register(env, SPR_IABR2, "IABR2",
922
                 SPR_NOACCESS, SPR_NOACCESS,
923
                 &spr_read_generic, &spr_write_generic,
924
                 0x00000000);
925
    /* XXX : not implemented */
926
    spr_register(env, SPR_IBCR, "IBCR",
927
                 SPR_NOACCESS, SPR_NOACCESS,
928
                 &spr_read_generic, &spr_write_generic,
929
                 0x00000000);
930
    /* XXX : not implemented */
931
    spr_register(env, SPR_DBCR, "DBCR",
932
                 SPR_NOACCESS, SPR_NOACCESS,
933
                 &spr_read_generic, &spr_write_generic,
934
                 0x00000000);
935
}
936

    
937
/* SPR specific to PowerPC 602 implementation */
938
static void gen_spr_602 (CPUPPCState *env)
939
{
940
    /* ESA registers */
941
    /* XXX : not implemented */
942
    spr_register(env, SPR_SER, "SER",
943
                 SPR_NOACCESS, SPR_NOACCESS,
944
                 &spr_read_generic, &spr_write_generic,
945
                 0x00000000);
946
    /* XXX : not implemented */
947
    spr_register(env, SPR_SEBR, "SEBR",
948
                 SPR_NOACCESS, SPR_NOACCESS,
949
                 &spr_read_generic, &spr_write_generic,
950
                 0x00000000);
951
    /* XXX : not implemented */
952
    spr_register(env, SPR_ESASR, "ESASR",
953
                 SPR_NOACCESS, SPR_NOACCESS,
954
                 &spr_read_generic, &spr_write_generic,
955
                 0x00000000);
956
    /* Floating point status */
957
    /* XXX : not implemented */
958
    spr_register(env, SPR_SP, "SP",
959
                 SPR_NOACCESS, SPR_NOACCESS,
960
                 &spr_read_generic, &spr_write_generic,
961
                 0x00000000);
962
    /* XXX : not implemented */
963
    spr_register(env, SPR_LT, "LT",
964
                 SPR_NOACCESS, SPR_NOACCESS,
965
                 &spr_read_generic, &spr_write_generic,
966
                 0x00000000);
967
    /* Watchdog timer */
968
    /* XXX : not implemented */
969
    spr_register(env, SPR_TCR, "TCR",
970
                 SPR_NOACCESS, SPR_NOACCESS,
971
                 &spr_read_generic, &spr_write_generic,
972
                 0x00000000);
973
    /* Interrupt base */
974
    spr_register(env, SPR_IBR, "IBR",
975
                 SPR_NOACCESS, SPR_NOACCESS,
976
                 &spr_read_generic, &spr_write_generic,
977
                 0x00000000);
978
}
979

    
980
/* SPR specific to PowerPC 601 implementation */
981
static void gen_spr_601 (CPUPPCState *env)
982
{
983
    /* Multiplication/division register */
984
    /* MQ */
985
    spr_register(env, SPR_MQ, "MQ",
986
                 &spr_read_generic, &spr_write_generic,
987
                 &spr_read_generic, &spr_write_generic,
988
                 0x00000000);
989
    /* RTC registers */
990
    spr_register(env, SPR_601_RTCU, "RTCU",
991
                 SPR_NOACCESS, SPR_NOACCESS,
992
                 SPR_NOACCESS, &spr_write_601_rtcu,
993
                 0x00000000);
994
    spr_register(env, SPR_601_VRTCU, "RTCU",
995
                 &spr_read_601_rtcu, SPR_NOACCESS,
996
                 &spr_read_601_rtcu, SPR_NOACCESS,
997
                 0x00000000);
998
    spr_register(env, SPR_601_RTCL, "RTCL",
999
                 SPR_NOACCESS, SPR_NOACCESS,
1000
                 SPR_NOACCESS, &spr_write_601_rtcl,
1001
                 0x00000000);
1002
    spr_register(env, SPR_601_VRTCL, "RTCL",
1003
                 &spr_read_601_rtcl, SPR_NOACCESS,
1004
                 &spr_read_601_rtcl, SPR_NOACCESS,
1005
                 0x00000000);
1006
    /* Timer */
1007
#if 0 /* ? */
1008
    spr_register(env, SPR_601_UDECR, "UDECR",
1009
                 &spr_read_decr, SPR_NOACCESS,
1010
                 &spr_read_decr, SPR_NOACCESS,
1011
                 0x00000000);
1012
#endif
1013
    /* External access control */
1014
    /* XXX : not implemented */
1015
    spr_register(env, SPR_EAR, "EAR",
1016
                 SPR_NOACCESS, SPR_NOACCESS,
1017
                 &spr_read_generic, &spr_write_generic,
1018
                 0x00000000);
1019
    /* Memory management */
1020
    spr_register(env, SPR_IBAT0U, "IBAT0U",
1021
                 SPR_NOACCESS, SPR_NOACCESS,
1022
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1023
                 0x00000000);
1024
    spr_register(env, SPR_IBAT0L, "IBAT0L",
1025
                 SPR_NOACCESS, SPR_NOACCESS,
1026
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1027
                 0x00000000);
1028
    spr_register(env, SPR_IBAT1U, "IBAT1U",
1029
                 SPR_NOACCESS, SPR_NOACCESS,
1030
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1031
                 0x00000000);
1032
    spr_register(env, SPR_IBAT1L, "IBAT1L",
1033
                 SPR_NOACCESS, SPR_NOACCESS,
1034
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1035
                 0x00000000);
1036
    spr_register(env, SPR_IBAT2U, "IBAT2U",
1037
                 SPR_NOACCESS, SPR_NOACCESS,
1038
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1039
                 0x00000000);
1040
    spr_register(env, SPR_IBAT2L, "IBAT2L",
1041
                 SPR_NOACCESS, SPR_NOACCESS,
1042
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1043
                 0x00000000);
1044
    spr_register(env, SPR_IBAT3U, "IBAT3U",
1045
                 SPR_NOACCESS, SPR_NOACCESS,
1046
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1047
                 0x00000000);
1048
    spr_register(env, SPR_IBAT3L, "IBAT3L",
1049
                 SPR_NOACCESS, SPR_NOACCESS,
1050
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1051
                 0x00000000);
1052
}
1053

    
1054
/* PowerPC BookE SPR */
1055
static void gen_spr_BookE (CPUPPCState *env)
1056
{
1057
    /* Processor identification */
1058
    spr_register(env, SPR_BOOKE_PIR, "PIR",
1059
                 SPR_NOACCESS, SPR_NOACCESS,
1060
                 &spr_read_generic, &spr_write_pir,
1061
                 0x00000000);
1062
    /* Interrupt processing */
1063
    spr_register(env, SPR_CSRR0, "CSRR0",
1064
                 SPR_NOACCESS, SPR_NOACCESS,
1065
                 &spr_read_generic, &spr_write_generic,
1066
                 0x00000000);
1067
    spr_register(env, SPR_CSRR1, "CSRR1",
1068
                 SPR_NOACCESS, SPR_NOACCESS,
1069
                 &spr_read_generic, &spr_write_generic,
1070
                 0x00000000);
1071
    /* Debug */
1072
    /* XXX : not implemented */
1073
    spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1074
                 SPR_NOACCESS, SPR_NOACCESS,
1075
                 &spr_read_generic, &spr_write_generic,
1076
                 0x00000000);
1077
    /* XXX : not implemented */
1078
    spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1079
                 SPR_NOACCESS, SPR_NOACCESS,
1080
                 &spr_read_generic, &spr_write_generic,
1081
                 0x00000000);
1082
    /* XXX : not implemented */
1083
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1084
                 SPR_NOACCESS, SPR_NOACCESS,
1085
                 &spr_read_generic, &spr_write_generic,
1086
                 0x00000000);
1087
    /* XXX : not implemented */
1088
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1089
                 SPR_NOACCESS, SPR_NOACCESS,
1090
                 &spr_read_generic, &spr_write_generic,
1091
                 0x00000000);
1092
    /* XXX : not implemented */
1093
    spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1094
                 SPR_NOACCESS, SPR_NOACCESS,
1095
                 &spr_read_generic, &spr_write_generic,
1096
                 0x00000000);
1097
    /* XXX : not implemented */
1098
    spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1099
                 SPR_NOACCESS, SPR_NOACCESS,
1100
                 &spr_read_generic, &spr_write_generic,
1101
                 0x00000000);
1102
    /* XXX : not implemented */
1103
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1104
                 SPR_NOACCESS, SPR_NOACCESS,
1105
                 &spr_read_generic, &spr_write_generic,
1106
                 0x00000000);
1107
    /* XXX : not implemented */
1108
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1109
                 SPR_NOACCESS, SPR_NOACCESS,
1110
                 &spr_read_generic, &spr_write_generic,
1111
                 0x00000000);
1112
    /* XXX : not implemented */
1113
    spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1114
                 SPR_NOACCESS, SPR_NOACCESS,
1115
                 &spr_read_generic, &spr_write_generic,
1116
                 0x00000000);
1117
    /* XXX : not implemented */
1118
    spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1119
                 SPR_NOACCESS, SPR_NOACCESS,
1120
                 &spr_read_generic, &spr_write_generic,
1121
                 0x00000000);
1122
    /* XXX : not implemented */
1123
    spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1124
                 SPR_NOACCESS, SPR_NOACCESS,
1125
                 &spr_read_generic, &spr_write_generic,
1126
                 0x00000000);
1127
    /* XXX : not implemented */
1128
    spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1129
                 SPR_NOACCESS, SPR_NOACCESS,
1130
                 &spr_read_generic, &spr_write_generic,
1131
                 0x00000000);
1132
    spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1133
                 SPR_NOACCESS, SPR_NOACCESS,
1134
                 &spr_read_generic, &spr_write_generic,
1135
                 0x00000000);
1136
    spr_register(env, SPR_BOOKE_ESR, "ESR",
1137
                 SPR_NOACCESS, SPR_NOACCESS,
1138
                 &spr_read_generic, &spr_write_generic,
1139
                 0x00000000);
1140
    spr_register(env, SPR_BOOKE_EVPR, "EVPR",
1141
                 SPR_NOACCESS, SPR_NOACCESS,
1142
                 &spr_read_generic, &spr_write_generic,
1143
                 0x00000000);
1144
    spr_register(env, SPR_BOOKE_IVOR0, "IVOR0",
1145
                 SPR_NOACCESS, SPR_NOACCESS,
1146
                 &spr_read_generic, &spr_write_generic,
1147
                 0x00000000);
1148
    spr_register(env, SPR_BOOKE_IVOR1, "IVOR1",
1149
                 SPR_NOACCESS, SPR_NOACCESS,
1150
                 &spr_read_generic, &spr_write_generic,
1151
                 0x00000000);
1152
    spr_register(env, SPR_BOOKE_IVOR2, "IVOR2",
1153
                 SPR_NOACCESS, SPR_NOACCESS,
1154
                 &spr_read_generic, &spr_write_generic,
1155
                 0x00000000);
1156
    spr_register(env, SPR_BOOKE_IVOR3, "IVOR3",
1157
                 SPR_NOACCESS, SPR_NOACCESS,
1158
                 &spr_read_generic, &spr_write_generic,
1159
                 0x00000000);
1160
    spr_register(env, SPR_BOOKE_IVOR4, "IVOR4",
1161
                 SPR_NOACCESS, SPR_NOACCESS,
1162
                 &spr_read_generic, &spr_write_generic,
1163
                 0x00000000);
1164
    spr_register(env, SPR_BOOKE_IVOR5, "IVOR5",
1165
                 SPR_NOACCESS, SPR_NOACCESS,
1166
                 &spr_read_generic, &spr_write_generic,
1167
                 0x00000000);
1168
    spr_register(env, SPR_BOOKE_IVOR6, "IVOR6",
1169
                 SPR_NOACCESS, SPR_NOACCESS,
1170
                 &spr_read_generic, &spr_write_generic,
1171
                 0x00000000);
1172
    spr_register(env, SPR_BOOKE_IVOR7, "IVOR7",
1173
                 SPR_NOACCESS, SPR_NOACCESS,
1174
                 &spr_read_generic, &spr_write_generic,
1175
                 0x00000000);
1176
    spr_register(env, SPR_BOOKE_IVOR8, "IVOR8",
1177
                 SPR_NOACCESS, SPR_NOACCESS,
1178
                 &spr_read_generic, &spr_write_generic,
1179
                 0x00000000);
1180
    spr_register(env, SPR_BOOKE_IVOR9, "IVOR9",
1181
                 SPR_NOACCESS, SPR_NOACCESS,
1182
                 &spr_read_generic, &spr_write_generic,
1183
                 0x00000000);
1184
    spr_register(env, SPR_BOOKE_IVOR10, "IVOR10",
1185
                 SPR_NOACCESS, SPR_NOACCESS,
1186
                 &spr_read_generic, &spr_write_generic,
1187
                 0x00000000);
1188
    spr_register(env, SPR_BOOKE_IVOR11, "IVOR11",
1189
                 SPR_NOACCESS, SPR_NOACCESS,
1190
                 &spr_read_generic, &spr_write_generic,
1191
                 0x00000000);
1192
    spr_register(env, SPR_BOOKE_IVOR12, "IVOR12",
1193
                 SPR_NOACCESS, SPR_NOACCESS,
1194
                 &spr_read_generic, &spr_write_generic,
1195
                 0x00000000);
1196
    spr_register(env, SPR_BOOKE_IVOR13, "IVOR13",
1197
                 SPR_NOACCESS, SPR_NOACCESS,
1198
                 &spr_read_generic, &spr_write_generic,
1199
                 0x00000000);
1200
    spr_register(env, SPR_BOOKE_IVOR14, "IVOR14",
1201
                 SPR_NOACCESS, SPR_NOACCESS,
1202
                 &spr_read_generic, &spr_write_generic,
1203
                 0x00000000);
1204
    spr_register(env, SPR_BOOKE_IVOR15, "IVOR15",
1205
                 SPR_NOACCESS, SPR_NOACCESS,
1206
                 &spr_read_generic, &spr_write_generic,
1207
                 0x00000000);
1208
    spr_register(env, SPR_BOOKE_PID, "PID",
1209
                 SPR_NOACCESS, SPR_NOACCESS,
1210
                 &spr_read_generic, &spr_write_generic,
1211
                 0x00000000);
1212
    spr_register(env, SPR_BOOKE_TCR, "TCR",
1213
                 SPR_NOACCESS, SPR_NOACCESS,
1214
                 &spr_read_generic, &spr_write_booke_tcr,
1215
                 0x00000000);
1216
    spr_register(env, SPR_BOOKE_TSR, "TSR",
1217
                 SPR_NOACCESS, SPR_NOACCESS,
1218
                 &spr_read_generic, &spr_write_booke_tsr,
1219
                 0x00000000);
1220
    /* Timer */
1221
    spr_register(env, SPR_DECR, "DECR",
1222
                 SPR_NOACCESS, SPR_NOACCESS,
1223
                 &spr_read_decr, &spr_write_decr,
1224
                 0x00000000);
1225
    spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1226
                 SPR_NOACCESS, SPR_NOACCESS,
1227
                 SPR_NOACCESS, &spr_write_generic,
1228
                 0x00000000);
1229
    /* SPRGs */
1230
    spr_register(env, SPR_USPRG0, "USPRG0",
1231
                 &spr_read_generic, &spr_write_generic,
1232
                 &spr_read_generic, &spr_write_generic,
1233
                 0x00000000);
1234
    spr_register(env, SPR_SPRG4, "SPRG4",
1235
                 SPR_NOACCESS, SPR_NOACCESS,
1236
                 &spr_read_generic, &spr_write_generic,
1237
                 0x00000000);
1238
    spr_register(env, SPR_USPRG4, "USPRG4",
1239
                 &spr_read_ureg, SPR_NOACCESS,
1240
                 &spr_read_ureg, SPR_NOACCESS,
1241
                 0x00000000);
1242
    spr_register(env, SPR_SPRG5, "SPRG5",
1243
                 SPR_NOACCESS, SPR_NOACCESS,
1244
                 &spr_read_generic, &spr_write_generic,
1245
                 0x00000000);
1246
    spr_register(env, SPR_USPRG5, "USPRG5",
1247
                 &spr_read_ureg, SPR_NOACCESS,
1248
                 &spr_read_ureg, SPR_NOACCESS,
1249
                 0x00000000);
1250
    spr_register(env, SPR_SPRG6, "SPRG6",
1251
                 SPR_NOACCESS, SPR_NOACCESS,
1252
                 &spr_read_generic, &spr_write_generic,
1253
                 0x00000000);
1254
    spr_register(env, SPR_USPRG6, "USPRG6",
1255
                 &spr_read_ureg, SPR_NOACCESS,
1256
                 &spr_read_ureg, SPR_NOACCESS,
1257
                 0x00000000);
1258
    spr_register(env, SPR_SPRG7, "SPRG7",
1259
                 SPR_NOACCESS, SPR_NOACCESS,
1260
                 &spr_read_generic, &spr_write_generic,
1261
                 0x00000000);
1262
    spr_register(env, SPR_USPRG7, "USPRG7",
1263
                 &spr_read_ureg, SPR_NOACCESS,
1264
                 &spr_read_ureg, SPR_NOACCESS,
1265
                 0x00000000);
1266
}
1267

    
1268
/* SPR specific to PowerPC 440 implementation */
1269
static void gen_spr_440 (CPUPPCState *env)
1270
{
1271
    /* Cache control */
1272
    /* XXX : not implemented */
1273
    spr_register(env, SPR_440_DNV0, "DNV0",
1274
                 SPR_NOACCESS, SPR_NOACCESS,
1275
                 &spr_read_generic, &spr_write_generic,
1276
                 0x00000000);
1277
    /* XXX : not implemented */
1278
    spr_register(env, SPR_440_DNV1, "DNV1",
1279
                 SPR_NOACCESS, SPR_NOACCESS,
1280
                 &spr_read_generic, &spr_write_generic,
1281
                 0x00000000);
1282
    /* XXX : not implemented */
1283
    spr_register(env, SPR_440_DNV2, "DNV2",
1284
                 SPR_NOACCESS, SPR_NOACCESS,
1285
                 &spr_read_generic, &spr_write_generic,
1286
                 0x00000000);
1287
    /* XXX : not implemented */
1288
    spr_register(env, SPR_440_DNV3, "DNV3",
1289
                 SPR_NOACCESS, SPR_NOACCESS,
1290
                 &spr_read_generic, &spr_write_generic,
1291
                 0x00000000);
1292
    /* XXX : not implemented */
1293
    spr_register(env, SPR_440_DVT0, "DVT0",
1294
                 SPR_NOACCESS, SPR_NOACCESS,
1295
                 &spr_read_generic, &spr_write_generic,
1296
                 0x00000000);
1297
    /* XXX : not implemented */
1298
    spr_register(env, SPR_440_DVT1, "DVT1",
1299
                 SPR_NOACCESS, SPR_NOACCESS,
1300
                 &spr_read_generic, &spr_write_generic,
1301
                 0x00000000);
1302
    /* XXX : not implemented */
1303
    spr_register(env, SPR_440_DVT2, "DVT2",
1304
                 SPR_NOACCESS, SPR_NOACCESS,
1305
                 &spr_read_generic, &spr_write_generic,
1306
                 0x00000000);
1307
    /* XXX : not implemented */
1308
    spr_register(env, SPR_440_DVT3, "DVT3",
1309
                 SPR_NOACCESS, SPR_NOACCESS,
1310
                 &spr_read_generic, &spr_write_generic,
1311
                 0x00000000);
1312
    /* XXX : not implemented */
1313
    spr_register(env, SPR_440_DVLIM, "DVLIM",
1314
                 SPR_NOACCESS, SPR_NOACCESS,
1315
                 &spr_read_generic, &spr_write_generic,
1316
                 0x00000000);
1317
    /* XXX : not implemented */
1318
    spr_register(env, SPR_440_INV0, "INV0",
1319
                 SPR_NOACCESS, SPR_NOACCESS,
1320
                 &spr_read_generic, &spr_write_generic,
1321
                 0x00000000);
1322
    /* XXX : not implemented */
1323
    spr_register(env, SPR_440_INV1, "INV1",
1324
                 SPR_NOACCESS, SPR_NOACCESS,
1325
                 &spr_read_generic, &spr_write_generic,
1326
                 0x00000000);
1327
    /* XXX : not implemented */
1328
    spr_register(env, SPR_440_INV2, "INV2",
1329
                 SPR_NOACCESS, SPR_NOACCESS,
1330
                 &spr_read_generic, &spr_write_generic,
1331
                 0x00000000);
1332
    /* XXX : not implemented */
1333
    spr_register(env, SPR_440_INV3, "INV3",
1334
                 SPR_NOACCESS, SPR_NOACCESS,
1335
                 &spr_read_generic, &spr_write_generic,
1336
                 0x00000000);
1337
    /* XXX : not implemented */
1338
    spr_register(env, SPR_440_IVT0, "IVT0",
1339
                 SPR_NOACCESS, SPR_NOACCESS,
1340
                 &spr_read_generic, &spr_write_generic,
1341
                 0x00000000);
1342
    /* XXX : not implemented */
1343
    spr_register(env, SPR_440_IVT1, "IVT1",
1344
                 SPR_NOACCESS, SPR_NOACCESS,
1345
                 &spr_read_generic, &spr_write_generic,
1346
                 0x00000000);
1347
    /* XXX : not implemented */
1348
    spr_register(env, SPR_440_IVT2, "IVT2",
1349
                 SPR_NOACCESS, SPR_NOACCESS,
1350
                 &spr_read_generic, &spr_write_generic,
1351
                 0x00000000);
1352
    /* XXX : not implemented */
1353
    spr_register(env, SPR_440_IVT3, "IVT3",
1354
                 SPR_NOACCESS, SPR_NOACCESS,
1355
                 &spr_read_generic, &spr_write_generic,
1356
                 0x00000000);
1357
    /* XXX : not implemented */
1358
    spr_register(env, SPR_440_IVLIM, "IVLIM",
1359
                 SPR_NOACCESS, SPR_NOACCESS,
1360
                 &spr_read_generic, &spr_write_generic,
1361
                 0x00000000);
1362
    /* Cache debug */
1363
    /* XXX : not implemented */
1364
    spr_register(env, SPR_440_DCBTRH, "DCBTRH",
1365
                 SPR_NOACCESS, SPR_NOACCESS,
1366
                 &spr_read_generic, SPR_NOACCESS,
1367
                 0x00000000);
1368
    /* XXX : not implemented */
1369
    spr_register(env, SPR_440_DCBTRL, "DCBTRL",
1370
                 SPR_NOACCESS, SPR_NOACCESS,
1371
                 &spr_read_generic, SPR_NOACCESS,
1372
                 0x00000000);
1373
    /* XXX : not implemented */
1374
    spr_register(env, SPR_4xx_ICDBDR, "ICDBDR",
1375
                 SPR_NOACCESS, SPR_NOACCESS,
1376
                 &spr_read_generic, SPR_NOACCESS,
1377
                 0x00000000);
1378
    /* XXX : not implemented */
1379
    spr_register(env, SPR_440_ICBTRH, "ICBTRH",
1380
                 SPR_NOACCESS, SPR_NOACCESS,
1381
                 &spr_read_generic, SPR_NOACCESS,
1382
                 0x00000000);
1383
    /* XXX : not implemented */
1384
    spr_register(env, SPR_440_ICBTRL, "ICBTRL",
1385
                 SPR_NOACCESS, SPR_NOACCESS,
1386
                 &spr_read_generic, SPR_NOACCESS,
1387
                 0x00000000);
1388
    /* XXX : not implemented */
1389
    spr_register(env, SPR_440_DBDR, "DBDR",
1390
                 SPR_NOACCESS, SPR_NOACCESS,
1391
                 &spr_read_generic, &spr_write_generic,
1392
                 0x00000000);
1393
    /* Processor control */
1394
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1395
                 SPR_NOACCESS, SPR_NOACCESS,
1396
                 &spr_read_generic, &spr_write_generic,
1397
                 0x00000000);
1398
    spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1399
                 SPR_NOACCESS, SPR_NOACCESS,
1400
                 &spr_read_generic, SPR_NOACCESS,
1401
                 0x00000000);
1402
    /* Storage control */
1403
    spr_register(env, SPR_440_MMUCR, "MMUCR",
1404
                 SPR_NOACCESS, SPR_NOACCESS,
1405
                 &spr_read_generic, &spr_write_generic,
1406
                 0x00000000);
1407
}
1408

    
1409
/* SPR shared between PowerPC 40x implementations */
1410
static void gen_spr_40x (CPUPPCState *env)
1411
{
1412
    /* Cache */
1413
    /* XXX : not implemented */
1414
    spr_register(env, SPR_40x_DCCR, "DCCR",
1415
                 SPR_NOACCESS, SPR_NOACCESS,
1416
                 &spr_read_generic, &spr_write_generic,
1417
                 0x00000000);
1418
    /* XXX : not implemented */
1419
    spr_register(env, SPR_40x_DCWR, "DCWR",
1420
                 SPR_NOACCESS, SPR_NOACCESS,
1421
                 &spr_read_generic, &spr_write_generic,
1422
                 0x00000000);
1423
    /* XXX : not implemented */
1424
    spr_register(env, SPR_40x_ICCR, "ICCR",
1425
                 SPR_NOACCESS, SPR_NOACCESS,
1426
                 &spr_read_generic, &spr_write_generic,
1427
                 0x00000000);
1428
    /* XXX : not implemented */
1429
    spr_register(env, SPR_4xx_ICDBDR, "ICDBDR",
1430
                 SPR_NOACCESS, SPR_NOACCESS,
1431
                 &spr_read_generic, SPR_NOACCESS,
1432
                 0x00000000);
1433
    /* Bus access control */
1434
    spr_register(env, SPR_40x_SGR, "SGR",
1435
                 SPR_NOACCESS, SPR_NOACCESS,
1436
                 &spr_read_generic, &spr_write_generic,
1437
                 0xFFFFFFFF);
1438
    spr_register(env, SPR_40x_ZPR, "ZPR",
1439
                 SPR_NOACCESS, SPR_NOACCESS,
1440
                 &spr_read_generic, &spr_write_generic,
1441
                 0x00000000);
1442
    /* MMU */
1443
    spr_register(env, SPR_40x_PID, "PID",
1444
                 SPR_NOACCESS, SPR_NOACCESS,
1445
                 &spr_read_generic, &spr_write_generic,
1446
                 0x00000000);
1447
    /* Exception */
1448
    spr_register(env, SPR_40x_DEAR, "DEAR",
1449
                 SPR_NOACCESS, SPR_NOACCESS,
1450
                 &spr_read_generic, &spr_write_generic,
1451
                 0x00000000);
1452
    spr_register(env, SPR_40x_ESR, "ESR",
1453
                 SPR_NOACCESS, SPR_NOACCESS,
1454
                 &spr_read_generic, &spr_write_generic,
1455
                 0x00000000);
1456
    spr_register(env, SPR_40x_EVPR, "EVPR",
1457
                 SPR_NOACCESS, SPR_NOACCESS,
1458
                 &spr_read_generic, &spr_write_generic,
1459
                 0x00000000);
1460
    spr_register(env, SPR_40x_SRR2, "SRR2",
1461
                 &spr_read_generic, &spr_write_generic,
1462
                 &spr_read_generic, &spr_write_generic,
1463
                 0x00000000);
1464
    spr_register(env, SPR_40x_SRR3, "SRR3",
1465
                 &spr_read_generic, &spr_write_generic,
1466
                 &spr_read_generic, &spr_write_generic,
1467
                 0x00000000);
1468
    /* Timers */
1469
    spr_register(env, SPR_40x_PIT, "PIT",
1470
                 SPR_NOACCESS, SPR_NOACCESS,
1471
                 &spr_read_40x_pit, &spr_write_40x_pit,
1472
                 0x00000000);
1473
    spr_register(env, SPR_40x_TCR, "TCR",
1474
                 SPR_NOACCESS, SPR_NOACCESS,
1475
                 &spr_read_generic, &spr_write_booke_tcr,
1476
                 0x00000000);
1477
    spr_register(env, SPR_40x_TSR, "TSR",
1478
                 SPR_NOACCESS, SPR_NOACCESS,
1479
                 &spr_read_generic, &spr_write_booke_tsr,
1480
                 0x00000000);
1481
    /* Debug interface */
1482
    /* XXX : not implemented */
1483
    spr_register(env, SPR_40x_DAC1, "DAC1",
1484
                 SPR_NOACCESS, SPR_NOACCESS,
1485
                 &spr_read_generic, &spr_write_generic,
1486
                 0x00000000);
1487
    spr_register(env, SPR_40x_DAC2, "DAC2",
1488
                 SPR_NOACCESS, SPR_NOACCESS,
1489
                 &spr_read_generic, &spr_write_generic,
1490
                 0x00000000);
1491
    /* XXX : not implemented */
1492
    spr_register(env, SPR_40x_DBCR0, "DBCR0",
1493
                 SPR_NOACCESS, SPR_NOACCESS,
1494
                 &spr_read_generic, &spr_write_generic,
1495
                 0x00000000);
1496
    /* XXX : not implemented */
1497
    spr_register(env, SPR_40x_DBSR, "DBSR",
1498
                 SPR_NOACCESS, SPR_NOACCESS,
1499
                 &spr_read_generic, &spr_write_generic,
1500
                 /* Last reset was system reset (system boot */
1501
                 0x00000300);
1502
    /* XXX : not implemented */
1503
    spr_register(env, SPR_40x_IAC1, "IAC1",
1504
                 SPR_NOACCESS, SPR_NOACCESS,
1505
                 &spr_read_generic, &spr_write_generic,
1506
                 0x00000000);
1507
    spr_register(env, SPR_40x_IAC2, "IAC2",
1508
                 SPR_NOACCESS, SPR_NOACCESS,
1509
                 &spr_read_generic, &spr_write_generic,
1510
                 0x00000000);
1511
}
1512

    
1513
/* SPR specific to PowerPC 405 implementation */
1514
static void gen_spr_405 (CPUPPCState *env)
1515
{
1516
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1517
                 SPR_NOACCESS, SPR_NOACCESS,
1518
                 &spr_read_generic, &spr_write_generic,
1519
                 0x00700000);
1520
    /* Debug */
1521
    /* XXX : not implemented */
1522
    spr_register(env, SPR_405_DBCR1, "DBCR1",
1523
                 SPR_NOACCESS, SPR_NOACCESS,
1524
                 &spr_read_generic, &spr_write_generic,
1525
                 0x00000000);
1526
    /* XXX : not implemented */
1527
    spr_register(env, SPR_405_DVC1, "DVC1",
1528
                 SPR_NOACCESS, SPR_NOACCESS,
1529
                 &spr_read_generic, &spr_write_generic,
1530
                 0x00000000);
1531
    /* XXX : not implemented */
1532
    spr_register(env, SPR_405_DVC2, "DVC2",
1533
                 SPR_NOACCESS, SPR_NOACCESS,
1534
                 &spr_read_generic, &spr_write_generic,
1535
                 0x00000000);
1536
    /* XXX : not implemented */
1537
    spr_register(env, SPR_405_IAC3, "IAC3",
1538
                 SPR_NOACCESS, SPR_NOACCESS,
1539
                 &spr_read_generic, &spr_write_generic,
1540
                 0x00000000);
1541
    /* XXX : not implemented */
1542
    spr_register(env, SPR_405_IAC4, "IAC4",
1543
                 SPR_NOACCESS, SPR_NOACCESS,
1544
                 &spr_read_generic, &spr_write_generic,
1545
                 0x00000000);
1546
    /* Storage control */
1547
    /* XXX : not implemented */
1548
    spr_register(env, SPR_405_SLER, "SLER",
1549
                 SPR_NOACCESS, SPR_NOACCESS,
1550
                 &spr_read_generic, &spr_write_generic,
1551
                 0x00000000);
1552
    /* XXX : not implemented */
1553
    spr_register(env, SPR_405_SU0R, "SU0R",
1554
                 SPR_NOACCESS, SPR_NOACCESS,
1555
                 &spr_read_generic, &spr_write_generic,
1556
                 0x00000000);
1557
    /* SPRG */
1558
    spr_register(env, SPR_USPRG0, "USPRG0",
1559
                 &spr_read_ureg, SPR_NOACCESS,
1560
                 &spr_read_ureg, SPR_NOACCESS,
1561
                 0x00000000);
1562
    spr_register(env, SPR_SPRG4, "SPRG4",
1563
                 SPR_NOACCESS, SPR_NOACCESS,
1564
                 SPR_NOACCESS, &spr_write_generic,
1565
                 0x00000000);
1566
    spr_register(env, SPR_USPRG4, "USPRG4",
1567
                 &spr_read_ureg, SPR_NOACCESS,
1568
                 &spr_read_ureg, SPR_NOACCESS,
1569
                 0x00000000);
1570
    spr_register(env, SPR_SPRG5, "SPRG5",
1571
                 SPR_NOACCESS, SPR_NOACCESS,
1572
                 SPR_NOACCESS, &spr_write_generic,
1573
                 0x00000000);
1574
    spr_register(env, SPR_USPRG5, "USPRG5",
1575
                 &spr_read_ureg, SPR_NOACCESS,
1576
                 &spr_read_ureg, SPR_NOACCESS,
1577
                 0x00000000);
1578
    spr_register(env, SPR_SPRG6, "SPRG6",
1579
                 SPR_NOACCESS, SPR_NOACCESS,
1580
                 SPR_NOACCESS, &spr_write_generic,
1581
                 0x00000000);
1582
    spr_register(env, SPR_USPRG6, "USPRG6",
1583
                 &spr_read_ureg, SPR_NOACCESS,
1584
                 &spr_read_ureg, SPR_NOACCESS,
1585
                 0x00000000);
1586
    spr_register(env, SPR_SPRG7, "SPRG7",
1587
                 SPR_NOACCESS, SPR_NOACCESS,
1588
                 SPR_NOACCESS, &spr_write_generic,
1589
                 0x00000000);
1590
    spr_register(env, SPR_USPRG7, "USPRG7",
1591
                 &spr_read_ureg, SPR_NOACCESS,
1592
                 &spr_read_ureg, SPR_NOACCESS,
1593
                 0x00000000);
1594
    /* Debug */
1595
    /* XXX : not implemented */
1596
    spr_register(env, SPR_40x_DAC2, "DAC2",
1597
                 SPR_NOACCESS, SPR_NOACCESS,
1598
                 &spr_read_generic, &spr_write_generic,
1599
                 0x00000000);
1600
    /* XXX : not implemented */
1601
    spr_register(env, SPR_40x_IAC2, "IAC2",
1602
                 SPR_NOACCESS, SPR_NOACCESS,
1603
                 &spr_read_generic, &spr_write_generic,
1604
                 0x00000000);
1605
}
1606

    
1607
/* SPR shared between PowerPC 401 & 403 implementations */
1608
static void gen_spr_401_403 (CPUPPCState *env)
1609
{
1610
    /* Time base */
1611
    spr_register(env, SPR_403_VTBL,  "TBL",
1612
                 &spr_read_tbl, SPR_NOACCESS,
1613
                 &spr_read_tbl, SPR_NOACCESS,
1614
                 0x00000000);
1615
    spr_register(env, SPR_403_TBL,   "TBL",
1616
                 SPR_NOACCESS, SPR_NOACCESS,
1617
                 SPR_NOACCESS, &spr_write_tbl,
1618
                 0x00000000);
1619
    spr_register(env, SPR_403_VTBU,  "TBU",
1620
                 &spr_read_tbu, SPR_NOACCESS,
1621
                 &spr_read_tbu, SPR_NOACCESS,
1622
                 0x00000000);
1623
    spr_register(env, SPR_403_TBU,   "TBU",
1624
                 SPR_NOACCESS, SPR_NOACCESS,
1625
                 SPR_NOACCESS, &spr_write_tbu,
1626
                 0x00000000);
1627
    /* Debug */
1628
    /* XXX: not implemented */
1629
    spr_register(env, SPR_403_CDBCR, "CDBCR",
1630
                 SPR_NOACCESS, SPR_NOACCESS,
1631
                 &spr_read_generic, &spr_write_generic,
1632
                 0x00000000);
1633
}
1634

    
1635
/* SPR specific to PowerPC 403 implementation */
1636
static void gen_spr_403 (CPUPPCState *env)
1637
{
1638
    /* MMU */
1639
    spr_register(env, SPR_403_PBL1,  "PBL1",
1640
                 SPR_NOACCESS, SPR_NOACCESS,
1641
                 &spr_read_403_pbr, &spr_write_403_pbr,
1642
                 0x00000000);
1643
    spr_register(env, SPR_403_PBU1,  "PBU1",
1644
                 SPR_NOACCESS, SPR_NOACCESS,
1645
                 &spr_read_403_pbr, &spr_write_403_pbr,
1646
                 0x00000000);
1647
    spr_register(env, SPR_403_PBL2,  "PBL2",
1648
                 SPR_NOACCESS, SPR_NOACCESS,
1649
                 &spr_read_403_pbr, &spr_write_403_pbr,
1650
                 0x00000000);
1651
    spr_register(env, SPR_403_PBU2,  "PBU2",
1652
                 SPR_NOACCESS, SPR_NOACCESS,
1653
                 &spr_read_403_pbr, &spr_write_403_pbr,
1654
                 0x00000000);
1655
    /* Debug */
1656
    /* XXX : not implemented */
1657
    spr_register(env, SPR_40x_DAC2, "DAC2",
1658
                 SPR_NOACCESS, SPR_NOACCESS,
1659
                 &spr_read_generic, &spr_write_generic,
1660
                 0x00000000);
1661
    /* XXX : not implemented */
1662
    spr_register(env, SPR_40x_IAC2, "IAC2",
1663
                 SPR_NOACCESS, SPR_NOACCESS,
1664
                 &spr_read_generic, &spr_write_generic,
1665
                 0x00000000);
1666
}
1667

    
1668
/* SPR specific to PowerPC compression coprocessor extension */
1669
#if defined (TODO)
1670
static void gen_spr_compress (CPUPPCState *env)
1671
{
1672
    spr_register(env, SPR_401_SKR, "SKR",
1673
                 SPR_NOACCESS, SPR_NOACCESS,
1674
                 &spr_read_generic, &spr_write_generic,
1675
                 0x00000000);
1676
}
1677
#endif
1678

    
1679
// XXX: TODO (64 bits PowerPC SPRs)
1680
/*
1681
 * ASR => SPR 280 (64 bits)
1682
 * FPECR => SPR 1022 (?)
1683
 * VRSAVE => SPR 256 (Altivec)
1684
 * SCOMC => SPR 276 (64 bits ?)
1685
 * SCOMD => SPR 277 (64 bits ?)
1686
 * HSPRG0 => SPR 304 (hypervisor)
1687
 * HSPRG1 => SPR 305 (hypervisor)
1688
 * HDEC => SPR 310 (hypervisor)
1689
 * HIOR => SPR 311 (hypervisor)
1690
 * RMOR => SPR 312 (970)
1691
 * HRMOR => SPR 313 (hypervisor)
1692
 * HSRR0 => SPR 314 (hypervisor)
1693
 * HSRR1 => SPR 315 (hypervisor)
1694
 * LPCR => SPR 316 (970)
1695
 * LPIDR => SPR 317 (970)
1696
 * ... and more (thermal management, performance counters, ...)
1697
 */
1698

    
1699
static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
1700
{
1701
    env->reserve = -1;
1702
    /* Default MMU definitions */
1703
    env->nb_BATs = -1;
1704
    env->nb_tlb = 0;
1705
    env->nb_ways = 0;
1706
    /* XXX: missing:
1707
     * 32 bits PowerPC:
1708
     * - MPC5xx(x)
1709
     * - MPC8xx(x)
1710
     * - RCPU (same as MPC5xx ?)
1711
     */
1712
    spr_register(env, SPR_PVR, "PVR",
1713
                 SPR_NOACCESS, SPR_NOACCESS,
1714
                 &spr_read_generic, SPR_NOACCESS,
1715
                 def->pvr);
1716
    printf("%s: PVR %08x mask %08x => %08x\n", __func__,
1717
           def->pvr, def->pvr_mask, def->pvr & def->pvr_mask);
1718
    switch (def->pvr & def->pvr_mask) {
1719
        /* Embedded PowerPC from IBM                           */
1720
    case CPU_PPC_401A1:   /* 401 A1 family                 */
1721
    case CPU_PPC_401B2:   /* 401 B2 family                 */
1722
    case CPU_PPC_401C2:   /* 401 C2 family                 */
1723
    case CPU_PPC_401D2:   /* 401 D2 family                 */
1724
    case CPU_PPC_401E2:   /* 401 E2 family                 */
1725
    case CPU_PPC_401F2:   /* 401 F2 family                 */
1726
    case CPU_PPC_401G2:   /* 401 G2 family                 */
1727
    case CPU_PPC_IOP480:  /* IOP 480 family                */
1728
    case CPU_PPC_COBRA:   /* IBM Processor for Network Resources */
1729
        gen_spr_generic(env);
1730
        gen_spr_40x(env);
1731
        gen_spr_401_403(env);
1732
#if defined (TODO)
1733
        /* XXX: optional ? */
1734
        gen_spr_compress(env);
1735
#endif
1736
        env->nb_BATs = 0;
1737
        env->nb_tlb = 64;
1738
        env->nb_ways = 1;
1739
        env->id_tlbs = 0;
1740
        break;
1741

    
1742
    case CPU_PPC_403GA:   /* 403 GA family                 */
1743
    case CPU_PPC_403GB:   /* 403 GB family                 */
1744
    case CPU_PPC_403GC:   /* 403 GC family                 */
1745
    case CPU_PPC_403GCX:  /* 403 GCX family                */
1746
        gen_spr_generic(env);
1747
        gen_spr_40x(env);
1748
        gen_spr_401_403(env);
1749
        gen_spr_403(env);
1750
        env->nb_BATs = 0;
1751
        env->nb_tlb = 64;
1752
        env->nb_ways = 1;
1753
        env->id_tlbs = 0;
1754
        break;
1755

    
1756
    case CPU_PPC_405CR:   /* 405 GP/CR family              */
1757
    case CPU_PPC_405EP:   /* 405 EP family                 */
1758
    case CPU_PPC_405GPR:  /* 405 GPR family                */
1759
    case CPU_PPC_405D2:   /* 405 D2 family                 */
1760
    case CPU_PPC_405D4:   /* 405 D4 family                 */
1761
        gen_spr_generic(env);
1762
        /* Time base */
1763
        gen_tbl(env);
1764
        gen_spr_40x(env);
1765
        gen_spr_405(env);
1766
        env->nb_BATs = 0;
1767
        env->nb_tlb = 64;
1768
        env->nb_ways = 1;
1769
        env->id_tlbs = 0;
1770
        break;
1771

    
1772
    case CPU_PPC_NPE405H: /* NPe405 H family               */
1773
    case CPU_PPC_NPE405H2:
1774
    case CPU_PPC_NPE405L: /* Npe405 L family               */
1775
        gen_spr_generic(env);
1776
        /* Time base */
1777
        gen_tbl(env);
1778
        gen_spr_40x(env);
1779
        gen_spr_405(env);
1780
        env->nb_BATs = 0;
1781
        env->nb_tlb = 64;
1782
        env->nb_ways = 1;
1783
        env->id_tlbs = 0;
1784
        break;
1785

    
1786
#if defined (TODO)
1787
    case CPU_PPC_STB01000:
1788
#endif
1789
#if defined (TODO)
1790
    case CPU_PPC_STB01010:
1791
#endif
1792
#if defined (TODO)
1793
    case CPU_PPC_STB0210:
1794
#endif
1795
    case CPU_PPC_STB03:   /* STB03 family                  */
1796
#if defined (TODO)
1797
    case CPU_PPC_STB043:  /* STB043 family                  */
1798
#endif
1799
#if defined (TODO)
1800
    case CPU_PPC_STB045:  /* STB045 family                  */
1801
#endif
1802
    case CPU_PPC_STB25:   /* STB25 family                  */
1803
#if defined (TODO)
1804
    case CPU_PPC_STB130:  /* STB130 family                 */
1805
#endif
1806
        gen_spr_generic(env);
1807
        /* Time base */
1808
        gen_tbl(env);
1809
        gen_spr_40x(env);
1810
        gen_spr_405(env);
1811
        env->nb_BATs = 0;
1812
        env->nb_tlb = 64;
1813
        env->nb_ways = 1;
1814
        env->id_tlbs = 0;
1815
        break;
1816

    
1817
    case CPU_PPC_440EP:   /* 440 EP family                 */
1818
    case CPU_PPC_440GP:   /* 440 GP family                 */
1819
    case CPU_PPC_440GX:   /* 440 GX family                 */
1820
    case CPU_PPC_440GXc:  /* 440 GXc family                */
1821
    case CPU_PPC_440GXf:  /* 440 GXf family                */
1822
    case CPU_PPC_440SP:   /* 440 SP family                 */
1823
    case CPU_PPC_440SP2:
1824
    case CPU_PPC_440SPE:  /* 440 SPE family                */
1825
        gen_spr_generic(env);
1826
        /* Time base */
1827
        gen_tbl(env);
1828
        gen_spr_BookE(env);
1829
        gen_spr_440(env);
1830
        env->nb_BATs = 0;
1831
        env->nb_tlb = 64;
1832
        env->nb_ways = 1;
1833
        env->id_tlbs = 0;
1834
        break;
1835

    
1836
        /* Embedded PowerPC from Freescale                     */
1837
#if defined (TODO)
1838
    case CPU_PPC_5xx:
1839
        break;
1840
#endif
1841
#if defined (TODO)
1842
    case CPU_PPC_8xx:     /* MPC821 / 823 / 850 / 860      */
1843
        break;
1844
#endif
1845
#if defined (TODO)
1846
    case CPU_PPC_82xx_HIP3:    /* MPC8240 / 8260                */
1847
    case CPU_PPC_82xx_HIP4:    /* MPC8240 / 8260                */
1848
        break;
1849
#endif
1850
#if defined (TODO)
1851
    case CPU_PPC_827x:    /* MPC 827x / 828x               */
1852
        break;
1853
#endif
1854

    
1855
        /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
1856
    case CPU_PPC_e500v110:
1857
    case CPU_PPC_e500v120:
1858
    case CPU_PPC_e500v210:
1859
    case CPU_PPC_e500v220:
1860
        gen_spr_generic(env);
1861
        /* Time base */
1862
        gen_tbl(env);
1863
        gen_spr_BookE(env);
1864
        env->nb_BATs = 0;
1865
        env->nb_tlb = 64;
1866
        env->nb_ways = 1;
1867
        env->id_tlbs = 0;
1868
        break;
1869

    
1870
#if defined (TODO)
1871
    case CPU_PPC_e600:
1872
        break;
1873
#endif
1874

    
1875
        /* 32 bits PowerPC                                     */
1876
    case CPU_PPC_601:     /* PowerPC 601                   */
1877
        gen_spr_generic(env);
1878
        gen_spr_ne_601(env);
1879
        gen_spr_601(env);
1880
        /* Hardware implementation registers */
1881
        /* XXX : not implemented */
1882
        spr_register(env, SPR_HID0, "HID0",
1883
                     SPR_NOACCESS, SPR_NOACCESS,
1884
                     &spr_read_generic, &spr_write_generic,
1885
                     0x00000000);
1886
        /* XXX : not implemented */
1887
        spr_register(env, SPR_HID1, "HID1",
1888
                     SPR_NOACCESS, SPR_NOACCESS,
1889
                     &spr_read_generic, &spr_write_generic,
1890
                     0x00000000);
1891
        /* XXX : not implemented */
1892
        spr_register(env, SPR_601_HID2, "HID2",
1893
                     SPR_NOACCESS, SPR_NOACCESS,
1894
                     &spr_read_generic, &spr_write_generic,
1895
                     0x00000000);
1896
        /* XXX : not implemented */
1897
        spr_register(env, SPR_601_HID5, "HID5",
1898
                     SPR_NOACCESS, SPR_NOACCESS,
1899
                     &spr_read_generic, &spr_write_generic,
1900
                     0x00000000);
1901
        /* XXX : not implemented */
1902
#if 0 /* ? */
1903
        spr_register(env, SPR_601_HID15, "HID15",
1904
                     SPR_NOACCESS, SPR_NOACCESS,
1905
                     &spr_read_generic, &spr_write_generic,
1906
                     0x00000000);
1907
#endif
1908
        env->nb_tlb = 64;
1909
        env->nb_ways = 2;
1910
        env->id_tlbs = 0;
1911
        env->id_tlbs = 0;
1912
        break;
1913

    
1914
    case CPU_PPC_602:     /* PowerPC 602                   */
1915
        gen_spr_generic(env);
1916
        gen_spr_ne_601(env);
1917
        /* Memory management */
1918
        gen_low_BATs(env);
1919
        /* Time base */
1920
        gen_tbl(env);
1921
        gen_6xx_7xx_soft_tlb(env, 64, 2);
1922
        gen_spr_602(env);
1923
        /* hardware implementation registers */
1924
        /* XXX : not implemented */
1925
        spr_register(env, SPR_HID0, "HID0",
1926
                     SPR_NOACCESS, SPR_NOACCESS,
1927
                     &spr_read_generic, &spr_write_generic,
1928
                     0x00000000);
1929
        /* XXX : not implemented */
1930
        spr_register(env, SPR_HID1, "HID1",
1931
                     SPR_NOACCESS, SPR_NOACCESS,
1932
                     &spr_read_generic, &spr_write_generic,
1933
                     0x00000000);
1934
        break;
1935

    
1936
    case CPU_PPC_603:     /* PowerPC 603                   */
1937
    case CPU_PPC_603E:    /* PowerPC 603e                  */
1938
    case CPU_PPC_603E7v:
1939
    case CPU_PPC_603E7v2:
1940
    case CPU_PPC_603P:    /* PowerPC 603p                  */
1941
    case CPU_PPC_603R:    /* PowerPC 603r                  */
1942
        gen_spr_generic(env);
1943
        gen_spr_ne_601(env);
1944
        /* Memory management */
1945
        gen_low_BATs(env);
1946
        /* Time base */
1947
        gen_tbl(env);
1948
        gen_6xx_7xx_soft_tlb(env, 64, 2);
1949
        gen_spr_603(env);
1950
        /* hardware implementation registers */
1951
        /* XXX : not implemented */
1952
        spr_register(env, SPR_HID0, "HID0",
1953
                     SPR_NOACCESS, SPR_NOACCESS,
1954
                     &spr_read_generic, &spr_write_generic,
1955
                     0x00000000);
1956
        /* XXX : not implemented */
1957
        spr_register(env, SPR_HID1, "HID1",
1958
                     SPR_NOACCESS, SPR_NOACCESS,
1959
                     &spr_read_generic, &spr_write_generic,
1960
                     0x00000000);
1961
        break;
1962
        
1963
    case CPU_PPC_G2:      /* PowerPC G2 family             */
1964
    case CPU_PPC_G2H4:
1965
    case CPU_PPC_G2gp:
1966
    case CPU_PPC_G2ls:
1967
    case CPU_PPC_G2LE:    /* PowerPC G2LE family           */
1968
    case CPU_PPC_G2LEgp:
1969
    case CPU_PPC_G2LEls:
1970
        gen_spr_generic(env);
1971
        gen_spr_ne_601(env);
1972
        /* Memory management */
1973
        gen_low_BATs(env);
1974
        /* Time base */
1975
        gen_tbl(env);
1976
        /* Memory management */
1977
        gen_high_BATs(env);
1978
        gen_6xx_7xx_soft_tlb(env, 64, 2);
1979
        gen_spr_G2_755(env);
1980
        gen_spr_G2(env);
1981
        /* Hardware implementation register */
1982
        /* XXX : not implemented */
1983
        spr_register(env, SPR_HID0, "HID0",
1984
                     SPR_NOACCESS, SPR_NOACCESS,
1985
                     &spr_read_generic, &spr_write_generic,
1986
                     0x00000000);
1987
        /* XXX : not implemented */
1988
        spr_register(env, SPR_HID1, "HID1",
1989
                     SPR_NOACCESS, SPR_NOACCESS,
1990
                     &spr_read_generic, &spr_write_generic,
1991
                     0x00000000);
1992
        /* XXX : not implemented */
1993
        spr_register(env, SPR_HID2, "HID2",
1994
                     SPR_NOACCESS, SPR_NOACCESS,
1995
                     &spr_read_generic, &spr_write_generic,
1996
                     0x00000000);
1997
        break;
1998

    
1999
    case CPU_PPC_604:     /* PowerPC 604                   */
2000
    case CPU_PPC_604E:    /* PowerPC 604e                  */
2001
    case CPU_PPC_604R:    /* PowerPC 604r                  */
2002
        gen_spr_generic(env);
2003
        gen_spr_ne_601(env);
2004
        /* Memory management */
2005
        gen_low_BATs(env);
2006
        /* Time base */
2007
        gen_tbl(env);
2008
        gen_spr_604(env);
2009
        /* Hardware implementation registers */
2010
        /* XXX : not implemented */
2011
        spr_register(env, SPR_HID0, "HID0",
2012
                     SPR_NOACCESS, SPR_NOACCESS,
2013
                     &spr_read_generic, &spr_write_generic,
2014
                     0x00000000);
2015
        /* XXX : not implemented */
2016
        spr_register(env, SPR_HID1, "HID1",
2017
                     SPR_NOACCESS, SPR_NOACCESS,
2018
                     &spr_read_generic, &spr_write_generic,
2019
                     0x00000000);
2020
        break;
2021

    
2022
    case CPU_PPC_74x:     /* PowerPC 740 / 750             */
2023
    case CPU_PPC_740E:
2024
    case CPU_PPC_750E:
2025
    case CPU_PPC_74xP:    /* PowerPC 740P / 750P           */
2026
    case CPU_PPC_750CXE21: /* IBM PowerPC 750cxe            */
2027
    case CPU_PPC_750CXE22:
2028
    case CPU_PPC_750CXE23:
2029
    case CPU_PPC_750CXE24:
2030
    case CPU_PPC_750CXE24b:
2031
    case CPU_PPC_750CXE31:
2032
    case CPU_PPC_750CXE31b:
2033
    case CPU_PPC_750CXR:
2034
        gen_spr_generic(env);
2035
        gen_spr_ne_601(env);
2036
        /* Memory management */
2037
        gen_low_BATs(env);
2038
        /* Time base */
2039
        gen_tbl(env);
2040
        gen_spr_7xx(env);
2041
        /* Hardware implementation registers */
2042
        /* XXX : not implemented */
2043
        spr_register(env, SPR_HID0, "HID0",
2044
                     SPR_NOACCESS, SPR_NOACCESS,
2045
                     &spr_read_generic, &spr_write_generic,
2046
                     0x00000000);
2047
        /* XXX : not implemented */
2048
        spr_register(env, SPR_HID1, "HID1",
2049
                     SPR_NOACCESS, SPR_NOACCESS,
2050
                     &spr_read_generic, &spr_write_generic,
2051
                     0x00000000);
2052
        break;
2053

    
2054
    case CPU_PPC_750FX10: /* IBM PowerPC 750 FX            */
2055
    case CPU_PPC_750FX20:
2056
    case CPU_PPC_750FX21:
2057
    case CPU_PPC_750FX22:
2058
    case CPU_PPC_750FX23:
2059
    case CPU_PPC_750GX10: /* IBM PowerPC 750 GX            */
2060
    case CPU_PPC_750GX11:
2061
    case CPU_PPC_750GX12:
2062
        gen_spr_generic(env);
2063
        gen_spr_ne_601(env);
2064
        /* Memory management */
2065
        gen_low_BATs(env);
2066
        /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2067
        gen_high_BATs(env);
2068
        /* Time base */
2069
        gen_tbl(env);
2070
        gen_spr_7xx(env);
2071
        /* Hardware implementation registers */
2072
        /* XXX : not implemented */
2073
        spr_register(env, SPR_HID0, "HID0",
2074
                     SPR_NOACCESS, SPR_NOACCESS,
2075
                     &spr_read_generic, &spr_write_generic,
2076
                     0x00000000);
2077
        /* XXX : not implemented */
2078
        spr_register(env, SPR_HID1, "HID1",
2079
                     SPR_NOACCESS, SPR_NOACCESS,
2080
                     &spr_read_generic, &spr_write_generic,
2081
                     0x00000000);
2082
        /* XXX : not implemented */
2083
        spr_register(env, SPR_750_HID2, "HID2",
2084
                     SPR_NOACCESS, SPR_NOACCESS,
2085
                     &spr_read_generic, &spr_write_generic,
2086
                     0x00000000);
2087
        break;
2088

    
2089
    case CPU_PPC_755_10:  /* PowerPC 755                   */
2090
    case CPU_PPC_755_11:
2091
    case CPU_PPC_755_20:
2092
    case CPU_PPC_755D:
2093
    case CPU_PPC_755E:
2094
        gen_spr_generic(env);
2095
        gen_spr_ne_601(env);
2096
        /* Memory management */
2097
        gen_low_BATs(env);
2098
        /* Time base */
2099
        gen_tbl(env);
2100
        /* Memory management */
2101
        gen_high_BATs(env);
2102
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2103
        gen_spr_G2_755(env);
2104
        /* L2 cache control */
2105
        /* XXX : not implemented */
2106
        spr_register(env, SPR_ICTC, "ICTC",
2107
                     SPR_NOACCESS, SPR_NOACCESS,
2108
                     &spr_read_generic, &spr_write_generic,
2109
                     0x00000000);
2110
        /* XXX : not implemented */
2111
        spr_register(env, SPR_L2PM, "L2PM",
2112
                     SPR_NOACCESS, SPR_NOACCESS,
2113
                     &spr_read_generic, &spr_write_generic,
2114
                     0x00000000);
2115
        /* Hardware implementation registers */
2116
        /* XXX : not implemented */
2117
        spr_register(env, SPR_HID0, "HID0",
2118
                     SPR_NOACCESS, SPR_NOACCESS,
2119
                     &spr_read_generic, &spr_write_generic,
2120
                     0x00000000);
2121
        /* XXX : not implemented */
2122
        spr_register(env, SPR_HID1, "HID1",
2123
                     SPR_NOACCESS, SPR_NOACCESS,
2124
                     &spr_read_generic, &spr_write_generic,
2125
                     0x00000000);
2126
        /* XXX : not implemented */
2127
        spr_register(env, SPR_HID2, "HID2",
2128
                     SPR_NOACCESS, SPR_NOACCESS,
2129
                     &spr_read_generic, &spr_write_generic,
2130
                     0x00000000);
2131
        break;
2132

    
2133
#if defined (TODO)
2134
        /* G4 family */
2135
    case CPU_PPC_7400:    /* PowerPC 7400                  */
2136
    case CPU_PPC_7410C:   /* PowerPC 7410                  */
2137
    case CPU_PPC_7410D:
2138
    case CPU_PPC_7410E:
2139
    case CPU_PPC_7441:    /* PowerPC 7441                  */
2140
    case CPU_PPC_7445:    /* PowerPC 7445                  */
2141
    case CPU_PPC_7447:    /* PowerPC 7447                  */
2142
    case CPU_PPC_7447A:   /* PowerPC 7447A                 */
2143
    case CPU_PPC_7448:    /* PowerPC 7448                  */
2144
    case CPU_PPC_7450:    /* PowerPC 7450                  */
2145
    case CPU_PPC_7450b:
2146
    case CPU_PPC_7451:    /* PowerPC 7451                  */
2147
    case CPU_PPC_7451G:
2148
    case CPU_PPC_7455:    /* PowerPC 7455                  */
2149
    case CPU_PPC_7455F:
2150
    case CPU_PPC_7455G:
2151
    case CPU_PPC_7457:    /* PowerPC 7457                  */
2152
    case CPU_PPC_7457C:
2153
    case CPU_PPC_7457A:   /* PowerPC 7457A                 */
2154
        break;
2155
#endif
2156

    
2157
#if defined (TODO)
2158
        /* 64 bits PowerPC                                     */
2159
    case CPU_PPC_620:     /* PowerPC 620                   */
2160
    case CPU_PPC_630:     /* PowerPC 630 (Power 3)         */
2161
    case CPU_PPC_631:     /* PowerPC 631 (Power 3+)        */
2162
    case CPU_PPC_POWER4:  /* Power 4                       */
2163
    case CPU_PPC_POWER4P: /* Power 4+                      */
2164
    case CPU_PPC_POWER5:  /* Power 5                       */
2165
    case CPU_PPC_POWER5P: /* Power 5+                      */
2166
    case CPU_PPC_970:     /* PowerPC 970                   */
2167
    case CPU_PPC_970FX10: /* PowerPC 970 FX                */
2168
    case CPU_PPC_970FX20:
2169
    case CPU_PPC_970FX21:
2170
    case CPU_PPC_970FX30:
2171
    case CPU_PPC_970FX31:
2172
    case CPU_PPC_970MP10: /* PowerPC 970 MP                */
2173
    case CPU_PPC_970MP11:
2174
    case CPU_PPC_CELL10:  /* Cell family                   */
2175
    case CPU_PPC_CELL20:
2176
    case CPU_PPC_CELL30:
2177
    case CPU_PPC_CELL31:
2178
    case CPU_PPC_RS64:    /* Apache (RS64/A35)             */
2179
    case CPU_PPC_RS64II:  /* NorthStar (RS64-II/A50)       */
2180
    case CPU_PPC_RS64III: /* Pulsar (RS64-III)             */
2181
    case CPU_PPC_RS64IV:  /* IceStar/IStar/SStar (RS64-IV) */
2182
        break;
2183
#endif
2184

    
2185
#if defined (TODO)
2186
        /* POWER                                               */
2187
    case CPU_POWER:       /* POWER                         */
2188
    case CPU_POWER2:      /* POWER2                        */
2189
        break;
2190
#endif
2191

    
2192
    default:
2193
        gen_spr_generic(env);
2194
        break;
2195
    }
2196
    if (env->nb_BATs == -1)
2197
        env->nb_BATs = 4;
2198
    /* Allocate TLBs buffer when needed */
2199
    if (env->nb_tlb != 0) {
2200
        int nb_tlb = env->nb_tlb;
2201
        if (env->id_tlbs != 0)
2202
            nb_tlb *= 2;
2203
        env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
2204
        /* Pre-compute some useful values */
2205
        env->tlb_per_way = env->nb_tlb / env->nb_ways;
2206
    }
2207
}
2208

    
2209
#if defined(PPC_DUMP_CPU)
2210
static void dump_sprs (CPUPPCState *env)
2211
{
2212
    ppc_spr_t *spr;
2213
    uint32_t pvr = env->spr[SPR_PVR];
2214
    uint32_t sr, sw, ur, uw;
2215
    int i, j, n;
2216

    
2217
    printf("* SPRs for PVR=%08x\n", pvr);
2218
    for (i = 0; i < 32; i++) {
2219
        for (j = 0; j < 32; j++) {
2220
            n = (i << 5) | j;
2221
            spr = &env->spr_cb[n];
2222
#if !defined(CONFIG_USER_ONLY)
2223
            sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
2224
            sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
2225
#else
2226
            sw = 0;
2227
            sr = 0;
2228
#endif
2229
            uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
2230
            ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
2231
            if (sw || sr || uw || ur) {
2232
                printf("%4d (%03x) %8s s%c%c u%c%c\n",
2233
                       (i << 5) | j, (i << 5) | j, spr->name,
2234
                       sw ? 'w' : '-', sr ? 'r' : '-',
2235
                       uw ? 'w' : '-', ur ? 'r' : '-');
2236
            }
2237
        }
2238
    }
2239
    fflush(stdout);
2240
    fflush(stderr);
2241
}
2242
#endif
2243

    
2244
/*****************************************************************************/
2245
#include <stdlib.h>
2246
#include <string.h>
2247

    
2248
int fflush (FILE *stream);
2249

    
2250
/* Opcode types */
2251
enum {
2252
    PPC_DIRECT   = 0, /* Opcode routine        */
2253
    PPC_INDIRECT = 1, /* Indirect opcode table */
2254
};
2255

    
2256
static inline int is_indirect_opcode (void *handler)
2257
{
2258
    return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
2259
}
2260

    
2261
static inline opc_handler_t **ind_table(void *handler)
2262
{
2263
    return (opc_handler_t **)((unsigned long)handler & ~3);
2264
}
2265

    
2266
/* Instruction table creation */
2267
/* Opcodes tables creation */
2268
static void fill_new_table (opc_handler_t **table, int len)
2269
{
2270
    int i;
2271

    
2272
    for (i = 0; i < len; i++)
2273
        table[i] = &invalid_handler;
2274
}
2275

    
2276
static int create_new_table (opc_handler_t **table, unsigned char idx)
2277
{
2278
    opc_handler_t **tmp;
2279

    
2280
    tmp = malloc(0x20 * sizeof(opc_handler_t));
2281
    if (tmp == NULL)
2282
        return -1;
2283
    fill_new_table(tmp, 0x20);
2284
    table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
2285

    
2286
    return 0;
2287
}
2288

    
2289
static int insert_in_table (opc_handler_t **table, unsigned char idx,
2290
                            opc_handler_t *handler)
2291
{
2292
    if (table[idx] != &invalid_handler)
2293
        return -1;
2294
    table[idx] = handler;
2295

    
2296
    return 0;
2297
}
2298

    
2299
static int register_direct_insn (opc_handler_t **ppc_opcodes,
2300
                                 unsigned char idx, opc_handler_t *handler)
2301
{
2302
    if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
2303
        printf("*** ERROR: opcode %02x already assigned in main "
2304
               "opcode table\n", idx);
2305
        return -1;
2306
    }
2307

    
2308
    return 0;
2309
}
2310

    
2311
static int register_ind_in_table (opc_handler_t **table,
2312
                                  unsigned char idx1, unsigned char idx2,
2313
                                  opc_handler_t *handler)
2314
{
2315
    if (table[idx1] == &invalid_handler) {
2316
        if (create_new_table(table, idx1) < 0) {
2317
            printf("*** ERROR: unable to create indirect table "
2318
                   "idx=%02x\n", idx1);
2319
            return -1;
2320
        }
2321
    } else {
2322
        if (!is_indirect_opcode(table[idx1])) {
2323
            printf("*** ERROR: idx %02x already assigned to a direct "
2324
                   "opcode\n", idx1);
2325
            return -1;
2326
        }
2327
    }
2328
    if (handler != NULL &&
2329
        insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
2330
        printf("*** ERROR: opcode %02x already assigned in "
2331
               "opcode table %02x\n", idx2, idx1);
2332
        return -1;
2333
    }
2334

    
2335
    return 0;
2336
}
2337

    
2338
static int register_ind_insn (opc_handler_t **ppc_opcodes,
2339
                              unsigned char idx1, unsigned char idx2,
2340
                              opc_handler_t *handler)
2341
{
2342
    int ret;
2343

    
2344
    ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
2345

    
2346
    return ret;
2347
}
2348

    
2349
static int register_dblind_insn (opc_handler_t **ppc_opcodes, 
2350
                                 unsigned char idx1, unsigned char idx2,
2351
                                 unsigned char idx3, opc_handler_t *handler)
2352
{
2353
    if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
2354
        printf("*** ERROR: unable to join indirect table idx "
2355
               "[%02x-%02x]\n", idx1, idx2);
2356
        return -1;
2357
    }
2358
    if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
2359
                              handler) < 0) {
2360
        printf("*** ERROR: unable to insert opcode "
2361
               "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
2362
        return -1;
2363
    }
2364

    
2365
    return 0;
2366
}
2367

    
2368
static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
2369
{
2370
    if (insn->opc2 != 0xFF) {
2371
        if (insn->opc3 != 0xFF) {
2372
            if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
2373
                                     insn->opc3, &insn->handler) < 0)
2374
                return -1;
2375
        } else {
2376
            if (register_ind_insn(ppc_opcodes, insn->opc1,
2377
                                  insn->opc2, &insn->handler) < 0)
2378
                return -1;
2379
        }
2380
    } else {
2381
        if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
2382
            return -1;
2383
    }
2384

    
2385
    return 0;
2386
}
2387

    
2388
static int test_opcode_table (opc_handler_t **table, int len)
2389
{
2390
    int i, count, tmp;
2391

    
2392
    for (i = 0, count = 0; i < len; i++) {
2393
        /* Consistency fixup */
2394
        if (table[i] == NULL)
2395
            table[i] = &invalid_handler;
2396
        if (table[i] != &invalid_handler) {
2397
            if (is_indirect_opcode(table[i])) {
2398
                tmp = test_opcode_table(ind_table(table[i]), 0x20);
2399
                if (tmp == 0) {
2400
                    free(table[i]);
2401
                    table[i] = &invalid_handler;
2402
                } else {
2403
                    count++;
2404
                }
2405
            } else {
2406
                count++;
2407
            }
2408
        }
2409
    }
2410

    
2411
    return count;
2412
}
2413

    
2414
static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
2415
{
2416
    if (test_opcode_table(ppc_opcodes, 0x40) == 0)
2417
        printf("*** WARNING: no opcode defined !\n");
2418
}
2419

    
2420
/*****************************************************************************/
2421
static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
2422
{
2423
    opcode_t *opc, *start, *end;
2424

    
2425
    fill_new_table(env->opcodes, 0x40);
2426
#if defined(PPC_DUMP_CPU)
2427
    printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2428
           " %08x\n",
2429
           def->pvr, def->name, def->insns_flags, def->flags);
2430
#endif
2431
    if (&opc_start < &opc_end) {
2432
        start = &opc_start;
2433
        end = &opc_end;
2434
    } else {
2435
        start = &opc_end;
2436
        end = &opc_start;
2437
    }
2438
    for (opc = start + 1; opc != end; opc++) {
2439
        if ((opc->handler.type & def->insns_flags) != 0) {
2440
            if (register_insn(env->opcodes, opc) < 0) {
2441
                printf("*** ERROR initializing PowerPC instruction "
2442
                       "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
2443
                       opc->opc3);
2444
                return -1;
2445
            }
2446
#if defined(PPC_DUMP_CPU)
2447
            if (opc1 != 0x00) {
2448
                if (opc->opc3 == 0xFF) {
2449
                    if (opc->opc2 == 0xFF) {
2450
                        printf(" %02x -- -- (%2d ----) : %s\n",
2451
                               opc->opc1, opc->opc1, opc->oname);
2452
                    } else {
2453
                        printf(" %02x %02x -- (%2d %4d) : %s\n",
2454
                               opc->opc1, opc->opc2, opc->opc1, opc->opc2,
2455
                               opc->oname);
2456
                    }
2457
                } else {
2458
                    printf(" %02x %02x %02x (%2d %4d) : %s\n",
2459
                           opc->opc1, opc->opc2, opc->opc3,
2460
                           opc->opc1, (opc->opc3 << 5) | opc->opc2,
2461
                           opc->oname);
2462
                }
2463
            }
2464
#endif
2465
        }
2466
    }
2467
    fix_opcode_tables(env->opcodes);
2468
    fflush(stdout);
2469
    fflush(stderr);
2470

    
2471
    return 0;
2472
}
2473

    
2474
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
2475
{
2476
    env->msr_mask = def->msr_mask;
2477
    env->flags = def->flags;
2478
    if (create_ppc_opcodes(env, def) < 0)
2479
        return -1;
2480
    init_ppc_proc(env, def);
2481
#if defined(PPC_DUMP_CPU)
2482
    dump_sprs(env);
2483
    if (env->tlb != NULL) {
2484
        printf("%d %s TLB in %d ways\n", env->nb_tlb,
2485
               env->id_tlbs ? "splitted" : "merged", env->nb_ways);
2486
    }
2487
#endif
2488

    
2489
    return 0;
2490
}
2491

    
2492
void do_compute_hflags (CPUPPCState *env);
2493
CPUPPCState *cpu_ppc_init (void)
2494
{
2495
    CPUPPCState *env;
2496

    
2497
    env = qemu_mallocz(sizeof(CPUPPCState));
2498
    if (!env)
2499
        return NULL;
2500
    cpu_exec_init(env);
2501
    tlb_flush(env, 1);
2502
#if defined (DO_SINGLE_STEP) && 0
2503
    /* Single step trace mode */
2504
    msr_se = 1;
2505
    msr_be = 1;
2506
#endif
2507
    msr_fp = 1; /* Allow floating point exceptions */
2508
    msr_me = 1; /* Allow machine check exceptions  */
2509
#if defined(CONFIG_USER_ONLY)
2510
    msr_pr = 1;
2511
#else
2512
    env->nip = 0xFFFFFFFC;
2513
#endif
2514
    do_compute_hflags(env);
2515
    env->reserve = -1;
2516
    return env;
2517
}
2518

    
2519
void cpu_ppc_close(CPUPPCState *env)
2520
{
2521
    /* Should also remove all opcode tables... */
2522
    free(env);
2523
}
2524

    
2525
/*****************************************************************************/
2526
/* PowerPC CPU definitions */
2527
static ppc_def_t ppc_defs[] =
2528
    {
2529
        /* Embedded PowerPC */
2530
#if defined (TODO)
2531
        /* PowerPC 401 */
2532
        {
2533
            .name        = "401",
2534
            .pvr         = CPU_PPC_401,
2535
            .pvr_mask    = 0xFFFF0000,
2536
            .insns_flags = PPC_INSNS_401,
2537
            .flags       = PPC_FLAGS_401,
2538
            .msr_mask    = xxx,
2539
        },
2540
#endif
2541
#if defined (TODO)
2542
        /* IOP480 (401 microcontroler) */
2543
        {
2544
            .name        = "iop480",
2545
            .pvr         = CPU_PPC_IOP480,
2546
            .pvr_mask    = 0xFFFF0000,
2547
            .insns_flags = PPC_INSNS_401,
2548
            .flags       = PPC_FLAGS_401,
2549
            .msr_mask    = xxx,
2550
        },
2551
#endif
2552
#if defined (TODO)
2553
        /* IBM Processor for Network Resources */
2554
        {
2555
            .name        = "Cobra",
2556
            .pvr         = CPU_PPC_COBRA,
2557
            .pvr_mask    = 0xFFFF0000,
2558
            .insns_flags = PPC_INSNS_401,
2559
            .flags       = PPC_FLAGS_401,
2560
            .msr_mask    = xxx,
2561
        },
2562
#endif
2563
#if defined (TODO)
2564
        /* Generic PowerPC 403 */
2565
        {
2566
            .name        = "403",
2567
            .pvr         = CPU_PPC_403,
2568
            .pvr_mask    = 0xFFFFFF00,
2569
            .insns_flags = PPC_INSNS_403,
2570
            .flags       = PPC_FLAGS_403,
2571
            .msr_mask    = 0x000000000007D23D,
2572
        },
2573
#endif
2574
#if defined (TODO)
2575
        /* PowerPC 403 GA */
2576
        {
2577
            .name        = "403ga",
2578
            .pvr         = CPU_PPC_403GA,
2579
            .pvr_mask    = 0xFFFFFF00,
2580
            .insns_flags = PPC_INSNS_403,
2581
            .flags       = PPC_FLAGS_403,
2582
            .msr_mask    = 0x000000000007D23D,
2583
        },
2584
#endif
2585
#if defined (TODO)
2586
        /* PowerPC 403 GB */
2587
        {
2588
            .name        = "403gb",
2589
            .pvr         = CPU_PPC_403GB,
2590
            .pvr_mask    = 0xFFFFFF00,
2591
            .insns_flags = PPC_INSNS_403,
2592
            .flags       = PPC_FLAGS_403,
2593
            .msr_mask    = 0x000000000007D23D,
2594
        },
2595
#endif
2596
#if defined (TODO)
2597
        /* PowerPC 403 GC */
2598
        {
2599
            .name        = "403gc",
2600
            .pvr         = CPU_PPC_403GC,
2601
            .pvr_mask    = 0xFFFFFF00,
2602
            .insns_flags = PPC_INSNS_403,
2603
            .flags       = PPC_FLAGS_403,
2604
            .msr_mask    = 0x000000000007D23D,
2605
        },
2606
#endif
2607
#if defined (TODO)
2608
        /* PowerPC 403 GCX */
2609
        {
2610
            .name        = "403gcx",
2611
            .pvr         = CPU_PPC_403GCX,
2612
            .pvr_mask    = 0xFFFFFF00,
2613
            .insns_flags = PPC_INSNS_403,
2614
            .flags       = PPC_FLAGS_403,
2615
            .msr_mask    = 0x000000000007D23D,
2616
        },
2617
#endif
2618
#if defined (TODO)
2619
        /* Generic PowerPC 405 */
2620
        {
2621
            .name        = "405",
2622
            .pvr         = CPU_PPC_405,
2623
            .pvr_mask    = 0xFFFF0000,
2624
            .insns_flags = PPC_INSNS_405,
2625
            .flags       = PPC_FLAGS_405,
2626
            .msr_mask    = 0x00000000020EFF30,
2627
        },
2628
#endif
2629
#if defined (TODO)
2630
        /* PowerPC 405 CR */
2631
        {
2632
            .name        = "405cr",
2633
            .pvr         = CPU_PPC_405,
2634
            .pvr_mask    = 0xFFFF0000,
2635
            .insns_flags = PPC_INSNS_405,
2636
            .flags       = PPC_FLAGS_405,
2637
            .msr_mask    = 0x00000000020EFF30,
2638
        },
2639
#endif
2640
#if defined (TODO)
2641
        /* PowerPC 405 GP */
2642
        {
2643
            .name        = "405gp",
2644
            .pvr         = CPU_PPC_405,
2645
            .pvr_mask    = 0xFFFF0000,
2646
            .insns_flags = PPC_INSNS_405,
2647
            .flags       = PPC_FLAGS_405,
2648
            .msr_mask    = 0x00000000020EFF30,
2649
        },
2650
#endif
2651
#if defined (TODO)
2652
        /* PowerPC 405 EP */
2653
        {
2654
            .name        = "405ep",
2655
            .pvr         = CPU_PPC_405EP,
2656
            .pvr_mask    = 0xFFFF0000,
2657
            .insns_flags = PPC_INSNS_405,
2658
            .flags       = PPC_FLAGS_405,
2659
            .msr_mask    = 0x00000000020EFF30,
2660
        },
2661
#endif
2662
#if defined (TODO)
2663
        /* PowerPC 405 GPR */
2664
        {
2665
            .name        = "405gpr",
2666
            .pvr         = CPU_PPC_405GPR,
2667
            .pvr_mask    = 0xFFFF0000,
2668
            .insns_flags = PPC_INSNS_405,
2669
            .flags       = PPC_FLAGS_405,
2670
            .msr_mask    = 0x00000000020EFF30,
2671
        },
2672
#endif
2673
#if defined (TODO)
2674
        /* PowerPC 405 D2 */
2675
        {
2676
            .name        = "405d2",
2677
            .pvr         = CPU_PPC_405D2,
2678
            .pvr_mask    = 0xFFFF0000,
2679
            .insns_flags = PPC_INSNS_405,
2680
            .flags       = PPC_FLAGS_405,
2681
            .msr_mask    = 0x00000000020EFF30,
2682
        },
2683
#endif
2684
#if defined (TODO)
2685
        /* PowerPC 405 D4 */
2686
        {
2687
            .name        = "405d4",
2688
            .pvr         = CPU_PPC_405D4,
2689
            .pvr_mask    = 0xFFFF0000,
2690
            .insns_flags = PPC_INSNS_405,
2691
            .flags       = PPC_FLAGS_405,
2692
            .msr_mask    = 0x00000000020EFF30,
2693
        },
2694
#endif
2695
#if defined (TODO)
2696
        /* Npe405 H */
2697
        {
2698
            .name        = "Npe405H",
2699
            .pvr         = CPU_PPC_NPE405H,
2700
            .pvr_mask    = 0xFFFF0000,
2701
            .insns_flags = PPC_INSNS_405,
2702
            .flags       = PPC_FLAGS_405,
2703
            .msr_mask    = 0x00000000020EFF30,
2704
        },
2705
#endif
2706
#if defined (TODO)
2707
        /* Npe405 L */
2708
        {
2709
            .name        = "Npe405L",
2710
            .pvr         = CPU_PPC_NPE405L,
2711
            .pvr_mask    = 0xFFFF0000,
2712
            .insns_flags = PPC_INSNS_405,
2713
            .flags       = PPC_FLAGS_405,
2714
            .msr_mask    = 0x00000000020EFF30,
2715
        },
2716
#endif
2717
#if defined (TODO)
2718
        /* STB010000 */
2719
        {
2720
            .name        = "STB01000",
2721
            .pvr         = CPU_PPC_STB01000,
2722
            .pvr_mask    = 0xFFFF0000,
2723
            .insns_flags = PPC_INSNS_405,
2724
            .flags       = PPC_FLAGS_405,
2725
            .msr_mask    = 0x00000000020EFF30,
2726
        },
2727
#endif
2728
#if defined (TODO)
2729
        /* STB01010 */
2730
        {
2731
            .name        = "STB01010",
2732
            .pvr         = CPU_PPC_STB01010,
2733
            .pvr_mask    = 0xFFFF0000,
2734
            .insns_flags = PPC_INSNS_405,
2735
            .flags       = PPC_FLAGS_405,
2736
            .msr_mask    = 0x00000000020EFF30,
2737
        },
2738
#endif
2739
#if defined (TODO)
2740
        /* STB0210 */
2741
        {
2742
            .name        = "STB0210",
2743
            .pvr         = CPU_PPC_STB0210,
2744
            .pvr_mask    = 0xFFFF0000,
2745
            .insns_flags = PPC_INSNS_405,
2746
            .flags       = PPC_FLAGS_405,
2747
            .msr_mask    = 0x00000000020EFF30,
2748
        },
2749
#endif
2750
#if defined (TODO)
2751
        /* STB03xx */
2752
        {
2753
            .name        = "STB03",
2754
            .pvr         = CPU_PPC_STB03,
2755
            .pvr_mask    = 0xFFFF0000,
2756
            .insns_flags = PPC_INSNS_405,
2757
            .flags       = PPC_FLAGS_405,
2758
            .msr_mask    = 0x00000000020EFF30,
2759
        },
2760
#endif
2761
#if defined (TODO)
2762
        /* STB043x */
2763
        {
2764
            .name        = "STB043",
2765
            .pvr         = CPU_PPC_STB043,
2766
            .pvr_mask    = 0xFFFF0000,
2767
            .insns_flags = PPC_INSNS_405,
2768
            .flags       = PPC_FLAGS_405,
2769
            .msr_mask    = 0x00000000020EFF30,
2770
        },
2771
#endif
2772
#if defined (TODO)
2773
        /* STB045x */
2774
        {
2775
            .name        = "STB045",
2776
            .pvr         = CPU_PPC_STB045,
2777
            .pvr_mask    = 0xFFFF0000,
2778
            .insns_flags = PPC_INSNS_405,
2779
            .flags       = PPC_FLAGS_405,
2780
            .msr_mask    = 0x00000000020EFF30,
2781
        },
2782
#endif
2783
#if defined (TODO)
2784
        /* STB25xx */
2785
        {
2786
            .name        = "STB25",
2787
            .pvr         = CPU_PPC_STB25,
2788
            .pvr_mask    = 0xFFFF0000,
2789
            .insns_flags = PPC_INSNS_405,
2790
            .flags       = PPC_FLAGS_405,
2791
            .msr_mask    = 0x00000000020EFF30,
2792
        },
2793
#endif
2794
#if defined (TODO)
2795
        /* STB130 */
2796
        {
2797
            .name        = "STB130",
2798
            .pvr         = CPU_PPC_STB130,
2799
            .pvr_mask    = 0xFFFF0000,
2800
            .insns_flags = PPC_INSNS_405,
2801
            .flags       = PPC_FLAGS_405,
2802
            .msr_mask    = 0x00000000020EFF30,
2803
        },
2804
#endif
2805
        /* Xilinx PowerPC 405 cores */
2806
#if defined (TODO)
2807
        {
2808
            .name        = "x2vp4",
2809
            .pvr         = CPU_PPC_X2VP4,
2810
            .pvr_mask    = 0xFFFF0000,
2811
            .insns_flags = PPC_INSNS_405,
2812
            .flags       = PPC_FLAGS_405,
2813
            .msr_mask    = 0x00000000020EFF30,
2814
        },
2815
        {
2816
            .name        = "x2vp7",
2817
            .pvr         = CPU_PPC_X2VP7,
2818
            .pvr_mask    = 0xFFFF0000,
2819
            .insns_flags = PPC_INSNS_405,
2820
            .flags       = PPC_FLAGS_405,
2821
            .msr_mask    = 0x00000000020EFF30,
2822
        },
2823
        {
2824
            .name        = "x2vp20",
2825
            .pvr         = CPU_PPC_X2VP20,
2826
            .pvr_mask    = 0xFFFF0000,
2827
            .insns_flags = PPC_INSNS_405,
2828
            .flags       = PPC_FLAGS_405,
2829
            .msr_mask    = 0x00000000020EFF30,
2830
        },
2831
        {
2832
            .name        = "x2vp50",
2833
            .pvr         = CPU_PPC_X2VP50,
2834
            .pvr_mask    = 0xFFFF0000,
2835
            .insns_flags = PPC_INSNS_405,
2836
            .flags       = PPC_FLAGS_405,
2837
            .msr_mask    = 0x00000000020EFF30,
2838
        },
2839
#endif
2840
#if defined (TODO)
2841
        /* PowerPC 440 EP */
2842
        {
2843
            .name        = "440ep",
2844
            .pvr         = CPU_PPC_440EP,
2845
            .pvr_mask    = 0xFFFF0000,
2846
            .insns_flags = PPC_INSNS_440,
2847
            .flags       = PPC_FLAGS_440,
2848
            .msr_mask    = 0x000000000006D630,
2849
        },
2850
#endif
2851
#if defined (TODO)
2852
        /* PowerPC 440 GR */
2853
        {
2854
            .name        = "440gr",
2855
            .pvr         = CPU_PPC_440GR,
2856
            .pvr_mask    = 0xFFFF0000,
2857
            .insns_flags = PPC_INSNS_440,
2858
            .flags       = PPC_FLAGS_440,
2859
            .msr_mask    = 0x000000000006D630,
2860
        },
2861
#endif
2862
#if defined (TODO)
2863
        /* PowerPC 440 GP */
2864
        {
2865
            .name        = "440gp",
2866
            .pvr         = CPU_PPC_440GP,
2867
            .pvr_mask    = 0xFFFFFF00,
2868
            .insns_flags = PPC_INSNS_440,
2869
            .flags       = PPC_FLAGS_440,
2870
            .msr_mask    = 0x000000000006D630,
2871
        },
2872
#endif
2873
#if defined (TODO)
2874
        /* PowerPC 440 GX */
2875
        {
2876
            .name        = "440gx",
2877
            .pvr         = CPU_PPC_440GX,
2878
            .pvr_mask    = 0xFFFF0000,
2879
            .insns_flags = PPC_INSNS_405,
2880
            .flags       = PPC_FLAGS_440,
2881
            .msr_mask    = 0x000000000006D630,
2882
        },
2883
#endif
2884
#if defined (TODO)
2885
        /* PowerPC 440 GXc */
2886
        {
2887
            .name        = "440gxc",
2888
            .pvr         = CPU_PPC_440GXC,
2889
            .pvr_mask    = 0xFFFF0000,
2890
            .insns_flags = PPC_INSNS_405,
2891
            .flags       = PPC_FLAGS_440,
2892
            .msr_mask    = 0x000000000006D630,
2893
        },
2894
#endif
2895
#if defined (TODO)
2896
        /* PowerPC 440 GXf */
2897
        {
2898
            .name        = "440gxf",
2899
            .pvr         = CPU_PPC_440GXF,
2900
            .pvr_mask    = 0xFFFF0000,
2901
            .insns_flags = PPC_INSNS_405,
2902
            .flags       = PPC_FLAGS_440,
2903
            .msr_mask    = 0x000000000006D630,
2904
        },
2905
#endif
2906
#if defined (TODO)
2907
        /* PowerPC 440 SP */
2908
        {
2909
            .name        = "440sp",
2910
            .pvr         = CPU_PPC_440SP,
2911
            .pvr_mask    = 0xFFFF0000,
2912
            .insns_flags = PPC_INSNS_405,
2913
            .flags       = PPC_FLAGS_440,
2914
            .msr_mask    = 0x000000000006D630,
2915
        },
2916
#endif
2917
#if defined (TODO)
2918
        /* PowerPC 440 SP2 */
2919
        {
2920
            .name        = "440sp2",
2921
            .pvr         = CPU_PPC_440SP2,
2922
            .pvr_mask    = 0xFFFF0000,
2923
            .insns_flags = PPC_INSNS_405,
2924
            .flags       = PPC_FLAGS_440,
2925
            .msr_mask    = 0x000000000006D630,
2926
        },
2927
#endif
2928
#if defined (TODO)
2929
        /* PowerPC 440 SPE */
2930
        {
2931
            .name        = "440spe",
2932
            .pvr         = CPU_PPC_440SPE,
2933
            .pvr_mask    = 0xFFFF0000,
2934
            .insns_flags = PPC_INSNS_405,
2935
            .flags       = PPC_FLAGS_440,
2936
            .msr_mask    = 0x000000000006D630,
2937
        },
2938
#endif
2939
        /* Fake generic BookE PowerPC */
2940
        {
2941
            .name        = "BookE",
2942
            .pvr         = CPU_PPC_e500,
2943
            .pvr_mask    = 0xFFFFFFFF,
2944
            .insns_flags = PPC_INSNS_BOOKE,
2945
            .flags       = PPC_FLAGS_BOOKE,
2946
            .msr_mask    = 0x000000000006D630,
2947
        },
2948
        /* PowerPC 460 cores - TODO */
2949
        /* PowerPC MPC 5xx cores - TODO */
2950
        /* PowerPC MPC 8xx cores - TODO */
2951
        /* PowerPC MPC 8xxx cores - TODO */
2952
        /* e200 cores - TODO */
2953
        /* e500 cores - TODO */
2954
        /* e600 cores - TODO */
2955

    
2956
        /* 32 bits "classic" PowerPC */
2957
#if defined (TODO)
2958
        /* PowerPC 601 */
2959
        {
2960
            .name        = "601",
2961
            .pvr         = CPU_PPC_601,
2962
            .pvr_mask    = 0xFFFF0000,
2963
            .insns_flags = PPC_INSNS_601,
2964
            .flags       = PPC_FLAGS_601,
2965
            .msr_mask    = 0x000000000000FD70,
2966
        },
2967
#endif
2968
#if defined (TODO)
2969
        /* PowerPC 602 */
2970
        {
2971
            .name        = "602",
2972
            .pvr         = CPU_PPC_602,
2973
            .pvr_mask    = 0xFFFF0000,
2974
            .insns_flags = PPC_INSNS_602,
2975
            .flags       = PPC_FLAGS_602,
2976
            .msr_mask    = 0x0000000000C7FF73,
2977
        },
2978
#endif
2979
        /* PowerPC 603 */
2980
        {
2981
            .name        = "603",
2982
            .pvr         = CPU_PPC_603,
2983
            .pvr_mask    = 0xFFFFFFFF,
2984
            .insns_flags = PPC_INSNS_603,
2985
            .flags       = PPC_FLAGS_603,
2986
            .msr_mask    = 0x000000000007FF73,
2987
        },
2988
        /* PowerPC 603e */
2989
        {
2990
            .name        = "603e",
2991
            .pvr         = CPU_PPC_603E,
2992
            .pvr_mask    = 0xFFFFFFFF,
2993
            .insns_flags = PPC_INSNS_603,
2994
            .flags       = PPC_FLAGS_603,
2995
            .msr_mask    = 0x000000000007FF73,
2996
        },
2997
        {
2998
            .name        = "Stretch",
2999
            .pvr         = CPU_PPC_603E,
3000
            .pvr_mask    = 0xFFFFFFFF,
3001
            .insns_flags = PPC_INSNS_603,
3002
            .flags       = PPC_FLAGS_603,
3003
            .msr_mask    = 0x000000000007FF73,
3004
        },
3005
        /* PowerPC 603p */
3006
        {
3007
            .name        = "603p",
3008
            .pvr         = CPU_PPC_603P,
3009
            .pvr_mask    = 0xFFFFFFFF,
3010
            .insns_flags = PPC_INSNS_603,
3011
            .flags       = PPC_FLAGS_603,
3012
            .msr_mask    = 0x000000000007FF73,
3013
        },
3014
        /* PowerPC 603e7 */
3015
        {
3016
            .name        = "603e7",
3017
            .pvr         = CPU_PPC_603E7,
3018
            .pvr_mask    = 0xFFFFFFFF,
3019
            .insns_flags = PPC_INSNS_603,
3020
            .flags       = PPC_FLAGS_603,
3021
            .msr_mask    = 0x000000000007FF73,
3022
        },
3023
        /* PowerPC 603e7v */
3024
        {
3025
            .name        = "603e7v",
3026
            .pvr         = CPU_PPC_603E7v,
3027
            .pvr_mask    = 0xFFFFFFFF,
3028
            .insns_flags = PPC_INSNS_603,
3029
            .flags       = PPC_FLAGS_603,
3030
            .msr_mask    = 0x000000000007FF73,
3031
        },
3032
        /* PowerPC 603e7v2 */
3033
        {
3034
            .name        = "603e7v2",
3035
            .pvr         = CPU_PPC_603E7v2,
3036
            .pvr_mask    = 0xFFFFFFFF,
3037
            .insns_flags = PPC_INSNS_603,
3038
            .flags       = PPC_FLAGS_603,
3039
            .msr_mask    = 0x000000000007FF73,
3040
        },
3041
        /* PowerPC 603r */
3042
        {
3043
            .name        = "603r",
3044
            .pvr         = CPU_PPC_603R,
3045
            .pvr_mask    = 0xFFFFFFFF,
3046
            .insns_flags = PPC_INSNS_603,
3047
            .flags       = PPC_FLAGS_603,
3048
            .msr_mask    = 0x000000000007FF73,
3049
        },
3050
        {
3051
            .name        = "Goldeneye",
3052
            .pvr         = CPU_PPC_603R,
3053
            .pvr_mask    = 0xFFFFFFFF,
3054
            .insns_flags = PPC_INSNS_603,
3055
            .flags       = PPC_FLAGS_603,
3056
            .msr_mask    = 0x000000000007FF73,
3057
        },
3058
#if defined (TODO)
3059
        /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */
3060
        {
3061
            .name        = "G2",
3062
            .pvr         = CPU_PPC_G2,
3063
            .pvr_mask    = 0xFFFF0000,
3064
            .insns_flags = PPC_INSNS_G2,
3065
            .flags       = PPC_FLAGS_G2,
3066
            .msr_mask    = 0x000000000006FFF2,
3067
        },
3068
        {
3069
            .name        = "G2h4",
3070
            .pvr         = CPU_PPC_G2H4,
3071
            .pvr_mask    = 0xFFFF0000,
3072
            .insns_flags = PPC_INSNS_G2,
3073
            .flags       = PPC_FLAGS_G2,
3074
            .msr_mask    = 0x000000000006FFF2,
3075
        },
3076
        {
3077
            .name        = "G2gp",
3078
            .pvr         = CPU_PPC_G2gp,
3079
            .pvr_mask    = 0xFFFF0000,
3080
            .insns_flags = PPC_INSNS_G2,
3081
            .flags       = PPC_FLAGS_G2,
3082
            .msr_mask    = 0x000000000006FFF2,
3083
        },
3084
        {
3085
            .name        = "G2ls",
3086
            .pvr         = CPU_PPC_G2ls,
3087
            .pvr_mask    = 0xFFFF0000,
3088
            .insns_flags = PPC_INSNS_G2,
3089
            .flags       = PPC_FLAGS_G2,
3090
            .msr_mask    = 0x000000000006FFF2,
3091
        },
3092
        { /* Same as G2, with LE mode support */
3093
            .name        = "G2le",
3094
            .pvr         = CPU_PPC_G2LE,
3095
            .pvr_mask    = 0xFFFF0000,
3096
            .insns_flags = PPC_INSNS_G2,
3097
            .flags       = PPC_FLAGS_G2,
3098
            .msr_mask    = 0x000000000007FFF3,
3099
        },
3100
        {
3101
            .name        = "G2legp",
3102
            .pvr         = CPU_PPC_G2LEgp,
3103
            .pvr_mask    = 0xFFFF0000,
3104
            .insns_flags = PPC_INSNS_G2,
3105
            .flags       = PPC_FLAGS_G2,
3106
            .msr_mask    = 0x000000000007FFF3,
3107
        },
3108
        {
3109
            .name        = "G2lels",
3110
            .pvr         = CPU_PPC_G2LEls,
3111
            .pvr_mask    = 0xFFFF0000,
3112
            .insns_flags = PPC_INSNS_G2,
3113
            .flags       = PPC_FLAGS_G2,
3114
            .msr_mask    = 0x000000000007FFF3,
3115
        },
3116
#endif
3117
        /* PowerPC 604 */
3118
        {
3119
            .name        = "604",
3120
            .pvr         = CPU_PPC_604,
3121
            .pvr_mask    = 0xFFFFFFFF,
3122
            .insns_flags = PPC_INSNS_604,
3123
            .flags       = PPC_FLAGS_604,
3124
            .msr_mask    = 0x000000000005FF77,
3125
        },
3126
        /* PowerPC 604e */
3127
        {
3128
            .name        = "604e",
3129
            .pvr         = CPU_PPC_604E,
3130
            .pvr_mask    = 0xFFFFFFFF,
3131
            .insns_flags = PPC_INSNS_604,
3132
            .flags       = PPC_FLAGS_604,
3133
            .msr_mask    = 0x000000000005FF77,
3134
        },
3135
        /* PowerPC 604r */
3136
        {
3137
            .name        = "604r",
3138
            .pvr         = CPU_PPC_604R,
3139
            .pvr_mask    = 0xFFFFFFFF,
3140
            .insns_flags = PPC_INSNS_604,
3141
            .flags       = PPC_FLAGS_604,
3142
            .msr_mask    = 0x000000000005FF77,
3143
        },
3144
        /* generic G3 */
3145
        {
3146
            .name        = "G3",
3147
            .pvr         = CPU_PPC_74x,
3148
            .pvr_mask    = 0xFFFFFFFF,
3149
            .insns_flags = PPC_INSNS_7x0,
3150
            .flags       = PPC_FLAGS_7x0,
3151
            .msr_mask    = 0x000000000007FF77,
3152
        },
3153
        /* MPC740 (G3) */
3154
        {
3155
            .name        = "740",
3156
            .pvr         = CPU_PPC_74x,
3157
            .pvr_mask    = 0xFFFFFFFF,
3158
            .insns_flags = PPC_INSNS_7x0,
3159
            .flags       = PPC_FLAGS_7x0,
3160
            .msr_mask    = 0x000000000007FF77,
3161
        },
3162
        {
3163
            .name        = "Arthur",
3164
            .pvr         = CPU_PPC_74x,
3165
            .pvr_mask    = 0xFFFFFFFF,
3166
            .insns_flags = PPC_INSNS_7x0,
3167
            .flags       = PPC_FLAGS_7x0,
3168
            .msr_mask    = 0x000000000007FF77,
3169
        },
3170
#if defined (TODO)
3171
        /* MPC745 (G3) */
3172
        {
3173
            .name        = "745",
3174
            .pvr         = CPU_PPC_74x,
3175
            .pvr_mask    = 0xFFFFF000,
3176
            .insns_flags = PPC_INSNS_7x5,
3177
            .flags       = PPC_FLAGS_7x5,
3178
            .msr_mask    = 0x000000000007FF77,
3179
        },
3180
        {
3181
            .name        = "Goldfinger",
3182
            .pvr         = CPU_PPC_74x,
3183
            .pvr_mask    = 0xFFFFF000,
3184
            .insns_flags = PPC_INSNS_7x5,
3185
            .flags       = PPC_FLAGS_7x5,
3186
            .msr_mask    = 0x000000000007FF77,
3187
        },
3188
#endif
3189
        /* MPC750 (G3) */
3190
        {
3191
            .name        = "750",
3192
            .pvr         = CPU_PPC_74x,
3193
            .pvr_mask    = 0xFFFFFFFF,
3194
            .insns_flags = PPC_INSNS_7x0,
3195
            .flags       = PPC_FLAGS_7x0,
3196
            .msr_mask    = 0x000000000007FF77,
3197
        },
3198
#if defined (TODO)
3199
        /* MPC755 (G3) */
3200
        {
3201
            .name        = "755",
3202
            .pvr         = CPU_PPC_755,
3203
            .pvr_mask    = 0xFFFFF000,
3204
            .insns_flags = PPC_INSNS_7x5,
3205
            .flags       = PPC_FLAGS_7x5,
3206
            .msr_mask    = 0x000000000007FF77,
3207
        },
3208
#endif
3209
        /* MPC740P (G3) */
3210
        {
3211
            .name        = "740p",
3212
            .pvr         = CPU_PPC_74xP,
3213
            .pvr_mask    = 0xFFFFFFFF,
3214
            .insns_flags = PPC_INSNS_7x0,
3215
            .flags       = PPC_FLAGS_7x0,
3216
            .msr_mask    = 0x000000000007FF77,
3217
        },
3218
        {
3219
            .name        = "Conan/Doyle",
3220
            .pvr         = CPU_PPC_74xP,
3221
            .pvr_mask    = 0xFFFFFFFF,
3222
            .insns_flags = PPC_INSNS_7x0,
3223
            .flags       = PPC_FLAGS_7x0,
3224
            .msr_mask    = 0x000000000007FF77,
3225
        },
3226
#if defined (TODO)
3227
        /* MPC745P (G3) */
3228
        {
3229
            .name        = "745p",
3230
            .pvr         = CPU_PPC_74xP,
3231
            .pvr_mask    = 0xFFFFF000,
3232
            .insns_flags = PPC_INSNS_7x5,
3233
            .flags       = PPC_FLAGS_7x5,
3234
            .msr_mask    = 0x000000000007FF77,
3235
        },
3236
#endif
3237
        /* MPC750P (G3) */
3238
        {
3239
            .name        = "750p",
3240
            .pvr         = CPU_PPC_74xP,
3241
            .pvr_mask    = 0xFFFFFFFF,
3242
            .insns_flags = PPC_INSNS_7x0,
3243
            .flags       = PPC_FLAGS_7x0,
3244
            .msr_mask    = 0x000000000007FF77,
3245
        },
3246
#if defined (TODO)
3247
        /* MPC755P (G3) */
3248
        {
3249
            .name        = "755p",
3250
            .pvr         = CPU_PPC_74xP,
3251
            .pvr_mask    = 0xFFFFF000,
3252
            .insns_flags = PPC_INSNS_7x5,
3253
            .flags       = PPC_FLAGS_7x5,
3254
            .msr_mask    = 0x000000000007FF77,
3255
        },
3256
#endif
3257
        /* IBM 750CXe (G3 embedded) */
3258
        {
3259
            .name        = "750cxe",
3260
            .pvr         = CPU_PPC_750CXE,
3261
            .pvr_mask    = 0xFFFFFFFF,
3262
            .insns_flags = PPC_INSNS_7x0,
3263
            .flags       = PPC_FLAGS_7x0,
3264
            .msr_mask    = 0x000000000007FF77,
3265
        },
3266
        /* IBM 750FX (G3 embedded) */
3267
        {
3268
            .name        = "750fx",
3269
            .pvr         = CPU_PPC_750FX,
3270
            .pvr_mask    = 0xFFFFFFFF,
3271
            .insns_flags = PPC_INSNS_7x0,
3272
            .flags       = PPC_FLAGS_7x0,
3273
            .msr_mask    = 0x000000000007FF77,
3274
        },
3275
        /* IBM 750GX (G3 embedded) */
3276
        {
3277
            .name        = "750gx",
3278
            .pvr         = CPU_PPC_750GX,
3279
            .pvr_mask    = 0xFFFFFFFF,
3280
            .insns_flags = PPC_INSNS_7x0,
3281
            .flags       = PPC_FLAGS_7x0,
3282
            .msr_mask    = 0x000000000007FF77,
3283
        },
3284
#if defined (TODO)
3285
        /* generic G4 */
3286
        {
3287
            .name        = "G4",
3288
            .pvr         = CPU_PPC_7400,
3289
            .pvr_mask    = 0xFFFF0000,
3290
            .insns_flags = PPC_INSNS_74xx,
3291
            .flags       = PPC_FLAGS_74xx,
3292
            .msr_mask    = 0x000000000205FF77,
3293
        },
3294
#endif
3295
#if defined (TODO)
3296
        /* PowerPC 7400 (G4) */
3297
        {
3298
            .name        = "7400",
3299
            .pvr         = CPU_PPC_7400,
3300
            .pvr_mask    = 0xFFFF0000,
3301
            .insns_flags = PPC_INSNS_74xx,
3302
            .flags       = PPC_FLAGS_74xx,
3303
            .msr_mask    = 0x000000000205FF77,
3304
        },
3305
        {
3306
            .name        = "Max",
3307
            .pvr         = CPU_PPC_7400,
3308
            .pvr_mask    = 0xFFFF0000,
3309
            .insns_flags = PPC_INSNS_74xx,
3310
            .flags       = PPC_FLAGS_74xx,
3311
            .msr_mask    = 0x000000000205FF77,
3312
        },
3313
#endif
3314
#if defined (TODO)
3315
        /* PowerPC 7410 (G4) */
3316
        {
3317
            .name        = "7410",
3318
            .pvr         = CPU_PPC_7410,
3319
            .pvr_mask    = 0xFFFF0000,
3320
            .insns_flags = PPC_INSNS_74xx,
3321
            .flags       = PPC_FLAGS_74xx,
3322
            .msr_mask    = 0x000000000205FF77,
3323
        },
3324
        {
3325
            .name        = "Nitro",
3326
            .pvr         = CPU_PPC_7410,
3327
            .pvr_mask    = 0xFFFF0000,
3328
            .insns_flags = PPC_INSNS_74xx,
3329
            .flags       = PPC_FLAGS_74xx,
3330
            .msr_mask    = 0x000000000205FF77,
3331
        },
3332
#endif
3333
        /* XXX: 7441 */
3334
        /* XXX: 7445 */
3335
        /* XXX: 7447 */
3336
        /* XXX: 7447A */
3337
#if defined (TODO)
3338
        /* PowerPC 7450 (G4) */
3339
        {
3340
            .name        = "7450",
3341
            .pvr         = CPU_PPC_7450,
3342
            .pvr_mask    = 0xFFFF0000,
3343
            .insns_flags = PPC_INSNS_74xx,
3344
            .flags       = PPC_FLAGS_74xx,
3345
            .msr_mask    = 0x000000000205FF77,
3346
        },
3347
        {
3348
            .name        = "Vger",
3349
            .pvr         = CPU_PPC_7450,
3350
            .pvr_mask    = 0xFFFF0000,
3351
            .insns_flags = PPC_INSNS_74xx,
3352
            .flags       = PPC_FLAGS_74xx,
3353
            .msr_mask    = 0x000000000205FF77,
3354
        },
3355
#endif
3356
        /* XXX: 7451 */
3357
#if defined (TODO)
3358
        /* PowerPC 7455 (G4) */
3359
        {
3360
            .name        = "7455",
3361
            .pvr         = CPU_PPC_7455,
3362
            .pvr_mask    = 0xFFFF0000,
3363
            .insns_flags = PPC_INSNS_74xx,
3364
            .flags       = PPC_FLAGS_74xx,
3365
            .msr_mask    = 0x000000000205FF77,
3366
        },
3367
        {
3368
            .name        = "Apollo 6",
3369
            .pvr         = CPU_PPC_7455,
3370
            .pvr_mask    = 0xFFFF0000,
3371
            .insns_flags = PPC_INSNS_74xx,
3372
            .flags       = PPC_FLAGS_74xx,
3373
            .msr_mask    = 0x000000000205FF77,
3374
        },
3375
#endif
3376
#if defined (TODO)
3377
        /* PowerPC 7457 (G4) */
3378
        {
3379
            .name        = "7457",
3380
            .pvr         = CPU_PPC_7457,
3381
            .pvr_mask    = 0xFFFF0000,
3382
            .insns_flags = PPC_INSNS_74xx,
3383
            .flags       = PPC_FLAGS_74xx,
3384
            .msr_mask    = 0x000000000205FF77,
3385
        },
3386
        {
3387
            .name        = "Apollo 7",
3388
            .pvr         = CPU_PPC_7457,
3389
            .pvr_mask    = 0xFFFF0000,
3390
            .insns_flags = PPC_INSNS_74xx,
3391
            .flags       = PPC_FLAGS_74xx,
3392
            .msr_mask    = 0x000000000205FF77,
3393
        },
3394
#endif
3395
#if defined (TODO)
3396
        /* PowerPC 7457A (G4) */
3397
        {
3398
            .name        = "7457A",
3399
            .pvr         = CPU_PPC_7457A,
3400
            .pvr_mask    = 0xFFFF0000,
3401
            .insns_flags = PPC_INSNS_74xx,
3402
            .flags       = PPC_FLAGS_74xx,
3403
            .msr_mask    = 0x000000000205FF77,
3404
        },
3405
        {
3406
            .name        = "Apollo 7 PM",
3407
            .pvr         = CPU_PPC_7457A,
3408
            .pvr_mask    = 0xFFFF0000,
3409
            .insns_flags = PPC_INSNS_74xx,
3410
            .flags       = PPC_FLAGS_74xx,
3411
            .msr_mask    = 0x000000000205FF77,
3412
        },
3413
#endif
3414
        /* 64 bits PowerPC */
3415
#if defined (TODO)
3416
        /* PowerPC 620 */
3417
        {
3418
            .name        = "620",
3419
            .pvr         = CPU_PPC_620,
3420
            .pvr_mask    = 0xFFFF0000,
3421
            .insns_flags = PPC_INSNS_620,
3422
            .flags       = PPC_FLAGS_620,
3423
            .msr_mask    = 0x800000000005FF73,
3424
        },
3425
#endif
3426
#if defined (TODO)
3427
        /* PowerPC 630 (POWER3) */
3428
        {
3429
            .name        = "630",
3430
            .pvr         = CPU_PPC_630,
3431
            .pvr_mask    = 0xFFFF0000,
3432
            .insns_flags = PPC_INSNS_630,
3433
            .flags       = PPC_FLAGS_630,
3434
            .msr_mask    = xxx,
3435
        }
3436
        {
3437
            .name        = "POWER3",
3438
            .pvr         = CPU_PPC_630,
3439
            .pvr_mask    = 0xFFFF0000,
3440
            .insns_flags = PPC_INSNS_630,
3441
            .flags       = PPC_FLAGS_630,
3442
            .msr_mask    = xxx,
3443
        }
3444
#endif
3445
#if defined (TODO)
3446
        /* PowerPC 631 (Power 3+)*/
3447
        {
3448
            .name        = "631",
3449
            .pvr         = CPU_PPC_631,
3450
            .pvr_mask    = 0xFFFF0000,
3451
            .insns_flags = PPC_INSNS_631,
3452
            .flags       = PPC_FLAGS_631,
3453
            .msr_mask    = xxx,
3454
        },
3455
        {
3456
            .name        = "POWER3+",
3457
            .pvr         = CPU_PPC_631,
3458
            .pvr_mask    = 0xFFFF0000,
3459
            .insns_flags = PPC_INSNS_631,
3460
            .flags       = PPC_FLAGS_631,
3461
            .msr_mask    = xxx,
3462
        },
3463
#endif
3464
#if defined (TODO)
3465
        /* POWER4 */
3466
        {
3467
            .name        = "POWER4",
3468
            .pvr         = CPU_PPC_POWER4,
3469
            .pvr_mask    = 0xFFFF0000,
3470
            .insns_flags = PPC_INSNS_POWER4,
3471
            .flags       = PPC_FLAGS_POWER4,
3472
            .msr_mask    = xxx,
3473
        },
3474
#endif
3475
#if defined (TODO)
3476
        /* POWER4p */
3477
        {
3478
            .name        = "POWER4+",
3479
            .pvr         = CPU_PPC_POWER4P,
3480
            .pvr_mask    = 0xFFFF0000,
3481
            .insns_flags = PPC_INSNS_POWER4,
3482
            .flags       = PPC_FLAGS_POWER4,
3483
            .msr_mask    = xxx,
3484
        },
3485
#endif
3486
#if defined (TODO)
3487
        /* POWER5 */
3488
        {
3489
            .name        = "POWER5",
3490
            .pvr         = CPU_PPC_POWER5,
3491
            .pvr_mask    = 0xFFFF0000,
3492
            .insns_flags = PPC_INSNS_POWER5,
3493
            .flags       = PPC_FLAGS_POWER5,
3494
            .msr_mask    = xxx,
3495
        },
3496
#endif
3497
#if defined (TODO)
3498
        /* POWER5+ */
3499
        {
3500
            .name        = "POWER5+",
3501
            .pvr         = CPU_PPC_POWER5P,
3502
            .pvr_mask    = 0xFFFF0000,
3503
            .insns_flags = PPC_INSNS_POWER5,
3504
            .flags       = PPC_FLAGS_POWER5,
3505
            .msr_mask    = xxx,
3506
        },
3507
#endif
3508
#if defined (TODO)
3509
        /* PowerPC 970 */
3510
        {
3511
            .name        = "970",
3512
            .pvr         = CPU_PPC_970,
3513
            .pvr_mask    = 0xFFFF0000,
3514
            .insns_flags = PPC_INSNS_970,
3515
            .flags       = PPC_FLAGS_970,
3516
            .msr_mask    = 0x900000000204FF36,
3517
        },
3518
#endif
3519
#if defined (TODO)
3520
        /* PowerPC 970FX (G5) */
3521
        {
3522
            .name        = "970fx",
3523
            .pvr         = CPU_PPC_970FX,
3524
            .pvr_mask    = 0xFFFF0000,
3525
            .insns_flags = PPC_INSNS_970FX,
3526
            .flags       = PPC_FLAGS_970FX,
3527
            .msr_mask    = 0x800000000204FF36,
3528
        },
3529
#endif
3530
#if defined (TODO)
3531
        /* RS64 (Apache/A35) */
3532
        /* This one seems to support the whole POWER2 instruction set
3533
         * and the PowerPC 64 one.
3534
         */
3535
        {
3536
            .name        = "RS64",
3537
            .pvr         = CPU_PPC_RS64,
3538
            .pvr_mask    = 0xFFFF0000,
3539
            .insns_flags = PPC_INSNS_RS64,
3540
            .flags       = PPC_FLAGS_RS64,
3541
            .msr_mask    = xxx,
3542
        },
3543
        {
3544
            .name        = "Apache",
3545
            .pvr         = CPU_PPC_RS64,
3546
            .pvr_mask    = 0xFFFF0000,
3547
            .insns_flags = PPC_INSNS_RS64,
3548
            .flags       = PPC_FLAGS_RS64,
3549
            .msr_mask    = xxx,
3550
        },
3551
        {
3552
            .name        = "A35",
3553
            .pvr         = CPU_PPC_RS64,
3554
            .pvr_mask    = 0xFFFF0000,
3555
            .insns_flags = PPC_INSNS_RS64,
3556
            .flags       = PPC_FLAGS_RS64,
3557
            .msr_mask    = xxx,
3558
        },
3559
#endif
3560
#if defined (TODO)
3561
        /* RS64-II (NorthStar/A50) */
3562
        {
3563
            .name        = "RS64-II",
3564
            .pvr         = CPU_PPC_RS64II,
3565
            .pvr_mask    = 0xFFFF0000,
3566
            .insns_flags = PPC_INSNS_RS64,
3567
            .flags       = PPC_FLAGS_RS64,
3568
            .msr_mask    = xxx,
3569
        },
3570
        {
3571
            .name        = "NortStar",
3572
            .pvr         = CPU_PPC_RS64II,
3573
            .pvr_mask    = 0xFFFF0000,
3574
            .insns_flags = PPC_INSNS_RS64,
3575
            .flags       = PPC_FLAGS_RS64,
3576
            .msr_mask    = xxx,
3577
        },
3578
        {
3579
            .name        = "A50",
3580
            .pvr         = CPU_PPC_RS64II,
3581
            .pvr_mask    = 0xFFFF0000,
3582
            .insns_flags = PPC_INSNS_RS64,
3583
            .flags       = PPC_FLAGS_RS64,
3584
            .msr_mask    = xxx,
3585
        },
3586
#endif
3587
#if defined (TODO)
3588
        /* RS64-III (Pulsar) */
3589
        {
3590
            .name        = "RS64-III",
3591
            .pvr         = CPU_PPC_RS64III,
3592
            .pvr_mask    = 0xFFFF0000,
3593
            .insns_flags = PPC_INSNS_RS64,
3594
            .flags       = PPC_FLAGS_RS64,
3595
            .msr_mask    = xxx,
3596
        },
3597
        {
3598
            .name        = "Pulsar",
3599
            .pvr         = CPU_PPC_RS64III,
3600
            .pvr_mask    = 0xFFFF0000,
3601
            .insns_flags = PPC_INSNS_RS64,
3602
            .flags       = PPC_FLAGS_RS64,
3603
            .msr_mask    = xxx,
3604
        },
3605
#endif
3606
#if defined (TODO)
3607
        /* RS64-IV (IceStar/IStar/SStar) */
3608
        {
3609
            .name        = "RS64-IV",
3610
            .pvr         = CPU_PPC_RS64IV,
3611
            .pvr_mask    = 0xFFFF0000,
3612
            .insns_flags = PPC_INSNS_RS64,
3613
            .flags       = PPC_FLAGS_RS64,
3614
            .msr_mask    = xxx,
3615
        },
3616
        {
3617
            .name        = "IceStar",
3618
            .pvr         = CPU_PPC_RS64IV,
3619
            .pvr_mask    = 0xFFFF0000,
3620
            .insns_flags = PPC_INSNS_RS64,
3621
            .flags       = PPC_FLAGS_RS64,
3622
            .msr_mask    = xxx,
3623
        },
3624
        {
3625
            .name        = "IStar",
3626
            .pvr         = CPU_PPC_RS64IV,
3627
            .pvr_mask    = 0xFFFF0000,
3628
            .insns_flags = PPC_INSNS_RS64,
3629
            .flags       = PPC_FLAGS_RS64,
3630
            .msr_mask    = xxx,
3631
        },
3632
        {
3633
            .name        = "SStar",
3634
            .pvr         = CPU_PPC_RS64IV,
3635
            .pvr_mask    = 0xFFFF0000,
3636
            .insns_flags = PPC_INSNS_RS64,
3637
            .flags       = PPC_FLAGS_RS64,
3638
            .msr_mask    = xxx,
3639
        },
3640
#endif
3641
        /* POWER */
3642
#if defined (TODO)
3643
        /* Original POWER */
3644
        {
3645
            .name        = "POWER",
3646
            .pvr         = CPU_POWER,
3647
            .pvr_mask    = 0xFFFF0000,
3648
            .insns_flags = PPC_INSNS_POWER,
3649
            .flags       = PPC_FLAGS_POWER,
3650
            .msr_mask    = xxx,
3651
        },
3652
#endif
3653
#if defined (TODO)
3654
        /* POWER2 */
3655
        {
3656
            .name        = "POWER2",
3657
            .pvr         = CPU_POWER2,
3658
            .pvr_mask    = 0xFFFF0000,
3659
            .insns_flags = PPC_INSNS_POWER,
3660
            .flags       = PPC_FLAGS_POWER,
3661
            .msr_mask    = xxx,
3662
        },
3663
#endif
3664
        /* Generic PowerPCs */
3665
#if defined (TODO)
3666
        {
3667
            .name        = "ppc64",
3668
            .pvr         = CPU_PPC_970,
3669
            .pvr_mask    = 0xFFFF0000,
3670
            .insns_flags = PPC_INSNS_PPC64,
3671
            .flags       = PPC_FLAGS_PPC64,
3672
            .msr_mask    = 0xA00000000204FF36,
3673
        },
3674
#endif
3675
        {
3676
            .name        = "ppc32",
3677
            .pvr         = CPU_PPC_604,
3678
            .pvr_mask    = 0xFFFFFFFF,
3679
            .insns_flags = PPC_INSNS_PPC32,
3680
            .flags       = PPC_FLAGS_PPC32,
3681
            .msr_mask    = 0x000000000005FF77,
3682
        },
3683
        /* Fallback */
3684
        {
3685
            .name        = "ppc",
3686
            .pvr         = CPU_PPC_604,
3687
            .pvr_mask    = 0xFFFFFFFF,
3688
            .insns_flags = PPC_INSNS_PPC32,
3689
            .flags       = PPC_FLAGS_PPC32,
3690
            .msr_mask    = 0x000000000005FF77,
3691
        },
3692
    };
3693

    
3694
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
3695
{
3696
    int i, ret;
3697

    
3698
    ret = -1;
3699
    *def = NULL;
3700
    for (i = 0; strcmp(ppc_defs[i].name, "ppc") != 0; i++) {
3701
        if (strcasecmp(name, ppc_defs[i].name) == 0) {
3702
            *def = &ppc_defs[i];
3703
            ret = 0;
3704
            break;
3705
        }
3706
    }
3707

    
3708
    return ret;
3709
}
3710

    
3711
int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
3712
{
3713
    int i, ret;
3714

    
3715
    ret = -1;
3716
    *def = NULL;
3717
    for (i = 0; ppc_defs[i].name != NULL; i++) {
3718
        if ((pvr & ppc_defs[i].pvr_mask) ==
3719
            (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
3720
            *def = &ppc_defs[i];
3721
            ret = 0;
3722
            break;
3723
        }
3724
    }
3725

    
3726
    return ret;
3727
}
3728

    
3729
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3730
{
3731
    int i;
3732

    
3733
    for (i = 0; ; i++) {
3734
        (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n",
3735
                       ppc_defs[i].name,
3736
                       ppc_defs[i].pvr, ppc_defs[i].pvr_mask);
3737
        if (strcmp(ppc_defs[i].name, "ppc") == 0)
3738
            break;
3739
    }
3740
}