Statistics
| Branch: | Revision:

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

History | View | Annotate | Download (242.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
    /* Hardware reset vector */
2239
    env->hreset_vector = 0xFFFFFFFCUL;
2240
#endif
2241
}
2242

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

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

    
2295
static void init_excp_601 (CPUPPCState *env)
2296
{
2297
#if !defined(CONFIG_USER_ONLY)
2298
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2299
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2300
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2301
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2302
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2303
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2304
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2305
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2306
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2307
    env->excp_vectors[POWERPC_EXCP_IO]       = 0x00000A00;
2308
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2309
    env->excp_vectors[POWERPC_EXCP_RUNM]     = 0x00002000;
2310
    env->excp_prefix = 0xFFF00000;
2311
    /* Hardware reset vector */
2312
    env->hreset_vector = 0xFFFFFFFCUL;
2313
#endif
2314
}
2315

    
2316
static void init_excp_602 (CPUPPCState *env)
2317
{
2318
#if !defined(CONFIG_USER_ONLY)
2319
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2320
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2321
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2322
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2323
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2324
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2325
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2326
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2327
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2328
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2329
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2330
    env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2331
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2332
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2333
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2334
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2335
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2336
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001500;
2337
    env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001600;
2338
    env->excp_prefix = 0xFFF00000;
2339
    /* Hardware reset vector */
2340
    env->hreset_vector = 0xFFFFFFFCUL;
2341
#endif
2342
}
2343

    
2344
static void init_excp_603 (CPUPPCState *env)
2345
{
2346
#if !defined(CONFIG_USER_ONLY)
2347
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2348
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2349
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2350
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2351
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2352
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2353
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2354
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2355
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2356
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2357
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2358
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2359
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2360
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2361
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2362
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2363
    /* Hardware reset vector */
2364
    env->hreset_vector = 0xFFFFFFFCUL;
2365
#endif
2366
}
2367

    
2368
static void init_excp_G2 (CPUPPCState *env)
2369
{
2370
#if !defined(CONFIG_USER_ONLY)
2371
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2372
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2373
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2374
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2375
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2376
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2377
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2378
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2379
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2380
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2381
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2382
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2383
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2384
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2385
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2386
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2387
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2388
    /* Hardware reset vector */
2389
    env->hreset_vector = 0xFFFFFFFCUL;
2390
#endif
2391
}
2392

    
2393
static void init_excp_604 (CPUPPCState *env)
2394
{
2395
#if !defined(CONFIG_USER_ONLY)
2396
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2397
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2398
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2399
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2400
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2401
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2402
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2403
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2404
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2405
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2406
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2407
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2408
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2409
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2410
    /* Hardware reset vector */
2411
    env->hreset_vector = 0xFFFFFFFCUL;
2412
#endif
2413
}
2414

    
2415
#if defined(TARGET_PPC64)
2416
static void init_excp_620 (CPUPPCState *env)
2417
{
2418
#if !defined(CONFIG_USER_ONLY)
2419
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2420
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2421
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2422
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2423
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2424
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2425
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2426
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2427
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2428
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2429
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2430
    env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2431
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2432
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2433
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2434
    /* Hardware reset vector */
2435
    env->hreset_vector = 0x0000000000000100ULL; /* ? */
2436
#endif
2437
}
2438
#endif /* defined(TARGET_PPC64) */
2439

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

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

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

    
2510
static void init_excp_7450 (CPUPPCState *env)
2511
{
2512
#if !defined(CONFIG_USER_ONLY)
2513
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2514
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2515
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2516
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2517
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2518
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2519
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2520
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2521
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2522
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2523
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2524
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2525
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
2526
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2527
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2528
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2529
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2530
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2531
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
2532
    /* Hardware reset vector */
2533
    env->hreset_vector = 0xFFFFFFFCUL;
2534
#endif
2535
}
2536

    
2537
#if defined (TARGET_PPC64)
2538
static void init_excp_970 (CPUPPCState *env)
2539
{
2540
#if !defined(CONFIG_USER_ONLY)
2541
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2542
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2543
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2544
    env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
2545
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2546
    env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
2547
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2548
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2549
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2550
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2551
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2552
#if defined(TARGET_PPC64H) /* PowerPC 64 with hypervisor mode support */
2553
    env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
2554
#endif
2555
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2556
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2557
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2558
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
2559
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2560
    env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
2561
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
2562
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
2563
    /* Hardware reset vector */
2564
    env->hreset_vector = 0x0000000000000100ULL;
2565
#endif
2566
}
2567
#endif
2568

    
2569
/*****************************************************************************/
2570
/* PowerPC implementations definitions                                       */
2571

    
2572
/* PowerPC 40x instruction set                                               */
2573
#define POWERPC_INSNS_EMB    (PPC_INSNS_BASE | PPC_CACHE_DCBZ | PPC_EMB_COMMON)
2574

    
2575
/* PowerPC 401                                                               */
2576
#define POWERPC_INSNS_401    (POWERPC_INSNS_EMB |                             \
2577
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2578
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2579
#define POWERPC_MSRM_401     (0x00000000000FD201ULL)
2580
#define POWERPC_MMU_401      (POWERPC_MMU_REAL_4xx)
2581
#define POWERPC_EXCP_401     (POWERPC_EXCP_40x)
2582
#define POWERPC_INPUT_401    (PPC_FLAGS_INPUT_401)
2583
#define POWERPC_BFDM_401     (bfd_mach_ppc_403)
2584

    
2585
static void init_proc_401 (CPUPPCState *env)
2586
{
2587
    gen_spr_40x(env);
2588
    gen_spr_401_403(env);
2589
    gen_spr_401(env);
2590
    init_excp_4xx_real(env);
2591
    env->dcache_line_size = 32;
2592
    env->icache_line_size = 32;
2593
    /* Allocate hardware IRQ controller */
2594
    ppc40x_irq_init(env);
2595
}
2596

    
2597
/* PowerPC 401x2                                                             */
2598
#define POWERPC_INSNS_401x2  (POWERPC_INSNS_EMB |                             \
2599
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2600
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2601
                              PPC_CACHE_DCBA | PPC_MFTB |                     \
2602
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2603
#define POWERPC_MSRM_401x2   (0x00000000001FD231ULL)
2604
#define POWERPC_MMU_401x2    (POWERPC_MMU_SOFT_4xx_Z)
2605
#define POWERPC_EXCP_401x2   (POWERPC_EXCP_40x)
2606
#define POWERPC_INPUT_401x2  (PPC_FLAGS_INPUT_401)
2607
#define POWERPC_BFDM_401x2   (bfd_mach_ppc_403)
2608

    
2609
static void init_proc_401x2 (CPUPPCState *env)
2610
{
2611
    gen_spr_40x(env);
2612
    gen_spr_401_403(env);
2613
    gen_spr_401x2(env);
2614
    gen_spr_compress(env);
2615
    /* Memory management */
2616
    env->nb_tlb = 64;
2617
    env->nb_ways = 1;
2618
    env->id_tlbs = 0;
2619
    init_excp_4xx_softmmu(env);
2620
    env->dcache_line_size = 32;
2621
    env->icache_line_size = 32;
2622
    /* Allocate hardware IRQ controller */
2623
    ppc40x_irq_init(env);
2624
}
2625

    
2626
/* PowerPC 401x3                                                             */
2627
#define POWERPC_INSNS_401x3  (POWERPC_INSNS_EMB |                             \
2628
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2629
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2630
                              PPC_CACHE_DCBA | PPC_MFTB |                     \
2631
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2632
#define POWERPC_MSRM_401x3   (0x00000000001FD631ULL)
2633
#define POWERPC_MMU_401x3    (POWERPC_MMU_SOFT_4xx_Z)
2634
#define POWERPC_EXCP_401x3   (POWERPC_EXCP_40x)
2635
#define POWERPC_INPUT_401x3  (PPC_FLAGS_INPUT_401)
2636
#define POWERPC_BFDM_401x3   (bfd_mach_ppc_403)
2637

    
2638
__attribute__ (( unused ))
2639
static void init_proc_401x3 (CPUPPCState *env)
2640
{
2641
    gen_spr_40x(env);
2642
    gen_spr_401_403(env);
2643
    gen_spr_401(env);
2644
    gen_spr_401x2(env);
2645
    gen_spr_compress(env);
2646
    init_excp_4xx_softmmu(env);
2647
    env->dcache_line_size = 32;
2648
    env->icache_line_size = 32;
2649
    /* Allocate hardware IRQ controller */
2650
    ppc40x_irq_init(env);
2651
}
2652

    
2653
/* IOP480                                                                    */
2654
#define POWERPC_INSNS_IOP480 (POWERPC_INSNS_EMB |                             \
2655
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2656
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2657
                              PPC_CACHE_DCBA |                                \
2658
                              PPC_4xx_COMMON | PPC_40x_EXCP |  PPC_40x_ICBT)
2659
#define POWERPC_MSRM_IOP480  (0x00000000001FD231ULL)
2660
#define POWERPC_MMU_IOP480   (POWERPC_MMU_SOFT_4xx_Z)
2661
#define POWERPC_EXCP_IOP480  (POWERPC_EXCP_40x)
2662
#define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401)
2663
#define POWERPC_BFDM_IOP480  (bfd_mach_ppc_403)
2664

    
2665
static void init_proc_IOP480 (CPUPPCState *env)
2666
{
2667
    gen_spr_40x(env);
2668
    gen_spr_401_403(env);
2669
    gen_spr_401x2(env);
2670
    gen_spr_compress(env);
2671
    /* Memory management */
2672
    env->nb_tlb = 64;
2673
    env->nb_ways = 1;
2674
    env->id_tlbs = 0;
2675
    init_excp_4xx_softmmu(env);
2676
    env->dcache_line_size = 32;
2677
    env->icache_line_size = 32;
2678
    /* Allocate hardware IRQ controller */
2679
    ppc40x_irq_init(env);
2680
}
2681

    
2682
/* PowerPC 403                                                               */
2683
#define POWERPC_INSNS_403    (POWERPC_INSNS_EMB |                             \
2684
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2685
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2686
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2687
#define POWERPC_MSRM_403     (0x000000000007D00DULL)
2688
#define POWERPC_MMU_403      (POWERPC_MMU_REAL_4xx)
2689
#define POWERPC_EXCP_403     (POWERPC_EXCP_40x)
2690
#define POWERPC_INPUT_403    (PPC_FLAGS_INPUT_401)
2691
#define POWERPC_BFDM_403     (bfd_mach_ppc_403)
2692

    
2693
static void init_proc_403 (CPUPPCState *env)
2694
{
2695
    gen_spr_40x(env);
2696
    gen_spr_401_403(env);
2697
    gen_spr_403(env);
2698
    gen_spr_403_real(env);
2699
    init_excp_4xx_real(env);
2700
    env->dcache_line_size = 32;
2701
    env->icache_line_size = 32;
2702
    /* Allocate hardware IRQ controller */
2703
    ppc40x_irq_init(env);
2704
#if !defined(CONFIG_USER_ONLY)
2705
    /* Hardware reset vector */
2706
    env->hreset_vector = 0xFFFFFFFCUL;
2707
#endif
2708
}
2709

    
2710
/* PowerPC 403 GCX                                                           */
2711
#define POWERPC_INSNS_403GCX (POWERPC_INSNS_EMB |                             \
2712
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
2713
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2714
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT)
2715
#define POWERPC_MSRM_403GCX  (0x000000000007D00DULL)
2716
#define POWERPC_MMU_403GCX   (POWERPC_MMU_SOFT_4xx_Z)
2717
#define POWERPC_EXCP_403GCX  (POWERPC_EXCP_40x)
2718
#define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401)
2719
#define POWERPC_BFDM_403GCX  (bfd_mach_ppc_403)
2720

    
2721
static void init_proc_403GCX (CPUPPCState *env)
2722
{
2723
    gen_spr_40x(env);
2724
    gen_spr_401_403(env);
2725
    gen_spr_403(env);
2726
    gen_spr_403_real(env);
2727
    gen_spr_403_mmu(env);
2728
    /* Bus access control */
2729
    /* not emulated, as Qemu never does speculative access */
2730
    spr_register(env, SPR_40x_SGR, "SGR",
2731
                 SPR_NOACCESS, SPR_NOACCESS,
2732
                 &spr_read_generic, &spr_write_generic,
2733
                 0xFFFFFFFF);
2734
    /* not emulated, as Qemu do not emulate caches */
2735
    spr_register(env, SPR_40x_DCWR, "DCWR",
2736
                 SPR_NOACCESS, SPR_NOACCESS,
2737
                 &spr_read_generic, &spr_write_generic,
2738
                 0x00000000);
2739
    /* Memory management */
2740
    env->nb_tlb = 64;
2741
    env->nb_ways = 1;
2742
    env->id_tlbs = 0;
2743
    init_excp_4xx_softmmu(env);
2744
    env->dcache_line_size = 32;
2745
    env->icache_line_size = 32;
2746
    /* Allocate hardware IRQ controller */
2747
    ppc40x_irq_init(env);
2748
}
2749

    
2750
/* PowerPC 405                                                               */
2751
#define POWERPC_INSNS_405    (POWERPC_INSNS_EMB | PPC_MFTB |                  \
2752
                              PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_CACHE_DCBA | \
2753
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
2754
                              PPC_4xx_COMMON | PPC_40x_EXCP | PPC_40x_ICBT |  \
2755
                              PPC_405_MAC)
2756
#define POWERPC_MSRM_405     (0x000000000006E630ULL)
2757
#define POWERPC_MMU_405      (POWERPC_MMU_SOFT_4xx)
2758
#define POWERPC_EXCP_405     (POWERPC_EXCP_40x)
2759
#define POWERPC_INPUT_405    (PPC_FLAGS_INPUT_405)
2760
#define POWERPC_BFDM_405     (bfd_mach_ppc_403)
2761

    
2762
static void init_proc_405 (CPUPPCState *env)
2763
{
2764
    /* Time base */
2765
    gen_tbl(env);
2766
    gen_spr_40x(env);
2767
    gen_spr_405(env);
2768
    /* Bus access control */
2769
    /* not emulated, as Qemu never does speculative access */
2770
    spr_register(env, SPR_40x_SGR, "SGR",
2771
                 SPR_NOACCESS, SPR_NOACCESS,
2772
                 &spr_read_generic, &spr_write_generic,
2773
                 0xFFFFFFFF);
2774
    /* not emulated, as Qemu do not emulate caches */
2775
    spr_register(env, SPR_40x_DCWR, "DCWR",
2776
                 SPR_NOACCESS, SPR_NOACCESS,
2777
                 &spr_read_generic, &spr_write_generic,
2778
                 0x00000000);
2779
    /* Memory management */
2780
    env->nb_tlb = 64;
2781
    env->nb_ways = 1;
2782
    env->id_tlbs = 0;
2783
    init_excp_4xx_softmmu(env);
2784
    env->dcache_line_size = 32;
2785
    env->icache_line_size = 32;
2786
    /* Allocate hardware IRQ controller */
2787
    ppc40x_irq_init(env);
2788
}
2789

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

    
2801
static void init_proc_440EP (CPUPPCState *env)
2802
{
2803
    /* Time base */
2804
    gen_tbl(env);
2805
    gen_spr_BookE(env);
2806
    gen_spr_440(env);
2807
    /* XXX : not implemented */
2808
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2809
                 SPR_NOACCESS, SPR_NOACCESS,
2810
                 &spr_read_generic, &spr_write_generic,
2811
                 0x00000000);
