Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ 86cc1ce0

History | View | Annotate | Download (126.7 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_BOOKE_CSRR0, "CSRR0",
897
                 SPR_NOACCESS, SPR_NOACCESS,
898
                 &spr_read_generic, &spr_write_generic,
899
                 0x00000000);
900
    spr_register(env, SPR_BOOKE_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_BOOKE_CSRR0, "CSRR0",
1064
                 SPR_NOACCESS, SPR_NOACCESS,
1065
                 &spr_read_generic, &spr_write_generic,
1066
                 0x00000000);
1067
    spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1068
                 SPR_NOACCESS, SPR_NOACCESS,
1069
                 &spr_read_generic, &spr_write_generic,
1070
                 0x00000000);
1071
    spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1072
                 SPR_NOACCESS, SPR_NOACCESS,
1073
                 &spr_read_generic, &spr_write_generic,
1074
                 0x00000000);
1075
    spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1076
                 SPR_NOACCESS, SPR_NOACCESS,
1077
                 &spr_read_generic, &spr_write_generic,
1078
                 0x00000000);
1079
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
1080
                 SPR_NOACCESS, SPR_NOACCESS,
1081
                 &spr_read_generic, &spr_write_generic,
1082
                 0x00000000);
1083
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
1084
                 SPR_NOACCESS, SPR_NOACCESS,
1085
                 &spr_read_generic, &spr_write_generic,
1086
                 0x00000000);
1087
    /* Debug */
1088
    /* XXX : not implemented */
1089
    spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1090
                 SPR_NOACCESS, SPR_NOACCESS,
1091
                 &spr_read_generic, &spr_write_generic,
1092
                 0x00000000);
1093
    /* XXX : not implemented */
1094
    spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1095
                 SPR_NOACCESS, SPR_NOACCESS,
1096
                 &spr_read_generic, &spr_write_generic,
1097
                 0x00000000);
1098
    /* XXX : not implemented */
1099
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1100
                 SPR_NOACCESS, SPR_NOACCESS,
1101
                 &spr_read_generic, &spr_write_generic,
1102
                 0x00000000);
1103
    /* XXX : not implemented */
1104
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1105
                 SPR_NOACCESS, SPR_NOACCESS,
1106
                 &spr_read_generic, &spr_write_generic,
1107
                 0x00000000);
1108
    /* XXX : not implemented */
1109
    spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1110
                 SPR_NOACCESS, SPR_NOACCESS,
1111
                 &spr_read_generic, &spr_write_generic,
1112
                 0x00000000);
1113
    /* XXX : not implemented */
1114
    spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1115
                 SPR_NOACCESS, SPR_NOACCESS,
1116
                 &spr_read_generic, &spr_write_generic,
1117
                 0x00000000);
1118
    /* XXX : not implemented */
1119
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1120
                 SPR_NOACCESS, SPR_NOACCESS,
1121
                 &spr_read_generic, &spr_write_generic,
1122
                 0x00000000);
1123
    /* XXX : not implemented */
1124
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1125
                 SPR_NOACCESS, SPR_NOACCESS,
1126
                 &spr_read_generic, &spr_write_generic,
1127
                 0x00000000);
1128
    /* XXX : not implemented */
1129
    spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1130
                 SPR_NOACCESS, SPR_NOACCESS,
1131
                 &spr_read_generic, &spr_write_generic,
1132
                 0x00000000);
1133
    /* XXX : not implemented */
1134
    spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1135
                 SPR_NOACCESS, SPR_NOACCESS,
1136
                 &spr_read_generic, &spr_write_generic,
1137
                 0x00000000);
1138
    /* XXX : not implemented */
1139
    spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1140
                 SPR_NOACCESS, SPR_NOACCESS,
1141
                 &spr_read_generic, &spr_write_generic,
1142
                 0x00000000);
1143
    /* XXX : not implemented */
1144
    spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1145
                 SPR_NOACCESS, SPR_NOACCESS,
1146
                 &spr_read_generic, &spr_write_generic,
1147
                 0x00000000);
1148
    spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1149
                 SPR_NOACCESS, SPR_NOACCESS,
1150
                 &spr_read_generic, &spr_write_generic,
1151
                 0x00000000);
1152
    spr_register(env, SPR_BOOKE_ESR, "ESR",
1153
                 SPR_NOACCESS, SPR_NOACCESS,
1154
                 &spr_read_generic, &spr_write_generic,
1155
                 0x00000000);
1156
    spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1157
                 SPR_NOACCESS, SPR_NOACCESS,
1158
                 &spr_read_generic, &spr_write_generic,
1159
                 0x00000000);
1160
    /* Exception vectors */
1161
    spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1162
                 SPR_NOACCESS, SPR_NOACCESS,
1163
                 &spr_read_generic, &spr_write_generic,
1164
                 0x00000000);
1165
    spr_register(env, SPR_BOOKE_IVOR0, "IVOR0",
1166
                 SPR_NOACCESS, SPR_NOACCESS,
1167
                 &spr_read_generic, &spr_write_generic,
1168
                 0x00000000);
1169
    spr_register(env, SPR_BOOKE_IVOR1, "IVOR1",
1170
                 SPR_NOACCESS, SPR_NOACCESS,
1171
                 &spr_read_generic, &spr_write_generic,
1172
                 0x00000000);
1173
    spr_register(env, SPR_BOOKE_IVOR2, "IVOR2",
1174
                 SPR_NOACCESS, SPR_NOACCESS,
1175
                 &spr_read_generic, &spr_write_generic,
1176
                 0x00000000);
1177
    spr_register(env, SPR_BOOKE_IVOR3, "IVOR3",
1178
                 SPR_NOACCESS, SPR_NOACCESS,
1179
                 &spr_read_generic, &spr_write_generic,
1180
                 0x00000000);
1181
    spr_register(env, SPR_BOOKE_IVOR4, "IVOR4",
1182
                 SPR_NOACCESS, SPR_NOACCESS,
1183
                 &spr_read_generic, &spr_write_generic,
1184
                 0x00000000);
1185
    spr_register(env, SPR_BOOKE_IVOR5, "IVOR5",
1186
                 SPR_NOACCESS, SPR_NOACCESS,
1187
                 &spr_read_generic, &spr_write_generic,
1188
                 0x00000000);
1189
    spr_register(env, SPR_BOOKE_IVOR6, "IVOR6",
1190
                 SPR_NOACCESS, SPR_NOACCESS,
1191
                 &spr_read_generic, &spr_write_generic,
1192
                 0x00000000);
1193
    spr_register(env, SPR_BOOKE_IVOR7, "IVOR7",
1194
                 SPR_NOACCESS, SPR_NOACCESS,
1195
                 &spr_read_generic, &spr_write_generic,
1196
                 0x00000000);
1197
    spr_register(env, SPR_BOOKE_IVOR8, "IVOR8",
1198
                 SPR_NOACCESS, SPR_NOACCESS,
1199
                 &spr_read_generic, &spr_write_generic,
1200
                 0x00000000);
1201
    spr_register(env, SPR_BOOKE_IVOR9, "IVOR9",
1202
                 SPR_NOACCESS, SPR_NOACCESS,
1203
                 &spr_read_generic, &spr_write_generic,
1204
                 0x00000000);
1205
    spr_register(env, SPR_BOOKE_IVOR10, "IVOR10",
1206
                 SPR_NOACCESS, SPR_NOACCESS,
1207
                 &spr_read_generic, &spr_write_generic,
1208
                 0x00000000);
1209
    spr_register(env, SPR_BOOKE_IVOR11, "IVOR11",
1210
                 SPR_NOACCESS, SPR_NOACCESS,
1211
                 &spr_read_generic, &spr_write_generic,
1212
                 0x00000000);
1213
    spr_register(env, SPR_BOOKE_IVOR12, "IVOR12",
1214
                 SPR_NOACCESS, SPR_NOACCESS,
1215
                 &spr_read_generic, &spr_write_generic,
1216
                 0x00000000);
1217
    spr_register(env, SPR_BOOKE_IVOR13, "IVOR13",
1218
                 SPR_NOACCESS, SPR_NOACCESS,
1219
                 &spr_read_generic, &spr_write_generic,
1220
                 0x00000000);
1221
    spr_register(env, SPR_BOOKE_IVOR14, "IVOR14",
1222
                 SPR_NOACCESS, SPR_NOACCESS,
1223
                 &spr_read_generic, &spr_write_generic,
1224
                 0x00000000);
1225
    spr_register(env, SPR_BOOKE_IVOR15, "IVOR15",
1226
                 SPR_NOACCESS, SPR_NOACCESS,
1227
                 &spr_read_generic, &spr_write_generic,
1228
                 0x00000000);
1229
    spr_register(env, SPR_BOOKE_IVOR32, "IVOR32",
1230
                 SPR_NOACCESS, SPR_NOACCESS,
1231
                 &spr_read_generic, &spr_write_generic,
1232
                 0x00000000);
1233
    spr_register(env, SPR_BOOKE_IVOR33, "IVOR33",
1234
                 SPR_NOACCESS, SPR_NOACCESS,
1235
                 &spr_read_generic, &spr_write_generic,
1236
                 0x00000000);
1237
    spr_register(env, SPR_BOOKE_IVOR34, "IVOR34",
1238
                 SPR_NOACCESS, SPR_NOACCESS,
1239
                 &spr_read_generic, &spr_write_generic,
1240
                 0x00000000);
