Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ d63001d1

History | View | Annotate | Download (244.2 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
#include "dis-asm.h"
27

    
28
//#define PPC_DUMP_CPU
29
//#define PPC_DEBUG_SPR
30
//#define PPC_DEBUG_IRQ
31

    
32
struct ppc_def_t {
33
    const unsigned char *name;
34
    uint32_t pvr;
35
    uint32_t pvr_mask;
36
    uint64_t insns_flags;
37
    uint64_t msr_mask;
38
    uint8_t mmu_model;
39
    uint8_t excp_model;
40
    uint8_t bus_model;
41
    uint8_t pad;
42
    int bfd_mach;
43
    void (*init_proc)(CPUPPCState *env);
44
};
45

    
46
/* For user-mode emulation, we don't emulate any IRQ controller */
47
#if defined(CONFIG_USER_ONLY)
48
#define PPC_IRQ_INIT_FN(name)                                                 \
49
static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env)         \
50
{                                                                             \
51
}
52
#else
53
#define PPC_IRQ_INIT_FN(name)                                                 \
54
void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
55
#endif
56

    
57
PPC_IRQ_INIT_FN(40x);
58
PPC_IRQ_INIT_FN(6xx);
59
PPC_IRQ_INIT_FN(970);
60

    
61
/* Generic callbacks:
62
 * do nothing but store/retrieve spr value
63
 */
64
#ifdef PPC_DUMP_SPR_ACCESSES
65
static void spr_read_generic (void *opaque, int sprn)
66
{
67
    gen_op_load_dump_spr(sprn);
68
}
69

    
70
static void spr_write_generic (void *opaque, int sprn)
71
{
72
    gen_op_store_dump_spr(sprn);
73
}
74
#else
75
static void spr_read_generic (void *opaque, int sprn)
76
{
77
    gen_op_load_spr(sprn);
78
}
79

    
80
static void spr_write_generic (void *opaque, int sprn)
81
{
82
    gen_op_store_spr(sprn);
83
}
84
#endif
85

    
86
#if !defined(CONFIG_USER_ONLY)
87
static void spr_write_clear (void *opaque, int sprn)
88
{
89
    gen_op_mask_spr(sprn);
90
}
91
#endif
92

    
93
/* SPR common to all PowerPC */
94
/* XER */
95
static void spr_read_xer (void *opaque, int sprn)
96
{
97
    gen_op_load_xer();
98
}
99

    
100
static void spr_write_xer (void *opaque, int sprn)
101
{
102
    gen_op_store_xer();
103
}
104

    
105
/* LR */
106
static void spr_read_lr (void *opaque, int sprn)
107
{
108
    gen_op_load_lr();
109
}
110

    
111
static void spr_write_lr (void *opaque, int sprn)
112
{
113
    gen_op_store_lr();
114
}
115

    
116
/* CTR */
117
static void spr_read_ctr (void *opaque, int sprn)
118
{
119
    gen_op_load_ctr();
120
}
121

    
122
static void spr_write_ctr (void *opaque, int sprn)
123
{
124
    gen_op_store_ctr();
125
}
126

    
127
/* User read access to SPR */
128
/* USPRx */
129
/* UMMCRx */
130
/* UPMCx */
131
/* USIA */
132
/* UDECR */
133
static void spr_read_ureg (void *opaque, int sprn)
134
{
135
    gen_op_load_spr(sprn + 0x10);
136
}
137

    
138
/* SPR common to all non-embedded PowerPC */
139
/* DECR */
140
#if !defined(CONFIG_USER_ONLY)
141
static void spr_read_decr (void *opaque, int sprn)
142
{
143
    gen_op_load_decr();
144
}
145

    
146
static void spr_write_decr (void *opaque, int sprn)
147
{
148
    gen_op_store_decr();
149
}
150
#endif
151

    
152
/* SPR common to all non-embedded PowerPC, except 601 */
153
/* Time base */
154
static void spr_read_tbl (void *opaque, int sprn)
155
{
156
    gen_op_load_tbl();
157
}
158

    
159
static void spr_read_tbu (void *opaque, int sprn)
160
{
161
    gen_op_load_tbu();
162
}
163

    
164
__attribute__ (( unused ))
165
static void spr_read_atbl (void *opaque, int sprn)
166
{
167
    gen_op_load_atbl();
168
}
169

    
170
__attribute__ (( unused ))
171
static void spr_read_atbu (void *opaque, int sprn)
172
{
173
    gen_op_load_atbu();
174
}
175

    
176
#if !defined(CONFIG_USER_ONLY)
177
static void spr_write_tbl (void *opaque, int sprn)
178
{
179
    gen_op_store_tbl();
180
}
181

    
182
static void spr_write_tbu (void *opaque, int sprn)
183
{
184
    gen_op_store_tbu();
185
}
186

    
187
__attribute__ (( unused ))
188
static void spr_write_atbl (void *opaque, int sprn)
189
{
190
    gen_op_store_atbl();
191
}
192

    
193
__attribute__ (( unused ))
194
static void spr_write_atbu (void *opaque, int sprn)
195
{
196
    gen_op_store_atbu();
197
}
198
#endif
199

    
200
#if !defined(CONFIG_USER_ONLY)
201
/* IBAT0U...IBAT0U */
202
/* IBAT0L...IBAT7L */
203
static void spr_read_ibat (void *opaque, int sprn)
204
{
205
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
206
}
207

    
208
static void spr_read_ibat_h (void *opaque, int sprn)
209
{
210
    gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);
211
}
212

    
213
static void spr_write_ibatu (void *opaque, int sprn)
214
{
215
    gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);
216
}
217

    
218
static void spr_write_ibatu_h (void *opaque, int sprn)
219
{
220
    gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);
221
}
222

    
223
static void spr_write_ibatl (void *opaque, int sprn)
224
{
225
    gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);
226
}
227

    
228
static void spr_write_ibatl_h (void *opaque, int sprn)
229
{
230
    gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);
231
}
232

    
233
/* DBAT0U...DBAT7U */
234
/* DBAT0L...DBAT7L */
235
static void spr_read_dbat (void *opaque, int sprn)
236
{
237
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);
238
}
239

    
240
static void spr_read_dbat_h (void *opaque, int sprn)
241
{
242
    gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);
243
}
244

    
245
static void spr_write_dbatu (void *opaque, int sprn)
246
{
247
    gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);
248
}
249

    
250
static void spr_write_dbatu_h (void *opaque, int sprn)
251
{
252
    gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);
253
}
254

    
255
static void spr_write_dbatl (void *opaque, int sprn)
256
{
257
    gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);
258
}
259

    
260
static void spr_write_dbatl_h (void *opaque, int sprn)
261
{
262
    gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);
263
}
264

    
265
/* SDR1 */
266
static void spr_read_sdr1 (void *opaque, int sprn)
267
{
268
    gen_op_load_sdr1();
269
}
270

    
271
static void spr_write_sdr1 (void *opaque, int sprn)
272
{
273
    gen_op_store_sdr1();
274
}
275

    
276
/* 64 bits PowerPC specific SPRs */
277
/* ASR */
278
#if defined(TARGET_PPC64)
279
__attribute__ (( unused ))
280
static void spr_read_asr (void *opaque, int sprn)
281
{
282
    gen_op_load_asr();
283
}
284

    
285
__attribute__ (( unused ))
286
static void spr_write_asr (void *opaque, int sprn)
287
{
288
    gen_op_store_asr();
289
}
290
#endif
291
#endif
292

    
293
/* PowerPC 601 specific registers */
294
/* RTC */
295
static void spr_read_601_rtcl (void *opaque, int sprn)
296
{
297
    gen_op_load_601_rtcl();
298
}
299

    
300
static void spr_read_601_rtcu (void *opaque, int sprn)
301
{
302
    gen_op_load_601_rtcu();
303
}
304

    
305
#if !defined(CONFIG_USER_ONLY)
306
static void spr_write_601_rtcu (void *opaque, int sprn)
307
{
308
    gen_op_store_601_rtcu();
309
}
310

    
311
static void spr_write_601_rtcl (void *opaque, int sprn)
312
{
313
    gen_op_store_601_rtcl();
314
}
315
#endif
316

    
317
/* Unified bats */
318
#if !defined(CONFIG_USER_ONLY)
319
static void spr_read_601_ubat (void *opaque, int sprn)
320
{
321
    gen_op_load_601_bat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
322
}
323

    
324
static void spr_write_601_ubatu (void *opaque, int sprn)
325
{
326
    gen_op_store_601_batu((sprn - SPR_IBAT0U) / 2);
327
}
328

    
329
static void spr_write_601_ubatl (void *opaque, int sprn)
330
{
331
    gen_op_store_601_batl((sprn - SPR_IBAT0L) / 2);
332
}
333
#endif
334

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

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

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

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

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

    
361
static void spr_write_booke_tcr (void *opaque, int sprn)
362
{
363
    gen_op_store_booke_tcr();
364
}
365

    
366
static void spr_write_booke_tsr (void *opaque, int sprn)
367
{
368
    gen_op_store_booke_tsr();
369
}
370
#endif
371

    
372
/* PowerPC 403 specific registers */
373
/* PBL1 / PBU1 / PBL2 / PBU2 */
374
#if !defined(CONFIG_USER_ONLY)
375
static void spr_read_403_pbr (void *opaque, int sprn)
376
{
377
    gen_op_load_403_pb(sprn - SPR_403_PBL1);
378
}
379

    
380
static void spr_write_403_pbr (void *opaque, int sprn)
381
{
382
    gen_op_store_403_pb(sprn - SPR_403_PBL1);
383
}
384

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

    
391
#if !defined(CONFIG_USER_ONLY)
392
/* Callback used to write the exception vector base */
393
static void spr_write_excp_prefix (void *opaque, int sprn)
394
{
395
    gen_op_store_excp_prefix();
396
    gen_op_store_spr(sprn);
397
}
398

    
399
static void spr_write_excp_vector (void *opaque, int sprn)
400
{
401
    DisasContext *ctx = opaque;
402

    
403
    if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
404
        gen_op_store_excp_vector(sprn - SPR_BOOKE_IVOR0);
405
        gen_op_store_spr(sprn);
406
    } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
407
        gen_op_store_excp_vector(sprn - SPR_BOOKE_IVOR32 + 32);
408
        gen_op_store_spr(sprn);
409
    } else {
410
        printf("Trying to write an unknown exception vector %d %03x\n",
411
               sprn, sprn);
412
        GEN_EXCP_PRIVREG(ctx);
413
    }
414
}
415
#endif
416

    
417
#if defined(CONFIG_USER_ONLY)
418
#define spr_register(env, num, name, uea_read, uea_write,                     \
419
                     oea_read, oea_write, initial_value)                      \
420
do {                                                                          \
421
     _spr_register(env, num, name, uea_read, uea_write, initial_value);       \
422
} while (0)
423
static inline void _spr_register (CPUPPCState *env, int num,
424
                                  const unsigned char *name,
425
                                  void (*uea_read)(void *opaque, int sprn),
426
                                  void (*uea_write)(void *opaque, int sprn),
427
                                  target_ulong initial_value)
428
#else
429
static inline void spr_register (CPUPPCState *env, int num,
430
                                 const unsigned char *name,
431
                                 void (*uea_read)(void *opaque, int sprn),
432
                                 void (*uea_write)(void *opaque, int sprn),
433
                                 void (*oea_read)(void *opaque, int sprn),
434
                                 void (*oea_write)(void *opaque, int sprn),
435
                                 target_ulong initial_value)
436
#endif
437
{
438
    ppc_spr_t *spr;
439

    
440
    spr = &env->spr_cb[num];
441
    if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
442
#if !defined(CONFIG_USER_ONLY)
443
        spr->oea_read != NULL || spr->oea_write != NULL ||
444
#endif
445
        spr->uea_read != NULL || spr->uea_write != NULL) {
446
        printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
447
        exit(1);
448
    }
449
#if defined(PPC_DEBUG_SPR)
450
    printf("*** register spr %d (%03x) %s val " ADDRX "\n", num, num, name,
451
           initial_value);
452
#endif
453
    spr->name = name;
454
    spr->uea_read = uea_read;
455
    spr->uea_write = uea_write;
456
#if !defined(CONFIG_USER_ONLY)
457
    spr->oea_read = oea_read;
458
    spr->oea_write = oea_write;
459
#endif
460
    env->spr[num] = initial_value;
461
}
462

    
463
/* Generic PowerPC SPRs */
464
static void gen_spr_generic (CPUPPCState *env)
465
{
466
    /* Integer processing */
467
    spr_register(env, SPR_XER, "XER",
468
                 &spr_read_xer, &spr_write_xer,
469
                 &spr_read_xer, &spr_write_xer,
470
                 0x00000000);
471
    /* Branch contol */
472
    spr_register(env, SPR_LR, "LR",
473
                 &spr_read_lr, &spr_write_lr,
474
                 &spr_read_lr, &spr_write_lr,
475
                 0x00000000);
476
    spr_register(env, SPR_CTR, "CTR",
477
                 &spr_read_ctr, &spr_write_ctr,
478
                 &spr_read_ctr, &spr_write_ctr,
479
                 0x00000000);
480
    /* Interrupt processing */
481
    spr_register(env, SPR_SRR0, "SRR0",
482
                 SPR_NOACCESS, SPR_NOACCESS,
483
                 &spr_read_generic, &spr_write_generic,
484
                 0x00000000);
485
    spr_register(env, SPR_SRR1, "SRR1",
486
                 SPR_NOACCESS, SPR_NOACCESS,
487
                 &spr_read_generic, &spr_write_generic,
488
                 0x00000000);
489
    /* Processor control */
490
    spr_register(env, SPR_SPRG0, "SPRG0",
491
                 SPR_NOACCESS, SPR_NOACCESS,
492
                 &spr_read_generic, &spr_write_generic,
493
                 0x00000000);
494
    spr_register(env, SPR_SPRG1, "SPRG1",
495
                 SPR_NOACCESS, SPR_NOACCESS,
496
                 &spr_read_generic, &spr_write_generic,
497
                 0x00000000);
498
    spr_register(env, SPR_SPRG2, "SPRG2",
499
                 SPR_NOACCESS, SPR_NOACCESS,
500
                 &spr_read_generic, &spr_write_generic,
501
                 0x00000000);
502
    spr_register(env, SPR_SPRG3, "SPRG3",
503
                 SPR_NOACCESS, SPR_NOACCESS,
504
                 &spr_read_generic, &spr_write_generic,
505
                 0x00000000);
506
}
507

    
508
/* SPR common to all non-embedded PowerPC, including 601 */
509
static void gen_spr_ne_601 (CPUPPCState *env)
510
{
511
    /* Exception processing */
512
    spr_register(env, SPR_DSISR, "DSISR",
513
                 SPR_NOACCESS, SPR_NOACCESS,
514
                 &spr_read_generic, &spr_write_generic,
515
                 0x00000000);
516
    spr_register(env, SPR_DAR, "DAR",
517
                 SPR_NOACCESS, SPR_NOACCESS,
518
                 &spr_read_generic, &spr_write_generic,
519
                 0x00000000);
520
    /* Timer */
521
    spr_register(env, SPR_DECR, "DECR",
522
                 SPR_NOACCESS, SPR_NOACCESS,
523
                 &spr_read_decr, &spr_write_decr,
524
                 0x00000000);
525
    /* Memory management */
526
    spr_register(env, SPR_SDR1, "SDR1",
527
                 SPR_NOACCESS, SPR_NOACCESS,
528
                 &spr_read_sdr1, &spr_write_sdr1,
529
                 0x00000000);
530
}
531

    
532
/* BATs 0-3 */
533
static void gen_low_BATs (CPUPPCState *env)
534
{
535
    spr_register(env, SPR_IBAT0U, "IBAT0U",
536
                 SPR_NOACCESS, SPR_NOACCESS,
537
                 &spr_read_ibat, &spr_write_ibatu,
538
                 0x00000000);
539
    spr_register(env, SPR_IBAT0L, "IBAT0L",
540
                 SPR_NOACCESS, SPR_NOACCESS,
541
                 &spr_read_ibat, &spr_write_ibatl,
542
                 0x00000000);
543
    spr_register(env, SPR_IBAT1U, "IBAT1U",
544
                 SPR_NOACCESS, SPR_NOACCESS,
545
                 &spr_read_ibat, &spr_write_ibatu,
546
                 0x00000000);
547
    spr_register(env, SPR_IBAT1L, "IBAT1L",
548
                 SPR_NOACCESS, SPR_NOACCESS,
549
                 &spr_read_ibat, &spr_write_ibatl,
550
                 0x00000000);
551
    spr_register(env, SPR_IBAT2U, "IBAT2U",
552
                 SPR_NOACCESS, SPR_NOACCESS,
553
                 &spr_read_ibat, &spr_write_ibatu,
554
                 0x00000000);
555
    spr_register(env, SPR_IBAT2L, "IBAT2L",
556
                 SPR_NOACCESS, SPR_NOACCESS,
557
                 &spr_read_ibat, &spr_write_ibatl,
558
                 0x00000000);
559
    spr_register(env, SPR_IBAT3U, "IBAT3U",
560
                 SPR_NOACCESS, SPR_NOACCESS,
561
                 &spr_read_ibat, &spr_write_ibatu,
562
                 0x00000000);
563
    spr_register(env, SPR_IBAT3L, "IBAT3L",
564
                 SPR_NOACCESS, SPR_NOACCESS,
565
                 &spr_read_ibat, &spr_write_ibatl,
566
                 0x00000000);
567
    spr_register(env, SPR_DBAT0U, "DBAT0U",
568
                 SPR_NOACCESS, SPR_NOACCESS,
569
                 &spr_read_dbat, &spr_write_dbatu,
570
                 0x00000000);
571
    spr_register(env, SPR_DBAT0L, "DBAT0L",
572
                 SPR_NOACCESS, SPR_NOACCESS,
573
                 &spr_read_dbat, &spr_write_dbatl,
574
                 0x00000000);
575
    spr_register(env, SPR_DBAT1U, "DBAT1U",
576
                 SPR_NOACCESS, SPR_NOACCESS,
577
                 &spr_read_dbat, &spr_write_dbatu,
578
                 0x00000000);
579
    spr_register(env, SPR_DBAT1L, "DBAT1L",
580
                 SPR_NOACCESS, SPR_NOACCESS,
581
                 &spr_read_dbat, &spr_write_dbatl,
582
                 0x00000000);
583
    spr_register(env, SPR_DBAT2U, "DBAT2U",
584
                 SPR_NOACCESS, SPR_NOACCESS,
585
                 &spr_read_dbat, &spr_write_dbatu,
586
                 0x00000000);
587
    spr_register(env, SPR_DBAT2L, "DBAT2L",
588
                 SPR_NOACCESS, SPR_NOACCESS,
589
                 &spr_read_dbat, &spr_write_dbatl,
590
                 0x00000000);
591
    spr_register(env, SPR_DBAT3U, "DBAT3U",
592
                 SPR_NOACCESS, SPR_NOACCESS,
593
                 &spr_read_dbat, &spr_write_dbatu,
594
                 0x00000000);
595
    spr_register(env, SPR_DBAT3L, "DBAT3L",
596
                 SPR_NOACCESS, SPR_NOACCESS,
597
                 &spr_read_dbat, &spr_write_dbatl,
598
                 0x00000000);
599
    env->nb_BATs += 4;
600
}
601

    
602
/* BATs 4-7 */
603
static void gen_high_BATs (CPUPPCState *env)
604
{
605
    spr_register(env, SPR_IBAT4U, "IBAT4U",
606
                 SPR_NOACCESS, SPR_NOACCESS,
607
                 &spr_read_ibat_h, &spr_write_ibatu_h,
608
                 0x00000000);
609
    spr_register(env, SPR_IBAT4L, "IBAT4L",
610
                 SPR_NOACCESS, SPR_NOACCESS,
611
                 &spr_read_ibat_h, &spr_write_ibatl_h,
612
                 0x00000000);
613
    spr_register(env, SPR_IBAT5U, "IBAT5U",
614
                 SPR_NOACCESS, SPR_NOACCESS,
615
                 &spr_read_ibat_h, &spr_write_ibatu_h,
616
                 0x00000000);
617
    spr_register(env, SPR_IBAT5L, "IBAT5L",
618
                 SPR_NOACCESS, SPR_NOACCESS,
619
                 &spr_read_ibat_h, &spr_write_ibatl_h,
620
                 0x00000000);
621
    spr_register(env, SPR_IBAT6U, "IBAT6U",
622
                 SPR_NOACCESS, SPR_NOACCESS,
623
                 &spr_read_ibat_h, &spr_write_ibatu_h,
624
                 0x00000000);
625
    spr_register(env, SPR_IBAT6L, "IBAT6L",
626
                 SPR_NOACCESS, SPR_NOACCESS,
627
                 &spr_read_ibat_h, &spr_write_ibatl_h,
628
                 0x00000000);
629
    spr_register(env, SPR_IBAT7U, "IBAT7U",
630
                 SPR_NOACCESS, SPR_NOACCESS,
631
                 &spr_read_ibat_h, &spr_write_ibatu_h,
632
                 0x00000000);
633
    spr_register(env, SPR_IBAT7L, "IBAT7L",
634
                 SPR_NOACCESS, SPR_NOACCESS,
635
                 &spr_read_ibat_h, &spr_write_ibatl_h,
636
                 0x00000000);
637
    spr_register(env, SPR_DBAT4U, "DBAT4U",
638
                 SPR_NOACCESS, SPR_NOACCESS,
639
                 &spr_read_dbat_h, &spr_write_dbatu_h,
640
                 0x00000000);
641
    spr_register(env, SPR_DBAT4L, "DBAT4L",
642
                 SPR_NOACCESS, SPR_NOACCESS,
643
                 &spr_read_dbat_h, &spr_write_dbatl_h,
644
                 0x00000000);
645
    spr_register(env, SPR_DBAT5U, "DBAT5U",
646
                 SPR_NOACCESS, SPR_NOACCESS,
647
                 &spr_read_dbat_h, &spr_write_dbatu_h,
648
                 0x00000000);
649
    spr_register(env, SPR_DBAT5L, "DBAT5L",
650
                 SPR_NOACCESS, SPR_NOACCESS,
651
                 &spr_read_dbat_h, &spr_write_dbatl_h,
652
                 0x00000000);
653
    spr_register(env, SPR_DBAT6U, "DBAT6U",
654
                 SPR_NOACCESS, SPR_NOACCESS,
655
                 &spr_read_dbat_h, &spr_write_dbatu_h,
656
                 0x00000000);
657
    spr_register(env, SPR_DBAT6L, "DBAT6L",
658
                 SPR_NOACCESS, SPR_NOACCESS,
659
                 &spr_read_dbat_h, &spr_write_dbatl_h,
660
                 0x00000000);
661
    spr_register(env, SPR_DBAT7U, "DBAT7U",
662
                 SPR_NOACCESS, SPR_NOACCESS,
663
                 &spr_read_dbat_h, &spr_write_dbatu_h,
664
                 0x00000000);
665
    spr_register(env, SPR_DBAT7L, "DBAT7L",
666
                 SPR_NOACCESS, SPR_NOACCESS,
667
                 &spr_read_dbat_h, &spr_write_dbatl_h,
668
                 0x00000000);
669
    env->nb_BATs += 4;
670
}
671

    
672
/* Generic PowerPC time base */
673
static void gen_tbl (CPUPPCState *env)
674
{
675
    spr_register(env, SPR_VTBL,  "TBL",
676
                 &spr_read_tbl, SPR_NOACCESS,
677
                 &spr_read_tbl, SPR_NOACCESS,
678
                 0x00000000);
679
    spr_register(env, SPR_TBL,   "TBL",
680
                 SPR_NOACCESS, SPR_NOACCESS,
681
                 SPR_NOACCESS, &spr_write_tbl,
682
                 0x00000000);
683
    spr_register(env, SPR_VTBU,  "TBU",
684
                 &spr_read_tbu, SPR_NOACCESS,
685
                 &spr_read_tbu, SPR_NOACCESS,
686
                 0x00000000);
687
    spr_register(env, SPR_TBU,   "TBU",
688
                 SPR_NOACCESS, SPR_NOACCESS,
689
                 SPR_NOACCESS, &spr_write_tbu,
690
                 0x00000000);
691
}
692

    
693
/* Softare table search registers */
694
static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
695
{
696
    env->nb_tlb = nb_tlbs;
697
    env->nb_ways = nb_ways;
698
    env->id_tlbs = 1;
699
    spr_register(env, SPR_DMISS, "DMISS",
700
                 SPR_NOACCESS, SPR_NOACCESS,
701
                 &spr_read_generic, SPR_NOACCESS,
702
                 0x00000000);
703
    spr_register(env, SPR_DCMP, "DCMP",
704
                 SPR_NOACCESS, SPR_NOACCESS,
705
                 &spr_read_generic, SPR_NOACCESS,
706
                 0x00000000);
707
    spr_register(env, SPR_HASH1, "HASH1",
708
                 SPR_NOACCESS, SPR_NOACCESS,
709
                 &spr_read_generic, SPR_NOACCESS,
710
                 0x00000000);
711
    spr_register(env, SPR_HASH2, "HASH2",
712
                 SPR_NOACCESS, SPR_NOACCESS,
713
                 &spr_read_generic, SPR_NOACCESS,
714
                 0x00000000);
715
    spr_register(env, SPR_IMISS, "IMISS",
716
                 SPR_NOACCESS, SPR_NOACCESS,
717
                 &spr_read_generic, SPR_NOACCESS,
718
                 0x00000000);
719
    spr_register(env, SPR_ICMP, "ICMP",
720
                 SPR_NOACCESS, SPR_NOACCESS,
721
                 &spr_read_generic, SPR_NOACCESS,
722
                 0x00000000);
723
    spr_register(env, SPR_RPA, "RPA",
724
                 SPR_NOACCESS, SPR_NOACCESS,
725
                 &spr_read_generic, &spr_write_generic,
726
                 0x00000000);
727
}
728

    
729
/* SPR common to MPC755 and G2 */
730
static void gen_spr_G2_755 (CPUPPCState *env)
731
{
732
    /* SGPRs */
733
    spr_register(env, SPR_SPRG4, "SPRG4",
734
                 SPR_NOACCESS, SPR_NOACCESS,
735
                 &spr_read_generic, &spr_write_generic,
736
                 0x00000000);
737
    spr_register(env, SPR_SPRG5, "SPRG5",
738
                 SPR_NOACCESS, SPR_NOACCESS,
739
                 &spr_read_generic, &spr_write_generic,
740
                 0x00000000);
741
    spr_register(env, SPR_SPRG6, "SPRG6",
742
                 SPR_NOACCESS, SPR_NOACCESS,
743
                 &spr_read_generic, &spr_write_generic,
744
                 0x00000000);
745
    spr_register(env, SPR_SPRG7, "SPRG7",
746
                 SPR_NOACCESS, SPR_NOACCESS,
747
                 &spr_read_generic, &spr_write_generic,
748
                 0x00000000);
749
    /* External access control */
750
    /* XXX : not implemented */
751
    spr_register(env, SPR_EAR, "EAR",
752
                 SPR_NOACCESS, SPR_NOACCESS,
753
                 &spr_read_generic, &spr_write_generic,
754
                 0x00000000);
755
}
756

    
757
/* SPR common to all 7xx PowerPC implementations */
758
static void gen_spr_7xx (CPUPPCState *env)
759
{
760
    /* Breakpoints */
761
    /* XXX : not implemented */
762
    spr_register(env, SPR_DABR, "DABR",
763
                 SPR_NOACCESS, SPR_NOACCESS,
764
                 &spr_read_generic, &spr_write_generic,
765
                 0x00000000);
766
    /* XXX : not implemented */
767
    spr_register(env, SPR_IABR, "IABR",
768
                 SPR_NOACCESS, SPR_NOACCESS,
769
                 &spr_read_generic, &spr_write_generic,
770
                 0x00000000);
771
    /* Cache management */
772
    /* XXX : not implemented */
773
    spr_register(env, SPR_ICTC, "ICTC",
774
                 SPR_NOACCESS, SPR_NOACCESS,
775
                 &spr_read_generic, &spr_write_generic,
776
                 0x00000000);
777
    /* XXX : not implemented */
778
    spr_register(env, SPR_L2CR, "L2CR",
779
                 SPR_NOACCESS, SPR_NOACCESS,
780
                 &spr_read_generic, &spr_write_generic,
781
                 0x00000000);
782
    /* Performance monitors */
783
    /* XXX : not implemented */
784
    spr_register(env, SPR_MMCR0, "MMCR0",
785
                 SPR_NOACCESS, SPR_NOACCESS,
786
                 &spr_read_generic, &spr_write_generic,
787
                 0x00000000);
788
    /* XXX : not implemented */
789
    spr_register(env, SPR_MMCR1, "MMCR1",
790
                 SPR_NOACCESS, SPR_NOACCESS,
791
                 &spr_read_generic, &spr_write_generic,
792
                 0x00000000);
793
    /* XXX : not implemented */
794
    spr_register(env, SPR_PMC1, "PMC1",
795
                 SPR_NOACCESS, SPR_NOACCESS,
796
                 &spr_read_generic, &spr_write_generic,
797
                 0x00000000);
798
    /* XXX : not implemented */
799
    spr_register(env, SPR_PMC2, "PMC2",
800
                 SPR_NOACCESS, SPR_NOACCESS,
801
                 &spr_read_generic, &spr_write_generic,
802
                 0x00000000);
803
    /* XXX : not implemented */
804
    spr_register(env, SPR_PMC3, "PMC3",
805
                 SPR_NOACCESS, SPR_NOACCESS,
806
                 &spr_read_generic, &spr_write_generic,
807
                 0x00000000);
808
    /* XXX : not implemented */
809
    spr_register(env, SPR_PMC4, "PMC4",
810
                 SPR_NOACCESS, SPR_NOACCESS,
811
                 &spr_read_generic, &spr_write_generic,
812
                 0x00000000);
813
    /* XXX : not implemented */
814
    spr_register(env, SPR_SIAR, "SIAR",
815
                 SPR_NOACCESS, SPR_NOACCESS,
816
                 &spr_read_generic, SPR_NOACCESS,
817
                 0x00000000);
818
    /* XXX : not implemented */
819
    spr_register(env, SPR_UMMCR0, "UMMCR0",
820
                 &spr_read_ureg, SPR_NOACCESS,
821
                 &spr_read_ureg, SPR_NOACCESS,
822
                 0x00000000);
823
    /* XXX : not implemented */
824
    spr_register(env, SPR_UMMCR1, "UMMCR1",
825
                 &spr_read_ureg, SPR_NOACCESS,
826
                 &spr_read_ureg, SPR_NOACCESS,
827
                 0x00000000);
828
    /* XXX : not implemented */
829
    spr_register(env, SPR_UPMC1, "UPMC1",
830
                 &spr_read_ureg, SPR_NOACCESS,
831
                 &spr_read_ureg, SPR_NOACCESS,
832
                 0x00000000);
833
    /* XXX : not implemented */
834
    spr_register(env, SPR_UPMC2, "UPMC2",
835
                 &spr_read_ureg, SPR_NOACCESS,
836
                 &spr_read_ureg, SPR_NOACCESS,
837
                 0x00000000);
838
    /* XXX : not implemented */
839
    spr_register(env, SPR_UPMC3, "UPMC3",
840
                 &spr_read_ureg, SPR_NOACCESS,
841
                 &spr_read_ureg, SPR_NOACCESS,
842
                 0x00000000);
843
    /* XXX : not implemented */
844
    spr_register(env, SPR_UPMC4, "UPMC4",
845
                 &spr_read_ureg, SPR_NOACCESS,
846
                 &spr_read_ureg, SPR_NOACCESS,
847
                 0x00000000);
848
    /* XXX : not implemented */
849
    spr_register(env, SPR_USIAR, "USIAR",
850
                 &spr_read_ureg, SPR_NOACCESS,
851
                 &spr_read_ureg, SPR_NOACCESS,
852
                 0x00000000);
853
    /* External access control */
854
    /* XXX : not implemented */
855
    spr_register(env, SPR_EAR, "EAR",
856
                 SPR_NOACCESS, SPR_NOACCESS,
857
                 &spr_read_generic, &spr_write_generic,
858
                 0x00000000);
859
}
860

    
861
static void gen_spr_thrm (CPUPPCState *env)
862
{
863
    /* Thermal management */
864
    /* XXX : not implemented */
865
    spr_register(env, SPR_THRM1, "THRM1",
866
                 SPR_NOACCESS, SPR_NOACCESS,
867
                 &spr_read_generic, &spr_write_generic,
868
                 0x00000000);
869
    /* XXX : not implemented */
870
    spr_register(env, SPR_THRM2, "THRM2",
871
                 SPR_NOACCESS, SPR_NOACCESS,
872
                 &spr_read_generic, &spr_write_generic,
873
                 0x00000000);
874
    /* XXX : not implemented */
875
    spr_register(env, SPR_THRM3, "THRM3",
876
                 SPR_NOACCESS, SPR_NOACCESS,
877
                 &spr_read_generic, &spr_write_generic,
878
                 0x00000000);
879
}
880

    
881
/* SPR specific to PowerPC 604 implementation */
882
static void gen_spr_604 (CPUPPCState *env)
883
{
884
    /* Processor identification */
885
    spr_register(env, SPR_PIR, "PIR",
886
                 SPR_NOACCESS, SPR_NOACCESS,
887
                 &spr_read_generic, &spr_write_pir,
888
                 0x00000000);
889
    /* Breakpoints */
890
    /* XXX : not implemented */
891
    spr_register(env, SPR_IABR, "IABR",
892
                 SPR_NOACCESS, SPR_NOACCESS,
893
                 &spr_read_generic, &spr_write_generic,
894
                 0x00000000);
895
    /* XXX : not implemented */
896
    spr_register(env, SPR_DABR, "DABR",
897
                 SPR_NOACCESS, SPR_NOACCESS,
898
                 &spr_read_generic, &spr_write_generic,
899
                 0x00000000);
900
    /* Performance counters */
901
    /* XXX : not implemented */
902
    spr_register(env, SPR_MMCR0, "MMCR0",
903
                 SPR_NOACCESS, SPR_NOACCESS,
904
                 &spr_read_generic, &spr_write_generic,
905
                 0x00000000);
906
    /* XXX : not implemented */
907
    spr_register(env, SPR_MMCR1, "MMCR1",
908
                 SPR_NOACCESS, SPR_NOACCESS,
909
                 &spr_read_generic, &spr_write_generic,
910
                 0x00000000);
911
    /* XXX : not implemented */
912
    spr_register(env, SPR_PMC1, "PMC1",
913
                 SPR_NOACCESS, SPR_NOACCESS,
914
                 &spr_read_generic, &spr_write_generic,
915
                 0x00000000);
916
    /* XXX : not implemented */
917
    spr_register(env, SPR_PMC2, "PMC2",
918
                 SPR_NOACCESS, SPR_NOACCESS,
919
                 &spr_read_generic, &spr_write_generic,
920
                 0x00000000);
921
    /* XXX : not implemented */
922
    spr_register(env, SPR_PMC3, "PMC3",
923
                 SPR_NOACCESS, SPR_NOACCESS,
924
                 &spr_read_generic, &spr_write_generic,
925
                 0x00000000);
926
    /* XXX : not implemented */
927
    spr_register(env, SPR_PMC4, "PMC4",
928
                 SPR_NOACCESS, SPR_NOACCESS,
929
                 &spr_read_generic, &spr_write_generic,
930
                 0x00000000);
931
    /* XXX : not implemented */
932
    spr_register(env, SPR_SIAR, "SIAR",
933
                 SPR_NOACCESS, SPR_NOACCESS,
934
                 &spr_read_generic, SPR_NOACCESS,
935
                 0x00000000);
936
    /* XXX : not implemented */
937
    spr_register(env, SPR_SDA, "SDA",
938
                 SPR_NOACCESS, SPR_NOACCESS,
939
                 &spr_read_generic, SPR_NOACCESS,
940
                 0x00000000);
941
    /* External access control */
942
    /* XXX : not implemented */
943
    spr_register(env, SPR_EAR, "EAR",
944
                 SPR_NOACCESS, SPR_NOACCESS,
945
                 &spr_read_generic, &spr_write_generic,
946
                 0x00000000);
947
}
948

    
949
/* SPR specific to PowerPC 603 implementation */
950
static void gen_spr_603 (CPUPPCState *env)
951
{
952
    /* External access control */
953
    /* XXX : not implemented */
954
    spr_register(env, SPR_EAR, "EAR",
955
                 SPR_NOACCESS, SPR_NOACCESS,
956
                 &spr_read_generic, &spr_write_generic,
957
                 0x00000000);
958
}
959

    
960
/* SPR specific to PowerPC G2 implementation */
961
static void gen_spr_G2 (CPUPPCState *env)
962
{
963
    /* Memory base address */
964
    /* MBAR */
965
    /* XXX : not implemented */
966
    spr_register(env, SPR_MBAR, "MBAR",
967
                 SPR_NOACCESS, SPR_NOACCESS,
968
                 &spr_read_generic, &spr_write_generic,
969
                 0x00000000);
970
    /* System version register */
971
    /* SVR */
972
    /* XXX : TODO: initialize it to an appropriate value */
973
    spr_register(env, SPR_SVR, "SVR",
974
                 SPR_NOACCESS, SPR_NOACCESS,
975
                 &spr_read_generic, SPR_NOACCESS,
976
                 0x00000000);
977
    /* Exception processing */
978
    spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
979
                 SPR_NOACCESS, SPR_NOACCESS,
980
                 &spr_read_generic, &spr_write_generic,
981
                 0x00000000);
982
    spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
983
                 SPR_NOACCESS, SPR_NOACCESS,
984
                 &spr_read_generic, &spr_write_generic,
985
                 0x00000000);
986
    /* Breakpoints */
987
    /* XXX : not implemented */
988
    spr_register(env, SPR_DABR, "DABR",
989
                 SPR_NOACCESS, SPR_NOACCESS,
990
                 &spr_read_generic, &spr_write_generic,
991
                 0x00000000);
992
    /* XXX : not implemented */
993
    spr_register(env, SPR_DABR2, "DABR2",
994
                 SPR_NOACCESS, SPR_NOACCESS,
995
                 &spr_read_generic, &spr_write_generic,
996
                 0x00000000);
997
    /* XXX : not implemented */