2812
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2813
                 SPR_NOACCESS, SPR_NOACCESS,
2814
                 &spr_read_generic, &spr_write_generic,
2815
                 0x00000000);
2816
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2817
                 SPR_NOACCESS, SPR_NOACCESS,
2818
                 &spr_read_generic, &spr_write_generic,
2819
                 0x00000000);
2820
    /* XXX : not implemented */
2821
    spr_register(env, SPR_440_CCR1, "CCR1",
2822
                 SPR_NOACCESS, SPR_NOACCESS,
2823
                 &spr_read_generic, &spr_write_generic,
2824
                 0x00000000);
2825
    /* Memory management */
2826
    env->nb_tlb = 64;
2827
    env->nb_ways = 1;
2828
    env->id_tlbs = 0;
2829
    init_excp_BookE(env);
2830
    env->dcache_line_size = 32;
2831
    env->icache_line_size = 32;
2832
    /* XXX: TODO: allocate internal IRQ controller */
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
}
2861

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

    
2873
__attribute__ (( unused ))
2874
static void init_proc_440x4 (CPUPPCState *env)
2875
{
2876
    /* Time base */
2877
    gen_tbl(env);
2878
    gen_spr_BookE(env);
2879
    gen_spr_440(env);
2880
    /* Memory management */
2881
    env->nb_tlb = 64;
2882
    env->nb_ways = 1;
2883
    env->id_tlbs = 0;
2884
    init_excp_BookE(env);
2885
    env->dcache_line_size = 32;
2886
    env->icache_line_size = 32;
2887
    /* XXX: TODO: allocate internal IRQ controller */
2888
}
2889

    
2890
/* PowerPC 440x5                                                             */
2891
#define POWERPC_INSNS_440x5  (POWERPC_INSNS_EMB |                             \
2892
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2893
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
2894
                              PPC_440_SPEC | PPC_RFMCI)
2895
#define POWERPC_MSRM_440x5   (0x000000000006FF30ULL)
2896
#define POWERPC_MMU_440x5    (POWERPC_MMU_BOOKE)
2897
#define POWERPC_EXCP_440x5   (POWERPC_EXCP_BOOKE)
2898
#define POWERPC_INPUT_440x5  (PPC_FLAGS_INPUT_BookE)
2899
#define POWERPC_BFDM_440x5   (bfd_mach_ppc_403)
2900

    
2901
static void init_proc_440x5 (CPUPPCState *env)
2902
{
2903
    /* Time base */
2904
    gen_tbl(env);
2905
    gen_spr_BookE(env);
2906
    gen_spr_440(env);
2907
    /* XXX : not implemented */
2908
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2909
                 SPR_NOACCESS, SPR_NOACCESS,
2910
                 &spr_read_generic, &spr_write_generic,
2911
                 0x00000000);
2912
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2913
                 SPR_NOACCESS, SPR_NOACCESS,
2914
                 &spr_read_generic, &spr_write_generic,
2915
                 0x00000000);
2916
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2917
                 SPR_NOACCESS, SPR_NOACCESS,
2918
                 &spr_read_generic, &spr_write_generic,
2919
                 0x00000000);
2920
    /* XXX : not implemented */
2921
    spr_register(env, SPR_440_CCR1, "CCR1",
2922
                 SPR_NOACCESS, SPR_NOACCESS,
2923
                 &spr_read_generic, &spr_write_generic,
2924
                 0x00000000);
2925
    /* Memory management */
2926
    env->nb_tlb = 64;
2927
    env->nb_ways = 1;
2928
    env->id_tlbs = 0;
2929
    init_excp_BookE(env);
2930
    env->dcache_line_size = 32;
2931
    env->icache_line_size = 32;
2932
    /* XXX: TODO: allocate internal IRQ controller */
2933
}
2934

    
2935
/* PowerPC 460 (guessed)                                                     */
2936
#define POWERPC_INSNS_460    (POWERPC_INSNS_EMB |                             \
2937
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2938
                              PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON |    \
2939
                              PPC_405_MAC | PPC_440_SPEC | PPC_DCRUX)
2940
#define POWERPC_MSRM_460     (0x000000000006FF30ULL)
2941
#define POWERPC_MMU_460      (POWERPC_MMU_BOOKE)
2942
#define POWERPC_EXCP_460     (POWERPC_EXCP_BOOKE)
2943
#define POWERPC_INPUT_460    (PPC_FLAGS_INPUT_BookE)
2944
#define POWERPC_BFDM_460     (bfd_mach_ppc_403)
2945

    
2946
__attribute__ (( unused ))
2947
static void init_proc_460 (CPUPPCState *env)
2948
{
2949
    /* Time base */
2950
    gen_tbl(env);
2951
    gen_spr_BookE(env);
2952
    gen_spr_440(env);
2953
    /* XXX : not implemented */
2954
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2955
                 SPR_NOACCESS, SPR_NOACCESS,
2956
                 &spr_read_generic, &spr_write_generic,
2957
                 0x00000000);
2958
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2959
                 SPR_NOACCESS, SPR_NOACCESS,
2960
                 &spr_read_generic, &spr_write_generic,
2961
                 0x00000000);
2962
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2963
                 SPR_NOACCESS, SPR_NOACCESS,
2964
                 &spr_read_generic, &spr_write_generic,
2965
                 0x00000000);
2966
    /* XXX : not implemented */
2967
    spr_register(env, SPR_440_CCR1, "CCR1",
2968
                 SPR_NOACCESS, SPR_NOACCESS,
2969
                 &spr_read_generic, &spr_write_generic,
2970
                 0x00000000);
2971
    /* XXX : not implemented */
2972
    spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
2973
                 &spr_read_generic, &spr_write_generic,
2974
                 &spr_read_generic, &spr_write_generic,
2975
                 0x00000000);
2976
    /* Memory management */
2977
    env->nb_tlb = 64;
2978
    env->nb_ways = 1;
2979
    env->id_tlbs = 0;
2980
    init_excp_BookE(env);
2981
    env->dcache_line_size = 32;
2982
    env->icache_line_size = 32;
2983
    /* XXX: TODO: allocate internal IRQ controller */
2984
}
2985

    
2986
/* PowerPC 460F (guessed)                                                    */
2987
#define POWERPC_INSNS_460F   (POWERPC_INSNS_EMB |                             \
2988
                              PPC_CACHE_DCBA | PPC_MEM_TLBSYNC |              \
2989
                              PPC_FLOAT | PPC_FLOAT_FSQRT | PPC_FLOAT_FRES |  \
2990
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |            \
2991
                              PPC_FLOAT_STFIWX |                              \
2992
                              PPC_BOOKE | PPC_BOOKE_EXT | PPC_4xx_COMMON |    \
2993
                              PPC_405_MAC | PPC_440_SPEC | PPC_DCRUX)
2994
#define POWERPC_MSRM_460     (0x000000000006FF30ULL)
2995
#define POWERPC_MMU_460F     (POWERPC_MMU_BOOKE)
2996
#define POWERPC_EXCP_460F    (POWERPC_EXCP_BOOKE)
2997
#define POWERPC_INPUT_460F   (PPC_FLAGS_INPUT_BookE)
2998
#define POWERPC_BFDM_460F    (bfd_mach_ppc_403)
2999

    
3000
__attribute__ (( unused ))
3001
static void init_proc_460F (CPUPPCState *env)
3002
{
3003
    /* Time base */
3004
    gen_tbl(env);
3005
    gen_spr_BookE(env);
3006
    gen_spr_440(env);
3007
    /* XXX : not implemented */
3008
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3009
                 SPR_NOACCESS, SPR_NOACCESS,
3010
                 &spr_read_generic, &spr_write_generic,
3011
                 0x00000000);
3012
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3013
                 SPR_NOACCESS, SPR_NOACCESS,
3014
                 &spr_read_generic, &spr_write_generic,
3015
                 0x00000000);
3016
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3017
                 SPR_NOACCESS, SPR_NOACCESS,
3018
                 &spr_read_generic, &spr_write_generic,
3019
                 0x00000000);
3020
    /* XXX : not implemented */
3021
    spr_register(env, SPR_440_CCR1, "CCR1",
3022
                 SPR_NOACCESS, SPR_NOACCESS,
3023
                 &spr_read_generic, &spr_write_generic,
3024
                 0x00000000);
3025
    /* XXX : not implemented */
3026
    spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
3027
                 &spr_read_generic, &spr_write_generic,
3028
                 &spr_read_generic, &spr_write_generic,
3029
                 0x00000000);
3030
    /* Memory management */
3031
    env->nb_tlb = 64;
3032
    env->nb_ways = 1;
3033
    env->id_tlbs = 0;
3034
    init_excp_BookE(env);
3035
    env->dcache_line_size = 32;
3036
    env->icache_line_size = 32;
3037
    /* XXX: TODO: allocate internal IRQ controller */
3038
}
3039

    
3040
/* Generic BookE PowerPC                                                     */
3041
#define POWERPC_INSNS_BookE  (POWERPC_INSNS_EMB |                             \
3042
                              PPC_MEM_EIEIO | PPC_MEM_TLBSYNC |               \
3043
                              PPC_CACHE_DCBA |                                \
3044
                              PPC_FLOAT | PPC_FLOAT_FSQRT |                   \
3045
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
3046
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIW |              \
3047
                              PPC_BOOKE)
3048
#define POWERPC_MSRM_BookE   (0x000000000006D630ULL)
3049
#define POWERPC_MMU_BookE    (POWERPC_MMU_BOOKE)
3050
#define POWERPC_EXCP_BookE   (POWERPC_EXCP_BOOKE)
3051
#define POWERPC_INPUT_BookE  (PPC_FLAGS_INPUT_BookE)
3052
#define POWERPC_BFDM_BookE   (bfd_mach_ppc_403)
3053

    
3054
__attribute__ (( unused ))
3055
static void init_proc_BookE (CPUPPCState *env)
3056
{
3057
    init_excp_BookE(env);
3058
    env->dcache_line_size = 32;
3059
    env->icache_line_size = 32;
3060
}
3061

    
3062
/* e200 core                                                                 */
3063

    
3064
/* e300 core                                                                 */
3065

    
3066
/* e500 core                                                                 */
3067
#define POWERPC_INSNS_e500   (POWERPC_INSNS_EMB |                             \
3068
                              PPC_MEM_EIEIO | PPC_MEM_TLBSYNC |               \
3069
                              PPC_CACHE_DCBA |                                \
3070
                              PPC_BOOKE | PPC_E500_VECTOR)
3071
#define POWERPC_MMU_e500     (POWERPC_MMU_SOFT_4xx)
3072
#define POWERPC_EXCP_e500    (POWERPC_EXCP_40x)
3073
#define POWERPC_INPUT_e500   (PPC_FLAGS_INPUT_BookE)
3074
#define POWERPC_BFDM_e500    (bfd_mach_ppc_403)
3075

    
3076
__attribute__ (( unused ))
3077
static void init_proc_e500 (CPUPPCState *env)
3078
{
3079
    /* Time base */
3080
    gen_tbl(env);
3081
    gen_spr_BookE(env);
3082
    /* Memory management */
3083
    gen_spr_BookE_FSL(env);
3084
    env->nb_tlb = 64;
3085
    env->nb_ways = 1;
3086
    env->id_tlbs = 0;
3087
    init_excp_BookE(env);
3088
    env->dcache_line_size = 32;
3089
    env->icache_line_size = 32;
3090
    /* XXX: TODO: allocate internal IRQ controller */
3091
}
3092

    
3093
/* e600 core                                                                 */
3094

    
3095
/* Non-embedded PowerPC                                                      */
3096
/* Base instructions set for all 6xx/7xx/74xx/970 PowerPC                    */
3097
#define POWERPC_INSNS_6xx    (PPC_INSNS_BASE | PPC_FLOAT | PPC_MEM_SYNC |     \
3098
                              PPC_MEM_EIEIO | PPC_SEGMENT | PPC_MEM_TLBIE)
3099
/* Instructions common to all 6xx/7xx/74xx/970 PowerPC except 601 & 602      */
3100
#define POWERPC_INSNS_WORKS  (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT |           \
3101
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
3102
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX |             \
3103
                              PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ | PPC_MFTB)
3104

    
3105
/* POWER : same as 601, without mfmsr, mfsr                                  */
3106
#if defined(TODO)
3107
#define POWERPC_INSNS_POWER  (XXX_TODO)
3108
/* POWER RSC (from RAD6000) */
3109
#define POWERPC_MSRM_POWER   (0x00000000FEF0ULL)
3110
#endif /* TODO */
3111

    
3112
/* PowerPC 601                                                               */
3113
#define POWERPC_INSNS_601    (POWERPC_INSNS_6xx | PPC_CACHE_DCBZ |            \
3114
                              PPC_EXTERN | PPC_POWER_BR)
3115
#define POWERPC_MSRM_601     (0x000000000000FE70ULL)
3116
//#define POWERPC_MMU_601      (POWERPC_MMU_601)
3117
//#define POWERPC_EXCP_601     (POWERPC_EXCP_601)
3118
#define POWERPC_INPUT_601    (PPC_FLAGS_INPUT_6xx)
3119
#define POWERPC_BFDM_601     (bfd_mach_ppc_601)
3120

    
3121
static void init_proc_601 (CPUPPCState *env)
3122
{
3123
    gen_spr_ne_601(env);
3124
    gen_spr_601(env);
3125
    /* Hardware implementation registers */
3126
    /* XXX : not implemented */
3127
    spr_register(env, SPR_HID0, "HID0",
3128
                 SPR_NOACCESS, SPR_NOACCESS,
3129
                 &spr_read_generic, &spr_write_generic,
3130
                 0x00000000);
3131
    /* XXX : not implemented */
3132
    spr_register(env, SPR_HID1, "HID1",
3133
                 SPR_NOACCESS, SPR_NOACCESS,
3134
                 &spr_read_generic, &spr_write_generic,
3135
                 0x00000000);
3136
    /* XXX : not implemented */
3137
    spr_register(env, SPR_601_HID2, "HID2",
3138
                 SPR_NOACCESS, SPR_NOACCESS,
3139
                 &spr_read_generic, &spr_write_generic,
3140
                 0x00000000);
3141
    /* XXX : not implemented */
3142
    spr_register(env, SPR_601_HID5, "HID5",
3143
                 SPR_NOACCESS, SPR_NOACCESS,
3144
                 &spr_read_generic, &spr_write_generic,
3145
                 0x00000000);
3146
    /* XXX : not implemented */
3147
    spr_register(env, SPR_601_HID15, "HID15",
3148
                 SPR_NOACCESS, SPR_NOACCESS,
3149
                 &spr_read_generic, &spr_write_generic,
3150
                 0x00000000);
3151
    /* Memory management */
3152
    env->nb_tlb = 64;
3153
    env->nb_ways = 2;
3154
    env->id_tlbs = 0;
3155
    env->id_tlbs = 0;
3156
    init_excp_601(env);
3157
    env->dcache_line_size = 64;
3158
    env->icache_line_size = 64;
3159
    /* XXX: TODO: allocate internal IRQ controller */
3160
}
3161

    
3162
/* PowerPC 602                                                               */
3163
#define POWERPC_INSNS_602    (POWERPC_INSNS_6xx | PPC_MFTB |                  \
3164
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
3165
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX |             \
3166
                              PPC_6xx_TLB | PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ |\
3167
                              PPC_602_SPEC)
