]> Git Repo - qemu.git/blob - target-ppc/translate_init.c
ehci: switch to nanoseconds
[qemu.git] / target-ppc / translate_init.c
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 insns_flags2;
41     uint64_t msr_mask;
42     powerpc_mmu_t   mmu_model;
43     powerpc_excp_t  excp_model;
44     powerpc_input_t bus_model;
45     uint32_t flags;
46     int bfd_mach;
47     void (*init_proc)(CPUPPCState *env);
48     int  (*check_pow)(CPUPPCState *env);
49 };
50
51 /* For user-mode emulation, we don't emulate any IRQ controller */
52 #if defined(CONFIG_USER_ONLY)
53 #define PPC_IRQ_INIT_FN(name)                                                 \
54 static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env)         \
55 {                                                                             \
56 }
57 #else
58 #define PPC_IRQ_INIT_FN(name)                                                 \
59 void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
60 #endif
61
62 PPC_IRQ_INIT_FN(40x);
63 PPC_IRQ_INIT_FN(6xx);
64 PPC_IRQ_INIT_FN(970);
65 PPC_IRQ_INIT_FN(POWER7);
66 PPC_IRQ_INIT_FN(e500);
67
68 /* Generic callbacks:
69  * do nothing but store/retrieve spr value
70  */
71 static void spr_read_generic (void *opaque, int gprn, int sprn)
72 {
73     gen_load_spr(cpu_gpr[gprn], sprn);
74 #ifdef PPC_DUMP_SPR_ACCESSES
75     {
76         TCGv_i32 t0 = tcg_const_i32(sprn);
77         gen_helper_load_dump_spr(t0);
78         tcg_temp_free_i32(t0);
79     }
80 #endif
81 }
82
83 static void spr_write_generic (void *opaque, int sprn, int gprn)
84 {
85     gen_store_spr(sprn, cpu_gpr[gprn]);
86 #ifdef PPC_DUMP_SPR_ACCESSES
87     {
88         TCGv_i32 t0 = tcg_const_i32(sprn);
89         gen_helper_store_dump_spr(t0);
90         tcg_temp_free_i32(t0);
91     }
92 #endif
93 }
94
95 #if !defined(CONFIG_USER_ONLY)
96 static void spr_write_clear (void *opaque, int sprn, int gprn)
97 {
98     TCGv t0 = tcg_temp_new();
99     TCGv t1 = tcg_temp_new();
100     gen_load_spr(t0, sprn);
101     tcg_gen_neg_tl(t1, cpu_gpr[gprn]);
102     tcg_gen_and_tl(t0, t0, t1);
103     gen_store_spr(sprn, t0);
104     tcg_temp_free(t0);
105     tcg_temp_free(t1);
106 }
107 #endif
108
109 /* SPR common to all PowerPC */
110 /* XER */
111 static void spr_read_xer (void *opaque, int gprn, int sprn)
112 {
113     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_xer);
114 }
115
116 static void spr_write_xer (void *opaque, int sprn, int gprn)
117 {
118     tcg_gen_mov_tl(cpu_xer, cpu_gpr[gprn]);
119 }
120
121 /* LR */
122 static void spr_read_lr (void *opaque, int gprn, int sprn)
123 {
124     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_lr);
125 }
126
127 static void spr_write_lr (void *opaque, int sprn, int gprn)
128 {
129     tcg_gen_mov_tl(cpu_lr, cpu_gpr[gprn]);
130 }
131
132 /* CTR */
133 static void spr_read_ctr (void *opaque, int gprn, int sprn)
134 {
135     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_ctr);
136 }
137
138 static void spr_write_ctr (void *opaque, int sprn, int gprn)
139 {
140     tcg_gen_mov_tl(cpu_ctr, cpu_gpr[gprn]);
141 }
142
143 /* User read access to SPR */
144 /* USPRx */
145 /* UMMCRx */
146 /* UPMCx */
147 /* USIA */
148 /* UDECR */
149 static void spr_read_ureg (void *opaque, int gprn, int sprn)
150 {
151     gen_load_spr(cpu_gpr[gprn], sprn + 0x10);
152 }
153
154 /* SPR common to all non-embedded PowerPC */
155 /* DECR */
156 #if !defined(CONFIG_USER_ONLY)
157 static void spr_read_decr (void *opaque, int gprn, int sprn)
158 {
159     if (use_icount) {
160         gen_io_start();
161     }
162     gen_helper_load_decr(cpu_gpr[gprn]);
163     if (use_icount) {
164         gen_io_end();
165         gen_stop_exception(opaque);
166     }
167 }
168
169 static void spr_write_decr (void *opaque, int sprn, int gprn)
170 {
171     if (use_icount) {
172         gen_io_start();
173     }
174     gen_helper_store_decr(cpu_gpr[gprn]);
175     if (use_icount) {
176         gen_io_end();
177         gen_stop_exception(opaque);
178     }
179 }
180 #endif
181
182 /* SPR common to all non-embedded PowerPC, except 601 */
183 /* Time base */
184 static void spr_read_tbl (void *opaque, int gprn, int sprn)
185 {
186     if (use_icount) {
187         gen_io_start();
188     }
189     gen_helper_load_tbl(cpu_gpr[gprn]);
190     if (use_icount) {
191         gen_io_end();
192         gen_stop_exception(opaque);
193     }
194 }
195
196 static void spr_read_tbu (void *opaque, int gprn, int sprn)
197 {
198     if (use_icount) {
199         gen_io_start();
200     }
201     gen_helper_load_tbu(cpu_gpr[gprn]);
202     if (use_icount) {
203         gen_io_end();
204         gen_stop_exception(opaque);
205     }
206 }
207
208 __attribute__ (( unused ))
209 static void spr_read_atbl (void *opaque, int gprn, int sprn)
210 {
211     gen_helper_load_atbl(cpu_gpr[gprn]);
212 }
213
214 __attribute__ (( unused ))
215 static void spr_read_atbu (void *opaque, int gprn, int sprn)
216 {
217     gen_helper_load_atbu(cpu_gpr[gprn]);
218 }
219
220 #if !defined(CONFIG_USER_ONLY)
221 static void spr_write_tbl (void *opaque, int sprn, int gprn)
222 {
223     if (use_icount) {
224         gen_io_start();
225     }
226     gen_helper_store_tbl(cpu_gpr[gprn]);
227     if (use_icount) {
228         gen_io_end();
229         gen_stop_exception(opaque);
230     }
231 }
232
233 static void spr_write_tbu (void *opaque, int sprn, int gprn)
234 {
235     if (use_icount) {
236         gen_io_start();
237     }
238     gen_helper_store_tbu(cpu_gpr[gprn]);
239     if (use_icount) {
240         gen_io_end();
241         gen_stop_exception(opaque);
242     }
243 }
244
245 __attribute__ (( unused ))
246 static void spr_write_atbl (void *opaque, int sprn, int gprn)
247 {
248     gen_helper_store_atbl(cpu_gpr[gprn]);
249 }
250
251 __attribute__ (( unused ))
252 static void spr_write_atbu (void *opaque, int sprn, int gprn)
253 {
254     gen_helper_store_atbu(cpu_gpr[gprn]);
255 }
256
257 #if defined(TARGET_PPC64)
258 __attribute__ (( unused ))
259 static void spr_read_purr (void *opaque, int gprn, int sprn)
260 {
261     gen_helper_load_purr(cpu_gpr[gprn]);
262 }
263 #endif
264 #endif
265
266 #if !defined(CONFIG_USER_ONLY)
267 /* IBAT0U...IBAT0U */
268 /* IBAT0L...IBAT7L */
269 static void spr_read_ibat (void *opaque, int gprn, int sprn)
270 {
271     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
272 }
273
274 static void spr_read_ibat_h (void *opaque, int gprn, int sprn)
275 {
276     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, IBAT[sprn & 1][(sprn - SPR_IBAT4U) / 2]));
277 }
278
279 static void spr_write_ibatu (void *opaque, int sprn, int gprn)
280 {
281     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
282     gen_helper_store_ibatu(t0, cpu_gpr[gprn]);
283     tcg_temp_free_i32(t0);
284 }
285
286 static void spr_write_ibatu_h (void *opaque, int sprn, int gprn)
287 {
288     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4U) / 2) + 4);
289     gen_helper_store_ibatu(t0, cpu_gpr[gprn]);
290     tcg_temp_free_i32(t0);
291 }
292
293 static void spr_write_ibatl (void *opaque, int sprn, int gprn)
294 {
295     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2);
296     gen_helper_store_ibatl(t0, cpu_gpr[gprn]);
297     tcg_temp_free_i32(t0);
298 }
299
300 static void spr_write_ibatl_h (void *opaque, int sprn, int gprn)
301 {
302     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4L) / 2) + 4);
303     gen_helper_store_ibatl(t0, cpu_gpr[gprn]);
304     tcg_temp_free_i32(t0);
305 }
306
307 /* DBAT0U...DBAT7U */
308 /* DBAT0L...DBAT7L */
309 static void spr_read_dbat (void *opaque, int gprn, int sprn)
310 {
311     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, DBAT[sprn & 1][(sprn - SPR_DBAT0U) / 2]));
312 }
313
314 static void spr_read_dbat_h (void *opaque, int gprn, int sprn)
315 {
316     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, DBAT[sprn & 1][((sprn - SPR_DBAT4U) / 2) + 4]));
317 }
318
319 static void spr_write_dbatu (void *opaque, int sprn, int gprn)
320 {
321     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2);
322     gen_helper_store_dbatu(t0, cpu_gpr[gprn]);
323     tcg_temp_free_i32(t0);
324 }
325
326 static void spr_write_dbatu_h (void *opaque, int sprn, int gprn)
327 {
328     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4);
329     gen_helper_store_dbatu(t0, cpu_gpr[gprn]);
330     tcg_temp_free_i32(t0);
331 }
332
333 static void spr_write_dbatl (void *opaque, int sprn, int gprn)
334 {
335     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2);
336     gen_helper_store_dbatl(t0, cpu_gpr[gprn]);
337     tcg_temp_free_i32(t0);
338 }
339
340 static void spr_write_dbatl_h (void *opaque, int sprn, int gprn)
341 {
342     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4);
343     gen_helper_store_dbatl(t0, cpu_gpr[gprn]);
344     tcg_temp_free_i32(t0);
345 }
346
347 /* SDR1 */
348 static void spr_write_sdr1 (void *opaque, int sprn, int gprn)
349 {
350     gen_helper_store_sdr1(cpu_gpr[gprn]);
351 }
352
353 /* 64 bits PowerPC specific SPRs */
354 /* ASR */
355 #if defined(TARGET_PPC64)
356 static void spr_read_hior (void *opaque, int gprn, int sprn)
357 {
358     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, excp_prefix));
359 }
360
361 static void spr_write_hior (void *opaque, int sprn, int gprn)
362 {
363     TCGv t0 = tcg_temp_new();
364     tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL);
365     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_prefix));
366     tcg_temp_free(t0);
367 }
368
369 static void spr_read_asr (void *opaque, int gprn, int sprn)
370 {
371     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, asr));
372 }
373
374 static void spr_write_asr (void *opaque, int sprn, int gprn)
375 {
376     gen_helper_store_asr(cpu_gpr[gprn]);
377 }
378 #endif
379 #endif
380
381 /* PowerPC 601 specific registers */
382 /* RTC */
383 static void spr_read_601_rtcl (void *opaque, int gprn, int sprn)
384 {
385     gen_helper_load_601_rtcl(cpu_gpr[gprn]);
386 }
387
388 static void spr_read_601_rtcu (void *opaque, int gprn, int sprn)
389 {
390     gen_helper_load_601_rtcu(cpu_gpr[gprn]);
391 }
392
393 #if !defined(CONFIG_USER_ONLY)
394 static void spr_write_601_rtcu (void *opaque, int sprn, int gprn)
395 {
396     gen_helper_store_601_rtcu(cpu_gpr[gprn]);
397 }
398
399 static void spr_write_601_rtcl (void *opaque, int sprn, int gprn)
400 {
401     gen_helper_store_601_rtcl(cpu_gpr[gprn]);
402 }
403
404 static void spr_write_hid0_601 (void *opaque, int sprn, int gprn)
405 {
406     DisasContext *ctx = opaque;
407
408     gen_helper_store_hid0_601(cpu_gpr[gprn]);
409     /* Must stop the translation as endianness may have changed */
410     gen_stop_exception(ctx);
411 }
412 #endif
413
414 /* Unified bats */
415 #if !defined(CONFIG_USER_ONLY)
416 static void spr_read_601_ubat (void *opaque, int gprn, int sprn)
417 {
418     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
419 }
420
421 static void spr_write_601_ubatu (void *opaque, int sprn, int gprn)
422 {
423     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
424     gen_helper_store_601_batl(t0, cpu_gpr[gprn]);
425     tcg_temp_free_i32(t0);
426 }
427
428 static void spr_write_601_ubatl (void *opaque, int sprn, int gprn)
429 {
430     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
431     gen_helper_store_601_batu(t0, cpu_gpr[gprn]);
432     tcg_temp_free_i32(t0);
433 }
434 #endif
435
436 /* PowerPC 40x specific registers */
437 #if !defined(CONFIG_USER_ONLY)
438 static void spr_read_40x_pit (void *opaque, int gprn, int sprn)
439 {
440     gen_helper_load_40x_pit(cpu_gpr[gprn]);
441 }
442
443 static void spr_write_40x_pit (void *opaque, int sprn, int gprn)
444 {
445     gen_helper_store_40x_pit(cpu_gpr[gprn]);
446 }
447
448 static void spr_write_40x_dbcr0 (void *opaque, int sprn, int gprn)
449 {
450     DisasContext *ctx = opaque;
451
452     gen_helper_store_40x_dbcr0(cpu_gpr[gprn]);
453     /* We must stop translation as we may have rebooted */
454     gen_stop_exception(ctx);
455 }
456
457 static void spr_write_40x_sler (void *opaque, int sprn, int gprn)
458 {
459     gen_helper_store_40x_sler(cpu_gpr[gprn]);
460 }
461
462 static void spr_write_booke_tcr (void *opaque, int sprn, int gprn)
463 {
464     gen_helper_store_booke_tcr(cpu_gpr[gprn]);
465 }
466
467 static void spr_write_booke_tsr (void *opaque, int sprn, int gprn)
468 {
469     gen_helper_store_booke_tsr(cpu_gpr[gprn]);
470 }
471 #endif
472
473 /* PowerPC 403 specific registers */
474 /* PBL1 / PBU1 / PBL2 / PBU2 */
475 #if !defined(CONFIG_USER_ONLY)
476 static void spr_read_403_pbr (void *opaque, int gprn, int sprn)
477 {
478     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUState, pb[sprn - SPR_403_PBL1]));
479 }
480
481 static void spr_write_403_pbr (void *opaque, int sprn, int gprn)
482 {
483     TCGv_i32 t0 = tcg_const_i32(sprn - SPR_403_PBL1);
484     gen_helper_store_403_pbr(t0, cpu_gpr[gprn]);
485     tcg_temp_free_i32(t0);
486 }
487
488 static void spr_write_pir (void *opaque, int sprn, int gprn)
489 {
490     TCGv t0 = tcg_temp_new();
491     tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF);
492     gen_store_spr(SPR_PIR, t0);
493     tcg_temp_free(t0);
494 }
495 #endif
496
497 /* SPE specific registers */
498 static void spr_read_spefscr (void *opaque, int gprn, int sprn)
499 {
500     TCGv_i32 t0 = tcg_temp_new_i32();
501     tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUState, spe_fscr));
502     tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0);
503     tcg_temp_free_i32(t0);
504 }
505
506 static void spr_write_spefscr (void *opaque, int sprn, int gprn)
507 {
508     TCGv_i32 t0 = tcg_temp_new_i32();
509     tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]);
510     tcg_gen_st_i32(t0, cpu_env, offsetof(CPUState, spe_fscr));
511     tcg_temp_free_i32(t0);
512 }
513
514 #if !defined(CONFIG_USER_ONLY)
515 /* Callback used to write the exception vector base */
516 static void spr_write_excp_prefix (void *opaque, int sprn, int gprn)
517 {
518     TCGv t0 = tcg_temp_new();
519     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, ivpr_mask));
520     tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
521     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_prefix));
522     gen_store_spr(sprn, t0);
523     tcg_temp_free(t0);
524 }
525
526 static void spr_write_excp_vector (void *opaque, int sprn, int gprn)
527 {
528     DisasContext *ctx = opaque;
529
530     if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
531         TCGv t0 = tcg_temp_new();
532         tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, ivor_mask));
533         tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
534         tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_vectors[sprn - SPR_BOOKE_IVOR0]));
535         gen_store_spr(sprn, t0);
536         tcg_temp_free(t0);
537     } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
538         TCGv t0 = tcg_temp_new();
539         tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUState, ivor_mask));
540         tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
541         tcg_gen_st_tl(t0, cpu_env, offsetof(CPUState, excp_vectors[sprn - SPR_BOOKE_IVOR32 + 32]));
542         gen_store_spr(sprn, t0);
543         tcg_temp_free(t0);
544     } else {
545         printf("Trying to write an unknown exception vector %d %03x\n",
546                sprn, sprn);
547         gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
548     }
549 }
550 #endif
551
552 static inline void vscr_init (CPUPPCState *env, uint32_t val)
553 {
554     env->vscr = val;
555     /* Altivec always uses round-to-nearest */
556     set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
557     set_flush_to_zero(vscr_nj, &env->vec_status);
558 }
559
560 #if defined(CONFIG_USER_ONLY)
561 #define spr_register(env, num, name, uea_read, uea_write,                     \
562                      oea_read, oea_write, initial_value)                      \
563 do {                                                                          \
564      _spr_register(env, num, name, uea_read, uea_write, initial_value);       \
565 } while (0)
566 static inline void _spr_register (CPUPPCState *env, int num,
567                                   const char *name,
568                                   void (*uea_read)(void *opaque, int gprn, int sprn),
569                                   void (*uea_write)(void *opaque, int sprn, int gprn),
570                                   target_ulong initial_value)
571 #else
572 static inline void spr_register (CPUPPCState *env, int num,
573                                  const char *name,
574                                  void (*uea_read)(void *opaque, int gprn, int sprn),
575                                  void (*uea_write)(void *opaque, int sprn, int gprn),
576                                  void (*oea_read)(void *opaque, int gprn, int sprn),
577                                  void (*oea_write)(void *opaque, int sprn, int gprn),
578                                  target_ulong initial_value)
579 #endif
580 {
581     ppc_spr_t *spr;
582
583     spr = &env->spr_cb[num];
584     if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
585 #if !defined(CONFIG_USER_ONLY)
586         spr->oea_read != NULL || spr->oea_write != NULL ||
587 #endif
588         spr->uea_read != NULL || spr->uea_write != NULL) {
589         printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
590         exit(1);
591     }
592 #if defined(PPC_DEBUG_SPR)
593     printf("*** register spr %d (%03x) %s val " TARGET_FMT_lx "\n", num, num,
594            name, initial_value);
595 #endif
596     spr->name = name;
597     spr->uea_read = uea_read;
598     spr->uea_write = uea_write;
599 #if !defined(CONFIG_USER_ONLY)
600     spr->oea_read = oea_read;
601     spr->oea_write = oea_write;
602 #endif
603     env->spr[num] = initial_value;
604 }
605
606 /* Generic PowerPC SPRs */
607 static void gen_spr_generic (CPUPPCState *env)
608 {
609     /* Integer processing */
610     spr_register(env, SPR_XER, "XER",
611                  &spr_read_xer, &spr_write_xer,
612                  &spr_read_xer, &spr_write_xer,
613                  0x00000000);
614     /* Branch contol */
615     spr_register(env, SPR_LR, "LR",
616                  &spr_read_lr, &spr_write_lr,
617                  &spr_read_lr, &spr_write_lr,
618                  0x00000000);
619     spr_register(env, SPR_CTR, "CTR",
620                  &spr_read_ctr, &spr_write_ctr,
621                  &spr_read_ctr, &spr_write_ctr,
622                  0x00000000);
623     /* Interrupt processing */
624     spr_register(env, SPR_SRR0, "SRR0",
625                  SPR_NOACCESS, SPR_NOACCESS,
626                  &spr_read_generic, &spr_write_generic,
627                  0x00000000);
628     spr_register(env, SPR_SRR1, "SRR1",
629                  SPR_NOACCESS, SPR_NOACCESS,
630                  &spr_read_generic, &spr_write_generic,
631                  0x00000000);
632     /* Processor control */
633     spr_register(env, SPR_SPRG0, "SPRG0",
634                  SPR_NOACCESS, SPR_NOACCESS,
635                  &spr_read_generic, &spr_write_generic,
636                  0x00000000);
637     spr_register(env, SPR_SPRG1, "SPRG1",
638                  SPR_NOACCESS, SPR_NOACCESS,
639                  &spr_read_generic, &spr_write_generic,
640                  0x00000000);
641     spr_register(env, SPR_SPRG2, "SPRG2",
642                  SPR_NOACCESS, SPR_NOACCESS,
643                  &spr_read_generic, &spr_write_generic,
644                  0x00000000);
645     spr_register(env, SPR_SPRG3, "SPRG3",
646                  SPR_NOACCESS, SPR_NOACCESS,
647                  &spr_read_generic, &spr_write_generic,
648                  0x00000000);
649 }
650
651 /* SPR common to all non-embedded PowerPC, including 601 */
652 static void gen_spr_ne_601 (CPUPPCState *env)
653 {
654     /* Exception processing */
655     spr_register(env, SPR_DSISR, "DSISR",
656                  SPR_NOACCESS, SPR_NOACCESS,
657                  &spr_read_generic, &spr_write_generic,
658                  0x00000000);
659     spr_register(env, SPR_DAR, "DAR",
660                  SPR_NOACCESS, SPR_NOACCESS,
661                  &spr_read_generic, &spr_write_generic,
662                  0x00000000);
663     /* Timer */
664     spr_register(env, SPR_DECR, "DECR",
665                  SPR_NOACCESS, SPR_NOACCESS,
666                  &spr_read_decr, &spr_write_decr,
667                  0x00000000);
668     /* Memory management */
669     spr_register(env, SPR_SDR1, "SDR1",
670                  SPR_NOACCESS, SPR_NOACCESS,
671                  &spr_read_generic, &spr_write_sdr1,
672                  0x00000000);
673 }
674
675 /* BATs 0-3 */
676 static void gen_low_BATs (CPUPPCState *env)
677 {
678 #if !defined(CONFIG_USER_ONLY)
679     spr_register(env, SPR_IBAT0U, "IBAT0U",
680                  SPR_NOACCESS, SPR_NOACCESS,
681                  &spr_read_ibat, &spr_write_ibatu,
682                  0x00000000);
683     spr_register(env, SPR_IBAT0L, "IBAT0L",
684                  SPR_NOACCESS, SPR_NOACCESS,
685                  &spr_read_ibat, &spr_write_ibatl,
686                  0x00000000);
687     spr_register(env, SPR_IBAT1U, "IBAT1U",
688                  SPR_NOACCESS, SPR_NOACCESS,
689                  &spr_read_ibat, &spr_write_ibatu,
690                  0x00000000);
691     spr_register(env, SPR_IBAT1L, "IBAT1L",
692                  SPR_NOACCESS, SPR_NOACCESS,
693                  &spr_read_ibat, &spr_write_ibatl,
694                  0x00000000);
695     spr_register(env, SPR_IBAT2U, "IBAT2U",
696                  SPR_NOACCESS, SPR_NOACCESS,
697                  &spr_read_ibat, &spr_write_ibatu,
698                  0x00000000);
699     spr_register(env, SPR_IBAT2L, "IBAT2L",
700                  SPR_NOACCESS, SPR_NOACCESS,
701                  &spr_read_ibat, &spr_write_ibatl,
702                  0x00000000);
703     spr_register(env, SPR_IBAT3U, "IBAT3U",
704                  SPR_NOACCESS, SPR_NOACCESS,
705                  &spr_read_ibat, &spr_write_ibatu,
706                  0x00000000);
707     spr_register(env, SPR_IBAT3L, "IBAT3L",
708                  SPR_NOACCESS, SPR_NOACCESS,
709                  &spr_read_ibat, &spr_write_ibatl,
710                  0x00000000);
711     spr_register(env, SPR_DBAT0U, "DBAT0U",
712                  SPR_NOACCESS, SPR_NOACCESS,
713                  &spr_read_dbat, &spr_write_dbatu,
714                  0x00000000);
715     spr_register(env, SPR_DBAT0L, "DBAT0L",
716                  SPR_NOACCESS, SPR_NOACCESS,
717                  &spr_read_dbat, &spr_write_dbatl,
718                  0x00000000);
719     spr_register(env, SPR_DBAT1U, "DBAT1U",
720                  SPR_NOACCESS, SPR_NOACCESS,
721                  &spr_read_dbat, &spr_write_dbatu,
722                  0x00000000);
723     spr_register(env, SPR_DBAT1L, "DBAT1L",
724                  SPR_NOACCESS, SPR_NOACCESS,
725                  &spr_read_dbat, &spr_write_dbatl,
726                  0x00000000);
727     spr_register(env, SPR_DBAT2U, "DBAT2U",
728                  SPR_NOACCESS, SPR_NOACCESS,
729                  &spr_read_dbat, &spr_write_dbatu,
730                  0x00000000);
731     spr_register(env, SPR_DBAT2L, "DBAT2L",
732                  SPR_NOACCESS, SPR_NOACCESS,
733                  &spr_read_dbat, &spr_write_dbatl,
734                  0x00000000);
735     spr_register(env, SPR_DBAT3U, "DBAT3U",
736                  SPR_NOACCESS, SPR_NOACCESS,
737                  &spr_read_dbat, &spr_write_dbatu,
738                  0x00000000);
739     spr_register(env, SPR_DBAT3L, "DBAT3L",
740                  SPR_NOACCESS, SPR_NOACCESS,
741                  &spr_read_dbat, &spr_write_dbatl,
742                  0x00000000);
743     env->nb_BATs += 4;
744 #endif
745 }
746
747 /* BATs 4-7 */
748 static void gen_high_BATs (CPUPPCState *env)
749 {
750 #if !defined(CONFIG_USER_ONLY)
751     spr_register(env, SPR_IBAT4U, "IBAT4U",
752                  SPR_NOACCESS, SPR_NOACCESS,
753                  &spr_read_ibat_h, &spr_write_ibatu_h,
754                  0x00000000);
755     spr_register(env, SPR_IBAT4L, "IBAT4L",
756                  SPR_NOACCESS, SPR_NOACCESS,
757                  &spr_read_ibat_h, &spr_write_ibatl_h,
758                  0x00000000);
759     spr_register(env, SPR_IBAT5U, "IBAT5U",
760                  SPR_NOACCESS, SPR_NOACCESS,
761                  &spr_read_ibat_h, &spr_write_ibatu_h,
762                  0x00000000);
763     spr_register(env, SPR_IBAT5L, "IBAT5L",
764                  SPR_NOACCESS, SPR_NOACCESS,
765                  &spr_read_ibat_h, &spr_write_ibatl_h,
766                  0x00000000);
767     spr_register(env, SPR_IBAT6U, "IBAT6U",
768                  SPR_NOACCESS, SPR_NOACCESS,
769                  &spr_read_ibat_h, &spr_write_ibatu_h,
770                  0x00000000);
771     spr_register(env, SPR_IBAT6L, "IBAT6L",
772                  SPR_NOACCESS, SPR_NOACCESS,
773                  &spr_read_ibat_h, &spr_write_ibatl_h,
774                  0x00000000);
775     spr_register(env, SPR_IBAT7U, "IBAT7U",
776                  SPR_NOACCESS, SPR_NOACCESS,
777                  &spr_read_ibat_h, &spr_write_ibatu_h,
778                  0x00000000);
779     spr_register(env, SPR_IBAT7L, "IBAT7L",
780                  SPR_NOACCESS, SPR_NOACCESS,
781                  &spr_read_ibat_h, &spr_write_ibatl_h,
782                  0x00000000);
783     spr_register(env, SPR_DBAT4U, "DBAT4U",
784                  SPR_NOACCESS, SPR_NOACCESS,
785                  &spr_read_dbat_h, &spr_write_dbatu_h,
786                  0x00000000);
787     spr_register(env, SPR_DBAT4L, "DBAT4L",
788                  SPR_NOACCESS, SPR_NOACCESS,
789                  &spr_read_dbat_h, &spr_write_dbatl_h,
790                  0x00000000);
791     spr_register(env, SPR_DBAT5U, "DBAT5U",
792                  SPR_NOACCESS, SPR_NOACCESS,
793                  &spr_read_dbat_h, &spr_write_dbatu_h,
794                  0x00000000);
795     spr_register(env, SPR_DBAT5L, "DBAT5L",
796                  SPR_NOACCESS, SPR_NOACCESS,
797                  &spr_read_dbat_h, &spr_write_dbatl_h,
798                  0x00000000);
799     spr_register(env, SPR_DBAT6U, "DBAT6U",
800                  SPR_NOACCESS, SPR_NOACCESS,
801                  &spr_read_dbat_h, &spr_write_dbatu_h,
802                  0x00000000);
803     spr_register(env, SPR_DBAT6L, "DBAT6L",
804                  SPR_NOACCESS, SPR_NOACCESS,
805                  &spr_read_dbat_h, &spr_write_dbatl_h,
806                  0x00000000);
807     spr_register(env, SPR_DBAT7U, "DBAT7U",
808                  SPR_NOACCESS, SPR_NOACCESS,
809                  &spr_read_dbat_h, &spr_write_dbatu_h,
810                  0x00000000);
811     spr_register(env, SPR_DBAT7L, "DBAT7L",
812                  SPR_NOACCESS, SPR_NOACCESS,
813                  &spr_read_dbat_h, &spr_write_dbatl_h,
814                  0x00000000);
815     env->nb_BATs += 4;
816 #endif
817 }
818
819 /* Generic PowerPC time base */
820 static void gen_tbl (CPUPPCState *env)
821 {
822     spr_register(env, SPR_VTBL,  "TBL",
823                  &spr_read_tbl, SPR_NOACCESS,
824                  &spr_read_tbl, SPR_NOACCESS,
825                  0x00000000);
826     spr_register(env, SPR_TBL,   "TBL",
827                  &spr_read_tbl, SPR_NOACCESS,
828                  &spr_read_tbl, &spr_write_tbl,
829                  0x00000000);
830     spr_register(env, SPR_VTBU,  "TBU",
831                  &spr_read_tbu, SPR_NOACCESS,
832                  &spr_read_tbu, SPR_NOACCESS,
833                  0x00000000);
834     spr_register(env, SPR_TBU,   "TBU",
835                  &spr_read_tbu, SPR_NOACCESS,
836                  &spr_read_tbu, &spr_write_tbu,
837                  0x00000000);
838 }
839
840 /* Softare table search registers */
841 static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
842 {
843 #if !defined(CONFIG_USER_ONLY)
844     env->nb_tlb = nb_tlbs;
845     env->nb_ways = nb_ways;
846     env->id_tlbs = 1;
847     spr_register(env, SPR_DMISS, "DMISS",
848                  SPR_NOACCESS, SPR_NOACCESS,
849                  &spr_read_generic, SPR_NOACCESS,
850                  0x00000000);
851     spr_register(env, SPR_DCMP, "DCMP",
852                  SPR_NOACCESS, SPR_NOACCESS,
853                  &spr_read_generic, SPR_NOACCESS,
854                  0x00000000);
855     spr_register(env, SPR_HASH1, "HASH1",
856                  SPR_NOACCESS, SPR_NOACCESS,
857                  &spr_read_generic, SPR_NOACCESS,
858                  0x00000000);
859     spr_register(env, SPR_HASH2, "HASH2",
860                  SPR_NOACCESS, SPR_NOACCESS,
861                  &spr_read_generic, SPR_NOACCESS,
862                  0x00000000);
863     spr_register(env, SPR_IMISS, "IMISS",
864                  SPR_NOACCESS, SPR_NOACCESS,
865                  &spr_read_generic, SPR_NOACCESS,
866                  0x00000000);
867     spr_register(env, SPR_ICMP, "ICMP",
868                  SPR_NOACCESS, SPR_NOACCESS,
869                  &spr_read_generic, SPR_NOACCESS,
870                  0x00000000);
871     spr_register(env, SPR_RPA, "RPA",
872                  SPR_NOACCESS, SPR_NOACCESS,
873                  &spr_read_generic, &spr_write_generic,
874                  0x00000000);
875 #endif
876 }
877
878 /* SPR common to MPC755 and G2 */
879 static void gen_spr_G2_755 (CPUPPCState *env)
880 {
881     /* SGPRs */
882     spr_register(env, SPR_SPRG4, "SPRG4",
883                  SPR_NOACCESS, SPR_NOACCESS,
884                  &spr_read_generic, &spr_write_generic,
885                  0x00000000);
886     spr_register(env, SPR_SPRG5, "SPRG5",
887                  SPR_NOACCESS, SPR_NOACCESS,
888                  &spr_read_generic, &spr_write_generic,
889                  0x00000000);
890     spr_register(env, SPR_SPRG6, "SPRG6",
891                  SPR_NOACCESS, SPR_NOACCESS,
892                  &spr_read_generic, &spr_write_generic,
893                  0x00000000);
894     spr_register(env, SPR_SPRG7, "SPRG7",
895                  SPR_NOACCESS, SPR_NOACCESS,
896                  &spr_read_generic, &spr_write_generic,
897                  0x00000000);
898 }
899
900 /* SPR common to all 7xx PowerPC implementations */
901 static void gen_spr_7xx (CPUPPCState *env)
902 {
903     /* Breakpoints */
904     /* XXX : not implemented */
905     spr_register(env, SPR_DABR, "DABR",
906                  SPR_NOACCESS, SPR_NOACCESS,
907                  &spr_read_generic, &spr_write_generic,
908                  0x00000000);
909     /* XXX : not implemented */
910     spr_register(env, SPR_IABR, "IABR",
911                  SPR_NOACCESS, SPR_NOACCESS,
912                  &spr_read_generic, &spr_write_generic,
913                  0x00000000);
914     /* Cache management */
915     /* XXX : not implemented */
916     spr_register(env, SPR_ICTC, "ICTC",
917                  SPR_NOACCESS, SPR_NOACCESS,
918                  &spr_read_generic, &spr_write_generic,
919                  0x00000000);
920     /* Performance monitors */
921     /* XXX : not implemented */
922     spr_register(env, SPR_MMCR0, "MMCR0",
923                  SPR_NOACCESS, SPR_NOACCESS,
924                  &spr_read_generic, &spr_write_generic,
925                  0x00000000);
926     /* XXX : not implemented */
927     spr_register(env, SPR_MMCR1, "MMCR1",
928                  SPR_NOACCESS, SPR_NOACCESS,
929                  &spr_read_generic, &spr_write_generic,
930                  0x00000000);
931     /* XXX : not implemented */
932     spr_register(env, SPR_PMC1, "PMC1",
933                  SPR_NOACCESS, SPR_NOACCESS,
934                  &spr_read_generic, &spr_write_generic,
935                  0x00000000);
936     /* XXX : not implemented */
937     spr_register(env, SPR_PMC2, "PMC2",
938                  SPR_NOACCESS, SPR_NOACCESS,
939                  &spr_read_generic, &spr_write_generic,
940                  0x00000000);
941     /* XXX : not implemented */
942     spr_register(env, SPR_PMC3, "PMC3",
943                  SPR_NOACCESS, SPR_NOACCESS,
944                  &spr_read_generic, &spr_write_generic,
945                  0x00000000);
946     /* XXX : not implemented */
947     spr_register(env, SPR_PMC4, "PMC4",
948                  SPR_NOACCESS, SPR_NOACCESS,
949                  &spr_read_generic, &spr_write_generic,
950                  0x00000000);
951     /* XXX : not implemented */
952     spr_register(env, SPR_SIAR, "SIAR",
953                  SPR_NOACCESS, SPR_NOACCESS,
954                  &spr_read_generic, SPR_NOACCESS,
955                  0x00000000);
956     /* XXX : not implemented */
957     spr_register(env, SPR_UMMCR0, "UMMCR0",
958                  &spr_read_ureg, SPR_NOACCESS,
959                  &spr_read_ureg, SPR_NOACCESS,
960                  0x00000000);
961     /* XXX : not implemented */
962     spr_register(env, SPR_UMMCR1, "UMMCR1",
963                  &spr_read_ureg, SPR_NOACCESS,
964                  &spr_read_ureg, SPR_NOACCESS,
965                  0x00000000);
966     /* XXX : not implemented */
967     spr_register(env, SPR_UPMC1, "UPMC1",
968                  &spr_read_ureg, SPR_NOACCESS,
969                  &spr_read_ureg, SPR_NOACCESS,
970                  0x00000000);
971     /* XXX : not implemented */
972     spr_register(env, SPR_UPMC2, "UPMC2",
973                  &spr_read_ureg, SPR_NOACCESS,
974                  &spr_read_ureg, SPR_NOACCESS,
975                  0x00000000);
976     /* XXX : not implemented */
977     spr_register(env, SPR_UPMC3, "UPMC3",
978                  &spr_read_ureg, SPR_NOACCESS,
979                  &spr_read_ureg, SPR_NOACCESS,
980                  0x00000000);
981     /* XXX : not implemented */
982     spr_register(env, SPR_UPMC4, "UPMC4",
983                  &spr_read_ureg, SPR_NOACCESS,
984                  &spr_read_ureg, SPR_NOACCESS,
985                  0x00000000);
986     /* XXX : not implemented */
987     spr_register(env, SPR_USIAR, "USIAR",
988                  &spr_read_ureg, SPR_NOACCESS,
989                  &spr_read_ureg, SPR_NOACCESS,
990                  0x00000000);
991     /* External access control */
992     /* XXX : not implemented */
993     spr_register(env, SPR_EAR, "EAR",
994                  SPR_NOACCESS, SPR_NOACCESS,
995                  &spr_read_generic, &spr_write_generic,
996                  0x00000000);
997 }
998
999 static void gen_spr_thrm (CPUPPCState *env)
1000 {
1001     /* Thermal management */
1002     /* XXX : not implemented */
1003     spr_register(env, SPR_THRM1, "THRM1",
1004                  SPR_NOACCESS, SPR_NOACCESS,
1005                  &spr_read_generic, &spr_write_generic,
1006                  0x00000000);
1007     /* XXX : not implemented */
1008     spr_register(env, SPR_THRM2, "THRM2",
1009                  SPR_NOACCESS, SPR_NOACCESS,
1010                  &spr_read_generic, &spr_write_generic,
1011                  0x00000000);
1012     /* XXX : not implemented */
1013     spr_register(env, SPR_THRM3, "THRM3",
1014                  SPR_NOACCESS, SPR_NOACCESS,
1015                  &spr_read_generic, &spr_write_generic,
1016                  0x00000000);
1017 }
1018
1019 /* SPR specific to PowerPC 604 implementation */
1020 static void gen_spr_604 (CPUPPCState *env)
1021 {
1022     /* Processor identification */
1023     spr_register(env, SPR_PIR, "PIR",
1024                  SPR_NOACCESS, SPR_NOACCESS,
1025                  &spr_read_generic, &spr_write_pir,
1026                  0x00000000);
1027     /* Breakpoints */
1028     /* XXX : not implemented */
1029     spr_register(env, SPR_IABR, "IABR",
1030                  SPR_NOACCESS, SPR_NOACCESS,
1031                  &spr_read_generic, &spr_write_generic,
1032                  0x00000000);
1033     /* XXX : not implemented */
1034     spr_register(env, SPR_DABR, "DABR",
1035                  SPR_NOACCESS, SPR_NOACCESS,
1036                  &spr_read_generic, &spr_write_generic,
1037                  0x00000000);
1038     /* Performance counters */
1039     /* XXX : not implemented */
1040     spr_register(env, SPR_MMCR0, "MMCR0",
1041                  SPR_NOACCESS, SPR_NOACCESS,
1042                  &spr_read_generic, &spr_write_generic,
1043                  0x00000000);
1044     /* XXX : not implemented */
1045     spr_register(env, SPR_PMC1, "PMC1",
1046                  SPR_NOACCESS, SPR_NOACCESS,
1047                  &spr_read_generic, &spr_write_generic,
1048                  0x00000000);
1049     /* XXX : not implemented */
1050     spr_register(env, SPR_PMC2, "PMC2",
1051                  SPR_NOACCESS, SPR_NOACCESS,
1052                  &spr_read_generic, &spr_write_generic,
1053                  0x00000000);
1054     /* XXX : not implemented */
1055     spr_register(env, SPR_SIAR, "SIAR",
1056                  SPR_NOACCESS, SPR_NOACCESS,
1057                  &spr_read_generic, SPR_NOACCESS,
1058                  0x00000000);
1059     /* XXX : not implemented */
1060     spr_register(env, SPR_SDA, "SDA",
1061                  SPR_NOACCESS, SPR_NOACCESS,
1062                  &spr_read_generic, SPR_NOACCESS,
1063                  0x00000000);
1064     /* External access control */
1065     /* XXX : not implemented */
1066     spr_register(env, SPR_EAR, "EAR",
1067                  SPR_NOACCESS, SPR_NOACCESS,
1068                  &spr_read_generic, &spr_write_generic,
1069                  0x00000000);
1070 }
1071
1072 /* SPR specific to PowerPC 603 implementation */
1073 static void gen_spr_603 (CPUPPCState *env)
1074 {
1075     /* External access control */
1076     /* XXX : not implemented */
1077     spr_register(env, SPR_EAR, "EAR",
1078                  SPR_NOACCESS, SPR_NOACCESS,
1079                  &spr_read_generic, &spr_write_generic,
1080                  0x00000000);
1081 }
1082
1083 /* SPR specific to PowerPC G2 implementation */
1084 static void gen_spr_G2 (CPUPPCState *env)
1085 {
1086     /* Memory base address */
1087     /* MBAR */
1088     /* XXX : not implemented */
1089     spr_register(env, SPR_MBAR, "MBAR",
1090                  SPR_NOACCESS, SPR_NOACCESS,
1091                  &spr_read_generic, &spr_write_generic,
1092                  0x00000000);
1093     /* Exception processing */
1094     spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1095                  SPR_NOACCESS, SPR_NOACCESS,
1096                  &spr_read_generic, &spr_write_generic,
1097                  0x00000000);
1098     spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1099                  SPR_NOACCESS, SPR_NOACCESS,
1100                  &spr_read_generic, &spr_write_generic,
1101                  0x00000000);
1102     /* Breakpoints */
1103     /* XXX : not implemented */
1104     spr_register(env, SPR_DABR, "DABR",
1105                  SPR_NOACCESS, SPR_NOACCESS,
1106                  &spr_read_generic, &spr_write_generic,
1107                  0x00000000);
1108     /* XXX : not implemented */
1109     spr_register(env, SPR_DABR2, "DABR2",
1110                  SPR_NOACCESS, SPR_NOACCESS,
1111                  &spr_read_generic, &spr_write_generic,
1112                  0x00000000);
1113     /* XXX : not implemented */
1114     spr_register(env, SPR_IABR, "IABR",
1115                  SPR_NOACCESS, SPR_NOACCESS,
1116                  &spr_read_generic, &spr_write_generic,
1117                  0x00000000);
1118     /* XXX : not implemented */
1119     spr_register(env, SPR_IABR2, "IABR2",
1120                  SPR_NOACCESS, SPR_NOACCESS,
1121                  &spr_read_generic, &spr_write_generic,
1122                  0x00000000);
1123     /* XXX : not implemented */
1124     spr_register(env, SPR_IBCR, "IBCR",
1125                  SPR_NOACCESS, SPR_NOACCESS,
1126                  &spr_read_generic, &spr_write_generic,
1127                  0x00000000);
1128     /* XXX : not implemented */
1129     spr_register(env, SPR_DBCR, "DBCR",
1130                  SPR_NOACCESS, SPR_NOACCESS,
1131                  &spr_read_generic, &spr_write_generic,
1132                  0x00000000);
1133 }
1134
1135 /* SPR specific to PowerPC 602 implementation */
1136 static void gen_spr_602 (CPUPPCState *env)
1137 {
1138     /* ESA registers */
1139     /* XXX : not implemented */
1140     spr_register(env, SPR_SER, "SER",
1141                  SPR_NOACCESS, SPR_NOACCESS,
1142                  &spr_read_generic, &spr_write_generic,
1143                  0x00000000);
1144     /* XXX : not implemented */
1145     spr_register(env, SPR_SEBR, "SEBR",
1146                  SPR_NOACCESS, SPR_NOACCESS,
1147                  &spr_read_generic, &spr_write_generic,
1148                  0x00000000);
1149     /* XXX : not implemented */
1150     spr_register(env, SPR_ESASRR, "ESASRR",
1151                  SPR_NOACCESS, SPR_NOACCESS,
1152                  &spr_read_generic, &spr_write_generic,
1153                  0x00000000);
1154     /* Floating point status */
1155     /* XXX : not implemented */
1156     spr_register(env, SPR_SP, "SP",
1157                  SPR_NOACCESS, SPR_NOACCESS,
1158                  &spr_read_generic, &spr_write_generic,
1159                  0x00000000);
1160     /* XXX : not implemented */
1161     spr_register(env, SPR_LT, "LT",
1162                  SPR_NOACCESS, SPR_NOACCESS,
1163                  &spr_read_generic, &spr_write_generic,
1164                  0x00000000);
1165     /* Watchdog timer */
1166     /* XXX : not implemented */
1167     spr_register(env, SPR_TCR, "TCR",
1168                  SPR_NOACCESS, SPR_NOACCESS,
1169                  &spr_read_generic, &spr_write_generic,
1170                  0x00000000);
1171     /* Interrupt base */
1172     spr_register(env, SPR_IBR, "IBR",
1173                  SPR_NOACCESS, SPR_NOACCESS,
1174                  &spr_read_generic, &spr_write_generic,
1175                  0x00000000);
1176     /* XXX : not implemented */
1177     spr_register(env, SPR_IABR, "IABR",
1178                  SPR_NOACCESS, SPR_NOACCESS,
1179                  &spr_read_generic, &spr_write_generic,
1180                  0x00000000);
1181 }
1182
1183 /* SPR specific to PowerPC 601 implementation */
1184 static void gen_spr_601 (CPUPPCState *env)
1185 {
1186     /* Multiplication/division register */
1187     /* MQ */
1188     spr_register(env, SPR_MQ, "MQ",
1189                  &spr_read_generic, &spr_write_generic,
1190                  &spr_read_generic, &spr_write_generic,
1191                  0x00000000);
1192     /* RTC registers */
1193     spr_register(env, SPR_601_RTCU, "RTCU",
1194                  SPR_NOACCESS, SPR_NOACCESS,
1195                  SPR_NOACCESS, &spr_write_601_rtcu,
1196                  0x00000000);
1197     spr_register(env, SPR_601_VRTCU, "RTCU",
1198                  &spr_read_601_rtcu, SPR_NOACCESS,
1199                  &spr_read_601_rtcu, SPR_NOACCESS,
1200                  0x00000000);
1201     spr_register(env, SPR_601_RTCL, "RTCL",
1202                  SPR_NOACCESS, SPR_NOACCESS,
1203                  SPR_NOACCESS, &spr_write_601_rtcl,
1204                  0x00000000);
1205     spr_register(env, SPR_601_VRTCL, "RTCL",
1206                  &spr_read_601_rtcl, SPR_NOACCESS,
1207                  &spr_read_601_rtcl, SPR_NOACCESS,
1208                  0x00000000);
1209     /* Timer */
1210 #if 0 /* ? */
1211     spr_register(env, SPR_601_UDECR, "UDECR",
1212                  &spr_read_decr, SPR_NOACCESS,
1213                  &spr_read_decr, SPR_NOACCESS,
1214                  0x00000000);
1215 #endif
1216     /* External access control */
1217     /* XXX : not implemented */
1218     spr_register(env, SPR_EAR, "EAR",
1219                  SPR_NOACCESS, SPR_NOACCESS,
1220                  &spr_read_generic, &spr_write_generic,
1221                  0x00000000);
1222     /* Memory management */
1223 #if !defined(CONFIG_USER_ONLY)
1224     spr_register(env, SPR_IBAT0U, "IBAT0U",
1225                  SPR_NOACCESS, SPR_NOACCESS,
1226                  &spr_read_601_ubat, &spr_write_601_ubatu,
1227                  0x00000000);
1228     spr_register(env, SPR_IBAT0L, "IBAT0L",
1229                  SPR_NOACCESS, SPR_NOACCESS,
1230                  &spr_read_601_ubat, &spr_write_601_ubatl,
1231                  0x00000000);
1232     spr_register(env, SPR_IBAT1U, "IBAT1U",
1233                  SPR_NOACCESS, SPR_NOACCESS,
1234                  &spr_read_601_ubat, &spr_write_601_ubatu,
1235                  0x00000000);
1236     spr_register(env, SPR_IBAT1L, "IBAT1L",
1237                  SPR_NOACCESS, SPR_NOACCESS,
1238                  &spr_read_601_ubat, &spr_write_601_ubatl,
1239                  0x00000000);
1240     spr_register(env, SPR_IBAT2U, "IBAT2U",
1241                  SPR_NOACCESS, SPR_NOACCESS,
1242                  &spr_read_601_ubat, &spr_write_601_ubatu,
1243                  0x00000000);
1244     spr_register(env, SPR_IBAT2L, "IBAT2L",
1245                  SPR_NOACCESS, SPR_NOACCESS,
1246                  &spr_read_601_ubat, &spr_write_601_ubatl,
1247                  0x00000000);
1248     spr_register(env, SPR_IBAT3U, "IBAT3U",
1249                  SPR_NOACCESS, SPR_NOACCESS,
1250                  &spr_read_601_ubat, &spr_write_601_ubatu,
1251                  0x00000000);
1252     spr_register(env, SPR_IBAT3L, "IBAT3L",
1253                  SPR_NOACCESS, SPR_NOACCESS,
1254                  &spr_read_601_ubat, &spr_write_601_ubatl,
1255                  0x00000000);
1256     env->nb_BATs = 4;
1257 #endif
1258 }
1259
1260 static void gen_spr_74xx (CPUPPCState *env)
1261 {
1262     /* Processor identification */
1263     spr_register(env, SPR_PIR, "PIR",
1264                  SPR_NOACCESS, SPR_NOACCESS,
1265                  &spr_read_generic, &spr_write_pir,
1266                  0x00000000);
1267     /* XXX : not implemented */
1268     spr_register(env, SPR_MMCR2, "MMCR2",
1269                  SPR_NOACCESS, SPR_NOACCESS,
1270                  &spr_read_generic, &spr_write_generic,
1271                  0x00000000);
1272     /* XXX : not implemented */
1273     spr_register(env, SPR_UMMCR2, "UMMCR2",
1274                  &spr_read_ureg, SPR_NOACCESS,
1275                  &spr_read_ureg, SPR_NOACCESS,
1276                  0x00000000);
1277     /* XXX: not implemented */
1278     spr_register(env, SPR_BAMR, "BAMR",
1279                  SPR_NOACCESS, SPR_NOACCESS,
1280                  &spr_read_generic, &spr_write_generic,
1281                  0x00000000);
1282     /* XXX : not implemented */
1283     spr_register(env, SPR_MSSCR0, "MSSCR0",
1284                  SPR_NOACCESS, SPR_NOACCESS,
1285                  &spr_read_generic, &spr_write_generic,
1286                  0x00000000);
1287     /* Hardware implementation registers */
1288     /* XXX : not implemented */
1289     spr_register(env, SPR_HID0, "HID0",
1290                  SPR_NOACCESS, SPR_NOACCESS,
1291                  &spr_read_generic, &spr_write_generic,
1292                  0x00000000);
1293     /* XXX : not implemented */
1294     spr_register(env, SPR_HID1, "HID1",
1295                  SPR_NOACCESS, SPR_NOACCESS,
1296                  &spr_read_generic, &spr_write_generic,
1297                  0x00000000);
1298     /* Altivec */
1299     spr_register(env, SPR_VRSAVE, "VRSAVE",
1300                  &spr_read_generic, &spr_write_generic,
1301                  &spr_read_generic, &spr_write_generic,
1302                  0x00000000);
1303     /* XXX : not implemented */
1304     spr_register(env, SPR_L2CR, "L2CR",
1305                  SPR_NOACCESS, SPR_NOACCESS,
1306                  &spr_read_generic, &spr_write_generic,
1307                  0x00000000);
1308     /* Not strictly an SPR */
1309     vscr_init(env, 0x00010000);
1310 }
1311
1312 static void gen_l3_ctrl (CPUPPCState *env)
1313 {
1314     /* L3CR */
1315     /* XXX : not implemented */
1316     spr_register(env, SPR_L3CR, "L3CR",
1317                  SPR_NOACCESS, SPR_NOACCESS,
1318                  &spr_read_generic, &spr_write_generic,
1319                  0x00000000);
1320     /* L3ITCR0 */
1321     /* XXX : not implemented */
1322     spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1323                  SPR_NOACCESS, SPR_NOACCESS,
1324                  &spr_read_generic, &spr_write_generic,
1325                  0x00000000);
1326     /* L3PM */
1327     /* XXX : not implemented */
1328     spr_register(env, SPR_L3PM, "L3PM",
1329                  SPR_NOACCESS, SPR_NOACCESS,
1330                  &spr_read_generic, &spr_write_generic,
1331                  0x00000000);
1332 }
1333
1334 static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
1335 {
1336 #if !defined(CONFIG_USER_ONLY)
1337     env->nb_tlb = nb_tlbs;
1338     env->nb_ways = nb_ways;
1339     env->id_tlbs = 1;
1340     /* XXX : not implemented */
1341     spr_register(env, SPR_PTEHI, "PTEHI",
1342                  SPR_NOACCESS, SPR_NOACCESS,
1343                  &spr_read_generic, &spr_write_generic,
1344                  0x00000000);
1345     /* XXX : not implemented */
1346     spr_register(env, SPR_PTELO, "PTELO",
1347                  SPR_NOACCESS, SPR_NOACCESS,
1348                  &spr_read_generic, &spr_write_generic,
1349                  0x00000000);
1350     /* XXX : not implemented */
1351     spr_register(env, SPR_TLBMISS, "TLBMISS",
1352                  SPR_NOACCESS, SPR_NOACCESS,
1353                  &spr_read_generic, &spr_write_generic,
1354                  0x00000000);
1355 #endif
1356 }
1357
1358 #if !defined(CONFIG_USER_ONLY)
1359 static void spr_write_e500_l1csr0 (void *opaque, int sprn, int gprn)
1360 {
1361     TCGv t0 = tcg_temp_new();
1362
1363     tcg_gen_andi_tl(t0, cpu_gpr[gprn], ~256);
1364     gen_store_spr(sprn, t0);
1365     tcg_temp_free(t0);
1366 }
1367
1368 static void spr_write_booke206_mmucsr0 (void *opaque, int sprn, int gprn)
1369 {
1370     TCGv_i32 t0 = tcg_const_i32(sprn);
1371     gen_helper_booke206_tlbflush(t0);
1372     tcg_temp_free_i32(t0);
1373 }
1374
1375 static void spr_write_booke_pid (void *opaque, int sprn, int gprn)
1376 {
1377     TCGv_i32 t0 = tcg_const_i32(sprn);
1378     gen_helper_booke_setpid(t0, cpu_gpr[gprn]);
1379     tcg_temp_free_i32(t0);
1380 }
1381 #endif
1382
1383 static void gen_spr_usprgh (CPUPPCState *env)
1384 {
1385     spr_register(env, SPR_USPRG4, "USPRG4",
1386                  &spr_read_ureg, SPR_NOACCESS,
1387                  &spr_read_ureg, SPR_NOACCESS,
1388                  0x00000000);
1389     spr_register(env, SPR_USPRG5, "USPRG5",
1390                  &spr_read_ureg, SPR_NOACCESS,
1391                  &spr_read_ureg, SPR_NOACCESS,
1392                  0x00000000);
1393     spr_register(env, SPR_USPRG6, "USPRG6",
1394                  &spr_read_ureg, SPR_NOACCESS,
1395                  &spr_read_ureg, SPR_NOACCESS,
1396                  0x00000000);
1397     spr_register(env, SPR_USPRG7, "USPRG7",
1398                  &spr_read_ureg, SPR_NOACCESS,
1399                  &spr_read_ureg, SPR_NOACCESS,
1400                  0x00000000);
1401 }
1402
1403 /* PowerPC BookE SPR */
1404 static void gen_spr_BookE (CPUPPCState *env, uint64_t ivor_mask)
1405 {
1406     const char *ivor_names[64] = {
1407         "IVOR0",  "IVOR1",  "IVOR2",  "IVOR3",
1408         "IVOR4",  "IVOR5",  "IVOR6",  "IVOR7",
1409         "IVOR8",  "IVOR9",  "IVOR10", "IVOR11",
1410         "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1411         "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1412         "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1413         "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1414         "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1415         "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1416         "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1417         "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1418         "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1419         "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1420         "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1421         "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1422         "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1423     };
1424 #define SPR_BOOKE_IVORxx (-1)
1425     int ivor_sprn[64] = {
1426         SPR_BOOKE_IVOR0,  SPR_BOOKE_IVOR1,  SPR_BOOKE_IVOR2,  SPR_BOOKE_IVOR3,
1427         SPR_BOOKE_IVOR4,  SPR_BOOKE_IVOR5,  SPR_BOOKE_IVOR6,  SPR_BOOKE_IVOR7,
1428         SPR_BOOKE_IVOR8,  SPR_BOOKE_IVOR9,  SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1429         SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1430         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1431         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1432         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1433         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1434         SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1435         SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1436         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1437         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1438         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1439         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1440         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1441         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1442     };
1443     int i;
1444
1445     /* Interrupt processing */
1446     spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1447                  SPR_NOACCESS, SPR_NOACCESS,
1448                  &spr_read_generic, &spr_write_generic,
1449                  0x00000000);
1450     spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1451                  SPR_NOACCESS, SPR_NOACCESS,
1452                  &spr_read_generic, &spr_write_generic,
1453                  0x00000000);
1454     /* Debug */
1455     /* XXX : not implemented */
1456     spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1457                  SPR_NOACCESS, SPR_NOACCESS,
1458                  &spr_read_generic, &spr_write_generic,
1459                  0x00000000);
1460     /* XXX : not implemented */
1461     spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1462                  SPR_NOACCESS, SPR_NOACCESS,
1463                  &spr_read_generic, &spr_write_generic,
1464                  0x00000000);
1465     /* XXX : not implemented */
1466     spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1467                  SPR_NOACCESS, SPR_NOACCESS,
1468                  &spr_read_generic, &spr_write_generic,
1469                  0x00000000);
1470     /* XXX : not implemented */
1471     spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1472                  SPR_NOACCESS, SPR_NOACCESS,
1473                  &spr_read_generic, &spr_write_generic,
1474                  0x00000000);
1475     /* XXX : not implemented */
1476     spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1477                  SPR_NOACCESS, SPR_NOACCESS,
1478                  &spr_read_generic, &spr_write_generic,
1479                  0x00000000);
1480     /* XXX : not implemented */
1481     spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1482                  SPR_NOACCESS, SPR_NOACCESS,
1483                  &spr_read_generic, &spr_write_generic,
1484                  0x00000000);
1485     /* XXX : not implemented */
1486     spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1487                  SPR_NOACCESS, SPR_NOACCESS,
1488                  &spr_read_generic, &spr_write_generic,
1489                  0x00000000);
1490     /* XXX : not implemented */
1491     spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1492                  SPR_NOACCESS, SPR_NOACCESS,
1493                  &spr_read_generic, &spr_write_clear,
1494                  0x00000000);
1495     spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1496                  SPR_NOACCESS, SPR_NOACCESS,
1497                  &spr_read_generic, &spr_write_generic,
1498                  0x00000000);
1499     spr_register(env, SPR_BOOKE_ESR, "ESR",
1500                  SPR_NOACCESS, SPR_NOACCESS,
1501                  &spr_read_generic, &spr_write_generic,
1502                  0x00000000);
1503     spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1504                  SPR_NOACCESS, SPR_NOACCESS,
1505                  &spr_read_generic, &spr_write_excp_prefix,
1506                  0x00000000);
1507     /* Exception vectors */
1508     for (i = 0; i < 64; i++) {
1509         if (ivor_mask & (1ULL << i)) {
1510             if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1511                 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1512                 exit(1);
1513             }
1514             spr_register(env, ivor_sprn[i], ivor_names[i],
1515                          SPR_NOACCESS, SPR_NOACCESS,
1516                          &spr_read_generic, &spr_write_excp_vector,
1517                          0x00000000);
1518         }
1519     }
1520     spr_register(env, SPR_BOOKE_PID, "PID",
1521                  SPR_NOACCESS, SPR_NOACCESS,
1522                  &spr_read_generic, &spr_write_booke_pid,
1523                  0x00000000);
1524     spr_register(env, SPR_BOOKE_TCR, "TCR",
1525                  SPR_NOACCESS, SPR_NOACCESS,
1526                  &spr_read_generic, &spr_write_booke_tcr,
1527                  0x00000000);
1528     spr_register(env, SPR_BOOKE_TSR, "TSR",
1529                  SPR_NOACCESS, SPR_NOACCESS,
1530                  &spr_read_generic, &spr_write_booke_tsr,
1531                  0x00000000);
1532     /* Timer */
1533     spr_register(env, SPR_DECR, "DECR",
1534                  SPR_NOACCESS, SPR_NOACCESS,
1535                  &spr_read_decr, &spr_write_decr,
1536                  0x00000000);
1537     spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1538                  SPR_NOACCESS, SPR_NOACCESS,
1539                  SPR_NOACCESS, &spr_write_generic,
1540                  0x00000000);
1541     /* SPRGs */
1542     spr_register(env, SPR_USPRG0, "USPRG0",
1543                  &spr_read_generic, &spr_write_generic,
1544                  &spr_read_generic, &spr_write_generic,
1545                  0x00000000);
1546     spr_register(env, SPR_SPRG4, "SPRG4",
1547                  SPR_NOACCESS, SPR_NOACCESS,
1548                  &spr_read_generic, &spr_write_generic,
1549                  0x00000000);
1550     spr_register(env, SPR_SPRG5, "SPRG5",
1551                  SPR_NOACCESS, SPR_NOACCESS,
1552                  &spr_read_generic, &spr_write_generic,
1553                  0x00000000);
1554     spr_register(env, SPR_SPRG6, "SPRG6",
1555                  SPR_NOACCESS, SPR_NOACCESS,
1556                  &spr_read_generic, &spr_write_generic,
1557                  0x00000000);
1558     spr_register(env, SPR_SPRG7, "SPRG7",
1559                  SPR_NOACCESS, SPR_NOACCESS,
1560                  &spr_read_generic, &spr_write_generic,
1561                  0x00000000);
1562 }
1563
1564 static inline uint32_t gen_tlbncfg(uint32_t assoc, uint32_t minsize,
1565                                    uint32_t maxsize, uint32_t flags,
1566                                    uint32_t nentries)
1567 {
1568     return (assoc << TLBnCFG_ASSOC_SHIFT) |
1569            (minsize << TLBnCFG_MINSIZE_SHIFT) |
1570            (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
1571            flags | nentries;
1572 }
1573
1574 /* BookE 2.06 storage control registers */
1575 static void gen_spr_BookE206(CPUPPCState *env, uint32_t mas_mask,
1576                               uint32_t *tlbncfg)
1577 {
1578 #if !defined(CONFIG_USER_ONLY)
1579     const char *mas_names[8] = {
1580         "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1581     };
1582     int mas_sprn[8] = {
1583         SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1584         SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1585     };
1586     int i;
1587
1588     /* TLB assist registers */
1589     /* XXX : not implemented */
1590     for (i = 0; i < 8; i++) {
1591         if (mas_mask & (1 << i)) {
1592             spr_register(env, mas_sprn[i], mas_names[i],
1593                          SPR_NOACCESS, SPR_NOACCESS,
1594                          &spr_read_generic, &spr_write_generic,
1595                          0x00000000);
1596         }
1597     }
1598     if (env->nb_pids > 1) {
1599         /* XXX : not implemented */
1600         spr_register(env, SPR_BOOKE_PID1, "PID1",
1601                      SPR_NOACCESS, SPR_NOACCESS,
1602                      &spr_read_generic, &spr_write_booke_pid,
1603                      0x00000000);
1604     }
1605     if (env->nb_pids > 2) {
1606         /* XXX : not implemented */
1607         spr_register(env, SPR_BOOKE_PID2, "PID2",
1608                      SPR_NOACCESS, SPR_NOACCESS,
1609                      &spr_read_generic, &spr_write_booke_pid,
1610                      0x00000000);
1611     }
1612     /* XXX : not implemented */
1613     spr_register(env, SPR_MMUCFG, "MMUCFG",
1614                  SPR_NOACCESS, SPR_NOACCESS,
1615                  &spr_read_generic, SPR_NOACCESS,
1616                  0x00000000); /* TOFIX */
1617     switch (env->nb_ways) {
1618     case 4:
1619         spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1620                      SPR_NOACCESS, SPR_NOACCESS,
1621                      &spr_read_generic, SPR_NOACCESS,
1622                      tlbncfg[3]);
1623         /* Fallthru */
1624     case 3:
1625         spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1626                      SPR_NOACCESS, SPR_NOACCESS,
1627                      &spr_read_generic, SPR_NOACCESS,
1628                      tlbncfg[2]);
1629         /* Fallthru */
1630     case 2:
1631         spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1632                      SPR_NOACCESS, SPR_NOACCESS,
1633                      &spr_read_generic, SPR_NOACCESS,
1634                      tlbncfg[1]);
1635         /* Fallthru */
1636     case 1:
1637         spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1638                      SPR_NOACCESS, SPR_NOACCESS,
1639                      &spr_read_generic, SPR_NOACCESS,
1640                      tlbncfg[0]);
1641         /* Fallthru */
1642     case 0:
1643     default:
1644         break;
1645     }
1646 #endif
1647
1648     gen_spr_usprgh(env);
1649 }
1650
1651 /* SPR specific to PowerPC 440 implementation */
1652 static void gen_spr_440 (CPUPPCState *env)
1653 {
1654     /* Cache control */
1655     /* XXX : not implemented */
1656     spr_register(env, SPR_440_DNV0, "DNV0",
1657                  SPR_NOACCESS, SPR_NOACCESS,
1658                  &spr_read_generic, &spr_write_generic,
1659                  0x00000000);
1660     /* XXX : not implemented */
1661     spr_register(env, SPR_440_DNV1, "DNV1",
1662                  SPR_NOACCESS, SPR_NOACCESS,
1663                  &spr_read_generic, &spr_write_generic,
1664                  0x00000000);
1665     /* XXX : not implemented */
1666     spr_register(env, SPR_440_DNV2, "DNV2",
1667                  SPR_NOACCESS, SPR_NOACCESS,
1668                  &spr_read_generic, &spr_write_generic,
1669                  0x00000000);
1670     /* XXX : not implemented */
1671     spr_register(env, SPR_440_DNV3, "DNV3",
1672                  SPR_NOACCESS, SPR_NOACCESS,
1673                  &spr_read_generic, &spr_write_generic,
1674                  0x00000000);
1675     /* XXX : not implemented */
1676     spr_register(env, SPR_440_DTV0, "DTV0",
1677                  SPR_NOACCESS, SPR_NOACCESS,
1678                  &spr_read_generic, &spr_write_generic,
1679                  0x00000000);
1680     /* XXX : not implemented */
1681     spr_register(env, SPR_440_DTV1, "DTV1",
1682                  SPR_NOACCESS, SPR_NOACCESS,
1683                  &spr_read_generic, &spr_write_generic,
1684                  0x00000000);
1685     /* XXX : not implemented */
1686     spr_register(env, SPR_440_DTV2, "DTV2",
1687                  SPR_NOACCESS, SPR_NOACCESS,
1688                  &spr_read_generic, &spr_write_generic,
1689                  0x00000000);
1690     /* XXX : not implemented */
1691     spr_register(env, SPR_440_DTV3, "DTV3",
1692                  SPR_NOACCESS, SPR_NOACCESS,
1693                  &spr_read_generic, &spr_write_generic,
1694                  0x00000000);
1695     /* XXX : not implemented */
1696     spr_register(env, SPR_440_DVLIM, "DVLIM",
1697                  SPR_NOACCESS, SPR_NOACCESS,
1698                  &spr_read_generic, &spr_write_generic,
1699                  0x00000000);
1700     /* XXX : not implemented */
1701     spr_register(env, SPR_440_INV0, "INV0",
1702                  SPR_NOACCESS, SPR_NOACCESS,
1703                  &spr_read_generic, &spr_write_generic,
1704                  0x00000000);
1705     /* XXX : not implemented */
1706     spr_register(env, SPR_440_INV1, "INV1",
1707                  SPR_NOACCESS, SPR_NOACCESS,
1708                  &spr_read_generic, &spr_write_generic,
1709                  0x00000000);
1710     /* XXX : not implemented */
1711     spr_register(env, SPR_440_INV2, "INV2",
1712                  SPR_NOACCESS, SPR_NOACCESS,
1713                  &spr_read_generic, &spr_write_generic,
1714                  0x00000000);
1715     /* XXX : not implemented */
1716     spr_register(env, SPR_440_INV3, "INV3",
1717                  SPR_NOACCESS, SPR_NOACCESS,
1718                  &spr_read_generic, &spr_write_generic,
1719                  0x00000000);
1720     /* XXX : not implemented */
1721     spr_register(env, SPR_440_ITV0, "ITV0",
1722                  SPR_NOACCESS, SPR_NOACCESS,
1723                  &spr_read_generic, &spr_write_generic,
1724                  0x00000000);
1725     /* XXX : not implemented */
1726     spr_register(env, SPR_440_ITV1, "ITV1",
1727                  SPR_NOACCESS, SPR_NOACCESS,
1728                  &spr_read_generic, &spr_write_generic,
1729                  0x00000000);
1730     /* XXX : not implemented */
1731     spr_register(env, SPR_440_ITV2, "ITV2",
1732                  SPR_NOACCESS, SPR_NOACCESS,
1733                  &spr_read_generic, &spr_write_generic,
1734                  0x00000000);
1735     /* XXX : not implemented */
1736     spr_register(env, SPR_440_ITV3, "ITV3",
1737                  SPR_NOACCESS, SPR_NOACCESS,
1738                  &spr_read_generic, &spr_write_generic,
1739                  0x00000000);
1740     /* XXX : not implemented */
1741     spr_register(env, SPR_440_IVLIM, "IVLIM",
1742                  SPR_NOACCESS, SPR_NOACCESS,
1743                  &spr_read_generic, &spr_write_generic,
1744                  0x00000000);
1745     /* Cache debug */
1746     /* XXX : not implemented */
1747     spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
1748                  SPR_NOACCESS, SPR_NOACCESS,
1749                  &spr_read_generic, SPR_NOACCESS,
1750                  0x00000000);
1751     /* XXX : not implemented */
1752     spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
1753                  SPR_NOACCESS, SPR_NOACCESS,
1754                  &spr_read_generic, SPR_NOACCESS,
1755                  0x00000000);
1756     /* XXX : not implemented */
1757     spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1758                  SPR_NOACCESS, SPR_NOACCESS,
1759                  &spr_read_generic, SPR_NOACCESS,
1760                  0x00000000);
1761     /* XXX : not implemented */
1762     spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
1763                  SPR_NOACCESS, SPR_NOACCESS,
1764                  &spr_read_generic, SPR_NOACCESS,
1765                  0x00000000);
1766     /* XXX : not implemented */
1767     spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
1768                  SPR_NOACCESS, SPR_NOACCESS,
1769                  &spr_read_generic, SPR_NOACCESS,
1770                  0x00000000);
1771     /* XXX : not implemented */
1772     spr_register(env, SPR_440_DBDR, "DBDR",
1773                  SPR_NOACCESS, SPR_NOACCESS,
1774                  &spr_read_generic, &spr_write_generic,
1775                  0x00000000);
1776     /* Processor control */
1777     spr_register(env, SPR_4xx_CCR0, "CCR0",
1778                  SPR_NOACCESS, SPR_NOACCESS,
1779                  &spr_read_generic, &spr_write_generic,
1780                  0x00000000);
1781     spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1782                  SPR_NOACCESS, SPR_NOACCESS,
1783                  &spr_read_generic, SPR_NOACCESS,
1784                  0x00000000);
1785     /* Storage control */
1786     spr_register(env, SPR_440_MMUCR, "MMUCR",
1787                  SPR_NOACCESS, SPR_NOACCESS,
1788                  &spr_read_generic, &spr_write_generic,
1789                  0x00000000);
1790 }
1791
1792 /* SPR shared between PowerPC 40x implementations */
1793 static void gen_spr_40x (CPUPPCState *env)
1794 {
1795     /* Cache */
1796     /* not emulated, as Qemu do not emulate caches */
1797     spr_register(env, SPR_40x_DCCR, "DCCR",
1798                  SPR_NOACCESS, SPR_NOACCESS,
1799                  &spr_read_generic, &spr_write_generic,
1800                  0x00000000);
1801     /* not emulated, as Qemu do not emulate caches */
1802     spr_register(env, SPR_40x_ICCR, "ICCR",
1803                  SPR_NOACCESS, SPR_NOACCESS,
1804                  &spr_read_generic, &spr_write_generic,
1805                  0x00000000);
1806     /* not emulated, as Qemu do not emulate caches */
1807     spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1808                  SPR_NOACCESS, SPR_NOACCESS,
1809                  &spr_read_generic, SPR_NOACCESS,
1810                  0x00000000);
1811     /* Exception */
1812     spr_register(env, SPR_40x_DEAR, "DEAR",
1813                  SPR_NOACCESS, SPR_NOACCESS,
1814                  &spr_read_generic, &spr_write_generic,
1815                  0x00000000);
1816     spr_register(env, SPR_40x_ESR, "ESR",
1817                  SPR_NOACCESS, SPR_NOACCESS,
1818                  &spr_read_generic, &spr_write_generic,
1819                  0x00000000);
1820     spr_register(env, SPR_40x_EVPR, "EVPR",
1821                  SPR_NOACCESS, SPR_NOACCESS,
1822                  &spr_read_generic, &spr_write_excp_prefix,
1823                  0x00000000);
1824     spr_register(env, SPR_40x_SRR2, "SRR2",
1825                  &spr_read_generic, &spr_write_generic,
1826                  &spr_read_generic, &spr_write_generic,
1827                  0x00000000);
1828     spr_register(env, SPR_40x_SRR3, "SRR3",
1829                  &spr_read_generic, &spr_write_generic,
1830                  &spr_read_generic, &spr_write_generic,
1831                  0x00000000);
1832     /* Timers */
1833     spr_register(env, SPR_40x_PIT, "PIT",
1834                  SPR_NOACCESS, SPR_NOACCESS,
1835                  &spr_read_40x_pit, &spr_write_40x_pit,
1836                  0x00000000);
1837     spr_register(env, SPR_40x_TCR, "TCR",
1838                  SPR_NOACCESS, SPR_NOACCESS,
1839                  &spr_read_generic, &spr_write_booke_tcr,
1840                  0x00000000);
1841     spr_register(env, SPR_40x_TSR, "TSR",
1842                  SPR_NOACCESS, SPR_NOACCESS,
1843                  &spr_read_generic, &spr_write_booke_tsr,
1844                  0x00000000);
1845 }
1846
1847 /* SPR specific to PowerPC 405 implementation */
1848 static void gen_spr_405 (CPUPPCState *env)
1849 {
1850     /* MMU */
1851     spr_register(env, SPR_40x_PID, "PID",
1852                  SPR_NOACCESS, SPR_NOACCESS,
1853                  &spr_read_generic, &spr_write_generic,
1854                  0x00000000);
1855     spr_register(env, SPR_4xx_CCR0, "CCR0",
1856                  SPR_NOACCESS, SPR_NOACCESS,
1857                  &spr_read_generic, &spr_write_generic,
1858                  0x00700000);
1859     /* Debug interface */
1860     /* XXX : not implemented */
1861     spr_register(env, SPR_40x_DBCR0, "DBCR0",
1862                  SPR_NOACCESS, SPR_NOACCESS,
1863                  &spr_read_generic, &spr_write_40x_dbcr0,
1864                  0x00000000);
1865     /* XXX : not implemented */
1866     spr_register(env, SPR_405_DBCR1, "DBCR1",
1867                  SPR_NOACCESS, SPR_NOACCESS,
1868                  &spr_read_generic, &spr_write_generic,
1869                  0x00000000);
1870     /* XXX : not implemented */
1871     spr_register(env, SPR_40x_DBSR, "DBSR",
1872                  SPR_NOACCESS, SPR_NOACCESS,
1873                  &spr_read_generic, &spr_write_clear,
1874                  /* Last reset was system reset */
1875                  0x00000300);
1876     /* XXX : not implemented */
1877     spr_register(env, SPR_40x_DAC1, "DAC1",
1878                  SPR_NOACCESS, SPR_NOACCESS,
1879                  &spr_read_generic, &spr_write_generic,
1880                  0x00000000);
1881     spr_register(env, SPR_40x_DAC2, "DAC2",
1882                  SPR_NOACCESS, SPR_NOACCESS,
1883                  &spr_read_generic, &spr_write_generic,
1884                  0x00000000);
1885     /* XXX : not implemented */
1886     spr_register(env, SPR_405_DVC1, "DVC1",
1887                  SPR_NOACCESS, SPR_NOACCESS,
1888                  &spr_read_generic, &spr_write_generic,
1889                  0x00000000);
1890     /* XXX : not implemented */
1891     spr_register(env, SPR_405_DVC2, "DVC2",
1892                  SPR_NOACCESS, SPR_NOACCESS,
1893                  &spr_read_generic, &spr_write_generic,
1894                  0x00000000);
1895     /* XXX : not implemented */
1896     spr_register(env, SPR_40x_IAC1, "IAC1",
1897                  SPR_NOACCESS, SPR_NOACCESS,
1898                  &spr_read_generic, &spr_write_generic,
1899                  0x00000000);
1900     spr_register(env, SPR_40x_IAC2, "IAC2",
1901                  SPR_NOACCESS, SPR_NOACCESS,
1902                  &spr_read_generic, &spr_write_generic,
1903                  0x00000000);
1904     /* XXX : not implemented */
1905     spr_register(env, SPR_405_IAC3, "IAC3",
1906                  SPR_NOACCESS, SPR_NOACCESS,
1907                  &spr_read_generic, &spr_write_generic,
1908                  0x00000000);
1909     /* XXX : not implemented */
1910     spr_register(env, SPR_405_IAC4, "IAC4",
1911                  SPR_NOACCESS, SPR_NOACCESS,
1912                  &spr_read_generic, &spr_write_generic,
1913                  0x00000000);
1914     /* Storage control */
1915     /* XXX: TODO: not implemented */
1916     spr_register(env, SPR_405_SLER, "SLER",
1917                  SPR_NOACCESS, SPR_NOACCESS,
1918                  &spr_read_generic, &spr_write_40x_sler,
1919                  0x00000000);
1920     spr_register(env, SPR_40x_ZPR, "ZPR",
1921                  SPR_NOACCESS, SPR_NOACCESS,
1922                  &spr_read_generic, &spr_write_generic,
1923                  0x00000000);
1924     /* XXX : not implemented */
1925     spr_register(env, SPR_405_SU0R, "SU0R",
1926                  SPR_NOACCESS, SPR_NOACCESS,
1927                  &spr_read_generic, &spr_write_generic,
1928                  0x00000000);
1929     /* SPRG */
1930     spr_register(env, SPR_USPRG0, "USPRG0",
1931                  &spr_read_ureg, SPR_NOACCESS,
1932                  &spr_read_ureg, SPR_NOACCESS,
1933                  0x00000000);
1934     spr_register(env, SPR_SPRG4, "SPRG4",
1935                  SPR_NOACCESS, SPR_NOACCESS,
1936                  &spr_read_generic, &spr_write_generic,
1937                  0x00000000);
1938     spr_register(env, SPR_SPRG5, "SPRG5",
1939                  SPR_NOACCESS, SPR_NOACCESS,
1940                  spr_read_generic, &spr_write_generic,
1941                  0x00000000);
1942     spr_register(env, SPR_SPRG6, "SPRG6",
1943                  SPR_NOACCESS, SPR_NOACCESS,
1944                  spr_read_generic, &spr_write_generic,
1945                  0x00000000);
1946     spr_register(env, SPR_SPRG7, "SPRG7",
1947                  SPR_NOACCESS, SPR_NOACCESS,
1948                  spr_read_generic, &spr_write_generic,
1949                  0x00000000);
1950     gen_spr_usprgh(env);
1951 }
1952
1953 /* SPR shared between PowerPC 401 & 403 implementations */
1954 static void gen_spr_401_403 (CPUPPCState *env)
1955 {
1956     /* Time base */
1957     spr_register(env, SPR_403_VTBL,  "TBL",
1958                  &spr_read_tbl, SPR_NOACCESS,
1959                  &spr_read_tbl, SPR_NOACCESS,
1960                  0x00000000);
1961     spr_register(env, SPR_403_TBL,   "TBL",
1962                  SPR_NOACCESS, SPR_NOACCESS,
1963                  SPR_NOACCESS, &spr_write_tbl,
1964                  0x00000000);
1965     spr_register(env, SPR_403_VTBU,  "TBU",
1966                  &spr_read_tbu, SPR_NOACCESS,
1967                  &spr_read_tbu, SPR_NOACCESS,
1968                  0x00000000);
1969     spr_register(env, SPR_403_TBU,   "TBU",
1970                  SPR_NOACCESS, SPR_NOACCESS,
1971                  SPR_NOACCESS, &spr_write_tbu,
1972                  0x00000000);
1973     /* Debug */
1974     /* not emulated, as Qemu do not emulate caches */
1975     spr_register(env, SPR_403_CDBCR, "CDBCR",
1976                  SPR_NOACCESS, SPR_NOACCESS,
1977                  &spr_read_generic, &spr_write_generic,
1978                  0x00000000);
1979 }
1980
1981 /* SPR specific to PowerPC 401 implementation */
1982 static void gen_spr_401 (CPUPPCState *env)
1983 {
1984     /* Debug interface */
1985     /* XXX : not implemented */
1986     spr_register(env, SPR_40x_DBCR0, "DBCR",
1987                  SPR_NOACCESS, SPR_NOACCESS,
1988                  &spr_read_generic, &spr_write_40x_dbcr0,
1989                  0x00000000);
1990     /* XXX : not implemented */
1991     spr_register(env, SPR_40x_DBSR, "DBSR",
1992                  SPR_NOACCESS, SPR_NOACCESS,
1993                  &spr_read_generic, &spr_write_clear,
1994                  /* Last reset was system reset */
1995                  0x00000300);
1996     /* XXX : not implemented */
1997     spr_register(env, SPR_40x_DAC1, "DAC",
1998                  SPR_NOACCESS, SPR_NOACCESS,
1999                  &spr_read_generic, &spr_write_generic,
2000                  0x00000000);
2001     /* XXX : not implemented */
2002     spr_register(env, SPR_40x_IAC1, "IAC",
2003                  SPR_NOACCESS, SPR_NOACCESS,
2004                  &spr_read_generic, &spr_write_generic,
2005                  0x00000000);
2006     /* Storage control */
2007     /* XXX: TODO: not implemented */
2008     spr_register(env, SPR_405_SLER, "SLER",
2009                  SPR_NOACCESS, SPR_NOACCESS,
2010                  &spr_read_generic, &spr_write_40x_sler,
2011                  0x00000000);
2012     /* not emulated, as Qemu never does speculative access */
2013     spr_register(env, SPR_40x_SGR, "SGR",
2014                  SPR_NOACCESS, SPR_NOACCESS,
2015                  &spr_read_generic, &spr_write_generic,
2016                  0xFFFFFFFF);
2017     /* not emulated, as Qemu do not emulate caches */
2018     spr_register(env, SPR_40x_DCWR, "DCWR",
2019                  SPR_NOACCESS, SPR_NOACCESS,
2020                  &spr_read_generic, &spr_write_generic,
2021                  0x00000000);
2022 }
2023
2024 static void gen_spr_401x2 (CPUPPCState *env)
2025 {
2026     gen_spr_401(env);
2027     spr_register(env, SPR_40x_PID, "PID",
2028                  SPR_NOACCESS, SPR_NOACCESS,
2029                  &spr_read_generic, &spr_write_generic,
2030                  0x00000000);
2031     spr_register(env, SPR_40x_ZPR, "ZPR",
2032                  SPR_NOACCESS, SPR_NOACCESS,
2033                  &spr_read_generic, &spr_write_generic,
2034                  0x00000000);
2035 }
2036
2037 /* SPR specific to PowerPC 403 implementation */
2038 static void gen_spr_403 (CPUPPCState *env)
2039 {
2040     /* Debug interface */
2041     /* XXX : not implemented */
2042     spr_register(env, SPR_40x_DBCR0, "DBCR0",
2043                  SPR_NOACCESS, SPR_NOACCESS,
2044                  &spr_read_generic, &spr_write_40x_dbcr0,
2045                  0x00000000);
2046     /* XXX : not implemented */
2047     spr_register(env, SPR_40x_DBSR, "DBSR",
2048                  SPR_NOACCESS, SPR_NOACCESS,
2049                  &spr_read_generic, &spr_write_clear,
2050                  /* Last reset was system reset */
2051                  0x00000300);
2052     /* XXX : not implemented */
2053     spr_register(env, SPR_40x_DAC1, "DAC1",
2054                  SPR_NOACCESS, SPR_NOACCESS,
2055                  &spr_read_generic, &spr_write_generic,
2056                  0x00000000);
2057     /* XXX : not implemented */
2058     spr_register(env, SPR_40x_DAC2, "DAC2",
2059                  SPR_NOACCESS, SPR_NOACCESS,
2060                  &spr_read_generic, &spr_write_generic,
2061                  0x00000000);
2062     /* XXX : not implemented */
2063     spr_register(env, SPR_40x_IAC1, "IAC1",
2064                  SPR_NOACCESS, SPR_NOACCESS,
2065                  &spr_read_generic, &spr_write_generic,
2066                  0x00000000);
2067     /* XXX : not implemented */
2068     spr_register(env, SPR_40x_IAC2, "IAC2",
2069                  SPR_NOACCESS, SPR_NOACCESS,
2070                  &spr_read_generic, &spr_write_generic,
2071                  0x00000000);
2072 }
2073
2074 static void gen_spr_403_real (CPUPPCState *env)
2075 {
2076     spr_register(env, SPR_403_PBL1,  "PBL1",
2077                  SPR_NOACCESS, SPR_NOACCESS,
2078                  &spr_read_403_pbr, &spr_write_403_pbr,
2079                  0x00000000);
2080     spr_register(env, SPR_403_PBU1,  "PBU1",
2081                  SPR_NOACCESS, SPR_NOACCESS,
2082                  &spr_read_403_pbr, &spr_write_403_pbr,
2083                  0x00000000);
2084     spr_register(env, SPR_403_PBL2,  "PBL2",
2085                  SPR_NOACCESS, SPR_NOACCESS,
2086                  &spr_read_403_pbr, &spr_write_403_pbr,
2087                  0x00000000);
2088     spr_register(env, SPR_403_PBU2,  "PBU2",
2089                  SPR_NOACCESS, SPR_NOACCESS,
2090                  &spr_read_403_pbr, &spr_write_403_pbr,
2091                  0x00000000);
2092 }
2093
2094 static void gen_spr_403_mmu (CPUPPCState *env)
2095 {
2096     /* MMU */
2097     spr_register(env, SPR_40x_PID, "PID",
2098                  SPR_NOACCESS, SPR_NOACCESS,
2099                  &spr_read_generic, &spr_write_generic,
2100                  0x00000000);
2101     spr_register(env, SPR_40x_ZPR, "ZPR",
2102                  SPR_NOACCESS, SPR_NOACCESS,
2103                  &spr_read_generic, &spr_write_generic,
2104                  0x00000000);
2105 }
2106
2107 /* SPR specific to PowerPC compression coprocessor extension */
2108 static void gen_spr_compress (CPUPPCState *env)
2109 {
2110     /* XXX : not implemented */
2111     spr_register(env, SPR_401_SKR, "SKR",
2112                  SPR_NOACCESS, SPR_NOACCESS,
2113                  &spr_read_generic, &spr_write_generic,
2114                  0x00000000);
2115 }
2116
2117 #if defined (TARGET_PPC64)
2118 /* SPR specific to PowerPC 620 */
2119 static void gen_spr_620 (CPUPPCState *env)
2120 {
2121     /* Processor identification */
2122     spr_register(env, SPR_PIR, "PIR",
2123                  SPR_NOACCESS, SPR_NOACCESS,
2124                  &spr_read_generic, &spr_write_pir,
2125                  0x00000000);
2126     spr_register(env, SPR_ASR, "ASR",
2127                  SPR_NOACCESS, SPR_NOACCESS,
2128                  &spr_read_asr, &spr_write_asr,
2129                  0x00000000);
2130     /* Breakpoints */
2131     /* XXX : not implemented */
2132     spr_register(env, SPR_IABR, "IABR",
2133                  SPR_NOACCESS, SPR_NOACCESS,
2134                  &spr_read_generic, &spr_write_generic,
2135                  0x00000000);
2136     /* XXX : not implemented */
2137     spr_register(env, SPR_DABR, "DABR",
2138                  SPR_NOACCESS, SPR_NOACCESS,
2139                  &spr_read_generic, &spr_write_generic,
2140                  0x00000000);
2141     /* XXX : not implemented */
2142     spr_register(env, SPR_SIAR, "SIAR",
2143                  SPR_NOACCESS, SPR_NOACCESS,
2144                  &spr_read_generic, SPR_NOACCESS,
2145                  0x00000000);
2146     /* XXX : not implemented */
2147     spr_register(env, SPR_SDA, "SDA",
2148                  SPR_NOACCESS, SPR_NOACCESS,
2149                  &spr_read_generic, SPR_NOACCESS,
2150                  0x00000000);
2151     /* XXX : not implemented */
2152     spr_register(env, SPR_620_PMC1R, "PMC1",
2153                  SPR_NOACCESS, SPR_NOACCESS,
2154                  &spr_read_generic, SPR_NOACCESS,
2155                  0x00000000);
2156     spr_register(env, SPR_620_PMC1W, "PMC1",
2157                  SPR_NOACCESS, SPR_NOACCESS,
2158                   SPR_NOACCESS, &spr_write_generic,
2159                  0x00000000);
2160     /* XXX : not implemented */
2161     spr_register(env, SPR_620_PMC2R, "PMC2",
2162                  SPR_NOACCESS, SPR_NOACCESS,
2163                  &spr_read_generic, SPR_NOACCESS,
2164                  0x00000000);
2165     spr_register(env, SPR_620_PMC2W, "PMC2",
2166                  SPR_NOACCESS, SPR_NOACCESS,
2167                   SPR_NOACCESS, &spr_write_generic,
2168                  0x00000000);
2169     /* XXX : not implemented */
2170     spr_register(env, SPR_620_MMCR0R, "MMCR0",
2171                  SPR_NOACCESS, SPR_NOACCESS,
2172                  &spr_read_generic, SPR_NOACCESS,
2173                  0x00000000);
2174     spr_register(env, SPR_620_MMCR0W, "MMCR0",
2175                  SPR_NOACCESS, SPR_NOACCESS,
2176                   SPR_NOACCESS, &spr_write_generic,
2177                  0x00000000);
2178     /* External access control */
2179     /* XXX : not implemented */
2180     spr_register(env, SPR_EAR, "EAR",
2181                  SPR_NOACCESS, SPR_NOACCESS,
2182                  &spr_read_generic, &spr_write_generic,
2183                  0x00000000);
2184 #if 0 // XXX: check this
2185     /* XXX : not implemented */
2186     spr_register(env, SPR_620_PMR0, "PMR0",
2187                  SPR_NOACCESS, SPR_NOACCESS,
2188                  &spr_read_generic, &spr_write_generic,
2189                  0x00000000);
2190     /* XXX : not implemented */
2191     spr_register(env, SPR_620_PMR1, "PMR1",
2192                  SPR_NOACCESS, SPR_NOACCESS,
2193                  &spr_read_generic, &spr_write_generic,
2194                  0x00000000);
2195     /* XXX : not implemented */
2196     spr_register(env, SPR_620_PMR2, "PMR2",
2197                  SPR_NOACCESS, SPR_NOACCESS,
2198                  &spr_read_generic, &spr_write_generic,
2199                  0x00000000);
2200     /* XXX : not implemented */
2201     spr_register(env, SPR_620_PMR3, "PMR3",
2202                  SPR_NOACCESS, SPR_NOACCESS,
2203                  &spr_read_generic, &spr_write_generic,
2204                  0x00000000);
2205     /* XXX : not implemented */
2206     spr_register(env, SPR_620_PMR4, "PMR4",
2207                  SPR_NOACCESS, SPR_NOACCESS,
2208                  &spr_read_generic, &spr_write_generic,
2209                  0x00000000);
2210     /* XXX : not implemented */
2211     spr_register(env, SPR_620_PMR5, "PMR5",
2212                  SPR_NOACCESS, SPR_NOACCESS,
2213                  &spr_read_generic, &spr_write_generic,
2214                  0x00000000);
2215     /* XXX : not implemented */
2216     spr_register(env, SPR_620_PMR6, "PMR6",
2217                  SPR_NOACCESS, SPR_NOACCESS,
2218                  &spr_read_generic, &spr_write_generic,
2219                  0x00000000);
2220     /* XXX : not implemented */
2221     spr_register(env, SPR_620_PMR7, "PMR7",
2222                  SPR_NOACCESS, SPR_NOACCESS,
2223                  &spr_read_generic, &spr_write_generic,
2224                  0x00000000);
2225     /* XXX : not implemented */
2226     spr_register(env, SPR_620_PMR8, "PMR8",
2227                  SPR_NOACCESS, SPR_NOACCESS,
2228                  &spr_read_generic, &spr_write_generic,
2229                  0x00000000);
2230     /* XXX : not implemented */
2231     spr_register(env, SPR_620_PMR9, "PMR9",
2232                  SPR_NOACCESS, SPR_NOACCESS,
2233                  &spr_read_generic, &spr_write_generic,
2234                  0x00000000);
2235     /* XXX : not implemented */
2236     spr_register(env, SPR_620_PMRA, "PMR10",
2237                  SPR_NOACCESS, SPR_NOACCESS,
2238                  &spr_read_generic, &spr_write_generic,
2239                  0x00000000);
2240     /* XXX : not implemented */
2241     spr_register(env, SPR_620_PMRB, "PMR11",
2242                  SPR_NOACCESS, SPR_NOACCESS,
2243                  &spr_read_generic, &spr_write_generic,
2244                  0x00000000);
2245     /* XXX : not implemented */
2246     spr_register(env, SPR_620_PMRC, "PMR12",
2247                  SPR_NOACCESS, SPR_NOACCESS,
2248                  &spr_read_generic, &spr_write_generic,
2249                  0x00000000);
2250     /* XXX : not implemented */
2251     spr_register(env, SPR_620_PMRD, "PMR13",
2252                  SPR_NOACCESS, SPR_NOACCESS,
2253                  &spr_read_generic, &spr_write_generic,
2254                  0x00000000);
2255     /* XXX : not implemented */
2256     spr_register(env, SPR_620_PMRE, "PMR14",
2257                  SPR_NOACCESS, SPR_NOACCESS,
2258                  &spr_read_generic, &spr_write_generic,
2259                  0x00000000);
2260     /* XXX : not implemented */
2261     spr_register(env, SPR_620_PMRF, "PMR15",
2262                  SPR_NOACCESS, SPR_NOACCESS,
2263                  &spr_read_generic, &spr_write_generic,
2264                  0x00000000);
2265 #endif
2266     /* XXX : not implemented */
2267     spr_register(env, SPR_620_BUSCSR, "BUSCSR",
2268                  SPR_NOACCESS, SPR_NOACCESS,
2269                  &spr_read_generic, &spr_write_generic,
2270                  0x00000000);
2271     /* XXX : not implemented */
2272     spr_register(env, SPR_620_L2CR, "L2CR",
2273                  SPR_NOACCESS, SPR_NOACCESS,
2274                  &spr_read_generic, &spr_write_generic,
2275                  0x00000000);
2276     /* XXX : not implemented */
2277     spr_register(env, SPR_620_L2SR, "L2SR",
2278                  SPR_NOACCESS, SPR_NOACCESS,
2279                  &spr_read_generic, &spr_write_generic,
2280                  0x00000000);
2281 }
2282 #endif /* defined (TARGET_PPC64) */
2283
2284 static void gen_spr_5xx_8xx (CPUPPCState *env)
2285 {
2286     /* Exception processing */
2287     spr_register(env, SPR_DSISR, "DSISR",
2288                  SPR_NOACCESS, SPR_NOACCESS,
2289                  &spr_read_generic, &spr_write_generic,
2290                  0x00000000);
2291     spr_register(env, SPR_DAR, "DAR",
2292                  SPR_NOACCESS, SPR_NOACCESS,
2293                  &spr_read_generic, &spr_write_generic,
2294                  0x00000000);
2295     /* Timer */
2296     spr_register(env, SPR_DECR, "DECR",
2297                  SPR_NOACCESS, SPR_NOACCESS,
2298                  &spr_read_decr, &spr_write_decr,
2299                  0x00000000);
2300     /* XXX : not implemented */
2301     spr_register(env, SPR_MPC_EIE, "EIE",
2302                  SPR_NOACCESS, SPR_NOACCESS,
2303                  &spr_read_generic, &spr_write_generic,
2304                  0x00000000);
2305     /* XXX : not implemented */
2306     spr_register(env, SPR_MPC_EID, "EID",
2307                  SPR_NOACCESS, SPR_NOACCESS,
2308                  &spr_read_generic, &spr_write_generic,
2309                  0x00000000);
2310     /* XXX : not implemented */
2311     spr_register(env, SPR_MPC_NRI, "NRI",
2312                  SPR_NOACCESS, SPR_NOACCESS,
2313                  &spr_read_generic, &spr_write_generic,
2314                  0x00000000);
2315     /* XXX : not implemented */
2316     spr_register(env, SPR_MPC_CMPA, "CMPA",
2317                  SPR_NOACCESS, SPR_NOACCESS,
2318                  &spr_read_generic, &spr_write_generic,
2319                  0x00000000);
2320     /* XXX : not implemented */
2321     spr_register(env, SPR_MPC_CMPB, "CMPB",
2322                  SPR_NOACCESS, SPR_NOACCESS,
2323                  &spr_read_generic, &spr_write_generic,
2324                  0x00000000);
2325     /* XXX : not implemented */
2326     spr_register(env, SPR_MPC_CMPC, "CMPC",
2327                  SPR_NOACCESS, SPR_NOACCESS,
2328                  &spr_read_generic, &spr_write_generic,
2329                  0x00000000);
2330     /* XXX : not implemented */
2331     spr_register(env, SPR_MPC_CMPD, "CMPD",
2332                  SPR_NOACCESS, SPR_NOACCESS,
2333                  &spr_read_generic, &spr_write_generic,
2334                  0x00000000);
2335     /* XXX : not implemented */
2336     spr_register(env, SPR_MPC_ECR, "ECR",
2337                  SPR_NOACCESS, SPR_NOACCESS,
2338                  &spr_read_generic, &spr_write_generic,
2339                  0x00000000);
2340     /* XXX : not implemented */
2341     spr_register(env, SPR_MPC_DER, "DER",
2342                  SPR_NOACCESS, SPR_NOACCESS,
2343                  &spr_read_generic, &spr_write_generic,
2344                  0x00000000);
2345     /* XXX : not implemented */
2346     spr_register(env, SPR_MPC_COUNTA, "COUNTA",
2347                  SPR_NOACCESS, SPR_NOACCESS,
2348                  &spr_read_generic, &spr_write_generic,
2349                  0x00000000);
2350     /* XXX : not implemented */
2351     spr_register(env, SPR_MPC_COUNTB, "COUNTB",
2352                  SPR_NOACCESS, SPR_NOACCESS,
2353                  &spr_read_generic, &spr_write_generic,
2354                  0x00000000);
2355     /* XXX : not implemented */
2356     spr_register(env, SPR_MPC_CMPE, "CMPE",
2357                  SPR_NOACCESS, SPR_NOACCESS,
2358                  &spr_read_generic, &spr_write_generic,
2359                  0x00000000);
2360     /* XXX : not implemented */
2361     spr_register(env, SPR_MPC_CMPF, "CMPF",
2362                  SPR_NOACCESS, SPR_NOACCESS,
2363                  &spr_read_generic, &spr_write_generic,
2364                  0x00000000);
2365     /* XXX : not implemented */
2366     spr_register(env, SPR_MPC_CMPG, "CMPG",
2367                  SPR_NOACCESS, SPR_NOACCESS,
2368                  &spr_read_generic, &spr_write_generic,
2369                  0x00000000);
2370     /* XXX : not implemented */
2371     spr_register(env, SPR_MPC_CMPH, "CMPH",
2372                  SPR_NOACCESS, SPR_NOACCESS,
2373                  &spr_read_generic, &spr_write_generic,
2374                  0x00000000);
2375     /* XXX : not implemented */
2376     spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
2377                  SPR_NOACCESS, SPR_NOACCESS,
2378                  &spr_read_generic, &spr_write_generic,
2379                  0x00000000);
2380     /* XXX : not implemented */
2381     spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
2382                  SPR_NOACCESS, SPR_NOACCESS,
2383                  &spr_read_generic, &spr_write_generic,
2384                  0x00000000);
2385     /* XXX : not implemented */
2386     spr_register(env, SPR_MPC_BAR, "BAR",
2387                  SPR_NOACCESS, SPR_NOACCESS,
2388                  &spr_read_generic, &spr_write_generic,
2389                  0x00000000);
2390     /* XXX : not implemented */
2391     spr_register(env, SPR_MPC_DPDR, "DPDR",
2392                  SPR_NOACCESS, SPR_NOACCESS,
2393                  &spr_read_generic, &spr_write_generic,
2394                  0x00000000);
2395     /* XXX : not implemented */
2396     spr_register(env, SPR_MPC_IMMR, "IMMR",
2397                  SPR_NOACCESS, SPR_NOACCESS,
2398                  &spr_read_generic, &spr_write_generic,
2399                  0x00000000);
2400 }
2401
2402 static void gen_spr_5xx (CPUPPCState *env)
2403 {
2404     /* XXX : not implemented */
2405     spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
2406                  SPR_NOACCESS, SPR_NOACCESS,
2407                  &spr_read_generic, &spr_write_generic,
2408                  0x00000000);
2409     /* XXX : not implemented */
2410     spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
2411                  SPR_NOACCESS, SPR_NOACCESS,
2412                  &spr_read_generic, &spr_write_generic,
2413                  0x00000000);
2414     /* XXX : not implemented */
2415     spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
2416                  SPR_NOACCESS, SPR_NOACCESS,
2417                  &spr_read_generic, &spr_write_generic,
2418                  0x00000000);
2419     /* XXX : not implemented */
2420     spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
2421                  SPR_NOACCESS, SPR_NOACCESS,
2422                  &spr_read_generic, &spr_write_generic,
2423                  0x00000000);
2424     /* XXX : not implemented */
2425     spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
2426                  SPR_NOACCESS, SPR_NOACCESS,
2427                  &spr_read_generic, &spr_write_generic,
2428                  0x00000000);
2429     /* XXX : not implemented */
2430     spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
2431                  SPR_NOACCESS, SPR_NOACCESS,
2432                  &spr_read_generic, &spr_write_generic,
2433                  0x00000000);
2434     /* XXX : not implemented */
2435     spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
2436                  SPR_NOACCESS, SPR_NOACCESS,
2437                  &spr_read_generic, &spr_write_generic,
2438                  0x00000000);
2439     /* XXX : not implemented */
2440     spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
2441                  SPR_NOACCESS, SPR_NOACCESS,
2442                  &spr_read_generic, &spr_write_generic,
2443                  0x00000000);
2444     /* XXX : not implemented */
2445     spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
2446                  SPR_NOACCESS, SPR_NOACCESS,
2447                  &spr_read_generic, &spr_write_generic,
2448                  0x00000000);
2449     /* XXX : not implemented */
2450     spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
2451                  SPR_NOACCESS, SPR_NOACCESS,
2452                  &spr_read_generic, &spr_write_generic,
2453                  0x00000000);
2454     /* XXX : not implemented */
2455     spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
2456                  SPR_NOACCESS, SPR_NOACCESS,
2457                  &spr_read_generic, &spr_write_generic,
2458                  0x00000000);
2459     /* XXX : not implemented */
2460     spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
2461                  SPR_NOACCESS, SPR_NOACCESS,
2462                  &spr_read_generic, &spr_write_generic,
2463                  0x00000000);
2464     /* XXX : not implemented */
2465     spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
2466                  SPR_NOACCESS, SPR_NOACCESS,
2467                  &spr_read_generic, &spr_write_generic,
2468                  0x00000000);
2469     /* XXX : not implemented */
2470     spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
2471                  SPR_NOACCESS, SPR_NOACCESS,
2472                  &spr_read_generic, &spr_write_generic,
2473                  0x00000000);
2474     /* XXX : not implemented */
2475     spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
2476                  SPR_NOACCESS, SPR_NOACCESS,
2477                  &spr_read_generic, &spr_write_generic,
2478                  0x00000000);
2479     /* XXX : not implemented */
2480     spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
2481                  SPR_NOACCESS, SPR_NOACCESS,
2482                  &spr_read_generic, &spr_write_generic,
2483                  0x00000000);
2484     /* XXX : not implemented */
2485     spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
2486                  SPR_NOACCESS, SPR_NOACCESS,
2487                  &spr_read_generic, &spr_write_generic,
2488                  0x00000000);
2489     /* XXX : not implemented */
2490     spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
2491                  SPR_NOACCESS, SPR_NOACCESS,
2492                  &spr_read_generic, &spr_write_generic,
2493                  0x00000000);
2494     /* XXX : not implemented */
2495     spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
2496                  SPR_NOACCESS, SPR_NOACCESS,
2497                  &spr_read_generic, &spr_write_generic,
2498                  0x00000000);
2499     /* XXX : not implemented */
2500     spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
2501                  SPR_NOACCESS, SPR_NOACCESS,
2502                  &spr_read_generic, &spr_write_generic,
2503                  0x00000000);
2504     /* XXX : not implemented */
2505     spr_register(env, SPR_RCPU_FPECR, "FPECR",
2506                  SPR_NOACCESS, SPR_NOACCESS,
2507                  &spr_read_generic, &spr_write_generic,
2508                  0x00000000);
2509 }
2510
2511 static void gen_spr_8xx (CPUPPCState *env)
2512 {
2513     /* XXX : not implemented */
2514     spr_register(env, SPR_MPC_IC_CST, "IC_CST",
2515                  SPR_NOACCESS, SPR_NOACCESS,
2516                  &spr_read_generic, &spr_write_generic,
2517                  0x00000000);
2518     /* XXX : not implemented */
2519     spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
2520                  SPR_NOACCESS, SPR_NOACCESS,
2521                  &spr_read_generic, &spr_write_generic,
2522                  0x00000000);
2523     /* XXX : not implemented */
2524     spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
2525                  SPR_NOACCESS, SPR_NOACCESS,
2526                  &spr_read_generic, &spr_write_generic,
2527                  0x00000000);
2528     /* XXX : not implemented */
2529     spr_register(env, SPR_MPC_DC_CST, "DC_CST",
2530                  SPR_NOACCESS, SPR_NOACCESS,
2531                  &spr_read_generic, &spr_write_generic,
2532                  0x00000000);
2533     /* XXX : not implemented */
2534     spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
2535                  SPR_NOACCESS, SPR_NOACCESS,
2536                  &spr_read_generic, &spr_write_generic,
2537                  0x00000000);
2538     /* XXX : not implemented */
2539     spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
2540                  SPR_NOACCESS, SPR_NOACCESS,
2541                  &spr_read_generic, &spr_write_generic,
2542                  0x00000000);
2543     /* XXX : not implemented */
2544     spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
2545                  SPR_NOACCESS, SPR_NOACCESS,
2546                  &spr_read_generic, &spr_write_generic,
2547                  0x00000000);
2548     /* XXX : not implemented */
2549     spr_register(env, SPR_MPC_MI_AP, "MI_AP",
2550                  SPR_NOACCESS, SPR_NOACCESS,
2551                  &spr_read_generic, &spr_write_generic,
2552                  0x00000000);
2553     /* XXX : not implemented */
2554     spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
2555                  SPR_NOACCESS, SPR_NOACCESS,
2556                  &spr_read_generic, &spr_write_generic,
2557                  0x00000000);
2558     /* XXX : not implemented */
2559     spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
2560                  SPR_NOACCESS, SPR_NOACCESS,
2561                  &spr_read_generic, &spr_write_generic,
2562                  0x00000000);
2563     /* XXX : not implemented */
2564     spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
2565                  SPR_NOACCESS, SPR_NOACCESS,
2566                  &spr_read_generic, &spr_write_generic,
2567                  0x00000000);
2568     /* XXX : not implemented */
2569     spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
2570                  SPR_NOACCESS, SPR_NOACCESS,
2571                  &spr_read_generic, &spr_write_generic,
2572                  0x00000000);
2573     /* XXX : not implemented */
2574     spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
2575                  SPR_NOACCESS, SPR_NOACCESS,
2576                  &spr_read_generic, &spr_write_generic,
2577                  0x00000000);
2578     /* XXX : not implemented */
2579     spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
2580                  SPR_NOACCESS, SPR_NOACCESS,
2581                  &spr_read_generic, &spr_write_generic,
2582                  0x00000000);
2583     /* XXX : not implemented */
2584     spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
2585                  SPR_NOACCESS, SPR_NOACCESS,
2586                  &spr_read_generic, &spr_write_generic,
2587                  0x00000000);
2588     /* XXX : not implemented */
2589     spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
2590                  SPR_NOACCESS, SPR_NOACCESS,
2591                  &spr_read_generic, &spr_write_generic,
2592                  0x00000000);
2593     /* XXX : not implemented */
2594     spr_register(env, SPR_MPC_MD_AP, "MD_AP",
2595                  SPR_NOACCESS, SPR_NOACCESS,
2596                  &spr_read_generic, &spr_write_generic,
2597                  0x00000000);
2598     /* XXX : not implemented */
2599     spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2600                  SPR_NOACCESS, SPR_NOACCESS,
2601                  &spr_read_generic, &spr_write_generic,
2602                  0x00000000);
2603     /* XXX : not implemented */
2604     spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2605                  SPR_NOACCESS, SPR_NOACCESS,
2606                  &spr_read_generic, &spr_write_generic,
2607                  0x00000000);
2608     /* XXX : not implemented */
2609     spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2610                  SPR_NOACCESS, SPR_NOACCESS,
2611                  &spr_read_generic, &spr_write_generic,
2612                  0x00000000);
2613     /* XXX : not implemented */
2614     spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2615                  SPR_NOACCESS, SPR_NOACCESS,
2616                  &spr_read_generic, &spr_write_generic,
2617                  0x00000000);
2618     /* XXX : not implemented */
2619     spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2620                  SPR_NOACCESS, SPR_NOACCESS,
2621                  &spr_read_generic, &spr_write_generic,
2622                  0x00000000);
2623     /* XXX : not implemented */
2624     spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2625                  SPR_NOACCESS, SPR_NOACCESS,
2626                  &spr_read_generic, &spr_write_generic,
2627                  0x00000000);
2628     /* XXX : not implemented */
2629     spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2630                  SPR_NOACCESS, SPR_NOACCESS,
2631                  &spr_read_generic, &spr_write_generic,
2632                  0x00000000);
2633     /* XXX : not implemented */
2634     spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2635                  SPR_NOACCESS, SPR_NOACCESS,
2636                  &spr_read_generic, &spr_write_generic,
2637                  0x00000000);
2638 }
2639
2640 // XXX: TODO
2641 /*
2642  * AMR     => SPR 29 (Power 2.04)
2643  * CTRL    => SPR 136 (Power 2.04)
2644  * CTRL    => SPR 152 (Power 2.04)
2645  * SCOMC   => SPR 276 (64 bits ?)
2646  * SCOMD   => SPR 277 (64 bits ?)
2647  * TBU40   => SPR 286 (Power 2.04 hypv)
2648  * HSPRG0  => SPR 304 (Power 2.04 hypv)
2649  * HSPRG1  => SPR 305 (Power 2.04 hypv)
2650  * HDSISR  => SPR 306 (Power 2.04 hypv)
2651  * HDAR    => SPR 307 (Power 2.04 hypv)
2652  * PURR    => SPR 309 (Power 2.04 hypv)
2653  * HDEC    => SPR 310 (Power 2.04 hypv)
2654  * HIOR    => SPR 311 (hypv)
2655  * RMOR    => SPR 312 (970)
2656  * HRMOR   => SPR 313 (Power 2.04 hypv)
2657  * HSRR0   => SPR 314 (Power 2.04 hypv)
2658  * HSRR1   => SPR 315 (Power 2.04 hypv)
2659  * LPCR    => SPR 316 (970)
2660  * LPIDR   => SPR 317 (970)
2661  * EPR     => SPR 702 (Power 2.04 emb)
2662  * perf    => 768-783 (Power 2.04)
2663  * perf    => 784-799 (Power 2.04)
2664  * PPR     => SPR 896 (Power 2.04)
2665  * EPLC    => SPR 947 (Power 2.04 emb)
2666  * EPSC    => SPR 948 (Power 2.04 emb)
2667  * DABRX   => 1015    (Power 2.04 hypv)
2668  * FPECR   => SPR 1022 (?)
2669  * ... and more (thermal management, performance counters, ...)
2670  */
2671
2672 /*****************************************************************************/
2673 /* Exception vectors models                                                  */
2674 static void init_excp_4xx_real (CPUPPCState *env)
2675 {
2676 #if !defined(CONFIG_USER_ONLY)
2677     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2678     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2679     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2680     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2681     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2682     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2683     env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2684     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2685     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2686     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2687     env->hreset_excp_prefix = 0x00000000UL;
2688     env->ivor_mask = 0x0000FFF0UL;
2689     env->ivpr_mask = 0xFFFF0000UL;
2690     /* Hardware reset vector */
2691     env->hreset_vector = 0xFFFFFFFCUL;
2692 #endif
2693 }
2694
2695 static void init_excp_4xx_softmmu (CPUPPCState *env)
2696 {
2697 #if !defined(CONFIG_USER_ONLY)
2698     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2699     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2700     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2701     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2702     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2703     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2704     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2705     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2706     env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2707     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2708     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2709     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001100;
2710     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001200;
2711     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2712     env->hreset_excp_prefix = 0x00000000UL;
2713     env->ivor_mask = 0x0000FFF0UL;
2714     env->ivpr_mask = 0xFFFF0000UL;
2715     /* Hardware reset vector */
2716     env->hreset_vector = 0xFFFFFFFCUL;
2717 #endif
2718 }
2719
2720 static void init_excp_MPC5xx (CPUPPCState *env)
2721 {
2722 #if !defined(CONFIG_USER_ONLY)
2723     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2724     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2725     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2726     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2727     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2728     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000900;
2729     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2730     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2731     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2732     env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2733     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
2734     env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
2735     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
2736     env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
2737     env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
2738     env->hreset_excp_prefix = 0x00000000UL;
2739     env->ivor_mask = 0x0000FFF0UL;
2740     env->ivpr_mask = 0xFFFF0000UL;
2741     /* Hardware reset vector */
2742     env->hreset_vector = 0xFFFFFFFCUL;
2743 #endif
2744 }
2745
2746 static void init_excp_MPC8xx (CPUPPCState *env)
2747 {
2748 #if !defined(CONFIG_USER_ONLY)
2749     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2750     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2751     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2752     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2753     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2754     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2755     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2756     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000900;
2757     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2758     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2759     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2760     env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2761     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
2762     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001100;
2763     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001200;
2764     env->excp_vectors[POWERPC_EXCP_ITLBE]    = 0x00001300;
2765     env->excp_vectors[POWERPC_EXCP_DTLBE]    = 0x00001400;
2766     env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
2767     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
2768     env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
2769     env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
2770     env->hreset_excp_prefix = 0x00000000UL;
2771     env->ivor_mask = 0x0000FFF0UL;
2772     env->ivpr_mask = 0xFFFF0000UL;
2773     /* Hardware reset vector */
2774     env->hreset_vector = 0xFFFFFFFCUL;
2775 #endif
2776 }
2777
2778 static void init_excp_G2 (CPUPPCState *env)
2779 {
2780 #if !defined(CONFIG_USER_ONLY)
2781     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2782     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2783     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2784     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2785     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2786     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2787     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2788     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2789     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2790     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2791     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2792     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2793     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2794     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2795     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2796     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2797     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2798     env->hreset_excp_prefix = 0x00000000UL;
2799     /* Hardware reset vector */
2800     env->hreset_vector = 0xFFFFFFFCUL;
2801 #endif
2802 }
2803
2804 static void init_excp_e200 (CPUPPCState *env)
2805 {
2806 #if !defined(CONFIG_USER_ONLY)
2807     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000FFC;
2808     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2809     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
2810     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
2811     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
2812     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2813     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
2814     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
2815     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
2816     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
2817     env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
2818     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
2819     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
2820     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
2821     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
2822     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
2823     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
2824     env->excp_vectors[POWERPC_EXCP_SPEU]     = 0x00000000;
2825     env->excp_vectors[POWERPC_EXCP_EFPDI]    = 0x00000000;
2826     env->excp_vectors[POWERPC_EXCP_EFPRI]    = 0x00000000;
2827     env->hreset_excp_prefix = 0x00000000UL;
2828     env->ivor_mask = 0x0000FFF7UL;
2829     env->ivpr_mask = 0xFFFF0000UL;
2830     /* Hardware reset vector */
2831     env->hreset_vector = 0xFFFFFFFCUL;
2832 #endif
2833 }
2834
2835 static void init_excp_BookE (CPUPPCState *env)
2836 {
2837 #if !defined(CONFIG_USER_ONLY)
2838     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2839     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
2840     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
2841     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
2842     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2843     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
2844     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
2845     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
2846     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
2847     env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
2848     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
2849     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
2850     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
2851     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
2852     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
2853     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
2854     env->hreset_excp_prefix = 0x00000000UL;
2855     env->ivor_mask = 0x0000FFE0UL;
2856     env->ivpr_mask = 0xFFFF0000UL;
2857     /* Hardware reset vector */
2858     env->hreset_vector = 0xFFFFFFFCUL;
2859 #endif
2860 }
2861
2862 static void init_excp_601 (CPUPPCState *env)
2863 {
2864 #if !defined(CONFIG_USER_ONLY)
2865     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2866     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2867     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2868     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2869     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2870     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2871     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2872     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2873     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2874     env->excp_vectors[POWERPC_EXCP_IO]       = 0x00000A00;
2875     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2876     env->excp_vectors[POWERPC_EXCP_RUNM]     = 0x00002000;
2877     env->hreset_excp_prefix = 0xFFF00000UL;
2878     /* Hardware reset vector */
2879     env->hreset_vector = 0x00000100UL;
2880 #endif
2881 }
2882
2883 static void init_excp_602 (CPUPPCState *env)
2884 {
2885 #if !defined(CONFIG_USER_ONLY)
2886     /* XXX: exception prefix has a special behavior on 602 */
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_IFTLB]    = 0x00001000;
2899     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2900     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2901     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2902     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2903     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001500;
2904     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001600;
2905     env->hreset_excp_prefix = 0xFFF00000UL;
2906     /* Hardware reset vector */
2907     env->hreset_vector = 0xFFFFFFFCUL;
2908 #endif
2909 }
2910
2911 static void init_excp_603 (CPUPPCState *env)
2912 {
2913 #if !defined(CONFIG_USER_ONLY)
2914     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2915     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2916     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2917     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2918     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2919     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2920     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2921     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2922     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2923     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2924     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2925     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2926     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2927     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2928     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2929     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2930     env->hreset_excp_prefix = 0x00000000UL;
2931     /* Hardware reset vector */
2932     env->hreset_vector = 0xFFFFFFFCUL;
2933 #endif
2934 }
2935
2936 static void init_excp_604 (CPUPPCState *env)
2937 {
2938 #if !defined(CONFIG_USER_ONLY)
2939     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2940     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2941     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2942     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2943     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2944     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2945     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2946     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2947     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2948     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2949     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2950     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2951     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2952     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2953     env->hreset_excp_prefix = 0xFFF00000UL;
2954     /* Hardware reset vector */
2955     env->hreset_vector = 0x00000100UL;
2956 #endif
2957 }
2958
2959 #if defined(TARGET_PPC64)
2960 static void init_excp_620 (CPUPPCState *env)
2961 {
2962 #if !defined(CONFIG_USER_ONLY)
2963     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2964     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2965     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2966     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2967     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2968     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2969     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2970     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2971     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2972     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2973     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2974     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2975     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2976     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2977     env->hreset_excp_prefix = 0xFFF00000UL;
2978     /* Hardware reset vector */
2979     env->hreset_vector = 0x0000000000000100ULL;
2980 #endif
2981 }
2982 #endif /* defined(TARGET_PPC64) */
2983
2984 static void init_excp_7x0 (CPUPPCState *env)
2985 {
2986 #if !defined(CONFIG_USER_ONLY)
2987     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2988     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2989     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2990     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2991     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2992     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2993     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2994     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2995     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2996     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2997     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2998     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2999     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3000     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3001     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3002     env->hreset_excp_prefix = 0x00000000UL;
3003     /* Hardware reset vector */
3004     env->hreset_vector = 0xFFFFFFFCUL;
3005 #endif
3006 }
3007
3008 static void init_excp_750cl (CPUPPCState *env)
3009 {
3010 #if !defined(CONFIG_USER_ONLY)
3011     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3012     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3013     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3014     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3015     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3016     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3017     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3018     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3019     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3020     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3021     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3022     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3023     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3024     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3025     env->hreset_excp_prefix = 0x00000000UL;
3026     /* Hardware reset vector */
3027     env->hreset_vector = 0xFFFFFFFCUL;
3028 #endif
3029 }
3030
3031 static void init_excp_750cx (CPUPPCState *env)
3032 {
3033 #if !defined(CONFIG_USER_ONLY)
3034     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3035     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3036     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3037     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3038     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3039     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3040     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3041     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3042     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3043     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3044     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3045     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3046     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3047     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3048     env->hreset_excp_prefix = 0x00000000UL;
3049     /* Hardware reset vector */
3050     env->hreset_vector = 0xFFFFFFFCUL;
3051 #endif
3052 }
3053
3054 /* XXX: Check if this is correct */
3055 static void init_excp_7x5 (CPUPPCState *env)
3056 {
3057 #if !defined(CONFIG_USER_ONLY)
3058     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3059     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3060     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3061     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3062     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3063     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3064     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3065     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3066     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3067     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3068     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3069     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3070     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
3071     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
3072     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
3073     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3074     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3075     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3076     env->hreset_excp_prefix = 0x00000000UL;
3077     /* Hardware reset vector */
3078     env->hreset_vector = 0xFFFFFFFCUL;
3079 #endif
3080 }
3081
3082 static void init_excp_7400 (CPUPPCState *env)
3083 {
3084 #if !defined(CONFIG_USER_ONLY)
3085     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3086     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3087     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3088     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3089     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3090     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3091     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3092     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3093     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3094     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3095     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3096     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3097     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3098     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3099     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3100     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
3101     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3102     env->hreset_excp_prefix = 0x00000000UL;
3103     /* Hardware reset vector */
3104     env->hreset_vector = 0xFFFFFFFCUL;
3105 #endif
3106 }
3107
3108 static void init_excp_7450 (CPUPPCState *env)
3109 {
3110 #if !defined(CONFIG_USER_ONLY)
3111     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3112     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3113     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3114     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3115     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3116     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3117     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3118     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3119     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3120     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3121     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3122     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3123     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3124     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
3125     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
3126     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
3127     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3128     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3129     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
3130     env->hreset_excp_prefix = 0x00000000UL;
3131     /* Hardware reset vector */
3132     env->hreset_vector = 0xFFFFFFFCUL;
3133 #endif
3134 }
3135
3136 #if defined (TARGET_PPC64)
3137 static void init_excp_970 (CPUPPCState *env)
3138 {
3139 #if !defined(CONFIG_USER_ONLY)
3140     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3141     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3142     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3143     env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
3144     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3145     env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
3146     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3147     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3148     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3149     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3150     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3151     env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
3152     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3153     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3154     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3155     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3156     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3157     env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
3158     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
3159     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
3160     env->hreset_excp_prefix = 0x00000000FFF00000ULL;
3161     /* Hardware reset vector */
3162     env->hreset_vector = 0x0000000000000100ULL;
3163 #endif
3164 }
3165
3166 static void init_excp_POWER7 (CPUPPCState *env)
3167 {
3168 #if !defined(CONFIG_USER_ONLY)
3169     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3170     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3171     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3172     env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
3173     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3174     env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
3175     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3176     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3177     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3178     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3179     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3180     env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
3181     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3182     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3183     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3184     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3185     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3186     env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
3187     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
3188     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
3189     env->hreset_excp_prefix = 0;
3190     /* Hardware reset vector */
3191     env->hreset_vector = 0x0000000000000100ULL;
3192 #endif
3193 }
3194 #endif
3195
3196 /*****************************************************************************/
3197 /* Power management enable checks                                            */
3198 static int check_pow_none (CPUPPCState *env)
3199 {
3200     return 0;
3201 }
3202
3203 static int check_pow_nocheck (CPUPPCState *env)
3204 {
3205     return 1;
3206 }
3207
3208 static int check_pow_hid0 (CPUPPCState *env)
3209 {
3210     if (env->spr[SPR_HID0] & 0x00E00000)
3211         return 1;
3212
3213     return 0;
3214 }
3215
3216 static int check_pow_hid0_74xx (CPUPPCState *env)
3217 {
3218     if (env->spr[SPR_HID0] & 0x00600000)
3219         return 1;
3220
3221     return 0;
3222 }
3223
3224 /*****************************************************************************/
3225 /* PowerPC implementations definitions                                       */
3226
3227 /* PowerPC 401                                                               */
3228 #define POWERPC_INSNS_401    (PPC_INSNS_BASE | PPC_STRING |                   \
3229                               PPC_WRTEE | PPC_DCR |                           \
3230                               PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3231                               PPC_CACHE_DCBZ |                                \
3232                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3233                               PPC_4xx_COMMON | PPC_40x_EXCP)
3234 #define POWERPC_INSNS2_401   (PPC_NONE)
3235 #define POWERPC_MSRM_401     (0x00000000000FD201ULL)
3236 #define POWERPC_MMU_401      (POWERPC_MMU_REAL)
3237 #define POWERPC_EXCP_401     (POWERPC_EXCP_40x)
3238 #define POWERPC_INPUT_401    (PPC_FLAGS_INPUT_401)
3239 #define POWERPC_BFDM_401     (bfd_mach_ppc_403)
3240 #define POWERPC_FLAG_401     (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3241                               POWERPC_FLAG_BUS_CLK)
3242 #define check_pow_401        check_pow_nocheck
3243
3244 static void init_proc_401 (CPUPPCState *env)
3245 {
3246     gen_spr_40x(env);
3247     gen_spr_401_403(env);
3248     gen_spr_401(env);
3249     init_excp_4xx_real(env);
3250     env->dcache_line_size = 32;
3251     env->icache_line_size = 32;
3252     /* Allocate hardware IRQ controller */
3253     ppc40x_irq_init(env);
3254 }
3255
3256 /* PowerPC 401x2                                                             */
3257 #define POWERPC_INSNS_401x2  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3258                               PPC_DCR | PPC_WRTEE |                           \
3259                               PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3260                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3261                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3262                               PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3263                               PPC_4xx_COMMON | PPC_40x_EXCP)
3264 #define POWERPC_INSNS2_401x2 (PPC_NONE)
3265 #define POWERPC_MSRM_401x2   (0x00000000001FD231ULL)
3266 #define POWERPC_MMU_401x2    (POWERPC_MMU_SOFT_4xx_Z)
3267 #define POWERPC_EXCP_401x2   (POWERPC_EXCP_40x)
3268 #define POWERPC_INPUT_401x2  (PPC_FLAGS_INPUT_401)
3269 #define POWERPC_BFDM_401x2   (bfd_mach_ppc_403)
3270 #define POWERPC_FLAG_401x2   (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3271                               POWERPC_FLAG_BUS_CLK)
3272 #define check_pow_401x2      check_pow_nocheck
3273
3274 static void init_proc_401x2 (CPUPPCState *env)
3275 {
3276     gen_spr_40x(env);
3277     gen_spr_401_403(env);
3278     gen_spr_401x2(env);
3279     gen_spr_compress(env);
3280     /* Memory management */
3281 #if !defined(CONFIG_USER_ONLY)
3282     env->nb_tlb = 64;
3283     env->nb_ways = 1;
3284     env->id_tlbs = 0;
3285 #endif
3286     init_excp_4xx_softmmu(env);
3287     env->dcache_line_size = 32;
3288     env->icache_line_size = 32;
3289     /* Allocate hardware IRQ controller */
3290     ppc40x_irq_init(env);
3291 }
3292
3293 /* PowerPC 401x3                                                             */
3294 #define POWERPC_INSNS_401x3  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3295                               PPC_DCR | PPC_WRTEE |                           \
3296                               PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3297                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3298                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3299                               PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3300                               PPC_4xx_COMMON | PPC_40x_EXCP)
3301 #define POWERPC_INSNS2_401x3 (PPC_NONE)
3302 #define POWERPC_MSRM_401x3   (0x00000000001FD631ULL)
3303 #define POWERPC_MMU_401x3    (POWERPC_MMU_SOFT_4xx_Z)
3304 #define POWERPC_EXCP_401x3   (POWERPC_EXCP_40x)
3305 #define POWERPC_INPUT_401x3  (PPC_FLAGS_INPUT_401)
3306 #define POWERPC_BFDM_401x3   (bfd_mach_ppc_403)
3307 #define POWERPC_FLAG_401x3   (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3308                               POWERPC_FLAG_BUS_CLK)
3309 #define check_pow_401x3      check_pow_nocheck
3310
3311 __attribute__ (( unused ))
3312 static void init_proc_401x3 (CPUPPCState *env)
3313 {
3314     gen_spr_40x(env);
3315     gen_spr_401_403(env);
3316     gen_spr_401(env);
3317     gen_spr_401x2(env);
3318     gen_spr_compress(env);
3319     init_excp_4xx_softmmu(env);
3320     env->dcache_line_size = 32;
3321     env->icache_line_size = 32;
3322     /* Allocate hardware IRQ controller */
3323     ppc40x_irq_init(env);
3324 }
3325
3326 /* IOP480                                                                    */
3327 #define POWERPC_INSNS_IOP480 (PPC_INSNS_BASE | PPC_STRING |                   \
3328                               PPC_DCR | PPC_WRTEE |                           \
3329                               PPC_CACHE | PPC_CACHE_ICBI |  PPC_40x_ICBT |    \
3330                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3331                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3332                               PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3333                               PPC_4xx_COMMON | PPC_40x_EXCP)
3334 #define POWERPC_INSNS2_IOP480 (PPC_NONE)
3335 #define POWERPC_MSRM_IOP480  (0x00000000001FD231ULL)
3336 #define POWERPC_MMU_IOP480   (POWERPC_MMU_SOFT_4xx_Z)
3337 #define POWERPC_EXCP_IOP480  (POWERPC_EXCP_40x)
3338 #define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401)
3339 #define POWERPC_BFDM_IOP480  (bfd_mach_ppc_403)
3340 #define POWERPC_FLAG_IOP480  (POWERPC_FLAG_CE | POWERPC_FLAG_DE |             \
3341                               POWERPC_FLAG_BUS_CLK)
3342 #define check_pow_IOP480     check_pow_nocheck
3343
3344 static void init_proc_IOP480 (CPUPPCState *env)
3345 {
3346     gen_spr_40x(env);
3347     gen_spr_401_403(env);
3348     gen_spr_401x2(env);
3349     gen_spr_compress(env);
3350     /* Memory management */
3351 #if !defined(CONFIG_USER_ONLY)
3352     env->nb_tlb = 64;
3353     env->nb_ways = 1;
3354     env->id_tlbs = 0;
3355 #endif
3356     init_excp_4xx_softmmu(env);
3357     env->dcache_line_size = 32;
3358     env->icache_line_size = 32;
3359     /* Allocate hardware IRQ controller */
3360     ppc40x_irq_init(env);
3361 }
3362
3363 /* PowerPC 403                                                               */
3364 #define POWERPC_INSNS_403    (PPC_INSNS_BASE | PPC_STRING |                   \
3365                               PPC_DCR | PPC_WRTEE |                           \
3366                               PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3367                               PPC_CACHE_DCBZ |                                \
3368                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3369                               PPC_4xx_COMMON | PPC_40x_EXCP)
3370 #define POWERPC_INSNS2_403   (PPC_NONE)
3371 #define POWERPC_MSRM_403     (0x000000000007D00DULL)
3372 #define POWERPC_MMU_403      (POWERPC_MMU_REAL)
3373 #define POWERPC_EXCP_403     (POWERPC_EXCP_40x)
3374 #define POWERPC_INPUT_403    (PPC_FLAGS_INPUT_401)
3375 #define POWERPC_BFDM_403     (bfd_mach_ppc_403)
3376 #define POWERPC_FLAG_403     (POWERPC_FLAG_CE | POWERPC_FLAG_PX |             \
3377                               POWERPC_FLAG_BUS_CLK)
3378 #define check_pow_403        check_pow_nocheck
3379
3380 static void init_proc_403 (CPUPPCState *env)
3381 {
3382     gen_spr_40x(env);
3383     gen_spr_401_403(env);
3384     gen_spr_403(env);
3385     gen_spr_403_real(env);
3386     init_excp_4xx_real(env);
3387     env->dcache_line_size = 32;
3388     env->icache_line_size = 32;
3389     /* Allocate hardware IRQ controller */
3390     ppc40x_irq_init(env);
3391 }
3392
3393 /* PowerPC 403 GCX                                                           */
3394 #define POWERPC_INSNS_403GCX (PPC_INSNS_BASE | PPC_STRING |                   \
3395                               PPC_DCR | PPC_WRTEE |                           \
3396                               PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3397                               PPC_CACHE_DCBZ |                                \
3398                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3399                               PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3400                               PPC_4xx_COMMON | PPC_40x_EXCP)
3401 #define POWERPC_INSNS2_403GCX (PPC_NONE)
3402 #define POWERPC_MSRM_403GCX  (0x000000000007D00DULL)
3403 #define POWERPC_MMU_403GCX   (POWERPC_MMU_SOFT_4xx_Z)
3404 #define POWERPC_EXCP_403GCX  (POWERPC_EXCP_40x)
3405 #define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401)
3406 #define POWERPC_BFDM_403GCX  (bfd_mach_ppc_403)
3407 #define POWERPC_FLAG_403GCX  (POWERPC_FLAG_CE | POWERPC_FLAG_PX |             \
3408                               POWERPC_FLAG_BUS_CLK)
3409 #define check_pow_403GCX     check_pow_nocheck
3410
3411 static void init_proc_403GCX (CPUPPCState *env)
3412 {
3413     gen_spr_40x(env);
3414     gen_spr_401_403(env);
3415     gen_spr_403(env);
3416     gen_spr_403_real(env);
3417     gen_spr_403_mmu(env);
3418     /* Bus access control */
3419     /* not emulated, as Qemu never does speculative access */
3420     spr_register(env, SPR_40x_SGR, "SGR",
3421                  SPR_NOACCESS, SPR_NOACCESS,
3422                  &spr_read_generic, &spr_write_generic,
3423                  0xFFFFFFFF);
3424     /* not emulated, as Qemu do not emulate caches */
3425     spr_register(env, SPR_40x_DCWR, "DCWR",
3426                  SPR_NOACCESS, SPR_NOACCESS,
3427                  &spr_read_generic, &spr_write_generic,
3428                  0x00000000);
3429     /* Memory management */
3430 #if !defined(CONFIG_USER_ONLY)
3431     env->nb_tlb = 64;
3432     env->nb_ways = 1;
3433     env->id_tlbs = 0;
3434 #endif
3435     init_excp_4xx_softmmu(env);
3436     env->dcache_line_size = 32;
3437     env->icache_line_size = 32;
3438     /* Allocate hardware IRQ controller */
3439     ppc40x_irq_init(env);
3440 }
3441
3442 /* PowerPC 405                                                               */
3443 #define POWERPC_INSNS_405    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
3444                               PPC_DCR | PPC_WRTEE |                           \
3445                               PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |     \
3446                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3447                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
3448                               PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC | \
3449                               PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP)
3450 #define POWERPC_INSNS2_405   (PPC_NONE)
3451 #define POWERPC_MSRM_405     (0x000000000006E630ULL)
3452 #define POWERPC_MMU_405      (POWERPC_MMU_SOFT_4xx)
3453 #define POWERPC_EXCP_405     (POWERPC_EXCP_40x)
3454 #define POWERPC_INPUT_405    (PPC_FLAGS_INPUT_405)
3455 #define POWERPC_BFDM_405     (bfd_mach_ppc_403)
3456 #define POWERPC_FLAG_405     (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3457                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3458 #define check_pow_405        check_pow_nocheck
3459
3460 static void init_proc_405 (CPUPPCState *env)
3461 {
3462     /* Time base */
3463     gen_tbl(env);
3464     gen_spr_40x(env);
3465     gen_spr_405(env);
3466     /* Bus access control */
3467     /* not emulated, as Qemu never does speculative access */
3468     spr_register(env, SPR_40x_SGR, "SGR",
3469                  SPR_NOACCESS, SPR_NOACCESS,
3470                  &spr_read_generic, &spr_write_generic,
3471                  0xFFFFFFFF);
3472     /* not emulated, as Qemu do not emulate caches */
3473     spr_register(env, SPR_40x_DCWR, "DCWR",
3474                  SPR_NOACCESS, SPR_NOACCESS,
3475                  &spr_read_generic, &spr_write_generic,
3476                  0x00000000);
3477     /* Memory management */
3478 #if !defined(CONFIG_USER_ONLY)
3479     env->nb_tlb = 64;
3480     env->nb_ways = 1;
3481     env->id_tlbs = 0;
3482 #endif
3483     init_excp_4xx_softmmu(env);
3484     env->dcache_line_size = 32;
3485     env->icache_line_size = 32;
3486     /* Allocate hardware IRQ controller */
3487     ppc40x_irq_init(env);
3488 }
3489
3490 /* PowerPC 440 EP                                                            */
3491 #define POWERPC_INSNS_440EP  (PPC_INSNS_BASE | PPC_STRING |                   \
3492                               PPC_DCR | PPC_WRTEE | PPC_RFMCI |               \
3493                               PPC_CACHE | PPC_CACHE_ICBI |                    \
3494                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3495                               PPC_MEM_TLBSYNC | PPC_MFTB |                    \
3496                               PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3497                               PPC_440_SPEC)
3498 #define POWERPC_INSNS2_440EP (PPC_NONE)
3499 #define POWERPC_MSRM_440EP   (0x000000000006D630ULL)
3500 #define POWERPC_MMU_440EP    (POWERPC_MMU_BOOKE)
3501 #define POWERPC_EXCP_440EP   (POWERPC_EXCP_BOOKE)
3502 #define POWERPC_INPUT_440EP  (PPC_FLAGS_INPUT_BookE)
3503 #define POWERPC_BFDM_440EP   (bfd_mach_ppc_403)
3504 #define POWERPC_FLAG_440EP   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3505                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3506 #define check_pow_440EP      check_pow_nocheck
3507
3508 __attribute__ (( unused ))
3509 static void init_proc_440EP (CPUPPCState *env)
3510 {
3511     /* Time base */
3512     gen_tbl(env);
3513     gen_spr_BookE(env, 0x000000000000FFFFULL);
3514     gen_spr_440(env);
3515     gen_spr_usprgh(env);
3516     /* Processor identification */
3517     spr_register(env, SPR_BOOKE_PIR, "PIR",
3518                  SPR_NOACCESS, SPR_NOACCESS,
3519                  &spr_read_generic, &spr_write_pir,
3520                  0x00000000);
3521     /* XXX : not implemented */
3522     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3523                  SPR_NOACCESS, SPR_NOACCESS,
3524                  &spr_read_generic, &spr_write_generic,
3525                  0x00000000);
3526     /* XXX : not implemented */
3527     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3528                  SPR_NOACCESS, SPR_NOACCESS,
3529                  &spr_read_generic, &spr_write_generic,
3530                  0x00000000);
3531     /* XXX : not implemented */
3532     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3533                  SPR_NOACCESS, SPR_NOACCESS,
3534                  &spr_read_generic, &spr_write_generic,
3535                  0x00000000);
3536     /* XXX : not implemented */
3537     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3538                  SPR_NOACCESS, SPR_NOACCESS,
3539                  &spr_read_generic, &spr_write_generic,
3540                  0x00000000);
3541     /* XXX : not implemented */
3542     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3543                  SPR_NOACCESS, SPR_NOACCESS,
3544                  &spr_read_generic, &spr_write_generic,
3545                  0x00000000);
3546     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3547                  SPR_NOACCESS, SPR_NOACCESS,
3548                  &spr_read_generic, &spr_write_generic,
3549                  0x00000000);
3550     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3551                  SPR_NOACCESS, SPR_NOACCESS,
3552                  &spr_read_generic, &spr_write_generic,
3553                  0x00000000);
3554     /* XXX : not implemented */
3555     spr_register(env, SPR_440_CCR1, "CCR1",
3556                  SPR_NOACCESS, SPR_NOACCESS,
3557                  &spr_read_generic, &spr_write_generic,
3558                  0x00000000);
3559     /* Memory management */
3560 #if !defined(CONFIG_USER_ONLY)
3561     env->nb_tlb = 64;
3562     env->nb_ways = 1;
3563     env->id_tlbs = 0;
3564 #endif
3565     init_excp_BookE(env);
3566     env->dcache_line_size = 32;
3567     env->icache_line_size = 32;
3568     /* XXX: TODO: allocate internal IRQ controller */
3569 }
3570
3571 /* PowerPC 440 GP                                                            */
3572 #define POWERPC_INSNS_440GP  (PPC_INSNS_BASE | PPC_STRING |                   \
3573                               PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |  \
3574                               PPC_CACHE | PPC_CACHE_ICBI |                    \
3575                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3576                               PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |       \
3577                               PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3578                               PPC_440_SPEC)
3579 #define POWERPC_INSNS2_440GP (PPC_NONE)
3580 #define POWERPC_MSRM_440GP   (0x000000000006FF30ULL)
3581 #define POWERPC_MMU_440GP    (POWERPC_MMU_BOOKE)
3582 #define POWERPC_EXCP_440GP   (POWERPC_EXCP_BOOKE)
3583 #define POWERPC_INPUT_440GP  (PPC_FLAGS_INPUT_BookE)
3584 #define POWERPC_BFDM_440GP   (bfd_mach_ppc_403)
3585 #define POWERPC_FLAG_440GP   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3586                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3587 #define check_pow_440GP      check_pow_nocheck
3588
3589 __attribute__ (( unused ))
3590 static void init_proc_440GP (CPUPPCState *env)
3591 {
3592     /* Time base */
3593     gen_tbl(env);
3594     gen_spr_BookE(env, 0x000000000000FFFFULL);
3595     gen_spr_440(env);
3596     gen_spr_usprgh(env);
3597     /* Processor identification */
3598     spr_register(env, SPR_BOOKE_PIR, "PIR",
3599                  SPR_NOACCESS, SPR_NOACCESS,
3600                  &spr_read_generic, &spr_write_pir,
3601                  0x00000000);
3602     /* XXX : not implemented */
3603     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3604                  SPR_NOACCESS, SPR_NOACCESS,
3605                  &spr_read_generic, &spr_write_generic,
3606                  0x00000000);
3607     /* XXX : not implemented */
3608     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3609                  SPR_NOACCESS, SPR_NOACCESS,
3610                  &spr_read_generic, &spr_write_generic,
3611                  0x00000000);
3612     /* XXX : not implemented */
3613     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3614                  SPR_NOACCESS, SPR_NOACCESS,
3615                  &spr_read_generic, &spr_write_generic,
3616                  0x00000000);
3617     /* XXX : not implemented */
3618     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3619                  SPR_NOACCESS, SPR_NOACCESS,
3620                  &spr_read_generic, &spr_write_generic,
3621                  0x00000000);
3622     /* Memory management */
3623 #if !defined(CONFIG_USER_ONLY)
3624     env->nb_tlb = 64;
3625     env->nb_ways = 1;
3626     env->id_tlbs = 0;
3627 #endif
3628     init_excp_BookE(env);
3629     env->dcache_line_size = 32;
3630     env->icache_line_size = 32;
3631     /* XXX: TODO: allocate internal IRQ controller */
3632 }
3633
3634 /* PowerPC 440x4                                                             */
3635 #define POWERPC_INSNS_440x4  (PPC_INSNS_BASE | PPC_STRING |                   \
3636                               PPC_DCR | PPC_WRTEE |                           \
3637                               PPC_CACHE | PPC_CACHE_ICBI |                    \
3638                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3639                               PPC_MEM_TLBSYNC | PPC_MFTB |                    \
3640                               PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3641                               PPC_440_SPEC)
3642 #define POWERPC_INSNS2_440x4 (PPC_NONE)
3643 #define POWERPC_MSRM_440x4   (0x000000000006FF30ULL)
3644 #define POWERPC_MMU_440x4    (POWERPC_MMU_BOOKE)
3645 #define POWERPC_EXCP_440x4   (POWERPC_EXCP_BOOKE)
3646 #define POWERPC_INPUT_440x4  (PPC_FLAGS_INPUT_BookE)
3647 #define POWERPC_BFDM_440x4   (bfd_mach_ppc_403)
3648 #define POWERPC_FLAG_440x4   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3649                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3650 #define check_pow_440x4      check_pow_nocheck
3651
3652 __attribute__ (( unused ))
3653 static void init_proc_440x4 (CPUPPCState *env)
3654 {
3655     /* Time base */
3656     gen_tbl(env);
3657     gen_spr_BookE(env, 0x000000000000FFFFULL);
3658     gen_spr_440(env);
3659     gen_spr_usprgh(env);
3660     /* Processor identification */
3661     spr_register(env, SPR_BOOKE_PIR, "PIR",
3662                  SPR_NOACCESS, SPR_NOACCESS,
3663                  &spr_read_generic, &spr_write_pir,
3664                  0x00000000);
3665     /* XXX : not implemented */
3666     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3667                  SPR_NOACCESS, SPR_NOACCESS,
3668                  &spr_read_generic, &spr_write_generic,
3669                  0x00000000);
3670     /* XXX : not implemented */
3671     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3672                  SPR_NOACCESS, SPR_NOACCESS,
3673                  &spr_read_generic, &spr_write_generic,
3674                  0x00000000);
3675     /* XXX : not implemented */
3676     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3677                  SPR_NOACCESS, SPR_NOACCESS,
3678                  &spr_read_generic, &spr_write_generic,
3679                  0x00000000);
3680     /* XXX : not implemented */
3681     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3682                  SPR_NOACCESS, SPR_NOACCESS,
3683                  &spr_read_generic, &spr_write_generic,
3684                  0x00000000);
3685     /* Memory management */
3686 #if !defined(CONFIG_USER_ONLY)
3687     env->nb_tlb = 64;
3688     env->nb_ways = 1;
3689     env->id_tlbs = 0;
3690 #endif
3691     init_excp_BookE(env);
3692     env->dcache_line_size = 32;
3693     env->icache_line_size = 32;
3694     /* XXX: TODO: allocate internal IRQ controller */
3695 }
3696
3697 /* PowerPC 440x5                                                             */
3698 #define POWERPC_INSNS_440x5  (PPC_INSNS_BASE | PPC_STRING |                   \
3699                               PPC_DCR | PPC_WRTEE | PPC_RFMCI |               \
3700                               PPC_CACHE | PPC_CACHE_ICBI |                    \
3701                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3702                               PPC_MEM_TLBSYNC | PPC_MFTB |                    \
3703                               PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3704                               PPC_440_SPEC)
3705 #define POWERPC_INSNS2_440x5 (PPC_NONE)
3706 #define POWERPC_MSRM_440x5   (0x000000000006FF30ULL)
3707 #define POWERPC_MMU_440x5    (POWERPC_MMU_BOOKE)
3708 #define POWERPC_EXCP_440x5   (POWERPC_EXCP_BOOKE)
3709 #define POWERPC_INPUT_440x5  (PPC_FLAGS_INPUT_BookE)
3710 #define POWERPC_BFDM_440x5   (bfd_mach_ppc_403)
3711 #define POWERPC_FLAG_440x5   (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |           \
3712                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3713 #define check_pow_440x5      check_pow_nocheck
3714
3715 static void init_proc_440x5 (CPUPPCState *env)
3716 {
3717     /* Time base */
3718     gen_tbl(env);
3719     gen_spr_BookE(env, 0x000000000000FFFFULL);
3720     gen_spr_440(env);
3721     gen_spr_usprgh(env);
3722     /* Processor identification */
3723     spr_register(env, SPR_BOOKE_PIR, "PIR",
3724                  SPR_NOACCESS, SPR_NOACCESS,
3725                  &spr_read_generic, &spr_write_pir,
3726                  0x00000000);
3727     /* XXX : not implemented */
3728     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3729                  SPR_NOACCESS, SPR_NOACCESS,
3730                  &spr_read_generic, &spr_write_generic,
3731                  0x00000000);
3732     /* XXX : not implemented */
3733     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3734                  SPR_NOACCESS, SPR_NOACCESS,
3735                  &spr_read_generic, &spr_write_generic,
3736                  0x00000000);
3737     /* XXX : not implemented */
3738     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3739                  SPR_NOACCESS, SPR_NOACCESS,
3740                  &spr_read_generic, &spr_write_generic,
3741                  0x00000000);
3742     /* XXX : not implemented */
3743     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3744                  SPR_NOACCESS, SPR_NOACCESS,
3745                  &spr_read_generic, &spr_write_generic,
3746                  0x00000000);
3747     /* XXX : not implemented */
3748     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3749                  SPR_NOACCESS, SPR_NOACCESS,
3750                  &spr_read_generic, &spr_write_generic,
3751                  0x00000000);
3752     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3753                  SPR_NOACCESS, SPR_NOACCESS,
3754                  &spr_read_generic, &spr_write_generic,
3755                  0x00000000);
3756     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3757                  SPR_NOACCESS, SPR_NOACCESS,
3758                  &spr_read_generic, &spr_write_generic,
3759                  0x00000000);
3760     /* XXX : not implemented */
3761     spr_register(env, SPR_440_CCR1, "CCR1",
3762                  SPR_NOACCESS, SPR_NOACCESS,
3763                  &spr_read_generic, &spr_write_generic,
3764                  0x00000000);
3765     /* Memory management */
3766 #if !defined(CONFIG_USER_ONLY)
3767     env->nb_tlb = 64;
3768     env->nb_ways = 1;
3769     env->id_tlbs = 0;
3770 #endif
3771     init_excp_BookE(env);
3772     env->dcache_line_size = 32;
3773     env->icache_line_size = 32;
3774     ppc40x_irq_init(env);
3775 }
3776
3777 /* PowerPC 460 (guessed)                                                     */
3778 #define POWERPC_INSNS_460    (PPC_INSNS_BASE | PPC_STRING |                   \
3779                               PPC_DCR | PPC_DCRX  | PPC_DCRUX |               \
3780                               PPC_WRTEE | PPC_MFAPIDI | PPC_MFTB |            \
3781                               PPC_CACHE | PPC_CACHE_ICBI |                    \
3782                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3783                               PPC_MEM_TLBSYNC | PPC_TLBIVA |                  \
3784                               PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3785                               PPC_440_SPEC)
3786 #define POWERPC_INSNS2_460   (PPC_NONE)
3787 #define POWERPC_MSRM_460     (0x000000000006FF30ULL)
3788 #define POWERPC_MMU_460      (POWERPC_MMU_BOOKE)
3789 #define POWERPC_EXCP_460     (POWERPC_EXCP_BOOKE)
3790 #define POWERPC_INPUT_460    (PPC_FLAGS_INPUT_BookE)
3791 #define POWERPC_BFDM_460     (bfd_mach_ppc_403)
3792 #define POWERPC_FLAG_460     (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3793                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3794 #define check_pow_460        check_pow_nocheck
3795
3796 __attribute__ (( unused ))
3797 static void init_proc_460 (CPUPPCState *env)
3798 {
3799     /* Time base */
3800     gen_tbl(env);
3801     gen_spr_BookE(env, 0x000000000000FFFFULL);
3802     gen_spr_440(env);
3803     gen_spr_usprgh(env);
3804     /* Processor identification */
3805     spr_register(env, SPR_BOOKE_PIR, "PIR",
3806                  SPR_NOACCESS, SPR_NOACCESS,
3807                  &spr_read_generic, &spr_write_pir,
3808                  0x00000000);
3809     /* XXX : not implemented */
3810     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3811                  SPR_NOACCESS, SPR_NOACCESS,
3812                  &spr_read_generic, &spr_write_generic,
3813                  0x00000000);
3814     /* XXX : not implemented */
3815     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3816                  SPR_NOACCESS, SPR_NOACCESS,
3817                  &spr_read_generic, &spr_write_generic,
3818                  0x00000000);
3819     /* XXX : not implemented */
3820     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3821                  SPR_NOACCESS, SPR_NOACCESS,
3822                  &spr_read_generic, &spr_write_generic,
3823                  0x00000000);
3824     /* XXX : not implemented */
3825     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3826                  SPR_NOACCESS, SPR_NOACCESS,
3827                  &spr_read_generic, &spr_write_generic,
3828                  0x00000000);
3829     /* XXX : not implemented */
3830     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3831                  SPR_NOACCESS, SPR_NOACCESS,
3832                  &spr_read_generic, &spr_write_generic,
3833                  0x00000000);
3834     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3835                  SPR_NOACCESS, SPR_NOACCESS,
3836                  &spr_read_generic, &spr_write_generic,
3837                  0x00000000);
3838     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3839                  SPR_NOACCESS, SPR_NOACCESS,
3840                  &spr_read_generic, &spr_write_generic,
3841                  0x00000000);
3842     /* XXX : not implemented */
3843     spr_register(env, SPR_440_CCR1, "CCR1",
3844                  SPR_NOACCESS, SPR_NOACCESS,
3845                  &spr_read_generic, &spr_write_generic,
3846                  0x00000000);
3847     /* XXX : not implemented */
3848     spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
3849                  &spr_read_generic, &spr_write_generic,
3850                  &spr_read_generic, &spr_write_generic,
3851                  0x00000000);
3852     /* Memory management */
3853 #if !defined(CONFIG_USER_ONLY)
3854     env->nb_tlb = 64;
3855     env->nb_ways = 1;
3856     env->id_tlbs = 0;
3857 #endif
3858     init_excp_BookE(env);
3859     env->dcache_line_size = 32;
3860     env->icache_line_size = 32;
3861     /* XXX: TODO: allocate internal IRQ controller */
3862 }
3863
3864 /* PowerPC 460F (guessed)                                                    */
3865 #define POWERPC_INSNS_460F   (PPC_INSNS_BASE | PPC_STRING |                   \
3866                               PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |   \
3867                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
3868                               PPC_FLOAT_STFIWX | PPC_MFTB |                   \
3869                               PPC_DCR | PPC_DCRX | PPC_DCRUX |                \
3870                               PPC_WRTEE | PPC_MFAPIDI |                       \
3871                               PPC_CACHE | PPC_CACHE_ICBI |                    \
3872                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
3873                               PPC_MEM_TLBSYNC | PPC_TLBIVA |                  \
3874                               PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |      \
3875                               PPC_440_SPEC)
3876 #define POWERPC_INSNS2_460F  (PPC_NONE)
3877 #define POWERPC_MSRM_460     (0x000000000006FF30ULL)
3878 #define POWERPC_MMU_460F     (POWERPC_MMU_BOOKE)
3879 #define POWERPC_EXCP_460F    (POWERPC_EXCP_BOOKE)
3880 #define POWERPC_INPUT_460F   (PPC_FLAGS_INPUT_BookE)
3881 #define POWERPC_BFDM_460F    (bfd_mach_ppc_403)
3882 #define POWERPC_FLAG_460F    (POWERPC_FLAG_CE | POWERPC_FLAG_DWE |            \
3883                               POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK)
3884 #define check_pow_460F       check_pow_nocheck
3885
3886 __attribute__ (( unused ))
3887 static void init_proc_460F (CPUPPCState *env)
3888 {
3889     /* Time base */
3890     gen_tbl(env);
3891     gen_spr_BookE(env, 0x000000000000FFFFULL);
3892     gen_spr_440(env);
3893     gen_spr_usprgh(env);
3894     /* Processor identification */
3895     spr_register(env, SPR_BOOKE_PIR, "PIR",
3896                  SPR_NOACCESS, SPR_NOACCESS,
3897                  &spr_read_generic, &spr_write_pir,
3898                  0x00000000);
3899     /* XXX : not implemented */
3900     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3901                  SPR_NOACCESS, SPR_NOACCESS,
3902                  &spr_read_generic, &spr_write_generic,
3903                  0x00000000);
3904     /* XXX : not implemented */
3905     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3906                  SPR_NOACCESS, SPR_NOACCESS,
3907                  &spr_read_generic, &spr_write_generic,
3908                  0x00000000);
3909     /* XXX : not implemented */
3910     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3911                  SPR_NOACCESS, SPR_NOACCESS,
3912                  &spr_read_generic, &spr_write_generic,
3913                  0x00000000);
3914     /* XXX : not implemented */
3915     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3916                  SPR_NOACCESS, SPR_NOACCESS,
3917                  &spr_read_generic, &spr_write_generic,
3918                  0x00000000);
3919     /* XXX : not implemented */
3920     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3921                  SPR_NOACCESS, SPR_NOACCESS,
3922                  &spr_read_generic, &spr_write_generic,
3923                  0x00000000);
3924     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3925                  SPR_NOACCESS, SPR_NOACCESS,
3926                  &spr_read_generic, &spr_write_generic,
3927                  0x00000000);
3928     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3929                  SPR_NOACCESS, SPR_NOACCESS,
3930                  &spr_read_generic, &spr_write_generic,
3931                  0x00000000);
3932     /* XXX : not implemented */
3933     spr_register(env, SPR_440_CCR1, "CCR1",
3934                  SPR_NOACCESS, SPR_NOACCESS,
3935                  &spr_read_generic, &spr_write_generic,
3936                  0x00000000);
3937     /* XXX : not implemented */
3938     spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
3939                  &spr_read_generic, &spr_write_generic,
3940                  &spr_read_generic, &spr_write_generic,
3941                  0x00000000);
3942     /* Memory management */
3943 #if !defined(CONFIG_USER_ONLY)
3944     env->nb_tlb = 64;
3945     env->nb_ways = 1;
3946     env->id_tlbs = 0;
3947 #endif
3948     init_excp_BookE(env);
3949     env->dcache_line_size = 32;
3950     env->icache_line_size = 32;
3951     /* XXX: TODO: allocate internal IRQ controller */
3952 }
3953
3954 /* Freescale 5xx cores (aka RCPU) */
3955 #define POWERPC_INSNS_MPC5xx (PPC_INSNS_BASE | PPC_STRING |                   \
3956                               PPC_MEM_EIEIO | PPC_MEM_SYNC |                  \
3957                               PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX | \
3958                               PPC_MFTB)
3959 #define POWERPC_INSNS2_MPC5xx (PPC_NONE)
3960 #define POWERPC_MSRM_MPC5xx  (0x000000000001FF43ULL)
3961 #define POWERPC_MMU_MPC5xx   (POWERPC_MMU_REAL)
3962 #define POWERPC_EXCP_MPC5xx  (POWERPC_EXCP_603)
3963 #define POWERPC_INPUT_MPC5xx (PPC_FLAGS_INPUT_RCPU)
3964 #define POWERPC_BFDM_MPC5xx  (bfd_mach_ppc_505)
3965 #define POWERPC_FLAG_MPC5xx  (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
3966                               POWERPC_FLAG_BUS_CLK)
3967 #define check_pow_MPC5xx     check_pow_none
3968
3969 __attribute__ (( unused ))
3970 static void init_proc_MPC5xx (CPUPPCState *env)
3971 {
3972     /* Time base */
3973     gen_tbl(env);
3974     gen_spr_5xx_8xx(env);
3975     gen_spr_5xx(env);
3976     init_excp_MPC5xx(env);
3977     env->dcache_line_size = 32;
3978     env->icache_line_size = 32;
3979     /* XXX: TODO: allocate internal IRQ controller */
3980 }
3981
3982 /* Freescale 8xx cores (aka PowerQUICC) */
3983 #define POWERPC_INSNS_MPC8xx (PPC_INSNS_BASE | PPC_STRING  |                  \
3984                               PPC_MEM_EIEIO | PPC_MEM_SYNC |                  \
3985                               PPC_CACHE_ICBI | PPC_MFTB)
3986 #define POWERPC_INSNS2_MPC8xx (PPC_NONE)
3987 #define POWERPC_MSRM_MPC8xx  (0x000000000001F673ULL)
3988 #define POWERPC_MMU_MPC8xx   (POWERPC_MMU_MPC8xx)
3989 #define POWERPC_EXCP_MPC8xx  (POWERPC_EXCP_603)
3990 #define POWERPC_INPUT_MPC8xx (PPC_FLAGS_INPUT_RCPU)
3991 #define POWERPC_BFDM_MPC8xx  (bfd_mach_ppc_860)
3992 #define POWERPC_FLAG_MPC8xx  (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
3993                               POWERPC_FLAG_BUS_CLK)
3994 #define check_pow_MPC8xx     check_pow_none
3995
3996 __attribute__ (( unused ))
3997 static void init_proc_MPC8xx (CPUPPCState *env)
3998 {
3999     /* Time base */
4000     gen_tbl(env);
4001     gen_spr_5xx_8xx(env);
4002     gen_spr_8xx(env);
4003     init_excp_MPC8xx(env);
4004     env->dcache_line_size = 32;
4005     env->icache_line_size = 32;
4006     /* XXX: TODO: allocate internal IRQ controller */
4007 }
4008
4009 /* Freescale 82xx cores (aka PowerQUICC-II)                                  */
4010 /* PowerPC G2                                                                */
4011 #define POWERPC_INSNS_G2     (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4012                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4013                               PPC_FLOAT_STFIWX |                              \
4014                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4015                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4016                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4017                               PPC_SEGMENT | PPC_EXTERN)
4018 #define POWERPC_INSNS2_G2    (PPC_NONE)
4019 #define POWERPC_MSRM_G2      (0x000000000006FFF2ULL)
4020 #define POWERPC_MMU_G2       (POWERPC_MMU_SOFT_6xx)
4021 //#define POWERPC_EXCP_G2      (POWERPC_EXCP_G2)
4022 #define POWERPC_INPUT_G2     (PPC_FLAGS_INPUT_6xx)
4023 #define POWERPC_BFDM_G2      (bfd_mach_ppc_ec603e)
4024 #define POWERPC_FLAG_G2      (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4025                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4026 #define check_pow_G2         check_pow_hid0
4027
4028 static void init_proc_G2 (CPUPPCState *env)
4029 {
4030     gen_spr_ne_601(env);
4031     gen_spr_G2_755(env);
4032     gen_spr_G2(env);
4033     /* Time base */
4034     gen_tbl(env);
4035     /* External access control */
4036     /* XXX : not implemented */
4037     spr_register(env, SPR_EAR, "EAR",
4038                  SPR_NOACCESS, SPR_NOACCESS,
4039                  &spr_read_generic, &spr_write_generic,
4040                  0x00000000);
4041     /* Hardware implementation register */
4042     /* XXX : not implemented */
4043     spr_register(env, SPR_HID0, "HID0",
4044                  SPR_NOACCESS, SPR_NOACCESS,
4045                  &spr_read_generic, &spr_write_generic,
4046                  0x00000000);
4047     /* XXX : not implemented */
4048     spr_register(env, SPR_HID1, "HID1",
4049                  SPR_NOACCESS, SPR_NOACCESS,
4050                  &spr_read_generic, &spr_write_generic,
4051                  0x00000000);
4052     /* XXX : not implemented */
4053     spr_register(env, SPR_HID2, "HID2",
4054                  SPR_NOACCESS, SPR_NOACCESS,
4055                  &spr_read_generic, &spr_write_generic,
4056                  0x00000000);
4057     /* Memory management */
4058     gen_low_BATs(env);
4059     gen_high_BATs(env);
4060     gen_6xx_7xx_soft_tlb(env, 64, 2);
4061     init_excp_G2(env);
4062     env->dcache_line_size = 32;
4063     env->icache_line_size = 32;
4064     /* Allocate hardware IRQ controller */
4065     ppc6xx_irq_init(env);
4066 }
4067
4068 /* PowerPC G2LE                                                              */
4069 #define POWERPC_INSNS_G2LE   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4070                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4071                               PPC_FLOAT_STFIWX |                              \
4072                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4073                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4074                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4075                               PPC_SEGMENT | PPC_EXTERN)
4076 #define POWERPC_INSNS2_G2LE  (PPC_NONE)
4077 #define POWERPC_MSRM_G2LE    (0x000000000007FFF3ULL)
4078 #define POWERPC_MMU_G2LE     (POWERPC_MMU_SOFT_6xx)
4079 #define POWERPC_EXCP_G2LE    (POWERPC_EXCP_G2)
4080 #define POWERPC_INPUT_G2LE   (PPC_FLAGS_INPUT_6xx)
4081 #define POWERPC_BFDM_G2LE    (bfd_mach_ppc_ec603e)
4082 #define POWERPC_FLAG_G2LE    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4083                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4084 #define check_pow_G2LE       check_pow_hid0
4085
4086 static void init_proc_G2LE (CPUPPCState *env)
4087 {
4088     gen_spr_ne_601(env);
4089     gen_spr_G2_755(env);
4090     gen_spr_G2(env);
4091     /* Time base */
4092     gen_tbl(env);
4093     /* External access control */
4094     /* XXX : not implemented */
4095     spr_register(env, SPR_EAR, "EAR",
4096                  SPR_NOACCESS, SPR_NOACCESS,
4097                  &spr_read_generic, &spr_write_generic,
4098                  0x00000000);
4099     /* Hardware implementation register */
4100     /* XXX : not implemented */
4101     spr_register(env, SPR_HID0, "HID0",
4102                  SPR_NOACCESS, SPR_NOACCESS,
4103                  &spr_read_generic, &spr_write_generic,
4104                  0x00000000);
4105     /* XXX : not implemented */
4106     spr_register(env, SPR_HID1, "HID1",
4107                  SPR_NOACCESS, SPR_NOACCESS,
4108                  &spr_read_generic, &spr_write_generic,
4109                  0x00000000);
4110     /* XXX : not implemented */
4111     spr_register(env, SPR_HID2, "HID2",
4112                  SPR_NOACCESS, SPR_NOACCESS,
4113                  &spr_read_generic, &spr_write_generic,
4114                  0x00000000);
4115     /* Memory management */
4116     gen_low_BATs(env);
4117     gen_high_BATs(env);
4118     gen_6xx_7xx_soft_tlb(env, 64, 2);
4119     init_excp_G2(env);
4120     env->dcache_line_size = 32;
4121     env->icache_line_size = 32;
4122     /* Allocate hardware IRQ controller */
4123     ppc6xx_irq_init(env);
4124 }
4125
4126 /* e200 core                                                                 */
4127 /* XXX: unimplemented instructions:
4128  * dcblc
4129  * dcbtlst
4130  * dcbtstls
4131  * icblc
4132  * icbtls
4133  * tlbivax
4134  * all SPE multiply-accumulate instructions
4135  */
4136 #define POWERPC_INSNS_e200   (PPC_INSNS_BASE | PPC_ISEL |                     \
4137                               PPC_SPE | PPC_SPE_SINGLE |                      \
4138                               PPC_WRTEE | PPC_RFDI |                          \
4139                               PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |   \
4140                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
4141                               PPC_MEM_TLBSYNC | PPC_TLBIVAX |                 \
4142                               PPC_BOOKE)
4143 #define POWERPC_INSNS2_e200  (PPC_NONE)
4144 #define POWERPC_MSRM_e200    (0x000000000606FF30ULL)
4145 #define POWERPC_MMU_e200     (POWERPC_MMU_BOOKE206)
4146 #define POWERPC_EXCP_e200    (POWERPC_EXCP_BOOKE)
4147 #define POWERPC_INPUT_e200   (PPC_FLAGS_INPUT_BookE)
4148 #define POWERPC_BFDM_e200    (bfd_mach_ppc_860)
4149 #define POWERPC_FLAG_e200    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |            \
4150                               POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |           \
4151                               POWERPC_FLAG_BUS_CLK)
4152 #define check_pow_e200       check_pow_hid0
4153
4154 __attribute__ (( unused ))
4155 static void init_proc_e200 (CPUPPCState *env)
4156 {
4157     /* Time base */
4158     gen_tbl(env);
4159     gen_spr_BookE(env, 0x000000070000FFFFULL);
4160     /* XXX : not implemented */
4161     spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4162                  &spr_read_spefscr, &spr_write_spefscr,
4163                  &spr_read_spefscr, &spr_write_spefscr,
4164                  0x00000000);
4165     /* Memory management */
4166     gen_spr_BookE206(env, 0x0000005D, NULL);
4167     /* XXX : not implemented */
4168     spr_register(env, SPR_HID0, "HID0",
4169                  SPR_NOACCESS, SPR_NOACCESS,
4170                  &spr_read_generic, &spr_write_generic,
4171                  0x00000000);
4172     /* XXX : not implemented */
4173     spr_register(env, SPR_HID1, "HID1",
4174                  SPR_NOACCESS, SPR_NOACCESS,
4175                  &spr_read_generic, &spr_write_generic,
4176                  0x00000000);
4177     /* XXX : not implemented */
4178     spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
4179                  SPR_NOACCESS, SPR_NOACCESS,
4180                  &spr_read_generic, &spr_write_generic,
4181                  0x00000000);
4182     /* XXX : not implemented */
4183     spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4184                  SPR_NOACCESS, SPR_NOACCESS,
4185                  &spr_read_generic, &spr_write_generic,
4186                  0x00000000);
4187     /* XXX : not implemented */
4188     spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
4189                  SPR_NOACCESS, SPR_NOACCESS,
4190                  &spr_read_generic, &spr_write_generic,
4191                  0x00000000);
4192     /* XXX : not implemented */
4193     spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
4194                  SPR_NOACCESS, SPR_NOACCESS,
4195                  &spr_read_generic, &spr_write_generic,
4196                  0x00000000);
4197     /* XXX : not implemented */
4198     spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
4199                  SPR_NOACCESS, SPR_NOACCESS,
4200                  &spr_read_generic, &spr_write_generic,
4201                  0x00000000);
4202     /* XXX : not implemented */
4203     spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4204                  SPR_NOACCESS, SPR_NOACCESS,
4205                  &spr_read_generic, &spr_write_generic,
4206                  0x00000000);
4207     /* XXX : not implemented */
4208     spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4209                  SPR_NOACCESS, SPR_NOACCESS,
4210                  &spr_read_generic, &spr_write_generic,
4211                  0x00000000);
4212     /* XXX : not implemented */
4213     spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
4214                  SPR_NOACCESS, SPR_NOACCESS,
4215                  &spr_read_generic, &spr_write_generic,
4216                  0x00000000);
4217     /* XXX : not implemented */
4218     spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
4219                  SPR_NOACCESS, SPR_NOACCESS,
4220                  &spr_read_generic, &spr_write_generic,
4221                  0x00000000);
4222     /* XXX : not implemented */
4223     spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
4224                  SPR_NOACCESS, SPR_NOACCESS,
4225                  &spr_read_generic, &spr_write_generic,
4226                  0x00000000);
4227     /* XXX : not implemented */
4228     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4229                  SPR_NOACCESS, SPR_NOACCESS,
4230                  &spr_read_generic, &spr_write_generic,
4231                  0x00000000);
4232     /* XXX : not implemented */
4233     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4234                  SPR_NOACCESS, SPR_NOACCESS,
4235                  &spr_read_generic, &spr_write_generic,
4236                  0x00000000);
4237     /* XXX : not implemented */
4238     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4239                  SPR_NOACCESS, SPR_NOACCESS,
4240                  &spr_read_generic, &spr_write_generic,
4241                  0x00000000); /* TOFIX */
4242     spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
4243                  SPR_NOACCESS, SPR_NOACCESS,
4244                  &spr_read_generic, &spr_write_generic,
4245                  0x00000000);
4246     spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
4247                  SPR_NOACCESS, SPR_NOACCESS,
4248                  &spr_read_generic, &spr_write_generic,
4249                  0x00000000);
4250 #if !defined(CONFIG_USER_ONLY)
4251     env->nb_tlb = 64;
4252     env->nb_ways = 1;
4253     env->id_tlbs = 0;
4254 #endif
4255     init_excp_e200(env);
4256     env->dcache_line_size = 32;
4257     env->icache_line_size = 32;
4258     /* XXX: TODO: allocate internal IRQ controller */
4259 }
4260
4261 /* e300 core                                                                 */
4262 #define POWERPC_INSNS_e300   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4263                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4264                               PPC_FLOAT_STFIWX |                              \
4265                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4266                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4267                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4268                               PPC_SEGMENT | PPC_EXTERN)
4269 #define POWERPC_INSNS2_e300  (PPC_NONE)
4270 #define POWERPC_MSRM_e300    (0x000000000007FFF3ULL)
4271 #define POWERPC_MMU_e300     (POWERPC_MMU_SOFT_6xx)
4272 #define POWERPC_EXCP_e300    (POWERPC_EXCP_603)
4273 #define POWERPC_INPUT_e300   (PPC_FLAGS_INPUT_6xx)
4274 #define POWERPC_BFDM_e300    (bfd_mach_ppc_603)
4275 #define POWERPC_FLAG_e300    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4276                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4277 #define check_pow_e300       check_pow_hid0
4278
4279 __attribute__ (( unused ))
4280 static void init_proc_e300 (CPUPPCState *env)
4281 {
4282     gen_spr_ne_601(env);
4283     gen_spr_603(env);
4284     /* Time base */
4285     gen_tbl(env);
4286     /* hardware implementation registers */
4287     /* XXX : not implemented */
4288     spr_register(env, SPR_HID0, "HID0",
4289                  SPR_NOACCESS, SPR_NOACCESS,
4290                  &spr_read_generic, &spr_write_generic,
4291                  0x00000000);
4292     /* XXX : not implemented */
4293     spr_register(env, SPR_HID1, "HID1",
4294                  SPR_NOACCESS, SPR_NOACCESS,
4295                  &spr_read_generic, &spr_write_generic,
4296                  0x00000000);
4297     /* XXX : not implemented */
4298     spr_register(env, SPR_HID2, "HID2",
4299                  SPR_NOACCESS, SPR_NOACCESS,
4300                  &spr_read_generic, &spr_write_generic,
4301                  0x00000000);
4302     /* Memory management */
4303     gen_low_BATs(env);
4304     gen_high_BATs(env);
4305     gen_6xx_7xx_soft_tlb(env, 64, 2);
4306     init_excp_603(env);
4307     env->dcache_line_size = 32;
4308     env->icache_line_size = 32;
4309     /* Allocate hardware IRQ controller */
4310     ppc6xx_irq_init(env);
4311 }
4312
4313 /* e500v1 core                                                               */
4314 #define POWERPC_INSNS_e500v1   (PPC_INSNS_BASE | PPC_ISEL |             \
4315                                 PPC_SPE | PPC_SPE_SINGLE |              \
4316                                 PPC_WRTEE | PPC_RFDI |                  \
4317                                 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | \
4318                                 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |       \
4319                                 PPC_MEM_TLBSYNC | PPC_TLBIVAX)
4320 #define POWERPC_INSNS2_e500v1  (PPC2_BOOKE206)
4321 #define POWERPC_MSRM_e500v1    (0x000000000606FF30ULL)
4322 #define POWERPC_MMU_e500v1     (POWERPC_MMU_BOOKE206)
4323 #define POWERPC_EXCP_e500v1    (POWERPC_EXCP_BOOKE)
4324 #define POWERPC_INPUT_e500v1   (PPC_FLAGS_INPUT_BookE)
4325 #define POWERPC_BFDM_e500v1    (bfd_mach_ppc_860)
4326 #define POWERPC_FLAG_e500v1    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |    \
4327                                 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |   \
4328                                 POWERPC_FLAG_BUS_CLK)
4329 #define check_pow_e500v1       check_pow_hid0
4330 #define init_proc_e500v1       init_proc_e500v1
4331
4332 /* e500v2 core                                                               */
4333 #define POWERPC_INSNS_e500v2   (PPC_INSNS_BASE | PPC_ISEL |             \
4334                                 PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |   \
4335                                 PPC_WRTEE | PPC_RFDI |                  \
4336                                 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | \
4337                                 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |       \
4338                                 PPC_MEM_TLBSYNC | PPC_TLBIVAX)
4339 #define POWERPC_INSNS2_e500v2  (PPC2_BOOKE206)
4340 #define POWERPC_MSRM_e500v2    (0x000000000606FF30ULL)
4341 #define POWERPC_MMU_e500v2     (POWERPC_MMU_BOOKE206)
4342 #define POWERPC_EXCP_e500v2    (POWERPC_EXCP_BOOKE)
4343 #define POWERPC_INPUT_e500v2   (PPC_FLAGS_INPUT_BookE)
4344 #define POWERPC_BFDM_e500v2    (bfd_mach_ppc_860)
4345 #define POWERPC_FLAG_e500v2    (POWERPC_FLAG_SPE | POWERPC_FLAG_CE |    \
4346                                 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |   \
4347                                 POWERPC_FLAG_BUS_CLK)
4348 #define check_pow_e500v2       check_pow_hid0
4349 #define init_proc_e500v2       init_proc_e500v2
4350
4351 static void init_proc_e500 (CPUPPCState *env, int version)
4352 {
4353     uint32_t tlbncfg[2];
4354 #if !defined(CONFIG_USER_ONLY)
4355     int i;
4356 #endif
4357
4358     /* Time base */
4359     gen_tbl(env);
4360     /*
4361      * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
4362      *     complain when accessing them.
4363      * gen_spr_BookE(env, 0x0000000F0000FD7FULL);
4364      */
4365     gen_spr_BookE(env, 0x0000000F0000FFFFULL);
4366     /* Processor identification */
4367     spr_register(env, SPR_BOOKE_PIR, "PIR",
4368                  SPR_NOACCESS, SPR_NOACCESS,
4369                  &spr_read_generic, &spr_write_pir,
4370                  0x00000000);
4371     /* XXX : not implemented */
4372     spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4373                  &spr_read_spefscr, &spr_write_spefscr,
4374                  &spr_read_spefscr, &spr_write_spefscr,
4375                  0x00000000);
4376     /* Memory management */
4377 #if !defined(CONFIG_USER_ONLY)
4378     env->nb_pids = 3;
4379     env->nb_ways = 2;
4380     env->id_tlbs = 0;
4381     switch (version) {
4382     case 1:
4383         /* e500v1 */
4384         tlbncfg[0] = gen_tlbncfg(2, 1, 1, 0, 256);
4385         tlbncfg[1] = gen_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4386         break;
4387     case 2:
4388         /* e500v2 */
4389         tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4390         tlbncfg[1] = gen_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4391         break;
4392     default:
4393         cpu_abort(env, "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4394     }
4395 #endif
4396     gen_spr_BookE206(env, 0x000000DF, tlbncfg);
4397     /* XXX : not implemented */
4398     spr_register(env, SPR_HID0, "HID0",
4399                  SPR_NOACCESS, SPR_NOACCESS,
4400                  &spr_read_generic, &spr_write_generic,
4401                  0x00000000);
4402     /* XXX : not implemented */
4403     spr_register(env, SPR_HID1, "HID1",
4404                  SPR_NOACCESS, SPR_NOACCESS,
4405                  &spr_read_generic, &spr_write_generic,
4406                  0x00000000);
4407     /* XXX : not implemented */
4408     spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
4409                  SPR_NOACCESS, SPR_NOACCESS,
4410                  &spr_read_generic, &spr_write_generic,
4411                  0x00000000);
4412     /* XXX : not implemented */
4413     spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
4414                  SPR_NOACCESS, SPR_NOACCESS,
4415                  &spr_read_generic, &spr_write_generic,
4416                  0x00000000);
4417     /* XXX : not implemented */
4418     spr_register(env, SPR_Exxx_MCAR, "MCAR",
4419                  SPR_NOACCESS, SPR_NOACCESS,
4420                  &spr_read_generic, &spr_write_generic,
4421                  0x00000000);
4422     /* XXX : not implemented */
4423     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4424                  SPR_NOACCESS, SPR_NOACCESS,
4425                  &spr_read_generic, &spr_write_generic,
4426                  0x00000000);
4427     /* XXX : not implemented */
4428     spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
4429                  SPR_NOACCESS, SPR_NOACCESS,
4430                  &spr_read_generic, &spr_write_generic,
4431                  0x00000000);
4432     /* XXX : not implemented */
4433     spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4434                  SPR_NOACCESS, SPR_NOACCESS,
4435                  &spr_read_generic, &spr_write_generic,
4436                  0x00000000);
4437     /* XXX : not implemented */
4438     spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4439                  SPR_NOACCESS, SPR_NOACCESS,
4440                  &spr_read_generic, &spr_write_generic,
4441                  0x00000000);
4442     /* XXX : not implemented */
4443     spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4444                  SPR_NOACCESS, SPR_NOACCESS,
4445                  &spr_read_generic, &spr_write_e500_l1csr0,
4446                  0x00000000);
4447     /* XXX : not implemented */
4448     spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
4449                  SPR_NOACCESS, SPR_NOACCESS,
4450                  &spr_read_generic, &spr_write_generic,
4451                  0x00000000);
4452     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4453                  SPR_NOACCESS, SPR_NOACCESS,
4454                  &spr_read_generic, &spr_write_generic,
4455                  0x00000000);
4456     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4457                  SPR_NOACCESS, SPR_NOACCESS,
4458                  &spr_read_generic, &spr_write_generic,
4459                  0x00000000);
4460     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4461                  SPR_NOACCESS, SPR_NOACCESS,
4462                  &spr_read_generic, &spr_write_booke206_mmucsr0,
4463                  0x00000000);
4464
4465 #if !defined(CONFIG_USER_ONLY)
4466     env->nb_tlb = 0;
4467     for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
4468         env->nb_tlb += booke206_tlb_size(env, i);
4469     }
4470 #endif
4471
4472     init_excp_e200(env);
4473     env->dcache_line_size = 32;
4474     env->icache_line_size = 32;
4475     /* Allocate hardware IRQ controller */
4476     ppce500_irq_init(env);
4477 }
4478
4479 static void init_proc_e500v1(CPUPPCState *env)
4480 {
4481     init_proc_e500(env, 1);
4482 }
4483
4484 static void init_proc_e500v2(CPUPPCState *env)
4485 {
4486     init_proc_e500(env, 2);
4487 }
4488
4489 /* Non-embedded PowerPC                                                      */
4490
4491 /* POWER : same as 601, without mfmsr, mfsr                                  */
4492 #if defined(TODO)
4493 #define POWERPC_INSNS_POWER  (XXX_TODO)
4494 /* POWER RSC (from RAD6000) */
4495 #define POWERPC_MSRM_POWER   (0x00000000FEF0ULL)
4496 #endif /* TODO */
4497
4498 /* PowerPC 601                                                               */
4499 #define POWERPC_INSNS_601    (PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |    \
4500                               PPC_FLOAT |                                     \
4501                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4502                               PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |  \
4503                               PPC_SEGMENT | PPC_EXTERN)
4504 #define POWERPC_INSNS2_601   (PPC_NONE)
4505 #define POWERPC_MSRM_601     (0x000000000000FD70ULL)
4506 #define POWERPC_MSRR_601     (0x0000000000001040ULL)
4507 //#define POWERPC_MMU_601      (POWERPC_MMU_601)
4508 //#define POWERPC_EXCP_601     (POWERPC_EXCP_601)
4509 #define POWERPC_INPUT_601    (PPC_FLAGS_INPUT_6xx)
4510 #define POWERPC_BFDM_601     (bfd_mach_ppc_601)
4511 #define POWERPC_FLAG_601     (POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK)
4512 #define check_pow_601        check_pow_none
4513
4514 static void init_proc_601 (CPUPPCState *env)
4515 {
4516     gen_spr_ne_601(env);
4517     gen_spr_601(env);
4518     /* Hardware implementation registers */
4519     /* XXX : not implemented */
4520     spr_register(env, SPR_HID0, "HID0",
4521                  SPR_NOACCESS, SPR_NOACCESS,
4522                  &spr_read_generic, &spr_write_hid0_601,
4523                  0x80010080);
4524     /* XXX : not implemented */
4525     spr_register(env, SPR_HID1, "HID1",
4526                  SPR_NOACCESS, SPR_NOACCESS,
4527                  &spr_read_generic, &spr_write_generic,
4528                  0x00000000);
4529     /* XXX : not implemented */
4530     spr_register(env, SPR_601_HID2, "HID2",
4531                  SPR_NOACCESS, SPR_NOACCESS,
4532                  &spr_read_generic, &spr_write_generic,
4533                  0x00000000);
4534     /* XXX : not implemented */
4535     spr_register(env, SPR_601_HID5, "HID5",
4536                  SPR_NOACCESS, SPR_NOACCESS,
4537                  &spr_read_generic, &spr_write_generic,
4538                  0x00000000);
4539     /* Memory management */
4540     init_excp_601(env);
4541     /* XXX: beware that dcache line size is 64 
4542      *      but dcbz uses 32 bytes "sectors"
4543      * XXX: this breaks clcs instruction !
4544      */
4545     env->dcache_line_size = 32;
4546     env->icache_line_size = 64;
4547     /* Allocate hardware IRQ controller */
4548     ppc6xx_irq_init(env);
4549 }
4550
4551 /* PowerPC 601v                                                              */
4552 #define POWERPC_INSNS_601v   (PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |    \
4553                               PPC_FLOAT |                                     \
4554                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4555                               PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |  \
4556                               PPC_SEGMENT | PPC_EXTERN)
4557 #define POWERPC_INSNS2_601v  (PPC_NONE)
4558 #define POWERPC_MSRM_601v    (0x000000000000FD70ULL)
4559 #define POWERPC_MSRR_601v    (0x0000000000001040ULL)
4560 #define POWERPC_MMU_601v     (POWERPC_MMU_601)
4561 #define POWERPC_EXCP_601v    (POWERPC_EXCP_601)
4562 #define POWERPC_INPUT_601v   (PPC_FLAGS_INPUT_6xx)
4563 #define POWERPC_BFDM_601v    (bfd_mach_ppc_601)
4564 #define POWERPC_FLAG_601v    (POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK)
4565 #define check_pow_601v       check_pow_none
4566
4567 static void init_proc_601v (CPUPPCState *env)
4568 {
4569     init_proc_601(env);
4570     /* XXX : not implemented */
4571     spr_register(env, SPR_601_HID15, "HID15",
4572                  SPR_NOACCESS, SPR_NOACCESS,
4573                  &spr_read_generic, &spr_write_generic,
4574                  0x00000000);
4575 }
4576
4577 /* PowerPC 602                                                               */
4578 #define POWERPC_INSNS_602    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4579                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4580                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4581                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4582                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4583                               PPC_MEM_TLBIE | PPC_6xx_TLB | PPC_MEM_TLBSYNC | \
4584                               PPC_SEGMENT | PPC_602_SPEC)
4585 #define POWERPC_INSNS2_602   (PPC_NONE)
4586 #define POWERPC_MSRM_602     (0x0000000000C7FF73ULL)
4587 /* XXX: 602 MMU is quite specific. Should add a special case */
4588 #define POWERPC_MMU_602      (POWERPC_MMU_SOFT_6xx)
4589 //#define POWERPC_EXCP_602     (POWERPC_EXCP_602)
4590 #define POWERPC_INPUT_602    (PPC_FLAGS_INPUT_6xx)
4591 #define POWERPC_BFDM_602     (bfd_mach_ppc_602)
4592 #define POWERPC_FLAG_602     (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4593                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4594 #define check_pow_602        check_pow_hid0
4595
4596 static void init_proc_602 (CPUPPCState *env)
4597 {
4598     gen_spr_ne_601(env);
4599     gen_spr_602(env);
4600     /* Time base */
4601     gen_tbl(env);
4602     /* hardware implementation registers */
4603     /* XXX : not implemented */
4604     spr_register(env, SPR_HID0, "HID0",
4605                  SPR_NOACCESS, SPR_NOACCESS,
4606                  &spr_read_generic, &spr_write_generic,
4607                  0x00000000);
4608     /* XXX : not implemented */
4609     spr_register(env, SPR_HID1, "HID1",
4610                  SPR_NOACCESS, SPR_NOACCESS,
4611                  &spr_read_generic, &spr_write_generic,
4612                  0x00000000);
4613     /* Memory management */
4614     gen_low_BATs(env);
4615     gen_6xx_7xx_soft_tlb(env, 64, 2);
4616     init_excp_602(env);
4617     env->dcache_line_size = 32;
4618     env->icache_line_size = 32;
4619     /* Allocate hardware IRQ controller */
4620     ppc6xx_irq_init(env);
4621 }
4622
4623 /* PowerPC 603                                                               */
4624 #define POWERPC_INSNS_603    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4625                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4626                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4627                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4628                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4629                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4630                               PPC_SEGMENT | PPC_EXTERN)
4631 #define POWERPC_INSNS2_603   (PPC_NONE)
4632 #define POWERPC_MSRM_603     (0x000000000007FF73ULL)
4633 #define POWERPC_MMU_603      (POWERPC_MMU_SOFT_6xx)
4634 //#define POWERPC_EXCP_603     (POWERPC_EXCP_603)
4635 #define POWERPC_INPUT_603    (PPC_FLAGS_INPUT_6xx)
4636 #define POWERPC_BFDM_603     (bfd_mach_ppc_603)
4637 #define POWERPC_FLAG_603     (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4638                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4639 #define check_pow_603        check_pow_hid0
4640
4641 static void init_proc_603 (CPUPPCState *env)
4642 {
4643     gen_spr_ne_601(env);
4644     gen_spr_603(env);
4645     /* Time base */
4646     gen_tbl(env);
4647     /* hardware implementation registers */
4648     /* XXX : not implemented */
4649     spr_register(env, SPR_HID0, "HID0",
4650                  SPR_NOACCESS, SPR_NOACCESS,
4651                  &spr_read_generic, &spr_write_generic,
4652                  0x00000000);
4653     /* XXX : not implemented */
4654     spr_register(env, SPR_HID1, "HID1",
4655                  SPR_NOACCESS, SPR_NOACCESS,
4656                  &spr_read_generic, &spr_write_generic,
4657                  0x00000000);
4658     /* Memory management */
4659     gen_low_BATs(env);
4660     gen_6xx_7xx_soft_tlb(env, 64, 2);
4661     init_excp_603(env);
4662     env->dcache_line_size = 32;
4663     env->icache_line_size = 32;
4664     /* Allocate hardware IRQ controller */
4665     ppc6xx_irq_init(env);
4666 }
4667
4668 /* PowerPC 603e                                                              */
4669 #define POWERPC_INSNS_603E   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4670                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4671                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4672                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4673                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4674                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
4675                               PPC_SEGMENT | PPC_EXTERN)
4676 #define POWERPC_INSNS2_603E  (PPC_NONE)
4677 #define POWERPC_MSRM_603E    (0x000000000007FF73ULL)
4678 #define POWERPC_MMU_603E     (POWERPC_MMU_SOFT_6xx)
4679 //#define POWERPC_EXCP_603E    (POWERPC_EXCP_603E)
4680 #define POWERPC_INPUT_603E   (PPC_FLAGS_INPUT_6xx)
4681 #define POWERPC_BFDM_603E    (bfd_mach_ppc_ec603e)
4682 #define POWERPC_FLAG_603E    (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |           \
4683                               POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK)
4684 #define check_pow_603E       check_pow_hid0
4685
4686 static void init_proc_603E (CPUPPCState *env)
4687 {
4688     gen_spr_ne_601(env);
4689     gen_spr_603(env);
4690     /* Time base */
4691     gen_tbl(env);
4692     /* hardware implementation registers */
4693     /* XXX : not implemented */
4694     spr_register(env, SPR_HID0, "HID0",
4695                  SPR_NOACCESS, SPR_NOACCESS,
4696                  &spr_read_generic, &spr_write_generic,
4697                  0x00000000);
4698     /* XXX : not implemented */
4699     spr_register(env, SPR_HID1, "HID1",
4700                  SPR_NOACCESS, SPR_NOACCESS,
4701                  &spr_read_generic, &spr_write_generic,
4702                  0x00000000);
4703     /* XXX : not implemented */
4704     spr_register(env, SPR_IABR, "IABR",
4705                  SPR_NOACCESS, SPR_NOACCESS,
4706                  &spr_read_generic, &spr_write_generic,
4707                  0x00000000);
4708     /* Memory management */
4709     gen_low_BATs(env);
4710     gen_6xx_7xx_soft_tlb(env, 64, 2);
4711     init_excp_603(env);
4712     env->dcache_line_size = 32;
4713     env->icache_line_size = 32;
4714     /* Allocate hardware IRQ controller */
4715     ppc6xx_irq_init(env);
4716 }
4717
4718 /* PowerPC 604                                                               */
4719 #define POWERPC_INSNS_604    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4720                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4721                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4722                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4723                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4724                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4725                               PPC_SEGMENT | PPC_EXTERN)
4726 #define POWERPC_INSNS2_604   (PPC_NONE)
4727 #define POWERPC_MSRM_604     (0x000000000005FF77ULL)
4728 #define POWERPC_MMU_604      (POWERPC_MMU_32B)
4729 //#define POWERPC_EXCP_604     (POWERPC_EXCP_604)
4730 #define POWERPC_INPUT_604    (PPC_FLAGS_INPUT_6xx)
4731 #define POWERPC_BFDM_604     (bfd_mach_ppc_604)
4732 #define POWERPC_FLAG_604     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4733                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4734 #define check_pow_604        check_pow_nocheck
4735
4736 static void init_proc_604 (CPUPPCState *env)
4737 {
4738     gen_spr_ne_601(env);
4739     gen_spr_604(env);
4740     /* Time base */
4741     gen_tbl(env);
4742     /* Hardware implementation registers */
4743     /* XXX : not implemented */
4744     spr_register(env, SPR_HID0, "HID0",
4745                  SPR_NOACCESS, SPR_NOACCESS,
4746                  &spr_read_generic, &spr_write_generic,
4747                  0x00000000);
4748     /* Memory management */
4749     gen_low_BATs(env);
4750     init_excp_604(env);
4751     env->dcache_line_size = 32;
4752     env->icache_line_size = 32;
4753     /* Allocate hardware IRQ controller */
4754     ppc6xx_irq_init(env);
4755 }
4756
4757 /* PowerPC 604E                                                              */
4758 #define POWERPC_INSNS_604E   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4759                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4760                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4761                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4762                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4763                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4764                               PPC_SEGMENT | PPC_EXTERN)
4765 #define POWERPC_INSNS2_604E  (PPC_NONE)
4766 #define POWERPC_MSRM_604E    (0x000000000005FF77ULL)
4767 #define POWERPC_MMU_604E     (POWERPC_MMU_32B)
4768 #define POWERPC_EXCP_604E    (POWERPC_EXCP_604)
4769 #define POWERPC_INPUT_604E   (PPC_FLAGS_INPUT_6xx)
4770 #define POWERPC_BFDM_604E    (bfd_mach_ppc_604)
4771 #define POWERPC_FLAG_604E    (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4772                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4773 #define check_pow_604E       check_pow_nocheck
4774
4775 static void init_proc_604E (CPUPPCState *env)
4776 {
4777     gen_spr_ne_601(env);
4778     gen_spr_604(env);
4779     /* XXX : not implemented */
4780     spr_register(env, SPR_MMCR1, "MMCR1",
4781                  SPR_NOACCESS, SPR_NOACCESS,
4782                  &spr_read_generic, &spr_write_generic,
4783                  0x00000000);
4784     /* XXX : not implemented */
4785     spr_register(env, SPR_PMC3, "PMC3",
4786                  SPR_NOACCESS, SPR_NOACCESS,
4787                  &spr_read_generic, &spr_write_generic,
4788                  0x00000000);
4789     /* XXX : not implemented */
4790     spr_register(env, SPR_PMC4, "PMC4",
4791                  SPR_NOACCESS, SPR_NOACCESS,
4792                  &spr_read_generic, &spr_write_generic,
4793                  0x00000000);
4794     /* Time base */
4795     gen_tbl(env);
4796     /* Hardware implementation registers */
4797     /* XXX : not implemented */
4798     spr_register(env, SPR_HID0, "HID0",
4799                  SPR_NOACCESS, SPR_NOACCESS,
4800                  &spr_read_generic, &spr_write_generic,
4801                  0x00000000);
4802     /* XXX : not implemented */
4803     spr_register(env, SPR_HID1, "HID1",
4804                  SPR_NOACCESS, SPR_NOACCESS,
4805                  &spr_read_generic, &spr_write_generic,
4806                  0x00000000);
4807     /* Memory management */
4808     gen_low_BATs(env);
4809     init_excp_604(env);
4810     env->dcache_line_size = 32;
4811     env->icache_line_size = 32;
4812     /* Allocate hardware IRQ controller */
4813     ppc6xx_irq_init(env);
4814 }
4815
4816 /* PowerPC 740                                                               */
4817 #define POWERPC_INSNS_740    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4818                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4819                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4820                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4821                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4822                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4823                               PPC_SEGMENT | PPC_EXTERN)
4824 #define POWERPC_INSNS2_740   (PPC_NONE)
4825 #define POWERPC_MSRM_740     (0x000000000005FF77ULL)
4826 #define POWERPC_MMU_740      (POWERPC_MMU_32B)
4827 #define POWERPC_EXCP_740     (POWERPC_EXCP_7x0)
4828 #define POWERPC_INPUT_740    (PPC_FLAGS_INPUT_6xx)
4829 #define POWERPC_BFDM_740     (bfd_mach_ppc_750)
4830 #define POWERPC_FLAG_740     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4831                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4832 #define check_pow_740        check_pow_hid0
4833
4834 static void init_proc_740 (CPUPPCState *env)
4835 {
4836     gen_spr_ne_601(env);
4837     gen_spr_7xx(env);
4838     /* Time base */
4839     gen_tbl(env);
4840     /* Thermal management */
4841     gen_spr_thrm(env);
4842     /* Hardware implementation registers */
4843     /* XXX : not implemented */
4844     spr_register(env, SPR_HID0, "HID0",
4845                  SPR_NOACCESS, SPR_NOACCESS,
4846                  &spr_read_generic, &spr_write_generic,
4847                  0x00000000);
4848     /* XXX : not implemented */
4849     spr_register(env, SPR_HID1, "HID1",
4850                  SPR_NOACCESS, SPR_NOACCESS,
4851                  &spr_read_generic, &spr_write_generic,
4852                  0x00000000);
4853     /* Memory management */
4854     gen_low_BATs(env);
4855     init_excp_7x0(env);
4856     env->dcache_line_size = 32;
4857     env->icache_line_size = 32;
4858     /* Allocate hardware IRQ controller */
4859     ppc6xx_irq_init(env);
4860 }
4861
4862 /* PowerPC 750                                                               */
4863 #define POWERPC_INSNS_750    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4864                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4865                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4866                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4867                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4868                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4869                               PPC_SEGMENT | PPC_EXTERN)
4870 #define POWERPC_INSNS2_750   (PPC_NONE)
4871 #define POWERPC_MSRM_750     (0x000000000005FF77ULL)
4872 #define POWERPC_MMU_750      (POWERPC_MMU_32B)
4873 #define POWERPC_EXCP_750     (POWERPC_EXCP_7x0)
4874 #define POWERPC_INPUT_750    (PPC_FLAGS_INPUT_6xx)
4875 #define POWERPC_BFDM_750     (bfd_mach_ppc_750)
4876 #define POWERPC_FLAG_750     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4877                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4878 #define check_pow_750        check_pow_hid0
4879
4880 static void init_proc_750 (CPUPPCState *env)
4881 {
4882     gen_spr_ne_601(env);
4883     gen_spr_7xx(env);
4884     /* XXX : not implemented */
4885     spr_register(env, SPR_L2CR, "L2CR",
4886                  SPR_NOACCESS, SPR_NOACCESS,
4887                  &spr_read_generic, &spr_write_generic,
4888                  0x00000000);
4889     /* Time base */
4890     gen_tbl(env);
4891     /* Thermal management */
4892     gen_spr_thrm(env);
4893     /* Hardware implementation registers */
4894     /* XXX : not implemented */
4895     spr_register(env, SPR_HID0, "HID0",
4896                  SPR_NOACCESS, SPR_NOACCESS,
4897                  &spr_read_generic, &spr_write_generic,
4898                  0x00000000);
4899     /* XXX : not implemented */
4900     spr_register(env, SPR_HID1, "HID1",
4901                  SPR_NOACCESS, SPR_NOACCESS,
4902                  &spr_read_generic, &spr_write_generic,
4903                  0x00000000);
4904     /* Memory management */
4905     gen_low_BATs(env);
4906     /* XXX: high BATs are also present but are known to be bugged on
4907      *      die version 1.x
4908      */
4909     init_excp_7x0(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 750 CL                                                            */
4917 /* XXX: not implemented:
4918  * cache lock instructions:
4919  * dcbz_l
4920  * floating point paired instructions
4921  * psq_lux
4922  * psq_lx
4923  * psq_stux
4924  * psq_stx
4925  * ps_abs
4926  * ps_add
4927  * ps_cmpo0
4928  * ps_cmpo1
4929  * ps_cmpu0
4930  * ps_cmpu1
4931  * ps_div
4932  * ps_madd
4933  * ps_madds0
4934  * ps_madds1
4935  * ps_merge00
4936  * ps_merge01
4937  * ps_merge10
4938  * ps_merge11
4939  * ps_mr
4940  * ps_msub
4941  * ps_mul
4942  * ps_muls0
4943  * ps_muls1
4944  * ps_nabs
4945  * ps_neg
4946  * ps_nmadd
4947  * ps_nmsub
4948  * ps_res
4949  * ps_rsqrte
4950  * ps_sel
4951  * ps_sub
4952  * ps_sum0
4953  * ps_sum1
4954  */
4955 #define POWERPC_INSNS_750cl  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
4956                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
4957                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
4958                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
4959                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
4960                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
4961                               PPC_SEGMENT | PPC_EXTERN)
4962 #define POWERPC_INSNS2_750cl (PPC_NONE)
4963 #define POWERPC_MSRM_750cl   (0x000000000005FF77ULL)
4964 #define POWERPC_MMU_750cl    (POWERPC_MMU_32B)
4965 #define POWERPC_EXCP_750cl   (POWERPC_EXCP_7x0)
4966 #define POWERPC_INPUT_750cl  (PPC_FLAGS_INPUT_6xx)
4967 #define POWERPC_BFDM_750cl   (bfd_mach_ppc_750)
4968 #define POWERPC_FLAG_750cl   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
4969                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
4970 #define check_pow_750cl      check_pow_hid0
4971
4972 static void init_proc_750cl (CPUPPCState *env)
4973 {
4974     gen_spr_ne_601(env);
4975     gen_spr_7xx(env);
4976     /* XXX : not implemented */
4977     spr_register(env, SPR_L2CR, "L2CR",
4978                  SPR_NOACCESS, SPR_NOACCESS,
4979                  &spr_read_generic, &spr_write_generic,
4980                  0x00000000);
4981     /* Time base */
4982     gen_tbl(env);
4983     /* Thermal management */
4984     /* Those registers are fake on 750CL */
4985     spr_register(env, SPR_THRM1, "THRM1",
4986                  SPR_NOACCESS, SPR_NOACCESS,
4987                  &spr_read_generic, &spr_write_generic,
4988                  0x00000000);
4989     spr_register(env, SPR_THRM2, "THRM2",
4990                  SPR_NOACCESS, SPR_NOACCESS,
4991                  &spr_read_generic, &spr_write_generic,
4992                  0x00000000);
4993     spr_register(env, SPR_THRM3, "THRM3",
4994                  SPR_NOACCESS, SPR_NOACCESS,
4995                  &spr_read_generic, &spr_write_generic,
4996                  0x00000000);
4997     /* XXX: not implemented */
4998     spr_register(env, SPR_750_TDCL, "TDCL",
4999                  SPR_NOACCESS, SPR_NOACCESS,
5000                  &spr_read_generic, &spr_write_generic,
5001                  0x00000000);
5002     spr_register(env, SPR_750_TDCH, "TDCH",
5003                  SPR_NOACCESS, SPR_NOACCESS,
5004                  &spr_read_generic, &spr_write_generic,
5005                  0x00000000);
5006     /* DMA */
5007     /* XXX : not implemented */
5008     spr_register(env, SPR_750_WPAR, "WPAR",
5009                  SPR_NOACCESS, SPR_NOACCESS,
5010                  &spr_read_generic, &spr_write_generic,
5011                  0x00000000);
5012     spr_register(env, SPR_750_DMAL, "DMAL",
5013                  SPR_NOACCESS, SPR_NOACCESS,
5014                  &spr_read_generic, &spr_write_generic,
5015                  0x00000000);
5016     spr_register(env, SPR_750_DMAU, "DMAU",
5017                  SPR_NOACCESS, SPR_NOACCESS,
5018                  &spr_read_generic, &spr_write_generic,
5019                  0x00000000);
5020     /* Hardware implementation registers */
5021     /* XXX : not implemented */
5022     spr_register(env, SPR_HID0, "HID0",
5023                  SPR_NOACCESS, SPR_NOACCESS,
5024                  &spr_read_generic, &spr_write_generic,
5025                  0x00000000);
5026     /* XXX : not implemented */
5027     spr_register(env, SPR_HID1, "HID1",
5028                  SPR_NOACCESS, SPR_NOACCESS,
5029                  &spr_read_generic, &spr_write_generic,
5030                  0x00000000);
5031     /* XXX : not implemented */
5032     spr_register(env, SPR_750CL_HID2, "HID2",
5033                  SPR_NOACCESS, SPR_NOACCESS,
5034                  &spr_read_generic, &spr_write_generic,
5035                  0x00000000);
5036     /* XXX : not implemented */
5037     spr_register(env, SPR_750CL_HID4, "HID4",
5038                  SPR_NOACCESS, SPR_NOACCESS,
5039                  &spr_read_generic, &spr_write_generic,
5040                  0x00000000);
5041     /* Quantization registers */
5042     /* XXX : not implemented */
5043     spr_register(env, SPR_750_GQR0, "GQR0",
5044                  SPR_NOACCESS, SPR_NOACCESS,
5045                  &spr_read_generic, &spr_write_generic,
5046                  0x00000000);
5047     /* XXX : not implemented */
5048     spr_register(env, SPR_750_GQR1, "GQR1",
5049                  SPR_NOACCESS, SPR_NOACCESS,
5050                  &spr_read_generic, &spr_write_generic,
5051                  0x00000000);
5052     /* XXX : not implemented */
5053     spr_register(env, SPR_750_GQR2, "GQR2",
5054                  SPR_NOACCESS, SPR_NOACCESS,
5055                  &spr_read_generic, &spr_write_generic,
5056                  0x00000000);
5057     /* XXX : not implemented */
5058     spr_register(env, SPR_750_GQR3, "GQR3",
5059                  SPR_NOACCESS, SPR_NOACCESS,
5060                  &spr_read_generic, &spr_write_generic,
5061                  0x00000000);
5062     /* XXX : not implemented */
5063     spr_register(env, SPR_750_GQR4, "GQR4",
5064                  SPR_NOACCESS, SPR_NOACCESS,
5065                  &spr_read_generic, &spr_write_generic,
5066                  0x00000000);
5067     /* XXX : not implemented */
5068     spr_register(env, SPR_750_GQR5, "GQR5",
5069                  SPR_NOACCESS, SPR_NOACCESS,
5070                  &spr_read_generic, &spr_write_generic,
5071                  0x00000000);
5072     /* XXX : not implemented */
5073     spr_register(env, SPR_750_GQR6, "GQR6",
5074                  SPR_NOACCESS, SPR_NOACCESS,
5075                  &spr_read_generic, &spr_write_generic,
5076                  0x00000000);
5077     /* XXX : not implemented */
5078     spr_register(env, SPR_750_GQR7, "GQR7",
5079                  SPR_NOACCESS, SPR_NOACCESS,
5080                  &spr_read_generic, &spr_write_generic,
5081                  0x00000000);
5082     /* Memory management */
5083     gen_low_BATs(env);
5084     /* PowerPC 750cl has 8 DBATs and 8 IBATs */
5085     gen_high_BATs(env);
5086     init_excp_750cl(env);
5087     env->dcache_line_size = 32;
5088     env->icache_line_size = 32;
5089     /* Allocate hardware IRQ controller */
5090     ppc6xx_irq_init(env);
5091 }
5092
5093 /* PowerPC 750CX                                                             */
5094 #define POWERPC_INSNS_750cx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5095                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5096                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5097                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5098                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5099                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5100                               PPC_SEGMENT | PPC_EXTERN)
5101 #define POWERPC_INSNS2_750cx (PPC_NONE)
5102 #define POWERPC_MSRM_750cx   (0x000000000005FF77ULL)
5103 #define POWERPC_MMU_750cx    (POWERPC_MMU_32B)
5104 #define POWERPC_EXCP_750cx   (POWERPC_EXCP_7x0)
5105 #define POWERPC_INPUT_750cx  (PPC_FLAGS_INPUT_6xx)
5106 #define POWERPC_BFDM_750cx   (bfd_mach_ppc_750)
5107 #define POWERPC_FLAG_750cx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5108                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5109 #define check_pow_750cx      check_pow_hid0
5110
5111 static void init_proc_750cx (CPUPPCState *env)
5112 {
5113     gen_spr_ne_601(env);
5114     gen_spr_7xx(env);
5115     /* XXX : not implemented */
5116     spr_register(env, SPR_L2CR, "L2CR",
5117                  SPR_NOACCESS, SPR_NOACCESS,
5118                  &spr_read_generic, &spr_write_generic,
5119                  0x00000000);
5120     /* Time base */
5121     gen_tbl(env);
5122     /* Thermal management */
5123     gen_spr_thrm(env);
5124     /* This register is not implemented but is present for compatibility */
5125     spr_register(env, SPR_SDA, "SDA",
5126                  SPR_NOACCESS, SPR_NOACCESS,
5127                  &spr_read_generic, &spr_write_generic,
5128                  0x00000000);
5129     /* Hardware implementation registers */
5130     /* XXX : not implemented */
5131     spr_register(env, SPR_HID0, "HID0",
5132                  SPR_NOACCESS, SPR_NOACCESS,
5133                  &spr_read_generic, &spr_write_generic,
5134                  0x00000000);
5135     /* XXX : not implemented */
5136     spr_register(env, SPR_HID1, "HID1",
5137                  SPR_NOACCESS, SPR_NOACCESS,
5138                  &spr_read_generic, &spr_write_generic,
5139                  0x00000000);
5140     /* Memory management */
5141     gen_low_BATs(env);
5142     /* PowerPC 750cx has 8 DBATs and 8 IBATs */
5143     gen_high_BATs(env);
5144     init_excp_750cx(env);
5145     env->dcache_line_size = 32;
5146     env->icache_line_size = 32;
5147     /* Allocate hardware IRQ controller */
5148     ppc6xx_irq_init(env);
5149 }
5150
5151 /* PowerPC 750FX                                                             */
5152 #define POWERPC_INSNS_750fx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5153                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5154                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5155                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5156                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5157                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5158                               PPC_SEGMENT  | PPC_EXTERN)
5159 #define POWERPC_INSNS2_750fx (PPC_NONE)
5160 #define POWERPC_MSRM_750fx   (0x000000000005FF77ULL)
5161 #define POWERPC_MMU_750fx    (POWERPC_MMU_32B)
5162 #define POWERPC_EXCP_750fx   (POWERPC_EXCP_7x0)
5163 #define POWERPC_INPUT_750fx  (PPC_FLAGS_INPUT_6xx)
5164 #define POWERPC_BFDM_750fx   (bfd_mach_ppc_750)
5165 #define POWERPC_FLAG_750fx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5166                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5167 #define check_pow_750fx      check_pow_hid0
5168
5169 static void init_proc_750fx (CPUPPCState *env)
5170 {
5171     gen_spr_ne_601(env);
5172     gen_spr_7xx(env);
5173     /* XXX : not implemented */
5174     spr_register(env, SPR_L2CR, "L2CR",
5175                  SPR_NOACCESS, SPR_NOACCESS,
5176                  &spr_read_generic, &spr_write_generic,
5177                  0x00000000);
5178     /* Time base */
5179     gen_tbl(env);
5180     /* Thermal management */
5181     gen_spr_thrm(env);
5182     /* XXX : not implemented */
5183     spr_register(env, SPR_750_THRM4, "THRM4",
5184                  SPR_NOACCESS, SPR_NOACCESS,
5185                  &spr_read_generic, &spr_write_generic,
5186                  0x00000000);
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_750FX_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     /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5206     gen_high_BATs(env);
5207     init_excp_7x0(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 750GX                                                             */
5215 #define POWERPC_INSNS_750gx  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5216                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5217                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5218                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5219                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5220                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5221                               PPC_SEGMENT  | PPC_EXTERN)
5222 #define POWERPC_INSNS2_750gx (PPC_NONE)
5223 #define POWERPC_MSRM_750gx   (0x000000000005FF77ULL)
5224 #define POWERPC_MMU_750gx    (POWERPC_MMU_32B)
5225 #define POWERPC_EXCP_750gx   (POWERPC_EXCP_7x0)
5226 #define POWERPC_INPUT_750gx  (PPC_FLAGS_INPUT_6xx)
5227 #define POWERPC_BFDM_750gx   (bfd_mach_ppc_750)
5228 #define POWERPC_FLAG_750gx   (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5229                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5230 #define check_pow_750gx      check_pow_hid0
5231
5232 static void init_proc_750gx (CPUPPCState *env)
5233 {
5234     gen_spr_ne_601(env);
5235     gen_spr_7xx(env);
5236     /* XXX : not implemented (XXX: different from 750fx) */
5237     spr_register(env, SPR_L2CR, "L2CR",
5238                  SPR_NOACCESS, SPR_NOACCESS,
5239                  &spr_read_generic, &spr_write_generic,
5240                  0x00000000);
5241     /* Time base */
5242     gen_tbl(env);
5243     /* Thermal management */
5244     gen_spr_thrm(env);
5245     /* XXX : not implemented */
5246     spr_register(env, SPR_750_THRM4, "THRM4",
5247                  SPR_NOACCESS, SPR_NOACCESS,
5248                  &spr_read_generic, &spr_write_generic,
5249                  0x00000000);
5250     /* Hardware implementation registers */
5251     /* XXX : not implemented (XXX: different from 750fx) */
5252     spr_register(env, SPR_HID0, "HID0",
5253                  SPR_NOACCESS, SPR_NOACCESS,
5254                  &spr_read_generic, &spr_write_generic,
5255                  0x00000000);
5256     /* XXX : not implemented */
5257     spr_register(env, SPR_HID1, "HID1",
5258                  SPR_NOACCESS, SPR_NOACCESS,
5259                  &spr_read_generic, &spr_write_generic,
5260                  0x00000000);
5261     /* XXX : not implemented (XXX: different from 750fx) */
5262     spr_register(env, SPR_750FX_HID2, "HID2",
5263                  SPR_NOACCESS, SPR_NOACCESS,
5264                  &spr_read_generic, &spr_write_generic,
5265                  0x00000000);
5266     /* Memory management */
5267     gen_low_BATs(env);
5268     /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5269     gen_high_BATs(env);
5270     init_excp_7x0(env);
5271     env->dcache_line_size = 32;
5272     env->icache_line_size = 32;
5273     /* Allocate hardware IRQ controller */
5274     ppc6xx_irq_init(env);
5275 }
5276
5277 /* PowerPC 745                                                               */
5278 #define POWERPC_INSNS_745    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5279                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5280                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5281                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5282                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5283                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
5284                               PPC_SEGMENT | PPC_EXTERN)
5285 #define POWERPC_INSNS2_745   (PPC_NONE)
5286 #define POWERPC_MSRM_745     (0x000000000005FF77ULL)
5287 #define POWERPC_MMU_745      (POWERPC_MMU_SOFT_6xx)
5288 #define POWERPC_EXCP_745     (POWERPC_EXCP_7x5)
5289 #define POWERPC_INPUT_745    (PPC_FLAGS_INPUT_6xx)
5290 #define POWERPC_BFDM_745     (bfd_mach_ppc_750)
5291 #define POWERPC_FLAG_745     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5292                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5293 #define check_pow_745        check_pow_hid0
5294
5295 static void init_proc_745 (CPUPPCState *env)
5296 {
5297     gen_spr_ne_601(env);
5298     gen_spr_7xx(env);
5299     gen_spr_G2_755(env);
5300     /* Time base */
5301     gen_tbl(env);
5302     /* Thermal management */
5303     gen_spr_thrm(env);
5304     /* Hardware implementation registers */
5305     /* XXX : not implemented */
5306     spr_register(env, SPR_HID0, "HID0",
5307                  SPR_NOACCESS, SPR_NOACCESS,
5308                  &spr_read_generic, &spr_write_generic,
5309                  0x00000000);
5310     /* XXX : not implemented */
5311     spr_register(env, SPR_HID1, "HID1",
5312                  SPR_NOACCESS, SPR_NOACCESS,
5313                  &spr_read_generic, &spr_write_generic,
5314                  0x00000000);
5315     /* XXX : not implemented */
5316     spr_register(env, SPR_HID2, "HID2",
5317                  SPR_NOACCESS, SPR_NOACCESS,
5318                  &spr_read_generic, &spr_write_generic,
5319                  0x00000000);
5320     /* Memory management */
5321     gen_low_BATs(env);
5322     gen_high_BATs(env);
5323     gen_6xx_7xx_soft_tlb(env, 64, 2);
5324     init_excp_7x5(env);
5325     env->dcache_line_size = 32;
5326     env->icache_line_size = 32;
5327     /* Allocate hardware IRQ controller */
5328     ppc6xx_irq_init(env);
5329 }
5330
5331 /* PowerPC 755                                                               */
5332 #define POWERPC_INSNS_755    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5333                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5334                               PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |          \
5335                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
5336                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5337                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB | \
5338                               PPC_SEGMENT | PPC_EXTERN)
5339 #define POWERPC_INSNS2_755   (PPC_NONE)
5340 #define POWERPC_MSRM_755     (0x000000000005FF77ULL)
5341 #define POWERPC_MMU_755      (POWERPC_MMU_SOFT_6xx)
5342 #define POWERPC_EXCP_755     (POWERPC_EXCP_7x5)
5343 #define POWERPC_INPUT_755    (PPC_FLAGS_INPUT_6xx)
5344 #define POWERPC_BFDM_755     (bfd_mach_ppc_750)
5345 #define POWERPC_FLAG_755     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |             \
5346                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
5347 #define check_pow_755        check_pow_hid0
5348
5349 static void init_proc_755 (CPUPPCState *env)
5350 {
5351     gen_spr_ne_601(env);
5352     gen_spr_7xx(env);
5353     gen_spr_G2_755(env);
5354     /* Time base */
5355     gen_tbl(env);
5356     /* L2 cache control */
5357     /* XXX : not implemented */
5358     spr_register(env, SPR_L2CR, "L2CR",
5359                  SPR_NOACCESS, SPR_NOACCESS,
5360                  &spr_read_generic, &spr_write_generic,
5361                  0x00000000);
5362     /* XXX : not implemented */
5363     spr_register(env, SPR_L2PMCR, "L2PMCR",
5364                  SPR_NOACCESS, SPR_NOACCESS,
5365                  &spr_read_generic, &spr_write_generic,
5366                  0x00000000);
5367     /* Thermal management */
5368     gen_spr_thrm(env);
5369     /* Hardware implementation registers */
5370     /* XXX : not implemented */
5371     spr_register(env, SPR_HID0, "HID0",
5372                  SPR_NOACCESS, SPR_NOACCESS,
5373                  &spr_read_generic, &spr_write_generic,
5374                  0x00000000);
5375     /* XXX : not implemented */
5376     spr_register(env, SPR_HID1, "HID1",
5377                  SPR_NOACCESS, SPR_NOACCESS,
5378                  &spr_read_generic, &spr_write_generic,
5379                  0x00000000);
5380     /* XXX : not implemented */
5381     spr_register(env, SPR_HID2, "HID2",
5382                  SPR_NOACCESS, SPR_NOACCESS,
5383                  &spr_read_generic, &spr_write_generic,
5384                  0x00000000);
5385     /* Memory management */
5386     gen_low_BATs(env);
5387     gen_high_BATs(env);
5388     gen_6xx_7xx_soft_tlb(env, 64, 2);
5389     init_excp_7x5(env);
5390     env->dcache_line_size = 32;
5391     env->icache_line_size = 32;
5392     /* Allocate hardware IRQ controller */
5393     ppc6xx_irq_init(env);
5394 }
5395
5396 /* PowerPC 7400 (aka G4)                                                     */
5397 #define POWERPC_INSNS_7400   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5398                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5399                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5400                               PPC_FLOAT_STFIWX |                              \
5401                               PPC_CACHE | PPC_CACHE_ICBI |                    \
5402                               PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5403                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5404                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5405                               PPC_MEM_TLBIA |                                 \
5406                               PPC_SEGMENT | PPC_EXTERN |                      \
5407                               PPC_ALTIVEC)
5408 #define POWERPC_INSNS2_7400  (PPC_NONE)
5409 #define POWERPC_MSRM_7400    (0x000000000205FF77ULL)
5410 #define POWERPC_MMU_7400     (POWERPC_MMU_32B)
5411 #define POWERPC_EXCP_7400    (POWERPC_EXCP_74xx)
5412 #define POWERPC_INPUT_7400   (PPC_FLAGS_INPUT_6xx)
5413 #define POWERPC_BFDM_7400    (bfd_mach_ppc_7400)
5414 #define POWERPC_FLAG_7400    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5415                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5416                               POWERPC_FLAG_BUS_CLK)
5417 #define check_pow_7400       check_pow_hid0
5418
5419 static void init_proc_7400 (CPUPPCState *env)
5420 {
5421     gen_spr_ne_601(env);
5422     gen_spr_7xx(env);
5423     /* Time base */
5424     gen_tbl(env);
5425     /* 74xx specific SPR */
5426     gen_spr_74xx(env);
5427     /* XXX : not implemented */
5428     spr_register(env, SPR_UBAMR, "UBAMR",
5429                  &spr_read_ureg, SPR_NOACCESS,
5430                  &spr_read_ureg, SPR_NOACCESS,
5431                  0x00000000);
5432     /* XXX: this seems not implemented on all revisions. */
5433     /* XXX : not implemented */
5434     spr_register(env, SPR_MSSCR1, "MSSCR1",
5435                  SPR_NOACCESS, SPR_NOACCESS,
5436                  &spr_read_generic, &spr_write_generic,
5437                  0x00000000);
5438     /* Thermal management */
5439     gen_spr_thrm(env);
5440     /* Memory management */
5441     gen_low_BATs(env);
5442     init_excp_7400(env);
5443     env->dcache_line_size = 32;
5444     env->icache_line_size = 32;
5445     /* Allocate hardware IRQ controller */
5446     ppc6xx_irq_init(env);
5447 }
5448
5449 /* PowerPC 7410 (aka G4)                                                     */
5450 #define POWERPC_INSNS_7410   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5451                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5452                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5453                               PPC_FLOAT_STFIWX |                              \
5454                               PPC_CACHE | PPC_CACHE_ICBI |                    \
5455                               PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5456                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5457                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5458                               PPC_MEM_TLBIA |                                 \
5459                               PPC_SEGMENT | PPC_EXTERN |                      \
5460                               PPC_ALTIVEC)
5461 #define POWERPC_INSNS2_7410  (PPC_NONE)
5462 #define POWERPC_MSRM_7410    (0x000000000205FF77ULL)
5463 #define POWERPC_MMU_7410     (POWERPC_MMU_32B)
5464 #define POWERPC_EXCP_7410    (POWERPC_EXCP_74xx)
5465 #define POWERPC_INPUT_7410   (PPC_FLAGS_INPUT_6xx)
5466 #define POWERPC_BFDM_7410    (bfd_mach_ppc_7400)
5467 #define POWERPC_FLAG_7410    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5468                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5469                               POWERPC_FLAG_BUS_CLK)
5470 #define check_pow_7410       check_pow_hid0
5471
5472 static void init_proc_7410 (CPUPPCState *env)
5473 {
5474     gen_spr_ne_601(env);
5475     gen_spr_7xx(env);
5476     /* Time base */
5477     gen_tbl(env);
5478     /* 74xx specific SPR */
5479     gen_spr_74xx(env);
5480     /* XXX : not implemented */
5481     spr_register(env, SPR_UBAMR, "UBAMR",
5482                  &spr_read_ureg, SPR_NOACCESS,
5483                  &spr_read_ureg, SPR_NOACCESS,
5484                  0x00000000);
5485     /* Thermal management */
5486     gen_spr_thrm(env);
5487     /* L2PMCR */
5488     /* XXX : not implemented */
5489     spr_register(env, SPR_L2PMCR, "L2PMCR",
5490                  SPR_NOACCESS, SPR_NOACCESS,
5491                  &spr_read_generic, &spr_write_generic,
5492                  0x00000000);
5493     /* LDSTDB */
5494     /* XXX : not implemented */
5495     spr_register(env, SPR_LDSTDB, "LDSTDB",
5496                  SPR_NOACCESS, SPR_NOACCESS,
5497                  &spr_read_generic, &spr_write_generic,
5498                  0x00000000);
5499     /* Memory management */
5500     gen_low_BATs(env);
5501     init_excp_7400(env);
5502     env->dcache_line_size = 32;
5503     env->icache_line_size = 32;
5504     /* Allocate hardware IRQ controller */
5505     ppc6xx_irq_init(env);
5506 }
5507
5508 /* PowerPC 7440 (aka G4)                                                     */
5509 #define POWERPC_INSNS_7440   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5510                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5511                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5512                               PPC_FLOAT_STFIWX |                              \
5513                               PPC_CACHE | PPC_CACHE_ICBI |                    \
5514                               PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5515                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5516                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5517                               PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5518                               PPC_SEGMENT | PPC_EXTERN |                      \
5519                               PPC_ALTIVEC)
5520 #define POWERPC_INSNS2_7440  (PPC_NONE)
5521 #define POWERPC_MSRM_7440    (0x000000000205FF77ULL)
5522 #define POWERPC_MMU_7440     (POWERPC_MMU_SOFT_74xx)
5523 #define POWERPC_EXCP_7440    (POWERPC_EXCP_74xx)
5524 #define POWERPC_INPUT_7440   (PPC_FLAGS_INPUT_6xx)
5525 #define POWERPC_BFDM_7440    (bfd_mach_ppc_7400)
5526 #define POWERPC_FLAG_7440    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5527                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5528                               POWERPC_FLAG_BUS_CLK)
5529 #define check_pow_7440       check_pow_hid0_74xx
5530
5531 __attribute__ (( unused ))
5532 static void init_proc_7440 (CPUPPCState *env)
5533 {
5534     gen_spr_ne_601(env);
5535     gen_spr_7xx(env);
5536     /* Time base */
5537     gen_tbl(env);
5538     /* 74xx specific SPR */
5539     gen_spr_74xx(env);
5540     /* XXX : not implemented */
5541     spr_register(env, SPR_UBAMR, "UBAMR",
5542                  &spr_read_ureg, SPR_NOACCESS,
5543                  &spr_read_ureg, SPR_NOACCESS,
5544                  0x00000000);
5545     /* LDSTCR */
5546     /* XXX : not implemented */
5547     spr_register(env, SPR_LDSTCR, "LDSTCR",
5548                  SPR_NOACCESS, SPR_NOACCESS,
5549                  &spr_read_generic, &spr_write_generic,
5550                  0x00000000);
5551     /* ICTRL */
5552     /* XXX : not implemented */
5553     spr_register(env, SPR_ICTRL, "ICTRL",
5554                  SPR_NOACCESS, SPR_NOACCESS,
5555                  &spr_read_generic, &spr_write_generic,
5556                  0x00000000);
5557     /* MSSSR0 */
5558     /* XXX : not implemented */
5559     spr_register(env, SPR_MSSSR0, "MSSSR0",
5560                  SPR_NOACCESS, SPR_NOACCESS,
5561                  &spr_read_generic, &spr_write_generic,
5562                  0x00000000);
5563     /* PMC */
5564     /* XXX : not implemented */
5565     spr_register(env, SPR_PMC5, "PMC5",
5566                  SPR_NOACCESS, SPR_NOACCESS,
5567                  &spr_read_generic, &spr_write_generic,
5568                  0x00000000);
5569     /* XXX : not implemented */
5570     spr_register(env, SPR_UPMC5, "UPMC5",
5571                  &spr_read_ureg, SPR_NOACCESS,
5572                  &spr_read_ureg, SPR_NOACCESS,
5573                  0x00000000);
5574     /* XXX : not implemented */
5575     spr_register(env, SPR_PMC6, "PMC6",
5576                  SPR_NOACCESS, SPR_NOACCESS,
5577                  &spr_read_generic, &spr_write_generic,
5578                  0x00000000);
5579     /* XXX : not implemented */
5580     spr_register(env, SPR_UPMC6, "UPMC6",
5581                  &spr_read_ureg, SPR_NOACCESS,
5582                  &spr_read_ureg, SPR_NOACCESS,
5583                  0x00000000);
5584     /* Memory management */
5585     gen_low_BATs(env);
5586     gen_74xx_soft_tlb(env, 128, 2);
5587     init_excp_7450(env);
5588     env->dcache_line_size = 32;
5589     env->icache_line_size = 32;
5590     /* Allocate hardware IRQ controller */
5591     ppc6xx_irq_init(env);
5592 }
5593
5594 /* PowerPC 7450 (aka G4)                                                     */
5595 #define POWERPC_INSNS_7450   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5596                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5597                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5598                               PPC_FLOAT_STFIWX |                              \
5599                               PPC_CACHE | PPC_CACHE_ICBI |                    \
5600                               PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5601                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5602                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5603                               PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5604                               PPC_SEGMENT | PPC_EXTERN |                      \
5605                               PPC_ALTIVEC)
5606 #define POWERPC_INSNS2_7450  (PPC_NONE)
5607 #define POWERPC_MSRM_7450    (0x000000000205FF77ULL)
5608 #define POWERPC_MMU_7450     (POWERPC_MMU_SOFT_74xx)
5609 #define POWERPC_EXCP_7450    (POWERPC_EXCP_74xx)
5610 #define POWERPC_INPUT_7450   (PPC_FLAGS_INPUT_6xx)
5611 #define POWERPC_BFDM_7450    (bfd_mach_ppc_7400)
5612 #define POWERPC_FLAG_7450    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5613                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5614                               POWERPC_FLAG_BUS_CLK)
5615 #define check_pow_7450       check_pow_hid0_74xx
5616
5617 __attribute__ (( unused ))
5618 static void init_proc_7450 (CPUPPCState *env)
5619 {
5620     gen_spr_ne_601(env);
5621     gen_spr_7xx(env);
5622     /* Time base */
5623     gen_tbl(env);
5624     /* 74xx specific SPR */
5625     gen_spr_74xx(env);
5626     /* Level 3 cache control */
5627     gen_l3_ctrl(env);
5628     /* L3ITCR1 */
5629     /* XXX : not implemented */
5630     spr_register(env, SPR_L3ITCR1, "L3ITCR1",
5631                  SPR_NOACCESS, SPR_NOACCESS,
5632                  &spr_read_generic, &spr_write_generic,
5633                  0x00000000);
5634     /* L3ITCR2 */
5635     /* XXX : not implemented */
5636     spr_register(env, SPR_L3ITCR2, "L3ITCR2",
5637                  SPR_NOACCESS, SPR_NOACCESS,
5638                  &spr_read_generic, &spr_write_generic,
5639                  0x00000000);
5640     /* L3ITCR3 */
5641     /* XXX : not implemented */
5642     spr_register(env, SPR_L3ITCR3, "L3ITCR3",
5643                  SPR_NOACCESS, SPR_NOACCESS,
5644                  &spr_read_generic, &spr_write_generic,
5645                  0x00000000);
5646     /* L3OHCR */
5647     /* XXX : not implemented */
5648     spr_register(env, SPR_L3OHCR, "L3OHCR",
5649                  SPR_NOACCESS, SPR_NOACCESS,
5650                  &spr_read_generic, &spr_write_generic,
5651                  0x00000000);
5652     /* XXX : not implemented */
5653     spr_register(env, SPR_UBAMR, "UBAMR",
5654                  &spr_read_ureg, SPR_NOACCESS,
5655                  &spr_read_ureg, SPR_NOACCESS,
5656                  0x00000000);
5657     /* LDSTCR */
5658     /* XXX : not implemented */
5659     spr_register(env, SPR_LDSTCR, "LDSTCR",
5660                  SPR_NOACCESS, SPR_NOACCESS,
5661                  &spr_read_generic, &spr_write_generic,
5662                  0x00000000);
5663     /* ICTRL */
5664     /* XXX : not implemented */
5665     spr_register(env, SPR_ICTRL, "ICTRL",
5666                  SPR_NOACCESS, SPR_NOACCESS,
5667                  &spr_read_generic, &spr_write_generic,
5668                  0x00000000);
5669     /* MSSSR0 */
5670     /* XXX : not implemented */
5671     spr_register(env, SPR_MSSSR0, "MSSSR0",
5672                  SPR_NOACCESS, SPR_NOACCESS,
5673                  &spr_read_generic, &spr_write_generic,
5674                  0x00000000);
5675     /* PMC */
5676     /* XXX : not implemented */
5677     spr_register(env, SPR_PMC5, "PMC5",
5678                  SPR_NOACCESS, SPR_NOACCESS,
5679                  &spr_read_generic, &spr_write_generic,
5680                  0x00000000);
5681     /* XXX : not implemented */
5682     spr_register(env, SPR_UPMC5, "UPMC5",
5683                  &spr_read_ureg, SPR_NOACCESS,
5684                  &spr_read_ureg, SPR_NOACCESS,
5685                  0x00000000);
5686     /* XXX : not implemented */
5687     spr_register(env, SPR_PMC6, "PMC6",
5688                  SPR_NOACCESS, SPR_NOACCESS,
5689                  &spr_read_generic, &spr_write_generic,
5690                  0x00000000);
5691     /* XXX : not implemented */
5692     spr_register(env, SPR_UPMC6, "UPMC6",
5693                  &spr_read_ureg, SPR_NOACCESS,
5694                  &spr_read_ureg, SPR_NOACCESS,
5695                  0x00000000);
5696     /* Memory management */
5697     gen_low_BATs(env);
5698     gen_74xx_soft_tlb(env, 128, 2);
5699     init_excp_7450(env);
5700     env->dcache_line_size = 32;
5701     env->icache_line_size = 32;
5702     /* Allocate hardware IRQ controller */
5703     ppc6xx_irq_init(env);
5704 }
5705
5706 /* PowerPC 7445 (aka G4)                                                     */
5707 #define POWERPC_INSNS_7445   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5708                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5709                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5710                               PPC_FLOAT_STFIWX |                              \
5711                               PPC_CACHE | PPC_CACHE_ICBI |                    \
5712                               PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5713                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5714                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5715                               PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5716                               PPC_SEGMENT | PPC_EXTERN |                      \
5717                               PPC_ALTIVEC)
5718 #define POWERPC_INSNS2_7445  (PPC_NONE)
5719 #define POWERPC_MSRM_7445    (0x000000000205FF77ULL)
5720 #define POWERPC_MMU_7445     (POWERPC_MMU_SOFT_74xx)
5721 #define POWERPC_EXCP_7445    (POWERPC_EXCP_74xx)
5722 #define POWERPC_INPUT_7445   (PPC_FLAGS_INPUT_6xx)
5723 #define POWERPC_BFDM_7445    (bfd_mach_ppc_7400)
5724 #define POWERPC_FLAG_7445    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5725                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5726                               POWERPC_FLAG_BUS_CLK)
5727 #define check_pow_7445       check_pow_hid0_74xx
5728
5729 __attribute__ (( unused ))
5730 static void init_proc_7445 (CPUPPCState *env)
5731 {
5732     gen_spr_ne_601(env);
5733     gen_spr_7xx(env);
5734     /* Time base */
5735     gen_tbl(env);
5736     /* 74xx specific SPR */
5737     gen_spr_74xx(env);
5738     /* LDSTCR */
5739     /* XXX : not implemented */
5740     spr_register(env, SPR_LDSTCR, "LDSTCR",
5741                  SPR_NOACCESS, SPR_NOACCESS,
5742                  &spr_read_generic, &spr_write_generic,
5743                  0x00000000);
5744     /* ICTRL */
5745     /* XXX : not implemented */
5746     spr_register(env, SPR_ICTRL, "ICTRL",
5747                  SPR_NOACCESS, SPR_NOACCESS,
5748                  &spr_read_generic, &spr_write_generic,
5749                  0x00000000);
5750     /* MSSSR0 */
5751     /* XXX : not implemented */
5752     spr_register(env, SPR_MSSSR0, "MSSSR0",
5753                  SPR_NOACCESS, SPR_NOACCESS,
5754                  &spr_read_generic, &spr_write_generic,
5755                  0x00000000);
5756     /* PMC */
5757     /* XXX : not implemented */
5758     spr_register(env, SPR_PMC5, "PMC5",
5759                  SPR_NOACCESS, SPR_NOACCESS,
5760                  &spr_read_generic, &spr_write_generic,
5761                  0x00000000);
5762     /* XXX : not implemented */
5763     spr_register(env, SPR_UPMC5, "UPMC5",
5764                  &spr_read_ureg, SPR_NOACCESS,
5765                  &spr_read_ureg, SPR_NOACCESS,
5766                  0x00000000);
5767     /* XXX : not implemented */
5768     spr_register(env, SPR_PMC6, "PMC6",
5769                  SPR_NOACCESS, SPR_NOACCESS,
5770                  &spr_read_generic, &spr_write_generic,
5771                  0x00000000);
5772     /* XXX : not implemented */
5773     spr_register(env, SPR_UPMC6, "UPMC6",
5774                  &spr_read_ureg, SPR_NOACCESS,
5775                  &spr_read_ureg, SPR_NOACCESS,
5776                  0x00000000);
5777     /* SPRGs */
5778     spr_register(env, SPR_SPRG4, "SPRG4",
5779                  SPR_NOACCESS, SPR_NOACCESS,
5780                  &spr_read_generic, &spr_write_generic,
5781                  0x00000000);
5782     spr_register(env, SPR_USPRG4, "USPRG4",
5783                  &spr_read_ureg, SPR_NOACCESS,
5784                  &spr_read_ureg, SPR_NOACCESS,
5785                  0x00000000);
5786     spr_register(env, SPR_SPRG5, "SPRG5",
5787                  SPR_NOACCESS, SPR_NOACCESS,
5788                  &spr_read_generic, &spr_write_generic,
5789                  0x00000000);
5790     spr_register(env, SPR_USPRG5, "USPRG5",
5791                  &spr_read_ureg, SPR_NOACCESS,
5792                  &spr_read_ureg, SPR_NOACCESS,
5793                  0x00000000);
5794     spr_register(env, SPR_SPRG6, "SPRG6",
5795                  SPR_NOACCESS, SPR_NOACCESS,
5796                  &spr_read_generic, &spr_write_generic,
5797                  0x00000000);
5798     spr_register(env, SPR_USPRG6, "USPRG6",
5799                  &spr_read_ureg, SPR_NOACCESS,
5800                  &spr_read_ureg, SPR_NOACCESS,
5801                  0x00000000);
5802     spr_register(env, SPR_SPRG7, "SPRG7",
5803                  SPR_NOACCESS, SPR_NOACCESS,
5804                  &spr_read_generic, &spr_write_generic,
5805                  0x00000000);
5806     spr_register(env, SPR_USPRG7, "USPRG7",
5807                  &spr_read_ureg, SPR_NOACCESS,
5808                  &spr_read_ureg, SPR_NOACCESS,
5809                  0x00000000);
5810     /* Memory management */
5811     gen_low_BATs(env);
5812     gen_high_BATs(env);
5813     gen_74xx_soft_tlb(env, 128, 2);
5814     init_excp_7450(env);
5815     env->dcache_line_size = 32;
5816     env->icache_line_size = 32;
5817     /* Allocate hardware IRQ controller */
5818     ppc6xx_irq_init(env);
5819 }
5820
5821 /* PowerPC 7455 (aka G4)                                                     */
5822 #define POWERPC_INSNS_7455   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5823                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5824                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5825                               PPC_FLOAT_STFIWX |                              \
5826                               PPC_CACHE | PPC_CACHE_ICBI |                    \
5827                               PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5828                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5829                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5830                               PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5831                               PPC_SEGMENT | PPC_EXTERN |                      \
5832                               PPC_ALTIVEC)
5833 #define POWERPC_INSNS2_7455  (PPC_NONE)
5834 #define POWERPC_MSRM_7455    (0x000000000205FF77ULL)
5835 #define POWERPC_MMU_7455     (POWERPC_MMU_SOFT_74xx)
5836 #define POWERPC_EXCP_7455    (POWERPC_EXCP_74xx)
5837 #define POWERPC_INPUT_7455   (PPC_FLAGS_INPUT_6xx)
5838 #define POWERPC_BFDM_7455    (bfd_mach_ppc_7400)
5839 #define POWERPC_FLAG_7455    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5840                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5841                               POWERPC_FLAG_BUS_CLK)
5842 #define check_pow_7455       check_pow_hid0_74xx
5843
5844 __attribute__ (( unused ))
5845 static void init_proc_7455 (CPUPPCState *env)
5846 {
5847     gen_spr_ne_601(env);
5848     gen_spr_7xx(env);
5849     /* Time base */
5850     gen_tbl(env);
5851     /* 74xx specific SPR */
5852     gen_spr_74xx(env);
5853     /* Level 3 cache control */
5854     gen_l3_ctrl(env);
5855     /* LDSTCR */
5856     /* XXX : not implemented */
5857     spr_register(env, SPR_LDSTCR, "LDSTCR",
5858                  SPR_NOACCESS, SPR_NOACCESS,
5859                  &spr_read_generic, &spr_write_generic,
5860                  0x00000000);
5861     /* ICTRL */
5862     /* XXX : not implemented */
5863     spr_register(env, SPR_ICTRL, "ICTRL",
5864                  SPR_NOACCESS, SPR_NOACCESS,
5865                  &spr_read_generic, &spr_write_generic,
5866                  0x00000000);
5867     /* MSSSR0 */
5868     /* XXX : not implemented */
5869     spr_register(env, SPR_MSSSR0, "MSSSR0",
5870                  SPR_NOACCESS, SPR_NOACCESS,
5871                  &spr_read_generic, &spr_write_generic,
5872                  0x00000000);
5873     /* PMC */
5874     /* XXX : not implemented */
5875     spr_register(env, SPR_PMC5, "PMC5",
5876                  SPR_NOACCESS, SPR_NOACCESS,
5877                  &spr_read_generic, &spr_write_generic,
5878                  0x00000000);
5879     /* XXX : not implemented */
5880     spr_register(env, SPR_UPMC5, "UPMC5",
5881                  &spr_read_ureg, SPR_NOACCESS,
5882                  &spr_read_ureg, SPR_NOACCESS,
5883                  0x00000000);
5884     /* XXX : not implemented */
5885     spr_register(env, SPR_PMC6, "PMC6",
5886                  SPR_NOACCESS, SPR_NOACCESS,
5887                  &spr_read_generic, &spr_write_generic,
5888                  0x00000000);
5889     /* XXX : not implemented */
5890     spr_register(env, SPR_UPMC6, "UPMC6",
5891                  &spr_read_ureg, SPR_NOACCESS,
5892                  &spr_read_ureg, SPR_NOACCESS,
5893                  0x00000000);
5894     /* SPRGs */
5895     spr_register(env, SPR_SPRG4, "SPRG4",
5896                  SPR_NOACCESS, SPR_NOACCESS,
5897                  &spr_read_generic, &spr_write_generic,
5898                  0x00000000);
5899     spr_register(env, SPR_USPRG4, "USPRG4",
5900                  &spr_read_ureg, SPR_NOACCESS,
5901                  &spr_read_ureg, SPR_NOACCESS,
5902                  0x00000000);
5903     spr_register(env, SPR_SPRG5, "SPRG5",
5904                  SPR_NOACCESS, SPR_NOACCESS,
5905                  &spr_read_generic, &spr_write_generic,
5906                  0x00000000);
5907     spr_register(env, SPR_USPRG5, "USPRG5",
5908                  &spr_read_ureg, SPR_NOACCESS,
5909                  &spr_read_ureg, SPR_NOACCESS,
5910                  0x00000000);
5911     spr_register(env, SPR_SPRG6, "SPRG6",
5912                  SPR_NOACCESS, SPR_NOACCESS,
5913                  &spr_read_generic, &spr_write_generic,
5914                  0x00000000);
5915     spr_register(env, SPR_USPRG6, "USPRG6",
5916                  &spr_read_ureg, SPR_NOACCESS,
5917                  &spr_read_ureg, SPR_NOACCESS,
5918                  0x00000000);
5919     spr_register(env, SPR_SPRG7, "SPRG7",
5920                  SPR_NOACCESS, SPR_NOACCESS,
5921                  &spr_read_generic, &spr_write_generic,
5922                  0x00000000);
5923     spr_register(env, SPR_USPRG7, "USPRG7",
5924                  &spr_read_ureg, SPR_NOACCESS,
5925                  &spr_read_ureg, SPR_NOACCESS,
5926                  0x00000000);
5927     /* Memory management */
5928     gen_low_BATs(env);
5929     gen_high_BATs(env);
5930     gen_74xx_soft_tlb(env, 128, 2);
5931     init_excp_7450(env);
5932     env->dcache_line_size = 32;
5933     env->icache_line_size = 32;
5934     /* Allocate hardware IRQ controller */
5935     ppc6xx_irq_init(env);
5936 }
5937
5938 /* PowerPC 7457 (aka G4)                                                     */
5939 #define POWERPC_INSNS_7457   (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
5940                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
5941                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
5942                               PPC_FLOAT_STFIWX |                              \
5943                               PPC_CACHE | PPC_CACHE_ICBI |                    \
5944                               PPC_CACHE_DCBA | PPC_CACHE_DCBZ |               \
5945                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
5946                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
5947                               PPC_MEM_TLBIA | PPC_74xx_TLB |                  \
5948                               PPC_SEGMENT | PPC_EXTERN |                      \
5949                               PPC_ALTIVEC)
5950 #define POWERPC_INSNS2_7457  (PPC_NONE)
5951 #define POWERPC_MSRM_7457    (0x000000000205FF77ULL)
5952 #define POWERPC_MMU_7457     (POWERPC_MMU_SOFT_74xx)
5953 #define POWERPC_EXCP_7457    (POWERPC_EXCP_74xx)
5954 #define POWERPC_INPUT_7457   (PPC_FLAGS_INPUT_6xx)
5955 #define POWERPC_BFDM_7457    (bfd_mach_ppc_7400)
5956 #define POWERPC_FLAG_7457    (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
5957                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
5958                               POWERPC_FLAG_BUS_CLK)
5959 #define check_pow_7457       check_pow_hid0_74xx
5960
5961 __attribute__ (( unused ))
5962 static void init_proc_7457 (CPUPPCState *env)
5963 {
5964     gen_spr_ne_601(env);
5965     gen_spr_7xx(env);
5966     /* Time base */
5967     gen_tbl(env);
5968     /* 74xx specific SPR */
5969     gen_spr_74xx(env);
5970     /* Level 3 cache control */
5971     gen_l3_ctrl(env);
5972     /* L3ITCR1 */
5973     /* XXX : not implemented */
5974     spr_register(env, SPR_L3ITCR1, "L3ITCR1",
5975                  SPR_NOACCESS, SPR_NOACCESS,
5976                  &spr_read_generic, &spr_write_generic,
5977                  0x00000000);
5978     /* L3ITCR2 */
5979     /* XXX : not implemented */
5980     spr_register(env, SPR_L3ITCR2, "L3ITCR2",
5981                  SPR_NOACCESS, SPR_NOACCESS,
5982                  &spr_read_generic, &spr_write_generic,
5983                  0x00000000);
5984     /* L3ITCR3 */
5985     /* XXX : not implemented */
5986     spr_register(env, SPR_L3ITCR3, "L3ITCR3",
5987                  SPR_NOACCESS, SPR_NOACCESS,
5988                  &spr_read_generic, &spr_write_generic,
5989                  0x00000000);
5990     /* L3OHCR */
5991     /* XXX : not implemented */
5992     spr_register(env, SPR_L3OHCR, "L3OHCR",
5993                  SPR_NOACCESS, SPR_NOACCESS,
5994                  &spr_read_generic, &spr_write_generic,
5995                  0x00000000);
5996     /* LDSTCR */
5997     /* XXX : not implemented */
5998     spr_register(env, SPR_LDSTCR, "LDSTCR",
5999                  SPR_NOACCESS, SPR_NOACCESS,
6000                  &spr_read_generic, &spr_write_generic,
6001                  0x00000000);
6002     /* ICTRL */
6003     /* XXX : not implemented */
6004     spr_register(env, SPR_ICTRL, "ICTRL",
6005                  SPR_NOACCESS, SPR_NOACCESS,
6006                  &spr_read_generic, &spr_write_generic,
6007                  0x00000000);
6008     /* MSSSR0 */
6009     /* XXX : not implemented */
6010     spr_register(env, SPR_MSSSR0, "MSSSR0",
6011                  SPR_NOACCESS, SPR_NOACCESS,
6012                  &spr_read_generic, &spr_write_generic,
6013                  0x00000000);
6014     /* PMC */
6015     /* XXX : not implemented */
6016     spr_register(env, SPR_PMC5, "PMC5",
6017                  SPR_NOACCESS, SPR_NOACCESS,
6018                  &spr_read_generic, &spr_write_generic,
6019                  0x00000000);
6020     /* XXX : not implemented */
6021     spr_register(env, SPR_UPMC5, "UPMC5",
6022                  &spr_read_ureg, SPR_NOACCESS,
6023                  &spr_read_ureg, SPR_NOACCESS,
6024                  0x00000000);
6025     /* XXX : not implemented */
6026     spr_register(env, SPR_PMC6, "PMC6",
6027                  SPR_NOACCESS, SPR_NOACCESS,
6028                  &spr_read_generic, &spr_write_generic,
6029                  0x00000000);
6030     /* XXX : not implemented */
6031     spr_register(env, SPR_UPMC6, "UPMC6",
6032                  &spr_read_ureg, SPR_NOACCESS,
6033                  &spr_read_ureg, SPR_NOACCESS,
6034                  0x00000000);
6035     /* SPRGs */
6036     spr_register(env, SPR_SPRG4, "SPRG4",
6037                  SPR_NOACCESS, SPR_NOACCESS,
6038                  &spr_read_generic, &spr_write_generic,
6039                  0x00000000);
6040     spr_register(env, SPR_USPRG4, "USPRG4",
6041                  &spr_read_ureg, SPR_NOACCESS,
6042                  &spr_read_ureg, SPR_NOACCESS,
6043                  0x00000000);
6044     spr_register(env, SPR_SPRG5, "SPRG5",
6045                  SPR_NOACCESS, SPR_NOACCESS,
6046                  &spr_read_generic, &spr_write_generic,
6047                  0x00000000);
6048     spr_register(env, SPR_USPRG5, "USPRG5",
6049                  &spr_read_ureg, SPR_NOACCESS,
6050                  &spr_read_ureg, SPR_NOACCESS,
6051                  0x00000000);
6052     spr_register(env, SPR_SPRG6, "SPRG6",
6053                  SPR_NOACCESS, SPR_NOACCESS,
6054                  &spr_read_generic, &spr_write_generic,
6055                  0x00000000);
6056     spr_register(env, SPR_USPRG6, "USPRG6",
6057                  &spr_read_ureg, SPR_NOACCESS,
6058                  &spr_read_ureg, SPR_NOACCESS,
6059                  0x00000000);
6060     spr_register(env, SPR_SPRG7, "SPRG7",
6061                  SPR_NOACCESS, SPR_NOACCESS,
6062                  &spr_read_generic, &spr_write_generic,
6063                  0x00000000);
6064     spr_register(env, SPR_USPRG7, "USPRG7",
6065                  &spr_read_ureg, SPR_NOACCESS,
6066                  &spr_read_ureg, SPR_NOACCESS,
6067                  0x00000000);
6068     /* Memory management */
6069     gen_low_BATs(env);
6070     gen_high_BATs(env);
6071     gen_74xx_soft_tlb(env, 128, 2);
6072     init_excp_7450(env);
6073     env->dcache_line_size = 32;
6074     env->icache_line_size = 32;
6075     /* Allocate hardware IRQ controller */
6076     ppc6xx_irq_init(env);
6077 }
6078
6079 #if defined (TARGET_PPC64)
6080 /* PowerPC 970                                                               */
6081 #define POWERPC_INSNS_970    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6082                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6083                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6084                               PPC_FLOAT_STFIWX |                              \
6085                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
6086                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6087                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6088                               PPC_64B | PPC_ALTIVEC |                         \
6089                               PPC_SEGMENT_64B | PPC_SLBI)
6090 #define POWERPC_INSNS2_970   (PPC_NONE)
6091 #define POWERPC_MSRM_970     (0x900000000204FF36ULL)
6092 #define POWERPC_MMU_970      (POWERPC_MMU_64B)
6093 //#define POWERPC_EXCP_970     (POWERPC_EXCP_970)
6094 #define POWERPC_INPUT_970    (PPC_FLAGS_INPUT_970)
6095 #define POWERPC_BFDM_970     (bfd_mach_ppc64)
6096 #define POWERPC_FLAG_970     (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6097                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6098                               POWERPC_FLAG_BUS_CLK)
6099
6100 #if defined(CONFIG_USER_ONLY)
6101 #define POWERPC970_HID5_INIT 0x00000080
6102 #else
6103 #define POWERPC970_HID5_INIT 0x00000000
6104 #endif
6105
6106 static int check_pow_970 (CPUPPCState *env)
6107 {
6108     if (env->spr[SPR_HID0] & 0x00600000)
6109         return 1;
6110
6111     return 0;
6112 }
6113
6114 static void init_proc_970 (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 970FX (aka G5)                                                    */
6177 #define POWERPC_INSNS_970FX  (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_INSNS2_970FX (PPC_NONE)
6187 #define POWERPC_MSRM_970FX   (0x800000000204FF36ULL)
6188 #define POWERPC_MMU_970FX    (POWERPC_MMU_64B)
6189 #define POWERPC_EXCP_970FX   (POWERPC_EXCP_970)
6190 #define POWERPC_INPUT_970FX  (PPC_FLAGS_INPUT_970)
6191 #define POWERPC_BFDM_970FX   (bfd_mach_ppc64)
6192 #define POWERPC_FLAG_970FX   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6193                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6194                               POWERPC_FLAG_BUS_CLK)
6195
6196 static int check_pow_970FX (CPUPPCState *env)
6197 {
6198     if (env->spr[SPR_HID0] & 0x00600000)
6199         return 1;
6200
6201     return 0;
6202 }
6203
6204 static void init_proc_970FX (CPUPPCState *env)
6205 {
6206     gen_spr_ne_601(env);
6207     gen_spr_7xx(env);
6208     /* Time base */
6209     gen_tbl(env);
6210     /* Hardware implementation registers */
6211     /* XXX : not implemented */
6212     spr_register(env, SPR_HID0, "HID0",
6213                  SPR_NOACCESS, SPR_NOACCESS,
6214                  &spr_read_generic, &spr_write_clear,
6215                  0x60000000);
6216     /* XXX : not implemented */
6217     spr_register(env, SPR_HID1, "HID1",
6218                  SPR_NOACCESS, SPR_NOACCESS,
6219                  &spr_read_generic, &spr_write_generic,
6220                  0x00000000);
6221     /* XXX : not implemented */
6222     spr_register(env, SPR_750FX_HID2, "HID2",
6223                  SPR_NOACCESS, SPR_NOACCESS,
6224                  &spr_read_generic, &spr_write_generic,
6225                  0x00000000);
6226     /* XXX : not implemented */
6227     spr_register(env, SPR_970_HID5, "HID5",
6228                  SPR_NOACCESS, SPR_NOACCESS,
6229                  &spr_read_generic, &spr_write_generic,
6230                  POWERPC970_HID5_INIT);
6231     /* XXX : not implemented */
6232     spr_register(env, SPR_L2CR, "L2CR",
6233                  SPR_NOACCESS, SPR_NOACCESS,
6234                  &spr_read_generic, &spr_write_generic,
6235                  0x00000000);
6236     /* Memory management */
6237     /* XXX: not correct */
6238     gen_low_BATs(env);
6239     /* XXX : not implemented */
6240     spr_register(env, SPR_MMUCFG, "MMUCFG",
6241                  SPR_NOACCESS, SPR_NOACCESS,
6242                  &spr_read_generic, SPR_NOACCESS,
6243                  0x00000000); /* TOFIX */
6244     /* XXX : not implemented */
6245     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6246                  SPR_NOACCESS, SPR_NOACCESS,
6247                  &spr_read_generic, &spr_write_generic,
6248                  0x00000000); /* TOFIX */
6249     spr_register(env, SPR_HIOR, "SPR_HIOR",
6250                  SPR_NOACCESS, SPR_NOACCESS,
6251                  &spr_read_hior, &spr_write_hior,
6252                  0x00000000);
6253     spr_register(env, SPR_CTRL, "SPR_CTRL",
6254                  SPR_NOACCESS, SPR_NOACCESS,
6255                  &spr_read_generic, &spr_write_generic,
6256                  0x00000000);
6257     spr_register(env, SPR_UCTRL, "SPR_UCTRL",
6258                  SPR_NOACCESS, SPR_NOACCESS,
6259                  &spr_read_generic, &spr_write_generic,
6260                  0x00000000);
6261     spr_register(env, SPR_VRSAVE, "SPR_VRSAVE",
6262                  &spr_read_generic, &spr_write_generic,
6263                  &spr_read_generic, &spr_write_generic,
6264                  0x00000000);
6265 #if !defined(CONFIG_USER_ONLY)
6266     env->slb_nr = 64;
6267 #endif
6268     init_excp_970(env);
6269     env->dcache_line_size = 128;
6270     env->icache_line_size = 128;
6271     /* Allocate hardware IRQ controller */
6272     ppc970_irq_init(env);
6273     /* Can't find information on what this should be on reset.  This
6274      * value is the one used by 74xx processors. */
6275     vscr_init(env, 0x00010000);
6276 }
6277
6278 /* PowerPC 970 GX                                                            */
6279 #define POWERPC_INSNS_970GX  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6280                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6281                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6282                               PPC_FLOAT_STFIWX |                              \
6283                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
6284                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6285                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6286                               PPC_64B | PPC_ALTIVEC |                         \
6287                               PPC_SEGMENT_64B | PPC_SLBI)
6288 #define POWERPC_INSNS2_970GX (PPC_NONE)
6289 #define POWERPC_MSRM_970GX   (0x800000000204FF36ULL)
6290 #define POWERPC_MMU_970GX    (POWERPC_MMU_64B)
6291 #define POWERPC_EXCP_970GX   (POWERPC_EXCP_970)
6292 #define POWERPC_INPUT_970GX  (PPC_FLAGS_INPUT_970)
6293 #define POWERPC_BFDM_970GX   (bfd_mach_ppc64)
6294 #define POWERPC_FLAG_970GX   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6295                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6296                               POWERPC_FLAG_BUS_CLK)
6297
6298 static int check_pow_970GX (CPUPPCState *env)
6299 {
6300     if (env->spr[SPR_HID0] & 0x00600000)
6301         return 1;
6302
6303     return 0;
6304 }
6305
6306 static void init_proc_970GX (CPUPPCState *env)
6307 {
6308     gen_spr_ne_601(env);
6309     gen_spr_7xx(env);
6310     /* Time base */
6311     gen_tbl(env);
6312     /* Hardware implementation registers */
6313     /* XXX : not implemented */
6314     spr_register(env, SPR_HID0, "HID0",
6315                  SPR_NOACCESS, SPR_NOACCESS,
6316                  &spr_read_generic, &spr_write_clear,
6317                  0x60000000);
6318     /* XXX : not implemented */
6319     spr_register(env, SPR_HID1, "HID1",
6320                  SPR_NOACCESS, SPR_NOACCESS,
6321                  &spr_read_generic, &spr_write_generic,
6322                  0x00000000);
6323     /* XXX : not implemented */
6324     spr_register(env, SPR_750FX_HID2, "HID2",
6325                  SPR_NOACCESS, SPR_NOACCESS,
6326                  &spr_read_generic, &spr_write_generic,
6327                  0x00000000);
6328     /* XXX : not implemented */
6329     spr_register(env, SPR_970_HID5, "HID5",
6330                  SPR_NOACCESS, SPR_NOACCESS,
6331                  &spr_read_generic, &spr_write_generic,
6332                  POWERPC970_HID5_INIT);
6333     /* XXX : not implemented */
6334     spr_register(env, SPR_L2CR, "L2CR",
6335                  SPR_NOACCESS, SPR_NOACCESS,
6336                  &spr_read_generic, &spr_write_generic,
6337                  0x00000000);
6338     /* Memory management */
6339     /* XXX: not correct */
6340     gen_low_BATs(env);
6341     /* XXX : not implemented */
6342     spr_register(env, SPR_MMUCFG, "MMUCFG",
6343                  SPR_NOACCESS, SPR_NOACCESS,
6344                  &spr_read_generic, SPR_NOACCESS,
6345                  0x00000000); /* TOFIX */
6346     /* XXX : not implemented */
6347     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6348                  SPR_NOACCESS, SPR_NOACCESS,
6349                  &spr_read_generic, &spr_write_generic,
6350                  0x00000000); /* TOFIX */
6351     spr_register(env, SPR_HIOR, "SPR_HIOR",
6352                  SPR_NOACCESS, SPR_NOACCESS,
6353                  &spr_read_hior, &spr_write_hior,
6354                  0x00000000);
6355 #if !defined(CONFIG_USER_ONLY)
6356     env->slb_nr = 32;
6357 #endif
6358     init_excp_970(env);
6359     env->dcache_line_size = 128;
6360     env->icache_line_size = 128;
6361     /* Allocate hardware IRQ controller */
6362     ppc970_irq_init(env);
6363     /* Can't find information on what this should be on reset.  This
6364      * value is the one used by 74xx processors. */
6365     vscr_init(env, 0x00010000);
6366 }
6367
6368 /* PowerPC 970 MP                                                            */
6369 #define POWERPC_INSNS_970MP  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6370                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6371                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6372                               PPC_FLOAT_STFIWX |                              \
6373                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
6374                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6375                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6376                               PPC_64B | PPC_ALTIVEC |                         \
6377                               PPC_SEGMENT_64B | PPC_SLBI)
6378 #define POWERPC_INSNS2_970MP (PPC_NONE)
6379 #define POWERPC_MSRM_970MP   (0x900000000204FF36ULL)
6380 #define POWERPC_MMU_970MP    (POWERPC_MMU_64B)
6381 #define POWERPC_EXCP_970MP   (POWERPC_EXCP_970)
6382 #define POWERPC_INPUT_970MP  (PPC_FLAGS_INPUT_970)
6383 #define POWERPC_BFDM_970MP   (bfd_mach_ppc64)
6384 #define POWERPC_FLAG_970MP   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6385                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6386                               POWERPC_FLAG_BUS_CLK)
6387
6388 static int check_pow_970MP (CPUPPCState *env)
6389 {
6390     if (env->spr[SPR_HID0] & 0x01C00000)
6391         return 1;
6392
6393     return 0;
6394 }
6395
6396 static void init_proc_970MP (CPUPPCState *env)
6397 {
6398     gen_spr_ne_601(env);
6399     gen_spr_7xx(env);
6400     /* Time base */
6401     gen_tbl(env);
6402     /* Hardware implementation registers */
6403     /* XXX : not implemented */
6404     spr_register(env, SPR_HID0, "HID0",
6405                  SPR_NOACCESS, SPR_NOACCESS,
6406                  &spr_read_generic, &spr_write_clear,
6407                  0x60000000);
6408     /* XXX : not implemented */
6409     spr_register(env, SPR_HID1, "HID1",
6410                  SPR_NOACCESS, SPR_NOACCESS,
6411                  &spr_read_generic, &spr_write_generic,
6412                  0x00000000);
6413     /* XXX : not implemented */
6414     spr_register(env, SPR_750FX_HID2, "HID2",
6415                  SPR_NOACCESS, SPR_NOACCESS,
6416                  &spr_read_generic, &spr_write_generic,
6417                  0x00000000);
6418     /* XXX : not implemented */
6419     spr_register(env, SPR_970_HID5, "HID5",
6420                  SPR_NOACCESS, SPR_NOACCESS,
6421                  &spr_read_generic, &spr_write_generic,
6422                  POWERPC970_HID5_INIT);
6423     /* XXX : not implemented */
6424     spr_register(env, SPR_L2CR, "L2CR",
6425                  SPR_NOACCESS, SPR_NOACCESS,
6426                  &spr_read_generic, &spr_write_generic,
6427                  0x00000000);
6428     /* Memory management */
6429     /* XXX: not correct */
6430     gen_low_BATs(env);
6431     /* XXX : not implemented */
6432     spr_register(env, SPR_MMUCFG, "MMUCFG",
6433                  SPR_NOACCESS, SPR_NOACCESS,
6434                  &spr_read_generic, SPR_NOACCESS,
6435                  0x00000000); /* TOFIX */
6436     /* XXX : not implemented */
6437     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6438                  SPR_NOACCESS, SPR_NOACCESS,
6439                  &spr_read_generic, &spr_write_generic,
6440                  0x00000000); /* TOFIX */
6441     spr_register(env, SPR_HIOR, "SPR_HIOR",
6442                  SPR_NOACCESS, SPR_NOACCESS,
6443                  &spr_read_hior, &spr_write_hior,
6444                  0x00000000);
6445 #if !defined(CONFIG_USER_ONLY)
6446     env->slb_nr = 32;
6447 #endif
6448     init_excp_970(env);
6449     env->dcache_line_size = 128;
6450     env->icache_line_size = 128;
6451     /* Allocate hardware IRQ controller */
6452     ppc970_irq_init(env);
6453     /* Can't find information on what this should be on reset.  This
6454      * value is the one used by 74xx processors. */
6455     vscr_init(env, 0x00010000);
6456 }
6457
6458 #if defined(TARGET_PPC64)
6459 /* POWER7 */
6460 #define POWERPC_INSNS_POWER7  (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6461                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6462                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6463                               PPC_FLOAT_STFIWX |                              \
6464                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZT |  \
6465                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6466                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6467                               PPC_64B | PPC_ALTIVEC |                         \
6468                               PPC_SEGMENT_64B | PPC_SLBI |                    \
6469                               PPC_POPCNTB | PPC_POPCNTWD)
6470 #define POWERPC_INSNS2_POWER7 (PPC_NONE)
6471 #define POWERPC_MSRM_POWER7   (0x800000000204FF36ULL)
6472 #define POWERPC_MMU_POWER7    (POWERPC_MMU_2_06)
6473 #define POWERPC_EXCP_POWER7   (POWERPC_EXCP_POWER7)
6474 #define POWERPC_INPUT_POWER7  (PPC_FLAGS_INPUT_POWER7)
6475 #define POWERPC_BFDM_POWER7   (bfd_mach_ppc64)
6476 #define POWERPC_FLAG_POWER7   (POWERPC_FLAG_VRE | POWERPC_FLAG_SE |            \
6477                               POWERPC_FLAG_BE | POWERPC_FLAG_PMM |            \
6478                               POWERPC_FLAG_BUS_CLK)
6479 #define check_pow_POWER7    check_pow_nocheck
6480
6481 static void init_proc_POWER7 (CPUPPCState *env)
6482 {
6483     gen_spr_ne_601(env);
6484     gen_spr_7xx(env);
6485     /* Time base */
6486     gen_tbl(env);
6487 #if !defined(CONFIG_USER_ONLY)
6488     /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
6489     spr_register(env, SPR_PURR,   "PURR",
6490                  &spr_read_purr, SPR_NOACCESS,
6491                  &spr_read_purr, SPR_NOACCESS,
6492                  0x00000000);
6493     spr_register(env, SPR_SPURR,   "SPURR",
6494                  &spr_read_purr, SPR_NOACCESS,
6495                  &spr_read_purr, SPR_NOACCESS,
6496                  0x00000000);
6497 #endif /* !CONFIG_USER_ONLY */
6498     /* Memory management */
6499     /* XXX : not implemented */
6500     spr_register(env, SPR_MMUCFG, "MMUCFG",
6501                  SPR_NOACCESS, SPR_NOACCESS,
6502                  &spr_read_generic, SPR_NOACCESS,
6503                  0x00000000); /* TOFIX */
6504     /* XXX : not implemented */
6505     spr_register(env, SPR_CTRL, "SPR_CTRLT",
6506                  SPR_NOACCESS, SPR_NOACCESS,
6507                  &spr_read_generic, &spr_write_generic,
6508                  0x80800000);
6509     spr_register(env, SPR_UCTRL, "SPR_CTRLF",
6510                  SPR_NOACCESS, SPR_NOACCESS,
6511                  &spr_read_generic, &spr_write_generic,
6512                  0x80800000);
6513     spr_register(env, SPR_VRSAVE, "SPR_VRSAVE",
6514                  &spr_read_generic, &spr_write_generic,
6515                  &spr_read_generic, &spr_write_generic,
6516                  0x00000000);
6517 #if !defined(CONFIG_USER_ONLY)
6518     env->slb_nr = 32;
6519 #endif
6520     init_excp_POWER7(env);
6521     env->dcache_line_size = 128;
6522     env->icache_line_size = 128;
6523     /* Allocate hardware IRQ controller */
6524     ppcPOWER7_irq_init(env);
6525     /* Can't find information on what this should be on reset.  This
6526      * value is the one used by 74xx processors. */
6527     vscr_init(env, 0x00010000);
6528 }
6529 #endif /* TARGET_PPC64 */
6530
6531 /* PowerPC 620                                                               */
6532 #define POWERPC_INSNS_620    (PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |        \
6533                               PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |   \
6534                               PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |           \
6535                               PPC_FLOAT_STFIWX |                              \
6536                               PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |   \
6537                               PPC_MEM_SYNC | PPC_MEM_EIEIO |                  \
6538                               PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |               \
6539                               PPC_SEGMENT | PPC_EXTERN |                      \
6540                               PPC_64B | PPC_SLBI)
6541 #define POWERPC_INSNS2_620   (PPC_NONE)
6542 #define POWERPC_MSRM_620     (0x800000000005FF77ULL)
6543 //#define POWERPC_MMU_620      (POWERPC_MMU_620)
6544 #define POWERPC_EXCP_620     (POWERPC_EXCP_970)
6545 #define POWERPC_INPUT_620    (PPC_FLAGS_INPUT_6xx)
6546 #define POWERPC_BFDM_620     (bfd_mach_ppc64)
6547 #define POWERPC_FLAG_620     (POWERPC_FLAG_SE | POWERPC_FLAG_BE |            \
6548                               POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK)
6549 #define check_pow_620        check_pow_nocheck /* Check this */
6550
6551 __attribute__ (( unused ))
6552 static void init_proc_620 (CPUPPCState *env)
6553 {
6554     gen_spr_ne_601(env);
6555     gen_spr_620(env);
6556     /* Time base */
6557     gen_tbl(env);
6558     /* Hardware implementation registers */
6559     /* XXX : not implemented */
6560     spr_register(env, SPR_HID0, "HID0",
6561                  SPR_NOACCESS, SPR_NOACCESS,
6562                  &spr_read_generic, &spr_write_generic,
6563                  0x00000000);
6564     /* Memory management */
6565     gen_low_BATs(env);
6566     init_excp_620(env);
6567     env->dcache_line_size = 64;
6568     env->icache_line_size = 64;
6569     /* Allocate hardware IRQ controller */
6570     ppc6xx_irq_init(env);
6571 }
6572 #endif /* defined (TARGET_PPC64) */
6573
6574 /* Default 32 bits PowerPC target will be 604 */
6575 #define CPU_POWERPC_PPC32     CPU_POWERPC_604
6576 #define POWERPC_INSNS_PPC32   POWERPC_INSNS_604
6577 #define POWERPC_INSNS2_PPC32  POWERPC_INSNS2_604
6578 #define POWERPC_MSRM_PPC32    POWERPC_MSRM_604
6579 #define POWERPC_MMU_PPC32     POWERPC_MMU_604
6580 #define POWERPC_EXCP_PPC32    POWERPC_EXCP_604
6581 #define POWERPC_INPUT_PPC32   POWERPC_INPUT_604
6582 #define POWERPC_BFDM_PPC32    POWERPC_BFDM_604
6583 #define POWERPC_FLAG_PPC32    POWERPC_FLAG_604
6584 #define check_pow_PPC32       check_pow_604
6585 #define init_proc_PPC32       init_proc_604
6586
6587 /* Default 64 bits PowerPC target will be 970 FX */
6588 #define CPU_POWERPC_PPC64     CPU_POWERPC_970FX
6589 #define POWERPC_INSNS_PPC64   POWERPC_INSNS_970FX
6590 #define POWERPC_INSNS2_PPC64  POWERPC_INSNS2_970FX
6591 #define POWERPC_MSRM_PPC64    POWERPC_MSRM_970FX
6592 #define POWERPC_MMU_PPC64     POWERPC_MMU_970FX
6593 #define POWERPC_EXCP_PPC64    POWERPC_EXCP_970FX
6594 #define POWERPC_INPUT_PPC64   POWERPC_INPUT_970FX
6595 #define POWERPC_BFDM_PPC64    POWERPC_BFDM_970FX
6596 #define POWERPC_FLAG_PPC64    POWERPC_FLAG_970FX
6597 #define check_pow_PPC64       check_pow_970FX
6598 #define init_proc_PPC64       init_proc_970FX
6599
6600 /* Default PowerPC target will be PowerPC 32 */
6601 #if defined (TARGET_PPC64) && 0 // XXX: TODO
6602 #define CPU_POWERPC_DEFAULT    CPU_POWERPC_PPC64
6603 #define POWERPC_INSNS_DEFAULT  POWERPC_INSNS_PPC64
6604 #define POWERPC_INSNS2_DEFAULT POWERPC_INSNS_PPC64
6605 #define POWERPC_MSRM_DEFAULT   POWERPC_MSRM_PPC64
6606 #define POWERPC_MMU_DEFAULT    POWERPC_MMU_PPC64
6607 #define POWERPC_EXCP_DEFAULT   POWERPC_EXCP_PPC64
6608 #define POWERPC_INPUT_DEFAULT  POWERPC_INPUT_PPC64
6609 #define POWERPC_BFDM_DEFAULT   POWERPC_BFDM_PPC64
6610 #define POWERPC_FLAG_DEFAULT   POWERPC_FLAG_PPC64
6611 #define check_pow_DEFAULT      check_pow_PPC64
6612 #define init_proc_DEFAULT      init_proc_PPC64
6613 #else
6614 #define CPU_POWERPC_DEFAULT    CPU_POWERPC_PPC32
6615 #define POWERPC_INSNS_DEFAULT  POWERPC_INSNS_PPC32
6616 #define POWERPC_INSNS2_DEFAULT POWERPC_INSNS_PPC32
6617 #define POWERPC_MSRM_DEFAULT   POWERPC_MSRM_PPC32
6618 #define POWERPC_MMU_DEFAULT    POWERPC_MMU_PPC32
6619 #define POWERPC_EXCP_DEFAULT   POWERPC_EXCP_PPC32
6620 #define POWERPC_INPUT_DEFAULT  POWERPC_INPUT_PPC32
6621 #define POWERPC_BFDM_DEFAULT   POWERPC_BFDM_PPC32
6622 #define POWERPC_FLAG_DEFAULT   POWERPC_FLAG_PPC32
6623 #define check_pow_DEFAULT      check_pow_PPC32
6624 #define init_proc_DEFAULT      init_proc_PPC32
6625 #endif
6626
6627 /*****************************************************************************/
6628 /* PVR definitions for most known PowerPC                                    */
6629 enum {
6630     /* PowerPC 401 family */
6631     /* Generic PowerPC 401 */
6632 #define CPU_POWERPC_401              CPU_POWERPC_401G2
6633     /* PowerPC 401 cores */
6634     CPU_POWERPC_401A1              = 0x00210000,
6635     CPU_POWERPC_401B2              = 0x00220000,
6636 #if 0
6637     CPU_POWERPC_401B3              = xxx,
6638 #endif
6639     CPU_POWERPC_401C2              = 0x00230000,
6640     CPU_POWERPC_401D2              = 0x00240000,
6641     CPU_POWERPC_401E2              = 0x00250000,
6642     CPU_POWERPC_401F2              = 0x00260000,
6643     CPU_POWERPC_401G2              = 0x00270000,
6644     /* PowerPC 401 microcontrolers */
6645 #if 0
6646     CPU_POWERPC_401GF              = xxx,
6647 #endif
6648 #define CPU_POWERPC_IOP480           CPU_POWERPC_401B2
6649     /* IBM Processor for Network Resources */
6650     CPU_POWERPC_COBRA              = 0x10100000, /* XXX: 405 ? */
6651 #if 0
6652     CPU_POWERPC_XIPCHIP            = xxx,
6653 #endif
6654     /* PowerPC 403 family */
6655     /* Generic PowerPC 403 */
6656 #define CPU_POWERPC_403              CPU_POWERPC_403GC
6657     /* PowerPC 403 microcontrollers */
6658     CPU_POWERPC_403GA              = 0x00200011,
6659     CPU_POWERPC_403GB              = 0x00200100,
6660     CPU_POWERPC_403GC              = 0x00200200,
6661     CPU_POWERPC_403GCX             = 0x00201400,
6662 #if 0
6663     CPU_POWERPC_403GP              = xxx,
6664 #endif
6665     /* PowerPC 405 family */
6666     /* Generic PowerPC 405 */
6667 #define CPU_POWERPC_405              CPU_POWERPC_405D4
6668     /* PowerPC 405 cores */
6669 #if 0
6670     CPU_POWERPC_405A3              = xxx,
6671 #endif
6672 #if 0
6673     CPU_POWERPC_405A4              = xxx,
6674 #endif
6675 #if 0
6676     CPU_POWERPC_405B3              = xxx,
6677 #endif
6678 #if 0
6679     CPU_POWERPC_405B4              = xxx,
6680 #endif
6681 #if 0
6682     CPU_POWERPC_405C3              = xxx,
6683 #endif
6684 #if 0
6685     CPU_POWERPC_405C4              = xxx,
6686 #endif
6687     CPU_POWERPC_405D2              = 0x20010000,
6688 #if 0
6689     CPU_POWERPC_405D3              = xxx,
6690 #endif
6691     CPU_POWERPC_405D4              = 0x41810000,
6692 #if 0
6693     CPU_POWERPC_405D5              = xxx,
6694 #endif
6695 #if 0
6696     CPU_POWERPC_405E4              = xxx,
6697 #endif
6698 #if 0
6699     CPU_POWERPC_405F4              = xxx,
6700 #endif
6701 #if 0
6702     CPU_POWERPC_405F5              = xxx,
6703 #endif
6704 #if 0
6705     CPU_POWERPC_405F6              = xxx,
6706 #endif
6707     /* PowerPC 405 microcontrolers */
6708     /* XXX: missing 0x200108a0 */
6709 #define CPU_POWERPC_405CR            CPU_POWERPC_405CRc
6710     CPU_POWERPC_405CRa             = 0x40110041,
6711     CPU_POWERPC_405CRb             = 0x401100C5,
6712     CPU_POWERPC_405CRc             = 0x40110145,
6713     CPU_POWERPC_405EP              = 0x51210950,
6714 #if 0
6715     CPU_POWERPC_405EXr             = xxx,
6716 #endif
6717     CPU_POWERPC_405EZ              = 0x41511460, /* 0x51210950 ? */
6718 #if 0
6719     CPU_POWERPC_405FX              = xxx,
6720 #endif
6721 #define CPU_POWERPC_405GP            CPU_POWERPC_405GPd
6722     CPU_POWERPC_405GPa             = 0x40110000,
6723     CPU_POWERPC_405GPb             = 0x40110040,
6724     CPU_POWERPC_405GPc             = 0x40110082,
6725     CPU_POWERPC_405GPd             = 0x401100C4,
6726 #define CPU_POWERPC_405GPe           CPU_POWERPC_405CRc
6727     CPU_POWERPC_405GPR             = 0x50910951,
6728 #if 0
6729     CPU_POWERPC_405H               = xxx,
6730 #endif
6731 #if 0
6732     CPU_POWERPC_405L               = xxx,
6733 #endif
6734     CPU_POWERPC_405LP              = 0x41F10000,
6735 #if 0
6736     CPU_POWERPC_405PM              = xxx,
6737 #endif
6738 #if 0
6739     CPU_POWERPC_405PS              = xxx,
6740 #endif
6741 #if 0
6742     CPU_POWERPC_405S               = xxx,
6743 #endif
6744     /* IBM network processors */
6745     CPU_POWERPC_NPE405H            = 0x414100C0,
6746     CPU_POWERPC_NPE405H2           = 0x41410140,
6747     CPU_POWERPC_NPE405L            = 0x416100C0,
6748     CPU_POWERPC_NPE4GS3            = 0x40B10000,
6749 #if 0
6750     CPU_POWERPC_NPCxx1             = xxx,
6751 #endif
6752 #if 0
6753     CPU_POWERPC_NPR161             = xxx,
6754 #endif
6755 #if 0
6756     CPU_POWERPC_LC77700            = xxx,
6757 #endif
6758     /* IBM STBxxx (PowerPC 401/403/405 core based microcontrollers) */
6759 #if 0
6760     CPU_POWERPC_STB01000           = xxx,
6761 #endif
6762 #if 0
6763     CPU_POWERPC_STB01010           = xxx,
6764 #endif
6765 #if 0
6766     CPU_POWERPC_STB0210            = xxx, /* 401B3 */
6767 #endif
6768     CPU_POWERPC_STB03              = 0x40310000, /* 0x40130000 ? */
6769 #if 0
6770     CPU_POWERPC_STB043             = xxx,
6771 #endif
6772 #if 0
6773     CPU_POWERPC_STB045             = xxx,
6774 #endif
6775     CPU_POWERPC_STB04              = 0x41810000,
6776     CPU_POWERPC_STB25              = 0x51510950,
6777 #if 0
6778     CPU_POWERPC_STB130             = xxx,
6779 #endif
6780     /* Xilinx cores */
6781     CPU_POWERPC_X2VP4              = 0x20010820,
6782 #define CPU_POWERPC_X2VP7            CPU_POWERPC_X2VP4
6783     CPU_POWERPC_X2VP20             = 0x20010860,
6784 #define CPU_POWERPC_X2VP50           CPU_POWERPC_X2VP20
6785 #if 0
6786     CPU_POWERPC_ZL10310            = xxx,
6787 #endif
6788 #if 0
6789     CPU_POWERPC_ZL10311            = xxx,
6790 #endif
6791 #if 0
6792     CPU_POWERPC_ZL10320            = xxx,
6793 #endif
6794 #if 0
6795     CPU_POWERPC_ZL10321            = xxx,
6796 #endif
6797     /* PowerPC 440 family */
6798     /* Generic PowerPC 440 */
6799 #define CPU_POWERPC_440              CPU_POWERPC_440GXf
6800     /* PowerPC 440 cores */
6801 #if 0
6802     CPU_POWERPC_440A4              = xxx,
6803 #endif
6804     CPU_POWERPC_440_XILINX         = 0x7ff21910,
6805 #if 0
6806     CPU_POWERPC_440A5              = xxx,
6807 #endif
6808 #if 0
6809     CPU_POWERPC_440B4              = xxx,
6810 #endif
6811 #if 0
6812     CPU_POWERPC_440F5              = xxx,
6813 #endif
6814 #if 0
6815     CPU_POWERPC_440G5              = xxx,
6816 #endif
6817 #if 0
6818     CPU_POWERPC_440H4              = xxx,
6819 #endif
6820 #if 0
6821     CPU_POWERPC_440H6              = xxx,
6822 #endif
6823     /* PowerPC 440 microcontrolers */
6824 #define CPU_POWERPC_440EP            CPU_POWERPC_440EPb
6825     CPU_POWERPC_440EPa             = 0x42221850,
6826     CPU_POWERPC_440EPb             = 0x422218D3,
6827 #define CPU_POWERPC_440GP            CPU_POWERPC_440GPc
6828     CPU_POWERPC_440GPb             = 0x40120440,
6829     CPU_POWERPC_440GPc             = 0x40120481,
6830 #define CPU_POWERPC_440GR            CPU_POWERPC_440GRa
6831 #define CPU_POWERPC_440GRa           CPU_POWERPC_440EPb
6832     CPU_POWERPC_440GRX             = 0x200008D0,
6833 #define CPU_POWERPC_440EPX           CPU_POWERPC_440GRX
6834 #define CPU_POWERPC_440GX            CPU_POWERPC_440GXf
6835     CPU_POWERPC_440GXa             = 0x51B21850,
6836     CPU_POWERPC_440GXb             = 0x51B21851,
6837     CPU_POWERPC_440GXc             = 0x51B21892,
6838     CPU_POWERPC_440GXf             = 0x51B21894,
6839 #if 0
6840     CPU_POWERPC_440S               = xxx,
6841 #endif
6842     CPU_POWERPC_440SP              = 0x53221850,
6843     CPU_POWERPC_440SP2             = 0x53221891,
6844     CPU_POWERPC_440SPE             = 0x53421890,
6845     /* PowerPC 460 family */
6846 #if 0
6847     /* Generic PowerPC 464 */
6848 #define CPU_POWERPC_464              CPU_POWERPC_464H90
6849 #endif
6850     /* PowerPC 464 microcontrolers */
6851 #if 0
6852     CPU_POWERPC_464H90             = xxx,
6853 #endif
6854 #if 0
6855     CPU_POWERPC_464H90FP           = xxx,
6856 #endif
6857     /* Freescale embedded PowerPC cores */
6858     /* PowerPC MPC 5xx cores (aka RCPU) */
6859     CPU_POWERPC_MPC5xx             = 0x00020020,
6860 #define CPU_POWERPC_MGT560           CPU_POWERPC_MPC5xx
6861 #define CPU_POWERPC_MPC509           CPU_POWERPC_MPC5xx
6862 #define CPU_POWERPC_MPC533           CPU_POWERPC_MPC5xx
6863 #define CPU_POWERPC_MPC534           CPU_POWERPC_MPC5xx
6864 #define CPU_POWERPC_MPC555           CPU_POWERPC_MPC5xx
6865 #define CPU_POWERPC_MPC556           CPU_POWERPC_MPC5xx
6866 #define CPU_POWERPC_MPC560           CPU_POWERPC_MPC5xx
6867 #define CPU_POWERPC_MPC561           CPU_POWERPC_MPC5xx
6868 #define CPU_POWERPC_MPC562           CPU_POWERPC_MPC5xx
6869 #define CPU_POWERPC_MPC563           CPU_POWERPC_MPC5xx
6870 #define CPU_POWERPC_MPC564           CPU_POWERPC_MPC5xx
6871 #define CPU_POWERPC_MPC565           CPU_POWERPC_MPC5xx
6872 #define CPU_POWERPC_MPC566           CPU_POWERPC_MPC5xx
6873     /* PowerPC MPC 8xx cores (aka PowerQUICC) */
6874     CPU_POWERPC_MPC8xx             = 0x00500000,
6875 #define CPU_POWERPC_MGT823           CPU_POWERPC_MPC8xx
6876 #define CPU_POWERPC_MPC821           CPU_POWERPC_MPC8xx
6877 #define CPU_POWERPC_MPC823           CPU_POWERPC_MPC8xx
6878 #define CPU_POWERPC_MPC850           CPU_POWERPC_MPC8xx
6879 #define CPU_POWERPC_MPC852T          CPU_POWERPC_MPC8xx
6880 #define CPU_POWERPC_MPC855T          CPU_POWERPC_MPC8xx
6881 #define CPU_POWERPC_MPC857           CPU_POWERPC_MPC8xx
6882 #define CPU_POWERPC_MPC859           CPU_POWERPC_MPC8xx
6883 #define CPU_POWERPC_MPC860           CPU_POWERPC_MPC8xx
6884 #define CPU_POWERPC_MPC862           CPU_POWERPC_MPC8xx
6885 #define CPU_POWERPC_MPC866           CPU_POWERPC_MPC8xx
6886 #define CPU_POWERPC_MPC870           CPU_POWERPC_MPC8xx
6887 #define CPU_POWERPC_MPC875           CPU_POWERPC_MPC8xx
6888 #define CPU_POWERPC_MPC880           CPU_POWERPC_MPC8xx
6889 #define CPU_POWERPC_MPC885           CPU_POWERPC_MPC8xx
6890     /* G2 cores (aka PowerQUICC-II) */
6891     CPU_POWERPC_G2                 = 0x00810011,
6892     CPU_POWERPC_G2H4               = 0x80811010,
6893     CPU_POWERPC_G2gp               = 0x80821010,
6894     CPU_POWERPC_G2ls               = 0x90810010,
6895     CPU_POWERPC_MPC603             = 0x00810100,
6896     CPU_POWERPC_G2_HIP3            = 0x00810101,
6897     CPU_POWERPC_G2_HIP4            = 0x80811014,
6898     /*   G2_LE core (aka PowerQUICC-II) */
6899     CPU_POWERPC_G2LE               = 0x80820010,
6900     CPU_POWERPC_G2LEgp             = 0x80822010,
6901     CPU_POWERPC_G2LEls             = 0xA0822010,
6902     CPU_POWERPC_G2LEgp1            = 0x80822011,
6903     CPU_POWERPC_G2LEgp3            = 0x80822013,
6904     /* MPC52xx microcontrollers  */
6905     /* XXX: MPC 5121 ? */
6906 #define CPU_POWERPC_MPC52xx          CPU_POWERPC_MPC5200
6907 #define CPU_POWERPC_MPC5200          CPU_POWERPC_MPC5200_v12
6908 #define CPU_POWERPC_MPC5200_v10      CPU_POWERPC_G2LEgp1
6909 #define CPU_POWERPC_MPC5200_v11      CPU_POWERPC_G2LEgp1
6910 #define CPU_POWERPC_MPC5200_v12      CPU_POWERPC_G2LEgp1
6911 #define CPU_POWERPC_MPC5200B         CPU_POWERPC_MPC5200B_v21
6912 #define CPU_POWERPC_MPC5200B_v20     CPU_POWERPC_G2LEgp1
6913 #define CPU_POWERPC_MPC5200B_v21     CPU_POWERPC_G2LEgp1
6914     /* MPC82xx microcontrollers */
6915 #define CPU_POWERPC_MPC82xx          CPU_POWERPC_MPC8280
6916 #define CPU_POWERPC_MPC8240          CPU_POWERPC_MPC603
6917 #define CPU_POWERPC_MPC8241          CPU_POWERPC_G2_HIP4
6918 #define CPU_POWERPC_MPC8245          CPU_POWERPC_G2_HIP4
6919 #define CPU_POWERPC_MPC8247          CPU_POWERPC_G2LEgp3
6920 #define CPU_POWERPC_MPC8248          CPU_POWERPC_G2LEgp3
6921 #define CPU_POWERPC_MPC8250          CPU_POWERPC_MPC8250_HiP4
6922 #define CPU_POWERPC_MPC8250_HiP3     CPU_POWERPC_G2_HIP3
6923 #define CPU_POWERPC_MPC8250_HiP4     CPU_POWERPC_G2_HIP4
6924 #define CPU_POWERPC_MPC8255          CPU_POWERPC_MPC8255_HiP4
6925 #define CPU_POWERPC_MPC8255_HiP3     CPU_POWERPC_G2_HIP3
6926 #define CPU_POWERPC_MPC8255_HiP4     CPU_POWERPC_G2_HIP4
6927 #define CPU_POWERPC_MPC8260          CPU_POWERPC_MPC8260_HiP4
6928 #define CPU_POWERPC_MPC8260_HiP3     CPU_POWERPC_G2_HIP3
6929 #define CPU_POWERPC_MPC8260_HiP4     CPU_POWERPC_G2_HIP4
6930 #define CPU_POWERPC_MPC8264          CPU_POWERPC_MPC8264_HiP4
6931 #define CPU_POWERPC_MPC8264_HiP3     CPU_POWERPC_G2_HIP3
6932 #define CPU_POWERPC_MPC8264_HiP4     CPU_POWERPC_G2_HIP4
6933 #define CPU_POWERPC_MPC8265          CPU_POWERPC_MPC8265_HiP4
6934 #define CPU_POWERPC_MPC8265_HiP3     CPU_POWERPC_G2_HIP3
6935 #define CPU_POWERPC_MPC8265_HiP4     CPU_POWERPC_G2_HIP4
6936 #define CPU_POWERPC_MPC8266          CPU_POWERPC_MPC8266_HiP4
6937 #define CPU_POWERPC_MPC8266_HiP3     CPU_POWERPC_G2_HIP3
6938 #define CPU_POWERPC_MPC8266_HiP4     CPU_POWERPC_G2_HIP4
6939 #define CPU_POWERPC_MPC8270          CPU_POWERPC_G2LEgp3
6940 #define CPU_POWERPC_MPC8271          CPU_POWERPC_G2LEgp3
6941 #define CPU_POWERPC_MPC8272          CPU_POWERPC_G2LEgp3
6942 #define CPU_POWERPC_MPC8275          CPU_POWERPC_G2LEgp3
6943 #define CPU_POWERPC_MPC8280          CPU_POWERPC_G2LEgp3
6944     /* e200 family */
6945     /* e200 cores */
6946 #define CPU_POWERPC_e200             CPU_POWERPC_e200z6
6947 #if 0
6948     CPU_POWERPC_e200z0             = xxx,
6949 #endif
6950 #if 0
6951     CPU_POWERPC_e200z1             = xxx,
6952 #endif
6953 #if 0 /* ? */
6954     CPU_POWERPC_e200z3             = 0x81120000,
6955 #endif
6956     CPU_POWERPC_e200z5             = 0x81000000,
6957     CPU_POWERPC_e200z6             = 0x81120000,
6958     /* MPC55xx microcontrollers */
6959 #define CPU_POWERPC_MPC55xx          CPU_POWERPC_MPC5567
6960 #if 0
6961 #define CPU_POWERPC_MPC5514E         CPU_POWERPC_MPC5514E_v1
6962 #define CPU_POWERPC_MPC5514E_v0      CPU_POWERPC_e200z0
6963 #define CPU_POWERPC_MPC5514E_v1      CPU_POWERPC_e200z1
6964 #define CPU_POWERPC_MPC5514G         CPU_POWERPC_MPC5514G_v1
6965 #define CPU_POWERPC_MPC5514G_v0      CPU_POWERPC_e200z0
6966 #define CPU_POWERPC_MPC5514G_v1      CPU_POWERPC_e200z1
6967 #define CPU_POWERPC_MPC5515S         CPU_POWERPC_e200z1
6968 #define CPU_POWERPC_MPC5516E         CPU_POWERPC_MPC5516E_v1
6969 #define CPU_POWERPC_MPC5516E_v0      CPU_POWERPC_e200z0
6970 #define CPU_POWERPC_MPC5516E_v1      CPU_POWERPC_e200z1
6971 #define CPU_POWERPC_MPC5516G         CPU_POWERPC_MPC5516G_v1
6972 #define CPU_POWERPC_MPC5516G_v0      CPU_POWERPC_e200z0
6973 #define CPU_POWERPC_MPC5516G_v1      CPU_POWERPC_e200z1
6974 #define CPU_POWERPC_MPC5516S         CPU_POWERPC_e200z1
6975 #endif
6976 #if 0
6977 #define CPU_POWERPC_MPC5533          CPU_POWERPC_e200z3
6978 #define CPU_POWERPC_MPC5534          CPU_POWERPC_e200z3
6979 #endif
6980 #define CPU_POWERPC_MPC5553          CPU_POWERPC_e200z6
6981 #define CPU_POWERPC_MPC5554          CPU_POWERPC_e200z6
6982 #define CPU_POWERPC_MPC5561          CPU_POWERPC_e200z6
6983 #define CPU_POWERPC_MPC5565          CPU_POWERPC_e200z6
6984 #define CPU_POWERPC_MPC5566          CPU_POWERPC_e200z6
6985 #define CPU_POWERPC_MPC5567          CPU_POWERPC_e200z6
6986     /* e300 family */
6987     /* e300 cores */
6988 #define CPU_POWERPC_e300             CPU_POWERPC_e300c3
6989     CPU_POWERPC_e300c1             = 0x00830010,
6990     CPU_POWERPC_e300c2             = 0x00840010,
6991     CPU_POWERPC_e300c3             = 0x00850010,
6992     CPU_POWERPC_e300c4             = 0x00860010,
6993     /* MPC83xx microcontrollers */
6994 #define CPU_POWERPC_MPC831x          CPU_POWERPC_e300c3
6995 #define CPU_POWERPC_MPC832x          CPU_POWERPC_e300c2
6996 #define CPU_POWERPC_MPC834x          CPU_POWERPC_e300c1
6997 #define CPU_POWERPC_MPC835x          CPU_POWERPC_e300c1
6998 #define CPU_POWERPC_MPC836x          CPU_POWERPC_e300c1
6999 #define CPU_POWERPC_MPC837x          CPU_POWERPC_e300c4
7000     /* e500 family */
7001     /* e500 cores  */
7002 #define CPU_POWERPC_e500             CPU_POWERPC_e500v2_v22
7003 #define CPU_POWERPC_e500v1           CPU_POWERPC_e500v1_v20
7004 #define CPU_POWERPC_e500v2           CPU_POWERPC_e500v2_v22
7005     CPU_POWERPC_e500v1_v10         = 0x80200010,
7006     CPU_POWERPC_e500v1_v20         = 0x80200020,
7007     CPU_POWERPC_e500v2_v10         = 0x80210010,
7008     CPU_POWERPC_e500v2_v11         = 0x80210011,
7009     CPU_POWERPC_e500v2_v20         = 0x80210020,
7010     CPU_POWERPC_e500v2_v21         = 0x80210021,
7011     CPU_POWERPC_e500v2_v22         = 0x80210022,
7012     CPU_POWERPC_e500v2_v30         = 0x80210030,
7013     /* MPC85xx microcontrollers */
7014 #define CPU_POWERPC_MPC8533          CPU_POWERPC_MPC8533_v11
7015 #define CPU_POWERPC_MPC8533_v10      CPU_POWERPC_e500v2_v21
7016 #define CPU_POWERPC_MPC8533_v11      CPU_POWERPC_e500v2_v22
7017 #define CPU_POWERPC_MPC8533E         CPU_POWERPC_MPC8533E_v11
7018 #define CPU_POWERPC_MPC8533E_v10     CPU_POWERPC_e500v2_v21
7019 #define CPU_POWERPC_MPC8533E_v11     CPU_POWERPC_e500v2_v22
7020 #define CPU_POWERPC_MPC8540          CPU_POWERPC_MPC8540_v21
7021 #define CPU_POWERPC_MPC8540_v10      CPU_POWERPC_e500v1_v10
7022 #define CPU_POWERPC_MPC8540_v20      CPU_POWERPC_e500v1_v20
7023 #define CPU_POWERPC_MPC8540_v21      CPU_POWERPC_e500v1_v20
7024 #define CPU_POWERPC_MPC8541          CPU_POWERPC_MPC8541_v11
7025 #define CPU_POWERPC_MPC8541_v10      CPU_POWERPC_e500v1_v20
7026 #define CPU_POWERPC_MPC8541_v11      CPU_POWERPC_e500v1_v20
7027 #define CPU_POWERPC_MPC8541E         CPU_POWERPC_MPC8541E_v11
7028 #define CPU_POWERPC_MPC8541E_v10     CPU_POWERPC_e500v1_v20
7029 #define CPU_POWERPC_MPC8541E_v11     CPU_POWERPC_e500v1_v20
7030 #define CPU_POWERPC_MPC8543          CPU_POWERPC_MPC8543_v21
7031 #define CPU_POWERPC_MPC8543_v10      CPU_POWERPC_e500v2_v10
7032 #define CPU_POWERPC_MPC8543_v11      CPU_POWERPC_e500v2_v11
7033 #define CPU_POWERPC_MPC8543_v20      CPU_POWERPC_e500v2_v20
7034 #define CPU_POWERPC_MPC8543_v21      CPU_POWERPC_e500v2_v21
7035 #define CPU_POWERPC_MPC8543E         CPU_POWERPC_MPC8543E_v21
7036 #define CPU_POWERPC_MPC8543E_v10     CPU_POWERPC_e500v2_v10
7037 #define CPU_POWERPC_MPC8543E_v11     CPU_POWERPC_e500v2_v11
7038 #define CPU_POWERPC_MPC8543E_v20     CPU_POWERPC_e500v2_v20
7039 #define CPU_POWERPC_MPC8543E_v21     CPU_POWERPC_e500v2_v21
7040 #define CPU_POWERPC_MPC8544          CPU_POWERPC_MPC8544_v11
7041 #define CPU_POWERPC_MPC8544_v10      CPU_POWERPC_e500v2_v21
7042 #define CPU_POWERPC_MPC8544_v11      CPU_POWERPC_e500v2_v22
7043 #define CPU_POWERPC_MPC8544E_v11     CPU_POWERPC_e500v2_v22
7044 #define CPU_POWERPC_MPC8544E         CPU_POWERPC_MPC8544E_v11
7045 #define CPU_POWERPC_MPC8544E_v10     CPU_POWERPC_e500v2_v21
7046 #define CPU_POWERPC_MPC8545          CPU_POWERPC_MPC8545_v21
7047 #define CPU_POWERPC_MPC8545_v10      CPU_POWERPC_e500v2_v10
7048 #define CPU_POWERPC_MPC8545_v20      CPU_POWERPC_e500v2_v20
7049 #define CPU_POWERPC_MPC8545_v21      CPU_POWERPC_e500v2_v21
7050 #define CPU_POWERPC_MPC8545E         CPU_POWERPC_MPC8545E_v21
7051 #define CPU_POWERPC_MPC8545E_v10     CPU_POWERPC_e500v2_v10
7052 #define CPU_POWERPC_MPC8545E_v20     CPU_POWERPC_e500v2_v20
7053 #define CPU_POWERPC_MPC8545E_v21     CPU_POWERPC_e500v2_v21
7054 #define CPU_POWERPC_MPC8547E         CPU_POWERPC_MPC8545E_v21
7055 #define CPU_POWERPC_MPC8547E_v10     CPU_POWERPC_e500v2_v10
7056 #define CPU_POWERPC_MPC8547E_v20     CPU_POWERPC_e500v2_v20
7057 #define CPU_POWERPC_MPC8547E_v21     CPU_POWERPC_e500v2_v21
7058 #define CPU_POWERPC_MPC8548          CPU_POWERPC_MPC8548_v21
7059 #define CPU_POWERPC_MPC8548_v10      CPU_POWERPC_e500v2_v10
7060 #define CPU_POWERPC_MPC8548_v11      CPU_POWERPC_e500v2_v11
7061 #define CPU_POWERPC_MPC8548_v20      CPU_POWERPC_e500v2_v20
7062 #define CPU_POWERPC_MPC8548_v21      CPU_POWERPC_e500v2_v21
7063 #define CPU_POWERPC_MPC8548E         CPU_POWERPC_MPC8548E_v21
7064 #define CPU_POWERPC_MPC8548E_v10     CPU_POWERPC_e500v2_v10
7065 #define CPU_POWERPC_MPC8548E_v11     CPU_POWERPC_e500v2_v11
7066 #define CPU_POWERPC_MPC8548E_v20     CPU_POWERPC_e500v2_v20
7067 #define CPU_POWERPC_MPC8548E_v21     CPU_POWERPC_e500v2_v21
7068 #define CPU_POWERPC_MPC8555          CPU_POWERPC_MPC8555_v11
7069 #define CPU_POWERPC_MPC8555_v10      CPU_POWERPC_e500v2_v10
7070 #define CPU_POWERPC_MPC8555_v11      CPU_POWERPC_e500v2_v11
7071 #define CPU_POWERPC_MPC8555E         CPU_POWERPC_MPC8555E_v11
7072 #define CPU_POWERPC_MPC8555E_v10     CPU_POWERPC_e500v2_v10
7073 #define CPU_POWERPC_MPC8555E_v11     CPU_POWERPC_e500v2_v11
7074 #define CPU_POWERPC_MPC8560          CPU_POWERPC_MPC8560_v21
7075 #define CPU_POWERPC_MPC8560_v10      CPU_POWERPC_e500v2_v10
7076 #define CPU_POWERPC_MPC8560_v20      CPU_POWERPC_e500v2_v20
7077 #define CPU_POWERPC_MPC8560_v21      CPU_POWERPC_e500v2_v21
7078 #define CPU_POWERPC_MPC8567          CPU_POWERPC_e500v2_v22
7079 #define CPU_POWERPC_MPC8567E         CPU_POWERPC_e500v2_v22
7080 #define CPU_POWERPC_MPC8568          CPU_POWERPC_e500v2_v22
7081 #define CPU_POWERPC_MPC8568E         CPU_POWERPC_e500v2_v22
7082 #define CPU_POWERPC_MPC8572          CPU_POWERPC_e500v2_v30
7083 #define CPU_POWERPC_MPC8572E         CPU_POWERPC_e500v2_v30
7084     /* e600 family */
7085     /* e600 cores */
7086     CPU_POWERPC_e600               = 0x80040010,
7087     /* MPC86xx microcontrollers */
7088 #define CPU_POWERPC_MPC8610          CPU_POWERPC_e600
7089 #define CPU_POWERPC_MPC8641          CPU_POWERPC_e600
7090 #define CPU_POWERPC_MPC8641D         CPU_POWERPC_e600
7091     /* PowerPC 6xx cores */
7092 #define CPU_POWERPC_601              CPU_POWERPC_601_v2
7093     CPU_POWERPC_601_v0             = 0x00010001,
7094     CPU_POWERPC_601_v1             = 0x00010001,
7095 #define CPU_POWERPC_601v             CPU_POWERPC_601_v2
7096     CPU_POWERPC_601_v2             = 0x00010002,
7097     CPU_POWERPC_602                = 0x00050100,
7098     CPU_POWERPC_603                = 0x00030100,
7099 #define CPU_POWERPC_603E             CPU_POWERPC_603E_v41
7100     CPU_POWERPC_603E_v11           = 0x00060101,
7101     CPU_POWERPC_603E_v12           = 0x00060102,
7102     CPU_POWERPC_603E_v13           = 0x00060103,
7103     CPU_POWERPC_603E_v14           = 0x00060104,
7104     CPU_POWERPC_603E_v22           = 0x00060202,
7105     CPU_POWERPC_603E_v3            = 0x00060300,
7106     CPU_POWERPC_603E_v4            = 0x00060400,
7107     CPU_POWERPC_603E_v41           = 0x00060401,
7108     CPU_POWERPC_603E7t             = 0x00071201,
7109     CPU_POWERPC_603E7v             = 0x00070100,
7110     CPU_POWERPC_603E7v1            = 0x00070101,
7111     CPU_POWERPC_603E7v2            = 0x00070201,
7112     CPU_POWERPC_603E7              = 0x00070200,
7113     CPU_POWERPC_603P               = 0x00070000,
7114 #define CPU_POWERPC_603R             CPU_POWERPC_603E7t
7115     /* XXX: missing 0x00040303 (604) */
7116     CPU_POWERPC_604                = 0x00040103,
7117 #define CPU_POWERPC_604E             CPU_POWERPC_604E_v24
7118     /* XXX: missing 0x00091203 */
7119     /* XXX: missing 0x00092110 */
7120     /* XXX: missing 0x00092120 */
7121     CPU_POWERPC_604E_v10           = 0x00090100,
7122     CPU_POWERPC_604E_v22           = 0x00090202,
7123     CPU_POWERPC_604E_v24           = 0x00090204,
7124     /* XXX: missing 0x000a0100 */
7125     /* XXX: missing 0x00093102 */
7126     CPU_POWERPC_604R               = 0x000a0101,
7127 #if 0
7128     CPU_POWERPC_604EV              = xxx, /* XXX: same as 604R ? */
7129 #endif
7130     /* PowerPC 740/750 cores (aka G3) */
7131     /* XXX: missing 0x00084202 */
7132 #define CPU_POWERPC_7x0              CPU_POWERPC_7x0_v31
7133     CPU_POWERPC_7x0_v10            = 0x00080100,
7134     CPU_POWERPC_7x0_v20            = 0x00080200,
7135     CPU_POWERPC_7x0_v21            = 0x00080201,
7136     CPU_POWERPC_7x0_v22            = 0x00080202,
7137     CPU_POWERPC_7x0_v30            = 0x00080300,
7138     CPU_POWERPC_7x0_v31            = 0x00080301,
7139     CPU_POWERPC_740E               = 0x00080100,
7140     CPU_POWERPC_750E               = 0x00080200,
7141     CPU_POWERPC_7x0P               = 0x10080000,
7142     /* XXX: missing 0x00087010 (CL ?) */
7143 #define CPU_POWERPC_750CL            CPU_POWERPC_750CL_v20
7144     CPU_POWERPC_750CL_v10          = 0x00087200,
7145     CPU_POWERPC_750CL_v20          = 0x00087210, /* aka rev E */
7146 #define CPU_POWERPC_750CX            CPU_POWERPC_750CX_v22
7147     CPU_POWERPC_750CX_v10          = 0x00082100,
7148     CPU_POWERPC_750CX_v20          = 0x00082200,
7149     CPU_POWERPC_750CX_v21          = 0x00082201,
7150     CPU_POWERPC_750CX_v22          = 0x00082202,
7151 #define CPU_POWERPC_750CXE           CPU_POWERPC_750CXE_v31b
7152     CPU_POWERPC_750CXE_v21         = 0x00082211,
7153     CPU_POWERPC_750CXE_v22         = 0x00082212,
7154     CPU_POWERPC_750CXE_v23         = 0x00082213,
7155     CPU_POWERPC_750CXE_v24         = 0x00082214,
7156     CPU_POWERPC_750CXE_v24b        = 0x00083214,
7157     CPU_POWERPC_750CXE_v30         = 0x00082310,
7158     CPU_POWERPC_750CXE_v31         = 0x00082311,
7159     CPU_POWERPC_750CXE_v31b        = 0x00083311,
7160     CPU_POWERPC_750CXR             = 0x00083410,
7161     CPU_POWERPC_750FL              = 0x70000203,
7162 #define CPU_POWERPC_750FX            CPU_POWERPC_750FX_v23
7163     CPU_POWERPC_750FX_v10          = 0x70000100,
7164     CPU_POWERPC_750FX_v20          = 0x70000200,
7165     CPU_POWERPC_750FX_v21          = 0x70000201,
7166     CPU_POWERPC_750FX_v22          = 0x70000202,
7167     CPU_POWERPC_750FX_v23          = 0x70000203,
7168     CPU_POWERPC_750GL              = 0x70020102,
7169 #define CPU_POWERPC_750GX            CPU_POWERPC_750GX_v12
7170     CPU_POWERPC_750GX_v10          = 0x70020100,
7171     CPU_POWERPC_750GX_v11          = 0x70020101,
7172     CPU_POWERPC_750GX_v12          = 0x70020102,
7173 #define CPU_POWERPC_750L             CPU_POWERPC_750L_v32 /* Aka LoneStar */
7174     CPU_POWERPC_750L_v20           = 0x00088200,
7175     CPU_POWERPC_750L_v21           = 0x00088201,
7176     CPU_POWERPC_750L_v22           = 0x00088202,
7177     CPU_POWERPC_750L_v30           = 0x00088300,
7178     CPU_POWERPC_750L_v32           = 0x00088302,
7179     /* PowerPC 745/755 cores */
7180 #define CPU_POWERPC_7x5              CPU_POWERPC_7x5_v28
7181     CPU_POWERPC_7x5_v10            = 0x00083100,
7182     CPU_POWERPC_7x5_v11            = 0x00083101,
7183     CPU_POWERPC_7x5_v20            = 0x00083200,
7184     CPU_POWERPC_7x5_v21            = 0x00083201,
7185     CPU_POWERPC_7x5_v22            = 0x00083202, /* aka D */
7186     CPU_POWERPC_7x5_v23            = 0x00083203, /* aka E */
7187     CPU_POWERPC_7x5_v24            = 0x00083204,
7188     CPU_POWERPC_7x5_v25            = 0x00083205,
7189     CPU_POWERPC_7x5_v26            = 0x00083206,
7190     CPU_POWERPC_7x5_v27            = 0x00083207,
7191     CPU_POWERPC_7x5_v28            = 0x00083208,
7192 #if 0
7193     CPU_POWERPC_7x5P               = xxx,
7194 #endif
7195     /* PowerPC 74xx cores (aka G4) */
7196     /* XXX: missing 0x000C1101 */
7197 #define CPU_POWERPC_7400             CPU_POWERPC_7400_v29
7198     CPU_POWERPC_7400_v10           = 0x000C0100,
7199     CPU_POWERPC_7400_v11           = 0x000C0101,
7200     CPU_POWERPC_7400_v20           = 0x000C0200,
7201     CPU_POWERPC_7400_v21           = 0x000C0201,
7202     CPU_POWERPC_7400_v22           = 0x000C0202,
7203     CPU_POWERPC_7400_v26           = 0x000C0206,
7204     CPU_POWERPC_7400_v27           = 0x000C0207,
7205     CPU_POWERPC_7400_v28           = 0x000C0208,
7206     CPU_POWERPC_7400_v29           = 0x000C0209,
7207 #define CPU_POWERPC_7410             CPU_POWERPC_7410_v14
7208     CPU_POWERPC_7410_v10           = 0x800C1100,
7209     CPU_POWERPC_7410_v11           = 0x800C1101,
7210     CPU_POWERPC_7410_v12           = 0x800C1102, /* aka C */
7211     CPU_POWERPC_7410_v13           = 0x800C1103, /* aka D */
7212     CPU_POWERPC_7410_v14           = 0x800C1104, /* aka E */
7213 #define CPU_POWERPC_7448             CPU_POWERPC_7448_v21
7214     CPU_POWERPC_7448_v10           = 0x80040100,
7215     CPU_POWERPC_7448_v11           = 0x80040101,
7216     CPU_POWERPC_7448_v20           = 0x80040200,
7217     CPU_POWERPC_7448_v21           = 0x80040201,
7218 #define CPU_POWERPC_7450             CPU_POWERPC_7450_v21
7219     CPU_POWERPC_7450_v10           = 0x80000100,
7220     CPU_POWERPC_7450_v11           = 0x80000101,
7221     CPU_POWERPC_7450_v12           = 0x80000102,
7222     CPU_POWERPC_7450_v20           = 0x80000200, /* aka A, B, C, D: 2.04 */
7223     CPU_POWERPC_7450_v21           = 0x80000201, /* aka E */
7224 #define CPU_POWERPC_74x1             CPU_POWERPC_74x1_v23
7225     CPU_POWERPC_74x1_v23           = 0x80000203, /* aka G: 2.3 */
7226     /* XXX: this entry might be a bug in some documentation */
7227     CPU_POWERPC_74x1_v210          = 0x80000210, /* aka G: 2.3 ? */
7228 #define CPU_POWERPC_74x5             CPU_POWERPC_74x5_v32
7229     CPU_POWERPC_74x5_v10           = 0x80010100,
7230     /* XXX: missing 0x80010200 */
7231     CPU_POWERPC_74x5_v21           = 0x80010201, /* aka C: 2.1 */
7232     CPU_POWERPC_74x5_v32           = 0x80010302,
7233     CPU_POWERPC_74x5_v33           = 0x80010303, /* aka F: 3.3 */
7234     CPU_POWERPC_74x5_v34           = 0x80010304, /* aka G: 3.4 */
7235 #define CPU_POWERPC_74x7             CPU_POWERPC_74x7_v12
7236     CPU_POWERPC_74x7_v10           = 0x80020100, /* aka A: 1.0 */
7237     CPU_POWERPC_74x7_v11           = 0x80020101, /* aka B: 1.1 */
7238     CPU_POWERPC_74x7_v12           = 0x80020102, /* aka C: 1.2 */
7239 #define CPU_POWERPC_74x7A            CPU_POWERPC_74x7A_v12
7240     CPU_POWERPC_74x7A_v10          = 0x80030100, /* aka A: 1.0 */
7241     CPU_POWERPC_74x7A_v11          = 0x80030101, /* aka B: 1.1 */
7242     CPU_POWERPC_74x7A_v12          = 0x80030102, /* aka C: 1.2 */
7243     /* 64 bits PowerPC */
7244 #if defined(TARGET_PPC64)
7245     CPU_POWERPC_620                = 0x00140000,
7246     CPU_POWERPC_630                = 0x00400000,
7247     CPU_POWERPC_631                = 0x00410104,
7248     CPU_POWERPC_POWER4             = 0x00350000,
7249     CPU_POWERPC_POWER4P            = 0x00380000,
7250      /* XXX: missing 0x003A0201 */
7251     CPU_POWERPC_POWER5             = 0x003A0203,
7252 #define CPU_POWERPC_POWER5GR         CPU_POWERPC_POWER5
7253     CPU_POWERPC_POWER5P            = 0x003B0000,
7254 #define CPU_POWERPC_POWER5GS         CPU_POWERPC_POWER5P
7255     CPU_POWERPC_POWER6             = 0x003E0000,
7256     CPU_POWERPC_POWER6_5           = 0x0F000001, /* POWER6 in POWER5 mode */
7257     CPU_POWERPC_POWER6A            = 0x0F000002,
7258 #define CPU_POWERPC_POWER7           CPU_POWERPC_POWER7_v20
7259     CPU_POWERPC_POWER7_v20         = 0x003F0200,
7260     CPU_POWERPC_970                = 0x00390202,
7261 #define CPU_POWERPC_970FX            CPU_POWERPC_970FX_v31
7262     CPU_POWERPC_970FX_v10          = 0x00391100,
7263     CPU_POWERPC_970FX_v20          = 0x003C0200,
7264     CPU_POWERPC_970FX_v21          = 0x003C0201,
7265     CPU_POWERPC_970FX_v30          = 0x003C0300,
7266     CPU_POWERPC_970FX_v31          = 0x003C0301,
7267     CPU_POWERPC_970GX              = 0x00450000,
7268 #define CPU_POWERPC_970MP            CPU_POWERPC_970MP_v11
7269     CPU_POWERPC_970MP_v10          = 0x00440100,
7270     CPU_POWERPC_970MP_v11          = 0x00440101,
7271 #define CPU_POWERPC_CELL             CPU_POWERPC_CELL_v32
7272     CPU_POWERPC_CELL_v10           = 0x00700100,
7273     CPU_POWERPC_CELL_v20           = 0x00700400,
7274     CPU_POWERPC_CELL_v30           = 0x00700500,
7275     CPU_POWERPC_CELL_v31           = 0x00700501,
7276 #define CPU_POWERPC_CELL_v32         CPU_POWERPC_CELL_v31
7277     CPU_POWERPC_RS64               = 0x00330000,
7278     CPU_POWERPC_RS64II             = 0x00340000,
7279     CPU_POWERPC_RS64III            = 0x00360000,
7280     CPU_POWERPC_RS64IV             = 0x00370000,
7281 #endif /* defined(TARGET_PPC64) */
7282     /* Original POWER */
7283     /* XXX: should be POWER (RIOS), RSC3308, RSC4608,
7284      * POWER2 (RIOS2) & RSC2 (P2SC) here
7285      */
7286 #if 0
7287     CPU_POWER                      = xxx, /* 0x20000 ? 0x30000 for RSC ? */
7288 #endif
7289 #if 0
7290     CPU_POWER2                     = xxx, /* 0x40000 ? */
7291 #endif
7292     /* PA Semi core */
7293     CPU_POWERPC_PA6T               = 0x00900000,
7294 };
7295
7296 /* System version register (used on MPC 8xxx)                                */
7297 enum {
7298     POWERPC_SVR_NONE               = 0x00000000,
7299 #define POWERPC_SVR_52xx             POWERPC_SVR_5200
7300 #define POWERPC_SVR_5200             POWERPC_SVR_5200_v12
7301     POWERPC_SVR_5200_v10           = 0x80110010,
7302     POWERPC_SVR_5200_v11           = 0x80110011,
7303     POWERPC_SVR_5200_v12           = 0x80110012,
7304 #define POWERPC_SVR_5200B            POWERPC_SVR_5200B_v21
7305     POWERPC_SVR_5200B_v20          = 0x80110020,
7306     POWERPC_SVR_5200B_v21          = 0x80110021,
7307 #define POWERPC_SVR_55xx             POWERPC_SVR_5567
7308 #if 0
7309     POWERPC_SVR_5533               = xxx,
7310 #endif
7311 #if 0
7312     POWERPC_SVR_5534               = xxx,
7313 #endif
7314 #if 0
7315     POWERPC_SVR_5553               = xxx,
7316 #endif
7317 #if 0
7318     POWERPC_SVR_5554               = xxx,
7319 #endif
7320 #if 0
7321     POWERPC_SVR_5561               = xxx,
7322 #endif
7323 #if 0
7324     POWERPC_SVR_5565               = xxx,
7325 #endif
7326 #if 0
7327     POWERPC_SVR_5566               = xxx,
7328 #endif
7329 #if 0
7330     POWERPC_SVR_5567               = xxx,
7331 #endif
7332 #if 0
7333     POWERPC_SVR_8313               = xxx,
7334 #endif
7335 #if 0
7336     POWERPC_SVR_8313E              = xxx,
7337 #endif
7338 #if 0
7339     POWERPC_SVR_8314               = xxx,
7340 #endif
7341 #if 0
7342     POWERPC_SVR_8314E              = xxx,
7343 #endif
7344 #if 0
7345     POWERPC_SVR_8315               = xxx,
7346 #endif
7347 #if 0
7348     POWERPC_SVR_8315E              = xxx,
7349 #endif
7350 #if 0
7351     POWERPC_SVR_8321               = xxx,
7352 #endif
7353 #if 0
7354     POWERPC_SVR_8321E              = xxx,
7355 #endif
7356 #if 0
7357     POWERPC_SVR_8323               = xxx,
7358 #endif
7359 #if 0
7360     POWERPC_SVR_8323E              = xxx,
7361 #endif
7362     POWERPC_SVR_8343               = 0x80570010,
7363     POWERPC_SVR_8343A              = 0x80570030,
7364     POWERPC_SVR_8343E              = 0x80560010,
7365     POWERPC_SVR_8343EA             = 0x80560030,
7366 #define POWERPC_SVR_8347             POWERPC_SVR_8347T
7367     POWERPC_SVR_8347P              = 0x80550010, /* PBGA package */
7368     POWERPC_SVR_8347T              = 0x80530010, /* TBGA package */
7369 #define POWERPC_SVR_8347A            POWERPC_SVR_8347AT
7370     POWERPC_SVR_8347AP             = 0x80550030, /* PBGA package */
7371     POWERPC_SVR_8347AT             = 0x80530030, /* TBGA package */
7372 #define POWERPC_SVR_8347E            POWERPC_SVR_8347ET
7373     POWERPC_SVR_8347EP             = 0x80540010, /* PBGA package */
7374     POWERPC_SVR_8347ET             = 0x80520010, /* TBGA package */
7375 #define POWERPC_SVR_8347EA            POWERPC_SVR_8347EAT
7376     POWERPC_SVR_8347EAP            = 0x80540030, /* PBGA package */
7377     POWERPC_SVR_8347EAT            = 0x80520030, /* TBGA package */
7378     POWERPC_SVR_8349               = 0x80510010,
7379     POWERPC_SVR_8349A              = 0x80510030,
7380     POWERPC_SVR_8349E              = 0x80500010,
7381     POWERPC_SVR_8349EA             = 0x80500030,
7382 #if 0
7383     POWERPC_SVR_8358E              = xxx,
7384 #endif
7385 #if 0
7386     POWERPC_SVR_8360E              = xxx,
7387 #endif
7388 #define POWERPC_SVR_E500             0x40000000
7389     POWERPC_SVR_8377               = 0x80C70010 | POWERPC_SVR_E500,
7390     POWERPC_SVR_8377E              = 0x80C60010 | POWERPC_SVR_E500,
7391     POWERPC_SVR_8378               = 0x80C50010 | POWERPC_SVR_E500,
7392     POWERPC_SVR_8378E              = 0x80C40010 | POWERPC_SVR_E500,
7393     POWERPC_SVR_8379               = 0x80C30010 | POWERPC_SVR_E500,
7394     POWERPC_SVR_8379E              = 0x80C00010 | POWERPC_SVR_E500,
7395 #define POWERPC_SVR_8533             POWERPC_SVR_8533_v11
7396     POWERPC_SVR_8533_v10           = 0x80340010 | POWERPC_SVR_E500,
7397     POWERPC_SVR_8533_v11           = 0x80340011 | POWERPC_SVR_E500,
7398 #define POWERPC_SVR_8533E            POWERPC_SVR_8533E_v11
7399     POWERPC_SVR_8533E_v10          = 0x803C0010 | POWERPC_SVR_E500,
7400     POWERPC_SVR_8533E_v11          = 0x803C0011 | POWERPC_SVR_E500,
7401 #define POWERPC_SVR_8540             POWERPC_SVR_8540_v21
7402     POWERPC_SVR_8540_v10           = 0x80300010 | POWERPC_SVR_E500,
7403     POWERPC_SVR_8540_v20           = 0x80300020 | POWERPC_SVR_E500,
7404     POWERPC_SVR_8540_v21           = 0x80300021 | POWERPC_SVR_E500,
7405 #define POWERPC_SVR_8541             POWERPC_SVR_8541_v11
7406     POWERPC_SVR_8541_v10           = 0x80720010 | POWERPC_SVR_E500,
7407     POWERPC_SVR_8541_v11           = 0x80720011 | POWERPC_SVR_E500,
7408 #define POWERPC_SVR_8541E            POWERPC_SVR_8541E_v11
7409     POWERPC_SVR_8541E_v10          = 0x807A0010 | POWERPC_SVR_E500,
7410     POWERPC_SVR_8541E_v11          = 0x807A0011 | POWERPC_SVR_E500,
7411 #define POWERPC_SVR_8543             POWERPC_SVR_8543_v21
7412     POWERPC_SVR_8543_v10           = 0x80320010 | POWERPC_SVR_E500,
7413     POWERPC_SVR_8543_v11           = 0x80320011 | POWERPC_SVR_E500,
7414     POWERPC_SVR_8543_v20           = 0x80320020 | POWERPC_SVR_E500,
7415     POWERPC_SVR_8543_v21           = 0x80320021 | POWERPC_SVR_E500,
7416 #define POWERPC_SVR_8543E            POWERPC_SVR_8543E_v21
7417     POWERPC_SVR_8543E_v10          = 0x803A0010 | POWERPC_SVR_E500,
7418     POWERPC_SVR_8543E_v11          = 0x803A0011 | POWERPC_SVR_E500,
7419     POWERPC_SVR_8543E_v20          = 0x803A0020 | POWERPC_SVR_E500,
7420     POWERPC_SVR_8543E_v21          = 0x803A0021 | POWERPC_SVR_E500,
7421 #define POWERPC_SVR_8544             POWERPC_SVR_8544_v11
7422     POWERPC_SVR_8544_v10           = 0x80340110 | POWERPC_SVR_E500,
7423     POWERPC_SVR_8544_v11           = 0x80340111 | POWERPC_SVR_E500,
7424 #define POWERPC_SVR_8544E            POWERPC_SVR_8544E_v11
7425     POWERPC_SVR_8544E_v10          = 0x803C0110 | POWERPC_SVR_E500,
7426     POWERPC_SVR_8544E_v11          = 0x803C0111 | POWERPC_SVR_E500,
7427 #define POWERPC_SVR_8545             POWERPC_SVR_8545_v21
7428     POWERPC_SVR_8545_v20           = 0x80310220 | POWERPC_SVR_E500,
7429     POWERPC_SVR_8545_v21           = 0x80310221 | POWERPC_SVR_E500,
7430 #define POWERPC_SVR_8545E            POWERPC_SVR_8545E_v21
7431     POWERPC_SVR_8545E_v20          = 0x80390220 | POWERPC_SVR_E500,
7432     POWERPC_SVR_8545E_v21          = 0x80390221 | POWERPC_SVR_E500,
7433 #define POWERPC_SVR_8547E            POWERPC_SVR_8547E_v21
7434     POWERPC_SVR_8547E_v20          = 0x80390120 | POWERPC_SVR_E500,
7435     POWERPC_SVR_8547E_v21          = 0x80390121 | POWERPC_SVR_E500,
7436 #define POWERPC_SVR_8548             POWERPC_SVR_8548_v21
7437     POWERPC_SVR_8548_v10           = 0x80310010 | POWERPC_SVR_E500,
7438     POWERPC_SVR_8548_v11           = 0x80310011 | POWERPC_SVR_E500,
7439     POWERPC_SVR_8548_v20           = 0x80310020 | POWERPC_SVR_E500,
7440     POWERPC_SVR_8548_v21           = 0x80310021 | POWERPC_SVR_E500,
7441 #define POWERPC_SVR_8548E            POWERPC_SVR_8548E_v21
7442     POWERPC_SVR_8548E_v10          = 0x80390010 | POWERPC_SVR_E500,
7443     POWERPC_SVR_8548E_v11          = 0x80390011 | POWERPC_SVR_E500,
7444     POWERPC_SVR_8548E_v20          = 0x80390020 | POWERPC_SVR_E500,
7445     POWERPC_SVR_8548E_v21          = 0x80390021 | POWERPC_SVR_E500,
7446 #define POWERPC_SVR_8555             POWERPC_SVR_8555_v11
7447     POWERPC_SVR_8555_v10           = 0x80710010 | POWERPC_SVR_E500,
7448     POWERPC_SVR_8555_v11           = 0x80710011 | POWERPC_SVR_E500,
7449 #define POWERPC_SVR_8555E            POWERPC_SVR_8555_v11
7450     POWERPC_SVR_8555E_v10          = 0x80790010 | POWERPC_SVR_E500,
7451     POWERPC_SVR_8555E_v11          = 0x80790011 | POWERPC_SVR_E500,
7452 #define POWERPC_SVR_8560             POWERPC_SVR_8560_v21
7453     POWERPC_SVR_8560_v10           = 0x80700010 | POWERPC_SVR_E500,
7454     POWERPC_SVR_8560_v20           = 0x80700020 | POWERPC_SVR_E500,
7455     POWERPC_SVR_8560_v21           = 0x80700021 | POWERPC_SVR_E500,
7456     POWERPC_SVR_8567               = 0x80750111 | POWERPC_SVR_E500,
7457     POWERPC_SVR_8567E              = 0x807D0111 | POWERPC_SVR_E500,
7458     POWERPC_SVR_8568               = 0x80750011 | POWERPC_SVR_E500,
7459     POWERPC_SVR_8568E              = 0x807D0011 | POWERPC_SVR_E500,
7460     POWERPC_SVR_8572               = 0x80E00010 | POWERPC_SVR_E500,
7461     POWERPC_SVR_8572E              = 0x80E80010 | POWERPC_SVR_E500,
7462 #if 0
7463     POWERPC_SVR_8610               = xxx,
7464 #endif
7465     POWERPC_SVR_8641               = 0x80900021,
7466     POWERPC_SVR_8641D              = 0x80900121,
7467 };
7468
7469 /*****************************************************************************/
7470 /* PowerPC CPU definitions                                                   */
7471 #define POWERPC_DEF_SVR(_name, _pvr, _svr, _type)                             \
7472     {                                                                         \
7473         .name         = _name,                                                \
7474         .pvr          = _pvr,                                                 \
7475         .svr          = _svr,                                                 \
7476         .insns_flags  = glue(POWERPC_INSNS_,_type),                           \
7477         .insns_flags2 = glue(POWERPC_INSNS2_,_type),                          \
7478         .msr_mask     = glue(POWERPC_MSRM_,_type),                            \
7479         .mmu_model    = glue(POWERPC_MMU_,_type),                             \
7480         .excp_model   = glue(POWERPC_EXCP_,_type),                            \
7481         .bus_model    = glue(POWERPC_INPUT_,_type),                           \
7482         .bfd_mach     = glue(POWERPC_BFDM_,_type),                            \
7483         .flags        = glue(POWERPC_FLAG_,_type),                            \
7484         .init_proc    = &glue(init_proc_,_type),                              \
7485         .check_pow    = &glue(check_pow_,_type),                              \
7486     }
7487 #define POWERPC_DEF(_name, _pvr, _type)                                       \
7488 POWERPC_DEF_SVR(_name, _pvr, POWERPC_SVR_NONE, _type)
7489
7490 static const ppc_def_t ppc_defs[] = {
7491     /* Embedded PowerPC                                                      */
7492     /* PowerPC 401 family                                                    */
7493     /* Generic PowerPC 401 */
7494     POWERPC_DEF("401",           CPU_POWERPC_401,                    401),
7495     /* PowerPC 401 cores                                                     */
7496     /* PowerPC 401A1 */
7497     POWERPC_DEF("401A1",         CPU_POWERPC_401A1,                  401),
7498     /* PowerPC 401B2                                                         */
7499     POWERPC_DEF("401B2",         CPU_POWERPC_401B2,                  401x2),
7500 #if defined (TODO)
7501     /* PowerPC 401B3                                                         */
7502     POWERPC_DEF("401B3",         CPU_POWERPC_401B3,                  401x3),
7503 #endif
7504     /* PowerPC 401C2                                                         */
7505     POWERPC_DEF("401C2",         CPU_POWERPC_401C2,                  401x2),
7506     /* PowerPC 401D2                                                         */
7507     POWERPC_DEF("401D2",         CPU_POWERPC_401D2,                  401x2),
7508     /* PowerPC 401E2                                                         */
7509     POWERPC_DEF("401E2",         CPU_POWERPC_401E2,                  401x2),
7510     /* PowerPC 401F2                                                         */
7511     POWERPC_DEF("401F2",         CPU_POWERPC_401F2,                  401x2),
7512     /* PowerPC 401G2                                                         */
7513     /* XXX: to be checked */
7514     POWERPC_DEF("401G2",         CPU_POWERPC_401G2,                  401x2),
7515     /* PowerPC 401 microcontrolers                                           */
7516 #if defined (TODO)
7517     /* PowerPC 401GF                                                         */
7518     POWERPC_DEF("401GF",         CPU_POWERPC_401GF,                  401),
7519 #endif
7520     /* IOP480 (401 microcontroler)                                           */
7521     POWERPC_DEF("IOP480",        CPU_POWERPC_IOP480,                 IOP480),
7522     /* IBM Processor for Network Resources                                   */
7523     POWERPC_DEF("Cobra",         CPU_POWERPC_COBRA,                  401),
7524 #if defined (TODO)
7525     POWERPC_DEF("Xipchip",       CPU_POWERPC_XIPCHIP,                401),
7526 #endif
7527     /* PowerPC 403 family                                                    */
7528     /* Generic PowerPC 403                                                   */
7529     POWERPC_DEF("403",           CPU_POWERPC_403,                    403),
7530     /* PowerPC 403 microcontrolers                                           */
7531     /* PowerPC 403 GA                                                        */
7532     POWERPC_DEF("403GA",         CPU_POWERPC_403GA,                  403),
7533     /* PowerPC 403 GB                                                        */
7534     POWERPC_DEF("403GB",         CPU_POWERPC_403GB,                  403),
7535     /* PowerPC 403 GC                                                        */
7536     POWERPC_DEF("403GC",         CPU_POWERPC_403GC,                  403),
7537     /* PowerPC 403 GCX                                                       */
7538     POWERPC_DEF("403GCX",        CPU_POWERPC_403GCX,                 403GCX),
7539 #if defined (TODO)
7540     /* PowerPC 403 GP                                                        */
7541     POWERPC_DEF("403GP",         CPU_POWERPC_403GP,                  403),
7542 #endif
7543     /* PowerPC 405 family                                                    */
7544     /* Generic PowerPC 405                                                   */
7545     POWERPC_DEF("405",           CPU_POWERPC_405,                    405),
7546     /* PowerPC 405 cores                                                     */
7547 #if defined (TODO)
7548     /* PowerPC 405 A3                                                        */
7549     POWERPC_DEF("405A3",         CPU_POWERPC_405A3,                  405),
7550 #endif
7551 #if defined (TODO)
7552     /* PowerPC 405 A4                                                        */
7553     POWERPC_DEF("405A4",         CPU_POWERPC_405A4,                  405),
7554 #endif
7555 #if defined (TODO)
7556     /* PowerPC 405 B3                                                        */
7557     POWERPC_DEF("405B3",         CPU_POWERPC_405B3,                  405),
7558 #endif
7559 #if defined (TODO)
7560     /* PowerPC 405 B4                                                        */
7561     POWERPC_DEF("405B4",         CPU_POWERPC_405B4,                  405),
7562 #endif
7563 #if defined (TODO)
7564     /* PowerPC 405 C3                                                        */
7565     POWERPC_DEF("405C3",         CPU_POWERPC_405C3,                  405),
7566 #endif
7567 #if defined (TODO)
7568     /* PowerPC 405 C4                                                        */
7569     POWERPC_DEF("405C4",         CPU_POWERPC_405C4,                  405),
7570 #endif
7571     /* PowerPC 405 D2                                                        */
7572     POWERPC_DEF("405D2",         CPU_POWERPC_405D2,                  405),
7573 #if defined (TODO)
7574     /* PowerPC 405 D3                                                        */
7575     POWERPC_DEF("405D3",         CPU_POWERPC_405D3,                  405),
7576 #endif
7577     /* PowerPC 405 D4                                                        */
7578     POWERPC_DEF("405D4",         CPU_POWERPC_405D4,                  405),
7579 #if defined (TODO)
7580     /* PowerPC 405 D5                                                        */
7581     POWERPC_DEF("405D5",         CPU_POWERPC_405D5,                  405),
7582 #endif
7583 #if defined (TODO)
7584     /* PowerPC 405 E4                                                        */
7585     POWERPC_DEF("405E4",         CPU_POWERPC_405E4,                  405),
7586 #endif
7587 #if defined (TODO)
7588     /* PowerPC 405 F4                                                        */
7589     POWERPC_DEF("405F4",         CPU_POWERPC_405F4,                  405),
7590 #endif
7591 #if defined (TODO)
7592     /* PowerPC 405 F5                                                        */
7593     POWERPC_DEF("405F5",         CPU_POWERPC_405F5,                  405),
7594 #endif
7595 #if defined (TODO)
7596     /* PowerPC 405 F6                                                        */
7597     POWERPC_DEF("405F6",         CPU_POWERPC_405F6,                  405),
7598 #endif
7599     /* PowerPC 405 microcontrolers                                           */
7600     /* PowerPC 405 CR                                                        */
7601     POWERPC_DEF("405CR",         CPU_POWERPC_405CR,                  405),
7602     /* PowerPC 405 CRa                                                       */
7603     POWERPC_DEF("405CRa",        CPU_POWERPC_405CRa,                 405),
7604     /* PowerPC 405 CRb                                                       */
7605     POWERPC_DEF("405CRb",        CPU_POWERPC_405CRb,                 405),
7606     /* PowerPC 405 CRc                                                       */
7607     POWERPC_DEF("405CRc",        CPU_POWERPC_405CRc,                 405),
7608     /* PowerPC 405 EP                                                        */
7609     POWERPC_DEF("405EP",         CPU_POWERPC_405EP,                  405),
7610 #if defined(TODO)
7611     /* PowerPC 405 EXr                                                       */
7612     POWERPC_DEF("405EXr",        CPU_POWERPC_405EXr,                 405),
7613 #endif
7614     /* PowerPC 405 EZ                                                        */
7615     POWERPC_DEF("405EZ",         CPU_POWERPC_405EZ,                  405),
7616 #if defined(TODO)
7617     /* PowerPC 405 FX                                                        */
7618     POWERPC_DEF("405FX",         CPU_POWERPC_405FX,                  405),
7619 #endif
7620     /* PowerPC 405 GP                                                        */
7621     POWERPC_DEF("405GP",         CPU_POWERPC_405GP,                  405),
7622     /* PowerPC 405 GPa                                                       */
7623     POWERPC_DEF("405GPa",        CPU_POWERPC_405GPa,                 405),
7624     /* PowerPC 405 GPb                                                       */
7625     POWERPC_DEF("405GPb",        CPU_POWERPC_405GPb,                 405),
7626     /* PowerPC 405 GPc                                                       */
7627     POWERPC_DEF("405GPc",        CPU_POWERPC_405GPc,                 405),
7628     /* PowerPC 405 GPd                                                       */
7629     POWERPC_DEF("405GPd",        CPU_POWERPC_405GPd,                 405),
7630     /* PowerPC 405 GPe                                                       */
7631     POWERPC_DEF("405GPe",        CPU_POWERPC_405GPe,                 405),
7632     /* PowerPC 405 GPR                                                       */
7633     POWERPC_DEF("405GPR",        CPU_POWERPC_405GPR,                 405),
7634 #if defined(TODO)
7635     /* PowerPC 405 H                                                         */
7636     POWERPC_DEF("405H",          CPU_POWERPC_405H,                   405),
7637 #endif
7638 #if defined(TODO)
7639     /* PowerPC 405 L                                                         */
7640     POWERPC_DEF("405L",          CPU_POWERPC_405L,                   405),
7641 #endif
7642     /* PowerPC 405 LP                                                        */
7643     POWERPC_DEF("405LP",         CPU_POWERPC_405LP,                  405),
7644 #if defined(TODO)
7645     /* PowerPC 405 PM                                                        */
7646     POWERPC_DEF("405PM",         CPU_POWERPC_405PM,                  405),
7647 #endif
7648 #if defined(TODO)
7649     /* PowerPC 405 PS                                                        */
7650     POWERPC_DEF("405PS",         CPU_POWERPC_405PS,                  405),
7651 #endif
7652 #if defined(TODO)
7653     /* PowerPC 405 S                                                         */
7654     POWERPC_DEF("405S",          CPU_POWERPC_405S,                   405),
7655 #endif
7656     /* Npe405 H                                                              */
7657     POWERPC_DEF("Npe405H",       CPU_POWERPC_NPE405H,                405),
7658     /* Npe405 H2                                                             */
7659     POWERPC_DEF("Npe405H2",      CPU_POWERPC_NPE405H2,               405),
7660     /* Npe405 L                                                              */
7661     POWERPC_DEF("Npe405L",       CPU_POWERPC_NPE405L,                405),
7662     /* Npe4GS3                                                               */
7663     POWERPC_DEF("Npe4GS3",       CPU_POWERPC_NPE4GS3,                405),
7664 #if defined (TODO)
7665     POWERPC_DEF("Npcxx1",        CPU_POWERPC_NPCxx1,                 405),
7666 #endif
7667 #if defined (TODO)
7668     POWERPC_DEF("Npr161",        CPU_POWERPC_NPR161,                 405),
7669 #endif
7670 #if defined (TODO)
7671     /* PowerPC LC77700 (Sanyo)                                               */
7672     POWERPC_DEF("LC77700",       CPU_POWERPC_LC77700,                405),
7673 #endif
7674     /* PowerPC 401/403/405 based set-top-box microcontrolers                 */
7675 #if defined (TODO)
7676     /* STB010000                                                             */
7677     POWERPC_DEF("STB01000",      CPU_POWERPC_STB01000,               401x2),
7678 #endif
7679 #if defined (TODO)
7680     /* STB01010                                                              */
7681     POWERPC_DEF("STB01010",      CPU_POWERPC_STB01010,               401x2),
7682 #endif
7683 #if defined (TODO)
7684     /* STB0210                                                               */
7685     POWERPC_DEF("STB0210",       CPU_POWERPC_STB0210,                401x3),
7686 #endif
7687     /* STB03xx                                                               */
7688     POWERPC_DEF("STB03",         CPU_POWERPC_STB03,                  405),
7689 #if defined (TODO)
7690     /* STB043x                                                               */
7691     POWERPC_DEF("STB043",        CPU_POWERPC_STB043,                 405),
7692 #endif
7693 #if defined (TODO)
7694     /* STB045x                                                               */
7695     POWERPC_DEF("STB045",        CPU_POWERPC_STB045,                 405),
7696 #endif
7697     /* STB04xx                                                               */
7698     POWERPC_DEF("STB04",         CPU_POWERPC_STB04,                  405),
7699     /* STB25xx                                                               */
7700     POWERPC_DEF("STB25",         CPU_POWERPC_STB25,                  405),
7701 #if defined (TODO)
7702     /* STB130                                                                */
7703     POWERPC_DEF("STB130",        CPU_POWERPC_STB130,                 405),
7704 #endif
7705     /* Xilinx PowerPC 405 cores                                              */
7706     POWERPC_DEF("x2vp4",         CPU_POWERPC_X2VP4,                  405),
7707     POWERPC_DEF("x2vp7",         CPU_POWERPC_X2VP7,                  405),
7708     POWERPC_DEF("x2vp20",        CPU_POWERPC_X2VP20,                 405),
7709     POWERPC_DEF("x2vp50",        CPU_POWERPC_X2VP50,                 405),
7710 #if defined (TODO)
7711     /* Zarlink ZL10310                                                       */
7712     POWERPC_DEF("zl10310",       CPU_POWERPC_ZL10310,                405),
7713 #endif
7714 #if defined (TODO)
7715     /* Zarlink ZL10311                                                       */
7716     POWERPC_DEF("zl10311",       CPU_POWERPC_ZL10311,                405),
7717 #endif
7718 #if defined (TODO)
7719     /* Zarlink ZL10320                                                       */
7720     POWERPC_DEF("zl10320",       CPU_POWERPC_ZL10320,                405),
7721 #endif
7722 #if defined (TODO)
7723     /* Zarlink ZL10321                                                       */
7724     POWERPC_DEF("zl10321",       CPU_POWERPC_ZL10321,                405),
7725 #endif
7726     /* PowerPC 440 family                                                    */
7727 #if defined(TODO_USER_ONLY)
7728     /* Generic PowerPC 440                                                   */
7729     POWERPC_DEF("440",           CPU_POWERPC_440,                    440GP),
7730 #endif
7731     /* PowerPC 440 cores                                                     */
7732 #if defined (TODO)
7733     /* PowerPC 440 A4                                                        */
7734     POWERPC_DEF("440A4",         CPU_POWERPC_440A4,                  440x4),
7735 #endif
7736     /* PowerPC 440 Xilinx 5                                                  */
7737     POWERPC_DEF("440-Xilinx",    CPU_POWERPC_440_XILINX,             440x5),
7738 #if defined (TODO)
7739     /* PowerPC 440 A5                                                        */
7740     POWERPC_DEF("440A5",         CPU_POWERPC_440A5,                  440x5),
7741 #endif
7742 #if defined (TODO)
7743     /* PowerPC 440 B4                                                        */
7744     POWERPC_DEF("440B4",         CPU_POWERPC_440B4,                  440x4),
7745 #endif
7746 #if defined (TODO)
7747     /* PowerPC 440 G4                                                        */
7748     POWERPC_DEF("440G4",         CPU_POWERPC_440G4,                  440x4),
7749 #endif
7750 #if defined (TODO)
7751     /* PowerPC 440 F5                                                        */
7752     POWERPC_DEF("440F5",         CPU_POWERPC_440F5,                  440x5),
7753 #endif
7754 #if defined (TODO)
7755     /* PowerPC 440 G5                                                        */
7756     POWERPC_DEF("440G5",         CPU_POWERPC_440G5,                  440x5),
7757 #endif
7758 #if defined (TODO)
7759     /* PowerPC 440H4                                                         */
7760     POWERPC_DEF("440H4",         CPU_POWERPC_440H4,                  440x4),
7761 #endif
7762 #if defined (TODO)
7763     /* PowerPC 440H6                                                         */
7764     POWERPC_DEF("440H6",         CPU_POWERPC_440H6,                  440Gx5),
7765 #endif
7766     /* PowerPC 440 microcontrolers                                           */
7767 #if defined(TODO_USER_ONLY)
7768     /* PowerPC 440 EP                                                        */
7769     POWERPC_DEF("440EP",         CPU_POWERPC_440EP,                  440EP),
7770 #endif
7771 #if defined(TODO_USER_ONLY)
7772     /* PowerPC 440 EPa                                                       */
7773     POWERPC_DEF("440EPa",        CPU_POWERPC_440EPa,                 440EP),
7774 #endif
7775 #if defined(TODO_USER_ONLY)
7776     /* PowerPC 440 EPb                                                       */
7777     POWERPC_DEF("440EPb",        CPU_POWERPC_440EPb,                 440EP),
7778 #endif
7779 #if defined(TODO_USER_ONLY)
7780     /* PowerPC 440 EPX                                                       */
7781     POWERPC_DEF("440EPX",        CPU_POWERPC_440EPX,                 440EP),
7782 #endif
7783 #if defined(TODO_USER_ONLY)
7784     /* PowerPC 440 GP                                                        */
7785     POWERPC_DEF("440GP",         CPU_POWERPC_440GP,                  440GP),
7786 #endif
7787 #if defined(TODO_USER_ONLY)
7788     /* PowerPC 440 GPb                                                       */
7789     POWERPC_DEF("440GPb",        CPU_POWERPC_440GPb,                 440GP),
7790 #endif
7791 #if defined(TODO_USER_ONLY)
7792     /* PowerPC 440 GPc                                                       */
7793     POWERPC_DEF("440GPc",        CPU_POWERPC_440GPc,                 440GP),
7794 #endif
7795 #if defined(TODO_USER_ONLY)
7796     /* PowerPC 440 GR                                                        */
7797     POWERPC_DEF("440GR",         CPU_POWERPC_440GR,                  440x5),
7798 #endif
7799 #if defined(TODO_USER_ONLY)
7800     /* PowerPC 440 GRa                                                       */
7801     POWERPC_DEF("440GRa",        CPU_POWERPC_440GRa,                 440x5),
7802 #endif
7803 #if defined(TODO_USER_ONLY)
7804     /* PowerPC 440 GRX                                                       */
7805     POWERPC_DEF("440GRX",        CPU_POWERPC_440GRX,                 440x5),
7806 #endif
7807 #if defined(TODO_USER_ONLY)
7808     /* PowerPC 440 GX                                                        */
7809     POWERPC_DEF("440GX",         CPU_POWERPC_440GX,                  440EP),
7810 #endif
7811 #if defined(TODO_USER_ONLY)
7812     /* PowerPC 440 GXa                                                       */
7813     POWERPC_DEF("440GXa",        CPU_POWERPC_440GXa,                 440EP),
7814 #endif
7815 #if defined(TODO_USER_ONLY)
7816     /* PowerPC 440 GXb                                                       */
7817     POWERPC_DEF("440GXb",        CPU_POWERPC_440GXb,                 440EP),
7818 #endif
7819 #if defined(TODO_USER_ONLY)
7820     /* PowerPC 440 GXc                                                       */
7821     POWERPC_DEF("440GXc",        CPU_POWERPC_440GXc,                 440EP),
7822 #endif
7823 #if defined(TODO_USER_ONLY)
7824     /* PowerPC 440 GXf                                                       */
7825     POWERPC_DEF("440GXf",        CPU_POWERPC_440GXf,                 440EP),
7826 #endif
7827 #if defined(TODO)
7828     /* PowerPC 440 S                                                         */
7829     POWERPC_DEF("440S",          CPU_POWERPC_440S,                   440),
7830 #endif
7831 #if defined(TODO_USER_ONLY)
7832     /* PowerPC 440 SP                                                        */
7833     POWERPC_DEF("440SP",         CPU_POWERPC_440SP,                  440EP),
7834 #endif
7835 #if defined(TODO_USER_ONLY)
7836     /* PowerPC 440 SP2                                                       */
7837     POWERPC_DEF("440SP2",        CPU_POWERPC_440SP2,                 440EP),
7838 #endif
7839 #if defined(TODO_USER_ONLY)
7840     /* PowerPC 440 SPE                                                       */
7841     POWERPC_DEF("440SPE",        CPU_POWERPC_440SPE,                 440EP),
7842 #endif
7843     /* PowerPC 460 family                                                    */
7844 #if defined (TODO)
7845     /* Generic PowerPC 464                                                   */
7846     POWERPC_DEF("464",           CPU_POWERPC_464,                    460),
7847 #endif
7848     /* PowerPC 464 microcontrolers                                           */
7849 #if defined (TODO)
7850     /* PowerPC 464H90                                                        */
7851     POWERPC_DEF("464H90",        CPU_POWERPC_464H90,                 460),
7852 #endif
7853 #if defined (TODO)
7854     /* PowerPC 464H90F                                                       */
7855     POWERPC_DEF("464H90F",       CPU_POWERPC_464H90F,                460F),
7856 #endif
7857     /* Freescale embedded PowerPC cores                                      */
7858     /* MPC5xx family (aka RCPU)                                              */
7859 #if defined(TODO_USER_ONLY)
7860     /* Generic MPC5xx core                                                   */
7861     POWERPC_DEF("MPC5xx",        CPU_POWERPC_MPC5xx,                 MPC5xx),
7862 #endif
7863 #if defined(TODO_USER_ONLY)
7864     /* Codename for MPC5xx core                                              */
7865     POWERPC_DEF("RCPU",          CPU_POWERPC_MPC5xx,                 MPC5xx),
7866 #endif
7867     /* MPC5xx microcontrollers                                               */
7868 #if defined(TODO_USER_ONLY)
7869     /* MGT560                                                                */
7870     POWERPC_DEF("MGT560",        CPU_POWERPC_MGT560,                 MPC5xx),
7871 #endif
7872 #if defined(TODO_USER_ONLY)
7873     /* MPC509                                                                */
7874     POWERPC_DEF("MPC509",        CPU_POWERPC_MPC509,                 MPC5xx),
7875 #endif
7876 #if defined(TODO_USER_ONLY)
7877     /* MPC533                                                                */
7878     POWERPC_DEF("MPC533",        CPU_POWERPC_MPC533,                 MPC5xx),
7879 #endif
7880 #if defined(TODO_USER_ONLY)
7881     /* MPC534                                                                */
7882     POWERPC_DEF("MPC534",        CPU_POWERPC_MPC534,                 MPC5xx),
7883 #endif
7884 #if defined(TODO_USER_ONLY)
7885     /* MPC555                                                                */
7886     POWERPC_DEF("MPC555",        CPU_POWERPC_MPC555,                 MPC5xx),
7887 #endif
7888 #if defined(TODO_USER_ONLY)
7889     /* MPC556                                                                */
7890     POWERPC_DEF("MPC556",        CPU_POWERPC_MPC556,                 MPC5xx),
7891 #endif
7892 #if defined(TODO_USER_ONLY)
7893     /* MPC560                                                                */
7894     POWERPC_DEF("MPC560",        CPU_POWERPC_MPC560,                 MPC5xx),
7895 #endif
7896 #if defined(TODO_USER_ONLY)
7897     /* MPC561                                                                */
7898     POWERPC_DEF("MPC561",        CPU_POWERPC_MPC561,                 MPC5xx),
7899 #endif
7900 #if defined(TODO_USER_ONLY)
7901     /* MPC562                                                                */
7902     POWERPC_DEF("MPC562",        CPU_POWERPC_MPC562,                 MPC5xx),
7903 #endif
7904 #if defined(TODO_USER_ONLY)
7905     /* MPC563                                                                */
7906     POWERPC_DEF("MPC563",        CPU_POWERPC_MPC563,                 MPC5xx),
7907 #endif
7908 #if defined(TODO_USER_ONLY)
7909     /* MPC564                                                                */
7910     POWERPC_DEF("MPC564",        CPU_POWERPC_MPC564,                 MPC5xx),
7911 #endif
7912 #if defined(TODO_USER_ONLY)
7913     /* MPC565                                                                */
7914     POWERPC_DEF("MPC565",        CPU_POWERPC_MPC565,                 MPC5xx),
7915 #endif
7916 #if defined(TODO_USER_ONLY)
7917     /* MPC566                                                                */
7918     POWERPC_DEF("MPC566",        CPU_POWERPC_MPC566,                 MPC5xx),
7919 #endif
7920     /* MPC8xx family (aka PowerQUICC)                                        */
7921 #if defined(TODO_USER_ONLY)
7922     /* Generic MPC8xx core                                                   */
7923     POWERPC_DEF("MPC8xx",        CPU_POWERPC_MPC8xx,                 MPC8xx),
7924 #endif
7925 #if defined(TODO_USER_ONLY)
7926     /* Codename for MPC8xx core                                              */
7927     POWERPC_DEF("PowerQUICC",    CPU_POWERPC_MPC8xx,                 MPC8xx),
7928 #endif
7929     /* MPC8xx microcontrollers                                               */
7930 #if defined(TODO_USER_ONLY)
7931     /* MGT823                                                                */
7932     POWERPC_DEF("MGT823",        CPU_POWERPC_MGT823,                 MPC8xx),
7933 #endif
7934 #if defined(TODO_USER_ONLY)
7935     /* MPC821                                                                */
7936     POWERPC_DEF("MPC821",        CPU_POWERPC_MPC821,                 MPC8xx),
7937 #endif
7938 #if defined(TODO_USER_ONLY)
7939     /* MPC823                                                                */
7940     POWERPC_DEF("MPC823",        CPU_POWERPC_MPC823,                 MPC8xx),
7941 #endif
7942 #if defined(TODO_USER_ONLY)
7943     /* MPC850                                                                */
7944     POWERPC_DEF("MPC850",        CPU_POWERPC_MPC850,                 MPC8xx),
7945 #endif
7946 #if defined(TODO_USER_ONLY)
7947     /* MPC852T                                                               */
7948     POWERPC_DEF("MPC852T",       CPU_POWERPC_MPC852T,                MPC8xx),
7949 #endif
7950 #if defined(TODO_USER_ONLY)
7951     /* MPC855T                                                               */
7952     POWERPC_DEF("MPC855T",       CPU_POWERPC_MPC855T,                MPC8xx),
7953 #endif
7954 #if defined(TODO_USER_ONLY)
7955     /* MPC857                                                                */
7956     POWERPC_DEF("MPC857",        CPU_POWERPC_MPC857,                 MPC8xx),
7957 #endif
7958 #if defined(TODO_USER_ONLY)
7959     /* MPC859                                                                */
7960     POWERPC_DEF("MPC859",        CPU_POWERPC_MPC859,                 MPC8xx),
7961 #endif
7962 #if defined(TODO_USER_ONLY)
7963     /* MPC860                                                                */
7964     POWERPC_DEF("MPC860",        CPU_POWERPC_MPC860,                 MPC8xx),
7965 #endif
7966 #if defined(TODO_USER_ONLY)
7967     /* MPC862                                                                */
7968     POWERPC_DEF("MPC862",        CPU_POWERPC_MPC862,                 MPC8xx),
7969 #endif
7970 #if defined(TODO_USER_ONLY)
7971     /* MPC866                                                                */
7972     POWERPC_DEF("MPC866",        CPU_POWERPC_MPC866,                 MPC8xx),
7973 #endif
7974 #if defined(TODO_USER_ONLY)
7975     /* MPC870                                                                */
7976     POWERPC_DEF("MPC870",        CPU_POWERPC_MPC870,                 MPC8xx),
7977 #endif
7978 #if defined(TODO_USER_ONLY)
7979     /* MPC875                                                                */
7980     POWERPC_DEF("MPC875",        CPU_POWERPC_MPC875,                 MPC8xx),
7981 #endif
7982 #if defined(TODO_USER_ONLY)
7983     /* MPC880                                                                */
7984     POWERPC_DEF("MPC880",        CPU_POWERPC_MPC880,                 MPC8xx),
7985 #endif
7986 #if defined(TODO_USER_ONLY)
7987     /* MPC885                                                                */
7988     POWERPC_DEF("MPC885",        CPU_POWERPC_MPC885,                 MPC8xx),
7989 #endif
7990     /* MPC82xx family (aka PowerQUICC-II)                                    */
7991     /* Generic MPC52xx core                                                  */
7992     POWERPC_DEF_SVR("MPC52xx",
7993                     CPU_POWERPC_MPC52xx,      POWERPC_SVR_52xx,      G2LE),
7994     /* Generic MPC82xx core                                                  */
7995     POWERPC_DEF("MPC82xx",       CPU_POWERPC_MPC82xx,                G2),
7996     /* Codename for MPC82xx                                                  */
7997     POWERPC_DEF("PowerQUICC-II", CPU_POWERPC_MPC82xx,                G2),
7998     /* PowerPC G2 core                                                       */
7999     POWERPC_DEF("G2",            CPU_POWERPC_G2,                     G2),
8000     /* PowerPC G2 H4 core                                                    */
8001     POWERPC_DEF("G2H4",          CPU_POWERPC_G2H4,                   G2),
8002     /* PowerPC G2 GP core                                                    */
8003     POWERPC_DEF("G2GP",          CPU_POWERPC_G2gp,                   G2),
8004     /* PowerPC G2 LS core                                                    */
8005     POWERPC_DEF("G2LS",          CPU_POWERPC_G2ls,                   G2),
8006     /* PowerPC G2 HiP3 core                                                  */
8007     POWERPC_DEF("G2HiP3",        CPU_POWERPC_G2_HIP3,                G2),
8008     /* PowerPC G2 HiP4 core                                                  */
8009     POWERPC_DEF("G2HiP4",        CPU_POWERPC_G2_HIP4,                G2),
8010     /* PowerPC MPC603 core                                                   */
8011     POWERPC_DEF("MPC603",        CPU_POWERPC_MPC603,                 603E),
8012     /* PowerPC G2le core (same as G2 plus little-endian mode support)        */
8013     POWERPC_DEF("G2le",          CPU_POWERPC_G2LE,                   G2LE),
8014     /* PowerPC G2LE GP core                                                  */
8015     POWERPC_DEF("G2leGP",        CPU_POWERPC_G2LEgp,                 G2LE),
8016     /* PowerPC G2LE LS core                                                  */
8017     POWERPC_DEF("G2leLS",        CPU_POWERPC_G2LEls,                 G2LE),
8018     /* PowerPC G2LE GP1 core                                                 */
8019     POWERPC_DEF("G2leGP1",       CPU_POWERPC_G2LEgp1,                G2LE),
8020     /* PowerPC G2LE GP3 core                                                 */
8021     POWERPC_DEF("G2leGP3",       CPU_POWERPC_G2LEgp1,                G2LE),
8022     /* PowerPC MPC603 microcontrollers                                       */
8023     /* MPC8240                                                               */
8024     POWERPC_DEF("MPC8240",       CPU_POWERPC_MPC8240,                603E),
8025     /* PowerPC G2 microcontrollers                                           */
8026 #if defined(TODO)
8027     /* MPC5121                                                               */
8028     POWERPC_DEF_SVR("MPC5121",
8029                     CPU_POWERPC_MPC5121,      POWERPC_SVR_5121,      G2LE),
8030 #endif
8031     /* MPC5200                                                               */
8032     POWERPC_DEF_SVR("MPC5200",
8033                     CPU_POWERPC_MPC5200,      POWERPC_SVR_5200,      G2LE),
8034     /* MPC5200 v1.0                                                          */
8035     POWERPC_DEF_SVR("MPC5200_v10",
8036                     CPU_POWERPC_MPC5200_v10,  POWERPC_SVR_5200_v10,  G2LE),
8037     /* MPC5200 v1.1                                                          */
8038     POWERPC_DEF_SVR("MPC5200_v11",
8039                     CPU_POWERPC_MPC5200_v11,  POWERPC_SVR_5200_v11,  G2LE),
8040     /* MPC5200 v1.2                                                          */
8041     POWERPC_DEF_SVR("MPC5200_v12",
8042                     CPU_POWERPC_MPC5200_v12,  POWERPC_SVR_5200_v12,  G2LE),
8043     /* MPC5200B                                                              */
8044     POWERPC_DEF_SVR("MPC5200B",
8045                     CPU_POWERPC_MPC5200B,     POWERPC_SVR_5200B,     G2LE),
8046     /* MPC5200B v2.0                                                         */
8047     POWERPC_DEF_SVR("MPC5200B_v20",
8048                     CPU_POWERPC_MPC5200B_v20, POWERPC_SVR_5200B_v20, G2LE),
8049     /* MPC5200B v2.1                                                         */
8050     POWERPC_DEF_SVR("MPC5200B_v21",
8051                     CPU_POWERPC_MPC5200B_v21, POWERPC_SVR_5200B_v21, G2LE),
8052     /* MPC8241                                                               */
8053     POWERPC_DEF("MPC8241",       CPU_POWERPC_MPC8241,                G2),
8054     /* MPC8245                                                               */
8055     POWERPC_DEF("MPC8245",       CPU_POWERPC_MPC8245,                G2),
8056     /* MPC8247                                                               */
8057     POWERPC_DEF("MPC8247",       CPU_POWERPC_MPC8247,                G2LE),
8058     /* MPC8248                                                               */
8059     POWERPC_DEF("MPC8248",       CPU_POWERPC_MPC8248,                G2LE),
8060     /* MPC8250                                                               */
8061     POWERPC_DEF("MPC8250",       CPU_POWERPC_MPC8250,                G2),
8062     /* MPC8250 HiP3                                                          */
8063     POWERPC_DEF("MPC8250_HiP3",  CPU_POWERPC_MPC8250_HiP3,           G2),
8064     /* MPC8250 HiP4                                                          */
8065     POWERPC_DEF("MPC8250_HiP4",  CPU_POWERPC_MPC8250_HiP4,           G2),
8066     /* MPC8255                                                               */
8067     POWERPC_DEF("MPC8255",       CPU_POWERPC_MPC8255,                G2),
8068     /* MPC8255 HiP3                                                          */
8069     POWERPC_DEF("MPC8255_HiP3",  CPU_POWERPC_MPC8255_HiP3,           G2),
8070     /* MPC8255 HiP4                                                          */
8071     POWERPC_DEF("MPC8255_HiP4",  CPU_POWERPC_MPC8255_HiP4,           G2),
8072     /* MPC8260                                                               */
8073     POWERPC_DEF("MPC8260",       CPU_POWERPC_MPC8260,                G2),
8074     /* MPC8260 HiP3                                                          */
8075     POWERPC_DEF("MPC8260_HiP3",  CPU_POWERPC_MPC8260_HiP3,           G2),
8076     /* MPC8260 HiP4                                                          */
8077     POWERPC_DEF("MPC8260_HiP4",  CPU_POWERPC_MPC8260_HiP4,           G2),
8078     /* MPC8264                                                               */
8079     POWERPC_DEF("MPC8264",       CPU_POWERPC_MPC8264,                G2),
8080     /* MPC8264 HiP3                                                          */
8081     POWERPC_DEF("MPC8264_HiP3",  CPU_POWERPC_MPC8264_HiP3,           G2),
8082     /* MPC8264 HiP4                                                          */
8083     POWERPC_DEF("MPC8264_HiP4",  CPU_POWERPC_MPC8264_HiP4,           G2),
8084     /* MPC8265                                                               */
8085     POWERPC_DEF("MPC8265",       CPU_POWERPC_MPC8265,                G2),
8086     /* MPC8265 HiP3                                                          */
8087     POWERPC_DEF("MPC8265_HiP3",  CPU_POWERPC_MPC8265_HiP3,           G2),
8088     /* MPC8265 HiP4                                                          */
8089     POWERPC_DEF("MPC8265_HiP4",  CPU_POWERPC_MPC8265_HiP4,           G2),
8090     /* MPC8266                                                               */
8091     POWERPC_DEF("MPC8266",       CPU_POWERPC_MPC8266,                G2),
8092     /* MPC8266 HiP3                                                          */
8093     POWERPC_DEF("MPC8266_HiP3",  CPU_POWERPC_MPC8266_HiP3,           G2),
8094     /* MPC8266 HiP4                                                          */
8095     POWERPC_DEF("MPC8266_HiP4",  CPU_POWERPC_MPC8266_HiP4,           G2),
8096     /* MPC8270                                                               */
8097     POWERPC_DEF("MPC8270",       CPU_POWERPC_MPC8270,                G2LE),
8098     /* MPC8271                                                               */
8099     POWERPC_DEF("MPC8271",       CPU_POWERPC_MPC8271,                G2LE),
8100     /* MPC8272                                                               */
8101     POWERPC_DEF("MPC8272",       CPU_POWERPC_MPC8272,                G2LE),
8102     /* MPC8275                                                               */
8103     POWERPC_DEF("MPC8275",       CPU_POWERPC_MPC8275,                G2LE),
8104     /* MPC8280                                                               */
8105     POWERPC_DEF("MPC8280",       CPU_POWERPC_MPC8280,                G2LE),
8106     /* e200 family                                                           */
8107     /* Generic PowerPC e200 core                                             */
8108     POWERPC_DEF("e200",          CPU_POWERPC_e200,                   e200),
8109     /* Generic MPC55xx core                                                  */
8110 #if defined (TODO)
8111     POWERPC_DEF_SVR("MPC55xx",
8112                     CPU_POWERPC_MPC55xx,      POWERPC_SVR_55xx,      e200),
8113 #endif
8114 #if defined (TODO)
8115     /* PowerPC e200z0 core                                                   */
8116     POWERPC_DEF("e200z0",        CPU_POWERPC_e200z0,                 e200),
8117 #endif
8118 #if defined (TODO)
8119     /* PowerPC e200z1 core                                                   */
8120     POWERPC_DEF("e200z1",        CPU_POWERPC_e200z1,                 e200),
8121 #endif
8122 #if defined (TODO)
8123     /* PowerPC e200z3 core                                                   */
8124     POWERPC_DEF("e200z3",        CPU_POWERPC_e200z3,                 e200),
8125 #endif
8126     /* PowerPC e200z5 core                                                   */
8127     POWERPC_DEF("e200z5",        CPU_POWERPC_e200z5,                 e200),
8128     /* PowerPC e200z6 core                                                   */
8129     POWERPC_DEF("e200z6",        CPU_POWERPC_e200z6,                 e200),
8130     /* PowerPC e200 microcontrollers                                         */
8131 #if defined (TODO)
8132     /* MPC5514E                                                              */
8133     POWERPC_DEF_SVR("MPC5514E",
8134                     CPU_POWERPC_MPC5514E,     POWERPC_SVR_5514E,     e200),
8135 #endif
8136 #if defined (TODO)
8137     /* MPC5514E v0                                                           */
8138     POWERPC_DEF_SVR("MPC5514E_v0",
8139                     CPU_POWERPC_MPC5514E_v0,  POWERPC_SVR_5514E_v0,  e200),
8140 #endif
8141 #if defined (TODO)
8142     /* MPC5514E v1                                                           */
8143     POWERPC_DEF_SVR("MPC5514E_v1",
8144                     CPU_POWERPC_MPC5514E_v1,  POWERPC_SVR_5514E_v1,  e200),
8145 #endif
8146 #if defined (TODO)
8147     /* MPC5514G                                                              */
8148     POWERPC_DEF_SVR("MPC5514G",
8149                     CPU_POWERPC_MPC5514G,     POWERPC_SVR_5514G,     e200),
8150 #endif
8151 #if defined (TODO)
8152     /* MPC5514G v0                                                           */
8153     POWERPC_DEF_SVR("MPC5514G_v0",
8154                     CPU_POWERPC_MPC5514G_v0,  POWERPC_SVR_5514G_v0,  e200),
8155 #endif
8156 #if defined (TODO)
8157     /* MPC5514G v1                                                           */
8158     POWERPC_DEF_SVR("MPC5514G_v1",
8159                     CPU_POWERPC_MPC5514G_v1,  POWERPC_SVR_5514G_v1,  e200),
8160 #endif
8161 #if defined (TODO)
8162     /* MPC5515S                                                              */
8163     POWERPC_DEF_SVR("MPC5515S",
8164                     CPU_POWERPC_MPC5515S,     POWERPC_SVR_5515S,     e200),
8165 #endif
8166 #if defined (TODO)
8167     /* MPC5516E                                                              */
8168     POWERPC_DEF_SVR("MPC5516E",
8169                     CPU_POWERPC_MPC5516E,     POWERPC_SVR_5516E,     e200),
8170 #endif
8171 #if defined (TODO)
8172     /* MPC5516E v0                                                           */
8173     POWERPC_DEF_SVR("MPC5516E_v0",
8174                     CPU_POWERPC_MPC5516E_v0,  POWERPC_SVR_5516E_v0,  e200),
8175 #endif
8176 #if defined (TODO)
8177     /* MPC5516E v1                                                           */
8178     POWERPC_DEF_SVR("MPC5516E_v1",
8179                     CPU_POWERPC_MPC5516E_v1,  POWERPC_SVR_5516E_v1,  e200),
8180 #endif
8181 #if defined (TODO)
8182     /* MPC5516G                                                              */
8183     POWERPC_DEF_SVR("MPC5516G",
8184                     CPU_POWERPC_MPC5516G,     POWERPC_SVR_5516G,     e200),
8185 #endif
8186 #if defined (TODO)
8187     /* MPC5516G v0                                                           */
8188     POWERPC_DEF_SVR("MPC5516G_v0",
8189                     CPU_POWERPC_MPC5516G_v0,  POWERPC_SVR_5516G_v0,  e200),
8190 #endif
8191 #if defined (TODO)
8192     /* MPC5516G v1                                                           */
8193     POWERPC_DEF_SVR("MPC5516G_v1",
8194                     CPU_POWERPC_MPC5516G_v1,  POWERPC_SVR_5516G_v1,  e200),
8195 #endif
8196 #if defined (TODO)
8197     /* MPC5516S                                                              */
8198     POWERPC_DEF_SVR("MPC5516S",
8199                     CPU_POWERPC_MPC5516S,     POWERPC_SVR_5516S,     e200),
8200 #endif
8201 #if defined (TODO)
8202     /* MPC5533                                                               */
8203     POWERPC_DEF_SVR("MPC5533",
8204                     CPU_POWERPC_MPC5533,      POWERPC_SVR_5533,      e200),
8205 #endif
8206 #if defined (TODO)
8207     /* MPC5534                                                               */
8208     POWERPC_DEF_SVR("MPC5534",
8209                     CPU_POWERPC_MPC5534,      POWERPC_SVR_5534,      e200),
8210 #endif
8211 #if defined (TODO)
8212     /* MPC5553                                                               */
8213     POWERPC_DEF_SVR("MPC5553",
8214                     CPU_POWERPC_MPC5553,      POWERPC_SVR_5553,      e200),
8215 #endif
8216 #if defined (TODO)
8217     /* MPC5554                                                               */
8218     POWERPC_DEF_SVR("MPC5554",
8219                     CPU_POWERPC_MPC5554,      POWERPC_SVR_5554,      e200),
8220 #endif
8221 #if defined (TODO)
8222     /* MPC5561                                                               */
8223     POWERPC_DEF_SVR("MPC5561",
8224                     CPU_POWERPC_MPC5561,      POWERPC_SVR_5561,      e200),
8225 #endif
8226 #if defined (TODO)
8227     /* MPC5565                                                               */
8228     POWERPC_DEF_SVR("MPC5565",
8229                     CPU_POWERPC_MPC5565,      POWERPC_SVR_5565,      e200),
8230 #endif
8231 #if defined (TODO)
8232     /* MPC5566                                                               */
8233     POWERPC_DEF_SVR("MPC5566",
8234                     CPU_POWERPC_MPC5566,      POWERPC_SVR_5566,      e200),
8235 #endif
8236 #if defined (TODO)
8237     /* MPC5567                                                               */
8238     POWERPC_DEF_SVR("MPC5567",
8239                     CPU_POWERPC_MPC5567,      POWERPC_SVR_5567,      e200),
8240 #endif
8241     /* e300 family                                                           */
8242     /* Generic PowerPC e300 core                                             */
8243     POWERPC_DEF("e300",          CPU_POWERPC_e300,                   e300),
8244     /* PowerPC e300c1 core                                                   */
8245     POWERPC_DEF("e300c1",        CPU_POWERPC_e300c1,                 e300),
8246     /* PowerPC e300c2 core                                                   */
8247     POWERPC_DEF("e300c2",        CPU_POWERPC_e300c2,                 e300),
8248     /* PowerPC e300c3 core                                                   */
8249     POWERPC_DEF("e300c3",        CPU_POWERPC_e300c3,                 e300),
8250     /* PowerPC e300c4 core                                                   */
8251     POWERPC_DEF("e300c4",        CPU_POWERPC_e300c4,                 e300),
8252     /* PowerPC e300 microcontrollers                                         */
8253 #if defined (TODO)
8254     /* MPC8313                                                               */
8255     POWERPC_DEF_SVR("MPC8313",
8256                     CPU_POWERPC_MPC831x,      POWERPC_SVR_8313,      e300),
8257 #endif
8258 #if defined (TODO)
8259     /* MPC8313E                                                              */
8260     POWERPC_DEF_SVR("MPC8313E",
8261                     CPU_POWERPC_MPC831x,      POWERPC_SVR_8313E,     e300),
8262 #endif
8263 #if defined (TODO)
8264     /* MPC8314                                                               */
8265     POWERPC_DEF_SVR("MPC8314",
8266                     CPU_POWERPC_MPC831x,      POWERPC_SVR_8314,      e300),
8267 #endif
8268 #if defined (TODO)
8269     /* MPC8314E                                                              */
8270     POWERPC_DEF_SVR("MPC8314E",
8271                     CPU_POWERPC_MPC831x,      POWERPC_SVR_8314E,     e300),
8272 #endif
8273 #if defined (TODO)
8274     /* MPC8315                                                               */
8275     POWERPC_DEF_SVR("MPC8315",
8276                     CPU_POWERPC_MPC831x,      POWERPC_SVR_8315,      e300),
8277 #endif
8278 #if defined (TODO)
8279     /* MPC8315E                                                              */
8280     POWERPC_DEF_SVR("MPC8315E",
8281                     CPU_POWERPC_MPC831x,      POWERPC_SVR_8315E,     e300),
8282 #endif
8283 #if defined (TODO)
8284     /* MPC8321                                                               */
8285     POWERPC_DEF_SVR("MPC8321",
8286                     CPU_POWERPC_MPC832x,      POWERPC_SVR_8321,      e300),
8287 #endif
8288 #if defined (TODO)
8289     /* MPC8321E                                                              */
8290     POWERPC_DEF_SVR("MPC8321E",
8291                     CPU_POWERPC_MPC832x,      POWERPC_SVR_8321E,     e300),
8292 #endif
8293 #if defined (TODO)
8294     /* MPC8323                                                               */
8295     POWERPC_DEF_SVR("MPC8323",
8296                     CPU_POWERPC_MPC832x,      POWERPC_SVR_8323,      e300),
8297 #endif
8298 #if defined (TODO)
8299     /* MPC8323E                                                              */
8300     POWERPC_DEF_SVR("MPC8323E",
8301                     CPU_POWERPC_MPC832x,      POWERPC_SVR_8323E,     e300),
8302 #endif
8303     /* MPC8343                                                               */
8304     POWERPC_DEF_SVR("MPC8343",
8305                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8343,      e300),
8306     /* MPC8343A                                                              */
8307     POWERPC_DEF_SVR("MPC8343A",
8308                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8343A,     e300),
8309     /* MPC8343E                                                              */
8310     POWERPC_DEF_SVR("MPC8343E",
8311                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8343E,     e300),
8312     /* MPC8343EA                                                             */
8313     POWERPC_DEF_SVR("MPC8343EA",
8314                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8343EA,    e300),
8315     /* MPC8347                                                               */
8316     POWERPC_DEF_SVR("MPC8347",
8317                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347,      e300),
8318     /* MPC8347T                                                              */
8319     POWERPC_DEF_SVR("MPC8347T",
8320                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347T,     e300),
8321     /* MPC8347P                                                              */
8322     POWERPC_DEF_SVR("MPC8347P",
8323                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347P,     e300),
8324     /* MPC8347A                                                              */
8325     POWERPC_DEF_SVR("MPC8347A",
8326                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347A,     e300),
8327     /* MPC8347AT                                                             */
8328     POWERPC_DEF_SVR("MPC8347AT",
8329                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347AT,    e300),
8330     /* MPC8347AP                                                             */
8331     POWERPC_DEF_SVR("MPC8347AP",
8332                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347AP,    e300),
8333     /* MPC8347E                                                              */
8334     POWERPC_DEF_SVR("MPC8347E",
8335                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347E,     e300),
8336     /* MPC8347ET                                                             */
8337     POWERPC_DEF_SVR("MPC8347ET",
8338                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347ET,    e300),
8339     /* MPC8343EP                                                             */
8340     POWERPC_DEF_SVR("MPC8347EP",
8341                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347EP,    e300),
8342     /* MPC8347EA                                                             */
8343     POWERPC_DEF_SVR("MPC8347EA",
8344                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347EA,    e300),
8345     /* MPC8347EAT                                                            */
8346     POWERPC_DEF_SVR("MPC8347EAT",
8347                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347EAT,   e300),
8348     /* MPC8343EAP                                                            */
8349     POWERPC_DEF_SVR("MPC8347EAP",
8350                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8347EAP,   e300),
8351     /* MPC8349                                                               */
8352     POWERPC_DEF_SVR("MPC8349",
8353                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8349,      e300),
8354     /* MPC8349A                                                              */
8355     POWERPC_DEF_SVR("MPC8349A",
8356                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8349A,     e300),
8357     /* MPC8349E                                                              */
8358     POWERPC_DEF_SVR("MPC8349E",
8359                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8349E,     e300),
8360     /* MPC8349EA                                                             */
8361     POWERPC_DEF_SVR("MPC8349EA",
8362                     CPU_POWERPC_MPC834x,      POWERPC_SVR_8349EA,    e300),
8363 #if defined (TODO)
8364     /* MPC8358E                                                              */
8365     POWERPC_DEF_SVR("MPC8358E",
8366                     CPU_POWERPC_MPC835x,      POWERPC_SVR_8358E,     e300),
8367 #endif
8368 #if defined (TODO)
8369     /* MPC8360E                                                              */
8370     POWERPC_DEF_SVR("MPC8360E",
8371                     CPU_POWERPC_MPC836x,      POWERPC_SVR_8360E,     e300),
8372 #endif
8373     /* MPC8377                                                               */
8374     POWERPC_DEF_SVR("MPC8377",
8375                     CPU_POWERPC_MPC837x,      POWERPC_SVR_8377,      e300),
8376     /* MPC8377E                                                              */
8377     POWERPC_DEF_SVR("MPC8377E",
8378                     CPU_POWERPC_MPC837x,      POWERPC_SVR_8377E,     e300),
8379     /* MPC8378                                                               */
8380     POWERPC_DEF_SVR("MPC8378",
8381                     CPU_POWERPC_MPC837x,      POWERPC_SVR_8378,      e300),
8382     /* MPC8378E                                                              */
8383     POWERPC_DEF_SVR("MPC8378E",
8384                     CPU_POWERPC_MPC837x,      POWERPC_SVR_8378E,     e300),
8385     /* MPC8379                                                               */
8386     POWERPC_DEF_SVR("MPC8379",
8387                     CPU_POWERPC_MPC837x,      POWERPC_SVR_8379,      e300),
8388     /* MPC8379E                                                              */
8389     POWERPC_DEF_SVR("MPC8379E",
8390                     CPU_POWERPC_MPC837x,      POWERPC_SVR_8379E,     e300),
8391     /* e500 family                                                           */
8392     /* PowerPC e500 core                                                     */
8393     POWERPC_DEF("e500",          CPU_POWERPC_e500v2_v22,             e500v2),
8394     /* PowerPC e500v1 core                                                   */
8395     POWERPC_DEF("e500v1",        CPU_POWERPC_e500v1,                 e500v1),
8396     /* PowerPC e500 v1.0 core                                                */
8397     POWERPC_DEF("e500_v10",      CPU_POWERPC_e500v1_v10,             e500v1),
8398     /* PowerPC e500 v2.0 core                                                */
8399     POWERPC_DEF("e500_v20",      CPU_POWERPC_e500v1_v20,             e500v1),
8400     /* PowerPC e500v2 core                                                   */
8401     POWERPC_DEF("e500v2",        CPU_POWERPC_e500v2,                 e500v2),
8402     /* PowerPC e500v2 v1.0 core                                              */
8403     POWERPC_DEF("e500v2_v10",    CPU_POWERPC_e500v2_v10,             e500v2),
8404     /* PowerPC e500v2 v2.0 core                                              */
8405     POWERPC_DEF("e500v2_v20",    CPU_POWERPC_e500v2_v20,             e500v2),
8406     /* PowerPC e500v2 v2.1 core                                              */
8407     POWERPC_DEF("e500v2_v21",    CPU_POWERPC_e500v2_v21,             e500v2),
8408     /* PowerPC e500v2 v2.2 core                                              */
8409     POWERPC_DEF("e500v2_v22",    CPU_POWERPC_e500v2_v22,             e500v2),
8410     /* PowerPC e500v2 v3.0 core                                              */
8411     POWERPC_DEF("e500v2_v30",    CPU_POWERPC_e500v2_v30,             e500v2),
8412     /* PowerPC e500 microcontrollers                                         */
8413     /* MPC8533                                                               */
8414     POWERPC_DEF_SVR("MPC8533",
8415                     CPU_POWERPC_MPC8533,      POWERPC_SVR_8533,      e500v2),
8416     /* MPC8533 v1.0                                                          */
8417     POWERPC_DEF_SVR("MPC8533_v10",
8418                     CPU_POWERPC_MPC8533_v10,  POWERPC_SVR_8533_v10,  e500v2),
8419     /* MPC8533 v1.1                                                          */
8420     POWERPC_DEF_SVR("MPC8533_v11",
8421                     CPU_POWERPC_MPC8533_v11,  POWERPC_SVR_8533_v11,  e500v2),
8422     /* MPC8533E                                                              */
8423     POWERPC_DEF_SVR("MPC8533E",
8424                     CPU_POWERPC_MPC8533E,     POWERPC_SVR_8533E,     e500v2),
8425     /* MPC8533E v1.0                                                         */
8426     POWERPC_DEF_SVR("MPC8533E_v10",
8427                     CPU_POWERPC_MPC8533E_v10, POWERPC_SVR_8533E_v10, e500v2),
8428     POWERPC_DEF_SVR("MPC8533E_v11",
8429                     CPU_POWERPC_MPC8533E_v11, POWERPC_SVR_8533E_v11, e500v2),
8430     /* MPC8540                                                               */
8431     POWERPC_DEF_SVR("MPC8540",
8432                     CPU_POWERPC_MPC8540,      POWERPC_SVR_8540,      e500v1),
8433     /* MPC8540 v1.0                                                          */
8434     POWERPC_DEF_SVR("MPC8540_v10",
8435                     CPU_POWERPC_MPC8540_v10,  POWERPC_SVR_8540_v10,  e500v1),
8436     /* MPC8540 v2.0                                                          */
8437     POWERPC_DEF_SVR("MPC8540_v20",
8438                     CPU_POWERPC_MPC8540_v20,  POWERPC_SVR_8540_v20,  e500v1),
8439     /* MPC8540 v2.1                                                          */
8440     POWERPC_DEF_SVR("MPC8540_v21",
8441                     CPU_POWERPC_MPC8540_v21,  POWERPC_SVR_8540_v21,  e500v1),
8442     /* MPC8541                                                               */
8443     POWERPC_DEF_SVR("MPC8541",
8444                     CPU_POWERPC_MPC8541,      POWERPC_SVR_8541,      e500v1),
8445     /* MPC8541 v1.0                                                          */
8446     POWERPC_DEF_SVR("MPC8541_v10",
8447                     CPU_POWERPC_MPC8541_v10,  POWERPC_SVR_8541_v10,  e500v1),
8448     /* MPC8541 v1.1                                                          */
8449     POWERPC_DEF_SVR("MPC8541_v11",
8450                     CPU_POWERPC_MPC8541_v11,  POWERPC_SVR_8541_v11,  e500v1),
8451     /* MPC8541E                                                              */
8452     POWERPC_DEF_SVR("MPC8541E",
8453                     CPU_POWERPC_MPC8541E,     POWERPC_SVR_8541E,     e500v1),
8454     /* MPC8541E v1.0                                                         */
8455     POWERPC_DEF_SVR("MPC8541E_v10",
8456                     CPU_POWERPC_MPC8541E_v10, POWERPC_SVR_8541E_v10, e500v1),
8457     /* MPC8541E v1.1                                                         */
8458     POWERPC_DEF_SVR("MPC8541E_v11",
8459                     CPU_POWERPC_MPC8541E_v11, POWERPC_SVR_8541E_v11, e500v1),
8460     /* MPC8543                                                               */
8461     POWERPC_DEF_SVR("MPC8543",
8462                     CPU_POWERPC_MPC8543,      POWERPC_SVR_8543,      e500v2),
8463     /* MPC8543 v1.0                                                          */
8464     POWERPC_DEF_SVR("MPC8543_v10",
8465                     CPU_POWERPC_MPC8543_v10,  POWERPC_SVR_8543_v10,  e500v2),
8466     /* MPC8543 v1.1                                                          */
8467     POWERPC_DEF_SVR("MPC8543_v11",
8468                     CPU_POWERPC_MPC8543_v11,  POWERPC_SVR_8543_v11,  e500v2),
8469     /* MPC8543 v2.0                                                          */
8470     POWERPC_DEF_SVR("MPC8543_v20",
8471                     CPU_POWERPC_MPC8543_v20,  POWERPC_SVR_8543_v20,  e500v2),
8472     /* MPC8543 v2.1                                                          */
8473     POWERPC_DEF_SVR("MPC8543_v21",
8474                     CPU_POWERPC_MPC8543_v21,  POWERPC_SVR_8543_v21,  e500v2),
8475     /* MPC8543E                                                              */
8476     POWERPC_DEF_SVR("MPC8543E",
8477                     CPU_POWERPC_MPC8543E,     POWERPC_SVR_8543E,     e500v2),
8478     /* MPC8543E v1.0                                                         */
8479     POWERPC_DEF_SVR("MPC8543E_v10",
8480                     CPU_POWERPC_MPC8543E_v10, POWERPC_SVR_8543E_v10, e500v2),
8481     /* MPC8543E v1.1                                                         */
8482     POWERPC_DEF_SVR("MPC8543E_v11",
8483                     CPU_POWERPC_MPC8543E_v11, POWERPC_SVR_8543E_v11, e500v2),
8484     /* MPC8543E v2.0                                                         */
8485     POWERPC_DEF_SVR("MPC8543E_v20",
8486                     CPU_POWERPC_MPC8543E_v20, POWERPC_SVR_8543E_v20, e500v2),
8487     /* MPC8543E v2.1                                                         */
8488     POWERPC_DEF_SVR("MPC8543E_v21",
8489                     CPU_POWERPC_MPC8543E_v21, POWERPC_SVR_8543E_v21, e500v2),
8490     /* MPC8544                                                               */
8491     POWERPC_DEF_SVR("MPC8544",
8492                     CPU_POWERPC_MPC8544,      POWERPC_SVR_8544,      e500v2),
8493     /* MPC8544 v1.0                                                          */
8494     POWERPC_DEF_SVR("MPC8544_v10",
8495                     CPU_POWERPC_MPC8544_v10,  POWERPC_SVR_8544_v10,  e500v2),
8496     /* MPC8544 v1.1                                                          */
8497     POWERPC_DEF_SVR("MPC8544_v11",
8498                     CPU_POWERPC_MPC8544_v11,  POWERPC_SVR_8544_v11,  e500v2),
8499     /* MPC8544E                                                              */
8500     POWERPC_DEF_SVR("MPC8544E",
8501                     CPU_POWERPC_MPC8544E,     POWERPC_SVR_8544E,     e500v2),
8502     /* MPC8544E v1.0                                                         */
8503     POWERPC_DEF_SVR("MPC8544E_v10",
8504                     CPU_POWERPC_MPC8544E_v10, POWERPC_SVR_8544E_v10, e500v2),
8505     /* MPC8544E v1.1                                                         */
8506     POWERPC_DEF_SVR("MPC8544E_v11",
8507                     CPU_POWERPC_MPC8544E_v11, POWERPC_SVR_8544E_v11, e500v2),
8508     /* MPC8545                                                               */
8509     POWERPC_DEF_SVR("MPC8545",
8510                     CPU_POWERPC_MPC8545,      POWERPC_SVR_8545,      e500v2),
8511     /* MPC8545 v2.0                                                          */
8512     POWERPC_DEF_SVR("MPC8545_v20",
8513                     CPU_POWERPC_MPC8545_v20,  POWERPC_SVR_8545_v20,  e500v2),
8514     /* MPC8545 v2.1                                                          */
8515     POWERPC_DEF_SVR("MPC8545_v21",
8516                     CPU_POWERPC_MPC8545_v21,  POWERPC_SVR_8545_v21,  e500v2),
8517     /* MPC8545E                                                              */
8518     POWERPC_DEF_SVR("MPC8545E",
8519                     CPU_POWERPC_MPC8545E,     POWERPC_SVR_8545E,     e500v2),
8520     /* MPC8545E v2.0                                                         */
8521     POWERPC_DEF_SVR("MPC8545E_v20",
8522                     CPU_POWERPC_MPC8545E_v20, POWERPC_SVR_8545E_v20, e500v2),
8523     /* MPC8545E v2.1                                                         */
8524     POWERPC_DEF_SVR("MPC8545E_v21",
8525                     CPU_POWERPC_MPC8545E_v21, POWERPC_SVR_8545E_v21, e500v2),
8526     /* MPC8547E                                                              */
8527     POWERPC_DEF_SVR("MPC8547E",
8528                     CPU_POWERPC_MPC8547E,     POWERPC_SVR_8547E,     e500v2),
8529     /* MPC8547E v2.0                                                         */
8530     POWERPC_DEF_SVR("MPC8547E_v20",
8531                     CPU_POWERPC_MPC8547E_v20, POWERPC_SVR_8547E_v20, e500v2),
8532     /* MPC8547E v2.1                                                         */
8533     POWERPC_DEF_SVR("MPC8547E_v21",
8534                     CPU_POWERPC_MPC8547E_v21, POWERPC_SVR_8547E_v21, e500v2),
8535     /* MPC8548                                                               */
8536     POWERPC_DEF_SVR("MPC8548",
8537                     CPU_POWERPC_MPC8548,      POWERPC_SVR_8548,      e500v2),
8538     /* MPC8548 v1.0                                                          */
8539     POWERPC_DEF_SVR("MPC8548_v10",
8540                     CPU_POWERPC_MPC8548_v10,  POWERPC_SVR_8548_v10,  e500v2),
8541     /* MPC8548 v1.1                                                          */
8542     POWERPC_DEF_SVR("MPC8548_v11",
8543                     CPU_POWERPC_MPC8548_v11,  POWERPC_SVR_8548_v11,  e500v2),
8544     /* MPC8548 v2.0                                                          */
8545     POWERPC_DEF_SVR("MPC8548_v20",
8546                     CPU_POWERPC_MPC8548_v20,  POWERPC_SVR_8548_v20,  e500v2),
8547     /* MPC8548 v2.1                                                          */
8548     POWERPC_DEF_SVR("MPC8548_v21",
8549                     CPU_POWERPC_MPC8548_v21,  POWERPC_SVR_8548_v21,  e500v2),
8550     /* MPC8548E                                                              */
8551     POWERPC_DEF_SVR("MPC8548E",
8552                     CPU_POWERPC_MPC8548E,     POWERPC_SVR_8548E,     e500v2),
8553     /* MPC8548E v1.0                                                         */
8554     POWERPC_DEF_SVR("MPC8548E_v10",
8555                     CPU_POWERPC_MPC8548E_v10, POWERPC_SVR_8548E_v10, e500v2),
8556     /* MPC8548E v1.1                                                         */
8557     POWERPC_DEF_SVR("MPC8548E_v11",
8558                     CPU_POWERPC_MPC8548E_v11, POWERPC_SVR_8548E_v11, e500v2),
8559     /* MPC8548E v2.0                                                         */
8560     POWERPC_DEF_SVR("MPC8548E_v20",
8561                     CPU_POWERPC_MPC8548E_v20, POWERPC_SVR_8548E_v20, e500v2),
8562     /* MPC8548E v2.1                                                         */
8563     POWERPC_DEF_SVR("MPC8548E_v21",
8564                     CPU_POWERPC_MPC8548E_v21, POWERPC_SVR_8548E_v21, e500v2),
8565     /* MPC8555                                                               */
8566     POWERPC_DEF_SVR("MPC8555",
8567                     CPU_POWERPC_MPC8555,      POWERPC_SVR_8555,      e500v2),
8568     /* MPC8555 v1.0                                                          */
8569     POWERPC_DEF_SVR("MPC8555_v10",
8570                     CPU_POWERPC_MPC8555_v10,  POWERPC_SVR_8555_v10,  e500v2),
8571     /* MPC8555 v1.1                                                          */
8572     POWERPC_DEF_SVR("MPC8555_v11",
8573                     CPU_POWERPC_MPC8555_v11,  POWERPC_SVR_8555_v11,  e500v2),
8574     /* MPC8555E                                                              */
8575     POWERPC_DEF_SVR("MPC8555E",
8576                     CPU_POWERPC_MPC8555E,     POWERPC_SVR_8555E,     e500v2),
8577     /* MPC8555E v1.0                                                         */
8578     POWERPC_DEF_SVR("MPC8555E_v10",
8579                     CPU_POWERPC_MPC8555E_v10, POWERPC_SVR_8555E_v10, e500v2),
8580     /* MPC8555E v1.1                                                         */
8581     POWERPC_DEF_SVR("MPC8555E_v11",
8582                     CPU_POWERPC_MPC8555E_v11, POWERPC_SVR_8555E_v11, e500v2),
8583     /* MPC8560                                                               */
8584     POWERPC_DEF_SVR("MPC8560",
8585                     CPU_POWERPC_MPC8560,      POWERPC_SVR_8560,      e500v2),
8586     /* MPC8560 v1.0                                                          */
8587     POWERPC_DEF_SVR("MPC8560_v10",
8588                     CPU_POWERPC_MPC8560_v10,  POWERPC_SVR_8560_v10,  e500v2),
8589     /* MPC8560 v2.0                                                          */
8590     POWERPC_DEF_SVR("MPC8560_v20",
8591                     CPU_POWERPC_MPC8560_v20,  POWERPC_SVR_8560_v20,  e500v2),
8592     /* MPC8560 v2.1                                                          */
8593     POWERPC_DEF_SVR("MPC8560_v21",
8594                     CPU_POWERPC_MPC8560_v21,  POWERPC_SVR_8560_v21,  e500v2),
8595     /* MPC8567                                                               */
8596     POWERPC_DEF_SVR("MPC8567",
8597                     CPU_POWERPC_MPC8567,      POWERPC_SVR_8567,      e500v2),
8598     /* MPC8567E                                                              */
8599     POWERPC_DEF_SVR("MPC8567E",
8600                     CPU_POWERPC_MPC8567E,     POWERPC_SVR_8567E,     e500v2),
8601     /* MPC8568                                                               */
8602     POWERPC_DEF_SVR("MPC8568",
8603                     CPU_POWERPC_MPC8568,      POWERPC_SVR_8568,      e500v2),
8604     /* MPC8568E                                                              */
8605     POWERPC_DEF_SVR("MPC8568E",
8606                     CPU_POWERPC_MPC8568E,     POWERPC_SVR_8568E,     e500v2),
8607     /* MPC8572                                                               */
8608     POWERPC_DEF_SVR("MPC8572",
8609                     CPU_POWERPC_MPC8572,      POWERPC_SVR_8572,      e500v2),
8610     /* MPC8572E                                                              */
8611     POWERPC_DEF_SVR("MPC8572E",
8612                     CPU_POWERPC_MPC8572E,     POWERPC_SVR_8572E,     e500v2),
8613     /* e600 family                                                           */
8614     /* PowerPC e600 core                                                     */
8615     POWERPC_DEF("e600",          CPU_POWERPC_e600,                   7400),
8616     /* PowerPC e600 microcontrollers                                         */
8617 #if defined (TODO)
8618     /* MPC8610                                                               */
8619     POWERPC_DEF_SVR("MPC8610",
8620                     CPU_POWERPC_MPC8610,      POWERPC_SVR_8610,      7400),
8621 #endif
8622     /* MPC8641                                                               */
8623     POWERPC_DEF_SVR("MPC8641",
8624                     CPU_POWERPC_MPC8641,      POWERPC_SVR_8641,      7400),
8625     /* MPC8641D                                                              */
8626     POWERPC_DEF_SVR("MPC8641D",
8627                     CPU_POWERPC_MPC8641D,     POWERPC_SVR_8641D,     7400),
8628     /* 32 bits "classic" PowerPC                                             */
8629     /* PowerPC 6xx family                                                    */
8630     /* PowerPC 601                                                           */
8631     POWERPC_DEF("601",           CPU_POWERPC_601,                    601v),
8632     /* PowerPC 601v0                                                         */
8633     POWERPC_DEF("601_v0",        CPU_POWERPC_601_v0,                 601),
8634     /* PowerPC 601v1                                                         */
8635     POWERPC_DEF("601_v1",        CPU_POWERPC_601_v1,                 601),
8636     /* PowerPC 601v                                                          */
8637     POWERPC_DEF("601v",          CPU_POWERPC_601v,                   601v),
8638     /* PowerPC 601v2                                                         */
8639     POWERPC_DEF("601_v2",        CPU_POWERPC_601_v2,                 601v),
8640     /* PowerPC 602                                                           */
8641     POWERPC_DEF("602",           CPU_POWERPC_602,                    602),
8642     /* PowerPC 603                                                           */
8643     POWERPC_DEF("603",           CPU_POWERPC_603,                    603),
8644     /* Code name for PowerPC 603                                             */
8645     POWERPC_DEF("Vanilla",       CPU_POWERPC_603,                    603),
8646     /* PowerPC 603e (aka PID6)                                               */
8647     POWERPC_DEF("603e",          CPU_POWERPC_603E,                   603E),
8648     /* Code name for PowerPC 603e                                            */
8649     POWERPC_DEF("Stretch",       CPU_POWERPC_603E,                   603E),
8650     /* PowerPC 603e v1.1                                                     */
8651     POWERPC_DEF("603e_v1.1",     CPU_POWERPC_603E_v11,               603E),
8652     /* PowerPC 603e v1.2                                                     */
8653     POWERPC_DEF("603e_v1.2",     CPU_POWERPC_603E_v12,               603E),
8654     /* PowerPC 603e v1.3                                                     */
8655     POWERPC_DEF("603e_v1.3",     CPU_POWERPC_603E_v13,               603E),
8656     /* PowerPC 603e v1.4                                                     */
8657     POWERPC_DEF("603e_v1.4",     CPU_POWERPC_603E_v14,               603E),
8658     /* PowerPC 603e v2.2                                                     */
8659     POWERPC_DEF("603e_v2.2",     CPU_POWERPC_603E_v22,               603E),
8660     /* PowerPC 603e v3                                                       */
8661     POWERPC_DEF("603e_v3",       CPU_POWERPC_603E_v3,                603E),
8662     /* PowerPC 603e v4                                                       */
8663     POWERPC_DEF("603e_v4",       CPU_POWERPC_603E_v4,                603E),
8664     /* PowerPC 603e v4.1                                                     */
8665     POWERPC_DEF("603e_v4.1",     CPU_POWERPC_603E_v41,               603E),
8666     /* PowerPC 603e (aka PID7)                                               */
8667     POWERPC_DEF("603e7",         CPU_POWERPC_603E7,                  603E),
8668     /* PowerPC 603e7t                                                        */
8669     POWERPC_DEF("603e7t",        CPU_POWERPC_603E7t,                 603E),
8670     /* PowerPC 603e7v                                                        */
8671     POWERPC_DEF("603e7v",        CPU_POWERPC_603E7v,                 603E),
8672     /* Code name for PowerPC 603ev                                           */
8673     POWERPC_DEF("Vaillant",      CPU_POWERPC_603E7v,                 603E),
8674     /* PowerPC 603e7v1                                                       */
8675     POWERPC_DEF("603e7v1",       CPU_POWERPC_603E7v1,                603E),
8676     /* PowerPC 603e7v2                                                       */
8677     POWERPC_DEF("603e7v2",       CPU_POWERPC_603E7v2,                603E),
8678     /* PowerPC 603p (aka PID7v)                                              */
8679     POWERPC_DEF("603p",          CPU_POWERPC_603P,                   603E),
8680     /* PowerPC 603r (aka PID7t)                                              */
8681     POWERPC_DEF("603r",          CPU_POWERPC_603R,                   603E),
8682     /* Code name for PowerPC 603r                                            */
8683     POWERPC_DEF("Goldeneye",     CPU_POWERPC_603R,                   603E),
8684     /* PowerPC 604                                                           */
8685     POWERPC_DEF("604",           CPU_POWERPC_604,                    604),
8686     /* PowerPC 604e (aka PID9)                                               */
8687     POWERPC_DEF("604e",          CPU_POWERPC_604E,                   604E),
8688     /* Code name for PowerPC 604e                                            */
8689     POWERPC_DEF("Sirocco",       CPU_POWERPC_604E,                   604E),
8690     /* PowerPC 604e v1.0                                                     */
8691     POWERPC_DEF("604e_v1.0",     CPU_POWERPC_604E_v10,               604E),
8692     /* PowerPC 604e v2.2                                                     */
8693     POWERPC_DEF("604e_v2.2",     CPU_POWERPC_604E_v22,               604E),
8694     /* PowerPC 604e v2.4                                                     */
8695     POWERPC_DEF("604e_v2.4",     CPU_POWERPC_604E_v24,               604E),
8696     /* PowerPC 604r (aka PIDA)                                               */
8697     POWERPC_DEF("604r",          CPU_POWERPC_604R,                   604E),
8698     /* Code name for PowerPC 604r                                            */
8699     POWERPC_DEF("Mach5",         CPU_POWERPC_604R,                   604E),
8700 #if defined(TODO)
8701     /* PowerPC 604ev                                                         */
8702     POWERPC_DEF("604ev",         CPU_POWERPC_604EV,                  604E),
8703 #endif
8704     /* PowerPC 7xx family                                                    */
8705     /* Generic PowerPC 740 (G3)                                              */
8706     POWERPC_DEF("740",           CPU_POWERPC_7x0,                    740),
8707     /* Code name for PowerPC 740                                             */
8708     POWERPC_DEF("Arthur",        CPU_POWERPC_7x0,                    740),
8709     /* Generic PowerPC 750 (G3)                                              */
8710     POWERPC_DEF("750",           CPU_POWERPC_7x0,                    750),
8711     /* Code name for PowerPC 750                                             */
8712     POWERPC_DEF("Typhoon",       CPU_POWERPC_7x0,                    750),
8713     /* PowerPC 740/750 is also known as G3                                   */
8714     POWERPC_DEF("G3",            CPU_POWERPC_7x0,                    750),
8715     /* PowerPC 740 v1.0 (G3)                                                 */
8716     POWERPC_DEF("740_v1.0",      CPU_POWERPC_7x0_v10,                740),
8717     /* PowerPC 750 v1.0 (G3)                                                 */
8718     POWERPC_DEF("750_v1.0",      CPU_POWERPC_7x0_v10,                750),
8719     /* PowerPC 740 v2.0 (G3)                                                 */
8720     POWERPC_DEF("740_v2.0",      CPU_POWERPC_7x0_v20,                740),
8721     /* PowerPC 750 v2.0 (G3)                                                 */
8722     POWERPC_DEF("750_v2.0",      CPU_POWERPC_7x0_v20,                750),
8723     /* PowerPC 740 v2.1 (G3)                                                 */
8724     POWERPC_DEF("740_v2.1",      CPU_POWERPC_7x0_v21,                740),
8725     /* PowerPC 750 v2.1 (G3)                                                 */
8726     POWERPC_DEF("750_v2.1",      CPU_POWERPC_7x0_v21,                750),
8727     /* PowerPC 740 v2.2 (G3)                                                 */
8728     POWERPC_DEF("740_v2.2",      CPU_POWERPC_7x0_v22,                740),
8729     /* PowerPC 750 v2.2 (G3)                                                 */
8730     POWERPC_DEF("750_v2.2",      CPU_POWERPC_7x0_v22,                750),
8731     /* PowerPC 740 v3.0 (G3)                                                 */
8732     POWERPC_DEF("740_v3.0",      CPU_POWERPC_7x0_v30,                740),
8733     /* PowerPC 750 v3.0 (G3)                                                 */
8734     POWERPC_DEF("750_v3.0",      CPU_POWERPC_7x0_v30,                750),
8735     /* PowerPC 740 v3.1 (G3)                                                 */
8736     POWERPC_DEF("740_v3.1",      CPU_POWERPC_7x0_v31,                740),
8737     /* PowerPC 750 v3.1 (G3)                                                 */
8738     POWERPC_DEF("750_v3.1",      CPU_POWERPC_7x0_v31,                750),
8739     /* PowerPC 740E (G3)                                                     */
8740     POWERPC_DEF("740e",          CPU_POWERPC_740E,                   740),
8741     /* PowerPC 750E (G3)                                                     */
8742     POWERPC_DEF("750e",          CPU_POWERPC_750E,                   750),
8743     /* PowerPC 740P (G3)                                                     */
8744     POWERPC_DEF("740p",          CPU_POWERPC_7x0P,                   740),
8745     /* PowerPC 750P (G3)                                                     */
8746     POWERPC_DEF("750p",          CPU_POWERPC_7x0P,                   750),
8747     /* Code name for PowerPC 740P/750P (G3)                                  */
8748     POWERPC_DEF("Conan/Doyle",   CPU_POWERPC_7x0P,                   750),
8749     /* PowerPC 750CL (G3 embedded)                                           */
8750     POWERPC_DEF("750cl",         CPU_POWERPC_750CL,                  750cl),
8751     /* PowerPC 750CL v1.0                                                    */
8752     POWERPC_DEF("750cl_v1.0",    CPU_POWERPC_750CL_v10,              750cl),
8753     /* PowerPC 750CL v2.0                                                    */
8754     POWERPC_DEF("750cl_v2.0",    CPU_POWERPC_750CL_v20,              750cl),
8755     /* PowerPC 750CX (G3 embedded)                                           */
8756     POWERPC_DEF("750cx",         CPU_POWERPC_750CX,                  750cx),
8757     /* PowerPC 750CX v1.0 (G3 embedded)                                      */
8758     POWERPC_DEF("750cx_v1.0",    CPU_POWERPC_750CX_v10,              750cx),
8759     /* PowerPC 750CX v2.1 (G3 embedded)                                      */
8760     POWERPC_DEF("750cx_v2.0",    CPU_POWERPC_750CX_v20,              750cx),
8761     /* PowerPC 750CX v2.1 (G3 embedded)                                      */
8762     POWERPC_DEF("750cx_v2.1",    CPU_POWERPC_750CX_v21,              750cx),
8763     /* PowerPC 750CX v2.2 (G3 embedded)                                      */
8764     POWERPC_DEF("750cx_v2.2",    CPU_POWERPC_750CX_v22,              750cx),
8765     /* PowerPC 750CXe (G3 embedded)                                          */
8766     POWERPC_DEF("750cxe",        CPU_POWERPC_750CXE,                 750cx),
8767     /* PowerPC 750CXe v2.1 (G3 embedded)                                     */
8768     POWERPC_DEF("750cxe_v2.1",   CPU_POWERPC_750CXE_v21,             750cx),
8769     /* PowerPC 750CXe v2.2 (G3 embedded)                                     */
8770     POWERPC_DEF("750cxe_v2.2",   CPU_POWERPC_750CXE_v22,             750cx),
8771     /* PowerPC 750CXe v2.3 (G3 embedded)                                     */
8772     POWERPC_DEF("750cxe_v2.3",   CPU_POWERPC_750CXE_v23,             750cx),
8773     /* PowerPC 750CXe v2.4 (G3 embedded)                                     */
8774     POWERPC_DEF("750cxe_v2.4",   CPU_POWERPC_750CXE_v24,             750cx),
8775     /* PowerPC 750CXe v2.4b (G3 embedded)                                    */
8776     POWERPC_DEF("750cxe_v2.4b",  CPU_POWERPC_750CXE_v24b,            750cx),
8777     /* PowerPC 750CXe v3.0 (G3 embedded)                                     */
8778     POWERPC_DEF("750cxe_v3.0",   CPU_POWERPC_750CXE_v30,             750cx),
8779     /* PowerPC 750CXe v3.1 (G3 embedded)                                     */
8780     POWERPC_DEF("750cxe_v3.1",   CPU_POWERPC_750CXE_v31,             750cx),
8781     /* PowerPC 750CXe v3.1b (G3 embedded)                                    */
8782     POWERPC_DEF("750cxe_v3.1b",  CPU_POWERPC_750CXE_v31b,            750cx),
8783     /* PowerPC 750CXr (G3 embedded)                                          */
8784     POWERPC_DEF("750cxr",        CPU_POWERPC_750CXR,                 750cx),
8785     /* PowerPC 750FL (G3 embedded)                                           */
8786     POWERPC_DEF("750fl",         CPU_POWERPC_750FL,                  750fx),
8787     /* PowerPC 750FX (G3 embedded)                                           */
8788     POWERPC_DEF("750fx",         CPU_POWERPC_750FX,                  750fx),
8789     /* PowerPC 750FX v1.0 (G3 embedded)                                      */
8790     POWERPC_DEF("750fx_v1.0",    CPU_POWERPC_750FX_v10,              750fx),
8791     /* PowerPC 750FX v2.0 (G3 embedded)                                      */
8792     POWERPC_DEF("750fx_v2.0",    CPU_POWERPC_750FX_v20,              750fx),
8793     /* PowerPC 750FX v2.1 (G3 embedded)                                      */
8794     POWERPC_DEF("750fx_v2.1",    CPU_POWERPC_750FX_v21,              750fx),
8795     /* PowerPC 750FX v2.2 (G3 embedded)                                      */
8796     POWERPC_DEF("750fx_v2.2",    CPU_POWERPC_750FX_v22,              750fx),
8797     /* PowerPC 750FX v2.3 (G3 embedded)                                      */
8798     POWERPC_DEF("750fx_v2.3",    CPU_POWERPC_750FX_v23,              750fx),
8799     /* PowerPC 750GL (G3 embedded)                                           */
8800     POWERPC_DEF("750gl",         CPU_POWERPC_750GL,                  750gx),
8801     /* PowerPC 750GX (G3 embedded)                                           */
8802     POWERPC_DEF("750gx",         CPU_POWERPC_750GX,                  750gx),
8803     /* PowerPC 750GX v1.0 (G3 embedded)                                      */
8804     POWERPC_DEF("750gx_v1.0",    CPU_POWERPC_750GX_v10,              750gx),
8805     /* PowerPC 750GX v1.1 (G3 embedded)                                      */
8806     POWERPC_DEF("750gx_v1.1",    CPU_POWERPC_750GX_v11,              750gx),
8807     /* PowerPC 750GX v1.2 (G3 embedded)                                      */
8808     POWERPC_DEF("750gx_v1.2",    CPU_POWERPC_750GX_v12,              750gx),
8809     /* PowerPC 750L (G3 embedded)                                            */
8810     POWERPC_DEF("750l",          CPU_POWERPC_750L,                   750),
8811     /* Code name for PowerPC 750L (G3 embedded)                              */
8812     POWERPC_DEF("LoneStar",      CPU_POWERPC_750L,                   750),
8813     /* PowerPC 750L v2.0 (G3 embedded)                                       */
8814     POWERPC_DEF("750l_v2.0",     CPU_POWERPC_750L_v20,               750),
8815     /* PowerPC 750L v2.1 (G3 embedded)                                       */
8816     POWERPC_DEF("750l_v2.1",     CPU_POWERPC_750L_v21,               750),
8817     /* PowerPC 750L v2.2 (G3 embedded)                                       */
8818     POWERPC_DEF("750l_v2.2",     CPU_POWERPC_750L_v22,               750),
8819     /* PowerPC 750L v3.0 (G3 embedded)                                       */
8820     POWERPC_DEF("750l_v3.0",     CPU_POWERPC_750L_v30,               750),
8821     /* PowerPC 750L v3.2 (G3 embedded)                                       */
8822     POWERPC_DEF("750l_v3.2",     CPU_POWERPC_750L_v32,               750),
8823     /* Generic PowerPC 745                                                   */
8824     POWERPC_DEF("745",           CPU_POWERPC_7x5,                    745),
8825     /* Generic PowerPC 755                                                   */
8826     POWERPC_DEF("755",           CPU_POWERPC_7x5,                    755),
8827     /* Code name for PowerPC 745/755                                         */
8828     POWERPC_DEF("Goldfinger",    CPU_POWERPC_7x5,                    755),
8829     /* PowerPC 745 v1.0                                                      */
8830     POWERPC_DEF("745_v1.0",      CPU_POWERPC_7x5_v10,                745),
8831     /* PowerPC 755 v1.0                                                      */
8832     POWERPC_DEF("755_v1.0",      CPU_POWERPC_7x5_v10,                755),
8833     /* PowerPC 745 v1.1                                                      */
8834     POWERPC_DEF("745_v1.1",      CPU_POWERPC_7x5_v11,                745),
8835     /* PowerPC 755 v1.1                                                      */
8836     POWERPC_DEF("755_v1.1",      CPU_POWERPC_7x5_v11,                755),
8837     /* PowerPC 745 v2.0                                                      */
8838     POWERPC_DEF("745_v2.0",      CPU_POWERPC_7x5_v20,                745),
8839     /* PowerPC 755 v2.0                                                      */
8840     POWERPC_DEF("755_v2.0",      CPU_POWERPC_7x5_v20,                755),
8841     /* PowerPC 745 v2.1                                                      */
8842     POWERPC_DEF("745_v2.1",      CPU_POWERPC_7x5_v21,                745),
8843     /* PowerPC 755 v2.1                                                      */
8844     POWERPC_DEF("755_v2.1",      CPU_POWERPC_7x5_v21,                755),
8845     /* PowerPC 745 v2.2                                                      */
8846     POWERPC_DEF("745_v2.2",      CPU_POWERPC_7x5_v22,                745),
8847     /* PowerPC 755 v2.2                                                      */
8848     POWERPC_DEF("755_v2.2",      CPU_POWERPC_7x5_v22,                755),
8849     /* PowerPC 745 v2.3                                                      */
8850     POWERPC_DEF("745_v2.3",      CPU_POWERPC_7x5_v23,                745),
8851     /* PowerPC 755 v2.3                                                      */
8852     POWERPC_DEF("755_v2.3",      CPU_POWERPC_7x5_v23,                755),
8853     /* PowerPC 745 v2.4                                                      */
8854     POWERPC_DEF("745_v2.4",      CPU_POWERPC_7x5_v24,                745),
8855     /* PowerPC 755 v2.4                                                      */
8856     POWERPC_DEF("755_v2.4",      CPU_POWERPC_7x5_v24,                755),
8857     /* PowerPC 745 v2.5                                                      */
8858     POWERPC_DEF("745_v2.5",      CPU_POWERPC_7x5_v25,                745),
8859     /* PowerPC 755 v2.5                                                      */
8860     POWERPC_DEF("755_v2.5",      CPU_POWERPC_7x5_v25,                755),
8861     /* PowerPC 745 v2.6                                                      */
8862     POWERPC_DEF("745_v2.6",      CPU_POWERPC_7x5_v26,                745),
8863     /* PowerPC 755 v2.6                                                      */
8864     POWERPC_DEF("755_v2.6",      CPU_POWERPC_7x5_v26,                755),
8865     /* PowerPC 745 v2.7                                                      */
8866     POWERPC_DEF("745_v2.7",      CPU_POWERPC_7x5_v27,                745),
8867     /* PowerPC 755 v2.7                                                      */
8868     POWERPC_DEF("755_v2.7",      CPU_POWERPC_7x5_v27,                755),
8869     /* PowerPC 745 v2.8                                                      */
8870     POWERPC_DEF("745_v2.8",      CPU_POWERPC_7x5_v28,                745),
8871     /* PowerPC 755 v2.8                                                      */
8872     POWERPC_DEF("755_v2.8",      CPU_POWERPC_7x5_v28,                755),
8873 #if defined (TODO)
8874     /* PowerPC 745P (G3)                                                     */
8875     POWERPC_DEF("745p",          CPU_POWERPC_7x5P,                   745),
8876     /* PowerPC 755P (G3)                                                     */
8877     POWERPC_DEF("755p",          CPU_POWERPC_7x5P,                   755),
8878 #endif
8879     /* PowerPC 74xx family                                                   */
8880     /* PowerPC 7400 (G4)                                                     */
8881     POWERPC_DEF("7400",          CPU_POWERPC_7400,                   7400),
8882     /* Code name for PowerPC 7400                                            */
8883     POWERPC_DEF("Max",           CPU_POWERPC_7400,                   7400),
8884     /* PowerPC 74xx is also well known as G4                                 */
8885     POWERPC_DEF("G4",            CPU_POWERPC_7400,                   7400),
8886     /* PowerPC 7400 v1.0 (G4)                                                */
8887     POWERPC_DEF("7400_v1.0",     CPU_POWERPC_7400_v10,               7400),
8888     /* PowerPC 7400 v1.1 (G4)                                                */
8889     POWERPC_DEF("7400_v1.1",     CPU_POWERPC_7400_v11,               7400),
8890     /* PowerPC 7400 v2.0 (G4)                                                */
8891     POWERPC_DEF("7400_v2.0",     CPU_POWERPC_7400_v20,               7400),
8892     /* PowerPC 7400 v2.1 (G4)                                                */
8893     POWERPC_DEF("7400_v2.1",     CPU_POWERPC_7400_v21,               7400),
8894     /* PowerPC 7400 v2.2 (G4)                                                */
8895     POWERPC_DEF("7400_v2.2",     CPU_POWERPC_7400_v22,               7400),
8896     /* PowerPC 7400 v2.6 (G4)                                                */
8897     POWERPC_DEF("7400_v2.6",     CPU_POWERPC_7400_v26,               7400),
8898     /* PowerPC 7400 v2.7 (G4)                                                */
8899     POWERPC_DEF("7400_v2.7",     CPU_POWERPC_7400_v27,               7400),
8900     /* PowerPC 7400 v2.8 (G4)                                                */
8901     POWERPC_DEF("7400_v2.8",     CPU_POWERPC_7400_v28,               7400),
8902     /* PowerPC 7400 v2.9 (G4)                                                */
8903     POWERPC_DEF("7400_v2.9",     CPU_POWERPC_7400_v29,               7400),
8904     /* PowerPC 7410 (G4)                                                     */
8905     POWERPC_DEF("7410",          CPU_POWERPC_7410,                   7410),
8906     /* Code name for PowerPC 7410                                            */
8907     POWERPC_DEF("Nitro",         CPU_POWERPC_7410,                   7410),
8908     /* PowerPC 7410 v1.0 (G4)                                                */
8909     POWERPC_DEF("7410_v1.0",     CPU_POWERPC_7410_v10,               7410),
8910     /* PowerPC 7410 v1.1 (G4)                                                */
8911     POWERPC_DEF("7410_v1.1",     CPU_POWERPC_7410_v11,               7410),
8912     /* PowerPC 7410 v1.2 (G4)                                                */
8913     POWERPC_DEF("7410_v1.2",     CPU_POWERPC_7410_v12,               7410),
8914     /* PowerPC 7410 v1.3 (G4)                                                */
8915     POWERPC_DEF("7410_v1.3",     CPU_POWERPC_7410_v13,               7410),
8916     /* PowerPC 7410 v1.4 (G4)                                                */
8917     POWERPC_DEF("7410_v1.4",     CPU_POWERPC_7410_v14,               7410),
8918     /* PowerPC 7448 (G4)                                                     */
8919     POWERPC_DEF("7448",          CPU_POWERPC_7448,                   7400),
8920     /* PowerPC 7448 v1.0 (G4)                                                */
8921     POWERPC_DEF("7448_v1.0",     CPU_POWERPC_7448_v10,               7400),
8922     /* PowerPC 7448 v1.1 (G4)                                                */
8923     POWERPC_DEF("7448_v1.1",     CPU_POWERPC_7448_v11,               7400),
8924     /* PowerPC 7448 v2.0 (G4)                                                */
8925     POWERPC_DEF("7448_v2.0",     CPU_POWERPC_7448_v20,               7400),
8926     /* PowerPC 7448 v2.1 (G4)                                                */
8927     POWERPC_DEF("7448_v2.1",     CPU_POWERPC_7448_v21,               7400),
8928     /* PowerPC 7450 (G4)                                                     */
8929     POWERPC_DEF("7450",          CPU_POWERPC_7450,                   7450),
8930     /* Code name for PowerPC 7450                                            */
8931     POWERPC_DEF("Vger",          CPU_POWERPC_7450,                   7450),
8932     /* PowerPC 7450 v1.0 (G4)                                                */
8933     POWERPC_DEF("7450_v1.0",     CPU_POWERPC_7450_v10,               7450),
8934     /* PowerPC 7450 v1.1 (G4)                                                */
8935     POWERPC_DEF("7450_v1.1",     CPU_POWERPC_7450_v11,               7450),
8936     /* PowerPC 7450 v1.2 (G4)                                                */
8937     POWERPC_DEF("7450_v1.2",     CPU_POWERPC_7450_v12,               7450),
8938     /* PowerPC 7450 v2.0 (G4)                                                */
8939     POWERPC_DEF("7450_v2.0",     CPU_POWERPC_7450_v20,               7450),
8940     /* PowerPC 7450 v2.1 (G4)                                                */
8941     POWERPC_DEF("7450_v2.1",     CPU_POWERPC_7450_v21,               7450),
8942     /* PowerPC 7441 (G4)                                                     */
8943     POWERPC_DEF("7441",          CPU_POWERPC_74x1,                   7440),
8944     /* PowerPC 7451 (G4)                                                     */
8945     POWERPC_DEF("7451",          CPU_POWERPC_74x1,                   7450),
8946     /* PowerPC 7441 v2.1 (G4)                                                */
8947     POWERPC_DEF("7441_v2.1",     CPU_POWERPC_7450_v21,               7440),
8948     /* PowerPC 7441 v2.3 (G4)                                                */
8949     POWERPC_DEF("7441_v2.3",     CPU_POWERPC_74x1_v23,               7440),
8950     /* PowerPC 7451 v2.3 (G4)                                                */
8951     POWERPC_DEF("7451_v2.3",     CPU_POWERPC_74x1_v23,               7450),
8952     /* PowerPC 7441 v2.10 (G4)                                                */
8953     POWERPC_DEF("7441_v2.10",    CPU_POWERPC_74x1_v210,              7440),
8954     /* PowerPC 7451 v2.10 (G4)                                               */
8955     POWERPC_DEF("7451_v2.10",    CPU_POWERPC_74x1_v210,              7450),
8956     /* PowerPC 7445 (G4)                                                     */
8957     POWERPC_DEF("7445",          CPU_POWERPC_74x5,                   7445),
8958     /* PowerPC 7455 (G4)                                                     */
8959     POWERPC_DEF("7455",          CPU_POWERPC_74x5,                   7455),
8960     /* Code name for PowerPC 7445/7455                                       */
8961     POWERPC_DEF("Apollo6",       CPU_POWERPC_74x5,                   7455),
8962     /* PowerPC 7445 v1.0 (G4)                                                */
8963     POWERPC_DEF("7445_v1.0",     CPU_POWERPC_74x5_v10,               7445),
8964     /* PowerPC 7455 v1.0 (G4)                                                */
8965     POWERPC_DEF("7455_v1.0",     CPU_POWERPC_74x5_v10,               7455),
8966     /* PowerPC 7445 v2.1 (G4)                                                */
8967     POWERPC_DEF("7445_v2.1",     CPU_POWERPC_74x5_v21,               7445),
8968     /* PowerPC 7455 v2.1 (G4)                                                */
8969     POWERPC_DEF("7455_v2.1",     CPU_POWERPC_74x5_v21,               7455),
8970     /* PowerPC 7445 v3.2 (G4)                                                */
8971     POWERPC_DEF("7445_v3.2",     CPU_POWERPC_74x5_v32,               7445),
8972     /* PowerPC 7455 v3.2 (G4)                                                */
8973     POWERPC_DEF("7455_v3.2",     CPU_POWERPC_74x5_v32,               7455),
8974     /* PowerPC 7445 v3.3 (G4)                                                */
8975     POWERPC_DEF("7445_v3.3",     CPU_POWERPC_74x5_v33,               7445),
8976     /* PowerPC 7455 v3.3 (G4)                                                */
8977     POWERPC_DEF("7455_v3.3",     CPU_POWERPC_74x5_v33,               7455),
8978     /* PowerPC 7445 v3.4 (G4)                                                */
8979     POWERPC_DEF("7445_v3.4",     CPU_POWERPC_74x5_v34,               7445),
8980     /* PowerPC 7455 v3.4 (G4)                                                */
8981     POWERPC_DEF("7455_v3.4",     CPU_POWERPC_74x5_v34,               7455),
8982     /* PowerPC 7447 (G4)                                                     */
8983     POWERPC_DEF("7447",          CPU_POWERPC_74x7,                   7445),
8984     /* PowerPC 7457 (G4)                                                     */
8985     POWERPC_DEF("7457",          CPU_POWERPC_74x7,                   7455),
8986     /* Code name for PowerPC 7447/7457                                       */
8987     POWERPC_DEF("Apollo7",       CPU_POWERPC_74x7,                   7455),
8988     /* PowerPC 7447 v1.0 (G4)                                                */
8989     POWERPC_DEF("7447_v1.0",     CPU_POWERPC_74x7_v10,               7445),
8990     /* PowerPC 7457 v1.0 (G4)                                                */
8991     POWERPC_DEF("7457_v1.0",     CPU_POWERPC_74x7_v10,               7455),
8992     /* PowerPC 7447 v1.1 (G4)                                                */
8993     POWERPC_DEF("7447_v1.1",     CPU_POWERPC_74x7_v11,               7445),
8994     /* PowerPC 7457 v1.1 (G4)                                                */
8995     POWERPC_DEF("7457_v1.1",     CPU_POWERPC_74x7_v11,               7455),
8996     /* PowerPC 7457 v1.2 (G4)                                                */
8997     POWERPC_DEF("7457_v1.2",     CPU_POWERPC_74x7_v12,               7455),
8998     /* PowerPC 7447A (G4)                                                    */
8999     POWERPC_DEF("7447A",         CPU_POWERPC_74x7A,                  7445),
9000     /* PowerPC 7457A (G4)                                                    */
9001     POWERPC_DEF("7457A",         CPU_POWERPC_74x7A,                  7455),
9002     /* PowerPC 7447A v1.0 (G4)                                               */
9003     POWERPC_DEF("7447A_v1.0",    CPU_POWERPC_74x7A_v10,              7445),
9004     /* PowerPC 7457A v1.0 (G4)                                               */
9005     POWERPC_DEF("7457A_v1.0",    CPU_POWERPC_74x7A_v10,              7455),
9006     /* Code name for PowerPC 7447A/7457A                                     */
9007     POWERPC_DEF("Apollo7PM",     CPU_POWERPC_74x7A_v10,              7455),
9008     /* PowerPC 7447A v1.1 (G4)                                               */
9009     POWERPC_DEF("7447A_v1.1",    CPU_POWERPC_74x7A_v11,              7445),
9010     /* PowerPC 7457A v1.1 (G4)                                               */
9011     POWERPC_DEF("7457A_v1.1",    CPU_POWERPC_74x7A_v11,              7455),
9012     /* PowerPC 7447A v1.2 (G4)                                               */
9013     POWERPC_DEF("7447A_v1.2",    CPU_POWERPC_74x7A_v12,              7445),
9014     /* PowerPC 7457A v1.2 (G4)                                               */
9015     POWERPC_DEF("7457A_v1.2",    CPU_POWERPC_74x7A_v12,              7455),
9016     /* 64 bits PowerPC                                                       */
9017 #if defined (TARGET_PPC64)
9018     /* PowerPC 620                                                           */
9019     POWERPC_DEF("620",           CPU_POWERPC_620,                    620),
9020     /* Code name for PowerPC 620                                             */
9021     POWERPC_DEF("Trident",       CPU_POWERPC_620,                    620),
9022 #if defined (TODO)
9023     /* PowerPC 630 (POWER3)                                                  */
9024     POWERPC_DEF("630",           CPU_POWERPC_630,                    630),
9025     POWERPC_DEF("POWER3",        CPU_POWERPC_630,                    630),
9026     /* Code names for POWER3                                                 */
9027     POWERPC_DEF("Boxer",         CPU_POWERPC_630,                    630),
9028     POWERPC_DEF("Dino",          CPU_POWERPC_630,                    630),
9029 #endif
9030 #if defined (TODO)
9031     /* PowerPC 631 (Power 3+)                                                */
9032     POWERPC_DEF("631",           CPU_POWERPC_631,                    631),
9033     POWERPC_DEF("POWER3+",       CPU_POWERPC_631,                    631),
9034 #endif
9035 #if defined (TODO)
9036     /* POWER4                                                                */
9037     POWERPC_DEF("POWER4",        CPU_POWERPC_POWER4,                 POWER4),
9038 #endif
9039 #if defined (TODO)
9040     /* POWER4p                                                               */
9041     POWERPC_DEF("POWER4+",       CPU_POWERPC_POWER4P,                POWER4P),
9042 #endif
9043 #if defined (TODO)
9044     /* POWER5                                                                */
9045     POWERPC_DEF("POWER5",        CPU_POWERPC_POWER5,                 POWER5),
9046     /* POWER5GR                                                              */
9047     POWERPC_DEF("POWER5gr",      CPU_POWERPC_POWER5GR,               POWER5),
9048 #endif
9049 #if defined (TODO)
9050     /* POWER5+                                                               */
9051     POWERPC_DEF("POWER5+",       CPU_POWERPC_POWER5P,                POWER5P),
9052     /* POWER5GS                                                              */
9053     POWERPC_DEF("POWER5gs",      CPU_POWERPC_POWER5GS,               POWER5P),
9054 #endif
9055 #if defined (TODO)
9056     /* POWER6                                                                */
9057     POWERPC_DEF("POWER6",        CPU_POWERPC_POWER6,                 POWER6),
9058     /* POWER6 running in POWER5 mode                                         */
9059     POWERPC_DEF("POWER6_5",      CPU_POWERPC_POWER6_5,               POWER5),
9060     /* POWER6A                                                               */
9061     POWERPC_DEF("POWER6A",       CPU_POWERPC_POWER6A,                POWER6),
9062 #endif
9063     /* POWER7                                                                */
9064     POWERPC_DEF("POWER7",        CPU_POWERPC_POWER7,                 POWER7),
9065     POWERPC_DEF("POWER7_v2.0",   CPU_POWERPC_POWER7_v20,             POWER7),
9066     /* PowerPC 970                                                           */
9067     POWERPC_DEF("970",           CPU_POWERPC_970,                    970),
9068     /* PowerPC 970FX (G5)                                                    */
9069     POWERPC_DEF("970fx",         CPU_POWERPC_970FX,                  970FX),
9070     /* PowerPC 970FX v1.0 (G5)                                               */
9071     POWERPC_DEF("970fx_v1.0",    CPU_POWERPC_970FX_v10,              970FX),
9072     /* PowerPC 970FX v2.0 (G5)                                               */
9073     POWERPC_DEF("970fx_v2.0",    CPU_POWERPC_970FX_v20,              970FX),
9074     /* PowerPC 970FX v2.1 (G5)                                               */
9075     POWERPC_DEF("970fx_v2.1",    CPU_POWERPC_970FX_v21,              970FX),
9076     /* PowerPC 970FX v3.0 (G5)                                               */
9077     POWERPC_DEF("970fx_v3.0",    CPU_POWERPC_970FX_v30,              970FX),
9078     /* PowerPC 970FX v3.1 (G5)                                               */
9079     POWERPC_DEF("970fx_v3.1",    CPU_POWERPC_970FX_v31,              970FX),
9080     /* PowerPC 970GX (G5)                                                    */
9081     POWERPC_DEF("970gx",         CPU_POWERPC_970GX,                  970GX),
9082     /* PowerPC 970MP                                                         */
9083     POWERPC_DEF("970mp",         CPU_POWERPC_970MP,                  970MP),
9084     /* PowerPC 970MP v1.0                                                    */
9085     POWERPC_DEF("970mp_v1.0",    CPU_POWERPC_970MP_v10,              970MP),
9086     /* PowerPC 970MP v1.1                                                    */
9087     POWERPC_DEF("970mp_v1.1",    CPU_POWERPC_970MP_v11,              970MP),
9088 #if defined (TODO)
9089     /* PowerPC Cell                                                          */
9090     POWERPC_DEF("Cell",          CPU_POWERPC_CELL,                   970),
9091 #endif
9092 #if defined (TODO)
9093     /* PowerPC Cell v1.0                                                     */
9094     POWERPC_DEF("Cell_v1.0",     CPU_POWERPC_CELL_v10,               970),
9095 #endif
9096 #if defined (TODO)
9097     /* PowerPC Cell v2.0                                                     */
9098     POWERPC_DEF("Cell_v2.0",     CPU_POWERPC_CELL_v20,               970),
9099 #endif
9100 #if defined (TODO)
9101     /* PowerPC Cell v3.0                                                     */
9102     POWERPC_DEF("Cell_v3.0",     CPU_POWERPC_CELL_v30,               970),
9103 #endif
9104 #if defined (TODO)
9105     /* PowerPC Cell v3.1                                                     */
9106     POWERPC_DEF("Cell_v3.1",     CPU_POWERPC_CELL_v31,               970),
9107 #endif
9108 #if defined (TODO)
9109     /* PowerPC Cell v3.2                                                     */
9110     POWERPC_DEF("Cell_v3.2",     CPU_POWERPC_CELL_v32,               970),
9111 #endif
9112 #if defined (TODO)
9113     /* RS64 (Apache/A35)                                                     */
9114     /* This one seems to support the whole POWER2 instruction set
9115      * and the PowerPC 64 one.
9116      */
9117     /* What about A10 & A30 ? */
9118     POWERPC_DEF("RS64",          CPU_POWERPC_RS64,                   RS64),
9119     POWERPC_DEF("Apache",        CPU_POWERPC_RS64,                   RS64),
9120     POWERPC_DEF("A35",           CPU_POWERPC_RS64,                   RS64),
9121 #endif
9122 #if defined (TODO)
9123     /* RS64-II (NorthStar/A50)                                               */
9124     POWERPC_DEF("RS64-II",       CPU_POWERPC_RS64II,                 RS64),
9125     POWERPC_DEF("NorthStar",     CPU_POWERPC_RS64II,                 RS64),
9126     POWERPC_DEF("A50",           CPU_POWERPC_RS64II,                 RS64),
9127 #endif
9128 #if defined (TODO)
9129     /* RS64-III (Pulsar)                                                     */
9130     POWERPC_DEF("RS64-III",      CPU_POWERPC_RS64III,                RS64),
9131     POWERPC_DEF("Pulsar",        CPU_POWERPC_RS64III,                RS64),
9132 #endif
9133 #if defined (TODO)
9134     /* RS64-IV (IceStar/IStar/SStar)                                         */
9135     POWERPC_DEF("RS64-IV",       CPU_POWERPC_RS64IV,                 RS64),
9136     POWERPC_DEF("IceStar",       CPU_POWERPC_RS64IV,                 RS64),
9137     POWERPC_DEF("IStar",         CPU_POWERPC_RS64IV,                 RS64),
9138     POWERPC_DEF("SStar",         CPU_POWERPC_RS64IV,                 RS64),
9139 #endif
9140 #endif /* defined (TARGET_PPC64) */
9141     /* POWER                                                                 */
9142 #if defined (TODO)
9143     /* Original POWER                                                        */
9144     POWERPC_DEF("POWER",         CPU_POWERPC_POWER,                  POWER),
9145     POWERPC_DEF("RIOS",          CPU_POWERPC_POWER,                  POWER),
9146     POWERPC_DEF("RSC",           CPU_POWERPC_POWER,                  POWER),
9147     POWERPC_DEF("RSC3308",       CPU_POWERPC_POWER,                  POWER),
9148     POWERPC_DEF("RSC4608",       CPU_POWERPC_POWER,                  POWER),
9149 #endif
9150 #if defined (TODO)
9151     /* POWER2                                                                */
9152     POWERPC_DEF("POWER2",        CPU_POWERPC_POWER2,                 POWER),
9153     POWERPC_DEF("RSC2",          CPU_POWERPC_POWER2,                 POWER),
9154     POWERPC_DEF("P2SC",          CPU_POWERPC_POWER2,                 POWER),
9155 #endif
9156     /* PA semi cores                                                         */
9157 #if defined (TODO)
9158     /* PA PA6T */
9159     POWERPC_DEF("PA6T",          CPU_POWERPC_PA6T,                   PA6T),
9160 #endif
9161     /* Generic PowerPCs                                                      */
9162 #if defined (TARGET_PPC64)
9163     POWERPC_DEF("ppc64",         CPU_POWERPC_PPC64,                  PPC64),
9164 #endif
9165     POWERPC_DEF("ppc32",         CPU_POWERPC_PPC32,                  PPC32),
9166     POWERPC_DEF("ppc",           CPU_POWERPC_DEFAULT,                DEFAULT),
9167     /* Fallback                                                              */
9168     POWERPC_DEF("default",       CPU_POWERPC_DEFAULT,                DEFAULT),
9169 };
9170
9171 /*****************************************************************************/
9172 /* Generic CPU instantiation routine                                         */
9173 static void init_ppc_proc (CPUPPCState *env, const ppc_def_t *def)
9174 {
9175 #if !defined(CONFIG_USER_ONLY)
9176     int i;
9177
9178     env->irq_inputs = NULL;
9179     /* Set all exception vectors to an invalid address */
9180     for (i = 0; i < POWERPC_EXCP_NB; i++)
9181         env->excp_vectors[i] = (target_ulong)(-1ULL);
9182     env->hreset_excp_prefix = 0x00000000;
9183     env->ivor_mask = 0x00000000;
9184     env->ivpr_mask = 0x00000000;
9185     /* Default MMU definitions */
9186     env->nb_BATs = 0;
9187     env->nb_tlb = 0;
9188     env->nb_ways = 0;
9189 #endif
9190     /* Register SPR common to all PowerPC implementations */
9191     gen_spr_generic(env);
9192     spr_register(env, SPR_PVR, "PVR",
9193                  /* Linux permits userspace to read PVR */
9194 #if defined(CONFIG_LINUX_USER)
9195                  &spr_read_generic,
9196 #else
9197                  SPR_NOACCESS,
9198 #endif
9199                  SPR_NOACCESS,
9200                  &spr_read_generic, SPR_NOACCESS,
9201                  def->pvr);
9202     /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
9203     if (def->svr != POWERPC_SVR_NONE) {
9204         if (def->svr & POWERPC_SVR_E500) {
9205             spr_register(env, SPR_E500_SVR, "SVR",
9206                          SPR_NOACCESS, SPR_NOACCESS,
9207                          &spr_read_generic, SPR_NOACCESS,
9208                          def->svr & ~POWERPC_SVR_E500);
9209         } else {
9210             spr_register(env, SPR_SVR, "SVR",
9211                          SPR_NOACCESS, SPR_NOACCESS,
9212                          &spr_read_generic, SPR_NOACCESS,
9213                          def->svr);
9214         }
9215     }
9216     /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
9217     (*def->init_proc)(env);
9218 #if !defined(CONFIG_USER_ONLY)
9219     env->excp_prefix = env->hreset_excp_prefix;
9220 #endif
9221     /* MSR bits & flags consistency checks */
9222     if (env->msr_mask & (1 << 25)) {
9223         switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
9224         case POWERPC_FLAG_SPE:
9225         case POWERPC_FLAG_VRE:
9226             break;
9227         default:
9228             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9229                     "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
9230             exit(1);
9231         }
9232     } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
9233         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9234                 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
9235         exit(1);
9236     }
9237     if (env->msr_mask & (1 << 17)) {
9238         switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
9239         case POWERPC_FLAG_TGPR:
9240         case POWERPC_FLAG_CE:
9241             break;
9242         default:
9243             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9244                     "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
9245             exit(1);
9246         }
9247     } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
9248         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9249                 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
9250         exit(1);
9251     }
9252     if (env->msr_mask & (1 << 10)) {
9253         switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
9254                               POWERPC_FLAG_UBLE)) {
9255         case POWERPC_FLAG_SE:
9256         case POWERPC_FLAG_DWE:
9257         case POWERPC_FLAG_UBLE:
9258             break;
9259         default:
9260             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9261                     "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
9262                     "POWERPC_FLAG_UBLE\n");
9263             exit(1);
9264         }
9265     } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
9266                              POWERPC_FLAG_UBLE)) {
9267         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9268                 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
9269                 "POWERPC_FLAG_UBLE\n");
9270             exit(1);
9271     }
9272     if (env->msr_mask & (1 << 9)) {
9273         switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
9274         case POWERPC_FLAG_BE:
9275         case POWERPC_FLAG_DE:
9276             break;
9277         default:
9278             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9279                     "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
9280             exit(1);
9281         }
9282     } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
9283         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9284                 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
9285         exit(1);
9286     }
9287     if (env->msr_mask & (1 << 2)) {
9288         switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9289         case POWERPC_FLAG_PX:
9290         case POWERPC_FLAG_PMM:
9291             break;
9292         default:
9293             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9294                     "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
9295             exit(1);
9296         }
9297     } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9298         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9299                 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
9300         exit(1);
9301     }
9302     if ((env->flags & (POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_BUS_CLK)) == 0) {
9303         fprintf(stderr, "PowerPC flags inconsistency\n"
9304                 "Should define the time-base and decrementer clock source\n");
9305         exit(1);
9306     }
9307     /* Allocate TLBs buffer when needed */
9308 #if !defined(CONFIG_USER_ONLY)
9309     if (env->nb_tlb != 0) {
9310         int nb_tlb = env->nb_tlb;
9311         if (env->id_tlbs != 0)
9312             nb_tlb *= 2;
9313         env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
9314         /* Pre-compute some useful values */
9315         env->tlb_per_way = env->nb_tlb / env->nb_ways;
9316     }
9317     if (env->irq_inputs == NULL) {
9318         fprintf(stderr, "WARNING: no internal IRQ controller registered.\n"
9319                 " Attempt Qemu to crash very soon !\n");
9320     }
9321 #endif
9322     if (env->check_pow == NULL) {
9323         fprintf(stderr, "WARNING: no power management check handler "
9324                 "registered.\n"
9325                 " Attempt Qemu to crash very soon !\n");
9326     }
9327 }
9328
9329 #if defined(PPC_DUMP_CPU)
9330 static void dump_ppc_sprs (CPUPPCState *env)
9331 {
9332     ppc_spr_t *spr;
9333 #if !defined(CONFIG_USER_ONLY)
9334     uint32_t sr, sw;
9335 #endif
9336     uint32_t ur, uw;
9337     int i, j, n;
9338
9339     printf("Special purpose registers:\n");
9340     for (i = 0; i < 32; i++) {
9341         for (j = 0; j < 32; j++) {
9342             n = (i << 5) | j;
9343             spr = &env->spr_cb[n];
9344             uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
9345             ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
9346 #if !defined(CONFIG_USER_ONLY)
9347             sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
9348             sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
9349             if (sw || sr || uw || ur) {
9350                 printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
9351                        (i << 5) | j, (i << 5) | j, spr->name,
9352                        sw ? 'w' : '-', sr ? 'r' : '-',
9353                        uw ? 'w' : '-', ur ? 'r' : '-');
9354             }
9355 #else
9356             if (uw || ur) {
9357                 printf("SPR: %4d (%03x) %-8s u%c%c\n",
9358                        (i << 5) | j, (i << 5) | j, spr->name,
9359                        uw ? 'w' : '-', ur ? 'r' : '-');
9360             }
9361 #endif
9362         }
9363     }
9364     fflush(stdout);
9365     fflush(stderr);
9366 }
9367 #endif
9368
9369 /*****************************************************************************/
9370 #include <stdlib.h>
9371 #include <string.h>
9372
9373 /* Opcode types */
9374 enum {
9375     PPC_DIRECT   = 0, /* Opcode routine        */
9376     PPC_INDIRECT = 1, /* Indirect opcode table */
9377 };
9378
9379 static inline int is_indirect_opcode (void *handler)
9380 {
9381     return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
9382 }
9383
9384 static inline opc_handler_t **ind_table(void *handler)
9385 {
9386     return (opc_handler_t **)((unsigned long)handler & ~3);
9387 }
9388
9389 /* Instruction table creation */
9390 /* Opcodes tables creation */
9391 static void fill_new_table (opc_handler_t **table, int len)
9392 {
9393     int i;
9394
9395     for (i = 0; i < len; i++)
9396         table[i] = &invalid_handler;
9397 }
9398
9399 static int create_new_table (opc_handler_t **table, unsigned char idx)
9400 {
9401     opc_handler_t **tmp;
9402
9403     tmp = malloc(0x20 * sizeof(opc_handler_t));
9404     fill_new_table(tmp, 0x20);
9405     table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
9406
9407     return 0;
9408 }
9409
9410 static int insert_in_table (opc_handler_t **table, unsigned char idx,
9411                             opc_handler_t *handler)
9412 {
9413     if (table[idx] != &invalid_handler)
9414         return -1;
9415     table[idx] = handler;
9416
9417     return 0;
9418 }
9419
9420 static int register_direct_insn (opc_handler_t **ppc_opcodes,
9421                                  unsigned char idx, opc_handler_t *handler)
9422 {
9423     if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
9424         printf("*** ERROR: opcode %02x already assigned in main "
9425                "opcode table\n", idx);
9426 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9427         printf("           Registered handler '%s' - new handler '%s'\n",
9428                ppc_opcodes[idx]->oname, handler->oname);
9429 #endif
9430         return -1;
9431     }
9432
9433     return 0;
9434 }
9435
9436 static int register_ind_in_table (opc_handler_t **table,
9437                                   unsigned char idx1, unsigned char idx2,
9438                                   opc_handler_t *handler)
9439 {
9440     if (table[idx1] == &invalid_handler) {
9441         if (create_new_table(table, idx1) < 0) {
9442             printf("*** ERROR: unable to create indirect table "
9443                    "idx=%02x\n", idx1);
9444             return -1;
9445         }
9446     } else {
9447         if (!is_indirect_opcode(table[idx1])) {
9448             printf("*** ERROR: idx %02x already assigned to a direct "
9449                    "opcode\n", idx1);
9450 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9451             printf("           Registered handler '%s' - new handler '%s'\n",
9452                    ind_table(table[idx1])[idx2]->oname, handler->oname);
9453 #endif
9454             return -1;
9455         }
9456     }
9457     if (handler != NULL &&
9458         insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
9459         printf("*** ERROR: opcode %02x already assigned in "
9460                "opcode table %02x\n", idx2, idx1);
9461 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9462         printf("           Registered handler '%s' - new handler '%s'\n",
9463                ind_table(table[idx1])[idx2]->oname, handler->oname);
9464 #endif
9465         return -1;
9466     }
9467
9468     return 0;
9469 }
9470
9471 static int register_ind_insn (opc_handler_t **ppc_opcodes,
9472                               unsigned char idx1, unsigned char idx2,
9473                               opc_handler_t *handler)
9474 {
9475     int ret;
9476
9477     ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
9478
9479     return ret;
9480 }
9481
9482 static int register_dblind_insn (opc_handler_t **ppc_opcodes,
9483                                  unsigned char idx1, unsigned char idx2,
9484                                  unsigned char idx3, opc_handler_t *handler)
9485 {
9486     if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
9487         printf("*** ERROR: unable to join indirect table idx "
9488                "[%02x-%02x]\n", idx1, idx2);
9489         return -1;
9490     }
9491     if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
9492                               handler) < 0) {
9493         printf("*** ERROR: unable to insert opcode "
9494                "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
9495         return -1;
9496     }
9497
9498     return 0;
9499 }
9500
9501 static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
9502 {
9503     if (insn->opc2 != 0xFF) {
9504         if (insn->opc3 != 0xFF) {
9505             if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
9506                                      insn->opc3, &insn->handler) < 0)
9507                 return -1;
9508         } else {
9509             if (register_ind_insn(ppc_opcodes, insn->opc1,
9510                                   insn->opc2, &insn->handler) < 0)
9511                 return -1;
9512         }
9513     } else {
9514         if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
9515             return -1;
9516     }
9517
9518     return 0;
9519 }
9520
9521 static int test_opcode_table (opc_handler_t **table, int len)
9522 {
9523     int i, count, tmp;
9524
9525     for (i = 0, count = 0; i < len; i++) {
9526         /* Consistency fixup */
9527         if (table[i] == NULL)
9528             table[i] = &invalid_handler;
9529         if (table[i] != &invalid_handler) {
9530             if (is_indirect_opcode(table[i])) {
9531                 tmp = test_opcode_table(ind_table(table[i]), 0x20);
9532                 if (tmp == 0) {
9533                     free(table[i]);
9534                     table[i] = &invalid_handler;
9535                 } else {
9536                     count++;
9537                 }
9538             } else {
9539                 count++;
9540             }
9541         }
9542     }
9543
9544     return count;
9545 }
9546
9547 static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
9548 {
9549     if (test_opcode_table(ppc_opcodes, 0x40) == 0)
9550         printf("*** WARNING: no opcode defined !\n");
9551 }
9552
9553 /*****************************************************************************/
9554 static int create_ppc_opcodes (CPUPPCState *env, const ppc_def_t *def)
9555 {
9556     opcode_t *opc;
9557
9558     fill_new_table(env->opcodes, 0x40);
9559     for (opc = opcodes; opc < &opcodes[ARRAY_SIZE(opcodes)]; opc++) {
9560         if (((opc->handler.type & def->insns_flags) != 0) ||
9561             ((opc->handler.type2 & def->insns_flags2) != 0)) {
9562             if (register_insn(env->opcodes, opc) < 0) {
9563                 printf("*** ERROR initializing PowerPC instruction "
9564                        "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
9565                        opc->opc3);
9566                 return -1;
9567             }
9568         }
9569     }
9570     fix_opcode_tables(env->opcodes);
9571     fflush(stdout);
9572     fflush(stderr);
9573
9574     return 0;
9575 }
9576
9577 #if defined(PPC_DUMP_CPU)
9578 static void dump_ppc_insns (CPUPPCState *env)
9579 {
9580     opc_handler_t **table, *handler;
9581     const char *p, *q;
9582     uint8_t opc1, opc2, opc3;
9583
9584     printf("Instructions set:\n");
9585     /* opc1 is 6 bits long */
9586     for (opc1 = 0x00; opc1 < 0x40; opc1++) {
9587         table = env->opcodes;
9588         handler = table[opc1];
9589         if (is_indirect_opcode(handler)) {
9590             /* opc2 is 5 bits long */
9591             for (opc2 = 0; opc2 < 0x20; opc2++) {
9592                 table = env->opcodes;
9593                 handler = env->opcodes[opc1];
9594                 table = ind_table(handler);
9595                 handler = table[opc2];
9596                 if (is_indirect_opcode(handler)) {
9597                     table = ind_table(handler);
9598                     /* opc3 is 5 bits long */
9599                     for (opc3 = 0; opc3 < 0x20; opc3++) {
9600                         handler = table[opc3];
9601                         if (handler->handler != &gen_invalid) {
9602                             /* Special hack to properly dump SPE insns */
9603                             p = strchr(handler->oname, '_');
9604                             if (p == NULL) {
9605                                 printf("INSN: %02x %02x %02x (%02d %04d) : "
9606                                        "%s\n",
9607                                        opc1, opc2, opc3, opc1,
9608                                        (opc3 << 5) | opc2,
9609                                        handler->oname);
9610                             } else {
9611                                 q = "speundef";
9612                                 if ((p - handler->oname) != strlen(q) ||
9613                                     memcmp(handler->oname, q, strlen(q)) != 0) {
9614                                     /* First instruction */
9615                                     printf("INSN: %02x %02x %02x (%02d %04d) : "
9616                                            "%.*s\n",
9617                                            opc1, opc2 << 1, opc3, opc1,
9618                                            (opc3 << 6) | (opc2 << 1),
9619                                            (int)(p - handler->oname),
9620                                            handler->oname);
9621                                 }
9622                                 if (strcmp(p + 1, q) != 0) {
9623                                     /* Second instruction */
9624                                     printf("INSN: %02x %02x %02x (%02d %04d) : "
9625                                            "%s\n",
9626                                            opc1, (opc2 << 1) | 1, opc3, opc1,
9627                                            (opc3 << 6) | (opc2 << 1) | 1,
9628                                            p + 1);
9629                                 }
9630                             }
9631                         }
9632                     }
9633                 } else {
9634                     if (handler->handler != &gen_invalid) {
9635                         printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
9636                                opc1, opc2, opc1, opc2, handler->oname);
9637                     }
9638                 }
9639             }
9640         } else {
9641             if (handler->handler != &gen_invalid) {
9642                 printf("INSN: %02x -- -- (%02d ----) : %s\n",
9643                        opc1, opc1, handler->oname);
9644             }
9645         }
9646     }
9647 }
9648 #endif
9649
9650 static int gdb_get_float_reg(CPUState *env, uint8_t *mem_buf, int n)
9651 {
9652     if (n < 32) {
9653         stfq_p(mem_buf, env->fpr[n]);
9654         return 8;
9655     }
9656     if (n == 32) {
9657         /* FPSCR not implemented  */
9658         memset(mem_buf, 0, 4);
9659         return 4;
9660     }
9661     return 0;
9662 }
9663
9664 static int gdb_set_float_reg(CPUState *env, uint8_t *mem_buf, int n)
9665 {
9666     if (n < 32) {
9667         env->fpr[n] = ldfq_p(mem_buf);
9668         return 8;
9669     }
9670     if (n == 32) {
9671         /* FPSCR not implemented  */
9672         return 4;
9673     }
9674     return 0;
9675 }
9676
9677 static int gdb_get_avr_reg(CPUState *env, uint8_t *mem_buf, int n)
9678 {
9679     if (n < 32) {
9680 #ifdef HOST_WORDS_BIGENDIAN
9681         stq_p(mem_buf, env->avr[n].u64[0]);
9682         stq_p(mem_buf+8, env->avr[n].u64[1]);
9683 #else
9684         stq_p(mem_buf, env->avr[n].u64[1]);
9685         stq_p(mem_buf+8, env->avr[n].u64[0]);
9686 #endif
9687         return 16;
9688     }
9689     if (n == 32) {
9690         stl_p(mem_buf, env->vscr);
9691         return 4;
9692     }
9693     if (n == 33) {
9694         stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
9695         return 4;
9696     }
9697     return 0;
9698 }
9699
9700 static int gdb_set_avr_reg(CPUState *env, uint8_t *mem_buf, int n)
9701 {
9702     if (n < 32) {
9703 #ifdef HOST_WORDS_BIGENDIAN
9704         env->avr[n].u64[0] = ldq_p(mem_buf);
9705         env->avr[n].u64[1] = ldq_p(mem_buf+8);
9706 #else
9707         env->avr[n].u64[1] = ldq_p(mem_buf);
9708         env->avr[n].u64[0] = ldq_p(mem_buf+8);
9709 #endif
9710         return 16;
9711     }
9712     if (n == 32) {
9713         env->vscr = ldl_p(mem_buf);
9714         return 4;
9715     }
9716     if (n == 33) {
9717         env->spr[SPR_VRSAVE] = (target_ulong)ldl_p(mem_buf);
9718         return 4;
9719     }
9720     return 0;
9721 }
9722
9723 static int gdb_get_spe_reg(CPUState *env, uint8_t *mem_buf, int n)
9724 {
9725     if (n < 32) {
9726 #if defined(TARGET_PPC64)
9727         stl_p(mem_buf, env->gpr[n] >> 32);
9728 #else
9729         stl_p(mem_buf, env->gprh[n]);
9730 #endif
9731         return 4;
9732     }
9733     if (n == 32) {
9734         stq_p(mem_buf, env->spe_acc);
9735         return 8;
9736     }
9737     if (n == 33) {
9738         stl_p(mem_buf, env->spe_fscr);
9739         return 4;
9740     }
9741     return 0;
9742 }
9743
9744 static int gdb_set_spe_reg(CPUState *env, uint8_t *mem_buf, int n)
9745 {
9746     if (n < 32) {
9747 #if defined(TARGET_PPC64)
9748         target_ulong lo = (uint32_t)env->gpr[n];
9749         target_ulong hi = (target_ulong)ldl_p(mem_buf) << 32;
9750         env->gpr[n] = lo | hi;
9751 #else
9752         env->gprh[n] = ldl_p(mem_buf);
9753 #endif
9754         return 4;
9755     }
9756     if (n == 32) {
9757         env->spe_acc = ldq_p(mem_buf);
9758         return 8;
9759     }
9760     if (n == 33) {
9761         env->spe_fscr = ldl_p(mem_buf);
9762         return 4;
9763     }
9764     return 0;
9765 }
9766
9767 int cpu_ppc_register_internal (CPUPPCState *env, const ppc_def_t *def)
9768 {
9769     env->msr_mask = def->msr_mask;
9770     env->mmu_model = def->mmu_model;
9771     env->excp_model = def->excp_model;
9772     env->bus_model = def->bus_model;
9773     env->insns_flags = def->insns_flags;
9774     env->insns_flags2 = def->insns_flags2;
9775     env->flags = def->flags;
9776     env->bfd_mach = def->bfd_mach;
9777     env->check_pow = def->check_pow;
9778     if (create_ppc_opcodes(env, def) < 0)
9779         return -1;
9780     init_ppc_proc(env, def);
9781
9782     if (def->insns_flags & PPC_FLOAT) {
9783         gdb_register_coprocessor(env, gdb_get_float_reg, gdb_set_float_reg,
9784                                  33, "power-fpu.xml", 0);
9785     }
9786     if (def->insns_flags & PPC_ALTIVEC) {
9787         gdb_register_coprocessor(env, gdb_get_avr_reg, gdb_set_avr_reg,
9788                                  34, "power-altivec.xml", 0);
9789     }
9790     if (def->insns_flags & PPC_SPE) {
9791         gdb_register_coprocessor(env, gdb_get_spe_reg, gdb_set_spe_reg,
9792                                  34, "power-spe.xml", 0);
9793     }
9794
9795 #if defined(PPC_DUMP_CPU)
9796     {
9797         const char *mmu_model, *excp_model, *bus_model;
9798         switch (env->mmu_model) {
9799         case POWERPC_MMU_32B:
9800             mmu_model = "PowerPC 32";
9801             break;
9802         case POWERPC_MMU_SOFT_6xx:
9803             mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
9804             break;
9805         case POWERPC_MMU_SOFT_74xx:
9806             mmu_model = "PowerPC 74xx with software driven TLBs";
9807             break;
9808         case POWERPC_MMU_SOFT_4xx:
9809             mmu_model = "PowerPC 4xx with software driven TLBs";
9810             break;
9811         case POWERPC_MMU_SOFT_4xx_Z:
9812             mmu_model = "PowerPC 4xx with software driven TLBs "
9813                 "and zones protections";
9814             break;
9815         case POWERPC_MMU_REAL:
9816             mmu_model = "PowerPC real mode only";
9817             break;
9818         case POWERPC_MMU_MPC8xx:
9819             mmu_model = "PowerPC MPC8xx";
9820             break;
9821         case POWERPC_MMU_BOOKE:
9822             mmu_model = "PowerPC BookE";
9823             break;
9824         case POWERPC_MMU_BOOKE206:
9825             mmu_model = "PowerPC BookE 2.06";
9826             break;
9827         case POWERPC_MMU_601:
9828             mmu_model = "PowerPC 601";
9829             break;
9830 #if defined (TARGET_PPC64)
9831         case POWERPC_MMU_64B:
9832             mmu_model = "PowerPC 64";
9833             break;
9834         case POWERPC_MMU_620:
9835             mmu_model = "PowerPC 620";
9836             break;
9837 #endif
9838         default:
9839             mmu_model = "Unknown or invalid";
9840             break;
9841         }
9842         switch (env->excp_model) {
9843         case POWERPC_EXCP_STD:
9844             excp_model = "PowerPC";
9845             break;
9846         case POWERPC_EXCP_40x:
9847             excp_model = "PowerPC 40x";
9848             break;
9849         case POWERPC_EXCP_601:
9850             excp_model = "PowerPC 601";
9851             break;
9852         case POWERPC_EXCP_602:
9853             excp_model = "PowerPC 602";
9854             break;
9855         case POWERPC_EXCP_603:
9856             excp_model = "PowerPC 603";
9857             break;
9858         case POWERPC_EXCP_603E:
9859             excp_model = "PowerPC 603e";
9860             break;
9861         case POWERPC_EXCP_604:
9862             excp_model = "PowerPC 604";
9863             break;
9864         case POWERPC_EXCP_7x0:
9865             excp_model = "PowerPC 740/750";
9866             break;
9867         case POWERPC_EXCP_7x5:
9868             excp_model = "PowerPC 745/755";
9869             break;
9870         case POWERPC_EXCP_74xx:
9871             excp_model = "PowerPC 74xx";
9872             break;
9873         case POWERPC_EXCP_BOOKE:
9874             excp_model = "PowerPC BookE";
9875             break;
9876 #if defined (TARGET_PPC64)
9877         case POWERPC_EXCP_970:
9878             excp_model = "PowerPC 970";
9879             break;
9880 #endif
9881         default:
9882             excp_model = "Unknown or invalid";
9883             break;
9884         }
9885         switch (env->bus_model) {
9886         case PPC_FLAGS_INPUT_6xx:
9887             bus_model = "PowerPC 6xx";
9888             break;
9889         case PPC_FLAGS_INPUT_BookE:
9890             bus_model = "PowerPC BookE";
9891             break;
9892         case PPC_FLAGS_INPUT_405:
9893             bus_model = "PowerPC 405";
9894             break;
9895         case PPC_FLAGS_INPUT_401:
9896             bus_model = "PowerPC 401/403";
9897             break;
9898         case PPC_FLAGS_INPUT_RCPU:
9899             bus_model = "RCPU / MPC8xx";
9900             break;
9901 #if defined (TARGET_PPC64)
9902         case PPC_FLAGS_INPUT_970:
9903             bus_model = "PowerPC 970";
9904             break;
9905 #endif
9906         default:
9907             bus_model = "Unknown or invalid";
9908             break;
9909         }
9910         printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
9911                "    MMU model        : %s\n",
9912                def->name, def->pvr, def->msr_mask, mmu_model);
9913 #if !defined(CONFIG_USER_ONLY)
9914         if (env->tlb != NULL) {
9915             printf("                       %d %s TLB in %d ways\n",
9916                    env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
9917                    env->nb_ways);
9918         }
9919 #endif
9920         printf("    Exceptions model : %s\n"
9921                "    Bus model        : %s\n",
9922                excp_model, bus_model);
9923         printf("    MSR features     :\n");
9924         if (env->flags & POWERPC_FLAG_SPE)
9925             printf("                        signal processing engine enable"
9926                    "\n");
9927         else if (env->flags & POWERPC_FLAG_VRE)
9928             printf("                        vector processor enable\n");
9929         if (env->flags & POWERPC_FLAG_TGPR)
9930             printf("                        temporary GPRs\n");
9931         else if (env->flags & POWERPC_FLAG_CE)
9932             printf("                        critical input enable\n");
9933         if (env->flags & POWERPC_FLAG_SE)
9934             printf("                        single-step trace mode\n");
9935         else if (env->flags & POWERPC_FLAG_DWE)
9936             printf("                        debug wait enable\n");
9937         else if (env->flags & POWERPC_FLAG_UBLE)
9938             printf("                        user BTB lock enable\n");
9939         if (env->flags & POWERPC_FLAG_BE)
9940             printf("                        branch-step trace mode\n");
9941         else if (env->flags & POWERPC_FLAG_DE)
9942             printf("                        debug interrupt enable\n");
9943         if (env->flags & POWERPC_FLAG_PX)
9944             printf("                        inclusive protection\n");
9945         else if (env->flags & POWERPC_FLAG_PMM)
9946             printf("                        performance monitor mark\n");
9947         if (env->flags == POWERPC_FLAG_NONE)
9948             printf("                        none\n");
9949         printf("    Time-base/decrementer clock source: %s\n",
9950                env->flags & POWERPC_FLAG_RTC_CLK ? "RTC clock" : "bus clock");
9951     }
9952     dump_ppc_insns(env);
9953     dump_ppc_sprs(env);
9954     fflush(stdout);
9955 #endif
9956
9957     return 0;
9958 }
9959
9960 static const ppc_def_t *ppc_find_by_pvr (uint32_t pvr)
9961 {
9962     const ppc_def_t *ret;
9963     uint32_t pvr_rev;
9964     int i, best, match, best_match, max;
9965
9966     ret = NULL;
9967     max = ARRAY_SIZE(ppc_defs);
9968     best = -1;
9969     pvr_rev = pvr & 0xFFFF;
9970     /* We want all specified bits to match */
9971     best_match = 32 - ctz32(pvr_rev);
9972     for (i = 0; i < max; i++) {
9973         /* We check that the 16 higher bits are the same to ensure the CPU
9974          * model will be the choosen one.
9975          */
9976         if (((pvr ^ ppc_defs[i].pvr) >> 16) == 0) {
9977             /* We want as much as possible of the low-level 16 bits
9978              * to be the same but we allow inexact matches.
9979              */
9980             match = clz32(pvr_rev ^ (ppc_defs[i].pvr & 0xFFFF));
9981             /* We check '>=' instead of '>' because the PPC_defs table
9982              * is ordered by increasing revision.
9983              * Then, we will match the higher revision compatible
9984              * with the requested PVR
9985              */
9986             if (match >= best_match) {
9987                 best = i;
9988                 best_match = match;
9989             }
9990         }
9991     }
9992     if (best != -1)
9993         ret = &ppc_defs[best];
9994
9995     return ret;
9996 }
9997
9998 #include <ctype.h>
9999
10000 const ppc_def_t *cpu_ppc_find_by_name (const char *name)
10001 {
10002     const ppc_def_t *ret;
10003     const char *p;
10004     int i, max, len;
10005
10006     /* Check if the given name is a PVR */
10007     len = strlen(name);
10008     if (len == 10 && name[0] == '0' && name[1] == 'x') {
10009         p = name + 2;
10010         goto check_pvr;
10011     } else if (len == 8) {
10012         p = name;
10013     check_pvr:
10014         for (i = 0; i < 8; i++) {
10015             if (!qemu_isxdigit(*p++))
10016                 break;
10017         }
10018         if (i == 8)
10019             return ppc_find_by_pvr(strtoul(name, NULL, 16));
10020     }
10021     ret = NULL;
10022     max = ARRAY_SIZE(ppc_defs);
10023     for (i = 0; i < max; i++) {
10024         if (strcasecmp(name, ppc_defs[i].name) == 0) {
10025             ret = &ppc_defs[i];
10026             break;
10027         }
10028     }
10029
10030     return ret;
10031 }
10032
10033 void ppc_cpu_list (FILE *f, fprintf_function cpu_fprintf)
10034 {
10035     int i, max;
10036
10037     max = ARRAY_SIZE(ppc_defs);
10038     for (i = 0; i < max; i++) {
10039         (*cpu_fprintf)(f, "PowerPC %-16s PVR %08x\n",
10040                        ppc_defs[i].name, ppc_defs[i].pvr);
10041     }
10042 }
This page took 0.614917 seconds and 4 git commands to generate.