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