3168
#define POWERPC_MSRM_602     (0x000000000033FF73ULL)
3169
#define POWERPC_MMU_602      (POWERPC_MMU_SOFT_6xx)
3170
//#define POWERPC_EXCP_602     (POWERPC_EXCP_602)
3171
#define POWERPC_INPUT_602    (PPC_FLAGS_INPUT_6xx)
3172
#define POWERPC_BFDM_602     (bfd_mach_ppc_602)
3173

    
3174
static void init_proc_602 (CPUPPCState *env)
3175
{
3176
    gen_spr_ne_601(env);
3177
    gen_spr_602(env);
3178
    /* Time base */
3179
    gen_tbl(env);
3180
    /* hardware implementation registers */
3181
    /* XXX : not implemented */
3182
    spr_register(env, SPR_HID0, "HID0",
3183
                 SPR_NOACCESS, SPR_NOACCESS,
3184
                 &spr_read_generic, &spr_write_generic,
3185
                 0x00000000);
3186
    /* XXX : not implemented */
3187
    spr_register(env, SPR_HID1, "HID1",
3188
                 SPR_NOACCESS, SPR_NOACCESS,
3189
                 &spr_read_generic, &spr_write_generic,
3190
                 0x00000000);
3191
    /* Memory management */
3192
    gen_low_BATs(env);
3193
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3194
    init_excp_602(env);
3195
    env->dcache_line_size = 32;
3196
    env->icache_line_size = 32;
3197
    /* Allocate hardware IRQ controller */
3198
    ppc6xx_irq_init(env);
3199
}
3200

    
3201
/* PowerPC 603                                                               */
3202
#define POWERPC_INSNS_603    (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3203
#define POWERPC_MSRM_603     (0x000000000001FF73ULL)
3204
#define POWERPC_MMU_603      (POWERPC_MMU_SOFT_6xx)
3205
//#define POWERPC_EXCP_603     (POWERPC_EXCP_603)
3206
#define POWERPC_INPUT_603    (PPC_FLAGS_INPUT_6xx)
3207
#define POWERPC_BFDM_603     (bfd_mach_ppc_603)
3208

    
3209
static void init_proc_603 (CPUPPCState *env)
3210
{
3211
    gen_spr_ne_601(env);
3212
    gen_spr_603(env);
3213
    /* Time base */
3214
    gen_tbl(env);
3215
    /* hardware implementation registers */
3216
    /* XXX : not implemented */
3217
    spr_register(env, SPR_HID0, "HID0",
3218
                 SPR_NOACCESS, SPR_NOACCESS,
3219
                 &spr_read_generic, &spr_write_generic,
3220
                 0x00000000);
3221
    /* XXX : not implemented */
3222
    spr_register(env, SPR_HID1, "HID1",
3223
                 SPR_NOACCESS, SPR_NOACCESS,
3224
                 &spr_read_generic, &spr_write_generic,
3225
                 0x00000000);
3226
    /* Memory management */
3227
    gen_low_BATs(env);
3228
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3229
    init_excp_603(env);
3230
    env->dcache_line_size = 32;
3231
    env->icache_line_size = 32;
3232
    /* Allocate hardware IRQ controller */
3233
    ppc6xx_irq_init(env);
3234
}
3235

    
3236
/* PowerPC 603e                                                              */
3237
#define POWERPC_INSNS_603E   (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3238
#define POWERPC_MSRM_603E    (0x000000000007FF73ULL)
3239
#define POWERPC_MMU_603E     (POWERPC_MMU_SOFT_6xx)
3240
//#define POWERPC_EXCP_603E    (POWERPC_EXCP_603E)
3241
#define POWERPC_INPUT_603E   (PPC_FLAGS_INPUT_6xx)
3242
#define POWERPC_BFDM_603E    (bfd_mach_ppc_ec603e)
3243

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

    
3276
/* PowerPC G2                                                                */
3277
#define POWERPC_INSNS_G2     (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3278
#define POWERPC_MSRM_G2      (0x000000000006FFF2ULL)
3279
#define POWERPC_MMU_G2       (POWERPC_MMU_SOFT_6xx)
3280
//#define POWERPC_EXCP_G2      (POWERPC_EXCP_G2)
3281
#define POWERPC_INPUT_G2     (PPC_FLAGS_INPUT_6xx)
3282
#define POWERPC_BFDM_G2      (bfd_mach_ppc_ec603e)
3283

    
3284
static void init_proc_G2 (CPUPPCState *env)
3285
{
3286
    gen_spr_ne_601(env);
3287
    gen_spr_G2_755(env);
3288
    gen_spr_G2(env);
3289
    /* Time base */
3290
    gen_tbl(env);
3291
    /* Hardware implementation register */
3292
    /* XXX : not implemented */
3293
    spr_register(env, SPR_HID0, "HID0",
3294
                 SPR_NOACCESS, SPR_NOACCESS,
3295
                 &spr_read_generic, &spr_write_generic,
3296
                 0x00000000);
3297
    /* XXX : not implemented */
3298
    spr_register(env, SPR_HID1, "HID1",
3299
                 SPR_NOACCESS, SPR_NOACCESS,
3300
                 &spr_read_generic, &spr_write_generic,
3301
                 0x00000000);
3302
    /* XXX : not implemented */
3303
    spr_register(env, SPR_HID2, "HID2",
3304
                 SPR_NOACCESS, SPR_NOACCESS,
3305
                 &spr_read_generic, &spr_write_generic,
3306
                 0x00000000);
3307
    /* Memory management */
3308
    gen_low_BATs(env);
3309
    gen_high_BATs(env);
3310
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3311
    init_excp_G2(env);
3312
    env->dcache_line_size = 32;
3313
    env->icache_line_size = 32;
3314
    /* Allocate hardware IRQ controller */
3315
    ppc6xx_irq_init(env);
3316
}
3317

    
3318
/* PowerPC G2LE                                                              */
3319
#define POWERPC_INSNS_G2LE   (POWERPC_INSNS_WORKS | PPC_6xx_TLB | PPC_EXTERN)
3320
#define POWERPC_MSRM_G2LE    (0x000000000007FFF3ULL)
3321
#define POWERPC_MMU_G2LE     (POWERPC_MMU_SOFT_6xx)
3322
#define POWERPC_EXCP_G2LE    (POWERPC_EXCP_G2)
3323
#define POWERPC_INPUT_G2LE   (PPC_FLAGS_INPUT_6xx)
3324
#define POWERPC_BFDM_G2LE    (bfd_mach_ppc_ec603e)
3325

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

    
3360
/* PowerPC 604                                                               */
3361
#define POWERPC_INSNS_604    (POWERPC_INSNS_WORKS | PPC_EXTERN)
3362
#define POWERPC_MSRM_604     (0x000000000005FF77ULL)
3363
#define POWERPC_MMU_604      (POWERPC_MMU_32B)
3364
//#define POWERPC_EXCP_604     (POWERPC_EXCP_604)
3365
#define POWERPC_INPUT_604    (PPC_FLAGS_INPUT_6xx)
3366
#define POWERPC_BFDM_604     (bfd_mach_ppc_604)
3367

    
3368
static void init_proc_604 (CPUPPCState *env)
3369
{
3370
    gen_spr_ne_601(env);
3371
    gen_spr_604(env);
3372
    /* Time base */
3373
    gen_tbl(env);
3374
    /* Hardware implementation registers */
3375
    /* XXX : not implemented */
3376
    spr_register(env, SPR_HID0, "HID0",
3377
                 SPR_NOACCESS, SPR_NOACCESS,
3378
                 &spr_read_generic, &spr_write_generic,
3379
                 0x00000000);
3380
    /* XXX : not implemented */
3381
    spr_register(env, SPR_HID1, "HID1",
3382
                 SPR_NOACCESS, SPR_NOACCESS,
3383
                 &spr_read_generic, &spr_write_generic,
3384
                 0x00000000);
3385
    /* Memory management */
3386
    gen_low_BATs(env);
3387
    init_excp_604(env);
3388
    env->dcache_line_size = 32;
3389
    env->icache_line_size = 32;
3390
    /* Allocate hardware IRQ controller */
3391
    ppc6xx_irq_init(env);
3392
}
3393

    
3394
/* PowerPC 740/750 (aka G3)                                                  */
3395
#define POWERPC_INSNS_7x0    (POWERPC_INSNS_WORKS | PPC_EXTERN)
3396
#define POWERPC_MSRM_7x0     (0x000000000007FF77ULL)
3397
#define POWERPC_MMU_7x0      (POWERPC_MMU_32B)
3398
//#define POWERPC_EXCP_7x0     (POWERPC_EXCP_7x0)
3399
#define POWERPC_INPUT_7x0    (PPC_FLAGS_INPUT_6xx)
3400
#define POWERPC_BFDM_7x0     (bfd_mach_ppc_750)
3401

    
3402
static void init_proc_7x0 (CPUPPCState *env)
3403
{
3404
    gen_spr_ne_601(env);
3405
    gen_spr_7xx(env);
3406
    /* Time base */
3407
    gen_tbl(env);
3408
    /* Thermal management */
3409
    gen_spr_thrm(env);
3410
    /* Hardware implementation registers */
3411
    /* XXX : not implemented */
3412
    spr_register(env, SPR_HID0, "HID0",
3413
                 SPR_NOACCESS, SPR_NOACCESS,
3414
                 &spr_read_generic, &spr_write_generic,
3415
                 0x00000000);
3416
    /* XXX : not implemented */
3417
    spr_register(env, SPR_HID1, "HID1",
3418
                 SPR_NOACCESS, SPR_NOACCESS,
3419
                 &spr_read_generic, &spr_write_generic,
3420
                 0x00000000);
3421
    /* Memory management */
3422
    gen_low_BATs(env);
3423
    init_excp_7x0(env);
3424
    env->dcache_line_size = 32;
3425
    env->icache_line_size = 32;
3426
    /* Allocate hardware IRQ controller */
3427
    ppc6xx_irq_init(env);
3428
}
3429

    
3430
/* PowerPC 750FX/GX                                                          */
3431
#define POWERPC_INSNS_750fx  (POWERPC_INSNS_WORKS | PPC_EXTERN)
3432
#define POWERPC_MSRM_750fx   (0x000000000007FF77ULL)
3433
#define POWERPC_MMU_750fx    (POWERPC_MMU_32B)
3434
#define POWERPC_EXCP_750fx   (POWERPC_EXCP_7x0)
3435
#define POWERPC_INPUT_750fx  (PPC_FLAGS_INPUT_6xx)
3436
#define POWERPC_BFDM_750fx   (bfd_mach_ppc_750)
3437

    
3438
static void init_proc_750fx (CPUPPCState *env)
3439
{
3440
    gen_spr_ne_601(env);
3441
    gen_spr_7xx(env);
3442
    /* Time base */
3443
    gen_tbl(env);
3444
    /* Thermal management */
3445
    gen_spr_thrm(env);
3446
    /* Hardware implementation registers */
3447
    /* XXX : not implemented */
3448
    spr_register(env, SPR_HID0, "HID0",
3449
                 SPR_NOACCESS, SPR_NOACCESS,
3450
                 &spr_read_generic, &spr_write_generic,
3451
                 0x00000000);
3452
    /* XXX : not implemented */
3453
    spr_register(env, SPR_HID1, "HID1",
3454
                 SPR_NOACCESS, SPR_NOACCESS,
3455
                 &spr_read_generic, &spr_write_generic,
3456
                 0x00000000);
3457
    /* XXX : not implemented */
3458
    spr_register(env, SPR_750_HID2, "HID2",
3459
                 SPR_NOACCESS, SPR_NOACCESS,
3460
                 &spr_read_generic, &spr_write_generic,
3461
                 0x00000000);
3462
    /* Memory management */
3463
    gen_low_BATs(env);
3464
    /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
3465
    gen_high_BATs(env);
3466
    init_excp_750FX(env);
3467
    env->dcache_line_size = 32;
3468
    env->icache_line_size = 32;
3469
    /* Allocate hardware IRQ controller */
3470
    ppc6xx_irq_init(env);
3471
}
3472

    
3473
/* PowerPC 745/755                                                           */
3474
#define POWERPC_INSNS_7x5    (POWERPC_INSNS_WORKS | PPC_EXTERN | PPC_6xx_TLB)
3475
#define POWERPC_MSRM_7x5     (0x000000000007FF77ULL)
3476
#define POWERPC_MMU_7x5      (POWERPC_MMU_SOFT_6xx)
3477
//#define POWERPC_EXCP_7x5     (POWERPC_EXCP_7x5)
3478
#define POWERPC_INPUT_7x5    (PPC_FLAGS_INPUT_6xx)
3479
#define POWERPC_BFDM_7x5     (bfd_mach_ppc_750)
3480

    
3481
static void init_proc_7x5 (CPUPPCState *env)
3482
{
3483
    gen_spr_ne_601(env);
3484
    gen_spr_G2_755(env);
3485
    /* Time base */
3486
    gen_tbl(env);
3487
    /* L2 cache control */
3488
    /* XXX : not implemented */
3489
    spr_register(env, SPR_ICTC, "ICTC",
3490
                 SPR_NOACCESS, SPR_NOACCESS,
3491
                 &spr_read_generic, &spr_write_generic,
3492
                 0x00000000);
3493
    /* XXX : not implemented */
3494
    spr_register(env, SPR_L2PMCR, "L2PMCR",
3495
                 SPR_NOACCESS, SPR_NOACCESS,
3496
                 &spr_read_generic, &spr_write_generic,
3497
                 0x00000000);
3498
    /* Hardware implementation registers */
3499
    /* XXX : not implemented */
3500
    spr_register(env, SPR_HID0, "HID0",
3501
                 SPR_NOACCESS, SPR_NOACCESS,
3502
                 &spr_read_generic, &spr_write_generic,
3503
                 0x00000000);
3504
    /* XXX : not implemented */
3505
    spr_register(env, SPR_HID1, "HID1",
3506
                 SPR_NOACCESS, SPR_NOACCESS,
3507
                 &spr_read_generic, &spr_write_generic,
3508
                 0x00000000);
3509
    /* XXX : not implemented */
3510
    spr_register(env, SPR_HID2, "HID2",
3511
                 SPR_NOACCESS, SPR_NOACCESS,
3512
                 &spr_read_generic, &spr_write_generic,
3513
                 0x00000000);
3514
    /* Memory management */
3515
    gen_low_BATs(env);
3516
    gen_high_BATs(env);
3517
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3518
    /* XXX: exception vectors ? */
3519
    env->dcache_line_size = 32;
3520
    env->icache_line_size = 32;
3521
    /* Allocate hardware IRQ controller */
3522
    ppc6xx_irq_init(env);
3523
#if !defined(CONFIG_USER_ONLY)
3524
    /* Hardware reset vector */
3525
    env->hreset_vector = 0xFFFFFFFCUL;
3526
#endif
3527
}
3528

    
3529
/* PowerPC 7400 (aka G4)                                                     */
3530
#define POWERPC_INSNS_7400   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3531
                              PPC_EXTERN | PPC_MEM_TLBIA |                    \
3532
                              PPC_ALTIVEC)
