Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ 76a66253

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

    
2470
    return 0;
2471
}
2472

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

    
2488
    return 0;
2489
}
2490

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

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

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

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

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

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

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

    
3707
    return ret;
3708
}
3709

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

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

    
3725
    return ret;
3726
}
3727

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

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