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