3533
#define POWERPC_MSRM_7400    (0x000000000205FF77ULL)
3534
#define POWERPC_MMU_7400     (POWERPC_MMU_32B)
3535
#define POWERPC_EXCP_7400    (POWERPC_EXCP_74xx)
3536
#define POWERPC_INPUT_7400   (PPC_FLAGS_INPUT_6xx)
3537
#define POWERPC_BFDM_7400    (bfd_mach_ppc_7400)
3538

    
3539
static void init_proc_7400 (CPUPPCState *env)
3540
{
3541
    gen_spr_ne_601(env);
3542
    gen_spr_7xx(env);
3543
    /* Time base */
3544
    gen_tbl(env);
3545
    /* 74xx specific SPR */
3546
    gen_spr_74xx(env);
3547
    /* Thermal management */
3548
    gen_spr_thrm(env);
3549
    /* Memory management */
3550
    gen_low_BATs(env);
3551
    init_excp_7400(env);
3552
    env->dcache_line_size = 32;
3553
    env->icache_line_size = 32;
3554
    /* Allocate hardware IRQ controller */
3555
    ppc6xx_irq_init(env);
3556
}
3557

    
3558
/* PowerPC 7410 (aka G4)                                                     */
3559
#define POWERPC_INSNS_7410   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3560
                              PPC_EXTERN | PPC_MEM_TLBIA |                    \
3561
                              PPC_ALTIVEC)
3562
#define POWERPC_MSRM_7410    (0x000000000205FF77ULL)
3563
#define POWERPC_MMU_7410     (POWERPC_MMU_32B)
3564
#define POWERPC_EXCP_7410    (POWERPC_EXCP_74xx)
3565
#define POWERPC_INPUT_7410   (PPC_FLAGS_INPUT_6xx)
3566
#define POWERPC_BFDM_7410    (bfd_mach_ppc_7400)
3567

    
3568
static void init_proc_7410 (CPUPPCState *env)
3569
{
3570
    gen_spr_ne_601(env);
3571
    gen_spr_7xx(env);
3572
    /* Time base */
3573
    gen_tbl(env);
3574
    /* 74xx specific SPR */
3575
    gen_spr_74xx(env);
3576
    /* Thermal management */
3577
    gen_spr_thrm(env);
3578
    /* L2PMCR */
3579
    /* XXX : not implemented */
3580
    spr_register(env, SPR_L2PMCR, "L2PMCR",
3581
                 SPR_NOACCESS, SPR_NOACCESS,
3582
                 &spr_read_generic, &spr_write_generic,
3583
                 0x00000000);
3584
    /* LDSTDB */
3585
    /* XXX : not implemented */
3586
    spr_register(env, SPR_LDSTDB, "LDSTDB",
3587
                 SPR_NOACCESS, SPR_NOACCESS,
3588
                 &spr_read_generic, &spr_write_generic,
3589
                 0x00000000);
3590
    /* Memory management */
3591
    gen_low_BATs(env);
3592
    init_excp_7400(env);
3593
    env->dcache_line_size = 32;
3594
    env->icache_line_size = 32;
3595
    /* Allocate hardware IRQ controller */
3596
    ppc6xx_irq_init(env);
3597
}
3598

    
3599
/* PowerPC 7440 (aka G4)                                                     */
3600
#define POWERPC_INSNS_7440   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3601
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3602
                              PPC_ALTIVEC)
3603
#define POWERPC_MSRM_7440    (0x000000000205FF77ULL)
3604
#define POWERPC_MMU_7440     (POWERPC_MMU_SOFT_74xx)
3605
#define POWERPC_EXCP_7440    (POWERPC_EXCP_74xx)
3606
#define POWERPC_INPUT_7440   (PPC_FLAGS_INPUT_6xx)
3607
#define POWERPC_BFDM_7440    (bfd_mach_ppc_7400)
3608

    
3609
__attribute__ (( unused ))
3610
static void init_proc_7440 (CPUPPCState *env)
3611
{
3612
    gen_spr_ne_601(env);
3613
    gen_spr_7xx(env);
3614
    /* Time base */
3615
    gen_tbl(env);
3616
    /* 74xx specific SPR */
3617
    gen_spr_74xx(env);
3618
    /* LDSTCR */
3619
    /* XXX : not implemented */
3620
    spr_register(env, SPR_LDSTCR, "LDSTCR",
3621
                 SPR_NOACCESS, SPR_NOACCESS,
3622
                 &spr_read_generic, &spr_write_generic,
3623
                 0x00000000);
3624
    /* ICTRL */
3625
    /* XXX : not implemented */
3626
    spr_register(env, SPR_ICTRL, "ICTRL",
3627
                 SPR_NOACCESS, SPR_NOACCESS,
3628
                 &spr_read_generic, &spr_write_generic,
3629
                 0x00000000);
3630
    /* MSSSR0 */
3631
    /* XXX : not implemented */
3632
    spr_register(env, SPR_MSSSR0, "MSSSR0",
3633
                 SPR_NOACCESS, SPR_NOACCESS,
3634
                 &spr_read_generic, &spr_write_generic,
3635
                 0x00000000);
3636
    /* PMC */
3637
    /* XXX : not implemented */
3638
    spr_register(env, SPR_PMC5, "PMC5",
3639
                 SPR_NOACCESS, SPR_NOACCESS,
3640
                 &spr_read_generic, &spr_write_generic,
3641
                 0x00000000);
3642
    /* XXX : not implemented */
3643
    spr_register(env, SPR_UPMC5, "UPMC5",
3644
                 &spr_read_ureg, SPR_NOACCESS,
3645
                 &spr_read_ureg, SPR_NOACCESS,
3646
                 0x00000000);
3647
    /* XXX : not implemented */
3648
    spr_register(env, SPR_PMC6, "PMC6",
3649
                 SPR_NOACCESS, SPR_NOACCESS,
3650
                 &spr_read_generic, &spr_write_generic,
3651
                 0x00000000);
3652
    /* XXX : not implemented */
3653
    spr_register(env, SPR_UPMC6, "UPMC6",
3654
                 &spr_read_ureg, SPR_NOACCESS,
3655
                 &spr_read_ureg, SPR_NOACCESS,
3656
                 0x00000000);
3657
    /* Memory management */
3658
    gen_low_BATs(env);
3659
    gen_74xx_soft_tlb(env, 128, 2);
3660
    init_excp_7450(env);
3661
    env->dcache_line_size = 32;
3662
    env->icache_line_size = 32;
3663
    /* Allocate hardware IRQ controller */
3664
    ppc6xx_irq_init(env);
3665
}
3666

    
3667
/* PowerPC 7450 (aka G4)                                                     */
3668
#define POWERPC_INSNS_7450   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3669
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3670
                              PPC_ALTIVEC)
3671
#define POWERPC_MSRM_7450    (0x000000000205FF77ULL)
3672
#define POWERPC_MMU_7450     (POWERPC_MMU_SOFT_74xx)
3673
#define POWERPC_EXCP_7450    (POWERPC_EXCP_74xx)
3674
#define POWERPC_INPUT_7450   (PPC_FLAGS_INPUT_6xx)
3675
#define POWERPC_BFDM_7450    (bfd_mach_ppc_7400)
3676

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

    
3737
/* PowerPC 7445 (aka G4)                                                     */
3738
#define POWERPC_INSNS_7445   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3739
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3740
                              PPC_ALTIVEC)
3741
#define POWERPC_MSRM_7445    (0x000000000205FF77ULL)
3742
#define POWERPC_MMU_7445     (POWERPC_MMU_SOFT_74xx)
3743
#define POWERPC_EXCP_7445    (POWERPC_EXCP_74xx)
3744
#define POWERPC_INPUT_7445   (PPC_FLAGS_INPUT_6xx)
3745
#define POWERPC_BFDM_7445    (bfd_mach_ppc_7400)
3746

    
3747
__attribute__ (( unused ))
3748
static void init_proc_7445 (CPUPPCState *env)
3749
{
3750
    gen_spr_ne_601(env);
3751
    gen_spr_7xx(env);
3752
    /* Time base */
3753
    gen_tbl(env);
3754
    /* 74xx specific SPR */
3755
    gen_spr_74xx(env);
3756
    /* LDSTCR */
3757
    /* XXX : not implemented */
3758
    spr_register(env, SPR_LDSTCR, "LDSTCR",
3759
                 SPR_NOACCESS, SPR_NOACCESS,
3760
                 &spr_read_generic, &spr_write_generic,
3761
                 0x00000000);
3762
    /* ICTRL */
3763
    /* XXX : not implemented */
3764
    spr_register(env, SPR_ICTRL, "ICTRL",
3765
                 SPR_NOACCESS, SPR_NOACCESS,
3766
                 &spr_read_generic, &spr_write_generic,
3767
                 0x00000000);
3768
    /* MSSSR0 */
3769
    /* XXX : not implemented */
3770
    spr_register(env, SPR_MSSSR0, "MSSSR0",
3771
                 SPR_NOACCESS, SPR_NOACCESS,
3772
                 &spr_read_generic, &spr_write_generic,
3773
                 0x00000000);
3774
    /* PMC */
3775
    /* XXX : not implemented */
3776
    spr_register(env, SPR_PMC5, "PMC5",
3777
                 SPR_NOACCESS, SPR_NOACCESS,
3778
                 &spr_read_generic, &spr_write_generic,
3779
                 0x00000000);
3780
    /* XXX : not implemented */
3781
    spr_register(env, SPR_UPMC5, "UPMC5",
3782
                 &spr_read_ureg, SPR_NOACCESS,
3783
                 &spr_read_ureg, SPR_NOACCESS,
3784
                 0x00000000);
3785
    /* XXX : not implemented */
3786
    spr_register(env, SPR_PMC6, "PMC6",
3787
                 SPR_NOACCESS, SPR_NOACCESS,
3788
                 &spr_read_generic, &spr_write_generic,
3789
                 0x00000000);
3790
    /* XXX : not implemented */
3791
    spr_register(env, SPR_UPMC6, "UPMC6",
3792
                 &spr_read_ureg, SPR_NOACCESS,
3793
                 &spr_read_ureg, SPR_NOACCESS,
3794
                 0x00000000);
3795
    /* SPRGs */
3796
    spr_register(env, SPR_SPRG4, "SPRG4",
3797
                 SPR_NOACCESS, SPR_NOACCESS,
3798
                 &spr_read_generic, &spr_write_generic,
3799
                 0x00000000);
3800
    spr_register(env, SPR_USPRG4, "USPRG4",
3801
                 &spr_read_ureg, SPR_NOACCESS,
3802
                 &spr_read_ureg, SPR_NOACCESS,
3803
                 0x00000000);
3804
    spr_register(env, SPR_SPRG5, "SPRG5",
3805
                 SPR_NOACCESS, SPR_NOACCESS,
3806
                 &spr_read_generic, &spr_write_generic,
3807
                 0x00000000);
3808
    spr_register(env, SPR_USPRG5, "USPRG5",
3809
                 &spr_read_ureg, SPR_NOACCESS,
3810
                 &spr_read_ureg, SPR_NOACCESS,
3811
                 0x00000000);
3812
    spr_register(env, SPR_SPRG6, "SPRG6",
3813
                 SPR_NOACCESS, SPR_NOACCESS,
3814
                 &spr_read_generic, &spr_write_generic,
3815
                 0x00000000);
3816
    spr_register(env, SPR_USPRG6, "USPRG6",
3817
                 &spr_read_ureg, SPR_NOACCESS,
3818
                 &spr_read_ureg, SPR_NOACCESS,
3819
                 0x00000000);
3820
    spr_register(env, SPR_SPRG7, "SPRG7",
3821
                 SPR_NOACCESS, SPR_NOACCESS,
3822
                 &spr_read_generic, &spr_write_generic,
3823
                 0x00000000);
3824
    spr_register(env, SPR_USPRG7, "USPRG7",
3825
                 &spr_read_ureg, SPR_NOACCESS,
3826
                 &spr_read_ureg, SPR_NOACCESS,
3827
                 0x00000000);
3828
    /* Memory management */
3829
    gen_low_BATs(env);
3830
    gen_high_BATs(env);
3831
    gen_74xx_soft_tlb(env, 128, 2);
3832
    init_excp_7450(env);
3833
    env->dcache_line_size = 32;
3834
    env->icache_line_size = 32;
3835
    /* Allocate hardware IRQ controller */
3836
    ppc6xx_irq_init(env);
3837
}
3838

    
3839
/* PowerPC 7455 (aka G4)                                                     */
3840
#define POWERPC_INSNS_7455   (POWERPC_INSNS_WORKS | PPC_CACHE_DCBA |          \
3841
                              PPC_EXTERN | PPC_74xx_TLB | PPC_MEM_TLBIA |     \
3842
                              PPC_ALTIVEC)
3843
#define POWERPC_MSRM_7455    (0x000000000205FF77ULL)
3844
#define POWERPC_MMU_7455     (POWERPC_MMU_SOFT_74xx)
3845
#define POWERPC_EXCP_7455    (POWERPC_EXCP_74xx)
3846
#define POWERPC_INPUT_7455   (PPC_FLAGS_INPUT_6xx)
3847
#define POWERPC_BFDM_7455    (bfd_mach_ppc_7400)
3848

    
3849
__attribute__ (( unused ))
3850
static void init_proc_7455 (CPUPPCState *env)
3851
{
3852
    gen_spr_ne_601(env);
3853
    gen_spr_7xx(env);
3854
    /* Time base */
3855
    gen_tbl(env);
3856
    /* 74xx specific SPR */
3857
    gen_spr_74xx(env);
3858
    /* Level 3 cache control */
3859
    gen_l3_ctrl(env);
3860
    /* LDSTCR */
3861
    /* XXX : not implemented */
3862
    spr_register(env, SPR_LDSTCR, "LDSTCR",
3863
                 SPR_NOACCESS, SPR_NOACCESS,
3864
                 &spr_read_generic, &spr_write_generic,
3865
                 0x00000000);
3866
    /* ICTRL */
3867
    /* XXX : not implemented */
3868
    spr_register(env, SPR_ICTRL, "ICTRL",
3869
                 SPR_NOACCESS, SPR_NOACCESS,
3870
                 &spr_read_generic, &spr_write_generic,
3871
                 0x00000000);
3872
    /* MSSSR0 */
3873
    /* XXX : not implemented */
3874
    spr_register(env, SPR_MSSSR0, "MSSSR0",
3875
                 SPR_NOACCESS, SPR_NOACCESS,
3876
                 &spr_read_generic, &spr_write_generic,
3877
                 0x00000000);
3878
    /* PMC */
3879
    /* XXX : not implemented */
3880
    spr_register(env, SPR_PMC5, "PMC5",
3881
                 SPR_NOACCESS, SPR_NOACCESS,
3882
                 &spr_read_generic, &spr_write_generic,
3883
                 0x00000000);
3884
    /* XXX : not implemented */
3885
    spr_register(env, SPR_UPMC5, "UPMC5",
3886
                 &spr_read_ureg, SPR_NOACCESS,
3887
                 &spr_read_ureg, SPR_NOACCESS,
3888
                 0x00000000);
3889
    /* XXX : not implemented */
3890
    spr_register(env, SPR_PMC6, "PMC6",
3891
                 SPR_NOACCESS, SPR_NOACCESS,
3892
                 &spr_read_generic, &spr_write_generic,
3893
                 0x00000000);
3894
    /* XXX : not implemented */
3895
    spr_register(env, SPR_UPMC6, "UPMC6",
3896
                 &spr_read_ureg, SPR_NOACCESS,
3897
                 &spr_read_ureg, SPR_NOACCESS,
3898
                 0x00000000);
3899
    /* SPRGs */
3900
    spr_register(env, SPR_SPRG4, "SPRG4",
3901
                 SPR_NOACCESS, SPR_NOACCESS,
3902
                 &spr_read_generic, &spr_write_generic,
3903
                 0x00000000);
3904
    spr_register(env, SPR_USPRG4, "USPRG4",
3905
                 &spr_read_ureg, SPR_NOACCESS,
3906
                 &spr_read_ureg, SPR_NOACCESS,
3907
                 0x00000000);
3908
    spr_register(env, SPR_SPRG5, "SPRG5",
3909
                 SPR_NOACCESS, SPR_NOACCESS,
3910
                 &spr_read_generic, &spr_write_generic,
3911
                 0x00000000);
3912
    spr_register(env, SPR_USPRG5, "USPRG5",
3913
                 &spr_read_ureg, SPR_NOACCESS,
3914
                 &spr_read_ureg, SPR_NOACCESS,
3915
                 0x00000000);
3916
    spr_register(env, SPR_SPRG6, "SPRG6",
3917
                 SPR_NOACCESS, SPR_NOACCESS,
3918
                 &spr_read_generic, &spr_write_generic,
3919
                 0x00000000);
3920
    spr_register(env, SPR_USPRG6, "USPRG6",
3921
                 &spr_read_ureg, SPR_NOACCESS,
3922
                 &spr_read_ureg, SPR_NOACCESS,
3923
                 0x00000000);
3924
    spr_register(env, SPR_SPRG7, "SPRG7",
3925
                 SPR_NOACCESS, SPR_NOACCESS,
3926
                 &spr_read_generic, &spr_write_generic,
3927
                 0x00000000);
3928
    spr_register(env, SPR_USPRG7, "USPRG7",
3929
                 &spr_read_ureg, SPR_NOACCESS,
3930
                 &spr_read_ureg, SPR_NOACCESS,
3931
                 0x00000000);
3932
    /* Memory management */
3933
    gen_low_BATs(env);
3934
    gen_high_BATs(env);
3935
    gen_74xx_soft_tlb(env, 128, 2);
3936
    init_excp_7450(env);
3937
    env->dcache_line_size = 32;
3938
    env->icache_line_size = 32;
3939
    /* Allocate hardware IRQ controller */
3940
    ppc6xx_irq_init(env);
3941
}
3942

    
3943
#if defined (TARGET_PPC64)
3944
#define POWERPC_INSNS_WORK64  (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT |          \
3945
                              PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE |            \