1241
    spr_register(env, SPR_BOOKE_IVOR35, "IVOR35",
1242
                 SPR_NOACCESS, SPR_NOACCESS,
1243
                 &spr_read_generic, &spr_write_generic,
1244
                 0x00000000);
1245
    spr_register(env, SPR_BOOKE_IVOR36, "IVOR36",
1246
                 SPR_NOACCESS, SPR_NOACCESS,
1247
                 &spr_read_generic, &spr_write_generic,
1248
                 0x00000000);
1249
    spr_register(env, SPR_BOOKE_IVOR37, "IVOR37",
1250
                 SPR_NOACCESS, SPR_NOACCESS,
1251
                 &spr_read_generic, &spr_write_generic,
1252
                 0x00000000);
1253
    spr_register(env, SPR_BOOKE_PID, "PID",
1254
                 SPR_NOACCESS, SPR_NOACCESS,
1255
                 &spr_read_generic, &spr_write_generic,
1256
                 0x00000000);
1257
    spr_register(env, SPR_BOOKE_TCR, "TCR",
1258
                 SPR_NOACCESS, SPR_NOACCESS,
1259
                 &spr_read_generic, &spr_write_booke_tcr,
1260
                 0x00000000);
1261
    spr_register(env, SPR_BOOKE_TSR, "TSR",
1262
                 SPR_NOACCESS, SPR_NOACCESS,
1263
                 &spr_read_generic, &spr_write_booke_tsr,
1264
                 0x00000000);
1265
    /* Timer */
1266
    spr_register(env, SPR_DECR, "DECR",
1267
                 SPR_NOACCESS, SPR_NOACCESS,
1268
                 &spr_read_decr, &spr_write_decr,
1269
                 0x00000000);
1270
    spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1271
                 SPR_NOACCESS, SPR_NOACCESS,
1272
                 SPR_NOACCESS, &spr_write_generic,
1273
                 0x00000000);
1274
    /* SPRGs */
1275
    spr_register(env, SPR_USPRG0, "USPRG0",
1276
                 &spr_read_generic, &spr_write_generic,
1277
                 &spr_read_generic, &spr_write_generic,
1278
                 0x00000000);
1279
    spr_register(env, SPR_SPRG4, "SPRG4",
1280
                 SPR_NOACCESS, SPR_NOACCESS,
1281
                 &spr_read_generic, &spr_write_generic,
1282
                 0x00000000);
1283
    spr_register(env, SPR_USPRG4, "USPRG4",
1284
                 &spr_read_ureg, SPR_NOACCESS,
1285
                 &spr_read_ureg, SPR_NOACCESS,
1286
                 0x00000000);
1287
    spr_register(env, SPR_SPRG5, "SPRG5",
1288
                 SPR_NOACCESS, SPR_NOACCESS,
1289
                 &spr_read_generic, &spr_write_generic,
1290
                 0x00000000);
1291
    spr_register(env, SPR_USPRG5, "USPRG5",
1292
                 &spr_read_ureg, SPR_NOACCESS,
1293
                 &spr_read_ureg, SPR_NOACCESS,
1294
                 0x00000000);
1295
    spr_register(env, SPR_SPRG6, "SPRG6",
1296
                 SPR_NOACCESS, SPR_NOACCESS,
1297
                 &spr_read_generic, &spr_write_generic,
1298
                 0x00000000);
1299
    spr_register(env, SPR_USPRG6, "USPRG6",
1300
                 &spr_read_ureg, SPR_NOACCESS,
1301
                 &spr_read_ureg, SPR_NOACCESS,
1302
                 0x00000000);
1303
    spr_register(env, SPR_SPRG7, "SPRG7",
1304
                 SPR_NOACCESS, SPR_NOACCESS,
1305
                 &spr_read_generic, &spr_write_generic,
1306
                 0x00000000);
1307
    spr_register(env, SPR_USPRG7, "USPRG7",
1308
                 &spr_read_ureg, SPR_NOACCESS,
1309
                 &spr_read_ureg, SPR_NOACCESS,
1310
                 0x00000000);
1311
}
1312

    
1313
/* FSL storage control registers */
1314
static void gen_spr_BookE_FSL (CPUPPCState *env)
1315
{
1316
    /* TLB assist registers */
1317
    spr_register(env, SPR_BOOKE_MAS0, "MAS0",
1318
                 SPR_NOACCESS, SPR_NOACCESS,
1319
                 &spr_read_generic, &spr_write_generic,
1320
                 0x00000000);
1321
    spr_register(env, SPR_BOOKE_MAS1, "MAS2",
1322
                 SPR_NOACCESS, SPR_NOACCESS,
1323
                 &spr_read_generic, &spr_write_generic,
1324
                 0x00000000);
1325
    spr_register(env, SPR_BOOKE_MAS2, "MAS3",
1326
                 SPR_NOACCESS, SPR_NOACCESS,
1327
                 &spr_read_generic, &spr_write_generic,
1328
                 0x00000000);
1329
    spr_register(env, SPR_BOOKE_MAS3, "MAS4",
1330
                 SPR_NOACCESS, SPR_NOACCESS,
1331
                 &spr_read_generic, &spr_write_generic,
1332
                 0x00000000);
1333
    spr_register(env, SPR_BOOKE_MAS4, "MAS5",
1334
                 SPR_NOACCESS, SPR_NOACCESS,
1335
                 &spr_read_generic, &spr_write_generic,
1336
                 0x00000000);
1337
    spr_register(env, SPR_BOOKE_MAS6, "MAS6",
1338
                 SPR_NOACCESS, SPR_NOACCESS,
1339
                 &spr_read_generic, &spr_write_generic,
1340
                 0x00000000);
1341
    spr_register(env, SPR_BOOKE_MAS7, "MAS7",
1342
                 SPR_NOACCESS, SPR_NOACCESS,
1343
                 &spr_read_generic, &spr_write_generic,
1344
                 0x00000000);
1345
    if (env->nb_pids > 1) {
1346
        spr_register(env, SPR_BOOKE_PID1, "PID1",
1347
                     SPR_NOACCESS, SPR_NOACCESS,
1348
                     &spr_read_generic, &spr_write_generic,
1349
                     0x00000000);
1350
    }
1351
    if (env->nb_pids > 2) {
1352
        spr_register(env, SPR_BOOKE_PID2, "PID2",
1353
                     SPR_NOACCESS, SPR_NOACCESS,
1354
                     &spr_read_generic, &spr_write_generic,
1355
                     0x00000000);
1356
    }
1357
    spr_register(env, SPR_BOOKE_MMUCFG, "MMUCFG",
1358
                 SPR_NOACCESS, SPR_NOACCESS,
1359
                 &spr_read_generic, SPR_NOACCESS,
1360
                 0x00000000); /* TOFIX */
1361
    spr_register(env, SPR_BOOKE_MMUCSR0, "MMUCSR0",
1362
                 SPR_NOACCESS, SPR_NOACCESS,
1363
                 &spr_read_generic, &spr_write_generic,
1364
                 0x00000000); /* TOFIX */
1365
    switch (env->nb_ways) {
1366
    case 4:
1367
        spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1368
                     SPR_NOACCESS, SPR_NOACCESS,
1369
                     &spr_read_generic, SPR_NOACCESS,
1370
                     0x00000000); /* TOFIX */
1371
        /* Fallthru */
1372
    case 3:
1373
        spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1374
                     SPR_NOACCESS, SPR_NOACCESS,
1375
                     &spr_read_generic, SPR_NOACCESS,
1376
                     0x00000000); /* TOFIX */
1377
        /* Fallthru */
1378
    case 2:
1379
        spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1380
                     SPR_NOACCESS, SPR_NOACCESS,
1381
                     &spr_read_generic, SPR_NOACCESS,
1382
                     0x00000000); /* TOFIX */
1383
        /* Fallthru */
1384
    case 1:
1385
        spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1386
                     SPR_NOACCESS, SPR_NOACCESS,
1387
                     &spr_read_generic, SPR_NOACCESS,
1388
                     0x00000000); /* TOFIX */
1389
        /* Fallthru */
1390
    case 0:
1391
    default:
1392
        break;
1393
    }