998
    spr_register(env, SPR_IABR, "IABR",
999
                 SPR_NOACCESS, SPR_NOACCESS,
1000
                 &spr_read_generic, &spr_write_generic,
1001
                 0x00000000);
1002
    /* XXX : not implemented */
1003
    spr_register(env, SPR_IABR2, "IABR2",
1004
                 SPR_NOACCESS, SPR_NOACCESS,
1005
                 &spr_read_generic, &spr_write_generic,
1006
                 0x00000000);
1007
    /* XXX : not implemented */
1008
    spr_register(env, SPR_IBCR, "IBCR",
1009
                 SPR_NOACCESS, SPR_NOACCESS,
1010
                 &spr_read_generic, &spr_write_generic,
1011
                 0x00000000);
1012
    /* XXX : not implemented */
1013
    spr_register(env, SPR_DBCR, "DBCR",
1014
                 SPR_NOACCESS, SPR_NOACCESS,
1015
                 &spr_read_generic, &spr_write_generic,
1016
                 0x00000000);
1017
}
1018

    
1019
/* SPR specific to PowerPC 602 implementation */
1020
static void gen_spr_602 (CPUPPCState *env)
1021
{
1022
    /* ESA registers */
1023
    /* XXX : not implemented */
1024
    spr_register(env, SPR_SER, "SER",
1025
                 SPR_NOACCESS, SPR_NOACCESS,
1026
                 &spr_read_generic, &spr_write_generic,
1027
                 0x00000000);
1028
    /* XXX : not implemented */
1029
    spr_register(env, SPR_SEBR, "SEBR",
1030
                 SPR_NOACCESS, SPR_NOACCESS,
1031
                 &spr_read_generic, &spr_write_generic,
1032
                 0x00000000);
1033
    /* XXX : not implemented */
1034
    spr_register(env, SPR_ESASRR, "ESASRR",
1035
                 SPR_NOACCESS, SPR_NOACCESS,
1036
                 &spr_read_generic, &spr_write_generic,
1037
                 0x00000000);
1038
    /* Floating point status */
1039
    /* XXX : not implemented */
1040
    spr_register(env, SPR_SP, "SP",
1041
                 SPR_NOACCESS, SPR_NOACCESS,
1042
                 &spr_read_generic, &spr_write_generic,
1043
                 0x00000000);
1044
    /* XXX : not implemented */
1045
    spr_register(env, SPR_LT, "LT",
1046
                 SPR_NOACCESS, SPR_NOACCESS,
1047
                 &spr_read_generic, &spr_write_generic,
1048
                 0x00000000);
1049
    /* Watchdog timer */
1050
    /* XXX : not implemented */
1051
    spr_register(env, SPR_TCR, "TCR",
1052
                 SPR_NOACCESS, SPR_NOACCESS,
1053
                 &spr_read_generic, &spr_write_generic,
1054
                 0x00000000);
1055
    /* Interrupt base */
1056
    spr_register(env, SPR_IBR, "IBR",
1057
                 SPR_NOACCESS, SPR_NOACCESS,
1058
                 &spr_read_generic, &spr_write_generic,
1059
                 0x00000000);
1060
    /* XXX : not implemented */
1061
    spr_register(env, SPR_IABR, "IABR",
1062
                 SPR_NOACCESS, SPR_NOACCESS,
1063
                 &spr_read_generic, &spr_write_generic,
1064
                 0x00000000);
1065
}
1066

    
1067
/* SPR specific to PowerPC 601 implementation */
1068
static void gen_spr_601 (CPUPPCState *env)
1069
{
1070
    /* Multiplication/division register */
1071
    /* MQ */
1072
    spr_register(env, SPR_MQ, "MQ",
1073
                 &spr_read_generic, &spr_write_generic,
1074
                 &spr_read_generic, &spr_write_generic,
1075
                 0x00000000);
1076
    /* RTC registers */
1077
    spr_register(env, SPR_601_RTCU, "RTCU",
1078
                 SPR_NOACCESS, SPR_NOACCESS,
1079
                 SPR_NOACCESS, &spr_write_601_rtcu,
1080
                 0x00000000);
1081
    spr_register(env, SPR_601_VRTCU, "RTCU",
1082
                 &spr_read_601_rtcu, SPR_NOACCESS,
1083
                 &spr_read_601_rtcu, SPR_NOACCESS,
1084
                 0x00000000);
1085
    spr_register(env, SPR_601_RTCL, "RTCL",
1086
                 SPR_NOACCESS, SPR_NOACCESS,
1087
                 SPR_NOACCESS, &spr_write_601_rtcl,
1088
                 0x00000000);
1089
    spr_register(env, SPR_601_VRTCL, "RTCL",
1090
                 &spr_read_601_rtcl, SPR_NOACCESS,
1091
                 &spr_read_601_rtcl, SPR_NOACCESS,
1092
                 0x00000000);
1093
    /* Timer */
1094
#if 0 /* ? */
1095
    spr_register(env, SPR_601_UDECR, "UDECR",
1096
                 &spr_read_decr, SPR_NOACCESS,
1097
                 &spr_read_decr, SPR_NOACCESS,
1098
                 0x00000000);
1099
#endif
1100
    /* External access control */
1101
    /* XXX : not implemented */
1102
    spr_register(env, SPR_EAR, "EAR",
1103
                 SPR_NOACCESS, SPR_NOACCESS,
1104
                 &spr_read_generic, &spr_write_generic,
1105
                 0x00000000);
1106
    /* Memory management */
1107
    spr_register(env, SPR_IBAT0U, "IBAT0U",
1108
                 SPR_NOACCESS, SPR_NOACCESS,
1109
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1110
                 0x00000000);
1111
    spr_register(env, SPR_IBAT0L, "IBAT0L",
1112
                 SPR_NOACCESS, SPR_NOACCESS,
1113
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1114
                 0x00000000);
1115
    spr_register(env, SPR_IBAT1U, "IBAT1U",
1116
                 SPR_NOACCESS, SPR_NOACCESS,
1117
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1118
                 0x00000000);
1119
    spr_register(env, SPR_IBAT1L, "IBAT1L",
1120
                 SPR_NOACCESS, SPR_NOACCESS,
1121
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1122
                 0x00000000);
1123
    spr_register(env, SPR_IBAT2U, "IBAT2U",
1124
                 SPR_NOACCESS, SPR_NOACCESS,
1125
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1126
                 0x00000000);
1127
    spr_register(env, SPR_IBAT2L, "IBAT2L",
1128
                 SPR_NOACCESS, SPR_NOACCESS,
1129
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1130
                 0x00000000);
1131
    spr_register(env, SPR_IBAT3U, "IBAT3U",
1132
                 SPR_NOACCESS, SPR_NOACCESS,
1133
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1134
                 0x00000000);
1135
    spr_register(env, SPR_IBAT3L, "IBAT3L",
1136
                 SPR_NOACCESS, SPR_NOACCESS,
1137
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1138
                 0x00000000);
1139
    env->nb_BATs = 4;
1140
}
1141

    
1142
static void gen_spr_74xx (CPUPPCState *env)
1143
{
1144
    /* Processor identification */
1145
    spr_register(env, SPR_PIR, "PIR",
1146
                 SPR_NOACCESS, SPR_NOACCESS,
1147
                 &spr_read_generic, &spr_write_pir,
1148
                 0x00000000);
1149
    /* XXX : not implemented */
1150
    spr_register(env, SPR_MMCR2, "MMCR2",
1151
                 SPR_NOACCESS, SPR_NOACCESS,
1152
                 &spr_read_generic, &spr_write_generic,
1153
                 0x00000000);
1154
    /* XXX : not implemented */
1155
    spr_register(env, SPR_UMMCR2, "UMMCR2",
1156
                 &spr_read_ureg, SPR_NOACCESS,
1157
                 &spr_read_ureg, SPR_NOACCESS,
1158
                 0x00000000);
1159
    /* XXX: not implemented */
1160
    spr_register(env, SPR_BAMR, "BAMR",
1161
                 SPR_NOACCESS, SPR_NOACCESS,
1162
                 &spr_read_generic, &spr_write_generic,
1163
                 0x00000000);
1164
    /* XXX : not implemented */
1165
    spr_register(env, SPR_UBAMR, "UBAMR",
1166
                 &spr_read_ureg, SPR_NOACCESS,
1167
                 &spr_read_ureg, SPR_NOACCESS,
1168
                 0x00000000);
1169
    /* XXX : not implemented */
1170
    spr_register(env, SPR_MSSCR0, "MSSCR0",
1171
                 SPR_NOACCESS, SPR_NOACCESS,
1172
                 &spr_read_generic, &spr_write_generic,
1173
                 0x00000000);
1174
    /* Hardware implementation registers */
1175
    /* XXX : not implemented */
1176
    spr_register(env, SPR_HID0, "HID0",
1177
                 SPR_NOACCESS, SPR_NOACCESS,
1178
                 &spr_read_generic, &spr_write_generic,
1179
                 0x00000000);
1180
    /* XXX : not implemented */
1181
    spr_register(env, SPR_HID1, "HID1",
1182
                 SPR_NOACCESS, SPR_NOACCESS,
1183
                 &spr_read_generic, &spr_write_generic,
1184
                 0x00000000);
1185
    /* Altivec */
1186
    spr_register(env, SPR_VRSAVE, "VRSAVE",
1187
                 &spr_read_generic, &spr_write_generic,
1188
                 &spr_read_generic, &spr_write_generic,
1189
                 0x00000000);
1190
}
1191

    
1192
static void gen_l3_ctrl (CPUPPCState *env)
1193
{
1194
    /* L3CR */
1195
    /* XXX : not implemented */
1196
    spr_register(env, SPR_L3CR, "L3CR",
1197
                 SPR_NOACCESS, SPR_NOACCESS,
1198
                 &spr_read_generic, &spr_write_generic,
1199
                 0x00000000);
1200
    /* L3ITCR0 */
1201
    /* XXX : not implemented */
1202
    spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1203
                 SPR_NOACCESS, SPR_NOACCESS,
1204
                 &spr_read_generic, &spr_write_generic,
1205
                 0x00000000);
1206
    /* L3ITCR1 */
1207
    /* XXX : not implemented */
1208
    spr_register(env, SPR_L3ITCR1, "L3ITCR1",
1209
                 SPR_NOACCESS, SPR_NOACCESS,
1210
                 &spr_read_generic, &spr_write_generic,
1211
                 0x00000000);
1212
    /* L3ITCR2 */
1213
    /* XXX : not implemented */
1214
    spr_register(env, SPR_L3ITCR2, "L3ITCR2",
1215
                 SPR_NOACCESS, SPR_NOACCESS,
1216
                 &spr_read_generic, &spr_write_generic,
1217
                 0x00000000);
1218
    /* L3ITCR3 */
1219
    /* XXX : not implemented */
1220
    spr_register(env, SPR_L3ITCR3, "L3ITCR3",
1221
                 SPR_NOACCESS, SPR_NOACCESS,
1222
                 &spr_read_generic, &spr_write_generic,
1223
                 0x00000000);
1224
    /* L3OHCR */
1225
    /* XXX : not implemented */
1226
    spr_register(env, SPR_L3OHCR, "L3OHCR",
1227
                 SPR_NOACCESS, SPR_NOACCESS,
1228
                 &spr_read_generic, &spr_write_generic,
1229
                 0x00000000);
1230
    /* L3PM */
1231
    /* XXX : not implemented */
1232
    spr_register(env, SPR_L3PM, "L3PM",
1233
                 SPR_NOACCESS, SPR_NOACCESS,
1234
                 &spr_read_generic, &spr_write_generic,
1235
                 0x00000000);
1236
}
1237

    
1238
static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
1239
{
1240
    env->nb_tlb = nb_tlbs;
1241
    env->nb_ways = nb_ways;
1242
    env->id_tlbs = 1;
1243
    /* XXX : not implemented */
1244
    spr_register(env, SPR_PTEHI, "PTEHI",
1245
                 SPR_NOACCESS, SPR_NOACCESS,
1246
                 &spr_read_generic, &spr_write_generic,
1247
                 0x00000000);
1248
    /* XXX : not implemented */
1249
    spr_register(env, SPR_PTELO, "PTELO",
1250
                 SPR_NOACCESS, SPR_NOACCESS,
1251
                 &spr_read_generic, &spr_write_generic,
1252
                 0x00000000);
1253
    /* XXX : not implemented */
1254
    spr_register(env, SPR_TLBMISS, "TLBMISS",
1255
                 SPR_NOACCESS, SPR_NOACCESS,
1256
                 &spr_read_generic, &spr_write_generic,
1257
                 0x00000000);
1258
}
1259

    
1260
/* PowerPC BookE SPR */
1261
static void gen_spr_BookE (CPUPPCState *env)
1262
{
1263
    /* Processor identification */
1264
    spr_register(env, SPR_BOOKE_PIR, "PIR",
1265
                 SPR_NOACCESS, SPR_NOACCESS,
1266
                 &spr_read_generic, &spr_write_pir,
1267
                 0x00000000);
1268
    /* Interrupt processing */
1269
    spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1270
                 SPR_NOACCESS, SPR_NOACCESS,
1271
                 &spr_read_generic, &spr_write_generic,
1272
                 0x00000000);
1273
    spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1274
                 SPR_NOACCESS, SPR_NOACCESS,
1275
                 &spr_read_generic, &spr_write_generic,
1276
                 0x00000000);
1277
#if 0
1278
    spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1279
                 SPR_NOACCESS, SPR_NOACCESS,
1280
                 &spr_read_generic, &spr_write_generic,
1281
                 0x00000000);
1282
    spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1283
                 SPR_NOACCESS, SPR_NOACCESS,
1284
                 &spr_read_generic, &spr_write_generic,
1285
                 0x00000000);
1286
#endif
1287
    /* Debug */
1288
    /* XXX : not implemented */
1289
    spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1290
                 SPR_NOACCESS, SPR_NOACCESS,
1291
                 &spr_read_generic, &spr_write_generic,
1292
                 0x00000000);
1293
    /* XXX : not implemented */
1294
    spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1295
                 SPR_NOACCESS, SPR_NOACCESS,
1296
                 &spr_read_generic, &spr_write_generic,
1297
                 0x00000000);
1298
    /* XXX : not implemented */
1299
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1300
                 SPR_NOACCESS, SPR_NOACCESS,
1301
                 &spr_read_generic, &spr_write_generic,
1302
                 0x00000000);
1303
    /* XXX : not implemented */
1304
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1305
                 SPR_NOACCESS, SPR_NOACCESS,
1306
                 &spr_read_generic, &spr_write_generic,
1307
                 0x00000000);
1308
    /* XXX : not implemented */
1309
    spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1310
                 SPR_NOACCESS, SPR_NOACCESS,
1311
                 &spr_read_generic, &spr_write_generic,
1312
                 0x00000000);
1313
    /* XXX : not implemented */
1314
    spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1315
                 SPR_NOACCESS, SPR_NOACCESS,
1316
                 &spr_read_generic, &spr_write_generic,
1317
                 0x00000000);
1318
    /* XXX : not implemented */
1319
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1320
                 SPR_NOACCESS, SPR_NOACCESS,
1321
                 &spr_read_generic, &spr_write_generic,
1322
                 0x00000000);
1323
    /* XXX : not implemented */
1324
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1325
                 SPR_NOACCESS, SPR_NOACCESS,
1326
                 &spr_read_generic, &spr_write_generic,
1327
                 0x00000000);
1328
    /* XXX : not implemented */
1329
    spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1330
                 SPR_NOACCESS, SPR_NOACCESS,
1331
                 &spr_read_generic, &spr_write_generic,
1332
                 0x00000000);
1333
    /* XXX : not implemented */
1334
    spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1335
                 SPR_NOACCESS, SPR_NOACCESS,
1336
                 &spr_read_generic, &spr_write_generic,
1337
                 0x00000000);
1338
    /* XXX : not implemented */
1339
    spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1340
                 SPR_NOACCESS, SPR_NOACCESS,
1341
                 &spr_read_generic, &spr_write_generic,
1342
                 0x00000000);
1343
    /* XXX : not implemented */
1344
    spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1345
                 SPR_NOACCESS, SPR_NOACCESS,
1346
                 &spr_read_generic, &spr_write_clear,
1347
                 0x00000000);
1348
    spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1349
                 SPR_NOACCESS, SPR_NOACCESS,
1350
                 &spr_read_generic, &spr_write_generic,
1351
                 0x00000000);
1352
    spr_register(env, SPR_BOOKE_ESR, "ESR",
1353
                 SPR_NOACCESS, SPR_NOACCESS,
1354
                 &spr_read_generic, &spr_write_generic,
1355
                 0x00000000);
1356
    spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1357
                 SPR_NOACCESS, SPR_NOACCESS,
1358
                 &spr_read_generic, &spr_write_excp_prefix,
1359
                 0x00000000);
1360
    /* Exception vectors */
1361
    spr_register(env, SPR_BOOKE_IVOR0, "IVOR0",
1362
                 SPR_NOACCESS, SPR_NOACCESS,
1363
                 &spr_read_generic, &spr_write_excp_vector,
1364
                 0x00000000);
1365
    spr_register(env, SPR_BOOKE_IVOR1, "IVOR1",
1366
                 SPR_NOACCESS, SPR_NOACCESS,
1367
                 &spr_read_generic, &spr_write_excp_vector,
1368
                 0x00000000);
1369
    spr_register(env, SPR_BOOKE_IVOR2, "IVOR2",
1370
                 SPR_NOACCESS, SPR_NOACCESS,
1371
                 &spr_read_generic, &spr_write_excp_vector,
1372
                 0x00000000);
1373
    spr_register(env, SPR_BOOKE_IVOR3, "IVOR3",
1374
                 SPR_NOACCESS, SPR_NOACCESS,
1375
                 &spr_read_generic, &spr_write_excp_vector,
1376
                 0x00000000);
1377
    spr_register(env, SPR_BOOKE_IVOR4, "IVOR4",
1378
                 SPR_NOACCESS, SPR_NOACCESS,
1379
                 &spr_read_generic, &spr_write_excp_vector,
1380
                 0x00000000);
1381
    spr_register(env, SPR_BOOKE_IVOR5, "IVOR5",
1382
                 SPR_NOACCESS, SPR_NOACCESS,
1383
                 &spr_read_generic, &spr_write_excp_vector,
1384
                 0x00000000);
1385
    spr_register(env, SPR_BOOKE_IVOR6, "IVOR6",
1386
                 SPR_NOACCESS, SPR_NOACCESS,
1387
                 &spr_read_generic, &spr_write_excp_vector,
1388
                 0x00000000);
1389
    spr_register(env, SPR_BOOKE_IVOR7, "IVOR7",
1390
                 SPR_NOACCESS, SPR_NOACCESS,
1391
                 &spr_read_generic, &spr_write_excp_vector,
1392
                 0x00000000);
1393
    spr_register(env, SPR_BOOKE_IVOR8, "IVOR8",
1394
                 SPR_NOACCESS, SPR_NOACCESS,
1395
                 &spr_read_generic, &spr_write_excp_vector,
1396
                 0x00000000);
1397
    spr_register(env, SPR_BOOKE_IVOR9, "IVOR9",
1398
                 SPR_NOACCESS, SPR_NOACCESS,
1399
                 &spr_read_generic, &spr_write_excp_vector,
1400
                 0x00000000);
1401
    spr_register(env, SPR_BOOKE_IVOR10, "IVOR10",
1402
                 SPR_NOACCESS, SPR_NOACCESS,
1403
                 &spr_read_generic, &spr_write_excp_vector,
1404
                 0x00000000);
1405
    spr_register(env, SPR_BOOKE_IVOR11, "IVOR11",
1406
                 SPR_NOACCESS, SPR_NOACCESS,
1407
                 &spr_read_generic, &spr_write_excp_vector,
1408
                 0x00000000);
1409
    spr_register(env, SPR_BOOKE_IVOR12, "IVOR12",
1410
                 SPR_NOACCESS, SPR_NOACCESS,
1411
                 &spr_read_generic, &spr_write_excp_vector,
1412
                 0x00000000);
1413
    spr_register(env, SPR_BOOKE_IVOR13, "IVOR13",
1414
                 SPR_NOACCESS, SPR_NOACCESS,
1415
                 &spr_read_generic, &spr_write_excp_vector,
1416
                 0x00000000);
1417
    spr_register(env, SPR_BOOKE_IVOR14, "IVOR14",
1418
                 SPR_NOACCESS, SPR_NOACCESS,
1419
                 &spr_read_generic, &spr_write_excp_vector,
1420
                 0x00000000);
1421
    spr_register(env, SPR_BOOKE_IVOR15, "IVOR15",
1422
                 SPR_NOACCESS, SPR_NOACCESS,
1423
                 &spr_read_generic, &spr_write_excp_vector,
1424
                 0x00000000);
1425
#if 0
1426
    spr_register(env, SPR_BOOKE_IVOR32, "IVOR32",
1427
                 SPR_NOACCESS, SPR_NOACCESS,
1428
                 &spr_read_generic, &spr_write_excp_vector,
1429
                 0x00000000);
1430
    spr_register(env, SPR_BOOKE_IVOR33, "IVOR33",
1431
                 SPR_NOACCESS, SPR_NOACCESS,
1432
                 &spr_read_generic, &spr_write_excp_vector,
1433
                 0x00000000);
1434
    spr_register(env, SPR_BOOKE_IVOR34, "IVOR34",
1435
                 SPR_NOACCESS, SPR_NOACCESS,
1436
                 &spr_read_generic, &spr_write_excp_vector,
1437
                 0x00000000);
1438
    spr_register(env, SPR_BOOKE_IVOR35, "IVOR35",
1439
                 SPR_NOACCESS, SPR_NOACCESS,
1440
                 &spr_read_generic, &spr_write_excp_vector,
1441
                 0x00000000);
1442
    spr_register(env, SPR_BOOKE_IVOR36, "IVOR36",
1443
                 SPR_NOACCESS, SPR_NOACCESS,
1444
                 &spr_read_generic, &spr_write_excp_vector,
1445
                 0x00000000);
1446
    spr_register(env, SPR_BOOKE_IVOR37, "IVOR37",
1447
                 SPR_NOACCESS, SPR_NOACCESS,
1448
                 &spr_read_generic, &spr_write_excp_vector,
1449
                 0x00000000);
1450
#endif
1451
    spr_register(env, SPR_BOOKE_PID, "PID",
1452
                 SPR_NOACCESS, SPR_NOACCESS,
1453
                 &spr_read_generic, &spr_write_generic,
1454
                 0x00000000);
1455
    spr_register(env, SPR_BOOKE_TCR, "TCR",
1456
                 SPR_NOACCESS, SPR_NOACCESS,
1457
                 &spr_read_generic, &spr_write_booke_tcr,
1458
                 0x00000000);
1459
    spr_register(env, SPR_BOOKE_TSR, "TSR",
1460
                 SPR_NOACCESS, SPR_NOACCESS,
1461
                 &spr_read_generic, &spr_write_booke_tsr,
1462
                 0x00000000);
1463
    /* Timer */
1464
    spr_register(env, SPR_DECR, "DECR",
1465
                 SPR_NOACCESS, SPR_NOACCESS,
1466
                 &spr_read_decr, &spr_write_decr,
1467
                 0x00000000);
1468
    spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1469
                 SPR_NOACCESS, SPR_NOACCESS,
1470
                 SPR_NOACCESS, &spr_write_generic,
1471
                 0x00000000);
1472
    /* SPRGs */
1473
    spr_register(env, SPR_USPRG0, "USPRG0",
1474
                 &spr_read_generic, &spr_write_generic,
1475
                 &spr_read_generic, &spr_write_generic,
1476
                 0x00000000);
1477
    spr_register(env, SPR_SPRG4, "SPRG4",
1478
                 SPR_NOACCESS, SPR_NOACCESS,
1479
                 &spr_read_generic, &spr_write_generic,
1480
                 0x00000000);
1481
    spr_register(env, SPR_USPRG4, "USPRG4",
1482
                 &spr_read_ureg, SPR_NOACCESS,
1483
                 &spr_read_ureg, SPR_NOACCESS,
1484
                 0x00000000);
1485
    spr_register(env, SPR_SPRG5, "SPRG5",
1486
                 SPR_NOACCESS, SPR_NOACCESS,
1487
                 &spr_read_generic, &spr_write_generic,
1488
                 0x00000000);
1489
    spr_register(env, SPR_USPRG5, "USPRG5",
1490
                 &spr_read_ureg, SPR_NOACCESS,
1491
                 &spr_read_ureg, SPR_NOACCESS,
1492
                 0x00000000);
1493
    spr_register(env, SPR_SPRG6, "SPRG6",
1494
                 SPR_NOACCESS, SPR_NOACCESS,
1495
                 &spr_read_generic, &spr_write_generic,
1496
                 0x00000000);
1497
    spr_register(env, SPR_USPRG6, "USPRG6",
1498
                 &spr_read_ureg, SPR_NOACCESS,
1499
                 &spr_read_ureg, SPR_NOACCESS,
1500
                 0x00000000);
1501
    spr_register(env, SPR_SPRG7, "SPRG7",
1502
                 SPR_NOACCESS, SPR_NOACCESS,
1503
                 &spr_read_generic, &spr_write_generic,
1504
                 0x00000000);
1505
    spr_register(env, SPR_USPRG7, "USPRG7",
1506
                 &spr_read_ureg, SPR_NOACCESS,
1507
                 &spr_read_ureg, SPR_NOACCESS,
1508
                 0x00000000);
1509
}
1510

    
1511
/* FSL storage control registers */
1512
static void gen_spr_BookE_FSL (CPUPPCState *env)
1513
{
1514
    /* TLB assist registers */
1515
    /* XXX : not implemented */
1516
    spr_register(env, SPR_BOOKE_MAS0, "MAS0",
1517
                 SPR_NOACCESS, SPR_NOACCESS,
1518
                 &spr_read_generic, &spr_write_generic,
1519
                 0x00000000);
1520
    /* XXX : not implemented */
1521
    spr_register(env, SPR_BOOKE_MAS1, "MAS2",
1522
                 SPR_NOACCESS, SPR_NOACCESS,
1523
                 &spr_read_generic, &spr_write_generic,
1524
                 0x00000000);
1525
    /* XXX : not implemented */
1526
    spr_register(env, SPR_BOOKE_MAS2, "MAS3",
1527
                 SPR_NOACCESS, SPR_NOACCESS,
1528
                 &spr_read_generic, &spr_write_generic,
1529
                 0x00000000);
1530
    /* XXX : not implemented */
1531
    spr_register(env, SPR_BOOKE_MAS3, "MAS4",
1532
                 SPR_NOACCESS, SPR_NOACCESS,
1533
                 &spr_read_generic, &spr_write_generic,
1534
                 0x00000000);
1535
    /* XXX : not implemented */
1536
    spr_register(env, SPR_BOOKE_MAS4, "MAS5",
1537
                 SPR_NOACCESS, SPR_NOACCESS,
1538
                 &spr_read_generic, &spr_write_generic,
1539
                 0x00000000);
1540
    /* XXX : not implemented */
1541
    spr_register(env, SPR_BOOKE_MAS6, "MAS6",
1542
                 SPR_NOACCESS, SPR_NOACCESS,
1543
                 &spr_read_generic, &spr_write_generic,
1544
                 0x00000000);
1545
    /* XXX : not implemented */
1546
    spr_register(env, SPR_BOOKE_MAS7, "MAS7",
1547
                 SPR_NOACCESS, SPR_NOACCESS,
1548
                 &spr_read_generic, &spr_write_generic,
1549
                 0x00000000);
1550
    if (env->nb_pids > 1) {
1551
        /* XXX : not implemented */
1552
        spr_register(env, SPR_BOOKE_PID1, "PID1",
1553
                     SPR_NOACCESS, SPR_NOACCESS,
1554
                     &spr_read_generic, &spr_write_generic,
1555
                     0x00000000);
1556
    }
1557
    if (env->nb_pids > 2) {
1558
        /* XXX : not implemented */
1559
        spr_register(env, SPR_BOOKE_PID2, "PID2",
1560
                     SPR_NOACCESS, SPR_NOACCESS,
1561
                     &spr_read_generic, &spr_write_generic,
1562
                     0x00000000);
1563
    }
1564
    /* XXX : not implemented */
1565
    spr_register(env, SPR_BOOKE_MMUCFG, "MMUCFG",
1566
                 SPR_NOACCESS, SPR_NOACCESS,
1567
                 &spr_read_generic, SPR_NOACCESS,
1568
                 0x00000000); /* TOFIX */
1569
    /* XXX : not implemented */
1570
    spr_register(env, SPR_BOOKE_MMUCSR0, "MMUCSR0",
1571
                 SPR_NOACCESS, SPR_NOACCESS,
1572
                 &spr_read_generic, &spr_write_generic,
1573
                 0x00000000); /* TOFIX */
1574
    switch (env->nb_ways) {
1575
    case 4:
1576
        /* XXX : not implemented */
1577
        spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1578
                     SPR_NOACCESS, SPR_NOACCESS,
1579
                     &spr_read_generic, SPR_NOACCESS,
1580
                     0x00000000); /* TOFIX */
1581
        /* Fallthru */
1582
    case 3:
1583
        /* XXX : not implemented */
1584
        spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1585
                     SPR_NOACCESS, SPR_NOACCESS,
1586
                     &spr_read_generic, SPR_NOACCESS,
1587
                     0x00000000); /* TOFIX */
1588
        /* Fallthru */
1589
    case 2:
1590
        /* XXX : not implemented */
1591
        spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1592
                     SPR_NOACCESS, SPR_NOACCESS,
1593
                     &spr_read_generic, SPR_NOACCESS,
1594
                     0x00000000); /* TOFIX */
1595
        /* Fallthru */
1596
    case 1:
1597
        /* XXX : not implemented */
1598
        spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1599
                     SPR_NOACCESS, SPR_NOACCESS,
1600
                     &spr_read_generic, SPR_NOACCESS,
1601
                     0x00000000); /* TOFIX */
1602
        /* Fallthru */
1603
    case 0:
1604
    default:
1605
        break;
1606
    }
1607
}
1608

    
1609
/* SPR specific to PowerPC 440 implementation */
1610
static void gen_spr_440 (CPUPPCState *env)
1611
{
1612
    /* Cache control */
1613
    /* XXX : not implemented */
1614
    spr_register(env, SPR_440_DNV0, "DNV0",
1615
                 SPR_NOACCESS, SPR_NOACCESS,
1616
                 &spr_read_generic, &spr_write_generic,
1617
                 0x00000000);
1618
    /* XXX : not implemented */
1619
    spr_register(env, SPR_440_DNV1, "DNV1",
1620
                 SPR_NOACCESS, SPR_NOACCESS,
1621
                 &spr_read_generic, &spr_write_generic,
1622
                 0x00000000);
1623
    /* XXX : not implemented */
1624
    spr_register(env, SPR_440_DNV2, "DNV2",
1625
                 SPR_NOACCESS, SPR_NOACCESS,
1626
                 &spr_read_generic, &spr_write_generic,
1627
                 0x00000000);
1628
    /* XXX : not implemented */
1629
    spr_register(env, SPR_440_DNV3, "DNV3",
1630
                 SPR_NOACCESS, SPR_NOACCESS,
1631
                 &spr_read_generic, &spr_write_generic,
1632
                 0x00000000);
1633
    /* XXX : not implemented */
1634
    spr_register(env, SPR_440_DTV0, "DTV0",
1635
                 SPR_NOACCESS, SPR_NOACCESS,
1636
                 &spr_read_generic, &spr_write_generic,
1637
                 0x00000000);
1638
    /* XXX : not implemented */
1639
    spr_register(env, SPR_440_DTV1, "DTV1",
1640
                 SPR_NOACCESS, SPR_NOACCESS,
1641
                 &spr_read_generic, &spr_write_generic,
1642
                 0x00000000);
1643
    /* XXX : not implemented */
1644
    spr_register(env, SPR_440_DTV2, "DTV2",
1645
                 SPR_NOACCESS, SPR_NOACCESS,
1646
                 &spr_read_generic, &spr_write_generic,
1647
                 0x00000000);
1648
    /* XXX : not implemented */
1649
    spr_register(env, SPR_440_DTV3, "DTV3",
1650
                 SPR_NOACCESS, SPR_NOACCESS,
1651
                 &spr_read_generic, &spr_write_generic,
1652
                 0x00000000);
1653
    /* XXX : not implemented */
1654
    spr_register(env, SPR_440_DVLIM, "DVLIM",
1655
                 SPR_NOACCESS, SPR_NOACCESS,
1656
                 &spr_read_generic, &spr_write_generic,
1657
                 0x00000000);
1658
    /* XXX : not implemented */
1659
    spr_register(env, SPR_440_INV0, "INV0",
1660
                 SPR_NOACCESS, SPR_NOACCESS,
1661
                 &spr_read_generic, &spr_write_generic,
1662
                 0x00000000);
1663
    /* XXX : not implemented */
1664
    spr_register(env, SPR_440_INV1, "INV1",
1665
                 SPR_NOACCESS, SPR_NOACCESS,
1666
                 &spr_read_generic, &spr_write_generic,
1667
                 0x00000000);
1668
    /* XXX : not implemented */
1669
    spr_register(env, SPR_440_INV2, "INV2",
1670
                 SPR_NOACCESS, SPR_NOACCESS,
1671
                 &spr_read_generic, &spr_write_generic,
1672
                 0x00000000);
1673
    /* XXX : not implemented */
1674
    spr_register(env, SPR_440_INV3, "INV3",
1675
                 SPR_NOACCESS, SPR_NOACCESS,
1676
                 &spr_read_generic, &spr_write_generic,
1677
                 0x00000000);
1678
    /* XXX : not implemented */
1679
    spr_register(env, SPR_440_ITV0, "ITV0",
1680
                 SPR_NOACCESS, SPR_NOACCESS,
1681
                 &spr_read_generic, &spr_write_generic,
1682
                 0x00000000);
1683
    /* XXX : not implemented */
1684
    spr_register(env, SPR_440_ITV1, "ITV1",
1685
                 SPR_NOACCESS, SPR_NOACCESS,
1686
                 &spr_read_generic, &spr_write_generic,
1687
                 0x00000000);
1688
    /* XXX : not implemented */
1689
    spr_register(env, SPR_440_ITV2, "ITV2",
1690
                 SPR_NOACCESS, SPR_NOACCESS,
1691
                 &spr_read_generic, &spr_write_generic,
1692
                 0x00000000);
1693
    /* XXX : not implemented */
1694
    spr_register(env, SPR_440_ITV3, "ITV3",
1695
                 SPR_NOACCESS, SPR_NOACCESS,
1696
                 &spr_read_generic, &spr_write_generic,
1697
                 0x00000000);
1698
    /* XXX : not implemented */
1699
    spr_register(env, SPR_440_IVLIM, "IVLIM",
1700
                 SPR_NOACCESS, SPR_NOACCESS,
1701
                 &spr_read_generic, &spr_write_generic,
1702
                 0x00000000);
1703
    /* Cache debug */
1704
    /* XXX : not implemented */
1705
    spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
1706
                 SPR_NOACCESS, SPR_NOACCESS,
1707
                 &spr_read_generic, SPR_NOACCESS,
1708
                 0x00000000);
1709
    /* XXX : not implemented */
1710
    spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
1711
                 SPR_NOACCESS, SPR_NOACCESS,
1712
                 &spr_read_generic, SPR_NOACCESS,
1713
                 0x00000000);
1714
    /* XXX : not implemented */
1715
    spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1716
                 SPR_NOACCESS, SPR_NOACCESS,
1717
                 &spr_read_generic, SPR_NOACCESS,
1718
                 0x00000000);
1719
    /* XXX : not implemented */
1720
    spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
1721
                 SPR_NOACCESS, SPR_NOACCESS,
1722
                 &spr_read_generic, SPR_NOACCESS,
1723
                 0x00000000);
1724
    /* XXX : not implemented */
1725
    spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
1726
                 SPR_NOACCESS, SPR_NOACCESS,
1727
                 &spr_read_generic, SPR_NOACCESS,
1728
                 0x00000000);
1729
    /* XXX : not implemented */
1730
    spr_register(env, SPR_440_DBDR, "DBDR",
1731
                 SPR_NOACCESS, SPR_NOACCESS,
1732
                 &spr_read_generic, &spr_write_generic,
1733
                 0x00000000);
1734
    /* Processor control */
1735
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1736
                 SPR_NOACCESS, SPR_NOACCESS,
1737
                 &spr_read_generic, &spr_write_generic,
1738
                 0x00000000);
1739
    spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1740
                 SPR_NOACCESS, SPR_NOACCESS,
1741
                 &spr_read_generic, SPR_NOACCESS,
1742
                 0x00000000);
1743
    /* Storage control */
1744
    spr_register(env, SPR_440_MMUCR, "MMUCR",
1745
                 SPR_NOACCESS, SPR_NOACCESS,
1746
                 &spr_read_generic, &spr_write_generic,
1747
                 0x00000000);
1748
}
1749

    
1750
/* SPR shared between PowerPC 40x implementations */
1751
static void gen_spr_40x (CPUPPCState *env)
1752
{
1753
    /* Cache */
1754
    /* not emulated, as Qemu do not emulate caches */
1755
    spr_register(env, SPR_40x_DCCR, "DCCR",
1756
                 SPR_NOACCESS, SPR_NOACCESS,
1757
                 &spr_read_generic, &spr_write_generic,
1758
                 0x00000000);
1759
    /* not emulated, as Qemu do not emulate caches */
1760
    spr_register(env, SPR_40x_ICCR, "ICCR",
1761
                 SPR_NOACCESS, SPR_NOACCESS,
1762
                 &spr_read_generic, &spr_write_generic,
1763
                 0x00000000);
1764
    /* not emulated, as Qemu do not emulate caches */
1765
    spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1766
                 SPR_NOACCESS, SPR_NOACCESS,
1767
                 &spr_read_generic, SPR_NOACCESS,
1768
                 0x00000000);
1769
    /* Exception */
1770
    spr_register(env, SPR_40x_DEAR, "DEAR",
1771
                 SPR_NOACCESS, SPR_NOACCESS,
1772
                 &spr_read_generic, &spr_write_generic,
1773
                 0x00000000);
1774
    spr_register(env, SPR_40x_ESR, "ESR",
1775
                 SPR_NOACCESS, SPR_NOACCESS,
1776
                 &spr_read_generic, &spr_write_generic,
1777
                 0x00000000);