3946
                              PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX |             \
3947
                              PPC_MEM_TLBSYNC | PPC_CACHE_DCBZT | PPC_MFTB)
3948
/* PowerPC 970                                                               */
3949
#define POWERPC_INSNS_970    (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT |        \
3950
                              PPC_64B | PPC_ALTIVEC |                         \
3951
                              PPC_64_BRIDGE | PPC_SLBI)
3952
#define POWERPC_MSRM_970     (0x900000000204FF36ULL)
3953
#define POWERPC_MMU_970      (POWERPC_MMU_64BRIDGE)
3954
//#define POWERPC_EXCP_970     (POWERPC_EXCP_970)
3955
#define POWERPC_INPUT_970    (PPC_FLAGS_INPUT_970)
3956
#define POWERPC_BFDM_970     (bfd_mach_ppc64)
3957

    
3958
static void init_proc_970 (CPUPPCState *env)
3959
{
3960
    gen_spr_ne_601(env);
3961
    gen_spr_7xx(env);
3962
    /* Time base */
3963
    gen_tbl(env);
3964
    /* Hardware implementation registers */
3965
    /* XXX : not implemented */
3966
    spr_register(env, SPR_HID0, "HID0",
3967
                 SPR_NOACCESS, SPR_NOACCESS,
3968
                 &spr_read_generic, &spr_write_clear,
3969
                 0x60000000);
3970
    /* XXX : not implemented */
3971
    spr_register(env, SPR_HID1, "HID1",
3972
                 SPR_NOACCESS, SPR_NOACCESS,
3973
                 &spr_read_generic, &spr_write_generic,
3974
                 0x00000000);
3975
    /* XXX : not implemented */
3976
    spr_register(env, SPR_750_HID2, "HID2",
3977
                 SPR_NOACCESS, SPR_NOACCESS,
3978
                 &spr_read_generic, &spr_write_generic,
3979
                 0x00000000);
3980
    /* XXX : not implemented */
3981
    spr_register(env, SPR_970_HID5, "HID5",
3982
                 SPR_NOACCESS, SPR_NOACCESS,
3983
                 &spr_read_generic, &spr_write_generic,
3984
#if defined(CONFIG_USER_ONLY)
3985
                 0x00000080
3986
#else
3987
                 0x00000000
3988
#endif
3989
                 );
3990
    /* Memory management */
3991
    /* XXX: not correct */
3992
    gen_low_BATs(env);
3993
#if 0 // TODO
3994
    env->slb_nr = 32;
3995
#endif
3996
    init_excp_970(env);
3997
    env->dcache_line_size = 128;
3998
    env->icache_line_size = 128;
3999
    /* Allocate hardware IRQ controller */
4000
    ppc970_irq_init(env);
4001
}
4002

    
4003
/* PowerPC 970FX (aka G5)                                                    */
4004
#define POWERPC_INSNS_970FX  (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT |        \
4005
                              PPC_64B | PPC_ALTIVEC |                         \
4006
                              PPC_64_BRIDGE | PPC_SLBI)
4007
#define POWERPC_MSRM_970FX   (0x800000000204FF36ULL)
4008
#define POWERPC_MMU_970FX    (POWERPC_MMU_64BRIDGE)
4009
#define POWERPC_EXCP_970FX   (POWERPC_EXCP_970)
4010
#define POWERPC_INPUT_970FX  (PPC_FLAGS_INPUT_970)
4011
#define POWERPC_BFDM_970FX   (bfd_mach_ppc64)
4012

    
4013
static void init_proc_970FX (CPUPPCState *env)
4014
{
4015
    gen_spr_ne_601(env);
4016
    gen_spr_7xx(env);
4017
    /* Time base */
4018
    gen_tbl(env);
4019
    /* Hardware implementation registers */
4020
    /* XXX : not implemented */
4021
    spr_register(env, SPR_HID0, "HID0",
4022
                 SPR_NOACCESS, SPR_NOACCESS,
4023
                 &spr_read_generic, &spr_write_clear,
4024
                 0x60000000);
4025
    /* XXX : not implemented */
4026
    spr_register(env, SPR_HID1, "HID1",
4027
                 SPR_NOACCESS, SPR_NOACCESS,
4028
                 &spr_read_generic, &spr_write_generic,
4029
                 0x00000000);
4030
    /* XXX : not implemented */
4031
    spr_register(env, SPR_750_HID2, "HID2",
4032
                 SPR_NOACCESS, SPR_NOACCESS,
4033
                 &spr_read_generic, &spr_write_generic,
4034
                 0x00000000);
4035
    /* XXX : not implemented */
4036
    spr_register(env, SPR_970_HID5, "HID5",
4037
                 SPR_NOACCESS, SPR_NOACCESS,
4038
                 &spr_read_generic, &spr_write_generic,
4039
#if defined(CONFIG_USER_ONLY)
4040
                 0x00000080
4041
#else
4042
                 0x00000000
4043
#endif
4044
                 );
4045
    /* Memory management */
4046
    /* XXX: not correct */
4047
    gen_low_BATs(env);
4048
#if 0 // TODO
4049
    env->slb_nr = 32;
4050
#endif
4051
    init_excp_970(env);
4052
    env->dcache_line_size = 128;
4053
    env->icache_line_size = 128;
4054
    /* Allocate hardware IRQ controller */
4055
    ppc970_irq_init(env);
4056
}
4057

    
4058
/* PowerPC 970 GX                                                            */
4059
#define POWERPC_INSNS_970GX  (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT |        \
4060
                              PPC_64B | PPC_ALTIVEC |                         \
4061
                              PPC_64_BRIDGE | PPC_SLBI)
4062
#define POWERPC_MSRM_970GX   (0x800000000204FF36ULL)
4063
#define POWERPC_MMU_970GX    (POWERPC_MMU_64BRIDGE)
4064
#define POWERPC_EXCP_970GX   (POWERPC_EXCP_970)
4065
#define POWERPC_INPUT_970GX  (PPC_FLAGS_INPUT_970)
4066
#define POWERPC_BFDM_970GX   (bfd_mach_ppc64)
4067

    
4068
static void init_proc_970GX (CPUPPCState *env)
4069
{
4070
    gen_spr_ne_601(env);
4071
    gen_spr_7xx(env);
4072
    /* Time base */
4073
    gen_tbl(env);
4074
    /* Hardware implementation registers */
4075
    /* XXX : not implemented */
4076
    spr_register(env, SPR_HID0, "HID0",
4077
                 SPR_NOACCESS, SPR_NOACCESS,
4078
                 &spr_read_generic, &spr_write_clear,
4079
                 0x60000000);
4080
    /* XXX : not implemented */
4081
    spr_register(env, SPR_HID1, "HID1",
4082
                 SPR_NOACCESS, SPR_NOACCESS,
4083
                 &spr_read_generic, &spr_write_generic,
4084
                 0x00000000);
4085
    /* XXX : not implemented */
4086
    spr_register(env, SPR_750_HID2, "HID2",
4087
                 SPR_NOACCESS, SPR_NOACCESS,
4088
                 &spr_read_generic, &spr_write_generic,
4089
                 0x00000000);
4090
    /* XXX : not implemented */
4091
    spr_register(env, SPR_970_HID5, "HID5",
4092
                 SPR_NOACCESS, SPR_NOACCESS,
4093
                 &spr_read_generic, &spr_write_generic,
4094
#if defined(CONFIG_USER_ONLY)
4095
                 0x00000080
4096
#else
4097
                 0x00000000
4098
#endif
4099
                 );
4100
    /* Memory management */
4101
    /* XXX: not correct */
4102
    gen_low_BATs(env);
4103
#if 0 // TODO
4104
    env->slb_nr = 32;
4105
#endif
4106
    init_excp_970(env);
4107
    env->dcache_line_size = 128;
4108
    env->icache_line_size = 128;
4109
    /* Allocate hardware IRQ controller */
4110
    ppc970_irq_init(env);
4111
}
4112

    
4113
/* PowerPC 620                                                               */
4114
#define POWERPC_INSNS_620    (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT |         \
4115
                              PPC_64B | PPC_SLBI)
4116
#define POWERPC_MSRM_620     (0x800000000005FF73ULL)
4117
#define POWERPC_MMU_620      (POWERPC_MMU_64B)
4118
#define POWERPC_EXCP_620     (POWERPC_EXCP_970)
4119
#define POWERPC_INPUT_620    (PPC_FLAGS_INPUT_970)
4120
#define POWERPC_BFDM_620     (bfd_mach_ppc64)
4121

    
4122
__attribute__ (( unused ))
4123
static void init_proc_620 (CPUPPCState *env)
4124
{
4125
    gen_spr_ne_601(env);
4126
    gen_spr_620(env);
4127
    /* Time base */
4128
    gen_tbl(env);
4129
    /* Hardware implementation registers */
4130
    /* XXX : not implemented */
4131
    spr_register(env, SPR_HID0, "HID0",
4132
                 SPR_NOACCESS, SPR_NOACCESS,
4133
                 &spr_read_generic, &spr_write_generic,
4134
                 0x00000000);
4135
    /* Memory management */
4136
    gen_low_BATs(env);
4137
    gen_high_BATs(env);
4138
    init_excp_620(env);
4139
    env->dcache_line_size = 64;
4140
    env->icache_line_size = 64;
4141
    /* XXX: TODO: initialize internal interrupt controller */
4142
}
4143
#endif /* defined (TARGET_PPC64) */
4144

    
4145
/* Default 32 bits PowerPC target will be 604 */
4146
#define CPU_POWERPC_PPC32     CPU_POWERPC_604
4147
#define POWERPC_INSNS_PPC32   POWERPC_INSNS_604
4148
#define POWERPC_MSRM_PPC32    POWERPC_MSRM_604
4149
#define POWERPC_MMU_PPC32     POWERPC_MMU_604
4150
#define POWERPC_EXCP_PPC32    POWERPC_EXCP_604
4151
#define POWERPC_INPUT_PPC32   POWERPC_INPUT_604
4152
#define init_proc_PPC32       init_proc_604
4153
#define POWERPC_BFDM_PPC32    POWERPC_BFDM_604
4154

    
4155
/* Default 64 bits PowerPC target will be 970 FX */
4156
#define CPU_POWERPC_PPC64     CPU_POWERPC_970FX
4157
#define POWERPC_INSNS_PPC64   POWERPC_INSNS_970FX
4158
#define POWERPC_MSRM_PPC64    POWERPC_MSRM_970FX
4159
#define POWERPC_MMU_PPC64     POWERPC_MMU_970FX
4160
#define POWERPC_EXCP_PPC64    POWERPC_EXCP_970FX
4161
#define POWERPC_INPUT_PPC64   POWERPC_INPUT_970FX
4162
#define init_proc_PPC64       init_proc_970FX
4163
#define POWERPC_BFDM_PPC64    POWERPC_BFDM_970FX
4164

    
4165
/* Default PowerPC target will be PowerPC 32 */
4166
#if defined (TARGET_PPC64) && 0 // XXX: TODO
4167
#define CPU_POWERPC_DEFAULT   CPU_POWERPC_PPC64
4168
#define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC64
4169
#define POWERPC_MSRM_DEFAULT  POWERPC_MSRM_PPC64
4170
#define POWERPC_MMU_DEFAULT   POWERPC_MMU_PPC64
4171
#define POWERPC_EXCP_DEFAULT  POWERPC_EXCP_PPC64
4172
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC64
4173
#define init_proc_DEFAULT     init_proc_PPC64
4174
#define POWERPC_BFDM_DEFAULT  POWERPC_BFDM_PPC64
4175
#else
4176
#define CPU_POWERPC_DEFAULT   CPU_POWERPC_PPC32
4177
#define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC32
4178
#define POWERPC_MSRM_DEFAULT  POWERPC_MSRM_PPC32
4179
#define POWERPC_MMU_DEFAULT   POWERPC_MMU_PPC32
4180
#define POWERPC_EXCP_DEFAULT  POWERPC_EXCP_PPC32
4181
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC32
4182
#define init_proc_DEFAULT     init_proc_PPC32
4183
#define POWERPC_BFDM_DEFAULT  POWERPC_BFDM_PPC32
4184
#endif
4185

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

    
4644
/* System version register (used on MPC 8xxx)                                */
4645
enum {
4646
    PPC_SVR_8540      = 0x80300000,
4647
    PPC_SVR_8541E     = 0x807A0010,
4648
    PPC_SVR_8543v10   = 0x80320010,
4649
    PPC_SVR_8543v11   = 0x80320011,
4650
    PPC_SVR_8543v20   = 0x80320020,
4651
    PPC_SVR_8543Ev10  = 0x803A0010,
4652
    PPC_SVR_8543Ev11  = 0x803A0011,
4653
    PPC_SVR_8543Ev20  = 0x803A0020,
4654
    PPC_SVR_8545      = 0x80310220,
4655
    PPC_SVR_8545E     = 0x80390220,
4656
    PPC_SVR_8547E     = 0x80390120,
4657
    PPC_SCR_8548v10   = 0x80310010,
4658
    PPC_SCR_8548v11   = 0x80310011,
4659
    PPC_SCR_8548v20   = 0x80310020,
4660
    PPC_SVR_8548Ev10  = 0x80390010,
4661
    PPC_SVR_8548Ev11  = 0x80390011,
4662
    PPC_SVR_8548Ev20  = 0x80390020,
4663
    PPC_SVR_8555E     = 0x80790010,
4664
    PPC_SVR_8560v10   = 0x80700010,
4665
    PPC_SVR_8560v20   = 0x80700020,
4666
};
4667

    
4668
/*****************************************************************************/
4669
/* PowerPC CPU definitions                                                   */
4670
#define POWERPC_DEF(_name, _pvr, _pvr_mask, _type)                            \
4671
    {                                                                         \
4672
        .name        = _name,                                                 \
4673
        .pvr         = _pvr,                                                  \
4674
        .pvr_mask    = _pvr_mask,                                             \
4675
        .insns_flags = glue(POWERPC_INSNS_,_type),                            \
4676
        .msr_mask    = glue(POWERPC_MSRM_,_type),                             \
4677
        .mmu_model   = glue(POWERPC_MMU_,_type),                              \
4678
        .excp_model  = glue(POWERPC_EXCP_,_type),                             \
4679
        .bus_model   = glue(POWERPC_INPUT_,_type),                            \
4680
        .bfd_mach    = glue(POWERPC_BFDM_,_type),                             \
4681
        .init_proc   = &glue(init_proc_,_type),                               \
4682
    }