1394
}
1395

    
1396
/* SPR specific to PowerPC 440 implementation */
1397
static void gen_spr_440 (CPUPPCState *env)
1398
{
1399
    /* Cache control */
1400
    /* XXX : not implemented */
1401
    spr_register(env, SPR_440_DNV0, "DNV0",
1402
                 SPR_NOACCESS, SPR_NOACCESS,
1403
                 &spr_read_generic, &spr_write_generic,
1404
                 0x00000000);
1405
    /* XXX : not implemented */
1406
    spr_register(env, SPR_440_DNV1, "DNV1",
1407
                 SPR_NOACCESS, SPR_NOACCESS,
1408
                 &spr_read_generic, &spr_write_generic,
1409
                 0x00000000);
1410
    /* XXX : not implemented */
1411
    spr_register(env, SPR_440_DNV2, "DNV2",
1412
                 SPR_NOACCESS, SPR_NOACCESS,
1413
                 &spr_read_generic, &spr_write_generic,
1414
                 0x00000000);
1415
    /* XXX : not implemented */
1416
    spr_register(env, SPR_440_DNV3, "DNV3",
1417
                 SPR_NOACCESS, SPR_NOACCESS,
1418
                 &spr_read_generic, &spr_write_generic,
1419
                 0x00000000);
1420
    /* XXX : not implemented */
1421
    spr_register(env, SPR_440_DVT0, "DVT0",
1422
                 SPR_NOACCESS, SPR_NOACCESS,
1423
                 &spr_read_generic, &spr_write_generic,
1424
                 0x00000000);
1425
    /* XXX : not implemented */
1426
    spr_register(env, SPR_440_DVT1, "DVT1",
1427
                 SPR_NOACCESS, SPR_NOACCESS,
1428
                 &spr_read_generic, &spr_write_generic,
1429
                 0x00000000);
1430
    /* XXX : not implemented */
1431
    spr_register(env, SPR_440_DVT2, "DVT2",
1432
                 SPR_NOACCESS, SPR_NOACCESS,
1433
                 &spr_read_generic, &spr_write_generic,
1434
                 0x00000000);
1435
    /* XXX : not implemented */
1436
    spr_register(env, SPR_440_DVT3, "DVT3",
1437
                 SPR_NOACCESS, SPR_NOACCESS,
1438
                 &spr_read_generic, &spr_write_generic,
1439
                 0x00000000);
1440
    /* XXX : not implemented */
1441
    spr_register(env, SPR_440_DVLIM, "DVLIM",
1442
                 SPR_NOACCESS, SPR_NOACCESS,
1443
                 &spr_read_generic, &spr_write_generic,
1444
                 0x00000000);
1445
    /* XXX : not implemented */
1446
    spr_register(env, SPR_440_INV0, "INV0",
1447
                 SPR_NOACCESS, SPR_NOACCESS,
1448
                 &spr_read_generic, &spr_write_generic,
1449
                 0x00000000);
1450
    /* XXX : not implemented */
1451
    spr_register(env, SPR_440_INV1, "INV1",
1452
                 SPR_NOACCESS, SPR_NOACCESS,
1453
                 &spr_read_generic, &spr_write_generic,
1454
                 0x00000000);
1455
    /* XXX : not implemented */
1456
    spr_register(env, SPR_440_INV2, "INV2",
1457
                 SPR_NOACCESS, SPR_NOACCESS,
1458
                 &spr_read_generic, &spr_write_generic,
1459
                 0x00000000);
1460
    /* XXX : not implemented */
1461
    spr_register(env, SPR_440_INV3, "INV3",
1462
                 SPR_NOACCESS, SPR_NOACCESS,
1463
                 &spr_read_generic, &spr_write_generic,
1464
                 0x00000000);
1465
    /* XXX : not implemented */
1466
    spr_register(env, SPR_440_IVT0, "IVT0",
1467
                 SPR_NOACCESS, SPR_NOACCESS,
1468
                 &spr_read_generic, &spr_write_generic,
1469
                 0x00000000);
1470
    /* XXX : not implemented */
1471
    spr_register(env, SPR_440_IVT1, "IVT1",
1472
                 SPR_NOACCESS, SPR_NOACCESS,
1473
                 &spr_read_generic, &spr_write_generic,
1474
                 0x00000000);
1475
    /* XXX : not implemented */
1476
    spr_register(env, SPR_440_IVT2, "IVT2",
1477
                 SPR_NOACCESS, SPR_NOACCESS,
1478
                 &spr_read_generic, &spr_write_generic,
1479
                 0x00000000);
1480
    /* XXX : not implemented */
1481
    spr_register(env, SPR_440_IVT3, "IVT3",
1482
                 SPR_NOACCESS, SPR_NOACCESS,
1483
                 &spr_read_generic, &spr_write_generic,
1484
                 0x00000000);
1485
    /* XXX : not implemented */
1486
    spr_register(env, SPR_440_IVLIM, "IVLIM",
1487
                 SPR_NOACCESS, SPR_NOACCESS,
1488
                 &spr_read_generic, &spr_write_generic,
1489
                 0x00000000);
1490
    /* Cache debug */
1491
    /* XXX : not implemented */
1492
    spr_register(env, SPR_BOOKE_DCBTRH, "DCBTRH",
1493
                 SPR_NOACCESS, SPR_NOACCESS,
1494
                 &spr_read_generic, SPR_NOACCESS,
1495
                 0x00000000);
1496
    /* XXX : not implemented */
1497
    spr_register(env, SPR_BOOKE_DCBTRL, "DCBTRL",
1498
                 SPR_NOACCESS, SPR_NOACCESS,
1499
                 &spr_read_generic, SPR_NOACCESS,
1500
                 0x00000000);
1501
    /* XXX : not implemented */
1502
    spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1503
                 SPR_NOACCESS, SPR_NOACCESS,
1504
                 &spr_read_generic, SPR_NOACCESS,
1505
                 0x00000000);
1506
    /* XXX : not implemented */
1507
    spr_register(env, SPR_BOOKE_ICBTRH, "ICBTRH",
1508
                 SPR_NOACCESS, SPR_NOACCESS,
1509
                 &spr_read_generic, SPR_NOACCESS,
1510
                 0x00000000);
1511
    /* XXX : not implemented */
1512
    spr_register(env, SPR_BOOKE_ICBTRL, "ICBTRL",
1513
                 SPR_NOACCESS, SPR_NOACCESS,
1514
                 &spr_read_generic, SPR_NOACCESS,
1515
                 0x00000000);
1516
    /* XXX : not implemented */
1517
    spr_register(env, SPR_440_DBDR, "DBDR",
1518
                 SPR_NOACCESS, SPR_NOACCESS,
1519
                 &spr_read_generic, &spr_write_generic,
1520
                 0x00000000);
1521
    /* Processor control */
1522
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1523
                 SPR_NOACCESS, SPR_NOACCESS,
1524
                 &spr_read_generic, &spr_write_generic,
1525
                 0x00000000);
1526
    spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1527
                 SPR_NOACCESS, SPR_NOACCESS,
1528
                 &spr_read_generic, SPR_NOACCESS,
1529
                 0x00000000);
1530
    /* Storage control */
1531
    spr_register(env, SPR_440_MMUCR, "MMUCR",
1532
                 SPR_NOACCESS, SPR_NOACCESS,
1533
                 &spr_read_generic, &spr_write_generic,
1534
                 0x00000000);
1535
}
1536

    
1537
/* SPR shared between PowerPC 40x implementations */
1538
static void gen_spr_40x (CPUPPCState *env)
1539
{
1540
    /* Cache */
1541
    /* XXX : not implemented */
1542
    spr_register(env, SPR_40x_DCCR, "DCCR",
1543
                 SPR_NOACCESS, SPR_NOACCESS,
1544
                 &spr_read_generic, &spr_write_generic,
1545
                 0x00000000);
1546
    /* XXX : not implemented */
1547
    spr_register(env, SPR_40x_DCWR, "DCWR",
1548
                 SPR_NOACCESS, SPR_NOACCESS,
1549
                 &spr_read_generic, &spr_write_generic,
1550
                 0x00000000);
1551
    /* XXX : not implemented */
1552
    spr_register(env, SPR_40x_ICCR, "ICCR",
1553
                 SPR_NOACCESS, SPR_NOACCESS,
1554
                 &spr_read_generic, &spr_write_generic,
1555
                 0x00000000);
1556
    /* XXX : not implemented */
1557
    spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1558
                 SPR_NOACCESS, SPR_NOACCESS,
1559
                 &spr_read_generic, SPR_NOACCESS,
1560
                 0x00000000);
1561
    /* Bus access control */
1562
    spr_register(env, SPR_40x_SGR, "SGR",
1563
                 SPR_NOACCESS, SPR_NOACCESS,
1564
                 &spr_read_generic, &spr_write_generic,
1565
                 0xFFFFFFFF);
1566
    spr_register(env, SPR_40x_ZPR, "ZPR",
1567
                 SPR_NOACCESS, SPR_NOACCESS,
1568
                 &spr_read_generic, &spr_write_generic,
1569
                 0x00000000);
1570
    /* MMU */
1571
    spr_register(env, SPR_40x_PID, "PID",
1572
                 SPR_NOACCESS, SPR_NOACCESS,
1573
                 &spr_read_generic, &spr_write_generic,
1574
                 0x00000000);
1575
    /* Exception */
1576
    spr_register(env, SPR_40x_DEAR, "DEAR",
1577
                 SPR_NOACCESS, SPR_NOACCESS,
1578
                 &spr_read_generic, &spr_write_generic,
1579
                 0x00000000);
1580
    spr_register(env, SPR_40x_ESR, "ESR",
1581
                 SPR_NOACCESS, SPR_NOACCESS,
1582
                 &spr_read_generic, &spr_write_generic,
1583
                 0x00000000);
1584
    spr_register(env, SPR_40x_EVPR, "EVPR",
1585
                 SPR_NOACCESS, SPR_NOACCESS,
1586
                 &spr_read_generic, &spr_write_generic,
1587
                 0x00000000);
1588
    spr_register(env, SPR_40x_SRR2, "SRR2",
1589
                 &spr_read_generic, &spr_write_generic,
1590
                 &spr_read_generic, &spr_write_generic,
1591
                 0x00000000);
1592
    spr_register(env, SPR_40x_SRR3, "SRR3",
1593
                 &spr_read_generic, &spr_write_generic,
1594
                 &spr_read_generic, &spr_write_generic,
1595
                 0x00000000);
1596
    /* Timers */
1597
    spr_register(env, SPR_40x_PIT, "PIT",
1598
                 SPR_NOACCESS, SPR_NOACCESS,
1599
                 &spr_read_40x_pit, &spr_write_40x_pit,
1600
                 0x00000000);