1778
    spr_register(env, SPR_40x_EVPR, "EVPR",
1779
                 SPR_NOACCESS, SPR_NOACCESS,
1780
                 &spr_read_generic, &spr_write_excp_prefix,
1781
                 0x00000000);
1782
    spr_register(env, SPR_40x_SRR2, "SRR2",
1783
                 &spr_read_generic, &spr_write_generic,
1784
                 &spr_read_generic, &spr_write_generic,
1785
                 0x00000000);
1786
    spr_register(env, SPR_40x_SRR3, "SRR3",
1787
                 &spr_read_generic, &spr_write_generic,
1788
                 &spr_read_generic, &spr_write_generic,
1789
                 0x00000000);
1790
    /* Timers */
1791
    spr_register(env, SPR_40x_PIT, "PIT",
1792
                 SPR_NOACCESS, SPR_NOACCESS,
1793
                 &spr_read_40x_pit, &spr_write_40x_pit,
1794
                 0x00000000);
1795
    spr_register(env, SPR_40x_TCR, "TCR",
1796
                 SPR_NOACCESS, SPR_NOACCESS,
1797
                 &spr_read_generic, &spr_write_booke_tcr,
1798
                 0x00000000);
1799
    spr_register(env, SPR_40x_TSR, "TSR",
1800
                 SPR_NOACCESS, SPR_NOACCESS,
1801
                 &spr_read_generic, &spr_write_booke_tsr,
1802
                 0x00000000);
1803
}
1804

    
1805
/* SPR specific to PowerPC 405 implementation */
1806
static void gen_spr_405 (CPUPPCState *env)
1807
{
1808
    /* MMU */
1809
    spr_register(env, SPR_40x_PID, "PID",
1810
                 SPR_NOACCESS, SPR_NOACCESS,
1811
                 &spr_read_generic, &spr_write_generic,
1812
                 0x00000000);
1813
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1814
                 SPR_NOACCESS, SPR_NOACCESS,
1815
                 &spr_read_generic, &spr_write_generic,
1816
                 0x00700000);
1817
    /* Debug interface */
1818
    /* XXX : not implemented */
1819
    spr_register(env, SPR_40x_DBCR0, "DBCR0",
1820
                 SPR_NOACCESS, SPR_NOACCESS,
1821
                 &spr_read_generic, &spr_write_40x_dbcr0,
1822
                 0x00000000);
1823
    /* XXX : not implemented */
1824
    spr_register(env, SPR_405_DBCR1, "DBCR1",
1825
                 SPR_NOACCESS, SPR_NOACCESS,
1826
                 &spr_read_generic, &spr_write_generic,
1827
                 0x00000000);
1828
    /* XXX : not implemented */
1829
    spr_register(env, SPR_40x_DBSR, "DBSR",
1830
                 SPR_NOACCESS, SPR_NOACCESS,
1831
                 &spr_read_generic, &spr_write_clear,
1832
                 /* Last reset was system reset */
1833
                 0x00000300);
1834
    /* XXX : not implemented */
1835
    spr_register(env, SPR_40x_DAC1, "DAC1",
1836
                 SPR_NOACCESS, SPR_NOACCESS,
1837
                 &spr_read_generic, &spr_write_generic,
1838
                 0x00000000);
1839
    spr_register(env, SPR_40x_DAC2, "DAC2",
1840
                 SPR_NOACCESS, SPR_NOACCESS,
1841
                 &spr_read_generic, &spr_write_generic,
1842
                 0x00000000);
1843
    /* XXX : not implemented */
1844
    spr_register(env, SPR_405_DVC1, "DVC1",
1845
                 SPR_NOACCESS, SPR_NOACCESS,
1846
                 &spr_read_generic, &spr_write_generic,
1847
                 0x00000000);
1848
    /* XXX : not implemented */
1849
    spr_register(env, SPR_405_DVC2, "DVC2",
1850
                 SPR_NOACCESS, SPR_NOACCESS,
1851
                 &spr_read_generic, &spr_write_generic,
1852
                 0x00000000);
1853
    /* XXX : not implemented */
1854
    spr_register(env, SPR_40x_IAC1, "IAC1",
1855
                 SPR_NOACCESS, SPR_NOACCESS,
1856
                 &spr_read_generic, &spr_write_generic,
1857
                 0x00000000);
1858
    spr_register(env, SPR_40x_IAC2, "IAC2",
1859
                 SPR_NOACCESS, SPR_NOACCESS,
1860
                 &spr_read_generic, &spr_write_generic,
1861
                 0x00000000);
1862
    /* XXX : not implemented */
1863
    spr_register(env, SPR_405_IAC3, "IAC3",
1864
                 SPR_NOACCESS, SPR_NOACCESS,
1865
                 &spr_read_generic, &spr_write_generic,
1866
                 0x00000000);
1867
    /* XXX : not implemented */
1868
    spr_register(env, SPR_405_IAC4, "IAC4",
1869
                 SPR_NOACCESS, SPR_NOACCESS,
1870
                 &spr_read_generic, &spr_write_generic,
1871
                 0x00000000);
1872
    /* Storage control */
1873
    /* XXX: TODO: not implemented */
1874
    spr_register(env, SPR_405_SLER, "SLER",
1875
                 SPR_NOACCESS, SPR_NOACCESS,
1876
                 &spr_read_generic, &spr_write_40x_sler,
1877
                 0x00000000);
1878
    spr_register(env, SPR_40x_ZPR, "ZPR",
1879
                 SPR_NOACCESS, SPR_NOACCESS,
1880
                 &spr_read_generic, &spr_write_generic,
1881
                 0x00000000);
1882
    /* XXX : not implemented */
1883
    spr_register(env, SPR_405_SU0R, "SU0R",
1884
                 SPR_NOACCESS, SPR_NOACCESS,
1885
                 &spr_read_generic, &spr_write_generic,
1886
                 0x00000000);
1887
    /* SPRG */
1888
    spr_register(env, SPR_USPRG0, "USPRG0",
1889
                 &spr_read_ureg, SPR_NOACCESS,
1890
                 &spr_read_ureg, SPR_NOACCESS,
1891
                 0x00000000);
1892
    spr_register(env, SPR_SPRG4, "SPRG4",
1893
                 SPR_NOACCESS, SPR_NOACCESS,
1894
                 &spr_read_generic, &spr_write_generic,
1895
                 0x00000000);
1896
    spr_register(env, SPR_USPRG4, "USPRG4",
1897
                 &spr_read_ureg, SPR_NOACCESS,
1898
                 &spr_read_ureg, SPR_NOACCESS,
1899
                 0x00000000);
1900
    spr_register(env, SPR_SPRG5, "SPRG5",
1901
                 SPR_NOACCESS, SPR_NOACCESS,
1902
                 spr_read_generic, &spr_write_generic,
1903
                 0x00000000);
1904
    spr_register(env, SPR_USPRG5, "USPRG5",
1905
                 &spr_read_ureg, SPR_NOACCESS,
1906
                 &spr_read_ureg, SPR_NOACCESS,
1907
                 0x00000000);
1908
    spr_register(env, SPR_SPRG6, "SPRG6",
1909
                 SPR_NOACCESS, SPR_NOACCESS,
1910
                 spr_read_generic, &spr_write_generic,
1911
                 0x00000000);
1912
    spr_register(env, SPR_USPRG6, "USPRG6",
1913
                 &spr_read_ureg, SPR_NOACCESS,
1914
                 &spr_read_ureg, SPR_NOACCESS,
1915
                 0x00000000);
1916
    spr_register(env, SPR_SPRG7, "SPRG7",
1917
                 SPR_NOACCESS, SPR_NOACCESS,
1918
                 spr_read_generic, &spr_write_generic,
1919
                 0x00000000);
1920
    spr_register(env, SPR_USPRG7, "USPRG7",
1921
                 &spr_read_ureg, SPR_NOACCESS,
1922
                 &spr_read_ureg, SPR_NOACCESS,
1923
                 0x00000000);
1924
}
1925

    
1926
/* SPR shared between PowerPC 401 & 403 implementations */
1927
static void gen_spr_401_403 (CPUPPCState *env)
1928
{
1929
    /* Time base */
1930
    spr_register(env, SPR_403_VTBL,  "TBL",
1931
                 &spr_read_tbl, SPR_NOACCESS,
1932
                 &spr_read_tbl, SPR_NOACCESS,
1933
                 0x00000000);
1934
    spr_register(env, SPR_403_TBL,   "TBL",
1935
                 SPR_NOACCESS, SPR_NOACCESS,
1936
                 SPR_NOACCESS, &spr_write_tbl,
1937
                 0x00000000);
1938
    spr_register(env, SPR_403_VTBU,  "TBU",
1939
                 &spr_read_tbu, SPR_NOACCESS,
1940
                 &spr_read_tbu, SPR_NOACCESS,
1941
                 0x00000000);
1942
    spr_register(env, SPR_403_TBU,   "TBU",
1943
                 SPR_NOACCESS, SPR_NOACCESS,
1944
                 SPR_NOACCESS, &spr_write_tbu,
1945
                 0x00000000);
1946
    /* Debug */
1947
    /* not emulated, as Qemu do not emulate caches */
1948
    spr_register(env, SPR_403_CDBCR, "CDBCR",
1949
                 SPR_NOACCESS, SPR_NOACCESS,
1950
                 &spr_read_generic, &spr_write_generic,
1951
                 0x00000000);
1952
}
1953

    
1954
/* SPR specific to PowerPC 401 implementation */
1955
static void gen_spr_401 (CPUPPCState *env)
1956
{
1957
    /* Debug interface */
1958
    /* XXX : not implemented */
1959
    spr_register(env, SPR_40x_DBCR0, "DBCR",
1960
                 SPR_NOACCESS, SPR_NOACCESS,
1961
                 &spr_read_generic, &spr_write_40x_dbcr0,
1962
                 0x00000000);
1963
    /* XXX : not implemented */
1964
    spr_register(env, SPR_40x_DBSR, "DBSR",
1965
                 SPR_NOACCESS, SPR_NOACCESS,
1966
                 &spr_read_generic, &spr_write_clear,
1967
                 /* Last reset was system reset */
1968
                 0x00000300);
1969
    /* XXX : not implemented */
1970
    spr_register(env, SPR_40x_DAC1, "DAC",
1971
                 SPR_NOACCESS, SPR_NOACCESS,
1972
                 &spr_read_generic, &spr_write_generic,
1973
                 0x00000000);
1974
    /* XXX : not implemented */
1975
    spr_register(env, SPR_40x_IAC1, "IAC",
1976
                 SPR_NOACCESS, SPR_NOACCESS,
1977
                 &spr_read_generic, &spr_write_generic,
1978
                 0x00000000);
1979
    /* Storage control */
1980
    /* XXX: TODO: not implemented */
1981
    spr_register(env, SPR_405_SLER, "SLER",
1982
                 SPR_NOACCESS, SPR_NOACCESS,
1983
                 &spr_read_generic, &spr_write_40x_sler,
1984
                 0x00000000);
1985
    /* not emulated, as Qemu never does speculative access */
1986
    spr_register(env, SPR_40x_SGR, "SGR",
1987
                 SPR_NOACCESS, SPR_NOACCESS,
1988
                 &spr_read_generic, &spr_write_generic,
1989
                 0xFFFFFFFF);
1990
    /* not emulated, as Qemu do not emulate caches */
1991
    spr_register(env, SPR_40x_DCWR, "DCWR",
1992
                 SPR_NOACCESS, SPR_NOACCESS,
1993
                 &spr_read_generic, &spr_write_generic,
1994
                 0x00000000);
1995
}
1996

    
1997
static void gen_spr_401x2 (CPUPPCState *env)
1998
{
1999
    gen_spr_401(env);
2000
    spr_register(env, SPR_40x_PID, "PID",
2001
                 SPR_NOACCESS, SPR_NOACCESS,
2002
                 &spr_read_generic, &spr_write_generic,
2003
                 0x00000000);
2004
    spr_register(env, SPR_40x_ZPR, "ZPR",
2005
                 SPR_NOACCESS, SPR_NOACCESS,
2006
                 &spr_read_generic, &spr_write_generic,
2007
                 0x00000000);
2008
}
2009

    
2010
/* SPR specific to PowerPC 403 implementation */
2011
static void gen_spr_403 (CPUPPCState *env)
2012
{
2013
    /* Debug interface */
2014
    /* XXX : not implemented */
2015
    spr_register(env, SPR_40x_DBCR0, "DBCR0",
2016
                 SPR_NOACCESS, SPR_NOACCESS,
2017
                 &spr_read_generic, &spr_write_40x_dbcr0,
2018
                 0x00000000);
2019
    /* XXX : not implemented */
2020
    spr_register(env, SPR_40x_DBSR, "DBSR",
2021
                 SPR_NOACCESS, SPR_NOACCESS,
2022
                 &spr_read_generic, &spr_write_clear,
2023
                 /* Last reset was system reset */
2024
                 0x00000300);
2025
    /* XXX : not implemented */
2026
    spr_register(env, SPR_40x_DAC1, "DAC1",
2027
                 SPR_NOACCESS, SPR_NOACCESS,
2028
                 &spr_read_generic, &spr_write_generic,
2029
                 0x00000000);
2030
    /* XXX : not implemented */
2031
    spr_register(env, SPR_40x_DAC2, "DAC2",
2032
                 SPR_NOACCESS, SPR_NOACCESS,
2033
                 &spr_read_generic, &spr_write_generic,
2034
                 0x00000000);
2035
    /* XXX : not implemented */
2036
    spr_register(env, SPR_40x_IAC1, "IAC1",
2037
                 SPR_NOACCESS, SPR_NOACCESS,
2038
                 &spr_read_generic, &spr_write_generic,
2039
                 0x00000000);
2040
    /* XXX : not implemented */
2041
    spr_register(env, SPR_40x_IAC2, "IAC2",
2042
                 SPR_NOACCESS, SPR_NOACCESS,
2043
                 &spr_read_generic, &spr_write_generic,
2044
                 0x00000000);
2045
}
2046

    
2047
static void gen_spr_403_real (CPUPPCState *env)
2048
{
2049
    spr_register(env, SPR_403_PBL1,  "PBL1",
2050
                 SPR_NOACCESS, SPR_NOACCESS,
2051
                 &spr_read_403_pbr, &spr_write_403_pbr,
2052
                 0x00000000);
2053
    spr_register(env, SPR_403_PBU1,  "PBU1",
2054
                 SPR_NOACCESS, SPR_NOACCESS,
2055
                 &spr_read_403_pbr, &spr_write_403_pbr,
2056
                 0x00000000);
2057
    spr_register(env, SPR_403_PBL2,  "PBL2",
2058
                 SPR_NOACCESS, SPR_NOACCESS,
2059
                 &spr_read_403_pbr, &spr_write_403_pbr,
2060
                 0x00000000);
2061
    spr_register(env, SPR_403_PBU2,  "PBU2",
2062
                 SPR_NOACCESS, SPR_NOACCESS,
2063
                 &spr_read_403_pbr, &spr_write_403_pbr,
2064
                 0x00000000);
2065
}
2066

    
2067
static void gen_spr_403_mmu (CPUPPCState *env)
2068
{
2069
    /* MMU */
2070
    spr_register(env, SPR_40x_PID, "PID",
2071
                 SPR_NOACCESS, SPR_NOACCESS,
2072
                 &spr_read_generic, &spr_write_generic,
2073
                 0x00000000);
2074
    spr_register(env, SPR_40x_ZPR, "ZPR",
2075
                 SPR_NOACCESS, SPR_NOACCESS,
2076
                 &spr_read_generic, &spr_write_generic,
2077
                 0x00000000);
2078
}
2079

    
2080
/* SPR specific to PowerPC compression coprocessor extension */
2081
static void gen_spr_compress (CPUPPCState *env)
2082
{
2083
    /* XXX : not implemented */
2084
    spr_register(env, SPR_401_SKR, "SKR",
2085
                 SPR_NOACCESS, SPR_NOACCESS,
2086
                 &spr_read_generic, &spr_write_generic,
2087
                 0x00000000);
2088
}
2089

    
2090
#if defined (TARGET_PPC64)
2091
/* SPR specific to PowerPC 620 */
2092
static void gen_spr_620 (CPUPPCState *env)
2093
{
2094
    /* XXX : not implemented */
2095
    spr_register(env, SPR_620_PMR0, "PMR0",
2096
                 SPR_NOACCESS, SPR_NOACCESS,
2097
                 &spr_read_generic, &spr_write_generic,
2098
                 0x00000000);
2099
    /* XXX : not implemented */
2100
    spr_register(env, SPR_620_PMR1, "PMR1",
2101
                 SPR_NOACCESS, SPR_NOACCESS,
2102
                 &spr_read_generic, &spr_write_generic,
2103
                 0x00000000);
2104
    /* XXX : not implemented */
2105
    spr_register(env, SPR_620_PMR2, "PMR2",
2106
                 SPR_NOACCESS, SPR_NOACCESS,
2107
                 &spr_read_generic, &spr_write_generic,
2108
                 0x00000000);
2109
    /* XXX : not implemented */
2110
    spr_register(env, SPR_620_PMR3, "PMR3",
2111
                 SPR_NOACCESS, SPR_NOACCESS,
2112
                 &spr_read_generic, &spr_write_generic,
2113
                 0x00000000);
2114
    /* XXX : not implemented */
2115
    spr_register(env, SPR_620_PMR4, "PMR4",
2116
                 SPR_NOACCESS, SPR_NOACCESS,
2117
                 &spr_read_generic, &spr_write_generic,
2118
                 0x00000000);
2119
    /* XXX : not implemented */
2120
    spr_register(env, SPR_620_PMR5, "PMR5",
2121
                 SPR_NOACCESS, SPR_NOACCESS,
2122
                 &spr_read_generic, &spr_write_generic,
2123
                 0x00000000);
2124
    /* XXX : not implemented */
2125
    spr_register(env, SPR_620_PMR6, "PMR6",
2126
                 SPR_NOACCESS, SPR_NOACCESS,
2127
                 &spr_read_generic, &spr_write_generic,
2128
                 0x00000000);
2129
    /* XXX : not implemented */
2130
    spr_register(env, SPR_620_PMR7, "PMR7",
2131
                 SPR_NOACCESS, SPR_NOACCESS,
2132
                 &spr_read_generic, &spr_write_generic,
2133
                 0x00000000);
2134
    /* XXX : not implemented */
2135
    spr_register(env, SPR_620_PMR8, "PMR8",
2136
                 SPR_NOACCESS, SPR_NOACCESS,
2137
                 &spr_read_generic, &spr_write_generic,
2138
                 0x00000000);
2139
    /* XXX : not implemented */
2140
    spr_register(env, SPR_620_PMR9, "PMR9",
2141
                 SPR_NOACCESS, SPR_NOACCESS,
2142
                 &spr_read_generic, &spr_write_generic,
2143
                 0x00000000);
2144
    /* XXX : not implemented */
2145
    spr_register(env, SPR_620_PMRA, "PMR10",
2146
                 SPR_NOACCESS, SPR_NOACCESS,
2147
                 &spr_read_generic, &spr_write_generic,
2148
                 0x00000000);
2149
    /* XXX : not implemented */
2150
    spr_register(env, SPR_620_PMRB, "PMR11",
2151
                 SPR_NOACCESS, SPR_NOACCESS,
2152
                 &spr_read_generic, &spr_write_generic,
2153
                 0x00000000);
2154
    /* XXX : not implemented */
2155
    spr_register(env, SPR_620_PMRC, "PMR12",
2156
                 SPR_NOACCESS, SPR_NOACCESS,
2157
                 &spr_read_generic, &spr_write_generic,
2158
                 0x00000000);
2159
    /* XXX : not implemented */
2160
    spr_register(env, SPR_620_PMRD, "PMR13",
2161
                 SPR_NOACCESS, SPR_NOACCESS,
2162
                 &spr_read_generic, &spr_write_generic,
2163
                 0x00000000);
2164
    /* XXX : not implemented */
2165
    spr_register(env, SPR_620_PMRE, "PMR14",
2166
                 SPR_NOACCESS, SPR_NOACCESS,
2167
                 &spr_read_generic, &spr_write_generic,
2168
                 0x00000000);
2169
    /* XXX : not implemented */
2170
    spr_register(env, SPR_620_PMRF, "PMR15",
2171
                 SPR_NOACCESS, SPR_NOACCESS,
2172
                 &spr_read_generic, &spr_write_generic,
2173
                 0x00000000);
2174
    /* XXX : not implemented */
2175
    spr_register(env, SPR_620_HID8, "HID8",
2176
                 SPR_NOACCESS, SPR_NOACCESS,
2177
                 &spr_read_generic, &spr_write_generic,
2178
                 0x00000000);
2179
    /* XXX : not implemented */
2180
    spr_register(env, SPR_620_HID9, "HID9",
2181
                 SPR_NOACCESS, SPR_NOACCESS,
2182
                 &spr_read_generic, &spr_write_generic,
2183
                 0x00000000);
2184
}
2185
#endif /* defined (TARGET_PPC64) */
2186

    
2187
// XXX: TODO
2188
/*
2189
 * AMR     => SPR 29 (Power 2.04)
2190
 * CTRL    => SPR 136 (Power 2.04)
2191
 * CTRL    => SPR 152 (Power 2.04)
2192
 * SCOMC   => SPR 276 (64 bits ?)
2193
 * SCOMD   => SPR 277 (64 bits ?)
2194
 * TBU40   => SPR 286 (Power 2.04 hypv)
2195
 * HSPRG0  => SPR 304 (Power 2.04 hypv)
2196
 * HSPRG1  => SPR 305 (Power 2.04 hypv)
2197
 * HDSISR  => SPR 306 (Power 2.04 hypv)
2198
 * HDAR    => SPR 307 (Power 2.04 hypv)
2199
 * PURR    => SPR 309 (Power 2.04 hypv)
2200
 * HDEC    => SPR 310 (Power 2.04 hypv)
2201
 * HIOR    => SPR 311 (hypv)
2202
 * RMOR    => SPR 312 (970)
2203
 * HRMOR   => SPR 313 (Power 2.04 hypv)
2204
 * HSRR0   => SPR 314 (Power 2.04 hypv)
2205
 * HSRR1   => SPR 315 (Power 2.04 hypv)
2206
 * LPCR    => SPR 316 (970)
2207
 * LPIDR   => SPR 317 (970)
2208
 * SPEFSCR => SPR 512 (Power 2.04 emb)
2209
 * EPR     => SPR 702 (Power 2.04 emb)
2210
 * perf    => 768-783 (Power 2.04)
2211
 * perf    => 784-799 (Power 2.04)
2212
 * PPR     => SPR 896 (Power 2.04)
2213
 * EPLC    => SPR 947 (Power 2.04 emb)
2214
 * EPSC    => SPR 948 (Power 2.04 emb)
2215
 * DABRX   => 1015    (Power 2.04 hypv)
2216
 * FPECR   => SPR 1022 (?)
2217
 * ... and more (thermal management, performance counters, ...)
2218
 */
2219

    
2220
/*****************************************************************************/
2221
/* Exception vectors models                                                  */
2222
static void init_excp_4xx_real (CPUPPCState *env)
2223
{
2224
#if !defined(CONFIG_USER_ONLY)
2225
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2226
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2227
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2228
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2229
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2230
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2231
    env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2232
    env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2233
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2234
    env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2235
    env->excp_prefix = 0x00000000;
2236
    env->ivor_mask = 0x0000FFF0;
2237
    env->ivpr_mask = 0xFFFF0000;
2238
#endif
2239
}
2240

    
2241
static void init_excp_4xx_softmmu (CPUPPCState *env)
2242
{
2243
#if !defined(CONFIG_USER_ONLY)
2244
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2245
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2246
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2247
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2248
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2249
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2250
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2251
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2252
    env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2253
    env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2254
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2255
    env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001100;
2256
    env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001200;
2257
    env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2258
    env->excp_prefix = 0x00000000;
2259
    env->ivor_mask = 0x0000FFF0;
2260
    env->ivpr_mask = 0xFFFF0000;
2261
#endif
2262
}
2263

    
2264
static void init_excp_BookE (CPUPPCState *env)
2265
{
2266
#if !defined(CONFIG_USER_ONLY)
2267
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2268
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
2269
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
2270
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
2271
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2272
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
2273
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
2274
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
2275
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
2276
    env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
2277
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
2278
    env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
2279
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
2280
    env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
2281
    env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
2282
    env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
2283
    env->excp_prefix = 0x00000000;
2284
    env->ivor_mask = 0x0000FFE0;
2285
    env->ivpr_mask = 0xFFFF0000;
2286
#endif
2287
}
2288

    
2289
static void init_excp_601 (CPUPPCState *env)
2290
{
2291
#if !defined(CONFIG_USER_ONLY)
2292
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2293
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2294
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2295
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2296
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2297
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2298
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2299
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2300
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2301
    env->excp_vectors[POWERPC_EXCP_IO]       = 0x00000A00;
2302
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2303
    env->excp_vectors[POWERPC_EXCP_RUNM]     = 0x00002000;
2304
    env->excp_prefix = 0xFFF00000;
2305
#endif
2306
}
2307

    
2308
static void init_excp_602 (CPUPPCState *env)
2309
{
2310
#if !defined(CONFIG_USER_ONLY)
2311
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2312
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2313
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2314
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2315
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2316
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2317
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2318
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2319
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2320
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2321
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2322
    env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2323
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2324
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2325
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2326
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2327
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2328
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001500;
2329
    env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001600;
2330
    env->excp_prefix = 0xFFF00000;
2331
#endif
2332
}
2333

    
2334
static void init_excp_603 (CPUPPCState *env)
2335
{
2336
#if !defined(CONFIG_USER_ONLY)
2337
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2338
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2339
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2340
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2341
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2342
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2343
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2344
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2345
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2346
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2347
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2348
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2349
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2350
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2351
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2352
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2353
#endif
2354
}
2355

    
2356
static void init_excp_G2 (CPUPPCState *env)
2357
{
2358
#if !defined(CONFIG_USER_ONLY)
2359
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2360
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2361
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2362
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2363
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2364
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2365
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2366
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2367
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2368
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2369
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2370
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2371
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2372
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2373
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2374
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2375
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2376
#endif
2377
}
2378

    
2379
static void init_excp_604 (CPUPPCState *env)
2380
{
2381
#if !defined(CONFIG_USER_ONLY)
2382
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2383
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2384
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2385
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2386
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2387
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2388
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2389
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2390
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2391
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2392
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2393
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2394
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2395
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2396
#endif
2397
}
2398

    
2399
#if defined(TARGET_PPC64)
2400
static void init_excp_620 (CPUPPCState *env)
2401
{
2402
#if !defined(CONFIG_USER_ONLY)
2403
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2404
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2405
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2406
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2407
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2408
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2409
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2410
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2411
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2412
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2413
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2414
    env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2415
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2416
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2417
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2418
#endif
2419
}
2420
#endif /* defined(TARGET_PPC64) */
2421

    
2422
static void init_excp_7x0 (CPUPPCState *env)
2423
{
2424
#if !defined(CONFIG_USER_ONLY)
2425
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2426
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2427
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2428
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2429
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2430
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2431
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2432
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2433
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2434
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2435
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2436
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2437
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2438
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
2439
#endif
2440
}
2441

    
2442
static void init_excp_750FX (CPUPPCState *env)
2443
{
2444
#if !defined(CONFIG_USER_ONLY)
2445
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2446
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2447
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2448
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2449
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2450
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2451
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2452
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2453
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2454
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2455
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2456
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2457
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2458
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2459
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
2460
#endif
2461
}
2462

    
2463
static void init_excp_7400 (CPUPPCState *env)
2464
{
2465
#if !defined(CONFIG_USER_ONLY)
2466
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2467
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2468
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2469
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2470
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2471
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2472
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2473
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2474
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2475
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2476
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2477
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2478
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
2479
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2480
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2481
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
2482
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
2483
#endif
2484
}
2485

    
2486
static void init_excp_7450 (CPUPPCState *env)
2487
{
2488
#if !defined(CONFIG_USER_ONLY)
2489
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2490
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2491
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2492
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2493
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2494
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2495
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2496
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2497
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2498
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2499
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2500
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2501
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
2502
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2503
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2504
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2505
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2506
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2507
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
2508
#endif
2509
}
2510

    
2511
#if defined (TARGET_PPC64)
2512
static void init_excp_970 (CPUPPCState *env)
2513
{
2514
#if !defined(CONFIG_USER_ONLY)
2515
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2516
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2517
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2518
    env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
2519
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2520
    env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
2521
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2522
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2523
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2524
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2525
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2526
#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */
2527
    env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
2528
#endif
2529
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2530
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2531
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2532
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
2533
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2534
    env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
2535
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
2536
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
2537
#endif
2538
}
2539
#endif
2540

    
2541
/*****************************************************************************/
2542
/* PowerPC implementations definitions                                       */
2543

    
2544
/* PowerPC 40x instruction set                                               */
2545
#define POWERPC_INSNS_EMB    (PPC_INSNS_BASE | PPC_CACHE_DCBZ | PPC_EMB_COMMON)
2546

    
2547
/* PowerPC 401                                                               */
2548
#define POWERPC_INSNS_401    (POWERPC_INSNS_EMB |                             \
2549
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2550
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2551
#define POWERPC_MSRM_401     (0x00000000000FD201ULL)
2552
#define POWERPC_MMU_401      (POWERPC_MMU_REAL_4xx)
2553
#define POWERPC_EXCP_401     (POWERPC_EXCP_40x)
2554
#define POWERPC_INPUT_401    (PPC_FLAGS_INPUT_401)
2555
#define POWERPC_BFDM_401     (bfd_mach_ppc_403)
2556

    
2557
static void init_proc_401 (CPUPPCState *env)
2558
{
2559
    gen_spr_40x(env);
2560
    gen_spr_401_403(env);
2561
    gen_spr_401(env);
2562
    init_excp_4xx_real(env);
2563
    env->dcache_line_size = 32;
2564
    env->icache_line_size = 32;
2565
    /* Allocate hardware IRQ controller */
2566
    ppc40x_irq_init(env);
2567
#if !defined(CONFIG_USER_ONLY)
2568
    /* Hardware reset vector */
2569
    env->hreset_vector = 0xFFFFFFFCUL;
2570
#endif
2571
}
2572

    
2573
/* PowerPC 401x2                                                             */
2574
#define POWERPC_INSNS_401x2  (POWERPC_INSNS_EMB |                             \
2575
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2576
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2577
                              PPC_CACHE_DCBA | PPC_MFTB |                     \
2578
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2579
#define POWERPC_MSRM_401x2   (0x00000000001FD231ULL)
2580
#define POWERPC_MMU_401x2    (POWERPC_MMU_SOFT_4xx_Z)
2581
#define POWERPC_EXCP_401x2   (POWERPC_EXCP_40x)
2582
#define POWERPC_INPUT_401x2  (PPC_FLAGS_INPUT_401)
2583
#define POWERPC_BFDM_401x2   (bfd_mach_ppc_403)
2584

    
2585
static void init_proc_401x2 (CPUPPCState *env)
2586
{
2587
    gen_spr_40x(env);
2588
    gen_spr_401_403(env);
2589
    gen_spr_401x2(env);
2590
    gen_spr_compress(env);
2591
    /* Memory management */
2592
    env->nb_tlb = 64;
2593
    env->nb_ways = 1;
2594
    env->id_tlbs = 0;
2595
    init_excp_4xx_softmmu(env);
2596
    env->dcache_line_size = 32;
2597
    env->icache_line_size = 32;
2598
    /* Allocate hardware IRQ controller */
2599
    ppc40x_irq_init(env);
2600
#if !defined(CONFIG_USER_ONLY)
2601
    /* Hardware reset vector */
2602
    env->hreset_vector = 0xFFFFFFFCUL;
2603
#endif
2604
}
2605

    
2606
/* PowerPC 401x3                                                             */
2607
#define POWERPC_INSNS_401x3  (POWERPC_INSNS_EMB |                             \
2608
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2609
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2610
                              PPC_CACHE_DCBA | PPC_MFTB |                     \
2611
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2612
#define POWERPC_MSRM_401x3   (0x00000000001FD631ULL)
2613
#define POWERPC_MMU_401x3    (POWERPC_MMU_SOFT_4xx_Z)
2614
#define POWERPC_EXCP_401x3   (POWERPC_EXCP_40x)
2615
#define POWERPC_INPUT_401x3  (PPC_FLAGS_INPUT_401)
2616
#define POWERPC_BFDM_401x3   (bfd_mach_ppc_403)
2617

    
2618
__attribute__ (( unused ))
2619
static void init_proc_401x3 (CPUPPCState *env)
2620
{
2621
    gen_spr_40x(env);
2622
    gen_spr_401_403(env);
2623
    gen_spr_401(env);
2624
    gen_spr_401x2(env);
2625
    gen_spr_compress(env);
2626
    init_excp_4xx_softmmu(env);
2627
    env->dcache_line_size = 32;
2628
    env->icache_line_size = 32;
2629
    /* Allocate hardware IRQ controller */
2630
    ppc40x_irq_init(env);
2631
#if !defined(CONFIG_USER_ONLY)
2632
    /* Hardware reset vector */
2633
    env->hreset_vector = 0xFFFFFFFCUL;
2634
#endif
2635
}
2636

    
2637
/* IOP480                                                                    */
2638
#define POWERPC_INSNS_IOP480 (POWERPC_INSNS_EMB |                             \
2639
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2640
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2641
                              PPC_CACHE_DCBA |                                \
2642
                              PPC_4xx_COMMON | PPC_40x_EXCP |  PPC_40x_ICBT)
2643
#define POWERPC_MSRM_IOP480  (0x00000000001FD231ULL)
2644
#define POWERPC_MMU_IOP480   (POWERPC_MMU_SOFT_4xx_Z)
2645
#define POWERPC_EXCP_IOP480  (POWERPC_EXCP_40x)
2646
#define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401)
2647
#define POWERPC_BFDM_IOP480  (bfd_mach_ppc_403)
2648

    
2649
static void init_proc_IOP480 (CPUPPCState *env)
2650
{
2651
    gen_spr_40x(env);
2652
    gen_spr_401_403(env);
2653
    gen_spr_401x2(env);
2654
    gen_spr_compress(env);
2655
    /* Memory management */
2656
    env->nb_tlb = 64;
2657
    env->nb_ways = 1;
2658
    env->id_tlbs = 0;
2659
    init_excp_4xx_softmmu(env);
2660
    env->dcache_line_size = 32;
2661
    env->icache_line_size = 32;
2662
    /* Allocate hardware IRQ controller */
2663
    ppc40x_irq_init(env);
2664
#if !defined(CONFIG_USER_ONLY)
2665
    /* Hardware reset vector */
2666
    env->hreset_vector = 0xFFFFFFFCUL;
2667
#endif
2668
}
2669

    
2670
/* PowerPC 403                                                               */
2671
#define POWERPC_INSNS_403    (POWERPC_INSNS_EMB |                             \
2672
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2673
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2674
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2675
#define POWERPC_MSRM_403     (0x000000000007D00DULL)
2676
#define POWERPC_MMU_403      (POWERPC_MMU_REAL_4xx)
2677
#define POWERPC_EXCP_403     (POWERPC_EXCP_40x)
2678
#define POWERPC_INPUT_403    (PPC_FLAGS_INPUT_401)
2679
#define POWERPC_BFDM_403     (bfd_mach_ppc_403)
2680

    
2681
static void init_proc_403 (CPUPPCState *env)
2682
{
2683
    gen_spr_40x(env);
2684
    gen_spr_401_403(env);
2685
    gen_spr_403(env);
2686
    gen_spr_403_real(env);
2687
    init_excp_4xx_real(env);
2688
    env->dcache_line_size = 32;
2689
    env->icache_line_size = 32;
2690
    /* Allocate hardware IRQ controller */
2691
    ppc40x_irq_init(env);
2692
#if !defined(CONFIG_USER_ONLY)
2693
    /* Hardware reset vector */
2694
    env->hreset_vector = 0xFFFFFFFCUL;
2695
#endif
2696
}
2697

    
2698
/* PowerPC 403 GCX                                                           */
2699
#define POWERPC_INSNS_403GCX (POWERPC_INSNS_EMB |                             \
2700
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2701
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2702
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2703
#define POWERPC_MSRM_403GCX  (0x000000000007D00DULL)
2704
#define POWERPC_MMU_403GCX   (POWERPC_MMU_SOFT_4xx_Z)
2705
#define POWERPC_EXCP_403GCX  (POWERPC_EXCP_40x)
2706
#define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401)
2707
#define POWERPC_BFDM_403GCX  (bfd_mach_ppc_403)
2708

    
2709
static void init_proc_403GCX (CPUPPCState *env)
2710
{
2711
    gen_spr_40x(env);
2712
    gen_spr_401_403(env);
2713
    gen_spr_403(env);
2714
    gen_spr_403_real(env);
2715
    gen_spr_403_mmu(env);
2716
    /* Bus access control */
2717
    /* not emulated, as Qemu never does speculative access */
2718
    spr_register(env, SPR_40x_SGR, "SGR",
2719
                 SPR_NOACCESS, SPR_NOACCESS,
2720
                 &spr_read_generic, &spr_write_generic,
2721
                 0xFFFFFFFF);
2722
    /* not emulated, as Qemu do not emulate caches */
2723
    spr_register(env, SPR_40x_DCWR, "DCWR",
2724
                 SPR_NOACCESS, SPR_NOACCESS,
2725
                 &spr_read_generic, &spr_write_generic,
2726
                 0x00000000);
2727
    /* Memory management */
2728
    env->nb_tlb = 64;
2729
    env->nb_ways = 1;
2730
    env->id_tlbs = 0;
2731
    init_excp_4xx_softmmu(env);
2732
    env->dcache_line_size = 32;
2733
    env->icache_line_size = 32;
2734
    /* Allocate hardware IRQ controller */
2735
    ppc40x_irq_init(env);
2736
#if !defined(CONFIG_USER_ONLY)
2737
    /* Hardware reset vector */
2738
    env->hreset_vector = 0xFFFFFFFCUL;
2739
#endif
2740
}
2741

    
2742
/* PowerPC 405                                                               */
2743
#define POWERPC_INSNS_405    (POWERPC_INSNS_EMB | PPC_MFTB |                  \
2744
                              PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_CACHE_DCBA | \
2745
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2746
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT |  \
2747
                              PPC_405_MAC)