4683

    
4684
static ppc_def_t ppc_defs[] = {
4685
    /* Embedded PowerPC                                                      */
4686
    /* PowerPC 401 family                                                    */
4687
    /* Generic PowerPC 401 */
4688
    POWERPC_DEF("401",         CPU_POWERPC_401,         0xFFFF0000, 401),
4689
    /* PowerPC 401 cores                                                     */
4690
    /* PowerPC 401A1 */
4691
    POWERPC_DEF("401A1",       CPU_POWERPC_401A1,       0xFFFFFFFF, 401),
4692
    /* PowerPC 401B2                                                         */
4693
    POWERPC_DEF("401B2",       CPU_POWERPC_401B2,       0xFFFFFFFF, 401x2),
4694
#if defined (TODO)
4695
    /* PowerPC 401B3                                                         */
4696
    POWERPC_DEF("401B3",       CPU_POWERPC_401B3,       0xFFFFFFFF, 401x3),
4697
#endif
4698
    /* PowerPC 401C2                                                         */
4699
    POWERPC_DEF("401C2",       CPU_POWERPC_401C2,       0xFFFFFFFF, 401x2),
4700
    /* PowerPC 401D2                                                         */
4701
    POWERPC_DEF("401D2",       CPU_POWERPC_401D2,       0xFFFFFFFF, 401x2),
4702
    /* PowerPC 401E2                                                         */
4703
    POWERPC_DEF("401E2",       CPU_POWERPC_401E2,       0xFFFFFFFF, 401x2),
4704
    /* PowerPC 401F2                                                         */
4705
    POWERPC_DEF("401F2",       CPU_POWERPC_401F2,       0xFFFFFFFF, 401x2),
4706
    /* PowerPC 401G2                                                         */
4707
    /* XXX: to be checked */
4708
    POWERPC_DEF("401G2",       CPU_POWERPC_401G2,       0xFFFFFFFF, 401x2),
4709
    /* PowerPC 401 microcontrolers                                           */
4710
#if defined (TODO)
4711
    /* PowerPC 401GF                                                         */
4712
    POWERPC_DEF("401GF",       CPU_POWERPC_401GF,       0xFFFFFFFF, 401),
4713
#endif
4714
    /* IOP480 (401 microcontroler)                                           */
4715
    POWERPC_DEF("IOP480",      CPU_POWERPC_IOP480,      0xFFFFFFFF, IOP480),
4716
    /* IBM Processor for Network Resources                                   */
4717
    POWERPC_DEF("Cobra",       CPU_POWERPC_COBRA,       0xFFFFFFFF, 401),
4718
#if defined (TODO)
4719
    POWERPC_DEF("Xipchip",     CPU_POWERPC_XIPCHIP,     0xFFFFFFFF, 401),
4720
#endif
4721
    /* PowerPC 403 family                                                    */
4722
    /* Generic PowerPC 403                                                   */
4723
    POWERPC_DEF("403",         CPU_POWERPC_403,         0xFFFF0000, 403),
4724
    /* PowerPC 403 microcontrolers                                           */
4725
    /* PowerPC 403 GA                                                        */
4726
    POWERPC_DEF("403GA",       CPU_POWERPC_403GA,       0xFFFFFFFF, 403),
4727
    /* PowerPC 403 GB                                                        */
4728
    POWERPC_DEF("403GB",       CPU_POWERPC_403GB,       0xFFFFFFFF, 403),
4729
    /* PowerPC 403 GC                                                        */
4730
    POWERPC_DEF("403GC",       CPU_POWERPC_403GC,       0xFFFFFFFF, 403),
4731
    /* PowerPC 403 GCX                                                       */
4732
    POWERPC_DEF("403GCX",      CPU_POWERPC_403GCX,      0xFFFFFFFF, 403GCX),
4733
#if defined (TODO)
4734
    /* PowerPC 403 GP                                                        */
4735
    POWERPC_DEF("403GP",       CPU_POWERPC_403GP,       0xFFFFFFFF, 403),
4736
#endif
4737
    /* PowerPC 405 family                                                    */
4738
    /* Generic PowerPC 405                                                   */
4739
    POWERPC_DEF("405",         CPU_POWERPC_405,         0xFFFF0000, 405),
4740
    /* PowerPC 405 cores                                                     */
4741
#if defined (TODO)
4742
    /* PowerPC 405 A3                                                        */
4743
    POWERPC_DEF("405A3",       CPU_POWERPC_405A3,       0xFFFFFFFF, 405),
4744
#endif
4745
#if defined (TODO)
4746
    /* PowerPC 405 A4                                                        */
4747
    POWERPC_DEF("405A4",       CPU_POWERPC_405A4,       0xFFFFFFFF, 405),
4748
#endif
4749
#if defined (TODO)
4750
    /* PowerPC 405 B3                                                        */
4751
    POWERPC_DEF("405B3",       CPU_POWERPC_405B3,       0xFFFFFFFF, 405),
4752
#endif
4753
#if defined (TODO)
4754
    /* PowerPC 405 B4                                                        */
4755
    POWERPC_DEF("405B4",       CPU_POWERPC_405B4,       0xFFFFFFFF, 405),
4756
#endif
4757
#if defined (TODO)
4758
    /* PowerPC 405 C3                                                        */
4759
    POWERPC_DEF("405C3",       CPU_POWERPC_405C3,       0xFFFFFFFF, 405),
4760
#endif
4761
#if defined (TODO)
4762
    /* PowerPC 405 C4                                                        */
4763
    POWERPC_DEF("405C4",       CPU_POWERPC_405C4,       0xFFFFFFFF, 405),
4764
#endif
4765
    /* PowerPC 405 D2                                                        */
4766
    POWERPC_DEF("405D2",       CPU_POWERPC_405D2,       0xFFFFFFFF, 405),
4767
#if defined (TODO)
4768
    /* PowerPC 405 D3                                                        */
4769
    POWERPC_DEF("405D3",       CPU_POWERPC_405D3,       0xFFFFFFFF, 405),
4770
#endif
4771
    /* PowerPC 405 D4                                                        */
4772
    POWERPC_DEF("405D4",       CPU_POWERPC_405D4,       0xFFFFFFFF, 405),
4773
#if defined (TODO)
4774
    /* PowerPC 405 D5                                                        */
4775
    POWERPC_DEF("405D5",       CPU_POWERPC_405D5,       0xFFFFFFFF, 405),
4776
#endif
4777
#if defined (TODO)
4778
    /* PowerPC 405 E4                                                        */
4779
    POWERPC_DEF("405E4",       CPU_POWERPC_405E4,       0xFFFFFFFF, 405),
4780
#endif
4781
#if defined (TODO)
4782
    /* PowerPC 405 F4                                                        */
4783
    POWERPC_DEF("405F4",       CPU_POWERPC_405F4,       0xFFFFFFFF, 405),
4784
#endif
4785
#if defined (TODO)
4786
    /* PowerPC 405 F5                                                        */
4787
    POWERPC_DEF("405F5",       CPU_POWERPC_405F5,       0xFFFFFFFF, 405),
4788
#endif
4789
#if defined (TODO)
4790
    /* PowerPC 405 F6                                                        */
4791
    POWERPC_DEF("405F6",       CPU_POWERPC_405F6,       0xFFFFFFFF, 405),
4792
#endif
4793
    /* PowerPC 405 microcontrolers                                           */
4794
    /* PowerPC 405 CR                                                        */
4795
    POWERPC_DEF("405CR",       CPU_POWERPC_405CR,       0xFFFFFFFF, 405),
4796
    /* PowerPC 405 CRa                                                       */
4797
    POWERPC_DEF("405CRa",      CPU_POWERPC_405CRa,      0xFFFFFFFF, 405),
4798
    /* PowerPC 405 CRb                                                       */
4799
    POWERPC_DEF("405CRb",      CPU_POWERPC_405CRb,      0xFFFFFFFF, 405),
4800
    /* PowerPC 405 CRc                                                       */
4801
    POWERPC_DEF("405CRc",      CPU_POWERPC_405CRc,      0xFFFFFFFF, 405),
4802
    /* PowerPC 405 EP                                                        */
4803
    POWERPC_DEF("405EP",       CPU_POWERPC_405EP,       0xFFFFFFFF, 405),
4804
#if defined(TODO)
4805
    /* PowerPC 405 EXr                                                       */
4806
    POWERPC_DEF("405EXr",      CPU_POWERPC_405EXr,      0xFFFFFFFF, 405),
4807
#endif
4808
    /* PowerPC 405 EZ                                                        */
4809
    POWERPC_DEF("405EZ",       CPU_POWERPC_405EZ,       0xFFFFFFFF, 405),
4810
#if defined(TODO)
4811
    /* PowerPC 405 FX                                                        */
4812
    POWERPC_DEF("405FX",       CPU_POWERPC_405FX,       0xFFFFFFFF, 405),
4813
#endif
4814
    /* PowerPC 405 GP                                                        */
4815
    POWERPC_DEF("405GP",       CPU_POWERPC_405GP,       0xFFFFFFFF, 405),
4816
    /* PowerPC 405 GPa                                                       */
4817
    POWERPC_DEF("405GPa",      CPU_POWERPC_405GPa,      0xFFFFFFFF, 405),
4818
    /* PowerPC 405 GPb                                                       */
4819
    POWERPC_DEF("405GPb",      CPU_POWERPC_405GPb,      0xFFFFFFFF, 405),
4820
    /* PowerPC 405 GPc                                                       */
4821
    POWERPC_DEF("405GPc",      CPU_POWERPC_405GPc,      0xFFFFFFFF, 405),
4822
    /* PowerPC 405 GPd                                                       */
4823
    POWERPC_DEF("405GPd",      CPU_POWERPC_405GPd,      0xFFFFFFFF, 405),
4824
    /* PowerPC 405 GPe                                                       */
4825
    POWERPC_DEF("405GPe",      CPU_POWERPC_405GPe,      0xFFFFFFFF, 405),
4826
    /* PowerPC 405 GPR                                                       */
4827
    POWERPC_DEF("405GPR",      CPU_POWERPC_405GPR,      0xFFFFFFFF, 405),
4828
#if defined(TODO)
4829
    /* PowerPC 405 H                                                         */
4830
    POWERPC_DEF("405H",        CPU_POWERPC_405H,        0xFFFFFFFF, 405),
4831
#endif
4832
#if defined(TODO)
4833
    /* PowerPC 405 L                                                         */
4834
    POWERPC_DEF("405L",        CPU_POWERPC_405L,        0xFFFFFFFF, 405),
4835
#endif
4836
    /* PowerPC 405 LP                                                        */
4837
    POWERPC_DEF("405LP",       CPU_POWERPC_405LP,       0xFFFFFFFF, 405),
4838
#if defined(TODO)
4839
    /* PowerPC 405 PM                                                        */
4840
    POWERPC_DEF("405PM",       CPU_POWERPC_405PM,       0xFFFFFFFF, 405),
4841
#endif
4842
#if defined(TODO)
4843
    /* PowerPC 405 PS                                                        */
4844
    POWERPC_DEF("405PS",       CPU_POWERPC_405PS,       0xFFFFFFFF, 405),
4845
#endif
4846
#if defined(TODO)
4847
    /* PowerPC 405 S                                                         */
4848
    POWERPC_DEF("405S",        CPU_POWERPC_405S,        0xFFFFFFFF, 405),
4849
#endif
4850
    /* Npe405 H                                                              */
4851
    POWERPC_DEF("Npe405H",     CPU_POWERPC_NPE405H,     0xFFFFFFFF, 405),
4852
    /* Npe405 H2                                                             */
4853
    POWERPC_DEF("Npe405H2",    CPU_POWERPC_NPE405H2,    0xFFFFFFFF, 405),
4854
    /* Npe405 L                                                              */
4855
    POWERPC_DEF("Npe405L",     CPU_POWERPC_NPE405L,     0xFFFFFFFF, 405),
4856
    /* Npe4GS3                                                               */
4857
    POWERPC_DEF("Npe4GS3",     CPU_POWERPC_NPE4GS3,     0xFFFFFFFF, 405),
4858
#if defined (TODO)
4859
    POWERPC_DEF("Npcxx1",      CPU_POWERPC_NPCxx1,      0xFFFFFFFF, 405),
4860
#endif
4861
#if defined (TODO)
4862
    POWERPC_DEF("Npr161",      CPU_POWERPC_NPR161,      0xFFFFFFFF, 405),
4863
#endif
4864
#if defined (TODO)
4865
    /* PowerPC LC77700 (Sanyo)                                               */
4866
    POWERPC_DEF("LC77700",     CPU_POWERPC_LC77700,     0xFFFFFFFF, 405),
4867
#endif
4868
    /* PowerPC 401/403/405 based set-top-box microcontrolers                 */
4869
#if defined (TODO)
4870
    /* STB010000                                                             */
4871
    POWERPC_DEF("STB01000",    CPU_POWERPC_STB01000,    0xFFFFFFFF, 401x2),
4872
#endif
4873
#if defined (TODO)
4874
    /* STB01010                                                              */
4875
    POWERPC_DEF("STB01010",    CPU_POWERPC_STB01010,    0xFFFFFFFF, 401x2),
4876
#endif
4877
#if defined (TODO)
4878
    /* STB0210                                                               */
4879
    POWERPC_DEF("STB0210",     CPU_POWERPC_STB0210,     0xFFFFFFFF, 401x3),
4880
#endif
4881
    /* STB03xx                                                               */
4882
    POWERPC_DEF("STB03",       CPU_POWERPC_STB03,       0xFFFFFFFF, 405),
4883
#if defined (TODO)
4884
    /* STB043x                                                               */
4885
    POWERPC_DEF("STB043",      CPU_POWERPC_STB043,      0xFFFFFFFF, 405),
4886
#endif
4887
#if defined (TODO)
4888
    /* STB045x                                                               */
4889
    POWERPC_DEF("STB045",      CPU_POWERPC_STB045,      0xFFFFFFFF, 405),
4890
#endif
4891
    /* STB04xx                                                               */
4892
    POWERPC_DEF("STB04",       CPU_POWERPC_STB04,       0xFFFF0000, 405),
4893
    /* STB25xx                                                               */
4894
    POWERPC_DEF("STB25",       CPU_POWERPC_STB25,       0xFFFFFFFF, 405),
4895
#if defined (TODO)
4896
    /* STB130                                                                */
4897
    POWERPC_DEF("STB130",      CPU_POWERPC_STB130,      0xFFFFFFFF, 405),
4898
#endif
4899
    /* Xilinx PowerPC 405 cores                                              */
4900
    POWERPC_DEF("x2vp4",       CPU_POWERPC_X2VP4,       0xFFFFFFFF, 405),
4901
    POWERPC_DEF("x2vp7",       CPU_POWERPC_X2VP7,       0xFFFFFFFF, 405),
4902
    POWERPC_DEF("x2vp20",      CPU_POWERPC_X2VP20,      0xFFFFFFFF, 405),
4903
    POWERPC_DEF("x2vp50",      CPU_POWERPC_X2VP50,      0xFFFFFFFF, 405),
4904
#if defined (TODO)
4905
    /* Zarlink ZL10310                                                       */
4906
    POWERPC_DEF("zl10310",     CPU_POWERPC_ZL10310,     0xFFFFFFFF, 405),
4907
#endif
4908
#if defined (TODO)
4909
    /* Zarlink ZL10311                                                       */
4910
    POWERPC_DEF("zl10311",     CPU_POWERPC_ZL10311,     0xFFFFFFFF, 405),
4911
#endif
4912
#if defined (TODO)
4913
    /* Zarlink ZL10320                                                       */
4914
    POWERPC_DEF("zl10320",     CPU_POWERPC_ZL10320,     0xFFFFFFFF, 405),
4915
#endif
4916
#if defined (TODO)
4917
    /* Zarlink ZL10321                                                       */
4918
    POWERPC_DEF("zl10321",     CPU_POWERPC_ZL10321,     0xFFFFFFFF, 405),
4919
#endif
4920
    /* PowerPC 440 family                                                    */
4921
    /* Generic PowerPC 440                                                   */
4922
    POWERPC_DEF("440",         CPU_POWERPC_440,         0xFFFFFFFF, 440GP),
4923
    /* PowerPC 440 cores                                                     */
4924
#if defined (TODO)
4925
    /* PowerPC 440 A4                                                        */
4926
    POWERPC_DEF("440A4",       CPU_POWERPC_440A4,       0xFFFFFFFF, 440x4),
4927
#endif
4928
#if defined (TODO)
4929
    /* PowerPC 440 A5                                                        */
4930
    POWERPC_DEF("440A5",       CPU_POWERPC_440A5,       0xFFFFFFFF, 440x5),
4931
#endif
4932
#if defined (TODO)
4933
    /* PowerPC 440 B4                                                        */
4934
    POWERPC_DEF("440B4",       CPU_POWERPC_440B4,       0xFFFFFFFF, 440x4),
4935
#endif
4936
#if defined (TODO)
4937
    /* PowerPC 440 G4                                                        */
4938
    POWERPC_DEF("440G4",       CPU_POWERPC_440G4,       0xFFFFFFFF, 440x4),
4939
#endif
4940
#if defined (TODO)
4941
    /* PowerPC 440 F5                                                        */
4942
    POWERPC_DEF("440F5",       CPU_POWERPC_440F5,       0xFFFFFFFF, 440x5),
4943
#endif
4944
#if defined (TODO)
4945
    /* PowerPC 440 G5                                                        */
4946
    POWERPC_DEF("440G5",       CPU_POWERPC_440G5,       0xFFFFFFFF, 440x5),
4947
#endif
4948
#if defined (TODO)
4949
    /* PowerPC 440H4                                                         */
4950
    POWERPC_DEF("440H4",       CPU_POWERPC_440H4,       0xFFFFFFFF, 440x4),
4951
#endif
4952
#if defined (TODO)
4953
    /* PowerPC 440H6                                                         */
4954
    POWERPC_DEF("440H6",       CPU_POWERPC_440H6,       0xFFFFFFFF, 440Gx5),
4955
#endif
4956
    /* PowerPC 440 microcontrolers                                           */
4957
    /* PowerPC 440 EP                                                        */
4958
    POWERPC_DEF("440EP",       CPU_POWERPC_440EP,       0xFFFFFFFF, 440EP),
4959
    /* PowerPC 440 EPa                                                       */
4960
    POWERPC_DEF("440EPa",      CPU_POWERPC_440EPa,      0xFFFFFFFF, 440EP),
4961
    /* PowerPC 440 EPb                                                       */
4962
    POWERPC_DEF("440EPb",      CPU_POWERPC_440EPb,      0xFFFFFFFF, 440EP),
4963
    /* PowerPC 440 EPX                                                       */
4964
    POWERPC_DEF("440EPX",      CPU_POWERPC_440EPX,      0xFFFFFFFF, 440EP),
4965
    /* PowerPC 440 GP                                                        */
4966
    POWERPC_DEF("440GP",       CPU_POWERPC_440GP,       0xFFFFFFFF, 440GP),
4967
    /* PowerPC 440 GPb                                                       */
4968
    POWERPC_DEF("440GPb",      CPU_POWERPC_440GPb,      0xFFFFFFFF, 440GP),
4969
    /* PowerPC 440 GPc                                                       */
4970
    POWERPC_DEF("440GPc",      CPU_POWERPC_440GPc,      0xFFFFFFFF, 440GP),
4971
    /* PowerPC 440 GR                                                        */
4972
    POWERPC_DEF("440GR",       CPU_POWERPC_440GR,       0xFFFFFFFF, 440x5),
4973
    /* PowerPC 440 GRa                                                       */
4974
    POWERPC_DEF("440GRa",      CPU_POWERPC_440GRa,      0xFFFFFFFF, 440x5),
4975
    /* PowerPC 440 GRX                                                       */
4976
    POWERPC_DEF("440GRX",      CPU_POWERPC_440GRX,      0xFFFFFFFF, 440x5),
4977
    /* PowerPC 440 GX                                                        */
4978
    POWERPC_DEF("440GX",       CPU_POWERPC_440GX,       0xFFFFFFFF, 440EP),
4979
    /* PowerPC 440 GXa                                                       */
4980
    POWERPC_DEF("440GXa",      CPU_POWERPC_440GXa,      0xFFFFFFFF, 440EP),
4981
    /* PowerPC 440 GXb                                                       */
4982
    POWERPC_DEF("440GXb",      CPU_POWERPC_440GXb,      0xFFFFFFFF, 440EP),
4983
    /* PowerPC 440 GXc                                                       */
4984
    POWERPC_DEF("440GXc",      CPU_POWERPC_440GXc,      0xFFFFFFFF, 440EP),
4985
    /* PowerPC 440 GXf                                                       */
4986
    POWERPC_DEF("440GXf",      CPU_POWERPC_440GXf,      0xFFFFFFFF, 440EP),
4987
#if defined(TODO)
4988
    /* PowerPC 440 S                                                         */
4989
    POWERPC_DEF("440S",        CPU_POWERPC_440S,        0xFFFFFFFF, 440),
4990
#endif
4991
    /* PowerPC 440 SP                                                        */
4992
    POWERPC_DEF("440SP",       CPU_POWERPC_440SP,       0xFFFFFFFF, 440EP),
4993
    /* PowerPC 440 SP2                                                       */
4994
    POWERPC_DEF("440SP2",      CPU_POWERPC_440SP2,      0xFFFFFFFF, 440EP),
4995
    /* PowerPC 440 SPE                                                       */
4996
    POWERPC_DEF("440SPE",      CPU_POWERPC_440SPE,      0xFFFFFFFF, 440EP),
4997
    /* PowerPC 460 family                                                    */
4998
#if defined (TODO)
4999
    /* Generic PowerPC 464                                                   */
5000
    POWERPC_DEF("464",         CPU_POWERPC_464,         0xFFFFFFFF, 460),
5001
#endif
5002
    /* PowerPC 464 microcontrolers                                           */
5003
#if defined (TODO)
5004
    /* PowerPC 464H90                                                        */
5005
    POWERPC_DEF("464H90",      CPU_POWERPC_464H90,      0xFFFFFFFF, 460),
5006
#endif
5007
#if defined (TODO)
5008
    /* PowerPC 464H90F                                                       */
5009
    POWERPC_DEF("464H90F",     CPU_POWERPC_464H90F,     0xFFFFFFFF, 460F),
5010
#endif
5011
    /* Freescale embedded PowerPC cores                                      */
5012
    /* e200 family                                                           */
5013
#if defined (TODO)
5014
    /* Generic PowerPC e200 core                                             */
5015
    POWERPC_DEF("e200",        CPU_POWERPC_e200,        0xFFFFFFFF, e200),
5016
#endif
5017
#if defined (TODO)
5018
    /* PowerPC e200z5 core                                                   */
5019
    POWERPC_DEF("e200z5",      CPU_POWERPC_e200z5,      0xFFFFFFFF, e200),
5020
#endif
5021
#if defined (TODO)
5022
    /* PowerPC e200z6 core                                                   */
5023
    POWERPC_DEF("e200z6",      CPU_POWERPC_e200z6,      0xFFFFFFFF, e200),
5024
#endif
5025
    /* e300 family                                                           */
5026
#if defined (TODO)
5027
    /* Generic PowerPC e300 core                                             */
5028
    POWERPC_DEF("e300",        CPU_POWERPC_e300,        0xFFFFFFFF, e300),
5029
#endif
5030
#if defined (TODO)
5031
    /* PowerPC e300c1 core                                                   */
5032
    POWERPC_DEF("e300c1",      CPU_POWERPC_e300c1,      0xFFFFFFFF, e300),
5033
#endif
5034
#if defined (TODO)
5035
    /* PowerPC e300c2 core                                                   */
5036
    POWERPC_DEF("e300c2",      CPU_POWERPC_e300c2,      0xFFFFFFFF, e300),
5037
#endif
5038
#if defined (TODO)
5039
    /* PowerPC e300c3 core                                                   */
5040
    POWERPC_DEF("e300c3",      CPU_POWERPC_e300c3,      0xFFFFFFFF, e300),
5041
#endif
5042
    /* e500 family                                                           */
5043
#if defined (TODO)
5044
    /* PowerPC e500 core                                                     */
5045
    POWERPC_DEF("e500",        CPU_POWERPC_e500,        0xFFFFFFFF, e500),
5046
#endif
5047
#if defined (TODO)
5048
    /* PowerPC e500 v1.1 core                                                */
5049
    POWERPC_DEF("e500v1.1",    CPU_POWERPC_e500_v11,    0xFFFFFFFF, e500),
5050
#endif
5051
#if defined (TODO)
5052
    /* PowerPC e500 v1.2 core                                                */
5053
    POWERPC_DEF("e500v1.2",    CPU_POWERPC_e500_v12,    0xFFFFFFFF, e500),
5054
#endif
5055
#if defined (TODO)
5056
    /* PowerPC e500 v2.1 core                                                */
5057
    POWERPC_DEF("e500v2.1",    CPU_POWERPC_e500_v21,    0xFFFFFFFF, e500),
5058
#endif
5059
#if defined (TODO)
5060
    /* PowerPC e500 v2.2 core                                                */
5061
    POWERPC_DEF("e500v2.2",    CPU_POWERPC_e500_v22,    0xFFFFFFFF, e500),
5062
#endif
5063
    /* e600 family                                                           */
5064
#if defined (TODO)
5065
    /* PowerPC e600 core                                                     */
5066
    POWERPC_DEF("e600",        CPU_POWERPC_e600,        0xFFFFFFFF, e600),
5067
#endif
5068
    /* PowerPC MPC 5xx cores                                                 */
5069
#if defined (TODO)
5070
    /* PowerPC MPC 5xx                                                       */
5071
    POWERPC_DEF("mpc5xx",      CPU_POWERPC_5xx,         0xFFFFFFFF, 5xx),
5072
#endif
5073
    /* PowerPC MPC 8xx cores                                                 */
5074
#if defined (TODO)
5075
    /* PowerPC MPC 8xx                                                       */
5076
    POWERPC_DEF("mpc8xx",      CPU_POWERPC_8xx,         0xFFFFFFFF, 8xx),
5077
#endif
5078
    /* PowerPC MPC 8xxx cores                                                */
5079
#if defined (TODO)
5080
    /* PowerPC MPC 82xx HIP3                                                 */
5081
    POWERPC_DEF("mpc82xxhip3", CPU_POWERPC_82xx_HIP3,   0xFFFFFFFF, 82xx),
5082
#endif
5083
#if defined (TODO)
5084
    /* PowerPC MPC 82xx HIP4                                                 */
5085
    POWERPC_DEF("mpc82xxhip4", CPU_POWERPC_82xx_HIP4,   0xFFFFFFFF, 82xx),
5086
#endif
5087
#if defined (TODO)
5088
    /* PowerPC MPC 827x                                                      */
5089
    POWERPC_DEF("mpc827x",     CPU_POWERPC_827x,        0xFFFFFFFF, 827x),
5090
#endif
5091

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

    
5631
/*****************************************************************************/
5632
/* Generic CPU instanciation routine                                         */
5633
static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
5634
{
5635
#if !defined(CONFIG_USER_ONLY)
5636
    int i;
5637

    
5638
    env->irq_inputs = NULL;
5639
    /* Set all exception vectors to an invalid address */
5640
    for (i = 0; i < POWERPC_EXCP_NB; i++)
5641
        env->excp_vectors[i] = (target_ulong)(-1ULL);
5642
    env->excp_prefix = 0x00000000;
5643
    env->ivor_mask = 0x00000000;
5644
    env->ivpr_mask = 0x00000000;
5645
#endif
5646
    /* Default MMU definitions */
5647
    env->nb_BATs = 0;
5648
    env->nb_tlb = 0;
5649
    env->nb_ways = 0;
5650
    /* Register SPR common to all PowerPC implementations */
5651
    gen_spr_generic(env);
5652
    spr_register(env, SPR_PVR, "PVR",
5653
                 SPR_NOACCESS, SPR_NOACCESS,
5654
                 &spr_read_generic, SPR_NOACCESS,
5655
                 def->pvr);
5656
    /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
5657
    (*def->init_proc)(env);
5658
    /* Allocate TLBs buffer when needed */
5659
    if (env->nb_tlb != 0) {
5660
        int nb_tlb = env->nb_tlb;
5661
        if (env->id_tlbs != 0)
5662
            nb_tlb *= 2;
5663
        env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
5664
        /* Pre-compute some useful values */
5665
        env->tlb_per_way = env->nb_tlb / env->nb_ways;
5666
    }
5667
#if !defined(CONFIG_USER_ONLY)
5668
    if (env->irq_inputs == NULL) {
5669
        fprintf(stderr, "WARNING: no internal IRQ controller registered.\n"
5670
                " Attempt Qemu to crash very soon !\n");
5671
    }
5672
#endif
5673
}
5674

    
5675
#if defined(PPC_DUMP_CPU)
5676
static void dump_ppc_sprs (CPUPPCState *env)
5677
{
5678
    ppc_spr_t *spr;
5679
#if !defined(CONFIG_USER_ONLY)
5680
    uint32_t sr, sw;
5681
#endif
5682
    uint32_t ur, uw;
5683
    int i, j, n;
5684

    
5685
    printf("Special purpose registers:\n");
5686
    for (i = 0; i < 32; i++) {
5687
        for (j = 0; j < 32; j++) {
5688
            n = (i << 5) | j;
5689
            spr = &env->spr_cb[n];
5690
            uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
5691
            ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
5692
#if !defined(CONFIG_USER_ONLY)
5693
            sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
5694
            sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
5695
            if (sw || sr || uw || ur) {
5696
                printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
5697
                       (i << 5) | j, (i << 5) | j, spr->name,
5698
                       sw ? 'w' : '-', sr ? 'r' : '-',
5699
                       uw ? 'w' : '-', ur ? 'r' : '-');
5700
            }
5701
#else
5702
            if (uw || ur) {
5703
                printf("SPR: %4d (%03x) %-8s u%c%c\n",
5704
                       (i << 5) | j, (i << 5) | j, spr->name,
5705
                       uw ? 'w' : '-', ur ? 'r' : '-');
5706
            }
5707
#endif
5708
        }
5709
    }
5710
    fflush(stdout);
5711
    fflush(stderr);
5712
}
5713
#endif
5714

    
5715
/*****************************************************************************/
5716
#include <stdlib.h>
5717
#include <string.h>
5718

    
5719
int fflush (FILE *stream);
5720

    
5721
/* Opcode types */
5722
enum {
5723
    PPC_DIRECT   = 0, /* Opcode routine        */
5724
    PPC_INDIRECT = 1, /* Indirect opcode table */
5725
};
5726

    
5727
static inline int is_indirect_opcode (void *handler)
5728
{
5729
    return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
5730
}
5731

    
5732
static inline opc_handler_t **ind_table(void *handler)
5733
{
5734
    return (opc_handler_t **)((unsigned long)handler & ~3);
5735
}
5736

    
5737
/* Instruction table creation */
5738
/* Opcodes tables creation */
5739
static void fill_new_table (opc_handler_t **table, int len)
5740
{
5741
    int i;
5742

    
5743
    for (i = 0; i < len; i++)
5744
        table[i] = &invalid_handler;
5745
}
5746

    
5747
static int create_new_table (opc_handler_t **table, unsigned char idx)
5748
{
5749
    opc_handler_t **tmp;
5750

    
5751
    tmp = malloc(0x20 * sizeof(opc_handler_t));
5752
    if (tmp == NULL)
5753
        return -1;
5754
    fill_new_table(tmp, 0x20);
5755
    table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
5756

    
5757
    return 0;
5758
}
5759

    
5760
static int insert_in_table (opc_handler_t **table, unsigned char idx,
5761
                            opc_handler_t *handler)