1601
    spr_register(env, SPR_40x_TCR, "TCR",
1602
                 SPR_NOACCESS, SPR_NOACCESS,
1603
                 &spr_read_generic, &spr_write_booke_tcr,
1604
                 0x00000000);
1605
    spr_register(env, SPR_40x_TSR, "TSR",
1606
                 SPR_NOACCESS, SPR_NOACCESS,
1607
                 &spr_read_generic, &spr_write_booke_tsr,
1608
                 0x00000000);
1609
    /* Debug interface */
1610
    /* XXX : not implemented */
1611
    spr_register(env, SPR_40x_DAC1, "DAC1",
1612
                 SPR_NOACCESS, SPR_NOACCESS,
1613
                 &spr_read_generic, &spr_write_generic,
1614
                 0x00000000);
1615
    spr_register(env, SPR_40x_DAC2, "DAC2",
1616
                 SPR_NOACCESS, SPR_NOACCESS,
1617
                 &spr_read_generic, &spr_write_generic,
1618
                 0x00000000);
1619
    /* XXX : not implemented */
1620
    spr_register(env, SPR_40x_DBCR0, "DBCR0",
1621
                 SPR_NOACCESS, SPR_NOACCESS,
1622
                 &spr_read_generic, &spr_write_generic,
1623
                 0x00000000);
1624
    /* XXX : not implemented */
1625
    spr_register(env, SPR_40x_DBSR, "DBSR",
1626
                 SPR_NOACCESS, SPR_NOACCESS,
1627
                 &spr_read_generic, &spr_write_generic,
1628
                 /* Last reset was system reset (system boot */
1629
                 0x00000300);
1630
    /* XXX : not implemented */
1631
    spr_register(env, SPR_40x_IAC1, "IAC1",
1632
                 SPR_NOACCESS, SPR_NOACCESS,
1633
                 &spr_read_generic, &spr_write_generic,
1634
                 0x00000000);
1635
    spr_register(env, SPR_40x_IAC2, "IAC2",
1636
                 SPR_NOACCESS, SPR_NOACCESS,
1637
                 &spr_read_generic, &spr_write_generic,
1638
                 0x00000000);
1639
}
1640

    
1641
/* SPR specific to PowerPC 405 implementation */
1642
static void gen_spr_405 (CPUPPCState *env)
1643
{
1644
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1645
                 SPR_NOACCESS, SPR_NOACCESS,
1646
                 &spr_read_generic, &spr_write_generic,
1647
                 0x00700000);
1648
    /* Debug */
1649
    /* XXX : not implemented */
1650
    spr_register(env, SPR_405_DBCR1, "DBCR1",
1651
                 SPR_NOACCESS, SPR_NOACCESS,
1652
                 &spr_read_generic, &spr_write_generic,
1653
                 0x00000000);
1654
    /* XXX : not implemented */
1655
    spr_register(env, SPR_405_DVC1, "DVC1",
1656
                 SPR_NOACCESS, SPR_NOACCESS,
1657
                 &spr_read_generic, &spr_write_generic,
1658
                 0x00000000);
1659
    /* XXX : not implemented */
1660
    spr_register(env, SPR_405_DVC2, "DVC2",
1661
                 SPR_NOACCESS, SPR_NOACCESS,
1662
                 &spr_read_generic, &spr_write_generic,
1663
                 0x00000000);
1664
    /* XXX : not implemented */
1665
    spr_register(env, SPR_405_IAC3, "IAC3",
1666
                 SPR_NOACCESS, SPR_NOACCESS,
1667
                 &spr_read_generic, &spr_write_generic,
1668
                 0x00000000);
1669
    /* XXX : not implemented */
1670
    spr_register(env, SPR_405_IAC4, "IAC4",
1671
                 SPR_NOACCESS, SPR_NOACCESS,
1672
                 &spr_read_generic, &spr_write_generic,
1673
                 0x00000000);
1674
    /* Storage control */
1675
    /* XXX : not implemented */
1676
    spr_register(env, SPR_405_SLER, "SLER",
1677
                 SPR_NOACCESS, SPR_NOACCESS,
1678
                 &spr_read_generic, &spr_write_generic,
1679
                 0x00000000);
1680
    /* XXX : not implemented */
1681
    spr_register(env, SPR_405_SU0R, "SU0R",
1682
                 SPR_NOACCESS, SPR_NOACCESS,
1683
                 &spr_read_generic, &spr_write_generic,
1684
                 0x00000000);
1685
    /* SPRG */
1686
    spr_register(env, SPR_USPRG0, "USPRG0",
1687
                 &spr_read_ureg, SPR_NOACCESS,
1688
                 &spr_read_ureg, SPR_NOACCESS,
1689
                 0x00000000);
1690
    spr_register(env, SPR_SPRG4, "SPRG4",
1691
                 SPR_NOACCESS, SPR_NOACCESS,
1692
                 SPR_NOACCESS, &spr_write_generic,
1693
                 0x00000000);
1694
    spr_register(env, SPR_USPRG4, "USPRG4",
1695
                 &spr_read_ureg, SPR_NOACCESS,
1696
                 &spr_read_ureg, SPR_NOACCESS,
1697
                 0x00000000);
1698
    spr_register(env, SPR_SPRG5, "SPRG5",
1699
                 SPR_NOACCESS, SPR_NOACCESS,
1700
                 SPR_NOACCESS, &spr_write_generic,
1701
                 0x00000000);
1702
    spr_register(env, SPR_USPRG5, "USPRG5",
1703
                 &spr_read_ureg, SPR_NOACCESS,
1704
                 &spr_read_ureg, SPR_NOACCESS,
1705
                 0x00000000);
1706
    spr_register(env, SPR_SPRG6, "SPRG6",
1707
                 SPR_NOACCESS, SPR_NOACCESS,
1708
                 SPR_NOACCESS, &spr_write_generic,
1709
                 0x00000000);
1710
    spr_register(env, SPR_USPRG6, "USPRG6",
1711
                 &spr_read_ureg, SPR_NOACCESS,
1712
                 &spr_read_ureg, SPR_NOACCESS,
1713
                 0x00000000);
1714
    spr_register(env, SPR_SPRG7, "SPRG7",
1715
                 SPR_NOACCESS, SPR_NOACCESS,
1716
                 SPR_NOACCESS, &spr_write_generic,
1717
                 0x00000000);
1718
    spr_register(env, SPR_USPRG7, "USPRG7",
1719
                 &spr_read_ureg, SPR_NOACCESS,
1720
                 &spr_read_ureg, SPR_NOACCESS,
1721
                 0x00000000);
1722
    /* Debug */
1723
    /* XXX : not implemented */
1724
    spr_register(env, SPR_40x_DAC2, "DAC2",
1725
                 SPR_NOACCESS, SPR_NOACCESS,
1726
                 &spr_read_generic, &spr_write_generic,
1727
                 0x00000000);
1728
    /* XXX : not implemented */
1729
    spr_register(env, SPR_40x_IAC2, "IAC2",
1730
                 SPR_NOACCESS, SPR_NOACCESS,
1731
                 &spr_read_generic, &spr_write_generic,
1732
                 0x00000000);