2748
#define POWERPC_MSRM_405     (0x000000000006E630ULL)
2749
#define POWERPC_MMU_405      (POWERPC_MMU_SOFT_4xx)
2750
#define POWERPC_EXCP_405     (POWERPC_EXCP_40x)
2751
#define POWERPC_INPUT_405    (PPC_FLAGS_INPUT_405)
2752
#define POWERPC_BFDM_405     (bfd_mach_ppc_403)
2753

    
2754
static void init_proc_405 (CPUPPCState *env)
2755
{
2756
    /* Time base */
2757
    gen_tbl(env);
2758
    gen_spr_40x(env);
2759
    gen_spr_405(env);
2760
    /* Bus access control */
2761
    /* not emulated, as Qemu never does speculative access */
2762
    spr_register(env, SPR_40x_SGR, "SGR",
2763
                 SPR_NOACCESS, SPR_NOACCESS,
2764
                 &spr_read_generic, &spr_write_generic,
2765
                 0xFFFFFFFF);
2766
    /* not emulated, as Qemu do not emulate caches */
2767
    spr_register(env, SPR_40x_DCWR, "DCWR",
2768
                 SPR_NOACCESS, SPR_NOACCESS,
2769
                 &spr_read_generic, &spr_write_generic,
2770
                 0x00000000);
2771
    /* Memory management */
2772
    env->nb_tlb = 64;
2773
    env->nb_ways = 1;
2774
    env->id_tlbs = 0;
2775
    init_excp_4xx_softmmu(env);
2776
    env->dcache_line_size = 32;
2777
    env->icache_line_size = 32;
2778
    /* Allocate hardware IRQ controller */
2779
    ppc40x_irq_init(env);
2780
#if !defined(CONFIG_USER_ONLY)
2781
    /* Hardware reset vector */
2782
    env->hreset_vector = 0xFFFFFFFCUL;
2783
#endif
2784
}
2785

    
2786
/* PowerPC 440 EP                                                            */
2787
#define POWERPC_INSNS_440EP  (POWERPC_INSNS_EMB |                             \
2788
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2789
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
2790
                              PPC_440_SPEC | PPC_RFMCI)
2791
#define POWERPC_MSRM_440EP   (0x000000000006D630ULL)
2792
#define POWERPC_MMU_440EP    (POWERPC_MMU_BOOKE)
2793
#define POWERPC_EXCP_440EP   (POWERPC_EXCP_BOOKE)
2794
#define POWERPC_INPUT_440EP  (PPC_FLAGS_INPUT_BookE)
2795
#define POWERPC_BFDM_440EP   (bfd_mach_ppc_403)
2796

    
2797
static void init_proc_440EP (CPUPPCState *env)
2798
{
2799
    /* Time base */
2800
    gen_tbl(env);
2801
    gen_spr_BookE(env);
2802
    gen_spr_440(env);
2803
    /* XXX : not implemented */
2804
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2805
                 SPR_NOACCESS, SPR_NOACCESS,
2806
                 &spr_read_generic, &spr_write_generic,
2807
                 0x00000000);
2808
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2809
                 SPR_NOACCESS, SPR_NOACCESS,
2810
                 &spr_read_generic, &spr_write_generic,
2811
                 0x00000000);
2812
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2813
                 SPR_NOACCESS, SPR_NOACCESS,
2814
                 &spr_read_generic, &spr_write_generic,
2815
                 0x00000000);
2816
    /* XXX : not implemented */
2817
    spr_register(env, SPR_440_CCR1, "CCR1",
2818
                 SPR_NOACCESS, SPR_NOACCESS,
2819
                 &spr_read_generic, &spr_write_generic,
2820
                 0x00000000);
2821
    /* Memory management */
2822
    env->nb_tlb = 64;
2823
    env->nb_ways = 1;
2824
    env->id_tlbs = 0;
2825
    init_excp_BookE(env);
2826
    env->dcache_line_size = 32;
2827
    env->icache_line_size = 32;
2828
    /* XXX: TODO: allocate internal IRQ controller */
2829
#if !defined(CONFIG_USER_ONLY)
2830
    /* Hardware reset vector */
2831
    env->hreset_vector = 0xFFFFFFFCUL;
2832
#endif
2833
}
2834

    
2835
/* PowerPC 440 GP                                                            */
2836
#define POWERPC_INSNS_440GP  (POWERPC_INSNS_EMB |                             \
2837
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2838
                              PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON |    \
2839
                              PPC_405_MAC | PPC_440_SPEC)
2840
#define POWERPC_MSRM_440GP   (0x000000000006FF30ULL)
2841
#define POWERPC_MMU_440GP    (POWERPC_MMU_BOOKE)
2842
#define POWERPC_EXCP_440GP   (POWERPC_EXCP_BOOKE)
2843
#define POWERPC_INPUT_440GP  (PPC_FLAGS_INPUT_BookE)
2844
#define POWERPC_BFDM_440GP   (bfd_mach_ppc_403)
2845

    
2846
static void init_proc_440GP (CPUPPCState *env)
2847
{
2848
    /* Time base */
2849
    gen_tbl(env);
2850
    gen_spr_BookE(env);
2851
    gen_spr_440(env);
2852
    /* Memory management */
2853
    env->nb_tlb = 64;
2854
    env->nb_ways = 1;
2855
    env->id_tlbs = 0;
2856
    init_excp_BookE(env);
2857
    env->dcache_line_size = 32;
2858
    env->icache_line_size = 32;
2859
    /* XXX: TODO: allocate internal IRQ controller */
2860
#if !defined(CONFIG_USER_ONLY)
2861
    /* Hardware reset vector */
2862
    env->hreset_vector = 0xFFFFFFFCUL;
2863
#endif
2864
}
2865

    
2866
/* PowerPC 440x4                                                             */
2867
#define POWERPC_INSNS_440x4  (POWERPC_INSNS_EMB |                             \
2868
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2869
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
2870
                              PPC_440_SPEC)
2871
#define POWERPC_MSRM_440x4   (0x000000000006FF30ULL)
2872
#define POWERPC_MMU_440x4    (POWERPC_MMU_BOOKE)
2873
#define POWERPC_EXCP_440x4   (POWERPC_EXCP_BOOKE)
2874
#define POWERPC_INPUT_440x4  (PPC_FLAGS_INPUT_BookE)
2875
#define POWERPC_BFDM_440x4   (bfd_mach_ppc_403)
2876

    
2877
__attribute__ (( unused ))
2878
static void init_proc_440x4 (CPUPPCState *env)
2879
{
2880
    /* Time base */
2881
    gen_tbl(env);
2882
    gen_spr_BookE(env);
2883
    gen_spr_440(env);
2884
    /* Memory management */
2885
    env->nb_tlb = 64;
2886
    env->nb_ways = 1;
2887
    env->id_tlbs = 0;
2888
    init_excp_BookE(env);
2889
    env->dcache_line_size = 32;
2890
    env->icache_line_size = 32;
2891
    /* XXX: TODO: allocate internal IRQ controller */
2892
#if !defined(CONFIG_USER_ONLY)
2893
    /* Hardware reset vector */
2894
    env->hreset_vector = 0xFFFFFFFCUL;
2895
#endif
2896
}
2897

    
2898
/* PowerPC 440x5                                                             */
2899
#define POWERPC_INSNS_440x5  (POWERPC_INSNS_EMB |                             \
2900
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2901
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
2902
                              PPC_440_SPEC | PPC_RFMCI)
2903
#define POWERPC_MSRM_440x5   (0x000000000006FF30ULL)
2904
#define POWERPC_MMU_440x5    (POWERPC_MMU_BOOKE)
2905
#define POWERPC_EXCP_440x5   (POWERPC_EXCP_BOOKE)
2906
#define POWERPC_INPUT_440x5  (PPC_FLAGS_INPUT_BookE)
2907
#define POWERPC_BFDM_440x5   (bfd_mach_ppc_403)
2908

    
2909
static void init_proc_440x5 (CPUPPCState *env)
2910
{
2911
    /* Time base */
2912
    gen_tbl(env);
2913
    gen_spr_BookE(env);
2914
    gen_spr_440(env);
2915
    /* XXX : not implemented */
2916
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2917
                 SPR_NOACCESS, SPR_NOACCESS,
2918
                 &spr_read_generic, &spr_write_generic,
2919
                 0x00000000);
2920
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2921
                 SPR_NOACCESS, SPR_NOACCESS,
2922
                 &spr_read_generic, &spr_write_generic,
2923
                 0x00000000);
2924
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2925
                 SPR_NOACCESS, SPR_NOACCESS,
2926
                 &spr_read_generic, &spr_write_generic,
2927
                 0x00000000);
2928
    /* XXX : not implemented */
2929
    spr_register(env, SPR_440_CCR1, "CCR1",
2930
                 SPR_NOACCESS, SPR_NOACCESS,
2931
                 &spr_read_generic, &spr_write_generic,
2932
                 0x00000000);
2933
    /* Memory management */
2934
    env->nb_tlb = 64;
2935
    env->nb_ways = 1;
2936
    env->id_tlbs = 0;
2937
    init_excp_BookE(env);
2938
    env->dcache_line_size = 32;
2939
    env->icache_line_size = 32;
2940
    /* XXX: TODO: allocate internal IRQ controller */
2941
#if !defined(CONFIG_USER_ONLY)
2942
    /* Hardware reset vector */
2943
    env->hreset_vector = 0xFFFFFFFCUL;
2944
#endif
2945
}
2946

    
2947
/* PowerPC 460 (guessed)                                                     */
2948
#define POWERPC_INSNS_460    (POWERPC_INSNS_EMB |                             \
2949
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2950
                              PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON |    \
2951
                              PPC_405_MAC | PPC_440_SPEC | PPC_DCRUX)
2952
#define POWERPC_MSRM_460     (0x000000000006FF30ULL)
2953
#define POWERPC_MMU_460      (POWERPC_MMU_BOOKE)
2954
#define POWERPC_EXCP_460     (POWERPC_EXCP_BOOKE)
2955
#define POWERPC_INPUT_460    (PPC_FLAGS_INPUT_BookE)
2956
#define POWERPC_BFDM_460     (bfd_mach_ppc_403)
2957

    
2958
__attribute__ (( unused ))
2959
static void init_proc_460 (CPUPPCState *env)
2960
{
2961
    /* Time base */
2962
    gen_tbl(env);
2963
    gen_spr_BookE(env);
2964
    gen_spr_440(env);
2965
    /* XXX : not implemented */
2966
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2967
                 SPR_NOACCESS, SPR_NOACCESS,
2968
                 &spr_read_generic, &spr_write_generic,
2969
                 0x00000000);
2970
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2971
                 SPR_NOACCESS, SPR_NOACCESS,
2972
                 &spr_read_generic, &spr_write_generic,
2973
                 0x00000000);
2974
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2975
                 SPR_NOACCESS, SPR_NOACCESS,
2976
                 &spr_read_generic, &spr_write_generic,
2977
                 0x00000000);
2978
    /* XXX : not implemented */
2979
    spr_register(env, SPR_440_CCR1, "CCR1",
2980
                 SPR_NOACCESS, SPR_NOACCESS,
2981
                 &spr_read_generic, &spr_write_generic,
2982
                 0x00000000);
2983
    /* XXX : not implemented */
2984
    spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
2985
                 &spr_read_generic, &spr_write_generic,
2986
                 &spr_read_generic, &spr_write_generic,
2987
                 0x00000000);
2988
    /* Memory management */
2989
    env->nb_tlb = 64;
2990
    env->nb_ways = 1;
2991
    env->id_tlbs = 0;
2992
    init_excp_BookE(env);
2993
    env->dcache_line_size = 32;
2994
    env->icache_line_size = 32;
2995
    /* XXX: TODO: allocate internal IRQ controller */
2996
#if !defined(CONFIG_USER_ONLY)
2997
    /* Hardware reset vector */
2998
    env->hreset_vector = 0xFFFFFFFCUL;
2999
#endif
3000
}
3001

    
3002
/* PowerPC 460F (guessed)                                                    */
3003
#define POWERPC_INSNS_460F   (POWERPC_INSNS_EMB |                             \
3004
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
3005
                              PPC_FLOAT | PPC_FLOAT_FSQRT | PPC_FLOAT_FRES |  \
3006
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |            \
3007
                              PPC_FLOAT_STFIWX |                              \
3008
                              PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON |    \
3009
                              PPC_405_MAC | PPC_440_SPEC | PPC_DCRUX)
3010
#define POWERPC_MSRM_460     (0x000000000006FF30ULL)
3011
#define POWERPC_MMU_460F     (POWERPC_MMU_BOOKE)
3012
#define POWERPC_EXCP_460F    (POWERPC_EXCP_BOOKE)
3013
#define POWERPC_INPUT_460F   (PPC_FLAGS_INPUT_BookE)
3014
#define POWERPC_BFDM_460F    (bfd_mach_ppc_403)
3015

    
3016
__attribute__ (( unused ))
3017
static void init_proc_460F (CPUPPCState *env)
3018
{
3019
    /* Time base */
3020
    gen_tbl(env);
3021
    gen_spr_BookE(env);
3022
    gen_spr_440(env);
3023
    /* XXX : not implemented */
3024
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3025
                 SPR_NOACCESS, SPR_NOACCESS,
3026
                 &spr_read_generic, &spr_write_generic,
3027
                 0x00000000);
3028
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3029
                 SPR_NOACCESS, SPR_NOACCESS,
3030
                 &spr_read_generic, &spr_write_generic,
3031
                 0x00000000);
3032
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3033
                 SPR_NOACCESS, SPR_NOACCESS,
3034
                 &spr_read_generic, &spr_write_generic,
3035
                 0x00000000);
3036
    /* XXX : not implemented */
3037
    spr_register(env, SPR_440_CCR1, "CCR1",
3038
                 SPR_NOACCESS, SPR_NOACCESS,
3039
                 &spr_read_generic, &spr_write_generic,
3040
                 0x00000000);
3041
    /* XXX : not implemented */
3042
    spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
3043
                 &spr_read_generic, &spr_write_generic,
3044
                 &spr_read_generic, &spr_write_generic,
3045
                 0x00000000);
3046
    /* Memory management */
3047
    env->nb_tlb = 64;
3048
    env->nb_ways = 1;
3049
    env->id_tlbs = 0;
3050
    init_excp_BookE(env);
3051
    env->dcache_line_size = 32;
3052
    env->icache_line_size = 32;
3053
    /* XXX: TODO: allocate internal IRQ controller */
3054
#if !defined(CONFIG_USER_ONLY)
3055
    /* Hardware reset vector */
3056
    env->hreset_vector = 0xFFFFFFFCUL;
3057
#endif
3058
}
3059

    
3060
/* Generic BookE PowerPC                                                     */
3061
#define POWERPC_INSNS_BookE  (POWERPC_INSNS_EMB |                             \
3062
                              PPC_MEM_EIEIO | PPC_MEM_TLBSYNC |               \
3063
                              PPC_CACHE_DCBA |                                \
3064
                              PPC_FLOAT | PPC_FLOAT_FSQRT |                   \
3065
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
3066
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIW |              \
3067
                              PPC_BOOKE)
3068
#define POWERPC_MSRM_BookE   (0x000000000006D630ULL)
3069
#define POWERPC_MMU_BookE    (POWERPC_MMU_BOOKE)
3070
#define POWERPC_EXCP_BookE   (POWERPC_EXCP_BOOKE)
3071
#define POWERPC_INPUT_BookE  (PPC_FLAGS_INPUT_BookE)
3072
#define POWERPC_BFDM_BookE   (bfd_mach_ppc_403)
3073

    
3074
__attribute__ (( unused ))
3075
static void init_proc_BookE (CPUPPCState *env)
3076
{
3077
    init_excp_BookE(env);
3078
    env->dcache_line_size = 32;
3079
    env->icache_line_size = 32;
3080
#if !defined(CONFIG_USER_ONLY)
3081
    /* Hardware reset vector */
3082
    env->hreset_vector = 0xFFFFFFFCUL;
3083
#endif
3084
}
3085

    
3086
/* e200 core                                                                 */
3087

    
3088
/* e300 core                                                                 */
3089

    
3090
/* e500 core                                                                 */
3091
#define POWERPC_INSNS_e500   (POWERPC_INSNS_EMB |                             \
3092
                              PPC_MEM_EIEIO | PPC_MEM_TLBSYNC |               \
3093
                              PPC_CACHE_DCBA |                                \
3094
                              PPC_BOOKE | PPC_E500_VECTOR)
3095
#define POWERPC_MMU_e500     (POWERPC_MMU_SOFT_4xx)
3096
#define POWERPC_EXCP_e500    (POWERPC_EXCP_40x)
3097
#define POWERPC_INPUT_e500   (PPC_FLAGS_INPUT_BookE)
3098
#define POWERPC_BFDM_e500    (bfd_mach_ppc_403)
3099

    
3100
__attribute__ (( unused ))
3101
static void init_proc_e500 (CPUPPCState *env)
3102
{
3103
    /* Time base */
3104
    gen_tbl(env);
3105
    gen_spr_BookE(env);
3106
    /* Memory management */
3107
    gen_spr_BookE_FSL(env);
3108
    env->nb_tlb = 64;
3109
    env->nb_ways = 1;
3110
    env->id_tlbs = 0;
3111
    init_excp_BookE(env);
3112
    env->dcache_line_size = 32;
3113
    env->icache_line_size = 32;
3114
    /* XXX: TODO: allocate internal IRQ controller */
3115
#if !defined(CONFIG_USER_ONLY)
3116
    /* Hardware reset vector */
3117
    env->hreset_vector = 0xFFFFFFFCUL;
3118
#endif
3119
}
3120

    
3121
/* e600 core                                                                 */
3122

    
3123
/* Non-embedded PowerPC                                                      */
3124
/* Base instructions set for all 6xx/7xx/74xx/970 PowerPC                    */
3125
#define POWERPC_INSNS_6xx    (PPC_INSNS_BASE | PPC_FLOAT | PPC_MEM_SYNC |     \
3126
                              PPC_MEM_EIEIO | PPC_SEGMENT | PPC_MEM_TLBIE)
3127
/* Instructions common to all 6xx/7xx/74xx/970 PowerPC except 601 & 602      */
3128
#define POWERPC_INSNS_WORKS  (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT |           \
3129
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
3130
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX |             \
3131
                              PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ | PPC_MFTB)
3132

    
3133
/* POWER : same as 601, without mfmsr, mfsr                                  */
3134
#if defined(TODO)
3135
#define POWERPC_INSNS_POWER  (XXX_TODO)
3136
/* POWER RSC (from RAD6000) */
3137
#define POWERPC_MSRM_POWER   (0x00000000FEF0ULL)
3138
#endif /* TODO */
3139

    
3140
/* PowerPC 601                                                               */
3141
#define POWERPC_INSNS_601    (POWERPC_INSNS_6xx | PPC_CACHE_DCBZ |            \
3142
                              PPC_EXTERN | PPC_POWER_BR)
3143
#define POWERPC_MSRM_601     (0x000000000000FE70ULL)
3144
//#define POWERPC_MMU_601      (POWERPC_MMU_601)
3145
//#define POWERPC_EXCP_601     (POWERPC_EXCP_601)
3146
#define POWERPC_INPUT_601    (PPC_FLAGS_INPUT_6xx)
3147
#define POWERPC_BFDM_601     (bfd_mach_ppc_601)
3148

    
3149
static void init_proc_601 (CPUPPCState *env)
3150
{
3151
    gen_spr_ne_601(env);
3152
    gen_spr_601(env);
3153
    /* Hardware implementation registers */
3154
    /* XXX : not implemented */
3155
    spr_register(env, SPR_HID0, "HID0",
3156
                 SPR_NOACCESS, SPR_NOACCESS,
3157
                 &spr_read_generic, &spr_write_generic,
3158
                 0x00000000);
3159
    /* XXX : not implemented */
3160
    spr_register(env, SPR_HID1, "HID1",
3161
                 SPR_NOACCESS, SPR_NOACCESS,
3162
                 &spr_read_generic, &spr_write_generic,
3163
                 0x00000000);
3164
    /* XXX : not implemented */
3165
    spr_register(env, SPR_601_HID2, "HID2",
3166
                 SPR_NOACCESS, SPR_NOACCESS,
3167
                 &spr_read_generic, &spr_write_generic,
3168
                 0x00000000);
3169
    /* XXX : not implemented */
3170
    spr_register(env, SPR_601_HID5, "HID5",
3171
                 SPR_NOACCESS, SPR_NOACCESS,
3172
                 &spr_read_generic, &spr_write_generic,
3173
                 0x00000000);
3174
    /* XXX : not implemented */
3175
    spr_register(env, SPR_601_HID15, "HID15",
3176
                 SPR_NOACCESS, SPR_NOACCESS,
3177
                 &spr_read_generic, &spr_write_generic,
3178
                 0x00000000);
3179
    /* Memory management */
3180
    env->nb_tlb = 64;
3181
    env->nb_ways = 2;
3182
    env->id_tlbs = 0;
3183
    env->id_tlbs = 0;
3184
    init_excp_601(env);
3185
    env->dcache_line_size = 64;
3186
    env->icache_line_size = 64;
3187
    /* XXX: TODO: allocate internal IRQ controller */
3188
#if !defined(CONFIG_USER_ONLY)
3189
    /* Hardware reset vector */
3190
    env->hreset_vector = 0xFFFFFFFCUL;
3191
#endif
3192
}
3193

    
3194
/* PowerPC 602                                                               */
3195
#define POWERPC_INSNS_602    (POWERPC_INSNS_6xx | PPC_MFTB |                  \
3196
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
3197
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX |             \
3198
                              PPC_6xx_TLB | PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ |\
3199
                              PPC_602_SPEC)
3200
#define POWERPC_MSRM_602     (0x000000000033FF73ULL)
3201
#define POWERPC_MMU_602      (POWERPC_MMU_SOFT_6xx)
3202
//#define POWERPC_EXCP_602     (POWERPC_EXCP_602)
3203
#define POWERPC_INPUT_602    (PPC_FLAGS_INPUT_6xx)
3204
#define POWERPC_BFDM_602     (bfd_mach_ppc_602)
3205

    
3206
static void init_proc_602 (CPUPPCState *env)
3207
{
3208
    gen_spr_ne_601(env);
3209
    gen_spr_602(env);
3210
    /* Time base */
3211
    gen_tbl(env);
3212
    /* hardware implementation registers */
3213
    /* XXX : not implemented */
3214
    spr_register(env, SPR_HID0, "HID0",
3215
                 SPR_NOACCESS, SPR_NOACCESS,
3216
                 &spr_read_generic, &spr_write_generic,
3217
                 0x00000000);
3218
    /* XXX : not implemented */
3219
    spr_register(env, SPR_HID1, "HID1",
3220
                 SPR_NOACCESS, SPR_NOACCESS,
3221
                 &spr_read_generic, &spr_write_generic,
3222
                 0x00000000);
3223
    /* Memory management */
3224
    gen_low_BATs(env);
3225
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3226
    init_excp_602(env);
3227
    env->dcache_line_size = 32;
3228
    env->icache_line_size = 32;
3229
    /* Allocate hardware IRQ controller */
3230
    ppc6xx_irq_init(env);
3231
#if !defined(CONFIG_USER_ONLY)
3232
    /* Hardware reset vector */
3233
    env->hreset_vector = 0xFFFFFFFCUL;
3234
#endif
3235
}
3236

    
3237
/* PowerPC 603                                                               */
3238
#define POWERPC_INSNS_603    (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3239
#define POWERPC_MSRM_603     (0x000000000001FF73ULL)
3240
#define POWERPC_MMU_603      (POWERPC_MMU_SOFT_6xx)
3241
//#define POWERPC_EXCP_603     (POWERPC_EXCP_603)
3242
#define POWERPC_INPUT_603    (PPC_FLAGS_INPUT_6xx)
3243
#define POWERPC_BFDM_603     (bfd_mach_ppc_603)
3244

    
3245
static void init_proc_603 (CPUPPCState *env)
3246
{
3247
    gen_spr_ne_601(env);
3248
    gen_spr_603(env);
3249
    /* Time base */
3250
    gen_tbl(env);
3251
    /* hardware implementation registers */
3252
    /* XXX : not implemented */
3253
    spr_register(env, SPR_HID0, "HID0",
3254
                 SPR_NOACCESS, SPR_NOACCESS,
3255
                 &spr_read_generic, &spr_write_generic,
3256
                 0x00000000);
3257
    /* XXX : not implemented */
3258
    spr_register(env, SPR_HID1, "HID1",
3259
                 SPR_NOACCESS, SPR_NOACCESS,
3260
                 &spr_read_generic, &spr_write_generic,
3261
                 0x00000000);
3262
    /* Memory management */
3263
    gen_low_BATs(env);
3264
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3265
    init_excp_603(env);
3266
    env->dcache_line_size = 32;
3267
    env->icache_line_size = 32;
3268
    /* Allocate hardware IRQ controller */
3269
    ppc6xx_irq_init(env);
3270
#if !defined(CONFIG_USER_ONLY)
3271
    /* Hardware reset vector */
3272
    env->hreset_vector = 0xFFFFFFFCUL;
3273
#endif
3274
}
3275

    
3276
/* PowerPC 603e                                                              */
3277
#define POWERPC_INSNS_603E   (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3278
#define POWERPC_MSRM_603E    (0x000000000007FF73ULL)
3279
#define POWERPC_MMU_603E     (POWERPC_MMU_SOFT_6xx)
3280
//#define POWERPC_EXCP_603E    (POWERPC_EXCP_603E)
3281
#define POWERPC_INPUT_603E   (PPC_FLAGS_INPUT_6xx)
3282
#define POWERPC_BFDM_603E    (bfd_mach_ppc_ec603e)
3283

    
3284
static void init_proc_603E (CPUPPCState *env)
3285
{
3286
    gen_spr_ne_601(env);
3287
    gen_spr_603(env);
3288
    /* Time base */
3289
    gen_tbl(env);
3290
    /* hardware implementation registers */
3291
    /* XXX : not implemented */
3292
    spr_register(env, SPR_HID0, "HID0",
3293
                 SPR_NOACCESS, SPR_NOACCESS,
3294
                 &spr_read_generic, &spr_write_generic,
3295
                 0x00000000);
3296
    /* XXX : not implemented */
3297
    spr_register(env, SPR_HID1, "HID1",
3298
                 SPR_NOACCESS, SPR_NOACCESS,
3299
                 &spr_read_generic, &spr_write_generic,
3300
                 0x00000000);
3301
    /* XXX : not implemented */
3302
    spr_register(env, SPR_IABR, "IABR",
3303
                 SPR_NOACCESS, SPR_NOACCESS,
3304
                 &spr_read_generic, &spr_write_generic,
3305
                 0x00000000);
3306
    /* Memory management */
3307
    gen_low_BATs(env);
3308
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3309
    init_excp_603(env);
3310
    env->dcache_line_size = 32;
3311
    env->icache_line_size = 32;
3312
    /* Allocate hardware IRQ controller */
3313
    ppc6xx_irq_init(env);
3314
#if !defined(CONFIG_USER_ONLY)
3315
    /* Hardware reset vector */
3316
    env->hreset_vector = 0xFFFFFFFCUL;
3317
#endif
3318
}
3319

    
3320
/* PowerPC G2                                                                */
3321
#define POWERPC_INSNS_G2     (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3322
#define POWERPC_MSRM_G2      (0x000000000006FFF2ULL)
3323
#define POWERPC_MMU_G2       (POWERPC_MMU_SOFT_6xx)
3324
//#define POWERPC_EXCP_G2      (POWERPC_EXCP_G2)
3325
#define POWERPC_INPUT_G2     (PPC_FLAGS_INPUT_6xx)
3326
#define POWERPC_BFDM_G2      (bfd_mach_ppc_ec603e)
3327

    
3328
static void init_proc_G2 (CPUPPCState *env)
3329
{
3330
    gen_spr_ne_601(env);
3331
    gen_spr_G2_755(env);
3332
    gen_spr_G2(env);
3333
    /* Time base */
3334
    gen_tbl(env);
3335
    /* Hardware implementation register */
3336
    /* XXX : not implemented */
3337
    spr_register(env, SPR_HID0, "HID0",
3338
                 SPR_NOACCESS, SPR_NOACCESS,
3339
                 &spr_read_generic, &spr_write_generic,
3340
                 0x00000000);
3341
    /* XXX : not implemented */
3342
    spr_register(env, SPR_HID1, "HID1",
3343
                 SPR_NOACCESS, SPR_NOACCESS,
3344
                 &spr_read_generic, &spr_write_generic,
3345
                 0x00000000);
3346
    /* XXX : not implemented */
3347
    spr_register(env, SPR_HID2, "HID2",
3348
                 SPR_NOACCESS, SPR_NOACCESS,
3349
                 &spr_read_generic, &spr_write_generic,
3350
                 0x00000000);
3351
    /* Memory management */
3352
    gen_low_BATs(env);
3353
    gen_high_BATs(env);
3354
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3355
    init_excp_G2(env);
3356
    env->dcache_line_size = 32;
3357
    env->icache_line_size = 32;
3358
    /* Allocate hardware IRQ controller */
3359
    ppc6xx_irq_init(env);
3360
#if !defined(CONFIG_USER_ONLY)
3361
    /* Hardware reset vector */
3362
    env->hreset_vector = 0xFFFFFFFCUL;
3363
#endif
3364
}
3365

    
3366
/* PowerPC G2LE                                                              */
3367
#define POWERPC_INSNS_G2LE   (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3368
#define POWERPC_MSRM_G2LE    (0x000000000007FFF3ULL)
3369
#define POWERPC_MMU_G2LE     (POWERPC_MMU_SOFT_6xx)
3370
#define POWERPC_EXCP_G2LE    (POWERPC_EXCP_G2)
3371
#define POWERPC_INPUT_G2LE   (PPC_FLAGS_INPUT_6xx)
3372
#define POWERPC_BFDM_G2LE    (bfd_mach_ppc_ec603e)
3373

    
3374
static void init_proc_G2LE (CPUPPCState *env)
3375
{
3376
    gen_spr_ne_601(env);
3377
    gen_spr_G2_755(env);
3378
    gen_spr_G2(env);
3379
    /* Time base */
3380
    gen_tbl(env);
3381
    /* Hardware implementation register */
3382
    /* XXX : not implemented */
3383
    spr_register(env, SPR_HID0, "HID0",
3384
                 SPR_NOACCESS, SPR_NOACCESS,
3385
                 &spr_read_generic, &spr_write_generic,
3386
                 0x00000000);
3387
    /* XXX : not implemented */
3388
    spr_register(env, SPR_HID1, "HID1",
3389
                 SPR_NOACCESS, SPR_NOACCESS,
3390
                 &spr_read_generic, &spr_write_generic,
3391
                 0x00000000);
3392
    /* XXX : not implemented */
3393
    spr_register(env, SPR_HID2, "HID2",
3394
                 SPR_NOACCESS, SPR_NOACCESS,
3395
                 &spr_read_generic, &spr_write_generic,
3396
                 0x00000000);
3397
    /* Memory management */
3398
    gen_low_BATs(env);
3399
    gen_high_BATs(env);
3400
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3401
    init_excp_G2(env);
3402
    env->dcache_line_size = 32;
3403
    env->icache_line_size = 32;
3404
    /* Allocate hardware IRQ controller */
3405
    ppc6xx_irq_init(env);
3406
#if !defined(CONFIG_USER_ONLY)
3407
    /* Hardware reset vector */
3408
    env->hreset_vector = 0xFFFFFFFCUL;
3409
#endif
3410
}
3411

    
3412
/* PowerPC 604                                                               */
3413
#define POWERPC_INSNS_604    (POWERPC_INSNS_WORKS | PPC_EXTERN)
3414
#define POWERPC_MSRM_604     (0x000000000005FF77ULL)
3415
#define POWERPC_MMU_604      (POWERPC_MMU_32B)
3416
//#define POWERPC_EXCP_604     (POWERPC_EXCP_604)
3417
#define POWERPC_INPUT_604    (PPC_FLAGS_INPUT_6xx)
3418
#define POWERPC_BFDM_604     (bfd_mach_ppc_604)
3419

    
3420
static void init_proc_604 (CPUPPCState *env)
3421
{
3422
    gen_spr_ne_601(env);
3423
    gen_spr_604(env);
3424
    /* Time base */
3425
    gen_tbl(env);
3426
    /* Hardware implementation registers */
3427
    /* XXX : not implemented */
3428
    spr_register(env, SPR_HID0, "HID0",
3429
                 SPR_NOACCESS, SPR_NOACCESS,
3430
                 &spr_read_generic, &spr_write_generic,
3431
                 0x00000000);
3432
    /* XXX : not implemented */
3433
    spr_register(env, SPR_HID1, "HID1",
3434
                 SPR_NOACCESS, SPR_NOACCESS,
3435
                 &spr_read_generic, &spr_write_generic,
3436
                 0x00000000);
3437
    /* Memory management */
3438
    gen_low_BATs(env);
3439
    init_excp_604(env);
3440
    env->dcache_line_size = 32;
3441
    env->icache_line_size = 32;
3442
    /* Allocate hardware IRQ controller */
3443
    ppc6xx_irq_init(env);
3444
#if !defined(CONFIG_USER_ONLY)
3445
    /* Hardware reset vector */
3446
    env->hreset_vector = 0xFFFFFFFCUL;
3447
#endif
3448
}
3449

    
3450
/* PowerPC 740/750 (aka G3)                                                  */
3451
#define POWERPC_INSNS_7x0    (POWERPC_INSNS_WORKS | PPC_EXTERN)
3452
#define POWERPC_MSRM_7x0     (0x000000000007FF77ULL)
3453
#define POWERPC_MMU_7x0      (POWERPC_MMU_32B)
3454
//#define POWERPC_EXCP_7x0     (POWERPC_EXCP_7x0)
3455
#define POWERPC_INPUT_7x0    (PPC_FLAGS_INPUT_6xx)
3456
#define POWERPC_BFDM_7x0     (bfd_mach_ppc_750)
3457

    
3458
static void init_proc_7x0 (CPUPPCState *env)
3459
{
3460
    gen_spr_ne_601(env);
3461
    gen_spr_7xx(env);
3462
    /* Time base */
3463
    gen_tbl(env);
3464
    /* Thermal management */
3465
    gen_spr_thrm(env);
3466
    /* Hardware implementation registers */
3467
    /* XXX : not implemented */
3468
    spr_register(env, SPR_HID0, "HID0",
3469
                 SPR_NOACCESS, SPR_NOACCESS,
3470
                 &spr_read_generic, &spr_write_generic,
3471
                 0x00000000);
3472
    /* XXX : not implemented */
3473
    spr_register(env, SPR_HID1, "HID1",
3474
                 SPR_NOACCESS, SPR_NOACCESS,
3475
                 &spr_read_generic, &spr_write_generic,
3476
                 0x00000000);
3477
    /* Memory management */
3478
    gen_low_BATs(env);
3479
    init_excp_7x0(env);
3480
    env->dcache_line_size = 32;
3481
    env->icache_line_size = 32;
3482
    /* Allocate hardware IRQ controller */
3483
    ppc6xx_irq_init(env);
3484
#if !defined(CONFIG_USER_ONLY)
3485
    /* Hardware reset vector */
3486
    env->hreset_vector = 0xFFFFFFFCUL;
3487
#endif
3488
}
3489

    
3490
/* PowerPC 750FX/GX                                                          */
3491
#define POWERPC_INSNS_750fx  (POWERPC_INSNS_WORKS | PPC_EXTERN)
3492
#define POWERPC_MSRM_750fx   (0x000000000007FF77ULL)
3493
#define POWERPC_MMU_750fx    (POWERPC_MMU_32B)
3494
#define POWERPC_EXCP_750fx   (POWERPC_EXCP_7x0)
3495
#define POWERPC_INPUT_750fx  (PPC_FLAGS_INPUT_6xx)
3496
#define POWERPC_BFDM_750fx   (bfd_mach_ppc_750)
3497

    
3498
static void init_proc_750fx (CPUPPCState *env)
3499
{
3500
    gen_spr_ne_601(env);
3501
    gen_spr_7xx(env);
3502
    /* Time base */
3503
    gen_tbl(env);
3504
    /* Thermal management */
3505
    gen_spr_thrm(env);
3506
    /* Hardware implementation registers */
3507
    /* XXX : not implemented */
3508
    spr_register(env, SPR_HID0, "HID0",
3509
                 SPR_NOACCESS, SPR_NOACCESS,
3510
                 &spr_read_generic, &spr_write_generic,
3511
                 0x00000000);
3512
    /* XXX : not implemented */
3513
    spr_register(env, SPR_HID1, "HID1",
3514
                 SPR_NOACCESS, SPR_NOACCESS,
3515
                 &spr_read_generic, &spr_write_generic,
3516
                 0x00000000);
3517
    /* XXX : not implemented */
3518
    spr_register(env, SPR_750_HID2, "HID2",
3519
                 SPR_NOACCESS, SPR_NOACCESS,
3520
                 &spr_read_generic, &spr_write_generic,
3521
                 0x00000000);
3522
    /* Memory management */
3523
    gen_low_BATs(env);
3524
    /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
3525
    gen_high_BATs(env);
3526
    init_excp_750FX(env);
3527
    env->dcache_line_size = 32;
3528
    env->icache_line_size = 32;
3529
    /* Allocate hardware IRQ controller */
3530
    ppc6xx_irq_init(env);
3531
#if !defined(CONFIG_USER_ONLY)
3532
    /* Hardware reset vector */
3533
    env->hreset_vector = 0xFFFFFFFCUL;
3534
#endif
3535
}
3536

    
3537
/* PowerPC 745/755                                                           */
3538
#define POWERPC_INSNS_7x5    (POWERPC_INSNS_WORKS | PPC_EXTERN | PPC_6xx_TLB)
3539
#define POWERPC_MSRM_7x5     (0x000000000007FF77ULL)
3540
#define POWERPC_MMU_7x5      (POWERPC_MMU_SOFT_6xx)
3541
//#define POWERPC_EXCP_7x5     (POWERPC_EXCP_7x5)
3542
#define POWERPC_INPUT_7x5    (PPC_FLAGS_INPUT_6xx)
3543
#define POWERPC_BFDM_7x5     (bfd_mach_ppc_750)
3544

    
3545
static void init_proc_7x5 (CPUPPCState *env)
3546
{
3547
    gen_spr_ne_601(env);
3548
    gen_spr_G2_755(env);
3549
    /* Time base */
3550
    gen_tbl(env);
3551
    /* L2 cache control */
3552
    /* XXX : not implemented */
3553
    spr_register(env, SPR_ICTC, "ICTC",
3554
                 SPR_NOACCESS, SPR_NOACCESS,
3555
                 &spr_read_generic, &spr_write_generic,
3556
                 0x00000000);
3557
    /* XXX : not implemented */
3558
    spr_register(env, SPR_L2PMCR, "L2PMCR",
3559
                 SPR_NOACCESS, SPR_NOACCESS,
3560
                 &spr_read_generic, &spr_write_generic,
3561
                 0x00000000);
3562
    /* Hardware implementation registers */
3563
    /* XXX : not implemented */
3564
    spr_register(env, SPR_HID0, "HID0",
3565
                 SPR_NOACCESS, SPR_NOACCESS,
3566
                 &spr_read_generic, &spr_write_generic,
3567
                 0x00000000);
3568
    /* XXX : not implemented */
3569
    spr_register(env, SPR_HID1, "HID1",
3570
                 SPR_NOACCESS, SPR_NOACCESS,
3571
                 &spr_read_generic, &spr_write_generic,
3572
                 0x00000000);
3573
    /* XXX : not implemented */
3574
    spr_register(env, SPR_HID2, "HID2",
3575
                 SPR_NOACCESS, SPR_NOACCESS,
3576
                 &spr_read_generic, &spr_write_generic,
3577
                 0x00000000);
3578
    /* Memory management */
3579
    gen_low_BATs(env);
3580
    gen_high_BATs(env);
3581
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3582
    env->dcache_line_size = 32;
3583
    env->icache_line_size = 32;
3584
    /* Allocate hardware IRQ controller */
3585
    ppc6xx_irq_init(env);
3586
#if !defined(CONFIG_USER_ONLY)
3587
    /* Hardware reset vector */
3588
    env->hreset_vector = 0xFFFFFFFCUL;
3589
#endif
3590
}
3591

    
3592
/* PowerPC 7400 (aka G4)                                                     */
3593
#define POWERPC_INSNS_7400   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3594
                              PPC_EXTERN | PPC_MEM_TLBIA |                    \
