Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ 426613db

History | View | Annotate | Download (121.5 kB)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
2191
#if defined (TODO)
2192
        /* POWER                                               */
2193
    case CPU_POWER:       /* POWER                         */
2194
    case CPU_POWER2:      /* POWER2                        */
2195
        break;
2196
#endif
2197

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

    
2215
#if defined(PPC_DUMP_CPU)
2216
static void dump_sprs (CPUPPCState *env)
2217
{
2218
    ppc_spr_t *spr;
2219
    uint32_t pvr = env->spr[SPR_PVR];
2220
    uint32_t sr, sw, ur, uw;
2221
    int i, j, n;
2222

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

    
2250
/*****************************************************************************/
2251
#include <stdlib.h>
2252
#include <string.h>
2253

    
2254
int fflush (FILE *stream);
2255

    
2256
/* Opcode types */
2257
enum {
2258
    PPC_DIRECT   = 0, /* Opcode routine        */
2259
    PPC_INDIRECT = 1, /* Indirect opcode table */
2260
};
2261

    
2262
static inline int is_indirect_opcode (void *handler)
2263
{
2264
    return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
2265
}
2266

    
2267
static inline opc_handler_t **ind_table(void *handler)
2268
{
2269
    return (opc_handler_t **)((unsigned long)handler & ~3);
2270
}
2271

    
2272
/* Instruction table creation */
2273
/* Opcodes tables creation */
2274
static void fill_new_table (opc_handler_t **table, int len)
2275
{
2276
    int i;
2277

    
2278
    for (i = 0; i < len; i++)
2279
        table[i] = &invalid_handler;
2280
}
2281

    
2282
static int create_new_table (opc_handler_t **table, unsigned char idx)
2283
{
2284
    opc_handler_t **tmp;
2285

    
2286
    tmp = malloc(0x20 * sizeof(opc_handler_t));
2287
    if (tmp == NULL)
2288
        return -1;
2289
    fill_new_table(tmp, 0x20);
2290
    table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
2291

    
2292
    return 0;
2293
}
2294

    
2295
static int insert_in_table (opc_handler_t **table, unsigned char idx,
2296
                            opc_handler_t *handler)
2297
{
2298
    if (table[idx] != &invalid_handler)
2299
        return -1;
2300
    table[idx] = handler;
2301

    
2302
    return 0;
2303
}
2304

    
2305
static int register_direct_insn (opc_handler_t **ppc_opcodes,
2306
                                 unsigned char idx, opc_handler_t *handler)
2307
{
2308
    if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
2309
        printf("*** ERROR: opcode %02x already assigned in main "
2310
               "opcode table\n", idx);
2311
        return -1;
2312
    }
2313

    
2314
    return 0;
2315
}
2316

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

    
2341
    return 0;
2342
}
2343

    
2344
static int register_ind_insn (opc_handler_t **ppc_opcodes,
2345
                              unsigned char idx1, unsigned char idx2,
2346
                              opc_handler_t *handler)
2347
{
2348
    int ret;
2349

    
2350
    ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
2351

    
2352
    return ret;
2353
}
2354

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

    
2371
    return 0;
2372
}
2373

    
2374
static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
2375
{
2376
    if (insn->opc2 != 0xFF) {
2377
        if (insn->opc3 != 0xFF) {
2378
            if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
2379
                                     insn->opc3, &insn->handler) < 0)
2380
                return -1;
2381
        } else {
2382
            if (register_ind_insn(ppc_opcodes, insn->opc1,
2383
                                  insn->opc2, &insn->handler) < 0)
2384
                return -1;
2385
        }
2386
    } else {
2387
        if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
2388
            return -1;
2389
    }
2390

    
2391
    return 0;
2392
}
2393

    
2394
static int test_opcode_table (opc_handler_t **table, int len)
2395
{
2396
    int i, count, tmp;
2397

    
2398
    for (i = 0, count = 0; i < len; i++) {
2399
        /* Consistency fixup */
2400
        if (table[i] == NULL)
2401
            table[i] = &invalid_handler;
2402
        if (table[i] != &invalid_handler) {
2403
            if (is_indirect_opcode(table[i])) {
2404
                tmp = test_opcode_table(ind_table(table[i]), 0x20);
2405
                if (tmp == 0) {
2406
                    free(table[i]);
2407
                    table[i] = &invalid_handler;
2408
                } else {
2409
                    count++;
2410
                }
2411
            } else {
2412
                count++;
2413
            }
2414
        }
2415
    }
2416

    
2417
    return count;
2418
}
2419

    
2420
static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
2421
{
2422
    if (test_opcode_table(ppc_opcodes, 0x40) == 0)
2423
        printf("*** WARNING: no opcode defined !\n");
2424
}
2425

    
2426
/*****************************************************************************/
2427
static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
2428
{
2429
    opcode_t *opc, *start, *end;
2430

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

    
2477
    return 0;
2478
}
2479

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

    
2495
    return 0;
2496
}
2497

    
2498
void do_compute_hflags (CPUPPCState *env);
2499
CPUPPCState *cpu_ppc_init (void)
2500
{
2501
    CPUPPCState *env;
2502

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

    
2525
void cpu_ppc_close(CPUPPCState *env)
2526
{
2527
    /* Should also remove all opcode tables... */
2528
    free(env);
2529
}
2530

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

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

    
3702
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
3703
{
3704
    int i, ret;
3705

    
3706
    ret = -1;
3707
    *def = NULL;
3708
    for (i = 0; strcmp(ppc_defs[i].name, "ppc") != 0; i++) {
3709
        if (strcasecmp(name, ppc_defs[i].name) == 0) {
3710
            *def = &ppc_defs[i];
3711
            ret = 0;
3712
            break;
3713
        }
3714
    }
3715

    
3716
    return ret;
3717
}
3718

    
3719
int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
3720
{
3721
    int i, ret;
3722

    
3723
    ret = -1;
3724
    *def = NULL;
3725
    for (i = 0; ppc_defs[i].name != NULL; i++) {
3726
        if ((pvr & ppc_defs[i].pvr_mask) ==
3727
            (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
3728
            *def = &ppc_defs[i];
3729
            ret = 0;
3730
            break;
3731
        }
3732
    }
3733

    
3734
    return ret;
3735
}
3736

    
3737
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3738
{
3739
    int i;
3740

    
3741
    for (i = 0; ; i++) {
3742
        (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n",
3743
                       ppc_defs[i].name,
3744
                       ppc_defs[i].pvr, ppc_defs[i].pvr_mask);
3745
        if (strcmp(ppc_defs[i].name, "ppc") == 0)
3746
            break;
3747
    }
3748
}