1733
}
1734

    
1735
/* SPR shared between PowerPC 401 & 403 implementations */
1736
static void gen_spr_401_403 (CPUPPCState *env)
1737
{
1738
    /* Time base */
1739
    spr_register(env, SPR_403_VTBL,  "TBL",
1740
                 &spr_read_tbl, SPR_NOACCESS,
1741
                 &spr_read_tbl, SPR_NOACCESS,
1742
                 0x00000000);
1743
    spr_register(env, SPR_403_TBL,   "TBL",
1744
                 SPR_NOACCESS, SPR_NOACCESS,
1745
                 SPR_NOACCESS, &spr_write_tbl,
1746
                 0x00000000);
1747
    spr_register(env, SPR_403_VTBU,  "TBU",
1748
                 &spr_read_tbu, SPR_NOACCESS,
1749
                 &spr_read_tbu, SPR_NOACCESS,
1750
                 0x00000000);
1751
    spr_register(env, SPR_403_TBU,   "TBU",
1752
                 SPR_NOACCESS, SPR_NOACCESS,
1753
                 SPR_NOACCESS, &spr_write_tbu,
1754
                 0x00000000);
1755
    /* Debug */
1756
    /* XXX: not implemented */
1757
    spr_register(env, SPR_403_CDBCR, "CDBCR",
1758
                 SPR_NOACCESS, SPR_NOACCESS,
1759
                 &spr_read_generic, &spr_write_generic,
1760
                 0x00000000);
1761
}
1762

    
1763
/* SPR specific to PowerPC 403 implementation */
1764
static void gen_spr_403 (CPUPPCState *env)
1765
{
1766
    /* MMU */
1767
    spr_register(env, SPR_403_PBL1,  "PBL1",
1768
                 SPR_NOACCESS, SPR_NOACCESS,
1769
                 &spr_read_403_pbr, &spr_write_403_pbr,
1770
                 0x00000000);
1771
    spr_register(env, SPR_403_PBU1,  "PBU1",
1772
                 SPR_NOACCESS, SPR_NOACCESS,
1773
                 &spr_read_403_pbr, &spr_write_403_pbr,
1774
                 0x00000000);
1775
    spr_register(env, SPR_403_PBL2,  "PBL2",
1776
                 SPR_NOACCESS, SPR_NOACCESS,
1777
                 &spr_read_403_pbr, &spr_write_403_pbr,
1778
                 0x00000000);
1779
    spr_register(env, SPR_403_PBU2,  "PBU2",
1780
                 SPR_NOACCESS, SPR_NOACCESS,
1781
                 &spr_read_403_pbr, &spr_write_403_pbr,
1782
                 0x00000000);
1783
    /* Debug */
1784
    /* XXX : not implemented */
1785
    spr_register(env, SPR_40x_DAC2, "DAC2",
1786
                 SPR_NOACCESS, SPR_NOACCESS,
1787
                 &spr_read_generic, &spr_write_generic,
1788
                 0x00000000);
1789
    /* XXX : not implemented */
1790
    spr_register(env, SPR_40x_IAC2, "IAC2",
1791
                 SPR_NOACCESS, SPR_NOACCESS,
1792
                 &spr_read_generic, &spr_write_generic,
1793
                 0x00000000);
1794
}
1795

    
1796
/* SPR specific to PowerPC compression coprocessor extension */
1797
#if defined (TODO)
1798
static void gen_spr_compress (CPUPPCState *env)
1799
{
1800
    spr_register(env, SPR_401_SKR, "SKR",
1801
                 SPR_NOACCESS, SPR_NOACCESS,
1802
                 &spr_read_generic, &spr_write_generic,
1803
                 0x00000000);
1804
}
1805
#endif
1806

    
1807
// XXX: TODO (64 bits PowerPC SPRs)
1808
/*
1809
 * ASR => SPR 280 (64 bits)
1810
 * FPECR => SPR 1022 (?)
1811
 * VRSAVE => SPR 256 (Altivec)
1812
 * SCOMC => SPR 276 (64 bits ?)
1813
 * SCOMD => SPR 277 (64 bits ?)
1814
 * HSPRG0 => SPR 304 (hypervisor)
1815
 * HSPRG1 => SPR 305 (hypervisor)
1816
 * HDEC => SPR 310 (hypervisor)
1817
 * HIOR => SPR 311 (hypervisor)
1818
 * RMOR => SPR 312 (970)
1819
 * HRMOR => SPR 313 (hypervisor)
1820
 * HSRR0 => SPR 314 (hypervisor)
1821
 * HSRR1 => SPR 315 (hypervisor)
1822
 * LPCR => SPR 316 (970)
1823
 * LPIDR => SPR 317 (970)
1824
 * ... and more (thermal management, performance counters, ...)
1825
 */