3595
                              PPC_ALTIVEC)
3596
#define POWERPC_MSRM_7400    (0x000000000205FF77ULL)
3597
#define POWERPC_MMU_7400     (POWERPC_MMU_32B)
3598
#define POWERPC_EXCP_7400    (POWERPC_EXCP_74xx)
3599
#define POWERPC_INPUT_7400   (PPC_FLAGS_INPUT_6xx)
3600
#define POWERPC_BFDM_7400    (bfd_mach_ppc_7400)
3601

    
3602
static void init_proc_7400 (CPUPPCState *env)
3603
{
3604
    gen_spr_ne_601(env);
3605
    gen_spr_7xx(env);
3606
    /* Time base */
3607
    gen_tbl(env);
3608
    /* 74xx specific SPR */
3609
    gen_spr_74xx(env);
3610
    /* Thermal management */
3611
    gen_spr_thrm(env);
3612
    /* Memory management */
3613
    gen_low_BATs(env);
3614
    init_excp_7400(env);
3615
    env->dcache_line_size = 32;
3616
    env->icache_line_size = 32;
3617
    /* Allocate hardware IRQ controller */
3618
    ppc6xx_irq_init(env);
3619
#if !defined(CONFIG_USER_ONLY)
3620
    /* Hardware reset vector */
3621
    env->hreset_vector = 0xFFFFFFFCUL;
3622
#endif
3623
}
3624

    
3625
/* PowerPC 7410 (aka G4)                                                     */
3626
#define POWERPC_INSNS_7410   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3627
                              PPC_EXTERN | PPC_MEM_TLBIA |                    \
3628
                              PPC_ALTIVEC)
3629
#define POWERPC_MSRM_7410    (0x000000000205FF77ULL)
3630
#define POWERPC_MMU_7410     (POWERPC_MMU_32B)
3631
#define POWERPC_EXCP_7410    (POWERPC_EXCP_74xx)
3632
#define POWERPC_INPUT_7410   (PPC_FLAGS_INPUT_6xx)
3633
#define POWERPC_BFDM_7410    (bfd_mach_ppc_7400)
3634

    
3635
static void init_proc_7410 (CPUPPCState *env)
3636
{
3637
    gen_spr_ne_601(env);
3638
    gen_spr_7xx(env);
3639
    /* Time base */
3640
    gen_tbl(env);
3641
    /* 74xx specific SPR */
3642
    gen_spr_74xx(env);
3643
    /* Thermal management */
3644
    gen_spr_thrm(env);
3645
    /* L2PMCR */
3646
    /* XXX : not implemented */
3647
    spr_register(env, SPR_L2PMCR, "L2PMCR",
3648
                 SPR_NOACCESS, SPR_NOACCESS,
3649
                 &spr_read_generic, &spr_write_generic,
3650
                 0x00000000);
3651
    /* LDSTDB */
3652
    /* XXX : not implemented */
3653
    spr_register(env, SPR_LDSTDB, "LDSTDB",
3654
                 SPR_NOACCESS, SPR_NOACCESS,
3655
                 &spr_read_generic, &spr_write_generic,
3656
                 0x00000000);
3657
    /* Memory management */
3658
    gen_low_BATs(env);
3659
    init_excp_7400(env);
3660
    env->dcache_line_size = 32;
3661
    env->icache_line_size = 32;
3662
    /* Allocate hardware IRQ controller */
3663
    ppc6xx_irq_init(env);
3664
#if !defined(CONFIG_USER_ONLY)
3665
    /* Hardware reset vector */
3666
    env->hreset_vector = 0xFFFFFFFCUL;
3667
#endif
3668
}
3669

    
3670
/* PowerPC 7440 (aka G4)                                                     */
3671
#define POWERPC_INSNS_7440   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3672
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3673
                              PPC_ALTIVEC)
3674
#define POWERPC_MSRM_7440    (0x000000000205FF77ULL)
3675
#define POWERPC_MMU_7440     (POWERPC_MMU_SOFT_74xx)
3676
#define POWERPC_EXCP_7440    (POWERPC_EXCP_74xx)
3677
#define POWERPC_INPUT_7440   (PPC_FLAGS_INPUT_6xx)
3678
#define POWERPC_BFDM_7440    (bfd_mach_ppc_7400)
3679

    
3680
__attribute__ (( unused ))
3681
static void init_proc_7440 (CPUPPCState *env)
3682
{
3683
    gen_spr_ne_601(env);
3684
    gen_spr_7xx(env);
3685
    /* Time base */
3686
    gen_tbl(env);
3687
    /* 74xx specific SPR */
3688
    gen_spr_74xx(env);
3689
    /* LDSTCR */
3690
    /* XXX : not implemented */
3691
    spr_register(env, SPR_LDSTCR, "LDSTCR",
3692
                 SPR_NOACCESS, SPR_NOACCESS,
3693
                 &spr_read_generic, &spr_write_generic,
3694
                 0x00000000);
3695
    /* ICTRL */
3696
    /* XXX : not implemented */
3697
    spr_register(env, SPR_ICTRL, "ICTRL",
3698
                 SPR_NOACCESS, SPR_NOACCESS,
3699
                 &spr_read_generic, &spr_write_generic,
3700
                 0x00000000);
3701
    /* MSSSR0 */
3702
    /* XXX : not implemented */
3703
    spr_register(env, SPR_MSSSR0, "MSSSR0",
3704
                 SPR_NOACCESS, SPR_NOACCESS,
3705
                 &spr_read_generic, &spr_write_generic,
3706
                 0x00000000);
3707
    /* PMC */
3708
    /* XXX : not implemented */
3709
    spr_register(env, SPR_PMC5, "PMC5",
3710
                 SPR_NOACCESS, SPR_NOACCESS,
3711
                 &spr_read_generic, &spr_write_generic,
3712
                 0x00000000);
3713
    /* XXX : not implemented */
3714
    spr_register(env, SPR_UPMC5, "UPMC5",
3715
                 &spr_read_ureg, SPR_NOACCESS,
3716
                 &spr_read_ureg, SPR_NOACCESS,
3717
                 0x00000000);
3718
    /* XXX : not implemented */
3719
    spr_register(env, SPR_PMC6, "PMC6",
3720
                 SPR_NOACCESS, SPR_NOACCESS,
3721
                 &spr_read_generic, &spr_write_generic,
3722
                 0x00000000);
3723
    /* XXX : not implemented */
3724
    spr_register(env, SPR_UPMC6, "UPMC6",
3725
                 &spr_read_ureg, SPR_NOACCESS,
3726
                 &spr_read_ureg, SPR_NOACCESS,
3727
                 0x00000000);
3728
    /* Memory management */
3729
    gen_low_BATs(env);
3730
    gen_74xx_soft_tlb(env, 128, 2);
3731
    env->dcache_line_size = 32;
3732
    env->icache_line_size = 32;
3733
    /* Allocate hardware IRQ controller */
3734
    ppc6xx_irq_init(env);
3735
#if !defined(CONFIG_USER_ONLY)
3736
    /* Hardware reset vector */
3737
    env->hreset_vector = 0xFFFFFFFCUL;
3738
#endif
3739
}
3740

    
3741
/* PowerPC 7450 (aka G4)                                                     */
3742
#define POWERPC_INSNS_7450   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3743
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3744
                              PPC_ALTIVEC)
3745
#define POWERPC_MSRM_7450    (0x000000000205FF77ULL)
3746
#define POWERPC_MMU_7450     (POWERPC_MMU_SOFT_74xx)
3747
#define POWERPC_EXCP_7450    (POWERPC_EXCP_74xx)
3748
#define POWERPC_INPUT_7450   (PPC_FLAGS_INPUT_6xx)
3749
#define POWERPC_BFDM_7450    (bfd_mach_ppc_7400)
3750

    
3751
__attribute__ (( unused ))
3752
static void init_proc_7450 (CPUPPCState *env)
3753
{
3754
    gen_spr_ne_601(env);
3755
    gen_spr_7xx(env);
3756
    /* Time base */
3757
    gen_tbl(env);
3758
    /* 74xx specific SPR */
3759
    gen_spr_74xx(env);
3760
    /* Level 3 cache control */
3761
    gen_l3_ctrl(env);
3762
    /* LDSTCR */
3763
    /* XXX : not implemented */
3764
    spr_register(env, SPR_LDSTCR, "LDSTCR",
3765
                 SPR_NOACCESS, SPR_NOACCESS,
3766
                 &spr_read_generic, &spr_write_generic,
3767
                 0x00000000);
3768
    /* ICTRL */
3769
    /* XXX : not implemented */
3770
    spr_register(env, SPR_ICTRL, "ICTRL",
3771
                 SPR_NOACCESS, SPR_NOACCESS,
3772
                 &spr_read_generic, &spr_write_generic,
3773
                 0x00000000);
3774
    /* MSSSR0 */
3775
    /* XXX : not implemented */
3776
    spr_register(env, SPR_MSSSR0, "MSSSR0",
3777
                 SPR_NOACCESS, SPR_NOACCESS,
3778
                 &spr_read_generic, &spr_write_generic,
3779
                 0x00000000);
3780
    /* PMC */
3781
    /* XXX : not implemented */
3782
    spr_register(env, SPR_PMC5, "PMC5",
3783
                 SPR_NOACCESS, SPR_NOACCESS,
3784
                 &spr_read_generic, &spr_write_generic,
3785
                 0x00000000);
3786
    /* XXX : not implemented */
3787
    spr_register(env, SPR_UPMC5, "UPMC5",
3788
                 &spr_read_ureg, SPR_NOACCESS,
3789
                 &spr_read_ureg, SPR_NOACCESS,
3790
                 0x00000000);
3791
    /* XXX : not implemented */
3792
    spr_register(env, SPR_PMC6, "PMC6",
3793
                 SPR_NOACCESS, SPR_NOACCESS,
3794
                 &spr_read_generic, &spr_write_generic,
3795
                 0x00000000);
3796
    /* XXX : not implemented */
3797
    spr_register(env, SPR_UPMC6, "UPMC6",
3798
                 &spr_read_ureg, SPR_NOACCESS,
3799
                 &spr_read_ureg, SPR_NOACCESS,
3800
                 0x00000000);
3801
    /* Memory management */
3802
    gen_low_BATs(env);
3803
    gen_74xx_soft_tlb(env, 128, 2);
3804
    init_excp_7450(env);
3805
    env->dcache_line_size = 32;
3806
    env->icache_line_size = 32;
3807
    /* Allocate hardware IRQ controller */
3808
    ppc6xx_irq_init(env);
3809
#if !defined(CONFIG_USER_ONLY)
3810
    /* Hardware reset vector */
3811
    env->hreset_vector = 0xFFFFFFFCUL;
3812
#endif
3813
}
3814

    
3815
/* PowerPC 7445 (aka G4)                                                     */
3816
#define POWERPC_INSNS_7445   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3817
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3818
                              PPC_ALTIVEC)
3819
#define POWERPC_MSRM_7445    (0x000000000205FF77ULL)
3820
#define POWERPC_MMU_7445     (POWERPC_MMU_SOFT_74xx)
3821
#define POWERPC_EXCP_7445    (POWERPC_EXCP_74xx)
3822
#define POWERPC_INPUT_7445   (PPC_FLAGS_INPUT_6xx)
3823
#define POWERPC_BFDM_7445    (bfd_mach_ppc_7400)
3824

    
3825
__attribute__ (( unused ))
3826
static void init_proc_7445 (CPUPPCState *env)
3827
{
3828
    gen_spr_ne_601(env);
3829
    gen_spr_7xx(env);
3830
    /* Time base */
3831
    gen_tbl(env);
3832
    /* 74xx specific SPR */
3833
    gen_spr_74xx(env);
3834
    /* LDSTCR */
3835
    /* XXX : not implemented */
3836
    spr_register(env, SPR_LDSTCR, "LDSTCR",
3837
                 SPR_NOACCESS, SPR_NOACCESS,
3838
                 &spr_read_generic, &spr_write_generic,
3839
                 0x00000000);
3840
    /* ICTRL */
3841
    /* XXX : not implemented */
3842
    spr_register(env, SPR_ICTRL, "ICTRL",
3843
                 SPR_NOACCESS, SPR_NOACCESS,
3844
                 &spr_read_generic, &spr_write_generic,
3845
                 0x00000000);
3846
    /* MSSSR0 */
3847
    /* XXX : not implemented */
3848
    spr_register(env, SPR_MSSSR0, "MSSSR0",
3849
                 SPR_NOACCESS, SPR_NOACCESS,
3850
                 &spr_read_generic, &spr_write_generic,
3851
                 0x00000000);
3852
    /* PMC */
3853
    /* XXX : not implemented */
3854
    spr_register(env, SPR_PMC5, "PMC5",
3855
                 SPR_NOACCESS, SPR_NOACCESS,
3856
                 &spr_read_generic, &spr_write_generic,
3857
                 0x00000000);
3858
    /* XXX : not implemented */
3859
    spr_register(env, SPR_UPMC5, "UPMC5",
3860
                 &spr_read_ureg, SPR_NOACCESS,
3861
                 &spr_read_ureg, SPR_NOACCESS,
3862
                 0x00000000);
3863
    /* XXX : not implemented */
3864
    spr_register(env, SPR_PMC6, "PMC6",
3865
                 SPR_NOACCESS, SPR_NOACCESS,
3866
                 &spr_read_generic, &spr_write_generic,
3867
                 0x00000000);
3868
    /* XXX : not implemented */
3869
    spr_register(env, SPR_UPMC6, "UPMC6",
3870
                 &spr_read_ureg, SPR_NOACCESS,
3871
                 &spr_read_ureg, SPR_NOACCESS,
3872
                 0x00000000);
3873
    /* SPRGs */
3874
    spr_register(env, SPR_SPRG4, "SPRG4",
3875
                 SPR_NOACCESS, SPR_NOACCESS,
3876
                 &spr_read_generic, &spr_write_generic,
3877
                 0x00000000);
3878
    spr_register(env, SPR_USPRG4, "USPRG4",
3879
                 &spr_read_ureg, SPR_NOACCESS,
3880
                 &spr_read_ureg, SPR_NOACCESS,
3881
                 0x00000000);
3882
    spr_register(env, SPR_SPRG5, "SPRG5",
3883
                 SPR_NOACCESS, SPR_NOACCESS,
3884
                 &spr_read_generic, &spr_write_generic,
3885
                 0x00000000);
3886
    spr_register(env, SPR_USPRG5, "USPRG5",
3887
                 &spr_read_ureg, SPR_NOACCESS,
3888
                 &spr_read_ureg, SPR_NOACCESS,
3889
                 0x00000000);
3890
    spr_register(env, SPR_SPRG6, "SPRG6",
3891
                 SPR_NOACCESS, SPR_NOACCESS,
3892
                 &spr_read_generic, &spr_write_generic,
3893
                 0x00000000);
3894
    spr_register(env, SPR_USPRG6, "USPRG6",
3895
                 &spr_read_ureg, SPR_NOACCESS,
3896
                 &spr_read_ureg, SPR_NOACCESS,
3897
                 0x00000000);
3898
    spr_register(env, SPR_SPRG7, "SPRG7",
3899
                 SPR_NOACCESS, SPR_NOACCESS,
3900
                 &spr_read_generic, &spr_write_generic,
3901
                 0x00000000);
3902
    spr_register(env, SPR_USPRG7, "USPRG7",
3903
                 &spr_read_ureg, SPR_NOACCESS,
3904
                 &spr_read_ureg, SPR_NOACCESS,
3905
                 0x00000000);
3906
    /* Memory management */
3907
    gen_low_BATs(env);
3908
    gen_high_BATs(env);
3909
    gen_74xx_soft_tlb(env, 128, 2);
3910
    init_excp_7450(env);
3911
    env->dcache_line_size = 32;
3912
    env->icache_line_size = 32;
3913
    /* Allocate hardware IRQ controller */
3914
    ppc6xx_irq_init(env);
3915
#if !defined(CONFIG_USER_ONLY)
3916
    /* Hardware reset vector */
3917
    env->hreset_vector = 0xFFFFFFFCUL;
3918
#endif
3919
}
3920

    
3921
/* PowerPC 7455 (aka G4)                                                     */
3922
#define POWERPC_INSNS_7455   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3923
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3924
                              PPC_ALTIVEC)
3925
#define POWERPC_MSRM_7455    (0x000000000205FF77ULL)
3926
#define POWERPC_MMU_7455     (POWERPC_MMU_SOFT_74xx)
3927
#define POWERPC_EXCP_7455    (POWERPC_EXCP_74xx)
3928
#define POWERPC_INPUT_7455   (PPC_FLAGS_INPUT_6xx)
3929
#define POWERPC_BFDM_7455    (bfd_mach_ppc_7400)
3930

    
3931
__attribute__ (( unused ))
3932
static void init_proc_7455 (CPUPPCState *env)
3933
{
3934
    gen_spr_ne_601(env);
3935
    gen_spr_7xx(env);
3936
    /* Time base */
3937
    gen_tbl(env);
3938
    /* 74xx specific SPR */
3939
    gen_spr_74xx(env);
3940
    /* Level 3 cache control */
3941
    gen_l3_ctrl(env);
3942
    /* LDSTCR */
3943
    /* XXX : not implemented */
3944
    spr_register(env, SPR_LDSTCR, "LDSTCR",
3945
                 SPR_NOACCESS, SPR_NOACCESS,
3946
                 &spr_read_generic, &spr_write_generic,
3947
                 0x00000000);
3948
    /* ICTRL */
3949
    /* XXX : not implemented */
3950
    spr_register(env, SPR_ICTRL, "ICTRL",
3951
                 SPR_NOACCESS, SPR_NOACCESS,
3952
                 &spr_read_generic, &spr_write_generic,
3953
                 0x00000000);
3954
    /* MSSSR0 */
3955
    /* XXX : not implemented */
3956
    spr_register(env, SPR_MSSSR0, "MSSSR0",
3957
                 SPR_NOACCESS, SPR_NOACCESS,
3958
                 &spr_read_generic, &spr_write_generic,
3959
                 0x00000000);
3960
    /* PMC */
3961
    /* XXX : not implemented */
3962
    spr_register(env, SPR_PMC5, "PMC5",
3963
                 SPR_NOACCESS, SPR_NOACCESS,
3964
                 &spr_read_generic, &spr_write_generic,
3965
                 0x00000000);
3966
    /* XXX : not implemented */
3967
    spr_register(env, SPR_UPMC5, "UPMC5",
3968
                 &spr_read_ureg, SPR_NOACCESS,
3969
                 &spr_read_ureg, SPR_NOACCESS,
3970
                 0x00000000);
3971
    /* XXX : not implemented */
3972
    spr_register(env, SPR_PMC6, "PMC6",
3973
                 SPR_NOACCESS, SPR_NOACCESS,
3974
                 &spr_read_generic, &spr_write_generic,
3975
                 0x00000000);
3976
    /* XXX : not implemented */
3977
    spr_register(env, SPR_UPMC6, "UPMC6",
3978
                 &spr_read_ureg, SPR_NOACCESS,
3979
                 &spr_read_ureg, SPR_NOACCESS,
3980
                 0x00000000);
3981
    /* SPRGs */
3982
    spr_register(env, SPR_SPRG4, "SPRG4",
3983
                 SPR_NOACCESS, SPR_NOACCESS,
3984
                 &spr_read_generic, &spr_write_generic,
3985
                 0x00000000);
3986
    spr_register(env, SPR_USPRG4, "USPRG4",
3987
                 &spr_read_ureg, SPR_NOACCESS,
3988
                 &spr_read_ureg, SPR_NOACCESS,
3989
                 0x00000000);
3990
    spr_register(env, SPR_SPRG5, "SPRG5",
3991
                 SPR_NOACCESS, SPR_NOACCESS,
3992
                 &spr_read_generic, &spr_write_generic,
3993
                 0x00000000);
3994
    spr_register(env, SPR_USPRG5, "USPRG5",
3995
                 &spr_read_ureg, SPR_NOACCESS,
3996
                 &spr_read_ureg, SPR_NOACCESS,
3997
                 0x00000000);
3998
    spr_register(env, SPR_SPRG6, "SPRG6",
3999
                 SPR_NOACCESS, SPR_NOACCESS,
4000
                 &spr_read_generic, &spr_write_generic,
4001
                 0x00000000);
4002
    spr_register(env, SPR_USPRG6, "USPRG6",
4003
                 &spr_read_ureg, SPR_NOACCESS,
4004
                 &spr_read_ureg, SPR_NOACCESS,
4005
                 0x00000000);
4006
    spr_register(env, SPR_SPRG7, "SPRG7",
4007
                 SPR_NOACCESS, SPR_NOACCESS,
4008
                 &spr_read_generic, &spr_write_generic,
4009
                 0x00000000);
4010
    spr_register(env, SPR_USPRG7, "USPRG7",
4011
                 &spr_read_ureg, SPR_NOACCESS,
4012
                 &spr_read_ureg, SPR_NOACCESS,
4013
                 0x00000000);
4014
    /* Memory management */
4015
    gen_low_BATs(env);
4016
    gen_high_BATs(env);
4017
    gen_74xx_soft_tlb(env, 128, 2);
4018
    init_excp_7450(env);
4019
    env->dcache_line_size = 32;
4020
    env->icache_line_size = 32;
4021
    /* Allocate hardware IRQ controller */
4022
    ppc6xx_irq_init(env);
4023
#if !defined(CONFIG_USER_ONLY)
4024
    /* Hardware reset vector */
4025
    env->hreset_vector = 0xFFFFFFFCUL;
4026
#endif
4027
}
4028

    
4029
#if defined (TARGET_PPC64)
4030
#define POWERPC_INSNS_WORK64  (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT |          \
4031
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
4032
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX |             \
4033
                              PPC_MEM_TLBSYNC | PPC_CACHE_DCBZT | PPC_MFTB)
4034
/* PowerPC 970                                                               */
4035
#define POWERPC_INSNS_970    (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT |        \
4036
                              PPC_64B | PPC_ALTIVEC |                         \
4037
                              PPC_64_BRIDGE | PPC_SLBI)
4038
#define POWERPC_MSRM_970     (0x900000000204FF36ULL)
4039
#define POWERPC_MMU_970      (POWERPC_MMU_64BRIDGE)
4040
//#define POWERPC_EXCP_970     (POWERPC_EXCP_970)
4041
#define POWERPC_INPUT_970    (PPC_FLAGS_INPUT_970)
4042
#define POWERPC_BFDM_970     (bfd_mach_ppc64)
4043

    
4044
static void init_proc_970 (CPUPPCState *env)
4045
{
4046
    gen_spr_ne_601(env);
4047
    gen_spr_7xx(env);
4048
    /* Time base */
4049
    gen_tbl(env);
4050
    /* Hardware implementation registers */
4051
    /* XXX : not implemented */
4052
    spr_register(env, SPR_HID0, "HID0",
4053
                 SPR_NOACCESS, SPR_NOACCESS,
4054
                 &spr_read_generic, &spr_write_clear,
4055
                 0x60000000);
4056
    /* XXX : not implemented */
4057
    spr_register(env, SPR_HID1, "HID1",
4058
                 SPR_NOACCESS, SPR_NOACCESS,
4059
                 &spr_read_generic, &spr_write_generic,
4060
                 0x00000000);
4061
    /* XXX : not implemented */
4062
    spr_register(env, SPR_750_HID2, "HID2",
4063
                 SPR_NOACCESS, SPR_NOACCESS,
4064
                 &spr_read_generic, &spr_write_generic,
4065
                 0x00000000);
4066
    /* Memory management */
4067
    /* XXX: not correct */
4068
    gen_low_BATs(env);
4069
#if 0 // TODO
4070
    env->slb_nr = 32;
4071
#endif
4072
    init_excp_970(env);
4073
    env->dcache_line_size = 128;
4074
    env->icache_line_size = 128;
4075
    /* Allocate hardware IRQ controller */
4076
    ppc970_irq_init(env);
4077
#if !defined(CONFIG_USER_ONLY)
4078
    /* Hardware reset vector */
4079
    env->hreset_vector = 0x0000000000000100ULL;
4080
#endif
4081
}
4082

    
4083
/* PowerPC 970FX (aka G5)                                                    */
4084
#define POWERPC_INSNS_970FX  (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT |        \
4085
                              PPC_64B | PPC_ALTIVEC |                         \
4086
                              PPC_64_BRIDGE | PPC_SLBI)
4087
#define POWERPC_MSRM_970FX   (0x800000000204FF36ULL)
4088
#define POWERPC_MMU_970FX    (POWERPC_MMU_64BRIDGE)
4089
#define POWERPC_EXCP_970FX   (POWERPC_EXCP_970)
4090
#define POWERPC_INPUT_970FX  (PPC_FLAGS_INPUT_970)
4091
#define POWERPC_BFDM_970FX   (bfd_mach_ppc64)
4092

    
4093
static void init_proc_970FX (CPUPPCState *env)
4094
{
4095
    gen_spr_ne_601(env);
4096
    gen_spr_7xx(env);
4097
    /* Time base */
4098
    gen_tbl(env);
4099
    /* Hardware implementation registers */
4100
    /* XXX : not implemented */
4101
    spr_register(env, SPR_HID0, "HID0",
4102
                 SPR_NOACCESS, SPR_NOACCESS,
4103
                 &spr_read_generic, &spr_write_clear,
4104
                 0x60000000);
4105
    /* XXX : not implemented */
4106
    spr_register(env, SPR_HID1, "HID1",
4107
                 SPR_NOACCESS, SPR_NOACCESS,
4108
                 &spr_read_generic, &spr_write_generic,
4109
                 0x00000000);
4110
    /* XXX : not implemented */
4111
    spr_register(env, SPR_750_HID2, "HID2",
4112
                 SPR_NOACCESS, SPR_NOACCESS,
4113
                 &spr_read_generic, &spr_write_generic,
4114
                 0x00000000);
4115
    /* XXX : not implemented */
4116
    spr_register(env, SPR_970_HID5, "HID5",
4117
                 SPR_NOACCESS, SPR_NOACCESS,
4118
                 &spr_read_generic, &spr_write_generic,
4119
                 0x00000000);
4120
    /* Memory management */
4121
    /* XXX: not correct */
4122
    gen_low_BATs(env);
4123
#if 0 // TODO
4124
    env->slb_nr = 32;
4125
#endif
4126
    init_excp_970(env);
4127
    env->dcache_line_size = 128;
4128
    env->icache_line_size = 128;
4129
    /* Allocate hardware IRQ controller */
4130
    ppc970_irq_init(env);
4131
#if !defined(CONFIG_USER_ONLY)
4132
    /* Hardware reset vector */
4133
    env->hreset_vector = 0x0000000000000100ULL;
4134
#endif
4135
}
4136

    
4137
/* PowerPC 970 GX                                                            */
4138
#define POWERPC_INSNS_970GX  (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT |        \
4139
                              PPC_64B | PPC_ALTIVEC |                         \
4140
                              PPC_64_BRIDGE | PPC_SLBI)
4141
#define POWERPC_MSRM_970GX   (0x800000000204FF36ULL)
4142
#define POWERPC_MMU_970GX    (POWERPC_MMU_64BRIDGE)
4143
#define POWERPC_EXCP_970GX   (POWERPC_EXCP_970)
4144
#define POWERPC_INPUT_970GX  (PPC_FLAGS_INPUT_970)
4145
#define POWERPC_BFDM_970GX   (bfd_mach_ppc64)
4146

    
4147
static void init_proc_970GX (CPUPPCState *env)
4148
{
4149
    gen_spr_ne_601(env);
4150
    gen_spr_7xx(env);
4151
    /* Time base */
4152
    gen_tbl(env);
4153
    /* Hardware implementation registers */
4154
    /* XXX : not implemented */
4155
    spr_register(env, SPR_HID0, "HID0",
4156
                 SPR_NOACCESS, SPR_NOACCESS,
4157
                 &spr_read_generic, &spr_write_clear,
4158
                 0x60000000);
4159
    /* XXX : not implemented */
4160
    spr_register(env, SPR_HID1, "HID1",
4161
                 SPR_NOACCESS, SPR_NOACCESS,
4162
                 &spr_read_generic, &spr_write_generic,
4163
                 0x00000000);
4164
    /* XXX : not implemented */
4165
    spr_register(env, SPR_750_HID2, "HID2",
4166
                 SPR_NOACCESS, SPR_NOACCESS,
4167
                 &spr_read_generic, &spr_write_generic,
4168
                 0x00000000);
4169
    /* XXX : not implemented */
4170
    spr_register(env, SPR_970_HID5, "HID5",
4171
                 SPR_NOACCESS, SPR_NOACCESS,
4172
                 &spr_read_generic, &spr_write_generic,
4173
                 0x00000000);
4174
    /* Memory management */
4175
    /* XXX: not correct */
4176
    gen_low_BATs(env);
4177
#if 0 // TODO
4178
    env->slb_nr = 32;
4179
#endif
4180
    init_excp_970(env);
4181
    env->dcache_line_size = 128;
4182
    env->icache_line_size = 128;
4183
    /* Allocate hardware IRQ controller */
4184
    ppc970_irq_init(env);
4185
#if !defined(CONFIG_USER_ONLY)
4186
    /* Hardware reset vector */
4187
    env->hreset_vector = 0x0000000000000100ULL;
4188
#endif
4189
}
4190

    
4191
/* PowerPC 620                                                               */
4192
#define POWERPC_INSNS_620    (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT |         \
4193
                              PPC_64B | PPC_SLBI)
