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