1826

    
1827
static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
1828
{
1829
    env->reserve = -1;
1830
    /* Default MMU definitions */
1831
    env->nb_BATs = -1;
1832
    env->nb_tlb = 0;
1833
    env->nb_ways = 0;
1834
    /* XXX: missing:
1835
     * 32 bits PowerPC:
1836
     * - MPC5xx(x)
1837
     * - MPC8xx(x)
1838
     * - RCPU (same as MPC5xx ?)
1839
     */
1840
    spr_register(env, SPR_PVR, "PVR",
1841
                 SPR_NOACCESS, SPR_NOACCESS,
1842
                 &spr_read_generic, SPR_NOACCESS,
1843
                 def->pvr);
1844
    printf("%s: PVR %08x mask %08x => %08x\n", __func__,
1845
           def->pvr, def->pvr_mask, def->pvr & def->pvr_mask);
1846
    switch (def->pvr & def->pvr_mask) {
1847
    /* Embedded PowerPC from IBM                           */
1848
    case CPU_PPC_401A1:   /* 401 A1 family                 */
1849
    case CPU_PPC_401B2:   /* 401 B2 family                 */
1850
    case CPU_PPC_401C2:   /* 401 C2 family                 */
1851
    case CPU_PPC_401D2:   /* 401 D2 family                 */
1852
    case CPU_PPC_401E2:   /* 401 E2 family                 */
1853
    case CPU_PPC_401F2:   /* 401 F2 family                 */
1854
    case CPU_PPC_401G2:   /* 401 G2 family                 */
1855
    case CPU_PPC_IOP480:  /* IOP 480 family                */
1856
    case CPU_PPC_COBRA:   /* IBM Processor for Network Resources */
1857
        gen_spr_generic(env);
1858
        gen_spr_40x(env);
1859
        gen_spr_401_403(env);
1860
#if defined (TODO)
1861
        /* XXX: optional ? */
1862
        gen_spr_compress(env);
1863
#endif
1864
        env->nb_BATs = 0;
1865
        env->nb_tlb = 64;
1866
        env->nb_ways = 1;
1867
        env->id_tlbs = 0;
1868
        break;
1869

    
1870
    case CPU_PPC_403GA:   /* 403 GA family                 */
1871
    case CPU_PPC_403GB:   /* 403 GB family                 */
1872
    case CPU_PPC_403GC:   /* 403 GC family                 */
1873
    case CPU_PPC_403GCX:  /* 403 GCX family                */
1874
        gen_spr_generic(env);
1875
        gen_spr_40x(env);
1876
        gen_spr_401_403(env);
1877
        gen_spr_403(env);
1878
        env->nb_BATs = 0;
1879
        env->nb_tlb = 64;
1880
        env->nb_ways = 1;
1881
        env->id_tlbs = 0;
1882
        break;
1883

    
1884
    case CPU_PPC_405CR:   /* 405 GP/CR family              */
1885
    case CPU_PPC_405EP:   /* 405 EP family                 */
1886
    case CPU_PPC_405GPR:  /* 405 GPR family                */
1887
    case CPU_PPC_405D2:   /* 405 D2 family                 */
1888
    case CPU_PPC_405D4:   /* 405 D4 family                 */
1889
        gen_spr_generic(env);
1890
        /* Time base */
1891
        gen_tbl(env);
1892
        gen_spr_40x(env);
1893
        gen_spr_405(env);
1894
        env->nb_BATs = 0;
1895
        env->nb_tlb = 64;
1896
        env->nb_ways = 1;
1897
        env->id_tlbs = 0;
1898
        break;
1899

    
1900
    case CPU_PPC_NPE405H: /* NPe405 H family               */
1901
    case CPU_PPC_NPE405H2:
1902
    case CPU_PPC_NPE405L: /* Npe405 L family               */
1903
        gen_spr_generic(env);
1904
        /* Time base */
1905
        gen_tbl(env);
1906
        gen_spr_40x(env);
1907
        gen_spr_405(env);
1908
        env->nb_BATs = 0;
1909
        env->nb_tlb = 64;
1910
        env->nb_ways = 1;
1911
        env->id_tlbs = 0;
1912
        break;
1913

    
1914
#if defined (TODO)
1915
    case CPU_PPC_STB01000:
1916
#endif
1917
#if defined (TODO)
1918
    case CPU_PPC_STB01010:
1919
#endif
1920
#if defined (TODO)
1921
    case CPU_PPC_STB0210:
1922
#endif
1923
    case CPU_PPC_STB03:   /* STB03 family                  */
1924
#if defined (TODO)
1925
    case CPU_PPC_STB043:  /* STB043 family                  */
1926
#endif
1927
#if defined (TODO)
1928
    case CPU_PPC_STB045:  /* STB045 family                  */
1929
#endif
1930
    case CPU_PPC_STB25:   /* STB25 family                  */
1931
#if defined (TODO)
1932
    case CPU_PPC_STB130:  /* STB130 family                 */
1933
#endif
1934
        gen_spr_generic(env);
1935
        /* Time base */
1936
        gen_tbl(env);
1937
        gen_spr_40x(env);
1938
        gen_spr_405(env);
1939
        env->nb_BATs = 0;
1940
        env->nb_tlb = 64;
1941
        env->nb_ways = 1;
1942
        env->id_tlbs = 0;
1943
        break;
1944

    
1945
    case CPU_PPC_440EP:   /* 440 EP family                 */
1946
    case CPU_PPC_440GP:   /* 440 GP family                 */
1947
    case CPU_PPC_440GX:   /* 440 GX family                 */
1948
    case CPU_PPC_440GXc:  /* 440 GXc family                */
1949
    case CPU_PPC_440GXf:  /* 440 GXf family                */
1950
    case CPU_PPC_440SP:   /* 440 SP family                 */
1951
    case CPU_PPC_440SP2:
1952
    case CPU_PPC_440SPE:  /* 440 SPE family                */
1953
        gen_spr_generic(env);
1954
        /* Time base */
1955
        gen_tbl(env);
1956
        gen_spr_BookE(env);
1957
        gen_spr_440(env);
1958
        env->nb_BATs = 0;
1959
        env->nb_tlb = 64;
1960
        env->nb_ways = 1;
1961
        env->id_tlbs = 0;
1962
        break;
1963

    
1964
    /* Embedded PowerPC from Freescale                     */
1965
#if defined (TODO)
1966
    case CPU_PPC_5xx:
1967
        break;
1968
#endif
1969
#if defined (TODO)
1970
    case CPU_PPC_8xx:     /* MPC821 / 823 / 850 / 860      */
1971
        break;
1972
#endif
1973
#if defined (TODO)
1974
    case CPU_PPC_82xx_HIP3:    /* MPC8240 / 8260                */
1975
    case CPU_PPC_82xx_HIP4:    /* MPC8240 / 8260                */
1976
        break;
1977
#endif
1978
#if defined (TODO)
1979
    case CPU_PPC_827x:    /* MPC 827x / 828x               */
1980
        break;
1981
#endif
1982

    
1983
    /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
1984
    case CPU_PPC_e500v110:
1985
    case CPU_PPC_e500v120:
1986
    case CPU_PPC_e500v210:
1987
    case CPU_PPC_e500v220:
1988
        gen_spr_generic(env);
1989
        /* Time base */
1990
        gen_tbl(env);
1991
        gen_spr_BookE(env);
1992
        gen_spr_BookE_FSL(env);
1993
        env->nb_BATs = 0;
1994
        env->nb_tlb = 64;
1995
        env->nb_ways = 1;
1996
        env->id_tlbs = 0;
1997
        break;
1998

    
1999
#if defined (TODO)
2000
    case CPU_PPC_e600:
2001
        break;
2002
#endif
2003

    
2004
    /* 32 bits PowerPC                                     */
2005
    case CPU_PPC_601:     /* PowerPC 601                   */
2006
        gen_spr_generic(env);
2007
        gen_spr_ne_601(env);
2008
        gen_spr_601(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
        /* XXX : not implemented */
2021
        spr_register(env, SPR_601_HID2, "HID2",
2022
                     SPR_NOACCESS, SPR_NOACCESS,
2023
                     &spr_read_generic, &spr_write_generic,
2024
                     0x00000000);
2025
        /* XXX : not implemented */
2026
        spr_register(env, SPR_601_HID5, "HID5",
2027
                     SPR_NOACCESS, SPR_NOACCESS,
2028
                     &spr_read_generic, &spr_write_generic,
2029
                     0x00000000);
2030
        /* XXX : not implemented */
2031
#if 0 /* ? */
2032
        spr_register(env, SPR_601_HID15, "HID15",
2033
                     SPR_NOACCESS, SPR_NOACCESS,
2034
                     &spr_read_generic, &spr_write_generic,
2035
                     0x00000000);
2036
#endif
2037
        env->nb_tlb = 64;
2038
        env->nb_ways = 2;
2039
        env->id_tlbs = 0;
2040
        env->id_tlbs = 0;
2041
        break;
2042

    
2043
    case CPU_PPC_602:     /* PowerPC 602                   */
2044
        gen_spr_generic(env);
2045
        gen_spr_ne_601(env);
2046
        /* Memory management */
2047
        gen_low_BATs(env);
2048
        /* Time base */
2049
        gen_tbl(env);
2050
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2051
        gen_spr_602(env);
2052
        /* hardware implementation registers */
2053
        /* XXX : not implemented */
2054
        spr_register(env, SPR_HID0, "HID0",
2055
                     SPR_NOACCESS, SPR_NOACCESS,
2056
                     &spr_read_generic, &spr_write_generic,
2057
                     0x00000000);
2058
        /* XXX : not implemented */
2059
        spr_register(env, SPR_HID1, "HID1",
2060
                     SPR_NOACCESS, SPR_NOACCESS,
2061
                     &spr_read_generic, &spr_write_generic,
2062
                     0x00000000);
2063
        break;
2064

    
2065
    case CPU_PPC_603:     /* PowerPC 603                   */
2066
    case CPU_PPC_603E:    /* PowerPC 603e                  */
2067
    case CPU_PPC_603E7v:
2068
    case CPU_PPC_603E7v2:
2069
    case CPU_PPC_603P:    /* PowerPC 603p                  */
2070
    case CPU_PPC_603R:    /* PowerPC 603r                  */
2071
        gen_spr_generic(env);
2072
        gen_spr_ne_601(env);
2073
        /* Memory management */
2074
        gen_low_BATs(env);
2075
        /* Time base */
2076
        gen_tbl(env);
2077
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2078
        gen_spr_603(env);
2079
        /* hardware implementation registers */
2080
        /* XXX : not implemented */
2081
        spr_register(env, SPR_HID0, "HID0",
2082
                     SPR_NOACCESS, SPR_NOACCESS,
2083
                     &spr_read_generic, &spr_write_generic,
2084
                     0x00000000);
2085
        /* XXX : not implemented */
2086
        spr_register(env, SPR_HID1, "HID1",
2087
                     SPR_NOACCESS, SPR_NOACCESS,
2088
                     &spr_read_generic, &spr_write_generic,
2089
                     0x00000000);
2090
        break;
2091
        
2092
    case CPU_PPC_G2:      /* PowerPC G2 family             */
2093
    case CPU_PPC_G2H4:
2094
    case CPU_PPC_G2gp:
2095
    case CPU_PPC_G2ls:
2096
    case CPU_PPC_G2LE:    /* PowerPC G2LE family           */
2097
    case CPU_PPC_G2LEgp:
2098
    case CPU_PPC_G2LEls:
2099
        gen_spr_generic(env);
2100
        gen_spr_ne_601(env);
2101
        /* Memory management */
2102
        gen_low_BATs(env);
2103
        /* Time base */
2104
        gen_tbl(env);
2105
        /* Memory management */
2106
        gen_high_BATs(env);
2107
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2108
        gen_spr_G2_755(env);
2109
        gen_spr_G2(env);
2110
        /* Hardware implementation register */
2111
        /* XXX : not implemented */
2112
        spr_register(env, SPR_HID0, "HID0",
2113
                     SPR_NOACCESS, SPR_NOACCESS,
2114
                     &spr_read_generic, &spr_write_generic,
2115
                     0x00000000);
2116
        /* XXX : not implemented */
2117
        spr_register(env, SPR_HID1, "HID1",
2118
                     SPR_NOACCESS, SPR_NOACCESS,
2119
                     &spr_read_generic, &spr_write_generic,
2120
                     0x00000000);
2121
        /* XXX : not implemented */
2122
        spr_register(env, SPR_HID2, "HID2",
2123
                     SPR_NOACCESS, SPR_NOACCESS,
2124
                     &spr_read_generic, &spr_write_generic,
2125
                     0x00000000);
2126
        break;
2127

    
2128
    case CPU_PPC_604:     /* PowerPC 604                   */
2129
    case CPU_PPC_604E:    /* PowerPC 604e                  */
2130
    case CPU_PPC_604R:    /* PowerPC 604r                  */
2131
        gen_spr_generic(env);
2132
        gen_spr_ne_601(env);
2133
        /* Memory management */
2134
        gen_low_BATs(env);
2135
        /* Time base */
2136
        gen_tbl(env);
2137
        gen_spr_604(env);
2138
        /* Hardware implementation registers */
2139
        /* XXX : not implemented */
2140
        spr_register(env, SPR_HID0, "HID0",
2141
                     SPR_NOACCESS, SPR_NOACCESS,
2142
                     &spr_read_generic, &spr_write_generic,
2143
                     0x00000000);
2144
        /* XXX : not implemented */
2145
        spr_register(env, SPR_HID1, "HID1",
2146
                     SPR_NOACCESS, SPR_NOACCESS,
2147
                     &spr_read_generic, &spr_write_generic,
2148
                     0x00000000);
2149
        break;
2150

    
2151
    case CPU_PPC_74x:     /* PowerPC 740 / 750             */
2152
    case CPU_PPC_740E:
2153
    case CPU_PPC_750E:
2154
    case CPU_PPC_74xP:    /* PowerPC 740P / 750P           */
2155
    case CPU_PPC_750CXE21: /* IBM PowerPC 750cxe            */
2156
    case CPU_PPC_750CXE22:
2157
    case CPU_PPC_750CXE23:
2158
    case CPU_PPC_750CXE24:
2159
    case CPU_PPC_750CXE24b:
2160
    case CPU_PPC_750CXE31:
2161
    case CPU_PPC_750CXE31b:
2162
    case CPU_PPC_750CXR:
2163
        gen_spr_generic(env);
2164
        gen_spr_ne_601(env);
2165
        /* Memory management */
2166
        gen_low_BATs(env);
2167
        /* Time base */
2168
        gen_tbl(env);
2169
        gen_spr_7xx(env);
2170
        /* Hardware implementation registers */
2171
        /* XXX : not implemented */
2172
        spr_register(env, SPR_HID0, "HID0",
2173
                     SPR_NOACCESS, SPR_NOACCESS,
2174
                     &spr_read_generic, &spr_write_generic,
2175
                     0x00000000);
2176
        /* XXX : not implemented */
2177
        spr_register(env, SPR_HID1, "HID1",
2178
                     SPR_NOACCESS, SPR_NOACCESS,
2179
                     &spr_read_generic, &spr_write_generic,
2180
                     0x00000000);
2181
        break;
2182

    
2183
    case CPU_PPC_750FX10: /* IBM PowerPC 750 FX            */
2184
    case CPU_PPC_750FX20:
2185
    case CPU_PPC_750FX21:
2186
    case CPU_PPC_750FX22:
2187
    case CPU_PPC_750FX23:
2188
    case CPU_PPC_750GX10: /* IBM PowerPC 750 GX            */
2189
    case CPU_PPC_750GX11:
2190
    case CPU_PPC_750GX12:
2191
        gen_spr_generic(env);
2192
        gen_spr_ne_601(env);
2193
        /* Memory management */
2194
        gen_low_BATs(env);
2195
        /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2196
        gen_high_BATs(env);
2197
        /* Time base */
2198
        gen_tbl(env);
2199
        gen_spr_7xx(env);
2200
        /* Hardware implementation registers */
2201
        /* XXX : not implemented */
2202
        spr_register(env, SPR_HID0, "HID0",
2203
                     SPR_NOACCESS, SPR_NOACCESS,
2204
                     &spr_read_generic, &spr_write_generic,
2205
                     0x00000000);
2206
        /* XXX : not implemented */
2207
        spr_register(env, SPR_HID1, "HID1",
2208
                     SPR_NOACCESS, SPR_NOACCESS,
2209
                     &spr_read_generic, &spr_write_generic,
2210
                     0x00000000);
2211
        /* XXX : not implemented */
2212
        spr_register(env, SPR_750_HID2, "HID2",
2213
                     SPR_NOACCESS, SPR_NOACCESS,
2214
                     &spr_read_generic, &spr_write_generic,
2215
                     0x00000000);
2216
        break;
2217

    
2218
    case CPU_PPC_755_10:  /* PowerPC 755                   */
2219
    case CPU_PPC_755_11:
2220
    case CPU_PPC_755_20:
2221
    case CPU_PPC_755D:
2222
    case CPU_PPC_755E:
2223
        gen_spr_generic(env);
2224
        gen_spr_ne_601(env);
2225
        /* Memory management */
2226
        gen_low_BATs(env);
2227
        /* Time base */
2228
        gen_tbl(env);
2229
        /* Memory management */
2230
        gen_high_BATs(env);
2231
        gen_6xx_7xx_soft_tlb(env, 64, 2);
2232
        gen_spr_G2_755(env);
2233
        /* L2 cache control */
2234
        /* XXX : not implemented */
2235
        spr_register(env, SPR_ICTC, "ICTC",
2236
                     SPR_NOACCESS, SPR_NOACCESS,
2237
                     &spr_read_generic, &spr_write_generic,
2238
                     0x00000000);
2239
        /* XXX : not implemented */
2240
        spr_register(env, SPR_L2PM, "L2PM",
2241
                     SPR_NOACCESS, SPR_NOACCESS,
2242
                     &spr_read_generic, &spr_write_generic,
2243
                     0x00000000);
2244
        /* Hardware implementation registers */
2245
        /* XXX : not implemented */
2246
        spr_register(env, SPR_HID0, "HID0",
2247
                     SPR_NOACCESS, SPR_NOACCESS,
2248
                     &spr_read_generic, &spr_write_generic,
2249
                     0x00000000);
2250
        /* XXX : not implemented */
2251
        spr_register(env, SPR_HID1, "HID1",
2252
                     SPR_NOACCESS, SPR_NOACCESS,
2253
                     &spr_read_generic, &spr_write_generic,
2254
                     0x00000000);
2255
        /* XXX : not implemented */
2256
        spr_register(env, SPR_HID2, "HID2",
2257
                     SPR_NOACCESS, SPR_NOACCESS,
2258
                     &spr_read_generic, &spr_write_generic,
2259
                     0x00000000);
2260
        break;
2261

    
2262
#if defined (TODO)
2263
    /* G4 family */
2264
    case CPU_PPC_7400:    /* PowerPC 7400                  */
2265
    case CPU_PPC_7410C:   /* PowerPC 7410                  */
2266
    case CPU_PPC_7410D:
2267
    case CPU_PPC_7410E:
2268
    case CPU_PPC_7441:    /* PowerPC 7441                  */
2269
    case CPU_PPC_7445:    /* PowerPC 7445                  */
2270
    case CPU_PPC_7447:    /* PowerPC 7447                  */
2271
    case CPU_PPC_7447A:   /* PowerPC 7447A                 */
2272
    case CPU_PPC_7448:    /* PowerPC 7448                  */
2273
    case CPU_PPC_7450:    /* PowerPC 7450                  */
2274
    case CPU_PPC_7450b:
2275
    case CPU_PPC_7451:    /* PowerPC 7451                  */
2276
    case CPU_PPC_7451G:
2277
    case CPU_PPC_7455:    /* PowerPC 7455                  */
2278
    case CPU_PPC_7455F:
2279
    case CPU_PPC_7455G:
2280
    case CPU_PPC_7457:    /* PowerPC 7457                  */
2281
    case CPU_PPC_7457C:
2282
    case CPU_PPC_7457A:   /* PowerPC 7457A                 */
2283
        break;
2284
#endif
2285

    
2286
    /* 64 bits PowerPC                                     */
2287
#if defined (TARGET_PPC64)
2288
#if defined (TODO)
2289
    case CPU_PPC_620:     /* PowerPC 620                   */
2290
    case CPU_PPC_630:     /* PowerPC 630 (Power 3)         */
2291
    case CPU_PPC_631:     /* PowerPC 631 (Power 3+)        */
2292
    case CPU_PPC_POWER4:  /* Power 4                       */
2293
    case CPU_PPC_POWER4P: /* Power 4+                      */
2294
    case CPU_PPC_POWER5:  /* Power 5                       */
2295
    case CPU_PPC_POWER5P: /* Power 5+                      */
2296
#endif
2297
    case CPU_PPC_970:     /* PowerPC 970                   */
2298
    case CPU_PPC_970FX10: /* PowerPC 970 FX                */
2299
    case CPU_PPC_970FX20:
2300
    case CPU_PPC_970FX21:
2301
    case CPU_PPC_970FX30:
2302
    case CPU_PPC_970FX31:
2303
    case CPU_PPC_970MP10: /* PowerPC 970 MP                */
2304
    case CPU_PPC_970MP11:
2305
#if defined (TODO)
2306
    case CPU_PPC_CELL10:  /* Cell family                   */
2307
    case CPU_PPC_CELL20:
2308
    case CPU_PPC_CELL30:
2309
    case CPU_PPC_CELL31:
2310
#endif
2311
#if defined (TODO)
2312
    case CPU_PPC_RS64:    /* Apache (RS64/A35)             */
2313
    case CPU_PPC_RS64II:  /* NorthStar (RS64-II/A50)       */
2314
    case CPU_PPC_RS64III: /* Pulsar (RS64-III)             */
2315
    case CPU_PPC_RS64IV:  /* IceStar/IStar/SStar (RS64-IV) */
2316
#endif
2317
        break;
2318
#endif /* defined (TARGET_PPC64) */
2319

    
2320
#if defined (TODO)
2321
        /* POWER                                               */
2322
    case CPU_POWER:       /* POWER                         */
2323
    case CPU_POWER2:      /* POWER2                        */
2324
        break;
2325
#endif
2326

    
2327
    default:
2328
        gen_spr_generic(env);
2329
        break;
2330
    }
2331
    if (env->nb_BATs == -1)
2332
        env->nb_BATs = 4;
2333
    /* Allocate TLBs buffer when needed */
2334
    if (env->nb_tlb != 0) {
2335
        int nb_tlb = env->nb_tlb;
2336
        if (env->id_tlbs != 0)
2337
            nb_tlb *= 2;
2338
        env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
2339
        /* Pre-compute some useful values */
2340
        env->tlb_per_way = env->nb_tlb / env->nb_ways;
2341
    }
2342
}
2343

    
2344
#if defined(PPC_DUMP_CPU)
2345
static void dump_sprs (CPUPPCState *env)
2346
{
2347
    ppc_spr_t *spr;
2348
    uint32_t pvr = env->spr[SPR_PVR];
2349
    uint32_t sr, sw, ur, uw;
2350
    int i, j, n;
2351

    
2352
    printf("* SPRs for PVR=%08x\n", pvr);
2353
    for (i = 0; i < 32; i++) {
2354
        for (j = 0; j < 32; j++) {
2355
            n = (i << 5) | j;
2356
            spr = &env->spr_cb[n];
2357
#if !defined(CONFIG_USER_ONLY)
2358
            sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
2359
            sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
2360
#else
2361
            sw = 0;
2362
            sr = 0;
2363
#endif
2364
            uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
2365
            ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
2366
            if (sw || sr || uw || ur) {
2367
                printf("%4d (%03x) %8s s%c%c u%c%c\n",
2368
                       (i << 5) | j, (i << 5) | j, spr->name,
2369
                       sw ? 'w' : '-', sr ? 'r' : '-',
2370
                       uw ? 'w' : '-', ur ? 'r' : '-');
2371
            }
2372
        }
2373
    }
2374
    fflush(stdout);
2375
    fflush(stderr);
2376
}
2377
#endif
2378

    
2379
/*****************************************************************************/
2380
#include <stdlib.h>
2381
#include <string.h>
2382

    
2383
int fflush (FILE *stream);
2384

    
2385
/* Opcode types */
2386
enum {
2387
    PPC_DIRECT   = 0, /* Opcode routine        */
2388
    PPC_INDIRECT = 1, /* Indirect opcode table */
2389
};
2390

    
2391
static inline int is_indirect_opcode (void *handler)
2392
{
2393
    return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
2394
}
2395

    
2396
static inline opc_handler_t **ind_table(void *handler)
2397
{
2398
    return (opc_handler_t **)((unsigned long)handler & ~3);
2399
}
2400

    
2401
/* Instruction table creation */
2402
/* Opcodes tables creation */
2403
static void fill_new_table (opc_handler_t **table, int len)
2404
{
2405
    int i;
2406

    
2407
    for (i = 0; i < len; i++)
2408
        table[i] = &invalid_handler;
2409
}
2410

    
2411
static int create_new_table (opc_handler_t **table, unsigned char idx)
2412
{
2413
    opc_handler_t **tmp;
2414

    
2415
    tmp = malloc(0x20 * sizeof(opc_handler_t));
2416
    if (tmp == NULL)
2417
        return -1;
2418
    fill_new_table(tmp, 0x20);
2419
    table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
2420

    
2421
    return 0;
2422
}
2423

    
2424
static int insert_in_table (opc_handler_t **table, unsigned char idx,
2425
                            opc_handler_t *handler)
2426
{
2427
    if (table[idx] != &invalid_handler)
2428
        return -1;
2429
    table[idx] = handler;
2430

    
2431
    return 0;
2432
}
2433

    
2434
static int register_direct_insn (opc_handler_t **ppc_opcodes,
2435
                                 unsigned char idx, opc_handler_t *handler)
2436
{
2437
    if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
2438
        printf("*** ERROR: opcode %02x already assigned in main "
2439
               "opcode table\n", idx);
2440
        return -1;
2441
    }
2442

    
2443
    return 0;
2444
}
2445

    
2446
static int register_ind_in_table (opc_handler_t **table,
2447
                                  unsigned char idx1, unsigned char idx2,
2448
                                  opc_handler_t *handler)