4194
#define POWERPC_MSRM_620     (0x800000000005FF73ULL)
4195
#define POWERPC_MMU_620      (POWERPC_MMU_64B)
4196
#define POWERPC_EXCP_620     (POWERPC_EXCP_970)
4197
#define POWERPC_INPUT_620    (PPC_FLAGS_INPUT_970)
4198
#define POWERPC_BFDM_620     (bfd_mach_ppc64)
4199

    
4200
__attribute__ (( unused ))
4201
static void init_proc_620 (CPUPPCState *env)
4202
{
4203
    gen_spr_ne_601(env);
4204
    gen_spr_620(env);
4205
    /* Time base */
4206
    gen_tbl(env);
4207
    /* Hardware implementation registers */
4208
    /* XXX : not implemented */
4209
    spr_register(env, SPR_HID0, "HID0",
4210
                 SPR_NOACCESS, SPR_NOACCESS,
4211
                 &spr_read_generic, &spr_write_generic,
4212
                 0x00000000);
4213
    /* Memory management */
4214
    gen_low_BATs(env);
4215
    gen_high_BATs(env);
4216
    init_excp_620(env);
4217
    env->dcache_line_size = 64;
4218
    env->icache_line_size = 64;
4219
    /* XXX: TODO: initialize internal interrupt controller */
4220
#if !defined(CONFIG_USER_ONLY)
4221
    /* Hardware reset vector */
4222
    env->hreset_vector = 0x0000000000000100ULL; /* ? */
4223
#endif
4224
}
4225
#endif /* defined (TARGET_PPC64) */
4226

    
4227
/* Default 32 bits PowerPC target will be 604 */
4228
#define CPU_POWERPC_PPC32     CPU_POWERPC_604
4229
#define POWERPC_INSNS_PPC32   POWERPC_INSNS_604
4230
#define POWERPC_MSRM_PPC32    POWERPC_MSRM_604
4231
#define POWERPC_MMU_PPC32     POWERPC_MMU_604
4232
#define POWERPC_EXCP_PPC32    POWERPC_EXCP_604
4233
#define POWERPC_INPUT_PPC32   POWERPC_INPUT_604
4234
#define init_proc_PPC32       init_proc_604
4235
#define POWERPC_BFDM_PPC32    POWERPC_BFDM_604
4236

    
4237
/* Default 64 bits PowerPC target will be 970 FX */
4238
#define CPU_POWERPC_PPC64     CPU_POWERPC_970FX
4239
#define POWERPC_INSNS_PPC64   POWERPC_INSNS_970FX
4240
#define POWERPC_MSRM_PPC64    POWERPC_MSRM_970FX
4241
#define POWERPC_MMU_PPC64     POWERPC_MMU_970FX
4242
#define POWERPC_EXCP_PPC64    POWERPC_EXCP_970FX
4243
#define POWERPC_INPUT_PPC64   POWERPC_INPUT_970FX
4244
#define init_proc_PPC64       init_proc_970FX
4245
#define POWERPC_BFDM_PPC64    POWERPC_BFDM_970FX
4246

    
4247
/* Default PowerPC target will be PowerPC 32 */
4248
#if defined (TARGET_PPC64) && 0 // XXX: TODO
4249
#define CPU_POWERPC_DEFAULT   CPU_POWERPC_PPC64
4250
#define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC64
4251
#define POWERPC_MSRM_DEFAULT  POWERPC_MSRM_PPC64
4252
#define POWERPC_MMU_DEFAULT   POWERPC_MMU_PPC64
4253
#define POWERPC_EXCP_DEFAULT  POWERPC_EXCP_PPC64
4254
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC64
4255
#define init_proc_DEFAULT     init_proc_PPC64
4256
#define POWERPC_BFDM_DEFAULT  POWERPC_BFDM_PPC64
4257
#else
4258
#define CPU_POWERPC_DEFAULT   CPU_POWERPC_PPC32
4259
#define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC32
4260
#define POWERPC_MSRM_DEFAULT  POWERPC_MSRM_PPC32
4261
#define POWERPC_MMU_DEFAULT   POWERPC_MMU_PPC32
4262
#define POWERPC_EXCP_DEFAULT  POWERPC_EXCP_PPC32
4263
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC32
4264
#define init_proc_DEFAULT     init_proc_PPC32
4265
#define POWERPC_BFDM_DEFAULT  POWERPC_BFDM_PPC32
4266
#endif
4267

    
4268
/*****************************************************************************/
4269
/* PVR definitions for most known PowerPC                                    */
4270
enum {
4271
    /* PowerPC 401 family */
4272
    /* Generic PowerPC 401 */
4273
#define CPU_POWERPC_401       CPU_POWERPC_401G2
4274
    /* PowerPC 401 cores */
4275
    CPU_POWERPC_401A1       = 0x00210000,
4276
    CPU_POWERPC_401B2       = 0x00220000,
4277
#if 0
4278
    CPU_POWERPC_401B3       = xxx,
4279
#endif
4280
    CPU_POWERPC_401C2       = 0x00230000,
4281
    CPU_POWERPC_401D2       = 0x00240000,
4282
    CPU_POWERPC_401E2       = 0x00250000,
4283
    CPU_POWERPC_401F2       = 0x00260000,
4284
    CPU_POWERPC_401G2       = 0x00270000,
4285
    /* PowerPC 401 microcontrolers */
4286
#if 0
4287
    CPU_POWERPC_401GF       = xxx,
4288
#endif
4289
#define CPU_POWERPC_IOP480    CPU_POWERPC_401B2
4290
    /* IBM Processor for Network Resources */
4291
    CPU_POWERPC_COBRA       = 0x10100000, /* XXX: 405 ? */
4292
#if 0
4293
    CPU_POWERPC_XIPCHIP     = xxx,
4294
#endif
4295
    /* PowerPC 403 family */
4296
    /* Generic PowerPC 403 */
4297
#define CPU_POWERPC_403       CPU_POWERPC_403GC
4298
    /* PowerPC 403 microcontrollers */
4299
    CPU_POWERPC_403GA       = 0x00200011,
4300
    CPU_POWERPC_403GB       = 0x00200100,
4301
    CPU_POWERPC_403GC       = 0x00200200,
4302
    CPU_POWERPC_403GCX      = 0x00201400,
4303
#if 0
4304
    CPU_POWERPC_403GP       = xxx,
4305
#endif
4306
    /* PowerPC 405 family */
4307
    /* Generic PowerPC 405 */
4308
#define CPU_POWERPC_405       CPU_POWERPC_405D4
4309
    /* PowerPC 405 cores */
4310
#if 0
4311
    CPU_POWERPC_405A3       = xxx,
4312
#endif
4313
#if 0
4314
    CPU_POWERPC_405A4       = xxx,
4315
#endif
4316
#if 0
4317
    CPU_POWERPC_405B3       = xxx,
4318
#endif
4319
#if 0
4320
    CPU_POWERPC_405B4       = xxx,
4321
#endif
4322
#if 0
4323
    CPU_POWERPC_405C3       = xxx,
4324
#endif
4325
#if 0
4326
    CPU_POWERPC_405C4       = xxx,
4327
#endif
4328
    CPU_POWERPC_405D2       = 0x20010000,
4329
#if 0
4330
    CPU_POWERPC_405D3       = xxx,
4331
#endif
4332
    CPU_POWERPC_405D4       = 0x41810000,
4333
#if 0
4334
    CPU_POWERPC_405D5       = xxx,
4335
#endif
4336
#if 0
4337
    CPU_POWERPC_405E4       = xxx,
4338
#endif
4339
#if 0
4340
    CPU_POWERPC_405F4       = xxx,
4341
#endif
4342
#if 0
4343
    CPU_POWERPC_405F5       = xxx,
4344
#endif
4345
#if 0
4346
    CPU_POWERPC_405F6       = xxx,
4347
#endif
4348
    /* PowerPC 405 microcontrolers */
4349
    /* XXX: missing 0x200108a0 */
4350
#define CPU_POWERPC_405CR     CPU_POWERPC_405CRc
4351
    CPU_POWERPC_405CRa      = 0x40110041,
4352
    CPU_POWERPC_405CRb      = 0x401100C5,
4353
    CPU_POWERPC_405CRc      = 0x40110145,
4354
    CPU_POWERPC_405EP       = 0x51210950,
4355
#if 0
4356
    CPU_POWERPC_405EXr      = xxx,
4357
#endif
4358
    CPU_POWERPC_405EZ       = 0x41511460, /* 0x51210950 ? */
4359
#if 0
4360
    CPU_POWERPC_405FX       = xxx,
4361
#endif
4362
#define CPU_POWERPC_405GP     CPU_POWERPC_405GPd
4363
    CPU_POWERPC_405GPa      = 0x40110000,
4364
    CPU_POWERPC_405GPb      = 0x40110040,
4365
    CPU_POWERPC_405GPc      = 0x40110082,
4366
    CPU_POWERPC_405GPd      = 0x401100C4,
4367
#define CPU_POWERPC_405GPe    CPU_POWERPC_405CRc
4368
    CPU_POWERPC_405GPR      = 0x50910951,
4369
#if 0
4370
    CPU_POWERPC_405H        = xxx,
4371
#endif
4372
#if 0
4373
    CPU_POWERPC_405L        = xxx,
4374
#endif
4375
    CPU_POWERPC_405LP       = 0x41F10000,
4376
#if 0
4377
    CPU_POWERPC_405PM       = xxx,
4378
#endif
4379
#if 0
4380
    CPU_POWERPC_405PS       = xxx,
4381
#endif
4382
#if 0
4383
    CPU_POWERPC_405S        = xxx,
4384
#endif
4385
    /* IBM network processors */
4386
    CPU_POWERPC_NPE405H     = 0x414100C0,
4387
    CPU_POWERPC_NPE405H2    = 0x41410140,
4388
    CPU_POWERPC_NPE405L     = 0x416100C0,
4389
    CPU_POWERPC_NPE4GS3     = 0x40B10000,
4390
#if 0
4391
    CPU_POWERPC_NPCxx1      = xxx,
4392
#endif
4393
#if 0
4394
    CPU_POWERPC_NPR161      = xxx,
4395
#endif
4396
#if 0
4397
    CPU_POWERPC_LC77700     = xxx,
4398
#endif
4399
    /* IBM STBxxx (PowerPC 401/403/405 core based microcontrollers) */
4400
#if 0
4401
    CPU_POWERPC_STB01000    = xxx,
4402
#endif
4403
#if 0
4404
    CPU_POWERPC_STB01010    = xxx,
4405
#endif
4406
#if 0
4407
    CPU_POWERPC_STB0210     = xxx, /* 401B3 */
4408
#endif
4409
    CPU_POWERPC_STB03       = 0x40310000, /* 0x40130000 ? */
4410
#if 0
4411
    CPU_POWERPC_STB043      = xxx,
4412
#endif
4413
#if 0
4414
    CPU_POWERPC_STB045      = xxx,
4415
#endif
4416
    CPU_POWERPC_STB04       = 0x41810000,
4417
    CPU_POWERPC_STB25       = 0x51510950,
4418
#if 0
4419
    CPU_POWERPC_STB130      = xxx,
4420
#endif
4421
    /* Xilinx cores */
4422
    CPU_POWERPC_X2VP4       = 0x20010820,
4423
#define CPU_POWERPC_X2VP7     CPU_POWERPC_X2VP4
4424
    CPU_POWERPC_X2VP20      = 0x20010860,
4425
#define CPU_POWERPC_X2VP50    CPU_POWERPC_X2VP20
4426
#if 0
4427
    CPU_POWERPC_ZL10310     = xxx,
4428
#endif
4429
#if 0
4430
    CPU_POWERPC_ZL10311     = xxx,
4431
#endif
4432
#if 0
4433
    CPU_POWERPC_ZL10320     = xxx,
4434
#endif
4435
#if 0
4436
    CPU_POWERPC_ZL10321     = xxx,
4437
#endif
4438
    /* PowerPC 440 family */
4439
    /* Generic PowerPC 440 */
4440
#define CPU_POWERPC_440       CPU_POWERPC_440GXf
4441
    /* PowerPC 440 cores */
4442
#if 0
4443
    CPU_POWERPC_440A4       = xxx,
4444
#endif
4445
#if 0
4446
    CPU_POWERPC_440A5       = xxx,
4447
#endif
4448
#if 0
4449
    CPU_POWERPC_440B4       = xxx,
4450
#endif
4451
#if 0
4452
    CPU_POWERPC_440F5       = xxx,
4453
#endif
4454
#if 0
4455
    CPU_POWERPC_440G5       = xxx,
4456
#endif
4457
#if 0
4458
    CPU_POWERPC_440H4       = xxx,
4459
#endif
4460
#if 0
4461
    CPU_POWERPC_440H6       = xxx,
4462
#endif
4463
    /* PowerPC 440 microcontrolers */
4464
#define CPU_POWERPC_440EP     CPU_POWERPC_440EPb
4465
    CPU_POWERPC_440EPa      = 0x42221850,
4466
    CPU_POWERPC_440EPb      = 0x422218D3,
4467
#define CPU_POWERPC_440GP     CPU_POWERPC_440GPc
4468
    CPU_POWERPC_440GPb      = 0x40120440,
4469
    CPU_POWERPC_440GPc      = 0x40120481,
4470
#define CPU_POWERPC_440GR     CPU_POWERPC_440GRa
4471
#define CPU_POWERPC_440GRa    CPU_POWERPC_440EPb
4472
    CPU_POWERPC_440GRX      = 0x200008D0,
4473
#define CPU_POWERPC_440EPX    CPU_POWERPC_440GRX
4474
#define CPU_POWERPC_440GX     CPU_POWERPC_440GXf
4475
    CPU_POWERPC_440GXa      = 0x51B21850,
4476
    CPU_POWERPC_440GXb      = 0x51B21851,
4477
    CPU_POWERPC_440GXc      = 0x51B21892,
4478
    CPU_POWERPC_440GXf      = 0x51B21894,
4479
#if 0
4480
    CPU_POWERPC_440S        = xxx,
4481
#endif
4482
    CPU_POWERPC_440SP       = 0x53221850,
4483
    CPU_POWERPC_440SP2      = 0x53221891,
4484
    CPU_POWERPC_440SPE      = 0x53421890,
4485
    /* PowerPC 460 family */
4486
#if 0
4487
    /* Generic PowerPC 464 */
4488
#define CPU_POWERPC_464       CPU_POWERPC_464H90
4489
#endif
4490
    /* PowerPC 464 microcontrolers */
4491
#if 0
4492
    CPU_POWERPC_464H90      = xxx,
4493
#endif
4494
#if 0
4495
    CPU_POWERPC_464H90FP    = xxx,
4496
#endif
4497
    /* Freescale embedded PowerPC cores */
4498
    /* e200 family */
4499
#define CPU_POWERPC_e200      CPU_POWERPC_e200z6
4500
#if 0
4501
    CPU_POWERPC_e200z0      = xxx,
4502
#endif
4503
#if 0
4504
    CPU_POWERPC_e200z3      = xxx,
4505
#endif
4506
    CPU_POWERPC_e200z5      = 0x81000000,
4507
    CPU_POWERPC_e200z6      = 0x81120000,
4508
    /* e300 family */
4509
#define CPU_POWERPC_e300      CPU_POWERPC_e300c3
4510
    CPU_POWERPC_e300c1      = 0x00830000,
4511
    CPU_POWERPC_e300c2      = 0x00840000,
4512
    CPU_POWERPC_e300c3      = 0x00850000,
4513
    /* e500 family */
4514
#define CPU_POWERPC_e500      CPU_POWERPC_e500_v22
4515
    CPU_POWERPC_e500_v11    = 0x80200010,
4516
    CPU_POWERPC_e500_v12    = 0x80200020,
4517
    CPU_POWERPC_e500_v21    = 0x80210010,
4518
    CPU_POWERPC_e500_v22    = 0x80210020,
4519
#if 0
4520
    CPU_POWERPC_e500mc      = xxx,
4521
#endif
4522
    /* e600 family */
4523
    CPU_POWERPC_e600        = 0x80040010,
4524
    /* PowerPC MPC 5xx cores */
4525
    CPU_POWERPC_5xx         = 0x00020020,
4526
    /* PowerPC MPC 8xx cores (aka PowerQUICC) */
4527
    CPU_POWERPC_8xx         = 0x00500000,
4528
    /* PowerPC MPC 8xxx cores (aka PowerQUICC-II) */
4529
    CPU_POWERPC_82xx_HIP3   = 0x00810101,
4530
    CPU_POWERPC_82xx_HIP4   = 0x80811014,
4531
    CPU_POWERPC_827x        = 0x80822013,
4532
    /* PowerPC 6xx cores */
4533
    CPU_POWERPC_601         = 0x00010001,
4534
    CPU_POWERPC_601a        = 0x00010002,
4535
    CPU_POWERPC_602         = 0x00050100,
4536
    CPU_POWERPC_603         = 0x00030100,
4537
#define CPU_POWERPC_603E      CPU_POWERPC_603E_v41
4538
    CPU_POWERPC_603E_v11    = 0x00060101,
4539
    CPU_POWERPC_603E_v12    = 0x00060102,
4540
    CPU_POWERPC_603E_v13    = 0x00060103,
4541
    CPU_POWERPC_603E_v14    = 0x00060104,
4542
    CPU_POWERPC_603E_v22    = 0x00060202,
4543
    CPU_POWERPC_603E_v3     = 0x00060300,
4544
    CPU_POWERPC_603E_v4     = 0x00060400,
4545
    CPU_POWERPC_603E_v41    = 0x00060401,
4546
    CPU_POWERPC_603E7t      = 0x00071201,
4547
    CPU_POWERPC_603E7v      = 0x00070100,
4548
    CPU_POWERPC_603E7v1     = 0x00070101,
4549
    CPU_POWERPC_603E7v2     = 0x00070201,
4550
    CPU_POWERPC_603E7       = 0x00070200,
4551
    CPU_POWERPC_603P        = 0x00070000,
4552
#define CPU_POWERPC_603R      CPU_POWERPC_603E7t
4553
    CPU_POWERPC_G2          = 0x00810011,
4554
#if 0 // Linux pretends the MSB is zero...
4555
    CPU_POWERPC_G2H4        = 0x80811010,
4556
    CPU_POWERPC_G2gp        = 0x80821010,
4557
    CPU_POWERPC_G2ls        = 0x90810010,
4558
    CPU_POWERPC_G2LE        = 0x80820010,
4559
    CPU_POWERPC_G2LEgp      = 0x80822010,
4560
    CPU_POWERPC_G2LEls      = 0xA0822010,
4561
#else
4562
    CPU_POWERPC_G2H4        = 0x00811010,
4563
    CPU_POWERPC_G2gp        = 0x00821010,
4564
    CPU_POWERPC_G2ls        = 0x10810010,
4565
    CPU_POWERPC_G2LE        = 0x00820010,
4566
    CPU_POWERPC_G2LEgp      = 0x00822010,
4567
    CPU_POWERPC_G2LEls      = 0x20822010,
4568
#endif
4569
    CPU_POWERPC_604         = 0x00040103,
4570
#define CPU_POWERPC_604E      CPU_POWERPC_604E_v24
4571
    CPU_POWERPC_604E_v10    = 0x00090100, /* Also 2110 & 2120 */
4572
    CPU_POWERPC_604E_v22    = 0x00090202,
4573
    CPU_POWERPC_604E_v24    = 0x00090204,
4574
    CPU_POWERPC_604R        = 0x000a0101, /* Also 0x00093102 */
4575
#if 0
4576
    CPU_POWERPC_604EV       = xxx,
4577
#endif
4578
    /* PowerPC 740/750 cores (aka G3) */
4579
    /* XXX: missing 0x00084202 */
4580
#define CPU_POWERPC_7x0       CPU_POWERPC_7x0_v31
4581
    CPU_POWERPC_7x0_v20     = 0x00080200,
4582
    CPU_POWERPC_7x0_v21     = 0x00080201,
4583
    CPU_POWERPC_7x0_v22     = 0x00080202,
4584
    CPU_POWERPC_7x0_v30     = 0x00080300,
4585
    CPU_POWERPC_7x0_v31     = 0x00080301,
4586
    CPU_POWERPC_740E        = 0x00080100,
4587
    CPU_POWERPC_7x0P        = 0x10080000,
4588
    /* XXX: missing 0x00087010 (CL ?) */
4589
    CPU_POWERPC_750CL       = 0x00087200,
4590
#define CPU_POWERPC_750CX     CPU_POWERPC_750CX_v22
4591
    CPU_POWERPC_750CX_v21   = 0x00082201,
4592
    CPU_POWERPC_750CX_v22   = 0x00082202,
4593
#define CPU_POWERPC_750CXE    CPU_POWERPC_750CXE_v31b
4594
    CPU_POWERPC_750CXE_v21  = 0x00082211,
4595
    CPU_POWERPC_750CXE_v22  = 0x00082212,
4596
    CPU_POWERPC_750CXE_v23  = 0x00082213,
4597
    CPU_POWERPC_750CXE_v24  = 0x00082214,
4598
    CPU_POWERPC_750CXE_v24b = 0x00083214,
4599
    CPU_POWERPC_750CXE_v31  = 0x00083211,
4600
    CPU_POWERPC_750CXE_v31b = 0x00083311,
4601
    CPU_POWERPC_750CXR      = 0x00083410,
4602
    CPU_POWERPC_750E        = 0x00080200,
4603
    CPU_POWERPC_750FL       = 0x700A0203,
4604
#define CPU_POWERPC_750FX     CPU_POWERPC_750FX_v23
4605
    CPU_POWERPC_750FX_v10   = 0x70000100,
4606
    CPU_POWERPC_750FX_v20   = 0x70000200,
4607
    CPU_POWERPC_750FX_v21   = 0x70000201,
4608
    CPU_POWERPC_750FX_v22   = 0x70000202,
4609
    CPU_POWERPC_750FX_v23   = 0x70000203,
4610
    CPU_POWERPC_750GL       = 0x70020102,
4611
#define CPU_POWERPC_750GX     CPU_POWERPC_750GX_v12
4612
    CPU_POWERPC_750GX_v10   = 0x70020100,
4613
    CPU_POWERPC_750GX_v11   = 0x70020101,
4614
    CPU_POWERPC_750GX_v12   = 0x70020102,
4615
#define CPU_POWERPC_750L      CPU_POWERPC_750L_v32 /* Aka LoneStar */
4616
    CPU_POWERPC_750L_v22    = 0x00088202,
4617
    CPU_POWERPC_750L_v30    = 0x00088300,
4618
    CPU_POWERPC_750L_v32    = 0x00088302,
4619
    /* PowerPC 745/755 cores */
4620
#define CPU_POWERPC_7x5       CPU_POWERPC_7x5_v28
4621
    CPU_POWERPC_7x5_v10     = 0x00083100,
4622
    CPU_POWERPC_7x5_v11     = 0x00083101,
4623
    CPU_POWERPC_7x5_v20     = 0x00083200,
4624
    CPU_POWERPC_7x5_v21     = 0x00083201,
4625
    CPU_POWERPC_7x5_v22     = 0x00083202, /* aka D */
4626
    CPU_POWERPC_7x5_v23     = 0x00083203, /* aka E */
4627
    CPU_POWERPC_7x5_v24     = 0x00083204,
4628
    CPU_POWERPC_7x5_v25     = 0x00083205,
4629
    CPU_POWERPC_7x5_v26     = 0x00083206,
4630
    CPU_POWERPC_7x5_v27     = 0x00083207,
4631
    CPU_POWERPC_7x5_v28     = 0x00083208,
4632
#if 0
4633
    CPU_POWERPC_7x5P        = xxx,
4634
#endif
4635
    /* PowerPC 74xx cores (aka G4) */
4636
    /* XXX: missing 0x000C1101 */
4637
#define CPU_POWERPC_7400      CPU_POWERPC_7400_v29
4638
    CPU_POWERPC_7400_v10    = 0x000C0100,
4639
    CPU_POWERPC_7400_v11    = 0x000C0101,
4640
    CPU_POWERPC_7400_v20    = 0x000C0200,
4641
    CPU_POWERPC_7400_v22    = 0x000C0202,
4642
    CPU_POWERPC_7400_v26    = 0x000C0206,
4643
    CPU_POWERPC_7400_v27    = 0x000C0207,
4644
    CPU_POWERPC_7400_v28    = 0x000C0208,
4645
    CPU_POWERPC_7400_v29    = 0x000C0209,
4646
#define CPU_POWERPC_7410      CPU_POWERPC_7410_v14
4647
    CPU_POWERPC_7410_v10    = 0x800C1100,
4648
    CPU_POWERPC_7410_v11    = 0x800C1101,
4649
    CPU_POWERPC_7410_v12    = 0x800C1102, /* aka C */
4650
    CPU_POWERPC_7410_v13    = 0x800C1103, /* aka D */
4651
    CPU_POWERPC_7410_v14    = 0x800C1104, /* aka E */
4652
#define CPU_POWERPC_7448      CPU_POWERPC_7448_v21
4653
    CPU_POWERPC_7448_v10    = 0x80040100,
4654
    CPU_POWERPC_7448_v11    = 0x80040101,
4655
    CPU_POWERPC_7448_v20    = 0x80040200,
4656
    CPU_POWERPC_7448_v21    = 0x80040201,
4657
#define CPU_POWERPC_7450      CPU_POWERPC_7450_v21
4658
    CPU_POWERPC_7450_v10    = 0x80000100,
4659
    CPU_POWERPC_7450_v11    = 0x80000101,
4660
    CPU_POWERPC_7450_v12    = 0x80000102,
4661
    CPU_POWERPC_7450_v20    = 0x80000200, /* aka D: 2.04 */
4662
    CPU_POWERPC_7450_v21    = 0x80000201, /* aka E */
4663
    CPU_POWERPC_74x1        = 0x80000203,
4664
    CPU_POWERPC_74x1G       = 0x80000210, /* aka G: 2.3 */
4665
    /* XXX: missing 0x80010200 */
4666
#define CPU_POWERPC_74x5      CPU_POWERPC_74x5_v32
4667
    CPU_POWERPC_74x5_v10    = 0x80010100,
4668
    CPU_POWERPC_74x5_v21    = 0x80010201, /* aka C: 2.1 */
4669
    CPU_POWERPC_74x5_v32    = 0x80010302,
4670
    CPU_POWERPC_74x5_v33    = 0x80010303, /* aka F: 3.3 */
4671
    CPU_POWERPC_74x5_v34    = 0x80010304, /* aka G: 3.4 */
4672
#define CPU_POWERPC_74x7      CPU_POWERPC_74x7_v12
4673
    CPU_POWERPC_74x7_v10    = 0x80020100, /* aka A: 1.0 */
4674
    CPU_POWERPC_74x7_v11    = 0x80030101, /* aka B: 1.1 */
4675
    CPU_POWERPC_74x7_v12    = 0x80020102, /* aka C: 1.2 */
4676
    /* 64 bits PowerPC */
4677
#if defined(TARGET_PPC64)
4678
    CPU_POWERPC_620         = 0x00140000,
4679
    CPU_POWERPC_630         = 0x00400000,
4680
    CPU_POWERPC_631         = 0x00410104,
4681
    CPU_POWERPC_POWER4      = 0x00350000,
4682
    CPU_POWERPC_POWER4P     = 0x00380000,
4683
    CPU_POWERPC_POWER5      = 0x003A0203,
4684
#define CPU_POWERPC_POWER5GR  CPU_POWERPC_POWER5
4685
    CPU_POWERPC_POWER5P     = 0x003B0000,
4686
#define CPU_POWERPC_POWER5GS  CPU_POWERPC_POWER5P
4687
    CPU_POWERPC_POWER6      = 0x003E0000,
4688
    CPU_POWERPC_POWER6_5    = 0x0F000001, /* POWER6 running POWER5 mode */
4689
    CPU_POWERPC_POWER6A     = 0x0F000002,
4690
    CPU_POWERPC_970         = 0x00390202,
4691
#define CPU_POWERPC_970FX     CPU_POWERPC_970FX_v31
4692
    CPU_POWERPC_970FX_v10   = 0x00391100,
4693
    CPU_POWERPC_970FX_v20   = 0x003C0200,
4694
    CPU_POWERPC_970FX_v21   = 0x003C0201,
4695
    CPU_POWERPC_970FX_v30   = 0x003C0300,
4696
    CPU_POWERPC_970FX_v31   = 0x003C0301,
4697
    CPU_POWERPC_970GX       = 0x00450000,
4698
#define CPU_POWERPC_970MP     CPU_POWERPC_970MP_v11
4699
    CPU_POWERPC_970MP_v10   = 0x00440100,
4700
    CPU_POWERPC_970MP_v11   = 0x00440101,
4701
#define CPU_POWERPC_CELL      CPU_POWERPC_CELL_v32
4702
    CPU_POWERPC_CELL_v10    = 0x00700100,
4703
    CPU_POWERPC_CELL_v20    = 0x00700400,
4704
    CPU_POWERPC_CELL_v30    = 0x00700500,
4705
    CPU_POWERPC_CELL_v31    = 0x00700501,
4706
#define CPU_POWERPC_CELL_v32  CPU_POWERPC_CELL_v31
4707
    CPU_POWERPC_RS64        = 0x00330000,
4708
    CPU_POWERPC_RS64II      = 0x00340000,
4709
    CPU_POWERPC_RS64III     = 0x00360000,
4710
    CPU_POWERPC_RS64IV      = 0x00370000,
4711
#endif /* defined(TARGET_PPC64) */
4712
    /* Original POWER */
4713
    /* XXX: should be POWER (RIOS), RSC3308, RSC4608,
4714
     * POWER2 (RIOS2) & RSC2 (P2SC) here
4715
     */
4716
#if 0
4717
    CPU_POWER           = xxx, /* 0x20000 ? 0x30000 for RSC ? */
4718
#endif
4719
#if 0
4720
    CPU_POWER2          = xxx, /* 0x40000 ? */
4721
#endif
4722
    /* PA Semi core */
4723
    CPU_POWERPC_PA6T        = 0x00900000,
4724
};
4725

    
4726
/* System version register (used on MPC 8xxx)                                */
4727
enum {
4728
    PPC_SVR_8540      = 0x80300000,
4729
    PPC_SVR_8541E     = 0x807A0010,
4730
    PPC_SVR_8543v10   = 0x80320010,
4731
    PPC_SVR_8543v11   = 0x80320011,
4732
    PPC_SVR_8543v20   = 0x80320020,
4733
    PPC_SVR_8543Ev10  = 0x803A0010,
4734
    PPC_SVR_8543Ev11  = 0x803A0011,
4735
    PPC_SVR_8543Ev20  = 0x803A0020,
4736
    PPC_SVR_8545      = 0x80310220,
4737
    PPC_SVR_8545E     = 0x80390220,
4738
    PPC_SVR_8547E     = 0x80390120,
4739
    PPC_SCR_8548v10   = 0x80310010,
4740
    PPC_SCR_8548v11   = 0x80310011,
4741
    PPC_SCR_8548v20   = 0x80310020,
4742
    PPC_SVR_8548Ev10  = 0x80390010,
4743
    PPC_SVR_8548Ev11  = 0x80390011,
4744
    PPC_SVR_8548Ev20  = 0x80390020,
4745
    PPC_SVR_8555E     = 0x80790010,
4746
    PPC_SVR_8560v10   = 0x80700010,
4747
    PPC_SVR_8560v20   = 0x80700020,
4748
};
4749

    
4750
/*****************************************************************************/
4751
/* PowerPC CPU definitions                                                   */
4752
#define POWERPC_DEF(_name, _pvr, _pvr_mask, _type)                            \
4753
    {                                                                         \
4754
        .name        = _name,                                                 \
4755
        .pvr         = _pvr,                                                  \
4756
        .pvr_mask    = _pvr_mask,                                             \
4757
        .insns_flags = glue(POWERPC_INSNS_,_type),                            \
4758
        .msr_mask    = glue(POWERPC_MSRM_,_type),                             \
4759
        .mmu_model   = glue(POWERPC_MMU_,_type),                              \
4760
        .excp_model  = glue(POWERPC_EXCP_,_type),                             \
4761
        .bus_model   = glue(POWERPC_INPUT_,_type),                            \
4762
        .bfd_mach    = glue(POWERPC_BFDM_,_type),                             \
4763
        .init_proc   = &glue(init_proc_,_type),                               \
4764
    }