5762
{
5763
    if (table[idx] != &invalid_handler)
5764
        return -1;
5765
    table[idx] = handler;
5766

    
5767
    return 0;
5768
}
5769

    
5770
static int register_direct_insn (opc_handler_t **ppc_opcodes,
5771
                                 unsigned char idx, opc_handler_t *handler)
5772
{
5773
    if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
5774
        printf("*** ERROR: opcode %02x already assigned in main "
5775
               "opcode table\n", idx);
5776
        return -1;
5777
    }
5778

    
5779
    return 0;
5780
}
5781

    
5782
static int register_ind_in_table (opc_handler_t **table,
5783
                                  unsigned char idx1, unsigned char idx2,
5784
                                  opc_handler_t *handler)
5785
{
5786
    if (table[idx1] == &invalid_handler) {
5787
        if (create_new_table(table, idx1) < 0) {
5788
            printf("*** ERROR: unable to create indirect table "
5789
                   "idx=%02x\n", idx1);
5790
            return -1;
5791
        }
5792
    } else {
5793
        if (!is_indirect_opcode(table[idx1])) {
5794
            printf("*** ERROR: idx %02x already assigned to a direct "
5795
                   "opcode\n", idx1);
5796
            return -1;
5797
        }
5798
    }
5799
    if (handler != NULL &&
5800
        insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
5801
        printf("*** ERROR: opcode %02x already assigned in "
5802
               "opcode table %02x\n", idx2, idx1);
5803
        return -1;
5804
    }
5805

    
5806
    return 0;
5807
}
5808

    
5809
static int register_ind_insn (opc_handler_t **ppc_opcodes,
5810
                              unsigned char idx1, unsigned char idx2,
5811
                              opc_handler_t *handler)