2449
{
2450
    if (table[idx1] == &invalid_handler) {
2451
        if (create_new_table(table, idx1) < 0) {
2452
            printf("*** ERROR: unable to create indirect table "
2453
                   "idx=%02x\n", idx1);
2454
            return -1;
2455
        }
2456
    } else {
2457
        if (!is_indirect_opcode(table[idx1])) {
2458
            printf("*** ERROR: idx %02x already assigned to a direct "
2459
                   "opcode\n", idx1);
2460
            return -1;
2461
        }
2462
    }
2463
    if (handler != NULL &&
2464
        insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
2465
        printf("*** ERROR: opcode %02x already assigned in "
2466
               "opcode table %02x\n", idx2, idx1);
2467
        return -1;
2468
    }
2469

    
2470
    return 0;
2471
}
2472

    
2473
static int register_ind_insn (opc_handler_t **ppc_opcodes,
2474
                              unsigned char idx1, unsigned char idx2,
2475
                              opc_handler_t *handler)
2476
{
2477
    int ret;
2478

    
2479
    ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
2480

    
2481
    return ret;
2482
}
2483

    
2484
static int register_dblind_insn (opc_handler_t **ppc_opcodes, 
2485
                                 unsigned char idx1, unsigned char idx2,
2486
                                 unsigned char idx3, opc_handler_t *handler)