4765

    
4766
static ppc_def_t ppc_defs[] = {
4767
    /* Embedded PowerPC                                                      */
4768
    /* PowerPC 401 family                                                    */
4769
    /* Generic PowerPC 401 */
4770
    POWERPC_DEF("401",         CPU_POWERPC_401,         0xFFFF0000, 401),
4771
    /* PowerPC 401 cores                                                     */
4772
    /* PowerPC 401A1 */
4773
    POWERPC_DEF("401A1",       CPU_POWERPC_401A1,       0xFFFFFFFF, 401),
4774
    /* PowerPC 401B2                                                         */
4775
    POWERPC_DEF("401B2",       CPU_POWERPC_401B2,       0xFFFFFFFF, 401x2),
4776
#if defined (TODO)
4777
    /* PowerPC 401B3                                                         */
4778
    POWERPC_DEF("401B3",       CPU_POWERPC_401B3,       0xFFFFFFFF, 401x3),
4779
#endif
4780
    /* PowerPC 401C2                                                         */
4781
    POWERPC_DEF("401C2",       CPU_POWERPC_401C2,       0xFFFFFFFF, 401x2),
4782
    /* PowerPC 401D2                                                         */
4783
    POWERPC_DEF("401D2",       CPU_POWERPC_401D2,       0xFFFFFFFF, 401x2),
4784
    /* PowerPC 401E2                                                         */
4785
    POWERPC_DEF("401E2",       CPU_POWERPC_401E2,       0xFFFFFFFF, 401x2),
4786
    /* PowerPC 401F2                                                         */
4787
    POWERPC_DEF("401F2",       CPU_POWERPC_401F2,       0xFFFFFFFF, 401x2),
4788
    /* PowerPC 401G2                                                         */
4789
    /* XXX: to be checked */
4790
    POWERPC_DEF("401G2",       CPU_POWERPC_401G2,       0xFFFFFFFF, 401x2),
4791
    /* PowerPC 401 microcontrolers                                           */
4792
#if defined (TODO)
4793
    /* PowerPC 401GF                                                         */
4794
    POWERPC_DEF("401GF",       CPU_POWERPC_401GF,       0xFFFFFFFF, 401),
4795
#endif
4796
    /* IOP480 (401 microcontroler)                                           */
4797
    POWERPC_DEF("IOP480",      CPU_POWERPC_IOP480,      0xFFFFFFFF, IOP480),
4798
    /* IBM Processor for Network Resources                                   */
4799
    POWERPC_DEF("Cobra",       CPU_POWERPC_COBRA,       0xFFFFFFFF, 401),
4800
#if defined (TODO)
4801
    POWERPC_DEF("Xipchip",     CPU_POWERPC_XIPCHIP,     0xFFFFFFFF, 401),
4802
#endif
4803
    /* PowerPC 403 family                                                    */
4804
    /* Generic PowerPC 403                                                   */
4805
    POWERPC_DEF("403",         CPU_POWERPC_403,         0xFFFF0000, 403),
4806
    /* PowerPC 403 microcontrolers                                           */
4807
    /* PowerPC 403 GA                                                        */
4808
    POWERPC_DEF("403GA",       CPU_POWERPC_403GA,       0xFFFFFFFF, 403),
4809
    /* PowerPC 403 GB                                                        */
4810
    POWERPC_DEF("403GB",       CPU_POWERPC_403GB,       0xFFFFFFFF, 403),
4811
    /* PowerPC 403 GC                                                        */
4812
    POWERPC_DEF("403GC",       CPU_POWERPC_403GC,       0xFFFFFFFF, 403),
4813
    /* PowerPC 403 GCX                                                       */
4814
    POWERPC_DEF("403GCX",      CPU_POWERPC_403GCX,      0xFFFFFFFF, 403GCX),
4815
#if defined (TODO)
4816
    /* PowerPC 403 GP                                                        */
4817
    POWERPC_DEF("403GP",       CPU_POWERPC_403GP,       0xFFFFFFFF, 403),
4818
#endif
4819
    /* PowerPC 405 family                                                    */
4820
    /* Generic PowerPC 405                                                   */
4821
    POWERPC_DEF("405",         CPU_POWERPC_405,         0xFFFF0000, 405),
4822
    /* PowerPC 405 cores                                                     */
4823
#if defined (TODO)
4824
    /* PowerPC 405 A3                                                        */
4825
    POWERPC_DEF("405A3",       CPU_POWERPC_405A3,       0xFFFFFFFF, 405),
4826
#endif
4827
#if defined (TODO)
4828
    /* PowerPC 405 A4                                                        */
4829
    POWERPC_DEF("405A4",       CPU_POWERPC_405A4,       0xFFFFFFFF, 405),
4830
#endif
4831
#if defined (TODO)
4832
    /* PowerPC 405 B3                                                        */
4833
    POWERPC_DEF("405B3",       CPU_POWERPC_405B3,       0xFFFFFFFF, 405),
4834
#endif
4835
#if defined (TODO)
4836
    /* PowerPC 405 B4                                                        */
4837
    POWERPC_DEF("405B4",       CPU_POWERPC_405B4,       0xFFFFFFFF, 405),
4838
#endif
4839
#if defined (TODO)
4840
    /* PowerPC 405 C3                                                        */
4841
    POWERPC_DEF("405C3",       CPU_POWERPC_405C3,       0xFFFFFFFF, 405),
4842
#endif
4843
#if defined (TODO)
4844
    /* PowerPC 405 C4                                                        */
4845
    POWERPC_DEF("405C4",       CPU_POWERPC_405C4,       0xFFFFFFFF, 405),
4846
#endif
4847
    /* PowerPC 405 D2                                                        */
4848
    POWERPC_DEF("405D2",       CPU_POWERPC_405D2,       0xFFFFFFFF, 405),
4849
#if defined (TODO)
4850
    /* PowerPC 405 D3                                                        */
4851
    POWERPC_DEF("405D3",       CPU_POWERPC_405D3,       0xFFFFFFFF, 405),
4852
#endif
4853
    /* PowerPC 405 D4                                                        */
4854
    POWERPC_DEF("405D4",       CPU_POWERPC_405D4,       0xFFFFFFFF, 405),
4855
#if defined (TODO)
4856
    /* PowerPC 405 D5                                                        */
4857
    POWERPC_DEF("405D5",       CPU_POWERPC_405D5,       0xFFFFFFFF, 405),
4858
#endif
4859
#if defined (TODO)
4860
    /* PowerPC 405 E4                                                        */
4861
    POWERPC_DEF("405E4",       CPU_POWERPC_405E4,       0xFFFFFFFF, 405),
4862
#endif
4863
#if defined (TODO)
4864
    /* PowerPC 405 F4                                                        */
4865
    POWERPC_DEF("405F4",       CPU_POWERPC_405F4,       0xFFFFFFFF, 405),
4866
#endif
4867
#if defined (TODO)
4868
    /* PowerPC 405 F5                                                        */
4869
    POWERPC_DEF("405F5",       CPU_POWERPC_405F5,       0xFFFFFFFF, 405),
4870
#endif
4871
#if defined (TODO)
4872
    /* PowerPC 405 F6                                                        */
4873
    POWERPC_DEF("405F6",       CPU_POWERPC_405F6,       0xFFFFFFFF, 405),
4874
#endif
4875
    /* PowerPC 405 microcontrolers                                           */
4876
    /* PowerPC 405 CR                                                        */
4877
    POWERPC_DEF("405CR",       CPU_POWERPC_405CR,       0xFFFFFFFF, 405),
4878
    /* PowerPC 405 CRa                                                       */
4879
    POWERPC_DEF("405CRa",      CPU_POWERPC_405CRa,      0xFFFFFFFF, 405),
4880
    /* PowerPC 405 CRb                                                       */
4881
    POWERPC_DEF("405CRb",      CPU_POWERPC_405CRb,      0xFFFFFFFF, 405),
4882
    /* PowerPC 405 CRc                                                       */
4883
    POWERPC_DEF("405CRc",      CPU_POWERPC_405CRc,      0xFFFFFFFF, 405),
4884
    /* PowerPC 405 EP                                                        */
4885
    POWERPC_DEF("405EP",       CPU_POWERPC_405EP,       0xFFFFFFFF, 405),
4886
#if defined(TODO)
4887
    /* PowerPC 405 EXr                                                       */
4888
    POWERPC_DEF("405EXr",      CPU_POWERPC_405EXr,      0xFFFFFFFF, 405),
4889
#endif
4890
    /* PowerPC 405 EZ                                                        */
4891
    POWERPC_DEF("405EZ",       CPU_POWERPC_405EZ,       0xFFFFFFFF, 405),
4892
#if defined(TODO)
4893
    /* PowerPC 405 FX                                                        */
4894
    POWERPC_DEF("405FX",       CPU_POWERPC_405FX,       0xFFFFFFFF, 405),
4895
#endif
4896
    /* PowerPC 405 GP                                                        */
4897
    POWERPC_DEF("405GP",       CPU_POWERPC_405GP,       0xFFFFFFFF, 405),
4898
    /* PowerPC 405 GPa                                                       */
4899
    POWERPC_DEF("405GPa",      CPU_POWERPC_405GPa,      0xFFFFFFFF, 405),
4900
    /* PowerPC 405 GPb                                                       */
4901
    POWERPC_DEF("405GPb",      CPU_POWERPC_405GPb,      0xFFFFFFFF, 405),
4902
    /* PowerPC 405 GPc                                                       */
4903
    POWERPC_DEF("405GPc",      CPU_POWERPC_405GPc,      0xFFFFFFFF, 405),
4904
    /* PowerPC 405 GPd                                                       */
4905
    POWERPC_DEF("405GPd",      CPU_POWERPC_405GPd,      0xFFFFFFFF, 405),
4906
    /* PowerPC 405 GPe                                                       */
4907
    POWERPC_DEF("405GPe",      CPU_POWERPC_405GPe,      0xFFFFFFFF, 405),
4908
    /* PowerPC 405 GPR                                                       */
4909
    POWERPC_DEF("405GPR",      CPU_POWERPC_405GPR,      0xFFFFFFFF, 405),
4910
#if defined(TODO)
4911
    /* PowerPC 405 H                                                         */
4912
    POWERPC_DEF("405H",        CPU_POWERPC_405H,        0xFFFFFFFF, 405),
4913
#endif
4914
#if defined(TODO)
4915
    /* PowerPC 405 L                                                         */
4916
    POWERPC_DEF("405L",        CPU_POWERPC_405L,        0xFFFFFFFF, 405),
4917
#endif
4918
    /* PowerPC 405 LP                                                        */
4919
    POWERPC_DEF("405LP",       CPU_POWERPC_405LP,       0xFFFFFFFF, 405),
4920
#if defined(TODO)
4921
    /* PowerPC 405 PM                                                        */
4922
    POWERPC_DEF("405PM",       CPU_POWERPC_405PM,       0xFFFFFFFF, 405),
4923
#endif
4924
#if defined(TODO)
4925
    /* PowerPC 405 PS                                                        */
4926
    POWERPC_DEF("405PS",       CPU_POWERPC_405PS,       0xFFFFFFFF, 405),
4927
#endif
4928
#if defined(TODO)
4929
    /* PowerPC 405 S                                                         */
4930
    POWERPC_DEF("405S",        CPU_POWERPC_405S,        0xFFFFFFFF, 405),
4931
#endif
4932
    /* Npe405 H                                                              */
4933
    POWERPC_DEF("Npe405H",     CPU_POWERPC_NPE405H,     0xFFFFFFFF, 405),
4934
    /* Npe405 H2                                                             */
4935
    POWERPC_DEF("Npe405H2",    CPU_POWERPC_NPE405H2,    0xFFFFFFFF, 405),
4936
    /* Npe405 L                                                              */
4937
    POWERPC_DEF("Npe405L",     CPU_POWERPC_NPE405L,     0xFFFFFFFF, 405),
4938
    /* Npe4GS3                                                               */
4939
    POWERPC_DEF("Npe4GS3",     CPU_POWERPC_NPE4GS3,     0xFFFFFFFF, 405),
4940
#if defined (TODO)
4941
    POWERPC_DEF("Npcxx1",      CPU_POWERPC_NPCxx1,      0xFFFFFFFF, 405),
4942
#endif
4943
#if defined (TODO)
4944
    POWERPC_DEF("Npr161",      CPU_POWERPC_NPR161,      0xFFFFFFFF, 405),
4945
#endif
4946
#if defined (TODO)
4947
    /* PowerPC LC77700 (Sanyo)                                               */
4948
    POWERPC_DEF("LC77700",     CPU_POWERPC_LC77700,     0xFFFFFFFF, 405),
4949
#endif
4950
    /* PowerPC 401/403/405 based set-top-box microcontrolers                 */
4951
#if defined (TODO)
4952
    /* STB010000                                                             */
4953
    POWERPC_DEF("STB01000",    CPU_POWERPC_STB01000,    0xFFFFFFFF, 401x2),
4954
#endif
4955
#if defined (TODO)
4956
    /* STB01010                                                              */
4957
    POWERPC_DEF("STB01010",    CPU_POWERPC_STB01010,    0xFFFFFFFF, 401x2),
4958
#endif
4959
#if defined (TODO)
4960
    /* STB0210                                                               */
4961
    POWERPC_DEF("STB0210",     CPU_POWERPC_STB0210,     0xFFFFFFFF, 401x3),
4962
#endif
4963
    /* STB03xx                                                               */
4964
    POWERPC_DEF("STB03",       CPU_POWERPC_STB03,       0xFFFFFFFF, 405),
4965
#if defined (TODO)
4966
    /* STB043x                                                               */
4967
    POWERPC_DEF("STB043",      CPU_POWERPC_STB043,      0xFFFFFFFF, 405),
4968
#endif
4969
#if defined (TODO)
4970
    /* STB045x                                                               */
4971
    POWERPC_DEF("STB045",      CPU_POWERPC_STB045,      0xFFFFFFFF, 405),
4972
#endif
4973
    /* STB04xx                                                               */
4974
    POWERPC_DEF("STB04",       CPU_POWERPC_STB04,       0xFFFF0000, 405),
4975
    /* STB25xx                                                               */
4976
    POWERPC_DEF("STB25",       CPU_POWERPC_STB25,       0xFFFFFFFF, 405),
4977
#if defined (TODO)
4978
    /* STB130                                                                */
4979
    POWERPC_DEF("STB130",      CPU_POWERPC_STB130,      0xFFFFFFFF, 405),
4980
#endif
4981
    /* Xilinx PowerPC 405 cores                                              */
4982
    POWERPC_DEF("x2vp4",       CPU_POWERPC_X2VP4,       0xFFFFFFFF, 405),
4983
    POWERPC_DEF("x2vp7",       CPU_POWERPC_X2VP7,       0xFFFFFFFF, 405),
4984
    POWERPC_DEF("x2vp20",      CPU_POWERPC_X2VP20,      0xFFFFFFFF, 405),
4985
    POWERPC_DEF("x2vp50",      CPU_POWERPC_X2VP50,      0xFFFFFFFF, 405),
4986
#if defined (TODO)
4987
    /* Zarlink ZL10310                                                       */
4988
    POWERPC_DEF("zl10310",     CPU_POWERPC_ZL10310,     0xFFFFFFFF, 405),
4989
#endif
4990
#if defined (TODO)
4991
    /* Zarlink ZL10311                                                       */
4992
    POWERPC_DEF("zl10311",     CPU_POWERPC_ZL10311,     0xFFFFFFFF, 405),
4993
#endif
4994
#if defined (TODO)
4995
    /* Zarlink ZL10320                                                       */
4996
    POWERPC_DEF("zl10320",     CPU_POWERPC_ZL10320,     0xFFFFFFFF, 405),
4997
#endif
4998
#if defined (TODO)
4999
    /* Zarlink ZL10321                                                       */
5000
    POWERPC_DEF("zl10321",     CPU_POWERPC_ZL10321,     0xFFFFFFFF, 405),
5001
#endif
5002
    /* PowerPC 440 family                                                    */
5003
    /* Generic PowerPC 440                                                   */
5004
    POWERPC_DEF("440",         CPU_POWERPC_440,         0xFFFFFFFF, 440GP),
5005
    /* PowerPC 440 cores                                                     */
5006
#if defined (TODO)
5007
    /* PowerPC 440 A4                                                        */
5008
    POWERPC_DEF("440A4",       CPU_POWERPC_440A4,       0xFFFFFFFF, 440x4),
5009
#endif
5010
#if defined (TODO)
5011
    /* PowerPC 440 A5                                                        */
5012
    POWERPC_DEF("440A5",       CPU_POWERPC_440A5,       0xFFFFFFFF, 440x5),
5013
#endif
5014
#if defined (TODO)
5015
    /* PowerPC 440 B4                                                        */
5016
    POWERPC_DEF("440B4",       CPU_POWERPC_440B4,       0xFFFFFFFF, 440x4),
5017
#endif
5018
#if defined (TODO)
5019
    /* PowerPC 440 G4                                                        */
5020
    POWERPC_DEF("440G4",       CPU_POWERPC_440G4,       0xFFFFFFFF, 440x4),
5021
#endif
5022
#if defined (TODO)
5023
    /* PowerPC 440 F5                                                        */
5024
    POWERPC_DEF("440F5",       CPU_POWERPC_440F5,       0xFFFFFFFF, 440x5),
5025
#endif
5026
#if defined (TODO)
5027
    /* PowerPC 440 G5                                                        */
5028
    POWERPC_DEF("440G5",       CPU_POWERPC_440G5,       0xFFFFFFFF, 440x5),
5029
#endif
5030
#if defined (TODO)
5031
    /* PowerPC 440H4                                                         */
5032
    POWERPC_DEF("440H4",       CPU_POWERPC_440H4,       0xFFFFFFFF, 440x4),
5033
#endif
5034
#if defined (TODO)
5035
    /* PowerPC 440H6                                                         */
5036
    POWERPC_DEF("440H6",       CPU_POWERPC_440H6,       0xFFFFFFFF, 440Gx5),
5037
#endif
5038
    /* PowerPC 440 microcontrolers                                           */
5039
    /* PowerPC 440 EP                                                        */
5040
    POWERPC_DEF("440EP",       CPU_POWERPC_440EP,       0xFFFFFFFF, 440EP),
5041
    /* PowerPC 440 EPa                                                       */
5042
    POWERPC_DEF("440EPa",      CPU_POWERPC_440EPa,      0xFFFFFFFF, 440EP),
5043
    /* PowerPC 440 EPb                                                       */
5044
    POWERPC_DEF("440EPb",      CPU_POWERPC_440EPb,      0xFFFFFFFF, 440EP),
5045
    /* PowerPC 440 EPX                                                       */
5046
    POWERPC_DEF("440EPX",      CPU_POWERPC_440EPX,      0xFFFFFFFF, 440EP),
5047
    /* PowerPC 440 GP                                                        */
5048
    POWERPC_DEF("440GP",       CPU_POWERPC_440GP,       0xFFFFFFFF, 440GP),
5049
    /* PowerPC 440 GPb                                                       */
5050
    POWERPC_DEF("440GPb",      CPU_POWERPC_440GPb,      0xFFFFFFFF, 440GP),
5051
    /* PowerPC 440 GPc                                                       */
5052
    POWERPC_DEF("440GPc",      CPU_POWERPC_440GPc,      0xFFFFFFFF, 440GP),
5053
    /* PowerPC 440 GR                                                        */
5054
    POWERPC_DEF("440GR",       CPU_POWERPC_440GR,       0xFFFFFFFF, 440x5),
5055
    /* PowerPC 440 GRa                                                       */
5056
    POWERPC_DEF("440GRa",      CPU_POWERPC_440GRa,      0xFFFFFFFF, 440x5),
5057
    /* PowerPC 440 GRX                                                       */
5058
    POWERPC_DEF("440GRX",      CPU_POWERPC_440GRX,      0xFFFFFFFF, 440x5),
5059
    /* PowerPC 440 GX                                                        */
5060
    POWERPC_DEF("440GX",       CPU_POWERPC_440GX,       0xFFFFFFFF, 440EP),
5061
    /* PowerPC 440 GXa                                                       */
5062
    POWERPC_DEF("440GXa",      CPU_POWERPC_440GXa,      0xFFFFFFFF, 440EP),
5063
    /* PowerPC 440 GXb                                                       */
5064
    POWERPC_DEF("440GXb",      CPU_POWERPC_440GXb,      0xFFFFFFFF, 440EP),
5065
    /* PowerPC 440 GXc                                                       */
5066
    POWERPC_DEF("440GXc",      CPU_POWERPC_440GXc,      0xFFFFFFFF, 440EP),
5067
    /* PowerPC 440 GXf                                                       */
5068
    POWERPC_DEF("440GXf",      CPU_POWERPC_440GXf,      0xFFFFFFFF, 440EP),
5069
#if defined(TODO)
5070
    /* PowerPC 440 S                                                         */
5071
    POWERPC_DEF("440S",        CPU_POWERPC_440S,        0xFFFFFFFF, 440),
5072
#endif
5073
    /* PowerPC 440 SP                                                        */
5074
    POWERPC_DEF("440SP",       CPU_POWERPC_440SP,       0xFFFFFFFF, 440EP),
5075
    /* PowerPC 440 SP2                                                       */
5076
    POWERPC_DEF("440SP2",      CPU_POWERPC_440SP2,      0xFFFFFFFF, 440EP),
5077
    /* PowerPC 440 SPE                                                       */
5078
    POWERPC_DEF("440SPE",      CPU_POWERPC_440SPE,      0xFFFFFFFF, 440EP),
5079
    /* PowerPC 460 family                                                    */
5080
#if defined (TODO)
5081
    /* Generic PowerPC 464                                                   */
5082
    POWERPC_DEF("464",         CPU_POWERPC_464,         0xFFFFFFFF, 460),
5083
#endif
5084
    /* PowerPC 464 microcontrolers                                           */
5085
#if defined (TODO)
5086
    /* PowerPC 464H90                                                        */
5087
    POWERPC_DEF("464H90",      CPU_POWERPC_464H90,      0xFFFFFFFF, 460),
5088
#endif
5089
#if defined (TODO)
5090
    /* PowerPC 464H90F                                                       */
5091
    POWERPC_DEF("464H90F",     CPU_POWERPC_464H90F,     0xFFFFFFFF, 460F),
5092
#endif
5093
    /* Freescale embedded PowerPC cores                                      */
5094
    /* e200 family                                                           */
5095
#if defined (TODO)
5096
    /* Generic PowerPC e200 core                                             */
5097
    POWERPC_DEF("e200",        CPU_POWERPC_e200,        0xFFFFFFFF, e200),
5098
#endif
5099
#if defined (TODO)
5100
    /* PowerPC e200z5 core                                                   */
5101
    POWERPC_DEF("e200z5",      CPU_POWERPC_e200z5,      0xFFFFFFFF, e200),
5102
#endif
5103
#if defined (TODO)
5104
    /* PowerPC e200z6 core                                                   */
5105
    POWERPC_DEF("e200z6",      CPU_POWERPC_e200z6,      0xFFFFFFFF, e200),
5106
#endif
5107
    /* e300 family                                                           */
5108
#if defined (TODO)
5109
    /* Generic PowerPC e300 core                                             */
5110
    POWERPC_DEF("e300",        CPU_POWERPC_e300,        0xFFFFFFFF, e300),
5111
#endif
5112
#if defined (TODO)
5113
    /* PowerPC e300c1 core                                                   */
5114
    POWERPC_DEF("e300c1",      CPU_POWERPC_e300c1,      0xFFFFFFFF, e300),
5115
#endif
5116
#if defined (TODO)
5117
    /* PowerPC e300c2 core                                                   */
5118
    POWERPC_DEF("e300c2",      CPU_POWERPC_e300c2,      0xFFFFFFFF, e300),
5119
#endif
5120
#if defined (TODO)
5121
    /* PowerPC e300c3 core                                                   */
5122
    POWERPC_DEF("e300c3",      CPU_POWERPC_e300c3,      0xFFFFFFFF, e300),
5123
#endif
5124
    /* e500 family                                                           */
5125
#if defined (TODO)
5126
    /* PowerPC e500 core                                                     */
5127
    POWERPC_DEF("e500",        CPU_POWERPC_e500,        0xFFFFFFFF, e500),
5128
#endif
5129
#if defined (TODO)
5130
    /* PowerPC e500 v1.1 core                                                */
5131
    POWERPC_DEF("e500v1.1",    CPU_POWERPC_e500_v11,    0xFFFFFFFF, e500),
5132
#endif
5133
#if defined (TODO)
5134
    /* PowerPC e500 v1.2 core                                                */
5135
    POWERPC_DEF("e500v1.2",    CPU_POWERPC_e500_v12,    0xFFFFFFFF, e500),
5136
#endif
5137
#if defined (TODO)
5138
    /* PowerPC e500 v2.1 core                                                */
5139
    POWERPC_DEF("e500v2.1",    CPU_POWERPC_e500_v21,    0xFFFFFFFF, e500),
5140
#endif
5141
#if defined (TODO)
5142
    /* PowerPC e500 v2.2 core                                                */
5143
    POWERPC_DEF("e500v2.2",    CPU_POWERPC_e500_v22,    0xFFFFFFFF, e500),
5144
#endif
5145
    /* e600 family                                                           */
5146
#if defined (TODO)
5147
    /* PowerPC e600 core                                                     */
5148
    POWERPC_DEF("e600",        CPU_POWERPC_e600,        0xFFFFFFFF, e600),
5149
#endif
5150
    /* PowerPC MPC 5xx cores                                                 */
5151
#if defined (TODO)
5152
    /* PowerPC MPC 5xx                                                       */
5153
    POWERPC_DEF("mpc5xx",      CPU_POWERPC_5xx,         0xFFFFFFFF, 5xx),
5154
#endif
5155
    /* PowerPC MPC 8xx cores                                                 */
5156
#if defined (TODO)
5157
    /* PowerPC MPC 8xx                                                       */
5158
    POWERPC_DEF("mpc8xx",      CPU_POWERPC_8xx,         0xFFFFFFFF, 8xx),
5159
#endif
5160
    /* PowerPC MPC 8xxx cores                                                */
5161
#if defined (TODO)
5162
    /* PowerPC MPC 82xx HIP3                                                 */
5163
    POWERPC_DEF("mpc82xxhip3", CPU_POWERPC_82xx_HIP3,   0xFFFFFFFF, 82xx),
5164
#endif
5165
#if defined (TODO)
5166
    /* PowerPC MPC 82xx HIP4                                                 */
5167
    POWERPC_DEF("mpc82xxhip4", CPU_POWERPC_82xx_HIP4,   0xFFFFFFFF, 82xx),
5168
#endif
5169
#if defined (TODO)
5170
    /* PowerPC MPC 827x                                                      */
5171
    POWERPC_DEF("mpc827x",     CPU_POWERPC_827x,        0xFFFFFFFF, 827x),
5172
#endif
5173

    
5174
    /* 32 bits "classic" PowerPC                                             */
5175
    /* PowerPC 6xx family                                                    */
5176
    /* PowerPC 601                                                           */
5177
    POWERPC_DEF("601",         CPU_POWERPC_601,         0xFFFFFFFF, 601),
5178
    /* PowerPC 601v2                                                         */
5179
    POWERPC_DEF("601a",        CPU_POWERPC_601a,        0xFFFFFFFF, 601),
5180
    /* PowerPC 602                                                           */
5181
    POWERPC_DEF("602",         CPU_POWERPC_602,         0xFFFFFFFF, 602),
5182
    /* PowerPC 603                                                           */
5183
    POWERPC_DEF("603",         CPU_POWERPC_603,         0xFFFFFFFF, 603),
5184
    /* Code name for PowerPC 603                                             */
5185
    POWERPC_DEF("Vanilla",     CPU_POWERPC_603,         0xFFFFFFFF, 603),
5186
    /* PowerPC 603e                                                          */
5187
    POWERPC_DEF("603e",        CPU_POWERPC_603E,        0xFFFFFFFF, 603E),
5188
    /* Code name for PowerPC 603e                                            */
5189
    POWERPC_DEF("Stretch",     CPU_POWERPC_603E,        0xFFFFFFFF, 603E),
5190
    /* PowerPC 603e v1.1                                                     */
5191
    POWERPC_DEF("603e1.1",     CPU_POWERPC_603E_v11,    0xFFFFFFFF, 603E),
5192
    /* PowerPC 603e v1.2                                                     */
5193
    POWERPC_DEF("603e1.2",     CPU_POWERPC_603E_v12,    0xFFFFFFFF, 603E),
5194
    /* PowerPC 603e v1.3                                                     */
5195
    POWERPC_DEF("603e1.3",     CPU_POWERPC_603E_v13,    0xFFFFFFFF, 603E),
5196
    /* PowerPC 603e v1.4                                                     */
5197
    POWERPC_DEF("603e1.4",     CPU_POWERPC_603E_v14,    0xFFFFFFFF, 603E),
5198
    /* PowerPC 603e v2.2                                                     */
5199
    POWERPC_DEF("603e2.2",     CPU_POWERPC_603E_v22,    0xFFFFFFFF, 603E),
5200
    /* PowerPC 603e v3                                                       */
5201
    POWERPC_DEF("603e3",       CPU_POWERPC_603E_v3,     0xFFFFFFFF, 603E),
5202
    /* PowerPC 603e v4                                                       */
5203
    POWERPC_DEF("603e4",       CPU_POWERPC_603E_v4,     0xFFFFFFFF, 603E),
5204
    /* PowerPC 603e v4.1                                                     */
5205
    POWERPC_DEF("603e4.1",     CPU_POWERPC_603E_v41,    0xFFFFFFFF, 603E),
5206
    /* PowerPC 603e                                                          */
5207
    POWERPC_DEF("603e7",       CPU_POWERPC_603E7,       0xFFFFFFFF, 603E),
5208
    /* PowerPC 603e7t                                                        */
5209
    POWERPC_DEF("603e7t",      CPU_POWERPC_603E7t,      0xFFFFFFFF, 603E),
5210
    /* PowerPC 603e7v                                                        */
5211
    POWERPC_DEF("603e7v",      CPU_POWERPC_603E7v,      0xFFFFFFFF, 603E),
5212
    /* Code name for PowerPC 603ev                                           */
5213
    POWERPC_DEF("Vaillant",    CPU_POWERPC_603E7v,      0xFFFFFFFF, 603E),
5214
    /* PowerPC 603e7v1                                                       */
5215
    POWERPC_DEF("603e7v1",     CPU_POWERPC_603E7v1,     0xFFFFFFFF, 603E),
5216
    /* PowerPC 603e7v2                                                       */
5217
    POWERPC_DEF("603e7v2",     CPU_POWERPC_603E7v2,     0xFFFFFFFF, 603E),
5218
    /* PowerPC 603p                                                          */
5219
    /* to be checked */
5220
    POWERPC_DEF("603p",        CPU_POWERPC_603P,        0xFFFFFFFF, 603),
5221
    /* PowerPC 603r                                                          */
5222
    POWERPC_DEF("603r",        CPU_POWERPC_603R,        0xFFFFFFFF, 603E),
5223
    /* Code name for PowerPC 603r                                            */
5224
    POWERPC_DEF("Goldeneye",   CPU_POWERPC_603R,        0xFFFFFFFF, 603E),
5225
    /* PowerPC G2 core                                                       */
5226
    POWERPC_DEF("G2",          CPU_POWERPC_G2,          0xFFFFFFFF, G2),
5227
    /* PowerPC G2 H4                                                         */
5228
    POWERPC_DEF("G2H4",        CPU_POWERPC_G2H4,        0xFFFFFFFF, G2),
5229
    /* PowerPC G2 GP                                                         */
5230
    POWERPC_DEF("G2GP",        CPU_POWERPC_G2gp,        0xFFFFFFFF, G2),
5231
    /* PowerPC G2 LS                                                         */
5232
    POWERPC_DEF("G2LS",        CPU_POWERPC_G2ls,        0xFFFFFFFF, G2),
5233
    /* PowerPC G2LE                                                          */
5234
    /* Same as G2, with little-endian mode support                           */
5235
    POWERPC_DEF("G2le",        CPU_POWERPC_G2LE,        0xFFFFFFFF, G2LE),
5236
    /* PowerPC G2LE GP                                                       */
5237
    POWERPC_DEF("G2leGP",      CPU_POWERPC_G2LEgp,      0xFFFFFFFF, G2LE),
5238
    /* PowerPC G2LE LS                                                       */
5239
    POWERPC_DEF("G2leLS",      CPU_POWERPC_G2LEls,      0xFFFFFFFF, G2LE),
5240
    /* PowerPC 604                                                           */
5241
    POWERPC_DEF("604",         CPU_POWERPC_604,         0xFFFFFFFF, 604),
5242
    /* PowerPC 604e                                                          */
5243
    POWERPC_DEF("604e",        CPU_POWERPC_604E,        0xFFFFFFFF, 604),
5244
    /* PowerPC 604e v1.0                                                     */
5245
    POWERPC_DEF("604e1.0",     CPU_POWERPC_604E_v10,    0xFFFFFFFF, 604),
5246
    /* PowerPC 604e v2.2                                                     */
5247
    POWERPC_DEF("604e2.2",     CPU_POWERPC_604E_v22,    0xFFFFFFFF, 604),
5248
    /* PowerPC 604e v2.4                                                     */
5249
    POWERPC_DEF("604e2.4",     CPU_POWERPC_604E_v24,    0xFFFFFFFF, 604),
5250
    /* PowerPC 604r                                                          */
5251
    POWERPC_DEF("604r",        CPU_POWERPC_604R,        0xFFFFFFFF, 604),
5252
#if defined(TODO)
5253
    /* PowerPC 604ev                                                         */
5254
    POWERPC_DEF("604ev",       CPU_POWERPC_604EV,       0xFFFFFFFF, 604),
5255
#endif
5256
    /* PowerPC 7xx family                                                    */
5257
    /* Generic PowerPC 740 (G3)                                              */
5258
    POWERPC_DEF("740",         CPU_POWERPC_7x0,         0xFFFFFFFF, 7x0),
5259
    /* Generic PowerPC 750 (G3)                                              */
5260
    POWERPC_DEF("750",         CPU_POWERPC_7x0,         0xFFFFFFFF, 7x0),
5261
    /* Code name for generic PowerPC 740/750 (G3)                            */
5262
    POWERPC_DEF("Arthur",      CPU_POWERPC_7x0,         0xFFFFFFFF, 7x0),
5263
    /* PowerPC 740/750 is also known as G3                                   */
5264
    POWERPC_DEF("G3",          CPU_POWERPC_7x0,         0xFFFFFFFF, 7x0),
5265
    /* PowerPC 740 v2.0 (G3)                                                 */
5266
    POWERPC_DEF("740v2.0",     CPU_POWERPC_7x0_v20,     0xFFFFFFFF, 7x0),
5267
    /* PowerPC 750 v2.0 (G3)                                                 */
5268
    POWERPC_DEF("750v2.0",     CPU_POWERPC_7x0_v20,     0xFFFFFFFF, 7x0),
5269
    /* PowerPC 740 v2.1 (G3)                                                 */
5270
    POWERPC_DEF("740v2.1",     CPU_POWERPC_7x0_v21,     0xFFFFFFFF, 7x0),
5271
    /* PowerPC 750 v2.1 (G3)                                                 */
5272
    POWERPC_DEF("750v2.1",     CPU_POWERPC_7x0_v21,     0xFFFFFFFF, 7x0),
5273
    /* PowerPC 740 v2.2 (G3)                                                 */
5274
    POWERPC_DEF("740v2.2",     CPU_POWERPC_7x0_v22,     0xFFFFFFFF, 7x0),
5275
    /* PowerPC 750 v2.2 (G3)                                                 */
5276
    POWERPC_DEF("750v2.2",     CPU_POWERPC_7x0_v22,     0xFFFFFFFF, 7x0),
5277
    /* PowerPC 740 v3.0 (G3)                                                 */
5278
    POWERPC_DEF("740v3.0",     CPU_POWERPC_7x0_v30,     0xFFFFFFFF, 7x0),
5279
    /* PowerPC 750 v3.0 (G3)                                                 */
5280
    POWERPC_DEF("750v3.0",     CPU_POWERPC_7x0_v30,     0xFFFFFFFF, 7x0),
5281
    /* PowerPC 740 v3.1 (G3)                                                 */
5282
    POWERPC_DEF("740v3.1",     CPU_POWERPC_7x0_v31,     0xFFFFFFFF, 7x0),
5283
    /* PowerPC 750 v3.1 (G3)                                                 */
5284
    POWERPC_DEF("750v3.1",     CPU_POWERPC_7x0_v31,     0xFFFFFFFF, 7x0),
5285
    /* PowerPC 740E (G3)                                                     */
5286
    POWERPC_DEF("740e",        CPU_POWERPC_740E,        0xFFFFFFFF, 7x0),
5287
    /* PowerPC 740P (G3)                                                     */
5288
    POWERPC_DEF("740p",        CPU_POWERPC_7x0P,        0xFFFFFFFF, 7x0),
5289
    /* PowerPC 750P (G3)                                                     */
5290
    POWERPC_DEF("750p",        CPU_POWERPC_7x0P,        0xFFFFFFFF, 7x0),
5291
    /* Code name for PowerPC 740P/750P (G3)                                  */
5292
    POWERPC_DEF("Conan/Doyle", CPU_POWERPC_7x0P,        0xFFFFFFFF, 7x0),
5293
    /* PowerPC 750CL (G3 embedded)                                           */
5294
    POWERPC_DEF("750cl",       CPU_POWERPC_750CL,       0xFFFFFFFF, 7x0),
5295
    /* PowerPC 750CX (G3 embedded)                                           */
5296
    POWERPC_DEF("750cx",       CPU_POWERPC_750CX,       0xFFFFFFFF, 7x0),
5297
    /* PowerPC 750CX v2.1 (G3 embedded)                                      */
5298
    POWERPC_DEF("750cx2.1",    CPU_POWERPC_750CX_v21,   0xFFFFFFFF, 7x0),
5299
    /* PowerPC 750CX v2.2 (G3 embedded)                                      */
5300
    POWERPC_DEF("750cx2.2",    CPU_POWERPC_750CX_v22,   0xFFFFFFFF, 7x0),
5301
    /* PowerPC 750CXe (G3 embedded)                                          */
5302
    POWERPC_DEF("750cxe",      CPU_POWERPC_750CXE,      0xFFFFFFFF, 7x0),
5303
    /* PowerPC 750CXe v2.1 (G3 embedded)                                     */
5304
    POWERPC_DEF("750cxe21",    CPU_POWERPC_750CXE_v21,  0xFFFFFFFF, 7x0),
5305
    /* PowerPC 750CXe v2.2 (G3 embedded)                                     */
5306
    POWERPC_DEF("750cxe22",    CPU_POWERPC_750CXE_v22,  0xFFFFFFFF, 7x0),
5307
    /* PowerPC 750CXe v2.3 (G3 embedded)                                     */
5308
    POWERPC_DEF("750cxe23",    CPU_POWERPC_750CXE_v23,  0xFFFFFFFF, 7x0),
5309
    /* PowerPC 750CXe v2.4 (G3 embedded)                                     */
5310
    POWERPC_DEF("750cxe24",    CPU_POWERPC_750CXE_v24,  0xFFFFFFFF, 7x0),
5311
    /* PowerPC 750CXe v2.4b (G3 embedded)                                    */
5312
    POWERPC_DEF("750cxe24b",   CPU_POWERPC_750CXE_v24b, 0xFFFFFFFF, 7x0),
5313
    /* PowerPC 750CXe v3.1 (G3 embedded)                                     */
5314
    POWERPC_DEF("750cxe31",    CPU_POWERPC_750CXE_v31,  0xFFFFFFFF, 7x0),
5315
    /* PowerPC 750CXe v3.1b (G3 embedded)                                    */
5316
    POWERPC_DEF("750cxe3.1b",  CPU_POWERPC_750CXE_v31b, 0xFFFFFFFF, 7x0),
5317
    /* PowerPC 750CXr (G3 embedded)                                          */
5318
    POWERPC_DEF("750cxr",      CPU_POWERPC_750CXR,      0xFFFFFFFF, 7x0),
5319
    /* PowerPC 750E (G3)                                                     */
5320
    POWERPC_DEF("750e",        CPU_POWERPC_750E,        0xFFFFFFFF, 7x0),
5321
    /* PowerPC 750FL (G3 embedded)                                           */
5322
    POWERPC_DEF("750fl",       CPU_POWERPC_750FL,       0xFFFFFFFF, 750fx),
5323
    /* PowerPC 750FX (G3 embedded)                                           */
5324
    POWERPC_DEF("750fx",       CPU_POWERPC_750FX,       0xFFFFFFFF, 750fx),
5325
    /* PowerPC 750FX v1.0 (G3 embedded)                                      */
5326
    POWERPC_DEF("750fx1.0",    CPU_POWERPC_750FX_v10,   0xFFFFFFFF, 750fx),
5327
    /* PowerPC 750FX v2.0 (G3 embedded)                                      */
5328
    POWERPC_DEF("750fx2.0",    CPU_POWERPC_750FX_v20,   0xFFFFFFFF, 750fx),
5329
    /* PowerPC 750FX v2.1 (G3 embedded)                                      */
5330
    POWERPC_DEF("750fx2.1",    CPU_POWERPC_750FX_v21,   0xFFFFFFFF, 750fx),
5331
    /* PowerPC 750FX v2.2 (G3 embedded)                                      */
5332
    POWERPC_DEF("750fx2.2",    CPU_POWERPC_750FX_v22,   0xFFFFFFFF, 750fx),
5333
    /* PowerPC 750FX v2.3 (G3 embedded)                                      */
5334
    POWERPC_DEF("750fx2.3",    CPU_POWERPC_750FX_v23,   0xFFFFFFFF, 750fx),
5335
    /* PowerPC 750GL (G3 embedded)                                           */
5336
    POWERPC_DEF("750gl",       CPU_POWERPC_750GL,       0xFFFFFFFF, 750fx),
5337
    /* PowerPC 750GX (G3 embedded)                                           */
5338
    POWERPC_DEF("750gx",       CPU_POWERPC_750GX,       0xFFFFFFFF, 750fx),
5339
    /* PowerPC 750GX v1.0 (G3 embedded)                                      */
5340
    POWERPC_DEF("750gx1.0",    CPU_POWERPC_750GX_v10,   0xFFFFFFFF, 750fx),
5341
    /* PowerPC 750GX v1.1 (G3 embedded)                                      */
5342
    POWERPC_DEF("750gx1.1",    CPU_POWERPC_750GX_v11,   0xFFFFFFFF, 750fx),
5343
    /* PowerPC 750GX v1.2 (G3 embedded)                                      */
5344
    POWERPC_DEF("750gx1.2",    CPU_POWERPC_750GX_v12,   0xFFFFFFFF, 750fx),
5345
    /* PowerPC 750L (G3 embedded)                                            */
5346
    POWERPC_DEF("750l",        CPU_POWERPC_750L,        0xFFFFFFFF, 7x0),
5347
    /* Code name for PowerPC 750L (G3 embedded)                              */
5348
    POWERPC_DEF("LoneStar",    CPU_POWERPC_750L,        0xFFFFFFFF, 7x0),
5349
    /* PowerPC 750L v2.2 (G3 embedded)                                       */
5350
    POWERPC_DEF("750l2.2",     CPU_POWERPC_750L_v22,    0xFFFFFFFF, 7x0),
5351
    /* PowerPC 750L v3.0 (G3 embedded)                                       */
5352
    POWERPC_DEF("750l3.0",     CPU_POWERPC_750L_v30,    0xFFFFFFFF, 7x0),
5353
    /* PowerPC 750L v3.2 (G3 embedded)                                       */
5354
    POWERPC_DEF("750l3.2",     CPU_POWERPC_750L_v32,    0xFFFFFFFF, 7x0),
5355
    /* Generic PowerPC 745                                                   */
5356
    POWERPC_DEF("745",         CPU_POWERPC_7x5,         0xFFFFFFFF, 7x5),
5357
    /* Generic PowerPC 755                                                   */
5358
    POWERPC_DEF("755",         CPU_POWERPC_7x5,         0xFFFFFFFF, 7x5),
5359
    /* Code name for PowerPC 745/755                                         */
5360
    POWERPC_DEF("Goldfinger",  CPU_POWERPC_7x5,         0xFFFFFFFF, 7x5),
5361
    /* PowerPC 745 v1.0                                                      */
5362
    POWERPC_DEF("745v1.0",     CPU_POWERPC_7x5_v10,     0xFFFFFFFF, 7x5),
5363
    /* PowerPC 755 v1.0                                                      */
5364
    POWERPC_DEF("755v1.0",     CPU_POWERPC_7x5_v10,     0xFFFFFFFF, 7x5),
5365
    /* PowerPC 745 v1.1                                                      */
5366
    POWERPC_DEF("745v1.1",     CPU_POWERPC_7x5_v11,     0xFFFFFFFF, 7x5),
5367
    /* PowerPC 755 v1.1                                                      */
5368
    POWERPC_DEF("755v1.1",     CPU_POWERPC_7x5_v11,     0xFFFFFFFF, 7x5),
5369
    /* PowerPC 745 v2.0                                                      */
5370
    POWERPC_DEF("745v2.0",     CPU_POWERPC_7x5_v20,     0xFFFFFFFF, 7x5),
5371
    /* PowerPC 755 v2.0                                                      */
5372
    POWERPC_DEF("755v2.0",     CPU_POWERPC_7x5_v20,     0xFFFFFFFF, 7x5),
5373
    /* PowerPC 745 v2.1                                                      */
5374
    POWERPC_DEF("745v2.1",     CPU_POWERPC_7x5_v21,     0xFFFFFFFF, 7x5),
5375
    /* PowerPC 755 v2.1                                                      */
5376
    POWERPC_DEF("755v2.1",     CPU_POWERPC_7x5_v21,     0xFFFFFFFF, 7x5),
5377
    /* PowerPC 745 v2.2                                                      */
5378
    POWERPC_DEF("745v2.2",     CPU_POWERPC_7x5_v22,     0xFFFFFFFF, 7x5),
5379
    /* PowerPC 755 v2.2                                                      */
5380
    POWERPC_DEF("755v2.2",     CPU_POWERPC_7x5_v22,     0xFFFFFFFF, 7x5),
5381
    /* PowerPC 745 v2.3                                                      */
5382
    POWERPC_DEF("745v2.3",     CPU_POWERPC_7x5_v23,     0xFFFFFFFF, 7x5),
5383
    /* PowerPC 755 v2.3                                                      */
5384
    POWERPC_DEF("755v2.3",     CPU_POWERPC_7x5_v23,     0xFFFFFFFF, 7x5),
5385
    /* PowerPC 745 v2.4                                                      */
5386
    POWERPC_DEF("745v2.4",     CPU_POWERPC_7x5_v24,     0xFFFFFFFF, 7x5),
5387
    /* PowerPC 755 v2.4                                                      */
5388
    POWERPC_DEF("755v2.4",     CPU_POWERPC_7x5_v24,     0xFFFFFFFF, 7x5),
5389
    /* PowerPC 745 v2.5                                                      */
5390
    POWERPC_DEF("745v2.5",     CPU_POWERPC_7x5_v25,     0xFFFFFFFF, 7x5),
5391
    /* PowerPC 755 v2.5                                                      */
5392
    POWERPC_DEF("755v2.5",     CPU_POWERPC_7x5_v25,     0xFFFFFFFF, 7x5),
5393
    /* PowerPC 745 v2.6                                                      */
5394
    POWERPC_DEF("745v2.6",     CPU_POWERPC_7x5_v26,     0xFFFFFFFF, 7x5),
5395
    /* PowerPC 755 v2.6                                                      */
5396
    POWERPC_DEF("755v2.6",     CPU_POWERPC_7x5_v26,     0xFFFFFFFF, 7x5),
5397
    /* PowerPC 745 v2.7                                                      */
5398
    POWERPC_DEF("745v2.7",     CPU_POWERPC_7x5_v27,     0xFFFFFFFF, 7x5),
5399
    /* PowerPC 755 v2.7                                                      */
5400
    POWERPC_DEF("755v2.7",     CPU_POWERPC_7x5_v27,     0xFFFFFFFF, 7x5),
5401
    /* PowerPC 745 v2.8                                                      */
5402
    POWERPC_DEF("745v2.8",     CPU_POWERPC_7x5_v28,     0xFFFFFFFF, 7x5),
5403
    /* PowerPC 755 v2.8                                                      */
5404
    POWERPC_DEF("755v2.8",     CPU_POWERPC_7x5_v28,     0xFFFFFFFF, 7x5),
5405
#if defined (TODO)
5406
    /* PowerPC 745P (G3)                                                     */
5407
    POWERPC_DEF("745p",        CPU_POWERPC_7x5P,        0xFFFFFFFF, 7x5),
5408
    /* PowerPC 755P (G3)                                                     */
5409
    POWERPC_DEF("755p",        CPU_POWERPC_7x5P,        0xFFFFFFFF, 7x5),
5410
#endif
5411
    /* PowerPC 74xx family                                                   */
5412
    /* PowerPC 7400 (G4)                                                     */
5413
    POWERPC_DEF("7400",        CPU_POWERPC_7400,        0xFFFFFFFF, 7400),
5414
    /* Code name for PowerPC 7400                                            */
5415
    POWERPC_DEF("Max",         CPU_POWERPC_7400,        0xFFFFFFFF, 7400),
5416
    /* PowerPC 74xx is also well known as G4                                 */
5417
    POWERPC_DEF("G4",          CPU_POWERPC_7400,        0xFFFFFFFF, 7400),
5418
    /* PowerPC 7400 v1.0 (G4)                                                */
5419
    POWERPC_DEF("7400v1.0",    CPU_POWERPC_7400_v10,    0xFFFFFFFF, 7400),
5420
    /* PowerPC 7400 v1.1 (G4)                                                */
5421
    POWERPC_DEF("7400v1.1",    CPU_POWERPC_7400_v11,    0xFFFFFFFF, 7400),
5422
    /* PowerPC 7400 v2.0 (G4)                                                */
5423
    POWERPC_DEF("7400v2.0",    CPU_POWERPC_7400_v20,    0xFFFFFFFF, 7400),
5424
    /* PowerPC 7400 v2.2 (G4)                                                */
5425
    POWERPC_DEF("7400v2.2",    CPU_POWERPC_7400_v22,    0xFFFFFFFF, 7400),
5426
    /* PowerPC 7400 v2.6 (G4)                                                */
5427
    POWERPC_DEF("7400v2.6",    CPU_POWERPC_7400_v26,    0xFFFFFFFF, 7400),
5428
    /* PowerPC 7400 v2.7 (G4)                                                */
5429
    POWERPC_DEF("7400v2.7",    CPU_POWERPC_7400_v27,    0xFFFFFFFF, 7400),
5430
    /* PowerPC 7400 v2.8 (G4)                                                */
5431
    POWERPC_DEF("7400v2.8",    CPU_POWERPC_7400_v28,    0xFFFFFFFF, 7400),
5432
    /* PowerPC 7400 v2.9 (G4)                                                */
5433
    POWERPC_DEF("7400v2.9",    CPU_POWERPC_7400_v29,    0xFFFFFFFF, 7400),
5434
    /* PowerPC 7410 (G4)                                                     */
5435
    POWERPC_DEF("7410",        CPU_POWERPC_7410,        0xFFFFFFFF, 7410),
5436
    /* Code name for PowerPC 7410                                            */
5437
    POWERPC_DEF("Nitro",       CPU_POWERPC_7410,        0xFFFFFFFF, 7410),
5438
    /* PowerPC 7410 v1.0 (G4)                                                */
5439
    POWERPC_DEF("7410v1.0",    CPU_POWERPC_7410_v10,    0xFFFFFFFF, 7410),
5440
    /* PowerPC 7410 v1.1 (G4)                                                */
5441
    POWERPC_DEF("7410v1.1",    CPU_POWERPC_7410_v11,    0xFFFFFFFF, 7410),
5442
    /* PowerPC 7410 v1.2 (G4)                                                */
5443
    POWERPC_DEF("7410v1.2",    CPU_POWERPC_7410_v12,    0xFFFFFFFF, 7410),
5444
    /* PowerPC 7410 v1.3 (G4)                                                */
5445
    POWERPC_DEF("7410v1.3",    CPU_POWERPC_7410_v13,    0xFFFFFFFF, 7410),
5446
    /* PowerPC 7410 v1.4 (G4)                                                */
5447
    POWERPC_DEF("7410v1.4",    CPU_POWERPC_7410_v14,    0xFFFFFFFF, 7410),
5448
    /* PowerPC 7448 (G4)                                                     */
5449
    POWERPC_DEF("7448",        CPU_POWERPC_7448,        0xFFFFFFFF, 7400),
5450
    /* PowerPC 7448 v1.0 (G4)                                                */
5451
    POWERPC_DEF("7448v1.0",    CPU_POWERPC_7448_v10,    0xFFFFFFFF, 7400),
5452
    /* PowerPC 7448 v1.1 (G4)                                                */
5453
    POWERPC_DEF("7448v1.1",    CPU_POWERPC_7448_v11,    0xFFFFFFFF, 7400),
5454
    /* PowerPC 7448 v2.0 (G4)                                                */
5455
    POWERPC_DEF("7448v2.0",    CPU_POWERPC_7448_v20,    0xFFFFFFFF, 7400),
5456
    /* PowerPC 7448 v2.1 (G4)                                                */
5457
    POWERPC_DEF("7448v2.1",    CPU_POWERPC_7448_v21,    0xFFFFFFFF, 7400),
5458
#if defined (TODO)
5459
    /* PowerPC 7450 (G4)                                                     */
5460
    POWERPC_DEF("7450",        CPU_POWERPC_7450,        0xFFFFFFFF, 7450),
5461
    /* Code name for PowerPC 7450                                            */
5462
    POWERPC_DEF("Vger",        CPU_POWERPC_7450,        0xFFFFFFFF, 7450),
5463
#endif
5464
#if defined (TODO)
5465
    /* PowerPC 7450 v1.0 (G4)                                                */
5466
    POWERPC_DEF("7450v1.0",    CPU_POWERPC_7450_v10,    0xFFFFFFFF, 7450),
5467
#endif
5468
#if defined (TODO)
5469
    /* PowerPC 7450 v1.1 (G4)                                                */
5470
    POWERPC_DEF("7450v1.1",    CPU_POWERPC_7450_v11,    0xFFFFFFFF, 7450),
5471
#endif
5472
#if defined (TODO)
5473
    /* PowerPC 7450 v1.2 (G4)                                                */
5474
    POWERPC_DEF("7450v1.2",    CPU_POWERPC_7450_v12,    0xFFFFFFFF, 7450),
5475
#endif
5476
#if defined (TODO)
5477
    /* PowerPC 7450 v2.0 (G4)                                                */
5478
    POWERPC_DEF("7450v2.0",    CPU_POWERPC_7450_v20,    0xFFFFFFFF, 7450),
5479
#endif
5480
#if defined (TODO)
5481
    /* PowerPC 7450 v2.1 (G4)                                                */
5482
    POWERPC_DEF("7450v2.1",    CPU_POWERPC_7450_v21,    0xFFFFFFFF, 7450),
5483
#endif
5484
#if defined (TODO)
5485
    /* PowerPC 7441 (G4)                                                     */
5486
    POWERPC_DEF("7441",        CPU_POWERPC_74x1,        0xFFFFFFFF, 7440),
5487
    /* PowerPC 7451 (G4)                                                     */
5488
    POWERPC_DEF("7451",        CPU_POWERPC_74x1,        0xFFFFFFFF, 7450),
5489
#endif
5490
#if defined (TODO)
5491
    /* PowerPC 7441g (G4)                                                    */
5492
    POWERPC_DEF("7441g",       CPU_POWERPC_74x1G,       0xFFFFFFFF, 7440),
5493
    /* PowerPC 7451g (G4)                                                    */
5494
    POWERPC_DEF("7451g",       CPU_POWERPC_74x1G,       0xFFFFFFFF, 7450),
5495
#endif
5496
#if defined (TODO)
5497
    /* PowerPC 7445 (G4)                                                     */
5498
    POWERPC_DEF("7445",        CPU_POWERPC_74x5,        0xFFFFFFFF, 7445),
5499
    /* PowerPC 7455 (G4)                                                     */
5500
    POWERPC_DEF("7455",        CPU_POWERPC_74x5,        0xFFFFFFFF, 7455),
5501
    /* Code name for PowerPC 7445/7455                                       */
5502
    POWERPC_DEF("Apollo6",     CPU_POWERPC_74x5,        0xFFFFFFFF, 7455),
5503
#endif
5504
#if defined (TODO)
5505
    /* PowerPC 7445 v1.0 (G4)                                                */
5506
    POWERPC_DEF("7445v1.0",    CPU_POWERPC_74x5_v10,    0xFFFFFFFF, 7445),
5507
    /* PowerPC 7455 v1.0 (G4)                                                */
5508
    POWERPC_DEF("7455v1.0",    CPU_POWERPC_74x5_v10,    0xFFFFFFFF, 7455),
5509
#endif
5510
#if defined (TODO)
5511
    /* PowerPC 7445 v2.1 (G4)                                                */
5512
    POWERPC_DEF("7445v2.1",    CPU_POWERPC_74x5_v21,    0xFFFFFFFF, 7445),
5513
    /* PowerPC 7455 v2.1 (G4)                                                */
5514
    POWERPC_DEF("7455v2.1",    CPU_POWERPC_74x5_v21,    0xFFFFFFFF, 7455),
5515
#endif
5516
#if defined (TODO)
5517
    /* PowerPC 7445 v3.2 (G4)                                                */
5518
    POWERPC_DEF("7445v3.2",    CPU_POWERPC_74x5_v32,    0xFFFFFFFF, 7445),
5519
    /* PowerPC 7455 v3.2 (G4)                                                */
5520
    POWERPC_DEF("7455v3.2",    CPU_POWERPC_74x5_v32,    0xFFFFFFFF, 7455),
5521
#endif
5522
#if defined (TODO)
5523
    /* PowerPC 7445 v3.3 (G4)                                                */
5524
    POWERPC_DEF("7445v3.3",    CPU_POWERPC_74x5_v33,    0xFFFFFFFF, 7445),
5525
    /* PowerPC 7455 v3.3 (G4)                                                */
5526
    POWERPC_DEF("7455v3.3",    CPU_POWERPC_74x5_v33,    0xFFFFFFFF, 7455),
5527
#endif
5528
#if defined (TODO)
5529
    /* PowerPC 7445 v3.4 (G4)                                                */
5530
    POWERPC_DEF("7445v3.4",    CPU_POWERPC_74x5_v34,    0xFFFFFFFF, 7445),
5531
    /* PowerPC 7455 v3.4 (G4)                                                */
5532
    POWERPC_DEF("7455v3.4",    CPU_POWERPC_74x5_v34,    0xFFFFFFFF, 7455),
5533
#endif
5534
#if defined (TODO)
5535
    /* PowerPC 7447 (G4)                                                     */
5536
    POWERPC_DEF("7447",        CPU_POWERPC_74x7,        0xFFFFFFFF, 7445),
5537
    /* PowerPC 7457 (G4)                                                     */
5538
    POWERPC_DEF("7457",        CPU_POWERPC_74x7,        0xFFFFFFFF, 7455),
5539
    /* Code name for PowerPC 7447/7457                                       */
5540
    POWERPC_DEF("Apollo7",     CPU_POWERPC_74x7,        0xFFFFFFFF, 7455),
5541
#endif
5542
#if defined (TODO)
5543
    /* PowerPC 7447 v1.0 (G4)                                                */
5544
    POWERPC_DEF("7447v1.0",    CPU_POWERPC_74x7_v10,    0xFFFFFFFF, 7445),
5545
    /* PowerPC 7457 v1.0 (G4)                                                */
5546
    POWERPC_DEF("7457v1.0",    CPU_POWERPC_74x7_v10,    0xFFFFFFFF, 7455),
5547
    /* Code name for PowerPC 7447A/7457A                                     */
5548
    POWERPC_DEF("Apollo7PM",   CPU_POWERPC_74x7_v10,    0xFFFFFFFF, 7455),
5549
#endif
5550
#if defined (TODO)
5551
    /* PowerPC 7447 v1.1 (G4)                                                */
5552
    POWERPC_DEF("7447v1.1",    CPU_POWERPC_74x7_v11,    0xFFFFFFFF, 7445),
5553
    /* PowerPC 7457 v1.1 (G4)                                                */
5554
    POWERPC_DEF("7457v1.1",    CPU_POWERPC_74x7_v11,    0xFFFFFFFF, 7455),
5555
#endif
5556
#if defined (TODO)
5557
    /* PowerPC 7447 v1.2 (G4)                                                */
5558
    POWERPC_DEF("7447v1.2",    CPU_POWERPC_74x7_v12,    0xFFFFFFFF, 7445),
5559
    /* PowerPC 7457 v1.2 (G4)                                                */
5560
    POWERPC_DEF("7457v1.2",    CPU_POWERPC_74x7_v12,    0xFFFFFFFF, 7455),
5561
#endif
5562
    /* 64 bits PowerPC                                                       */
5563
#if defined (TARGET_PPC64)
5564
#if defined (TODO)
5565
    /* PowerPC 620                                                           */
5566
    POWERPC_DEF("620",         CPU_POWERPC_620,         0xFFFFFFFF, 620),
5567
#endif
5568
#if defined (TODO)
5569
    /* PowerPC 630 (POWER3)                                                  */
5570
    POWERPC_DEF("630",         CPU_POWERPC_630,         0xFFFFFFFF, 630),
5571
    POWERPC_DEF("POWER3",      CPU_POWERPC_630,         0xFFFFFFFF, 630),
5572
#endif
5573
#if defined (TODO)
5574
    /* PowerPC 631 (Power 3+)                                                */
5575
    POWERPC_DEF("631",         CPU_POWERPC_631,         0xFFFFFFFF, 631),
5576
    POWERPC_DEF("POWER3+",     CPU_POWERPC_631,         0xFFFFFFFF, 631),
5577
#endif
5578
#if defined (TODO)
5579
    /* POWER4                                                                */
5580
    POWERPC_DEF("POWER4",      CPU_POWERPC_POWER4,      0xFFFFFFFF, POWER4),
5581
#endif
5582
#if defined (TODO)
5583
    /* POWER4p                                                               */
5584
    POWERPC_DEF("POWER4+",     CPU_POWERPC_POWER4P,     0xFFFFFFFF, POWER4P),
5585
#endif
5586
#if defined (TODO)
5587
    /* POWER5                                                                */
5588
    POWERPC_DEF("POWER5",      CPU_POWERPC_POWER5,      0xFFFFFFFF, POWER5),
5589
    /* POWER5GR                                                              */
5590
    POWERPC_DEF("POWER5gr",    CPU_POWERPC_POWER5GR,    0xFFFFFFFF, POWER5),
5591
#endif
5592
#if defined (TODO)
5593
    /* POWER5+                                                               */
5594
    POWERPC_DEF("POWER5+",     CPU_POWERPC_POWER5P,     0xFFFFFFFF, POWER5P),
5595
    /* POWER5GS                                                              */
5596
    POWERPC_DEF("POWER5gs",    CPU_POWERPC_POWER5GS,    0xFFFFFFFF, POWER5P),
5597
#endif
5598
#if defined (TODO)
5599
    /* POWER6                                                                */
5600
    POWERPC_DEF("POWER6",      CPU_POWERPC_POWER6,      0xFFFFFFFF, POWER6),
5601
    /* POWER6 running in POWER5 mode                                         */
5602
    POWERPC_DEF("POWER6_5",    CPU_POWERPC_POWER6_5,    0xFFFFFFFF, POWER5),
5603
    /* POWER6A                                                               */
5604
    POWERPC_DEF("POWER6A",     CPU_POWERPC_POWER6A,     0xFFFFFFFF, POWER6),
5605
#endif
5606
    /* PowerPC 970                                                           */
5607
    POWERPC_DEF("970",         CPU_POWERPC_970,         0xFFFFFFFF, 970),
5608
    /* PowerPC 970FX (G5)                                                    */
5609
    POWERPC_DEF("970fx",       CPU_POWERPC_970FX,       0xFFFFFFFF, 970FX),
5610
    /* PowerPC 970FX v1.0 (G5)                                               */
5611
    POWERPC_DEF("970fx1.0",    CPU_POWERPC_970FX_v10,   0xFFFFFFFF, 970FX),
5612
    /* PowerPC 970FX v2.0 (G5)                                               */
5613
    POWERPC_DEF("970fx2.0",    CPU_POWERPC_970FX_v20,   0xFFFFFFFF, 970FX),
5614
    /* PowerPC 970FX v2.1 (G5)                                               */
5615
    POWERPC_DEF("970fx2.1",    CPU_POWERPC_970FX_v21,   0xFFFFFFFF, 970FX),
5616
    /* PowerPC 970FX v3.0 (G5)                                               */
5617
    POWERPC_DEF("970fx3.0",    CPU_POWERPC_970FX_v30,   0xFFFFFFFF, 970FX),
5618
    /* PowerPC 970FX v3.1 (G5)                                               */
5619
    POWERPC_DEF("970fx3.1",    CPU_POWERPC_970FX_v31,   0xFFFFFFFF, 970FX),
5620
    /* PowerPC 970GX (G5)                                                    */
5621
    POWERPC_DEF("970gx",       CPU_POWERPC_970GX,       0xFFFFFFFF, 970GX),
5622
    /* PowerPC 970MP                                                         */
5623
    POWERPC_DEF("970mp",       CPU_POWERPC_970MP,       0xFFFFFFFF, 970),
5624
    /* PowerPC 970MP v1.0                                                    */
5625
    POWERPC_DEF("970mp1.0",    CPU_POWERPC_970MP_v10,   0xFFFFFFFF, 970),
5626
    /* PowerPC 970MP v1.1                                                    */
5627
    POWERPC_DEF("970mp1.1",    CPU_POWERPC_970MP_v11,   0xFFFFFFFF, 970),
5628
#if defined (TODO)
5629
    /* PowerPC Cell                                                          */
5630
    POWERPC_DEF("Cell",        CPU_POWERPC_CELL,        0xFFFFFFFF, 970),
5631
#endif
5632
#if defined (TODO)
5633
    /* PowerPC Cell v1.0                                                     */
5634
    POWERPC_DEF("Cell1.0",     CPU_POWERPC_CELL_v10,    0xFFFFFFFF, 970),
5635
#endif
5636
#if defined (TODO)
5637
    /* PowerPC Cell v2.0                                                     */
5638
    POWERPC_DEF("Cell2.0",     CPU_POWERPC_CELL_v20,    0xFFFFFFFF, 970),
5639
#endif
5640
#if defined (TODO)
5641
    /* PowerPC Cell v3.0                                                     */
5642
    POWERPC_DEF("Cell3.0",     CPU_POWERPC_CELL_v30,    0xFFFFFFFF, 970),
5643
#endif
5644
#if defined (TODO)
5645
    /* PowerPC Cell v3.1                                                     */
5646
    POWERPC_DEF("Cell3.1",     CPU_POWERPC_CELL_v31,    0xFFFFFFFF, 970),
5647
#endif
5648
#if defined (TODO)
5649
    /* PowerPC Cell v3.2                                                     */
5650
    POWERPC_DEF("Cell3.2",     CPU_POWERPC_CELL_v32,    0xFFFFFFFF, 970),
5651
#endif
5652
#if defined (TODO)
5653
    /* RS64 (Apache/A35)                                                     */
5654
    /* This one seems to support the whole POWER2 instruction set
5655
     * and the PowerPC 64 one.
5656
     */
5657
    /* What about A10 & A30 ? */
5658
    POWERPC_DEF("RS64",        CPU_POWERPC_RS64,        0xFFFFFFFF, RS64),
5659
    POWERPC_DEF("Apache",      CPU_POWERPC_RS64,        0xFFFFFFFF, RS64),
5660
    POWERPC_DEF("A35",         CPU_POWERPC_RS64,        0xFFFFFFFF, RS64),
5661
#endif
5662
#if defined (TODO)
5663
    /* RS64-II (NorthStar/A50)                                               */
5664
    POWERPC_DEF("RS64-II",     CPU_POWERPC_RS64II,      0xFFFFFFFF, RS64),
5665
    POWERPC_DEF("NorthStar",   CPU_POWERPC_RS64II,      0xFFFFFFFF, RS64),
5666
    POWERPC_DEF("A50",         CPU_POWERPC_RS64II,      0xFFFFFFFF, RS64),
5667
#endif
5668
#if defined (TODO)
5669
    /* RS64-III (Pulsar)                                                     */
5670
    POWERPC_DEF("RS64-III",    CPU_POWERPC_RS64III,     0xFFFFFFFF, RS64),
5671
    POWERPC_DEF("Pulsar",      CPU_POWERPC_RS64III,     0xFFFFFFFF, RS64),
5672
#endif
5673
#if defined (TODO)
5674
    /* RS64-IV (IceStar/IStar/SStar)                                         */
5675
    POWERPC_DEF("RS64-IV",     CPU_POWERPC_RS64IV,      0xFFFFFFFF, RS64),
5676
    POWERPC_DEF("IceStar",     CPU_POWERPC_RS64IV,      0xFFFFFFFF, RS64),
5677
    POWERPC_DEF("IStar",       CPU_POWERPC_RS64IV,      0xFFFFFFFF, RS64),
5678
    POWERPC_DEF("SStar",       CPU_POWERPC_RS64IV,      0xFFFFFFFF, RS64),
5679
#endif
5680
#endif /* defined (TARGET_PPC64) */
5681
    /* POWER                                                                 */
5682
#if defined (TODO)
5683
    /* Original POWER                                                        */
5684
    POWERPC_DEF("POWER",       CPU_POWERPC_POWER,       0xFFFFFFFF, POWER),
5685
    POWERPC_DEF("RIOS",        CPU_POWERPC_POWER,       0xFFFFFFFF, POWER),
5686
    POWERPC_DEF("RSC",         CPU_POWERPC_POWER,       0xFFFFFFFF, POWER),
5687
    POWERPC_DEF("RSC3308",     CPU_POWERPC_POWER,       0xFFFFFFFF, POWER),
5688
    POWERPC_DEF("RSC4608",     CPU_POWERPC_POWER,       0xFFFFFFFF, POWER),
5689
#endif
5690
#if defined (TODO)
5691
    /* POWER2                                                                */
5692
    POWERPC_DEF("POWER2",      CPU_POWERPC_POWER2,      0xFFFFFFFF, POWER),
5693
    POWERPC_DEF("RSC2",        CPU_POWERPC_POWER2,      0xFFFFFFFF, POWER),
5694
    POWERPC_DEF("P2SC",        CPU_POWERPC_POWER2,      0xFFFFFFFF, POWER),
5695
#endif
5696
    /* PA semi cores                                                         */
5697
#if defined (TODO)
5698
    /* PA PA6T */
5699
    POWERPC_DEF("PA6T",        CPU_POWERPC_PA6T,        0xFFFFFFFF, PA6T),
5700
#endif
5701
    /* Generic PowerPCs                                                      */
5702
#if defined (TARGET_PPC64)
5703
#if defined (TODO)
5704
    POWERPC_DEF("ppc64",       CPU_POWERPC_PPC64,       0xFFFFFFFF, PPC64),
5705
#endif
5706
#endif
5707
    POWERPC_DEF("ppc32",       CPU_POWERPC_PPC32,       0xFFFFFFFF, PPC32),
5708
    POWERPC_DEF("ppc",         CPU_POWERPC_DEFAULT,     0xFFFFFFFF, DEFAULT),
5709
    /* Fallback                                                              */
5710
    POWERPC_DEF("default",     CPU_POWERPC_DEFAULT,     0xFFFFFFFF, DEFAULT),
5711
};
5712

    
5713
/*****************************************************************************/
5714
/* Generic CPU instanciation routine                                         */
5715
static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
5716
{
5717
#if !defined(CONFIG_USER_ONLY)
5718
    int i;
5719

    
5720
    env->irq_inputs = NULL;
5721
    /* Set all exception vectors to an invalid address */
5722
    for (i = 0; i < POWERPC_EXCP_NB; i++)
5723
        env->excp_vectors[i] = (target_ulong)(-1ULL);
5724
    env->excp_prefix = 0x00000000;
5725
    env->ivor_mask = 0x00000000;
5726
    env->ivpr_mask = 0x00000000;
5727
#endif
5728
    /* Default MMU definitions */
5729
    env->nb_BATs = 0;
5730
    env->nb_tlb = 0;
5731
    env->nb_ways = 0;
5732
    /* Register SPR common to all PowerPC implementations */
5733
    gen_spr_generic(env);
5734
    spr_register(env, SPR_PVR, "PVR",
5735
                 SPR_NOACCESS, SPR_NOACCESS,
5736
                 &spr_read_generic, SPR_NOACCESS,
5737
                 def->pvr);
5738
    /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
5739
    (*def->init_proc)(env);
5740
    /* Allocate TLBs buffer when needed */
5741
    if (env->nb_tlb != 0) {
5742
        int nb_tlb = env->nb_tlb;
5743
        if (env->id_tlbs != 0)
5744
            nb_tlb *= 2;
5745
        env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
5746
        /* Pre-compute some useful values */
5747
        env->tlb_per_way = env->nb_tlb / env->nb_ways;
5748
    }
5749
#if !defined(CONFIG_USER_ONLY)
5750
    if (env->irq_inputs == NULL) {
5751
        fprintf(stderr, "WARNING: no internal IRQ controller registered.\n"
5752
                " Attempt Qemu to crash very soon !\n");
5753
    }
5754
#endif
5755
}
5756

    
5757
#if defined(PPC_DUMP_CPU)
5758
static void dump_ppc_sprs (CPUPPCState *env)
5759
{
5760
    ppc_spr_t *spr;
5761
#if !defined(CONFIG_USER_ONLY)
5762
    uint32_t sr, sw;
5763
#endif
5764
    uint32_t ur, uw;
5765
    int i, j, n;
5766

    
5767
    printf("Special purpose registers:\n");
5768
    for (i = 0; i < 32; i++) {
5769
        for (j = 0; j < 32; j++) {
5770
            n = (i << 5) | j;
5771
            spr = &env->spr_cb[n];
5772
            uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
5773
            ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
5774
#if !defined(CONFIG_USER_ONLY)
5775
            sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
5776
            sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
5777
            if (sw || sr || uw || ur) {
5778
                printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
5779
                       (i << 5) | j, (i << 5) | j, spr->name,
5780
                       sw ? 'w' : '-', sr ? 'r' : '-',
5781
                       uw ? 'w' : '-', ur ? 'r' : '-');
5782
            }
5783
#else
5784
            if (uw || ur) {
5785
                printf("SPR: %4d (%03x) %-8s u%c%c\n",
5786
                       (i << 5) | j, (i << 5) | j, spr->name,
5787
                       uw ? 'w' : '-', ur ? 'r' : '-');
5788
            }
5789
#endif
5790
        }
5791
    }