5812
{
5813
    int ret;
5814

    
5815
    ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
5816

    
5817
    return ret;
5818
}
5819

    
5820
static int register_dblind_insn (opc_handler_t **ppc_opcodes,
5821
                                 unsigned char idx1, unsigned char idx2,
5822
                                 unsigned char idx3, opc_handler_t *handler)
5823
{
5824
    if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
5825
        printf("*** ERROR: unable to join indirect table idx "
5826
               "[%02x-%02x]\n", idx1, idx2);
5827
        return -1;
5828
    }
5829
    if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
5830
                              handler) < 0) {
5831
        printf("*** ERROR: unable to insert opcode "
5832
               "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
5833
        return -1;
5834
    }
5835

    
5836
    return 0;
5837
}
5838

    
5839
static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
5840
{
5841
    if (insn->opc2 != 0xFF) {
5842
        if (insn->opc3 != 0xFF) {
5843
            if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
5844
                                     insn->opc3, &insn->handler) < 0)
5845
                return -1;
5846
        } else {
5847
            if (register_ind_insn(ppc_opcodes, insn->opc1,
5848
                                  insn->opc2, &insn->handler) < 0)
5849
                return -1;
5850
        }
5851
    } else {
5852
        if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
5853
            return -1;
5854
    }
5855

    
5856
    return 0;
5857
}
5858

    
5859
static int test_opcode_table (opc_handler_t **table, int len)
5860
{
5861
    int i, count, tmp;
5862

    
5863
    for (i = 0, count = 0; i < len; i++) {
5864
        /* Consistency fixup */
5865
        if (table[i] == NULL)
5866
            table[i] = &invalid_handler;
5867
        if (table[i] != &invalid_handler) {
5868
            if (is_indirect_opcode(table[i])) {
5869
                tmp = test_opcode_table(ind_table(table[i]), 0x20);
5870
                if (tmp == 0) {
5871
                    free(table[i]);
5872
                    table[i] = &invalid_handler;
5873
                } else {
5874
                    count++;
5875
                }
5876
            } else {
5877
                count++;
5878
            }
5879
        }
5880
    }
5881

    
5882
    return count;
5883
}
5884

    
5885
static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
5886
{
5887
    if (test_opcode_table(ppc_opcodes, 0x40) == 0)
5888
        printf("*** WARNING: no opcode defined !\n");
5889
}
5890

    
5891
/*****************************************************************************/
5892
static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
5893
{
5894
    opcode_t *opc, *start, *end;
5895

    
5896
    fill_new_table(env->opcodes, 0x40);
5897
    if (&opc_start < &opc_end) {
5898
        start = &opc_start;
5899
        end = &opc_end;
5900
    } else {
5901
        start = &opc_end;
5902
        end = &opc_start;
5903
    }
5904
    for (opc = start + 1; opc != end; opc++) {
5905
        if ((opc->handler.type & def->insns_flags) != 0) {
5906
            if (register_insn(env->opcodes, opc) < 0) {
5907
                printf("*** ERROR initializing PowerPC instruction "
5908
                       "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
5909
                       opc->opc3);
5910
                return -1;
5911
            }
5912
        }
5913
    }
5914
    fix_opcode_tables(env->opcodes);
5915
    fflush(stdout);
5916
    fflush(stderr);
5917

    
5918
    return 0;
5919
}
5920

    
5921
#if defined(PPC_DUMP_CPU)
5922
static int dump_ppc_insns (CPUPPCState *env)
5923
{
5924
    opc_handler_t **table, *handler;
5925
    uint8_t opc1, opc2, opc3;
5926

    
5927
    printf("Instructions set:\n");
5928
    /* opc1 is 6 bits long */
5929
    for (opc1 = 0x00; opc1 < 0x40; opc1++) {
5930
        table = env->opcodes;
5931
        handler = table[opc1];
5932
        if (is_indirect_opcode(handler)) {
5933
            /* opc2 is 5 bits long */
5934
            for (opc2 = 0; opc2 < 0x20; opc2++) {
5935
                table = env->opcodes;
5936
                handler = env->opcodes[opc1];
5937
                table = ind_table(handler);
5938
                handler = table[opc2];
5939
                if (is_indirect_opcode(handler)) {
5940
                    table = ind_table(handler);
5941
                    /* opc3 is 5 bits long */
5942
                    for (opc3 = 0; opc3 < 0x20; opc3++) {
5943
                        handler = table[opc3];
5944
                        if (handler->handler != &gen_invalid) {
5945
                            printf("INSN: %02x %02x %02x (%02d %04d) : %s\n",
5946
                                   opc1, opc2, opc3, opc1, (opc3 << 5) | opc2,
5947
                                   handler->oname);
5948
                        }
5949
                    }
5950
                } else {
5951
                    if (handler->handler != &gen_invalid) {
5952
                        printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
5953
                               opc1, opc2, opc1, opc2, handler->oname);
5954
                    }
5955
                }
5956
            }
5957
        } else {
5958
            if (handler->handler != &gen_invalid) {
5959
                printf("INSN: %02x -- -- (%02d ----) : %s\n",
5960
                       opc1, opc1, handler->oname);
5961
            }
5962
        }
5963
    }
5964
}
5965
#endif
5966

    
5967
int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
5968
{
5969
    env->msr_mask = def->msr_mask;
5970
    env->mmu_model = def->mmu_model;
5971
    env->excp_model = def->excp_model;
5972
    env->bus_model = def->bus_model;
5973
    env->bfd_mach = def->bfd_mach;
5974
    if (create_ppc_opcodes(env, def) < 0)
5975
        return -1;
5976
    init_ppc_proc(env, def);
5977
#if defined(PPC_DUMP_CPU)
5978
    {
5979
        const unsigned char *mmu_model, *excp_model, *bus_model;
5980
        switch (env->mmu_model) {
5981
        case POWERPC_MMU_32B:
5982
            mmu_model = "PowerPC 32";
5983
            break;
5984
        case POWERPC_MMU_601:
5985
            mmu_model = "PowerPC 601";
5986
            break;
5987
        case POWERPC_MMU_SOFT_6xx:
5988
            mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
5989
            break;
5990
        case POWERPC_MMU_SOFT_74xx:
5991
            mmu_model = "PowerPC 74xx with software driven TLBs";
5992
            break;
5993
        case POWERPC_MMU_SOFT_4xx:
5994
            mmu_model = "PowerPC 4xx with software driven TLBs";
5995
            break;
5996
        case POWERPC_MMU_SOFT_4xx_Z:
5997
            mmu_model = "PowerPC 4xx with software driven TLBs "
5998
                "and zones protections";
5999
            break;
6000
        case POWERPC_MMU_REAL_4xx:
6001
            mmu_model = "PowerPC 4xx real mode only";
6002
            break;
6003
        case POWERPC_MMU_BOOKE:
6004
            mmu_model = "PowerPC BookE";
6005
            break;
6006
        case POWERPC_MMU_BOOKE_FSL:
6007
            mmu_model = "PowerPC BookE FSL";
6008
            break;
6009
#if defined (TARGET_PPC64)
6010
        case POWERPC_MMU_64B:
6011
            mmu_model = "PowerPC 64";
6012
            break;
6013
        case POWERPC_MMU_64BRIDGE:
6014
            mmu_model = "PowerPC 64 bridge";
6015
            break;
6016
#endif
6017
        default:
6018
            mmu_model = "Unknown or invalid";
6019
            break;
6020
        }
6021
        switch (env->excp_model) {
6022
        case POWERPC_EXCP_STD:
6023
            excp_model = "PowerPC";
6024
            break;
6025
        case POWERPC_EXCP_40x:
6026
            excp_model = "PowerPC 40x";
6027
            break;
6028
        case POWERPC_EXCP_601:
6029
            excp_model = "PowerPC 601";
6030
            break;
6031
        case POWERPC_EXCP_602:
6032
            excp_model = "PowerPC 602";
6033
            break;
6034
        case POWERPC_EXCP_603:
6035
            excp_model = "PowerPC 603";
6036
            break;
6037
        case POWERPC_EXCP_603E:
6038
            excp_model = "PowerPC 603e";
6039
            break;
6040
        case POWERPC_EXCP_604:
6041
            excp_model = "PowerPC 604";
6042
            break;
6043
        case POWERPC_EXCP_7x0:
6044
            excp_model = "PowerPC 740/750";
6045
            break;
6046
        case POWERPC_EXCP_7x5:
6047
            excp_model = "PowerPC 745/755";
6048
            break;
6049
        case POWERPC_EXCP_74xx:
6050
            excp_model = "PowerPC 74xx";
6051
            break;
6052
        case POWERPC_EXCP_BOOKE:
6053
            excp_model = "PowerPC BookE";
6054
            break;
6055
#if defined (TARGET_PPC64)
6056
        case POWERPC_EXCP_970:
6057
            excp_model = "PowerPC 970";
6058
            break;
6059
#endif
6060
        default:
6061
            excp_model = "Unknown or invalid";
6062
            break;
6063
        }
6064
        switch (env->bus_model) {
6065
        case PPC_FLAGS_INPUT_6xx:
6066
            bus_model = "PowerPC 6xx";
6067
            break;
6068
        case PPC_FLAGS_INPUT_BookE:
6069
            bus_model = "PowerPC BookE";
6070
            break;
6071
        case PPC_FLAGS_INPUT_405:
6072
            bus_model = "PowerPC 405";
6073
            break;
6074
        case PPC_FLAGS_INPUT_401:
6075
            bus_model = "PowerPC 401/403";
6076
            break;
6077
#if defined (TARGET_PPC64)
6078
        case PPC_FLAGS_INPUT_970:
6079
            bus_model = "PowerPC 970";
6080
            break;
6081
#endif
6082
        default:
6083
            bus_model = "Unknown or invalid";
6084
            break;
6085
        }
6086
        printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
6087
               "    MMU model        : %s\n",
6088
               def->name, def->pvr, def->msr_mask, mmu_model);
6089
        if (env->tlb != NULL) {
6090
            printf("                       %d %s TLB in %d ways\n",
6091
                   env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
6092
                   env->nb_ways);
6093
        }
6094
        printf("    Exceptions model : %s\n"
6095
               "    Bus model        : %s\n",
6096
               excp_model, bus_model);
6097
    }
6098
    dump_ppc_insns(env);
6099
    dump_ppc_sprs(env);
6100
    fflush(stdout);
6101
#endif
6102

    
6103
    return 0;
6104
}
6105

    
6106
int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
6107
{
6108
    int i, max, ret;
6109

    
6110
    ret = -1;
6111
    *def = NULL;
6112
    max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6113
    for (i = 0; i < max; i++) {
6114
        if (strcasecmp(name, ppc_defs[i].name) == 0) {
6115
            *def = &ppc_defs[i];
6116
            ret = 0;
6117
            break;
6118
        }
6119
    }
6120

    
6121
    return ret;
6122
}
6123

    
6124
int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
6125
{
6126
    int i, max, ret;
6127

    
6128
    ret = -1;
6129
    *def = NULL;
6130
    max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6131
    for (i = 0; i < max; i++) {
6132
        if ((pvr & ppc_defs[i].pvr_mask) ==
6133
            (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
6134
            *def = &ppc_defs[i];
6135
            ret = 0;
6136
            break;
6137
        }
6138
    }
6139

    
6140
    return ret;
6141
}
6142

    
6143
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
6144
{
6145
    int i, max;
6146

    
6147
    max = sizeof(ppc_defs) / sizeof(ppc_def_t);
6148
    for (i = 0; i < max; i++) {
6149
        (*cpu_fprintf)(f, "PowerPC %-16s PVR %08x\n",
6150
                       ppc_defs[i].name, ppc_defs[i].pvr);
6151
    }
6152
}