2487
{
2488
    if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
2489
        printf("*** ERROR: unable to join indirect table idx "
2490
               "[%02x-%02x]\n", idx1, idx2);
2491
        return -1;
2492
    }
2493
    if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
2494
                              handler) < 0) {
2495
        printf("*** ERROR: unable to insert opcode "
2496
               "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
2497
        return -1;
2498
    }
2499

    
2500
    return 0;
2501
}
2502

    
2503
static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
2504
{
2505
    if (insn->opc2 != 0xFF) {
2506
        if (insn->opc3 != 0xFF) {
2507
            if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
2508
                                     insn->opc3, &insn->handler) < 0)
2509
                return -1;
2510
        } else {
2511
            if (register_ind_insn(ppc_opcodes, insn->opc1,
2512
                                  insn->opc2, &insn->handler) < 0)
2513
                return -1;
2514
        }
2515
    } else {
2516
        if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
2517
            return -1;
2518
    }
2519

    
2520
    return 0;
2521
}
2522

    
2523
static int test_opcode_table (opc_handler_t **table, int len)
2524
{
2525
    int i, count, tmp;
2526

    
2527
    for (i = 0, count = 0; i < len; i++) {
2528
        /* Consistency fixup */
2529
        if (table[i] == NULL)
2530
            table[i] = &invalid_handler;
2531
        if (table[i] != &invalid_handler) {
2532
            if (is_indirect_opcode(table[i])) {
2533
                tmp = test_opcode_table(ind_table(table[i]), 0x20);
2534
                if (tmp == 0) {
2535
                    free(table[i]);
2536
                    table[i] = &invalid_handler;
2537
                } else {
2538
                    count++;
2539
                }
2540
            } else {
2541
                count++;
2542
            }
2543
        }
2544
    }
2545

    
2546
    return count;
2547
}
2548

    
2549
static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
2550
{
2551
    if (test_opcode_table(ppc_opcodes, 0x40) == 0)
2552
        printf("*** WARNING: no opcode defined !\n");
2553
}
2554

    
2555
/*****************************************************************************/
2556
static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
2557
{
2558
    opcode_t *opc, *start, *end;
2559

    
2560
    fill_new_table(env->opcodes, 0x40);
2561
#if defined(PPC_DUMP_CPU)
2562
    printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2563
           " %08x\n",
2564
           def->pvr, def->name, def->insns_flags, def->flags);
2565
#endif
2566
    if (&opc_start < &opc_end) {
2567
        start = &opc_start;
2568
        end = &opc_end;
2569
    } else {
2570
        start = &opc_end;
2571
        end = &opc_start;
2572
    }
2573
    for (opc = start + 1; opc != end; opc++) {
2574
        if ((opc->handler.type & def->insns_flags) != 0) {
2575
            if (register_insn(env->opcodes, opc) < 0) {
2576
                printf("*** ERROR initializing PowerPC instruction "
2577
                       "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
2578
                       opc->opc3);
2579
                return -1;
2580
            }
2581
#if defined(PPC_DUMP_CPU)
2582
            if (opc1 != 0x00) {
2583
                if (opc->opc3 == 0xFF) {
2584
                    if (opc->opc2 == 0xFF) {
2585
                        printf(" %02x -- -- (%2d ----) : %s\n",
2586
                               opc->opc1, opc->opc1, opc->oname);
2587
                    } else {
2588
                        printf(" %02x %02x -- (%2d %4d) : %s\n",
2589
                               opc->opc1, opc->opc2, opc->opc1, opc->opc2,
2590
                               opc->oname);
2591
                    }
2592
                } else {
2593
                    printf(" %02x %02x %02x (%2d %4d) : %s\n",
2594
                           opc->opc1, opc->opc2, opc->opc3,
2595
                           opc->opc1, (opc->opc3 << 5) | opc->opc2,
2596
                           opc->oname);
2597
                }
2598
            }
2599
#endif
2600
        }
2601
    }
2602
    fix_opcode_tables(env->opcodes);
2603
    fflush(stdout);
2604
    fflush(stderr);
2605

    
2606
    return 0;
2607
}
2608

    
2609
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
2610
{
2611
    env->msr_mask = def->msr_mask;
2612
    env->flags = def->flags;
2613
    if (create_ppc_opcodes(env, def) < 0)
2614
        return -1;
2615
    init_ppc_proc(env, def);
2616
#if defined(PPC_DUMP_CPU)
2617
    dump_sprs(env);
2618
    if (env->tlb != NULL) {
2619
        printf("%d %s TLB in %d ways\n", env->nb_tlb,
2620
               env->id_tlbs ? "splitted" : "merged", env->nb_ways);
2621
    }
2622
#endif
2623

    
2624
    return 0;
2625
}
2626

    
2627
void do_compute_hflags (CPUPPCState *env);
2628
CPUPPCState *cpu_ppc_init (void)
2629
{
2630
    CPUPPCState *env;
2631

    
2632
    env = qemu_mallocz(sizeof(CPUPPCState));
2633
    if (!env)
2634
        return NULL;
2635
    cpu_exec_init(env);
2636
    tlb_flush(env, 1);
2637
#if defined (DO_SINGLE_STEP) && 0
2638
    /* Single step trace mode */
2639
    msr_se = 1;
2640
    msr_be = 1;
2641
#endif
2642
    msr_fp = 1; /* Allow floating point exceptions */
2643
    msr_me = 1; /* Allow machine check exceptions  */
2644
#if defined(CONFIG_USER_ONLY)
2645
    msr_pr = 1;
2646
#else
2647
    env->nip = 0xFFFFFFFC;
2648
#endif
2649
    do_compute_hflags(env);
2650
    env->reserve = -1;
2651
    return env;
2652
}
2653

    
2654
void cpu_ppc_close(CPUPPCState *env)
2655
{
2656
    /* Should also remove all opcode tables... */
2657
    free(env);
2658
}
2659

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

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

    
3831
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
3832
{
3833
    int i, ret;
3834

    
3835
    ret = -1;
3836
    *def = NULL;
3837
    for (i = 0; strcmp(ppc_defs[i].name, "ppc") != 0; i++) {
3838
        if (strcasecmp(name, ppc_defs[i].name) == 0) {
3839
            *def = &ppc_defs[i];
3840
            ret = 0;
3841
            break;
3842
        }
3843
    }
3844

    
3845
    return ret;
3846
}
3847

    
3848
int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
3849
{
3850
    int i, ret;
3851

    
3852
    ret = -1;
3853
    *def = NULL;
3854
    for (i = 0; ppc_defs[i].name != NULL; i++) {
3855
        if ((pvr & ppc_defs[i].pvr_mask) ==
3856
            (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
3857
            *def = &ppc_defs[i];
3858
            ret = 0;
3859
            break;
3860
        }
3861
    }
3862

    
3863
    return ret;
3864
}
3865

    
3866
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3867
{
3868
    int i;
3869

    
3870
    for (i = 0; ; i++) {
3871
        (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n",
3872
                       ppc_defs[i].name,
3873
                       ppc_defs[i].pvr, ppc_defs[i].pvr_mask);
3874
        if (strcmp(ppc_defs[i].name, "ppc") == 0)
3875
            break;
3876
    }
3877
}