5792
    fflush(stdout);
5793
    fflush(stderr);
5794
}
5795
#endif
5796

    
5797
/*****************************************************************************/
5798
#include <stdlib.h>
5799
#include <string.h>
5800

    
5801
int fflush (FILE *stream);
5802

    
5803
/* Opcode types */
5804
enum {
5805
    PPC_DIRECT   = 0, /* Opcode routine        */
5806
    PPC_INDIRECT = 1, /* Indirect opcode table */
5807
};
5808

    
5809
static inline int is_indirect_opcode (void *handler)
5810
{
5811
    return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
5812
}
5813

    
5814
static inline opc_handler_t **ind_table(void *handler)
5815
{
5816
    return (opc_handler_t **)((unsigned long)handler & ~3);
5817
}
5818

    
5819
/* Instruction table creation */
5820
/* Opcodes tables creation */
5821
static void fill_new_table (opc_handler_t **table, int len)
5822
{
5823
    int i;
5824

    
5825
    for (i = 0; i < len; i++)
5826
        table[i] = &invalid_handler;
5827
}
5828

    
5829
static int create_new_table (opc_handler_t **table, unsigned char idx)
5830
{
5831
    opc_handler_t **tmp;
5832

    
5833
    tmp = malloc(0x20 * sizeof(opc_handler_t));
5834
    if (tmp == NULL)
5835
        return -1;
5836
    fill_new_table(tmp, 0x20);
5837
    table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
5838

    
5839
    return 0;
5840
}
5841

    
5842
static int insert_in_table (opc_handler_t **table, unsigned char idx,
5843
                            opc_handler_t *handler)
5844
{
5845
    if (table[idx] != &invalid_handler)
5846
        return -1;
5847
    table[idx] = handler;
5848

    
5849
    return 0;
5850
}
5851

    
5852
static int register_direct_insn (opc_handler_t **ppc_opcodes,
5853
                                 unsigned char idx, opc_handler_t *handler)
5854
{
5855
    if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
5856
        printf("*** ERROR: opcode %02x already assigned in main "
5857
               "opcode table\n", idx);
5858
        return -1;
5859
    }
5860

    
5861
    return 0;
5862
}
5863

    
5864
static int register_ind_in_table (opc_handler_t **table,
5865
                                  unsigned char idx1, unsigned char idx2,
5866
                                  opc_handler_t *handler)
5867
{
5868
    if (table[idx1] == &invalid_handler) {
5869
        if (create_new_table(table, idx1) < 0) {
5870
            printf("*** ERROR: unable to create indirect table "
5871
                   "idx=%02x\n", idx1);
5872
            return -1;
5873
        }
5874
    } else {
5875
        if (!is_indirect_opcode(table[idx1])) {
5876
            printf("*** ERROR: idx %02x already assigned to a direct "
5877
                   "opcode\n", idx1);
5878
            return -1;
5879
        }
5880
    }
5881
    if (handler != NULL &&
5882
        insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
5883
        printf("*** ERROR: opcode %02x already assigned in "
5884
               "opcode table %02x\n", idx2, idx1);
5885
        return -1;
5886
    }
5887

    
5888
    return 0;
5889
}
5890

    
5891
static int register_ind_insn (opc_handler_t **ppc_opcodes,
5892
                              unsigned char idx1, unsigned char idx2,
5893
                              opc_handler_t *handler)
5894
{
5895
    int ret;
5896

    
5897
    ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
5898

    
5899
    return ret;
5900
}
5901

    
5902
static int register_dblind_insn (opc_handler_t **ppc_opcodes,
5903
                                 unsigned char idx1, unsigned char idx2,
5904
                                 unsigned char idx3, opc_handler_t *handler)
5905
{
5906
    if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
5907
        printf("*** ERROR: unable to join indirect table idx "
5908
               "[%02x-%02x]\n", idx1, idx2);
5909
        return -1;
5910
    }
5911
    if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
5912
                              handler) < 0) {
5913
        printf("*** ERROR: unable to insert opcode "
5914
               "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
5915
        return -1;
5916
    }
5917

    
5918
    return 0;
5919
}
5920

    
5921
static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
5922
{
5923
    if (insn->opc2 != 0xFF) {
5924
        if (insn->opc3 != 0xFF) {
5925
            if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
5926
                                     insn->opc3, &insn->handler) < 0)
5927
                return -1;
5928
        } else {
5929
            if (register_ind_insn(ppc_opcodes, insn->opc1,
5930
                                  insn->opc2, &insn->handler) < 0)
5931
                return -1;
5932
        }
5933
    } else {
5934
        if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
5935
            return -1;
5936
    }
5937

    
5938
    return 0;
5939
}
5940

    
5941
static int test_opcode_table (opc_handler_t **table, int len)
5942
{
5943
    int i, count, tmp;
5944

    
5945
    for (i = 0, count = 0; i < len; i++) {
5946
        /* Consistency fixup */
5947
        if (table[i] == NULL)
5948
            table[i] = &invalid_handler;
5949
        if (table[i] != &invalid_handler) {
5950
            if (is_indirect_opcode(table[i])) {
5951
                tmp = test_opcode_table(ind_table(table[i]), 0x20);
5952
                if (tmp == 0) {
5953
                    free(table[i]);
5954
                    table[i] = &invalid_handler;
5955
                } else {
5956
                    count++;
5957
                }
5958
            } else {
5959
                count++;
5960
            }
5961
        }
5962
    }
5963

    
5964
    return count;
5965
}
5966

    
5967
static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
5968
{
5969
    if (test_opcode_table(ppc_opcodes, 0x40) == 0)
5970
        printf("*** WARNING: no opcode defined !\n");
5971
}
5972

    
5973
/*****************************************************************************/
5974
static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
5975
{
5976
    opcode_t *opc, *start, *end;
5977

    
5978
    fill_new_table(env->opcodes, 0x40);
5979
    if (&opc_start < &opc_end) {
5980
        start = &opc_start;
5981
        end = &opc_end;
5982
    } else {
5983
        start = &opc_end;
5984
        end = &opc_start;
5985
    }
5986
    for (opc = start + 1; opc != end; opc++) {
5987
        if ((opc->handler.type & def->insns_flags) != 0) {
5988
            if (register_insn(env->opcodes, opc) < 0) {
5989
                printf("*** ERROR initializing PowerPC instruction "
5990
                       "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
5991
                       opc->opc3);
5992
                return -1;
5993
            }
5994
        }
5995
    }
5996
    fix_opcode_tables(env->opcodes);
5997
    fflush(stdout);
5998
    fflush(stderr);
5999

    
6000
    return 0;
6001
}
6002

    
6003
#if defined(PPC_DUMP_CPU)
6004
static int dump_ppc_insns (CPUPPCState *env)
6005
{
6006
    opc_handler_t **table, *handler;
6007
    uint8_t opc1, opc2, opc3;
6008

    
6009
    printf("Instructions set:\n");
6010
    /* opc1 is 6 bits long */
6011
    for (opc1 = 0x00; opc1 < 0x40; opc1++) {
6012
        table = env->opcodes;
6013
        handler = table[opc1];
6014
        if (is_indirect_opcode(handler)) {
6015
            /* opc2 is 5 bits long */
6016
            for (opc2 = 0; opc2 < 0x20; opc2++) {
6017
                table = env->opcodes;
6018
                handler = env->opcodes[opc1];
6019
                table = ind_table(handler);
6020
                handler = table[opc2];
6021
                if (is_indirect_opcode(handler)) {
6022
                    table = ind_table(handler);
6023
                    /* opc3 is 5 bits long */
6024
                    for (opc3 = 0; opc3 < 0x20; opc3++) {
6025
                        handler = table[opc3];
6026
                        if (handler->handler != &gen_invalid) {
6027
                            printf("INSN: %02x %02x %02x (%02d %04d) : %s\n",
6028
                                   opc1, opc2, opc3, opc1, (opc3 << 5) | opc2,
6029
                                   handler->oname);
6030
                        }
6031
                    }
6032
                } else {
6033
                    if (handler->handler != &gen_invalid) {
6034
                        printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
6035
                               opc1, opc2, opc1, opc2, handler->oname);
6036
                    }
6037
                }
6038
            }
6039
        } else {
6040
            if (handler->handler != &gen_invalid) {
6041
                printf("INSN: %02x -- -- (%02d ----) : %s\n",
6042
                       opc1, opc1, handler->oname);
6043
            }
6044
        }
6045
    }
6046
}
6047
#endif
6048

    
6049
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
6050
{
6051
    env->msr_mask = def->msr_mask;
6052
    env->mmu_model = def->mmu_model;
6053
    env->excp_model = def->excp_model;
6054
    env->bus_model = def->bus_model;
6055
    env->bfd_mach = def->bfd_mach;
6056
    if (create_ppc_opcodes(env, def) < 0)
6057
        return -1;
6058
    init_ppc_proc(env, def);
6059
#if defined(PPC_DUMP_CPU)
6060
    {
6061
        const unsigned char *mmu_model, *excp_model, *bus_model;
6062
        switch (env->mmu_model) {
6063
        case POWERPC_MMU_32B:
6064
            mmu_model = "PowerPC 32";
6065
            break;
6066
        case POWERPC_MMU_601:
6067
            mmu_model = "PowerPC 601";
6068
            break;
6069
        case POWERPC_MMU_SOFT_6xx:
6070
            mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
6071
            break;
6072
        case POWERPC_MMU_SOFT_74xx:
6073
            mmu_model = "PowerPC 74xx with software driven TLBs";
6074
            break;
6075
        case POWERPC_MMU_SOFT_4xx:
6076
            mmu_model = "PowerPC 4xx with software driven TLBs";
6077
            break;
6078
        case POWERPC_MMU_SOFT_4xx_Z:
6079
            mmu_model = "PowerPC 4xx with software driven TLBs "
6080
                "and zones protections";
6081
            break;
6082
        case POWERPC_MMU_REAL_4xx:
6083
            mmu_model = "PowerPC 4xx real mode only";
6084
            break;
6085
        case POWERPC_MMU_BOOKE:
6086
            mmu_model = "PowerPC BookE";
6087
            break;
6088
        case POWERPC_MMU_BOOKE_FSL:
6089
            mmu_model = "PowerPC BookE FSL";
6090
            break;
6091
#if defined (TARGET_PPC64)
6092
        case POWERPC_MMU_64B:
6093
            mmu_model = "PowerPC 64";
6094
            break;
6095
        case POWERPC_MMU_64BRIDGE:
6096
            mmu_model = "PowerPC 64 bridge";
6097
            break;
6098
#endif
6099
        default:
6100
            mmu_model = "Unknown or invalid";
6101
            break;
6102
        }
6103
        switch (env->excp_model) {
6104
        case POWERPC_EXCP_STD:
6105
            excp_model = "PowerPC";
6106
            break;
6107
        case POWERPC_EXCP_40x:
6108
            excp_model = "PowerPC 40x";
6109
            break;
6110
        case POWERPC_EXCP_601:
6111
            excp_model = "PowerPC 601";
6112
            break;
6113
        case POWERPC_EXCP_602:
6114
            excp_model = "PowerPC 602";
6115
            break;
6116
        case POWERPC_EXCP_603:
6117
            excp_model = "PowerPC 603";
6118
            break;
6119
        case POWERPC_EXCP_603E:
6120
            excp_model = "PowerPC 603e";
6121
            break;
6122
        case POWERPC_EXCP_604:
6123
            excp_model = "PowerPC 604";
6124
            break;
6125
        case POWERPC_EXCP_7x0:
6126
            excp_model = "PowerPC 740/750";
6127
            break;
6128
        case POWERPC_EXCP_7x5:
6129
            excp_model = "PowerPC 745/755";
6130
            break;
6131
        case POWERPC_EXCP_74xx:
6132
            excp_model = "PowerPC 74xx";
6133
            break;
6134
        case POWERPC_EXCP_BOOKE:
6135
            excp_model = "PowerPC BookE";
6136
            break;
6137
#if defined (TARGET_PPC64)
6138
        case POWERPC_EXCP_970:
6139
            excp_model = "PowerPC 970";
6140
            break;
6141
#endif
6142
        default:
6143
            excp_model = "Unknown or invalid";
6144
            break;
6145
        }
6146
        switch (env->bus_model) {
6147
        case PPC_FLAGS_INPUT_6xx:
6148
            bus_model = "PowerPC 6xx";
6149
            break;
6150
        case PPC_FLAGS_INPUT_BookE:
6151
            bus_model = "PowerPC BookE";
6152
            break;
6153
        case PPC_FLAGS_INPUT_405:
6154
            bus_model = "PowerPC 405";
6155
            break;
6156
        case PPC_FLAGS_INPUT_401:
6157
            bus_model = "PowerPC 401/403";
6158
            break;
6159
#if defined (TARGET_PPC64)
6160
        case PPC_FLAGS_INPUT_970:
6161
            bus_model = "PowerPC 970";
6162
            break;
6163
#endif
6164
        default:
6165
            bus_model = "Unknown or invalid";
6166
            break;
6167
        }
6168
        printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
6169
               "    MMU model        : %s\n",
6170
               def->name, def->pvr, def->msr_mask, mmu_model);
6171
        if (env->tlb != NULL) {
6172
            printf("                       %d %s TLB in %d ways\n",
6173
                   env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
6174
                   env->nb_ways);
6175
        }
6176
        printf("    Exceptions model : %s\n"
6177
               "    Bus model        : %s\n",
6178
               excp_model, bus_model);
6179
    }
6180
    dump_ppc_insns(env);
6181
    dump_ppc_sprs(env);
6182
    fflush(stdout);
6183
#endif
6184

    
6185
    return 0;
6186
}
6187

    
6188
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
6189
{
6190
    int i, max, ret;
6191

    
6192
    ret = -1;
6193
    *def = NULL;
6194
    max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6195
    for (i = 0; i < max; i++) {
6196
        if (strcasecmp(name, ppc_defs[i].name) == 0) {
6197
            *def = &ppc_defs[i];
6198
            ret = 0;
6199
            break;
6200
        }
6201
    }
6202

    
6203
    return ret;
6204
}
6205

    
6206
int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
6207
{
6208
    int i, max, ret;
6209

    
6210
    ret = -1;
6211
    *def = NULL;
6212
    max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6213
    for (i = 0; i < max; i++) {
6214
        if ((pvr & ppc_defs[i].pvr_mask) ==
6215
            (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
6216
            *def = &ppc_defs[i];
6217
            ret = 0;
6218
            break;
6219
        }
6220
    }
6221

    
6222
    return ret;
6223
}
6224

    
6225
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
6226
{
6227
    int i, max;
6228

    
6229
    max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6230
    for (i = 0; i < max; i++) {
6231
        (*cpu_fprintf)(f, "PowerPC %-16s PVR %08x\n",
6232
                       ppc_defs[i].name, ppc_defs[i].pvr);
6233
    }
6234
}