Statistics
| Branch: | Revision:

root / target-ppc / translate_init.c @ 8167ee88

History | View | Annotate | Download (413.5 kB)

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

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

    
25
#include "dis-asm.h"
26
#include "gdbstub.h"
27

    
28
//#define PPC_DUMP_CPU
29
//#define PPC_DEBUG_SPR
30
//#define PPC_DUMP_SPR_ACCESSES
31
#if defined(CONFIG_USER_ONLY)
32
#define TODO_USER_ONLY 1
33
#endif
34

    
35
struct ppc_def_t {
36
    const char *name;
37
    uint32_t pvr;
38
    uint32_t svr;
39
    uint64_t insns_flags;
40
    uint64_t msr_mask;
41
    powerpc_mmu_t   mmu_model;
42
    powerpc_excp_t  excp_model;
43
    powerpc_input_t bus_model;
44
    uint32_t flags;
45
    int bfd_mach;
46
    void (*init_proc)(CPUPPCState *env);
47
    int  (*check_pow)(CPUPPCState *env);
48
};
49

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

    
61
PPC_IRQ_INIT_FN(40x);
62
PPC_IRQ_INIT_FN(6xx);
63
PPC_IRQ_INIT_FN(970);
64
PPC_IRQ_INIT_FN(e500);
65

    
66
/* Generic callbacks:
67
 * do nothing but store/retrieve spr value
68
 */
69
static void spr_read_generic (void *opaque, int gprn, int sprn)
70
{
71
    gen_load_spr(cpu_gpr[gprn], sprn);
72
#ifdef PPC_DUMP_SPR_ACCESSES
73
    {
74
        TCGv t0 = tcg_const_i32(sprn);
75
        gen_helper_load_dump_spr(t0);
76
        tcg_temp_free_i32(t0);
77
    }
78
#endif
79
}
80

    
81
static void spr_write_generic (void *opaque, int sprn, int gprn)
82
{
83
    gen_store_spr(sprn, cpu_gpr[gprn]);
84
#ifdef PPC_DUMP_SPR_ACCESSES
85
    {
86
        TCGv t0 = tcg_const_i32(sprn);
87
        gen_helper_store_dump_spr(t0);
88
        tcg_temp_free_i32(t0);
89
    }
90
#endif
91
}
92

    
93
#if !defined(CONFIG_USER_ONLY)
94
static void spr_write_clear (void *opaque, int sprn, int gprn)
95
{
96
    TCGv t0 = tcg_temp_new();
97
    TCGv t1 = tcg_temp_new();
98
    gen_load_spr(t0, sprn);
99
    tcg_gen_neg_tl(t1, cpu_gpr[gprn]);
100
    tcg_gen_and_tl(t0, t0, t1);
101
    gen_store_spr(sprn, t0);
102
    tcg_temp_free(t0);
103
    tcg_temp_free(t1);
104
}
105
#endif
106

    
107
/* SPR common to all PowerPC */
108
/* XER */
109
static void spr_read_xer (void *opaque, int gprn, int sprn)
110
{
111
    tcg_gen_mov_tl(cpu_gpr[gprn], cpu_xer);
112
}
113

    
114
static void spr_write_xer (void *opaque, int sprn, int gprn)
115
{
116
    tcg_gen_mov_tl(cpu_xer, cpu_gpr[gprn]);
117
}
118

    
119
/* LR */
120
static void spr_read_lr (void *opaque, int gprn, int sprn)
121
{
122
    tcg_gen_mov_tl(cpu_gpr[gprn], cpu_lr);
123
}
124

    
125
static void spr_write_lr (void *opaque, int sprn, int gprn)
126
{
127
    tcg_gen_mov_tl(cpu_lr, cpu_gpr[gprn]);
128
}
129

    
130
/* CTR */
131
static void spr_read_ctr (void *opaque, int gprn, int sprn)
132
{
133
    tcg_gen_mov_tl(cpu_gpr[gprn], cpu_ctr);
134
}
135

    
136
static void spr_write_ctr (void *opaque, int sprn, int gprn)
137
{
138
    tcg_gen_mov_tl(cpu_ctr, cpu_gpr[gprn]);
139
}
140

    
141
/* User read access to SPR */
142
/* USPRx */
143
/* UMMCRx */
144
/* UPMCx */
145
/* USIA */
146
/* UDECR */
147
static void spr_read_ureg (void *opaque, int gprn, int sprn)
148
{
149
    gen_load_spr(cpu_gpr[gprn], sprn + 0x10);
150
}
151

    
152
/* SPR common to all non-embedded PowerPC */
153
/* DECR */
154
#if !defined(CONFIG_USER_ONLY)
155
static void spr_read_decr (void *opaque, int gprn, int sprn)
156
{
157
    gen_helper_load_decr(cpu_gpr[gprn]);
158
}
159

    
160
static void spr_write_decr (void *opaque, int sprn, int gprn)
161
{
162
    gen_helper_store_decr(cpu_gpr[gprn]);
163
}
164
#endif
165

    
166
/* SPR common to all non-embedded PowerPC, except 601 */
167
/* Time base */
168
static void spr_read_tbl (void *opaque, int gprn, int sprn)
169
{
170
    gen_helper_load_tbl(cpu_gpr[gprn]);
171
}
172

    
173
static void spr_read_tbu (void *opaque, int gprn, int sprn)
174
{
175
    gen_helper_load_tbu(cpu_gpr[gprn]);
176
}
177

    
178
__attribute__ (( unused ))
179
static void spr_read_atbl (void *opaque, int gprn, int sprn)
180
{
181
    gen_helper_load_atbl(cpu_gpr[gprn]);
182
}
183

    
184
__attribute__ (( unused ))
185
static void spr_read_atbu (void *opaque, int gprn, int sprn)
186
{
187
    gen_helper_load_atbu(cpu_gpr[gprn]);
188
}
189

    
190
#if !defined(CONFIG_USER_ONLY)
191
static void spr_write_tbl (void *opaque, int sprn, int gprn)
192
{
193
    gen_helper_store_tbl(cpu_gpr[gprn]);
194
}
195

    
196
static void spr_write_tbu (void *opaque, int sprn, int gprn)
197
{
198
    gen_helper_store_tbu(cpu_gpr[gprn]);
199
}
200

    
201
__attribute__ (( unused ))
202
static void spr_write_atbl (void *opaque, int sprn, int gprn)
203
{
204
    gen_helper_store_atbl(cpu_gpr[gprn]);
205
}
206

    
207
__attribute__ (( unused ))
208
static void spr_write_atbu (void *opaque, int sprn, int gprn)
209
{
210
    gen_helper_store_atbu(cpu_gpr[gprn]);
211
}
212
#endif
213

    
214
#if !defined(CONFIG_USER_ONLY)
215
/* IBAT0U...IBAT0U */
216
/* IBAT0L...IBAT7L */
217
static void spr_read_ibat (void *opaque, int gprn, int sprn)
218
{
219
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
220
}
221

    
222
static void spr_read_ibat_h (void *opaque, int gprn, int sprn)
223
{
224
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, IBAT[sprn & 1][(sprn - SPR_IBAT4U) / 2]));
225
}
226

    
227
static void spr_write_ibatu (void *opaque, int sprn, int gprn)
228
{
229
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
230
    gen_helper_store_ibatu(t0, cpu_gpr[gprn]);
231
    tcg_temp_free_i32(t0);
232
}
233

    
234
static void spr_write_ibatu_h (void *opaque, int sprn, int gprn)
235
{
236
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT4U) / 2);
237
    gen_helper_store_ibatu(t0, cpu_gpr[gprn]);
238
    tcg_temp_free_i32(t0);
239
}
240

    
241
static void spr_write_ibatl (void *opaque, int sprn, int gprn)
242
{
243
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2);
244
    gen_helper_store_ibatl(t0, cpu_gpr[gprn]);
245
    tcg_temp_free_i32(t0);
246
}
247

    
248
static void spr_write_ibatl_h (void *opaque, int sprn, int gprn)
249
{
250
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT4L) / 2);
251
    gen_helper_store_ibatl(t0, cpu_gpr[gprn]);
252
    tcg_temp_free_i32(t0);
253
}
254

    
255
/* DBAT0U...DBAT7U */
256
/* DBAT0L...DBAT7L */
257
static void spr_read_dbat (void *opaque, int gprn, int sprn)
258
{
259
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, DBAT[sprn & 1][(sprn - SPR_DBAT0U) / 2]));
260
}
261

    
262
static void spr_read_dbat_h (void *opaque, int gprn, int sprn)
263
{
264
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, DBAT[sprn & 1][((sprn - SPR_DBAT4U) / 2) + 4]));
265
}
266

    
267
static void spr_write_dbatu (void *opaque, int sprn, int gprn)
268
{
269
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2);
270
    gen_helper_store_dbatu(t0, cpu_gpr[gprn]);
271
    tcg_temp_free_i32(t0);
272
}
273

    
274
static void spr_write_dbatu_h (void *opaque, int sprn, int gprn)
275
{
276
    TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4);
277
    gen_helper_store_dbatu(t0, cpu_gpr[gprn]);
278
    tcg_temp_free_i32(t0);
279
}
280

    
281
static void spr_write_dbatl (void *opaque, int sprn, int gprn)
282
{
283
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2);
284
    gen_helper_store_dbatl(t0, cpu_gpr[gprn]);
285
    tcg_temp_free_i32(t0);
286
}
287

    
288
static void spr_write_dbatl_h (void *opaque, int sprn, int gprn)
289
{
290
    TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4);
291
    gen_helper_store_dbatl(t0, cpu_gpr[gprn]);
292
    tcg_temp_free_i32(t0);
293
}
294

    
295
/* SDR1 */
296
static void spr_read_sdr1 (void *opaque, int gprn, int sprn)
297
{
298
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, sdr1));
299
}
300

    
301
static void spr_write_sdr1 (void *opaque, int sprn, int gprn)
302
{
303
    gen_helper_store_sdr1(cpu_gpr[gprn]);
304
}
305

    
306
/* 64 bits PowerPC specific SPRs */
307
/* ASR */
308
#if defined(TARGET_PPC64)
309
static void spr_read_hior (void *opaque, int gprn, int sprn)
310
{
311
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, excp_prefix));
312
}
313

    
314
static void spr_write_hior (void *opaque, int sprn, int gprn)
315
{
316
    TCGv t0 = tcg_temp_new();
317
    tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL);
318
    tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_prefix));
319
    tcg_temp_free(t0);
320
}
321

    
322
static void spr_read_asr (void *opaque, int gprn, int sprn)
323
{
324
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, asr));
325
}
326

    
327
static void spr_write_asr (void *opaque, int sprn, int gprn)
328
{
329
    gen_helper_store_asr(cpu_gpr[gprn]);
330
}
331
#endif
332
#endif
333

    
334
/* PowerPC 601 specific registers */
335
/* RTC */
336
static void spr_read_601_rtcl (void *opaque, int gprn, int sprn)
337
{
338
    gen_helper_load_601_rtcl(cpu_gpr[gprn]);
339
}
340

    
341
static void spr_read_601_rtcu (void *opaque, int gprn, int sprn)
342
{
343
    gen_helper_load_601_rtcu(cpu_gpr[gprn]);
344
}
345

    
346
#if !defined(CONFIG_USER_ONLY)
347
static void spr_write_601_rtcu (void *opaque, int sprn, int gprn)
348
{
349
    gen_helper_store_601_rtcu(cpu_gpr[gprn]);
350
}
351

    
352
static void spr_write_601_rtcl (void *opaque, int sprn, int gprn)
353
{
354
    gen_helper_store_601_rtcl(cpu_gpr[gprn]);
355
}
356

    
357
static void spr_write_hid0_601 (void *opaque, int sprn, int gprn)
358
{
359
    DisasContext *ctx = opaque;
360

    
361
    gen_helper_store_hid0_601(cpu_gpr[gprn]);
362
    /* Must stop the translation as endianness may have changed */
363
    gen_stop_exception(ctx);
364
}
365
#endif
366

    
367
/* Unified bats */
368
#if !defined(CONFIG_USER_ONLY)
369
static void spr_read_601_ubat (void *opaque, int gprn, int sprn)
370
{
371
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
372
}
373

    
374
static void spr_write_601_ubatu (void *opaque, int sprn, int gprn)
375
{
376
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
377
    gen_helper_store_601_batl(t0, cpu_gpr[gprn]);
378
    tcg_temp_free_i32(t0);
379
}
380

    
381
static void spr_write_601_ubatl (void *opaque, int sprn, int gprn)
382
{
383
    TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
384
    gen_helper_store_601_batu(t0, cpu_gpr[gprn]);
385
    tcg_temp_free_i32(t0);
386
}
387
#endif
388

    
389
/* PowerPC 40x specific registers */
390
#if !defined(CONFIG_USER_ONLY)
391
static void spr_read_40x_pit (void *opaque, int gprn, int sprn)
392
{
393
    gen_helper_load_40x_pit(cpu_gpr[gprn]);
394
}
395

    
396
static void spr_write_40x_pit (void *opaque, int sprn, int gprn)
397
{
398
    gen_helper_store_40x_pit(cpu_gpr[gprn]);
399
}
400

    
401
static void spr_write_40x_dbcr0 (void *opaque, int sprn, int gprn)
402
{
403
    DisasContext *ctx = opaque;
404

    
405
    gen_helper_store_40x_dbcr0(cpu_gpr[gprn]);
406
    /* We must stop translation as we may have rebooted */
407
    gen_stop_exception(ctx);
408
}
409

    
410
static void spr_write_40x_sler (void *opaque, int sprn, int gprn)
411
{
412
    gen_helper_store_40x_sler(cpu_gpr[gprn]);
413
}
414

    
415
static void spr_write_booke_tcr (void *opaque, int sprn, int gprn)
416
{
417
    gen_helper_store_booke_tcr(cpu_gpr[gprn]);
418
}
419

    
420
static void spr_write_booke_tsr (void *opaque, int sprn, int gprn)
421
{
422
    gen_helper_store_booke_tsr(cpu_gpr[gprn]);
423
}
424
#endif
425

    
426
/* PowerPC 403 specific registers */
427
/* PBL1 / PBU1 / PBL2 / PBU2 */
428
#if !defined(CONFIG_USER_ONLY)
429
static void spr_read_403_pbr (void *opaque, int gprn, int sprn)
430
{
431
    tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, pb[sprn - SPR_403_PBL1]));
432
}
433

    
434
static void spr_write_403_pbr (void *opaque, int sprn, int gprn)
435
{
436
    TCGv_i32 t0 = tcg_const_i32(sprn - SPR_403_PBL1);
437
    gen_helper_store_403_pbr(t0, cpu_gpr[gprn]);
438
    tcg_temp_free_i32(t0);
439
}
440

    
441
static void spr_write_pir (void *opaque, int sprn, int gprn)
442
{
443
    TCGv t0 = tcg_temp_new();
444
    tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF);
445
    gen_store_spr(SPR_PIR, t0);
446
    tcg_temp_free(t0);
447
}
448
#endif
449

    
450
/* SPE specific registers */
451
static void spr_read_spefscr (void *opaque, int gprn, int sprn)
452
{
453
    TCGv_i32 t0 = tcg_temp_new_i32();
454
    tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUState, spe_fscr));
455
    tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0);
456
    tcg_temp_free_i32(t0);
457
}
458

    
459
static void spr_write_spefscr (void *opaque, int sprn, int gprn)
460
{
461
    TCGv_i32 t0 = tcg_temp_new_i32();
462
    tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]);
463
    tcg_gen_st_i32(t0, cpu_env, offsetof(CPUState, spe_fscr));
464
    tcg_temp_free_i32(t0);
465
}
466

    
467
#if !defined(CONFIG_USER_ONLY)
468
/* Callback used to write the exception vector base */
469
static void spr_write_excp_prefix (void *opaque, int sprn, int gprn)
470
{
471
    TCGv t0 = tcg_temp_new();
472
    tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, ivpr_mask));
473
    tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
474
    tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_prefix));
475
    gen_store_spr(sprn, t0);
476
    tcg_temp_free(t0);
477
}
478

    
479
static void spr_write_excp_vector (void *opaque, int sprn, int gprn)
480
{
481
    DisasContext *ctx = opaque;
482

    
483
    if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
484
        TCGv t0 = tcg_temp_new();
485
        tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, ivor_mask));
486
        tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
487
        tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_vectors[sprn - SPR_BOOKE_IVOR0]));
488
        gen_store_spr(sprn, t0);
489
        tcg_temp_free(t0);
490
    } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
491
        TCGv t0 = tcg_temp_new();
492
        tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, ivor_mask));
493
        tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
494
        tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_vectors[sprn - SPR_BOOKE_IVOR32 + 32]));
495
        gen_store_spr(sprn, t0);
496
        tcg_temp_free(t0);
497
    } else {
498
        printf("Trying to write an unknown exception vector %d %03x\n",
499
               sprn, sprn);
500
        gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
501
    }
502
}
503
#endif
504

    
505
static inline void vscr_init (CPUPPCState *env, uint32_t val)
506
{
507
    env->vscr = val;
508
    /* Altivec always uses round-to-nearest */
509
    set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
510
    set_flush_to_zero(vscr_nj, &env->vec_status);
511
}
512

    
513
#if defined(CONFIG_USER_ONLY)
514
#define spr_register(env, num, name, uea_read, uea_write,                     \
515
                     oea_read, oea_write, initial_value)                      \
516
do {                                                                          \
517
     _spr_register(env, num, name, uea_read, uea_write, initial_value);       \
518
} while (0)
519
static inline void _spr_register (CPUPPCState *env, int num,
520
                                  const char *name,
521
                                  void (*uea_read)(void *opaque, int gprn, int sprn),
522
                                  void (*uea_write)(void *opaque, int sprn, int gprn),
523
                                  target_ulong initial_value)
524
#else
525
static inline void spr_register (CPUPPCState *env, int num,
526
                                 const char *name,
527
                                 void (*uea_read)(void *opaque, int gprn, int sprn),
528
                                 void (*uea_write)(void *opaque, int sprn, int gprn),
529
                                 void (*oea_read)(void *opaque, int gprn, int sprn),
530
                                 void (*oea_write)(void *opaque, int sprn, int gprn),
531
                                 target_ulong initial_value)
532
#endif
533
{
534
    ppc_spr_t *spr;
535

    
536
    spr = &env->spr_cb[num];
537
    if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
538
#if !defined(CONFIG_USER_ONLY)
539
        spr->oea_read != NULL || spr->oea_write != NULL ||
540
#endif
541
        spr->uea_read != NULL || spr->uea_write != NULL) {
542
        printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
543
        exit(1);
544
    }
545
#if defined(PPC_DEBUG_SPR)
546
    printf("*** register spr %d (%03x) %s val " ADDRX "\n", num, num, name,
547
           initial_value);
548
#endif
549
    spr->name = name;
550
    spr->uea_read = uea_read;
551
    spr->uea_write = uea_write;
552
#if !defined(CONFIG_USER_ONLY)
553
    spr->oea_read = oea_read;
554
    spr->oea_write = oea_write;
555
#endif
556
    env->spr[num] = initial_value;
557
}
558

    
559
/* Generic PowerPC SPRs */
560
static void gen_spr_generic (CPUPPCState *env)
561
{
562
    /* Integer processing */
563
    spr_register(env, SPR_XER, "XER",
564
                 &spr_read_xer, &spr_write_xer,
565
                 &spr_read_xer, &spr_write_xer,
566
                 0x00000000);
567
    /* Branch contol */
568
    spr_register(env, SPR_LR, "LR",
569
                 &spr_read_lr, &spr_write_lr,
570
                 &spr_read_lr, &spr_write_lr,
571
                 0x00000000);
572
    spr_register(env, SPR_CTR, "CTR",
573
                 &spr_read_ctr, &spr_write_ctr,
574
                 &spr_read_ctr, &spr_write_ctr,
575
                 0x00000000);
576
    /* Interrupt processing */
577
    spr_register(env, SPR_SRR0, "SRR0",
578
                 SPR_NOACCESS, SPR_NOACCESS,
579
                 &spr_read_generic, &spr_write_generic,
580
                 0x00000000);
581
    spr_register(env, SPR_SRR1, "SRR1",
582
                 SPR_NOACCESS, SPR_NOACCESS,
583
                 &spr_read_generic, &spr_write_generic,
584
                 0x00000000);
585
    /* Processor control */
586
    spr_register(env, SPR_SPRG0, "SPRG0",
587
                 SPR_NOACCESS, SPR_NOACCESS,
588
                 &spr_read_generic, &spr_write_generic,
589
                 0x00000000);
590
    spr_register(env, SPR_SPRG1, "SPRG1",
591
                 SPR_NOACCESS, SPR_NOACCESS,
592
                 &spr_read_generic, &spr_write_generic,
593
                 0x00000000);
594
    spr_register(env, SPR_SPRG2, "SPRG2",
595
                 SPR_NOACCESS, SPR_NOACCESS,
596
                 &spr_read_generic, &spr_write_generic,
597
                 0x00000000);
598
    spr_register(env, SPR_SPRG3, "SPRG3",
599
                 SPR_NOACCESS, SPR_NOACCESS,
600
                 &spr_read_generic, &spr_write_generic,
601
                 0x00000000);
602
}
603

    
604
/* SPR common to all non-embedded PowerPC, including 601 */
605
static void gen_spr_ne_601 (CPUPPCState *env)
606
{
607
    /* Exception processing */
608
    spr_register(env, SPR_DSISR, "DSISR",
609
                 SPR_NOACCESS, SPR_NOACCESS,
610
                 &spr_read_generic, &spr_write_generic,
611
                 0x00000000);
612
    spr_register(env, SPR_DAR, "DAR",
613
                 SPR_NOACCESS, SPR_NOACCESS,
614
                 &spr_read_generic, &spr_write_generic,
615
                 0x00000000);
616
    /* Timer */
617
    spr_register(env, SPR_DECR, "DECR",
618
                 SPR_NOACCESS, SPR_NOACCESS,
619
                 &spr_read_decr, &spr_write_decr,
620
                 0x00000000);
621
    /* Memory management */
622
    spr_register(env, SPR_SDR1, "SDR1",
623
                 SPR_NOACCESS, SPR_NOACCESS,
624
                 &spr_read_sdr1, &spr_write_sdr1,
625
                 0x00000000);
626
}
627

    
628
/* BATs 0-3 */
629
static void gen_low_BATs (CPUPPCState *env)
630
{
631
#if !defined(CONFIG_USER_ONLY)
632
    spr_register(env, SPR_IBAT0U, "IBAT0U",
633
                 SPR_NOACCESS, SPR_NOACCESS,
634
                 &spr_read_ibat, &spr_write_ibatu,
635
                 0x00000000);
636
    spr_register(env, SPR_IBAT0L, "IBAT0L",
637
                 SPR_NOACCESS, SPR_NOACCESS,
638
                 &spr_read_ibat, &spr_write_ibatl,
639
                 0x00000000);
640
    spr_register(env, SPR_IBAT1U, "IBAT1U",
641
                 SPR_NOACCESS, SPR_NOACCESS,
642
                 &spr_read_ibat, &spr_write_ibatu,
643
                 0x00000000);
644
    spr_register(env, SPR_IBAT1L, "IBAT1L",
645
                 SPR_NOACCESS, SPR_NOACCESS,
646
                 &spr_read_ibat, &spr_write_ibatl,
647
                 0x00000000);
648
    spr_register(env, SPR_IBAT2U, "IBAT2U",
649
                 SPR_NOACCESS, SPR_NOACCESS,
650
                 &spr_read_ibat, &spr_write_ibatu,
651
                 0x00000000);
652
    spr_register(env, SPR_IBAT2L, "IBAT2L",
653
                 SPR_NOACCESS, SPR_NOACCESS,
654
                 &spr_read_ibat, &spr_write_ibatl,
655
                 0x00000000);
656
    spr_register(env, SPR_IBAT3U, "IBAT3U",
657
                 SPR_NOACCESS, SPR_NOACCESS,
658
                 &spr_read_ibat, &spr_write_ibatu,
659
                 0x00000000);
660
    spr_register(env, SPR_IBAT3L, "IBAT3L",
661
                 SPR_NOACCESS, SPR_NOACCESS,
662
                 &spr_read_ibat, &spr_write_ibatl,
663
                 0x00000000);
664
    spr_register(env, SPR_DBAT0U, "DBAT0U",
665
                 SPR_NOACCESS, SPR_NOACCESS,
666
                 &spr_read_dbat, &spr_write_dbatu,
667
                 0x00000000);
668
    spr_register(env, SPR_DBAT0L, "DBAT0L",
669
                 SPR_NOACCESS, SPR_NOACCESS,
670
                 &spr_read_dbat, &spr_write_dbatl,
671
                 0x00000000);
672
    spr_register(env, SPR_DBAT1U, "DBAT1U",
673
                 SPR_NOACCESS, SPR_NOACCESS,
674
                 &spr_read_dbat, &spr_write_dbatu,
675
                 0x00000000);
676
    spr_register(env, SPR_DBAT1L, "DBAT1L",
677
                 SPR_NOACCESS, SPR_NOACCESS,
678
                 &spr_read_dbat, &spr_write_dbatl,
679
                 0x00000000);
680
    spr_register(env, SPR_DBAT2U, "DBAT2U",
681
                 SPR_NOACCESS, SPR_NOACCESS,
682
                 &spr_read_dbat, &spr_write_dbatu,
683
                 0x00000000);
684
    spr_register(env, SPR_DBAT2L, "DBAT2L",
685
                 SPR_NOACCESS, SPR_NOACCESS,
686
                 &spr_read_dbat, &spr_write_dbatl,
687
                 0x00000000);
688
    spr_register(env, SPR_DBAT3U, "DBAT3U",
689
                 SPR_NOACCESS, SPR_NOACCESS,
690
                 &spr_read_dbat, &spr_write_dbatu,
691
                 0x00000000);
692
    spr_register(env, SPR_DBAT3L, "DBAT3L",
693
                 SPR_NOACCESS, SPR_NOACCESS,
694
                 &spr_read_dbat, &spr_write_dbatl,
695
                 0x00000000);
696
    env->nb_BATs += 4;
697
#endif
698
}
699

    
700
/* BATs 4-7 */
701
static void gen_high_BATs (CPUPPCState *env)
702
{
703
#if !defined(CONFIG_USER_ONLY)
704
    spr_register(env, SPR_IBAT4U, "IBAT4U",
705
                 SPR_NOACCESS, SPR_NOACCESS,
706
                 &spr_read_ibat_h, &spr_write_ibatu_h,
707
                 0x00000000);
708
    spr_register(env, SPR_IBAT4L, "IBAT4L",
709
                 SPR_NOACCESS, SPR_NOACCESS,
710
                 &spr_read_ibat_h, &spr_write_ibatl_h,
711
                 0x00000000);
712
    spr_register(env, SPR_IBAT5U, "IBAT5U",
713
                 SPR_NOACCESS, SPR_NOACCESS,
714
                 &spr_read_ibat_h, &spr_write_ibatu_h,
715
                 0x00000000);
716
    spr_register(env, SPR_IBAT5L, "IBAT5L",
717
                 SPR_NOACCESS, SPR_NOACCESS,
718
                 &spr_read_ibat_h, &spr_write_ibatl_h,
719
                 0x00000000);
720
    spr_register(env, SPR_IBAT6U, "IBAT6U",
721
                 SPR_NOACCESS, SPR_NOACCESS,
722
                 &spr_read_ibat_h, &spr_write_ibatu_h,
723
                 0x00000000);
724
    spr_register(env, SPR_IBAT6L, "IBAT6L",
725
                 SPR_NOACCESS, SPR_NOACCESS,
726
                 &spr_read_ibat_h, &spr_write_ibatl_h,
727
                 0x00000000);
728
    spr_register(env, SPR_IBAT7U, "IBAT7U",
729
                 SPR_NOACCESS, SPR_NOACCESS,
730
                 &spr_read_ibat_h, &spr_write_ibatu_h,
731
                 0x00000000);
732
    spr_register(env, SPR_IBAT7L, "IBAT7L",
733
                 SPR_NOACCESS, SPR_NOACCESS,
734
                 &spr_read_ibat_h, &spr_write_ibatl_h,
735
                 0x00000000);
736
    spr_register(env, SPR_DBAT4U, "DBAT4U",
737
                 SPR_NOACCESS, SPR_NOACCESS,
738
                 &spr_read_dbat_h, &spr_write_dbatu_h,
739
                 0x00000000);
740
    spr_register(env, SPR_DBAT4L, "DBAT4L",
741
                 SPR_NOACCESS, SPR_NOACCESS,
742
                 &spr_read_dbat_h, &spr_write_dbatl_h,
743
                 0x00000000);
744
    spr_register(env, SPR_DBAT5U, "DBAT5U",
745
                 SPR_NOACCESS, SPR_NOACCESS,
746
                 &spr_read_dbat_h, &spr_write_dbatu_h,
747
                 0x00000000);
748
    spr_register(env, SPR_DBAT5L, "DBAT5L",
749
                 SPR_NOACCESS, SPR_NOACCESS,
750
                 &spr_read_dbat_h, &spr_write_dbatl_h,
751
                 0x00000000);
752
    spr_register(env, SPR_DBAT6U, "DBAT6U",
753
                 SPR_NOACCESS, SPR_NOACCESS,
754
                 &spr_read_dbat_h, &spr_write_dbatu_h,
755
                 0x00000000);
756
    spr_register(env, SPR_DBAT6L, "DBAT6L",
757
                 SPR_NOACCESS, SPR_NOACCESS,
758
                 &spr_read_dbat_h, &spr_write_dbatl_h,
759
                 0x00000000);
760
    spr_register(env, SPR_DBAT7U, "DBAT7U",
761
                 SPR_NOACCESS, SPR_NOACCESS,
762
                 &spr_read_dbat_h, &spr_write_dbatu_h,
763
                 0x00000000);
764
    spr_register(env, SPR_DBAT7L, "DBAT7L",
765
                 SPR_NOACCESS, SPR_NOACCESS,
766
                 &spr_read_dbat_h, &spr_write_dbatl_h,
767
                 0x00000000);
768
    env->nb_BATs += 4;
769
#endif
770
}
771

    
772
/* Generic PowerPC time base */
773
static void gen_tbl (CPUPPCState *env)
774
{
775
    spr_register(env, SPR_VTBL,  "TBL",
776
                 &spr_read_tbl, SPR_NOACCESS,
777
                 &spr_read_tbl, SPR_NOACCESS,
778
                 0x00000000);
779
    spr_register(env, SPR_TBL,   "TBL",
780
                 SPR_NOACCESS, SPR_NOACCESS,
781
                 SPR_NOACCESS, &spr_write_tbl,
782
                 0x00000000);
783
    spr_register(env, SPR_VTBU,  "TBU",
784
                 &spr_read_tbu, SPR_NOACCESS,
785
                 &spr_read_tbu, SPR_NOACCESS,
786
                 0x00000000);
787
    spr_register(env, SPR_TBU,   "TBU",
788
                 SPR_NOACCESS, SPR_NOACCESS,
789
                 SPR_NOACCESS, &spr_write_tbu,
790
                 0x00000000);
791
}
792

    
793
/* Softare table search registers */
794
static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
795
{
796
#if !defined(CONFIG_USER_ONLY)
797
    env->nb_tlb = nb_tlbs;
798
    env->nb_ways = nb_ways;
799
    env->id_tlbs = 1;
800
    spr_register(env, SPR_DMISS, "DMISS",
801
                 SPR_NOACCESS, SPR_NOACCESS,
802
                 &spr_read_generic, SPR_NOACCESS,
803
                 0x00000000);
804
    spr_register(env, SPR_DCMP, "DCMP",
805
                 SPR_NOACCESS, SPR_NOACCESS,
806
                 &spr_read_generic, SPR_NOACCESS,
807
                 0x00000000);
808
    spr_register(env, SPR_HASH1, "HASH1",
809
                 SPR_NOACCESS, SPR_NOACCESS,
810
                 &spr_read_generic, SPR_NOACCESS,
811
                 0x00000000);
812
    spr_register(env, SPR_HASH2, "HASH2",
813
                 SPR_NOACCESS, SPR_NOACCESS,
814
                 &spr_read_generic, SPR_NOACCESS,
815
                 0x00000000);
816
    spr_register(env, SPR_IMISS, "IMISS",
817
                 SPR_NOACCESS, SPR_NOACCESS,
818
                 &spr_read_generic, SPR_NOACCESS,
819
                 0x00000000);
820
    spr_register(env, SPR_ICMP, "ICMP",
821
                 SPR_NOACCESS, SPR_NOACCESS,
822
                 &spr_read_generic, SPR_NOACCESS,
823
                 0x00000000);
824
    spr_register(env, SPR_RPA, "RPA",
825
                 SPR_NOACCESS, SPR_NOACCESS,
826
                 &spr_read_generic, &spr_write_generic,
827
                 0x00000000);
828
#endif
829
}
830

    
831
/* SPR common to MPC755 and G2 */
832
static void gen_spr_G2_755 (CPUPPCState *env)
833
{
834
    /* SGPRs */
835
    spr_register(env, SPR_SPRG4, "SPRG4",
836
                 SPR_NOACCESS, SPR_NOACCESS,
837
                 &spr_read_generic, &spr_write_generic,
838
                 0x00000000);
839
    spr_register(env, SPR_SPRG5, "SPRG5",
840
                 SPR_NOACCESS, SPR_NOACCESS,
841
                 &spr_read_generic, &spr_write_generic,
842
                 0x00000000);
843
    spr_register(env, SPR_SPRG6, "SPRG6",
844
                 SPR_NOACCESS, SPR_NOACCESS,
845
                 &spr_read_generic, &spr_write_generic,
846
                 0x00000000);
847
    spr_register(env, SPR_SPRG7, "SPRG7",
848
                 SPR_NOACCESS, SPR_NOACCESS,
849
                 &spr_read_generic, &spr_write_generic,
850
                 0x00000000);
851
}
852

    
853
/* SPR common to all 7xx PowerPC implementations */
854
static void gen_spr_7xx (CPUPPCState *env)
855
{
856
    /* Breakpoints */
857
    /* XXX : not implemented */
858
    spr_register(env, SPR_DABR, "DABR",
859
                 SPR_NOACCESS, SPR_NOACCESS,
860
                 &spr_read_generic, &spr_write_generic,
861
                 0x00000000);
862
    /* XXX : not implemented */
863
    spr_register(env, SPR_IABR, "IABR",
864
                 SPR_NOACCESS, SPR_NOACCESS,
865
                 &spr_read_generic, &spr_write_generic,
866
                 0x00000000);
867
    /* Cache management */
868
    /* XXX : not implemented */
869
    spr_register(env, SPR_ICTC, "ICTC",
870
                 SPR_NOACCESS, SPR_NOACCESS,
871
                 &spr_read_generic, &spr_write_generic,
872
                 0x00000000);
873
    /* Performance monitors */
874
    /* XXX : not implemented */
875
    spr_register(env, SPR_MMCR0, "MMCR0",
876
                 SPR_NOACCESS, SPR_NOACCESS,
877
                 &spr_read_generic, &spr_write_generic,
878
                 0x00000000);
879
    /* XXX : not implemented */
880
    spr_register(env, SPR_MMCR1, "MMCR1",
881
                 SPR_NOACCESS, SPR_NOACCESS,
882
                 &spr_read_generic, &spr_write_generic,
883
                 0x00000000);
884
    /* XXX : not implemented */
885
    spr_register(env, SPR_PMC1, "PMC1",
886
                 SPR_NOACCESS, SPR_NOACCESS,
887
                 &spr_read_generic, &spr_write_generic,
888
                 0x00000000);
889
    /* XXX : not implemented */
890
    spr_register(env, SPR_PMC2, "PMC2",
891
                 SPR_NOACCESS, SPR_NOACCESS,
892
                 &spr_read_generic, &spr_write_generic,
893
                 0x00000000);
894
    /* XXX : not implemented */
895
    spr_register(env, SPR_PMC3, "PMC3",
896
                 SPR_NOACCESS, SPR_NOACCESS,
897
                 &spr_read_generic, &spr_write_generic,
898
                 0x00000000);
899
    /* XXX : not implemented */
900
    spr_register(env, SPR_PMC4, "PMC4",
901
                 SPR_NOACCESS, SPR_NOACCESS,
902
                 &spr_read_generic, &spr_write_generic,
903
                 0x00000000);
904
    /* XXX : not implemented */
905
    spr_register(env, SPR_SIAR, "SIAR",
906
                 SPR_NOACCESS, SPR_NOACCESS,
907
                 &spr_read_generic, SPR_NOACCESS,
908
                 0x00000000);
909
    /* XXX : not implemented */
910
    spr_register(env, SPR_UMMCR0, "UMMCR0",
911
                 &spr_read_ureg, SPR_NOACCESS,
912
                 &spr_read_ureg, SPR_NOACCESS,
913
                 0x00000000);
914
    /* XXX : not implemented */
915
    spr_register(env, SPR_UMMCR1, "UMMCR1",
916
                 &spr_read_ureg, SPR_NOACCESS,
917
                 &spr_read_ureg, SPR_NOACCESS,
918
                 0x00000000);
919
    /* XXX : not implemented */
920
    spr_register(env, SPR_UPMC1, "UPMC1",
921
                 &spr_read_ureg, SPR_NOACCESS,
922
                 &spr_read_ureg, SPR_NOACCESS,
923
                 0x00000000);
924
    /* XXX : not implemented */
925
    spr_register(env, SPR_UPMC2, "UPMC2",
926
                 &spr_read_ureg, SPR_NOACCESS,
927
                 &spr_read_ureg, SPR_NOACCESS,
928
                 0x00000000);
929
    /* XXX : not implemented */
930
    spr_register(env, SPR_UPMC3, "UPMC3",
931
                 &spr_read_ureg, SPR_NOACCESS,
932
                 &spr_read_ureg, SPR_NOACCESS,
933
                 0x00000000);
934
    /* XXX : not implemented */
935
    spr_register(env, SPR_UPMC4, "UPMC4",
936
                 &spr_read_ureg, SPR_NOACCESS,
937
                 &spr_read_ureg, SPR_NOACCESS,
938
                 0x00000000);
939
    /* XXX : not implemented */
940
    spr_register(env, SPR_USIAR, "USIAR",
941
                 &spr_read_ureg, SPR_NOACCESS,
942
                 &spr_read_ureg, SPR_NOACCESS,
943
                 0x00000000);
944
    /* External access control */
945
    /* XXX : not implemented */
946
    spr_register(env, SPR_EAR, "EAR",
947
                 SPR_NOACCESS, SPR_NOACCESS,
948
                 &spr_read_generic, &spr_write_generic,
949
                 0x00000000);
950
}
951

    
952
static void gen_spr_thrm (CPUPPCState *env)
953
{
954
    /* Thermal management */
955
    /* XXX : not implemented */
956
    spr_register(env, SPR_THRM1, "THRM1",
957
                 SPR_NOACCESS, SPR_NOACCESS,
958
                 &spr_read_generic, &spr_write_generic,
959
                 0x00000000);
960
    /* XXX : not implemented */
961
    spr_register(env, SPR_THRM2, "THRM2",
962
                 SPR_NOACCESS, SPR_NOACCESS,
963
                 &spr_read_generic, &spr_write_generic,
964
                 0x00000000);
965
    /* XXX : not implemented */
966
    spr_register(env, SPR_THRM3, "THRM3",
967
                 SPR_NOACCESS, SPR_NOACCESS,
968
                 &spr_read_generic, &spr_write_generic,
969
                 0x00000000);
970
}
971

    
972
/* SPR specific to PowerPC 604 implementation */
973
static void gen_spr_604 (CPUPPCState *env)
974
{
975
    /* Processor identification */
976
    spr_register(env, SPR_PIR, "PIR",
977
                 SPR_NOACCESS, SPR_NOACCESS,
978
                 &spr_read_generic, &spr_write_pir,
979
                 0x00000000);
980
    /* Breakpoints */
981
    /* XXX : not implemented */
982
    spr_register(env, SPR_IABR, "IABR",
983
                 SPR_NOACCESS, SPR_NOACCESS,
984
                 &spr_read_generic, &spr_write_generic,
985
                 0x00000000);
986
    /* XXX : not implemented */
987
    spr_register(env, SPR_DABR, "DABR",
988
                 SPR_NOACCESS, SPR_NOACCESS,
989
                 &spr_read_generic, &spr_write_generic,
990
                 0x00000000);
991
    /* Performance counters */
992
    /* XXX : not implemented */
993
    spr_register(env, SPR_MMCR0, "MMCR0",
994
                 SPR_NOACCESS, SPR_NOACCESS,
995
                 &spr_read_generic, &spr_write_generic,
996
                 0x00000000);
997
    /* XXX : not implemented */
998
    spr_register(env, SPR_PMC1, "PMC1",
999
                 SPR_NOACCESS, SPR_NOACCESS,
1000
                 &spr_read_generic, &spr_write_generic,
1001
                 0x00000000);
1002
    /* XXX : not implemented */
1003
    spr_register(env, SPR_PMC2, "PMC2",
1004
                 SPR_NOACCESS, SPR_NOACCESS,
1005
                 &spr_read_generic, &spr_write_generic,
1006
                 0x00000000);
1007
    /* XXX : not implemented */
1008
    spr_register(env, SPR_SIAR, "SIAR",
1009
                 SPR_NOACCESS, SPR_NOACCESS,
1010
                 &spr_read_generic, SPR_NOACCESS,
1011
                 0x00000000);
1012
    /* XXX : not implemented */
1013
    spr_register(env, SPR_SDA, "SDA",
1014
                 SPR_NOACCESS, SPR_NOACCESS,
1015
                 &spr_read_generic, SPR_NOACCESS,
1016
                 0x00000000);
1017
    /* External access control */
1018
    /* XXX : not implemented */
1019
    spr_register(env, SPR_EAR, "EAR",
1020
                 SPR_NOACCESS, SPR_NOACCESS,
1021
                 &spr_read_generic, &spr_write_generic,
1022
                 0x00000000);
1023
}
1024

    
1025
/* SPR specific to PowerPC 603 implementation */
1026
static void gen_spr_603 (CPUPPCState *env)
1027
{
1028
    /* External access control */
1029
    /* XXX : not implemented */
1030
    spr_register(env, SPR_EAR, "EAR",
1031
                 SPR_NOACCESS, SPR_NOACCESS,
1032
                 &spr_read_generic, &spr_write_generic,
1033
                 0x00000000);
1034
}
1035

    
1036
/* SPR specific to PowerPC G2 implementation */
1037
static void gen_spr_G2 (CPUPPCState *env)
1038
{
1039
    /* Memory base address */
1040
    /* MBAR */
1041
    /* XXX : not implemented */
1042
    spr_register(env, SPR_MBAR, "MBAR",
1043
                 SPR_NOACCESS, SPR_NOACCESS,
1044
                 &spr_read_generic, &spr_write_generic,
1045
                 0x00000000);
1046
    /* Exception processing */
1047
    spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1048
                 SPR_NOACCESS, SPR_NOACCESS,
1049
                 &spr_read_generic, &spr_write_generic,
1050
                 0x00000000);
1051
    spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1052
                 SPR_NOACCESS, SPR_NOACCESS,
1053
                 &spr_read_generic, &spr_write_generic,
1054
                 0x00000000);
1055
    /* Breakpoints */
1056
    /* XXX : not implemented */
1057
    spr_register(env, SPR_DABR, "DABR",
1058
                 SPR_NOACCESS, SPR_NOACCESS,
1059
                 &spr_read_generic, &spr_write_generic,
1060
                 0x00000000);
1061
    /* XXX : not implemented */
1062
    spr_register(env, SPR_DABR2, "DABR2",
1063
                 SPR_NOACCESS, SPR_NOACCESS,
1064
                 &spr_read_generic, &spr_write_generic,
1065
                 0x00000000);
1066
    /* XXX : not implemented */
1067
    spr_register(env, SPR_IABR, "IABR",
1068
                 SPR_NOACCESS, SPR_NOACCESS,
1069
                 &spr_read_generic, &spr_write_generic,
1070
                 0x00000000);
1071
    /* XXX : not implemented */
1072
    spr_register(env, SPR_IABR2, "IABR2",
1073
                 SPR_NOACCESS, SPR_NOACCESS,
1074
                 &spr_read_generic, &spr_write_generic,
1075
                 0x00000000);
1076
    /* XXX : not implemented */
1077
    spr_register(env, SPR_IBCR, "IBCR",
1078
                 SPR_NOACCESS, SPR_NOACCESS,
1079
                 &spr_read_generic, &spr_write_generic,
1080
                 0x00000000);
1081
    /* XXX : not implemented */
1082
    spr_register(env, SPR_DBCR, "DBCR",
1083
                 SPR_NOACCESS, SPR_NOACCESS,
1084
                 &spr_read_generic, &spr_write_generic,
1085
                 0x00000000);
1086
}
1087

    
1088
/* SPR specific to PowerPC 602 implementation */
1089
static void gen_spr_602 (CPUPPCState *env)
1090
{
1091
    /* ESA registers */
1092
    /* XXX : not implemented */
1093
    spr_register(env, SPR_SER, "SER",
1094
                 SPR_NOACCESS, SPR_NOACCESS,
1095
                 &spr_read_generic, &spr_write_generic,
1096
                 0x00000000);
1097
    /* XXX : not implemented */
1098
    spr_register(env, SPR_SEBR, "SEBR",
1099
                 SPR_NOACCESS, SPR_NOACCESS,
1100
                 &spr_read_generic, &spr_write_generic,
1101
                 0x00000000);
1102
    /* XXX : not implemented */
1103
    spr_register(env, SPR_ESASRR, "ESASRR",
1104
                 SPR_NOACCESS, SPR_NOACCESS,
1105
                 &spr_read_generic, &spr_write_generic,
1106
                 0x00000000);
1107
    /* Floating point status */
1108
    /* XXX : not implemented */
1109
    spr_register(env, SPR_SP, "SP",
1110
                 SPR_NOACCESS, SPR_NOACCESS,
1111
                 &spr_read_generic, &spr_write_generic,
1112
                 0x00000000);
1113
    /* XXX : not implemented */
1114
    spr_register(env, SPR_LT, "LT",
1115
                 SPR_NOACCESS, SPR_NOACCESS,
1116
                 &spr_read_generic, &spr_write_generic,
1117
                 0x00000000);
1118
    /* Watchdog timer */
1119
    /* XXX : not implemented */
1120
    spr_register(env, SPR_TCR, "TCR",
1121
                 SPR_NOACCESS, SPR_NOACCESS,
1122
                 &spr_read_generic, &spr_write_generic,
1123
                 0x00000000);
1124
    /* Interrupt base */
1125
    spr_register(env, SPR_IBR, "IBR",
1126
                 SPR_NOACCESS, SPR_NOACCESS,
1127
                 &spr_read_generic, &spr_write_generic,
1128
                 0x00000000);
1129
    /* XXX : not implemented */
1130
    spr_register(env, SPR_IABR, "IABR",
1131
                 SPR_NOACCESS, SPR_NOACCESS,
1132
                 &spr_read_generic, &spr_write_generic,
1133
                 0x00000000);
1134
}
1135

    
1136
/* SPR specific to PowerPC 601 implementation */
1137
static void gen_spr_601 (CPUPPCState *env)
1138
{
1139
    /* Multiplication/division register */
1140
    /* MQ */
1141
    spr_register(env, SPR_MQ, "MQ",
1142
                 &spr_read_generic, &spr_write_generic,
1143
                 &spr_read_generic, &spr_write_generic,
1144
                 0x00000000);
1145
    /* RTC registers */
1146
    spr_register(env, SPR_601_RTCU, "RTCU",
1147
                 SPR_NOACCESS, SPR_NOACCESS,
1148
                 SPR_NOACCESS, &spr_write_601_rtcu,
1149
                 0x00000000);
1150
    spr_register(env, SPR_601_VRTCU, "RTCU",
1151
                 &spr_read_601_rtcu, SPR_NOACCESS,
1152
                 &spr_read_601_rtcu, SPR_NOACCESS,
1153
                 0x00000000);
1154
    spr_register(env, SPR_601_RTCL, "RTCL",
1155
                 SPR_NOACCESS, SPR_NOACCESS,
1156
                 SPR_NOACCESS, &spr_write_601_rtcl,
1157
                 0x00000000);
1158
    spr_register(env, SPR_601_VRTCL, "RTCL",
1159
                 &spr_read_601_rtcl, SPR_NOACCESS,
1160
                 &spr_read_601_rtcl, SPR_NOACCESS,
1161
                 0x00000000);
1162
    /* Timer */
1163
#if 0 /* ? */
1164
    spr_register(env, SPR_601_UDECR, "UDECR",
1165
                 &spr_read_decr, SPR_NOACCESS,
1166
                 &spr_read_decr, SPR_NOACCESS,
1167
                 0x00000000);
1168
#endif
1169
    /* External access control */
1170
    /* XXX : not implemented */
1171
    spr_register(env, SPR_EAR, "EAR",
1172
                 SPR_NOACCESS, SPR_NOACCESS,
1173
                 &spr_read_generic, &spr_write_generic,
1174
                 0x00000000);
1175
    /* Memory management */
1176
#if !defined(CONFIG_USER_ONLY)
1177
    spr_register(env, SPR_IBAT0U, "IBAT0U",
1178
                 SPR_NOACCESS, SPR_NOACCESS,
1179
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1180
                 0x00000000);
1181
    spr_register(env, SPR_IBAT0L, "IBAT0L",
1182
                 SPR_NOACCESS, SPR_NOACCESS,
1183
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1184
                 0x00000000);
1185
    spr_register(env, SPR_IBAT1U, "IBAT1U",
1186
                 SPR_NOACCESS, SPR_NOACCESS,
1187
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1188
                 0x00000000);
1189
    spr_register(env, SPR_IBAT1L, "IBAT1L",
1190
                 SPR_NOACCESS, SPR_NOACCESS,
1191
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1192
                 0x00000000);
1193
    spr_register(env, SPR_IBAT2U, "IBAT2U",
1194
                 SPR_NOACCESS, SPR_NOACCESS,
1195
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1196
                 0x00000000);
1197
    spr_register(env, SPR_IBAT2L, "IBAT2L",
1198
                 SPR_NOACCESS, SPR_NOACCESS,
1199
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1200
                 0x00000000);
1201
    spr_register(env, SPR_IBAT3U, "IBAT3U",
1202
                 SPR_NOACCESS, SPR_NOACCESS,
1203
                 &spr_read_601_ubat, &spr_write_601_ubatu,
1204
                 0x00000000);
1205
    spr_register(env, SPR_IBAT3L, "IBAT3L",
1206
                 SPR_NOACCESS, SPR_NOACCESS,
1207
                 &spr_read_601_ubat, &spr_write_601_ubatl,
1208
                 0x00000000);
1209
    env->nb_BATs = 4;
1210
#endif
1211
}
1212

    
1213
static void gen_spr_74xx (CPUPPCState *env)
1214
{
1215
    /* Processor identification */
1216
    spr_register(env, SPR_PIR, "PIR",
1217
                 SPR_NOACCESS, SPR_NOACCESS,
1218
                 &spr_read_generic, &spr_write_pir,
1219
                 0x00000000);
1220
    /* XXX : not implemented */
1221
    spr_register(env, SPR_MMCR2, "MMCR2",
1222
                 SPR_NOACCESS, SPR_NOACCESS,
1223
                 &spr_read_generic, &spr_write_generic,
1224
                 0x00000000);
1225
    /* XXX : not implemented */
1226
    spr_register(env, SPR_UMMCR2, "UMMCR2",
1227
                 &spr_read_ureg, SPR_NOACCESS,
1228
                 &spr_read_ureg, SPR_NOACCESS,
1229
                 0x00000000);
1230
    /* XXX: not implemented */
1231
    spr_register(env, SPR_BAMR, "BAMR",
1232
                 SPR_NOACCESS, SPR_NOACCESS,
1233
                 &spr_read_generic, &spr_write_generic,
1234
                 0x00000000);
1235
    /* XXX : not implemented */
1236
    spr_register(env, SPR_MSSCR0, "MSSCR0",
1237
                 SPR_NOACCESS, SPR_NOACCESS,
1238
                 &spr_read_generic, &spr_write_generic,
1239
                 0x00000000);
1240
    /* Hardware implementation registers */
1241
    /* XXX : not implemented */
1242
    spr_register(env, SPR_HID0, "HID0",
1243
                 SPR_NOACCESS, SPR_NOACCESS,
1244
                 &spr_read_generic, &spr_write_generic,
1245
                 0x00000000);
1246
    /* XXX : not implemented */
1247
    spr_register(env, SPR_HID1, "HID1",
1248
                 SPR_NOACCESS, SPR_NOACCESS,
1249
                 &spr_read_generic, &spr_write_generic,
1250
                 0x00000000);
1251
    /* Altivec */
1252
    spr_register(env, SPR_VRSAVE, "VRSAVE",
1253
                 &spr_read_generic, &spr_write_generic,
1254
                 &spr_read_generic, &spr_write_generic,
1255
                 0x00000000);
1256
    /* XXX : not implemented */
1257
    spr_register(env, SPR_L2CR, "L2CR",
1258
                 SPR_NOACCESS, SPR_NOACCESS,
1259
                 &spr_read_generic, &spr_write_generic,
1260
                 0x00000000);
1261
    /* Not strictly an SPR */
1262
    vscr_init(env, 0x00010000);
1263
}
1264

    
1265
static void gen_l3_ctrl (CPUPPCState *env)
1266
{
1267
    /* L3CR */
1268
    /* XXX : not implemented */
1269
    spr_register(env, SPR_L3CR, "L3CR",
1270
                 SPR_NOACCESS, SPR_NOACCESS,
1271
                 &spr_read_generic, &spr_write_generic,
1272
                 0x00000000);
1273
    /* L3ITCR0 */
1274
    /* XXX : not implemented */
1275
    spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1276
                 SPR_NOACCESS, SPR_NOACCESS,
1277
                 &spr_read_generic, &spr_write_generic,
1278
                 0x00000000);
1279
    /* L3PM */
1280
    /* XXX : not implemented */
1281
    spr_register(env, SPR_L3PM, "L3PM",
1282
                 SPR_NOACCESS, SPR_NOACCESS,
1283
                 &spr_read_generic, &spr_write_generic,
1284
                 0x00000000);
1285
}
1286

    
1287
static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
1288
{
1289
#if !defined(CONFIG_USER_ONLY)
1290
    env->nb_tlb = nb_tlbs;
1291
    env->nb_ways = nb_ways;
1292
    env->id_tlbs = 1;
1293
    /* XXX : not implemented */
1294
    spr_register(env, SPR_PTEHI, "PTEHI",
1295
                 SPR_NOACCESS, SPR_NOACCESS,
1296
                 &spr_read_generic, &spr_write_generic,
1297
                 0x00000000);
1298
    /* XXX : not implemented */
1299
    spr_register(env, SPR_PTELO, "PTELO",
1300
                 SPR_NOACCESS, SPR_NOACCESS,
1301
                 &spr_read_generic, &spr_write_generic,
1302
                 0x00000000);
1303
    /* XXX : not implemented */
1304
    spr_register(env, SPR_TLBMISS, "TLBMISS",
1305
                 SPR_NOACCESS, SPR_NOACCESS,
1306
                 &spr_read_generic, &spr_write_generic,
1307
                 0x00000000);
1308
#endif
1309
}
1310

    
1311
static void gen_spr_usprgh (CPUPPCState *env)
1312
{
1313
    spr_register(env, SPR_USPRG4, "USPRG4",
1314
                 &spr_read_ureg, SPR_NOACCESS,
1315
                 &spr_read_ureg, SPR_NOACCESS,
1316
                 0x00000000);
1317
    spr_register(env, SPR_USPRG5, "USPRG5",
1318
                 &spr_read_ureg, SPR_NOACCESS,
1319
                 &spr_read_ureg, SPR_NOACCESS,
1320
                 0x00000000);
1321
    spr_register(env, SPR_USPRG6, "USPRG6",
1322
                 &spr_read_ureg, SPR_NOACCESS,
1323
                 &spr_read_ureg, SPR_NOACCESS,
1324
                 0x00000000);
1325
    spr_register(env, SPR_USPRG7, "USPRG7",
1326
                 &spr_read_ureg, SPR_NOACCESS,
1327
                 &spr_read_ureg, SPR_NOACCESS,
1328
                 0x00000000);
1329
}
1330

    
1331
/* PowerPC BookE SPR */
1332
static void gen_spr_BookE (CPUPPCState *env, uint64_t ivor_mask)
1333
{
1334
    const char *ivor_names[64] = {
1335
        "IVOR0",  "IVOR1",  "IVOR2",  "IVOR3",
1336
        "IVOR4",  "IVOR5",  "IVOR6",  "IVOR7",
1337
        "IVOR8",  "IVOR9",  "IVOR10", "IVOR11",
1338
        "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1339
        "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1340
        "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1341
        "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1342
        "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1343
        "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1344
        "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1345
        "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1346
        "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1347
        "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1348
        "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1349
        "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1350
        "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1351
    };
1352
#define SPR_BOOKE_IVORxx (-1)
1353
    int ivor_sprn[64] = {
1354
        SPR_BOOKE_IVOR0,  SPR_BOOKE_IVOR1,  SPR_BOOKE_IVOR2,  SPR_BOOKE_IVOR3,
1355
        SPR_BOOKE_IVOR4,  SPR_BOOKE_IVOR5,  SPR_BOOKE_IVOR6,  SPR_BOOKE_IVOR7,
1356
        SPR_BOOKE_IVOR8,  SPR_BOOKE_IVOR9,  SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1357
        SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1358
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1359
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1360
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1361
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1362
        SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1363
        SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1364
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1365
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1366
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1367
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1368
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1369
        SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1370
    };
1371
    int i;
1372

    
1373
    /* Interrupt processing */
1374
    spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1375
                 SPR_NOACCESS, SPR_NOACCESS,
1376
                 &spr_read_generic, &spr_write_generic,
1377
                 0x00000000);
1378
    spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1379
                 SPR_NOACCESS, SPR_NOACCESS,
1380
                 &spr_read_generic, &spr_write_generic,
1381
                 0x00000000);
1382
    /* Debug */
1383
    /* XXX : not implemented */
1384
    spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1385
                 SPR_NOACCESS, SPR_NOACCESS,
1386
                 &spr_read_generic, &spr_write_generic,
1387
                 0x00000000);
1388
    /* XXX : not implemented */
1389
    spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1390
                 SPR_NOACCESS, SPR_NOACCESS,
1391
                 &spr_read_generic, &spr_write_generic,
1392
                 0x00000000);
1393
    /* XXX : not implemented */
1394
    spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1395
                 SPR_NOACCESS, SPR_NOACCESS,
1396
                 &spr_read_generic, &spr_write_generic,
1397
                 0x00000000);
1398
    /* XXX : not implemented */
1399
    spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1400
                 SPR_NOACCESS, SPR_NOACCESS,
1401
                 &spr_read_generic, &spr_write_generic,
1402
                 0x00000000);
1403
    /* XXX : not implemented */
1404
    spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1405
                 SPR_NOACCESS, SPR_NOACCESS,
1406
                 &spr_read_generic, &spr_write_generic,
1407
                 0x00000000);
1408
    /* XXX : not implemented */
1409
    spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1410
                 SPR_NOACCESS, SPR_NOACCESS,
1411
                 &spr_read_generic, &spr_write_generic,
1412
                 0x00000000);
1413
    /* XXX : not implemented */
1414
    spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1415
                 SPR_NOACCESS, SPR_NOACCESS,
1416
                 &spr_read_generic, &spr_write_generic,
1417
                 0x00000000);
1418
    /* XXX : not implemented */
1419
    spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1420
                 SPR_NOACCESS, SPR_NOACCESS,
1421
                 &spr_read_generic, &spr_write_clear,
1422
                 0x00000000);
1423
    spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1424
                 SPR_NOACCESS, SPR_NOACCESS,
1425
                 &spr_read_generic, &spr_write_generic,
1426
                 0x00000000);
1427
    spr_register(env, SPR_BOOKE_ESR, "ESR",
1428
                 SPR_NOACCESS, SPR_NOACCESS,
1429
                 &spr_read_generic, &spr_write_generic,
1430
                 0x00000000);
1431
    spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1432
                 SPR_NOACCESS, SPR_NOACCESS,
1433
                 &spr_read_generic, &spr_write_excp_prefix,
1434
                 0x00000000);
1435
    /* Exception vectors */
1436
    for (i = 0; i < 64; i++) {
1437
        if (ivor_mask & (1ULL << i)) {
1438
            if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1439
                fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1440
                exit(1);
1441
            }
1442
            spr_register(env, ivor_sprn[i], ivor_names[i],
1443
                         SPR_NOACCESS, SPR_NOACCESS,
1444
                         &spr_read_generic, &spr_write_excp_vector,
1445
                         0x00000000);
1446
        }
1447
    }
1448
    spr_register(env, SPR_BOOKE_PID, "PID",
1449
                 SPR_NOACCESS, SPR_NOACCESS,
1450
                 &spr_read_generic, &spr_write_generic,
1451
                 0x00000000);
1452
    spr_register(env, SPR_BOOKE_TCR, "TCR",
1453
                 SPR_NOACCESS, SPR_NOACCESS,
1454
                 &spr_read_generic, &spr_write_booke_tcr,
1455
                 0x00000000);
1456
    spr_register(env, SPR_BOOKE_TSR, "TSR",
1457
                 SPR_NOACCESS, SPR_NOACCESS,
1458
                 &spr_read_generic, &spr_write_booke_tsr,
1459
                 0x00000000);
1460
    /* Timer */
1461
    spr_register(env, SPR_DECR, "DECR",
1462
                 SPR_NOACCESS, SPR_NOACCESS,
1463
                 &spr_read_decr, &spr_write_decr,
1464
                 0x00000000);
1465
    spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1466
                 SPR_NOACCESS, SPR_NOACCESS,
1467
                 SPR_NOACCESS, &spr_write_generic,
1468
                 0x00000000);
1469
    /* SPRGs */
1470
    spr_register(env, SPR_USPRG0, "USPRG0",
1471
                 &spr_read_generic, &spr_write_generic,
1472
                 &spr_read_generic, &spr_write_generic,
1473
                 0x00000000);
1474
    spr_register(env, SPR_SPRG4, "SPRG4",
1475
                 SPR_NOACCESS, SPR_NOACCESS,
1476
                 &spr_read_generic, &spr_write_generic,
1477
                 0x00000000);
1478
    spr_register(env, SPR_SPRG5, "SPRG5",
1479
                 SPR_NOACCESS, SPR_NOACCESS,
1480
                 &spr_read_generic, &spr_write_generic,
1481
                 0x00000000);
1482
    spr_register(env, SPR_SPRG6, "SPRG6",
1483
                 SPR_NOACCESS, SPR_NOACCESS,
1484
                 &spr_read_generic, &spr_write_generic,
1485
                 0x00000000);
1486
    spr_register(env, SPR_SPRG7, "SPRG7",
1487
                 SPR_NOACCESS, SPR_NOACCESS,
1488
                 &spr_read_generic, &spr_write_generic,
1489
                 0x00000000);
1490
}
1491

    
1492
/* FSL storage control registers */
1493
static void gen_spr_BookE_FSL (CPUPPCState *env, uint32_t mas_mask)
1494
{
1495
#if !defined(CONFIG_USER_ONLY)
1496
    const char *mas_names[8] = {
1497
        "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1498
    };
1499
    int mas_sprn[8] = {
1500
        SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1501
        SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1502
    };
1503
    int i;
1504

    
1505
    /* TLB assist registers */
1506
    /* XXX : not implemented */
1507
    for (i = 0; i < 8; i++) {
1508
        if (mas_mask & (1 << i)) {
1509
            spr_register(env, mas_sprn[i], mas_names[i],
1510
                         SPR_NOACCESS, SPR_NOACCESS,
1511
                         &spr_read_generic, &spr_write_generic,
1512
                         0x00000000);
1513
        }
1514
    }
1515
    if (env->nb_pids > 1) {
1516
        /* XXX : not implemented */
1517
        spr_register(env, SPR_BOOKE_PID1, "PID1",
1518
                     SPR_NOACCESS, SPR_NOACCESS,
1519
                     &spr_read_generic, &spr_write_generic,
1520
                     0x00000000);
1521
    }
1522
    if (env->nb_pids > 2) {
1523
        /* XXX : not implemented */
1524
        spr_register(env, SPR_BOOKE_PID2, "PID2",
1525
                     SPR_NOACCESS, SPR_NOACCESS,
1526
                     &spr_read_generic, &spr_write_generic,
1527
                     0x00000000);
1528
    }
1529
    /* XXX : not implemented */
1530
    spr_register(env, SPR_MMUCFG, "MMUCFG",
1531
                 SPR_NOACCESS, SPR_NOACCESS,
1532
                 &spr_read_generic, SPR_NOACCESS,
1533
                 0x00000000); /* TOFIX */
1534
    /* XXX : not implemented */
1535
    spr_register(env, SPR_MMUCSR0, "MMUCSR0",
1536
                 SPR_NOACCESS, SPR_NOACCESS,
1537
                 &spr_read_generic, &spr_write_generic,
1538
                 0x00000000); /* TOFIX */
1539
    switch (env->nb_ways) {
1540
    case 4:
1541
        /* XXX : not implemented */
1542
        spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1543
                     SPR_NOACCESS, SPR_NOACCESS,
1544
                     &spr_read_generic, SPR_NOACCESS,
1545
                     0x00000000); /* TOFIX */
1546
        /* Fallthru */
1547
    case 3:
1548
        /* XXX : not implemented */
1549
        spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1550
                     SPR_NOACCESS, SPR_NOACCESS,
1551
                     &spr_read_generic, SPR_NOACCESS,
1552
                     0x00000000); /* TOFIX */
1553
        /* Fallthru */
1554
    case 2:
1555
        /* XXX : not implemented */
1556
        spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1557
                     SPR_NOACCESS, SPR_NOACCESS,
1558
                     &spr_read_generic, SPR_NOACCESS,
1559
                     0x00000000); /* TOFIX */
1560
        /* Fallthru */
1561
    case 1:
1562
        /* XXX : not implemented */
1563
        spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1564
                     SPR_NOACCESS, SPR_NOACCESS,
1565
                     &spr_read_generic, SPR_NOACCESS,
1566
                     0x00000000); /* TOFIX */
1567
        /* Fallthru */
1568
    case 0:
1569
    default:
1570
        break;
1571
    }
1572
#endif
1573
}
1574

    
1575
/* SPR specific to PowerPC 440 implementation */
1576
static void gen_spr_440 (CPUPPCState *env)
1577
{
1578
    /* Cache control */
1579
    /* XXX : not implemented */
1580
    spr_register(env, SPR_440_DNV0, "DNV0",
1581
                 SPR_NOACCESS, SPR_NOACCESS,
1582
                 &spr_read_generic, &spr_write_generic,
1583
                 0x00000000);
1584
    /* XXX : not implemented */
1585
    spr_register(env, SPR_440_DNV1, "DNV1",
1586
                 SPR_NOACCESS, SPR_NOACCESS,
1587
                 &spr_read_generic, &spr_write_generic,
1588
                 0x00000000);
1589
    /* XXX : not implemented */
1590
    spr_register(env, SPR_440_DNV2, "DNV2",
1591
                 SPR_NOACCESS, SPR_NOACCESS,
1592
                 &spr_read_generic, &spr_write_generic,
1593
                 0x00000000);
1594
    /* XXX : not implemented */
1595
    spr_register(env, SPR_440_DNV3, "DNV3",
1596
                 SPR_NOACCESS, SPR_NOACCESS,
1597
                 &spr_read_generic, &spr_write_generic,
1598
                 0x00000000);
1599
    /* XXX : not implemented */
1600
    spr_register(env, SPR_440_DTV0, "DTV0",
1601
                 SPR_NOACCESS, SPR_NOACCESS,
1602
                 &spr_read_generic, &spr_write_generic,
1603
                 0x00000000);
1604
    /* XXX : not implemented */
1605
    spr_register(env, SPR_440_DTV1, "DTV1",
1606
                 SPR_NOACCESS, SPR_NOACCESS,
1607
                 &spr_read_generic, &spr_write_generic,
1608
                 0x00000000);
1609
    /* XXX : not implemented */
1610
    spr_register(env, SPR_440_DTV2, "DTV2",
1611
                 SPR_NOACCESS, SPR_NOACCESS,
1612
                 &spr_read_generic, &spr_write_generic,
1613
                 0x00000000);
1614
    /* XXX : not implemented */
1615
    spr_register(env, SPR_440_DTV3, "DTV3",
1616
                 SPR_NOACCESS, SPR_NOACCESS,
1617
                 &spr_read_generic, &spr_write_generic,
1618
                 0x00000000);
1619
    /* XXX : not implemented */
1620
    spr_register(env, SPR_440_DVLIM, "DVLIM",
1621
                 SPR_NOACCESS, SPR_NOACCESS,
1622
                 &spr_read_generic, &spr_write_generic,
1623
                 0x00000000);
1624
    /* XXX : not implemented */
1625
    spr_register(env, SPR_440_INV0, "INV0",
1626
                 SPR_NOACCESS, SPR_NOACCESS,
1627
                 &spr_read_generic, &spr_write_generic,
1628
                 0x00000000);
1629
    /* XXX : not implemented */
1630
    spr_register(env, SPR_440_INV1, "INV1",
1631
                 SPR_NOACCESS, SPR_NOACCESS,
1632
                 &spr_read_generic, &spr_write_generic,
1633
                 0x00000000);
1634
    /* XXX : not implemented */
1635
    spr_register(env, SPR_440_INV2, "INV2",
1636
                 SPR_NOACCESS, SPR_NOACCESS,
1637
                 &spr_read_generic, &spr_write_generic,
1638
                 0x00000000);
1639
    /* XXX : not implemented */
1640
    spr_register(env, SPR_440_INV3, "INV3",
1641
                 SPR_NOACCESS, SPR_NOACCESS,
1642
                 &spr_read_generic, &spr_write_generic,
1643
                 0x00000000);
1644
    /* XXX : not implemented */
1645
    spr_register(env, SPR_440_ITV0, "ITV0",
1646
                 SPR_NOACCESS, SPR_NOACCESS,
1647
                 &spr_read_generic, &spr_write_generic,
1648
                 0x00000000);
1649
    /* XXX : not implemented */
1650
    spr_register(env, SPR_440_ITV1, "ITV1",
1651
                 SPR_NOACCESS, SPR_NOACCESS,
1652
                 &spr_read_generic, &spr_write_generic,
1653
                 0x00000000);
1654
    /* XXX : not implemented */
1655
    spr_register(env, SPR_440_ITV2, "ITV2",
1656
                 SPR_NOACCESS, SPR_NOACCESS,
1657
                 &spr_read_generic, &spr_write_generic,
1658
                 0x00000000);
1659
    /* XXX : not implemented */
1660
    spr_register(env, SPR_440_ITV3, "ITV3",
1661
                 SPR_NOACCESS, SPR_NOACCESS,
1662
                 &spr_read_generic, &spr_write_generic,
1663
                 0x00000000);
1664
    /* XXX : not implemented */
1665
    spr_register(env, SPR_440_IVLIM, "IVLIM",
1666
                 SPR_NOACCESS, SPR_NOACCESS,
1667
                 &spr_read_generic, &spr_write_generic,
1668
                 0x00000000);
1669
    /* Cache debug */
1670
    /* XXX : not implemented */
1671
    spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
1672
                 SPR_NOACCESS, SPR_NOACCESS,
1673
                 &spr_read_generic, SPR_NOACCESS,
1674
                 0x00000000);
1675
    /* XXX : not implemented */
1676
    spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
1677
                 SPR_NOACCESS, SPR_NOACCESS,
1678
                 &spr_read_generic, SPR_NOACCESS,
1679
                 0x00000000);
1680
    /* XXX : not implemented */
1681
    spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1682
                 SPR_NOACCESS, SPR_NOACCESS,
1683
                 &spr_read_generic, SPR_NOACCESS,
1684
                 0x00000000);
1685
    /* XXX : not implemented */
1686
    spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
1687
                 SPR_NOACCESS, SPR_NOACCESS,
1688
                 &spr_read_generic, SPR_NOACCESS,
1689
                 0x00000000);
1690
    /* XXX : not implemented */
1691
    spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
1692
                 SPR_NOACCESS, SPR_NOACCESS,
1693
                 &spr_read_generic, SPR_NOACCESS,
1694
                 0x00000000);
1695
    /* XXX : not implemented */
1696
    spr_register(env, SPR_440_DBDR, "DBDR",
1697
                 SPR_NOACCESS, SPR_NOACCESS,
1698
                 &spr_read_generic, &spr_write_generic,
1699
                 0x00000000);
1700
    /* Processor control */
1701
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1702
                 SPR_NOACCESS, SPR_NOACCESS,
1703
                 &spr_read_generic, &spr_write_generic,
1704
                 0x00000000);
1705
    spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1706
                 SPR_NOACCESS, SPR_NOACCESS,
1707
                 &spr_read_generic, SPR_NOACCESS,
1708
                 0x00000000);
1709
    /* Storage control */
1710
    spr_register(env, SPR_440_MMUCR, "MMUCR",
1711
                 SPR_NOACCESS, SPR_NOACCESS,
1712
                 &spr_read_generic, &spr_write_generic,
1713
                 0x00000000);
1714
}
1715

    
1716
/* SPR shared between PowerPC 40x implementations */
1717
static void gen_spr_40x (CPUPPCState *env)
1718
{
1719
    /* Cache */
1720
    /* not emulated, as Qemu do not emulate caches */
1721
    spr_register(env, SPR_40x_DCCR, "DCCR",
1722
                 SPR_NOACCESS, SPR_NOACCESS,
1723
                 &spr_read_generic, &spr_write_generic,
1724
                 0x00000000);
1725
    /* not emulated, as Qemu do not emulate caches */
1726
    spr_register(env, SPR_40x_ICCR, "ICCR",
1727
                 SPR_NOACCESS, SPR_NOACCESS,
1728
                 &spr_read_generic, &spr_write_generic,
1729
                 0x00000000);
1730
    /* not emulated, as Qemu do not emulate caches */
1731
    spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1732
                 SPR_NOACCESS, SPR_NOACCESS,
1733
                 &spr_read_generic, SPR_NOACCESS,
1734
                 0x00000000);
1735
    /* Exception */
1736
    spr_register(env, SPR_40x_DEAR, "DEAR",
1737
                 SPR_NOACCESS, SPR_NOACCESS,
1738
                 &spr_read_generic, &spr_write_generic,
1739
                 0x00000000);
1740
    spr_register(env, SPR_40x_ESR, "ESR",
1741
                 SPR_NOACCESS, SPR_NOACCESS,
1742
                 &spr_read_generic, &spr_write_generic,
1743
                 0x00000000);
1744
    spr_register(env, SPR_40x_EVPR, "EVPR",
1745
                 SPR_NOACCESS, SPR_NOACCESS,
1746
                 &spr_read_generic, &spr_write_excp_prefix,
1747
                 0x00000000);
1748
    spr_register(env, SPR_40x_SRR2, "SRR2",
1749
                 &spr_read_generic, &spr_write_generic,
1750
                 &spr_read_generic, &spr_write_generic,
1751
                 0x00000000);
1752
    spr_register(env, SPR_40x_SRR3, "SRR3",
1753
                 &spr_read_generic, &spr_write_generic,
1754
                 &spr_read_generic, &spr_write_generic,
1755
                 0x00000000);
1756
    /* Timers */
1757
    spr_register(env, SPR_40x_PIT, "PIT",
1758
                 SPR_NOACCESS, SPR_NOACCESS,
1759
                 &spr_read_40x_pit, &spr_write_40x_pit,
1760
                 0x00000000);
1761
    spr_register(env, SPR_40x_TCR, "TCR",
1762
                 SPR_NOACCESS, SPR_NOACCESS,
1763
                 &spr_read_generic, &spr_write_booke_tcr,
1764
                 0x00000000);
1765
    spr_register(env, SPR_40x_TSR, "TSR",
1766
                 SPR_NOACCESS, SPR_NOACCESS,
1767
                 &spr_read_generic, &spr_write_booke_tsr,
1768
                 0x00000000);
1769
}
1770

    
1771
/* SPR specific to PowerPC 405 implementation */
1772
static void gen_spr_405 (CPUPPCState *env)
1773
{
1774
    /* MMU */
1775
    spr_register(env, SPR_40x_PID, "PID",
1776
                 SPR_NOACCESS, SPR_NOACCESS,
1777
                 &spr_read_generic, &spr_write_generic,
1778
                 0x00000000);
1779
    spr_register(env, SPR_4xx_CCR0, "CCR0",
1780
                 SPR_NOACCESS, SPR_NOACCESS,
1781
                 &spr_read_generic, &spr_write_generic,
1782
                 0x00700000);
1783
    /* Debug interface */
1784
    /* XXX : not implemented */
1785
    spr_register(env, SPR_40x_DBCR0, "DBCR0",
1786
                 SPR_NOACCESS, SPR_NOACCESS,
1787
                 &spr_read_generic, &spr_write_40x_dbcr0,
1788
                 0x00000000);
1789
    /* XXX : not implemented */
1790
    spr_register(env, SPR_405_DBCR1, "DBCR1",
1791
                 SPR_NOACCESS, SPR_NOACCESS,
1792
                 &spr_read_generic, &spr_write_generic,
1793
                 0x00000000);
1794
    /* XXX : not implemented */
1795
    spr_register(env, SPR_40x_DBSR, "DBSR",
1796
                 SPR_NOACCESS, SPR_NOACCESS,
1797
                 &spr_read_generic, &spr_write_clear,
1798
                 /* Last reset was system reset */
1799
                 0x00000300);
1800
    /* XXX : not implemented */
1801
    spr_register(env, SPR_40x_DAC1, "DAC1",
1802
                 SPR_NOACCESS, SPR_NOACCESS,
1803
                 &spr_read_generic, &spr_write_generic,
1804
                 0x00000000);
1805
    spr_register(env, SPR_40x_DAC2, "DAC2",
1806
                 SPR_NOACCESS, SPR_NOACCESS,
1807
                 &spr_read_generic, &spr_write_generic,
1808
                 0x00000000);
1809
    /* XXX : not implemented */
1810
    spr_register(env, SPR_405_DVC1, "DVC1",
1811
                 SPR_NOACCESS, SPR_NOACCESS,
1812
                 &spr_read_generic, &spr_write_generic,
1813
                 0x00000000);
1814
    /* XXX : not implemented */
1815
    spr_register(env, SPR_405_DVC2, "DVC2",
1816
                 SPR_NOACCESS, SPR_NOACCESS,
1817
                 &spr_read_generic, &spr_write_generic,
1818
                 0x00000000);
1819
    /* XXX : not implemented */
1820
    spr_register(env, SPR_40x_IAC1, "IAC1",
1821
                 SPR_NOACCESS, SPR_NOACCESS,
1822
                 &spr_read_generic, &spr_write_generic,
1823
                 0x00000000);
1824
    spr_register(env, SPR_40x_IAC2, "IAC2",
1825
                 SPR_NOACCESS, SPR_NOACCESS,
1826
                 &spr_read_generic, &spr_write_generic,
1827
                 0x00000000);
1828
    /* XXX : not implemented */
1829
    spr_register(env, SPR_405_IAC3, "IAC3",
1830
                 SPR_NOACCESS, SPR_NOACCESS,
1831
                 &spr_read_generic, &spr_write_generic,
1832
                 0x00000000);
1833
    /* XXX : not implemented */
1834
    spr_register(env, SPR_405_IAC4, "IAC4",
1835
                 SPR_NOACCESS, SPR_NOACCESS,
1836
                 &spr_read_generic, &spr_write_generic,
1837
                 0x00000000);
1838
    /* Storage control */
1839
    /* XXX: TODO: not implemented */
1840
    spr_register(env, SPR_405_SLER, "SLER",
1841
                 SPR_NOACCESS, SPR_NOACCESS,
1842
                 &spr_read_generic, &spr_write_40x_sler,
1843
                 0x00000000);
1844
    spr_register(env, SPR_40x_ZPR, "ZPR",
1845
                 SPR_NOACCESS, SPR_NOACCESS,
1846
                 &spr_read_generic, &spr_write_generic,
1847
                 0x00000000);
1848
    /* XXX : not implemented */
1849
    spr_register(env, SPR_405_SU0R, "SU0R",
1850
                 SPR_NOACCESS, SPR_NOACCESS,
1851
                 &spr_read_generic, &spr_write_generic,
1852
                 0x00000000);
1853
    /* SPRG */
1854
    spr_register(env, SPR_USPRG0, "USPRG0",
1855
                 &spr_read_ureg, SPR_NOACCESS,
1856
                 &spr_read_ureg, SPR_NOACCESS,
1857
                 0x00000000);
1858
    spr_register(env, SPR_SPRG4, "SPRG4",
1859
                 SPR_NOACCESS, SPR_NOACCESS,
1860
                 &spr_read_generic, &spr_write_generic,
1861
                 0x00000000);
1862
    spr_register(env, SPR_SPRG5, "SPRG5",
1863
                 SPR_NOACCESS, SPR_NOACCESS,
1864
                 spr_read_generic, &spr_write_generic,
1865
                 0x00000000);
1866
    spr_register(env, SPR_SPRG6, "SPRG6",
1867
                 SPR_NOACCESS, SPR_NOACCESS,
1868
                 spr_read_generic, &spr_write_generic,
1869
                 0x00000000);
1870
    spr_register(env, SPR_SPRG7, "SPRG7",
1871
                 SPR_NOACCESS, SPR_NOACCESS,
1872
                 spr_read_generic, &spr_write_generic,
1873
                 0x00000000);
1874
    gen_spr_usprgh(env);
1875
}
1876

    
1877
/* SPR shared between PowerPC 401 & 403 implementations */
1878
static void gen_spr_401_403 (CPUPPCState *env)
1879
{
1880
    /* Time base */
1881
    spr_register(env, SPR_403_VTBL,  "TBL",
1882
                 &spr_read_tbl, SPR_NOACCESS,
1883
                 &spr_read_tbl, SPR_NOACCESS,
1884
                 0x00000000);
1885
    spr_register(env, SPR_403_TBL,   "TBL",
1886
                 SPR_NOACCESS, SPR_NOACCESS,
1887
                 SPR_NOACCESS, &spr_write_tbl,
1888
                 0x00000000);
1889
    spr_register(env, SPR_403_VTBU,  "TBU",
1890
                 &spr_read_tbu, SPR_NOACCESS,
1891
                 &spr_read_tbu, SPR_NOACCESS,
1892
                 0x00000000);
1893
    spr_register(env, SPR_403_TBU,   "TBU",
1894
                 SPR_NOACCESS, SPR_NOACCESS,
1895
                 SPR_NOACCESS, &spr_write_tbu,
1896
                 0x00000000);
1897
    /* Debug */
1898
    /* not emulated, as Qemu do not emulate caches */
1899
    spr_register(env, SPR_403_CDBCR, "CDBCR",
1900
                 SPR_NOACCESS, SPR_NOACCESS,
1901
                 &spr_read_generic, &spr_write_generic,
1902
                 0x00000000);
1903
}
1904

    
1905
/* SPR specific to PowerPC 401 implementation */
1906
static void gen_spr_401 (CPUPPCState *env)
1907
{
1908
    /* Debug interface */
1909
    /* XXX : not implemented */
1910
    spr_register(env, SPR_40x_DBCR0, "DBCR",
1911
                 SPR_NOACCESS, SPR_NOACCESS,
1912
                 &spr_read_generic, &spr_write_40x_dbcr0,
1913
                 0x00000000);
1914
    /* XXX : not implemented */
1915
    spr_register(env, SPR_40x_DBSR, "DBSR",
1916
                 SPR_NOACCESS, SPR_NOACCESS,
1917
                 &spr_read_generic, &spr_write_clear,
1918
                 /* Last reset was system reset */
1919
                 0x00000300);
1920
    /* XXX : not implemented */
1921
    spr_register(env, SPR_40x_DAC1, "DAC",
1922
                 SPR_NOACCESS, SPR_NOACCESS,
1923
                 &spr_read_generic, &spr_write_generic,
1924
                 0x00000000);
1925
    /* XXX : not implemented */
1926
    spr_register(env, SPR_40x_IAC1, "IAC",
1927
                 SPR_NOACCESS, SPR_NOACCESS,
1928
                 &spr_read_generic, &spr_write_generic,
1929
                 0x00000000);
1930
    /* Storage control */
1931
    /* XXX: TODO: not implemented */
1932
    spr_register(env, SPR_405_SLER, "SLER",
1933
                 SPR_NOACCESS, SPR_NOACCESS,
1934
                 &spr_read_generic, &spr_write_40x_sler,
1935
                 0x00000000);
1936
    /* not emulated, as Qemu never does speculative access */
1937
    spr_register(env, SPR_40x_SGR, "SGR",
1938
                 SPR_NOACCESS, SPR_NOACCESS,
1939
                 &spr_read_generic, &spr_write_generic,
1940
                 0xFFFFFFFF);
1941
    /* not emulated, as Qemu do not emulate caches */
1942
    spr_register(env, SPR_40x_DCWR, "DCWR",
1943
                 SPR_NOACCESS, SPR_NOACCESS,
1944
                 &spr_read_generic, &spr_write_generic,
1945
                 0x00000000);
1946
}
1947

    
1948
static void gen_spr_401x2 (CPUPPCState *env)
1949
{
1950
    gen_spr_401(env);
1951
    spr_register(env, SPR_40x_PID, "PID",
1952
                 SPR_NOACCESS, SPR_NOACCESS,
1953
                 &spr_read_generic, &spr_write_generic,
1954
                 0x00000000);
1955
    spr_register(env, SPR_40x_ZPR, "ZPR",
1956
                 SPR_NOACCESS, SPR_NOACCESS,
1957
                 &spr_read_generic, &spr_write_generic,
1958
                 0x00000000);
1959
}
1960

    
1961
/* SPR specific to PowerPC 403 implementation */
1962
static void gen_spr_403 (CPUPPCState *env)
1963
{
1964
    /* Debug interface */
1965
    /* XXX : not implemented */
1966
    spr_register(env, SPR_40x_DBCR0, "DBCR0",
1967
                 SPR_NOACCESS, SPR_NOACCESS,
1968
                 &spr_read_generic, &spr_write_40x_dbcr0,
1969
                 0x00000000);
1970
    /* XXX : not implemented */
1971
    spr_register(env, SPR_40x_DBSR, "DBSR",
1972
                 SPR_NOACCESS, SPR_NOACCESS,
1973
                 &spr_read_generic, &spr_write_clear,
1974
                 /* Last reset was system reset */
1975
                 0x00000300);
1976
    /* XXX : not implemented */
1977
    spr_register(env, SPR_40x_DAC1, "DAC1",
1978
                 SPR_NOACCESS, SPR_NOACCESS,
1979
                 &spr_read_generic, &spr_write_generic,
1980
                 0x00000000);
1981
    /* XXX : not implemented */
1982
    spr_register(env, SPR_40x_DAC2, "DAC2",
1983
                 SPR_NOACCESS, SPR_NOACCESS,
1984
                 &spr_read_generic, &spr_write_generic,
1985
                 0x00000000);
1986
    /* XXX : not implemented */
1987
    spr_register(env, SPR_40x_IAC1, "IAC1",
1988
                 SPR_NOACCESS, SPR_NOACCESS,
1989
                 &spr_read_generic, &spr_write_generic,
1990
                 0x00000000);
1991
    /* XXX : not implemented */
1992
    spr_register(env, SPR_40x_IAC2, "IAC2",
1993
                 SPR_NOACCESS, SPR_NOACCESS,
1994
                 &spr_read_generic, &spr_write_generic,
1995
                 0x00000000);
1996
}
1997

    
1998
static void gen_spr_403_real (CPUPPCState *env)
1999
{
2000
    spr_register(env, SPR_403_PBL1,  "PBL1",
2001
                 SPR_NOACCESS, SPR_NOACCESS,
2002
                 &spr_read_403_pbr, &spr_write_403_pbr,
2003
                 0x00000000);
2004
    spr_register(env, SPR_403_PBU1,  "PBU1",
2005
                 SPR_NOACCESS, SPR_NOACCESS,
2006
                 &spr_read_403_pbr, &spr_write_403_pbr,
2007
                 0x00000000);
2008
    spr_register(env, SPR_403_PBL2,  "PBL2",
2009
                 SPR_NOACCESS, SPR_NOACCESS,
2010
                 &spr_read_403_pbr, &spr_write_403_pbr,
2011
                 0x00000000);
2012
    spr_register(env, SPR_403_PBU2,  "PBU2",
2013
                 SPR_NOACCESS, SPR_NOACCESS,
2014
                 &spr_read_403_pbr, &spr_write_403_pbr,
2015
                 0x00000000);
2016
}
2017

    
2018
static void gen_spr_403_mmu (CPUPPCState *env)
2019
{
2020
    /* MMU */
2021
    spr_register(env, SPR_40x_PID, "PID",
2022
                 SPR_NOACCESS, SPR_NOACCESS,
2023
                 &spr_read_generic, &spr_write_generic,
2024
                 0x00000000);
2025
    spr_register(env, SPR_40x_ZPR, "ZPR",
2026
                 SPR_NOACCESS, SPR_NOACCESS,
2027
                 &spr_read_generic, &spr_write_generic,
2028
                 0x00000000);
2029
}
2030

    
2031
/* SPR specific to PowerPC compression coprocessor extension */
2032
static void gen_spr_compress (CPUPPCState *env)
2033
{
2034
    /* XXX : not implemented */
2035
    spr_register(env, SPR_401_SKR, "SKR",
2036
                 SPR_NOACCESS, SPR_NOACCESS,
2037
                 &spr_read_generic, &spr_write_generic,
2038
                 0x00000000);
2039
}
2040

    
2041
#if defined (TARGET_PPC64)
2042
/* SPR specific to PowerPC 620 */
2043
static void gen_spr_620 (CPUPPCState *env)
2044
{
2045
    /* Processor identification */
2046
    spr_register(env, SPR_PIR, "PIR",
2047
                 SPR_NOACCESS, SPR_NOACCESS,
2048
                 &spr_read_generic, &spr_write_pir,
2049
                 0x00000000);
2050
    spr_register(env, SPR_ASR, "ASR",
2051
                 SPR_NOACCESS, SPR_NOACCESS,
2052
                 &spr_read_asr, &spr_write_asr,
2053
                 0x00000000);
2054
    /* Breakpoints */
2055
    /* XXX : not implemented */
2056
    spr_register(env, SPR_IABR, "IABR",
2057
                 SPR_NOACCESS, SPR_NOACCESS,
2058
                 &spr_read_generic, &spr_write_generic,
2059
                 0x00000000);
2060
    /* XXX : not implemented */
2061
    spr_register(env, SPR_DABR, "DABR",
2062
                 SPR_NOACCESS, SPR_NOACCESS,
2063
                 &spr_read_generic, &spr_write_generic,
2064
                 0x00000000);
2065
    /* XXX : not implemented */
2066
    spr_register(env, SPR_SIAR, "SIAR",
2067
                 SPR_NOACCESS, SPR_NOACCESS,
2068
                 &spr_read_generic, SPR_NOACCESS,
2069
                 0x00000000);
2070
    /* XXX : not implemented */
2071
    spr_register(env, SPR_SDA, "SDA",
2072
                 SPR_NOACCESS, SPR_NOACCESS,
2073
                 &spr_read_generic, SPR_NOACCESS,
2074
                 0x00000000);
2075
    /* XXX : not implemented */
2076
    spr_register(env, SPR_620_PMC1R, "PMC1",
2077
                 SPR_NOACCESS, SPR_NOACCESS,
2078
                 &spr_read_generic, SPR_NOACCESS,
2079
                 0x00000000);
2080
    spr_register(env, SPR_620_PMC1W, "PMC1",
2081
                 SPR_NOACCESS, SPR_NOACCESS,
2082
                  SPR_NOACCESS, &spr_write_generic,
2083
                 0x00000000);
2084
    /* XXX : not implemented */
2085
    spr_register(env, SPR_620_PMC2R, "PMC2",
2086
                 SPR_NOACCESS, SPR_NOACCESS,
2087
                 &spr_read_generic, SPR_NOACCESS,
2088
                 0x00000000);
2089
    spr_register(env, SPR_620_PMC2W, "PMC2",
2090
                 SPR_NOACCESS, SPR_NOACCESS,
2091
                  SPR_NOACCESS, &spr_write_generic,
2092
                 0x00000000);
2093
    /* XXX : not implemented */
2094
    spr_register(env, SPR_620_MMCR0R, "MMCR0",
2095
                 SPR_NOACCESS, SPR_NOACCESS,
2096
                 &spr_read_generic, SPR_NOACCESS,
2097
                 0x00000000);
2098
    spr_register(env, SPR_620_MMCR0W, "MMCR0",
2099
                 SPR_NOACCESS, SPR_NOACCESS,
2100
                  SPR_NOACCESS, &spr_write_generic,
2101
                 0x00000000);
2102
    /* External access control */
2103
    /* XXX : not implemented */
2104
    spr_register(env, SPR_EAR, "EAR",
2105
                 SPR_NOACCESS, SPR_NOACCESS,
2106
                 &spr_read_generic, &spr_write_generic,
2107
                 0x00000000);
2108
#if 0 // XXX: check this
2109
    /* XXX : not implemented */
2110
    spr_register(env, SPR_620_PMR0, "PMR0",
2111
                 SPR_NOACCESS, SPR_NOACCESS,
2112
                 &spr_read_generic, &spr_write_generic,
2113
                 0x00000000);
2114
    /* XXX : not implemented */
2115
    spr_register(env, SPR_620_PMR1, "PMR1",
2116
                 SPR_NOACCESS, SPR_NOACCESS,
2117
                 &spr_read_generic, &spr_write_generic,
2118
                 0x00000000);
2119
    /* XXX : not implemented */
2120
    spr_register(env, SPR_620_PMR2, "PMR2",
2121
                 SPR_NOACCESS, SPR_NOACCESS,
2122
                 &spr_read_generic, &spr_write_generic,
2123
                 0x00000000);
2124
    /* XXX : not implemented */
2125
    spr_register(env, SPR_620_PMR3, "PMR3",
2126
                 SPR_NOACCESS, SPR_NOACCESS,
2127
                 &spr_read_generic, &spr_write_generic,
2128
                 0x00000000);
2129
    /* XXX : not implemented */
2130
    spr_register(env, SPR_620_PMR4, "PMR4",
2131
                 SPR_NOACCESS, SPR_NOACCESS,
2132
                 &spr_read_generic, &spr_write_generic,
2133
                 0x00000000);
2134
    /* XXX : not implemented */
2135
    spr_register(env, SPR_620_PMR5, "PMR5",
2136
                 SPR_NOACCESS, SPR_NOACCESS,
2137
                 &spr_read_generic, &spr_write_generic,
2138
                 0x00000000);
2139
    /* XXX : not implemented */
2140
    spr_register(env, SPR_620_PMR6, "PMR6",
2141
                 SPR_NOACCESS, SPR_NOACCESS,
2142
                 &spr_read_generic, &spr_write_generic,
2143
                 0x00000000);
2144
    /* XXX : not implemented */
2145
    spr_register(env, SPR_620_PMR7, "PMR7",
2146
                 SPR_NOACCESS, SPR_NOACCESS,
2147
                 &spr_read_generic, &spr_write_generic,
2148
                 0x00000000);
2149
    /* XXX : not implemented */
2150
    spr_register(env, SPR_620_PMR8, "PMR8",
2151
                 SPR_NOACCESS, SPR_NOACCESS,
2152
                 &spr_read_generic, &spr_write_generic,
2153
                 0x00000000);
2154
    /* XXX : not implemented */
2155
    spr_register(env, SPR_620_PMR9, "PMR9",
2156
                 SPR_NOACCESS, SPR_NOACCESS,
2157
                 &spr_read_generic, &spr_write_generic,
2158
                 0x00000000);
2159
    /* XXX : not implemented */
2160
    spr_register(env, SPR_620_PMRA, "PMR10",
2161
                 SPR_NOACCESS, SPR_NOACCESS,
2162
                 &spr_read_generic, &spr_write_generic,
2163
                 0x00000000);
2164
    /* XXX : not implemented */
2165
    spr_register(env, SPR_620_PMRB, "PMR11",
2166
                 SPR_NOACCESS, SPR_NOACCESS,
2167
                 &spr_read_generic, &spr_write_generic,
2168
                 0x00000000);
2169
    /* XXX : not implemented */
2170
    spr_register(env, SPR_620_PMRC, "PMR12",
2171
                 SPR_NOACCESS, SPR_NOACCESS,
2172
                 &spr_read_generic, &spr_write_generic,
2173
                 0x00000000);
2174
    /* XXX : not implemented */
2175
    spr_register(env, SPR_620_PMRD, "PMR13",
2176
                 SPR_NOACCESS, SPR_NOACCESS,
2177
                 &spr_read_generic, &spr_write_generic,
2178
                 0x00000000);
2179
    /* XXX : not implemented */
2180
    spr_register(env, SPR_620_PMRE, "PMR14",
2181
                 SPR_NOACCESS, SPR_NOACCESS,
2182
                 &spr_read_generic, &spr_write_generic,
2183
                 0x00000000);
2184
    /* XXX : not implemented */
2185
    spr_register(env, SPR_620_PMRF, "PMR15",
2186
                 SPR_NOACCESS, SPR_NOACCESS,
2187
                 &spr_read_generic, &spr_write_generic,
2188
                 0x00000000);
2189
#endif
2190
    /* XXX : not implemented */
2191
    spr_register(env, SPR_620_BUSCSR, "BUSCSR",
2192
                 SPR_NOACCESS, SPR_NOACCESS,
2193
                 &spr_read_generic, &spr_write_generic,
2194
                 0x00000000);
2195
    /* XXX : not implemented */
2196
    spr_register(env, SPR_620_L2CR, "L2CR",
2197
                 SPR_NOACCESS, SPR_NOACCESS,
2198
                 &spr_read_generic, &spr_write_generic,
2199
                 0x00000000);
2200
    /* XXX : not implemented */
2201
    spr_register(env, SPR_620_L2SR, "L2SR",
2202
                 SPR_NOACCESS, SPR_NOACCESS,
2203
                 &spr_read_generic, &spr_write_generic,
2204
                 0x00000000);
2205
}
2206
#endif /* defined (TARGET_PPC64) */
2207

    
2208
static void gen_spr_5xx_8xx (CPUPPCState *env)
2209
{
2210
    /* Exception processing */
2211
    spr_register(env, SPR_DSISR, "DSISR",
2212
                 SPR_NOACCESS, SPR_NOACCESS,
2213
                 &spr_read_generic, &spr_write_generic,
2214
                 0x00000000);
2215
    spr_register(env, SPR_DAR, "DAR",
2216
                 SPR_NOACCESS, SPR_NOACCESS,
2217
                 &spr_read_generic, &spr_write_generic,
2218
                 0x00000000);
2219
    /* Timer */
2220
    spr_register(env, SPR_DECR, "DECR",
2221
                 SPR_NOACCESS, SPR_NOACCESS,
2222
                 &spr_read_decr, &spr_write_decr,
2223
                 0x00000000);
2224
    /* XXX : not implemented */
2225
    spr_register(env, SPR_MPC_EIE, "EIE",
2226
                 SPR_NOACCESS, SPR_NOACCESS,
2227
                 &spr_read_generic, &spr_write_generic,
2228
                 0x00000000);
2229
    /* XXX : not implemented */
2230
    spr_register(env, SPR_MPC_EID, "EID",
2231
                 SPR_NOACCESS, SPR_NOACCESS,
2232
                 &spr_read_generic, &spr_write_generic,
2233
                 0x00000000);
2234
    /* XXX : not implemented */
2235
    spr_register(env, SPR_MPC_NRI, "NRI",
2236
                 SPR_NOACCESS, SPR_NOACCESS,
2237
                 &spr_read_generic, &spr_write_generic,
2238
                 0x00000000);
2239
    /* XXX : not implemented */
2240
    spr_register(env, SPR_MPC_CMPA, "CMPA",
2241
                 SPR_NOACCESS, SPR_NOACCESS,
2242
                 &spr_read_generic, &spr_write_generic,
2243
                 0x00000000);
2244
    /* XXX : not implemented */
2245
    spr_register(env, SPR_MPC_CMPB, "CMPB",
2246
                 SPR_NOACCESS, SPR_NOACCESS,
2247
                 &spr_read_generic, &spr_write_generic,
2248
                 0x00000000);
2249
    /* XXX : not implemented */
2250
    spr_register(env, SPR_MPC_CMPC, "CMPC",
2251
                 SPR_NOACCESS, SPR_NOACCESS,
2252
                 &spr_read_generic, &spr_write_generic,
2253
                 0x00000000);
2254
    /* XXX : not implemented */
2255
    spr_register(env, SPR_MPC_CMPD, "CMPD",
2256
                 SPR_NOACCESS, SPR_NOACCESS,
2257
                 &spr_read_generic, &spr_write_generic,
2258
                 0x00000000);
2259
    /* XXX : not implemented */
2260
    spr_register(env, SPR_MPC_ECR, "ECR",
2261
                 SPR_NOACCESS, SPR_NOACCESS,
2262
                 &spr_read_generic, &spr_write_generic,
2263
                 0x00000000);
2264
    /* XXX : not implemented */
2265
    spr_register(env, SPR_MPC_DER, "DER",
2266
                 SPR_NOACCESS, SPR_NOACCESS,
2267
                 &spr_read_generic, &spr_write_generic,
2268
                 0x00000000);
2269
    /* XXX : not implemented */
2270
    spr_register(env, SPR_MPC_COUNTA, "COUNTA",
2271
                 SPR_NOACCESS, SPR_NOACCESS,
2272
                 &spr_read_generic, &spr_write_generic,
2273
                 0x00000000);
2274
    /* XXX : not implemented */
2275
    spr_register(env, SPR_MPC_COUNTB, "COUNTB",
2276
                 SPR_NOACCESS, SPR_NOACCESS,
2277
                 &spr_read_generic, &spr_write_generic,
2278
                 0x00000000);
2279
    /* XXX : not implemented */
2280
    spr_register(env, SPR_MPC_CMPE, "CMPE",
2281
                 SPR_NOACCESS, SPR_NOACCESS,
2282
                 &spr_read_generic, &spr_write_generic,
2283
                 0x00000000);
2284
    /* XXX : not implemented */
2285
    spr_register(env, SPR_MPC_CMPF, "CMPF",
2286
                 SPR_NOACCESS, SPR_NOACCESS,
2287
                 &spr_read_generic, &spr_write_generic,
2288
                 0x00000000);
2289
    /* XXX : not implemented */
2290
    spr_register(env, SPR_MPC_CMPG, "CMPG",
2291
                 SPR_NOACCESS, SPR_NOACCESS,
2292
                 &spr_read_generic, &spr_write_generic,
2293
                 0x00000000);
2294
    /* XXX : not implemented */
2295
    spr_register(env, SPR_MPC_CMPH, "CMPH",
2296
                 SPR_NOACCESS, SPR_NOACCESS,
2297
                 &spr_read_generic, &spr_write_generic,
2298
                 0x00000000);
2299
    /* XXX : not implemented */
2300
    spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
2301
                 SPR_NOACCESS, SPR_NOACCESS,
2302
                 &spr_read_generic, &spr_write_generic,
2303
                 0x00000000);
2304
    /* XXX : not implemented */
2305
    spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
2306
                 SPR_NOACCESS, SPR_NOACCESS,
2307
                 &spr_read_generic, &spr_write_generic,
2308
                 0x00000000);
2309
    /* XXX : not implemented */
2310
    spr_register(env, SPR_MPC_BAR, "BAR",
2311
                 SPR_NOACCESS, SPR_NOACCESS,
2312
                 &spr_read_generic, &spr_write_generic,
2313
                 0x00000000);
2314
    /* XXX : not implemented */
2315
    spr_register(env, SPR_MPC_DPDR, "DPDR",
2316
                 SPR_NOACCESS, SPR_NOACCESS,
2317
                 &spr_read_generic, &spr_write_generic,
2318
                 0x00000000);
2319
    /* XXX : not implemented */
2320
    spr_register(env, SPR_MPC_IMMR, "IMMR",
2321
                 SPR_NOACCESS, SPR_NOACCESS,
2322
                 &spr_read_generic, &spr_write_generic,
2323
                 0x00000000);
2324
}
2325

    
2326
static void gen_spr_5xx (CPUPPCState *env)
2327
{
2328
    /* XXX : not implemented */
2329
    spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
2330
                 SPR_NOACCESS, SPR_NOACCESS,
2331
                 &spr_read_generic, &spr_write_generic,
2332
                 0x00000000);
2333
    /* XXX : not implemented */
2334
    spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
2335
                 SPR_NOACCESS, SPR_NOACCESS,
2336
                 &spr_read_generic, &spr_write_generic,
2337
                 0x00000000);
2338
    /* XXX : not implemented */
2339
    spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
2340
                 SPR_NOACCESS, SPR_NOACCESS,
2341
                 &spr_read_generic, &spr_write_generic,
2342
                 0x00000000);
2343
    /* XXX : not implemented */
2344
    spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
2345
                 SPR_NOACCESS, SPR_NOACCESS,
2346
                 &spr_read_generic, &spr_write_generic,
2347
                 0x00000000);
2348
    /* XXX : not implemented */
2349
    spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
2350
                 SPR_NOACCESS, SPR_NOACCESS,
2351
                 &spr_read_generic, &spr_write_generic,
2352
                 0x00000000);
2353
    /* XXX : not implemented */
2354
    spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
2355
                 SPR_NOACCESS, SPR_NOACCESS,
2356
                 &spr_read_generic, &spr_write_generic,
2357
                 0x00000000);
2358
    /* XXX : not implemented */
2359
    spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
2360
                 SPR_NOACCESS, SPR_NOACCESS,
2361
                 &spr_read_generic, &spr_write_generic,
2362
                 0x00000000);
2363
    /* XXX : not implemented */
2364
    spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
2365
                 SPR_NOACCESS, SPR_NOACCESS,
2366
                 &spr_read_generic, &spr_write_generic,
2367
                 0x00000000);
2368
    /* XXX : not implemented */
2369
    spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
2370
                 SPR_NOACCESS, SPR_NOACCESS,
2371
                 &spr_read_generic, &spr_write_generic,
2372
                 0x00000000);
2373
    /* XXX : not implemented */
2374
    spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
2375
                 SPR_NOACCESS, SPR_NOACCESS,
2376
                 &spr_read_generic, &spr_write_generic,
2377
                 0x00000000);
2378
    /* XXX : not implemented */
2379
    spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
2380
                 SPR_NOACCESS, SPR_NOACCESS,
2381
                 &spr_read_generic, &spr_write_generic,
2382
                 0x00000000);
2383
    /* XXX : not implemented */
2384
    spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
2385
                 SPR_NOACCESS, SPR_NOACCESS,
2386
                 &spr_read_generic, &spr_write_generic,
2387
                 0x00000000);
2388
    /* XXX : not implemented */
2389
    spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
2390
                 SPR_NOACCESS, SPR_NOACCESS,
2391
                 &spr_read_generic, &spr_write_generic,
2392
                 0x00000000);
2393
    /* XXX : not implemented */
2394
    spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
2395
                 SPR_NOACCESS, SPR_NOACCESS,
2396
                 &spr_read_generic, &spr_write_generic,
2397
                 0x00000000);
2398
    /* XXX : not implemented */
2399
    spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
2400
                 SPR_NOACCESS, SPR_NOACCESS,
2401
                 &spr_read_generic, &spr_write_generic,
2402
                 0x00000000);
2403
    /* XXX : not implemented */
2404
    spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
2405
                 SPR_NOACCESS, SPR_NOACCESS,
2406
                 &spr_read_generic, &spr_write_generic,
2407
                 0x00000000);
2408
    /* XXX : not implemented */
2409
    spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
2410
                 SPR_NOACCESS, SPR_NOACCESS,
2411
                 &spr_read_generic, &spr_write_generic,
2412
                 0x00000000);
2413
    /* XXX : not implemented */
2414
    spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
2415
                 SPR_NOACCESS, SPR_NOACCESS,
2416
                 &spr_read_generic, &spr_write_generic,
2417
                 0x00000000);
2418
    /* XXX : not implemented */
2419
    spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
2420
                 SPR_NOACCESS, SPR_NOACCESS,
2421
                 &spr_read_generic, &spr_write_generic,
2422
                 0x00000000);
2423
    /* XXX : not implemented */
2424
    spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
2425
                 SPR_NOACCESS, SPR_NOACCESS,
2426
                 &spr_read_generic, &spr_write_generic,
2427
                 0x00000000);
2428
    /* XXX : not implemented */
2429
    spr_register(env, SPR_RCPU_FPECR, "FPECR",
2430
                 SPR_NOACCESS, SPR_NOACCESS,
2431
                 &spr_read_generic, &spr_write_generic,
2432
                 0x00000000);
2433
}
2434

    
2435
static void gen_spr_8xx (CPUPPCState *env)
2436
{
2437
    /* XXX : not implemented */
2438
    spr_register(env, SPR_MPC_IC_CST, "IC_CST",
2439
                 SPR_NOACCESS, SPR_NOACCESS,
2440
                 &spr_read_generic, &spr_write_generic,
2441
                 0x00000000);
2442
    /* XXX : not implemented */
2443
    spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
2444
                 SPR_NOACCESS, SPR_NOACCESS,
2445
                 &spr_read_generic, &spr_write_generic,
2446
                 0x00000000);
2447
    /* XXX : not implemented */
2448
    spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
2449
                 SPR_NOACCESS, SPR_NOACCESS,
2450
                 &spr_read_generic, &spr_write_generic,
2451
                 0x00000000);
2452
    /* XXX : not implemented */
2453
    spr_register(env, SPR_MPC_DC_CST, "DC_CST",
2454
                 SPR_NOACCESS, SPR_NOACCESS,
2455
                 &spr_read_generic, &spr_write_generic,
2456
                 0x00000000);
2457
    /* XXX : not implemented */
2458
    spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
2459
                 SPR_NOACCESS, SPR_NOACCESS,
2460
                 &spr_read_generic, &spr_write_generic,
2461
                 0x00000000);
2462
    /* XXX : not implemented */
2463
    spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
2464
                 SPR_NOACCESS, SPR_NOACCESS,
2465
                 &spr_read_generic, &spr_write_generic,
2466
                 0x00000000);
2467
    /* XXX : not implemented */
2468
    spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
2469
                 SPR_NOACCESS, SPR_NOACCESS,
2470
                 &spr_read_generic, &spr_write_generic,
2471
                 0x00000000);
2472
    /* XXX : not implemented */
2473
    spr_register(env, SPR_MPC_MI_AP, "MI_AP",
2474
                 SPR_NOACCESS, SPR_NOACCESS,
2475
                 &spr_read_generic, &spr_write_generic,
2476
                 0x00000000);
2477
    /* XXX : not implemented */
2478
    spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
2479
                 SPR_NOACCESS, SPR_NOACCESS,
2480
                 &spr_read_generic, &spr_write_generic,
2481
                 0x00000000);
2482
    /* XXX : not implemented */
2483
    spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
2484
                 SPR_NOACCESS, SPR_NOACCESS,
2485
                 &spr_read_generic, &spr_write_generic,
2486
                 0x00000000);
2487
    /* XXX : not implemented */
2488
    spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
2489
                 SPR_NOACCESS, SPR_NOACCESS,
2490
                 &spr_read_generic, &spr_write_generic,
2491
                 0x00000000);
2492
    /* XXX : not implemented */
2493
    spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
2494
                 SPR_NOACCESS, SPR_NOACCESS,
2495
                 &spr_read_generic, &spr_write_generic,
2496
                 0x00000000);
2497
    /* XXX : not implemented */
2498
    spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
2499
                 SPR_NOACCESS, SPR_NOACCESS,
2500
                 &spr_read_generic, &spr_write_generic,
2501
                 0x00000000);
2502
    /* XXX : not implemented */
2503
    spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
2504
                 SPR_NOACCESS, SPR_NOACCESS,
2505
                 &spr_read_generic, &spr_write_generic,
2506
                 0x00000000);
2507
    /* XXX : not implemented */
2508
    spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
2509
                 SPR_NOACCESS, SPR_NOACCESS,
2510
                 &spr_read_generic, &spr_write_generic,
2511
                 0x00000000);
2512
    /* XXX : not implemented */
2513
    spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
2514
                 SPR_NOACCESS, SPR_NOACCESS,
2515
                 &spr_read_generic, &spr_write_generic,
2516
                 0x00000000);
2517
    /* XXX : not implemented */
2518
    spr_register(env, SPR_MPC_MD_AP, "MD_AP",
2519
                 SPR_NOACCESS, SPR_NOACCESS,
2520
                 &spr_read_generic, &spr_write_generic,
2521
                 0x00000000);
2522
    /* XXX : not implemented */
2523
    spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2524
                 SPR_NOACCESS, SPR_NOACCESS,
2525
                 &spr_read_generic, &spr_write_generic,
2526
                 0x00000000);
2527
    /* XXX : not implemented */
2528
    spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2529
                 SPR_NOACCESS, SPR_NOACCESS,
2530
                 &spr_read_generic, &spr_write_generic,
2531
                 0x00000000);
2532
    /* XXX : not implemented */
2533
    spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2534
                 SPR_NOACCESS, SPR_NOACCESS,
2535
                 &spr_read_generic, &spr_write_generic,
2536
                 0x00000000);
2537
    /* XXX : not implemented */
2538
    spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2539
                 SPR_NOACCESS, SPR_NOACCESS,
2540
                 &spr_read_generic, &spr_write_generic,
2541
                 0x00000000);
2542
    /* XXX : not implemented */
2543
    spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2544
                 SPR_NOACCESS, SPR_NOACCESS,
2545
                 &spr_read_generic, &spr_write_generic,
2546
                 0x00000000);
2547
    /* XXX : not implemented */
2548
    spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2549
                 SPR_NOACCESS, SPR_NOACCESS,
2550
                 &spr_read_generic, &spr_write_generic,
2551
                 0x00000000);
2552
    /* XXX : not implemented */
2553
    spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2554
                 SPR_NOACCESS, SPR_NOACCESS,
2555
                 &spr_read_generic, &spr_write_generic,
2556
                 0x00000000);
2557
    /* XXX : not implemented */
2558
    spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2559
                 SPR_NOACCESS, SPR_NOACCESS,
2560
                 &spr_read_generic, &spr_write_generic,
2561
                 0x00000000);
2562
}
2563

    
2564
// XXX: TODO
2565
/*
2566
 * AMR     => SPR 29 (Power 2.04)
2567
 * CTRL    => SPR 136 (Power 2.04)
2568
 * CTRL    => SPR 152 (Power 2.04)
2569
 * SCOMC   => SPR 276 (64 bits ?)
2570
 * SCOMD   => SPR 277 (64 bits ?)
2571
 * TBU40   => SPR 286 (Power 2.04 hypv)
2572
 * HSPRG0  => SPR 304 (Power 2.04 hypv)
2573
 * HSPRG1  => SPR 305 (Power 2.04 hypv)
2574
 * HDSISR  => SPR 306 (Power 2.04 hypv)
2575
 * HDAR    => SPR 307 (Power 2.04 hypv)
2576
 * PURR    => SPR 309 (Power 2.04 hypv)
2577
 * HDEC    => SPR 310 (Power 2.04 hypv)
2578
 * HIOR    => SPR 311 (hypv)
2579
 * RMOR    => SPR 312 (970)
2580
 * HRMOR   => SPR 313 (Power 2.04 hypv)
2581
 * HSRR0   => SPR 314 (Power 2.04 hypv)
2582
 * HSRR1   => SPR 315 (Power 2.04 hypv)
2583
 * LPCR    => SPR 316 (970)
2584
 * LPIDR   => SPR 317 (970)
2585
 * EPR     => SPR 702 (Power 2.04 emb)
2586
 * perf    => 768-783 (Power 2.04)
2587
 * perf    => 784-799 (Power 2.04)
2588
 * PPR     => SPR 896 (Power 2.04)
2589
 * EPLC    => SPR 947 (Power 2.04 emb)
2590
 * EPSC    => SPR 948 (Power 2.04 emb)
2591
 * DABRX   => 1015    (Power 2.04 hypv)
2592
 * FPECR   => SPR 1022 (?)
2593
 * ... and more (thermal management, performance counters, ...)
2594
 */
2595

    
2596
/*****************************************************************************/
2597
/* Exception vectors models                                                  */
2598
static void init_excp_4xx_real (CPUPPCState *env)
2599
{
2600
#if !defined(CONFIG_USER_ONLY)
2601
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2602
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2603
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2604
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2605
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2606
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2607
    env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2608
    env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2609
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2610
    env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2611
    env->hreset_excp_prefix = 0x00000000UL;
2612
    env->ivor_mask = 0x0000FFF0UL;
2613
    env->ivpr_mask = 0xFFFF0000UL;
2614
    /* Hardware reset vector */
2615
    env->hreset_vector = 0xFFFFFFFCUL;
2616
#endif
2617
}
2618

    
2619
static void init_excp_4xx_softmmu (CPUPPCState *env)
2620
{
2621
#if !defined(CONFIG_USER_ONLY)
2622
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2623
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2624
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2625
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2626
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2627
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2628
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2629
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2630
    env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2631
    env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2632
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2633
    env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001100;
2634
    env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001200;
2635
    env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2636
    env->hreset_excp_prefix = 0x00000000UL;
2637
    env->ivor_mask = 0x0000FFF0UL;
2638
    env->ivpr_mask = 0xFFFF0000UL;
2639
    /* Hardware reset vector */
2640
    env->hreset_vector = 0xFFFFFFFCUL;
2641
#endif
2642
}
2643

    
2644
static void init_excp_MPC5xx (CPUPPCState *env)
2645
{
2646
#if !defined(CONFIG_USER_ONLY)
2647
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2648
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2649
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2650
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2651
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2652
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000900;
2653
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2654
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2655
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2656
    env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2657
    env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
2658
    env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
2659
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
2660
    env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
2661
    env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
2662
    env->hreset_excp_prefix = 0x00000000UL;
2663
    env->ivor_mask = 0x0000FFF0UL;
2664
    env->ivpr_mask = 0xFFFF0000UL;
2665
    /* Hardware reset vector */
2666
    env->hreset_vector = 0xFFFFFFFCUL;
2667
#endif
2668
}
2669

    
2670
static void init_excp_MPC8xx (CPUPPCState *env)
2671
{
2672
#if !defined(CONFIG_USER_ONLY)
2673
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2674
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2675
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2676
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2677
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2678
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2679
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2680
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000900;
2681
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2682
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2683
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2684
    env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2685
    env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
2686
    env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001100;
2687
    env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001200;
2688
    env->excp_vectors[POWERPC_EXCP_ITLBE]    = 0x00001300;
2689
    env->excp_vectors[POWERPC_EXCP_DTLBE]    = 0x00001400;
2690
    env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
2691
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
2692
    env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
2693
    env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
2694
    env->hreset_excp_prefix = 0x00000000UL;
2695
    env->ivor_mask = 0x0000FFF0UL;
2696
    env->ivpr_mask = 0xFFFF0000UL;
2697
    /* Hardware reset vector */
2698
    env->hreset_vector = 0xFFFFFFFCUL;
2699
#endif
2700
}
2701

    
2702
static void init_excp_G2 (CPUPPCState *env)
2703
{
2704
#if !defined(CONFIG_USER_ONLY)
2705
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2706
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2707
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2708
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2709
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2710
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2711
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2712
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2713
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2714
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2715
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2716
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2717
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2718
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2719
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2720
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2721
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2722
    env->hreset_excp_prefix = 0x00000000UL;
2723
    /* Hardware reset vector */
2724
    env->hreset_vector = 0xFFFFFFFCUL;
2725
#endif
2726
}
2727

    
2728
static void init_excp_e200 (CPUPPCState *env)
2729
{
2730
#if !defined(CONFIG_USER_ONLY)
2731
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000FFC;
2732
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2733
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
2734
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
2735
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
2736
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2737
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
2738
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
2739
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
2740
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
2741
    env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
2742
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
2743
    env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
2744
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
2745
    env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
2746
    env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
2747
    env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
2748
    env->excp_vectors[POWERPC_EXCP_SPEU]     = 0x00000000;
2749
    env->excp_vectors[POWERPC_EXCP_EFPDI]    = 0x00000000;
2750
    env->excp_vectors[POWERPC_EXCP_EFPRI]    = 0x00000000;
2751
    env->hreset_excp_prefix = 0x00000000UL;
2752
    env->ivor_mask = 0x0000FFF7UL;
2753
    env->ivpr_mask = 0xFFFF0000UL;
2754
    /* Hardware reset vector */
2755
    env->hreset_vector = 0xFFFFFFFCUL;
2756
#endif
2757
}
2758

    
2759
static void init_excp_BookE (CPUPPCState *env)
2760
{
2761
#if !defined(CONFIG_USER_ONLY)
2762
    env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2763
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
2764
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
2765
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
2766
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2767
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
2768
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
2769
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
2770
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
2771
    env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
2772
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
2773
    env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
2774
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
2775
    env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
2776
    env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
2777
    env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
2778
    env->hreset_excp_prefix = 0x00000000UL;
2779
    env->ivor_mask = 0x0000FFE0UL;
2780
    env->ivpr_mask = 0xFFFF0000UL;
2781
    /* Hardware reset vector */
2782
    env->hreset_vector = 0xFFFFFFFCUL;
2783
#endif
2784
}
2785

    
2786
static void init_excp_601 (CPUPPCState *env)
2787
{
2788
#if !defined(CONFIG_USER_ONLY)
2789
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2790
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2791
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2792
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2793
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2794
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2795
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2796
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2797
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2798
    env->excp_vectors[POWERPC_EXCP_IO]       = 0x00000A00;
2799
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2800
    env->excp_vectors[POWERPC_EXCP_RUNM]     = 0x00002000;
2801
    env->hreset_excp_prefix = 0xFFF00000UL;
2802
    /* Hardware reset vector */
2803
    env->hreset_vector = 0x00000100UL;
2804
#endif
2805
}
2806

    
2807
static void init_excp_602 (CPUPPCState *env)
2808
{
2809
#if !defined(CONFIG_USER_ONLY)
2810
    /* XXX: exception prefix has a special behavior on 602 */
2811
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2812
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2813
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2814
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2815
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2816
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2817
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2818
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2819
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2820
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2821
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2822
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2823
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2824
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2825
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2826
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2827
    env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001500;
2828
    env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001600;
2829
    env->hreset_excp_prefix = 0xFFF00000UL;
2830
    /* Hardware reset vector */
2831
    env->hreset_vector = 0xFFFFFFFCUL;
2832
#endif
2833
}
2834

    
2835
static void init_excp_603 (CPUPPCState *env)
2836
{
2837
#if !defined(CONFIG_USER_ONLY)
2838
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2839
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2840
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2841
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2842
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2843
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2844
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2845
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2846
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2847
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2848
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2849
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2850
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2851
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2852
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2853
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2854
    env->hreset_excp_prefix = 0x00000000UL;
2855
    /* Hardware reset vector */
2856
    env->hreset_vector = 0xFFFFFFFCUL;
2857
#endif
2858
}
2859

    
2860
static void init_excp_604 (CPUPPCState *env)
2861
{
2862
#if !defined(CONFIG_USER_ONLY)
2863
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2864
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2865
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2866
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2867
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2868
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2869
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2870
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2871
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2872
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2873
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2874
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2875
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2876
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2877
    env->hreset_excp_prefix = 0xFFF00000UL;
2878
    /* Hardware reset vector */
2879
    env->hreset_vector = 0x00000100UL;
2880
#endif
2881
}
2882

    
2883
#if defined(TARGET_PPC64)
2884
static void init_excp_620 (CPUPPCState *env)
2885
{
2886
#if !defined(CONFIG_USER_ONLY)
2887
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2888
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2889
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2890
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2891
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2892
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2893
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2894
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2895
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2896
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2897
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2898
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2899
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2900
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2901
    env->hreset_excp_prefix = 0xFFF00000UL;
2902
    /* Hardware reset vector */
2903
    env->hreset_vector = 0x0000000000000100ULL;
2904
#endif
2905
}
2906
#endif /* defined(TARGET_PPC64) */
2907

    
2908
static void init_excp_7x0 (CPUPPCState *env)
2909
{
2910
#if !defined(CONFIG_USER_ONLY)
2911
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2912
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2913
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2914
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2915
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2916
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2917
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2918
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2919
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2920
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2921
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2922
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2923
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2924
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2925
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
2926
    env->hreset_excp_prefix = 0x00000000UL;
2927
    /* Hardware reset vector */
2928
    env->hreset_vector = 0xFFFFFFFCUL;
2929
#endif
2930
}
2931

    
2932
static void init_excp_750cl (CPUPPCState *env)
2933
{
2934
#if !defined(CONFIG_USER_ONLY)
2935
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2936
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2937
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2938
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2939
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2940
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2941
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2942
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2943
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2944
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2945
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2946
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2947
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2948
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2949
    env->hreset_excp_prefix = 0x00000000UL;
2950
    /* Hardware reset vector */
2951
    env->hreset_vector = 0xFFFFFFFCUL;
2952
#endif
2953
}
2954

    
2955
static void init_excp_750cx (CPUPPCState *env)
2956
{
2957
#if !defined(CONFIG_USER_ONLY)
2958
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2959
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2960
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2961
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2962
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2963
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2964
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2965
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2966
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2967
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2968
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2969
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2970
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2971
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
2972
    env->hreset_excp_prefix = 0x00000000UL;
2973
    /* Hardware reset vector */
2974
    env->hreset_vector = 0xFFFFFFFCUL;
2975
#endif
2976
}
2977

    
2978
/* XXX: Check if this is correct */
2979
static void init_excp_7x5 (CPUPPCState *env)
2980
{
2981
#if !defined(CONFIG_USER_ONLY)
2982
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2983
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2984
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2985
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2986
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2987
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2988
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2989
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2990
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2991
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2992
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2993
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2994
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2995
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2996
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2997
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2998
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2999
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3000
    env->hreset_excp_prefix = 0x00000000UL;
3001
    /* Hardware reset vector */
3002
    env->hreset_vector = 0xFFFFFFFCUL;
3003
#endif
3004
}
3005

    
3006
static void init_excp_7400 (CPUPPCState *env)
3007
{
3008
#if !defined(CONFIG_USER_ONLY)
3009
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3010
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3011
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3012
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3013
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3014
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3015
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3016
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3017
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3018
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3019
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3020
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3021
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3022
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3023
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3024
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
3025
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3026
    env->hreset_excp_prefix = 0x00000000UL;
3027
    /* Hardware reset vector */
3028
    env->hreset_vector = 0xFFFFFFFCUL;
3029
#endif
3030
}
3031

    
3032
static void init_excp_7450 (CPUPPCState *env)
3033
{
3034
#if !defined(CONFIG_USER_ONLY)
3035
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3036
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3037
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3038
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3039
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3040
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3041
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3042
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3043
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3044
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3045
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3046
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3047
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3048
    env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
3049
    env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
3050
    env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
3051
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3052
    env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3053
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
3054
    env->hreset_excp_prefix = 0x00000000UL;
3055
    /* Hardware reset vector */
3056
    env->hreset_vector = 0xFFFFFFFCUL;
3057
#endif
3058
}
3059

    
3060
#if defined (TARGET_PPC64)
3061
static void init_excp_970 (CPUPPCState *env)
3062
{
3063
#if !defined(CONFIG_USER_ONLY)
3064
    env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3065
    env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3066
    env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3067
    env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
3068
    env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3069
    env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
3070
    env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3071
    env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3072
    env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3073
    env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3074
    env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3075
    env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
3076
    env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3077
    env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3078
    env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3079
    env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3080
    env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3081
    env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
3082
    env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
3083
    env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
3084
    env->hreset_excp_prefix = 0x00000000FFF00000ULL;
3085
    /* Hardware reset vector */
3086
    env->hreset_vector = 0x0000000000000100ULL;
3087
#endif
3088
}
3089
#endif
3090

    
3091
/*****************************************************************************/
3092
/* Power management enable checks                                            */
3093
static int check_pow_none (CPUPPCState *env)
3094
{
3095
    return 0;
3096
}
3097

    
3098
static int check_pow_nocheck (CPUPPCState *env)
3099
{
3100
    return 1;
3101
}
3102

    
3103
static int check_pow_hid0 (CPUPPCState *env)
3104
{
3105
    if (env->spr[SPR_HID0] & 0x00E00000)
3106
        return 1;
3107

    
3108
    return 0;
3109
}
3110

    
3111
static int check_pow_hid0_74xx (CPUPPCState *env)
3112
{
3113
    if (env->spr[SPR_HID0] & 0x00600000)
3114
        return 1;
3115

    
3116
    return 0;
3117
}
3118

    
3119
/*****************************************************************************/
3120
/* PowerPC implementations definitions                                       */
3121

    
3122
/* PowerPC 401                                                               */
3123
#define POWERPC_INSNS_401    (PPC_INSNS_BASE | PPC_STRING |                   \
3124
                              PPC_WRTEE | PPC_DCR |                           \
3125
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3126
                              PPC_CACHE_DCBZ |                                \
3127
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3128
                              PPC_4xx_COMMON | PPC_40x_EXCP)
3129
#define POWERPC_MSRM_401     (0x00000000000FD201ULL)
3130
#define POWERPC_MMU_401      (POWERPC_MMU_REAL)
3131
#define POWERPC_EXCP_401     (POWERPC_EXCP_40x)
3132
#define POWERPC_INPUT_401    (PPC_FLAGS_INPUT_401)
3133
#define POWERPC_BFDM_401     (bfd_mach_ppc_403)
3134
#define POWERPC_FLAG_401     (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3135
                              POWERPC_FLAG_BUS_CLK)
3136
#define check_pow_401        check_pow_nocheck
3137

    
3138
static void init_proc_401 (CPUPPCState *env)
3139
{
3140
    gen_spr_40x(env);
3141
    gen_spr_401_403(env);
3142
    gen_spr_401(env);
3143
    init_excp_4xx_real(env);
3144
    env->dcache_line_size = 32;
3145
    env->icache_line_size = 32;
3146
    /* Allocate hardware IRQ controller */
3147
    ppc40x_irq_init(env);
3148
}
3149

    
3150
/* PowerPC 401x2                                                             */
3151
#define POWERPC_INSNS_401x2  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3152
                              PPC_DCR | PPC_WRTEE |                           \
3153
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3154
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3155
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3156
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3157
                              PPC_4xx_COMMON | PPC_40x_EXCP)
3158
#define POWERPC_MSRM_401x2   (0x00000000001FD231ULL)
3159
#define POWERPC_MMU_401x2    (POWERPC_MMU_SOFT_4xx_Z)
3160
#define POWERPC_EXCP_401x2   (POWERPC_EXCP_40x)
3161
#define POWERPC_INPUT_401x2  (PPC_FLAGS_INPUT_401)
3162
#define POWERPC_BFDM_401x2   (bfd_mach_ppc_403)
3163
#define POWERPC_FLAG_401x2   (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3164
                              POWERPC_FLAG_BUS_CLK)
3165
#define check_pow_401x2      check_pow_nocheck
3166

    
3167
static void init_proc_401x2 (CPUPPCState *env)
3168
{
3169
    gen_spr_40x(env);
3170
    gen_spr_401_403(env);
3171
    gen_spr_401x2(env);
3172
    gen_spr_compress(env);
3173
    /* Memory management */
3174
#if !defined(CONFIG_USER_ONLY)
3175
    env->nb_tlb = 64;
3176
    env->nb_ways = 1;
3177
    env->id_tlbs = 0;
3178
#endif
3179
    init_excp_4xx_softmmu(env);
3180
    env->dcache_line_size = 32;
3181
    env->icache_line_size = 32;
3182
    /* Allocate hardware IRQ controller */
3183
    ppc40x_irq_init(env);
3184
}
3185

    
3186
/* PowerPC 401x3                                                             */
3187
#define POWERPC_INSNS_401x3  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3188
                              PPC_DCR | PPC_WRTEE |                           \
3189
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3190
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3191
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3192
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3193
                              PPC_4xx_COMMON | PPC_40x_EXCP)
3194
#define POWERPC_MSRM_401x3   (0x00000000001FD631ULL)
3195
#define POWERPC_MMU_401x3    (POWERPC_MMU_SOFT_4xx_Z)
3196
#define POWERPC_EXCP_401x3   (POWERPC_EXCP_40x)
3197
#define POWERPC_INPUT_401x3  (PPC_FLAGS_INPUT_401)
3198
#define POWERPC_BFDM_401x3   (bfd_mach_ppc_403)
3199
#define POWERPC_FLAG_401x3   (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3200
                              POWERPC_FLAG_BUS_CLK)
3201
#define check_pow_401x3      check_pow_nocheck
3202

    
3203
__attribute__ (( unused ))
3204
static void init_proc_401x3 (CPUPPCState *env)
3205
{
3206
    gen_spr_40x(env);
3207
    gen_spr_401_403(env);
3208
    gen_spr_401(env);
3209
    gen_spr_401x2(env);
3210
    gen_spr_compress(env);
3211
    init_excp_4xx_softmmu(env);
3212
    env->dcache_line_size = 32;
3213
    env->icache_line_size = 32;
3214
    /* Allocate hardware IRQ controller */
3215
    ppc40x_irq_init(env);
3216
}
3217

    
3218
/* IOP480                                                                    */
3219
#define POWERPC_INSNS_IOP480 (PPC_INSNS_BASE | PPC_STRING |                   \
3220
                              PPC_DCR | PPC_WRTEE |                           \
3221
                              PPC_CACHE | PPC_CACHE_ICBI |  PPC_40x_ICBT |    \
3222
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3223
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3224
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3225
                              PPC_4xx_COMMON | PPC_40x_EXCP)
3226
#define POWERPC_MSRM_IOP480  (0x00000000001FD231ULL)
3227
#define POWERPC_MMU_IOP480   (POWERPC_MMU_SOFT_4xx_Z)
3228
#define POWERPC_EXCP_IOP480  (POWERPC_EXCP_40x)
3229
#define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401)
3230
#define POWERPC_BFDM_IOP480  (bfd_mach_ppc_403)
3231
#define POWERPC_FLAG_IOP480  (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3232
                              POWERPC_FLAG_BUS_CLK)
3233
#define check_pow_IOP480     check_pow_nocheck
3234

    
3235
static void init_proc_IOP480 (CPUPPCState *env)
3236
{
3237
    gen_spr_40x(env);
3238
    gen_spr_401_403(env);
3239
    gen_spr_401x2(env);
3240
    gen_spr_compress(env);
3241
    /* Memory management */
3242
#if !defined(CONFIG_USER_ONLY)
3243
    env->nb_tlb = 64;
3244
    env->nb_ways = 1;
3245
    env->id_tlbs = 0;
3246
#endif
3247
    init_excp_4xx_softmmu(env);
3248
    env->dcache_line_size = 32;
3249
    env->icache_line_size = 32;
3250
    /* Allocate hardware IRQ controller */
3251
    ppc40x_irq_init(env);
3252
}
3253

    
3254
/* PowerPC 403                                                               */
3255
#define POWERPC_INSNS_403    (PPC_INSNS_BASE | PPC_STRING |                   \
3256
                              PPC_DCR | PPC_WRTEE |                           \
3257
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3258
                              PPC_CACHE_DCBZ |                                \
3259
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3260
                              PPC_4xx_COMMON | PPC_40x_EXCP)
3261
#define POWERPC_MSRM_403     (0x000000000007D00DULL)
3262
#define POWERPC_MMU_403      (POWERPC_MMU_REAL)
3263
#define POWERPC_EXCP_403     (POWERPC_EXCP_40x)
3264
#define POWERPC_INPUT_403    (PPC_FLAGS_INPUT_401)
3265
#define POWERPC_BFDM_403     (bfd_mach_ppc_403)
3266
#define POWERPC_FLAG_403     (POWERPC_FLAG_CE | POWERPC_FLAG_PX |             \
3267
                              POWERPC_FLAG_BUS_CLK)
3268
#define check_pow_403        check_pow_nocheck
3269

    
3270
static void init_proc_403 (CPUPPCState *env)
3271
{
3272
    gen_spr_40x(env);
3273
    gen_spr_401_403(env);
3274
    gen_spr_403(env);
3275
    gen_spr_403_real(env);
3276
    init_excp_4xx_real(env);
3277
    env->dcache_line_size = 32;
3278
    env->icache_line_size = 32;
3279
    /* Allocate hardware IRQ controller */
3280
    ppc40x_irq_init(env);
3281
}
3282

    
3283
/* PowerPC 403 GCX                                                           */
3284
#define POWERPC_INSNS_403GCX (PPC_INSNS_BASE | PPC_STRING |                   \
3285
                              PPC_DCR | PPC_WRTEE |                           \
3286
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3287
                              PPC_CACHE_DCBZ |                                \
3288
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3289
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3290
                              PPC_4xx_COMMON | PPC_40x_EXCP)
3291
#define POWERPC_MSRM_403GCX  (0x000000000007D00DULL)
3292
#define POWERPC_MMU_403GCX   (POWERPC_MMU_SOFT_4xx_Z)
3293
#define POWERPC_EXCP_403GCX  (POWERPC_EXCP_40x)
3294
#define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401)
3295
#define POWERPC_BFDM_403GCX  (bfd_mach_ppc_403)
3296
#define POWERPC_FLAG_403GCX  (POWERPC_FLAG_CE | POWERPC_FLAG_PX |             \
3297
                              POWERPC_FLAG_BUS_CLK)
3298
#define check_pow_403GCX     check_pow_nocheck
3299

    
3300
static void init_proc_403GCX (CPUPPCState *env)
3301
{
3302
    gen_spr_40x(env);
3303
    gen_spr_401_403(env);
3304
    gen_spr_403(env);
3305
    gen_spr_403_real(env);
3306
    gen_spr_403_mmu(env);
3307
    /* Bus access control */
3308
    /* not emulated, as Qemu never does speculative access */
3309
    spr_register(env, SPR_40x_SGR, "SGR",
3310
                 SPR_NOACCESS, SPR_NOACCESS,
3311
                 &spr_read_generic, &spr_write_generic,
3312
                 0xFFFFFFFF);
3313
    /* not emulated, as Qemu do not emulate caches */
3314
    spr_register(env, SPR_40x_DCWR, "DCWR",
3315
                 SPR_NOACCESS, SPR_NOACCESS,
3316
                 &spr_read_generic, &spr_write_generic,
3317
                 0x00000000);
3318
    /* Memory management */
3319
#if !defined(CONFIG_USER_ONLY)
3320
    env->nb_tlb = 64;
3321
    env->nb_ways = 1;
3322
    env->id_tlbs = 0;
3323
#endif
3324
    init_excp_4xx_softmmu(env);
3325
    env->dcache_line_size = 32;
3326
    env->icache_line_size = 32;
3327
    /* Allocate hardware IRQ controller */
3328
    ppc40x_irq_init(env);
3329
}
3330

    
3331
/* PowerPC 405                                                               */
3332
#define POWERPC_INSNS_405    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3333
                              PPC_DCR | PPC_WRTEE |                           \
3334
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3335
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3336
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3337
                              PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3338
                              PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP)
3339
#define POWERPC_MSRM_405     (0x000000000006E630ULL)
3340
#define POWERPC_MMU_405      (POWERPC_MMU_SOFT_4xx)
3341
#define POWERPC_EXCP_405     (POWERPC_EXCP_40x)
3342
#define POWERPC_INPUT_405    (PPC_FLAGS_INPUT_405)
3343
#define POWERPC_BFDM_405     (bfd_mach_ppc_403)
3344
#define POWERPC_FLAG_405     (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3345
                              POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3346
#define check_pow_405        check_pow_nocheck
3347

    
3348
static void init_proc_405 (CPUPPCState *env)
3349
{
3350
    /* Time base */
3351
    gen_tbl(env);
3352
    gen_spr_40x(env);
3353
    gen_spr_405(env);
3354
    /* Bus access control */
3355
    /* not emulated, as Qemu never does speculative access */
3356
    spr_register(env, SPR_40x_SGR, "SGR",
3357
                 SPR_NOACCESS, SPR_NOACCESS,
3358
                 &spr_read_generic, &spr_write_generic,
3359
                 0xFFFFFFFF);
3360
    /* not emulated, as Qemu do not emulate caches */
3361
    spr_register(env, SPR_40x_DCWR, "DCWR",
3362
                 SPR_NOACCESS, SPR_NOACCESS,
3363
                 &spr_read_generic, &spr_write_generic,
3364
                 0x00000000);
3365
    /* Memory management */
3366
#if !defined(CONFIG_USER_ONLY)
3367
    env->nb_tlb = 64;
3368
    env->nb_ways = 1;
3369
    env->id_tlbs = 0;
3370
#endif
3371
    init_excp_4xx_softmmu(env);
3372
    env->dcache_line_size = 32;
3373
    env->icache_line_size = 32;
3374
    /* Allocate hardware IRQ controller */
3375
    ppc40x_irq_init(env);
3376
}
3377

    
3378
/* PowerPC 440 EP                                                            */
3379
#define POWERPC_INSNS_440EP  (PPC_INSNS_BASE | PPC_STRING |                   \
3380
                              PPC_DCR | PPC_WRTEE | PPC_RFMCI |               \
3381
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
3382
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3383
                              PPC_MEM_TLBSYNC | PPC_MFTB |                    \
3384
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3385
                              PPC_440_SPEC)
3386
#define POWERPC_MSRM_440EP   (0x000000000006D630ULL)
3387
#define POWERPC_MMU_440EP    (POWERPC_MMU_BOOKE)
3388
#define POWERPC_EXCP_440EP   (POWERPC_EXCP_BOOKE)
3389
#define POWERPC_INPUT_440EP  (PPC_FLAGS_INPUT_BookE)
3390
#define POWERPC_BFDM_440EP   (bfd_mach_ppc_403)
3391
#define POWERPC_FLAG_440EP   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3392
                              POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3393
#define check_pow_440EP      check_pow_nocheck
3394

    
3395
__attribute__ (( unused ))
3396
static void init_proc_440EP (CPUPPCState *env)
3397
{
3398
    /* Time base */
3399
    gen_tbl(env);
3400
    gen_spr_BookE(env, 0x000000000000FFFFULL);
3401
    gen_spr_440(env);
3402
    gen_spr_usprgh(env);
3403
    /* Processor identification */
3404
    spr_register(env, SPR_BOOKE_PIR, "PIR",
3405
                 SPR_NOACCESS, SPR_NOACCESS,
3406
                 &spr_read_generic, &spr_write_pir,
3407
                 0x00000000);
3408
    /* XXX : not implemented */
3409
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3410
                 SPR_NOACCESS, SPR_NOACCESS,
3411
                 &spr_read_generic, &spr_write_generic,
3412
                 0x00000000);
3413
    /* XXX : not implemented */
3414
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3415
                 SPR_NOACCESS, SPR_NOACCESS,
3416
                 &spr_read_generic, &spr_write_generic,
3417
                 0x00000000);
3418
    /* XXX : not implemented */
3419
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3420
                 SPR_NOACCESS, SPR_NOACCESS,
3421
                 &spr_read_generic, &spr_write_generic,
3422
                 0x00000000);
3423
    /* XXX : not implemented */
3424
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3425
                 SPR_NOACCESS, SPR_NOACCESS,
3426
                 &spr_read_generic, &spr_write_generic,
3427
                 0x00000000);
3428
    /* XXX : not implemented */
3429
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3430
                 SPR_NOACCESS, SPR_NOACCESS,
3431
                 &spr_read_generic, &spr_write_generic,
3432
                 0x00000000);
3433
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3434
                 SPR_NOACCESS, SPR_NOACCESS,
3435
                 &spr_read_generic, &spr_write_generic,
3436
                 0x00000000);
3437
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3438
                 SPR_NOACCESS, SPR_NOACCESS,
3439
                 &spr_read_generic, &spr_write_generic,
3440
                 0x00000000);
3441
    /* XXX : not implemented */
3442
    spr_register(env, SPR_440_CCR1, "CCR1",
3443
                 SPR_NOACCESS, SPR_NOACCESS,
3444
                 &spr_read_generic, &spr_write_generic,
3445
                 0x00000000);
3446
    /* Memory management */
3447
#if !defined(CONFIG_USER_ONLY)
3448
    env->nb_tlb = 64;
3449
    env->nb_ways = 1;
3450
    env->id_tlbs = 0;
3451
#endif
3452
    init_excp_BookE(env);
3453
    env->dcache_line_size = 32;
3454
    env->icache_line_size = 32;
3455
    /* XXX: TODO: allocate internal IRQ controller */
3456
}
3457

    
3458
/* PowerPC 440 GP                                                            */
3459
#define POWERPC_INSNS_440GP  (PPC_INSNS_BASE | PPC_STRING |                   \
3460
                              PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |  \
3461
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
3462
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3463
                              PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |       \
3464
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3465
                              PPC_440_SPEC)
3466
#define POWERPC_MSRM_440GP   (0x000000000006FF30ULL)
3467
#define POWERPC_MMU_440GP    (POWERPC_MMU_BOOKE)
3468
#define POWERPC_EXCP_440GP   (POWERPC_EXCP_BOOKE)
3469
#define POWERPC_INPUT_440GP  (PPC_FLAGS_INPUT_BookE)
3470
#define POWERPC_BFDM_440GP   (bfd_mach_ppc_403)
3471
#define POWERPC_FLAG_440GP   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3472
                              POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3473
#define check_pow_440GP      check_pow_nocheck
3474

    
3475
__attribute__ (( unused ))
3476
static void init_proc_440GP (CPUPPCState *env)
3477
{
3478
    /* Time base */
3479
    gen_tbl(env);
3480
    gen_spr_BookE(env, 0x000000000000FFFFULL);
3481
    gen_spr_440(env);
3482
    gen_spr_usprgh(env);
3483
    /* Processor identification */
3484
    spr_register(env, SPR_BOOKE_PIR, "PIR",
3485
                 SPR_NOACCESS, SPR_NOACCESS,
3486
                 &spr_read_generic, &spr_write_pir,
3487
                 0x00000000);
3488
    /* XXX : not implemented */
3489
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3490
                 SPR_NOACCESS, SPR_NOACCESS,
3491
                 &spr_read_generic, &spr_write_generic,
3492
                 0x00000000);
3493
    /* XXX : not implemented */
3494
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3495
                 SPR_NOACCESS, SPR_NOACCESS,
3496
                 &spr_read_generic, &spr_write_generic,
3497
                 0x00000000);
3498
    /* XXX : not implemented */
3499
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3500
                 SPR_NOACCESS, SPR_NOACCESS,
3501
                 &spr_read_generic, &spr_write_generic,
3502
                 0x00000000);
3503
    /* XXX : not implemented */
3504
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3505
                 SPR_NOACCESS, SPR_NOACCESS,
3506
                 &spr_read_generic, &spr_write_generic,
3507
                 0x00000000);
3508
    /* Memory management */
3509
#if !defined(CONFIG_USER_ONLY)
3510
    env->nb_tlb = 64;
3511
    env->nb_ways = 1;
3512
    env->id_tlbs = 0;
3513
#endif
3514
    init_excp_BookE(env);
3515
    env->dcache_line_size = 32;
3516
    env->icache_line_size = 32;
3517
    /* XXX: TODO: allocate internal IRQ controller */
3518
}
3519

    
3520
/* PowerPC 440x4                                                             */
3521
#define POWERPC_INSNS_440x4  (PPC_INSNS_BASE | PPC_STRING |                   \
3522
                              PPC_DCR | PPC_WRTEE |                           \
3523
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
3524
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3525
                              PPC_MEM_TLBSYNC | PPC_MFTB |                    \
3526
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3527
                              PPC_440_SPEC)
3528
#define POWERPC_MSRM_440x4   (0x000000000006FF30ULL)
3529
#define POWERPC_MMU_440x4    (POWERPC_MMU_BOOKE)
3530
#define POWERPC_EXCP_440x4   (POWERPC_EXCP_BOOKE)
3531
#define POWERPC_INPUT_440x4  (PPC_FLAGS_INPUT_BookE)
3532
#define POWERPC_BFDM_440x4   (bfd_mach_ppc_403)
3533
#define POWERPC_FLAG_440x4   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3534
                              POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3535
#define check_pow_440x4      check_pow_nocheck
3536

    
3537
__attribute__ (( unused ))
3538
static void init_proc_440x4 (CPUPPCState *env)
3539
{
3540
    /* Time base */
3541
    gen_tbl(env);
3542
    gen_spr_BookE(env, 0x000000000000FFFFULL);
3543
    gen_spr_440(env);
3544
    gen_spr_usprgh(env);
3545
    /* Processor identification */
3546
    spr_register(env, SPR_BOOKE_PIR, "PIR",
3547
                 SPR_NOACCESS, SPR_NOACCESS,
3548
                 &spr_read_generic, &spr_write_pir,
3549
                 0x00000000);
3550
    /* XXX : not implemented */
3551
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3552
                 SPR_NOACCESS, SPR_NOACCESS,
3553
                 &spr_read_generic, &spr_write_generic,
3554
                 0x00000000);
3555
    /* XXX : not implemented */
3556
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3557
                 SPR_NOACCESS, SPR_NOACCESS,
3558
                 &spr_read_generic, &spr_write_generic,
3559
                 0x00000000);
3560
    /* XXX : not implemented */
3561
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3562
                 SPR_NOACCESS, SPR_NOACCESS,
3563
                 &spr_read_generic, &spr_write_generic,
3564
                 0x00000000);
3565
    /* XXX : not implemented */
3566
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3567
                 SPR_NOACCESS, SPR_NOACCESS,
3568
                 &spr_read_generic, &spr_write_generic,
3569
                 0x00000000);
3570
    /* Memory management */
3571
#if !defined(CONFIG_USER_ONLY)
3572
    env->nb_tlb = 64;
3573
    env->nb_ways = 1;
3574
    env->id_tlbs = 0;
3575
#endif
3576
    init_excp_BookE(env);
3577
    env->dcache_line_size = 32;
3578
    env->icache_line_size = 32;
3579
    /* XXX: TODO: allocate internal IRQ controller */
3580
}
3581

    
3582
/* PowerPC 440x5                                                             */
3583
#define POWERPC_INSNS_440x5  (PPC_INSNS_BASE | PPC_STRING |                   \
3584
                              PPC_DCR | PPC_WRTEE | PPC_RFMCI |               \
3585
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
3586
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3587
                              PPC_MEM_TLBSYNC | PPC_MFTB |                    \
3588
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3589
                              PPC_440_SPEC)
3590
#define POWERPC_MSRM_440x5   (0x000000000006FF30ULL)
3591
#define POWERPC_MMU_440x5    (POWERPC_MMU_BOOKE)
3592
#define POWERPC_EXCP_440x5   (POWERPC_EXCP_BOOKE)
3593
#define POWERPC_INPUT_440x5  (PPC_FLAGS_INPUT_BookE)
3594
#define POWERPC_BFDM_440x5   (bfd_mach_ppc_403)
3595
#define POWERPC_FLAG_440x5   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |           \
3596
                              POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3597
#define check_pow_440x5      check_pow_nocheck
3598

    
3599
__attribute__ (( unused ))
3600
static void init_proc_440x5 (CPUPPCState *env)
3601
{
3602
    /* Time base */
3603
    gen_tbl(env);
3604
    gen_spr_BookE(env, 0x000000000000FFFFULL);
3605
    gen_spr_440(env);
3606
    gen_spr_usprgh(env);
3607
    /* Processor identification */
3608
    spr_register(env, SPR_BOOKE_PIR, "PIR",
3609
                 SPR_NOACCESS, SPR_NOACCESS,
3610
                 &spr_read_generic, &spr_write_pir,
3611
                 0x00000000);
3612
    /* XXX : not implemented */
3613
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3614
                 SPR_NOACCESS, SPR_NOACCESS,
3615
                 &spr_read_generic, &spr_write_generic,
3616
                 0x00000000);
3617
    /* XXX : not implemented */
3618
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3619
                 SPR_NOACCESS, SPR_NOACCESS,
3620
                 &spr_read_generic, &spr_write_generic,
3621
                 0x00000000);
3622
    /* XXX : not implemented */
3623
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3624
                 SPR_NOACCESS, SPR_NOACCESS,
3625
                 &spr_read_generic, &spr_write_generic,
3626
                 0x00000000);
3627
    /* XXX : not implemented */
3628
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3629
                 SPR_NOACCESS, SPR_NOACCESS,
3630
                 &spr_read_generic, &spr_write_generic,
3631
                 0x00000000);
3632
    /* XXX : not implemented */
3633
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3634
                 SPR_NOACCESS, SPR_NOACCESS,
3635
                 &spr_read_generic, &spr_write_generic,
3636
                 0x00000000);
3637
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3638
                 SPR_NOACCESS, SPR_NOACCESS,
3639
                 &spr_read_generic, &spr_write_generic,
3640
                 0x00000000);
3641
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3642
                 SPR_NOACCESS, SPR_NOACCESS,
3643
                 &spr_read_generic, &spr_write_generic,
3644
                 0x00000000);
3645
    /* XXX : not implemented */
3646
    spr_register(env, SPR_440_CCR1, "CCR1",
3647
                 SPR_NOACCESS, SPR_NOACCESS,
3648
                 &spr_read_generic, &spr_write_generic,
3649
                 0x00000000);
3650
    /* Memory management */
3651
#if !defined(CONFIG_USER_ONLY)
3652
    env->nb_tlb = 64;
3653
    env->nb_ways = 1;
3654
    env->id_tlbs = 0;
3655
#endif
3656
    init_excp_BookE(env);
3657
    env->dcache_line_size = 32;
3658
    env->icache_line_size = 32;
3659
    /* XXX: TODO: allocate internal IRQ controller */
3660
}
3661

    
3662
/* PowerPC 460 (guessed)                                                     */
3663
#define POWERPC_INSNS_460    (PPC_INSNS_BASE | PPC_STRING |                   \
3664
                              PPC_DCR | PPC_DCRX  | PPC_DCRUX |               \
3665
                              PPC_WRTEE | PPC_MFAPIDI | PPC_MFTB |            \
3666
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
3667
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3668
                              PPC_MEM_TLBSYNC | PPC_TLBIVA |                  \
3669
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3670
                              PPC_440_SPEC)
3671
#define POWERPC_MSRM_460     (0x000000000006FF30ULL)
3672
#define POWERPC_MMU_460      (POWERPC_MMU_BOOKE)
3673
#define POWERPC_EXCP_460     (POWERPC_EXCP_BOOKE)
3674
#define POWERPC_INPUT_460    (PPC_FLAGS_INPUT_BookE)
3675
#define POWERPC_BFDM_460     (bfd_mach_ppc_403)
3676
#define POWERPC_FLAG_460     (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3677
                              POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3678
#define check_pow_460        check_pow_nocheck
3679

    
3680
__attribute__ (( unused ))
3681
static void init_proc_460 (CPUPPCState *env)
3682
{
3683
    /* Time base */
3684
    gen_tbl(env);
3685
    gen_spr_BookE(env, 0x000000000000FFFFULL);
3686
    gen_spr_440(env);
3687
    gen_spr_usprgh(env);
3688
    /* Processor identification */
3689
    spr_register(env, SPR_BOOKE_PIR, "PIR",
3690
                 SPR_NOACCESS, SPR_NOACCESS,
3691
                 &spr_read_generic, &spr_write_pir,
3692
                 0x00000000);
3693
    /* XXX : not implemented */
3694
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3695
                 SPR_NOACCESS, SPR_NOACCESS,
3696
                 &spr_read_generic, &spr_write_generic,
3697
                 0x00000000);
3698
    /* XXX : not implemented */
3699
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3700
                 SPR_NOACCESS, SPR_NOACCESS,
3701
                 &spr_read_generic, &spr_write_generic,
3702
                 0x00000000);
3703
    /* XXX : not implemented */
3704
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3705
                 SPR_NOACCESS, SPR_NOACCESS,
3706
                 &spr_read_generic, &spr_write_generic,
3707
                 0x00000000);
3708
    /* XXX : not implemented */
3709
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3710
                 SPR_NOACCESS, SPR_NOACCESS,
3711
                 &spr_read_generic, &spr_write_generic,
3712
                 0x00000000);
3713
    /* XXX : not implemented */
3714
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3715
                 SPR_NOACCESS, SPR_NOACCESS,
3716
                 &spr_read_generic, &spr_write_generic,
3717
                 0x00000000);
3718
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3719
                 SPR_NOACCESS, SPR_NOACCESS,
3720
                 &spr_read_generic, &spr_write_generic,
3721
                 0x00000000);
3722
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3723
                 SPR_NOACCESS, SPR_NOACCESS,
3724
                 &spr_read_generic, &spr_write_generic,
3725
                 0x00000000);
3726
    /* XXX : not implemented */
3727
    spr_register(env, SPR_440_CCR1, "CCR1",
3728
                 SPR_NOACCESS, SPR_NOACCESS,
3729
                 &spr_read_generic, &spr_write_generic,
3730
                 0x00000000);
3731
    /* XXX : not implemented */
3732
    spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
3733
                 &spr_read_generic, &spr_write_generic,
3734
                 &spr_read_generic, &spr_write_generic,
3735
                 0x00000000);
3736
    /* Memory management */
3737
#if !defined(CONFIG_USER_ONLY)
3738
    env->nb_tlb = 64;
3739
    env->nb_ways = 1;
3740
    env->id_tlbs = 0;
3741
#endif
3742
    init_excp_BookE(env);
3743
    env->dcache_line_size = 32;
3744
    env->icache_line_size = 32;
3745
    /* XXX: TODO: allocate internal IRQ controller */
3746
}
3747

    
3748
/* PowerPC 460F (guessed)                                                    */
3749
#define POWERPC_INSNS_460F   (PPC_INSNS_BASE | PPC_STRING |                   \
3750
                              PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |   \
3751
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
3752
                              PPC_FLOAT_STFIWX | PPC_MFTB |                   \
3753
                              PPC_DCR | PPC_DCRX | PPC_DCRUX |                \
3754
                              PPC_WRTEE | PPC_MFAPIDI |                       \
3755
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
3756
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3757
                              PPC_MEM_TLBSYNC | PPC_TLBIVA |                  \
3758
                              PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3759
                              PPC_440_SPEC)
3760
#define POWERPC_MSRM_460     (0x000000000006FF30ULL)
3761
#define POWERPC_MMU_460F     (POWERPC_MMU_BOOKE)
3762
#define POWERPC_EXCP_460F    (POWERPC_EXCP_BOOKE)
3763
#define POWERPC_INPUT_460F   (PPC_FLAGS_INPUT_BookE)
3764
#define POWERPC_BFDM_460F    (bfd_mach_ppc_403)
3765
#define POWERPC_FLAG_460F    (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3766
                              POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3767
#define check_pow_460F       check_pow_nocheck
3768

    
3769
__attribute__ (( unused ))
3770
static void init_proc_460F (CPUPPCState *env)
3771
{
3772
    /* Time base */
3773
    gen_tbl(env);
3774
    gen_spr_BookE(env, 0x000000000000FFFFULL);
3775
    gen_spr_440(env);
3776
    gen_spr_usprgh(env);
3777
    /* Processor identification */
3778
    spr_register(env, SPR_BOOKE_PIR, "PIR",
3779
                 SPR_NOACCESS, SPR_NOACCESS,
3780
                 &spr_read_generic, &spr_write_pir,
3781
                 0x00000000);
3782
    /* XXX : not implemented */
3783
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3784
                 SPR_NOACCESS, SPR_NOACCESS,
3785
                 &spr_read_generic, &spr_write_generic,
3786
                 0x00000000);
3787
    /* XXX : not implemented */
3788
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3789
                 SPR_NOACCESS, SPR_NOACCESS,
3790
                 &spr_read_generic, &spr_write_generic,
3791
                 0x00000000);
3792
    /* XXX : not implemented */
3793
    spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3794
                 SPR_NOACCESS, SPR_NOACCESS,
3795
                 &spr_read_generic, &spr_write_generic,
3796
                 0x00000000);
3797
    /* XXX : not implemented */
3798
    spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3799
                 SPR_NOACCESS, SPR_NOACCESS,
3800
                 &spr_read_generic, &spr_write_generic,
3801
                 0x00000000);
3802
    /* XXX : not implemented */
3803
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3804
                 SPR_NOACCESS, SPR_NOACCESS,
3805
                 &spr_read_generic, &spr_write_generic,
3806
                 0x00000000);
3807
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3808
                 SPR_NOACCESS, SPR_NOACCESS,
3809
                 &spr_read_generic, &spr_write_generic,
3810
                 0x00000000);
3811
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3812
                 SPR_NOACCESS, SPR_NOACCESS,
3813
                 &spr_read_generic, &spr_write_generic,
3814
                 0x00000000);
3815
    /* XXX : not implemented */
3816
    spr_register(env, SPR_440_CCR1, "CCR1",
3817
                 SPR_NOACCESS, SPR_NOACCESS,
3818
                 &spr_read_generic, &spr_write_generic,
3819
                 0x00000000);
3820
    /* XXX : not implemented */
3821
    spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
3822
                 &spr_read_generic, &spr_write_generic,
3823
                 &spr_read_generic, &spr_write_generic,
3824
                 0x00000000);
3825
    /* Memory management */
3826
#if !defined(CONFIG_USER_ONLY)
3827
    env->nb_tlb = 64;
3828
    env->nb_ways = 1;
3829
    env->id_tlbs = 0;
3830
#endif
3831
    init_excp_BookE(env);
3832
    env->dcache_line_size = 32;
3833
    env->icache_line_size = 32;
3834
    /* XXX: TODO: allocate internal IRQ controller */
3835
}
3836

    
3837
/* Freescale 5xx cores (aka RCPU) */
3838
#define POWERPC_INSNS_MPC5xx (PPC_INSNS_BASE | PPC_STRING |                   \
3839
                              PPC_MEM_EIEIO | PPC_MEM_SYNC |                  \
3840
                              PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX | \
3841
                              PPC_MFTB)
3842
#define POWERPC_MSRM_MPC5xx  (0x000000000001FF43ULL)
3843
#define POWERPC_MMU_MPC5xx   (POWERPC_MMU_REAL)
3844
#define POWERPC_EXCP_MPC5xx  (POWERPC_EXCP_603)
3845
#define POWERPC_INPUT_MPC5xx (PPC_FLAGS_INPUT_RCPU)
3846
#define POWERPC_BFDM_MPC5xx  (bfd_mach_ppc_505)
3847
#define POWERPC_FLAG_MPC5xx  (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
3848
                              POWERPC_FLAG_BUS_CLK)
3849
#define check_pow_MPC5xx     check_pow_none
3850

    
3851
__attribute__ (( unused ))
3852
static void init_proc_MPC5xx (CPUPPCState *env)
3853
{
3854
    /* Time base */
3855
    gen_tbl(env);
3856
    gen_spr_5xx_8xx(env);
3857
    gen_spr_5xx(env);
3858
    init_excp_MPC5xx(env);
3859
    env->dcache_line_size = 32;
3860
    env->icache_line_size = 32;
3861
    /* XXX: TODO: allocate internal IRQ controller */
3862
}
3863

    
3864
/* Freescale 8xx cores (aka PowerQUICC) */
3865
#define POWERPC_INSNS_MPC8xx (PPC_INSNS_BASE | PPC_STRING  |                  \
3866
                              PPC_MEM_EIEIO | PPC_MEM_SYNC |                  \
3867
                              PPC_CACHE_ICBI | PPC_MFTB)
3868
#define POWERPC_MSRM_MPC8xx  (0x000000000001F673ULL)
3869
#define POWERPC_MMU_MPC8xx   (POWERPC_MMU_MPC8xx)
3870
#define POWERPC_EXCP_MPC8xx  (POWERPC_EXCP_603)
3871
#define POWERPC_INPUT_MPC8xx (PPC_FLAGS_INPUT_RCPU)
3872
#define POWERPC_BFDM_MPC8xx  (bfd_mach_ppc_860)
3873
#define POWERPC_FLAG_MPC8xx  (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
3874
                              POWERPC_FLAG_BUS_CLK)
3875
#define check_pow_MPC8xx     check_pow_none
3876

    
3877
__attribute__ (( unused ))
3878
static void init_proc_MPC8xx (CPUPPCState *env)
3879
{
3880
    /* Time base */
3881
    gen_tbl(env);
3882
    gen_spr_5xx_8xx(env);
3883
    gen_spr_8xx(env);
3884
    init_excp_MPC8xx(env);
3885
    env->dcache_line_size = 32;
3886
    env->icache_line_size = 32;
3887
    /* XXX: TODO: allocate internal IRQ controller */
3888
}
3889

    
3890
/* Freescale 82xx cores (aka PowerQUICC-II)                                  */
3891
/* PowerPC G2                                                                */
3892
#define POWERPC_INSNS_G2     (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3893
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
3894
                              PPC_FLOAT_STFIWX |                              \
3895
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
3896
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3897
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
3898
                              PPC_SEGMENT | PPC_EXTERN)
3899
#define POWERPC_MSRM_G2      (0x000000000006FFF2ULL)
3900
#define POWERPC_MMU_G2       (POWERPC_MMU_SOFT_6xx)
3901
//#define POWERPC_EXCP_G2      (POWERPC_EXCP_G2)
3902
#define POWERPC_INPUT_G2     (PPC_FLAGS_INPUT_6xx)
3903
#define POWERPC_BFDM_G2      (bfd_mach_ppc_ec603e)
3904
#define POWERPC_FLAG_G2      (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
3905
                              POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
3906
#define check_pow_G2         check_pow_hid0
3907

    
3908
static void init_proc_G2 (CPUPPCState *env)
3909
{
3910
    gen_spr_ne_601(env);
3911
    gen_spr_G2_755(env);
3912
    gen_spr_G2(env);
3913
    /* Time base */
3914
    gen_tbl(env);
3915
    /* External access control */
3916
    /* XXX : not implemented */
3917
    spr_register(env, SPR_EAR, "EAR",
3918
                 SPR_NOACCESS, SPR_NOACCESS,
3919
                 &spr_read_generic, &spr_write_generic,
3920
                 0x00000000);
3921
    /* Hardware implementation register */
3922
    /* XXX : not implemented */
3923
    spr_register(env, SPR_HID0, "HID0",
3924
                 SPR_NOACCESS, SPR_NOACCESS,
3925
                 &spr_read_generic, &spr_write_generic,
3926
                 0x00000000);
3927
    /* XXX : not implemented */
3928
    spr_register(env, SPR_HID1, "HID1",
3929
                 SPR_NOACCESS, SPR_NOACCESS,
3930
                 &spr_read_generic, &spr_write_generic,
3931
                 0x00000000);
3932
    /* XXX : not implemented */
3933
    spr_register(env, SPR_HID2, "HID2",
3934
                 SPR_NOACCESS, SPR_NOACCESS,
3935
                 &spr_read_generic, &spr_write_generic,
3936
                 0x00000000);
3937
    /* Memory management */
3938
    gen_low_BATs(env);
3939
    gen_high_BATs(env);
3940
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3941
    init_excp_G2(env);
3942
    env->dcache_line_size = 32;
3943
    env->icache_line_size = 32;
3944
    /* Allocate hardware IRQ controller */
3945
    ppc6xx_irq_init(env);
3946
}
3947

    
3948
/* PowerPC G2LE                                                              */
3949
#define POWERPC_INSNS_G2LE   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3950
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
3951
                              PPC_FLOAT_STFIWX |                              \
3952
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
3953
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3954
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
3955
                              PPC_SEGMENT | PPC_EXTERN)
3956
#define POWERPC_MSRM_G2LE    (0x000000000007FFF3ULL)
3957
#define POWERPC_MMU_G2LE     (POWERPC_MMU_SOFT_6xx)
3958
#define POWERPC_EXCP_G2LE    (POWERPC_EXCP_G2)
3959
#define POWERPC_INPUT_G2LE   (PPC_FLAGS_INPUT_6xx)
3960
#define POWERPC_BFDM_G2LE    (bfd_mach_ppc_ec603e)
3961
#define POWERPC_FLAG_G2LE    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
3962
                              POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
3963
#define check_pow_G2LE       check_pow_hid0
3964

    
3965
static void init_proc_G2LE (CPUPPCState *env)
3966
{
3967
    gen_spr_ne_601(env);
3968
    gen_spr_G2_755(env);
3969
    gen_spr_G2(env);
3970
    /* Time base */
3971
    gen_tbl(env);
3972
    /* External access control */
3973
    /* XXX : not implemented */
3974
    spr_register(env, SPR_EAR, "EAR",
3975
                 SPR_NOACCESS, SPR_NOACCESS,
3976
                 &spr_read_generic, &spr_write_generic,
3977
                 0x00000000);
3978
    /* Hardware implementation register */
3979
    /* XXX : not implemented */
3980
    spr_register(env, SPR_HID0, "HID0",
3981
                 SPR_NOACCESS, SPR_NOACCESS,
3982
                 &spr_read_generic, &spr_write_generic,
3983
                 0x00000000);
3984
    /* XXX : not implemented */
3985
    spr_register(env, SPR_HID1, "HID1",
3986
                 SPR_NOACCESS, SPR_NOACCESS,
3987
                 &spr_read_generic, &spr_write_generic,
3988
                 0x00000000);
3989
    /* XXX : not implemented */
3990
    spr_register(env, SPR_HID2, "HID2",
3991
                 SPR_NOACCESS, SPR_NOACCESS,
3992
                 &spr_read_generic, &spr_write_generic,
3993
                 0x00000000);
3994
    /* Memory management */
3995
    gen_low_BATs(env);
3996
    gen_high_BATs(env);
3997
    gen_6xx_7xx_soft_tlb(env, 64, 2);
3998
    init_excp_G2(env);
3999
    env->dcache_line_size = 32;
4000
    env->icache_line_size = 32;
4001
    /* Allocate hardware IRQ controller */
4002
    ppc6xx_irq_init(env);
4003
}
4004

    
4005
/* e200 core                                                                 */
4006
/* XXX: unimplemented instructions:
4007
 * dcblc
4008
 * dcbtlst
4009
 * dcbtstls
4010
 * icblc
4011
 * icbtls
4012
 * tlbivax
4013
 * all SPE multiply-accumulate instructions
4014
 */
4015
#define POWERPC_INSNS_e200   (PPC_INSNS_BASE | PPC_ISEL |                     \
4016
                              PPC_SPE | PPC_SPE_SINGLE |                      \
4017
                              PPC_WRTEE | PPC_RFDI |                          \
4018
                              PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |   \
4019
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
4020
                              PPC_MEM_TLBSYNC | PPC_TLBIVAX |                 \
4021
                              PPC_BOOKE)
4022
#define POWERPC_MSRM_e200    (0x000000000606FF30ULL)
4023
#define POWERPC_MMU_e200     (POWERPC_MMU_BOOKE_FSL)
4024
#define POWERPC_EXCP_e200    (POWERPC_EXCP_BOOKE)
4025
#define POWERPC_INPUT_e200   (PPC_FLAGS_INPUT_BookE)
4026
#define POWERPC_BFDM_e200    (bfd_mach_ppc_860)
4027
#define POWERPC_FLAG_e200    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |            \
4028
                              POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |           \
4029
                              POWERPC_FLAG_BUS_CLK)
4030
#define check_pow_e200       check_pow_hid0
4031

    
4032
__attribute__ (( unused ))
4033
static void init_proc_e200 (CPUPPCState *env)
4034
{
4035
    /* Time base */
4036
    gen_tbl(env);
4037
    gen_spr_BookE(env, 0x000000070000FFFFULL);
4038
    /* XXX : not implemented */
4039
    spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4040
                 &spr_read_spefscr, &spr_write_spefscr,
4041
                 &spr_read_spefscr, &spr_write_spefscr,
4042
                 0x00000000);
4043
    /* Memory management */
4044
    gen_spr_BookE_FSL(env, 0x0000005D);
4045
    /* XXX : not implemented */
4046
    spr_register(env, SPR_HID0, "HID0",
4047
                 SPR_NOACCESS, SPR_NOACCESS,
4048
                 &spr_read_generic, &spr_write_generic,
4049
                 0x00000000);
4050
    /* XXX : not implemented */
4051
    spr_register(env, SPR_HID1, "HID1",
4052
                 SPR_NOACCESS, SPR_NOACCESS,
4053
                 &spr_read_generic, &spr_write_generic,
4054
                 0x00000000);
4055
    /* XXX : not implemented */
4056
    spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
4057
                 SPR_NOACCESS, SPR_NOACCESS,
4058
                 &spr_read_generic, &spr_write_generic,
4059
                 0x00000000);
4060
    /* XXX : not implemented */
4061
    spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4062
                 SPR_NOACCESS, SPR_NOACCESS,
4063
                 &spr_read_generic, &spr_write_generic,
4064
                 0x00000000);
4065
    /* XXX : not implemented */
4066
    spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
4067
                 SPR_NOACCESS, SPR_NOACCESS,
4068
                 &spr_read_generic, &spr_write_generic,
4069
                 0x00000000);
4070
    /* XXX : not implemented */
4071
    spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
4072
                 SPR_NOACCESS, SPR_NOACCESS,
4073
                 &spr_read_generic, &spr_write_generic,
4074
                 0x00000000);
4075
    /* XXX : not implemented */
4076
    spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
4077
                 SPR_NOACCESS, SPR_NOACCESS,
4078
                 &spr_read_generic, &spr_write_generic,
4079
                 0x00000000);
4080
    /* XXX : not implemented */
4081
    spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4082
                 SPR_NOACCESS, SPR_NOACCESS,
4083
                 &spr_read_generic, &spr_write_generic,
4084
                 0x00000000);
4085
    /* XXX : not implemented */
4086
    spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4087
                 SPR_NOACCESS, SPR_NOACCESS,
4088
                 &spr_read_generic, &spr_write_generic,
4089
                 0x00000000);
4090
    /* XXX : not implemented */
4091
    spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
4092
                 SPR_NOACCESS, SPR_NOACCESS,
4093
                 &spr_read_generic, &spr_write_generic,
4094
                 0x00000000);
4095
    /* XXX : not implemented */
4096
    spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
4097
                 SPR_NOACCESS, SPR_NOACCESS,
4098
                 &spr_read_generic, &spr_write_generic,
4099
                 0x00000000);
4100
    /* XXX : not implemented */
4101
    spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
4102
                 SPR_NOACCESS, SPR_NOACCESS,
4103
                 &spr_read_generic, &spr_write_generic,
4104
                 0x00000000);
4105
    /* XXX : not implemented */
4106
    spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4107
                 SPR_NOACCESS, SPR_NOACCESS,
4108
                 &spr_read_generic, &spr_write_generic,
4109
                 0x00000000);
4110
    /* XXX : not implemented */
4111
    spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4112
                 SPR_NOACCESS, SPR_NOACCESS,
4113
                 &spr_read_generic, &spr_write_generic,
4114
                 0x00000000);
4115
    spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
4116
                 SPR_NOACCESS, SPR_NOACCESS,
4117
                 &spr_read_generic, &spr_write_generic,
4118
                 0x00000000);
4119
    spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
4120
                 SPR_NOACCESS, SPR_NOACCESS,
4121
                 &spr_read_generic, &spr_write_generic,
4122
                 0x00000000);
4123
#if !defined(CONFIG_USER_ONLY)
4124
    env->nb_tlb = 64;
4125
    env->nb_ways = 1;
4126
    env->id_tlbs = 0;
4127
#endif
4128
    init_excp_e200(env);
4129
    env->dcache_line_size = 32;
4130
    env->icache_line_size = 32;
4131
    /* XXX: TODO: allocate internal IRQ controller */
4132
}
4133

    
4134
/* e300 core                                                                 */
4135
#define POWERPC_INSNS_e300   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4136
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4137
                              PPC_FLOAT_STFIWX |                              \
4138
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4139
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4140
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4141
                              PPC_SEGMENT | PPC_EXTERN)
4142
#define POWERPC_MSRM_e300    (0x000000000007FFF3ULL)
4143
#define POWERPC_MMU_e300     (POWERPC_MMU_SOFT_6xx)
4144
#define POWERPC_EXCP_e300    (POWERPC_EXCP_603)
4145
#define POWERPC_INPUT_e300   (PPC_FLAGS_INPUT_6xx)
4146
#define POWERPC_BFDM_e300    (bfd_mach_ppc_603)
4147
#define POWERPC_FLAG_e300    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4148
                              POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4149
#define check_pow_e300       check_pow_hid0
4150

    
4151
__attribute__ (( unused ))
4152
static void init_proc_e300 (CPUPPCState *env)
4153
{
4154
    gen_spr_ne_601(env);
4155
    gen_spr_603(env);
4156
    /* Time base */
4157
    gen_tbl(env);
4158
    /* hardware implementation registers */
4159
    /* XXX : not implemented */
4160
    spr_register(env, SPR_HID0, "HID0",
4161
                 SPR_NOACCESS, SPR_NOACCESS,
4162
                 &spr_read_generic, &spr_write_generic,
4163
                 0x00000000);
4164
    /* XXX : not implemented */
4165
    spr_register(env, SPR_HID1, "HID1",
4166
                 SPR_NOACCESS, SPR_NOACCESS,
4167
                 &spr_read_generic, &spr_write_generic,
4168
                 0x00000000);
4169
    /* Memory management */
4170
    gen_low_BATs(env);
4171
    gen_6xx_7xx_soft_tlb(env, 64, 2);
4172
    init_excp_603(env);
4173
    env->dcache_line_size = 32;
4174
    env->icache_line_size = 32;
4175
    /* Allocate hardware IRQ controller */
4176
    ppc6xx_irq_init(env);
4177
}
4178

    
4179
/* e500v1 core                                                               */
4180
#define POWERPC_INSNS_e500v1   (PPC_INSNS_BASE | PPC_ISEL |             \
4181
                                PPC_SPE | PPC_SPE_SINGLE |              \
4182
                                PPC_WRTEE | PPC_RFDI |                  \
4183
                                PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | \
4184
                                PPC_CACHE_DCBZ | PPC_CACHE_DCBA |       \
4185
                                PPC_MEM_TLBSYNC | PPC_TLBIVAX |         \
4186
                                PPC_BOOKE)
4187
#define POWERPC_MSRM_e500v1    (0x000000000606FF30ULL)
4188
#define POWERPC_MMU_e500v1     (POWERPC_MMU_BOOKE_FSL)
4189
#define POWERPC_EXCP_e500v1    (POWERPC_EXCP_BOOKE)
4190
#define POWERPC_INPUT_e500v1   (PPC_FLAGS_INPUT_BookE)
4191
#define POWERPC_BFDM_e500v1    (bfd_mach_ppc_860)
4192
#define POWERPC_FLAG_e500v1    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |    \
4193
                                POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |   \
4194
                                POWERPC_FLAG_BUS_CLK)
4195
#define check_pow_e500v1       check_pow_hid0
4196
#define init_proc_e500v1       init_proc_e500
4197

    
4198
/* e500v2 core                                                               */
4199
#define POWERPC_INSNS_e500v2   (PPC_INSNS_BASE | PPC_ISEL |             \
4200
                                PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |   \
4201
                                PPC_WRTEE | PPC_RFDI |                  \
4202
                                PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | \
4203
                                PPC_CACHE_DCBZ | PPC_CACHE_DCBA |       \
4204
                                PPC_MEM_TLBSYNC | PPC_TLBIVAX |         \
4205
                                PPC_BOOKE)
4206
#define POWERPC_MSRM_e500v2    (0x000000000606FF30ULL)
4207
#define POWERPC_MMU_e500v2     (POWERPC_MMU_BOOKE_FSL)
4208
#define POWERPC_EXCP_e500v2    (POWERPC_EXCP_BOOKE)
4209
#define POWERPC_INPUT_e500v2   (PPC_FLAGS_INPUT_BookE)
4210
#define POWERPC_BFDM_e500v2    (bfd_mach_ppc_860)
4211
#define POWERPC_FLAG_e500v2    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |    \
4212
                                POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |   \
4213
                                POWERPC_FLAG_BUS_CLK)
4214
#define check_pow_e500v2       check_pow_hid0
4215
#define init_proc_e500v2       init_proc_e500
4216

    
4217
static void init_proc_e500 (CPUPPCState *env)
4218
{
4219
    /* Time base */
4220
    gen_tbl(env);
4221
    gen_spr_BookE(env, 0x0000000F0000FD7FULL);
4222
    /* Processor identification */
4223
    spr_register(env, SPR_BOOKE_PIR, "PIR",
4224
                 SPR_NOACCESS, SPR_NOACCESS,
4225
                 &spr_read_generic, &spr_write_pir,
4226
                 0x00000000);
4227
    /* XXX : not implemented */
4228
    spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4229
                 &spr_read_spefscr, &spr_write_spefscr,
4230
                 &spr_read_spefscr, &spr_write_spefscr,
4231
                 0x00000000);
4232
    /* Memory management */
4233
#if !defined(CONFIG_USER_ONLY)
4234
    env->nb_pids = 3;
4235
#endif
4236
    gen_spr_BookE_FSL(env, 0x0000005F);
4237
    /* XXX : not implemented */
4238
    spr_register(env, SPR_HID0, "HID0",
4239
                 SPR_NOACCESS, SPR_NOACCESS,
4240
                 &spr_read_generic, &spr_write_generic,
4241
                 0x00000000);
4242
    /* XXX : not implemented */
4243
    spr_register(env, SPR_HID1, "HID1",
4244
                 SPR_NOACCESS, SPR_NOACCESS,
4245
                 &spr_read_generic, &spr_write_generic,
4246
                 0x00000000);
4247
    /* XXX : not implemented */
4248
    spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
4249
                 SPR_NOACCESS, SPR_NOACCESS,
4250
                 &spr_read_generic, &spr_write_generic,
4251
                 0x00000000);
4252
    /* XXX : not implemented */
4253
    spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
4254
                 SPR_NOACCESS, SPR_NOACCESS,
4255
                 &spr_read_generic, &spr_write_generic,
4256
                 0x00000000);
4257
    /* XXX : not implemented */
4258
    spr_register(env, SPR_Exxx_MCAR, "MCAR",
4259
                 SPR_NOACCESS, SPR_NOACCESS,
4260
                 &spr_read_generic, &spr_write_generic,
4261
                 0x00000000);
4262
    /* XXX : not implemented */
4263
    spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4264
                 SPR_NOACCESS, SPR_NOACCESS,
4265
                 &spr_read_generic, &spr_write_generic,
4266
                 0x00000000);
4267
    /* XXX : not implemented */
4268
    spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
4269
                 SPR_NOACCESS, SPR_NOACCESS,
4270
                 &spr_read_generic, &spr_write_generic,
4271
                 0x00000000);
4272
    /* XXX : not implemented */
4273
    spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4274
                 SPR_NOACCESS, SPR_NOACCESS,
4275
                 &spr_read_generic, &spr_write_generic,
4276
                 0x00000000);
4277
    /* XXX : not implemented */
4278
    spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4279
                 SPR_NOACCESS, SPR_NOACCESS,
4280
                 &spr_read_generic, &spr_write_generic,
4281
                 0x00000000);
4282
    /* XXX : not implemented */
4283
    spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4284
                 SPR_NOACCESS, SPR_NOACCESS,
4285
                 &spr_read_generic, &spr_write_generic,
4286
                 0x00000000);
4287
    /* XXX : not implemented */
4288
    spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
4289
                 SPR_NOACCESS, SPR_NOACCESS,
4290
                 &spr_read_generic, &spr_write_generic,
4291
                 0x00000000);
4292
    /* XXX : not implemented */
4293
    spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
4294
                 SPR_NOACCESS, SPR_NOACCESS,
4295
                 &spr_read_generic, &spr_write_generic,
4296
                 0x00000000);
4297
    /* XXX : not implemented */
4298
    spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
4299
                 SPR_NOACCESS, SPR_NOACCESS,
4300
                 &spr_read_generic, &spr_write_generic,
4301
                 0x00000000);
4302
    spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4303
                 SPR_NOACCESS, SPR_NOACCESS,
4304
                 &spr_read_generic, &spr_write_generic,
4305
                 0x00000000);
4306
    spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4307
                 SPR_NOACCESS, SPR_NOACCESS,
4308
                 &spr_read_generic, &spr_write_generic,
4309
                 0x00000000);
4310
#if !defined(CONFIG_USER_ONLY)
4311
    env->nb_tlb = 64;
4312
    env->nb_ways = 1;
4313
    env->id_tlbs = 0;
4314
#endif
4315
    init_excp_e200(env);
4316
    env->dcache_line_size = 32;
4317
    env->icache_line_size = 32;
4318
    /* Allocate hardware IRQ controller */
4319
    ppce500_irq_init(env);
4320
}
4321

    
4322
/* Non-embedded PowerPC                                                      */
4323

    
4324
/* POWER : same as 601, without mfmsr, mfsr                                  */
4325
#if defined(TODO)
4326
#define POWERPC_INSNS_POWER  (XXX_TODO)
4327
/* POWER RSC (from RAD6000) */
4328
#define POWERPC_MSRM_POWER   (0x00000000FEF0ULL)
4329
#endif /* TODO */
4330

    
4331
/* PowerPC 601                                                               */
4332
#define POWERPC_INSNS_601    (PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |    \
4333
                              PPC_FLOAT |                                     \
4334
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4335
                              PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |  \
4336
                              PPC_SEGMENT | PPC_EXTERN)
4337
#define POWERPC_MSRM_601     (0x000000000000FD70ULL)
4338
#define POWERPC_MSRR_601     (0x0000000000001040ULL)
4339
//#define POWERPC_MMU_601      (POWERPC_MMU_601)
4340
//#define POWERPC_EXCP_601     (POWERPC_EXCP_601)
4341
#define POWERPC_INPUT_601    (PPC_FLAGS_INPUT_6xx)
4342
#define POWERPC_BFDM_601     (bfd_mach_ppc_601)
4343
#define POWERPC_FLAG_601     (POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK)
4344
#define check_pow_601        check_pow_none
4345

    
4346
static void init_proc_601 (CPUPPCState *env)
4347
{
4348
    gen_spr_ne_601(env);
4349
    gen_spr_601(env);
4350
    /* Hardware implementation registers */
4351
    /* XXX : not implemented */
4352
    spr_register(env, SPR_HID0, "HID0",
4353
                 SPR_NOACCESS, SPR_NOACCESS,
4354
                 &spr_read_generic, &spr_write_hid0_601,
4355
                 0x80010080);
4356
    /* XXX : not implemented */
4357
    spr_register(env, SPR_HID1, "HID1",
4358
                 SPR_NOACCESS, SPR_NOACCESS,
4359
                 &spr_read_generic, &spr_write_generic,
4360
                 0x00000000);
4361
    /* XXX : not implemented */
4362
    spr_register(env, SPR_601_HID2, "HID2",
4363
                 SPR_NOACCESS, SPR_NOACCESS,
4364
                 &spr_read_generic, &spr_write_generic,
4365
                 0x00000000);
4366
    /* XXX : not implemented */
4367
    spr_register(env, SPR_601_HID5, "HID5",
4368
                 SPR_NOACCESS, SPR_NOACCESS,
4369
                 &spr_read_generic, &spr_write_generic,
4370
                 0x00000000);
4371
    /* Memory management */
4372
    init_excp_601(env);
4373
    /* XXX: beware that dcache line size is 64 
4374
     *      but dcbz uses 32 bytes "sectors"
4375
     * XXX: this breaks clcs instruction !
4376
     */
4377
    env->dcache_line_size = 32;
4378
    env->icache_line_size = 64;
4379
    /* Allocate hardware IRQ controller */
4380
    ppc6xx_irq_init(env);
4381
}
4382

    
4383
/* PowerPC 601v                                                              */
4384
#define POWERPC_INSNS_601v   (PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |    \
4385
                              PPC_FLOAT |                                     \
4386
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4387
                              PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |  \
4388
                              PPC_SEGMENT | PPC_EXTERN)
4389
#define POWERPC_MSRM_601v    (0x000000000000FD70ULL)
4390
#define POWERPC_MSRR_601v    (0x0000000000001040ULL)
4391
#define POWERPC_MMU_601v     (POWERPC_MMU_601)
4392
#define POWERPC_EXCP_601v    (POWERPC_EXCP_601)
4393
#define POWERPC_INPUT_601v   (PPC_FLAGS_INPUT_6xx)
4394
#define POWERPC_BFDM_601v    (bfd_mach_ppc_601)
4395
#define POWERPC_FLAG_601v    (POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK)
4396
#define check_pow_601v       check_pow_none
4397

    
4398
static void init_proc_601v (CPUPPCState *env)
4399
{
4400
    init_proc_601(env);
4401
    /* XXX : not implemented */
4402
    spr_register(env, SPR_601_HID15, "HID15",
4403
                 SPR_NOACCESS, SPR_NOACCESS,
4404
                 &spr_read_generic, &spr_write_generic,
4405
                 0x00000000);
4406
}
4407

    
4408
/* PowerPC 602                                                               */
4409
#define POWERPC_INSNS_602    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4410
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4411
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4412
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4413
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4414
                              PPC_MEM_TLBIE | PPC_6xx_TLB | PPC_MEM_TLBSYNC | \
4415
                              PPC_SEGMENT | PPC_602_SPEC)
4416
#define POWERPC_MSRM_602     (0x0000000000C7FF73ULL)
4417
/* XXX: 602 MMU is quite specific. Should add a special case */
4418
#define POWERPC_MMU_602      (POWERPC_MMU_SOFT_6xx)
4419
//#define POWERPC_EXCP_602     (POWERPC_EXCP_602)
4420
#define POWERPC_INPUT_602    (PPC_FLAGS_INPUT_6xx)
4421
#define POWERPC_BFDM_602     (bfd_mach_ppc_602)
4422
#define POWERPC_FLAG_602     (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4423
                              POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4424
#define check_pow_602        check_pow_hid0
4425

    
4426
static void init_proc_602 (CPUPPCState *env)
4427
{
4428
    gen_spr_ne_601(env);
4429
    gen_spr_602(env);
4430
    /* Time base */
4431
    gen_tbl(env);
4432
    /* hardware implementation registers */
4433
    /* XXX : not implemented */
4434
    spr_register(env, SPR_HID0, "HID0",
4435
                 SPR_NOACCESS, SPR_NOACCESS,
4436
                 &spr_read_generic, &spr_write_generic,
4437
                 0x00000000);
4438
    /* XXX : not implemented */
4439
    spr_register(env, SPR_HID1, "HID1",
4440
                 SPR_NOACCESS, SPR_NOACCESS,
4441
                 &spr_read_generic, &spr_write_generic,
4442
                 0x00000000);
4443
    /* Memory management */
4444
    gen_low_BATs(env);
4445
    gen_6xx_7xx_soft_tlb(env, 64, 2);
4446
    init_excp_602(env);
4447
    env->dcache_line_size = 32;
4448
    env->icache_line_size = 32;
4449
    /* Allocate hardware IRQ controller */
4450
    ppc6xx_irq_init(env);
4451
}
4452

    
4453
/* PowerPC 603                                                               */
4454
#define POWERPC_INSNS_603    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4455
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4456
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4457
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4458
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4459
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4460
                              PPC_SEGMENT | PPC_EXTERN)
4461
#define POWERPC_MSRM_603     (0x000000000007FF73ULL)
4462
#define POWERPC_MMU_603      (POWERPC_MMU_SOFT_6xx)
4463
//#define POWERPC_EXCP_603     (POWERPC_EXCP_603)
4464
#define POWERPC_INPUT_603    (PPC_FLAGS_INPUT_6xx)
4465
#define POWERPC_BFDM_603     (bfd_mach_ppc_603)
4466
#define POWERPC_FLAG_603     (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4467
                              POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4468
#define check_pow_603        check_pow_hid0
4469

    
4470
static void init_proc_603 (CPUPPCState *env)
4471
{
4472
    gen_spr_ne_601(env);
4473
    gen_spr_603(env);
4474
    /* Time base */
4475
    gen_tbl(env);
4476
    /* hardware implementation registers */
4477
    /* XXX : not implemented */
4478
    spr_register(env, SPR_HID0, "HID0",
4479
                 SPR_NOACCESS, SPR_NOACCESS,
4480
                 &spr_read_generic, &spr_write_generic,
4481
                 0x00000000);
4482
    /* XXX : not implemented */
4483
    spr_register(env, SPR_HID1, "HID1",
4484
                 SPR_NOACCESS, SPR_NOACCESS,
4485
                 &spr_read_generic, &spr_write_generic,
4486
                 0x00000000);
4487
    /* Memory management */
4488
    gen_low_BATs(env);
4489
    gen_6xx_7xx_soft_tlb(env, 64, 2);
4490
    init_excp_603(env);
4491
    env->dcache_line_size = 32;
4492
    env->icache_line_size = 32;
4493
    /* Allocate hardware IRQ controller */
4494
    ppc6xx_irq_init(env);
4495
}
4496

    
4497
/* PowerPC 603e                                                              */
4498
#define POWERPC_INSNS_603E   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4499
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4500
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4501
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4502
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4503
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4504
                              PPC_SEGMENT | PPC_EXTERN)
4505
#define POWERPC_MSRM_603E    (0x000000000007FF73ULL)
4506
#define POWERPC_MMU_603E     (POWERPC_MMU_SOFT_6xx)
4507
//#define POWERPC_EXCP_603E    (POWERPC_EXCP_603E)
4508
#define POWERPC_INPUT_603E   (PPC_FLAGS_INPUT_6xx)
4509
#define POWERPC_BFDM_603E    (bfd_mach_ppc_ec603e)
4510
#define POWERPC_FLAG_603E    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4511
                              POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4512
#define check_pow_603E       check_pow_hid0
4513

    
4514
static void init_proc_603E (CPUPPCState *env)
4515
{
4516
    gen_spr_ne_601(env);
4517
    gen_spr_603(env);
4518
    /* Time base */
4519
    gen_tbl(env);
4520
    /* hardware implementation registers */
4521
    /* XXX : not implemented */
4522
    spr_register(env, SPR_HID0, "HID0",
4523
                 SPR_NOACCESS, SPR_NOACCESS,
4524
                 &spr_read_generic, &spr_write_generic,
4525
                 0x00000000);
4526
    /* XXX : not implemented */
4527
    spr_register(env, SPR_HID1, "HID1",
4528
                 SPR_NOACCESS, SPR_NOACCESS,
4529
                 &spr_read_generic, &spr_write_generic,
4530
                 0x00000000);
4531
    /* XXX : not implemented */
4532
    spr_register(env, SPR_IABR, "IABR",
4533
                 SPR_NOACCESS, SPR_NOACCESS,
4534
                 &spr_read_generic, &spr_write_generic,
4535
                 0x00000000);
4536
    /* Memory management */
4537
    gen_low_BATs(env);
4538
    gen_6xx_7xx_soft_tlb(env, 64, 2);
4539
    init_excp_603(env);
4540
    env->dcache_line_size = 32;
4541
    env->icache_line_size = 32;
4542
    /* Allocate hardware IRQ controller */
4543
    ppc6xx_irq_init(env);
4544
}
4545

    
4546
/* PowerPC 604                                                               */
4547
#define POWERPC_INSNS_604    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4548
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4549
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4550
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4551
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4552
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4553
                              PPC_SEGMENT | PPC_EXTERN)
4554
#define POWERPC_MSRM_604     (0x000000000005FF77ULL)
4555
#define POWERPC_MMU_604      (POWERPC_MMU_32B)
4556
//#define POWERPC_EXCP_604     (POWERPC_EXCP_604)
4557
#define POWERPC_INPUT_604    (PPC_FLAGS_INPUT_6xx)
4558
#define POWERPC_BFDM_604     (bfd_mach_ppc_604)
4559
#define POWERPC_FLAG_604     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4560
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4561
#define check_pow_604        check_pow_nocheck
4562

    
4563
static void init_proc_604 (CPUPPCState *env)
4564
{
4565
    gen_spr_ne_601(env);
4566
    gen_spr_604(env);
4567
    /* Time base */
4568
    gen_tbl(env);
4569
    /* Hardware implementation registers */
4570
    /* XXX : not implemented */
4571
    spr_register(env, SPR_HID0, "HID0",
4572
                 SPR_NOACCESS, SPR_NOACCESS,
4573
                 &spr_read_generic, &spr_write_generic,
4574
                 0x00000000);
4575
    /* Memory management */
4576
    gen_low_BATs(env);
4577
    init_excp_604(env);
4578
    env->dcache_line_size = 32;
4579
    env->icache_line_size = 32;
4580
    /* Allocate hardware IRQ controller */
4581
    ppc6xx_irq_init(env);
4582
}
4583

    
4584
/* PowerPC 604E                                                              */
4585
#define POWERPC_INSNS_604E   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4586
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4587
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4588
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4589
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4590
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4591
                              PPC_SEGMENT | PPC_EXTERN)
4592
#define POWERPC_MSRM_604E    (0x000000000005FF77ULL)
4593
#define POWERPC_MMU_604E     (POWERPC_MMU_32B)
4594
#define POWERPC_EXCP_604E    (POWERPC_EXCP_604)
4595
#define POWERPC_INPUT_604E   (PPC_FLAGS_INPUT_6xx)
4596
#define POWERPC_BFDM_604E    (bfd_mach_ppc_604)
4597
#define POWERPC_FLAG_604E    (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4598
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4599
#define check_pow_604E       check_pow_nocheck
4600

    
4601
static void init_proc_604E (CPUPPCState *env)
4602
{
4603
    gen_spr_ne_601(env);
4604
    gen_spr_604(env);
4605
    /* XXX : not implemented */
4606
    spr_register(env, SPR_MMCR1, "MMCR1",
4607
                 SPR_NOACCESS, SPR_NOACCESS,
4608
                 &spr_read_generic, &spr_write_generic,
4609
                 0x00000000);
4610
    /* XXX : not implemented */
4611
    spr_register(env, SPR_PMC3, "PMC3",
4612
                 SPR_NOACCESS, SPR_NOACCESS,
4613
                 &spr_read_generic, &spr_write_generic,
4614
                 0x00000000);
4615
    /* XXX : not implemented */
4616
    spr_register(env, SPR_PMC4, "PMC4",
4617
                 SPR_NOACCESS, SPR_NOACCESS,
4618
                 &spr_read_generic, &spr_write_generic,
4619
                 0x00000000);
4620
    /* Time base */
4621
    gen_tbl(env);
4622
    /* Hardware implementation registers */
4623
    /* XXX : not implemented */
4624
    spr_register(env, SPR_HID0, "HID0",
4625
                 SPR_NOACCESS, SPR_NOACCESS,
4626
                 &spr_read_generic, &spr_write_generic,
4627
                 0x00000000);
4628
    /* XXX : not implemented */
4629
    spr_register(env, SPR_HID1, "HID1",
4630
                 SPR_NOACCESS, SPR_NOACCESS,
4631
                 &spr_read_generic, &spr_write_generic,
4632
                 0x00000000);
4633
    /* Memory management */
4634
    gen_low_BATs(env);
4635
    init_excp_604(env);
4636
    env->dcache_line_size = 32;
4637
    env->icache_line_size = 32;
4638
    /* Allocate hardware IRQ controller */
4639
    ppc6xx_irq_init(env);
4640
}
4641

    
4642
/* PowerPC 740                                                               */
4643
#define POWERPC_INSNS_740    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4644
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4645
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4646
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4647
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4648
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4649
                              PPC_SEGMENT | PPC_EXTERN)
4650
#define POWERPC_MSRM_740     (0x000000000005FF77ULL)
4651
#define POWERPC_MMU_740      (POWERPC_MMU_32B)
4652
#define POWERPC_EXCP_740     (POWERPC_EXCP_7x0)
4653
#define POWERPC_INPUT_740    (PPC_FLAGS_INPUT_6xx)
4654
#define POWERPC_BFDM_740     (bfd_mach_ppc_750)
4655
#define POWERPC_FLAG_740     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4656
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4657
#define check_pow_740        check_pow_hid0
4658

    
4659
static void init_proc_740 (CPUPPCState *env)
4660
{
4661
    gen_spr_ne_601(env);
4662
    gen_spr_7xx(env);
4663
    /* Time base */
4664
    gen_tbl(env);
4665
    /* Thermal management */
4666
    gen_spr_thrm(env);
4667
    /* Hardware implementation registers */
4668
    /* XXX : not implemented */
4669
    spr_register(env, SPR_HID0, "HID0",
4670
                 SPR_NOACCESS, SPR_NOACCESS,
4671
                 &spr_read_generic, &spr_write_generic,
4672
                 0x00000000);
4673
    /* XXX : not implemented */
4674
    spr_register(env, SPR_HID1, "HID1",
4675
                 SPR_NOACCESS, SPR_NOACCESS,
4676
                 &spr_read_generic, &spr_write_generic,
4677
                 0x00000000);
4678
    /* Memory management */
4679
    gen_low_BATs(env);
4680
    init_excp_7x0(env);
4681
    env->dcache_line_size = 32;
4682
    env->icache_line_size = 32;
4683
    /* Allocate hardware IRQ controller */
4684
    ppc6xx_irq_init(env);
4685
}
4686

    
4687
/* PowerPC 750                                                               */
4688
#define POWERPC_INSNS_750    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4689
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4690
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4691
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4692
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4693
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4694
                              PPC_SEGMENT | PPC_EXTERN)
4695
#define POWERPC_MSRM_750     (0x000000000005FF77ULL)
4696
#define POWERPC_MMU_750      (POWERPC_MMU_32B)
4697
#define POWERPC_EXCP_750     (POWERPC_EXCP_7x0)
4698
#define POWERPC_INPUT_750    (PPC_FLAGS_INPUT_6xx)
4699
#define POWERPC_BFDM_750     (bfd_mach_ppc_750)
4700
#define POWERPC_FLAG_750     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4701
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4702
#define check_pow_750        check_pow_hid0
4703

    
4704
static void init_proc_750 (CPUPPCState *env)
4705
{
4706
    gen_spr_ne_601(env);
4707
    gen_spr_7xx(env);
4708
    /* XXX : not implemented */
4709
    spr_register(env, SPR_L2CR, "L2CR",
4710
                 SPR_NOACCESS, SPR_NOACCESS,
4711
                 &spr_read_generic, &spr_write_generic,
4712
                 0x00000000);
4713
    /* Time base */
4714
    gen_tbl(env);
4715
    /* Thermal management */
4716
    gen_spr_thrm(env);
4717
    /* Hardware implementation registers */
4718
    /* XXX : not implemented */
4719
    spr_register(env, SPR_HID0, "HID0",
4720
                 SPR_NOACCESS, SPR_NOACCESS,
4721
                 &spr_read_generic, &spr_write_generic,
4722
                 0x00000000);
4723
    /* XXX : not implemented */
4724
    spr_register(env, SPR_HID1, "HID1",
4725
                 SPR_NOACCESS, SPR_NOACCESS,
4726
                 &spr_read_generic, &spr_write_generic,
4727
                 0x00000000);
4728
    /* Memory management */
4729
    gen_low_BATs(env);
4730
    /* XXX: high BATs are also present but are known to be bugged on
4731
     *      die version 1.x
4732
     */
4733
    init_excp_7x0(env);
4734
    env->dcache_line_size = 32;
4735
    env->icache_line_size = 32;
4736
    /* Allocate hardware IRQ controller */
4737
    ppc6xx_irq_init(env);
4738
}
4739

    
4740
/* PowerPC 750 CL                                                            */
4741
/* XXX: not implemented:
4742
 * cache lock instructions:
4743
 * dcbz_l
4744
 * floating point paired instructions
4745
 * psq_lux
4746
 * psq_lx
4747
 * psq_stux
4748
 * psq_stx
4749
 * ps_abs
4750
 * ps_add
4751
 * ps_cmpo0
4752
 * ps_cmpo1
4753
 * ps_cmpu0
4754
 * ps_cmpu1
4755
 * ps_div
4756
 * ps_madd
4757
 * ps_madds0
4758
 * ps_madds1
4759
 * ps_merge00
4760
 * ps_merge01
4761
 * ps_merge10
4762
 * ps_merge11
4763
 * ps_mr
4764
 * ps_msub
4765
 * ps_mul
4766
 * ps_muls0
4767
 * ps_muls1
4768
 * ps_nabs
4769
 * ps_neg
4770
 * ps_nmadd
4771
 * ps_nmsub
4772
 * ps_res
4773
 * ps_rsqrte
4774
 * ps_sel
4775
 * ps_sub
4776
 * ps_sum0
4777
 * ps_sum1
4778
 */
4779
#define POWERPC_INSNS_750cl  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4780
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4781
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4782
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4783
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4784
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4785
                              PPC_SEGMENT | PPC_EXTERN)
4786
#define POWERPC_MSRM_750cl   (0x000000000005FF77ULL)
4787
#define POWERPC_MMU_750cl    (POWERPC_MMU_32B)
4788
#define POWERPC_EXCP_750cl   (POWERPC_EXCP_7x0)
4789
#define POWERPC_INPUT_750cl  (PPC_FLAGS_INPUT_6xx)
4790
#define POWERPC_BFDM_750cl   (bfd_mach_ppc_750)
4791
#define POWERPC_FLAG_750cl   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4792
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4793
#define check_pow_750cl      check_pow_hid0
4794

    
4795
static void init_proc_750cl (CPUPPCState *env)
4796
{
4797
    gen_spr_ne_601(env);
4798
    gen_spr_7xx(env);
4799
    /* XXX : not implemented */
4800
    spr_register(env, SPR_L2CR, "L2CR",
4801
                 SPR_NOACCESS, SPR_NOACCESS,
4802
                 &spr_read_generic, &spr_write_generic,
4803
                 0x00000000);
4804
    /* Time base */
4805
    gen_tbl(env);
4806
    /* Thermal management */
4807
    /* Those registers are fake on 750CL */
4808
    spr_register(env, SPR_THRM1, "THRM1",
4809
                 SPR_NOACCESS, SPR_NOACCESS,
4810
                 &spr_read_generic, &spr_write_generic,
4811
                 0x00000000);
4812
    spr_register(env, SPR_THRM2, "THRM2",
4813
                 SPR_NOACCESS, SPR_NOACCESS,
4814
                 &spr_read_generic, &spr_write_generic,
4815
                 0x00000000);
4816
    spr_register(env, SPR_THRM3, "THRM3",
4817
                 SPR_NOACCESS, SPR_NOACCESS,
4818
                 &spr_read_generic, &spr_write_generic,
4819
                 0x00000000);
4820
    /* XXX: not implemented */
4821
    spr_register(env, SPR_750_TDCL, "TDCL",
4822
                 SPR_NOACCESS, SPR_NOACCESS,
4823
                 &spr_read_generic, &spr_write_generic,
4824
                 0x00000000);
4825
    spr_register(env, SPR_750_TDCH, "TDCH",
4826
                 SPR_NOACCESS, SPR_NOACCESS,
4827
                 &spr_read_generic, &spr_write_generic,
4828
                 0x00000000);
4829
    /* DMA */
4830
    /* XXX : not implemented */
4831
    spr_register(env, SPR_750_WPAR, "WPAR",
4832
                 SPR_NOACCESS, SPR_NOACCESS,
4833
                 &spr_read_generic, &spr_write_generic,
4834
                 0x00000000);
4835
    spr_register(env, SPR_750_DMAL, "DMAL",
4836
                 SPR_NOACCESS, SPR_NOACCESS,
4837
                 &spr_read_generic, &spr_write_generic,
4838
                 0x00000000);
4839
    spr_register(env, SPR_750_DMAU, "DMAU",
4840
                 SPR_NOACCESS, SPR_NOACCESS,
4841
                 &spr_read_generic, &spr_write_generic,
4842
                 0x00000000);
4843
    /* Hardware implementation registers */
4844
    /* XXX : not implemented */
4845
    spr_register(env, SPR_HID0, "HID0",
4846
                 SPR_NOACCESS, SPR_NOACCESS,
4847
                 &spr_read_generic, &spr_write_generic,
4848
                 0x00000000);
4849
    /* XXX : not implemented */
4850
    spr_register(env, SPR_HID1, "HID1",
4851
                 SPR_NOACCESS, SPR_NOACCESS,
4852
                 &spr_read_generic, &spr_write_generic,
4853
                 0x00000000);
4854
    /* XXX : not implemented */
4855
    spr_register(env, SPR_750CL_HID2, "HID2",
4856
                 SPR_NOACCESS, SPR_NOACCESS,
4857
                 &spr_read_generic, &spr_write_generic,
4858
                 0x00000000);
4859
    /* XXX : not implemented */
4860
    spr_register(env, SPR_750CL_HID4, "HID4",
4861
                 SPR_NOACCESS, SPR_NOACCESS,
4862
                 &spr_read_generic, &spr_write_generic,
4863
                 0x00000000);
4864
    /* Quantization registers */
4865
    /* XXX : not implemented */
4866
    spr_register(env, SPR_750_GQR0, "GQR0",
4867
                 SPR_NOACCESS, SPR_NOACCESS,
4868
                 &spr_read_generic, &spr_write_generic,
4869
                 0x00000000);
4870
    /* XXX : not implemented */
4871
    spr_register(env, SPR_750_GQR1, "GQR1",
4872
                 SPR_NOACCESS, SPR_NOACCESS,
4873
                 &spr_read_generic, &spr_write_generic,
4874
                 0x00000000);
4875
    /* XXX : not implemented */
4876
    spr_register(env, SPR_750_GQR2, "GQR2",
4877
                 SPR_NOACCESS, SPR_NOACCESS,
4878
                 &spr_read_generic, &spr_write_generic,
4879
                 0x00000000);
4880
    /* XXX : not implemented */
4881
    spr_register(env, SPR_750_GQR3, "GQR3",
4882
                 SPR_NOACCESS, SPR_NOACCESS,
4883
                 &spr_read_generic, &spr_write_generic,
4884
                 0x00000000);
4885
    /* XXX : not implemented */
4886
    spr_register(env, SPR_750_GQR4, "GQR4",
4887
                 SPR_NOACCESS, SPR_NOACCESS,
4888
                 &spr_read_generic, &spr_write_generic,
4889
                 0x00000000);
4890
    /* XXX : not implemented */
4891
    spr_register(env, SPR_750_GQR5, "GQR5",
4892
                 SPR_NOACCESS, SPR_NOACCESS,
4893
                 &spr_read_generic, &spr_write_generic,
4894
                 0x00000000);
4895
    /* XXX : not implemented */
4896
    spr_register(env, SPR_750_GQR6, "GQR6",
4897
                 SPR_NOACCESS, SPR_NOACCESS,
4898
                 &spr_read_generic, &spr_write_generic,
4899
                 0x00000000);
4900
    /* XXX : not implemented */
4901
    spr_register(env, SPR_750_GQR7, "GQR7",
4902
                 SPR_NOACCESS, SPR_NOACCESS,
4903
                 &spr_read_generic, &spr_write_generic,
4904
                 0x00000000);
4905
    /* Memory management */
4906
    gen_low_BATs(env);
4907
    /* PowerPC 750cl has 8 DBATs and 8 IBATs */
4908
    gen_high_BATs(env);
4909
    init_excp_750cl(env);
4910
    env->dcache_line_size = 32;
4911
    env->icache_line_size = 32;
4912
    /* Allocate hardware IRQ controller */
4913
    ppc6xx_irq_init(env);
4914
}
4915

    
4916
/* PowerPC 750CX                                                             */
4917
#define POWERPC_INSNS_750cx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4918
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4919
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4920
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4921
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4922
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4923
                              PPC_SEGMENT | PPC_EXTERN)
4924
#define POWERPC_MSRM_750cx   (0x000000000005FF77ULL)
4925
#define POWERPC_MMU_750cx    (POWERPC_MMU_32B)
4926
#define POWERPC_EXCP_750cx   (POWERPC_EXCP_7x0)
4927
#define POWERPC_INPUT_750cx  (PPC_FLAGS_INPUT_6xx)
4928
#define POWERPC_BFDM_750cx   (bfd_mach_ppc_750)
4929
#define POWERPC_FLAG_750cx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4930
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4931
#define check_pow_750cx      check_pow_hid0
4932

    
4933
static void init_proc_750cx (CPUPPCState *env)
4934
{
4935
    gen_spr_ne_601(env);
4936
    gen_spr_7xx(env);
4937
    /* XXX : not implemented */
4938
    spr_register(env, SPR_L2CR, "L2CR",
4939
                 SPR_NOACCESS, SPR_NOACCESS,
4940
                 &spr_read_generic, &spr_write_generic,
4941
                 0x00000000);
4942
    /* Time base */
4943
    gen_tbl(env);
4944
    /* Thermal management */
4945
    gen_spr_thrm(env);
4946
    /* This register is not implemented but is present for compatibility */
4947
    spr_register(env, SPR_SDA, "SDA",
4948
                 SPR_NOACCESS, SPR_NOACCESS,
4949
                 &spr_read_generic, &spr_write_generic,
4950
                 0x00000000);
4951
    /* Hardware implementation registers */
4952
    /* XXX : not implemented */
4953
    spr_register(env, SPR_HID0, "HID0",
4954
                 SPR_NOACCESS, SPR_NOACCESS,
4955
                 &spr_read_generic, &spr_write_generic,
4956
                 0x00000000);
4957
    /* XXX : not implemented */
4958
    spr_register(env, SPR_HID1, "HID1",
4959
                 SPR_NOACCESS, SPR_NOACCESS,
4960
                 &spr_read_generic, &spr_write_generic,
4961
                 0x00000000);
4962
    /* Memory management */
4963
    gen_low_BATs(env);
4964
    /* PowerPC 750cx has 8 DBATs and 8 IBATs */
4965
    gen_high_BATs(env);
4966
    init_excp_750cx(env);
4967
    env->dcache_line_size = 32;
4968
    env->icache_line_size = 32;
4969
    /* Allocate hardware IRQ controller */
4970
    ppc6xx_irq_init(env);
4971
}
4972

    
4973
/* PowerPC 750FX                                                             */
4974
#define POWERPC_INSNS_750fx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4975
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4976
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4977
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4978
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4979
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4980
                              PPC_SEGMENT  | PPC_EXTERN)
4981
#define POWERPC_MSRM_750fx   (0x000000000005FF77ULL)
4982
#define POWERPC_MMU_750fx    (POWERPC_MMU_32B)
4983
#define POWERPC_EXCP_750fx   (POWERPC_EXCP_7x0)
4984
#define POWERPC_INPUT_750fx  (PPC_FLAGS_INPUT_6xx)
4985
#define POWERPC_BFDM_750fx   (bfd_mach_ppc_750)
4986
#define POWERPC_FLAG_750fx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4987
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4988
#define check_pow_750fx      check_pow_hid0
4989

    
4990
static void init_proc_750fx (CPUPPCState *env)
4991
{
4992
    gen_spr_ne_601(env);
4993
    gen_spr_7xx(env);
4994
    /* XXX : not implemented */
4995
    spr_register(env, SPR_L2CR, "L2CR",
4996
                 SPR_NOACCESS, SPR_NOACCESS,
4997
                 &spr_read_generic, &spr_write_generic,
4998
                 0x00000000);
4999
    /* Time base */
5000
    gen_tbl(env);
5001
    /* Thermal management */
5002
    gen_spr_thrm(env);
5003
    /* XXX : not implemented */
5004
    spr_register(env, SPR_750_THRM4, "THRM4",
5005
                 SPR_NOACCESS, SPR_NOACCESS,
5006
                 &spr_read_generic, &spr_write_generic,
5007
                 0x00000000);
5008
    /* Hardware implementation registers */
5009
    /* XXX : not implemented */
5010
    spr_register(env, SPR_HID0, "HID0",
5011
                 SPR_NOACCESS, SPR_NOACCESS,
5012
                 &spr_read_generic, &spr_write_generic,
5013
                 0x00000000);
5014
    /* XXX : not implemented */
5015
    spr_register(env, SPR_HID1, "HID1",
5016
                 SPR_NOACCESS, SPR_NOACCESS,
5017
                 &spr_read_generic, &spr_write_generic,
5018
                 0x00000000);
5019
    /* XXX : not implemented */
5020
    spr_register(env, SPR_750FX_HID2, "HID2",
5021
                 SPR_NOACCESS, SPR_NOACCESS,
5022
                 &spr_read_generic, &spr_write_generic,
5023
                 0x00000000);
5024
    /* Memory management */
5025
    gen_low_BATs(env);
5026
    /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5027
    gen_high_BATs(env);
5028
    init_excp_7x0(env);
5029
    env->dcache_line_size = 32;
5030
    env->icache_line_size = 32;
5031
    /* Allocate hardware IRQ controller */
5032
    ppc6xx_irq_init(env);
5033
}
5034

    
5035
/* PowerPC 750GX                                                             */
5036
#define POWERPC_INSNS_750gx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5037
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5038
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5039
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5040
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5041
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5042
                              PPC_SEGMENT  | PPC_EXTERN)
5043
#define POWERPC_MSRM_750gx   (0x000000000005FF77ULL)
5044
#define POWERPC_MMU_750gx    (POWERPC_MMU_32B)
5045
#define POWERPC_EXCP_750gx   (POWERPC_EXCP_7x0)
5046
#define POWERPC_INPUT_750gx  (PPC_FLAGS_INPUT_6xx)
5047
#define POWERPC_BFDM_750gx   (bfd_mach_ppc_750)
5048
#define POWERPC_FLAG_750gx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5049
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5050
#define check_pow_750gx      check_pow_hid0
5051

    
5052
static void init_proc_750gx (CPUPPCState *env)
5053
{
5054
    gen_spr_ne_601(env);
5055
    gen_spr_7xx(env);
5056
    /* XXX : not implemented (XXX: different from 750fx) */
5057
    spr_register(env, SPR_L2CR, "L2CR",
5058
                 SPR_NOACCESS, SPR_NOACCESS,
5059
                 &spr_read_generic, &spr_write_generic,
5060
                 0x00000000);
5061
    /* Time base */
5062
    gen_tbl(env);
5063
    /* Thermal management */
5064
    gen_spr_thrm(env);
5065
    /* XXX : not implemented */
5066
    spr_register(env, SPR_750_THRM4, "THRM4",
5067
                 SPR_NOACCESS, SPR_NOACCESS,
5068
                 &spr_read_generic, &spr_write_generic,
5069
                 0x00000000);
5070
    /* Hardware implementation registers */
5071
    /* XXX : not implemented (XXX: different from 750fx) */
5072
    spr_register(env, SPR_HID0, "HID0",
5073
                 SPR_NOACCESS, SPR_NOACCESS,
5074
                 &spr_read_generic, &spr_write_generic,
5075
                 0x00000000);
5076
    /* XXX : not implemented */
5077
    spr_register(env, SPR_HID1, "HID1",
5078
                 SPR_NOACCESS, SPR_NOACCESS,
5079
                 &spr_read_generic, &spr_write_generic,
5080
                 0x00000000);
5081
    /* XXX : not implemented (XXX: different from 750fx) */
5082
    spr_register(env, SPR_750FX_HID2, "HID2",
5083
                 SPR_NOACCESS, SPR_NOACCESS,
5084
                 &spr_read_generic, &spr_write_generic,
5085
                 0x00000000);
5086
    /* Memory management */
5087
    gen_low_BATs(env);
5088
    /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5089
    gen_high_BATs(env);
5090
    init_excp_7x0(env);
5091
    env->dcache_line_size = 32;
5092
    env->icache_line_size = 32;
5093
    /* Allocate hardware IRQ controller */
5094
    ppc6xx_irq_init(env);
5095
}
5096

    
5097
/* PowerPC 745                                                               */
5098
#define POWERPC_INSNS_745    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5099
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5100
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5101
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5102
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5103
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
5104
                              PPC_SEGMENT | PPC_EXTERN)
5105
#define POWERPC_MSRM_745     (0x000000000005FF77ULL)
5106
#define POWERPC_MMU_745      (POWERPC_MMU_SOFT_6xx)
5107
#define POWERPC_EXCP_745     (POWERPC_EXCP_7x5)
5108
#define POWERPC_INPUT_745    (PPC_FLAGS_INPUT_6xx)
5109
#define POWERPC_BFDM_745     (bfd_mach_ppc_750)
5110
#define POWERPC_FLAG_745     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5111
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5112
#define check_pow_745        check_pow_hid0
5113

    
5114
static void init_proc_745 (CPUPPCState *env)
5115
{
5116
    gen_spr_ne_601(env);
5117
    gen_spr_7xx(env);
5118
    gen_spr_G2_755(env);
5119
    /* Time base */
5120
    gen_tbl(env);
5121
    /* Thermal management */
5122
    gen_spr_thrm(env);
5123
    /* Hardware implementation registers */
5124
    /* XXX : not implemented */
5125
    spr_register(env, SPR_HID0, "HID0",
5126
                 SPR_NOACCESS, SPR_NOACCESS,
5127
                 &spr_read_generic, &spr_write_generic,
5128
                 0x00000000);
5129
    /* XXX : not implemented */
5130
    spr_register(env, SPR_HID1, "HID1",
5131
                 SPR_NOACCESS, SPR_NOACCESS,
5132
                 &spr_read_generic, &spr_write_generic,
5133
                 0x00000000);
5134
    /* XXX : not implemented */
5135
    spr_register(env, SPR_HID2, "HID2",
5136
                 SPR_NOACCESS, SPR_NOACCESS,
5137
                 &spr_read_generic, &spr_write_generic,
5138
                 0x00000000);
5139
    /* Memory management */
5140
    gen_low_BATs(env);
5141
    gen_high_BATs(env);
5142
    gen_6xx_7xx_soft_tlb(env, 64, 2);
5143
    init_excp_7x5(env);
5144
    env->dcache_line_size = 32;
5145
    env->icache_line_size = 32;
5146
    /* Allocate hardware IRQ controller */
5147
    ppc6xx_irq_init(env);
5148
}
5149

    
5150
/* PowerPC 755                                                               */
5151
#define POWERPC_INSNS_755    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5152
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5153
                              PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5154
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5155
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5156
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
5157
                              PPC_SEGMENT | PPC_EXTERN)
5158
#define POWERPC_MSRM_755     (0x000000000005FF77ULL)
5159
#define POWERPC_MMU_755      (POWERPC_MMU_SOFT_6xx)
5160
#define POWERPC_EXCP_755     (POWERPC_EXCP_7x5)
5161
#define POWERPC_INPUT_755    (PPC_FLAGS_INPUT_6xx)
5162
#define POWERPC_BFDM_755     (bfd_mach_ppc_750)
5163
#define POWERPC_FLAG_755     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5164
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5165
#define check_pow_755        check_pow_hid0
5166

    
5167
static void init_proc_755 (CPUPPCState *env)
5168
{
5169
    gen_spr_ne_601(env);
5170
    gen_spr_7xx(env);
5171
    gen_spr_G2_755(env);
5172
    /* Time base */
5173
    gen_tbl(env);
5174
    /* L2 cache control */
5175
    /* XXX : not implemented */
5176
    spr_register(env, SPR_L2CR, "L2CR",
5177
                 SPR_NOACCESS, SPR_NOACCESS,
5178
                 &spr_read_generic, &spr_write_generic,
5179
                 0x00000000);
5180
    /* XXX : not implemented */
5181
    spr_register(env, SPR_L2PMCR, "L2PMCR",
5182
                 SPR_NOACCESS, SPR_NOACCESS,
5183
                 &spr_read_generic, &spr_write_generic,
5184
                 0x00000000);
5185
    /* Thermal management */
5186
    gen_spr_thrm(env);
5187
    /* Hardware implementation registers */
5188
    /* XXX : not implemented */
5189
    spr_register(env, SPR_HID0, "HID0",
5190
                 SPR_NOACCESS, SPR_NOACCESS,
5191
                 &spr_read_generic, &spr_write_generic,
5192
                 0x00000000);
5193
    /* XXX : not implemented */
5194
    spr_register(env, SPR_HID1, "HID1",
5195
                 SPR_NOACCESS, SPR_NOACCESS,
5196
                 &spr_read_generic, &spr_write_generic,
5197
                 0x00000000);
5198
    /* XXX : not implemented */
5199
    spr_register(env, SPR_HID2, "HID2",
5200
                 SPR_NOACCESS, SPR_NOACCESS,
5201
                 &spr_read_generic, &spr_write_generic,
5202
                 0x00000000);
5203
    /* Memory management */
5204
    gen_low_BATs(env);
5205
    gen_high_BATs(env);
5206
    gen_6xx_7xx_soft_tlb(env, 64, 2);
5207
    init_excp_7x5(env);
5208
    env->dcache_line_size = 32;
5209
    env->icache_line_size = 32;
5210
    /* Allocate hardware IRQ controller */
5211
    ppc6xx_irq_init(env);
5212
}
5213

    
5214
/* PowerPC 7400 (aka G4)                                                     */
5215
#define POWERPC_INSNS_7400   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5216
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5217
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5218
                              PPC_FLOAT_STFIWX |                              \
5219
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
5220
                              PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5221
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5222
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5223
                              PPC_MEM_TLBIA |                                 \
5224
                              PPC_SEGMENT | PPC_EXTERN |                      \
5225
                              PPC_ALTIVEC)
5226
#define POWERPC_MSRM_7400    (0x000000000205FF77ULL)
5227
#define POWERPC_MMU_7400     (POWERPC_MMU_32B)
5228
#define POWERPC_EXCP_7400    (POWERPC_EXCP_74xx)
5229
#define POWERPC_INPUT_7400   (PPC_FLAGS_INPUT_6xx)
5230
#define POWERPC_BFDM_7400    (bfd_mach_ppc_7400)
5231
#define POWERPC_FLAG_7400    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5232
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5233
                              POWERPC_FLAG_BUS_CLK)
5234
#define check_pow_7400       check_pow_hid0_74xx
5235

    
5236
static void init_proc_7400 (CPUPPCState *env)
5237
{
5238
    gen_spr_ne_601(env);
5239
    gen_spr_7xx(env);
5240
    /* Time base */
5241
    gen_tbl(env);
5242
    /* 74xx specific SPR */
5243
    gen_spr_74xx(env);
5244
    /* XXX : not implemented */
5245
    spr_register(env, SPR_UBAMR, "UBAMR",
5246
                 &spr_read_ureg, SPR_NOACCESS,
5247
                 &spr_read_ureg, SPR_NOACCESS,
5248
                 0x00000000);
5249
    /* XXX: this seems not implemented on all revisions. */
5250
    /* XXX : not implemented */
5251
    spr_register(env, SPR_MSSCR1, "MSSCR1",
5252
                 SPR_NOACCESS, SPR_NOACCESS,
5253
                 &spr_read_generic, &spr_write_generic,
5254
                 0x00000000);
5255
    /* Thermal management */
5256
    gen_spr_thrm(env);
5257
    /* Memory management */
5258
    gen_low_BATs(env);
5259
    init_excp_7400(env);
5260
    env->dcache_line_size = 32;
5261
    env->icache_line_size = 32;
5262
    /* Allocate hardware IRQ controller */
5263
    ppc6xx_irq_init(env);
5264
}
5265

    
5266
/* PowerPC 7410 (aka G4)                                                     */
5267
#define POWERPC_INSNS_7410   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5268
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5269
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5270
                              PPC_FLOAT_STFIWX |                              \
5271
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
5272
                              PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5273
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5274
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5275
                              PPC_MEM_TLBIA |                                 \
5276
                              PPC_SEGMENT | PPC_EXTERN |                      \
5277
                              PPC_ALTIVEC)
5278
#define POWERPC_MSRM_7410    (0x000000000205FF77ULL)
5279
#define POWERPC_MMU_7410     (POWERPC_MMU_32B)
5280
#define POWERPC_EXCP_7410    (POWERPC_EXCP_74xx)
5281
#define POWERPC_INPUT_7410   (PPC_FLAGS_INPUT_6xx)
5282
#define POWERPC_BFDM_7410    (bfd_mach_ppc_7400)
5283
#define POWERPC_FLAG_7410    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5284
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5285
                              POWERPC_FLAG_BUS_CLK)
5286
#define check_pow_7410       check_pow_hid0_74xx
5287

    
5288
static void init_proc_7410 (CPUPPCState *env)
5289
{
5290
    gen_spr_ne_601(env);
5291
    gen_spr_7xx(env);
5292
    /* Time base */
5293
    gen_tbl(env);
5294
    /* 74xx specific SPR */
5295
    gen_spr_74xx(env);
5296
    /* XXX : not implemented */
5297
    spr_register(env, SPR_UBAMR, "UBAMR",
5298
                 &spr_read_ureg, SPR_NOACCESS,
5299
                 &spr_read_ureg, SPR_NOACCESS,
5300
                 0x00000000);
5301
    /* Thermal management */
5302
    gen_spr_thrm(env);
5303
    /* L2PMCR */
5304
    /* XXX : not implemented */
5305
    spr_register(env, SPR_L2PMCR, "L2PMCR",
5306
                 SPR_NOACCESS, SPR_NOACCESS,
5307
                 &spr_read_generic, &spr_write_generic,
5308
                 0x00000000);
5309
    /* LDSTDB */
5310
    /* XXX : not implemented */
5311
    spr_register(env, SPR_LDSTDB, "LDSTDB",
5312
                 SPR_NOACCESS, SPR_NOACCESS,
5313
                 &spr_read_generic, &spr_write_generic,
5314
                 0x00000000);
5315
    /* Memory management */
5316
    gen_low_BATs(env);
5317
    init_excp_7400(env);
5318
    env->dcache_line_size = 32;
5319
    env->icache_line_size = 32;
5320
    /* Allocate hardware IRQ controller */
5321
    ppc6xx_irq_init(env);
5322
}
5323

    
5324
/* PowerPC 7440 (aka G4)                                                     */
5325
#define POWERPC_INSNS_7440   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5326
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5327
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5328
                              PPC_FLOAT_STFIWX |                              \
5329
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
5330
                              PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5331
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5332
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5333
                              PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5334
                              PPC_SEGMENT | PPC_EXTERN |                      \
5335
                              PPC_ALTIVEC)
5336
#define POWERPC_MSRM_7440    (0x000000000205FF77ULL)
5337
#define POWERPC_MMU_7440     (POWERPC_MMU_SOFT_74xx)
5338
#define POWERPC_EXCP_7440    (POWERPC_EXCP_74xx)
5339
#define POWERPC_INPUT_7440   (PPC_FLAGS_INPUT_6xx)
5340
#define POWERPC_BFDM_7440    (bfd_mach_ppc_7400)
5341
#define POWERPC_FLAG_7440    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5342
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5343
                              POWERPC_FLAG_BUS_CLK)
5344
#define check_pow_7440       check_pow_hid0_74xx
5345

    
5346
__attribute__ (( unused ))
5347
static void init_proc_7440 (CPUPPCState *env)
5348
{
5349
    gen_spr_ne_601(env);
5350
    gen_spr_7xx(env);
5351
    /* Time base */
5352
    gen_tbl(env);
5353
    /* 74xx specific SPR */
5354
    gen_spr_74xx(env);
5355
    /* XXX : not implemented */
5356
    spr_register(env, SPR_UBAMR, "UBAMR",
5357
                 &spr_read_ureg, SPR_NOACCESS,
5358
                 &spr_read_ureg, SPR_NOACCESS,
5359
                 0x00000000);
5360
    /* LDSTCR */
5361
    /* XXX : not implemented */
5362
    spr_register(env, SPR_LDSTCR, "LDSTCR",
5363
                 SPR_NOACCESS, SPR_NOACCESS,
5364
                 &spr_read_generic, &spr_write_generic,
5365
                 0x00000000);
5366
    /* ICTRL */
5367
    /* XXX : not implemented */
5368
    spr_register(env, SPR_ICTRL, "ICTRL",
5369
                 SPR_NOACCESS, SPR_NOACCESS,
5370
                 &spr_read_generic, &spr_write_generic,
5371
                 0x00000000);
5372
    /* MSSSR0 */
5373
    /* XXX : not implemented */
5374
    spr_register(env, SPR_MSSSR0, "MSSSR0",
5375
                 SPR_NOACCESS, SPR_NOACCESS,
5376
                 &spr_read_generic, &spr_write_generic,
5377
                 0x00000000);
5378
    /* PMC */
5379
    /* XXX : not implemented */
5380
    spr_register(env, SPR_PMC5, "PMC5",
5381
                 SPR_NOACCESS, SPR_NOACCESS,
5382
                 &spr_read_generic, &spr_write_generic,
5383
                 0x00000000);
5384
    /* XXX : not implemented */
5385
    spr_register(env, SPR_UPMC5, "UPMC5",
5386
                 &spr_read_ureg, SPR_NOACCESS,
5387
                 &spr_read_ureg, SPR_NOACCESS,
5388
                 0x00000000);
5389
    /* XXX : not implemented */
5390
    spr_register(env, SPR_PMC6, "PMC6",
5391
                 SPR_NOACCESS, SPR_NOACCESS,
5392
                 &spr_read_generic, &spr_write_generic,
5393
                 0x00000000);
5394
    /* XXX : not implemented */
5395
    spr_register(env, SPR_UPMC6, "UPMC6",
5396
                 &spr_read_ureg, SPR_NOACCESS,
5397
                 &spr_read_ureg, SPR_NOACCESS,
5398
                 0x00000000);
5399
    /* Memory management */
5400
    gen_low_BATs(env);
5401
    gen_74xx_soft_tlb(env, 128, 2);
5402
    init_excp_7450(env);
5403
    env->dcache_line_size = 32;
5404
    env->icache_line_size = 32;
5405
    /* Allocate hardware IRQ controller */
5406
    ppc6xx_irq_init(env);
5407
}
5408

    
5409
/* PowerPC 7450 (aka G4)                                                     */
5410
#define POWERPC_INSNS_7450   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5411
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5412
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5413
                              PPC_FLOAT_STFIWX |                              \
5414
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
5415
                              PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5416
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5417
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5418
                              PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5419
                              PPC_SEGMENT | PPC_EXTERN |                      \
5420
                              PPC_ALTIVEC)
5421
#define POWERPC_MSRM_7450    (0x000000000205FF77ULL)
5422
#define POWERPC_MMU_7450     (POWERPC_MMU_SOFT_74xx)
5423
#define POWERPC_EXCP_7450    (POWERPC_EXCP_74xx)
5424
#define POWERPC_INPUT_7450   (PPC_FLAGS_INPUT_6xx)
5425
#define POWERPC_BFDM_7450    (bfd_mach_ppc_7400)
5426
#define POWERPC_FLAG_7450    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5427
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5428
                              POWERPC_FLAG_BUS_CLK)
5429
#define check_pow_7450       check_pow_hid0_74xx
5430

    
5431
__attribute__ (( unused ))
5432
static void init_proc_7450 (CPUPPCState *env)
5433
{
5434
    gen_spr_ne_601(env);
5435
    gen_spr_7xx(env);
5436
    /* Time base */
5437
    gen_tbl(env);
5438
    /* 74xx specific SPR */
5439
    gen_spr_74xx(env);
5440
    /* Level 3 cache control */
5441
    gen_l3_ctrl(env);
5442
    /* L3ITCR1 */
5443
    /* XXX : not implemented */
5444
    spr_register(env, SPR_L3ITCR1, "L3ITCR1",
5445
                 SPR_NOACCESS, SPR_NOACCESS,
5446
                 &spr_read_generic, &spr_write_generic,
5447
                 0x00000000);
5448
    /* L3ITCR2 */
5449
    /* XXX : not implemented */
5450
    spr_register(env, SPR_L3ITCR2, "L3ITCR2",
5451
                 SPR_NOACCESS, SPR_NOACCESS,
5452
                 &spr_read_generic, &spr_write_generic,
5453
                 0x00000000);
5454
    /* L3ITCR3 */
5455
    /* XXX : not implemented */
5456
    spr_register(env, SPR_L3ITCR3, "L3ITCR3",
5457
                 SPR_NOACCESS, SPR_NOACCESS,
5458
                 &spr_read_generic, &spr_write_generic,
5459
                 0x00000000);
5460
    /* L3OHCR */
5461
    /* XXX : not implemented */
5462
    spr_register(env, SPR_L3OHCR, "L3OHCR",
5463
                 SPR_NOACCESS, SPR_NOACCESS,
5464
                 &spr_read_generic, &spr_write_generic,
5465
                 0x00000000);
5466
    /* XXX : not implemented */
5467
    spr_register(env, SPR_UBAMR, "UBAMR",
5468
                 &spr_read_ureg, SPR_NOACCESS,
5469
                 &spr_read_ureg, SPR_NOACCESS,
5470
                 0x00000000);
5471
    /* LDSTCR */
5472
    /* XXX : not implemented */
5473
    spr_register(env, SPR_LDSTCR, "LDSTCR",
5474
                 SPR_NOACCESS, SPR_NOACCESS,
5475
                 &spr_read_generic, &spr_write_generic,
5476
                 0x00000000);
5477
    /* ICTRL */
5478
    /* XXX : not implemented */
5479
    spr_register(env, SPR_ICTRL, "ICTRL",
5480
                 SPR_NOACCESS, SPR_NOACCESS,
5481
                 &spr_read_generic, &spr_write_generic,
5482
                 0x00000000);
5483
    /* MSSSR0 */
5484
    /* XXX : not implemented */
5485
    spr_register(env, SPR_MSSSR0, "MSSSR0",
5486
                 SPR_NOACCESS, SPR_NOACCESS,
5487
                 &spr_read_generic, &spr_write_generic,
5488
                 0x00000000);
5489
    /* PMC */
5490
    /* XXX : not implemented */
5491
    spr_register(env, SPR_PMC5, "PMC5",
5492
                 SPR_NOACCESS, SPR_NOACCESS,
5493
                 &spr_read_generic, &spr_write_generic,
5494
                 0x00000000);
5495
    /* XXX : not implemented */
5496
    spr_register(env, SPR_UPMC5, "UPMC5",
5497
                 &spr_read_ureg, SPR_NOACCESS,
5498
                 &spr_read_ureg, SPR_NOACCESS,
5499
                 0x00000000);
5500
    /* XXX : not implemented */
5501
    spr_register(env, SPR_PMC6, "PMC6",
5502
                 SPR_NOACCESS, SPR_NOACCESS,
5503
                 &spr_read_generic, &spr_write_generic,
5504
                 0x00000000);
5505
    /* XXX : not implemented */
5506
    spr_register(env, SPR_UPMC6, "UPMC6",
5507
                 &spr_read_ureg, SPR_NOACCESS,
5508
                 &spr_read_ureg, SPR_NOACCESS,
5509
                 0x00000000);
5510
    /* Memory management */
5511
    gen_low_BATs(env);
5512
    gen_74xx_soft_tlb(env, 128, 2);
5513
    init_excp_7450(env);
5514
    env->dcache_line_size = 32;
5515
    env->icache_line_size = 32;
5516
    /* Allocate hardware IRQ controller */
5517
    ppc6xx_irq_init(env);
5518
}
5519

    
5520
/* PowerPC 7445 (aka G4)                                                     */
5521
#define POWERPC_INSNS_7445   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5522
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5523
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5524
                              PPC_FLOAT_STFIWX |                              \
5525
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
5526
                              PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5527
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5528
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5529
                              PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5530
                              PPC_SEGMENT | PPC_EXTERN |                      \
5531
                              PPC_ALTIVEC)
5532
#define POWERPC_MSRM_7445    (0x000000000205FF77ULL)
5533
#define POWERPC_MMU_7445     (POWERPC_MMU_SOFT_74xx)
5534
#define POWERPC_EXCP_7445    (POWERPC_EXCP_74xx)
5535
#define POWERPC_INPUT_7445   (PPC_FLAGS_INPUT_6xx)
5536
#define POWERPC_BFDM_7445    (bfd_mach_ppc_7400)
5537
#define POWERPC_FLAG_7445    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5538
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5539
                              POWERPC_FLAG_BUS_CLK)
5540
#define check_pow_7445       check_pow_hid0_74xx
5541

    
5542
__attribute__ (( unused ))
5543
static void init_proc_7445 (CPUPPCState *env)
5544
{
5545
    gen_spr_ne_601(env);
5546
    gen_spr_7xx(env);
5547
    /* Time base */
5548
    gen_tbl(env);
5549
    /* 74xx specific SPR */
5550
    gen_spr_74xx(env);
5551
    /* LDSTCR */
5552
    /* XXX : not implemented */
5553
    spr_register(env, SPR_LDSTCR, "LDSTCR",
5554
                 SPR_NOACCESS, SPR_NOACCESS,
5555
                 &spr_read_generic, &spr_write_generic,
5556
                 0x00000000);
5557
    /* ICTRL */
5558
    /* XXX : not implemented */
5559
    spr_register(env, SPR_ICTRL, "ICTRL",
5560
                 SPR_NOACCESS, SPR_NOACCESS,
5561
                 &spr_read_generic, &spr_write_generic,
5562
                 0x00000000);
5563
    /* MSSSR0 */
5564
    /* XXX : not implemented */
5565
    spr_register(env, SPR_MSSSR0, "MSSSR0",
5566
                 SPR_NOACCESS, SPR_NOACCESS,
5567
                 &spr_read_generic, &spr_write_generic,
5568
                 0x00000000);
5569
    /* PMC */
5570
    /* XXX : not implemented */
5571
    spr_register(env, SPR_PMC5, "PMC5",
5572
                 SPR_NOACCESS, SPR_NOACCESS,
5573
                 &spr_read_generic, &spr_write_generic,
5574
                 0x00000000);
5575
    /* XXX : not implemented */
5576
    spr_register(env, SPR_UPMC5, "UPMC5",
5577
                 &spr_read_ureg, SPR_NOACCESS,
5578
                 &spr_read_ureg, SPR_NOACCESS,
5579
                 0x00000000);
5580
    /* XXX : not implemented */
5581
    spr_register(env, SPR_PMC6, "PMC6",
5582
                 SPR_NOACCESS, SPR_NOACCESS,
5583
                 &spr_read_generic, &spr_write_generic,
5584
                 0x00000000);
5585
    /* XXX : not implemented */
5586
    spr_register(env, SPR_UPMC6, "UPMC6",
5587
                 &spr_read_ureg, SPR_NOACCESS,
5588
                 &spr_read_ureg, SPR_NOACCESS,
5589
                 0x00000000);
5590
    /* SPRGs */
5591
    spr_register(env, SPR_SPRG4, "SPRG4",
5592
                 SPR_NOACCESS, SPR_NOACCESS,
5593
                 &spr_read_generic, &spr_write_generic,
5594
                 0x00000000);
5595
    spr_register(env, SPR_USPRG4, "USPRG4",
5596
                 &spr_read_ureg, SPR_NOACCESS,
5597
                 &spr_read_ureg, SPR_NOACCESS,
5598
                 0x00000000);
5599
    spr_register(env, SPR_SPRG5, "SPRG5",
5600
                 SPR_NOACCESS, SPR_NOACCESS,
5601
                 &spr_read_generic, &spr_write_generic,
5602
                 0x00000000);
5603
    spr_register(env, SPR_USPRG5, "USPRG5",
5604
                 &spr_read_ureg, SPR_NOACCESS,
5605
                 &spr_read_ureg, SPR_NOACCESS,
5606
                 0x00000000);
5607
    spr_register(env, SPR_SPRG6, "SPRG6",
5608
                 SPR_NOACCESS, SPR_NOACCESS,
5609
                 &spr_read_generic, &spr_write_generic,
5610
                 0x00000000);
5611
    spr_register(env, SPR_USPRG6, "USPRG6",
5612
                 &spr_read_ureg, SPR_NOACCESS,
5613
                 &spr_read_ureg, SPR_NOACCESS,
5614
                 0x00000000);
5615
    spr_register(env, SPR_SPRG7, "SPRG7",
5616
                 SPR_NOACCESS, SPR_NOACCESS,
5617
                 &spr_read_generic, &spr_write_generic,
5618
                 0x00000000);
5619
    spr_register(env, SPR_USPRG7, "USPRG7",
5620
                 &spr_read_ureg, SPR_NOACCESS,
5621
                 &spr_read_ureg, SPR_NOACCESS,
5622
                 0x00000000);
5623
    /* Memory management */
5624
    gen_low_BATs(env);
5625
    gen_high_BATs(env);
5626
    gen_74xx_soft_tlb(env, 128, 2);
5627
    init_excp_7450(env);
5628
    env->dcache_line_size = 32;
5629
    env->icache_line_size = 32;
5630
    /* Allocate hardware IRQ controller */
5631
    ppc6xx_irq_init(env);
5632
}
5633

    
5634
/* PowerPC 7455 (aka G4)                                                     */
5635
#define POWERPC_INSNS_7455   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5636
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5637
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5638
                              PPC_FLOAT_STFIWX |                              \
5639
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
5640
                              PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5641
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5642
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5643
                              PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5644
                              PPC_SEGMENT | PPC_EXTERN |                      \
5645
                              PPC_ALTIVEC)
5646
#define POWERPC_MSRM_7455    (0x000000000205FF77ULL)
5647
#define POWERPC_MMU_7455     (POWERPC_MMU_SOFT_74xx)
5648
#define POWERPC_EXCP_7455    (POWERPC_EXCP_74xx)
5649
#define POWERPC_INPUT_7455   (PPC_FLAGS_INPUT_6xx)
5650
#define POWERPC_BFDM_7455    (bfd_mach_ppc_7400)
5651
#define POWERPC_FLAG_7455    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5652
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5653
                              POWERPC_FLAG_BUS_CLK)
5654
#define check_pow_7455       check_pow_hid0_74xx
5655

    
5656
__attribute__ (( unused ))
5657
static void init_proc_7455 (CPUPPCState *env)
5658
{
5659
    gen_spr_ne_601(env);
5660
    gen_spr_7xx(env);
5661
    /* Time base */
5662
    gen_tbl(env);
5663
    /* 74xx specific SPR */
5664
    gen_spr_74xx(env);
5665
    /* Level 3 cache control */
5666
    gen_l3_ctrl(env);
5667
    /* LDSTCR */
5668
    /* XXX : not implemented */
5669
    spr_register(env, SPR_LDSTCR, "LDSTCR",
5670
                 SPR_NOACCESS, SPR_NOACCESS,
5671
                 &spr_read_generic, &spr_write_generic,
5672
                 0x00000000);
5673
    /* ICTRL */
5674
    /* XXX : not implemented */
5675
    spr_register(env, SPR_ICTRL, "ICTRL",
5676
                 SPR_NOACCESS, SPR_NOACCESS,
5677
                 &spr_read_generic, &spr_write_generic,
5678
                 0x00000000);
5679
    /* MSSSR0 */
5680
    /* XXX : not implemented */
5681
    spr_register(env, SPR_MSSSR0, "MSSSR0",
5682
                 SPR_NOACCESS, SPR_NOACCESS,
5683
                 &spr_read_generic, &spr_write_generic,
5684
                 0x00000000);
5685
    /* PMC */
5686
    /* XXX : not implemented */
5687
    spr_register(env, SPR_PMC5, "PMC5",
5688
                 SPR_NOACCESS, SPR_NOACCESS,
5689
                 &spr_read_generic, &spr_write_generic,
5690
                 0x00000000);
5691
    /* XXX : not implemented */
5692
    spr_register(env, SPR_UPMC5, "UPMC5",
5693
                 &spr_read_ureg, SPR_NOACCESS,
5694
                 &spr_read_ureg, SPR_NOACCESS,
5695
                 0x00000000);
5696
    /* XXX : not implemented */
5697
    spr_register(env, SPR_PMC6, "PMC6",
5698
                 SPR_NOACCESS, SPR_NOACCESS,
5699
                 &spr_read_generic, &spr_write_generic,
5700
                 0x00000000);
5701
    /* XXX : not implemented */
5702
    spr_register(env, SPR_UPMC6, "UPMC6",
5703
                 &spr_read_ureg, SPR_NOACCESS,
5704
                 &spr_read_ureg, SPR_NOACCESS,
5705
                 0x00000000);
5706
    /* SPRGs */
5707
    spr_register(env, SPR_SPRG4, "SPRG4",
5708
                 SPR_NOACCESS, SPR_NOACCESS,
5709
                 &spr_read_generic, &spr_write_generic,
5710
                 0x00000000);
5711
    spr_register(env, SPR_USPRG4, "USPRG4",
5712
                 &spr_read_ureg, SPR_NOACCESS,
5713
                 &spr_read_ureg, SPR_NOACCESS,
5714
                 0x00000000);
5715
    spr_register(env, SPR_SPRG5, "SPRG5",
5716
                 SPR_NOACCESS, SPR_NOACCESS,
5717
                 &spr_read_generic, &spr_write_generic,
5718
                 0x00000000);
5719
    spr_register(env, SPR_USPRG5, "USPRG5",
5720
                 &spr_read_ureg, SPR_NOACCESS,
5721
                 &spr_read_ureg, SPR_NOACCESS,
5722
                 0x00000000);
5723
    spr_register(env, SPR_SPRG6, "SPRG6",
5724
                 SPR_NOACCESS, SPR_NOACCESS,
5725
                 &spr_read_generic, &spr_write_generic,
5726
                 0x00000000);
5727
    spr_register(env, SPR_USPRG6, "USPRG6",
5728
                 &spr_read_ureg, SPR_NOACCESS,
5729
                 &spr_read_ureg, SPR_NOACCESS,
5730
                 0x00000000);
5731
    spr_register(env, SPR_SPRG7, "SPRG7",
5732
                 SPR_NOACCESS, SPR_NOACCESS,
5733
                 &spr_read_generic, &spr_write_generic,
5734
                 0x00000000);
5735
    spr_register(env, SPR_USPRG7, "USPRG7",
5736
                 &spr_read_ureg, SPR_NOACCESS,
5737
                 &spr_read_ureg, SPR_NOACCESS,
5738
                 0x00000000);
5739
    /* Memory management */
5740
    gen_low_BATs(env);
5741
    gen_high_BATs(env);
5742
    gen_74xx_soft_tlb(env, 128, 2);
5743
    init_excp_7450(env);
5744
    env->dcache_line_size = 32;
5745
    env->icache_line_size = 32;
5746
    /* Allocate hardware IRQ controller */
5747
    ppc6xx_irq_init(env);
5748
}
5749

    
5750
/* PowerPC 7457 (aka G4)                                                     */
5751
#define POWERPC_INSNS_7457   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5752
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5753
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5754
                              PPC_FLOAT_STFIWX |                              \
5755
                              PPC_CACHE | PPC_CACHE_ICBI |                    \
5756
                              PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5757
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5758
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5759
                              PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5760
                              PPC_SEGMENT | PPC_EXTERN |                      \
5761
                              PPC_ALTIVEC)
5762
#define POWERPC_MSRM_7457    (0x000000000205FF77ULL)
5763
#define POWERPC_MMU_7457     (POWERPC_MMU_SOFT_74xx)
5764
#define POWERPC_EXCP_7457    (POWERPC_EXCP_74xx)
5765
#define POWERPC_INPUT_7457   (PPC_FLAGS_INPUT_6xx)
5766
#define POWERPC_BFDM_7457    (bfd_mach_ppc_7400)
5767
#define POWERPC_FLAG_7457    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5768
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5769
                              POWERPC_FLAG_BUS_CLK)
5770
#define check_pow_7457       check_pow_hid0_74xx
5771

    
5772
__attribute__ (( unused ))
5773
static void init_proc_7457 (CPUPPCState *env)
5774
{
5775
    gen_spr_ne_601(env);
5776
    gen_spr_7xx(env);
5777
    /* Time base */
5778
    gen_tbl(env);
5779
    /* 74xx specific SPR */
5780
    gen_spr_74xx(env);
5781
    /* Level 3 cache control */
5782
    gen_l3_ctrl(env);
5783
    /* L3ITCR1 */
5784
    /* XXX : not implemented */
5785
    spr_register(env, SPR_L3ITCR1, "L3ITCR1",
5786
                 SPR_NOACCESS, SPR_NOACCESS,
5787
                 &spr_read_generic, &spr_write_generic,
5788
                 0x00000000);
5789
    /* L3ITCR2 */
5790
    /* XXX : not implemented */
5791
    spr_register(env, SPR_L3ITCR2, "L3ITCR2",
5792
                 SPR_NOACCESS, SPR_NOACCESS,
5793
                 &spr_read_generic, &spr_write_generic,
5794
                 0x00000000);
5795
    /* L3ITCR3 */
5796
    /* XXX : not implemented */
5797
    spr_register(env, SPR_L3ITCR3, "L3ITCR3",
5798
                 SPR_NOACCESS, SPR_NOACCESS,
5799
                 &spr_read_generic, &spr_write_generic,
5800
                 0x00000000);
5801
    /* L3OHCR */
5802
    /* XXX : not implemented */
5803
    spr_register(env, SPR_L3OHCR, "L3OHCR",
5804
                 SPR_NOACCESS, SPR_NOACCESS,
5805
                 &spr_read_generic, &spr_write_generic,
5806
                 0x00000000);
5807
    /* LDSTCR */
5808
    /* XXX : not implemented */
5809
    spr_register(env, SPR_LDSTCR, "LDSTCR",
5810
                 SPR_NOACCESS, SPR_NOACCESS,
5811
                 &spr_read_generic, &spr_write_generic,
5812
                 0x00000000);
5813
    /* ICTRL */
5814
    /* XXX : not implemented */
5815
    spr_register(env, SPR_ICTRL, "ICTRL",
5816
                 SPR_NOACCESS, SPR_NOACCESS,
5817
                 &spr_read_generic, &spr_write_generic,
5818
                 0x00000000);
5819
    /* MSSSR0 */
5820
    /* XXX : not implemented */
5821
    spr_register(env, SPR_MSSSR0, "MSSSR0",
5822
                 SPR_NOACCESS, SPR_NOACCESS,
5823
                 &spr_read_generic, &spr_write_generic,
5824
                 0x00000000);
5825
    /* PMC */
5826
    /* XXX : not implemented */
5827
    spr_register(env, SPR_PMC5, "PMC5",
5828
                 SPR_NOACCESS, SPR_NOACCESS,
5829
                 &spr_read_generic, &spr_write_generic,
5830
                 0x00000000);
5831
    /* XXX : not implemented */
5832
    spr_register(env, SPR_UPMC5, "UPMC5",
5833
                 &spr_read_ureg, SPR_NOACCESS,
5834
                 &spr_read_ureg, SPR_NOACCESS,
5835
                 0x00000000);
5836
    /* XXX : not implemented */
5837
    spr_register(env, SPR_PMC6, "PMC6",
5838
                 SPR_NOACCESS, SPR_NOACCESS,
5839
                 &spr_read_generic, &spr_write_generic,
5840
                 0x00000000);
5841
    /* XXX : not implemented */
5842
    spr_register(env, SPR_UPMC6, "UPMC6",
5843
                 &spr_read_ureg, SPR_NOACCESS,
5844
                 &spr_read_ureg, SPR_NOACCESS,
5845
                 0x00000000);
5846
    /* SPRGs */
5847
    spr_register(env, SPR_SPRG4, "SPRG4",
5848
                 SPR_NOACCESS, SPR_NOACCESS,
5849
                 &spr_read_generic, &spr_write_generic,
5850
                 0x00000000);
5851
    spr_register(env, SPR_USPRG4, "USPRG4",
5852
                 &spr_read_ureg, SPR_NOACCESS,
5853
                 &spr_read_ureg, SPR_NOACCESS,
5854
                 0x00000000);
5855
    spr_register(env, SPR_SPRG5, "SPRG5",
5856
                 SPR_NOACCESS, SPR_NOACCESS,
5857
                 &spr_read_generic, &spr_write_generic,
5858
                 0x00000000);
5859
    spr_register(env, SPR_USPRG5, "USPRG5",
5860
                 &spr_read_ureg, SPR_NOACCESS,
5861
                 &spr_read_ureg, SPR_NOACCESS,
5862
                 0x00000000);
5863
    spr_register(env, SPR_SPRG6, "SPRG6",
5864
                 SPR_NOACCESS, SPR_NOACCESS,
5865
                 &spr_read_generic, &spr_write_generic,
5866
                 0x00000000);
5867
    spr_register(env, SPR_USPRG6, "USPRG6",
5868
                 &spr_read_ureg, SPR_NOACCESS,
5869
                 &spr_read_ureg, SPR_NOACCESS,
5870
                 0x00000000);
5871
    spr_register(env, SPR_SPRG7, "SPRG7",
5872
                 SPR_NOACCESS, SPR_NOACCESS,
5873
                 &spr_read_generic, &spr_write_generic,
5874
                 0x00000000);
5875
    spr_register(env, SPR_USPRG7, "USPRG7",
5876
                 &spr_read_ureg, SPR_NOACCESS,
5877
                 &spr_read_ureg, SPR_NOACCESS,
5878
                 0x00000000);
5879
    /* Memory management */
5880
    gen_low_BATs(env);
5881
    gen_high_BATs(env);
5882
    gen_74xx_soft_tlb(env, 128, 2);
5883
    init_excp_7450(env);
5884
    env->dcache_line_size = 32;
5885
    env->icache_line_size = 32;
5886
    /* Allocate hardware IRQ controller */
5887
    ppc6xx_irq_init(env);
5888
}
5889

    
5890
#if defined (TARGET_PPC64)
5891
/* PowerPC 970                                                               */
5892
#define POWERPC_INSNS_970    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5893
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5894
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5895
                              PPC_FLOAT_STFIWX |                              \
5896
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
5897
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5898
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5899
                              PPC_64B | PPC_ALTIVEC |                         \
5900
                              PPC_SEGMENT_64B | PPC_SLBI)
5901
#define POWERPC_MSRM_970     (0x900000000204FF36ULL)
5902
#define POWERPC_MMU_970      (POWERPC_MMU_64B)
5903
//#define POWERPC_EXCP_970     (POWERPC_EXCP_970)
5904
#define POWERPC_INPUT_970    (PPC_FLAGS_INPUT_970)
5905
#define POWERPC_BFDM_970     (bfd_mach_ppc64)
5906
#define POWERPC_FLAG_970     (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5907
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5908
                              POWERPC_FLAG_BUS_CLK)
5909

    
5910
#if defined(CONFIG_USER_ONLY)
5911
#define POWERPC970_HID5_INIT 0x00000080
5912
#else
5913
#define POWERPC970_HID5_INIT 0x00000000
5914
#endif
5915

    
5916
static int check_pow_970 (CPUPPCState *env)
5917
{
5918
    if (env->spr[SPR_HID0] & 0x00600000)
5919
        return 1;
5920

    
5921
    return 0;
5922
}
5923

    
5924
static void init_proc_970 (CPUPPCState *env)
5925
{
5926
    gen_spr_ne_601(env);
5927
    gen_spr_7xx(env);
5928
    /* Time base */
5929
    gen_tbl(env);
5930
    /* Hardware implementation registers */
5931
    /* XXX : not implemented */
5932
    spr_register(env, SPR_HID0, "HID0",
5933
                 SPR_NOACCESS, SPR_NOACCESS,
5934
                 &spr_read_generic, &spr_write_clear,
5935
                 0x60000000);
5936
    /* XXX : not implemented */
5937
    spr_register(env, SPR_HID1, "HID1",
5938
                 SPR_NOACCESS, SPR_NOACCESS,
5939
                 &spr_read_generic, &spr_write_generic,
5940
                 0x00000000);
5941
    /* XXX : not implemented */
5942
    spr_register(env, SPR_750FX_HID2, "HID2",
5943
                 SPR_NOACCESS, SPR_NOACCESS,
5944
                 &spr_read_generic, &spr_write_generic,
5945
                 0x00000000);
5946
    /* XXX : not implemented */
5947
    spr_register(env, SPR_970_HID5, "HID5",
5948
                 SPR_NOACCESS, SPR_NOACCESS,
5949
                 &spr_read_generic, &spr_write_generic,
5950
                 POWERPC970_HID5_INIT);
5951
    /* XXX : not implemented */
5952
    spr_register(env, SPR_L2CR, "L2CR",
5953
                 SPR_NOACCESS, SPR_NOACCESS,
5954
                 &spr_read_generic, &spr_write_generic,
5955
                 0x00000000);
5956
    /* Memory management */
5957
    /* XXX: not correct */
5958
    gen_low_BATs(env);
5959
    /* XXX : not implemented */
5960
    spr_register(env, SPR_MMUCFG, "MMUCFG",
5961
                 SPR_NOACCESS, SPR_NOACCESS,
5962
                 &spr_read_generic, SPR_NOACCESS,
5963
                 0x00000000); /* TOFIX */
5964
    /* XXX : not implemented */
5965
    spr_register(env, SPR_MMUCSR0, "MMUCSR0",
5966
                 SPR_NOACCESS, SPR_NOACCESS,
5967
                 &spr_read_generic, &spr_write_generic,
5968
                 0x00000000); /* TOFIX */
5969
    spr_register(env, SPR_HIOR, "SPR_HIOR",
5970
                 SPR_NOACCESS, SPR_NOACCESS,
5971
                 &spr_read_hior, &spr_write_hior,
5972
                 0x00000000);
5973
#if !defined(CONFIG_USER_ONLY)
5974
    env->slb_nr = 32;
5975
#endif
5976
    init_excp_970(env);
5977
    env->dcache_line_size = 128;
5978
    env->icache_line_size = 128;
5979
    /* Allocate hardware IRQ controller */
5980
    ppc970_irq_init(env);
5981
    /* Can't find information on what this should be on reset.  This
5982
     * value is the one used by 74xx processors. */
5983
    vscr_init(env, 0x00010000);
5984
}
5985

    
5986
/* PowerPC 970FX (aka G5)                                                    */
5987
#define POWERPC_INSNS_970FX  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5988
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5989
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5990
                              PPC_FLOAT_STFIWX |                              \
5991
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
5992
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5993
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5994
                              PPC_64B | PPC_ALTIVEC |                         \
5995
                              PPC_SEGMENT_64B | PPC_SLBI)
5996
#define POWERPC_MSRM_970FX   (0x800000000204FF36ULL)
5997
#define POWERPC_MMU_970FX    (POWERPC_MMU_64B)
5998
#define POWERPC_EXCP_970FX   (POWERPC_EXCP_970)
5999
#define POWERPC_INPUT_970FX  (PPC_FLAGS_INPUT_970)
6000
#define POWERPC_BFDM_970FX   (bfd_mach_ppc64)
6001
#define POWERPC_FLAG_970FX   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6002
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6003
                              POWERPC_FLAG_BUS_CLK)
6004

    
6005
static int check_pow_970FX (CPUPPCState *env)
6006
{
6007
    if (env->spr[SPR_HID0] & 0x00600000)
6008
        return 1;
6009

    
6010
    return 0;
6011
}
6012

    
6013
static void init_proc_970FX (CPUPPCState *env)
6014
{
6015
    gen_spr_ne_601(env);
6016
    gen_spr_7xx(env);
6017
    /* Time base */
6018
    gen_tbl(env);
6019
    /* Hardware implementation registers */
6020
    /* XXX : not implemented */
6021
    spr_register(env, SPR_HID0, "HID0",
6022
                 SPR_NOACCESS, SPR_NOACCESS,
6023
                 &spr_read_generic, &spr_write_clear,
6024
                 0x60000000);
6025
    /* XXX : not implemented */
6026
    spr_register(env, SPR_HID1, "HID1",
6027
                 SPR_NOACCESS, SPR_NOACCESS,
6028
                 &spr_read_generic, &spr_write_generic,
6029
                 0x00000000);
6030
    /* XXX : not implemented */
6031
    spr_register(env, SPR_750FX_HID2, "HID2",
6032
                 SPR_NOACCESS, SPR_NOACCESS,
6033
                 &spr_read_generic, &spr_write_generic,
6034
                 0x00000000);
6035
    /* XXX : not implemented */
6036
    spr_register(env, SPR_970_HID5, "HID5",
6037
                 SPR_NOACCESS, SPR_NOACCESS,
6038
                 &spr_read_generic, &spr_write_generic,
6039
                 POWERPC970_HID5_INIT);
6040
    /* XXX : not implemented */
6041
    spr_register(env, SPR_L2CR, "L2CR",
6042
                 SPR_NOACCESS, SPR_NOACCESS,
6043
                 &spr_read_generic, &spr_write_generic,
6044
                 0x00000000);
6045
    /* Memory management */
6046
    /* XXX: not correct */
6047
    gen_low_BATs(env);
6048
    /* XXX : not implemented */
6049
    spr_register(env, SPR_MMUCFG, "MMUCFG",
6050
                 SPR_NOACCESS, SPR_NOACCESS,
6051
                 &spr_read_generic, SPR_NOACCESS,
6052
                 0x00000000); /* TOFIX */
6053
    /* XXX : not implemented */
6054
    spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6055
                 SPR_NOACCESS, SPR_NOACCESS,
6056
                 &spr_read_generic, &spr_write_generic,
6057
                 0x00000000); /* TOFIX */
6058
    spr_register(env, SPR_HIOR, "SPR_HIOR",
6059
                 SPR_NOACCESS, SPR_NOACCESS,
6060
                 &spr_read_hior, &spr_write_hior,
6061
                 0x00000000);
6062
    spr_register(env, SPR_CTRL, "SPR_CTRL",
6063
                 SPR_NOACCESS, SPR_NOACCESS,
6064
                 &spr_read_generic, &spr_write_generic,
6065
                 0x00000000);
6066
    spr_register(env, SPR_UCTRL, "SPR_UCTRL",
6067
                 SPR_NOACCESS, SPR_NOACCESS,
6068
                 &spr_read_generic, &spr_write_generic,
6069
                 0x00000000);
6070
    spr_register(env, SPR_VRSAVE, "SPR_VRSAVE",
6071
                 &spr_read_generic, &spr_write_generic,
6072
                 &spr_read_generic, &spr_write_generic,
6073
                 0x00000000);
6074
#if !defined(CONFIG_USER_ONLY)
6075
    env->slb_nr = 64;
6076
#endif
6077
    init_excp_970(env);
6078
    env->dcache_line_size = 128;
6079
    env->icache_line_size = 128;
6080
    /* Allocate hardware IRQ controller */
6081
    ppc970_irq_init(env);
6082
    /* Can't find information on what this should be on reset.  This
6083
     * value is the one used by 74xx processors. */
6084
    vscr_init(env, 0x00010000);
6085
}
6086

    
6087
/* PowerPC 970 GX                                                            */
6088
#define POWERPC_INSNS_970GX  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6089
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6090
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6091
                              PPC_FLOAT_STFIWX |                              \
6092
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
6093
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6094
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6095
                              PPC_64B | PPC_ALTIVEC |                         \
6096
                              PPC_SEGMENT_64B | PPC_SLBI)
6097
#define POWERPC_MSRM_970GX   (0x800000000204FF36ULL)
6098
#define POWERPC_MMU_970GX    (POWERPC_MMU_64B)
6099
#define POWERPC_EXCP_970GX   (POWERPC_EXCP_970)
6100
#define POWERPC_INPUT_970GX  (PPC_FLAGS_INPUT_970)
6101
#define POWERPC_BFDM_970GX   (bfd_mach_ppc64)
6102
#define POWERPC_FLAG_970GX   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6103
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6104
                              POWERPC_FLAG_BUS_CLK)
6105

    
6106
static int check_pow_970GX (CPUPPCState *env)
6107
{
6108
    if (env->spr[SPR_HID0] & 0x00600000)
6109
        return 1;
6110

    
6111
    return 0;
6112
}
6113

    
6114
static void init_proc_970GX (CPUPPCState *env)
6115
{
6116
    gen_spr_ne_601(env);
6117
    gen_spr_7xx(env);
6118
    /* Time base */
6119
    gen_tbl(env);
6120
    /* Hardware implementation registers */
6121
    /* XXX : not implemented */
6122
    spr_register(env, SPR_HID0, "HID0",
6123
                 SPR_NOACCESS, SPR_NOACCESS,
6124
                 &spr_read_generic, &spr_write_clear,
6125
                 0x60000000);
6126
    /* XXX : not implemented */
6127
    spr_register(env, SPR_HID1, "HID1",
6128
                 SPR_NOACCESS, SPR_NOACCESS,
6129
                 &spr_read_generic, &spr_write_generic,
6130
                 0x00000000);
6131
    /* XXX : not implemented */
6132
    spr_register(env, SPR_750FX_HID2, "HID2",
6133
                 SPR_NOACCESS, SPR_NOACCESS,
6134
                 &spr_read_generic, &spr_write_generic,
6135
                 0x00000000);
6136
    /* XXX : not implemented */
6137
    spr_register(env, SPR_970_HID5, "HID5",
6138
                 SPR_NOACCESS, SPR_NOACCESS,
6139
                 &spr_read_generic, &spr_write_generic,
6140
                 POWERPC970_HID5_INIT);
6141
    /* XXX : not implemented */
6142
    spr_register(env, SPR_L2CR, "L2CR",
6143
                 SPR_NOACCESS, SPR_NOACCESS,
6144
                 &spr_read_generic, &spr_write_generic,
6145
                 0x00000000);
6146
    /* Memory management */
6147
    /* XXX: not correct */
6148
    gen_low_BATs(env);
6149
    /* XXX : not implemented */
6150
    spr_register(env, SPR_MMUCFG, "MMUCFG",
6151
                 SPR_NOACCESS, SPR_NOACCESS,
6152
                 &spr_read_generic, SPR_NOACCESS,
6153
                 0x00000000); /* TOFIX */
6154
    /* XXX : not implemented */
6155
    spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6156
                 SPR_NOACCESS, SPR_NOACCESS,
6157
                 &spr_read_generic, &spr_write_generic,
6158
                 0x00000000); /* TOFIX */
6159
    spr_register(env, SPR_HIOR, "SPR_HIOR",
6160
                 SPR_NOACCESS, SPR_NOACCESS,
6161
                 &spr_read_hior, &spr_write_hior,
6162
                 0x00000000);
6163
#if !defined(CONFIG_USER_ONLY)
6164
    env->slb_nr = 32;
6165
#endif
6166
    init_excp_970(env);
6167
    env->dcache_line_size = 128;
6168
    env->icache_line_size = 128;
6169
    /* Allocate hardware IRQ controller */
6170
    ppc970_irq_init(env);
6171
    /* Can't find information on what this should be on reset.  This
6172
     * value is the one used by 74xx processors. */
6173
    vscr_init(env, 0x00010000);
6174
}
6175

    
6176
/* PowerPC 970 MP                                                            */
6177
#define POWERPC_INSNS_970MP  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6178
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6179
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6180
                              PPC_FLOAT_STFIWX |                              \
6181
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
6182
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6183
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6184
                              PPC_64B | PPC_ALTIVEC |                         \
6185
                              PPC_SEGMENT_64B | PPC_SLBI)
6186
#define POWERPC_MSRM_970MP   (0x900000000204FF36ULL)
6187
#define POWERPC_MMU_970MP    (POWERPC_MMU_64B)
6188
#define POWERPC_EXCP_970MP   (POWERPC_EXCP_970)
6189
#define POWERPC_INPUT_970MP  (PPC_FLAGS_INPUT_970)
6190
#define POWERPC_BFDM_970MP   (bfd_mach_ppc64)
6191
#define POWERPC_FLAG_970MP   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6192
                              POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6193
                              POWERPC_FLAG_BUS_CLK)
6194

    
6195
static int check_pow_970MP (CPUPPCState *env)
6196
{
6197
    if (env->spr[SPR_HID0] & 0x01C00000)
6198
        return 1;
6199

    
6200
    return 0;
6201
}
6202

    
6203
static void init_proc_970MP (CPUPPCState *env)
6204
{
6205
    gen_spr_ne_601(env);
6206
    gen_spr_7xx(env);
6207
    /* Time base */
6208
    gen_tbl(env);
6209
    /* Hardware implementation registers */
6210
    /* XXX : not implemented */
6211
    spr_register(env, SPR_HID0, "HID0",
6212
                 SPR_NOACCESS, SPR_NOACCESS,
6213
                 &spr_read_generic, &spr_write_clear,
6214
                 0x60000000);
6215
    /* XXX : not implemented */
6216
    spr_register(env, SPR_HID1, "HID1",
6217
                 SPR_NOACCESS, SPR_NOACCESS,
6218
                 &spr_read_generic, &spr_write_generic,
6219
                 0x00000000);
6220
    /* XXX : not implemented */
6221
    spr_register(env, SPR_750FX_HID2, "HID2",
6222
                 SPR_NOACCESS, SPR_NOACCESS,
6223
                 &spr_read_generic, &spr_write_generic,
6224
                 0x00000000);
6225
    /* XXX : not implemented */
6226
    spr_register(env, SPR_970_HID5, "HID5",
6227
                 SPR_NOACCESS, SPR_NOACCESS,
6228
                 &spr_read_generic, &spr_write_generic,
6229
                 POWERPC970_HID5_INIT);
6230
    /* XXX : not implemented */
6231
    spr_register(env, SPR_L2CR, "L2CR",
6232
                 SPR_NOACCESS, SPR_NOACCESS,
6233
                 &spr_read_generic, &spr_write_generic,
6234
                 0x00000000);
6235
    /* Memory management */
6236
    /* XXX: not correct */
6237
    gen_low_BATs(env);
6238
    /* XXX : not implemented */
6239
    spr_register(env, SPR_MMUCFG, "MMUCFG",
6240
                 SPR_NOACCESS, SPR_NOACCESS,
6241
                 &spr_read_generic, SPR_NOACCESS,
6242
                 0x00000000); /* TOFIX */
6243
    /* XXX : not implemented */
6244
    spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6245
                 SPR_NOACCESS, SPR_NOACCESS,
6246
                 &spr_read_generic, &spr_write_generic,
6247
                 0x00000000); /* TOFIX */
6248
    spr_register(env, SPR_HIOR, "SPR_HIOR",
6249
                 SPR_NOACCESS, SPR_NOACCESS,
6250
                 &spr_read_hior, &spr_write_hior,
6251
                 0x00000000);
6252
#if !defined(CONFIG_USER_ONLY)
6253
    env->slb_nr = 32;
6254
#endif
6255
    init_excp_970(env);
6256
    env->dcache_line_size = 128;
6257
    env->icache_line_size = 128;
6258
    /* Allocate hardware IRQ controller */
6259
    ppc970_irq_init(env);
6260
    /* Can't find information on what this should be on reset.  This
6261
     * value is the one used by 74xx processors. */
6262
    vscr_init(env, 0x00010000);
6263
}
6264

    
6265
/* PowerPC 620                                                               */
6266
#define POWERPC_INSNS_620    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6267
                              PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6268
                              PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6269
                              PPC_FLOAT_STFIWX |                              \
6270
                              PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
6271
                              PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6272
                              PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6273
                              PPC_SEGMENT | PPC_EXTERN |                      \
6274
                              PPC_64B | PPC_SLBI)
6275
#define POWERPC_MSRM_620     (0x800000000005FF77ULL)
6276
//#define POWERPC_MMU_620      (POWERPC_MMU_620)
6277
#define POWERPC_EXCP_620     (POWERPC_EXCP_970)
6278
#define POWERPC_INPUT_620    (PPC_FLAGS_INPUT_6xx)
6279
#define POWERPC_BFDM_620     (bfd_mach_ppc64)
6280
#define POWERPC_FLAG_620     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |            \
6281
                              POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
6282
#define check_pow_620        check_pow_nocheck /* Check this */
6283

    
6284
__attribute__ (( unused ))
6285
static void init_proc_620 (CPUPPCState *env)
6286
{
6287
    gen_spr_ne_601(env);
6288
    gen_spr_620(env);
6289
    /* Time base */
6290
    gen_tbl(env);
6291
    /* Hardware implementation registers */
6292
    /* XXX : not implemented */
6293
    spr_register(env, SPR_HID0, "HID0",
6294
                 SPR_NOACCESS, SPR_NOACCESS,
6295
                 &spr_read_generic, &spr_write_generic,
6296
                 0x00000000);
6297
    /* Memory management */
6298
    gen_low_BATs(env);
6299
    init_excp_620(env);
6300
    env->dcache_line_size = 64;
6301
    env->icache_line_size = 64;
6302
    /* Allocate hardware IRQ controller */
6303
    ppc6xx_irq_init(env);
6304
}
6305
#endif /* defined (TARGET_PPC64) */
6306

    
6307
/* Default 32 bits PowerPC target will be 604 */
6308
#define CPU_POWERPC_PPC32     CPU_POWERPC_604
6309
#define POWERPC_INSNS_PPC32   POWERPC_INSNS_604
6310
#define POWERPC_MSRM_PPC32    POWERPC_MSRM_604
6311
#define POWERPC_MMU_PPC32     POWERPC_MMU_604
6312
#define POWERPC_EXCP_PPC32    POWERPC_EXCP_604
6313
#define POWERPC_INPUT_PPC32   POWERPC_INPUT_604
6314
#define POWERPC_BFDM_PPC32    POWERPC_BFDM_604
6315
#define POWERPC_FLAG_PPC32    POWERPC_FLAG_604
6316
#define check_pow_PPC32       check_pow_604
6317
#define init_proc_PPC32       init_proc_604
6318

    
6319
/* Default 64 bits PowerPC target will be 970 FX */
6320
#define CPU_POWERPC_PPC64     CPU_POWERPC_970FX
6321
#define POWERPC_INSNS_PPC64   POWERPC_INSNS_970FX
6322
#define POWERPC_MSRM_PPC64    POWERPC_MSRM_970FX
6323
#define POWERPC_MMU_PPC64     POWERPC_MMU_970FX
6324
#define POWERPC_EXCP_PPC64    POWERPC_EXCP_970FX
6325
#define POWERPC_INPUT_PPC64   POWERPC_INPUT_970FX
6326
#define POWERPC_BFDM_PPC64    POWERPC_BFDM_970FX
6327
#define POWERPC_FLAG_PPC64    POWERPC_FLAG_970FX
6328
#define check_pow_PPC64       check_pow_970FX
6329
#define init_proc_PPC64       init_proc_970FX
6330

    
6331
/* Default PowerPC target will be PowerPC 32 */
6332
#if defined (TARGET_PPC64) && 0 // XXX: TODO
6333
#define CPU_POWERPC_DEFAULT   CPU_POWERPC_PPC64
6334
#define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC64
6335
#define POWERPC_MSRM_DEFAULT  POWERPC_MSRM_PPC64
6336
#define POWERPC_MMU_DEFAULT   POWERPC_MMU_PPC64
6337
#define POWERPC_EXCP_DEFAULT  POWERPC_EXCP_PPC64
6338
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC64
6339
#define POWERPC_BFDM_DEFAULT  POWERPC_BFDM_PPC64
6340
#define POWERPC_FLAG_DEFAULT  POWERPC_FLAG_PPC64
6341
#define check_pow_DEFAULT     check_pow_PPC64
6342
#define init_proc_DEFAULT     init_proc_PPC64
6343
#else
6344
#define CPU_POWERPC_DEFAULT   CPU_POWERPC_PPC32
6345
#define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC32
6346
#define POWERPC_MSRM_DEFAULT  POWERPC_MSRM_PPC32
6347
#define POWERPC_MMU_DEFAULT   POWERPC_MMU_PPC32
6348
#define POWERPC_EXCP_DEFAULT  POWERPC_EXCP_PPC32
6349
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC32
6350
#define POWERPC_BFDM_DEFAULT  POWERPC_BFDM_PPC32
6351
#define POWERPC_FLAG_DEFAULT  POWERPC_FLAG_PPC32
6352
#define check_pow_DEFAULT     check_pow_PPC32
6353
#define init_proc_DEFAULT     init_proc_PPC32
6354
#endif
6355

    
6356
/*****************************************************************************/
6357
/* PVR definitions for most known PowerPC                                    */
6358
enum {
6359
    /* PowerPC 401 family */
6360
    /* Generic PowerPC 401 */
6361
#define CPU_POWERPC_401              CPU_POWERPC_401G2
6362
    /* PowerPC 401 cores */
6363
    CPU_POWERPC_401A1              = 0x00210000,
6364
    CPU_POWERPC_401B2              = 0x00220000,
6365
#if 0
6366
    CPU_POWERPC_401B3              = xxx,
6367
#endif
6368
    CPU_POWERPC_401C2              = 0x00230000,
6369
    CPU_POWERPC_401D2              = 0x00240000,
6370
    CPU_POWERPC_401E2              = 0x00250000,
6371
    CPU_POWERPC_401F2              = 0x00260000,
6372
    CPU_POWERPC_401G2              = 0x00270000,
6373
    /* PowerPC 401 microcontrolers */
6374
#if 0
6375
    CPU_POWERPC_401GF              = xxx,
6376
#endif
6377
#define CPU_POWERPC_IOP480           CPU_POWERPC_401B2
6378
    /* IBM Processor for Network Resources */
6379
    CPU_POWERPC_COBRA              = 0x10100000, /* XXX: 405 ? */
6380
#if 0
6381
    CPU_POWERPC_XIPCHIP            = xxx,
6382
#endif
6383
    /* PowerPC 403 family */
6384
    /* Generic PowerPC 403 */
6385
#define CPU_POWERPC_403              CPU_POWERPC_403GC
6386
    /* PowerPC 403 microcontrollers */
6387
    CPU_POWERPC_403GA              = 0x00200011,
6388
    CPU_POWERPC_403GB              = 0x00200100,
6389
    CPU_POWERPC_403GC              = 0x00200200,
6390
    CPU_POWERPC_403GCX             = 0x00201400,
6391
#if 0
6392
    CPU_POWERPC_403GP              = xxx,
6393
#endif
6394
    /* PowerPC 405 family */
6395
    /* Generic PowerPC 405 */
6396
#define CPU_POWERPC_405              CPU_POWERPC_405D4
6397
    /* PowerPC 405 cores */
6398
#if 0
6399
    CPU_POWERPC_405A3              = xxx,
6400
#endif
6401
#if 0
6402
    CPU_POWERPC_405A4              = xxx,
6403
#endif
6404
#if 0
6405
    CPU_POWERPC_405B3              = xxx,
6406
#endif
6407
#if 0
6408
    CPU_POWERPC_405B4              = xxx,
6409
#endif
6410
#if 0
6411
    CPU_POWERPC_405C3              = xxx,
6412
#endif
6413
#if 0
6414
    CPU_POWERPC_405C4              = xxx,
6415
#endif
6416
    CPU_POWERPC_405D2              = 0x20010000,
6417
#if 0
6418
    CPU_POWERPC_405D3              = xxx,
6419
#endif
6420
    CPU_POWERPC_405D4              = 0x41810000,
6421
#if 0
6422
    CPU_POWERPC_405D5              = xxx,
6423
#endif
6424
#if 0
6425
    CPU_POWERPC_405E4              = xxx,
6426
#endif
6427
#if 0
6428
    CPU_POWERPC_405F4              = xxx,
6429
#endif
6430
#if 0
6431
    CPU_POWERPC_405F5              = xxx,
6432
#endif
6433
#if 0
6434
    CPU_POWERPC_405F6              = xxx,
6435
#endif
6436
    /* PowerPC 405 microcontrolers */
6437
    /* XXX: missing 0x200108a0 */
6438
#define CPU_POWERPC_405CR            CPU_POWERPC_405CRc
6439
    CPU_POWERPC_405CRa             = 0x40110041,
6440
    CPU_POWERPC_405CRb             = 0x401100C5,
6441
    CPU_POWERPC_405CRc             = 0x40110145,
6442
    CPU_POWERPC_405EP              = 0x51210950,
6443
#if 0
6444
    CPU_POWERPC_405EXr             = xxx,
6445
#endif
6446
    CPU_POWERPC_405EZ              = 0x41511460, /* 0x51210950 ? */
6447
#if 0
6448
    CPU_POWERPC_405FX              = xxx,
6449
#endif
6450
#define CPU_POWERPC_405GP            CPU_POWERPC_405GPd
6451
    CPU_POWERPC_405GPa             = 0x40110000,
6452
    CPU_POWERPC_405GPb             = 0x40110040,
6453
    CPU_POWERPC_405GPc             = 0x40110082,
6454
    CPU_POWERPC_405GPd             = 0x401100C4,
6455
#define CPU_POWERPC_405GPe           CPU_POWERPC_405CRc
6456
    CPU_POWERPC_405GPR             = 0x50910951,
6457
#if 0
6458
    CPU_POWERPC_405H               = xxx,
6459
#endif
6460
#if 0
6461
    CPU_POWERPC_405L               = xxx,
6462
#endif
6463
    CPU_POWERPC_405LP              = 0x41F10000,
6464
#if 0
6465
    CPU_POWERPC_405PM              = xxx,
6466
#endif
6467
#if 0
6468
    CPU_POWERPC_405PS              = xxx,
6469
#endif
6470
#if 0
6471
    CPU_POWERPC_405S               = xxx,
6472
#endif
6473
    /* IBM network processors */
6474
    CPU_POWERPC_NPE405H            = 0x414100C0,
6475
    CPU_POWERPC_NPE405H2           = 0x41410140,
6476
    CPU_POWERPC_NPE405L            = 0x416100C0,
6477
    CPU_POWERPC_NPE4GS3            = 0x40B10000,
6478
#if 0
6479
    CPU_POWERPC_NPCxx1             = xxx,
6480
#endif
6481
#if 0
6482
    CPU_POWERPC_NPR161             = xxx,
6483
#endif
6484
#if 0
6485
    CPU_POWERPC_LC77700            = xxx,
6486
#endif
6487
    /* IBM STBxxx (PowerPC 401/403/405 core based microcontrollers) */
6488
#if 0
6489
    CPU_POWERPC_STB01000           = xxx,
6490
#endif
6491
#if 0
6492
    CPU_POWERPC_STB01010           = xxx,
6493
#endif
6494
#if 0
6495
    CPU_POWERPC_STB0210            = xxx, /* 401B3 */
6496
#endif
6497
    CPU_POWERPC_STB03              = 0x40310000, /* 0x40130000 ? */
6498
#if 0
6499
    CPU_POWERPC_STB043             = xxx,
6500
#endif
6501
#if 0
6502
    CPU_POWERPC_STB045             = xxx,
6503
#endif
6504
    CPU_POWERPC_STB04              = 0x41810000,
6505
    CPU_POWERPC_STB25              = 0x51510950,
6506
#if 0
6507
    CPU_POWERPC_STB130             = xxx,
6508
#endif
6509
    /* Xilinx cores */
6510
    CPU_POWERPC_X2VP4              = 0x20010820,
6511
#define CPU_POWERPC_X2VP7            CPU_POWERPC_X2VP4
6512
    CPU_POWERPC_X2VP20             = 0x20010860,
6513
#define CPU_POWERPC_X2VP50           CPU_POWERPC_X2VP20
6514
#if 0
6515
    CPU_POWERPC_ZL10310            = xxx,
6516
#endif
6517
#if 0
6518
    CPU_POWERPC_ZL10311            = xxx,
6519
#endif
6520
#if 0
6521
    CPU_POWERPC_ZL10320            = xxx,
6522
#endif
6523
#if 0
6524
    CPU_POWERPC_ZL10321            = xxx,
6525
#endif
6526
    /* PowerPC 440 family */
6527
    /* Generic PowerPC 440 */
6528
#define CPU_POWERPC_440              CPU_POWERPC_440GXf
6529
    /* PowerPC 440 cores */
6530
#if 0
6531
    CPU_POWERPC_440A4              = xxx,
6532
#endif
6533
#if 0
6534
    CPU_POWERPC_440A5              = xxx,
6535
#endif
6536
#if 0
6537
    CPU_POWERPC_440B4              = xxx,
6538
#endif
6539
#if 0
6540
    CPU_POWERPC_440F5              = xxx,
6541
#endif
6542
#if 0
6543
    CPU_POWERPC_440G5              = xxx,
6544
#endif
6545
#if 0
6546
    CPU_POWERPC_440H4              = xxx,
6547
#endif
6548
#if 0
6549
    CPU_POWERPC_440H6              = xxx,
6550
#endif
6551
    /* PowerPC 440 microcontrolers */
6552
#define CPU_POWERPC_440EP            CPU_POWERPC_440EPb
6553
    CPU_POWERPC_440EPa             = 0x42221850,
6554
    CPU_POWERPC_440EPb             = 0x422218D3,
6555
#define CPU_POWERPC_440GP            CPU_POWERPC_440GPc
6556
    CPU_POWERPC_440GPb             = 0x40120440,
6557
    CPU_POWERPC_440GPc             = 0x40120481,
6558
#define CPU_POWERPC_440GR            CPU_POWERPC_440GRa
6559
#define CPU_POWERPC_440GRa           CPU_POWERPC_440EPb
6560
    CPU_POWERPC_440GRX             = 0x200008D0,
6561
#define CPU_POWERPC_440EPX           CPU_POWERPC_440GRX
6562
#define CPU_POWERPC_440GX            CPU_POWERPC_440GXf
6563
    CPU_POWERPC_440GXa             = 0x51B21850,
6564
    CPU_POWERPC_440GXb             = 0x51B21851,
6565
    CPU_POWERPC_440GXc             = 0x51B21892,
6566
    CPU_POWERPC_440GXf             = 0x51B21894,
6567
#if 0
6568
    CPU_POWERPC_440S               = xxx,
6569
#endif
6570
    CPU_POWERPC_440SP              = 0x53221850,
6571
    CPU_POWERPC_440SP2             = 0x53221891,
6572
    CPU_POWERPC_440SPE             = 0x53421890,
6573
    /* PowerPC 460 family */
6574
#if 0
6575
    /* Generic PowerPC 464 */
6576
#define CPU_POWERPC_464              CPU_POWERPC_464H90
6577
#endif
6578
    /* PowerPC 464 microcontrolers */
6579
#if 0
6580
    CPU_POWERPC_464H90             = xxx,
6581
#endif
6582
#if 0
6583
    CPU_POWERPC_464H90FP           = xxx,
6584
#endif
6585
    /* Freescale embedded PowerPC cores */
6586
    /* PowerPC MPC 5xx cores (aka RCPU) */
6587
    CPU_POWERPC_MPC5xx             = 0x00020020,
6588
#define CPU_POWERPC_MGT560           CPU_POWERPC_MPC5xx
6589
#define CPU_POWERPC_MPC509           CPU_POWERPC_MPC5xx
6590
#define CPU_POWERPC_MPC533           CPU_POWERPC_MPC5xx
6591
#define CPU_POWERPC_MPC534           CPU_POWERPC_MPC5xx
6592
#define CPU_POWERPC_MPC555           CPU_POWERPC_MPC5xx
6593
#define CPU_POWERPC_MPC556           CPU_POWERPC_MPC5xx
6594
#define CPU_POWERPC_MPC560           CPU_POWERPC_MPC5xx
6595
#define CPU_POWERPC_MPC561           CPU_POWERPC_MPC5xx
6596
#define CPU_POWERPC_MPC562           CPU_POWERPC_MPC5xx
6597
#define CPU_POWERPC_MPC563           CPU_POWERPC_MPC5xx
6598
#define CPU_POWERPC_MPC564           CPU_POWERPC_MPC5xx
6599
#define CPU_POWERPC_MPC565           CPU_POWERPC_MPC5xx
6600
#define CPU_POWERPC_MPC566           CPU_POWERPC_MPC5xx
6601
    /* PowerPC MPC 8xx cores (aka PowerQUICC) */
6602
    CPU_POWERPC_MPC8xx             = 0x00500000,
6603
#define CPU_POWERPC_MGT823           CPU_POWERPC_MPC8xx
6604
#define CPU_POWERPC_MPC821           CPU_POWERPC_MPC8xx
6605
#define CPU_POWERPC_MPC823           CPU_POWERPC_MPC8xx
6606
#define CPU_POWERPC_MPC850           CPU_POWERPC_MPC8xx
6607
#define CPU_POWERPC_MPC852T          CPU_POWERPC_MPC8xx
6608
#define CPU_POWERPC_MPC855T          CPU_POWERPC_MPC8xx
6609
#define CPU_POWERPC_MPC857           CPU_POWERPC_MPC8xx
6610
#define CPU_POWERPC_MPC859           CPU_POWERPC_MPC8xx
6611
#define CPU_POWERPC_MPC860           CPU_POWERPC_MPC8xx
6612
#define CPU_POWERPC_MPC862           CPU_POWERPC_MPC8xx
6613
#define CPU_POWERPC_MPC866           CPU_POWERPC_MPC8xx
6614
#define CPU_POWERPC_MPC870           CPU_POWERPC_MPC8xx
6615
#define CPU_POWERPC_MPC875           CPU_POWERPC_MPC8xx
6616
#define CPU_POWERPC_MPC880           CPU_POWERPC_MPC8xx
6617
#define CPU_POWERPC_MPC885           CPU_POWERPC_MPC8xx
6618
    /* G2 cores (aka PowerQUICC-II) */
6619
    CPU_POWERPC_G2                 = 0x00810011,
6620
    CPU_POWERPC_G2H4               = 0x80811010,
6621
    CPU_POWERPC_G2gp               = 0x80821010,
6622
    CPU_POWERPC_G2ls               = 0x90810010,
6623
    CPU_POWERPC_MPC603             = 0x00810100,
6624
    CPU_POWERPC_G2_HIP3            = 0x00810101,
6625
    CPU_POWERPC_G2_HIP4            = 0x80811014,
6626
    /*   G2_LE core (aka PowerQUICC-II) */
6627
    CPU_POWERPC_G2LE               = 0x80820010,
6628
    CPU_POWERPC_G2LEgp             = 0x80822010,
6629
    CPU_POWERPC_G2LEls             = 0xA0822010,
6630
    CPU_POWERPC_G2LEgp1            = 0x80822011,
6631
    CPU_POWERPC_G2LEgp3            = 0x80822013,
6632
    /* MPC52xx microcontrollers  */
6633
    /* XXX: MPC 5121 ? */
6634
#define CPU_POWERPC_MPC52xx          CPU_POWERPC_MPC5200
6635
#define CPU_POWERPC_MPC5200          CPU_POWERPC_MPC5200_v12
6636
#define CPU_POWERPC_MPC5200_v10      CPU_POWERPC_G2LEgp1
6637
#define CPU_POWERPC_MPC5200_v11      CPU_POWERPC_G2LEgp1
6638
#define CPU_POWERPC_MPC5200_v12      CPU_POWERPC_G2LEgp1
6639
#define CPU_POWERPC_MPC5200B         CPU_POWERPC_MPC5200B_v21
6640
#define CPU_POWERPC_MPC5200B_v20     CPU_POWERPC_G2LEgp1
6641
#define CPU_POWERPC_MPC5200B_v21     CPU_POWERPC_G2LEgp1
6642
    /* MPC82xx microcontrollers */
6643
#define CPU_POWERPC_MPC82xx          CPU_POWERPC_MPC8280
6644
#define CPU_POWERPC_MPC8240          CPU_POWERPC_MPC603
6645
#define CPU_POWERPC_MPC8241          CPU_POWERPC_G2_HIP4
6646
#define CPU_POWERPC_MPC8245          CPU_POWERPC_G2_HIP4
6647
#define CPU_POWERPC_MPC8247          CPU_POWERPC_G2LEgp3
6648
#define CPU_POWERPC_MPC8248          CPU_POWERPC_G2LEgp3
6649
#define CPU_POWERPC_MPC8250          CPU_POWERPC_MPC8250_HiP4
6650
#define CPU_POWERPC_MPC8250_HiP3     CPU_POWERPC_G2_HIP3
6651
#define CPU_POWERPC_MPC8250_HiP4     CPU_POWERPC_G2_HIP4
6652
#define CPU_POWERPC_MPC8255          CPU_POWERPC_MPC8255_HiP4
6653
#define CPU_POWERPC_MPC8255_HiP3     CPU_POWERPC_G2_HIP3
6654
#define CPU_POWERPC_MPC8255_HiP4     CPU_POWERPC_G2_HIP4
6655
#define CPU_POWERPC_MPC8260          CPU_POWERPC_MPC8260_HiP4
6656
#define CPU_POWERPC_MPC8260_HiP3     CPU_POWERPC_G2_HIP3
6657
#define CPU_POWERPC_MPC8260_HiP4     CPU_POWERPC_G2_HIP4
6658
#define CPU_POWERPC_MPC8264          CPU_POWERPC_MPC8264_HiP4
6659
#define CPU_POWERPC_MPC8264_HiP3     CPU_POWERPC_G2_HIP3
6660
#define CPU_POWERPC_MPC8264_HiP4     CPU_POWERPC_G2_HIP4
6661
#define CPU_POWERPC_MPC8265          CPU_POWERPC_MPC8265_HiP4
6662
#define CPU_POWERPC_MPC8265_HiP3     CPU_POWERPC_G2_HIP3
6663
#define CPU_POWERPC_MPC8265_HiP4     CPU_POWERPC_G2_HIP4
6664
#define CPU_POWERPC_MPC8266          CPU_POWERPC_MPC8266_HiP4
6665
#define CPU_POWERPC_MPC8266_HiP3     CPU_POWERPC_G2_HIP3
6666
#define CPU_POWERPC_MPC8266_HiP4     CPU_POWERPC_G2_HIP4
6667
#define CPU_POWERPC_MPC8270          CPU_POWERPC_G2LEgp3
6668
#define CPU_POWERPC_MPC8271          CPU_POWERPC_G2LEgp3
6669
#define CPU_POWERPC_MPC8272          CPU_POWERPC_G2LEgp3
6670
#define CPU_POWERPC_MPC8275          CPU_POWERPC_G2LEgp3
6671
#define CPU_POWERPC_MPC8280          CPU_POWERPC_G2LEgp3
6672
    /* e200 family */
6673
    /* e200 cores */
6674
#define CPU_POWERPC_e200             CPU_POWERPC_e200z6
6675
#if 0
6676
    CPU_POWERPC_e200z0             = xxx,
6677
#endif
6678
#if 0
6679
    CPU_POWERPC_e200z1             = xxx,
6680
#endif
6681
#if 0 /* ? */
6682
    CPU_POWERPC_e200z3             = 0x81120000,
6683
#endif
6684
    CPU_POWERPC_e200z5             = 0x81000000,
6685
    CPU_POWERPC_e200z6             = 0x81120000,
6686
    /* MPC55xx microcontrollers */
6687
#define CPU_POWERPC_MPC55xx          CPU_POWERPC_MPC5567
6688
#if 0
6689
#define CPU_POWERPC_MPC5514E         CPU_POWERPC_MPC5514E_v1
6690
#define CPU_POWERPC_MPC5514E_v0      CPU_POWERPC_e200z0
6691
#define CPU_POWERPC_MPC5514E_v1      CPU_POWERPC_e200z1
6692
#define CPU_POWERPC_MPC5514G         CPU_POWERPC_MPC5514G_v1
6693
#define CPU_POWERPC_MPC5514G_v0      CPU_POWERPC_e200z0
6694
#define CPU_POWERPC_MPC5514G_v1      CPU_POWERPC_e200z1
6695
#define CPU_POWERPC_MPC5515S         CPU_POWERPC_e200z1
6696
#define CPU_POWERPC_MPC5516E         CPU_POWERPC_MPC5516E_v1
6697
#define CPU_POWERPC_MPC5516E_v0      CPU_POWERPC_e200z0
6698
#define CPU_POWERPC_MPC5516E_v1      CPU_POWERPC_e200z1
6699
#define CPU_POWERPC_MPC5516G         CPU_POWERPC_MPC5516G_v1
6700
#define CPU_POWERPC_MPC5516G_v0      CPU_POWERPC_e200z0
6701
#define CPU_POWERPC_MPC5516G_v1      CPU_POWERPC_e200z1
6702
#define CPU_POWERPC_MPC5516S         CPU_POWERPC_e200z1
6703
#endif
6704
#if 0
6705
#define CPU_POWERPC_MPC5533          CPU_POWERPC_e200z3
6706
#define CPU_POWERPC_MPC5534          CPU_POWERPC_e200z3
6707
#endif
6708
#define CPU_POWERPC_MPC5553          CPU_POWERPC_e200z6
6709
#define CPU_POWERPC_MPC5554          CPU_POWERPC_e200z6
6710
#define CPU_POWERPC_MPC5561          CPU_POWERPC_e200z6
6711
#define CPU_POWERPC_MPC5565          CPU_POWERPC_e200z6
6712
#define CPU_POWERPC_MPC5566          CPU_POWERPC_e200z6
6713
#define CPU_POWERPC_MPC5567          CPU_POWERPC_e200z6
6714
    /* e300 family */
6715
    /* e300 cores */
6716
#define CPU_POWERPC_e300             CPU_POWERPC_e300c3
6717
    CPU_POWERPC_e300c1             = 0x00830010,
6718
    CPU_POWERPC_e300c2             = 0x00840010,
6719
    CPU_POWERPC_e300c3             = 0x00850010,
6720
    CPU_POWERPC_e300c4             = 0x00860010,
6721
    /* MPC83xx microcontrollers */
6722
#define CPU_POWERPC_MPC8313          CPU_POWERPC_e300c3
6723
#define CPU_POWERPC_MPC8313E         CPU_POWERPC_e300c3
6724
#define CPU_POWERPC_MPC8314          CPU_POWERPC_e300c3
6725
#define CPU_POWERPC_MPC8314E         CPU_POWERPC_e300c3
6726
#define CPU_POWERPC_MPC8315          CPU_POWERPC_e300c3
6727
#define CPU_POWERPC_MPC8315E         CPU_POWERPC_e300c3
6728
#define CPU_POWERPC_MPC8321          CPU_POWERPC_e300c2
6729
#define CPU_POWERPC_MPC8321E         CPU_POWERPC_e300c2
6730
#define CPU_POWERPC_MPC8323          CPU_POWERPC_e300c2
6731
#define CPU_POWERPC_MPC8323E         CPU_POWERPC_e300c2
6732
#define CPU_POWERPC_MPC8343A         CPU_POWERPC_e300c1
6733
#define CPU_POWERPC_MPC8343EA        CPU_POWERPC_e300c1
6734
#define CPU_POWERPC_MPC8347A         CPU_POWERPC_e300c1
6735
#define CPU_POWERPC_MPC8347AT        CPU_POWERPC_e300c1
6736
#define CPU_POWERPC_MPC8347AP        CPU_POWERPC_e300c1
6737
#define CPU_POWERPC_MPC8347EA        CPU_POWERPC_e300c1
6738
#define CPU_POWERPC_MPC8347EAT       CPU_POWERPC_e300c1
6739
#define CPU_POWERPC_MPC8347EAP       CPU_POWERPC_e300c1
6740
#define CPU_POWERPC_MPC8349          CPU_POWERPC_e300c1
6741
#define CPU_POWERPC_MPC8349A         CPU_POWERPC_e300c1
6742
#define CPU_POWERPC_MPC8349E         CPU_POWERPC_e300c1
6743
#define CPU_POWERPC_MPC8349EA        CPU_POWERPC_e300c1
6744
#define CPU_POWERPC_MPC8358E         CPU_POWERPC_e300c1
6745
#define CPU_POWERPC_MPC8360E         CPU_POWERPC_e300c1
6746
#define CPU_POWERPC_MPC8377          CPU_POWERPC_e300c4
6747
#define CPU_POWERPC_MPC8377E         CPU_POWERPC_e300c4
6748
#define CPU_POWERPC_MPC8378          CPU_POWERPC_e300c4
6749
#define CPU_POWERPC_MPC8378E         CPU_POWERPC_e300c4
6750
#define CPU_POWERPC_MPC8379          CPU_POWERPC_e300c4
6751
#define CPU_POWERPC_MPC8379E         CPU_POWERPC_e300c4
6752
    /* e500 family */
6753
    /* e500 cores  */
6754
#define CPU_POWERPC_e500             CPU_POWERPC_e500v2_v22
6755
#define CPU_POWERPC_e500v1           CPU_POWERPC_e500v1_v20
6756
#define CPU_POWERPC_e500v2           CPU_POWERPC_e500v2_v22
6757
    CPU_POWERPC_e500v1_v10         = 0x80200010,
6758
    CPU_POWERPC_e500v1_v20         = 0x80200020,
6759
    CPU_POWERPC_e500v2_v10         = 0x80210010,
6760
    CPU_POWERPC_e500v2_v11         = 0x80210011,
6761
    CPU_POWERPC_e500v2_v20         = 0x80210020,
6762
    CPU_POWERPC_e500v2_v21         = 0x80210021,
6763
    CPU_POWERPC_e500v2_v22         = 0x80210022,
6764
    CPU_POWERPC_e500v2_v30         = 0x80210030,
6765
    /* MPC85xx microcontrollers */
6766
#define CPU_POWERPC_MPC8533          CPU_POWERPC_MPC8533_v11
6767
#define CPU_POWERPC_MPC8533_v10      CPU_POWERPC_e500v2_v21
6768
#define CPU_POWERPC_MPC8533_v11      CPU_POWERPC_e500v2_v22
6769
#define CPU_POWERPC_MPC8533E         CPU_POWERPC_MPC8533E_v11
6770
#define CPU_POWERPC_MPC8533E_v10     CPU_POWERPC_e500v2_v21
6771
#define CPU_POWERPC_MPC8533E_v11     CPU_POWERPC_e500v2_v22
6772
#define CPU_POWERPC_MPC8540          CPU_POWERPC_MPC8540_v21
6773
#define CPU_POWERPC_MPC8540_v10      CPU_POWERPC_e500v1_v10
6774
#define CPU_POWERPC_MPC8540_v20      CPU_POWERPC_e500v1_v20
6775
#define CPU_POWERPC_MPC8540_v21      CPU_POWERPC_e500v1_v20
6776
#define CPU_POWERPC_MPC8541          CPU_POWERPC_MPC8541_v11
6777
#define CPU_POWERPC_MPC8541_v10      CPU_POWERPC_e500v1_v20
6778
#define CPU_POWERPC_MPC8541_v11      CPU_POWERPC_e500v1_v20
6779
#define CPU_POWERPC_MPC8541E         CPU_POWERPC_MPC8541E_v11
6780
#define CPU_POWERPC_MPC8541E_v10     CPU_POWERPC_e500v1_v20
6781
#define CPU_POWERPC_MPC8541E_v11     CPU_POWERPC_e500v1_v20
6782
#define CPU_POWERPC_MPC8543          CPU_POWERPC_MPC8543_v21
6783
#define CPU_POWERPC_MPC8543_v10      CPU_POWERPC_e500v2_v10
6784
#define CPU_POWERPC_MPC8543_v11      CPU_POWERPC_e500v2_v11
6785
#define CPU_POWERPC_MPC8543_v20      CPU_POWERPC_e500v2_v20
6786
#define CPU_POWERPC_MPC8543_v21      CPU_POWERPC_e500v2_v21
6787
#define CPU_POWERPC_MPC8543E         CPU_POWERPC_MPC8543E_v21
6788
#define CPU_POWERPC_MPC8543E_v10     CPU_POWERPC_e500v2_v10
6789
#define CPU_POWERPC_MPC8543E_v11     CPU_POWERPC_e500v2_v11
6790
#define CPU_POWERPC_MPC8543E_v20     CPU_POWERPC_e500v2_v20
6791
#define CPU_POWERPC_MPC8543E_v21     CPU_POWERPC_e500v2_v21
6792
#define CPU_POWERPC_MPC8544          CPU_POWERPC_MPC8544_v11
6793
#define CPU_POWERPC_MPC8544_v10      CPU_POWERPC_e500v2_v21
6794
#define CPU_POWERPC_MPC8544_v11      CPU_POWERPC_e500v2_v22
6795
#define CPU_POWERPC_MPC8544E_v11     CPU_POWERPC_e500v2_v22
6796
#define CPU_POWERPC_MPC8544E         CPU_POWERPC_MPC8544E_v11
6797
#define CPU_POWERPC_MPC8544E_v10     CPU_POWERPC_e500v2_v21
6798
#define CPU_POWERPC_MPC8545          CPU_POWERPC_MPC8545_v21
6799
#define CPU_POWERPC_MPC8545_v10      CPU_POWERPC_e500v2_v10
6800
#define CPU_POWERPC_MPC8545_v20      CPU_POWERPC_e500v2_v20
6801
#define CPU_POWERPC_MPC8545_v21      CPU_POWERPC_e500v2_v21
6802
#define CPU_POWERPC_MPC8545E         CPU_POWERPC_MPC8545E_v21
6803
#define CPU_POWERPC_MPC8545E_v10     CPU_POWERPC_e500v2_v10
6804
#define CPU_POWERPC_MPC8545E_v20     CPU_POWERPC_e500v2_v20
6805
#define CPU_POWERPC_MPC8545E_v21     CPU_POWERPC_e500v2_v21
6806
#define CPU_POWERPC_MPC8547E         CPU_POWERPC_MPC8545E_v21
6807
#define CPU_POWERPC_MPC8547E_v10     CPU_POWERPC_e500v2_v10
6808
#define CPU_POWERPC_MPC8547E_v20     CPU_POWERPC_e500v2_v20
6809
#define CPU_POWERPC_MPC8547E_v21     CPU_POWERPC_e500v2_v21
6810
#define CPU_POWERPC_MPC8548          CPU_POWERPC_MPC8548_v21
6811
#define CPU_POWERPC_MPC8548_v10      CPU_POWERPC_e500v2_v10
6812
#define CPU_POWERPC_MPC8548_v11      CPU_POWERPC_e500v2_v11
6813
#define CPU_POWERPC_MPC8548_v20      CPU_POWERPC_e500v2_v20
6814
#define CPU_POWERPC_MPC8548_v21      CPU_POWERPC_e500v2_v21
6815
#define CPU_POWERPC_MPC8548E         CPU_POWERPC_MPC8548E_v21
6816
#define CPU_POWERPC_MPC8548E_v10     CPU_POWERPC_e500v2_v10
6817
#define CPU_POWERPC_MPC8548E_v11     CPU_POWERPC_e500v2_v11
6818
#define CPU_POWERPC_MPC8548E_v20     CPU_POWERPC_e500v2_v20
6819
#define CPU_POWERPC_MPC8548E_v21     CPU_POWERPC_e500v2_v21
6820
#define CPU_POWERPC_MPC8555          CPU_POWERPC_MPC8555_v11
6821
#define CPU_POWERPC_MPC8555_v10      CPU_POWERPC_e500v2_v10
6822
#define CPU_POWERPC_MPC8555_v11      CPU_POWERPC_e500v2_v11
6823
#define CPU_POWERPC_MPC8555E         CPU_POWERPC_MPC8555E_v11
6824
#define CPU_POWERPC_MPC8555E_v10     CPU_POWERPC_e500v2_v10
6825
#define CPU_POWERPC_MPC8555E_v11     CPU_POWERPC_e500v2_v11
6826
#define CPU_POWERPC_MPC8560          CPU_POWERPC_MPC8560_v21
6827
#define CPU_POWERPC_MPC8560_v10      CPU_POWERPC_e500v2_v10
6828
#define CPU_POWERPC_MPC8560_v20      CPU_POWERPC_e500v2_v20
6829
#define CPU_POWERPC_MPC8560_v21      CPU_POWERPC_e500v2_v21
6830
#define CPU_POWERPC_MPC8567          CPU_POWERPC_e500v2_v22
6831
#define CPU_POWERPC_MPC8567E         CPU_POWERPC_e500v2_v22
6832
#define CPU_POWERPC_MPC8568          CPU_POWERPC_e500v2_v22
6833
#define CPU_POWERPC_MPC8568E         CPU_POWERPC_e500v2_v22
6834
#define CPU_POWERPC_MPC8572          CPU_POWERPC_e500v2_v30
6835
#define CPU_POWERPC_MPC8572E         CPU_POWERPC_e500v2_v30
6836
    /* e600 family */
6837
    /* e600 cores */
6838
    CPU_POWERPC_e600               = 0x80040010,
6839
    /* MPC86xx microcontrollers */
6840
#define CPU_POWERPC_MPC8610          CPU_POWERPC_e600
6841
#define CPU_POWERPC_MPC8641          CPU_POWERPC_e600
6842
#define CPU_POWERPC_MPC8641D         CPU_POWERPC_e600
6843
    /* PowerPC 6xx cores */
6844
#define CPU_POWERPC_601              CPU_POWERPC_601_v2
6845
    CPU_POWERPC_601_v0             = 0x00010001,
6846
    CPU_POWERPC_601_v1             = 0x00010001,
6847
#define CPU_POWERPC_601v             CPU_POWERPC_601_v2
6848
    CPU_POWERPC_601_v2             = 0x00010002,
6849
    CPU_POWERPC_602                = 0x00050100,
6850
    CPU_POWERPC_603                = 0x00030100,
6851
#define CPU_POWERPC_603E             CPU_POWERPC_603E_v41
6852
    CPU_POWERPC_603E_v11           = 0x00060101,
6853
    CPU_POWERPC_603E_v12           = 0x00060102,
6854
    CPU_POWERPC_603E_v13           = 0x00060103,
6855
    CPU_POWERPC_603E_v14           = 0x00060104,
6856
    CPU_POWERPC_603E_v22           = 0x00060202,
6857
    CPU_POWERPC_603E_v3            = 0x00060300,
6858
    CPU_POWERPC_603E_v4            = 0x00060400,
6859
    CPU_POWERPC_603E_v41           = 0x00060401,
6860
    CPU_POWERPC_603E7t             = 0x00071201,
6861
    CPU_POWERPC_603E7v             = 0x00070100,
6862
    CPU_POWERPC_603E7v1            = 0x00070101,
6863
    CPU_POWERPC_603E7v2            = 0x00070201,
6864
    CPU_POWERPC_603E7              = 0x00070200,
6865
    CPU_POWERPC_603P               = 0x00070000,
6866
#define CPU_POWERPC_603R             CPU_POWERPC_603E7t
6867
    /* XXX: missing 0x00040303 (604) */
6868
    CPU_POWERPC_604                = 0x00040103,
6869
#define CPU_POWERPC_604E             CPU_POWERPC_604E_v24
6870
    /* XXX: missing 0x00091203 */
6871
    /* XXX: missing 0x00092110 */
6872
    /* XXX: missing 0x00092120 */
6873
    CPU_POWERPC_604E_v10           = 0x00090100,
6874
    CPU_POWERPC_604E_v22           = 0x00090202,
6875
    CPU_POWERPC_604E_v24           = 0x00090204,
6876
    /* XXX: missing 0x000a0100 */
6877
    /* XXX: missing 0x00093102 */
6878
    CPU_POWERPC_604R               = 0x000a0101,
6879
#if 0
6880
    CPU_POWERPC_604EV              = xxx, /* XXX: same as 604R ? */
6881
#endif
6882
    /* PowerPC 740/750 cores (aka G3) */
6883
    /* XXX: missing 0x00084202 */
6884
#define CPU_POWERPC_7x0              CPU_POWERPC_7x0_v31
6885
    CPU_POWERPC_7x0_v10            = 0x00080100,
6886
    CPU_POWERPC_7x0_v20            = 0x00080200,
6887
    CPU_POWERPC_7x0_v21            = 0x00080201,
6888
    CPU_POWERPC_7x0_v22            = 0x00080202,
6889
    CPU_POWERPC_7x0_v30            = 0x00080300,
6890
    CPU_POWERPC_7x0_v31            = 0x00080301,
6891
    CPU_POWERPC_740E               = 0x00080100,
6892
    CPU_POWERPC_750E               = 0x00080200,
6893
    CPU_POWERPC_7x0P               = 0x10080000,
6894
    /* XXX: missing 0x00087010 (CL ?) */
6895
#define CPU_POWERPC_750CL            CPU_POWERPC_750CL_v20
6896
    CPU_POWERPC_750CL_v10          = 0x00087200,
6897
    CPU_POWERPC_750CL_v20          = 0x00087210, /* aka rev E */
6898
#define CPU_POWERPC_750CX            CPU_POWERPC_750CX_v22
6899
    CPU_POWERPC_750CX_v10          = 0x00082100,
6900
    CPU_POWERPC_750CX_v20          = 0x00082200,
6901
    CPU_POWERPC_750CX_v21          = 0x00082201,
6902
    CPU_POWERPC_750CX_v22          = 0x00082202,
6903
#define CPU_POWERPC_750CXE           CPU_POWERPC_750CXE_v31b
6904
    CPU_POWERPC_750CXE_v21         = 0x00082211,
6905
    CPU_POWERPC_750CXE_v22         = 0x00082212,
6906
    CPU_POWERPC_750CXE_v23         = 0x00082213,
6907
    CPU_POWERPC_750CXE_v24         = 0x00082214,
6908
    CPU_POWERPC_750CXE_v24b        = 0x00083214,
6909
    CPU_POWERPC_750CXE_v30         = 0x00082310,
6910
    CPU_POWERPC_750CXE_v31         = 0x00082311,
6911
    CPU_POWERPC_750CXE_v31b        = 0x00083311,
6912
    CPU_POWERPC_750CXR             = 0x00083410,
6913
    CPU_POWERPC_750FL              = 0x70000203,
6914
#define CPU_POWERPC_750FX            CPU_POWERPC_750FX_v23
6915
    CPU_POWERPC_750FX_v10          = 0x70000100,
6916
    CPU_POWERPC_750FX_v20          = 0x70000200,
6917
    CPU_POWERPC_750FX_v21          = 0x70000201,
6918
    CPU_POWERPC_750FX_v22          = 0x70000202,
6919
    CPU_POWERPC_750FX_v23          = 0x70000203,
6920
    CPU_POWERPC_750GL              = 0x70020102,
6921
#define CPU_POWERPC_750GX            CPU_POWERPC_750GX_v12
6922
    CPU_POWERPC_750GX_v10          = 0x70020100,
6923
    CPU_POWERPC_750GX_v11          = 0x70020101,
6924
    CPU_POWERPC_750GX_v12          = 0x70020102,
6925
#define CPU_POWERPC_750L             CPU_POWERPC_750L_v32 /* Aka LoneStar */
6926
    CPU_POWERPC_750L_v20           = 0x00088200,
6927
    CPU_POWERPC_750L_v21           = 0x00088201,
6928
    CPU_POWERPC_750L_v22           = 0x00088202,
6929
    CPU_POWERPC_750L_v30           = 0x00088300,
6930
    CPU_POWERPC_750L_v32           = 0x00088302,
6931
    /* PowerPC 745/755 cores */
6932
#define CPU_POWERPC_7x5              CPU_POWERPC_7x5_v28
6933
    CPU_POWERPC_7x5_v10            = 0x00083100,
6934
    CPU_POWERPC_7x5_v11            = 0x00083101,
6935
    CPU_POWERPC_7x5_v20            = 0x00083200,
6936
    CPU_POWERPC_7x5_v21            = 0x00083201,
6937
    CPU_POWERPC_7x5_v22            = 0x00083202, /* aka D */
6938
    CPU_POWERPC_7x5_v23            = 0x00083203, /* aka E */
6939
    CPU_POWERPC_7x5_v24            = 0x00083204,
6940
    CPU_POWERPC_7x5_v25            = 0x00083205,
6941
    CPU_POWERPC_7x5_v26            = 0x00083206,
6942
    CPU_POWERPC_7x5_v27            = 0x00083207,
6943
    CPU_POWERPC_7x5_v28            = 0x00083208,
6944
#if 0
6945
    CPU_POWERPC_7x5P               = xxx,
6946
#endif
6947
    /* PowerPC 74xx cores (aka G4) */
6948
    /* XXX: missing 0x000C1101 */
6949
#define CPU_POWERPC_7400             CPU_POWERPC_7400_v29
6950
    CPU_POWERPC_7400_v10           = 0x000C0100,
6951
    CPU_POWERPC_7400_v11           = 0x000C0101,
6952
    CPU_POWERPC_7400_v20           = 0x000C0200,
6953
    CPU_POWERPC_7400_v21           = 0x000C0201,
6954
    CPU_POWERPC_7400_v22           = 0x000C0202,
6955
    CPU_POWERPC_7400_v26           = 0x000C0206,
6956
    CPU_POWERPC_7400_v27           = 0x000C0207,
6957
    CPU_POWERPC_7400_v28           = 0x000C0208,
6958
    CPU_POWERPC_7400_v29           = 0x000C0209,
6959
#define CPU_POWERPC_7410             CPU_POWERPC_7410_v14
6960
    CPU_POWERPC_7410_v10           = 0x800C1100,
6961
    CPU_POWERPC_7410_v11           = 0x800C1101,
6962
    CPU_POWERPC_7410_v12           = 0x800C1102, /* aka C */
6963
    CPU_POWERPC_7410_v13           = 0x800C1103, /* aka D */
6964
    CPU_POWERPC_7410_v14           = 0x800C1104, /* aka E */
6965
#define CPU_POWERPC_7448             CPU_POWERPC_7448_v21
6966
    CPU_POWERPC_7448_v10           = 0x80040100,
6967
    CPU_POWERPC_7448_v11           = 0x80040101,
6968
    CPU_POWERPC_7448_v20           = 0x80040200,
6969
    CPU_POWERPC_7448_v21           = 0x80040201,
6970
#define CPU_POWERPC_7450             CPU_POWERPC_7450_v21
6971
    CPU_POWERPC_7450_v10           = 0x80000100,
6972
    CPU_POWERPC_7450_v11           = 0x80000101,
6973
    CPU_POWERPC_7450_v12           = 0x80000102,
6974
    CPU_POWERPC_7450_v20           = 0x80000200, /* aka A, B, C, D: 2.04 */
6975
    CPU_POWERPC_7450_v21           = 0x80000201, /* aka E */
6976
#define CPU_POWERPC_74x1             CPU_POWERPC_74x1_v23
6977
    CPU_POWERPC_74x1_v23           = 0x80000203, /* aka G: 2.3 */
6978
    /* XXX: this entry might be a bug in some documentation */
6979
    CPU_POWERPC_74x1_v210          = 0x80000210, /* aka G: 2.3 ? */
6980
#define CPU_POWERPC_74x5             CPU_POWERPC_74x5_v32
6981
    CPU_POWERPC_74x5_v10           = 0x80010100,
6982
    /* XXX: missing 0x80010200 */
6983
    CPU_POWERPC_74x5_v21           = 0x80010201, /* aka C: 2.1 */
6984
    CPU_POWERPC_74x5_v32           = 0x80010302,
6985
    CPU_POWERPC_74x5_v33           = 0x80010303, /* aka F: 3.3 */
6986
    CPU_POWERPC_74x5_v34           = 0x80010304, /* aka G: 3.4 */
6987
#define CPU_POWERPC_74x7             CPU_POWERPC_74x7_v12
6988
    CPU_POWERPC_74x7_v10           = 0x80020100, /* aka A: 1.0 */
6989
    CPU_POWERPC_74x7_v11           = 0x80020101, /* aka B: 1.1 */
6990
    CPU_POWERPC_74x7_v12           = 0x80020102, /* aka C: 1.2 */
6991
#define CPU_POWERPC_74x7A            CPU_POWERPC_74x7A_v12
6992
    CPU_POWERPC_74x7A_v10          = 0x80030100, /* aka A: 1.0 */
6993
    CPU_POWERPC_74x7A_v11          = 0x80030101, /* aka B: 1.1 */
6994
    CPU_POWERPC_74x7A_v12          = 0x80030102, /* aka C: 1.2 */
6995
    /* 64 bits PowerPC */
6996
#if defined(TARGET_PPC64)
6997
    CPU_POWERPC_620                = 0x00140000,
6998
    CPU_POWERPC_630                = 0x00400000,
6999
    CPU_POWERPC_631                = 0x00410104,
7000
    CPU_POWERPC_POWER4             = 0x00350000,
7001
    CPU_POWERPC_POWER4P            = 0x00380000,
7002
     /* XXX: missing 0x003A0201 */
7003
    CPU_POWERPC_POWER5             = 0x003A0203,
7004
#define CPU_POWERPC_POWER5GR         CPU_POWERPC_POWER5
7005
    CPU_POWERPC_POWER5P            = 0x003B0000,
7006
#define CPU_POWERPC_POWER5GS         CPU_POWERPC_POWER5P
7007
    CPU_POWERPC_POWER6             = 0x003E0000,
7008
    CPU_POWERPC_POWER6_5           = 0x0F000001, /* POWER6 in POWER5 mode */
7009
    CPU_POWERPC_POWER6A            = 0x0F000002,
7010
    CPU_POWERPC_970                = 0x00390202,
7011
#define CPU_POWERPC_970FX            CPU_POWERPC_970FX_v31
7012
    CPU_POWERPC_970FX_v10          = 0x00391100,
7013
    CPU_POWERPC_970FX_v20          = 0x003C0200,
7014
    CPU_POWERPC_970FX_v21          = 0x003C0201,
7015
    CPU_POWERPC_970FX_v30          = 0x003C0300,
7016
    CPU_POWERPC_970FX_v31          = 0x003C0301,
7017
    CPU_POWERPC_970GX              = 0x00450000,
7018
#define CPU_POWERPC_970MP            CPU_POWERPC_970MP_v11
7019
    CPU_POWERPC_970MP_v10          = 0x00440100,
7020
    CPU_POWERPC_970MP_v11          = 0x00440101,
7021
#define CPU_POWERPC_CELL             CPU_POWERPC_CELL_v32
7022
    CPU_POWERPC_CELL_v10           = 0x00700100,
7023
    CPU_POWERPC_CELL_v20           = 0x00700400,
7024
    CPU_POWERPC_CELL_v30           = 0x00700500,
7025
    CPU_POWERPC_CELL_v31           = 0x00700501,
7026
#define CPU_POWERPC_CELL_v32         CPU_POWERPC_CELL_v31
7027
    CPU_POWERPC_RS64               = 0x00330000,
7028
    CPU_POWERPC_RS64II             = 0x00340000,
7029
    CPU_POWERPC_RS64III            = 0x00360000,
7030
    CPU_POWERPC_RS64IV             = 0x00370000,
7031
#endif /* defined(TARGET_PPC64) */
7032
    /* Original POWER */
7033
    /* XXX: should be POWER (RIOS), RSC3308, RSC4608,
7034
     * POWER2 (RIOS2) & RSC2 (P2SC) here
7035
     */
7036
#if 0
7037
    CPU_POWER                      = xxx, /* 0x20000 ? 0x30000 for RSC ? */
7038
#endif
7039
#if 0
7040
    CPU_POWER2                     = xxx, /* 0x40000 ? */
7041
#endif
7042
    /* PA Semi core */
7043
    CPU_POWERPC_PA6T               = 0x00900000,
7044
};
7045

    
7046
/* System version register (used on MPC 8xxx)                                */
7047
enum {
7048
    POWERPC_SVR_NONE               = 0x00000000,
7049
#define POWERPC_SVR_52xx             POWERPC_SVR_5200
7050
#define POWERPC_SVR_5200             POWERPC_SVR_5200_v12
7051
    POWERPC_SVR_5200_v10           = 0x80110010,
7052
    POWERPC_SVR_5200_v11           = 0x80110011,
7053
    POWERPC_SVR_5200_v12           = 0x80110012,
7054
#define POWERPC_SVR_5200B            POWERPC_SVR_5200B_v21
7055
    POWERPC_SVR_5200B_v20          = 0x80110020,
7056
    POWERPC_SVR_5200B_v21          = 0x80110021,
7057
#define POWERPC_SVR_55xx             POWERPC_SVR_5567
7058
#if 0
7059
    POWERPC_SVR_5533               = xxx,
7060
#endif
7061
#if 0
7062
    POWERPC_SVR_5534               = xxx,
7063
#endif
7064
#if 0
7065
    POWERPC_SVR_5553               = xxx,
7066
#endif
7067
#if 0
7068
    POWERPC_SVR_5554               = xxx,
7069
#endif
7070
#if 0
7071
    POWERPC_SVR_5561               = xxx,
7072
#endif
7073
#if 0
7074
    POWERPC_SVR_5565               = xxx,
7075
#endif
7076
#if 0
7077
    POWERPC_SVR_5566               = xxx,
7078
#endif
7079
#if 0
7080
    POWERPC_SVR_5567               = xxx,
7081
#endif
7082
#if 0
7083
    POWERPC_SVR_8313               = xxx,
7084
#endif
7085
#if 0
7086
    POWERPC_SVR_8313E              = xxx,
7087
#endif
7088
#if 0
7089
    POWERPC_SVR_8314               = xxx,
7090
#endif
7091
#if 0
7092
    POWERPC_SVR_8314E              = xxx,
7093
#endif
7094
#if 0
7095
    POWERPC_SVR_8315               = xxx,
7096
#endif
7097
#if 0
7098
    POWERPC_SVR_8315E              = xxx,
7099
#endif
7100
#if 0
7101
    POWERPC_SVR_8321               = xxx,
7102
#endif
7103
#if 0
7104
    POWERPC_SVR_8321E              = xxx,
7105
#endif
7106
#if 0
7107
    POWERPC_SVR_8323               = xxx,
7108
#endif
7109
#if 0
7110
    POWERPC_SVR_8323E              = xxx,
7111
#endif
7112
    POWERPC_SVR_8343A              = 0x80570030,
7113
    POWERPC_SVR_8343EA             = 0x80560030,
7114
#define POWERPC_SVR_8347A            POWERPC_SVR_8347AT
7115
    POWERPC_SVR_8347AP             = 0x80550030, /* PBGA package */
7116
    POWERPC_SVR_8347AT             = 0x80530030, /* TBGA package */
7117
#define POWERPC_SVR_8347EA            POWERPC_SVR_8347EAT
7118
    POWERPC_SVR_8347EAP            = 0x80540030, /* PBGA package */
7119
    POWERPC_SVR_8347EAT            = 0x80520030, /* TBGA package */
7120
    POWERPC_SVR_8349               = 0x80510010,
7121
    POWERPC_SVR_8349A              = 0x80510030,
7122
    POWERPC_SVR_8349E              = 0x80500010,
7123
    POWERPC_SVR_8349EA             = 0x80500030,
7124
#if 0
7125
    POWERPC_SVR_8358E              = xxx,
7126
#endif
7127
#if 0
7128
    POWERPC_SVR_8360E              = xxx,
7129
#endif
7130
#define POWERPC_SVR_E500             0x40000000
7131
    POWERPC_SVR_8377               = 0x80C70010 | POWERPC_SVR_E500,
7132
    POWERPC_SVR_8377E              = 0x80C60010 | POWERPC_SVR_E500,
7133
    POWERPC_SVR_8378               = 0x80C50010 | POWERPC_SVR_E500,
7134
    POWERPC_SVR_8378E              = 0x80C40010 | POWERPC_SVR_E500,
7135
    POWERPC_SVR_8379               = 0x80C30010 | POWERPC_SVR_E500,
7136
    POWERPC_SVR_8379E              = 0x80C00010 | POWERPC_SVR_E500,
7137
#define POWERPC_SVR_8533             POWERPC_SVR_8533_v11
7138
    POWERPC_SVR_8533_v10           = 0x80340010 | POWERPC_SVR_E500,
7139
    POWERPC_SVR_8533_v11           = 0x80340011 | POWERPC_SVR_E500,
7140
#define POWERPC_SVR_8533E            POWERPC_SVR_8533E_v11
7141
    POWERPC_SVR_8533E_v10          = 0x803C0010 | POWERPC_SVR_E500,
7142
    POWERPC_SVR_8533E_v11          = 0x803C0011 | POWERPC_SVR_E500,
7143
#define POWERPC_SVR_8540             POWERPC_SVR_8540_v21
7144
    POWERPC_SVR_8540_v10           = 0x80300010 | POWERPC_SVR_E500,
7145
    POWERPC_SVR_8540_v20           = 0x80300020 | POWERPC_SVR_E500,
7146
    POWERPC_SVR_8540_v21           = 0x80300021 | POWERPC_SVR_E500,
7147
#define POWERPC_SVR_8541             POWERPC_SVR_8541_v11
7148
    POWERPC_SVR_8541_v10           = 0x80720010 | POWERPC_SVR_E500,
7149
    POWERPC_SVR_8541_v11           = 0x80720011 | POWERPC_SVR_E500,
7150
#define POWERPC_SVR_8541E            POWERPC_SVR_8541E_v11
7151
    POWERPC_SVR_8541E_v10          = 0x807A0010 | POWERPC_SVR_E500,
7152
    POWERPC_SVR_8541E_v11          = 0x807A0011 | POWERPC_SVR_E500,
7153
#define POWERPC_SVR_8543             POWERPC_SVR_8543_v21
7154
    POWERPC_SVR_8543_v10           = 0x80320010 | POWERPC_SVR_E500,
7155
    POWERPC_SVR_8543_v11           = 0x80320011 | POWERPC_SVR_E500,
7156
    POWERPC_SVR_8543_v20           = 0x80320020 | POWERPC_SVR_E500,
7157
    POWERPC_SVR_8543_v21           = 0x80320021 | POWERPC_SVR_E500,
7158
#define POWERPC_SVR_8543E            POWERPC_SVR_8543E_v21
7159
    POWERPC_SVR_8543E_v10          = 0x803A0010 | POWERPC_SVR_E500,
7160
    POWERPC_SVR_8543E_v11          = 0x803A0011 | POWERPC_SVR_E500,
7161
    POWERPC_SVR_8543E_v20          = 0x803A0020 | POWERPC_SVR_E500,
7162
    POWERPC_SVR_8543E_v21          = 0x803A0021 | POWERPC_SVR_E500,
7163
#define POWERPC_SVR_8544             POWERPC_SVR_8544_v11
7164
    POWERPC_SVR_8544_v10           = 0x80340110 | POWERPC_SVR_E500,
7165
    POWERPC_SVR_8544_v11           = 0x80340111 | POWERPC_SVR_E500,
7166
#define POWERPC_SVR_8544E            POWERPC_SVR_8544E_v11
7167
    POWERPC_SVR_8544E_v10          = 0x803C0110 | POWERPC_SVR_E500,
7168
    POWERPC_SVR_8544E_v11          = 0x803C0111 | POWERPC_SVR_E500,
7169
#define POWERPC_SVR_8545             POWERPC_SVR_8545_v21
7170
    POWERPC_SVR_8545_v20           = 0x80310220 | POWERPC_SVR_E500,
7171
    POWERPC_SVR_8545_v21           = 0x80310221 | POWERPC_SVR_E500,
7172
#define POWERPC_SVR_8545E            POWERPC_SVR_8545E_v21
7173
    POWERPC_SVR_8545E_v20          = 0x80390220 | POWERPC_SVR_E500,
7174
    POWERPC_SVR_8545E_v21          = 0x80390221 | POWERPC_SVR_E500,
7175
#define POWERPC_SVR_8547E            POWERPC_SVR_8547E_v21
7176
    POWERPC_SVR_8547E_v20          = 0x80390120 | POWERPC_SVR_E500,
7177
    POWERPC_SVR_8547E_v21          = 0x80390121 | POWERPC_SVR_E500,
7178
#define POWERPC_SVR_8548             POWERPC_SVR_8548_v21
7179
    POWERPC_SVR_8548_v10           = 0x80310010 | POWERPC_SVR_E500,
7180
    POWERPC_SVR_8548_v11           = 0x80310011 | POWERPC_SVR_E500,
7181
    POWERPC_SVR_8548_v20           = 0x80310020 | POWERPC_SVR_E500,
7182
    POWERPC_SVR_8548_v21           = 0x80310021 | POWERPC_SVR_E500,
7183
#define POWERPC_SVR_8548E            POWERPC_SVR_8548E_v21
7184
    POWERPC_SVR_8548E_v10          = 0x80390010 | POWERPC_SVR_E500,
7185
    POWERPC_SVR_8548E_v11          = 0x80390011 | POWERPC_SVR_E500,
7186
    POWERPC_SVR_8548E_v20          = 0x80390020 | POWERPC_SVR_E500,
7187
    POWERPC_SVR_8548E_v21          = 0x80390021 | POWERPC_SVR_E500,
7188
#define POWERPC_SVR_8555             POWERPC_SVR_8555_v11
7189
    POWERPC_SVR_8555_v10           = 0x80710010 | POWERPC_SVR_E500,
7190
    POWERPC_SVR_8555_v11           = 0x80710011 | POWERPC_SVR_E500,
7191
#define POWERPC_SVR_8555E            POWERPC_SVR_8555_v11
7192
    POWERPC_SVR_8555E_v10          = 0x80790010 | POWERPC_SVR_E500,
7193
    POWERPC_SVR_8555E_v11          = 0x80790011 | POWERPC_SVR_E500,
7194
#define POWERPC_SVR_8560             POWERPC_SVR_8560_v21
7195
    POWERPC_SVR_8560_v10           = 0x80700010 | POWERPC_SVR_E500,
7196
    POWERPC_SVR_8560_v20           = 0x80700020 | POWERPC_SVR_E500,
7197
    POWERPC_SVR_8560_v21           = 0x80700021 | POWERPC_SVR_E500,
7198
    POWERPC_SVR_8567               = 0x80750111 | POWERPC_SVR_E500,
7199
    POWERPC_SVR_8567E              = 0x807D0111 | POWERPC_SVR_E500,
7200
    POWERPC_SVR_8568               = 0x80750011 | POWERPC_SVR_E500,
7201
    POWERPC_SVR_8568E              = 0x807D0011 | POWERPC_SVR_E500,
7202
    POWERPC_SVR_8572               = 0x80E00010 | POWERPC_SVR_E500,
7203
    POWERPC_SVR_8572E              = 0x80E80010 | POWERPC_SVR_E500,
7204
#if 0
7205
    POWERPC_SVR_8610               = xxx,
7206
#endif
7207
    POWERPC_SVR_8641               = 0x80900021,
7208
    POWERPC_SVR_8641D              = 0x80900121,
7209
};
7210

    
7211
/*****************************************************************************/
7212
/* PowerPC CPU definitions                                                   */
7213
#define POWERPC_DEF_SVR(_name, _pvr, _svr, _type)                             \
7214
    {                                                                         \
7215
        .name        = _name,                                                 \
7216
        .pvr         = _pvr,                                                  \
7217
        .svr         = _svr,                                                  \
7218
        .insns_flags = glue(POWERPC_INSNS_,_type),                            \
7219
        .msr_mask    = glue(POWERPC_MSRM_,_type),                             \
7220
        .mmu_model   = glue(POWERPC_MMU_,_type),                              \
7221
        .excp_model  = glue(POWERPC_EXCP_,_type),                             \
7222
        .bus_model   = glue(POWERPC_INPUT_,_type),                            \
7223
        .bfd_mach    = glue(POWERPC_BFDM_,_type),                             \
7224
        .flags       = glue(POWERPC_FLAG_,_type),                             \
7225
        .init_proc   = &glue(init_proc_,_type),                               \
7226
        .check_pow   = &glue(check_pow_,_type),                               \
7227
    }
7228
#define POWERPC_DEF(_name, _pvr, _type)                                       \
7229
POWERPC_DEF_SVR(_name, _pvr, POWERPC_SVR_NONE, _type)
7230

    
7231
static const ppc_def_t ppc_defs[] = {
7232
    /* Embedded PowerPC                                                      */
7233
    /* PowerPC 401 family                                                    */
7234
    /* Generic PowerPC 401 */
7235
    POWERPC_DEF("401",           CPU_POWERPC_401,                    401),
7236
    /* PowerPC 401 cores                                                     */
7237
    /* PowerPC 401A1 */
7238
    POWERPC_DEF("401A1",         CPU_POWERPC_401A1,                  401),
7239
    /* PowerPC 401B2                                                         */
7240
    POWERPC_DEF("401B2",         CPU_POWERPC_401B2,                  401x2),
7241
#if defined (TODO)
7242
    /* PowerPC 401B3                                                         */
7243
    POWERPC_DEF("401B3",         CPU_POWERPC_401B3,                  401x3),
7244
#endif
7245
    /* PowerPC 401C2                                                         */
7246
    POWERPC_DEF("401C2",         CPU_POWERPC_401C2,                  401x2),
7247
    /* PowerPC 401D2                                                         */
7248
    POWERPC_DEF("401D2",         CPU_POWERPC_401D2,                  401x2),
7249
    /* PowerPC 401E2                                                         */
7250
    POWERPC_DEF("401E2",         CPU_POWERPC_401E2,                  401x2),
7251
    /* PowerPC 401F2                                                         */
7252
    POWERPC_DEF("401F2",         CPU_POWERPC_401F2,                  401x2),
7253
    /* PowerPC 401G2                                                         */
7254
    /* XXX: to be checked */
7255
    POWERPC_DEF("401G2",         CPU_POWERPC_401G2,                  401x2),
7256
    /* PowerPC 401 microcontrolers                                           */
7257
#if defined (TODO)
7258
    /* PowerPC 401GF                                                         */
7259
    POWERPC_DEF("401GF",         CPU_POWERPC_401GF,                  401),
7260
#endif
7261
    /* IOP480 (401 microcontroler)                                           */
7262
    POWERPC_DEF("IOP480",        CPU_POWERPC_IOP480,                 IOP480),
7263
    /* IBM Processor for Network Resources                                   */
7264
    POWERPC_DEF("Cobra",         CPU_POWERPC_COBRA,                  401),
7265
#if defined (TODO)
7266
    POWERPC_DEF("Xipchip",       CPU_POWERPC_XIPCHIP,                401),
7267
#endif
7268
    /* PowerPC 403 family                                                    */
7269
    /* Generic PowerPC 403                                                   */
7270
    POWERPC_DEF("403",           CPU_POWERPC_403,                    403),
7271
    /* PowerPC 403 microcontrolers                                           */
7272
    /* PowerPC 403 GA                                                        */
7273
    POWERPC_DEF("403GA",         CPU_POWERPC_403GA,                  403),
7274
    /* PowerPC 403 GB                                                        */
7275
    POWERPC_DEF("403GB",         CPU_POWERPC_403GB,                  403),
7276
    /* PowerPC 403 GC                                                        */
7277
    POWERPC_DEF("403GC",         CPU_POWERPC_403GC,                  403),
7278
    /* PowerPC 403 GCX                                                       */
7279
    POWERPC_DEF("403GCX",        CPU_POWERPC_403GCX,                 403GCX),
7280
#if defined (TODO)
7281
    /* PowerPC 403 GP                                                        */
7282
    POWERPC_DEF("403GP",         CPU_POWERPC_403GP,                  403),
7283
#endif
7284
    /* PowerPC 405 family                                                    */
7285
    /* Generic PowerPC 405                                                   */
7286
    POWERPC_DEF("405",           CPU_POWERPC_405,                    405),
7287
    /* PowerPC 405 cores                                                     */
7288
#if defined (TODO)
7289
    /* PowerPC 405 A3                                                        */
7290
    POWERPC_DEF("405A3",         CPU_POWERPC_405A3,                  405),
7291
#endif
7292
#if defined (TODO)
7293
    /* PowerPC 405 A4                                                        */
7294
    POWERPC_DEF("405A4",         CPU_POWERPC_405A4,                  405),
7295
#endif
7296
#if defined (TODO)
7297
    /* PowerPC 405 B3                                                        */
7298
    POWERPC_DEF("405B3",         CPU_POWERPC_405B3,                  405),
7299
#endif
7300
#if defined (TODO)
7301
    /* PowerPC 405 B4                                                        */
7302
    POWERPC_DEF("405B4",         CPU_POWERPC_405B4,                  405),
7303
#endif
7304
#if defined (TODO)
7305
    /* PowerPC 405 C3                                                        */
7306
    POWERPC_DEF("405C3",         CPU_POWERPC_405C3,                  405),
7307
#endif
7308
#if defined (TODO)
7309
    /* PowerPC 405 C4                                                        */
7310
    POWERPC_DEF("405C4",         CPU_POWERPC_405C4,                  405),
7311
#endif
7312
    /* PowerPC 405 D2                                                        */
7313
    POWERPC_DEF("405D2",         CPU_POWERPC_405D2,                  405),
7314
#if defined (TODO)
7315
    /* PowerPC 405 D3                                                        */
7316
    POWERPC_DEF("405D3",         CPU_POWERPC_405D3,                  405),
7317
#endif
7318
    /* PowerPC 405 D4                                                        */
7319
    POWERPC_DEF("405D4",         CPU_POWERPC_405D4,                  405),
7320
#if defined (TODO)
7321
    /* PowerPC 405 D5                                                        */
7322
    POWERPC_DEF("405D5",         CPU_POWERPC_405D5,                  405),
7323
#endif
7324
#if defined (TODO)
7325
    /* PowerPC 405 E4                                                        */
7326
    POWERPC_DEF("405E4",         CPU_POWERPC_405E4,                  405),
7327
#endif
7328
#if defined (TODO)
7329
    /* PowerPC 405 F4                                                        */
7330
    POWERPC_DEF("405F4",         CPU_POWERPC_405F4,                  405),
7331
#endif
7332
#if defined (TODO)
7333
    /* PowerPC 405 F5                                                        */
7334
    POWERPC_DEF("405F5",         CPU_POWERPC_405F5,                  405),
7335
#endif
7336
#if defined (TODO)
7337
    /* PowerPC 405 F6                                                        */
7338
    POWERPC_DEF("405F6",         CPU_POWERPC_405F6,                  405),
7339
#endif
7340
    /* PowerPC 405 microcontrolers                                           */
7341
    /* PowerPC 405 CR                                                        */
7342
    POWERPC_DEF("405CR",         CPU_POWERPC_405CR,                  405),
7343
    /* PowerPC 405 CRa                                                       */
7344
    POWERPC_DEF("405CRa",        CPU_POWERPC_405CRa,                 405),
7345
    /* PowerPC 405 CRb                                                       */
7346
    POWERPC_DEF("405CRb",        CPU_POWERPC_405CRb,                 405),
7347
    /* PowerPC 405 CRc                                                       */
7348
    POWERPC_DEF("405CRc",        CPU_POWERPC_405CRc,                 405),
7349
    /* PowerPC 405 EP                                                        */
7350
    POWERPC_DEF("405EP",         CPU_POWERPC_405EP,                  405),
7351
#if defined(TODO)
7352
    /* PowerPC 405 EXr                                                       */
7353
    POWERPC_DEF("405EXr",        CPU_POWERPC_405EXr,                 405),
7354
#endif
7355
    /* PowerPC 405 EZ                                                        */
7356
    POWERPC_DEF("405EZ",         CPU_POWERPC_405EZ,                  405),
7357
#if defined(TODO)
7358
    /* PowerPC 405 FX                                                        */
7359
    POWERPC_DEF("405FX",         CPU_POWERPC_405FX,                  405),
7360
#endif
7361
    /* PowerPC 405 GP                                                        */
7362
    POWERPC_DEF("405GP",         CPU_POWERPC_405GP,                  405),
7363
    /* PowerPC 405 GPa                                                       */
7364
    POWERPC_DEF("405GPa",        CPU_POWERPC_405GPa,                 405),
7365
    /* PowerPC 405 GPb                                                       */
7366
    POWERPC_DEF("405GPb",        CPU_POWERPC_405GPb,                 405),
7367
    /* PowerPC 405 GPc                                                       */
7368
    POWERPC_DEF("405GPc",        CPU_POWERPC_405GPc,                 405),
7369
    /* PowerPC 405 GPd                                                       */
7370
    POWERPC_DEF("405GPd",        CPU_POWERPC_405GPd,                 405),
7371
    /* PowerPC 405 GPe                                                       */
7372
    POWERPC_DEF("405GPe",        CPU_POWERPC_405GPe,                 405),
7373
    /* PowerPC 405 GPR                                                       */
7374
    POWERPC_DEF("405GPR",        CPU_POWERPC_405GPR,                 405),
7375
#if defined(TODO)
7376
    /* PowerPC 405 H                                                         */
7377
    POWERPC_DEF("405H",          CPU_POWERPC_405H,                   405),
7378
#endif
7379
#if defined(TODO)
7380
    /* PowerPC 405 L                                                         */
7381
    POWERPC_DEF("405L",          CPU_POWERPC_405L,                   405),
7382
#endif
7383
    /* PowerPC 405 LP                                                        */
7384
    POWERPC_DEF("405LP",         CPU_POWERPC_405LP,                  405),
7385
#if defined(TODO)
7386
    /* PowerPC 405 PM                                                        */
7387
    POWERPC_DEF("405PM",         CPU_POWERPC_405PM,                  405),
7388
#endif
7389
#if defined(TODO)
7390
    /* PowerPC 405 PS                                                        */
7391
    POWERPC_DEF("405PS",         CPU_POWERPC_405PS,                  405),
7392
#endif
7393
#if defined(TODO)
7394
    /* PowerPC 405 S                                                         */
7395
    POWERPC_DEF("405S",          CPU_POWERPC_405S,                   405),
7396
#endif
7397
    /* Npe405 H                                                              */
7398
    POWERPC_DEF("Npe405H",       CPU_POWERPC_NPE405H,                405),
7399
    /* Npe405 H2                                                             */
7400
    POWERPC_DEF("Npe405H2",      CPU_POWERPC_NPE405H2,               405),
7401
    /* Npe405 L                                                              */
7402
    POWERPC_DEF("Npe405L",       CPU_POWERPC_NPE405L,                405),
7403
    /* Npe4GS3                                                               */
7404
    POWERPC_DEF("Npe4GS3",       CPU_POWERPC_NPE4GS3,                405),
7405
#if defined (TODO)
7406
    POWERPC_DEF("Npcxx1",        CPU_POWERPC_NPCxx1,                 405),
7407
#endif
7408
#if defined (TODO)
7409
    POWERPC_DEF("Npr161",        CPU_POWERPC_NPR161,                 405),
7410
#endif
7411
#if defined (TODO)
7412
    /* PowerPC LC77700 (Sanyo)                                               */
7413
    POWERPC_DEF("LC77700",       CPU_POWERPC_LC77700,                405),
7414
#endif
7415
    /* PowerPC 401/403/405 based set-top-box microcontrolers                 */
7416
#if defined (TODO)
7417
    /* STB010000                                                             */
7418
    POWERPC_DEF("STB01000",      CPU_POWERPC_STB01000,               401x2),
7419
#endif
7420
#if defined (TODO)
7421
    /* STB01010                                                              */
7422
    POWERPC_DEF("STB01010",      CPU_POWERPC_STB01010,               401x2),
7423
#endif
7424
#if defined (TODO)
7425
    /* STB0210                                                               */
7426
    POWERPC_DEF("STB0210",       CPU_POWERPC_STB0210,                401x3),
7427
#endif
7428
    /* STB03xx                                                               */
7429
    POWERPC_DEF("STB03",         CPU_POWERPC_STB03,                  405),
7430
#if defined (TODO)
7431
    /* STB043x                                                               */
7432
    POWERPC_DEF("STB043",        CPU_POWERPC_STB043,                 405),
7433
#endif
7434
#if defined (TODO)
7435
    /* STB045x                                                               */
7436
    POWERPC_DEF("STB045",        CPU_POWERPC_STB045,                 405),
7437
#endif
7438
    /* STB04xx                                                               */
7439
    POWERPC_DEF("STB04",         CPU_POWERPC_STB04,                  405),
7440
    /* STB25xx                                                               */
7441
    POWERPC_DEF("STB25",         CPU_POWERPC_STB25,                  405),
7442
#if defined (TODO)
7443
    /* STB130                                                                */
7444
    POWERPC_DEF("STB130",        CPU_POWERPC_STB130,                 405),
7445
#endif
7446
    /* Xilinx PowerPC 405 cores                                              */
7447
    POWERPC_DEF("x2vp4",         CPU_POWERPC_X2VP4,                  405),
7448
    POWERPC_DEF("x2vp7",         CPU_POWERPC_X2VP7,                  405),
7449
    POWERPC_DEF("x2vp20",        CPU_POWERPC_X2VP20,                 405),
7450
    POWERPC_DEF("x2vp50",        CPU_POWERPC_X2VP50,                 405),
7451
#if defined (TODO)
7452
    /* Zarlink ZL10310                                                       */
7453
    POWERPC_DEF("zl10310",       CPU_POWERPC_ZL10310,                405),
7454
#endif
7455
#if defined (TODO)
7456
    /* Zarlink ZL10311                                                       */
7457
    POWERPC_DEF("zl10311",       CPU_POWERPC_ZL10311,                405),
7458
#endif
7459
#if defined (TODO)
7460
    /* Zarlink ZL10320                                                       */
7461
    POWERPC_DEF("zl10320",       CPU_POWERPC_ZL10320,                405),
7462
#endif
7463
#if defined (TODO)
7464
    /* Zarlink ZL10321                                                       */
7465
    POWERPC_DEF("zl10321",       CPU_POWERPC_ZL10321,                405),
7466
#endif
7467
    /* PowerPC 440 family                                                    */
7468
#if defined(TODO_USER_ONLY)
7469
    /* Generic PowerPC 440                                                   */
7470
    POWERPC_DEF("440",           CPU_POWERPC_440,                    440GP),
7471
#endif
7472
    /* PowerPC 440 cores                                                     */
7473
#if defined (TODO)
7474
    /* PowerPC 440 A4                                                        */
7475
    POWERPC_DEF("440A4",         CPU_POWERPC_440A4,                  440x4),
7476
#endif
7477
#if defined (TODO)
7478
    /* PowerPC 440 A5                                                        */
7479
    POWERPC_DEF("440A5",         CPU_POWERPC_440A5,                  440x5),
7480
#endif
7481
#if defined (TODO)
7482
    /* PowerPC 440 B4                                                        */
7483
    POWERPC_DEF("440B4",         CPU_POWERPC_440B4,                  440x4),
7484
#endif
7485
#if defined (TODO)
7486
    /* PowerPC 440 G4                                                        */
7487
    POWERPC_DEF("440G4",         CPU_POWERPC_440G4,                  440x4),
7488
#endif
7489
#if defined (TODO)
7490
    /* PowerPC 440 F5                                                        */
7491
    POWERPC_DEF("440F5",         CPU_POWERPC_440F5,                  440x5),
7492
#endif
7493
#if defined (TODO)
7494
    /* PowerPC 440 G5                                                        */
7495
    POWERPC_DEF("440G5",         CPU_POWERPC_440G5,                  440x5),
7496
#endif
7497
#if defined (TODO)
7498
    /* PowerPC 440H4                                                         */
7499
    POWERPC_DEF("440H4",         CPU_POWERPC_440H4,                  440x4),
7500
#endif
7501
#if defined (TODO)
7502
    /* PowerPC 440H6                                                         */
7503
    POWERPC_DEF("440H6",         CPU_POWERPC_440H6,                  440Gx5),
7504
#endif
7505
    /* PowerPC 440 microcontrolers                                           */
7506
#if defined(TODO_USER_ONLY)
7507
    /* PowerPC 440 EP                                                        */
7508
    POWERPC_DEF("440EP",         CPU_POWERPC_440EP,                  440EP),
7509
#endif
7510
#if defined(TODO_USER_ONLY)
7511
    /* PowerPC 440 EPa                                                       */
7512
    POWERPC_DEF("440EPa",        CPU_POWERPC_440EPa,                 440EP),
7513
#endif
7514
#if defined(TODO_USER_ONLY)
7515
    /* PowerPC 440 EPb                                                       */
7516
    POWERPC_DEF("440EPb",        CPU_POWERPC_440EPb,                 440EP),
7517
#endif
7518
#if defined(TODO_USER_ONLY)
7519
    /* PowerPC 440 EPX                                                       */
7520
    POWERPC_DEF("440EPX",        CPU_POWERPC_440EPX,                 440EP),
7521
#endif
7522
#if defined(TODO_USER_ONLY)
7523
    /* PowerPC 440 GP                                                        */
7524
    POWERPC_DEF("440GP",         CPU_POWERPC_440GP,                  440GP),
7525
#endif
7526
#if defined(TODO_USER_ONLY)
7527
    /* PowerPC 440 GPb                                                       */
7528
    POWERPC_DEF("440GPb",        CPU_POWERPC_440GPb,                 440GP),
7529
#endif
7530
#if defined(TODO_USER_ONLY)
7531
    /* PowerPC 440 GPc                                                       */
7532
    POWERPC_DEF("440GPc",        CPU_POWERPC_440GPc,                 440GP),
7533
#endif
7534
#if defined(TODO_USER_ONLY)
7535
    /* PowerPC 440 GR                                                        */
7536
    POWERPC_DEF("440GR",         CPU_POWERPC_440GR,                  440x5),
7537
#endif
7538
#if defined(TODO_USER_ONLY)
7539
    /* PowerPC 440 GRa                                                       */
7540
    POWERPC_DEF("440GRa",        CPU_POWERPC_440GRa,                 440x5),
7541
#endif
7542
#if defined(TODO_USER_ONLY)
7543
    /* PowerPC 440 GRX                                                       */
7544
    POWERPC_DEF("440GRX",        CPU_POWERPC_440GRX,                 440x5),
7545
#endif
7546
#if defined(TODO_USER_ONLY)
7547
    /* PowerPC 440 GX                                                        */
7548
    POWERPC_DEF("440GX",         CPU_POWERPC_440GX,                  440EP),
7549
#endif
7550
#if defined(TODO_USER_ONLY)
7551
    /* PowerPC 440 GXa                                                       */
7552
    POWERPC_DEF("440GXa",        CPU_POWERPC_440GXa,                 440EP),
7553
#endif
7554
#if defined(TODO_USER_ONLY)
7555
    /* PowerPC 440 GXb                                                       */
7556
    POWERPC_DEF("440GXb",        CPU_POWERPC_440GXb,                 440EP),
7557
#endif
7558
#if defined(TODO_USER_ONLY)
7559
    /* PowerPC 440 GXc                                                       */
7560
    POWERPC_DEF("440GXc",        CPU_POWERPC_440GXc,                 440EP),
7561
#endif
7562
#if defined(TODO_USER_ONLY)
7563
    /* PowerPC 440 GXf                                                       */
7564
    POWERPC_DEF("440GXf",        CPU_POWERPC_440GXf,                 440EP),
7565
#endif
7566
#if defined(TODO)
7567
    /* PowerPC 440 S                                                         */
7568
    POWERPC_DEF("440S",          CPU_POWERPC_440S,                   440),
7569
#endif
7570
#if defined(TODO_USER_ONLY)
7571
    /* PowerPC 440 SP                                                        */
7572
    POWERPC_DEF("440SP",         CPU_POWERPC_440SP,                  440EP),
7573
#endif
7574
#if defined(TODO_USER_ONLY)
7575
    /* PowerPC 440 SP2                                                       */
7576
    POWERPC_DEF("440SP2",        CPU_POWERPC_440SP2,                 440EP),
7577
#endif
7578
#if defined(TODO_USER_ONLY)
7579
    /* PowerPC 440 SPE                                                       */
7580
    POWERPC_DEF("440SPE",        CPU_POWERPC_440SPE,                 440EP),
7581
#endif
7582
    /* PowerPC 460 family                                                    */
7583
#if defined (TODO)
7584
    /* Generic PowerPC 464                                                   */
7585
    POWERPC_DEF("464",           CPU_POWERPC_464,                    460),
7586
#endif
7587
    /* PowerPC 464 microcontrolers                                           */
7588
#if defined (TODO)
7589
    /* PowerPC 464H90                                                        */
7590
    POWERPC_DEF("464H90",        CPU_POWERPC_464H90,                 460),
7591
#endif
7592
#if defined (TODO)
7593
    /* PowerPC 464H90F                                                       */
7594
    POWERPC_DEF("464H90F",       CPU_POWERPC_464H90F,                460F),
7595
#endif
7596
    /* Freescale embedded PowerPC cores                                      */
7597
    /* MPC5xx family (aka RCPU)                                              */
7598
#if defined(TODO_USER_ONLY)
7599
    /* Generic MPC5xx core                                                   */
7600
    POWERPC_DEF("MPC5xx",        CPU_POWERPC_MPC5xx,                 MPC5xx),
7601
#endif
7602
#if defined(TODO_USER_ONLY)
7603
    /* Codename for MPC5xx core                                              */
7604
    POWERPC_DEF("RCPU",          CPU_POWERPC_MPC5xx,                 MPC5xx),
7605
#endif
7606
    /* MPC5xx microcontrollers                                               */
7607
#if defined(TODO_USER_ONLY)
7608
    /* MGT560                                                                */
7609
    POWERPC_DEF("MGT560",        CPU_POWERPC_MGT560,                 MPC5xx),
7610
#endif
7611
#if defined(TODO_USER_ONLY)
7612
    /* MPC509                                                                */
7613
    POWERPC_DEF("MPC509",        CPU_POWERPC_MPC509,                 MPC5xx),
7614
#endif
7615
#if defined(TODO_USER_ONLY)
7616
    /* MPC533                                                                */
7617
    POWERPC_DEF("MPC533",        CPU_POWERPC_MPC533,                 MPC5xx),
7618
#endif
7619
#if defined(TODO_USER_ONLY)
7620
    /* MPC534                                                                */
7621
    POWERPC_DEF("MPC534",        CPU_POWERPC_MPC534,                 MPC5xx),
7622
#endif
7623
#if defined(TODO_USER_ONLY)
7624
    /* MPC555                                                                */
7625
    POWERPC_DEF("MPC555",        CPU_POWERPC_MPC555,                 MPC5xx),
7626
#endif
7627
#if defined(TODO_USER_ONLY)
7628
    /* MPC556                                                                */
7629
    POWERPC_DEF("MPC556",        CPU_POWERPC_MPC556,                 MPC5xx),
7630
#endif
7631
#if defined(TODO_USER_ONLY)
7632
    /* MPC560                                                                */
7633
    POWERPC_DEF("MPC560",        CPU_POWERPC_MPC560,                 MPC5xx),
7634
#endif
7635
#if defined(TODO_USER_ONLY)
7636
    /* MPC561                                                                */
7637
    POWERPC_DEF("MPC561",        CPU_POWERPC_MPC561,                 MPC5xx),
7638
#endif
7639
#if defined(TODO_USER_ONLY)
7640
    /* MPC562                                                                */
7641
    POWERPC_DEF("MPC562",        CPU_POWERPC_MPC562,                 MPC5xx),
7642
#endif
7643
#if defined(TODO_USER_ONLY)
7644
    /* MPC563                                                                */
7645
    POWERPC_DEF("MPC563",        CPU_POWERPC_MPC563,                 MPC5xx),
7646
#endif
7647
#if defined(TODO_USER_ONLY)
7648
    /* MPC564                                                                */
7649
    POWERPC_DEF("MPC564",        CPU_POWERPC_MPC564,                 MPC5xx),
7650
#endif
7651
#if defined(TODO_USER_ONLY)
7652
    /* MPC565                                                                */
7653
    POWERPC_DEF("MPC565",        CPU_POWERPC_MPC565,                 MPC5xx),
7654
#endif
7655
#if defined(TODO_USER_ONLY)
7656
    /* MPC566                                                                */
7657
    POWERPC_DEF("MPC566",        CPU_POWERPC_MPC566,                 MPC5xx),
7658
#endif
7659
    /* MPC8xx family (aka PowerQUICC)                                        */
7660
#if defined(TODO_USER_ONLY)
7661
    /* Generic MPC8xx core                                                   */
7662
    POWERPC_DEF("MPC8xx",        CPU_POWERPC_MPC8xx,                 MPC8xx),
7663
#endif
7664
#if defined(TODO_USER_ONLY)
7665
    /* Codename for MPC8xx core                                              */
7666
    POWERPC_DEF("PowerQUICC",    CPU_POWERPC_MPC8xx,                 MPC8xx),
7667
#endif
7668
    /* MPC8xx microcontrollers                                               */
7669
#if defined(TODO_USER_ONLY)
7670
    /* MGT823                                                                */
7671
    POWERPC_DEF("MGT823",        CPU_POWERPC_MGT823,                 MPC8xx),
7672
#endif
7673
#if defined(TODO_USER_ONLY)
7674
    /* MPC821                                                                */
7675
    POWERPC_DEF("MPC821",        CPU_POWERPC_MPC821,                 MPC8xx),
7676
#endif
7677
#if defined(TODO_USER_ONLY)
7678
    /* MPC823                                                                */
7679
    POWERPC_DEF("MPC823",        CPU_POWERPC_MPC823,                 MPC8xx),
7680
#endif
7681
#if defined(TODO_USER_ONLY)
7682
    /* MPC850                                                                */
7683
    POWERPC_DEF("MPC850",        CPU_POWERPC_MPC850,                 MPC8xx),
7684
#endif
7685
#if defined(TODO_USER_ONLY)
7686
    /* MPC852T                                                               */
7687
    POWERPC_DEF("MPC852T",       CPU_POWERPC_MPC852T,                MPC8xx),
7688
#endif
7689
#if defined(TODO_USER_ONLY)
7690
    /* MPC855T                                                               */
7691
    POWERPC_DEF("MPC855T",       CPU_POWERPC_MPC855T,                MPC8xx),
7692
#endif
7693
#if defined(TODO_USER_ONLY)
7694
    /* MPC857                                                                */
7695
    POWERPC_DEF("MPC857",        CPU_POWERPC_MPC857,                 MPC8xx),
7696
#endif
7697
#if defined(TODO_USER_ONLY)
7698
    /* MPC859                                                                */
7699
    POWERPC_DEF("MPC859",        CPU_POWERPC_MPC859,                 MPC8xx),
7700
#endif
7701
#if defined(TODO_USER_ONLY)
7702
    /* MPC860                                                                */
7703
    POWERPC_DEF("MPC860",        CPU_POWERPC_MPC860,                 MPC8xx),
7704
#endif
7705
#if defined(TODO_USER_ONLY)
7706
    /* MPC862                                                                */
7707
    POWERPC_DEF("MPC862",        CPU_POWERPC_MPC862,                 MPC8xx),
7708
#endif
7709
#if defined(TODO_USER_ONLY)
7710
    /* MPC866                                                                */
7711
    POWERPC_DEF("MPC866",        CPU_POWERPC_MPC866,                 MPC8xx),
7712
#endif
7713
#if defined(TODO_USER_ONLY)
7714
    /* MPC870                                                                */
7715
    POWERPC_DEF("MPC870",        CPU_POWERPC_MPC870,                 MPC8xx),
7716
#endif
7717
#if defined(TODO_USER_ONLY)
7718
    /* MPC875                                                                */
7719
    POWERPC_DEF("MPC875",        CPU_POWERPC_MPC875,                 MPC8xx),
7720
#endif
7721
#if defined(TODO_USER_ONLY)
7722
    /* MPC880                                                                */
7723
    POWERPC_DEF("MPC880",        CPU_POWERPC_MPC880,                 MPC8xx),
7724
#endif
7725
#if defined(TODO_USER_ONLY)
7726
    /* MPC885                                                                */
7727
    POWERPC_DEF("MPC885",        CPU_POWERPC_MPC885,                 MPC8xx),
7728
#endif
7729
    /* MPC82xx family (aka PowerQUICC-II)                                    */
7730
    /* Generic MPC52xx core                                                  */
7731
    POWERPC_DEF_SVR("MPC52xx",
7732
                    CPU_POWERPC_MPC52xx,      POWERPC_SVR_52xx,      G2LE),
7733
    /* Generic MPC82xx core                                                  */
7734
    POWERPC_DEF("MPC82xx",       CPU_POWERPC_MPC82xx,                G2),
7735
    /* Codename for MPC82xx                                                  */
7736
    POWERPC_DEF("PowerQUICC-II", CPU_POWERPC_MPC82xx,                G2),
7737
    /* PowerPC G2 core                                                       */
7738
    POWERPC_DEF("G2",            CPU_POWERPC_G2,                     G2),
7739
    /* PowerPC G2 H4 core                                                    */
7740
    POWERPC_DEF("G2H4",          CPU_POWERPC_G2H4,                   G2),
7741
    /* PowerPC G2 GP core                                                    */
7742
    POWERPC_DEF("G2GP",          CPU_POWERPC_G2gp,                   G2),
7743
    /* PowerPC G2 LS core                                                    */
7744
    POWERPC_DEF("G2LS",          CPU_POWERPC_G2ls,                   G2),
7745
    /* PowerPC G2 HiP3 core                                                  */
7746
    POWERPC_DEF("G2HiP3",        CPU_POWERPC_G2_HIP3,                G2),
7747
    /* PowerPC G2 HiP4 core                                                  */
7748
    POWERPC_DEF("G2HiP4",        CPU_POWERPC_G2_HIP4,                G2),
7749
    /* PowerPC MPC603 core                                                   */
7750
    POWERPC_DEF("MPC603",        CPU_POWERPC_MPC603,                 603E),
7751
    /* PowerPC G2le core (same as G2 plus little-endian mode support)        */
7752
    POWERPC_DEF("G2le",          CPU_POWERPC_G2LE,                   G2LE),
7753
    /* PowerPC G2LE GP core                                                  */
7754
    POWERPC_DEF("G2leGP",        CPU_POWERPC_G2LEgp,                 G2LE),
7755
    /* PowerPC G2LE LS core                                                  */
7756
    POWERPC_DEF("G2leLS",        CPU_POWERPC_G2LEls,                 G2LE),
7757
    /* PowerPC G2LE GP1 core                                                 */
7758
    POWERPC_DEF("G2leGP1",       CPU_POWERPC_G2LEgp1,                G2LE),
7759
    /* PowerPC G2LE GP3 core                                                 */
7760
    POWERPC_DEF("G2leGP3",       CPU_POWERPC_G2LEgp1,                G2LE),
7761
    /* PowerPC MPC603 microcontrollers                                       */
7762
    /* MPC8240                                                               */
7763
    POWERPC_DEF("MPC8240",       CPU_POWERPC_MPC8240,                603E),
7764
    /* PowerPC G2 microcontrollers                                           */
7765
#if defined(TODO)
7766
    /* MPC5121                                                               */
7767
    POWERPC_DEF_SVR("MPC5121",
7768
                    CPU_POWERPC_MPC5121,      POWERPC_SVR_5121,      G2LE),
7769
#endif
7770
    /* MPC5200                                                               */
7771
    POWERPC_DEF_SVR("MPC5200",
7772
                    CPU_POWERPC_MPC5200,      POWERPC_SVR_5200,      G2LE),
7773
    /* MPC5200 v1.0                                                          */
7774
    POWERPC_DEF_SVR("MPC5200_v10",
7775
                    CPU_POWERPC_MPC5200_v10,  POWERPC_SVR_5200_v10,  G2LE),
7776
    /* MPC5200 v1.1                                                          */
7777
    POWERPC_DEF_SVR("MPC5200_v11",
7778
                    CPU_POWERPC_MPC5200_v11,  POWERPC_SVR_5200_v11,  G2LE),
7779
    /* MPC5200 v1.2                                                          */
7780
    POWERPC_DEF_SVR("MPC5200_v12",
7781
                    CPU_POWERPC_MPC5200_v12,  POWERPC_SVR_5200_v12,  G2LE),
7782
    /* MPC5200B                                                              */
7783
    POWERPC_DEF_SVR("MPC5200B",
7784
                    CPU_POWERPC_MPC5200B,     POWERPC_SVR_5200B,     G2LE),
7785
    /* MPC5200B v2.0                                                         */
7786
    POWERPC_DEF_SVR("MPC5200B_v20",
7787
                    CPU_POWERPC_MPC5200B_v20, POWERPC_SVR_5200B_v20, G2LE),
7788
    /* MPC5200B v2.1                                                         */
7789
    POWERPC_DEF_SVR("MPC5200B_v21",
7790
                    CPU_POWERPC_MPC5200B_v21, POWERPC_SVR_5200B_v21, G2LE),
7791
    /* MPC8241                                                               */
7792
    POWERPC_DEF("MPC8241",       CPU_POWERPC_MPC8241,                G2),
7793
    /* MPC8245                                                               */
7794
    POWERPC_DEF("MPC8245",       CPU_POWERPC_MPC8245,                G2),
7795
    /* MPC8247                                                               */
7796
    POWERPC_DEF("MPC8247",       CPU_POWERPC_MPC8247,                G2LE),
7797
    /* MPC8248                                                               */
7798
    POWERPC_DEF("MPC8248",       CPU_POWERPC_MPC8248,                G2LE),
7799
    /* MPC8250                                                               */
7800
    POWERPC_DEF("MPC8250",       CPU_POWERPC_MPC8250,                G2),
7801
    /* MPC8250 HiP3                                                          */
7802
    POWERPC_DEF("MPC8250_HiP3",  CPU_POWERPC_MPC8250_HiP3,           G2),
7803
    /* MPC8250 HiP4                                                          */
7804
    POWERPC_DEF("MPC8250_HiP4",  CPU_POWERPC_MPC8250_HiP4,           G2),
7805
    /* MPC8255                                                               */
7806
    POWERPC_DEF("MPC8255",       CPU_POWERPC_MPC8255,                G2),
7807
    /* MPC8255 HiP3                                                          */
7808
    POWERPC_DEF("MPC8255_HiP3",  CPU_POWERPC_MPC8255_HiP3,           G2),
7809
    /* MPC8255 HiP4                                                          */
7810
    POWERPC_DEF("MPC8255_HiP4",  CPU_POWERPC_MPC8255_HiP4,           G2),
7811
    /* MPC8260                                                               */
7812
    POWERPC_DEF("MPC8260",       CPU_POWERPC_MPC8260,                G2),
7813
    /* MPC8260 HiP3                                                          */
7814
    POWERPC_DEF("MPC8260_HiP3",  CPU_POWERPC_MPC8260_HiP3,           G2),
7815
    /* MPC8260 HiP4                                                          */
7816
    POWERPC_DEF("MPC8260_HiP4",  CPU_POWERPC_MPC8260_HiP4,           G2),
7817
    /* MPC8264                                                               */
7818
    POWERPC_DEF("MPC8264",       CPU_POWERPC_MPC8264,                G2),
7819
    /* MPC8264 HiP3                                                          */
7820
    POWERPC_DEF("MPC8264_HiP3",  CPU_POWERPC_MPC8264_HiP3,           G2),
7821
    /* MPC8264 HiP4                                                          */
7822
    POWERPC_DEF("MPC8264_HiP4",  CPU_POWERPC_MPC8264_HiP4,           G2),
7823
    /* MPC8265                                                               */
7824
    POWERPC_DEF("MPC8265",       CPU_POWERPC_MPC8265,                G2),
7825
    /* MPC8265 HiP3                                                          */
7826
    POWERPC_DEF("MPC8265_HiP3",  CPU_POWERPC_MPC8265_HiP3,           G2),
7827
    /* MPC8265 HiP4                                                          */
7828
    POWERPC_DEF("MPC8265_HiP4",  CPU_POWERPC_MPC8265_HiP4,           G2),
7829
    /* MPC8266                                                               */
7830
    POWERPC_DEF("MPC8266",       CPU_POWERPC_MPC8266,                G2),
7831
    /* MPC8266 HiP3                                                          */
7832
    POWERPC_DEF("MPC8266_HiP3",  CPU_POWERPC_MPC8266_HiP3,           G2),
7833
    /* MPC8266 HiP4                                                          */
7834
    POWERPC_DEF("MPC8266_HiP4",  CPU_POWERPC_MPC8266_HiP4,           G2),
7835
    /* MPC8270                                                               */
7836
    POWERPC_DEF("MPC8270",       CPU_POWERPC_MPC8270,                G2LE),
7837
    /* MPC8271                                                               */
7838
    POWERPC_DEF("MPC8271",       CPU_POWERPC_MPC8271,                G2LE),
7839
    /* MPC8272                                                               */
7840
    POWERPC_DEF("MPC8272",       CPU_POWERPC_MPC8272,                G2LE),
7841
    /* MPC8275                                                               */
7842
    POWERPC_DEF("MPC8275",       CPU_POWERPC_MPC8275,                G2LE),
7843
    /* MPC8280                                                               */
7844
    POWERPC_DEF("MPC8280",       CPU_POWERPC_MPC8280,                G2LE),
7845
    /* e200 family                                                           */
7846
    /* Generic PowerPC e200 core                                             */
7847
    POWERPC_DEF("e200",          CPU_POWERPC_e200,                   e200),
7848
    /* Generic MPC55xx core                                                  */
7849
#if defined (TODO)
7850
    POWERPC_DEF_SVR("MPC55xx",
7851
                    CPU_POWERPC_MPC55xx,      POWERPC_SVR_55xx,      e200),
7852
#endif
7853
#if defined (TODO)
7854
    /* PowerPC e200z0 core                                                   */
7855
    POWERPC_DEF("e200z0",        CPU_POWERPC_e200z0,                 e200),
7856
#endif
7857
#if defined (TODO)
7858
    /* PowerPC e200z1 core                                                   */
7859
    POWERPC_DEF("e200z1",        CPU_POWERPC_e200z1,                 e200),
7860
#endif
7861
#if defined (TODO)
7862
    /* PowerPC e200z3 core                                                   */
7863
    POWERPC_DEF("e200z3",        CPU_POWERPC_e200z3,                 e200),
7864
#endif
7865
    /* PowerPC e200z5 core                                                   */
7866
    POWERPC_DEF("e200z5",        CPU_POWERPC_e200z5,                 e200),
7867
    /* PowerPC e200z6 core                                                   */
7868
    POWERPC_DEF("e200z6",        CPU_POWERPC_e200z6,                 e200),
7869
    /* PowerPC e200 microcontrollers                                         */
7870
#if defined (TODO)
7871
    /* MPC5514E                                                              */
7872
    POWERPC_DEF_SVR("MPC5514E",
7873
                    CPU_POWERPC_MPC5514E,     POWERPC_SVR_5514E,     e200),
7874
#endif
7875
#if defined (TODO)
7876
    /* MPC5514E v0                                                           */
7877
    POWERPC_DEF_SVR("MPC5514E_v0",
7878
                    CPU_POWERPC_MPC5514E_v0,  POWERPC_SVR_5514E_v0,  e200),
7879
#endif
7880
#if defined (TODO)
7881
    /* MPC5514E v1                                                           */
7882
    POWERPC_DEF_SVR("MPC5514E_v1",
7883
                    CPU_POWERPC_MPC5514E_v1,  POWERPC_SVR_5514E_v1,  e200),
7884
#endif
7885
#if defined (TODO)
7886
    /* MPC5514G                                                              */
7887
    POWERPC_DEF_SVR("MPC5514G",
7888
                    CPU_POWERPC_MPC5514G,     POWERPC_SVR_5514G,     e200),
7889
#endif
7890
#if defined (TODO)
7891
    /* MPC5514G v0                                                           */
7892
    POWERPC_DEF_SVR("MPC5514G_v0",
7893
                    CPU_POWERPC_MPC5514G_v0,  POWERPC_SVR_5514G_v0,  e200),
7894
#endif
7895
#if defined (TODO)
7896
    /* MPC5514G v1                                                           */
7897
    POWERPC_DEF_SVR("MPC5514G_v1",
7898
                    CPU_POWERPC_MPC5514G_v1,  POWERPC_SVR_5514G_v1,  e200),
7899
#endif
7900
#if defined (TODO)
7901
    /* MPC5515S                                                              */
7902
    POWERPC_DEF_SVR("MPC5515S",
7903
                    CPU_POWERPC_MPC5515S,     POWERPC_SVR_5515S,     e200),
7904
#endif
7905
#if defined (TODO)
7906
    /* MPC5516E                                                              */
7907
    POWERPC_DEF_SVR("MPC5516E",
7908
                    CPU_POWERPC_MPC5516E,     POWERPC_SVR_5516E,     e200),
7909
#endif
7910
#if defined (TODO)
7911
    /* MPC5516E v0                                                           */
7912
    POWERPC_DEF_SVR("MPC5516E_v0",
7913
                    CPU_POWERPC_MPC5516E_v0,  POWERPC_SVR_5516E_v0,  e200),
7914
#endif
7915
#if defined (TODO)
7916
    /* MPC5516E v1                                                           */
7917
    POWERPC_DEF_SVR("MPC5516E_v1",
7918
                    CPU_POWERPC_MPC5516E_v1,  POWERPC_SVR_5516E_v1,  e200),
7919
#endif
7920
#if defined (TODO)
7921
    /* MPC5516G                                                              */
7922
    POWERPC_DEF_SVR("MPC5516G",
7923
                    CPU_POWERPC_MPC5516G,     POWERPC_SVR_5516G,     e200),
7924
#endif
7925
#if defined (TODO)
7926
    /* MPC5516G v0                                                           */
7927
    POWERPC_DEF_SVR("MPC5516G_v0",
7928
                    CPU_POWERPC_MPC5516G_v0,  POWERPC_SVR_5516G_v0,  e200),
7929
#endif
7930
#if defined (TODO)
7931
    /* MPC5516G v1                                                           */
7932
    POWERPC_DEF_SVR("MPC5516G_v1",
7933
                    CPU_POWERPC_MPC5516G_v1,  POWERPC_SVR_5516G_v1,  e200),
7934
#endif
7935
#if defined (TODO)
7936
    /* MPC5516S                                                              */
7937
    POWERPC_DEF_SVR("MPC5516S",
7938
                    CPU_POWERPC_MPC5516S,     POWERPC_SVR_5516S,     e200),
7939
#endif
7940
#if defined (TODO)
7941
    /* MPC5533                                                               */
7942
    POWERPC_DEF_SVR("MPC5533",
7943
                    CPU_POWERPC_MPC5533,      POWERPC_SVR_5533,      e200),
7944
#endif
7945
#if defined (TODO)
7946
    /* MPC5534                                                               */
7947
    POWERPC_DEF_SVR("MPC5534",
7948
                    CPU_POWERPC_MPC5534,      POWERPC_SVR_5534,      e200),
7949
#endif
7950
#if defined (TODO)
7951
    /* MPC5553                                                               */
7952
    POWERPC_DEF_SVR("MPC5553",
7953
                    CPU_POWERPC_MPC5553,      POWERPC_SVR_5553,      e200),
7954
#endif
7955
#if defined (TODO)
7956
    /* MPC5554                                                               */
7957
    POWERPC_DEF_SVR("MPC5554",
7958
                    CPU_POWERPC_MPC5554,      POWERPC_SVR_5554,      e200),
7959
#endif
7960
#if defined (TODO)
7961
    /* MPC5561                                                               */
7962
    POWERPC_DEF_SVR("MPC5561",
7963
                    CPU_POWERPC_MPC5561,      POWERPC_SVR_5561,      e200),
7964
#endif
7965
#if defined (TODO)
7966
    /* MPC5565                                                               */
7967
    POWERPC_DEF_SVR("MPC5565",
7968
                    CPU_POWERPC_MPC5565,      POWERPC_SVR_5565,      e200),
7969
#endif
7970
#if defined (TODO)
7971
    /* MPC5566                                                               */
7972
    POWERPC_DEF_SVR("MPC5566",
7973
                    CPU_POWERPC_MPC5566,      POWERPC_SVR_5566,      e200),
7974
#endif
7975
#if defined (TODO)
7976
    /* MPC5567                                                               */
7977
    POWERPC_DEF_SVR("MPC5567",
7978
                    CPU_POWERPC_MPC5567,      POWERPC_SVR_5567,      e200),
7979
#endif
7980
    /* e300 family                                                           */
7981
    /* Generic PowerPC e300 core                                             */
7982
    POWERPC_DEF("e300",          CPU_POWERPC_e300,                   e300),
7983
    /* PowerPC e300c1 core                                                   */
7984
    POWERPC_DEF("e300c1",        CPU_POWERPC_e300c1,                 e300),
7985
    /* PowerPC e300c2 core                                                   */
7986
    POWERPC_DEF("e300c2",        CPU_POWERPC_e300c2,                 e300),
7987
    /* PowerPC e300c3 core                                                   */
7988
    POWERPC_DEF("e300c3",        CPU_POWERPC_e300c3,                 e300),
7989
    /* PowerPC e300c4 core                                                   */
7990
    POWERPC_DEF("e300c4",        CPU_POWERPC_e300c4,                 e300),
7991
    /* PowerPC e300 microcontrollers                                         */
7992
#if defined (TODO)
7993
    /* MPC8313                                                               */
7994
    POWERPC_DEF_SVR("MPC8313",
7995
                    CPU_POWERPC_MPC8313,      POWERPC_SVR_8313,      e300),
7996
#endif
7997
#if defined (TODO)
7998
    /* MPC8313E                                                              */
7999
    POWERPC_DEF_SVR("MPC8313E",
8000
                    CPU_POWERPC_MPC8313E,     POWERPC_SVR_8313E,     e300),
8001
#endif
8002
#if defined (TODO)
8003
    /* MPC8314                                                               */
8004
    POWERPC_DEF_SVR("MPC8314",
8005
                    CPU_POWERPC_MPC8314,      POWERPC_SVR_8314,      e300),
8006
#endif
8007
#if defined (TODO)
8008
    /* MPC8314E                                                              */
8009
    POWERPC_DEF_SVR("MPC8314E",
8010
                    CPU_POWERPC_MPC8314E,     POWERPC_SVR_8314E,     e300),
8011
#endif
8012
#if defined (TODO)
8013
    /* MPC8315                                                               */
8014
    POWERPC_DEF_SVR("MPC8315",
8015
                    CPU_POWERPC_MPC8315,      POWERPC_SVR_8315,      e300),
8016
#endif
8017
#if defined (TODO)
8018
    /* MPC8315E                                                              */
8019
    POWERPC_DEF_SVR("MPC8315E",
8020
                    CPU_POWERPC_MPC8315E,     POWERPC_SVR_8315E,     e300),
8021
#endif
8022
#if defined (TODO)
8023
    /* MPC8321                                                               */
8024
    POWERPC_DEF_SVR("MPC8321",
8025
                    CPU_POWERPC_MPC8321,      POWERPC_SVR_8321,      e300),
8026
#endif
8027
#if defined (TODO)
8028
    /* MPC8321E                                                              */
8029
    POWERPC_DEF_SVR("MPC8321E",
8030
                    CPU_POWERPC_MPC8321E,     POWERPC_SVR_8321E,     e300),
8031
#endif
8032
#if defined (TODO)
8033
    /* MPC8323                                                               */
8034
    POWERPC_DEF_SVR("MPC8323",
8035
                    CPU_POWERPC_MPC8323,      POWERPC_SVR_8323,      e300),
8036
#endif
8037
#if defined (TODO)
8038
    /* MPC8323E                                                              */
8039
    POWERPC_DEF_SVR("MPC8323E",
8040
                    CPU_POWERPC_MPC8323E,     POWERPC_SVR_8323E,     e300),
8041
#endif
8042
    /* MPC8343A                                                              */
8043
    POWERPC_DEF_SVR("MPC8343A",
8044
                    CPU_POWERPC_MPC8343A,     POWERPC_SVR_8343A,     e300),
8045
    /* MPC8343EA                                                             */
8046
    POWERPC_DEF_SVR("MPC8343EA",
8047
                    CPU_POWERPC_MPC8343EA,    POWERPC_SVR_8343EA,    e300),
8048
    /* MPC8347A                                                              */
8049
    POWERPC_DEF_SVR("MPC8347A",
8050
                    CPU_POWERPC_MPC8347A,     POWERPC_SVR_8347A,     e300),
8051
    /* MPC8347AT                                                             */
8052
    POWERPC_DEF_SVR("MPC8347AT",
8053
                    CPU_POWERPC_MPC8347AT,    POWERPC_SVR_8347AT,    e300),
8054
    /* MPC8347AP                                                             */
8055
    POWERPC_DEF_SVR("MPC8347AP",
8056
                    CPU_POWERPC_MPC8347AP,    POWERPC_SVR_8347AP,    e300),
8057
    /* MPC8347EA                                                             */
8058
    POWERPC_DEF_SVR("MPC8347EA",
8059
                    CPU_POWERPC_MPC8347EA,    POWERPC_SVR_8347EA,    e300),
8060
    /* MPC8347EAT                                                            */
8061
    POWERPC_DEF_SVR("MPC8347EAT",
8062
                    CPU_POWERPC_MPC8347EAT,   POWERPC_SVR_8347EAT,   e300),
8063
    /* MPC8343EAP                                                            */
8064
    POWERPC_DEF_SVR("MPC8347EAP",
8065
                    CPU_POWERPC_MPC8347EAP,   POWERPC_SVR_8347EAP,   e300),
8066
    /* MPC8349                                                               */
8067
    POWERPC_DEF_SVR("MPC8349",
8068
                    CPU_POWERPC_MPC8349,      POWERPC_SVR_8349,      e300),
8069
    /* MPC8349A                                                              */
8070
    POWERPC_DEF_SVR("MPC8349A",
8071
                    CPU_POWERPC_MPC8349A,     POWERPC_SVR_8349A,     e300),
8072
    /* MPC8349E                                                              */
8073
    POWERPC_DEF_SVR("MPC8349E",
8074
                    CPU_POWERPC_MPC8349E,     POWERPC_SVR_8349E,     e300),
8075
    /* MPC8349EA                                                             */
8076
    POWERPC_DEF_SVR("MPC8349EA",
8077
                    CPU_POWERPC_MPC8349EA,    POWERPC_SVR_8349EA,    e300),
8078
#if defined (TODO)
8079
    /* MPC8358E                                                              */
8080
    POWERPC_DEF_SVR("MPC8358E",
8081
                    CPU_POWERPC_MPC8358E,     POWERPC_SVR_8358E,     e300),
8082
#endif
8083
#if defined (TODO)
8084
    /* MPC8360E                                                              */
8085
    POWERPC_DEF_SVR("MPC8360E",
8086
                    CPU_POWERPC_MPC8360E,     POWERPC_SVR_8360E,     e300),
8087
#endif
8088
    /* MPC8377                                                               */
8089
    POWERPC_DEF_SVR("MPC8377",
8090
                    CPU_POWERPC_MPC8377,      POWERPC_SVR_8377,      e300),
8091
    /* MPC8377E                                                              */
8092
    POWERPC_DEF_SVR("MPC8377E",
8093
                    CPU_POWERPC_MPC8377E,     POWERPC_SVR_8377E,     e300),
8094
    /* MPC8378                                                               */
8095
    POWERPC_DEF_SVR("MPC8378",
8096
                    CPU_POWERPC_MPC8378,      POWERPC_SVR_8378,      e300),
8097
    /* MPC8378E                                                              */
8098
    POWERPC_DEF_SVR("MPC8378E",
8099
                    CPU_POWERPC_MPC8378E,     POWERPC_SVR_8378E,     e300),
8100
    /* MPC8379                                                               */
8101
    POWERPC_DEF_SVR("MPC8379",
8102
                    CPU_POWERPC_MPC8379,      POWERPC_SVR_8379,      e300),
8103
    /* MPC8379E                                                              */
8104
    POWERPC_DEF_SVR("MPC8379E",
8105
                    CPU_POWERPC_MPC8379E,     POWERPC_SVR_8379E,     e300),
8106
    /* e500 family                                                           */
8107
    /* PowerPC e500 core                                                     */
8108
    POWERPC_DEF("e500",          CPU_POWERPC_e500v2_v22,             e500v2),
8109
    /* PowerPC e500v1 core                                                   */
8110
    POWERPC_DEF("e500v1",        CPU_POWERPC_e500v1,                 e500v1),
8111
    /* PowerPC e500 v1.0 core                                                */
8112
    POWERPC_DEF("e500_v10",      CPU_POWERPC_e500v1_v10,             e500v1),
8113
    /* PowerPC e500 v2.0 core                                                */
8114
    POWERPC_DEF("e500_v20",      CPU_POWERPC_e500v1_v20,             e500v1),
8115
    /* PowerPC e500v2 core                                                   */
8116
    POWERPC_DEF("e500v2",        CPU_POWERPC_e500v2,                 e500v2),
8117
    /* PowerPC e500v2 v1.0 core                                              */
8118
    POWERPC_DEF("e500v2_v10",    CPU_POWERPC_e500v2_v10,             e500v2),
8119
    /* PowerPC e500v2 v2.0 core                                              */
8120
    POWERPC_DEF("e500v2_v20",    CPU_POWERPC_e500v2_v20,             e500v2),
8121
    /* PowerPC e500v2 v2.1 core                                              */
8122
    POWERPC_DEF("e500v2_v21",    CPU_POWERPC_e500v2_v21,             e500v2),
8123
    /* PowerPC e500v2 v2.2 core                                              */
8124
    POWERPC_DEF("e500v2_v22",    CPU_POWERPC_e500v2_v22,             e500v2),
8125
    /* PowerPC e500v2 v3.0 core                                              */
8126
    POWERPC_DEF("e500v2_v30",    CPU_POWERPC_e500v2_v30,             e500v2),
8127
    /* PowerPC e500 microcontrollers                                         */
8128
    /* MPC8533                                                               */
8129
    POWERPC_DEF_SVR("MPC8533",
8130
                    CPU_POWERPC_MPC8533,      POWERPC_SVR_8533,      e500v2),
8131
    /* MPC8533 v1.0                                                          */
8132
    POWERPC_DEF_SVR("MPC8533_v10",
8133
                    CPU_POWERPC_MPC8533_v10,  POWERPC_SVR_8533_v10,  e500v2),
8134
    /* MPC8533 v1.1                                                          */
8135
    POWERPC_DEF_SVR("MPC8533_v11",
8136
                    CPU_POWERPC_MPC8533_v11,  POWERPC_SVR_8533_v11,  e500v2),
8137
    /* MPC8533E                                                              */
8138
    POWERPC_DEF_SVR("MPC8533E",
8139
                    CPU_POWERPC_MPC8533E,     POWERPC_SVR_8533E,     e500v2),
8140
    /* MPC8533E v1.0                                                         */
8141
    POWERPC_DEF_SVR("MPC8533E_v10",
8142
                    CPU_POWERPC_MPC8533E_v10, POWERPC_SVR_8533E_v10, e500v2),
8143
    POWERPC_DEF_SVR("MPC8533E_v11",
8144
                    CPU_POWERPC_MPC8533E_v11, POWERPC_SVR_8533E_v11, e500v2),
8145
    /* MPC8540                                                               */
8146
    POWERPC_DEF_SVR("MPC8540",
8147
                    CPU_POWERPC_MPC8540,      POWERPC_SVR_8540,      e500v1),
8148
    /* MPC8540 v1.0                                                          */
8149
    POWERPC_DEF_SVR("MPC8540_v10",
8150
                    CPU_POWERPC_MPC8540_v10,  POWERPC_SVR_8540_v10,  e500v1),
8151
    /* MPC8540 v2.0                                                          */
8152
    POWERPC_DEF_SVR("MPC8540_v20",
8153
                    CPU_POWERPC_MPC8540_v20,  POWERPC_SVR_8540_v20,  e500v1),
8154
    /* MPC8540 v2.1                                                          */
8155
    POWERPC_DEF_SVR("MPC8540_v21",
8156
                    CPU_POWERPC_MPC8540_v21,  POWERPC_SVR_8540_v21,  e500v1),
8157
    /* MPC8541                                                               */
8158
    POWERPC_DEF_SVR("MPC8541",
8159
                    CPU_POWERPC_MPC8541,      POWERPC_SVR_8541,      e500v1),
8160
    /* MPC8541 v1.0                                                          */
8161
    POWERPC_DEF_SVR("MPC8541_v10",
8162
                    CPU_POWERPC_MPC8541_v10,  POWERPC_SVR_8541_v10,  e500v1),
8163
    /* MPC8541 v1.1                                                          */
8164
    POWERPC_DEF_SVR("MPC8541_v11",
8165
                    CPU_POWERPC_MPC8541_v11,  POWERPC_SVR_8541_v11,  e500v1),
8166
    /* MPC8541E                                                              */
8167
    POWERPC_DEF_SVR("MPC8541E",
8168
                    CPU_POWERPC_MPC8541E,     POWERPC_SVR_8541E,     e500v1),
8169
    /* MPC8541E v1.0                                                         */
8170
    POWERPC_DEF_SVR("MPC8541E_v10",
8171
                    CPU_POWERPC_MPC8541E_v10, POWERPC_SVR_8541E_v10, e500v1),
8172
    /* MPC8541E v1.1                                                         */
8173
    POWERPC_DEF_SVR("MPC8541E_v11",
8174
                    CPU_POWERPC_MPC8541E_v11, POWERPC_SVR_8541E_v11, e500v1),
8175
    /* MPC8543                                                               */
8176
    POWERPC_DEF_SVR("MPC8543",
8177
                    CPU_POWERPC_MPC8543,      POWERPC_SVR_8543,      e500v2),
8178
    /* MPC8543 v1.0                                                          */
8179
    POWERPC_DEF_SVR("MPC8543_v10",
8180
                    CPU_POWERPC_MPC8543_v10,  POWERPC_SVR_8543_v10,  e500v2),
8181
    /* MPC8543 v1.1                                                          */
8182
    POWERPC_DEF_SVR("MPC8543_v11",
8183
                    CPU_POWERPC_MPC8543_v11,  POWERPC_SVR_8543_v11,  e500v2),
8184
    /* MPC8543 v2.0                                                          */
8185
    POWERPC_DEF_SVR("MPC8543_v20",
8186
                    CPU_POWERPC_MPC8543_v20,  POWERPC_SVR_8543_v20,  e500v2),
8187
    /* MPC8543 v2.1                                                          */
8188
    POWERPC_DEF_SVR("MPC8543_v21",
8189
                    CPU_POWERPC_MPC8543_v21,  POWERPC_SVR_8543_v21,  e500v2),
8190
    /* MPC8543E                                                              */
8191
    POWERPC_DEF_SVR("MPC8543E",
8192
                    CPU_POWERPC_MPC8543E,     POWERPC_SVR_8543E,     e500v2),
8193
    /* MPC8543E v1.0                                                         */
8194
    POWERPC_DEF_SVR("MPC8543E_v10",
8195
                    CPU_POWERPC_MPC8543E_v10, POWERPC_SVR_8543E_v10, e500v2),
8196
    /* MPC8543E v1.1                                                         */
8197
    POWERPC_DEF_SVR("MPC8543E_v11",
8198
                    CPU_POWERPC_MPC8543E_v11, POWERPC_SVR_8543E_v11, e500v2),
8199
    /* MPC8543E v2.0                                                         */
8200
    POWERPC_DEF_SVR("MPC8543E_v20",
8201
                    CPU_POWERPC_MPC8543E_v20, POWERPC_SVR_8543E_v20, e500v2),
8202
    /* MPC8543E v2.1                                                         */
8203
    POWERPC_DEF_SVR("MPC8543E_v21",
8204
                    CPU_POWERPC_MPC8543E_v21, POWERPC_SVR_8543E_v21, e500v2),
8205
    /* MPC8544                                                               */
8206
    POWERPC_DEF_SVR("MPC8544",
8207
                    CPU_POWERPC_MPC8544,      POWERPC_SVR_8544,      e500v2),
8208
    /* MPC8544 v1.0                                                          */
8209
    POWERPC_DEF_SVR("MPC8544_v10",
8210
                    CPU_POWERPC_MPC8544_v10,  POWERPC_SVR_8544_v10,  e500v2),
8211
    /* MPC8544 v1.1                                                          */
8212
    POWERPC_DEF_SVR("MPC8544_v11",
8213
                    CPU_POWERPC_MPC8544_v11,  POWERPC_SVR_8544_v11,  e500v2),
8214
    /* MPC8544E                                                              */
8215
    POWERPC_DEF_SVR("MPC8544E",
8216
                    CPU_POWERPC_MPC8544E,     POWERPC_SVR_8544E,     e500v2),
8217
    /* MPC8544E v1.0                                                         */
8218
    POWERPC_DEF_SVR("MPC8544E_v10",
8219
                    CPU_POWERPC_MPC8544E_v10, POWERPC_SVR_8544E_v10, e500v2),
8220
    /* MPC8544E v1.1                                                         */
8221
    POWERPC_DEF_SVR("MPC8544E_v11",
8222
                    CPU_POWERPC_MPC8544E_v11, POWERPC_SVR_8544E_v11, e500v2),
8223
    /* MPC8545                                                               */
8224
    POWERPC_DEF_SVR("MPC8545",
8225
                    CPU_POWERPC_MPC8545,      POWERPC_SVR_8545,      e500v2),
8226
    /* MPC8545 v2.0                                                          */
8227
    POWERPC_DEF_SVR("MPC8545_v20",
8228
                    CPU_POWERPC_MPC8545_v20,  POWERPC_SVR_8545_v20,  e500v2),
8229
    /* MPC8545 v2.1                                                          */
8230
    POWERPC_DEF_SVR("MPC8545_v21",
8231
                    CPU_POWERPC_MPC8545_v21,  POWERPC_SVR_8545_v21,  e500v2),
8232
    /* MPC8545E                                                              */
8233
    POWERPC_DEF_SVR("MPC8545E",
8234
                    CPU_POWERPC_MPC8545E,     POWERPC_SVR_8545E,     e500v2),
8235
    /* MPC8545E v2.0                                                         */
8236
    POWERPC_DEF_SVR("MPC8545E_v20",
8237
                    CPU_POWERPC_MPC8545E_v20, POWERPC_SVR_8545E_v20, e500v2),
8238
    /* MPC8545E v2.1                                                         */
8239
    POWERPC_DEF_SVR("MPC8545E_v21",
8240
                    CPU_POWERPC_MPC8545E_v21, POWERPC_SVR_8545E_v21, e500v2),
8241
    /* MPC8547E                                                              */
8242
    POWERPC_DEF_SVR("MPC8547E",
8243
                    CPU_POWERPC_MPC8547E,     POWERPC_SVR_8547E,     e500v2),
8244
    /* MPC8547E v2.0                                                         */
8245
    POWERPC_DEF_SVR("MPC8547E_v20",
8246
                    CPU_POWERPC_MPC8547E_v20, POWERPC_SVR_8547E_v20, e500v2),
8247
    /* MPC8547E v2.1                                                         */
8248
    POWERPC_DEF_SVR("MPC8547E_v21",
8249
                    CPU_POWERPC_MPC8547E_v21, POWERPC_SVR_8547E_v21, e500v2),
8250
    /* MPC8548                                                               */
8251
    POWERPC_DEF_SVR("MPC8548",
8252
                    CPU_POWERPC_MPC8548,      POWERPC_SVR_8548,      e500v2),
8253
    /* MPC8548 v1.0                                                          */
8254
    POWERPC_DEF_SVR("MPC8548_v10",
8255
                    CPU_POWERPC_MPC8548_v10,  POWERPC_SVR_8548_v10,  e500v2),
8256
    /* MPC8548 v1.1                                                          */
8257
    POWERPC_DEF_SVR("MPC8548_v11",
8258
                    CPU_POWERPC_MPC8548_v11,  POWERPC_SVR_8548_v11,  e500v2),
8259
    /* MPC8548 v2.0                                                          */
8260
    POWERPC_DEF_SVR("MPC8548_v20",
8261
                    CPU_POWERPC_MPC8548_v20,  POWERPC_SVR_8548_v20,  e500v2),
8262
    /* MPC8548 v2.1                                                          */
8263
    POWERPC_DEF_SVR("MPC8548_v21",
8264
                    CPU_POWERPC_MPC8548_v21,  POWERPC_SVR_8548_v21,  e500v2),
8265
    /* MPC8548E                                                              */
8266
    POWERPC_DEF_SVR("MPC8548E",
8267
                    CPU_POWERPC_MPC8548E,     POWERPC_SVR_8548E,     e500v2),
8268
    /* MPC8548E v1.0                                                         */
8269
    POWERPC_DEF_SVR("MPC8548E_v10",
8270
                    CPU_POWERPC_MPC8548E_v10, POWERPC_SVR_8548E_v10, e500v2),
8271
    /* MPC8548E v1.1                                                         */
8272
    POWERPC_DEF_SVR("MPC8548E_v11",
8273
                    CPU_POWERPC_MPC8548E_v11, POWERPC_SVR_8548E_v11, e500v2),
8274
    /* MPC8548E v2.0                                                         */
8275
    POWERPC_DEF_SVR("MPC8548E_v20",
8276
                    CPU_POWERPC_MPC8548E_v20, POWERPC_SVR_8548E_v20, e500v2),
8277
    /* MPC8548E v2.1                                                         */
8278
    POWERPC_DEF_SVR("MPC8548E_v21",
8279
                    CPU_POWERPC_MPC8548E_v21, POWERPC_SVR_8548E_v21, e500v2),
8280
    /* MPC8555                                                               */
8281
    POWERPC_DEF_SVR("MPC8555",
8282
                    CPU_POWERPC_MPC8555,      POWERPC_SVR_8555,      e500v2),
8283
    /* MPC8555 v1.0                                                          */
8284
    POWERPC_DEF_SVR("MPC8555_v10",
8285
                    CPU_POWERPC_MPC8555_v10,  POWERPC_SVR_8555_v10,  e500v2),
8286
    /* MPC8555 v1.1                                                          */
8287
    POWERPC_DEF_SVR("MPC8555_v11",
8288
                    CPU_POWERPC_MPC8555_v11,  POWERPC_SVR_8555_v11,  e500v2),
8289
    /* MPC8555E                                                              */
8290
    POWERPC_DEF_SVR("MPC8555E",
8291
                    CPU_POWERPC_MPC8555E,     POWERPC_SVR_8555E,     e500v2),
8292
    /* MPC8555E v1.0                                                         */
8293
    POWERPC_DEF_SVR("MPC8555E_v10",
8294
                    CPU_POWERPC_MPC8555E_v10, POWERPC_SVR_8555E_v10, e500v2),
8295
    /* MPC8555E v1.1                                                         */
8296
    POWERPC_DEF_SVR("MPC8555E_v11",
8297
                    CPU_POWERPC_MPC8555E_v11, POWERPC_SVR_8555E_v11, e500v2),
8298
    /* MPC8560                                                               */
8299
    POWERPC_DEF_SVR("MPC8560",
8300
                    CPU_POWERPC_MPC8560,      POWERPC_SVR_8560,      e500v2),
8301
    /* MPC8560 v1.0                                                          */
8302
    POWERPC_DEF_SVR("MPC8560_v10",
8303
                    CPU_POWERPC_MPC8560_v10,  POWERPC_SVR_8560_v10,  e500v2),
8304
    /* MPC8560 v2.0                                                          */
8305
    POWERPC_DEF_SVR("MPC8560_v20",
8306
                    CPU_POWERPC_MPC8560_v20,  POWERPC_SVR_8560_v20,  e500v2),
8307
    /* MPC8560 v2.1                                                          */
8308
    POWERPC_DEF_SVR("MPC8560_v21",
8309
                    CPU_POWERPC_MPC8560_v21,  POWERPC_SVR_8560_v21,  e500v2),
8310
    /* MPC8567                                                               */
8311
    POWERPC_DEF_SVR("MPC8567",
8312
                    CPU_POWERPC_MPC8567,      POWERPC_SVR_8567,      e500v2),
8313
    /* MPC8567E                                                              */
8314
    POWERPC_DEF_SVR("MPC8567E",
8315
                    CPU_POWERPC_MPC8567E,     POWERPC_SVR_8567E,     e500v2),
8316
    /* MPC8568                                                               */
8317
    POWERPC_DEF_SVR("MPC8568",
8318
                    CPU_POWERPC_MPC8568,      POWERPC_SVR_8568,      e500v2),
8319
    /* MPC8568E                                                              */
8320
    POWERPC_DEF_SVR("MPC8568E",
8321
                    CPU_POWERPC_MPC8568E,     POWERPC_SVR_8568E,     e500v2),
8322
    /* MPC8572                                                               */
8323
    POWERPC_DEF_SVR("MPC8572",
8324
                    CPU_POWERPC_MPC8572,      POWERPC_SVR_8572,      e500v2),
8325
    /* MPC8572E                                                              */
8326
    POWERPC_DEF_SVR("MPC8572E",
8327
                    CPU_POWERPC_MPC8572E,     POWERPC_SVR_8572E,     e500v2),
8328
    /* e600 family                                                           */
8329
    /* PowerPC e600 core                                                     */
8330
    POWERPC_DEF("e600",          CPU_POWERPC_e600,                   7400),
8331
    /* PowerPC e600 microcontrollers                                         */
8332
#if defined (TODO)
8333
    /* MPC8610                                                               */
8334
    POWERPC_DEF_SVR("MPC8610",
8335
                    CPU_POWERPC_MPC8610,      POWERPC_SVR_8610,      7400),
8336
#endif
8337
    /* MPC8641                                                               */
8338
    POWERPC_DEF_SVR("MPC8641",
8339
                    CPU_POWERPC_MPC8641,      POWERPC_SVR_8641,      7400),
8340
    /* MPC8641D                                                              */
8341
    POWERPC_DEF_SVR("MPC8641D",
8342
                    CPU_POWERPC_MPC8641D,     POWERPC_SVR_8641D,     7400),
8343
    /* 32 bits "classic" PowerPC                                             */
8344
    /* PowerPC 6xx family                                                    */
8345
    /* PowerPC 601                                                           */
8346
    POWERPC_DEF("601",           CPU_POWERPC_601,                    601v),
8347
    /* PowerPC 601v0                                                         */
8348
    POWERPC_DEF("601_v0",        CPU_POWERPC_601_v0,                 601),
8349
    /* PowerPC 601v1                                                         */
8350
    POWERPC_DEF("601_v1",        CPU_POWERPC_601_v1,                 601),
8351
    /* PowerPC 601v                                                          */
8352
    POWERPC_DEF("601v",          CPU_POWERPC_601v,                   601v),
8353
    /* PowerPC 601v2                                                         */
8354
    POWERPC_DEF("601_v2",        CPU_POWERPC_601_v2,                 601v),
8355
    /* PowerPC 602                                                           */
8356
    POWERPC_DEF("602",           CPU_POWERPC_602,                    602),
8357
    /* PowerPC 603                                                           */
8358
    POWERPC_DEF("603",           CPU_POWERPC_603,                    603),
8359
    /* Code name for PowerPC 603                                             */
8360
    POWERPC_DEF("Vanilla",       CPU_POWERPC_603,                    603),
8361
    /* PowerPC 603e (aka PID6)                                               */
8362
    POWERPC_DEF("603e",          CPU_POWERPC_603E,                   603E),
8363
    /* Code name for PowerPC 603e                                            */
8364
    POWERPC_DEF("Stretch",       CPU_POWERPC_603E,                   603E),
8365
    /* PowerPC 603e v1.1                                                     */
8366
    POWERPC_DEF("603e_v1.1",     CPU_POWERPC_603E_v11,               603E),
8367
    /* PowerPC 603e v1.2                                                     */
8368
    POWERPC_DEF("603e_v1.2",     CPU_POWERPC_603E_v12,               603E),
8369
    /* PowerPC 603e v1.3                                                     */
8370
    POWERPC_DEF("603e_v1.3",     CPU_POWERPC_603E_v13,               603E),
8371
    /* PowerPC 603e v1.4                                                     */
8372
    POWERPC_DEF("603e_v1.4",     CPU_POWERPC_603E_v14,               603E),
8373
    /* PowerPC 603e v2.2                                                     */
8374
    POWERPC_DEF("603e_v2.2",     CPU_POWERPC_603E_v22,               603E),
8375
    /* PowerPC 603e v3                                                       */
8376
    POWERPC_DEF("603e_v3",       CPU_POWERPC_603E_v3,                603E),
8377
    /* PowerPC 603e v4                                                       */
8378
    POWERPC_DEF("603e_v4",       CPU_POWERPC_603E_v4,                603E),
8379
    /* PowerPC 603e v4.1                                                     */
8380
    POWERPC_DEF("603e_v4.1",     CPU_POWERPC_603E_v41,               603E),
8381
    /* PowerPC 603e (aka PID7)                                               */
8382
    POWERPC_DEF("603e7",         CPU_POWERPC_603E7,                  603E),
8383
    /* PowerPC 603e7t                                                        */
8384
    POWERPC_DEF("603e7t",        CPU_POWERPC_603E7t,                 603E),
8385
    /* PowerPC 603e7v                                                        */
8386
    POWERPC_DEF("603e7v",        CPU_POWERPC_603E7v,                 603E),
8387
    /* Code name for PowerPC 603ev                                           */
8388
    POWERPC_DEF("Vaillant",      CPU_POWERPC_603E7v,                 603E),
8389
    /* PowerPC 603e7v1                                                       */
8390
    POWERPC_DEF("603e7v1",       CPU_POWERPC_603E7v1,                603E),
8391
    /* PowerPC 603e7v2                                                       */
8392
    POWERPC_DEF("603e7v2",       CPU_POWERPC_603E7v2,                603E),
8393
    /* PowerPC 603p (aka PID7v)                                              */
8394
    POWERPC_DEF("603p",          CPU_POWERPC_603P,                   603E),
8395
    /* PowerPC 603r (aka PID7t)                                              */
8396
    POWERPC_DEF("603r",          CPU_POWERPC_603R,                   603E),
8397
    /* Code name for PowerPC 603r                                            */
8398
    POWERPC_DEF("Goldeneye",     CPU_POWERPC_603R,                   603E),
8399
    /* PowerPC 604                                                           */
8400
    POWERPC_DEF("604",           CPU_POWERPC_604,                    604),
8401
    /* PowerPC 604e (aka PID9)                                               */
8402
    POWERPC_DEF("604e",          CPU_POWERPC_604E,                   604E),
8403
    /* Code name for PowerPC 604e                                            */
8404
    POWERPC_DEF("Sirocco",       CPU_POWERPC_604E,                   604E),
8405
    /* PowerPC 604e v1.0                                                     */
8406
    POWERPC_DEF("604e_v1.0",     CPU_POWERPC_604E_v10,               604E),
8407
    /* PowerPC 604e v2.2                                                     */
8408
    POWERPC_DEF("604e_v2.2",     CPU_POWERPC_604E_v22,               604E),
8409
    /* PowerPC 604e v2.4                                                     */
8410
    POWERPC_DEF("604e_v2.4",     CPU_POWERPC_604E_v24,               604E),
8411
    /* PowerPC 604r (aka PIDA)                                               */
8412
    POWERPC_DEF("604r",          CPU_POWERPC_604R,                   604E),
8413
    /* Code name for PowerPC 604r                                            */
8414
    POWERPC_DEF("Mach5",         CPU_POWERPC_604R,                   604E),
8415
#if defined(TODO)
8416
    /* PowerPC 604ev                                                         */
8417
    POWERPC_DEF("604ev",         CPU_POWERPC_604EV,                  604E),
8418
#endif
8419
    /* PowerPC 7xx family                                                    */
8420
    /* Generic PowerPC 740 (G3)                                              */
8421
    POWERPC_DEF("740",           CPU_POWERPC_7x0,                    740),
8422
    /* Code name for PowerPC 740                                             */
8423
    POWERPC_DEF("Arthur",        CPU_POWERPC_7x0,                    740),
8424
    /* Generic PowerPC 750 (G3)                                              */
8425
    POWERPC_DEF("750",           CPU_POWERPC_7x0,                    750),
8426
    /* Code name for PowerPC 750                                             */
8427
    POWERPC_DEF("Typhoon",       CPU_POWERPC_7x0,                    750),
8428
    /* PowerPC 740/750 is also known as G3                                   */
8429
    POWERPC_DEF("G3",            CPU_POWERPC_7x0,                    750),
8430
    /* PowerPC 740 v1.0 (G3)                                                 */
8431
    POWERPC_DEF("740_v1.0",      CPU_POWERPC_7x0_v10,                740),
8432
    /* PowerPC 750 v1.0 (G3)                                                 */
8433
    POWERPC_DEF("750_v1.0",      CPU_POWERPC_7x0_v10,                750),
8434
    /* PowerPC 740 v2.0 (G3)                                                 */
8435
    POWERPC_DEF("740_v2.0",      CPU_POWERPC_7x0_v20,                740),
8436
    /* PowerPC 750 v2.0 (G3)                                                 */
8437
    POWERPC_DEF("750_v2.0",      CPU_POWERPC_7x0_v20,                750),
8438
    /* PowerPC 740 v2.1 (G3)                                                 */
8439
    POWERPC_DEF("740_v2.1",      CPU_POWERPC_7x0_v21,                740),
8440
    /* PowerPC 750 v2.1 (G3)                                                 */
8441
    POWERPC_DEF("750_v2.1",      CPU_POWERPC_7x0_v21,                750),
8442
    /* PowerPC 740 v2.2 (G3)                                                 */
8443
    POWERPC_DEF("740_v2.2",      CPU_POWERPC_7x0_v22,                740),
8444
    /* PowerPC 750 v2.2 (G3)                                                 */
8445
    POWERPC_DEF("750_v2.2",      CPU_POWERPC_7x0_v22,                750),
8446
    /* PowerPC 740 v3.0 (G3)                                                 */
8447
    POWERPC_DEF("740_v3.0",      CPU_POWERPC_7x0_v30,                740),
8448
    /* PowerPC 750 v3.0 (G3)                                                 */
8449
    POWERPC_DEF("750_v3.0",      CPU_POWERPC_7x0_v30,                750),
8450
    /* PowerPC 740 v3.1 (G3)                                                 */
8451
    POWERPC_DEF("740_v3.1",      CPU_POWERPC_7x0_v31,                740),
8452
    /* PowerPC 750 v3.1 (G3)                                                 */
8453
    POWERPC_DEF("750_v3.1",      CPU_POWERPC_7x0_v31,                750),
8454
    /* PowerPC 740E (G3)                                                     */
8455
    POWERPC_DEF("740e",          CPU_POWERPC_740E,                   740),
8456
    /* PowerPC 750E (G3)                                                     */
8457
    POWERPC_DEF("750e",          CPU_POWERPC_750E,                   750),
8458
    /* PowerPC 740P (G3)                                                     */
8459
    POWERPC_DEF("740p",          CPU_POWERPC_7x0P,                   740),
8460
    /* PowerPC 750P (G3)                                                     */
8461
    POWERPC_DEF("750p",          CPU_POWERPC_7x0P,                   750),
8462
    /* Code name for PowerPC 740P/750P (G3)                                  */
8463
    POWERPC_DEF("Conan/Doyle",   CPU_POWERPC_7x0P,                   750),
8464
    /* PowerPC 750CL (G3 embedded)                                           */
8465
    POWERPC_DEF("750cl",         CPU_POWERPC_750CL,                  750cl),
8466
    /* PowerPC 750CL v1.0                                                    */
8467
    POWERPC_DEF("750cl_v1.0",    CPU_POWERPC_750CL_v10,              750cl),
8468
    /* PowerPC 750CL v2.0                                                    */
8469
    POWERPC_DEF("750cl_v2.0",    CPU_POWERPC_750CL_v20,              750cl),
8470
    /* PowerPC 750CX (G3 embedded)                                           */
8471
    POWERPC_DEF("750cx",         CPU_POWERPC_750CX,                  750cx),
8472
    /* PowerPC 750CX v1.0 (G3 embedded)                                      */
8473
    POWERPC_DEF("750cx_v1.0",    CPU_POWERPC_750CX_v10,              750cx),
8474
    /* PowerPC 750CX v2.1 (G3 embedded)                                      */
8475
    POWERPC_DEF("750cx_v2.0",    CPU_POWERPC_750CX_v20,              750cx),
8476
    /* PowerPC 750CX v2.1 (G3 embedded)                                      */
8477
    POWERPC_DEF("750cx_v2.1",    CPU_POWERPC_750CX_v21,              750cx),
8478
    /* PowerPC 750CX v2.2 (G3 embedded)                                      */
8479
    POWERPC_DEF("750cx_v2.2",    CPU_POWERPC_750CX_v22,              750cx),
8480
    /* PowerPC 750CXe (G3 embedded)                                          */
8481
    POWERPC_DEF("750cxe",        CPU_POWERPC_750CXE,                 750cx),
8482
    /* PowerPC 750CXe v2.1 (G3 embedded)                                     */
8483
    POWERPC_DEF("750cxe_v2.1",   CPU_POWERPC_750CXE_v21,             750cx),
8484
    /* PowerPC 750CXe v2.2 (G3 embedded)                                     */
8485
    POWERPC_DEF("750cxe_v2.2",   CPU_POWERPC_750CXE_v22,             750cx),
8486
    /* PowerPC 750CXe v2.3 (G3 embedded)                                     */
8487
    POWERPC_DEF("750cxe_v2.3",   CPU_POWERPC_750CXE_v23,             750cx),
8488
    /* PowerPC 750CXe v2.4 (G3 embedded)                                     */
8489
    POWERPC_DEF("750cxe_v2.4",   CPU_POWERPC_750CXE_v24,             750cx),
8490
    /* PowerPC 750CXe v2.4b (G3 embedded)                                    */
8491
    POWERPC_DEF("750cxe_v2.4b",  CPU_POWERPC_750CXE_v24b,            750cx),
8492
    /* PowerPC 750CXe v3.0 (G3 embedded)                                     */
8493
    POWERPC_DEF("750cxe_v3.0",   CPU_POWERPC_750CXE_v30,             750cx),
8494
    /* PowerPC 750CXe v3.1 (G3 embedded)                                     */
8495
    POWERPC_DEF("750cxe_v3.1",   CPU_POWERPC_750CXE_v31,             750cx),
8496
    /* PowerPC 750CXe v3.1b (G3 embedded)                                    */
8497
    POWERPC_DEF("750cxe_v3.1b",  CPU_POWERPC_750CXE_v31b,            750cx),
8498
    /* PowerPC 750CXr (G3 embedded)                                          */
8499
    POWERPC_DEF("750cxr",        CPU_POWERPC_750CXR,                 750cx),
8500
    /* PowerPC 750FL (G3 embedded)                                           */
8501
    POWERPC_DEF("750fl",         CPU_POWERPC_750FL,                  750fx),
8502
    /* PowerPC 750FX (G3 embedded)                                           */
8503
    POWERPC_DEF("750fx",         CPU_POWERPC_750FX,                  750fx),
8504
    /* PowerPC 750FX v1.0 (G3 embedded)                                      */
8505
    POWERPC_DEF("750fx_v1.0",    CPU_POWERPC_750FX_v10,              750fx),
8506
    /* PowerPC 750FX v2.0 (G3 embedded)                                      */
8507
    POWERPC_DEF("750fx_v2.0",    CPU_POWERPC_750FX_v20,              750fx),
8508
    /* PowerPC 750FX v2.1 (G3 embedded)                                      */
8509
    POWERPC_DEF("750fx_v2.1",    CPU_POWERPC_750FX_v21,              750fx),
8510
    /* PowerPC 750FX v2.2 (G3 embedded)                                      */
8511
    POWERPC_DEF("750fx_v2.2",    CPU_POWERPC_750FX_v22,              750fx),
8512
    /* PowerPC 750FX v2.3 (G3 embedded)                                      */
8513
    POWERPC_DEF("750fx_v2.3",    CPU_POWERPC_750FX_v23,              750fx),
8514
    /* PowerPC 750GL (G3 embedded)                                           */
8515
    POWERPC_DEF("750gl",         CPU_POWERPC_750GL,                  750gx),
8516
    /* PowerPC 750GX (G3 embedded)                                           */
8517
    POWERPC_DEF("750gx",         CPU_POWERPC_750GX,                  750gx),
8518
    /* PowerPC 750GX v1.0 (G3 embedded)                                      */
8519
    POWERPC_DEF("750gx_v1.0",    CPU_POWERPC_750GX_v10,              750gx),
8520
    /* PowerPC 750GX v1.1 (G3 embedded)                                      */
8521
    POWERPC_DEF("750gx_v1.1",    CPU_POWERPC_750GX_v11,              750gx),
8522
    /* PowerPC 750GX v1.2 (G3 embedded)                                      */
8523
    POWERPC_DEF("750gx_v1.2",    CPU_POWERPC_750GX_v12,              750gx),
8524
    /* PowerPC 750L (G3 embedded)                                            */
8525
    POWERPC_DEF("750l",          CPU_POWERPC_750L,                   750),
8526
    /* Code name for PowerPC 750L (G3 embedded)                              */
8527
    POWERPC_DEF("LoneStar",      CPU_POWERPC_750L,                   750),
8528
    /* PowerPC 750L v2.0 (G3 embedded)                                       */
8529
    POWERPC_DEF("750l_v2.0",     CPU_POWERPC_750L_v20,               750),
8530
    /* PowerPC 750L v2.1 (G3 embedded)                                       */
8531
    POWERPC_DEF("750l_v2.1",     CPU_POWERPC_750L_v21,               750),
8532
    /* PowerPC 750L v2.2 (G3 embedded)                                       */
8533
    POWERPC_DEF("750l_v2.2",     CPU_POWERPC_750L_v22,               750),
8534
    /* PowerPC 750L v3.0 (G3 embedded)                                       */
8535
    POWERPC_DEF("750l_v3.0",     CPU_POWERPC_750L_v30,               750),
8536
    /* PowerPC 750L v3.2 (G3 embedded)                                       */
8537
    POWERPC_DEF("750l_v3.2",     CPU_POWERPC_750L_v32,               750),
8538
    /* Generic PowerPC 745                                                   */
8539
    POWERPC_DEF("745",           CPU_POWERPC_7x5,                    745),
8540
    /* Generic PowerPC 755                                                   */
8541
    POWERPC_DEF("755",           CPU_POWERPC_7x5,                    755),
8542
    /* Code name for PowerPC 745/755                                         */
8543
    POWERPC_DEF("Goldfinger",    CPU_POWERPC_7x5,                    755),
8544
    /* PowerPC 745 v1.0                                                      */
8545
    POWERPC_DEF("745_v1.0",      CPU_POWERPC_7x5_v10,                745),
8546
    /* PowerPC 755 v1.0                                                      */
8547
    POWERPC_DEF("755_v1.0",      CPU_POWERPC_7x5_v10,                755),
8548
    /* PowerPC 745 v1.1                                                      */
8549
    POWERPC_DEF("745_v1.1",      CPU_POWERPC_7x5_v11,                745),
8550
    /* PowerPC 755 v1.1                                                      */
8551
    POWERPC_DEF("755_v1.1",      CPU_POWERPC_7x5_v11,                755),
8552
    /* PowerPC 745 v2.0                                                      */
8553
    POWERPC_DEF("745_v2.0",      CPU_POWERPC_7x5_v20,                745),
8554
    /* PowerPC 755 v2.0                                                      */
8555
    POWERPC_DEF("755_v2.0",      CPU_POWERPC_7x5_v20,                755),
8556
    /* PowerPC 745 v2.1                                                      */
8557
    POWERPC_DEF("745_v2.1",      CPU_POWERPC_7x5_v21,                745),
8558
    /* PowerPC 755 v2.1                                                      */
8559
    POWERPC_DEF("755_v2.1",      CPU_POWERPC_7x5_v21,                755),
8560
    /* PowerPC 745 v2.2                                                      */
8561
    POWERPC_DEF("745_v2.2",      CPU_POWERPC_7x5_v22,                745),
8562
    /* PowerPC 755 v2.2                                                      */
8563
    POWERPC_DEF("755_v2.2",      CPU_POWERPC_7x5_v22,                755),
8564
    /* PowerPC 745 v2.3                                                      */
8565
    POWERPC_DEF("745_v2.3",      CPU_POWERPC_7x5_v23,                745),
8566
    /* PowerPC 755 v2.3                                                      */
8567
    POWERPC_DEF("755_v2.3",      CPU_POWERPC_7x5_v23,                755),
8568
    /* PowerPC 745 v2.4                                                      */
8569
    POWERPC_DEF("745_v2.4",      CPU_POWERPC_7x5_v24,                745),
8570
    /* PowerPC 755 v2.4                                                      */
8571
    POWERPC_DEF("755_v2.4",      CPU_POWERPC_7x5_v24,                755),
8572
    /* PowerPC 745 v2.5                                                      */
8573
    POWERPC_DEF("745_v2.5",      CPU_POWERPC_7x5_v25,                745),
8574
    /* PowerPC 755 v2.5                                                      */
8575
    POWERPC_DEF("755_v2.5",      CPU_POWERPC_7x5_v25,                755),
8576
    /* PowerPC 745 v2.6                                                      */
8577
    POWERPC_DEF("745_v2.6",      CPU_POWERPC_7x5_v26,                745),
8578
    /* PowerPC 755 v2.6                                                      */
8579
    POWERPC_DEF("755_v2.6",      CPU_POWERPC_7x5_v26,                755),
8580
    /* PowerPC 745 v2.7                                                      */
8581
    POWERPC_DEF("745_v2.7",      CPU_POWERPC_7x5_v27,                745),
8582
    /* PowerPC 755 v2.7                                                      */
8583
    POWERPC_DEF("755_v2.7",      CPU_POWERPC_7x5_v27,                755),
8584
    /* PowerPC 745 v2.8                                                      */
8585
    POWERPC_DEF("745_v2.8",      CPU_POWERPC_7x5_v28,                745),
8586
    /* PowerPC 755 v2.8                                                      */
8587
    POWERPC_DEF("755_v2.8",      CPU_POWERPC_7x5_v28,                755),
8588
#if defined (TODO)
8589
    /* PowerPC 745P (G3)                                                     */
8590
    POWERPC_DEF("745p",          CPU_POWERPC_7x5P,                   745),
8591
    /* PowerPC 755P (G3)                                                     */
8592
    POWERPC_DEF("755p",          CPU_POWERPC_7x5P,                   755),
8593
#endif
8594
    /* PowerPC 74xx family                                                   */
8595
    /* PowerPC 7400 (G4)                                                     */
8596
    POWERPC_DEF("7400",          CPU_POWERPC_7400,                   7400),
8597
    /* Code name for PowerPC 7400                                            */
8598
    POWERPC_DEF("Max",           CPU_POWERPC_7400,                   7400),
8599
    /* PowerPC 74xx is also well known as G4                                 */
8600
    POWERPC_DEF("G4",            CPU_POWERPC_7400,                   7400),
8601
    /* PowerPC 7400 v1.0 (G4)                                                */
8602
    POWERPC_DEF("7400_v1.0",     CPU_POWERPC_7400_v10,               7400),
8603
    /* PowerPC 7400 v1.1 (G4)                                                */
8604
    POWERPC_DEF("7400_v1.1",     CPU_POWERPC_7400_v11,               7400),
8605
    /* PowerPC 7400 v2.0 (G4)                                                */
8606
    POWERPC_DEF("7400_v2.0",     CPU_POWERPC_7400_v20,               7400),
8607
    /* PowerPC 7400 v2.1 (G4)                                                */
8608
    POWERPC_DEF("7400_v2.1",     CPU_POWERPC_7400_v21,               7400),
8609
    /* PowerPC 7400 v2.2 (G4)                                                */
8610
    POWERPC_DEF("7400_v2.2",     CPU_POWERPC_7400_v22,               7400),
8611
    /* PowerPC 7400 v2.6 (G4)                                                */
8612
    POWERPC_DEF("7400_v2.6",     CPU_POWERPC_7400_v26,               7400),
8613
    /* PowerPC 7400 v2.7 (G4)                                                */
8614
    POWERPC_DEF("7400_v2.7",     CPU_POWERPC_7400_v27,               7400),
8615
    /* PowerPC 7400 v2.8 (G4)                                                */
8616
    POWERPC_DEF("7400_v2.8",     CPU_POWERPC_7400_v28,               7400),
8617
    /* PowerPC 7400 v2.9 (G4)                                                */
8618
    POWERPC_DEF("7400_v2.9",     CPU_POWERPC_7400_v29,               7400),
8619
    /* PowerPC 7410 (G4)                                                     */
8620
    POWERPC_DEF("7410",          CPU_POWERPC_7410,                   7410),
8621
    /* Code name for PowerPC 7410                                            */
8622
    POWERPC_DEF("Nitro",         CPU_POWERPC_7410,                   7410),
8623
    /* PowerPC 7410 v1.0 (G4)                                                */
8624
    POWERPC_DEF("7410_v1.0",     CPU_POWERPC_7410_v10,               7410),
8625
    /* PowerPC 7410 v1.1 (G4)                                                */
8626
    POWERPC_DEF("7410_v1.1",     CPU_POWERPC_7410_v11,               7410),
8627
    /* PowerPC 7410 v1.2 (G4)                                                */
8628
    POWERPC_DEF("7410_v1.2",     CPU_POWERPC_7410_v12,               7410),
8629
    /* PowerPC 7410 v1.3 (G4)                                                */
8630
    POWERPC_DEF("7410_v1.3",     CPU_POWERPC_7410_v13,               7410),
8631
    /* PowerPC 7410 v1.4 (G4)                                                */
8632
    POWERPC_DEF("7410_v1.4",     CPU_POWERPC_7410_v14,               7410),
8633
    /* PowerPC 7448 (G4)                                                     */
8634
    POWERPC_DEF("7448",          CPU_POWERPC_7448,                   7400),
8635
    /* PowerPC 7448 v1.0 (G4)                                                */
8636
    POWERPC_DEF("7448_v1.0",     CPU_POWERPC_7448_v10,               7400),
8637
    /* PowerPC 7448 v1.1 (G4)                                                */
8638
    POWERPC_DEF("7448_v1.1",     CPU_POWERPC_7448_v11,               7400),
8639
    /* PowerPC 7448 v2.0 (G4)                                                */
8640
    POWERPC_DEF("7448_v2.0",     CPU_POWERPC_7448_v20,               7400),
8641
    /* PowerPC 7448 v2.1 (G4)                                                */
8642
    POWERPC_DEF("7448_v2.1",     CPU_POWERPC_7448_v21,               7400),
8643
    /* PowerPC 7450 (G4)                                                     */
8644
    POWERPC_DEF("7450",          CPU_POWERPC_7450,                   7450),
8645
    /* Code name for PowerPC 7450                                            */
8646
    POWERPC_DEF("Vger",          CPU_POWERPC_7450,                   7450),
8647
    /* PowerPC 7450 v1.0 (G4)                                                */
8648
    POWERPC_DEF("7450_v1.0",     CPU_POWERPC_7450_v10,               7450),
8649
    /* PowerPC 7450 v1.1 (G4)                                                */
8650
    POWERPC_DEF("7450_v1.1",     CPU_POWERPC_7450_v11,               7450),
8651
    /* PowerPC 7450 v1.2 (G4)                                                */
8652
    POWERPC_DEF("7450_v1.2",     CPU_POWERPC_7450_v12,               7450),
8653
    /* PowerPC 7450 v2.0 (G4)                                                */
8654
    POWERPC_DEF("7450_v2.0",     CPU_POWERPC_7450_v20,               7450),
8655
    /* PowerPC 7450 v2.1 (G4)                                                */
8656
    POWERPC_DEF("7450_v2.1",     CPU_POWERPC_7450_v21,               7450),
8657
    /* PowerPC 7441 (G4)                                                     */
8658
    POWERPC_DEF("7441",          CPU_POWERPC_74x1,                   7440),
8659
    /* PowerPC 7451 (G4)                                                     */
8660
    POWERPC_DEF("7451",          CPU_POWERPC_74x1,                   7450),
8661
    /* PowerPC 7441 v2.1 (G4)                                                */
8662
    POWERPC_DEF("7441_v2.1",     CPU_POWERPC_7450_v21,               7440),
8663
    /* PowerPC 7441 v2.3 (G4)                                                */
8664
    POWERPC_DEF("7441_v2.3",     CPU_POWERPC_74x1_v23,               7440),
8665
    /* PowerPC 7451 v2.3 (G4)                                                */
8666
    POWERPC_DEF("7451_v2.3",     CPU_POWERPC_74x1_v23,               7450),
8667
    /* PowerPC 7441 v2.10 (G4)                                                */
8668
    POWERPC_DEF("7441_v2.10",    CPU_POWERPC_74x1_v210,              7440),
8669
    /* PowerPC 7451 v2.10 (G4)                                               */
8670
    POWERPC_DEF("7451_v2.10",    CPU_POWERPC_74x1_v210,              7450),
8671
    /* PowerPC 7445 (G4)                                                     */
8672
    POWERPC_DEF("7445",          CPU_POWERPC_74x5,                   7445),
8673
    /* PowerPC 7455 (G4)                                                     */
8674
    POWERPC_DEF("7455",          CPU_POWERPC_74x5,                   7455),
8675
    /* Code name for PowerPC 7445/7455                                       */
8676
    POWERPC_DEF("Apollo6",       CPU_POWERPC_74x5,                   7455),
8677
    /* PowerPC 7445 v1.0 (G4)                                                */
8678
    POWERPC_DEF("7445_v1.0",     CPU_POWERPC_74x5_v10,               7445),
8679
    /* PowerPC 7455 v1.0 (G4)                                                */
8680
    POWERPC_DEF("7455_v1.0",     CPU_POWERPC_74x5_v10,               7455),
8681
    /* PowerPC 7445 v2.1 (G4)                                                */
8682
    POWERPC_DEF("7445_v2.1",     CPU_POWERPC_74x5_v21,               7445),
8683
    /* PowerPC 7455 v2.1 (G4)                                                */
8684
    POWERPC_DEF("7455_v2.1",     CPU_POWERPC_74x5_v21,               7455),
8685
    /* PowerPC 7445 v3.2 (G4)                                                */
8686
    POWERPC_DEF("7445_v3.2",     CPU_POWERPC_74x5_v32,               7445),
8687
    /* PowerPC 7455 v3.2 (G4)                                                */
8688
    POWERPC_DEF("7455_v3.2",     CPU_POWERPC_74x5_v32,               7455),
8689
    /* PowerPC 7445 v3.3 (G4)                                                */
8690
    POWERPC_DEF("7445_v3.3",     CPU_POWERPC_74x5_v33,               7445),
8691
    /* PowerPC 7455 v3.3 (G4)                                                */
8692
    POWERPC_DEF("7455_v3.3",     CPU_POWERPC_74x5_v33,               7455),
8693
    /* PowerPC 7445 v3.4 (G4)                                                */
8694
    POWERPC_DEF("7445_v3.4",     CPU_POWERPC_74x5_v34,               7445),
8695
    /* PowerPC 7455 v3.4 (G4)                                                */
8696
    POWERPC_DEF("7455_v3.4",     CPU_POWERPC_74x5_v34,               7455),
8697
    /* PowerPC 7447 (G4)                                                     */
8698
    POWERPC_DEF("7447",          CPU_POWERPC_74x7,                   7445),
8699
    /* PowerPC 7457 (G4)                                                     */
8700
    POWERPC_DEF("7457",          CPU_POWERPC_74x7,                   7455),
8701
    /* Code name for PowerPC 7447/7457                                       */
8702
    POWERPC_DEF("Apollo7",       CPU_POWERPC_74x7,                   7455),
8703
    /* PowerPC 7447 v1.0 (G4)                                                */
8704
    POWERPC_DEF("7447_v1.0",     CPU_POWERPC_74x7_v10,               7445),
8705
    /* PowerPC 7457 v1.0 (G4)                                                */
8706
    POWERPC_DEF("7457_v1.0",     CPU_POWERPC_74x7_v10,               7455),
8707
    /* PowerPC 7447 v1.1 (G4)                                                */
8708
    POWERPC_DEF("7447_v1.1",     CPU_POWERPC_74x7_v11,               7445),
8709
    /* PowerPC 7457 v1.1 (G4)                                                */
8710
    POWERPC_DEF("7457_v1.1",     CPU_POWERPC_74x7_v11,               7455),
8711
    /* PowerPC 7457 v1.2 (G4)                                                */
8712
    POWERPC_DEF("7457_v1.2",     CPU_POWERPC_74x7_v12,               7455),
8713
    /* PowerPC 7447A (G4)                                                    */
8714
    POWERPC_DEF("7447A",         CPU_POWERPC_74x7A,                  7445),
8715
    /* PowerPC 7457A (G4)                                                    */
8716
    POWERPC_DEF("7457A",         CPU_POWERPC_74x7A,                  7455),
8717
    /* PowerPC 7447A v1.0 (G4)                                               */
8718
    POWERPC_DEF("7447A_v1.0",    CPU_POWERPC_74x7A_v10,              7445),
8719
    /* PowerPC 7457A v1.0 (G4)                                               */
8720
    POWERPC_DEF("7457A_v1.0",    CPU_POWERPC_74x7A_v10,              7455),
8721
    /* Code name for PowerPC 7447A/7457A                                     */
8722
    POWERPC_DEF("Apollo7PM",     CPU_POWERPC_74x7A_v10,              7455),
8723
    /* PowerPC 7447A v1.1 (G4)                                               */
8724
    POWERPC_DEF("7447A_v1.1",    CPU_POWERPC_74x7A_v11,              7445),
8725
    /* PowerPC 7457A v1.1 (G4)                                               */
8726
    POWERPC_DEF("7457A_v1.1",    CPU_POWERPC_74x7A_v11,              7455),
8727
    /* PowerPC 7447A v1.2 (G4)                                               */
8728
    POWERPC_DEF("7447A_v1.2",    CPU_POWERPC_74x7A_v12,              7445),
8729
    /* PowerPC 7457A v1.2 (G4)                                               */
8730
    POWERPC_DEF("7457A_v1.2",    CPU_POWERPC_74x7A_v12,              7455),
8731
    /* 64 bits PowerPC                                                       */
8732
#if defined (TARGET_PPC64)
8733
    /* PowerPC 620                                                           */
8734
    POWERPC_DEF("620",           CPU_POWERPC_620,                    620),
8735
    /* Code name for PowerPC 620                                             */
8736
    POWERPC_DEF("Trident",       CPU_POWERPC_620,                    620),
8737
#if defined (TODO)
8738
    /* PowerPC 630 (POWER3)                                                  */
8739
    POWERPC_DEF("630",           CPU_POWERPC_630,                    630),
8740
    POWERPC_DEF("POWER3",        CPU_POWERPC_630,                    630),
8741
    /* Code names for POWER3                                                 */
8742
    POWERPC_DEF("Boxer",         CPU_POWERPC_630,                    630),
8743
    POWERPC_DEF("Dino",          CPU_POWERPC_630,                    630),
8744
#endif
8745
#if defined (TODO)
8746
    /* PowerPC 631 (Power 3+)                                                */
8747
    POWERPC_DEF("631",           CPU_POWERPC_631,                    631),
8748
    POWERPC_DEF("POWER3+",       CPU_POWERPC_631,                    631),
8749
#endif
8750
#if defined (TODO)
8751
    /* POWER4                                                                */
8752
    POWERPC_DEF("POWER4",        CPU_POWERPC_POWER4,                 POWER4),
8753
#endif
8754
#if defined (TODO)
8755
    /* POWER4p                                                               */
8756
    POWERPC_DEF("POWER4+",       CPU_POWERPC_POWER4P,                POWER4P),
8757
#endif
8758
#if defined (TODO)
8759
    /* POWER5                                                                */
8760
    POWERPC_DEF("POWER5",        CPU_POWERPC_POWER5,                 POWER5),
8761
    /* POWER5GR                                                              */
8762
    POWERPC_DEF("POWER5gr",      CPU_POWERPC_POWER5GR,               POWER5),
8763
#endif
8764
#if defined (TODO)
8765
    /* POWER5+                                                               */
8766
    POWERPC_DEF("POWER5+",       CPU_POWERPC_POWER5P,                POWER5P),
8767
    /* POWER5GS                                                              */
8768
    POWERPC_DEF("POWER5gs",      CPU_POWERPC_POWER5GS,               POWER5P),
8769
#endif
8770
#if defined (TODO)
8771
    /* POWER6                                                                */
8772
    POWERPC_DEF("POWER6",        CPU_POWERPC_POWER6,                 POWER6),
8773
    /* POWER6 running in POWER5 mode                                         */
8774
    POWERPC_DEF("POWER6_5",      CPU_POWERPC_POWER6_5,               POWER5),
8775
    /* POWER6A                                                               */
8776
    POWERPC_DEF("POWER6A",       CPU_POWERPC_POWER6A,                POWER6),
8777
#endif
8778
    /* PowerPC 970                                                           */
8779
    POWERPC_DEF("970",           CPU_POWERPC_970,                    970),
8780
    /* PowerPC 970FX (G5)                                                    */
8781
    POWERPC_DEF("970fx",         CPU_POWERPC_970FX,                  970FX),
8782
    /* PowerPC 970FX v1.0 (G5)                                               */
8783
    POWERPC_DEF("970fx_v1.0",    CPU_POWERPC_970FX_v10,              970FX),
8784
    /* PowerPC 970FX v2.0 (G5)                                               */
8785
    POWERPC_DEF("970fx_v2.0",    CPU_POWERPC_970FX_v20,              970FX),
8786
    /* PowerPC 970FX v2.1 (G5)                                               */
8787
    POWERPC_DEF("970fx_v2.1",    CPU_POWERPC_970FX_v21,              970FX),
8788
    /* PowerPC 970FX v3.0 (G5)                                               */
8789
    POWERPC_DEF("970fx_v3.0",    CPU_POWERPC_970FX_v30,              970FX),
8790
    /* PowerPC 970FX v3.1 (G5)                                               */
8791
    POWERPC_DEF("970fx_v3.1",    CPU_POWERPC_970FX_v31,              970FX),
8792
    /* PowerPC 970GX (G5)                                                    */
8793
    POWERPC_DEF("970gx",         CPU_POWERPC_970GX,                  970GX),
8794
    /* PowerPC 970MP                                                         */
8795
    POWERPC_DEF("970mp",         CPU_POWERPC_970MP,                  970MP),
8796
    /* PowerPC 970MP v1.0                                                    */
8797
    POWERPC_DEF("970mp_v1.0",    CPU_POWERPC_970MP_v10,              970MP),
8798
    /* PowerPC 970MP v1.1                                                    */
8799
    POWERPC_DEF("970mp_v1.1",    CPU_POWERPC_970MP_v11,              970MP),
8800
#if defined (TODO)
8801
    /* PowerPC Cell                                                          */
8802
    POWERPC_DEF("Cell",          CPU_POWERPC_CELL,                   970),
8803
#endif
8804
#if defined (TODO)
8805
    /* PowerPC Cell v1.0                                                     */
8806
    POWERPC_DEF("Cell_v1.0",     CPU_POWERPC_CELL_v10,               970),
8807
#endif
8808
#if defined (TODO)
8809
    /* PowerPC Cell v2.0                                                     */
8810
    POWERPC_DEF("Cell_v2.0",     CPU_POWERPC_CELL_v20,               970),
8811
#endif
8812
#if defined (TODO)
8813
    /* PowerPC Cell v3.0                                                     */
8814
    POWERPC_DEF("Cell_v3.0",     CPU_POWERPC_CELL_v30,               970),
8815
#endif
8816
#if defined (TODO)
8817
    /* PowerPC Cell v3.1                                                     */
8818
    POWERPC_DEF("Cell_v3.1",     CPU_POWERPC_CELL_v31,               970),
8819
#endif
8820
#if defined (TODO)
8821
    /* PowerPC Cell v3.2                                                     */
8822
    POWERPC_DEF("Cell_v3.2",     CPU_POWERPC_CELL_v32,               970),
8823
#endif
8824
#if defined (TODO)
8825
    /* RS64 (Apache/A35)                                                     */
8826
    /* This one seems to support the whole POWER2 instruction set
8827
     * and the PowerPC 64 one.
8828
     */
8829
    /* What about A10 & A30 ? */
8830
    POWERPC_DEF("RS64",          CPU_POWERPC_RS64,                   RS64),
8831
    POWERPC_DEF("Apache",        CPU_POWERPC_RS64,                   RS64),
8832
    POWERPC_DEF("A35",           CPU_POWERPC_RS64,                   RS64),
8833
#endif
8834
#if defined (TODO)
8835
    /* RS64-II (NorthStar/A50)                                               */
8836
    POWERPC_DEF("RS64-II",       CPU_POWERPC_RS64II,                 RS64),
8837
    POWERPC_DEF("NorthStar",     CPU_POWERPC_RS64II,                 RS64),
8838
    POWERPC_DEF("A50",           CPU_POWERPC_RS64II,                 RS64),
8839
#endif
8840
#if defined (TODO)
8841
    /* RS64-III (Pulsar)                                                     */
8842
    POWERPC_DEF("RS64-III",      CPU_POWERPC_RS64III,                RS64),
8843
    POWERPC_DEF("Pulsar",        CPU_POWERPC_RS64III,                RS64),
8844
#endif
8845
#if defined (TODO)
8846
    /* RS64-IV (IceStar/IStar/SStar)                                         */
8847
    POWERPC_DEF("RS64-IV",       CPU_POWERPC_RS64IV,                 RS64),
8848
    POWERPC_DEF("IceStar",       CPU_POWERPC_RS64IV,                 RS64),
8849
    POWERPC_DEF("IStar",         CPU_POWERPC_RS64IV,                 RS64),
8850
    POWERPC_DEF("SStar",         CPU_POWERPC_RS64IV,                 RS64),
8851
#endif
8852
#endif /* defined (TARGET_PPC64) */
8853
    /* POWER                                                                 */
8854
#if defined (TODO)
8855
    /* Original POWER                                                        */
8856
    POWERPC_DEF("POWER",         CPU_POWERPC_POWER,                  POWER),
8857
    POWERPC_DEF("RIOS",          CPU_POWERPC_POWER,                  POWER),
8858
    POWERPC_DEF("RSC",           CPU_POWERPC_POWER,                  POWER),
8859
    POWERPC_DEF("RSC3308",       CPU_POWERPC_POWER,                  POWER),
8860
    POWERPC_DEF("RSC4608",       CPU_POWERPC_POWER,                  POWER),
8861
#endif
8862
#if defined (TODO)
8863
    /* POWER2                                                                */
8864
    POWERPC_DEF("POWER2",        CPU_POWERPC_POWER2,                 POWER),
8865
    POWERPC_DEF("RSC2",          CPU_POWERPC_POWER2,                 POWER),
8866
    POWERPC_DEF("P2SC",          CPU_POWERPC_POWER2,                 POWER),
8867
#endif
8868
    /* PA semi cores                                                         */
8869
#if defined (TODO)
8870
    /* PA PA6T */
8871
    POWERPC_DEF("PA6T",          CPU_POWERPC_PA6T,                   PA6T),
8872
#endif
8873
    /* Generic PowerPCs                                                      */
8874
#if defined (TARGET_PPC64)
8875
    POWERPC_DEF("ppc64",         CPU_POWERPC_PPC64,                  PPC64),
8876
#endif
8877
    POWERPC_DEF("ppc32",         CPU_POWERPC_PPC32,                  PPC32),
8878
    POWERPC_DEF("ppc",           CPU_POWERPC_DEFAULT,                DEFAULT),
8879
    /* Fallback                                                              */
8880
    POWERPC_DEF("default",       CPU_POWERPC_DEFAULT,                DEFAULT),
8881
};
8882

    
8883
/*****************************************************************************/
8884
/* Generic CPU instanciation routine                                         */
8885
static void init_ppc_proc (CPUPPCState *env, const ppc_def_t *def)
8886
{
8887
#if !defined(CONFIG_USER_ONLY)
8888
    int i;
8889

    
8890
    env->irq_inputs = NULL;
8891
    /* Set all exception vectors to an invalid address */
8892
    for (i = 0; i < POWERPC_EXCP_NB; i++)
8893
        env->excp_vectors[i] = (target_ulong)(-1ULL);
8894
    env->hreset_excp_prefix = 0x00000000;
8895
    env->ivor_mask = 0x00000000;
8896
    env->ivpr_mask = 0x00000000;
8897
    /* Default MMU definitions */
8898
    env->nb_BATs = 0;
8899
    env->nb_tlb = 0;
8900
    env->nb_ways = 0;
8901
#endif
8902
    /* Register SPR common to all PowerPC implementations */
8903
    gen_spr_generic(env);
8904
    spr_register(env, SPR_PVR, "PVR",
8905
                 /* Linux permits userspace to read PVR */
8906
#if defined(CONFIG_LINUX_USER)
8907
                 &spr_read_generic,
8908
#else
8909
                 SPR_NOACCESS,
8910
#endif
8911
                 SPR_NOACCESS,
8912
                 &spr_read_generic, SPR_NOACCESS,
8913
                 def->pvr);
8914
    /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
8915
    if (def->svr != POWERPC_SVR_NONE) {
8916
        if (def->svr & POWERPC_SVR_E500) {
8917
            spr_register(env, SPR_E500_SVR, "SVR",
8918
                         SPR_NOACCESS, SPR_NOACCESS,
8919
                         &spr_read_generic, SPR_NOACCESS,
8920
                         def->svr & ~POWERPC_SVR_E500);
8921
        } else {
8922
            spr_register(env, SPR_SVR, "SVR",
8923
                         SPR_NOACCESS, SPR_NOACCESS,
8924
                         &spr_read_generic, SPR_NOACCESS,
8925
                         def->svr);
8926
        }
8927
    }
8928
    /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
8929
    (*def->init_proc)(env);
8930
#if !defined(CONFIG_USER_ONLY)
8931
    env->excp_prefix = env->hreset_excp_prefix;
8932
#endif
8933
    /* MSR bits & flags consistency checks */
8934
    if (env->msr_mask & (1 << 25)) {
8935
        switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
8936
        case POWERPC_FLAG_SPE:
8937
        case POWERPC_FLAG_VRE:
8938
            break;
8939
        default:
8940
            fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8941
                    "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
8942
            exit(1);
8943
        }
8944
    } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
8945
        fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8946
                "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
8947
        exit(1);
8948
    }
8949
    if (env->msr_mask & (1 << 17)) {
8950
        switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
8951
        case POWERPC_FLAG_TGPR:
8952
        case POWERPC_FLAG_CE:
8953
            break;
8954
        default:
8955
            fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8956
                    "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
8957
            exit(1);
8958
        }
8959
    } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
8960
        fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8961
                "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
8962
        exit(1);
8963
    }
8964
    if (env->msr_mask & (1 << 10)) {
8965
        switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
8966
                              POWERPC_FLAG_UBLE)) {
8967
        case POWERPC_FLAG_SE:
8968
        case POWERPC_FLAG_DWE:
8969
        case POWERPC_FLAG_UBLE:
8970
            break;
8971
        default:
8972
            fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8973
                    "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
8974
                    "POWERPC_FLAG_UBLE\n");
8975
            exit(1);
8976
        }
8977
    } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
8978
                             POWERPC_FLAG_UBLE)) {
8979
        fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8980
                "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
8981
                "POWERPC_FLAG_UBLE\n");
8982
            exit(1);
8983
    }
8984
    if (env->msr_mask & (1 << 9)) {
8985
        switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
8986
        case POWERPC_FLAG_BE:
8987
        case POWERPC_FLAG_DE:
8988
            break;
8989
        default:
8990
            fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8991
                    "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
8992
            exit(1);
8993
        }
8994
    } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
8995
        fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8996
                "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
8997
        exit(1);
8998
    }
8999
    if (env->msr_mask & (1 << 2)) {
9000
        switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9001
        case POWERPC_FLAG_PX:
9002
        case POWERPC_FLAG_PMM:
9003
            break;
9004
        default:
9005
            fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9006
                    "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
9007
            exit(1);
9008
        }
9009
    } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9010
        fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9011
                "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
9012
        exit(1);
9013
    }
9014
    if ((env->flags & (POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_BUS_CLK)) == 0) {
9015
        fprintf(stderr, "PowerPC flags inconsistency\n"
9016
                "Should define the time-base and decrementer clock source\n");
9017
        exit(1);
9018
    }
9019
    /* Allocate TLBs buffer when needed */
9020
#if !defined(CONFIG_USER_ONLY)
9021
    if (env->nb_tlb != 0) {
9022
        int nb_tlb = env->nb_tlb;
9023
        if (env->id_tlbs != 0)
9024
            nb_tlb *= 2;
9025
        env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
9026
        /* Pre-compute some useful values */
9027
        env->tlb_per_way = env->nb_tlb / env->nb_ways;
9028
    }
9029
    if (env->irq_inputs == NULL) {
9030
        fprintf(stderr, "WARNING: no internal IRQ controller registered.\n"
9031
                " Attempt Qemu to crash very soon !\n");
9032
    }
9033
#endif
9034
    if (env->check_pow == NULL) {
9035
        fprintf(stderr, "WARNING: no power management check handler "
9036
                "registered.\n"
9037
                " Attempt Qemu to crash very soon !\n");
9038
    }
9039
}
9040

    
9041
#if defined(PPC_DUMP_CPU)
9042
static void dump_ppc_sprs (CPUPPCState *env)
9043
{
9044
    ppc_spr_t *spr;
9045
#if !defined(CONFIG_USER_ONLY)
9046
    uint32_t sr, sw;
9047
#endif
9048
    uint32_t ur, uw;
9049
    int i, j, n;
9050

    
9051
    printf("Special purpose registers:\n");
9052
    for (i = 0; i < 32; i++) {
9053
        for (j = 0; j < 32; j++) {
9054
            n = (i << 5) | j;
9055
            spr = &env->spr_cb[n];
9056
            uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
9057
            ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
9058
#if !defined(CONFIG_USER_ONLY)
9059
            sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
9060
            sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
9061
            if (sw || sr || uw || ur) {
9062
                printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
9063
                       (i << 5) | j, (i << 5) | j, spr->name,
9064
                       sw ? 'w' : '-', sr ? 'r' : '-',
9065
                       uw ? 'w' : '-', ur ? 'r' : '-');
9066
            }
9067
#else
9068
            if (uw || ur) {
9069
                printf("SPR: %4d (%03x) %-8s u%c%c\n",
9070
                       (i << 5) | j, (i << 5) | j, spr->name,
9071
                       uw ? 'w' : '-', ur ? 'r' : '-');
9072
            }
9073
#endif
9074
        }
9075
    }
9076
    fflush(stdout);
9077
    fflush(stderr);
9078
}
9079
#endif
9080

    
9081
/*****************************************************************************/
9082
#include <stdlib.h>
9083
#include <string.h>
9084

    
9085
/* Opcode types */
9086
enum {
9087
    PPC_DIRECT   = 0, /* Opcode routine        */
9088
    PPC_INDIRECT = 1, /* Indirect opcode table */
9089
};
9090

    
9091
static inline int is_indirect_opcode (void *handler)
9092
{
9093
    return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
9094
}
9095

    
9096
static inline opc_handler_t **ind_table(void *handler)
9097
{
9098
    return (opc_handler_t **)((unsigned long)handler & ~3);
9099
}
9100

    
9101
/* Instruction table creation */
9102
/* Opcodes tables creation */
9103
static void fill_new_table (opc_handler_t **table, int len)
9104
{
9105
    int i;
9106

    
9107
    for (i = 0; i < len; i++)
9108
        table[i] = &invalid_handler;
9109
}
9110

    
9111
static int create_new_table (opc_handler_t **table, unsigned char idx)
9112
{
9113
    opc_handler_t **tmp;
9114

    
9115
    tmp = malloc(0x20 * sizeof(opc_handler_t));
9116
    fill_new_table(tmp, 0x20);
9117
    table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
9118

    
9119
    return 0;
9120
}
9121

    
9122
static int insert_in_table (opc_handler_t **table, unsigned char idx,
9123
                            opc_handler_t *handler)
9124
{
9125
    if (table[idx] != &invalid_handler)
9126
        return -1;
9127
    table[idx] = handler;
9128

    
9129
    return 0;
9130
}
9131

    
9132
static int register_direct_insn (opc_handler_t **ppc_opcodes,
9133
                                 unsigned char idx, opc_handler_t *handler)
9134
{
9135
    if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
9136
        printf("*** ERROR: opcode %02x already assigned in main "
9137
               "opcode table\n", idx);
9138
#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9139
        printf("           Registered handler '%s' - new handler '%s'\n",
9140
               ppc_opcodes[idx]->oname, handler->oname);
9141
#endif
9142
        return -1;
9143
    }
9144

    
9145
    return 0;
9146
}
9147

    
9148
static int register_ind_in_table (opc_handler_t **table,
9149
                                  unsigned char idx1, unsigned char idx2,
9150
                                  opc_handler_t *handler)
9151
{
9152
    if (table[idx1] == &invalid_handler) {
9153
        if (create_new_table(table, idx1) < 0) {
9154
            printf("*** ERROR: unable to create indirect table "
9155
                   "idx=%02x\n", idx1);
9156
            return -1;
9157
        }
9158
    } else {
9159
        if (!is_indirect_opcode(table[idx1])) {
9160
            printf("*** ERROR: idx %02x already assigned to a direct "
9161
                   "opcode\n", idx1);
9162
#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9163
            printf("           Registered handler '%s' - new handler '%s'\n",
9164
                   ind_table(table[idx1])[idx2]->oname, handler->oname);
9165
#endif
9166
            return -1;
9167
        }
9168
    }
9169
    if (handler != NULL &&
9170
        insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
9171
        printf("*** ERROR: opcode %02x already assigned in "
9172
               "opcode table %02x\n", idx2, idx1);
9173
#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9174
        printf("           Registered handler '%s' - new handler '%s'\n",
9175
               ind_table(table[idx1])[idx2]->oname, handler->oname);
9176
#endif
9177
        return -1;
9178
    }
9179

    
9180
    return 0;
9181
}
9182

    
9183
static int register_ind_insn (opc_handler_t **ppc_opcodes,
9184
                              unsigned char idx1, unsigned char idx2,
9185
                              opc_handler_t *handler)
9186
{
9187
    int ret;
9188

    
9189
    ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
9190

    
9191
    return ret;
9192
}
9193

    
9194
static int register_dblind_insn (opc_handler_t **ppc_opcodes,
9195
                                 unsigned char idx1, unsigned char idx2,
9196
                                 unsigned char idx3, opc_handler_t *handler)
9197
{
9198
    if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
9199
        printf("*** ERROR: unable to join indirect table idx "
9200
               "[%02x-%02x]\n", idx1, idx2);
9201
        return -1;
9202
    }
9203
    if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
9204
                              handler) < 0) {
9205
        printf("*** ERROR: unable to insert opcode "
9206
               "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
9207
        return -1;
9208
    }
9209

    
9210
    return 0;
9211
}
9212

    
9213
static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
9214
{
9215
    if (insn->opc2 != 0xFF) {
9216
        if (insn->opc3 != 0xFF) {
9217
            if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
9218
                                     insn->opc3, &insn->handler) < 0)
9219
                return -1;
9220
        } else {
9221
            if (register_ind_insn(ppc_opcodes, insn->opc1,
9222
                                  insn->opc2, &insn->handler) < 0)
9223
                return -1;
9224
        }
9225
    } else {
9226
        if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
9227
            return -1;
9228
    }
9229

    
9230
    return 0;
9231
}
9232

    
9233
static int test_opcode_table (opc_handler_t **table, int len)
9234
{
9235
    int i, count, tmp;
9236

    
9237
    for (i = 0, count = 0; i < len; i++) {
9238
        /* Consistency fixup */
9239
        if (table[i] == NULL)
9240
            table[i] = &invalid_handler;
9241
        if (table[i] != &invalid_handler) {
9242
            if (is_indirect_opcode(table[i])) {
9243
                tmp = test_opcode_table(ind_table(table[i]), 0x20);
9244
                if (tmp == 0) {
9245
                    free(table[i]);
9246
                    table[i] = &invalid_handler;
9247
                } else {
9248
                    count++;
9249
                }
9250
            } else {
9251
                count++;
9252
            }
9253
        }
9254
    }
9255

    
9256
    return count;
9257
}
9258

    
9259
static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
9260
{
9261
    if (test_opcode_table(ppc_opcodes, 0x40) == 0)
9262
        printf("*** WARNING: no opcode defined !\n");
9263
}
9264

    
9265
/*****************************************************************************/
9266
static int create_ppc_opcodes (CPUPPCState *env, const ppc_def_t *def)
9267
{
9268
    opcode_t *opc;
9269

    
9270
    fill_new_table(env->opcodes, 0x40);
9271
    for (opc = opcodes; opc < &opcodes[ARRAY_SIZE(opcodes)]; opc++) {
9272
        if ((opc->handler.type & def->insns_flags) != 0) {
9273
            if (register_insn(env->opcodes, opc) < 0) {
9274
                printf("*** ERROR initializing PowerPC instruction "
9275
                       "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
9276
                       opc->opc3);
9277
                return -1;
9278
            }
9279
        }
9280
    }
9281
    fix_opcode_tables(env->opcodes);
9282
    fflush(stdout);
9283
    fflush(stderr);
9284

    
9285
    return 0;
9286
}
9287

    
9288
#if defined(PPC_DUMP_CPU)
9289
static void dump_ppc_insns (CPUPPCState *env)
9290
{
9291
    opc_handler_t **table, *handler;
9292
    const char *p, *q;
9293
    uint8_t opc1, opc2, opc3;
9294

    
9295
    printf("Instructions set:\n");
9296
    /* opc1 is 6 bits long */
9297
    for (opc1 = 0x00; opc1 < 0x40; opc1++) {
9298
        table = env->opcodes;
9299
        handler = table[opc1];
9300
        if (is_indirect_opcode(handler)) {
9301
            /* opc2 is 5 bits long */
9302
            for (opc2 = 0; opc2 < 0x20; opc2++) {
9303
                table = env->opcodes;
9304
                handler = env->opcodes[opc1];
9305
                table = ind_table(handler);
9306
                handler = table[opc2];
9307
                if (is_indirect_opcode(handler)) {
9308
                    table = ind_table(handler);
9309
                    /* opc3 is 5 bits long */
9310
                    for (opc3 = 0; opc3 < 0x20; opc3++) {
9311
                        handler = table[opc3];
9312
                        if (handler->handler != &gen_invalid) {
9313
                            /* Special hack to properly dump SPE insns */
9314
                            p = strchr(handler->oname, '_');
9315
                            if (p == NULL) {
9316
                                printf("INSN: %02x %02x %02x (%02d %04d) : "
9317
                                       "%s\n",
9318
                                       opc1, opc2, opc3, opc1,
9319
                                       (opc3 << 5) | opc2,
9320
                                       handler->oname);
9321
                            } else {
9322
                                q = "speundef";
9323
                                if ((p - handler->oname) != strlen(q) ||
9324
                                    memcmp(handler->oname, q, strlen(q)) != 0) {
9325
                                    /* First instruction */
9326
                                    printf("INSN: %02x %02x %02x (%02d %04d) : "
9327
                                           "%.*s\n",
9328
                                           opc1, opc2 << 1, opc3, opc1,
9329
                                           (opc3 << 6) | (opc2 << 1),
9330
                                           (int)(p - handler->oname),
9331
                                           handler->oname);
9332
                                }
9333
                                if (strcmp(p + 1, q) != 0) {
9334
                                    /* Second instruction */
9335
                                    printf("INSN: %02x %02x %02x (%02d %04d) : "
9336
                                           "%s\n",
9337
                                           opc1, (opc2 << 1) | 1, opc3, opc1,
9338
                                           (opc3 << 6) | (opc2 << 1) | 1,
9339
                                           p + 1);
9340
                                }
9341
                            }
9342
                        }
9343
                    }
9344
                } else {
9345
                    if (handler->handler != &gen_invalid) {
9346
                        printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
9347
                               opc1, opc2, opc1, opc2, handler->oname);
9348
                    }
9349
                }
9350
            }
9351
        } else {
9352
            if (handler->handler != &gen_invalid) {
9353
                printf("INSN: %02x -- -- (%02d ----) : %s\n",
9354
                       opc1, opc1, handler->oname);
9355
            }
9356
        }
9357
    }
9358
}
9359
#endif
9360

    
9361
static int gdb_get_float_reg(CPUState *env, uint8_t *mem_buf, int n)
9362
{
9363
    if (n < 32) {
9364
        stfq_p(mem_buf, env->fpr[n]);
9365
        return 8;
9366
    }
9367
    if (n == 32) {
9368
        /* FPSCR not implemented  */
9369
        memset(mem_buf, 0, 4);
9370
        return 4;
9371
    }
9372
    return 0;
9373
}
9374

    
9375
static int gdb_set_float_reg(CPUState *env, uint8_t *mem_buf, int n)
9376
{
9377
    if (n < 32) {
9378
        env->fpr[n] = ldfq_p(mem_buf);
9379
        return 8;
9380
    }
9381
    if (n == 32) {
9382
        /* FPSCR not implemented  */
9383
        return 4;
9384
    }
9385
    return 0;
9386
}
9387

    
9388
static int gdb_get_avr_reg(CPUState *env, uint8_t *mem_buf, int n)
9389
{
9390
    if (n < 32) {
9391
#ifdef WORDS_BIGENDIAN
9392
        stq_p(mem_buf, env->avr[n].u64[0]);
9393
        stq_p(mem_buf+8, env->avr[n].u64[1]);
9394
#else
9395
        stq_p(mem_buf, env->avr[n].u64[1]);
9396
        stq_p(mem_buf+8, env->avr[n].u64[0]);
9397
#endif
9398
        return 16;
9399
    }
9400
    if (n == 32) {
9401
        stl_p(mem_buf, env->vscr);
9402
        return 4;
9403
    }
9404
    if (n == 33) {
9405
        stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
9406
        return 4;
9407
    }
9408
    return 0;
9409
}
9410

    
9411
static int gdb_set_avr_reg(CPUState *env, uint8_t *mem_buf, int n)
9412
{
9413
    if (n < 32) {
9414
#ifdef WORDS_BIGENDIAN
9415
        env->avr[n].u64[0] = ldq_p(mem_buf);
9416
        env->avr[n].u64[1] = ldq_p(mem_buf+8);
9417
#else
9418
        env->avr[n].u64[1] = ldq_p(mem_buf);
9419
        env->avr[n].u64[0] = ldq_p(mem_buf+8);
9420
#endif
9421
        return 16;
9422
    }
9423
    if (n == 32) {
9424
        env->vscr = ldl_p(mem_buf);
9425
        return 4;
9426
    }
9427
    if (n == 33) {
9428
        env->spr[SPR_VRSAVE] = (target_ulong)ldl_p(mem_buf);
9429
        return 4;
9430
    }
9431
    return 0;
9432
}
9433

    
9434
static int gdb_get_spe_reg(CPUState *env, uint8_t *mem_buf, int n)
9435
{
9436
    if (n < 32) {
9437
#if defined(TARGET_PPC64)
9438
        stl_p(mem_buf, env->gpr[n] >> 32);
9439
#else
9440
        stl_p(mem_buf, env->gprh[n]);
9441
#endif
9442
        return 4;
9443
    }
9444
    if (n == 32) {
9445
        stq_p(mem_buf, env->spe_acc);
9446
        return 8;
9447
    }
9448
    if (n == 33) {
9449
        stl_p(mem_buf, env->spe_fscr);
9450
        return 4;
9451
    }
9452
    return 0;
9453
}
9454

    
9455
static int gdb_set_spe_reg(CPUState *env, uint8_t *mem_buf, int n)
9456
{
9457
    if (n < 32) {
9458
#if defined(TARGET_PPC64)
9459
        target_ulong lo = (uint32_t)env->gpr[n];
9460
        target_ulong hi = (target_ulong)ldl_p(mem_buf) << 32;
9461
        env->gpr[n] = lo | hi;
9462
#else
9463
        env->gprh[n] = ldl_p(mem_buf);
9464
#endif
9465
        return 4;
9466
    }
9467
    if (n == 32) {
9468
        env->spe_acc = ldq_p(mem_buf);
9469
        return 8;
9470
    }
9471
    if (n == 33) {
9472
        env->spe_fscr = ldl_p(mem_buf);
9473
        return 4;
9474
    }
9475
    return 0;
9476
}
9477

    
9478
int cpu_ppc_register_internal (CPUPPCState *env, const ppc_def_t *def)
9479
{
9480
    env->msr_mask = def->msr_mask;
9481
    env->mmu_model = def->mmu_model;
9482
    env->excp_model = def->excp_model;
9483
    env->bus_model = def->bus_model;
9484
    env->insns_flags = def->insns_flags;
9485
    env->flags = def->flags;
9486
    env->bfd_mach = def->bfd_mach;
9487
    env->check_pow = def->check_pow;
9488
    if (create_ppc_opcodes(env, def) < 0)
9489
        return -1;
9490
    init_ppc_proc(env, def);
9491

    
9492
    if (def->insns_flags & PPC_FLOAT) {
9493
        gdb_register_coprocessor(env, gdb_get_float_reg, gdb_set_float_reg,
9494
                                 33, "power-fpu.xml", 0);
9495
    }
9496
    if (def->insns_flags & PPC_ALTIVEC) {
9497
        gdb_register_coprocessor(env, gdb_get_avr_reg, gdb_set_avr_reg,
9498
                                 34, "power-altivec.xml", 0);
9499
    }
9500
    if (def->insns_flags & PPC_SPE) {
9501
        gdb_register_coprocessor(env, gdb_get_spe_reg, gdb_set_spe_reg,
9502
                                 34, "power-spe.xml", 0);
9503
    }
9504

    
9505
#if defined(PPC_DUMP_CPU)
9506
    {
9507
        const char *mmu_model, *excp_model, *bus_model;
9508
        switch (env->mmu_model) {
9509
        case POWERPC_MMU_32B:
9510
            mmu_model = "PowerPC 32";
9511
            break;
9512
        case POWERPC_MMU_SOFT_6xx:
9513
            mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
9514
            break;
9515
        case POWERPC_MMU_SOFT_74xx:
9516
            mmu_model = "PowerPC 74xx with software driven TLBs";
9517
            break;
9518
        case POWERPC_MMU_SOFT_4xx:
9519
            mmu_model = "PowerPC 4xx with software driven TLBs";
9520
            break;
9521
        case POWERPC_MMU_SOFT_4xx_Z:
9522
            mmu_model = "PowerPC 4xx with software driven TLBs "
9523
                "and zones protections";
9524
            break;
9525
        case POWERPC_MMU_REAL:
9526
            mmu_model = "PowerPC real mode only";
9527
            break;
9528
        case POWERPC_MMU_MPC8xx:
9529
            mmu_model = "PowerPC MPC8xx";
9530
            break;
9531
        case POWERPC_MMU_BOOKE:
9532
            mmu_model = "PowerPC BookE";
9533
            break;
9534
        case POWERPC_MMU_BOOKE_FSL:
9535
            mmu_model = "PowerPC BookE FSL";
9536
            break;
9537
        case POWERPC_MMU_601:
9538
            mmu_model = "PowerPC 601";
9539
            break;
9540
#if defined (TARGET_PPC64)
9541
        case POWERPC_MMU_64B:
9542
            mmu_model = "PowerPC 64";
9543
            break;
9544
        case POWERPC_MMU_620:
9545
            mmu_model = "PowerPC 620";
9546
            break;
9547
#endif
9548
        default:
9549
            mmu_model = "Unknown or invalid";
9550
            break;
9551
        }
9552
        switch (env->excp_model) {
9553
        case POWERPC_EXCP_STD:
9554
            excp_model = "PowerPC";
9555
            break;
9556
        case POWERPC_EXCP_40x:
9557
            excp_model = "PowerPC 40x";
9558
            break;
9559
        case POWERPC_EXCP_601:
9560
            excp_model = "PowerPC 601";
9561
            break;
9562
        case POWERPC_EXCP_602:
9563
            excp_model = "PowerPC 602";
9564
            break;
9565
        case POWERPC_EXCP_603:
9566
            excp_model = "PowerPC 603";
9567
            break;
9568
        case POWERPC_EXCP_603E:
9569
            excp_model = "PowerPC 603e";
9570
            break;
9571
        case POWERPC_EXCP_604:
9572
            excp_model = "PowerPC 604";
9573
            break;
9574
        case POWERPC_EXCP_7x0:
9575
            excp_model = "PowerPC 740/750";
9576
            break;
9577
        case POWERPC_EXCP_7x5:
9578
            excp_model = "PowerPC 745/755";
9579
            break;
9580
        case POWERPC_EXCP_74xx:
9581
            excp_model = "PowerPC 74xx";
9582
            break;
9583
        case POWERPC_EXCP_BOOKE:
9584
            excp_model = "PowerPC BookE";
9585
            break;
9586
#if defined (TARGET_PPC64)
9587
        case POWERPC_EXCP_970:
9588
            excp_model = "PowerPC 970";
9589
            break;
9590
#endif
9591
        default:
9592
            excp_model = "Unknown or invalid";
9593
            break;
9594
        }
9595
        switch (env->bus_model) {
9596
        case PPC_FLAGS_INPUT_6xx:
9597
            bus_model = "PowerPC 6xx";
9598
            break;
9599
        case PPC_FLAGS_INPUT_BookE:
9600
            bus_model = "PowerPC BookE";
9601
            break;
9602
        case PPC_FLAGS_INPUT_405:
9603
            bus_model = "PowerPC 405";
9604
            break;
9605
        case PPC_FLAGS_INPUT_401:
9606
            bus_model = "PowerPC 401/403";
9607
            break;
9608
        case PPC_FLAGS_INPUT_RCPU:
9609
            bus_model = "RCPU / MPC8xx";
9610
            break;
9611
#if defined (TARGET_PPC64)
9612
        case PPC_FLAGS_INPUT_970:
9613
            bus_model = "PowerPC 970";
9614
            break;
9615
#endif
9616
        default:
9617
            bus_model = "Unknown or invalid";
9618
            break;
9619
        }
9620
        printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
9621
               "    MMU model        : %s\n",
9622
               def->name, def->pvr, def->msr_mask, mmu_model);
9623
#if !defined(CONFIG_USER_ONLY)
9624
        if (env->tlb != NULL) {
9625
            printf("                       %d %s TLB in %d ways\n",
9626
                   env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
9627
                   env->nb_ways);
9628
        }
9629
#endif
9630
        printf("    Exceptions model : %s\n"
9631
               "    Bus model        : %s\n",
9632
               excp_model, bus_model);
9633
        printf("    MSR features     :\n");
9634
        if (env->flags & POWERPC_FLAG_SPE)
9635
            printf("                        signal processing engine enable"
9636
                   "\n");
9637
        else if (env->flags & POWERPC_FLAG_VRE)
9638
            printf("                        vector processor enable\n");
9639
        if (env->flags & POWERPC_FLAG_TGPR)
9640
            printf("                        temporary GPRs\n");
9641
        else if (env->flags & POWERPC_FLAG_CE)
9642
            printf("                        critical input enable\n");
9643
        if (env->flags & POWERPC_FLAG_SE)
9644
            printf("                        single-step trace mode\n");
9645
        else if (env->flags & POWERPC_FLAG_DWE)
9646
            printf("                        debug wait enable\n");
9647
        else if (env->flags & POWERPC_FLAG_UBLE)
9648
            printf("                        user BTB lock enable\n");
9649
        if (env->flags & POWERPC_FLAG_BE)
9650
            printf("                        branch-step trace mode\n");
9651
        else if (env->flags & POWERPC_FLAG_DE)
9652
            printf("                        debug interrupt enable\n");
9653
        if (env->flags & POWERPC_FLAG_PX)
9654
            printf("                        inclusive protection\n");
9655
        else if (env->flags & POWERPC_FLAG_PMM)
9656
            printf("                        performance monitor mark\n");
9657
        if (env->flags == POWERPC_FLAG_NONE)
9658
            printf("                        none\n");
9659
        printf("    Time-base/decrementer clock source: %s\n",
9660
               env->flags & POWERPC_FLAG_RTC_CLK ? "RTC clock" : "bus clock");
9661
    }
9662
    dump_ppc_insns(env);
9663
    dump_ppc_sprs(env);
9664
    fflush(stdout);
9665
#endif
9666

    
9667
    return 0;
9668
}
9669

    
9670
static const ppc_def_t *ppc_find_by_pvr (uint32_t pvr)
9671
{
9672
    const ppc_def_t *ret;
9673
    uint32_t pvr_rev;
9674
    int i, best, match, best_match, max;
9675

    
9676
    ret = NULL;
9677
    max = ARRAY_SIZE(ppc_defs);
9678
    best = -1;
9679
    pvr_rev = pvr & 0xFFFF;
9680
    /* We want all specified bits to match */
9681
    best_match = 32 - ctz32(pvr_rev);
9682
    for (i = 0; i < max; i++) {
9683
        /* We check that the 16 higher bits are the same to ensure the CPU
9684
         * model will be the choosen one.
9685
         */
9686
        if (((pvr ^ ppc_defs[i].pvr) >> 16) == 0) {
9687
            /* We want as much as possible of the low-level 16 bits
9688
             * to be the same but we allow inexact matches.
9689
             */
9690
            match = clz32(pvr_rev ^ (ppc_defs[i].pvr & 0xFFFF));
9691
            /* We check '>=' instead of '>' because the PPC_defs table
9692
             * is ordered by increasing revision.
9693
             * Then, we will match the higher revision compatible
9694
             * with the requested PVR
9695
             */
9696
            if (match >= best_match) {
9697
                best = i;
9698
                best_match = match;
9699
            }
9700
        }
9701
    }
9702
    if (best != -1)
9703
        ret = &ppc_defs[best];
9704

    
9705
    return ret;
9706
}
9707

    
9708
#include <ctype.h>
9709

    
9710
const ppc_def_t *cpu_ppc_find_by_name (const char *name)
9711
{
9712
    const ppc_def_t *ret;
9713
    const char *p;
9714
    int i, max, len;
9715

    
9716
    /* Check if the given name is a PVR */
9717
    len = strlen(name);
9718
    if (len == 10 && name[0] == '0' && name[1] == 'x') {
9719
        p = name + 2;
9720
        goto check_pvr;
9721
    } else if (len == 8) {
9722
        p = name;
9723
    check_pvr:
9724
        for (i = 0; i < 8; i++) {
9725
            if (!qemu_isxdigit(*p++))
9726
                break;
9727
        }
9728
        if (i == 8)
9729
            return ppc_find_by_pvr(strtoul(name, NULL, 16));
9730
    }
9731
    ret = NULL;
9732
    max = ARRAY_SIZE(ppc_defs);
9733
    for (i = 0; i < max; i++) {
9734
        if (strcasecmp(name, ppc_defs[i].name) == 0) {
9735
            ret = &ppc_defs[i];
9736
            break;
9737
        }
9738
    }
9739

    
9740
    return ret;
9741
}
9742

    
9743
void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
9744
{
9745
    int i, max;
9746

    
9747
    max = ARRAY_SIZE(ppc_defs);
9748
    for (i = 0; i < max; i++) {
9749
        (*cpu_fprintf)(f, "PowerPC %-16s PVR %08x\n",
9750
                       ppc_defs[i].name, ppc_defs[i].pvr);
9751
    }
9752
}