]> Git Repo - qemu.git/blob - target-ppc/translate_init.c
target-ppc: Move CPU aliases out of translate_init.c
[qemu.git] / target-ppc / translate_init.c
1 /*
2  *  PowerPC CPU initialization for qemu.
3  *
4  *  Copyright (c) 2003-2007 Jocelyn Mayer
5  *  Copyright 2011 Freescale Semiconductor, Inc.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "disas/bfd.h"
22 #include "exec/gdbstub.h"
23 #include <sysemu/kvm.h>
24 #include "kvm_ppc.h"
25 #include "sysemu/arch_init.h"
26 #include "sysemu/cpus.h"
27 #include "cpu-models.h"
28
29 //#define PPC_DUMP_CPU
30 //#define PPC_DEBUG_SPR
31 //#define PPC_DUMP_SPR_ACCESSES
32
33 /* For user-mode emulation, we don't emulate any IRQ controller */
34 #if defined(CONFIG_USER_ONLY)
35 #define PPC_IRQ_INIT_FN(name)                                                 \
36 static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env)         \
37 {                                                                             \
38 }
39 #else
40 #define PPC_IRQ_INIT_FN(name)                                                 \
41 void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
42 #endif
43
44 PPC_IRQ_INIT_FN(40x);
45 PPC_IRQ_INIT_FN(6xx);
46 PPC_IRQ_INIT_FN(970);
47 PPC_IRQ_INIT_FN(POWER7);
48 PPC_IRQ_INIT_FN(e500);
49
50 /* Generic callbacks:
51  * do nothing but store/retrieve spr value
52  */
53 static void spr_load_dump_spr(int sprn)
54 {
55 #ifdef PPC_DUMP_SPR_ACCESSES
56     TCGv_i32 t0 = tcg_const_i32(sprn);
57     gen_helper_load_dump_spr(cpu_env, t0);
58     tcg_temp_free_i32(t0);
59 #endif
60 }
61
62 static void spr_read_generic (void *opaque, int gprn, int sprn)
63 {
64     gen_load_spr(cpu_gpr[gprn], sprn);
65     spr_load_dump_spr(sprn);
66 }
67
68 static void spr_store_dump_spr(int sprn)
69 {
70 #ifdef PPC_DUMP_SPR_ACCESSES
71     TCGv_i32 t0 = tcg_const_i32(sprn);
72     gen_helper_store_dump_spr(cpu_env, t0);
73     tcg_temp_free_i32(t0);
74 #endif
75 }
76
77 static void spr_write_generic (void *opaque, int sprn, int gprn)
78 {
79     gen_store_spr(sprn, cpu_gpr[gprn]);
80     spr_store_dump_spr(sprn);
81 }
82
83 #if !defined(CONFIG_USER_ONLY)
84 static void spr_write_generic32(void *opaque, int sprn, int gprn)
85 {
86 #ifdef TARGET_PPC64
87     TCGv t0 = tcg_temp_new();
88     tcg_gen_ext32u_tl(t0, cpu_gpr[gprn]);
89     gen_store_spr(sprn, t0);
90     tcg_temp_free(t0);
91     spr_store_dump_spr(sprn);
92 #else
93     spr_write_generic(opaque, sprn, gprn);
94 #endif
95 }
96
97 static void spr_write_clear (void *opaque, int sprn, int gprn)
98 {
99     TCGv t0 = tcg_temp_new();
100     TCGv t1 = tcg_temp_new();
101     gen_load_spr(t0, sprn);
102     tcg_gen_neg_tl(t1, cpu_gpr[gprn]);
103     tcg_gen_and_tl(t0, t0, t1);
104     gen_store_spr(sprn, t0);
105     tcg_temp_free(t0);
106     tcg_temp_free(t1);
107 }
108 #endif
109
110 /* SPR common to all PowerPC */
111 /* XER */
112 static void spr_read_xer (void *opaque, int gprn, int sprn)
113 {
114     gen_read_xer(cpu_gpr[gprn]);
115 }
116
117 static void spr_write_xer (void *opaque, int sprn, int gprn)
118 {
119     gen_write_xer(cpu_gpr[gprn]);
120 }
121
122 /* LR */
123 static void spr_read_lr (void *opaque, int gprn, int sprn)
124 {
125     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_lr);
126 }
127
128 static void spr_write_lr (void *opaque, int sprn, int gprn)
129 {
130     tcg_gen_mov_tl(cpu_lr, cpu_gpr[gprn]);
131 }
132
133 /* CFAR */
134 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
135 static void spr_read_cfar (void *opaque, int gprn, int sprn)
136 {
137     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_cfar);
138 }
139
140 static void spr_write_cfar (void *opaque, int sprn, int gprn)
141 {
142     tcg_gen_mov_tl(cpu_cfar, cpu_gpr[gprn]);
143 }
144 #endif /* defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) */
145
146 /* CTR */
147 static void spr_read_ctr (void *opaque, int gprn, int sprn)
148 {
149     tcg_gen_mov_tl(cpu_gpr[gprn], cpu_ctr);
150 }
151
152 static void spr_write_ctr (void *opaque, int sprn, int gprn)
153 {
154     tcg_gen_mov_tl(cpu_ctr, cpu_gpr[gprn]);
155 }
156
157 /* User read access to SPR */
158 /* USPRx */
159 /* UMMCRx */
160 /* UPMCx */
161 /* USIA */
162 /* UDECR */
163 static void spr_read_ureg (void *opaque, int gprn, int sprn)
164 {
165     gen_load_spr(cpu_gpr[gprn], sprn + 0x10);
166 }
167
168 /* SPR common to all non-embedded PowerPC */
169 /* DECR */
170 #if !defined(CONFIG_USER_ONLY)
171 static void spr_read_decr (void *opaque, int gprn, int sprn)
172 {
173     if (use_icount) {
174         gen_io_start();
175     }
176     gen_helper_load_decr(cpu_gpr[gprn], cpu_env);
177     if (use_icount) {
178         gen_io_end();
179         gen_stop_exception(opaque);
180     }
181 }
182
183 static void spr_write_decr (void *opaque, int sprn, int gprn)
184 {
185     if (use_icount) {
186         gen_io_start();
187     }
188     gen_helper_store_decr(cpu_env, cpu_gpr[gprn]);
189     if (use_icount) {
190         gen_io_end();
191         gen_stop_exception(opaque);
192     }
193 }
194 #endif
195
196 /* SPR common to all non-embedded PowerPC, except 601 */
197 /* Time base */
198 static void spr_read_tbl (void *opaque, int gprn, int sprn)
199 {
200     if (use_icount) {
201         gen_io_start();
202     }
203     gen_helper_load_tbl(cpu_gpr[gprn], cpu_env);
204     if (use_icount) {
205         gen_io_end();
206         gen_stop_exception(opaque);
207     }
208 }
209
210 static void spr_read_tbu (void *opaque, int gprn, int sprn)
211 {
212     if (use_icount) {
213         gen_io_start();
214     }
215     gen_helper_load_tbu(cpu_gpr[gprn], cpu_env);
216     if (use_icount) {
217         gen_io_end();
218         gen_stop_exception(opaque);
219     }
220 }
221
222 __attribute__ (( unused ))
223 static void spr_read_atbl (void *opaque, int gprn, int sprn)
224 {
225     gen_helper_load_atbl(cpu_gpr[gprn], cpu_env);
226 }
227
228 __attribute__ (( unused ))
229 static void spr_read_atbu (void *opaque, int gprn, int sprn)
230 {
231     gen_helper_load_atbu(cpu_gpr[gprn], cpu_env);
232 }
233
234 #if !defined(CONFIG_USER_ONLY)
235 static void spr_write_tbl (void *opaque, int sprn, int gprn)
236 {
237     if (use_icount) {
238         gen_io_start();
239     }
240     gen_helper_store_tbl(cpu_env, cpu_gpr[gprn]);
241     if (use_icount) {
242         gen_io_end();
243         gen_stop_exception(opaque);
244     }
245 }
246
247 static void spr_write_tbu (void *opaque, int sprn, int gprn)
248 {
249     if (use_icount) {
250         gen_io_start();
251     }
252     gen_helper_store_tbu(cpu_env, cpu_gpr[gprn]);
253     if (use_icount) {
254         gen_io_end();
255         gen_stop_exception(opaque);
256     }
257 }
258
259 __attribute__ (( unused ))
260 static void spr_write_atbl (void *opaque, int sprn, int gprn)
261 {
262     gen_helper_store_atbl(cpu_env, cpu_gpr[gprn]);
263 }
264
265 __attribute__ (( unused ))
266 static void spr_write_atbu (void *opaque, int sprn, int gprn)
267 {
268     gen_helper_store_atbu(cpu_env, cpu_gpr[gprn]);
269 }
270
271 #if defined(TARGET_PPC64)
272 __attribute__ (( unused ))
273 static void spr_read_purr (void *opaque, int gprn, int sprn)
274 {
275     gen_helper_load_purr(cpu_gpr[gprn], cpu_env);
276 }
277 #endif
278 #endif
279
280 #if !defined(CONFIG_USER_ONLY)
281 /* IBAT0U...IBAT0U */
282 /* IBAT0L...IBAT7L */
283 static void spr_read_ibat (void *opaque, int gprn, int sprn)
284 {
285     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
286 }
287
288 static void spr_read_ibat_h (void *opaque, int gprn, int sprn)
289 {
290     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT4U) / 2]));
291 }
292
293 static void spr_write_ibatu (void *opaque, int sprn, int gprn)
294 {
295     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
296     gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
297     tcg_temp_free_i32(t0);
298 }
299
300 static void spr_write_ibatu_h (void *opaque, int sprn, int gprn)
301 {
302     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4U) / 2) + 4);
303     gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
304     tcg_temp_free_i32(t0);
305 }
306
307 static void spr_write_ibatl (void *opaque, int sprn, int gprn)
308 {
309     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2);
310     gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
311     tcg_temp_free_i32(t0);
312 }
313
314 static void spr_write_ibatl_h (void *opaque, int sprn, int gprn)
315 {
316     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4L) / 2) + 4);
317     gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
318     tcg_temp_free_i32(t0);
319 }
320
321 /* DBAT0U...DBAT7U */
322 /* DBAT0L...DBAT7L */
323 static void spr_read_dbat (void *opaque, int gprn, int sprn)
324 {
325     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][(sprn - SPR_DBAT0U) / 2]));
326 }
327
328 static void spr_read_dbat_h (void *opaque, int gprn, int sprn)
329 {
330     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][((sprn - SPR_DBAT4U) / 2) + 4]));
331 }
332
333 static void spr_write_dbatu (void *opaque, int sprn, int gprn)
334 {
335     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2);
336     gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
337     tcg_temp_free_i32(t0);
338 }
339
340 static void spr_write_dbatu_h (void *opaque, int sprn, int gprn)
341 {
342     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4);
343     gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
344     tcg_temp_free_i32(t0);
345 }
346
347 static void spr_write_dbatl (void *opaque, int sprn, int gprn)
348 {
349     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2);
350     gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
351     tcg_temp_free_i32(t0);
352 }
353
354 static void spr_write_dbatl_h (void *opaque, int sprn, int gprn)
355 {
356     TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4);
357     gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
358     tcg_temp_free_i32(t0);
359 }
360
361 /* SDR1 */
362 static void spr_write_sdr1 (void *opaque, int sprn, int gprn)
363 {
364     gen_helper_store_sdr1(cpu_env, cpu_gpr[gprn]);
365 }
366
367 /* 64 bits PowerPC specific SPRs */
368 /* ASR */
369 #if defined(TARGET_PPC64)
370 static void spr_read_hior (void *opaque, int gprn, int sprn)
371 {
372     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, excp_prefix));
373 }
374
375 static void spr_write_hior (void *opaque, int sprn, int gprn)
376 {
377     TCGv t0 = tcg_temp_new();
378     tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL);
379     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
380     tcg_temp_free(t0);
381 }
382
383 static void spr_read_asr (void *opaque, int gprn, int sprn)
384 {
385     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, asr));
386 }
387
388 static void spr_write_asr (void *opaque, int sprn, int gprn)
389 {
390     gen_helper_store_asr(cpu_env, cpu_gpr[gprn]);
391 }
392 #endif
393 #endif
394
395 /* PowerPC 601 specific registers */
396 /* RTC */
397 static void spr_read_601_rtcl (void *opaque, int gprn, int sprn)
398 {
399     gen_helper_load_601_rtcl(cpu_gpr[gprn], cpu_env);
400 }
401
402 static void spr_read_601_rtcu (void *opaque, int gprn, int sprn)
403 {
404     gen_helper_load_601_rtcu(cpu_gpr[gprn], cpu_env);
405 }
406
407 #if !defined(CONFIG_USER_ONLY)
408 static void spr_write_601_rtcu (void *opaque, int sprn, int gprn)
409 {
410     gen_helper_store_601_rtcu(cpu_env, cpu_gpr[gprn]);
411 }
412
413 static void spr_write_601_rtcl (void *opaque, int sprn, int gprn)
414 {
415     gen_helper_store_601_rtcl(cpu_env, cpu_gpr[gprn]);
416 }
417
418 static void spr_write_hid0_601 (void *opaque, int sprn, int gprn)
419 {
420     DisasContext *ctx = opaque;
421
422     gen_helper_store_hid0_601(cpu_env, cpu_gpr[gprn]);
423     /* Must stop the translation as endianness may have changed */
424     gen_stop_exception(ctx);
425 }
426 #endif
427
428 /* Unified bats */
429 #if !defined(CONFIG_USER_ONLY)
430 static void spr_read_601_ubat (void *opaque, int gprn, int sprn)
431 {
432     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
433 }
434
435 static void spr_write_601_ubatu (void *opaque, int sprn, int gprn)
436 {
437     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
438     gen_helper_store_601_batl(cpu_env, t0, cpu_gpr[gprn]);
439     tcg_temp_free_i32(t0);
440 }
441
442 static void spr_write_601_ubatl (void *opaque, int sprn, int gprn)
443 {
444     TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
445     gen_helper_store_601_batu(cpu_env, t0, cpu_gpr[gprn]);
446     tcg_temp_free_i32(t0);
447 }
448 #endif
449
450 /* PowerPC 40x specific registers */
451 #if !defined(CONFIG_USER_ONLY)
452 static void spr_read_40x_pit (void *opaque, int gprn, int sprn)
453 {
454     gen_helper_load_40x_pit(cpu_gpr[gprn], cpu_env);
455 }
456
457 static void spr_write_40x_pit (void *opaque, int sprn, int gprn)
458 {
459     gen_helper_store_40x_pit(cpu_env, cpu_gpr[gprn]);
460 }
461
462 static void spr_write_40x_dbcr0 (void *opaque, int sprn, int gprn)
463 {
464     DisasContext *ctx = opaque;
465
466     gen_helper_store_40x_dbcr0(cpu_env, cpu_gpr[gprn]);
467     /* We must stop translation as we may have rebooted */
468     gen_stop_exception(ctx);
469 }
470
471 static void spr_write_40x_sler (void *opaque, int sprn, int gprn)
472 {
473     gen_helper_store_40x_sler(cpu_env, cpu_gpr[gprn]);
474 }
475
476 static void spr_write_booke_tcr (void *opaque, int sprn, int gprn)
477 {
478     gen_helper_store_booke_tcr(cpu_env, cpu_gpr[gprn]);
479 }
480
481 static void spr_write_booke_tsr (void *opaque, int sprn, int gprn)
482 {
483     gen_helper_store_booke_tsr(cpu_env, cpu_gpr[gprn]);
484 }
485 #endif
486
487 /* PowerPC 403 specific registers */
488 /* PBL1 / PBU1 / PBL2 / PBU2 */
489 #if !defined(CONFIG_USER_ONLY)
490 static void spr_read_403_pbr (void *opaque, int gprn, int sprn)
491 {
492     tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, pb[sprn - SPR_403_PBL1]));
493 }
494
495 static void spr_write_403_pbr (void *opaque, int sprn, int gprn)
496 {
497     TCGv_i32 t0 = tcg_const_i32(sprn - SPR_403_PBL1);
498     gen_helper_store_403_pbr(cpu_env, t0, cpu_gpr[gprn]);
499     tcg_temp_free_i32(t0);
500 }
501
502 static void spr_write_pir (void *opaque, int sprn, int gprn)
503 {
504     TCGv t0 = tcg_temp_new();
505     tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF);
506     gen_store_spr(SPR_PIR, t0);
507     tcg_temp_free(t0);
508 }
509 #endif
510
511 /* SPE specific registers */
512 static void spr_read_spefscr (void *opaque, int gprn, int sprn)
513 {
514     TCGv_i32 t0 = tcg_temp_new_i32();
515     tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
516     tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0);
517     tcg_temp_free_i32(t0);
518 }
519
520 static void spr_write_spefscr (void *opaque, int sprn, int gprn)
521 {
522     TCGv_i32 t0 = tcg_temp_new_i32();
523     tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]);
524     tcg_gen_st_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
525     tcg_temp_free_i32(t0);
526 }
527
528 #if !defined(CONFIG_USER_ONLY)
529 /* Callback used to write the exception vector base */
530 static void spr_write_excp_prefix (void *opaque, int sprn, int gprn)
531 {
532     TCGv t0 = tcg_temp_new();
533     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivpr_mask));
534     tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
535     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
536     gen_store_spr(sprn, t0);
537     tcg_temp_free(t0);
538 }
539
540 static void spr_write_excp_vector (void *opaque, int sprn, int gprn)
541 {
542     DisasContext *ctx = opaque;
543     int sprn_offs;
544
545     if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
546         sprn_offs = sprn - SPR_BOOKE_IVOR0;
547     } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
548         sprn_offs = sprn - SPR_BOOKE_IVOR32 + 32;
549     } else if (sprn >= SPR_BOOKE_IVOR38 && sprn <= SPR_BOOKE_IVOR42) {
550         sprn_offs = sprn - SPR_BOOKE_IVOR38 + 38;
551     } else {
552         printf("Trying to write an unknown exception vector %d %03x\n",
553                sprn, sprn);
554         gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
555         return;
556     }
557
558     TCGv t0 = tcg_temp_new();
559     tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivor_mask));
560     tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
561     tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_vectors[sprn_offs]));
562     gen_store_spr(sprn, t0);
563     tcg_temp_free(t0);
564 }
565 #endif
566
567 static inline void vscr_init (CPUPPCState *env, uint32_t val)
568 {
569     env->vscr = val;
570     /* Altivec always uses round-to-nearest */
571     set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
572     set_flush_to_zero(vscr_nj, &env->vec_status);
573 }
574
575 #ifdef CONFIG_USER_ONLY
576 #define spr_register_kvm(env, num, name, uea_read, uea_write,                  \
577                          oea_read, oea_write, one_reg_id, initial_value)       \
578     _spr_register(env, num, name, uea_read, uea_write, initial_value)
579 #else
580 #if !defined(CONFIG_KVM)
581 #define spr_register_kvm(env, num, name, uea_read, uea_write,                  \
582                          oea_read, oea_write, one_reg_id, initial_value) \
583     _spr_register(env, num, name, uea_read, uea_write,                         \
584                   oea_read, oea_write, initial_value)
585 #else
586 #define spr_register_kvm(env, num, name, uea_read, uea_write,                  \
587                          oea_read, oea_write, one_reg_id, initial_value) \
588     _spr_register(env, num, name, uea_read, uea_write,                         \
589                   oea_read, oea_write, one_reg_id, initial_value)
590 #endif
591 #endif
592
593 #define spr_register(env, num, name, uea_read, uea_write,                      \
594                      oea_read, oea_write, initial_value)                       \
595     spr_register_kvm(env, num, name, uea_read, uea_write,                      \
596                      oea_read, oea_write, 0, initial_value)
597
598 static inline void _spr_register(CPUPPCState *env, int num,
599                                  const char *name,
600                                  void (*uea_read)(void *opaque, int gprn, int sprn),
601                                  void (*uea_write)(void *opaque, int sprn, int gprn),
602 #if !defined(CONFIG_USER_ONLY)
603
604                                  void (*oea_read)(void *opaque, int gprn, int sprn),
605                                  void (*oea_write)(void *opaque, int sprn, int gprn),
606 #endif
607 #if defined(CONFIG_KVM)
608                                  uint64_t one_reg_id,
609 #endif
610                                  target_ulong initial_value)
611 {
612     ppc_spr_t *spr;
613
614     spr = &env->spr_cb[num];
615     if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
616 #if !defined(CONFIG_USER_ONLY)
617         spr->oea_read != NULL || spr->oea_write != NULL ||
618 #endif
619         spr->uea_read != NULL || spr->uea_write != NULL) {
620         printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
621         exit(1);
622     }
623 #if defined(PPC_DEBUG_SPR)
624     printf("*** register spr %d (%03x) %s val " TARGET_FMT_lx "\n", num, num,
625            name, initial_value);
626 #endif
627     spr->name = name;
628     spr->uea_read = uea_read;
629     spr->uea_write = uea_write;
630 #if !defined(CONFIG_USER_ONLY)
631     spr->oea_read = oea_read;
632     spr->oea_write = oea_write;
633 #endif
634     env->spr[num] = initial_value;
635 }
636
637 /* Generic PowerPC SPRs */
638 static void gen_spr_generic (CPUPPCState *env)
639 {
640     /* Integer processing */
641     spr_register(env, SPR_XER, "XER",
642                  &spr_read_xer, &spr_write_xer,
643                  &spr_read_xer, &spr_write_xer,
644                  0x00000000);
645     /* Branch contol */
646     spr_register(env, SPR_LR, "LR",
647                  &spr_read_lr, &spr_write_lr,
648                  &spr_read_lr, &spr_write_lr,
649                  0x00000000);
650     spr_register(env, SPR_CTR, "CTR",
651                  &spr_read_ctr, &spr_write_ctr,
652                  &spr_read_ctr, &spr_write_ctr,
653                  0x00000000);
654     /* Interrupt processing */
655     spr_register(env, SPR_SRR0, "SRR0",
656                  SPR_NOACCESS, SPR_NOACCESS,
657                  &spr_read_generic, &spr_write_generic,
658                  0x00000000);
659     spr_register(env, SPR_SRR1, "SRR1",
660                  SPR_NOACCESS, SPR_NOACCESS,
661                  &spr_read_generic, &spr_write_generic,
662                  0x00000000);
663     /* Processor control */
664     spr_register(env, SPR_SPRG0, "SPRG0",
665                  SPR_NOACCESS, SPR_NOACCESS,
666                  &spr_read_generic, &spr_write_generic,
667                  0x00000000);
668     spr_register(env, SPR_SPRG1, "SPRG1",
669                  SPR_NOACCESS, SPR_NOACCESS,
670                  &spr_read_generic, &spr_write_generic,
671                  0x00000000);
672     spr_register(env, SPR_SPRG2, "SPRG2",
673                  SPR_NOACCESS, SPR_NOACCESS,
674                  &spr_read_generic, &spr_write_generic,
675                  0x00000000);
676     spr_register(env, SPR_SPRG3, "SPRG3",
677                  SPR_NOACCESS, SPR_NOACCESS,
678                  &spr_read_generic, &spr_write_generic,
679                  0x00000000);
680 }
681
682 /* SPR common to all non-embedded PowerPC, including 601 */
683 static void gen_spr_ne_601 (CPUPPCState *env)
684 {
685     /* Exception processing */
686     spr_register_kvm(env, SPR_DSISR, "DSISR",
687                      SPR_NOACCESS, SPR_NOACCESS,
688                      &spr_read_generic, &spr_write_generic,
689                      KVM_REG_PPC_DSISR, 0x00000000);
690     spr_register_kvm(env, SPR_DAR, "DAR",
691                      SPR_NOACCESS, SPR_NOACCESS,
692                      &spr_read_generic, &spr_write_generic,
693                      KVM_REG_PPC_DAR, 0x00000000);
694     /* Timer */
695     spr_register(env, SPR_DECR, "DECR",
696                  SPR_NOACCESS, SPR_NOACCESS,
697                  &spr_read_decr, &spr_write_decr,
698                  0x00000000);
699     /* Memory management */
700     spr_register(env, SPR_SDR1, "SDR1",
701                  SPR_NOACCESS, SPR_NOACCESS,
702                  &spr_read_generic, &spr_write_sdr1,
703                  0x00000000);
704 }
705
706 /* BATs 0-3 */
707 static void gen_low_BATs (CPUPPCState *env)
708 {
709 #if !defined(CONFIG_USER_ONLY)
710     spr_register(env, SPR_IBAT0U, "IBAT0U",
711                  SPR_NOACCESS, SPR_NOACCESS,
712                  &spr_read_ibat, &spr_write_ibatu,
713                  0x00000000);
714     spr_register(env, SPR_IBAT0L, "IBAT0L",
715                  SPR_NOACCESS, SPR_NOACCESS,
716                  &spr_read_ibat, &spr_write_ibatl,
717                  0x00000000);
718     spr_register(env, SPR_IBAT1U, "IBAT1U",
719                  SPR_NOACCESS, SPR_NOACCESS,
720                  &spr_read_ibat, &spr_write_ibatu,
721                  0x00000000);
722     spr_register(env, SPR_IBAT1L, "IBAT1L",
723                  SPR_NOACCESS, SPR_NOACCESS,
724                  &spr_read_ibat, &spr_write_ibatl,
725                  0x00000000);
726     spr_register(env, SPR_IBAT2U, "IBAT2U",
727                  SPR_NOACCESS, SPR_NOACCESS,
728                  &spr_read_ibat, &spr_write_ibatu,
729                  0x00000000);
730     spr_register(env, SPR_IBAT2L, "IBAT2L",
731                  SPR_NOACCESS, SPR_NOACCESS,
732                  &spr_read_ibat, &spr_write_ibatl,
733                  0x00000000);
734     spr_register(env, SPR_IBAT3U, "IBAT3U",
735                  SPR_NOACCESS, SPR_NOACCESS,
736                  &spr_read_ibat, &spr_write_ibatu,
737                  0x00000000);
738     spr_register(env, SPR_IBAT3L, "IBAT3L",
739                  SPR_NOACCESS, SPR_NOACCESS,
740                  &spr_read_ibat, &spr_write_ibatl,
741                  0x00000000);
742     spr_register(env, SPR_DBAT0U, "DBAT0U",
743                  SPR_NOACCESS, SPR_NOACCESS,
744                  &spr_read_dbat, &spr_write_dbatu,
745                  0x00000000);
746     spr_register(env, SPR_DBAT0L, "DBAT0L",
747                  SPR_NOACCESS, SPR_NOACCESS,
748                  &spr_read_dbat, &spr_write_dbatl,
749                  0x00000000);
750     spr_register(env, SPR_DBAT1U, "DBAT1U",
751                  SPR_NOACCESS, SPR_NOACCESS,
752                  &spr_read_dbat, &spr_write_dbatu,
753                  0x00000000);
754     spr_register(env, SPR_DBAT1L, "DBAT1L",
755                  SPR_NOACCESS, SPR_NOACCESS,
756                  &spr_read_dbat, &spr_write_dbatl,
757                  0x00000000);
758     spr_register(env, SPR_DBAT2U, "DBAT2U",
759                  SPR_NOACCESS, SPR_NOACCESS,
760                  &spr_read_dbat, &spr_write_dbatu,
761                  0x00000000);
762     spr_register(env, SPR_DBAT2L, "DBAT2L",
763                  SPR_NOACCESS, SPR_NOACCESS,
764                  &spr_read_dbat, &spr_write_dbatl,
765                  0x00000000);
766     spr_register(env, SPR_DBAT3U, "DBAT3U",
767                  SPR_NOACCESS, SPR_NOACCESS,
768                  &spr_read_dbat, &spr_write_dbatu,
769                  0x00000000);
770     spr_register(env, SPR_DBAT3L, "DBAT3L",
771                  SPR_NOACCESS, SPR_NOACCESS,
772                  &spr_read_dbat, &spr_write_dbatl,
773                  0x00000000);
774     env->nb_BATs += 4;
775 #endif
776 }
777
778 /* BATs 4-7 */
779 static void gen_high_BATs (CPUPPCState *env)
780 {
781 #if !defined(CONFIG_USER_ONLY)
782     spr_register(env, SPR_IBAT4U, "IBAT4U",
783                  SPR_NOACCESS, SPR_NOACCESS,
784                  &spr_read_ibat_h, &spr_write_ibatu_h,
785                  0x00000000);
786     spr_register(env, SPR_IBAT4L, "IBAT4L",
787                  SPR_NOACCESS, SPR_NOACCESS,
788                  &spr_read_ibat_h, &spr_write_ibatl_h,
789                  0x00000000);
790     spr_register(env, SPR_IBAT5U, "IBAT5U",
791                  SPR_NOACCESS, SPR_NOACCESS,
792                  &spr_read_ibat_h, &spr_write_ibatu_h,
793                  0x00000000);
794     spr_register(env, SPR_IBAT5L, "IBAT5L",
795                  SPR_NOACCESS, SPR_NOACCESS,
796                  &spr_read_ibat_h, &spr_write_ibatl_h,
797                  0x00000000);
798     spr_register(env, SPR_IBAT6U, "IBAT6U",
799                  SPR_NOACCESS, SPR_NOACCESS,
800                  &spr_read_ibat_h, &spr_write_ibatu_h,
801                  0x00000000);
802     spr_register(env, SPR_IBAT6L, "IBAT6L",
803                  SPR_NOACCESS, SPR_NOACCESS,
804                  &spr_read_ibat_h, &spr_write_ibatl_h,
805                  0x00000000);
806     spr_register(env, SPR_IBAT7U, "IBAT7U",
807                  SPR_NOACCESS, SPR_NOACCESS,
808                  &spr_read_ibat_h, &spr_write_ibatu_h,
809                  0x00000000);
810     spr_register(env, SPR_IBAT7L, "IBAT7L",
811                  SPR_NOACCESS, SPR_NOACCESS,
812                  &spr_read_ibat_h, &spr_write_ibatl_h,
813                  0x00000000);
814     spr_register(env, SPR_DBAT4U, "DBAT4U",
815                  SPR_NOACCESS, SPR_NOACCESS,
816                  &spr_read_dbat_h, &spr_write_dbatu_h,
817                  0x00000000);
818     spr_register(env, SPR_DBAT4L, "DBAT4L",
819                  SPR_NOACCESS, SPR_NOACCESS,
820                  &spr_read_dbat_h, &spr_write_dbatl_h,
821                  0x00000000);
822     spr_register(env, SPR_DBAT5U, "DBAT5U",
823                  SPR_NOACCESS, SPR_NOACCESS,
824                  &spr_read_dbat_h, &spr_write_dbatu_h,
825                  0x00000000);
826     spr_register(env, SPR_DBAT5L, "DBAT5L",
827                  SPR_NOACCESS, SPR_NOACCESS,
828                  &spr_read_dbat_h, &spr_write_dbatl_h,
829                  0x00000000);
830     spr_register(env, SPR_DBAT6U, "DBAT6U",
831                  SPR_NOACCESS, SPR_NOACCESS,
832                  &spr_read_dbat_h, &spr_write_dbatu_h,
833                  0x00000000);
834     spr_register(env, SPR_DBAT6L, "DBAT6L",
835                  SPR_NOACCESS, SPR_NOACCESS,
836                  &spr_read_dbat_h, &spr_write_dbatl_h,
837                  0x00000000);
838     spr_register(env, SPR_DBAT7U, "DBAT7U",
839                  SPR_NOACCESS, SPR_NOACCESS,
840                  &spr_read_dbat_h, &spr_write_dbatu_h,
841                  0x00000000);
842     spr_register(env, SPR_DBAT7L, "DBAT7L",
843                  SPR_NOACCESS, SPR_NOACCESS,
844                  &spr_read_dbat_h, &spr_write_dbatl_h,
845                  0x00000000);
846     env->nb_BATs += 4;
847 #endif
848 }
849
850 /* Generic PowerPC time base */
851 static void gen_tbl (CPUPPCState *env)
852 {
853     spr_register(env, SPR_VTBL,  "TBL",
854                  &spr_read_tbl, SPR_NOACCESS,
855                  &spr_read_tbl, SPR_NOACCESS,
856                  0x00000000);
857     spr_register(env, SPR_TBL,   "TBL",
858                  &spr_read_tbl, SPR_NOACCESS,
859                  &spr_read_tbl, &spr_write_tbl,
860                  0x00000000);
861     spr_register(env, SPR_VTBU,  "TBU",
862                  &spr_read_tbu, SPR_NOACCESS,
863                  &spr_read_tbu, SPR_NOACCESS,
864                  0x00000000);
865     spr_register(env, SPR_TBU,   "TBU",
866                  &spr_read_tbu, SPR_NOACCESS,
867                  &spr_read_tbu, &spr_write_tbu,
868                  0x00000000);
869 }
870
871 /* Softare table search registers */
872 static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
873 {
874 #if !defined(CONFIG_USER_ONLY)
875     env->nb_tlb = nb_tlbs;
876     env->nb_ways = nb_ways;
877     env->id_tlbs = 1;
878     env->tlb_type = TLB_6XX;
879     spr_register(env, SPR_DMISS, "DMISS",
880                  SPR_NOACCESS, SPR_NOACCESS,
881                  &spr_read_generic, SPR_NOACCESS,
882                  0x00000000);
883     spr_register(env, SPR_DCMP, "DCMP",
884                  SPR_NOACCESS, SPR_NOACCESS,
885                  &spr_read_generic, SPR_NOACCESS,
886                  0x00000000);
887     spr_register(env, SPR_HASH1, "HASH1",
888                  SPR_NOACCESS, SPR_NOACCESS,
889                  &spr_read_generic, SPR_NOACCESS,
890                  0x00000000);
891     spr_register(env, SPR_HASH2, "HASH2",
892                  SPR_NOACCESS, SPR_NOACCESS,
893                  &spr_read_generic, SPR_NOACCESS,
894                  0x00000000);
895     spr_register(env, SPR_IMISS, "IMISS",
896                  SPR_NOACCESS, SPR_NOACCESS,
897                  &spr_read_generic, SPR_NOACCESS,
898                  0x00000000);
899     spr_register(env, SPR_ICMP, "ICMP",
900                  SPR_NOACCESS, SPR_NOACCESS,
901                  &spr_read_generic, SPR_NOACCESS,
902                  0x00000000);
903     spr_register(env, SPR_RPA, "RPA",
904                  SPR_NOACCESS, SPR_NOACCESS,
905                  &spr_read_generic, &spr_write_generic,
906                  0x00000000);
907 #endif
908 }
909
910 /* SPR common to MPC755 and G2 */
911 static void gen_spr_G2_755 (CPUPPCState *env)
912 {
913     /* SGPRs */
914     spr_register(env, SPR_SPRG4, "SPRG4",
915                  SPR_NOACCESS, SPR_NOACCESS,
916                  &spr_read_generic, &spr_write_generic,
917                  0x00000000);
918     spr_register(env, SPR_SPRG5, "SPRG5",
919                  SPR_NOACCESS, SPR_NOACCESS,
920                  &spr_read_generic, &spr_write_generic,
921                  0x00000000);
922     spr_register(env, SPR_SPRG6, "SPRG6",
923                  SPR_NOACCESS, SPR_NOACCESS,
924                  &spr_read_generic, &spr_write_generic,
925                  0x00000000);
926     spr_register(env, SPR_SPRG7, "SPRG7",
927                  SPR_NOACCESS, SPR_NOACCESS,
928                  &spr_read_generic, &spr_write_generic,
929                  0x00000000);
930 }
931
932 /* SPR common to all 7xx PowerPC implementations */
933 static void gen_spr_7xx (CPUPPCState *env)
934 {
935     /* Breakpoints */
936     /* XXX : not implemented */
937     spr_register_kvm(env, SPR_DABR, "DABR",
938                      SPR_NOACCESS, SPR_NOACCESS,
939                      &spr_read_generic, &spr_write_generic,
940                      KVM_REG_PPC_DABR, 0x00000000);
941     /* XXX : not implemented */
942     spr_register(env, SPR_IABR, "IABR",
943                  SPR_NOACCESS, SPR_NOACCESS,
944                  &spr_read_generic, &spr_write_generic,
945                  0x00000000);
946     /* Cache management */
947     /* XXX : not implemented */
948     spr_register(env, SPR_ICTC, "ICTC",
949                  SPR_NOACCESS, SPR_NOACCESS,
950                  &spr_read_generic, &spr_write_generic,
951                  0x00000000);
952     /* Performance monitors */
953     /* XXX : not implemented */
954     spr_register(env, SPR_MMCR0, "MMCR0",
955                  SPR_NOACCESS, SPR_NOACCESS,
956                  &spr_read_generic, &spr_write_generic,
957                  0x00000000);
958     /* XXX : not implemented */
959     spr_register(env, SPR_MMCR1, "MMCR1",
960                  SPR_NOACCESS, SPR_NOACCESS,
961                  &spr_read_generic, &spr_write_generic,
962                  0x00000000);
963     /* XXX : not implemented */
964     spr_register(env, SPR_PMC1, "PMC1",
965                  SPR_NOACCESS, SPR_NOACCESS,
966                  &spr_read_generic, &spr_write_generic,
967                  0x00000000);
968     /* XXX : not implemented */
969     spr_register(env, SPR_PMC2, "PMC2",
970                  SPR_NOACCESS, SPR_NOACCESS,
971                  &spr_read_generic, &spr_write_generic,
972                  0x00000000);
973     /* XXX : not implemented */
974     spr_register(env, SPR_PMC3, "PMC3",
975                  SPR_NOACCESS, SPR_NOACCESS,
976                  &spr_read_generic, &spr_write_generic,
977                  0x00000000);
978     /* XXX : not implemented */
979     spr_register(env, SPR_PMC4, "PMC4",
980                  SPR_NOACCESS, SPR_NOACCESS,
981                  &spr_read_generic, &spr_write_generic,
982                  0x00000000);
983     /* XXX : not implemented */
984     spr_register(env, SPR_SIAR, "SIAR",
985                  SPR_NOACCESS, SPR_NOACCESS,
986                  &spr_read_generic, SPR_NOACCESS,
987                  0x00000000);
988     /* XXX : not implemented */
989     spr_register(env, SPR_UMMCR0, "UMMCR0",
990                  &spr_read_ureg, SPR_NOACCESS,
991                  &spr_read_ureg, SPR_NOACCESS,
992                  0x00000000);
993     /* XXX : not implemented */
994     spr_register(env, SPR_UMMCR1, "UMMCR1",
995                  &spr_read_ureg, SPR_NOACCESS,
996                  &spr_read_ureg, SPR_NOACCESS,
997                  0x00000000);
998     /* XXX : not implemented */
999     spr_register(env, SPR_UPMC1, "UPMC1",
1000                  &spr_read_ureg, SPR_NOACCESS,
1001                  &spr_read_ureg, SPR_NOACCESS,
1002                  0x00000000);
1003     /* XXX : not implemented */
1004     spr_register(env, SPR_UPMC2, "UPMC2",
1005                  &spr_read_ureg, SPR_NOACCESS,
1006                  &spr_read_ureg, SPR_NOACCESS,
1007                  0x00000000);
1008     /* XXX : not implemented */
1009     spr_register(env, SPR_UPMC3, "UPMC3",
1010                  &spr_read_ureg, SPR_NOACCESS,
1011                  &spr_read_ureg, SPR_NOACCESS,
1012                  0x00000000);
1013     /* XXX : not implemented */
1014     spr_register(env, SPR_UPMC4, "UPMC4",
1015                  &spr_read_ureg, SPR_NOACCESS,
1016                  &spr_read_ureg, SPR_NOACCESS,
1017                  0x00000000);
1018     /* XXX : not implemented */
1019     spr_register(env, SPR_USIAR, "USIAR",
1020                  &spr_read_ureg, SPR_NOACCESS,
1021                  &spr_read_ureg, SPR_NOACCESS,
1022                  0x00000000);
1023     /* External access control */
1024     /* XXX : not implemented */
1025     spr_register(env, SPR_EAR, "EAR",
1026                  SPR_NOACCESS, SPR_NOACCESS,
1027                  &spr_read_generic, &spr_write_generic,
1028                  0x00000000);
1029 }
1030
1031 static void gen_spr_thrm (CPUPPCState *env)
1032 {
1033     /* Thermal management */
1034     /* XXX : not implemented */
1035     spr_register(env, SPR_THRM1, "THRM1",
1036                  SPR_NOACCESS, SPR_NOACCESS,
1037                  &spr_read_generic, &spr_write_generic,
1038                  0x00000000);
1039     /* XXX : not implemented */
1040     spr_register(env, SPR_THRM2, "THRM2",
1041                  SPR_NOACCESS, SPR_NOACCESS,
1042                  &spr_read_generic, &spr_write_generic,
1043                  0x00000000);
1044     /* XXX : not implemented */
1045     spr_register(env, SPR_THRM3, "THRM3",
1046                  SPR_NOACCESS, SPR_NOACCESS,
1047                  &spr_read_generic, &spr_write_generic,
1048                  0x00000000);
1049 }
1050
1051 /* SPR specific to PowerPC 604 implementation */
1052 static void gen_spr_604 (CPUPPCState *env)
1053 {
1054     /* Processor identification */
1055     spr_register(env, SPR_PIR, "PIR",
1056                  SPR_NOACCESS, SPR_NOACCESS,
1057                  &spr_read_generic, &spr_write_pir,
1058                  0x00000000);
1059     /* Breakpoints */
1060     /* XXX : not implemented */
1061     spr_register(env, SPR_IABR, "IABR",
1062                  SPR_NOACCESS, SPR_NOACCESS,
1063                  &spr_read_generic, &spr_write_generic,
1064                  0x00000000);
1065     /* XXX : not implemented */
1066     spr_register_kvm(env, SPR_DABR, "DABR",
1067                      SPR_NOACCESS, SPR_NOACCESS,
1068                      &spr_read_generic, &spr_write_generic,
1069                      KVM_REG_PPC_DABR, 0x00000000);
1070     /* Performance counters */
1071     /* XXX : not implemented */
1072     spr_register(env, SPR_MMCR0, "MMCR0",
1073                  SPR_NOACCESS, SPR_NOACCESS,
1074                  &spr_read_generic, &spr_write_generic,
1075                  0x00000000);
1076     /* XXX : not implemented */
1077     spr_register(env, SPR_PMC1, "PMC1",
1078                  SPR_NOACCESS, SPR_NOACCESS,
1079                  &spr_read_generic, &spr_write_generic,
1080                  0x00000000);
1081     /* XXX : not implemented */
1082     spr_register(env, SPR_PMC2, "PMC2",
1083                  SPR_NOACCESS, SPR_NOACCESS,
1084                  &spr_read_generic, &spr_write_generic,
1085                  0x00000000);
1086     /* XXX : not implemented */
1087     spr_register(env, SPR_SIAR, "SIAR",
1088                  SPR_NOACCESS, SPR_NOACCESS,
1089                  &spr_read_generic, SPR_NOACCESS,
1090                  0x00000000);
1091     /* XXX : not implemented */
1092     spr_register(env, SPR_SDA, "SDA",
1093                  SPR_NOACCESS, SPR_NOACCESS,
1094                  &spr_read_generic, SPR_NOACCESS,
1095                  0x00000000);
1096     /* External access control */
1097     /* XXX : not implemented */
1098     spr_register(env, SPR_EAR, "EAR",
1099                  SPR_NOACCESS, SPR_NOACCESS,
1100                  &spr_read_generic, &spr_write_generic,
1101                  0x00000000);
1102 }
1103
1104 /* SPR specific to PowerPC 603 implementation */
1105 static void gen_spr_603 (CPUPPCState *env)
1106 {
1107     /* External access control */
1108     /* XXX : not implemented */
1109     spr_register(env, SPR_EAR, "EAR",
1110                  SPR_NOACCESS, SPR_NOACCESS,
1111                  &spr_read_generic, &spr_write_generic,
1112                  0x00000000);
1113 }
1114
1115 /* SPR specific to PowerPC G2 implementation */
1116 static void gen_spr_G2 (CPUPPCState *env)
1117 {
1118     /* Memory base address */
1119     /* MBAR */
1120     /* XXX : not implemented */
1121     spr_register(env, SPR_MBAR, "MBAR",
1122                  SPR_NOACCESS, SPR_NOACCESS,
1123                  &spr_read_generic, &spr_write_generic,
1124                  0x00000000);
1125     /* Exception processing */
1126     spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1127                  SPR_NOACCESS, SPR_NOACCESS,
1128                  &spr_read_generic, &spr_write_generic,
1129                  0x00000000);
1130     spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1131                  SPR_NOACCESS, SPR_NOACCESS,
1132                  &spr_read_generic, &spr_write_generic,
1133                  0x00000000);
1134     /* Breakpoints */
1135     /* XXX : not implemented */
1136     spr_register(env, SPR_DABR, "DABR",
1137                  SPR_NOACCESS, SPR_NOACCESS,
1138                  &spr_read_generic, &spr_write_generic,
1139                  0x00000000);
1140     /* XXX : not implemented */
1141     spr_register(env, SPR_DABR2, "DABR2",
1142                  SPR_NOACCESS, SPR_NOACCESS,
1143                  &spr_read_generic, &spr_write_generic,
1144                  0x00000000);
1145     /* XXX : not implemented */
1146     spr_register(env, SPR_IABR, "IABR",
1147                  SPR_NOACCESS, SPR_NOACCESS,
1148                  &spr_read_generic, &spr_write_generic,
1149                  0x00000000);
1150     /* XXX : not implemented */
1151     spr_register(env, SPR_IABR2, "IABR2",
1152                  SPR_NOACCESS, SPR_NOACCESS,
1153                  &spr_read_generic, &spr_write_generic,
1154                  0x00000000);
1155     /* XXX : not implemented */
1156     spr_register(env, SPR_IBCR, "IBCR",
1157                  SPR_NOACCESS, SPR_NOACCESS,
1158                  &spr_read_generic, &spr_write_generic,
1159                  0x00000000);
1160     /* XXX : not implemented */
1161     spr_register(env, SPR_DBCR, "DBCR",
1162                  SPR_NOACCESS, SPR_NOACCESS,
1163                  &spr_read_generic, &spr_write_generic,
1164                  0x00000000);
1165 }
1166
1167 /* SPR specific to PowerPC 602 implementation */
1168 static void gen_spr_602 (CPUPPCState *env)
1169 {
1170     /* ESA registers */
1171     /* XXX : not implemented */
1172     spr_register(env, SPR_SER, "SER",
1173                  SPR_NOACCESS, SPR_NOACCESS,
1174                  &spr_read_generic, &spr_write_generic,
1175                  0x00000000);
1176     /* XXX : not implemented */
1177     spr_register(env, SPR_SEBR, "SEBR",
1178                  SPR_NOACCESS, SPR_NOACCESS,
1179                  &spr_read_generic, &spr_write_generic,
1180                  0x00000000);
1181     /* XXX : not implemented */
1182     spr_register(env, SPR_ESASRR, "ESASRR",
1183                  SPR_NOACCESS, SPR_NOACCESS,
1184                  &spr_read_generic, &spr_write_generic,
1185                  0x00000000);
1186     /* Floating point status */
1187     /* XXX : not implemented */
1188     spr_register(env, SPR_SP, "SP",
1189                  SPR_NOACCESS, SPR_NOACCESS,
1190                  &spr_read_generic, &spr_write_generic,
1191                  0x00000000);
1192     /* XXX : not implemented */
1193     spr_register(env, SPR_LT, "LT",
1194                  SPR_NOACCESS, SPR_NOACCESS,
1195                  &spr_read_generic, &spr_write_generic,
1196                  0x00000000);
1197     /* Watchdog timer */
1198     /* XXX : not implemented */
1199     spr_register(env, SPR_TCR, "TCR",
1200                  SPR_NOACCESS, SPR_NOACCESS,
1201                  &spr_read_generic, &spr_write_generic,
1202                  0x00000000);
1203     /* Interrupt base */
1204     spr_register(env, SPR_IBR, "IBR",
1205                  SPR_NOACCESS, SPR_NOACCESS,
1206                  &spr_read_generic, &spr_write_generic,
1207                  0x00000000);
1208     /* XXX : not implemented */
1209     spr_register(env, SPR_IABR, "IABR",
1210                  SPR_NOACCESS, SPR_NOACCESS,
1211                  &spr_read_generic, &spr_write_generic,
1212                  0x00000000);
1213 }
1214
1215 /* SPR specific to PowerPC 601 implementation */
1216 static void gen_spr_601 (CPUPPCState *env)
1217 {
1218     /* Multiplication/division register */
1219     /* MQ */
1220     spr_register(env, SPR_MQ, "MQ",
1221                  &spr_read_generic, &spr_write_generic,
1222                  &spr_read_generic, &spr_write_generic,
1223                  0x00000000);
1224     /* RTC registers */
1225     spr_register(env, SPR_601_RTCU, "RTCU",
1226                  SPR_NOACCESS, SPR_NOACCESS,
1227                  SPR_NOACCESS, &spr_write_601_rtcu,
1228                  0x00000000);
1229     spr_register(env, SPR_601_VRTCU, "RTCU",
1230                  &spr_read_601_rtcu, SPR_NOACCESS,
1231                  &spr_read_601_rtcu, SPR_NOACCESS,
1232                  0x00000000);
1233     spr_register(env, SPR_601_RTCL, "RTCL",
1234                  SPR_NOACCESS, SPR_NOACCESS,
1235                  SPR_NOACCESS, &spr_write_601_rtcl,
1236                  0x00000000);
1237     spr_register(env, SPR_601_VRTCL, "RTCL",
1238                  &spr_read_601_rtcl, SPR_NOACCESS,
1239                  &spr_read_601_rtcl, SPR_NOACCESS,
1240                  0x00000000);
1241     /* Timer */
1242 #if 0 /* ? */
1243     spr_register(env, SPR_601_UDECR, "UDECR",
1244                  &spr_read_decr, SPR_NOACCESS,
1245                  &spr_read_decr, SPR_NOACCESS,
1246                  0x00000000);
1247 #endif
1248     /* External access control */
1249     /* XXX : not implemented */
1250     spr_register(env, SPR_EAR, "EAR",
1251                  SPR_NOACCESS, SPR_NOACCESS,
1252                  &spr_read_generic, &spr_write_generic,
1253                  0x00000000);
1254     /* Memory management */
1255 #if !defined(CONFIG_USER_ONLY)
1256     spr_register(env, SPR_IBAT0U, "IBAT0U",
1257                  SPR_NOACCESS, SPR_NOACCESS,
1258                  &spr_read_601_ubat, &spr_write_601_ubatu,
1259                  0x00000000);
1260     spr_register(env, SPR_IBAT0L, "IBAT0L",
1261                  SPR_NOACCESS, SPR_NOACCESS,
1262                  &spr_read_601_ubat, &spr_write_601_ubatl,
1263                  0x00000000);
1264     spr_register(env, SPR_IBAT1U, "IBAT1U",
1265                  SPR_NOACCESS, SPR_NOACCESS,
1266                  &spr_read_601_ubat, &spr_write_601_ubatu,
1267                  0x00000000);
1268     spr_register(env, SPR_IBAT1L, "IBAT1L",
1269                  SPR_NOACCESS, SPR_NOACCESS,
1270                  &spr_read_601_ubat, &spr_write_601_ubatl,
1271                  0x00000000);
1272     spr_register(env, SPR_IBAT2U, "IBAT2U",
1273                  SPR_NOACCESS, SPR_NOACCESS,
1274                  &spr_read_601_ubat, &spr_write_601_ubatu,
1275                  0x00000000);
1276     spr_register(env, SPR_IBAT2L, "IBAT2L",
1277                  SPR_NOACCESS, SPR_NOACCESS,
1278                  &spr_read_601_ubat, &spr_write_601_ubatl,
1279                  0x00000000);
1280     spr_register(env, SPR_IBAT3U, "IBAT3U",
1281                  SPR_NOACCESS, SPR_NOACCESS,
1282                  &spr_read_601_ubat, &spr_write_601_ubatu,
1283                  0x00000000);
1284     spr_register(env, SPR_IBAT3L, "IBAT3L",
1285                  SPR_NOACCESS, SPR_NOACCESS,
1286                  &spr_read_601_ubat, &spr_write_601_ubatl,
1287                  0x00000000);
1288     env->nb_BATs = 4;
1289 #endif
1290 }
1291
1292 static void gen_spr_74xx (CPUPPCState *env)
1293 {
1294     /* Processor identification */
1295     spr_register(env, SPR_PIR, "PIR",
1296                  SPR_NOACCESS, SPR_NOACCESS,
1297                  &spr_read_generic, &spr_write_pir,
1298                  0x00000000);
1299     /* XXX : not implemented */
1300     spr_register(env, SPR_MMCR2, "MMCR2",
1301                  SPR_NOACCESS, SPR_NOACCESS,
1302                  &spr_read_generic, &spr_write_generic,
1303                  0x00000000);
1304     /* XXX : not implemented */
1305     spr_register(env, SPR_UMMCR2, "UMMCR2",
1306                  &spr_read_ureg, SPR_NOACCESS,
1307                  &spr_read_ureg, SPR_NOACCESS,
1308                  0x00000000);
1309     /* XXX: not implemented */
1310     spr_register(env, SPR_BAMR, "BAMR",
1311                  SPR_NOACCESS, SPR_NOACCESS,
1312                  &spr_read_generic, &spr_write_generic,
1313                  0x00000000);
1314     /* XXX : not implemented */
1315     spr_register(env, SPR_MSSCR0, "MSSCR0",
1316                  SPR_NOACCESS, SPR_NOACCESS,
1317                  &spr_read_generic, &spr_write_generic,
1318                  0x00000000);
1319     /* Hardware implementation registers */
1320     /* XXX : not implemented */
1321     spr_register(env, SPR_HID0, "HID0",
1322                  SPR_NOACCESS, SPR_NOACCESS,
1323                  &spr_read_generic, &spr_write_generic,
1324                  0x00000000);
1325     /* XXX : not implemented */
1326     spr_register(env, SPR_HID1, "HID1",
1327                  SPR_NOACCESS, SPR_NOACCESS,
1328                  &spr_read_generic, &spr_write_generic,
1329                  0x00000000);
1330     /* Altivec */
1331     spr_register(env, SPR_VRSAVE, "VRSAVE",
1332                  &spr_read_generic, &spr_write_generic,
1333                  &spr_read_generic, &spr_write_generic,
1334                  0x00000000);
1335     /* XXX : not implemented */
1336     spr_register(env, SPR_L2CR, "L2CR",
1337                  SPR_NOACCESS, SPR_NOACCESS,
1338                  &spr_read_generic, &spr_write_generic,
1339                  0x00000000);
1340     /* Not strictly an SPR */
1341     vscr_init(env, 0x00010000);
1342 }
1343
1344 static void gen_l3_ctrl (CPUPPCState *env)
1345 {
1346     /* L3CR */
1347     /* XXX : not implemented */
1348     spr_register(env, SPR_L3CR, "L3CR",
1349                  SPR_NOACCESS, SPR_NOACCESS,
1350                  &spr_read_generic, &spr_write_generic,
1351                  0x00000000);
1352     /* L3ITCR0 */
1353     /* XXX : not implemented */
1354     spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1355                  SPR_NOACCESS, SPR_NOACCESS,
1356                  &spr_read_generic, &spr_write_generic,
1357                  0x00000000);
1358     /* L3PM */
1359     /* XXX : not implemented */
1360     spr_register(env, SPR_L3PM, "L3PM",
1361                  SPR_NOACCESS, SPR_NOACCESS,
1362                  &spr_read_generic, &spr_write_generic,
1363                  0x00000000);
1364 }
1365
1366 static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
1367 {
1368 #if !defined(CONFIG_USER_ONLY)
1369     env->nb_tlb = nb_tlbs;
1370     env->nb_ways = nb_ways;
1371     env->id_tlbs = 1;
1372     env->tlb_type = TLB_6XX;
1373     /* XXX : not implemented */
1374     spr_register(env, SPR_PTEHI, "PTEHI",
1375                  SPR_NOACCESS, SPR_NOACCESS,
1376                  &spr_read_generic, &spr_write_generic,
1377                  0x00000000);
1378     /* XXX : not implemented */
1379     spr_register(env, SPR_PTELO, "PTELO",
1380                  SPR_NOACCESS, SPR_NOACCESS,
1381                  &spr_read_generic, &spr_write_generic,
1382                  0x00000000);
1383     /* XXX : not implemented */
1384     spr_register(env, SPR_TLBMISS, "TLBMISS",
1385                  SPR_NOACCESS, SPR_NOACCESS,
1386                  &spr_read_generic, &spr_write_generic,
1387                  0x00000000);
1388 #endif
1389 }
1390
1391 #if !defined(CONFIG_USER_ONLY)
1392 static void spr_write_e500_l1csr0 (void *opaque, int sprn, int gprn)
1393 {
1394     TCGv t0 = tcg_temp_new();
1395
1396     tcg_gen_andi_tl(t0, cpu_gpr[gprn], ~256);
1397     gen_store_spr(sprn, t0);
1398     tcg_temp_free(t0);
1399 }
1400
1401 static void spr_write_booke206_mmucsr0 (void *opaque, int sprn, int gprn)
1402 {
1403     TCGv_i32 t0 = tcg_const_i32(sprn);
1404     gen_helper_booke206_tlbflush(cpu_env, t0);
1405     tcg_temp_free_i32(t0);
1406 }
1407
1408 static void spr_write_booke_pid (void *opaque, int sprn, int gprn)
1409 {
1410     TCGv_i32 t0 = tcg_const_i32(sprn);
1411     gen_helper_booke_setpid(cpu_env, t0, cpu_gpr[gprn]);
1412     tcg_temp_free_i32(t0);
1413 }
1414 #endif
1415
1416 static void gen_spr_usprgh (CPUPPCState *env)
1417 {
1418     spr_register(env, SPR_USPRG4, "USPRG4",
1419                  &spr_read_ureg, SPR_NOACCESS,
1420                  &spr_read_ureg, SPR_NOACCESS,
1421                  0x00000000);
1422     spr_register(env, SPR_USPRG5, "USPRG5",
1423                  &spr_read_ureg, SPR_NOACCESS,
1424                  &spr_read_ureg, SPR_NOACCESS,
1425                  0x00000000);
1426     spr_register(env, SPR_USPRG6, "USPRG6",
1427                  &spr_read_ureg, SPR_NOACCESS,
1428                  &spr_read_ureg, SPR_NOACCESS,
1429                  0x00000000);
1430     spr_register(env, SPR_USPRG7, "USPRG7",
1431                  &spr_read_ureg, SPR_NOACCESS,
1432                  &spr_read_ureg, SPR_NOACCESS,
1433                  0x00000000);
1434 }
1435
1436 /* PowerPC BookE SPR */
1437 static void gen_spr_BookE (CPUPPCState *env, uint64_t ivor_mask)
1438 {
1439     const char *ivor_names[64] = {
1440         "IVOR0",  "IVOR1",  "IVOR2",  "IVOR3",
1441         "IVOR4",  "IVOR5",  "IVOR6",  "IVOR7",
1442         "IVOR8",  "IVOR9",  "IVOR10", "IVOR11",
1443         "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1444         "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1445         "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1446         "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1447         "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1448         "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1449         "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1450         "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1451         "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1452         "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1453         "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1454         "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1455         "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1456     };
1457 #define SPR_BOOKE_IVORxx (-1)
1458     int ivor_sprn[64] = {
1459         SPR_BOOKE_IVOR0,  SPR_BOOKE_IVOR1,  SPR_BOOKE_IVOR2,  SPR_BOOKE_IVOR3,
1460         SPR_BOOKE_IVOR4,  SPR_BOOKE_IVOR5,  SPR_BOOKE_IVOR6,  SPR_BOOKE_IVOR7,
1461         SPR_BOOKE_IVOR8,  SPR_BOOKE_IVOR9,  SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1462         SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1463         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1464         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1465         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1466         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1467         SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1468         SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
1469         SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
1470         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1471         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1472         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1473         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1474         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1475     };
1476     int i;
1477
1478     /* Interrupt processing */
1479     spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1480                  SPR_NOACCESS, SPR_NOACCESS,
1481                  &spr_read_generic, &spr_write_generic,
1482                  0x00000000);
1483     spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1484                  SPR_NOACCESS, SPR_NOACCESS,
1485                  &spr_read_generic, &spr_write_generic,
1486                  0x00000000);
1487     /* Debug */
1488     /* XXX : not implemented */
1489     spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1490                  SPR_NOACCESS, SPR_NOACCESS,
1491                  &spr_read_generic, &spr_write_generic,
1492                  0x00000000);
1493     /* XXX : not implemented */
1494     spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1495                  SPR_NOACCESS, SPR_NOACCESS,
1496                  &spr_read_generic, &spr_write_generic,
1497                  0x00000000);
1498     /* XXX : not implemented */
1499     spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1500                  SPR_NOACCESS, SPR_NOACCESS,
1501                  &spr_read_generic, &spr_write_generic,
1502                  0x00000000);
1503     /* XXX : not implemented */
1504     spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1505                  SPR_NOACCESS, SPR_NOACCESS,
1506                  &spr_read_generic, &spr_write_generic,
1507                  0x00000000);
1508     /* XXX : not implemented */
1509     spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1510                  SPR_NOACCESS, SPR_NOACCESS,
1511                  &spr_read_generic, &spr_write_40x_dbcr0,
1512                  0x00000000);
1513     /* XXX : not implemented */
1514     spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1515                  SPR_NOACCESS, SPR_NOACCESS,
1516                  &spr_read_generic, &spr_write_generic,
1517                  0x00000000);
1518     /* XXX : not implemented */
1519     spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1520                  SPR_NOACCESS, SPR_NOACCESS,
1521                  &spr_read_generic, &spr_write_generic,
1522                  0x00000000);
1523     /* XXX : not implemented */
1524     spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1525                  SPR_NOACCESS, SPR_NOACCESS,
1526                  &spr_read_generic, &spr_write_clear,
1527                  0x00000000);
1528     spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1529                  SPR_NOACCESS, SPR_NOACCESS,
1530                  &spr_read_generic, &spr_write_generic,
1531                  0x00000000);
1532     spr_register(env, SPR_BOOKE_ESR, "ESR",
1533                  SPR_NOACCESS, SPR_NOACCESS,
1534                  &spr_read_generic, &spr_write_generic,
1535                  0x00000000);
1536     spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1537                  SPR_NOACCESS, SPR_NOACCESS,
1538                  &spr_read_generic, &spr_write_excp_prefix,
1539                  0x00000000);
1540     /* Exception vectors */
1541     for (i = 0; i < 64; i++) {
1542         if (ivor_mask & (1ULL << i)) {
1543             if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1544                 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1545                 exit(1);
1546             }
1547             spr_register(env, ivor_sprn[i], ivor_names[i],
1548                          SPR_NOACCESS, SPR_NOACCESS,
1549                          &spr_read_generic, &spr_write_excp_vector,
1550                          0x00000000);
1551         }
1552     }
1553     spr_register(env, SPR_BOOKE_PID, "PID",
1554                  SPR_NOACCESS, SPR_NOACCESS,
1555                  &spr_read_generic, &spr_write_booke_pid,
1556                  0x00000000);
1557     spr_register(env, SPR_BOOKE_TCR, "TCR",
1558                  SPR_NOACCESS, SPR_NOACCESS,
1559                  &spr_read_generic, &spr_write_booke_tcr,
1560                  0x00000000);
1561     spr_register(env, SPR_BOOKE_TSR, "TSR",
1562                  SPR_NOACCESS, SPR_NOACCESS,
1563                  &spr_read_generic, &spr_write_booke_tsr,
1564                  0x00000000);
1565     /* Timer */
1566     spr_register(env, SPR_DECR, "DECR",
1567                  SPR_NOACCESS, SPR_NOACCESS,
1568                  &spr_read_decr, &spr_write_decr,
1569                  0x00000000);
1570     spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1571                  SPR_NOACCESS, SPR_NOACCESS,
1572                  SPR_NOACCESS, &spr_write_generic,
1573                  0x00000000);
1574     /* SPRGs */
1575     spr_register(env, SPR_USPRG0, "USPRG0",
1576                  &spr_read_generic, &spr_write_generic,
1577                  &spr_read_generic, &spr_write_generic,
1578                  0x00000000);
1579     spr_register(env, SPR_SPRG4, "SPRG4",
1580                  SPR_NOACCESS, SPR_NOACCESS,
1581                  &spr_read_generic, &spr_write_generic,
1582                  0x00000000);
1583     spr_register(env, SPR_SPRG5, "SPRG5",
1584                  SPR_NOACCESS, SPR_NOACCESS,
1585                  &spr_read_generic, &spr_write_generic,
1586                  0x00000000);
1587     spr_register(env, SPR_SPRG6, "SPRG6",
1588                  SPR_NOACCESS, SPR_NOACCESS,
1589                  &spr_read_generic, &spr_write_generic,
1590                  0x00000000);
1591     spr_register(env, SPR_SPRG7, "SPRG7",
1592                  SPR_NOACCESS, SPR_NOACCESS,
1593                  &spr_read_generic, &spr_write_generic,
1594                  0x00000000);
1595 }
1596
1597 static inline uint32_t gen_tlbncfg(uint32_t assoc, uint32_t minsize,
1598                                    uint32_t maxsize, uint32_t flags,
1599                                    uint32_t nentries)
1600 {
1601     return (assoc << TLBnCFG_ASSOC_SHIFT) |
1602            (minsize << TLBnCFG_MINSIZE_SHIFT) |
1603            (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
1604            flags | nentries;
1605 }
1606
1607 /* BookE 2.06 storage control registers */
1608 static void gen_spr_BookE206(CPUPPCState *env, uint32_t mas_mask,
1609                               uint32_t *tlbncfg)
1610 {
1611 #if !defined(CONFIG_USER_ONLY)
1612     const char *mas_names[8] = {
1613         "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1614     };
1615     int mas_sprn[8] = {
1616         SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1617         SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1618     };
1619     int i;
1620
1621     /* TLB assist registers */
1622     /* XXX : not implemented */
1623     for (i = 0; i < 8; i++) {
1624         void (*uea_write)(void *o, int sprn, int gprn) = &spr_write_generic32;
1625         if (i == 2 && (mas_mask & (1 << i)) && (env->insns_flags & PPC_64B)) {
1626             uea_write = &spr_write_generic;
1627         }
1628         if (mas_mask & (1 << i)) {
1629             spr_register(env, mas_sprn[i], mas_names[i],
1630                          SPR_NOACCESS, SPR_NOACCESS,
1631                          &spr_read_generic, uea_write,
1632                          0x00000000);
1633         }
1634     }
1635     if (env->nb_pids > 1) {
1636         /* XXX : not implemented */
1637         spr_register(env, SPR_BOOKE_PID1, "PID1",
1638                      SPR_NOACCESS, SPR_NOACCESS,
1639                      &spr_read_generic, &spr_write_booke_pid,
1640                      0x00000000);
1641     }
1642     if (env->nb_pids > 2) {
1643         /* XXX : not implemented */
1644         spr_register(env, SPR_BOOKE_PID2, "PID2",
1645                      SPR_NOACCESS, SPR_NOACCESS,
1646                      &spr_read_generic, &spr_write_booke_pid,
1647                      0x00000000);
1648     }
1649     /* XXX : not implemented */
1650     spr_register(env, SPR_MMUCFG, "MMUCFG",
1651                  SPR_NOACCESS, SPR_NOACCESS,
1652                  &spr_read_generic, SPR_NOACCESS,
1653                  0x00000000); /* TOFIX */
1654     switch (env->nb_ways) {
1655     case 4:
1656         spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1657                      SPR_NOACCESS, SPR_NOACCESS,
1658                      &spr_read_generic, SPR_NOACCESS,
1659                      tlbncfg[3]);
1660         /* Fallthru */
1661     case 3:
1662         spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1663                      SPR_NOACCESS, SPR_NOACCESS,
1664                      &spr_read_generic, SPR_NOACCESS,
1665                      tlbncfg[2]);
1666         /* Fallthru */
1667     case 2:
1668         spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1669                      SPR_NOACCESS, SPR_NOACCESS,
1670                      &spr_read_generic, SPR_NOACCESS,
1671                      tlbncfg[1]);
1672         /* Fallthru */
1673     case 1:
1674         spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1675                      SPR_NOACCESS, SPR_NOACCESS,
1676                      &spr_read_generic, SPR_NOACCESS,
1677                      tlbncfg[0]);
1678         /* Fallthru */
1679     case 0:
1680     default:
1681         break;
1682     }
1683 #endif
1684
1685     gen_spr_usprgh(env);
1686 }
1687
1688 /* SPR specific to PowerPC 440 implementation */
1689 static void gen_spr_440 (CPUPPCState *env)
1690 {
1691     /* Cache control */
1692     /* XXX : not implemented */
1693     spr_register(env, SPR_440_DNV0, "DNV0",
1694                  SPR_NOACCESS, SPR_NOACCESS,
1695                  &spr_read_generic, &spr_write_generic,
1696                  0x00000000);
1697     /* XXX : not implemented */
1698     spr_register(env, SPR_440_DNV1, "DNV1",
1699                  SPR_NOACCESS, SPR_NOACCESS,
1700                  &spr_read_generic, &spr_write_generic,
1701                  0x00000000);
1702     /* XXX : not implemented */
1703     spr_register(env, SPR_440_DNV2, "DNV2",
1704                  SPR_NOACCESS, SPR_NOACCESS,
1705                  &spr_read_generic, &spr_write_generic,
1706                  0x00000000);
1707     /* XXX : not implemented */
1708     spr_register(env, SPR_440_DNV3, "DNV3",
1709                  SPR_NOACCESS, SPR_NOACCESS,
1710                  &spr_read_generic, &spr_write_generic,
1711                  0x00000000);
1712     /* XXX : not implemented */
1713     spr_register(env, SPR_440_DTV0, "DTV0",
1714                  SPR_NOACCESS, SPR_NOACCESS,
1715                  &spr_read_generic, &spr_write_generic,
1716                  0x00000000);
1717     /* XXX : not implemented */
1718     spr_register(env, SPR_440_DTV1, "DTV1",
1719                  SPR_NOACCESS, SPR_NOACCESS,
1720                  &spr_read_generic, &spr_write_generic,
1721                  0x00000000);
1722     /* XXX : not implemented */
1723     spr_register(env, SPR_440_DTV2, "DTV2",
1724                  SPR_NOACCESS, SPR_NOACCESS,
1725                  &spr_read_generic, &spr_write_generic,
1726                  0x00000000);
1727     /* XXX : not implemented */
1728     spr_register(env, SPR_440_DTV3, "DTV3",
1729                  SPR_NOACCESS, SPR_NOACCESS,
1730                  &spr_read_generic, &spr_write_generic,
1731                  0x00000000);
1732     /* XXX : not implemented */
1733     spr_register(env, SPR_440_DVLIM, "DVLIM",
1734                  SPR_NOACCESS, SPR_NOACCESS,
1735                  &spr_read_generic, &spr_write_generic,
1736                  0x00000000);
1737     /* XXX : not implemented */
1738     spr_register(env, SPR_440_INV0, "INV0",
1739                  SPR_NOACCESS, SPR_NOACCESS,
1740                  &spr_read_generic, &spr_write_generic,
1741                  0x00000000);
1742     /* XXX : not implemented */
1743     spr_register(env, SPR_440_INV1, "INV1",
1744                  SPR_NOACCESS, SPR_NOACCESS,
1745                  &spr_read_generic, &spr_write_generic,
1746                  0x00000000);
1747     /* XXX : not implemented */
1748     spr_register(env, SPR_440_INV2, "INV2",
1749                  SPR_NOACCESS, SPR_NOACCESS,
1750                  &spr_read_generic, &spr_write_generic,
1751                  0x00000000);
1752     /* XXX : not implemented */
1753     spr_register(env, SPR_440_INV3, "INV3",
1754                  SPR_NOACCESS, SPR_NOACCESS,
1755                  &spr_read_generic, &spr_write_generic,
1756                  0x00000000);
1757     /* XXX : not implemented */
1758     spr_register(env, SPR_440_ITV0, "ITV0",
1759                  SPR_NOACCESS, SPR_NOACCESS,
1760                  &spr_read_generic, &spr_write_generic,
1761                  0x00000000);
1762     /* XXX : not implemented */
1763     spr_register(env, SPR_440_ITV1, "ITV1",
1764                  SPR_NOACCESS, SPR_NOACCESS,
1765                  &spr_read_generic, &spr_write_generic,
1766                  0x00000000);
1767     /* XXX : not implemented */
1768     spr_register(env, SPR_440_ITV2, "ITV2",
1769                  SPR_NOACCESS, SPR_NOACCESS,
1770                  &spr_read_generic, &spr_write_generic,
1771                  0x00000000);
1772     /* XXX : not implemented */
1773     spr_register(env, SPR_440_ITV3, "ITV3",
1774                  SPR_NOACCESS, SPR_NOACCESS,
1775                  &spr_read_generic, &spr_write_generic,
1776                  0x00000000);
1777     /* XXX : not implemented */
1778     spr_register(env, SPR_440_IVLIM, "IVLIM",
1779                  SPR_NOACCESS, SPR_NOACCESS,
1780                  &spr_read_generic, &spr_write_generic,
1781                  0x00000000);
1782     /* Cache debug */
1783     /* XXX : not implemented */
1784     spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
1785                  SPR_NOACCESS, SPR_NOACCESS,
1786                  &spr_read_generic, SPR_NOACCESS,
1787                  0x00000000);
1788     /* XXX : not implemented */
1789     spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
1790                  SPR_NOACCESS, SPR_NOACCESS,
1791                  &spr_read_generic, SPR_NOACCESS,
1792                  0x00000000);
1793     /* XXX : not implemented */
1794     spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1795                  SPR_NOACCESS, SPR_NOACCESS,
1796                  &spr_read_generic, SPR_NOACCESS,
1797                  0x00000000);
1798     /* XXX : not implemented */
1799     spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
1800                  SPR_NOACCESS, SPR_NOACCESS,
1801                  &spr_read_generic, SPR_NOACCESS,
1802                  0x00000000);
1803     /* XXX : not implemented */
1804     spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
1805                  SPR_NOACCESS, SPR_NOACCESS,
1806                  &spr_read_generic, SPR_NOACCESS,
1807                  0x00000000);
1808     /* XXX : not implemented */
1809     spr_register(env, SPR_440_DBDR, "DBDR",
1810                  SPR_NOACCESS, SPR_NOACCESS,
1811                  &spr_read_generic, &spr_write_generic,
1812                  0x00000000);
1813     /* Processor control */
1814     spr_register(env, SPR_4xx_CCR0, "CCR0",
1815                  SPR_NOACCESS, SPR_NOACCESS,
1816                  &spr_read_generic, &spr_write_generic,
1817                  0x00000000);
1818     spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1819                  SPR_NOACCESS, SPR_NOACCESS,
1820                  &spr_read_generic, SPR_NOACCESS,
1821                  0x00000000);
1822     /* Storage control */
1823     spr_register(env, SPR_440_MMUCR, "MMUCR",
1824                  SPR_NOACCESS, SPR_NOACCESS,
1825                  &spr_read_generic, &spr_write_generic,
1826                  0x00000000);
1827 }
1828
1829 /* SPR shared between PowerPC 40x implementations */
1830 static void gen_spr_40x (CPUPPCState *env)
1831 {
1832     /* Cache */
1833     /* not emulated, as QEMU do not emulate caches */
1834     spr_register(env, SPR_40x_DCCR, "DCCR",
1835                  SPR_NOACCESS, SPR_NOACCESS,
1836                  &spr_read_generic, &spr_write_generic,
1837                  0x00000000);
1838     /* not emulated, as QEMU do not emulate caches */
1839     spr_register(env, SPR_40x_ICCR, "ICCR",
1840                  SPR_NOACCESS, SPR_NOACCESS,
1841                  &spr_read_generic, &spr_write_generic,
1842                  0x00000000);
1843     /* not emulated, as QEMU do not emulate caches */
1844     spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1845                  SPR_NOACCESS, SPR_NOACCESS,
1846                  &spr_read_generic, SPR_NOACCESS,
1847                  0x00000000);
1848     /* Exception */
1849     spr_register(env, SPR_40x_DEAR, "DEAR",
1850                  SPR_NOACCESS, SPR_NOACCESS,
1851                  &spr_read_generic, &spr_write_generic,
1852                  0x00000000);
1853     spr_register(env, SPR_40x_ESR, "ESR",
1854                  SPR_NOACCESS, SPR_NOACCESS,
1855                  &spr_read_generic, &spr_write_generic,
1856                  0x00000000);
1857     spr_register(env, SPR_40x_EVPR, "EVPR",
1858                  SPR_NOACCESS, SPR_NOACCESS,
1859                  &spr_read_generic, &spr_write_excp_prefix,
1860                  0x00000000);
1861     spr_register(env, SPR_40x_SRR2, "SRR2",
1862                  &spr_read_generic, &spr_write_generic,
1863                  &spr_read_generic, &spr_write_generic,
1864                  0x00000000);
1865     spr_register(env, SPR_40x_SRR3, "SRR3",
1866                  &spr_read_generic, &spr_write_generic,
1867                  &spr_read_generic, &spr_write_generic,
1868                  0x00000000);
1869     /* Timers */
1870     spr_register(env, SPR_40x_PIT, "PIT",
1871                  SPR_NOACCESS, SPR_NOACCESS,
1872                  &spr_read_40x_pit, &spr_write_40x_pit,
1873                  0x00000000);
1874     spr_register(env, SPR_40x_TCR, "TCR",
1875                  SPR_NOACCESS, SPR_NOACCESS,
1876                  &spr_read_generic, &spr_write_booke_tcr,
1877                  0x00000000);
1878     spr_register(env, SPR_40x_TSR, "TSR",
1879                  SPR_NOACCESS, SPR_NOACCESS,
1880                  &spr_read_generic, &spr_write_booke_tsr,
1881                  0x00000000);
1882 }
1883
1884 /* SPR specific to PowerPC 405 implementation */
1885 static void gen_spr_405 (CPUPPCState *env)
1886 {
1887     /* MMU */
1888     spr_register(env, SPR_40x_PID, "PID",
1889                  SPR_NOACCESS, SPR_NOACCESS,
1890                  &spr_read_generic, &spr_write_generic,
1891                  0x00000000);
1892     spr_register(env, SPR_4xx_CCR0, "CCR0",
1893                  SPR_NOACCESS, SPR_NOACCESS,
1894                  &spr_read_generic, &spr_write_generic,
1895                  0x00700000);
1896     /* Debug interface */
1897     /* XXX : not implemented */
1898     spr_register(env, SPR_40x_DBCR0, "DBCR0",
1899                  SPR_NOACCESS, SPR_NOACCESS,
1900                  &spr_read_generic, &spr_write_40x_dbcr0,
1901                  0x00000000);
1902     /* XXX : not implemented */
1903     spr_register(env, SPR_405_DBCR1, "DBCR1",
1904                  SPR_NOACCESS, SPR_NOACCESS,
1905                  &spr_read_generic, &spr_write_generic,
1906                  0x00000000);
1907     /* XXX : not implemented */
1908     spr_register(env, SPR_40x_DBSR, "DBSR",
1909                  SPR_NOACCESS, SPR_NOACCESS,
1910                  &spr_read_generic, &spr_write_clear,
1911                  /* Last reset was system reset */
1912                  0x00000300);
1913     /* XXX : not implemented */
1914     spr_register(env, SPR_40x_DAC1, "DAC1",
1915                  SPR_NOACCESS, SPR_NOACCESS,
1916                  &spr_read_generic, &spr_write_generic,
1917                  0x00000000);
1918     spr_register(env, SPR_40x_DAC2, "DAC2",
1919                  SPR_NOACCESS, SPR_NOACCESS,
1920                  &spr_read_generic, &spr_write_generic,
1921                  0x00000000);
1922     /* XXX : not implemented */
1923     spr_register(env, SPR_405_DVC1, "DVC1",
1924                  SPR_NOACCESS, SPR_NOACCESS,
1925                  &spr_read_generic, &spr_write_generic,
1926                  0x00000000);
1927     /* XXX : not implemented */
1928     spr_register(env, SPR_405_DVC2, "DVC2",
1929                  SPR_NOACCESS, SPR_NOACCESS,
1930                  &spr_read_generic, &spr_write_generic,
1931                  0x00000000);
1932     /* XXX : not implemented */
1933     spr_register(env, SPR_40x_IAC1, "IAC1",
1934                  SPR_NOACCESS, SPR_NOACCESS,
1935                  &spr_read_generic, &spr_write_generic,
1936                  0x00000000);
1937     spr_register(env, SPR_40x_IAC2, "IAC2",
1938                  SPR_NOACCESS, SPR_NOACCESS,
1939                  &spr_read_generic, &spr_write_generic,
1940                  0x00000000);
1941     /* XXX : not implemented */
1942     spr_register(env, SPR_405_IAC3, "IAC3",
1943                  SPR_NOACCESS, SPR_NOACCESS,
1944                  &spr_read_generic, &spr_write_generic,
1945                  0x00000000);
1946     /* XXX : not implemented */
1947     spr_register(env, SPR_405_IAC4, "IAC4",
1948                  SPR_NOACCESS, SPR_NOACCESS,
1949                  &spr_read_generic, &spr_write_generic,
1950                  0x00000000);
1951     /* Storage control */
1952     /* XXX: TODO: not implemented */
1953     spr_register(env, SPR_405_SLER, "SLER",
1954                  SPR_NOACCESS, SPR_NOACCESS,
1955                  &spr_read_generic, &spr_write_40x_sler,
1956                  0x00000000);
1957     spr_register(env, SPR_40x_ZPR, "ZPR",
1958                  SPR_NOACCESS, SPR_NOACCESS,
1959                  &spr_read_generic, &spr_write_generic,
1960                  0x00000000);
1961     /* XXX : not implemented */
1962     spr_register(env, SPR_405_SU0R, "SU0R",
1963                  SPR_NOACCESS, SPR_NOACCESS,
1964                  &spr_read_generic, &spr_write_generic,
1965                  0x00000000);
1966     /* SPRG */
1967     spr_register(env, SPR_USPRG0, "USPRG0",
1968                  &spr_read_ureg, SPR_NOACCESS,
1969                  &spr_read_ureg, SPR_NOACCESS,
1970                  0x00000000);
1971     spr_register(env, SPR_SPRG4, "SPRG4",
1972                  SPR_NOACCESS, SPR_NOACCESS,
1973                  &spr_read_generic, &spr_write_generic,
1974                  0x00000000);
1975     spr_register(env, SPR_SPRG5, "SPRG5",
1976                  SPR_NOACCESS, SPR_NOACCESS,
1977                  spr_read_generic, &spr_write_generic,
1978                  0x00000000);
1979     spr_register(env, SPR_SPRG6, "SPRG6",
1980                  SPR_NOACCESS, SPR_NOACCESS,
1981                  spr_read_generic, &spr_write_generic,
1982                  0x00000000);
1983     spr_register(env, SPR_SPRG7, "SPRG7",
1984                  SPR_NOACCESS, SPR_NOACCESS,
1985                  spr_read_generic, &spr_write_generic,
1986                  0x00000000);
1987     gen_spr_usprgh(env);
1988 }
1989
1990 /* SPR shared between PowerPC 401 & 403 implementations */
1991 static void gen_spr_401_403 (CPUPPCState *env)
1992 {
1993     /* Time base */
1994     spr_register(env, SPR_403_VTBL,  "TBL",
1995                  &spr_read_tbl, SPR_NOACCESS,
1996                  &spr_read_tbl, SPR_NOACCESS,
1997                  0x00000000);
1998     spr_register(env, SPR_403_TBL,   "TBL",
1999                  SPR_NOACCESS, SPR_NOACCESS,
2000                  SPR_NOACCESS, &spr_write_tbl,
2001                  0x00000000);
2002     spr_register(env, SPR_403_VTBU,  "TBU",
2003                  &spr_read_tbu, SPR_NOACCESS,
2004                  &spr_read_tbu, SPR_NOACCESS,
2005                  0x00000000);
2006     spr_register(env, SPR_403_TBU,   "TBU",
2007                  SPR_NOACCESS, SPR_NOACCESS,
2008                  SPR_NOACCESS, &spr_write_tbu,
2009                  0x00000000);
2010     /* Debug */
2011     /* not emulated, as QEMU do not emulate caches */
2012     spr_register(env, SPR_403_CDBCR, "CDBCR",
2013                  SPR_NOACCESS, SPR_NOACCESS,
2014                  &spr_read_generic, &spr_write_generic,
2015                  0x00000000);
2016 }
2017
2018 /* SPR specific to PowerPC 401 implementation */
2019 static void gen_spr_401 (CPUPPCState *env)
2020 {
2021     /* Debug interface */
2022     /* XXX : not implemented */
2023     spr_register(env, SPR_40x_DBCR0, "DBCR",
2024                  SPR_NOACCESS, SPR_NOACCESS,
2025                  &spr_read_generic, &spr_write_40x_dbcr0,
2026                  0x00000000);
2027     /* XXX : not implemented */
2028     spr_register(env, SPR_40x_DBSR, "DBSR",
2029                  SPR_NOACCESS, SPR_NOACCESS,
2030                  &spr_read_generic, &spr_write_clear,
2031                  /* Last reset was system reset */
2032                  0x00000300);
2033     /* XXX : not implemented */
2034     spr_register(env, SPR_40x_DAC1, "DAC",
2035                  SPR_NOACCESS, SPR_NOACCESS,
2036                  &spr_read_generic, &spr_write_generic,
2037                  0x00000000);
2038     /* XXX : not implemented */
2039     spr_register(env, SPR_40x_IAC1, "IAC",
2040                  SPR_NOACCESS, SPR_NOACCESS,
2041                  &spr_read_generic, &spr_write_generic,
2042                  0x00000000);
2043     /* Storage control */
2044     /* XXX: TODO: not implemented */
2045     spr_register(env, SPR_405_SLER, "SLER",
2046                  SPR_NOACCESS, SPR_NOACCESS,
2047                  &spr_read_generic, &spr_write_40x_sler,
2048                  0x00000000);
2049     /* not emulated, as QEMU never does speculative access */
2050     spr_register(env, SPR_40x_SGR, "SGR",
2051                  SPR_NOACCESS, SPR_NOACCESS,
2052                  &spr_read_generic, &spr_write_generic,
2053                  0xFFFFFFFF);
2054     /* not emulated, as QEMU do not emulate caches */
2055     spr_register(env, SPR_40x_DCWR, "DCWR",
2056                  SPR_NOACCESS, SPR_NOACCESS,
2057                  &spr_read_generic, &spr_write_generic,
2058                  0x00000000);
2059 }
2060
2061 static void gen_spr_401x2 (CPUPPCState *env)
2062 {
2063     gen_spr_401(env);
2064     spr_register(env, SPR_40x_PID, "PID",
2065                  SPR_NOACCESS, SPR_NOACCESS,
2066                  &spr_read_generic, &spr_write_generic,
2067                  0x00000000);
2068     spr_register(env, SPR_40x_ZPR, "ZPR",
2069                  SPR_NOACCESS, SPR_NOACCESS,
2070                  &spr_read_generic, &spr_write_generic,
2071                  0x00000000);
2072 }
2073
2074 /* SPR specific to PowerPC 403 implementation */
2075 static void gen_spr_403 (CPUPPCState *env)
2076 {
2077     /* Debug interface */
2078     /* XXX : not implemented */
2079     spr_register(env, SPR_40x_DBCR0, "DBCR0",
2080                  SPR_NOACCESS, SPR_NOACCESS,
2081                  &spr_read_generic, &spr_write_40x_dbcr0,
2082                  0x00000000);
2083     /* XXX : not implemented */
2084     spr_register(env, SPR_40x_DBSR, "DBSR",
2085                  SPR_NOACCESS, SPR_NOACCESS,
2086                  &spr_read_generic, &spr_write_clear,
2087                  /* Last reset was system reset */
2088                  0x00000300);
2089     /* XXX : not implemented */
2090     spr_register(env, SPR_40x_DAC1, "DAC1",
2091                  SPR_NOACCESS, SPR_NOACCESS,
2092                  &spr_read_generic, &spr_write_generic,
2093                  0x00000000);
2094     /* XXX : not implemented */
2095     spr_register(env, SPR_40x_DAC2, "DAC2",
2096                  SPR_NOACCESS, SPR_NOACCESS,
2097                  &spr_read_generic, &spr_write_generic,
2098                  0x00000000);
2099     /* XXX : not implemented */
2100     spr_register(env, SPR_40x_IAC1, "IAC1",
2101                  SPR_NOACCESS, SPR_NOACCESS,
2102                  &spr_read_generic, &spr_write_generic,
2103                  0x00000000);
2104     /* XXX : not implemented */
2105     spr_register(env, SPR_40x_IAC2, "IAC2",
2106                  SPR_NOACCESS, SPR_NOACCESS,
2107                  &spr_read_generic, &spr_write_generic,
2108                  0x00000000);
2109 }
2110
2111 static void gen_spr_403_real (CPUPPCState *env)
2112 {
2113     spr_register(env, SPR_403_PBL1,  "PBL1",
2114                  SPR_NOACCESS, SPR_NOACCESS,
2115                  &spr_read_403_pbr, &spr_write_403_pbr,
2116                  0x00000000);
2117     spr_register(env, SPR_403_PBU1,  "PBU1",
2118                  SPR_NOACCESS, SPR_NOACCESS,
2119                  &spr_read_403_pbr, &spr_write_403_pbr,
2120                  0x00000000);
2121     spr_register(env, SPR_403_PBL2,  "PBL2",
2122                  SPR_NOACCESS, SPR_NOACCESS,
2123                  &spr_read_403_pbr, &spr_write_403_pbr,
2124                  0x00000000);
2125     spr_register(env, SPR_403_PBU2,  "PBU2",
2126                  SPR_NOACCESS, SPR_NOACCESS,
2127                  &spr_read_403_pbr, &spr_write_403_pbr,
2128                  0x00000000);
2129 }
2130
2131 static void gen_spr_403_mmu (CPUPPCState *env)
2132 {
2133     /* MMU */
2134     spr_register(env, SPR_40x_PID, "PID",
2135                  SPR_NOACCESS, SPR_NOACCESS,
2136                  &spr_read_generic, &spr_write_generic,
2137                  0x00000000);
2138     spr_register(env, SPR_40x_ZPR, "ZPR",
2139                  SPR_NOACCESS, SPR_NOACCESS,
2140                  &spr_read_generic, &spr_write_generic,
2141                  0x00000000);
2142 }
2143
2144 /* SPR specific to PowerPC compression coprocessor extension */
2145 static void gen_spr_compress (CPUPPCState *env)
2146 {
2147     /* XXX : not implemented */
2148     spr_register(env, SPR_401_SKR, "SKR",
2149                  SPR_NOACCESS, SPR_NOACCESS,
2150                  &spr_read_generic, &spr_write_generic,
2151                  0x00000000);
2152 }
2153
2154 #if defined (TARGET_PPC64)
2155 /* SPR specific to PowerPC 620 */
2156 static void gen_spr_620 (CPUPPCState *env)
2157 {
2158     /* Processor identification */
2159     spr_register(env, SPR_PIR, "PIR",
2160                  SPR_NOACCESS, SPR_NOACCESS,
2161                  &spr_read_generic, &spr_write_pir,
2162                  0x00000000);
2163     spr_register(env, SPR_ASR, "ASR",
2164                  SPR_NOACCESS, SPR_NOACCESS,
2165                  &spr_read_asr, &spr_write_asr,
2166                  0x00000000);
2167     /* Breakpoints */
2168     /* XXX : not implemented */
2169     spr_register(env, SPR_IABR, "IABR",
2170                  SPR_NOACCESS, SPR_NOACCESS,
2171                  &spr_read_generic, &spr_write_generic,
2172                  0x00000000);
2173     /* XXX : not implemented */
2174     spr_register(env, SPR_DABR, "DABR",
2175                  SPR_NOACCESS, SPR_NOACCESS,
2176                  &spr_read_generic, &spr_write_generic,
2177                  0x00000000);
2178     /* XXX : not implemented */
2179     spr_register(env, SPR_SIAR, "SIAR",
2180                  SPR_NOACCESS, SPR_NOACCESS,
2181                  &spr_read_generic, SPR_NOACCESS,
2182                  0x00000000);
2183     /* XXX : not implemented */
2184     spr_register(env, SPR_SDA, "SDA",
2185                  SPR_NOACCESS, SPR_NOACCESS,
2186                  &spr_read_generic, SPR_NOACCESS,
2187                  0x00000000);
2188     /* XXX : not implemented */
2189     spr_register(env, SPR_620_PMC1R, "PMC1",
2190                  SPR_NOACCESS, SPR_NOACCESS,
2191                  &spr_read_generic, SPR_NOACCESS,
2192                  0x00000000);
2193     spr_register(env, SPR_620_PMC1W, "PMC1",
2194                  SPR_NOACCESS, SPR_NOACCESS,
2195                   SPR_NOACCESS, &spr_write_generic,
2196                  0x00000000);
2197     /* XXX : not implemented */
2198     spr_register(env, SPR_620_PMC2R, "PMC2",
2199                  SPR_NOACCESS, SPR_NOACCESS,
2200                  &spr_read_generic, SPR_NOACCESS,
2201                  0x00000000);
2202     spr_register(env, SPR_620_PMC2W, "PMC2",
2203                  SPR_NOACCESS, SPR_NOACCESS,
2204                   SPR_NOACCESS, &spr_write_generic,
2205                  0x00000000);
2206     /* XXX : not implemented */
2207     spr_register(env, SPR_620_MMCR0R, "MMCR0",
2208                  SPR_NOACCESS, SPR_NOACCESS,
2209                  &spr_read_generic, SPR_NOACCESS,
2210                  0x00000000);
2211     spr_register(env, SPR_620_MMCR0W, "MMCR0",
2212                  SPR_NOACCESS, SPR_NOACCESS,
2213                   SPR_NOACCESS, &spr_write_generic,
2214                  0x00000000);
2215     /* External access control */
2216     /* XXX : not implemented */
2217     spr_register(env, SPR_EAR, "EAR",
2218                  SPR_NOACCESS, SPR_NOACCESS,
2219                  &spr_read_generic, &spr_write_generic,
2220                  0x00000000);
2221 #if 0 // XXX: check this
2222     /* XXX : not implemented */
2223     spr_register(env, SPR_620_PMR0, "PMR0",
2224                  SPR_NOACCESS, SPR_NOACCESS,
2225                  &spr_read_generic, &spr_write_generic,
2226                  0x00000000);
2227     /* XXX : not implemented */
2228     spr_register(env, SPR_620_PMR1, "PMR1",
2229                  SPR_NOACCESS, SPR_NOACCESS,
2230                  &spr_read_generic, &spr_write_generic,
2231                  0x00000000);
2232     /* XXX : not implemented */
2233     spr_register(env, SPR_620_PMR2, "PMR2",
2234                  SPR_NOACCESS, SPR_NOACCESS,
2235                  &spr_read_generic, &spr_write_generic,
2236                  0x00000000);
2237     /* XXX : not implemented */
2238     spr_register(env, SPR_620_PMR3, "PMR3",
2239                  SPR_NOACCESS, SPR_NOACCESS,
2240                  &spr_read_generic, &spr_write_generic,
2241                  0x00000000);
2242     /* XXX : not implemented */
2243     spr_register(env, SPR_620_PMR4, "PMR4",
2244                  SPR_NOACCESS, SPR_NOACCESS,
2245                  &spr_read_generic, &spr_write_generic,
2246                  0x00000000);
2247     /* XXX : not implemented */
2248     spr_register(env, SPR_620_PMR5, "PMR5",
2249                  SPR_NOACCESS, SPR_NOACCESS,
2250                  &spr_read_generic, &spr_write_generic,
2251                  0x00000000);
2252     /* XXX : not implemented */
2253     spr_register(env, SPR_620_PMR6, "PMR6",
2254                  SPR_NOACCESS, SPR_NOACCESS,
2255                  &spr_read_generic, &spr_write_generic,
2256                  0x00000000);
2257     /* XXX : not implemented */
2258     spr_register(env, SPR_620_PMR7, "PMR7",
2259                  SPR_NOACCESS, SPR_NOACCESS,
2260                  &spr_read_generic, &spr_write_generic,
2261                  0x00000000);
2262     /* XXX : not implemented */
2263     spr_register(env, SPR_620_PMR8, "PMR8",
2264                  SPR_NOACCESS, SPR_NOACCESS,
2265                  &spr_read_generic, &spr_write_generic,
2266                  0x00000000);
2267     /* XXX : not implemented */
2268     spr_register(env, SPR_620_PMR9, "PMR9",
2269                  SPR_NOACCESS, SPR_NOACCESS,
2270                  &spr_read_generic, &spr_write_generic,
2271                  0x00000000);
2272     /* XXX : not implemented */
2273     spr_register(env, SPR_620_PMRA, "PMR10",
2274                  SPR_NOACCESS, SPR_NOACCESS,
2275                  &spr_read_generic, &spr_write_generic,
2276                  0x00000000);
2277     /* XXX : not implemented */
2278     spr_register(env, SPR_620_PMRB, "PMR11",
2279                  SPR_NOACCESS, SPR_NOACCESS,
2280                  &spr_read_generic, &spr_write_generic,
2281                  0x00000000);
2282     /* XXX : not implemented */
2283     spr_register(env, SPR_620_PMRC, "PMR12",
2284                  SPR_NOACCESS, SPR_NOACCESS,
2285                  &spr_read_generic, &spr_write_generic,
2286                  0x00000000);
2287     /* XXX : not implemented */
2288     spr_register(env, SPR_620_PMRD, "PMR13",
2289                  SPR_NOACCESS, SPR_NOACCESS,
2290                  &spr_read_generic, &spr_write_generic,
2291                  0x00000000);
2292     /* XXX : not implemented */
2293     spr_register(env, SPR_620_PMRE, "PMR14",
2294                  SPR_NOACCESS, SPR_NOACCESS,
2295                  &spr_read_generic, &spr_write_generic,
2296                  0x00000000);
2297     /* XXX : not implemented */
2298     spr_register(env, SPR_620_PMRF, "PMR15",
2299                  SPR_NOACCESS, SPR_NOACCESS,
2300                  &spr_read_generic, &spr_write_generic,
2301                  0x00000000);
2302 #endif
2303     /* XXX : not implemented */
2304     spr_register(env, SPR_620_BUSCSR, "BUSCSR",
2305                  SPR_NOACCESS, SPR_NOACCESS,
2306                  &spr_read_generic, &spr_write_generic,
2307                  0x00000000);
2308     /* XXX : not implemented */
2309     spr_register(env, SPR_620_L2CR, "L2CR",
2310                  SPR_NOACCESS, SPR_NOACCESS,
2311                  &spr_read_generic, &spr_write_generic,
2312                  0x00000000);
2313     /* XXX : not implemented */
2314     spr_register(env, SPR_620_L2SR, "L2SR",
2315                  SPR_NOACCESS, SPR_NOACCESS,
2316                  &spr_read_generic, &spr_write_generic,
2317                  0x00000000);
2318 }
2319 #endif /* defined (TARGET_PPC64) */
2320
2321 static void gen_spr_5xx_8xx (CPUPPCState *env)
2322 {
2323     /* Exception processing */
2324     spr_register_kvm(env, SPR_DSISR, "DSISR",
2325                      SPR_NOACCESS, SPR_NOACCESS,
2326                      &spr_read_generic, &spr_write_generic,
2327                      KVM_REG_PPC_DSISR, 0x00000000);
2328     spr_register_kvm(env, SPR_DAR, "DAR",
2329                      SPR_NOACCESS, SPR_NOACCESS,
2330                      &spr_read_generic, &spr_write_generic,
2331                      KVM_REG_PPC_DAR, 0x00000000);
2332     /* Timer */
2333     spr_register(env, SPR_DECR, "DECR",
2334                  SPR_NOACCESS, SPR_NOACCESS,
2335                  &spr_read_decr, &spr_write_decr,
2336                  0x00000000);
2337     /* XXX : not implemented */
2338     spr_register(env, SPR_MPC_EIE, "EIE",
2339                  SPR_NOACCESS, SPR_NOACCESS,
2340                  &spr_read_generic, &spr_write_generic,
2341                  0x00000000);
2342     /* XXX : not implemented */
2343     spr_register(env, SPR_MPC_EID, "EID",
2344                  SPR_NOACCESS, SPR_NOACCESS,
2345                  &spr_read_generic, &spr_write_generic,
2346                  0x00000000);
2347     /* XXX : not implemented */
2348     spr_register(env, SPR_MPC_NRI, "NRI",
2349                  SPR_NOACCESS, SPR_NOACCESS,
2350                  &spr_read_generic, &spr_write_generic,
2351                  0x00000000);
2352     /* XXX : not implemented */
2353     spr_register(env, SPR_MPC_CMPA, "CMPA",
2354                  SPR_NOACCESS, SPR_NOACCESS,
2355                  &spr_read_generic, &spr_write_generic,
2356                  0x00000000);
2357     /* XXX : not implemented */
2358     spr_register(env, SPR_MPC_CMPB, "CMPB",
2359                  SPR_NOACCESS, SPR_NOACCESS,
2360                  &spr_read_generic, &spr_write_generic,
2361                  0x00000000);
2362     /* XXX : not implemented */
2363     spr_register(env, SPR_MPC_CMPC, "CMPC",
2364                  SPR_NOACCESS, SPR_NOACCESS,
2365                  &spr_read_generic, &spr_write_generic,
2366                  0x00000000);
2367     /* XXX : not implemented */
2368     spr_register(env, SPR_MPC_CMPD, "CMPD",
2369                  SPR_NOACCESS, SPR_NOACCESS,
2370                  &spr_read_generic, &spr_write_generic,
2371                  0x00000000);
2372     /* XXX : not implemented */
2373     spr_register(env, SPR_MPC_ECR, "ECR",
2374                  SPR_NOACCESS, SPR_NOACCESS,
2375                  &spr_read_generic, &spr_write_generic,
2376                  0x00000000);
2377     /* XXX : not implemented */
2378     spr_register(env, SPR_MPC_DER, "DER",
2379                  SPR_NOACCESS, SPR_NOACCESS,
2380                  &spr_read_generic, &spr_write_generic,
2381                  0x00000000);
2382     /* XXX : not implemented */
2383     spr_register(env, SPR_MPC_COUNTA, "COUNTA",
2384                  SPR_NOACCESS, SPR_NOACCESS,
2385                  &spr_read_generic, &spr_write_generic,
2386                  0x00000000);
2387     /* XXX : not implemented */
2388     spr_register(env, SPR_MPC_COUNTB, "COUNTB",
2389                  SPR_NOACCESS, SPR_NOACCESS,
2390                  &spr_read_generic, &spr_write_generic,
2391                  0x00000000);
2392     /* XXX : not implemented */
2393     spr_register(env, SPR_MPC_CMPE, "CMPE",
2394                  SPR_NOACCESS, SPR_NOACCESS,
2395                  &spr_read_generic, &spr_write_generic,
2396                  0x00000000);
2397     /* XXX : not implemented */
2398     spr_register(env, SPR_MPC_CMPF, "CMPF",
2399                  SPR_NOACCESS, SPR_NOACCESS,
2400                  &spr_read_generic, &spr_write_generic,
2401                  0x00000000);
2402     /* XXX : not implemented */
2403     spr_register(env, SPR_MPC_CMPG, "CMPG",
2404                  SPR_NOACCESS, SPR_NOACCESS,
2405                  &spr_read_generic, &spr_write_generic,
2406                  0x00000000);
2407     /* XXX : not implemented */
2408     spr_register(env, SPR_MPC_CMPH, "CMPH",
2409                  SPR_NOACCESS, SPR_NOACCESS,
2410                  &spr_read_generic, &spr_write_generic,
2411                  0x00000000);
2412     /* XXX : not implemented */
2413     spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
2414                  SPR_NOACCESS, SPR_NOACCESS,
2415                  &spr_read_generic, &spr_write_generic,
2416                  0x00000000);
2417     /* XXX : not implemented */
2418     spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
2419                  SPR_NOACCESS, SPR_NOACCESS,
2420                  &spr_read_generic, &spr_write_generic,
2421                  0x00000000);
2422     /* XXX : not implemented */
2423     spr_register(env, SPR_MPC_BAR, "BAR",
2424                  SPR_NOACCESS, SPR_NOACCESS,
2425                  &spr_read_generic, &spr_write_generic,
2426                  0x00000000);
2427     /* XXX : not implemented */
2428     spr_register(env, SPR_MPC_DPDR, "DPDR",
2429                  SPR_NOACCESS, SPR_NOACCESS,
2430                  &spr_read_generic, &spr_write_generic,
2431                  0x00000000);
2432     /* XXX : not implemented */
2433     spr_register(env, SPR_MPC_IMMR, "IMMR",
2434                  SPR_NOACCESS, SPR_NOACCESS,
2435                  &spr_read_generic, &spr_write_generic,
2436                  0x00000000);
2437 }
2438
2439 static void gen_spr_5xx (CPUPPCState *env)
2440 {
2441     /* XXX : not implemented */
2442     spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
2443                  SPR_NOACCESS, SPR_NOACCESS,
2444                  &spr_read_generic, &spr_write_generic,
2445                  0x00000000);
2446     /* XXX : not implemented */
2447     spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
2448                  SPR_NOACCESS, SPR_NOACCESS,
2449                  &spr_read_generic, &spr_write_generic,
2450                  0x00000000);
2451     /* XXX : not implemented */
2452     spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
2453                  SPR_NOACCESS, SPR_NOACCESS,
2454                  &spr_read_generic, &spr_write_generic,
2455                  0x00000000);
2456     /* XXX : not implemented */
2457     spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
2458                  SPR_NOACCESS, SPR_NOACCESS,
2459                  &spr_read_generic, &spr_write_generic,
2460                  0x00000000);
2461     /* XXX : not implemented */
2462     spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
2463                  SPR_NOACCESS, SPR_NOACCESS,
2464                  &spr_read_generic, &spr_write_generic,
2465                  0x00000000);
2466     /* XXX : not implemented */
2467     spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
2468                  SPR_NOACCESS, SPR_NOACCESS,
2469                  &spr_read_generic, &spr_write_generic,
2470                  0x00000000);
2471     /* XXX : not implemented */
2472     spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
2473                  SPR_NOACCESS, SPR_NOACCESS,
2474                  &spr_read_generic, &spr_write_generic,
2475                  0x00000000);
2476     /* XXX : not implemented */
2477     spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
2478                  SPR_NOACCESS, SPR_NOACCESS,
2479                  &spr_read_generic, &spr_write_generic,
2480                  0x00000000);
2481     /* XXX : not implemented */
2482     spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
2483                  SPR_NOACCESS, SPR_NOACCESS,
2484                  &spr_read_generic, &spr_write_generic,
2485                  0x00000000);
2486     /* XXX : not implemented */
2487     spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
2488                  SPR_NOACCESS, SPR_NOACCESS,
2489                  &spr_read_generic, &spr_write_generic,
2490                  0x00000000);
2491     /* XXX : not implemented */
2492     spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
2493                  SPR_NOACCESS, SPR_NOACCESS,
2494                  &spr_read_generic, &spr_write_generic,
2495                  0x00000000);
2496     /* XXX : not implemented */
2497     spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
2498                  SPR_NOACCESS, SPR_NOACCESS,
2499                  &spr_read_generic, &spr_write_generic,
2500                  0x00000000);
2501     /* XXX : not implemented */
2502     spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
2503                  SPR_NOACCESS, SPR_NOACCESS,
2504                  &spr_read_generic, &spr_write_generic,
2505                  0x00000000);
2506     /* XXX : not implemented */
2507     spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
2508                  SPR_NOACCESS, SPR_NOACCESS,
2509                  &spr_read_generic, &spr_write_generic,
2510                  0x00000000);
2511     /* XXX : not implemented */
2512     spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
2513                  SPR_NOACCESS, SPR_NOACCESS,
2514                  &spr_read_generic, &spr_write_generic,
2515                  0x00000000);
2516     /* XXX : not implemented */
2517     spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
2518                  SPR_NOACCESS, SPR_NOACCESS,
2519                  &spr_read_generic, &spr_write_generic,
2520                  0x00000000);
2521     /* XXX : not implemented */
2522     spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
2523                  SPR_NOACCESS, SPR_NOACCESS,
2524                  &spr_read_generic, &spr_write_generic,
2525                  0x00000000);
2526     /* XXX : not implemented */
2527     spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
2528                  SPR_NOACCESS, SPR_NOACCESS,
2529                  &spr_read_generic, &spr_write_generic,
2530                  0x00000000);
2531     /* XXX : not implemented */
2532     spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
2533                  SPR_NOACCESS, SPR_NOACCESS,
2534                  &spr_read_generic, &spr_write_generic,
2535                  0x00000000);
2536     /* XXX : not implemented */
2537     spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
2538                  SPR_NOACCESS, SPR_NOACCESS,
2539                  &spr_read_generic, &spr_write_generic,
2540                  0x00000000);
2541     /* XXX : not implemented */
2542     spr_register(env, SPR_RCPU_FPECR, "FPECR",
2543                  SPR_NOACCESS, SPR_NOACCESS,
2544                  &spr_read_generic, &spr_write_generic,
2545                  0x00000000);
2546 }
2547
2548 static void gen_spr_8xx (CPUPPCState *env)
2549 {
2550     /* XXX : not implemented */
2551     spr_register(env, SPR_MPC_IC_CST, "IC_CST",
2552                  SPR_NOACCESS, SPR_NOACCESS,
2553                  &spr_read_generic, &spr_write_generic,
2554                  0x00000000);
2555     /* XXX : not implemented */
2556     spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
2557                  SPR_NOACCESS, SPR_NOACCESS,
2558                  &spr_read_generic, &spr_write_generic,
2559                  0x00000000);
2560     /* XXX : not implemented */
2561     spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
2562                  SPR_NOACCESS, SPR_NOACCESS,
2563                  &spr_read_generic, &spr_write_generic,
2564                  0x00000000);
2565     /* XXX : not implemented */
2566     spr_register(env, SPR_MPC_DC_CST, "DC_CST",
2567                  SPR_NOACCESS, SPR_NOACCESS,
2568                  &spr_read_generic, &spr_write_generic,
2569                  0x00000000);
2570     /* XXX : not implemented */
2571     spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
2572                  SPR_NOACCESS, SPR_NOACCESS,
2573                  &spr_read_generic, &spr_write_generic,
2574                  0x00000000);
2575     /* XXX : not implemented */
2576     spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
2577                  SPR_NOACCESS, SPR_NOACCESS,
2578                  &spr_read_generic, &spr_write_generic,
2579                  0x00000000);
2580     /* XXX : not implemented */
2581     spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
2582                  SPR_NOACCESS, SPR_NOACCESS,
2583                  &spr_read_generic, &spr_write_generic,
2584                  0x00000000);
2585     /* XXX : not implemented */
2586     spr_register(env, SPR_MPC_MI_AP, "MI_AP",
2587                  SPR_NOACCESS, SPR_NOACCESS,
2588                  &spr_read_generic, &spr_write_generic,
2589                  0x00000000);
2590     /* XXX : not implemented */
2591     spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
2592                  SPR_NOACCESS, SPR_NOACCESS,
2593                  &spr_read_generic, &spr_write_generic,
2594                  0x00000000);
2595     /* XXX : not implemented */
2596     spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
2597                  SPR_NOACCESS, SPR_NOACCESS,
2598                  &spr_read_generic, &spr_write_generic,
2599                  0x00000000);
2600     /* XXX : not implemented */
2601     spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
2602                  SPR_NOACCESS, SPR_NOACCESS,
2603                  &spr_read_generic, &spr_write_generic,
2604                  0x00000000);
2605     /* XXX : not implemented */
2606     spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
2607                  SPR_NOACCESS, SPR_NOACCESS,
2608                  &spr_read_generic, &spr_write_generic,
2609                  0x00000000);
2610     /* XXX : not implemented */
2611     spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
2612                  SPR_NOACCESS, SPR_NOACCESS,
2613                  &spr_read_generic, &spr_write_generic,
2614                  0x00000000);
2615     /* XXX : not implemented */
2616     spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
2617                  SPR_NOACCESS, SPR_NOACCESS,
2618                  &spr_read_generic, &spr_write_generic,
2619                  0x00000000);
2620     /* XXX : not implemented */
2621     spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
2622                  SPR_NOACCESS, SPR_NOACCESS,
2623                  &spr_read_generic, &spr_write_generic,
2624                  0x00000000);
2625     /* XXX : not implemented */
2626     spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
2627                  SPR_NOACCESS, SPR_NOACCESS,
2628                  &spr_read_generic, &spr_write_generic,
2629                  0x00000000);
2630     /* XXX : not implemented */
2631     spr_register(env, SPR_MPC_MD_AP, "MD_AP",
2632                  SPR_NOACCESS, SPR_NOACCESS,
2633                  &spr_read_generic, &spr_write_generic,
2634                  0x00000000);
2635     /* XXX : not implemented */
2636     spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2637                  SPR_NOACCESS, SPR_NOACCESS,
2638                  &spr_read_generic, &spr_write_generic,
2639                  0x00000000);
2640     /* XXX : not implemented */
2641     spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2642                  SPR_NOACCESS, SPR_NOACCESS,
2643                  &spr_read_generic, &spr_write_generic,
2644                  0x00000000);
2645     /* XXX : not implemented */
2646     spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2647                  SPR_NOACCESS, SPR_NOACCESS,
2648                  &spr_read_generic, &spr_write_generic,
2649                  0x00000000);
2650     /* XXX : not implemented */
2651     spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2652                  SPR_NOACCESS, SPR_NOACCESS,
2653                  &spr_read_generic, &spr_write_generic,
2654                  0x00000000);
2655     /* XXX : not implemented */
2656     spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2657                  SPR_NOACCESS, SPR_NOACCESS,
2658                  &spr_read_generic, &spr_write_generic,
2659                  0x00000000);
2660     /* XXX : not implemented */
2661     spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2662                  SPR_NOACCESS, SPR_NOACCESS,
2663                  &spr_read_generic, &spr_write_generic,
2664                  0x00000000);
2665     /* XXX : not implemented */
2666     spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2667                  SPR_NOACCESS, SPR_NOACCESS,
2668                  &spr_read_generic, &spr_write_generic,
2669                  0x00000000);
2670     /* XXX : not implemented */
2671     spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2672                  SPR_NOACCESS, SPR_NOACCESS,
2673                  &spr_read_generic, &spr_write_generic,
2674                  0x00000000);
2675 }
2676
2677 // XXX: TODO
2678 /*
2679  * AMR     => SPR 29 (Power 2.04)
2680  * CTRL    => SPR 136 (Power 2.04)
2681  * CTRL    => SPR 152 (Power 2.04)
2682  * SCOMC   => SPR 276 (64 bits ?)
2683  * SCOMD   => SPR 277 (64 bits ?)
2684  * TBU40   => SPR 286 (Power 2.04 hypv)
2685  * HSPRG0  => SPR 304 (Power 2.04 hypv)
2686  * HSPRG1  => SPR 305 (Power 2.04 hypv)
2687  * HDSISR  => SPR 306 (Power 2.04 hypv)
2688  * HDAR    => SPR 307 (Power 2.04 hypv)
2689  * PURR    => SPR 309 (Power 2.04 hypv)
2690  * HDEC    => SPR 310 (Power 2.04 hypv)
2691  * HIOR    => SPR 311 (hypv)
2692  * RMOR    => SPR 312 (970)
2693  * HRMOR   => SPR 313 (Power 2.04 hypv)
2694  * HSRR0   => SPR 314 (Power 2.04 hypv)
2695  * HSRR1   => SPR 315 (Power 2.04 hypv)
2696  * LPCR    => SPR 316 (970)
2697  * LPIDR   => SPR 317 (970)
2698  * EPR     => SPR 702 (Power 2.04 emb)
2699  * perf    => 768-783 (Power 2.04)
2700  * perf    => 784-799 (Power 2.04)
2701  * PPR     => SPR 896 (Power 2.04)
2702  * EPLC    => SPR 947 (Power 2.04 emb)
2703  * EPSC    => SPR 948 (Power 2.04 emb)
2704  * DABRX   => 1015    (Power 2.04 hypv)
2705  * FPECR   => SPR 1022 (?)
2706  * ... and more (thermal management, performance counters, ...)
2707  */
2708
2709 /*****************************************************************************/
2710 /* Exception vectors models                                                  */
2711 static void init_excp_4xx_real (CPUPPCState *env)
2712 {
2713 #if !defined(CONFIG_USER_ONLY)
2714     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2715     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2716     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2717     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2718     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2719     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2720     env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2721     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2722     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2723     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2724     env->hreset_excp_prefix = 0x00000000UL;
2725     env->ivor_mask = 0x0000FFF0UL;
2726     env->ivpr_mask = 0xFFFF0000UL;
2727     /* Hardware reset vector */
2728     env->hreset_vector = 0xFFFFFFFCUL;
2729 #endif
2730 }
2731
2732 static void init_excp_4xx_softmmu (CPUPPCState *env)
2733 {
2734 #if !defined(CONFIG_USER_ONLY)
2735     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2736     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2737     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2738     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2739     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2740     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2741     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2742     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2743     env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
2744     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
2745     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
2746     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001100;
2747     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001200;
2748     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
2749     env->hreset_excp_prefix = 0x00000000UL;
2750     env->ivor_mask = 0x0000FFF0UL;
2751     env->ivpr_mask = 0xFFFF0000UL;
2752     /* Hardware reset vector */
2753     env->hreset_vector = 0xFFFFFFFCUL;
2754 #endif
2755 }
2756
2757 static void init_excp_MPC5xx (CPUPPCState *env)
2758 {
2759 #if !defined(CONFIG_USER_ONLY)
2760     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2761     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2762     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2763     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2764     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2765     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000900;
2766     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2767     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2768     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2769     env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2770     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
2771     env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
2772     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
2773     env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
2774     env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
2775     env->hreset_excp_prefix = 0x00000000UL;
2776     env->ivor_mask = 0x0000FFF0UL;
2777     env->ivpr_mask = 0xFFFF0000UL;
2778     /* Hardware reset vector */
2779     env->hreset_vector = 0xFFFFFFFCUL;
2780 #endif
2781 }
2782
2783 static void init_excp_MPC8xx (CPUPPCState *env)
2784 {
2785 #if !defined(CONFIG_USER_ONLY)
2786     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2787     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2788     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2789     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2790     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2791     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2792     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2793     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000900;
2794     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2795     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2796     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2797     env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
2798     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
2799     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001100;
2800     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001200;
2801     env->excp_vectors[POWERPC_EXCP_ITLBE]    = 0x00001300;
2802     env->excp_vectors[POWERPC_EXCP_DTLBE]    = 0x00001400;
2803     env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
2804     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
2805     env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
2806     env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
2807     env->hreset_excp_prefix = 0x00000000UL;
2808     env->ivor_mask = 0x0000FFF0UL;
2809     env->ivpr_mask = 0xFFFF0000UL;
2810     /* Hardware reset vector */
2811     env->hreset_vector = 0xFFFFFFFCUL;
2812 #endif
2813 }
2814
2815 static void init_excp_G2 (CPUPPCState *env)
2816 {
2817 #if !defined(CONFIG_USER_ONLY)
2818     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2819     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2820     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2821     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2822     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2823     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2824     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2825     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2826     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2827     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2828     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2829     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2830     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2831     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2832     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2833     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2834     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2835     env->hreset_excp_prefix = 0x00000000UL;
2836     /* Hardware reset vector */
2837     env->hreset_vector = 0xFFFFFFFCUL;
2838 #endif
2839 }
2840
2841 static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
2842 {
2843 #if !defined(CONFIG_USER_ONLY)
2844     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000FFC;
2845     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2846     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
2847     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
2848     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
2849     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2850     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
2851     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
2852     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
2853     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
2854     env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
2855     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
2856     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
2857     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
2858     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
2859     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
2860     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
2861     env->excp_vectors[POWERPC_EXCP_SPEU]     = 0x00000000;
2862     env->excp_vectors[POWERPC_EXCP_EFPDI]    = 0x00000000;
2863     env->excp_vectors[POWERPC_EXCP_EFPRI]    = 0x00000000;
2864     env->hreset_excp_prefix = 0x00000000UL;
2865     env->ivor_mask = 0x0000FFF7UL;
2866     env->ivpr_mask = ivpr_mask;
2867     /* Hardware reset vector */
2868     env->hreset_vector = 0xFFFFFFFCUL;
2869 #endif
2870 }
2871
2872 static void init_excp_BookE (CPUPPCState *env)
2873 {
2874 #if !defined(CONFIG_USER_ONLY)
2875     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2876     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
2877     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
2878     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
2879     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2880     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
2881     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
2882     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
2883     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
2884     env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
2885     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
2886     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
2887     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
2888     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
2889     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
2890     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
2891     env->hreset_excp_prefix = 0x00000000UL;
2892     env->ivor_mask = 0x0000FFE0UL;
2893     env->ivpr_mask = 0xFFFF0000UL;
2894     /* Hardware reset vector */
2895     env->hreset_vector = 0xFFFFFFFCUL;
2896 #endif
2897 }
2898
2899 static void init_excp_601 (CPUPPCState *env)
2900 {
2901 #if !defined(CONFIG_USER_ONLY)
2902     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2903     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2904     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2905     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2906     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2907     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2908     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2909     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2910     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2911     env->excp_vectors[POWERPC_EXCP_IO]       = 0x00000A00;
2912     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2913     env->excp_vectors[POWERPC_EXCP_RUNM]     = 0x00002000;
2914     env->hreset_excp_prefix = 0xFFF00000UL;
2915     /* Hardware reset vector */
2916     env->hreset_vector = 0x00000100UL;
2917 #endif
2918 }
2919
2920 static void init_excp_602 (CPUPPCState *env)
2921 {
2922 #if !defined(CONFIG_USER_ONLY)
2923     /* XXX: exception prefix has a special behavior on 602 */
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_IFTLB]    = 0x00001000;
2936     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2937     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2938     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2939     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2940     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001500;
2941     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001600;
2942     env->hreset_excp_prefix = 0xFFF00000UL;
2943     /* Hardware reset vector */
2944     env->hreset_vector = 0xFFFFFFFCUL;
2945 #endif
2946 }
2947
2948 static void init_excp_603 (CPUPPCState *env)
2949 {
2950 #if !defined(CONFIG_USER_ONLY)
2951     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2952     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2953     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2954     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2955     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2956     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2957     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2958     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2959     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2960     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2961     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2962     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
2963     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
2964     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
2965     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2966     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2967     env->hreset_excp_prefix = 0x00000000UL;
2968     /* Hardware reset vector */
2969     env->hreset_vector = 0xFFFFFFFCUL;
2970 #endif
2971 }
2972
2973 static void init_excp_604 (CPUPPCState *env)
2974 {
2975 #if !defined(CONFIG_USER_ONLY)
2976     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
2977     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
2978     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
2979     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
2980     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2981     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
2982     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
2983     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
2984     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
2985     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
2986     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
2987     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
2988     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
2989     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
2990     env->hreset_excp_prefix = 0xFFF00000UL;
2991     /* Hardware reset vector */
2992     env->hreset_vector = 0x00000100UL;
2993 #endif
2994 }
2995
2996 #if defined(TARGET_PPC64)
2997 static void init_excp_620 (CPUPPCState *env)
2998 {
2999 #if !defined(CONFIG_USER_ONLY)
3000     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3001     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3002     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3003     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3004     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3005     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3006     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3007     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3008     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3009     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3010     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3011     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3012     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3013     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3014     env->hreset_excp_prefix = 0xFFF00000UL;
3015     /* Hardware reset vector */
3016     env->hreset_vector = 0x0000000000000100ULL;
3017 #endif
3018 }
3019 #endif /* defined(TARGET_PPC64) */
3020
3021 static void init_excp_7x0 (CPUPPCState *env)
3022 {
3023 #if !defined(CONFIG_USER_ONLY)
3024     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3025     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3026     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3027     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3028     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3029     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3030     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3031     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3032     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3033     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3034     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3035     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3036     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3037     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3038     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3039     env->hreset_excp_prefix = 0x00000000UL;
3040     /* Hardware reset vector */
3041     env->hreset_vector = 0xFFFFFFFCUL;
3042 #endif
3043 }
3044
3045 static void init_excp_750cl (CPUPPCState *env)
3046 {
3047 #if !defined(CONFIG_USER_ONLY)
3048     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3049     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3050     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3051     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3052     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3053     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3054     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3055     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3056     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3057     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3058     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3059     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3060     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3061     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3062     env->hreset_excp_prefix = 0x00000000UL;
3063     /* Hardware reset vector */
3064     env->hreset_vector = 0xFFFFFFFCUL;
3065 #endif
3066 }
3067
3068 static void init_excp_750cx (CPUPPCState *env)
3069 {
3070 #if !defined(CONFIG_USER_ONLY)
3071     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3072     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3073     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3074     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3075     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3076     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3077     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3078     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3079     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3080     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3081     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3082     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3083     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3084     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3085     env->hreset_excp_prefix = 0x00000000UL;
3086     /* Hardware reset vector */
3087     env->hreset_vector = 0xFFFFFFFCUL;
3088 #endif
3089 }
3090
3091 /* XXX: Check if this is correct */
3092 static void init_excp_7x5 (CPUPPCState *env)
3093 {
3094 #if !defined(CONFIG_USER_ONLY)
3095     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3096     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3097     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3098     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3099     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3100     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3101     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3102     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3103     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3104     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3105     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3106     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3107     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
3108     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
3109     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
3110     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3111     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3112     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3113     env->hreset_excp_prefix = 0x00000000UL;
3114     /* Hardware reset vector */
3115     env->hreset_vector = 0xFFFFFFFCUL;
3116 #endif
3117 }
3118
3119 static void init_excp_7400 (CPUPPCState *env)
3120 {
3121 #if !defined(CONFIG_USER_ONLY)
3122     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3123     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3124     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3125     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3126     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3127     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3128     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3129     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3130     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3131     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3132     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3133     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3134     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3135     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3136     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3137     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
3138     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
3139     env->hreset_excp_prefix = 0x00000000UL;
3140     /* Hardware reset vector */
3141     env->hreset_vector = 0xFFFFFFFCUL;
3142 #endif
3143 }
3144
3145 static void init_excp_7450 (CPUPPCState *env)
3146 {
3147 #if !defined(CONFIG_USER_ONLY)
3148     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3149     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3150     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3151     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3152     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3153     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3154     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3155     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3156     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3157     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3158     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3159     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3160     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3161     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
3162     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
3163     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
3164     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3165     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
3166     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
3167     env->hreset_excp_prefix = 0x00000000UL;
3168     /* Hardware reset vector */
3169     env->hreset_vector = 0xFFFFFFFCUL;
3170 #endif
3171 }
3172
3173 #if defined (TARGET_PPC64)
3174 static void init_excp_970 (CPUPPCState *env)
3175 {
3176 #if !defined(CONFIG_USER_ONLY)
3177     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3178     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3179     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3180     env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
3181     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3182     env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
3183     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3184     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3185     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3186     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3187     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3188     env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
3189     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3190     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3191     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3192     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3193     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3194     env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
3195     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
3196     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
3197     env->hreset_excp_prefix = 0x00000000FFF00000ULL;
3198     /* Hardware reset vector */
3199     env->hreset_vector = 0x0000000000000100ULL;
3200 #endif
3201 }
3202
3203 static void init_excp_POWER7 (CPUPPCState *env)
3204 {
3205 #if !defined(CONFIG_USER_ONLY)
3206     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
3207     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
3208     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
3209     env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
3210     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
3211     env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
3212     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3213     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
3214     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
3215     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
3216     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
3217     env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
3218     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
3219     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
3220     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
3221     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
3222     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
3223     env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
3224     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
3225     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
3226     env->hreset_excp_prefix = 0;
3227     /* Hardware reset vector */
3228     env->hreset_vector = 0x0000000000000100ULL;
3229 #endif
3230 }
3231 #endif
3232
3233 /*****************************************************************************/
3234 /* Power management enable checks                                            */
3235 static int check_pow_none (CPUPPCState *env)
3236 {
3237     return 0;
3238 }
3239
3240 static int check_pow_nocheck (CPUPPCState *env)
3241 {
3242     return 1;
3243 }
3244
3245 static int check_pow_hid0 (CPUPPCState *env)
3246 {
3247     if (env->spr[SPR_HID0] & 0x00E00000)
3248         return 1;
3249
3250     return 0;
3251 }
3252
3253 static int check_pow_hid0_74xx (CPUPPCState *env)
3254 {
3255     if (env->spr[SPR_HID0] & 0x00600000)
3256         return 1;
3257
3258     return 0;
3259 }
3260
3261 /*****************************************************************************/
3262 /* PowerPC implementations definitions                                       */
3263
3264 #define POWERPC_FAMILY(_name)                                               \
3265     static void                                                             \
3266     glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
3267                                                                             \
3268     static const TypeInfo                                                   \
3269     glue(glue(ppc_, _name), _cpu_family_type_info) = {                      \
3270         .name = stringify(_name) "-family-" TYPE_POWERPC_CPU,               \
3271         .parent = TYPE_POWERPC_CPU,                                         \
3272         .abstract = true,                                                   \
3273         .class_init = glue(glue(ppc_, _name), _cpu_family_class_init),      \
3274     };                                                                      \
3275                                                                             \
3276     static void glue(glue(ppc_, _name), _cpu_family_register_types)(void)   \
3277     {                                                                       \
3278         type_register_static(                                               \
3279             &glue(glue(ppc_, _name), _cpu_family_type_info));               \
3280     }                                                                       \
3281                                                                             \
3282     type_init(glue(glue(ppc_, _name), _cpu_family_register_types))          \
3283                                                                             \
3284     static void glue(glue(ppc_, _name), _cpu_family_class_init)
3285
3286 static void init_proc_401 (CPUPPCState *env)
3287 {
3288     gen_spr_40x(env);
3289     gen_spr_401_403(env);
3290     gen_spr_401(env);
3291     init_excp_4xx_real(env);
3292     env->dcache_line_size = 32;
3293     env->icache_line_size = 32;
3294     /* Allocate hardware IRQ controller */
3295     ppc40x_irq_init(env);
3296
3297     SET_FIT_PERIOD(12, 16, 20, 24);
3298     SET_WDT_PERIOD(16, 20, 24, 28);
3299 }
3300
3301 POWERPC_FAMILY(401)(ObjectClass *oc, void *data)
3302 {
3303     DeviceClass *dc = DEVICE_CLASS(oc);
3304     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3305
3306     dc->desc = "PowerPC 401";
3307     pcc->init_proc = init_proc_401;
3308     pcc->check_pow = check_pow_nocheck;
3309     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3310                        PPC_WRTEE | PPC_DCR |
3311                        PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3312                        PPC_CACHE_DCBZ |
3313                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
3314                        PPC_4xx_COMMON | PPC_40x_EXCP;
3315     pcc->insns_flags2 = PPC_NONE;
3316     pcc->msr_mask = 0x00000000000FD201ULL;
3317     pcc->mmu_model = POWERPC_MMU_REAL;
3318     pcc->excp_model = POWERPC_EXCP_40x;
3319     pcc->bus_model = PPC_FLAGS_INPUT_401;
3320     pcc->bfd_mach = bfd_mach_ppc_403;
3321     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3322                  POWERPC_FLAG_BUS_CLK;
3323 }
3324
3325 static void init_proc_401x2 (CPUPPCState *env)
3326 {
3327     gen_spr_40x(env);
3328     gen_spr_401_403(env);
3329     gen_spr_401x2(env);
3330     gen_spr_compress(env);
3331     /* Memory management */
3332 #if !defined(CONFIG_USER_ONLY)
3333     env->nb_tlb = 64;
3334     env->nb_ways = 1;
3335     env->id_tlbs = 0;
3336     env->tlb_type = TLB_EMB;
3337 #endif
3338     init_excp_4xx_softmmu(env);
3339     env->dcache_line_size = 32;
3340     env->icache_line_size = 32;
3341     /* Allocate hardware IRQ controller */
3342     ppc40x_irq_init(env);
3343
3344     SET_FIT_PERIOD(12, 16, 20, 24);
3345     SET_WDT_PERIOD(16, 20, 24, 28);
3346 }
3347
3348 POWERPC_FAMILY(401x2)(ObjectClass *oc, void *data)
3349 {
3350     DeviceClass *dc = DEVICE_CLASS(oc);
3351     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3352
3353     dc->desc = "PowerPC 401x2";
3354     pcc->init_proc = init_proc_401x2;
3355     pcc->check_pow = check_pow_nocheck;
3356     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3357                        PPC_DCR | PPC_WRTEE |
3358                        PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3359                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3360                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
3361                        PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3362                        PPC_4xx_COMMON | PPC_40x_EXCP;
3363     pcc->insns_flags2 = PPC_NONE;
3364     pcc->msr_mask = 0x00000000001FD231ULL;
3365     pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3366     pcc->excp_model = POWERPC_EXCP_40x;
3367     pcc->bus_model = PPC_FLAGS_INPUT_401;
3368     pcc->bfd_mach = bfd_mach_ppc_403;
3369     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3370                  POWERPC_FLAG_BUS_CLK;
3371 }
3372
3373 static void init_proc_401x3 (CPUPPCState *env)
3374 {
3375     gen_spr_40x(env);
3376     gen_spr_401_403(env);
3377     gen_spr_401(env);
3378     gen_spr_401x2(env);
3379     gen_spr_compress(env);
3380     init_excp_4xx_softmmu(env);
3381     env->dcache_line_size = 32;
3382     env->icache_line_size = 32;
3383     /* Allocate hardware IRQ controller */
3384     ppc40x_irq_init(env);
3385
3386     SET_FIT_PERIOD(12, 16, 20, 24);
3387     SET_WDT_PERIOD(16, 20, 24, 28);
3388 }
3389
3390 POWERPC_FAMILY(401x3)(ObjectClass *oc, void *data)
3391 {
3392     DeviceClass *dc = DEVICE_CLASS(oc);
3393     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3394
3395     dc->desc = "PowerPC 401x3";
3396     pcc->init_proc = init_proc_401x3;
3397     pcc->check_pow = check_pow_nocheck;
3398     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3399                        PPC_DCR | PPC_WRTEE |
3400                        PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3401                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3402                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
3403                        PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3404                        PPC_4xx_COMMON | PPC_40x_EXCP;
3405     pcc->insns_flags2 = PPC_NONE;
3406     pcc->msr_mask = 0x00000000001FD631ULL;
3407     pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3408     pcc->excp_model = POWERPC_EXCP_40x;
3409     pcc->bus_model = PPC_FLAGS_INPUT_401;
3410     pcc->bfd_mach = bfd_mach_ppc_403;
3411     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3412                  POWERPC_FLAG_BUS_CLK;
3413 }
3414
3415 static void init_proc_IOP480 (CPUPPCState *env)
3416 {
3417     gen_spr_40x(env);
3418     gen_spr_401_403(env);
3419     gen_spr_401x2(env);
3420     gen_spr_compress(env);
3421     /* Memory management */
3422 #if !defined(CONFIG_USER_ONLY)
3423     env->nb_tlb = 64;
3424     env->nb_ways = 1;
3425     env->id_tlbs = 0;
3426     env->tlb_type = TLB_EMB;
3427 #endif
3428     init_excp_4xx_softmmu(env);
3429     env->dcache_line_size = 32;
3430     env->icache_line_size = 32;
3431     /* Allocate hardware IRQ controller */
3432     ppc40x_irq_init(env);
3433
3434     SET_FIT_PERIOD(8, 12, 16, 20);
3435     SET_WDT_PERIOD(16, 20, 24, 28);
3436 }
3437
3438 POWERPC_FAMILY(IOP480)(ObjectClass *oc, void *data)
3439 {
3440     DeviceClass *dc = DEVICE_CLASS(oc);
3441     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3442
3443     dc->desc = "IOP480";
3444     pcc->init_proc = init_proc_IOP480;
3445     pcc->check_pow = check_pow_nocheck;
3446     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3447                        PPC_DCR | PPC_WRTEE |
3448                        PPC_CACHE | PPC_CACHE_ICBI |  PPC_40x_ICBT |
3449                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3450                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
3451                        PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3452                        PPC_4xx_COMMON | PPC_40x_EXCP;
3453     pcc->insns_flags2 = PPC_NONE;
3454     pcc->msr_mask = 0x00000000001FD231ULL;
3455     pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3456     pcc->excp_model = POWERPC_EXCP_40x;
3457     pcc->bus_model = PPC_FLAGS_INPUT_401;
3458     pcc->bfd_mach = bfd_mach_ppc_403;
3459     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3460                  POWERPC_FLAG_BUS_CLK;
3461 }
3462
3463 static void init_proc_403 (CPUPPCState *env)
3464 {
3465     gen_spr_40x(env);
3466     gen_spr_401_403(env);
3467     gen_spr_403(env);
3468     gen_spr_403_real(env);
3469     init_excp_4xx_real(env);
3470     env->dcache_line_size = 32;
3471     env->icache_line_size = 32;
3472     /* Allocate hardware IRQ controller */
3473     ppc40x_irq_init(env);
3474
3475     SET_FIT_PERIOD(8, 12, 16, 20);
3476     SET_WDT_PERIOD(16, 20, 24, 28);
3477 }
3478
3479 POWERPC_FAMILY(403)(ObjectClass *oc, void *data)
3480 {
3481     DeviceClass *dc = DEVICE_CLASS(oc);
3482     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3483
3484     dc->desc = "PowerPC 403";
3485     pcc->init_proc = init_proc_403;
3486     pcc->check_pow = check_pow_nocheck;
3487     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3488                        PPC_DCR | PPC_WRTEE |
3489                        PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3490                        PPC_CACHE_DCBZ |
3491                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
3492                        PPC_4xx_COMMON | PPC_40x_EXCP;
3493     pcc->insns_flags2 = PPC_NONE;
3494     pcc->msr_mask = 0x000000000007D00DULL;
3495     pcc->mmu_model = POWERPC_MMU_REAL;
3496     pcc->excp_model = POWERPC_EXCP_40x;
3497     pcc->bus_model = PPC_FLAGS_INPUT_401;
3498     pcc->bfd_mach = bfd_mach_ppc_403;
3499     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3500                  POWERPC_FLAG_BUS_CLK;
3501 }
3502
3503 static void init_proc_403GCX (CPUPPCState *env)
3504 {
3505     gen_spr_40x(env);
3506     gen_spr_401_403(env);
3507     gen_spr_403(env);
3508     gen_spr_403_real(env);
3509     gen_spr_403_mmu(env);
3510     /* Bus access control */
3511     /* not emulated, as QEMU never does speculative access */
3512     spr_register(env, SPR_40x_SGR, "SGR",
3513                  SPR_NOACCESS, SPR_NOACCESS,
3514                  &spr_read_generic, &spr_write_generic,
3515                  0xFFFFFFFF);
3516     /* not emulated, as QEMU do not emulate caches */
3517     spr_register(env, SPR_40x_DCWR, "DCWR",
3518                  SPR_NOACCESS, SPR_NOACCESS,
3519                  &spr_read_generic, &spr_write_generic,
3520                  0x00000000);
3521     /* Memory management */
3522 #if !defined(CONFIG_USER_ONLY)
3523     env->nb_tlb = 64;
3524     env->nb_ways = 1;
3525     env->id_tlbs = 0;
3526     env->tlb_type = TLB_EMB;
3527 #endif
3528     init_excp_4xx_softmmu(env);
3529     env->dcache_line_size = 32;
3530     env->icache_line_size = 32;
3531     /* Allocate hardware IRQ controller */
3532     ppc40x_irq_init(env);
3533
3534     SET_FIT_PERIOD(8, 12, 16, 20);
3535     SET_WDT_PERIOD(16, 20, 24, 28);
3536 }
3537
3538 POWERPC_FAMILY(403GCX)(ObjectClass *oc, void *data)
3539 {
3540     DeviceClass *dc = DEVICE_CLASS(oc);
3541     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3542
3543     dc->desc = "PowerPC 403 GCX";
3544     pcc->init_proc = init_proc_403GCX;
3545     pcc->check_pow = check_pow_nocheck;
3546     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3547                        PPC_DCR | PPC_WRTEE |
3548                        PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3549                        PPC_CACHE_DCBZ |
3550                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
3551                        PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3552                        PPC_4xx_COMMON | PPC_40x_EXCP;
3553     pcc->insns_flags2 = PPC_NONE;
3554     pcc->msr_mask = 0x000000000007D00DULL;
3555     pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3556     pcc->excp_model = POWERPC_EXCP_40x;
3557     pcc->bus_model = PPC_FLAGS_INPUT_401;
3558     pcc->bfd_mach = bfd_mach_ppc_403;
3559     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3560                  POWERPC_FLAG_BUS_CLK;
3561 }
3562
3563 static void init_proc_405 (CPUPPCState *env)
3564 {
3565     /* Time base */
3566     gen_tbl(env);
3567     gen_spr_40x(env);
3568     gen_spr_405(env);
3569     /* Bus access control */
3570     /* not emulated, as QEMU never does speculative access */
3571     spr_register(env, SPR_40x_SGR, "SGR",
3572                  SPR_NOACCESS, SPR_NOACCESS,
3573                  &spr_read_generic, &spr_write_generic,
3574                  0xFFFFFFFF);
3575     /* not emulated, as QEMU do not emulate caches */
3576     spr_register(env, SPR_40x_DCWR, "DCWR",
3577                  SPR_NOACCESS, SPR_NOACCESS,
3578                  &spr_read_generic, &spr_write_generic,
3579                  0x00000000);
3580     /* Memory management */
3581 #if !defined(CONFIG_USER_ONLY)
3582     env->nb_tlb = 64;
3583     env->nb_ways = 1;
3584     env->id_tlbs = 0;
3585     env->tlb_type = TLB_EMB;
3586 #endif
3587     init_excp_4xx_softmmu(env);
3588     env->dcache_line_size = 32;
3589     env->icache_line_size = 32;
3590     /* Allocate hardware IRQ controller */
3591     ppc40x_irq_init(env);
3592
3593     SET_FIT_PERIOD(8, 12, 16, 20);
3594     SET_WDT_PERIOD(16, 20, 24, 28);
3595 }
3596
3597 POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
3598 {
3599     DeviceClass *dc = DEVICE_CLASS(oc);
3600     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3601
3602     dc->desc = "PowerPC 405";
3603     pcc->init_proc = init_proc_405;
3604     pcc->check_pow = check_pow_nocheck;
3605     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3606                        PPC_DCR | PPC_WRTEE |
3607                        PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3608                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3609                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
3610                        PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3611                        PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
3612     pcc->insns_flags2 = PPC_NONE;
3613     pcc->msr_mask = 0x000000000006E630ULL;
3614     pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
3615     pcc->excp_model = POWERPC_EXCP_40x;
3616     pcc->bus_model = PPC_FLAGS_INPUT_405;
3617     pcc->bfd_mach = bfd_mach_ppc_403;
3618     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3619                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3620 }
3621
3622 static void init_proc_440EP (CPUPPCState *env)
3623 {
3624     /* Time base */
3625     gen_tbl(env);
3626     gen_spr_BookE(env, 0x000000000000FFFFULL);
3627     gen_spr_440(env);
3628     gen_spr_usprgh(env);
3629     /* Processor identification */
3630     spr_register(env, SPR_BOOKE_PIR, "PIR",
3631                  SPR_NOACCESS, SPR_NOACCESS,
3632                  &spr_read_generic, &spr_write_pir,
3633                  0x00000000);
3634     /* XXX : not implemented */
3635     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3636                  SPR_NOACCESS, SPR_NOACCESS,
3637                  &spr_read_generic, &spr_write_generic,
3638                  0x00000000);
3639     /* XXX : not implemented */
3640     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3641                  SPR_NOACCESS, SPR_NOACCESS,
3642                  &spr_read_generic, &spr_write_generic,
3643                  0x00000000);
3644     /* XXX : not implemented */
3645     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3646                  SPR_NOACCESS, SPR_NOACCESS,
3647                  &spr_read_generic, &spr_write_generic,
3648                  0x00000000);
3649     /* XXX : not implemented */
3650     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3651                  SPR_NOACCESS, SPR_NOACCESS,
3652                  &spr_read_generic, &spr_write_generic,
3653                  0x00000000);
3654     /* XXX : not implemented */
3655     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3656                  SPR_NOACCESS, SPR_NOACCESS,
3657                  &spr_read_generic, &spr_write_generic,
3658                  0x00000000);
3659     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3660                  SPR_NOACCESS, SPR_NOACCESS,
3661                  &spr_read_generic, &spr_write_generic,
3662                  0x00000000);
3663     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3664                  SPR_NOACCESS, SPR_NOACCESS,
3665                  &spr_read_generic, &spr_write_generic,
3666                  0x00000000);
3667     /* XXX : not implemented */
3668     spr_register(env, SPR_440_CCR1, "CCR1",
3669                  SPR_NOACCESS, SPR_NOACCESS,
3670                  &spr_read_generic, &spr_write_generic,
3671                  0x00000000);
3672     /* Memory management */
3673 #if !defined(CONFIG_USER_ONLY)
3674     env->nb_tlb = 64;
3675     env->nb_ways = 1;
3676     env->id_tlbs = 0;
3677     env->tlb_type = TLB_EMB;
3678 #endif
3679     init_excp_BookE(env);
3680     env->dcache_line_size = 32;
3681     env->icache_line_size = 32;
3682     ppc40x_irq_init(env);
3683
3684     SET_FIT_PERIOD(12, 16, 20, 24);
3685     SET_WDT_PERIOD(20, 24, 28, 32);
3686 }
3687
3688 POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
3689 {
3690     DeviceClass *dc = DEVICE_CLASS(oc);
3691     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3692
3693     dc->desc = "PowerPC 440 EP";
3694     pcc->init_proc = init_proc_440EP;
3695     pcc->check_pow = check_pow_nocheck;
3696     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3697                        PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3698                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3699                        PPC_FLOAT_STFIWX |
3700                        PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3701                        PPC_CACHE | PPC_CACHE_ICBI |
3702                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3703                        PPC_MEM_TLBSYNC | PPC_MFTB |
3704                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3705                        PPC_440_SPEC;
3706     pcc->insns_flags2 = PPC_NONE;
3707     pcc->msr_mask = 0x000000000006FF30ULL;
3708     pcc->mmu_model = POWERPC_MMU_BOOKE;
3709     pcc->excp_model = POWERPC_EXCP_BOOKE;
3710     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3711     pcc->bfd_mach = bfd_mach_ppc_403;
3712     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3713                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3714 }
3715
3716 static void init_proc_440GP (CPUPPCState *env)
3717 {
3718     /* Time base */
3719     gen_tbl(env);
3720     gen_spr_BookE(env, 0x000000000000FFFFULL);
3721     gen_spr_440(env);
3722     gen_spr_usprgh(env);
3723     /* Processor identification */
3724     spr_register(env, SPR_BOOKE_PIR, "PIR",
3725                  SPR_NOACCESS, SPR_NOACCESS,
3726                  &spr_read_generic, &spr_write_pir,
3727                  0x00000000);
3728     /* XXX : not implemented */
3729     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3730                  SPR_NOACCESS, SPR_NOACCESS,
3731                  &spr_read_generic, &spr_write_generic,
3732                  0x00000000);
3733     /* XXX : not implemented */
3734     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3735                  SPR_NOACCESS, SPR_NOACCESS,
3736                  &spr_read_generic, &spr_write_generic,
3737                  0x00000000);
3738     /* XXX : not implemented */
3739     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3740                  SPR_NOACCESS, SPR_NOACCESS,
3741                  &spr_read_generic, &spr_write_generic,
3742                  0x00000000);
3743     /* XXX : not implemented */
3744     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3745                  SPR_NOACCESS, SPR_NOACCESS,
3746                  &spr_read_generic, &spr_write_generic,
3747                  0x00000000);
3748     /* Memory management */
3749 #if !defined(CONFIG_USER_ONLY)
3750     env->nb_tlb = 64;
3751     env->nb_ways = 1;
3752     env->id_tlbs = 0;
3753     env->tlb_type = TLB_EMB;
3754 #endif
3755     init_excp_BookE(env);
3756     env->dcache_line_size = 32;
3757     env->icache_line_size = 32;
3758     /* XXX: TODO: allocate internal IRQ controller */
3759
3760     SET_FIT_PERIOD(12, 16, 20, 24);
3761     SET_WDT_PERIOD(20, 24, 28, 32);
3762 }
3763
3764 POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
3765 {
3766     DeviceClass *dc = DEVICE_CLASS(oc);
3767     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3768
3769     dc->desc = "PowerPC 440 GP";
3770     pcc->init_proc = init_proc_440GP;
3771     pcc->check_pow = check_pow_nocheck;
3772     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3773                        PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
3774                        PPC_CACHE | PPC_CACHE_ICBI |
3775                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3776                        PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
3777                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3778                        PPC_440_SPEC;
3779     pcc->insns_flags2 = PPC_NONE;
3780     pcc->msr_mask = 0x000000000006FF30ULL;
3781     pcc->mmu_model = POWERPC_MMU_BOOKE;
3782     pcc->excp_model = POWERPC_EXCP_BOOKE;
3783     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3784     pcc->bfd_mach = bfd_mach_ppc_403;
3785     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3786                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3787 }
3788
3789 static void init_proc_440x4 (CPUPPCState *env)
3790 {
3791     /* Time base */
3792     gen_tbl(env);
3793     gen_spr_BookE(env, 0x000000000000FFFFULL);
3794     gen_spr_440(env);
3795     gen_spr_usprgh(env);
3796     /* Processor identification */
3797     spr_register(env, SPR_BOOKE_PIR, "PIR",
3798                  SPR_NOACCESS, SPR_NOACCESS,
3799                  &spr_read_generic, &spr_write_pir,
3800                  0x00000000);
3801     /* XXX : not implemented */
3802     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3803                  SPR_NOACCESS, SPR_NOACCESS,
3804                  &spr_read_generic, &spr_write_generic,
3805                  0x00000000);
3806     /* XXX : not implemented */
3807     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3808                  SPR_NOACCESS, SPR_NOACCESS,
3809                  &spr_read_generic, &spr_write_generic,
3810                  0x00000000);
3811     /* XXX : not implemented */
3812     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3813                  SPR_NOACCESS, SPR_NOACCESS,
3814                  &spr_read_generic, &spr_write_generic,
3815                  0x00000000);
3816     /* XXX : not implemented */
3817     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3818                  SPR_NOACCESS, SPR_NOACCESS,
3819                  &spr_read_generic, &spr_write_generic,
3820                  0x00000000);
3821     /* Memory management */
3822 #if !defined(CONFIG_USER_ONLY)
3823     env->nb_tlb = 64;
3824     env->nb_ways = 1;
3825     env->id_tlbs = 0;
3826     env->tlb_type = TLB_EMB;
3827 #endif
3828     init_excp_BookE(env);
3829     env->dcache_line_size = 32;
3830     env->icache_line_size = 32;
3831     /* XXX: TODO: allocate internal IRQ controller */
3832
3833     SET_FIT_PERIOD(12, 16, 20, 24);
3834     SET_WDT_PERIOD(20, 24, 28, 32);
3835 }
3836
3837 POWERPC_FAMILY(440x4)(ObjectClass *oc, void *data)
3838 {
3839     DeviceClass *dc = DEVICE_CLASS(oc);
3840     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3841
3842     dc->desc = "PowerPC 440x4";
3843     pcc->init_proc = init_proc_440x4;
3844     pcc->check_pow = check_pow_nocheck;
3845     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3846                        PPC_DCR | PPC_WRTEE |
3847                        PPC_CACHE | PPC_CACHE_ICBI |
3848                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3849                        PPC_MEM_TLBSYNC | PPC_MFTB |
3850                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3851                        PPC_440_SPEC;
3852     pcc->insns_flags2 = PPC_NONE;
3853     pcc->msr_mask = 0x000000000006FF30ULL;
3854     pcc->mmu_model = POWERPC_MMU_BOOKE;
3855     pcc->excp_model = POWERPC_EXCP_BOOKE;
3856     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3857     pcc->bfd_mach = bfd_mach_ppc_403;
3858     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3859                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3860 }
3861
3862 static void init_proc_440x5 (CPUPPCState *env)
3863 {
3864     /* Time base */
3865     gen_tbl(env);
3866     gen_spr_BookE(env, 0x000000000000FFFFULL);
3867     gen_spr_440(env);
3868     gen_spr_usprgh(env);
3869     /* Processor identification */
3870     spr_register(env, SPR_BOOKE_PIR, "PIR",
3871                  SPR_NOACCESS, SPR_NOACCESS,
3872                  &spr_read_generic, &spr_write_pir,
3873                  0x00000000);
3874     /* XXX : not implemented */
3875     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3876                  SPR_NOACCESS, SPR_NOACCESS,
3877                  &spr_read_generic, &spr_write_generic,
3878                  0x00000000);
3879     /* XXX : not implemented */
3880     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3881                  SPR_NOACCESS, SPR_NOACCESS,
3882                  &spr_read_generic, &spr_write_generic,
3883                  0x00000000);
3884     /* XXX : not implemented */
3885     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3886                  SPR_NOACCESS, SPR_NOACCESS,
3887                  &spr_read_generic, &spr_write_generic,
3888                  0x00000000);
3889     /* XXX : not implemented */
3890     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3891                  SPR_NOACCESS, SPR_NOACCESS,
3892                  &spr_read_generic, &spr_write_generic,
3893                  0x00000000);
3894     /* XXX : not implemented */
3895     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3896                  SPR_NOACCESS, SPR_NOACCESS,
3897                  &spr_read_generic, &spr_write_generic,
3898                  0x00000000);
3899     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3900                  SPR_NOACCESS, SPR_NOACCESS,
3901                  &spr_read_generic, &spr_write_generic,
3902                  0x00000000);
3903     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3904                  SPR_NOACCESS, SPR_NOACCESS,
3905                  &spr_read_generic, &spr_write_generic,
3906                  0x00000000);
3907     /* XXX : not implemented */
3908     spr_register(env, SPR_440_CCR1, "CCR1",
3909                  SPR_NOACCESS, SPR_NOACCESS,
3910                  &spr_read_generic, &spr_write_generic,
3911                  0x00000000);
3912     /* Memory management */
3913 #if !defined(CONFIG_USER_ONLY)
3914     env->nb_tlb = 64;
3915     env->nb_ways = 1;
3916     env->id_tlbs = 0;
3917     env->tlb_type = TLB_EMB;
3918 #endif
3919     init_excp_BookE(env);
3920     env->dcache_line_size = 32;
3921     env->icache_line_size = 32;
3922     ppc40x_irq_init(env);
3923
3924     SET_FIT_PERIOD(12, 16, 20, 24);
3925     SET_WDT_PERIOD(20, 24, 28, 32);
3926 }
3927
3928 POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
3929 {
3930     DeviceClass *dc = DEVICE_CLASS(oc);
3931     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3932
3933     dc->desc = "PowerPC 440x5";
3934     pcc->init_proc = init_proc_440x5;
3935     pcc->check_pow = check_pow_nocheck;
3936     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3937                        PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3938                        PPC_CACHE | PPC_CACHE_ICBI |
3939                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3940                        PPC_MEM_TLBSYNC | PPC_MFTB |
3941                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3942                        PPC_440_SPEC;
3943     pcc->insns_flags2 = PPC_NONE;
3944     pcc->msr_mask = 0x000000000006FF30ULL;
3945     pcc->mmu_model = POWERPC_MMU_BOOKE;
3946     pcc->excp_model = POWERPC_EXCP_BOOKE;
3947     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3948     pcc->bfd_mach = bfd_mach_ppc_403;
3949     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3950                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3951 }
3952
3953 static void init_proc_460 (CPUPPCState *env)
3954 {
3955     /* Time base */
3956     gen_tbl(env);
3957     gen_spr_BookE(env, 0x000000000000FFFFULL);
3958     gen_spr_440(env);
3959     gen_spr_usprgh(env);
3960     /* Processor identification */
3961     spr_register(env, SPR_BOOKE_PIR, "PIR",
3962                  SPR_NOACCESS, SPR_NOACCESS,
3963                  &spr_read_generic, &spr_write_pir,
3964                  0x00000000);
3965     /* XXX : not implemented */
3966     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3967                  SPR_NOACCESS, SPR_NOACCESS,
3968                  &spr_read_generic, &spr_write_generic,
3969                  0x00000000);
3970     /* XXX : not implemented */
3971     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3972                  SPR_NOACCESS, SPR_NOACCESS,
3973                  &spr_read_generic, &spr_write_generic,
3974                  0x00000000);
3975     /* XXX : not implemented */
3976     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3977                  SPR_NOACCESS, SPR_NOACCESS,
3978                  &spr_read_generic, &spr_write_generic,
3979                  0x00000000);
3980     /* XXX : not implemented */
3981     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3982                  SPR_NOACCESS, SPR_NOACCESS,
3983                  &spr_read_generic, &spr_write_generic,
3984                  0x00000000);
3985     /* XXX : not implemented */
3986     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3987                  SPR_NOACCESS, SPR_NOACCESS,
3988                  &spr_read_generic, &spr_write_generic,
3989                  0x00000000);
3990     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3991                  SPR_NOACCESS, SPR_NOACCESS,
3992                  &spr_read_generic, &spr_write_generic,
3993                  0x00000000);
3994     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3995                  SPR_NOACCESS, SPR_NOACCESS,
3996                  &spr_read_generic, &spr_write_generic,
3997                  0x00000000);
3998     /* XXX : not implemented */
3999     spr_register(env, SPR_440_CCR1, "CCR1",
4000                  SPR_NOACCESS, SPR_NOACCESS,
4001                  &spr_read_generic, &spr_write_generic,
4002                  0x00000000);
4003     /* XXX : not implemented */
4004     spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
4005                  &spr_read_generic, &spr_write_generic,
4006                  &spr_read_generic, &spr_write_generic,
4007                  0x00000000);
4008     /* Memory management */
4009 #if !defined(CONFIG_USER_ONLY)
4010     env->nb_tlb = 64;
4011     env->nb_ways = 1;
4012     env->id_tlbs = 0;
4013     env->tlb_type = TLB_EMB;
4014 #endif
4015     init_excp_BookE(env);
4016     env->dcache_line_size = 32;
4017     env->icache_line_size = 32;
4018     /* XXX: TODO: allocate internal IRQ controller */
4019
4020     SET_FIT_PERIOD(12, 16, 20, 24);
4021     SET_WDT_PERIOD(20, 24, 28, 32);
4022 }
4023
4024 POWERPC_FAMILY(460)(ObjectClass *oc, void *data)
4025 {
4026     DeviceClass *dc = DEVICE_CLASS(oc);
4027     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4028
4029     dc->desc = "PowerPC 460 (guessed)";
4030     pcc->init_proc = init_proc_460;
4031     pcc->check_pow = check_pow_nocheck;
4032     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4033                        PPC_DCR | PPC_DCRX  | PPC_DCRUX |
4034                        PPC_WRTEE | PPC_MFAPIDI | PPC_MFTB |
4035                        PPC_CACHE | PPC_CACHE_ICBI |
4036                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4037                        PPC_MEM_TLBSYNC | PPC_TLBIVA |
4038                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4039                        PPC_440_SPEC;
4040     pcc->insns_flags2 = PPC_NONE;
4041     pcc->msr_mask = 0x000000000006FF30ULL;
4042     pcc->mmu_model = POWERPC_MMU_BOOKE;
4043     pcc->excp_model = POWERPC_EXCP_BOOKE;
4044     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4045     pcc->bfd_mach = bfd_mach_ppc_403;
4046     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4047                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4048 }
4049
4050 static void init_proc_460F (CPUPPCState *env)
4051 {
4052     /* Time base */
4053     gen_tbl(env);
4054     gen_spr_BookE(env, 0x000000000000FFFFULL);
4055     gen_spr_440(env);
4056     gen_spr_usprgh(env);
4057     /* Processor identification */
4058     spr_register(env, SPR_BOOKE_PIR, "PIR",
4059                  SPR_NOACCESS, SPR_NOACCESS,
4060                  &spr_read_generic, &spr_write_pir,
4061                  0x00000000);
4062     /* XXX : not implemented */
4063     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4064                  SPR_NOACCESS, SPR_NOACCESS,
4065                  &spr_read_generic, &spr_write_generic,
4066                  0x00000000);
4067     /* XXX : not implemented */
4068     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4069                  SPR_NOACCESS, SPR_NOACCESS,
4070                  &spr_read_generic, &spr_write_generic,
4071                  0x00000000);
4072     /* XXX : not implemented */
4073     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
4074                  SPR_NOACCESS, SPR_NOACCESS,
4075                  &spr_read_generic, &spr_write_generic,
4076                  0x00000000);
4077     /* XXX : not implemented */
4078     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
4079                  SPR_NOACCESS, SPR_NOACCESS,
4080                  &spr_read_generic, &spr_write_generic,
4081                  0x00000000);
4082     /* XXX : not implemented */
4083     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4084                  SPR_NOACCESS, SPR_NOACCESS,
4085                  &spr_read_generic, &spr_write_generic,
4086                  0x00000000);
4087     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4088                  SPR_NOACCESS, SPR_NOACCESS,
4089                  &spr_read_generic, &spr_write_generic,
4090                  0x00000000);
4091     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4092                  SPR_NOACCESS, SPR_NOACCESS,
4093                  &spr_read_generic, &spr_write_generic,
4094                  0x00000000);
4095     /* XXX : not implemented */
4096     spr_register(env, SPR_440_CCR1, "CCR1",
4097                  SPR_NOACCESS, SPR_NOACCESS,
4098                  &spr_read_generic, &spr_write_generic,
4099                  0x00000000);
4100     /* XXX : not implemented */
4101     spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
4102                  &spr_read_generic, &spr_write_generic,
4103                  &spr_read_generic, &spr_write_generic,
4104                  0x00000000);
4105     /* Memory management */
4106 #if !defined(CONFIG_USER_ONLY)
4107     env->nb_tlb = 64;
4108     env->nb_ways = 1;
4109     env->id_tlbs = 0;
4110     env->tlb_type = TLB_EMB;
4111 #endif
4112     init_excp_BookE(env);
4113     env->dcache_line_size = 32;
4114     env->icache_line_size = 32;
4115     /* XXX: TODO: allocate internal IRQ controller */
4116
4117     SET_FIT_PERIOD(12, 16, 20, 24);
4118     SET_WDT_PERIOD(20, 24, 28, 32);
4119 }
4120
4121 POWERPC_FAMILY(460F)(ObjectClass *oc, void *data)
4122 {
4123     DeviceClass *dc = DEVICE_CLASS(oc);
4124     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4125
4126     dc->desc = "PowerPC 460F (guessed)";
4127     pcc->init_proc = init_proc_460F;
4128     pcc->check_pow = check_pow_nocheck;
4129     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4130                        PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
4131                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
4132                        PPC_FLOAT_STFIWX | PPC_MFTB |
4133                        PPC_DCR | PPC_DCRX | PPC_DCRUX |
4134                        PPC_WRTEE | PPC_MFAPIDI |
4135                        PPC_CACHE | PPC_CACHE_ICBI |
4136                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4137                        PPC_MEM_TLBSYNC | PPC_TLBIVA |
4138                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4139                        PPC_440_SPEC;
4140     pcc->insns_flags2 = PPC_NONE;
4141     pcc->msr_mask = 0x000000000006FF30ULL;
4142     pcc->mmu_model = POWERPC_MMU_BOOKE;
4143     pcc->excp_model = POWERPC_EXCP_BOOKE;
4144     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4145     pcc->bfd_mach = bfd_mach_ppc_403;
4146     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4147                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4148 }
4149
4150 static void init_proc_MPC5xx (CPUPPCState *env)
4151 {
4152     /* Time base */
4153     gen_tbl(env);
4154     gen_spr_5xx_8xx(env);
4155     gen_spr_5xx(env);
4156     init_excp_MPC5xx(env);
4157     env->dcache_line_size = 32;
4158     env->icache_line_size = 32;
4159     /* XXX: TODO: allocate internal IRQ controller */
4160 }
4161
4162 POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
4163 {
4164     DeviceClass *dc = DEVICE_CLASS(oc);
4165     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4166
4167     dc->desc = "Freescale 5xx cores (aka RCPU)";
4168     pcc->init_proc = init_proc_MPC5xx;
4169     pcc->check_pow = check_pow_none;
4170     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4171                        PPC_MEM_EIEIO | PPC_MEM_SYNC |
4172                        PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
4173                        PPC_MFTB;
4174     pcc->insns_flags2 = PPC_NONE;
4175     pcc->msr_mask = 0x000000000001FF43ULL;
4176     pcc->mmu_model = POWERPC_MMU_REAL;
4177     pcc->excp_model = POWERPC_EXCP_603;
4178     pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4179     pcc->bfd_mach = bfd_mach_ppc_505;
4180     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4181                  POWERPC_FLAG_BUS_CLK;
4182 }
4183
4184 static void init_proc_MPC8xx (CPUPPCState *env)
4185 {
4186     /* Time base */
4187     gen_tbl(env);
4188     gen_spr_5xx_8xx(env);
4189     gen_spr_8xx(env);
4190     init_excp_MPC8xx(env);
4191     env->dcache_line_size = 32;
4192     env->icache_line_size = 32;
4193     /* XXX: TODO: allocate internal IRQ controller */
4194 }
4195
4196 POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
4197 {
4198     DeviceClass *dc = DEVICE_CLASS(oc);
4199     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4200
4201     dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
4202     pcc->init_proc = init_proc_MPC8xx;
4203     pcc->check_pow = check_pow_none;
4204     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING  |
4205                        PPC_MEM_EIEIO | PPC_MEM_SYNC |
4206                        PPC_CACHE_ICBI | PPC_MFTB;
4207     pcc->insns_flags2 = PPC_NONE;
4208     pcc->msr_mask = 0x000000000001F673ULL;
4209     pcc->mmu_model = POWERPC_MMU_MPC8xx;
4210     pcc->excp_model = POWERPC_EXCP_603;
4211     pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4212     pcc->bfd_mach = bfd_mach_ppc_860;
4213     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4214                  POWERPC_FLAG_BUS_CLK;
4215 }
4216
4217 /* Freescale 82xx cores (aka PowerQUICC-II)                                  */
4218
4219 static void init_proc_G2 (CPUPPCState *env)
4220 {
4221     gen_spr_ne_601(env);
4222     gen_spr_G2_755(env);
4223     gen_spr_G2(env);
4224     /* Time base */
4225     gen_tbl(env);
4226     /* External access control */
4227     /* XXX : not implemented */
4228     spr_register(env, SPR_EAR, "EAR",
4229                  SPR_NOACCESS, SPR_NOACCESS,
4230                  &spr_read_generic, &spr_write_generic,
4231                  0x00000000);
4232     /* Hardware implementation register */
4233     /* XXX : not implemented */
4234     spr_register(env, SPR_HID0, "HID0",
4235                  SPR_NOACCESS, SPR_NOACCESS,
4236                  &spr_read_generic, &spr_write_generic,
4237                  0x00000000);
4238     /* XXX : not implemented */
4239     spr_register(env, SPR_HID1, "HID1",
4240                  SPR_NOACCESS, SPR_NOACCESS,
4241                  &spr_read_generic, &spr_write_generic,
4242                  0x00000000);
4243     /* XXX : not implemented */
4244     spr_register(env, SPR_HID2, "HID2",
4245                  SPR_NOACCESS, SPR_NOACCESS,
4246                  &spr_read_generic, &spr_write_generic,
4247                  0x00000000);
4248     /* Memory management */
4249     gen_low_BATs(env);
4250     gen_high_BATs(env);
4251     gen_6xx_7xx_soft_tlb(env, 64, 2);
4252     init_excp_G2(env);
4253     env->dcache_line_size = 32;
4254     env->icache_line_size = 32;
4255     /* Allocate hardware IRQ controller */
4256     ppc6xx_irq_init(env);
4257 }
4258
4259 POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
4260 {
4261     DeviceClass *dc = DEVICE_CLASS(oc);
4262     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4263
4264     dc->desc = "PowerPC G2";
4265     pcc->init_proc = init_proc_G2;
4266     pcc->check_pow = check_pow_hid0;
4267     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4268                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4269                        PPC_FLOAT_STFIWX |
4270                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4271                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
4272                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4273                        PPC_SEGMENT | PPC_EXTERN;
4274     pcc->insns_flags2 = PPC_NONE;
4275     pcc->msr_mask = 0x000000000006FFF2ULL;
4276     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4277     pcc->excp_model = POWERPC_EXCP_G2;
4278     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4279     pcc->bfd_mach = bfd_mach_ppc_ec603e;
4280     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4281                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4282 }
4283
4284 static void init_proc_G2LE (CPUPPCState *env)
4285 {
4286     gen_spr_ne_601(env);
4287     gen_spr_G2_755(env);
4288     gen_spr_G2(env);
4289     /* Time base */
4290     gen_tbl(env);
4291     /* External access control */
4292     /* XXX : not implemented */
4293     spr_register(env, SPR_EAR, "EAR",
4294                  SPR_NOACCESS, SPR_NOACCESS,
4295                  &spr_read_generic, &spr_write_generic,
4296                  0x00000000);
4297     /* Hardware implementation register */
4298     /* XXX : not implemented */
4299     spr_register(env, SPR_HID0, "HID0",
4300                  SPR_NOACCESS, SPR_NOACCESS,
4301                  &spr_read_generic, &spr_write_generic,
4302                  0x00000000);
4303     /* XXX : not implemented */
4304     spr_register(env, SPR_HID1, "HID1",
4305                  SPR_NOACCESS, SPR_NOACCESS,
4306                  &spr_read_generic, &spr_write_generic,
4307                  0x00000000);
4308     /* XXX : not implemented */
4309     spr_register(env, SPR_HID2, "HID2",
4310                  SPR_NOACCESS, SPR_NOACCESS,
4311                  &spr_read_generic, &spr_write_generic,
4312                  0x00000000);
4313     /* Memory management */
4314     gen_low_BATs(env);
4315     gen_high_BATs(env);
4316     gen_6xx_7xx_soft_tlb(env, 64, 2);
4317     init_excp_G2(env);
4318     env->dcache_line_size = 32;
4319     env->icache_line_size = 32;
4320     /* Allocate hardware IRQ controller */
4321     ppc6xx_irq_init(env);
4322 }
4323
4324 POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
4325 {
4326     DeviceClass *dc = DEVICE_CLASS(oc);
4327     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4328
4329     dc->desc = "PowerPC G2LE";
4330     pcc->init_proc = init_proc_G2LE;
4331     pcc->check_pow = check_pow_hid0;
4332     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4333                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4334                        PPC_FLOAT_STFIWX |
4335                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4336                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
4337                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4338                        PPC_SEGMENT | PPC_EXTERN;
4339     pcc->insns_flags2 = PPC_NONE;
4340     pcc->msr_mask = 0x000000000007FFF3ULL;
4341     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4342     pcc->excp_model = POWERPC_EXCP_G2;
4343     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4344     pcc->bfd_mach = bfd_mach_ppc_ec603e;
4345     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4346                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4347 }
4348
4349 static void init_proc_e200 (CPUPPCState *env)
4350 {
4351     /* Time base */
4352     gen_tbl(env);
4353     gen_spr_BookE(env, 0x000000070000FFFFULL);
4354     /* XXX : not implemented */
4355     spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4356                  &spr_read_spefscr, &spr_write_spefscr,
4357                  &spr_read_spefscr, &spr_write_spefscr,
4358                  0x00000000);
4359     /* Memory management */
4360     gen_spr_BookE206(env, 0x0000005D, NULL);
4361     /* XXX : not implemented */
4362     spr_register(env, SPR_HID0, "HID0",
4363                  SPR_NOACCESS, SPR_NOACCESS,
4364                  &spr_read_generic, &spr_write_generic,
4365                  0x00000000);
4366     /* XXX : not implemented */
4367     spr_register(env, SPR_HID1, "HID1",
4368                  SPR_NOACCESS, SPR_NOACCESS,
4369                  &spr_read_generic, &spr_write_generic,
4370                  0x00000000);
4371     /* XXX : not implemented */
4372     spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
4373                  SPR_NOACCESS, SPR_NOACCESS,
4374                  &spr_read_generic, &spr_write_generic,
4375                  0x00000000);
4376     /* XXX : not implemented */
4377     spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4378                  SPR_NOACCESS, SPR_NOACCESS,
4379                  &spr_read_generic, &spr_write_generic,
4380                  0x00000000);
4381     /* XXX : not implemented */
4382     spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
4383                  SPR_NOACCESS, SPR_NOACCESS,
4384                  &spr_read_generic, &spr_write_generic,
4385                  0x00000000);
4386     /* XXX : not implemented */
4387     spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
4388                  SPR_NOACCESS, SPR_NOACCESS,
4389                  &spr_read_generic, &spr_write_generic,
4390                  0x00000000);
4391     /* XXX : not implemented */
4392     spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
4393                  SPR_NOACCESS, SPR_NOACCESS,
4394                  &spr_read_generic, &spr_write_generic,
4395                  0x00000000);
4396     /* XXX : not implemented */
4397     spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4398                  SPR_NOACCESS, SPR_NOACCESS,
4399                  &spr_read_generic, &spr_write_generic,
4400                  0x00000000);
4401     /* XXX : not implemented */
4402     spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4403                  SPR_NOACCESS, SPR_NOACCESS,
4404                  &spr_read_generic, &spr_write_generic,
4405                  0x00000000);
4406     /* XXX : not implemented */
4407     spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
4408                  SPR_NOACCESS, SPR_NOACCESS,
4409                  &spr_read_generic, &spr_write_generic,
4410                  0x00000000);
4411     /* XXX : not implemented */
4412     spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
4413                  SPR_NOACCESS, SPR_NOACCESS,
4414                  &spr_read_generic, &spr_write_generic,
4415                  0x00000000);
4416     /* XXX : not implemented */
4417     spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
4418                  SPR_NOACCESS, SPR_NOACCESS,
4419                  &spr_read_generic, &spr_write_generic,
4420                  0x00000000);
4421     /* XXX : not implemented */
4422     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4423                  SPR_NOACCESS, SPR_NOACCESS,
4424                  &spr_read_generic, &spr_write_generic,
4425                  0x00000000);
4426     /* XXX : not implemented */
4427     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4428                  SPR_NOACCESS, SPR_NOACCESS,
4429                  &spr_read_generic, &spr_write_generic,
4430                  0x00000000);
4431     /* XXX : not implemented */
4432     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4433                  SPR_NOACCESS, SPR_NOACCESS,
4434                  &spr_read_generic, &spr_write_generic,
4435                  0x00000000); /* TOFIX */
4436     spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
4437                  SPR_NOACCESS, SPR_NOACCESS,
4438                  &spr_read_generic, &spr_write_generic,
4439                  0x00000000);
4440     spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
4441                  SPR_NOACCESS, SPR_NOACCESS,
4442                  &spr_read_generic, &spr_write_generic,
4443                  0x00000000);
4444 #if !defined(CONFIG_USER_ONLY)
4445     env->nb_tlb = 64;
4446     env->nb_ways = 1;
4447     env->id_tlbs = 0;
4448     env->tlb_type = TLB_EMB;
4449 #endif
4450     init_excp_e200(env, 0xFFFF0000UL);
4451     env->dcache_line_size = 32;
4452     env->icache_line_size = 32;
4453     /* XXX: TODO: allocate internal IRQ controller */
4454 }
4455
4456 POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
4457 {
4458     DeviceClass *dc = DEVICE_CLASS(oc);
4459     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4460
4461     dc->desc = "e200 core";
4462     pcc->init_proc = init_proc_e200;
4463     pcc->check_pow = check_pow_hid0;
4464     /* XXX: unimplemented instructions:
4465      * dcblc
4466      * dcbtlst
4467      * dcbtstls
4468      * icblc
4469      * icbtls
4470      * tlbivax
4471      * all SPE multiply-accumulate instructions
4472      */
4473     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4474                        PPC_SPE | PPC_SPE_SINGLE |
4475                        PPC_WRTEE | PPC_RFDI |
4476                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4477                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4478                        PPC_MEM_TLBSYNC | PPC_TLBIVAX |
4479                        PPC_BOOKE;
4480     pcc->insns_flags2 = PPC_NONE;
4481     pcc->msr_mask = 0x000000000606FF30ULL;
4482     pcc->mmu_model = POWERPC_MMU_BOOKE206;
4483     pcc->excp_model = POWERPC_EXCP_BOOKE;
4484     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4485     pcc->bfd_mach = bfd_mach_ppc_860;
4486     pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4487                  POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4488                  POWERPC_FLAG_BUS_CLK;
4489 }
4490
4491 static void init_proc_e300 (CPUPPCState *env)
4492 {
4493     gen_spr_ne_601(env);
4494     gen_spr_603(env);
4495     /* Time base */
4496     gen_tbl(env);
4497     /* hardware implementation registers */
4498     /* XXX : not implemented */
4499     spr_register(env, SPR_HID0, "HID0",
4500                  SPR_NOACCESS, SPR_NOACCESS,
4501                  &spr_read_generic, &spr_write_generic,
4502                  0x00000000);
4503     /* XXX : not implemented */
4504     spr_register(env, SPR_HID1, "HID1",
4505                  SPR_NOACCESS, SPR_NOACCESS,
4506                  &spr_read_generic, &spr_write_generic,
4507                  0x00000000);
4508     /* XXX : not implemented */
4509     spr_register(env, SPR_HID2, "HID2",
4510                  SPR_NOACCESS, SPR_NOACCESS,
4511                  &spr_read_generic, &spr_write_generic,
4512                  0x00000000);
4513     /* Memory management */
4514     gen_low_BATs(env);
4515     gen_high_BATs(env);
4516     gen_6xx_7xx_soft_tlb(env, 64, 2);
4517     init_excp_603(env);
4518     env->dcache_line_size = 32;
4519     env->icache_line_size = 32;
4520     /* Allocate hardware IRQ controller */
4521     ppc6xx_irq_init(env);
4522 }
4523
4524 POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
4525 {
4526     DeviceClass *dc = DEVICE_CLASS(oc);
4527     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4528
4529     dc->desc = "e300 core";
4530     pcc->init_proc = init_proc_e300;
4531     pcc->check_pow = check_pow_hid0;
4532     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4533                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4534                        PPC_FLOAT_STFIWX |
4535                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4536                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
4537                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4538                        PPC_SEGMENT | PPC_EXTERN;
4539     pcc->insns_flags2 = PPC_NONE;
4540     pcc->msr_mask = 0x000000000007FFF3ULL;
4541     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4542     pcc->excp_model = POWERPC_EXCP_603;
4543     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4544     pcc->bfd_mach = bfd_mach_ppc_603;
4545     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4546                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4547 }
4548
4549 #if !defined(CONFIG_USER_ONLY)
4550 static void spr_write_mas73(void *opaque, int sprn, int gprn)
4551 {
4552     TCGv val = tcg_temp_new();
4553     tcg_gen_ext32u_tl(val, cpu_gpr[gprn]);
4554     gen_store_spr(SPR_BOOKE_MAS3, val);
4555     tcg_gen_shri_tl(val, cpu_gpr[gprn], 32);
4556     gen_store_spr(SPR_BOOKE_MAS7, val);
4557     tcg_temp_free(val);
4558 }
4559
4560 static void spr_read_mas73(void *opaque, int gprn, int sprn)
4561 {
4562     TCGv mas7 = tcg_temp_new();
4563     TCGv mas3 = tcg_temp_new();
4564     gen_load_spr(mas7, SPR_BOOKE_MAS7);
4565     tcg_gen_shli_tl(mas7, mas7, 32);
4566     gen_load_spr(mas3, SPR_BOOKE_MAS3);
4567     tcg_gen_or_tl(cpu_gpr[gprn], mas3, mas7);
4568     tcg_temp_free(mas3);
4569     tcg_temp_free(mas7);
4570 }
4571
4572 #endif
4573
4574 enum fsl_e500_version {
4575     fsl_e500v1,
4576     fsl_e500v2,
4577     fsl_e500mc,
4578     fsl_e5500,
4579 };
4580
4581 static void init_proc_e500 (CPUPPCState *env, int version)
4582 {
4583     uint32_t tlbncfg[2];
4584     uint64_t ivor_mask;
4585     uint64_t ivpr_mask = 0xFFFF0000ULL;
4586     uint32_t l1cfg0 = 0x3800  /* 8 ways */
4587                     | 0x0020; /* 32 kb */
4588 #if !defined(CONFIG_USER_ONLY)
4589     int i;
4590 #endif
4591
4592     /* Time base */
4593     gen_tbl(env);
4594     /*
4595      * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
4596      *     complain when accessing them.
4597      * gen_spr_BookE(env, 0x0000000F0000FD7FULL);
4598      */
4599     switch (version) {
4600         case fsl_e500v1:
4601         case fsl_e500v2:
4602         default:
4603             ivor_mask = 0x0000000F0000FFFFULL;
4604             break;
4605         case fsl_e500mc:
4606         case fsl_e5500:
4607             ivor_mask = 0x000003FE0000FFFFULL;
4608             break;
4609     }
4610     gen_spr_BookE(env, ivor_mask);
4611     /* Processor identification */
4612     spr_register(env, SPR_BOOKE_PIR, "PIR",
4613                  SPR_NOACCESS, SPR_NOACCESS,
4614                  &spr_read_generic, &spr_write_pir,
4615                  0x00000000);
4616     /* XXX : not implemented */
4617     spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4618                  &spr_read_spefscr, &spr_write_spefscr,
4619                  &spr_read_spefscr, &spr_write_spefscr,
4620                  0x00000000);
4621 #if !defined(CONFIG_USER_ONLY)
4622     /* Memory management */
4623     env->nb_pids = 3;
4624     env->nb_ways = 2;
4625     env->id_tlbs = 0;
4626     switch (version) {
4627     case fsl_e500v1:
4628         tlbncfg[0] = gen_tlbncfg(2, 1, 1, 0, 256);
4629         tlbncfg[1] = gen_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4630         break;
4631     case fsl_e500v2:
4632         tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4633         tlbncfg[1] = gen_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4634         break;
4635     case fsl_e500mc:
4636     case fsl_e5500:
4637         tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4638         tlbncfg[1] = gen_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
4639         break;
4640     default:
4641         cpu_abort(env, "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4642     }
4643 #endif
4644     /* Cache sizes */
4645     switch (version) {
4646     case fsl_e500v1:
4647     case fsl_e500v2:
4648         env->dcache_line_size = 32;
4649         env->icache_line_size = 32;
4650         break;
4651     case fsl_e500mc:
4652     case fsl_e5500:
4653         env->dcache_line_size = 64;
4654         env->icache_line_size = 64;
4655         l1cfg0 |= 0x1000000; /* 64 byte cache block size */
4656         break;
4657     default:
4658         cpu_abort(env, "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4659     }
4660     gen_spr_BookE206(env, 0x000000DF, tlbncfg);
4661     /* XXX : not implemented */
4662     spr_register(env, SPR_HID0, "HID0",
4663                  SPR_NOACCESS, SPR_NOACCESS,
4664                  &spr_read_generic, &spr_write_generic,
4665                  0x00000000);
4666     /* XXX : not implemented */
4667     spr_register(env, SPR_HID1, "HID1",
4668                  SPR_NOACCESS, SPR_NOACCESS,
4669                  &spr_read_generic, &spr_write_generic,
4670                  0x00000000);
4671     /* XXX : not implemented */
4672     spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
4673                  SPR_NOACCESS, SPR_NOACCESS,
4674                  &spr_read_generic, &spr_write_generic,
4675                  0x00000000);
4676     /* XXX : not implemented */
4677     spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
4678                  SPR_NOACCESS, SPR_NOACCESS,
4679                  &spr_read_generic, &spr_write_generic,
4680                  0x00000000);
4681     /* XXX : not implemented */
4682     spr_register(env, SPR_Exxx_MCAR, "MCAR",
4683                  SPR_NOACCESS, SPR_NOACCESS,
4684                  &spr_read_generic, &spr_write_generic,
4685                  0x00000000);
4686     /* XXX : not implemented */
4687     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4688                  SPR_NOACCESS, SPR_NOACCESS,
4689                  &spr_read_generic, &spr_write_generic,
4690                  0x00000000);
4691     /* XXX : not implemented */
4692     spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
4693                  SPR_NOACCESS, SPR_NOACCESS,
4694                  &spr_read_generic, &spr_write_generic,
4695                  0x00000000);
4696     /* XXX : not implemented */
4697     spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4698                  SPR_NOACCESS, SPR_NOACCESS,
4699                  &spr_read_generic, &spr_write_generic,
4700                  0x00000000);
4701     /* XXX : not implemented */
4702     spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4703                  SPR_NOACCESS, SPR_NOACCESS,
4704                  &spr_read_generic, &spr_write_generic,
4705                  l1cfg0);
4706     /* XXX : not implemented */
4707     spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4708                  SPR_NOACCESS, SPR_NOACCESS,
4709                  &spr_read_generic, &spr_write_e500_l1csr0,
4710                  0x00000000);
4711     /* XXX : not implemented */
4712     spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
4713                  SPR_NOACCESS, SPR_NOACCESS,
4714                  &spr_read_generic, &spr_write_generic,
4715                  0x00000000);
4716     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4717                  SPR_NOACCESS, SPR_NOACCESS,
4718                  &spr_read_generic, &spr_write_generic,
4719                  0x00000000);
4720     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4721                  SPR_NOACCESS, SPR_NOACCESS,
4722                  &spr_read_generic, &spr_write_generic,
4723                  0x00000000);
4724     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4725                  SPR_NOACCESS, SPR_NOACCESS,
4726                  &spr_read_generic, &spr_write_booke206_mmucsr0,
4727                  0x00000000);
4728     spr_register(env, SPR_BOOKE_EPR, "EPR",
4729                  SPR_NOACCESS, SPR_NOACCESS,
4730                  &spr_read_generic, SPR_NOACCESS,
4731                  0x00000000);
4732     /* XXX better abstract into Emb.xxx features */
4733     if (version == fsl_e5500) {
4734         spr_register(env, SPR_BOOKE_EPCR, "EPCR",
4735                      SPR_NOACCESS, SPR_NOACCESS,
4736                      &spr_read_generic, &spr_write_generic,
4737                      0x00000000);
4738         spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
4739                      SPR_NOACCESS, SPR_NOACCESS,
4740                      &spr_read_mas73, &spr_write_mas73,
4741                      0x00000000);
4742         ivpr_mask = (target_ulong)~0xFFFFULL;
4743     }
4744
4745 #if !defined(CONFIG_USER_ONLY)
4746     env->nb_tlb = 0;
4747     env->tlb_type = TLB_MAS;
4748     for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
4749         env->nb_tlb += booke206_tlb_size(env, i);
4750     }
4751 #endif
4752
4753     init_excp_e200(env, ivpr_mask);
4754     /* Allocate hardware IRQ controller */
4755     ppce500_irq_init(env);
4756 }
4757
4758 static void init_proc_e500v1(CPUPPCState *env)
4759 {
4760     init_proc_e500(env, fsl_e500v1);
4761 }
4762
4763 POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
4764 {
4765     DeviceClass *dc = DEVICE_CLASS(oc);
4766     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4767
4768     dc->desc = "e500v1 core";
4769     pcc->init_proc = init_proc_e500v1;
4770     pcc->check_pow = check_pow_hid0;
4771     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4772                        PPC_SPE | PPC_SPE_SINGLE |
4773                        PPC_WRTEE | PPC_RFDI |
4774                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4775                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4776                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4777     pcc->insns_flags2 = PPC2_BOOKE206;
4778     pcc->msr_mask = 0x000000000606FF30ULL;
4779     pcc->mmu_model = POWERPC_MMU_BOOKE206;
4780     pcc->excp_model = POWERPC_EXCP_BOOKE;
4781     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4782     pcc->bfd_mach = bfd_mach_ppc_860;
4783     pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4784                  POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4785                  POWERPC_FLAG_BUS_CLK;
4786 }
4787
4788 static void init_proc_e500v2(CPUPPCState *env)
4789 {
4790     init_proc_e500(env, fsl_e500v2);
4791 }
4792
4793 POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
4794 {
4795     DeviceClass *dc = DEVICE_CLASS(oc);
4796     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4797
4798     dc->desc = "e500v2 core";
4799     pcc->init_proc = init_proc_e500v2;
4800     pcc->check_pow = check_pow_hid0;
4801     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4802                        PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
4803                        PPC_WRTEE | PPC_RFDI |
4804                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4805                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4806                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4807     pcc->insns_flags2 = PPC2_BOOKE206;
4808     pcc->msr_mask = 0x000000000606FF30ULL;
4809     pcc->mmu_model = POWERPC_MMU_BOOKE206;
4810     pcc->excp_model = POWERPC_EXCP_BOOKE;
4811     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4812     pcc->bfd_mach = bfd_mach_ppc_860;
4813     pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4814                  POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4815                  POWERPC_FLAG_BUS_CLK;
4816 }
4817
4818 static void init_proc_e500mc(CPUPPCState *env)
4819 {
4820     init_proc_e500(env, fsl_e500mc);
4821 }
4822
4823 POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
4824 {
4825     DeviceClass *dc = DEVICE_CLASS(oc);
4826     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4827
4828     dc->desc = "e500mc core";
4829     pcc->init_proc = init_proc_e500mc;
4830     pcc->check_pow = check_pow_none;
4831     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4832                        PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
4833                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4834                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4835                        PPC_FLOAT | PPC_FLOAT_FRES |
4836                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
4837                        PPC_FLOAT_STFIWX | PPC_WAIT |
4838                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4839     pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
4840     pcc->msr_mask = 0x000000001402FB36ULL;
4841     pcc->mmu_model = POWERPC_MMU_BOOKE206;
4842     pcc->excp_model = POWERPC_EXCP_BOOKE;
4843     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4844     /* FIXME: figure out the correct flag for e500mc */
4845     pcc->bfd_mach = bfd_mach_ppc_e500;
4846     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
4847                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4848 }
4849
4850 #ifdef TARGET_PPC64
4851 static void init_proc_e5500(CPUPPCState *env)
4852 {
4853     init_proc_e500(env, fsl_e5500);
4854 }
4855
4856 POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
4857 {
4858     DeviceClass *dc = DEVICE_CLASS(oc);
4859     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4860
4861     dc->desc = "e5500 core";
4862     pcc->init_proc = init_proc_e5500;
4863     pcc->check_pow = check_pow_none;
4864     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4865                        PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
4866                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4867                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4868                        PPC_FLOAT | PPC_FLOAT_FRES |
4869                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
4870                        PPC_FLOAT_STFIWX | PPC_WAIT |
4871                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
4872                        PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
4873     pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
4874     pcc->msr_mask = 0x000000009402FB36ULL;
4875     pcc->mmu_model = POWERPC_MMU_BOOKE206;
4876     pcc->excp_model = POWERPC_EXCP_BOOKE;
4877     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4878     /* FIXME: figure out the correct flag for e5500 */
4879     pcc->bfd_mach = bfd_mach_ppc_e500;
4880     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
4881                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4882 }
4883 #endif
4884
4885 /* Non-embedded PowerPC                                                      */
4886
4887 /* POWER : same as 601, without mfmsr, mfsr                                  */
4888 POWERPC_FAMILY(POWER)(ObjectClass *oc, void *data)
4889 {
4890     DeviceClass *dc = DEVICE_CLASS(oc);
4891     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4892
4893     dc->desc = "POWER";
4894     /* pcc->insns_flags = XXX_TODO; */
4895     /* POWER RSC (from RAD6000) */
4896     pcc->msr_mask = 0x00000000FEF0ULL;
4897 }
4898
4899 #define POWERPC_MSRR_601     (0x0000000000001040ULL)
4900
4901 static void init_proc_601 (CPUPPCState *env)
4902 {
4903     gen_spr_ne_601(env);
4904     gen_spr_601(env);
4905     /* Hardware implementation registers */
4906     /* XXX : not implemented */
4907     spr_register(env, SPR_HID0, "HID0",
4908                  SPR_NOACCESS, SPR_NOACCESS,
4909                  &spr_read_generic, &spr_write_hid0_601,
4910                  0x80010080);
4911     /* XXX : not implemented */
4912     spr_register(env, SPR_HID1, "HID1",
4913                  SPR_NOACCESS, SPR_NOACCESS,
4914                  &spr_read_generic, &spr_write_generic,
4915                  0x00000000);
4916     /* XXX : not implemented */
4917     spr_register(env, SPR_601_HID2, "HID2",
4918                  SPR_NOACCESS, SPR_NOACCESS,
4919                  &spr_read_generic, &spr_write_generic,
4920                  0x00000000);
4921     /* XXX : not implemented */
4922     spr_register(env, SPR_601_HID5, "HID5",
4923                  SPR_NOACCESS, SPR_NOACCESS,
4924                  &spr_read_generic, &spr_write_generic,
4925                  0x00000000);
4926     /* Memory management */
4927     init_excp_601(env);
4928     /* XXX: beware that dcache line size is 64 
4929      *      but dcbz uses 32 bytes "sectors"
4930      * XXX: this breaks clcs instruction !
4931      */
4932     env->dcache_line_size = 32;
4933     env->icache_line_size = 64;
4934     /* Allocate hardware IRQ controller */
4935     ppc6xx_irq_init(env);
4936 }
4937
4938 POWERPC_FAMILY(601)(ObjectClass *oc, void *data)
4939 {
4940     DeviceClass *dc = DEVICE_CLASS(oc);
4941     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4942
4943     dc->desc = "PowerPC 601";
4944     pcc->init_proc = init_proc_601;
4945     pcc->check_pow = check_pow_none;
4946     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
4947                        PPC_FLOAT |
4948                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4949                        PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
4950                        PPC_SEGMENT | PPC_EXTERN;
4951     pcc->insns_flags2 = PPC_NONE;
4952     pcc->msr_mask = 0x000000000000FD70ULL;
4953     pcc->mmu_model = POWERPC_MMU_601;
4954     pcc->excp_model = POWERPC_EXCP_601;
4955     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4956     pcc->bfd_mach = bfd_mach_ppc_601;
4957     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
4958 }
4959
4960 #define POWERPC_MSRR_601v    (0x0000000000001040ULL)
4961
4962 static void init_proc_601v (CPUPPCState *env)
4963 {
4964     init_proc_601(env);
4965     /* XXX : not implemented */
4966     spr_register(env, SPR_601_HID15, "HID15",
4967                  SPR_NOACCESS, SPR_NOACCESS,
4968                  &spr_read_generic, &spr_write_generic,
4969                  0x00000000);
4970 }
4971
4972 POWERPC_FAMILY(601v)(ObjectClass *oc, void *data)
4973 {
4974     DeviceClass *dc = DEVICE_CLASS(oc);
4975     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4976
4977     dc->desc = "PowerPC 601v";
4978     pcc->init_proc = init_proc_601v;
4979     pcc->check_pow = check_pow_none;
4980     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
4981                        PPC_FLOAT |
4982                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4983                        PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
4984                        PPC_SEGMENT | PPC_EXTERN;
4985     pcc->insns_flags2 = PPC_NONE;
4986     pcc->msr_mask = 0x000000000000FD70ULL;
4987     pcc->mmu_model = POWERPC_MMU_601;
4988     pcc->excp_model = POWERPC_EXCP_601;
4989     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4990     pcc->bfd_mach = bfd_mach_ppc_601;
4991     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
4992 }
4993
4994 static void init_proc_602 (CPUPPCState *env)
4995 {
4996     gen_spr_ne_601(env);
4997     gen_spr_602(env);
4998     /* Time base */
4999     gen_tbl(env);
5000     /* hardware implementation registers */
5001     /* XXX : not implemented */
5002     spr_register(env, SPR_HID0, "HID0",
5003                  SPR_NOACCESS, SPR_NOACCESS,
5004                  &spr_read_generic, &spr_write_generic,
5005                  0x00000000);
5006     /* XXX : not implemented */
5007     spr_register(env, SPR_HID1, "HID1",
5008                  SPR_NOACCESS, SPR_NOACCESS,
5009                  &spr_read_generic, &spr_write_generic,
5010                  0x00000000);
5011     /* Memory management */
5012     gen_low_BATs(env);
5013     gen_6xx_7xx_soft_tlb(env, 64, 2);
5014     init_excp_602(env);
5015     env->dcache_line_size = 32;
5016     env->icache_line_size = 32;
5017     /* Allocate hardware IRQ controller */
5018     ppc6xx_irq_init(env);
5019 }
5020
5021 POWERPC_FAMILY(602)(ObjectClass *oc, void *data)
5022 {
5023     DeviceClass *dc = DEVICE_CLASS(oc);
5024     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5025
5026     dc->desc = "PowerPC 602";
5027     pcc->init_proc = init_proc_602;
5028     pcc->check_pow = check_pow_hid0;
5029     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5030                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5031                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5032                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5033                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5034                        PPC_MEM_TLBIE | PPC_6xx_TLB | PPC_MEM_TLBSYNC |
5035                        PPC_SEGMENT | PPC_602_SPEC;
5036     pcc->insns_flags2 = PPC_NONE;
5037     pcc->msr_mask = 0x0000000000C7FF73ULL;
5038     /* XXX: 602 MMU is quite specific. Should add a special case */
5039     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5040     pcc->excp_model = POWERPC_EXCP_602;
5041     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5042     pcc->bfd_mach = bfd_mach_ppc_602;
5043     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5044                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5045 }
5046
5047 static void init_proc_603 (CPUPPCState *env)
5048 {
5049     gen_spr_ne_601(env);
5050     gen_spr_603(env);
5051     /* Time base */
5052     gen_tbl(env);
5053     /* hardware implementation registers */
5054     /* XXX : not implemented */
5055     spr_register(env, SPR_HID0, "HID0",
5056                  SPR_NOACCESS, SPR_NOACCESS,
5057                  &spr_read_generic, &spr_write_generic,
5058                  0x00000000);
5059     /* XXX : not implemented */
5060     spr_register(env, SPR_HID1, "HID1",
5061                  SPR_NOACCESS, SPR_NOACCESS,
5062                  &spr_read_generic, &spr_write_generic,
5063                  0x00000000);
5064     /* Memory management */
5065     gen_low_BATs(env);
5066     gen_6xx_7xx_soft_tlb(env, 64, 2);
5067     init_excp_603(env);
5068     env->dcache_line_size = 32;
5069     env->icache_line_size = 32;
5070     /* Allocate hardware IRQ controller */
5071     ppc6xx_irq_init(env);
5072 }
5073
5074 POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
5075 {
5076     DeviceClass *dc = DEVICE_CLASS(oc);
5077     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5078
5079     dc->desc = "PowerPC 603";
5080     pcc->init_proc = init_proc_603;
5081     pcc->check_pow = check_pow_hid0;
5082     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5083                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5084                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5085                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5086                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5087                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5088                        PPC_SEGMENT | PPC_EXTERN;
5089     pcc->insns_flags2 = PPC_NONE;
5090     pcc->msr_mask = 0x000000000007FF73ULL;
5091     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5092     pcc->excp_model = POWERPC_EXCP_603;
5093     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5094     pcc->bfd_mach = bfd_mach_ppc_603;
5095     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5096                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5097 }
5098
5099 static void init_proc_603E (CPUPPCState *env)
5100 {
5101     gen_spr_ne_601(env);
5102     gen_spr_603(env);
5103     /* Time base */
5104     gen_tbl(env);
5105     /* hardware implementation registers */
5106     /* XXX : not implemented */
5107     spr_register(env, SPR_HID0, "HID0",
5108                  SPR_NOACCESS, SPR_NOACCESS,
5109                  &spr_read_generic, &spr_write_generic,
5110                  0x00000000);
5111     /* XXX : not implemented */
5112     spr_register(env, SPR_HID1, "HID1",
5113                  SPR_NOACCESS, SPR_NOACCESS,
5114                  &spr_read_generic, &spr_write_generic,
5115                  0x00000000);
5116     /* XXX : not implemented */
5117     spr_register(env, SPR_IABR, "IABR",
5118                  SPR_NOACCESS, SPR_NOACCESS,
5119                  &spr_read_generic, &spr_write_generic,
5120                  0x00000000);
5121     /* Memory management */
5122     gen_low_BATs(env);
5123     gen_6xx_7xx_soft_tlb(env, 64, 2);
5124     init_excp_603(env);
5125     env->dcache_line_size = 32;
5126     env->icache_line_size = 32;
5127     /* Allocate hardware IRQ controller */
5128     ppc6xx_irq_init(env);
5129 }
5130
5131 POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
5132 {
5133     DeviceClass *dc = DEVICE_CLASS(oc);
5134     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5135
5136     dc->desc = "PowerPC 603e";
5137     pcc->init_proc = init_proc_603E;
5138     pcc->check_pow = check_pow_hid0;
5139     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5140                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5141                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5142                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5143                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5144                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5145                        PPC_SEGMENT | PPC_EXTERN;
5146     pcc->insns_flags2 = PPC_NONE;
5147     pcc->msr_mask = 0x000000000007FF73ULL;
5148     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5149     pcc->excp_model = POWERPC_EXCP_603E;
5150     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5151     pcc->bfd_mach = bfd_mach_ppc_ec603e;
5152     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5153                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5154 }
5155
5156 static void init_proc_604 (CPUPPCState *env)
5157 {
5158     gen_spr_ne_601(env);
5159     gen_spr_604(env);
5160     /* Time base */
5161     gen_tbl(env);
5162     /* Hardware implementation registers */
5163     /* XXX : not implemented */
5164     spr_register(env, SPR_HID0, "HID0",
5165                  SPR_NOACCESS, SPR_NOACCESS,
5166                  &spr_read_generic, &spr_write_generic,
5167                  0x00000000);
5168     /* Memory management */
5169     gen_low_BATs(env);
5170     init_excp_604(env);
5171     env->dcache_line_size = 32;
5172     env->icache_line_size = 32;
5173     /* Allocate hardware IRQ controller */
5174     ppc6xx_irq_init(env);
5175 }
5176
5177 POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
5178 {
5179     DeviceClass *dc = DEVICE_CLASS(oc);
5180     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5181
5182     dc->desc = "PowerPC 604";
5183     pcc->init_proc = init_proc_604;
5184     pcc->check_pow = check_pow_nocheck;
5185     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5186                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5187                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5188                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5189                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5190                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5191                        PPC_SEGMENT | PPC_EXTERN;
5192     pcc->insns_flags2 = PPC_NONE;
5193     pcc->msr_mask = 0x000000000005FF77ULL;
5194     pcc->mmu_model = POWERPC_MMU_32B;
5195     pcc->excp_model = POWERPC_EXCP_604;
5196     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5197     pcc->bfd_mach = bfd_mach_ppc_604;
5198     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5199                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5200 }
5201
5202 static void init_proc_604E (CPUPPCState *env)
5203 {
5204     gen_spr_ne_601(env);
5205     gen_spr_604(env);
5206     /* XXX : not implemented */
5207     spr_register(env, SPR_MMCR1, "MMCR1",
5208                  SPR_NOACCESS, SPR_NOACCESS,
5209                  &spr_read_generic, &spr_write_generic,
5210                  0x00000000);
5211     /* XXX : not implemented */
5212     spr_register(env, SPR_PMC3, "PMC3",
5213                  SPR_NOACCESS, SPR_NOACCESS,
5214                  &spr_read_generic, &spr_write_generic,
5215                  0x00000000);
5216     /* XXX : not implemented */
5217     spr_register(env, SPR_PMC4, "PMC4",
5218                  SPR_NOACCESS, SPR_NOACCESS,
5219                  &spr_read_generic, &spr_write_generic,
5220                  0x00000000);
5221     /* Time base */
5222     gen_tbl(env);
5223     /* Hardware implementation registers */
5224     /* XXX : not implemented */
5225     spr_register(env, SPR_HID0, "HID0",
5226                  SPR_NOACCESS, SPR_NOACCESS,
5227                  &spr_read_generic, &spr_write_generic,
5228                  0x00000000);
5229     /* XXX : not implemented */
5230     spr_register(env, SPR_HID1, "HID1",
5231                  SPR_NOACCESS, SPR_NOACCESS,
5232                  &spr_read_generic, &spr_write_generic,
5233                  0x00000000);
5234     /* Memory management */
5235     gen_low_BATs(env);
5236     init_excp_604(env);
5237     env->dcache_line_size = 32;
5238     env->icache_line_size = 32;
5239     /* Allocate hardware IRQ controller */
5240     ppc6xx_irq_init(env);
5241 }
5242
5243 POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
5244 {
5245     DeviceClass *dc = DEVICE_CLASS(oc);
5246     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5247
5248     dc->desc = "PowerPC 604E";
5249     pcc->init_proc = init_proc_604E;
5250     pcc->check_pow = check_pow_nocheck;
5251     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5252                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5253                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5254                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5255                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5256                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5257                        PPC_SEGMENT | PPC_EXTERN;
5258     pcc->insns_flags2 = PPC_NONE;
5259     pcc->msr_mask = 0x000000000005FF77ULL;
5260     pcc->mmu_model = POWERPC_MMU_32B;
5261     pcc->excp_model = POWERPC_EXCP_604;
5262     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5263     pcc->bfd_mach = bfd_mach_ppc_604;
5264     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5265                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5266 }
5267
5268 static void init_proc_740 (CPUPPCState *env)
5269 {
5270     gen_spr_ne_601(env);
5271     gen_spr_7xx(env);
5272     /* Time base */
5273     gen_tbl(env);
5274     /* Thermal management */
5275     gen_spr_thrm(env);
5276     /* Hardware implementation registers */
5277     /* XXX : not implemented */
5278     spr_register(env, SPR_HID0, "HID0",
5279                  SPR_NOACCESS, SPR_NOACCESS,
5280                  &spr_read_generic, &spr_write_generic,
5281                  0x00000000);
5282     /* XXX : not implemented */
5283     spr_register(env, SPR_HID1, "HID1",
5284                  SPR_NOACCESS, SPR_NOACCESS,
5285                  &spr_read_generic, &spr_write_generic,
5286                  0x00000000);
5287     /* Memory management */
5288     gen_low_BATs(env);
5289     init_excp_7x0(env);
5290     env->dcache_line_size = 32;
5291     env->icache_line_size = 32;
5292     /* Allocate hardware IRQ controller */
5293     ppc6xx_irq_init(env);
5294 }
5295
5296 POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
5297 {
5298     DeviceClass *dc = DEVICE_CLASS(oc);
5299     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5300
5301     dc->desc = "PowerPC 740";
5302     pcc->init_proc = init_proc_740;
5303     pcc->check_pow = check_pow_hid0;
5304     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5305                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5306                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5307                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5308                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5309                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5310                        PPC_SEGMENT | PPC_EXTERN;
5311     pcc->insns_flags2 = PPC_NONE;
5312     pcc->msr_mask = 0x000000000005FF77ULL;
5313     pcc->mmu_model = POWERPC_MMU_32B;
5314     pcc->excp_model = POWERPC_EXCP_7x0;
5315     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5316     pcc->bfd_mach = bfd_mach_ppc_750;
5317     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5318                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5319 }
5320
5321 static void init_proc_750 (CPUPPCState *env)
5322 {
5323     gen_spr_ne_601(env);
5324     gen_spr_7xx(env);
5325     /* XXX : not implemented */
5326     spr_register(env, SPR_L2CR, "L2CR",
5327                  SPR_NOACCESS, SPR_NOACCESS,
5328                  &spr_read_generic, &spr_write_generic,
5329                  0x00000000);
5330     /* Time base */
5331     gen_tbl(env);
5332     /* Thermal management */
5333     gen_spr_thrm(env);
5334     /* Hardware implementation registers */
5335     /* XXX : not implemented */
5336     spr_register(env, SPR_HID0, "HID0",
5337                  SPR_NOACCESS, SPR_NOACCESS,
5338                  &spr_read_generic, &spr_write_generic,
5339                  0x00000000);
5340     /* XXX : not implemented */
5341     spr_register(env, SPR_HID1, "HID1",
5342                  SPR_NOACCESS, SPR_NOACCESS,
5343                  &spr_read_generic, &spr_write_generic,
5344                  0x00000000);
5345     /* Memory management */
5346     gen_low_BATs(env);
5347     /* XXX: high BATs are also present but are known to be bugged on
5348      *      die version 1.x
5349      */
5350     init_excp_7x0(env);
5351     env->dcache_line_size = 32;
5352     env->icache_line_size = 32;
5353     /* Allocate hardware IRQ controller */
5354     ppc6xx_irq_init(env);
5355 }
5356
5357 POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
5358 {
5359     DeviceClass *dc = DEVICE_CLASS(oc);
5360     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5361
5362     dc->desc = "PowerPC 750";
5363     pcc->init_proc = init_proc_750;
5364     pcc->check_pow = check_pow_hid0;
5365     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5366                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5367                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5368                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5369                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5370                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5371                        PPC_SEGMENT | PPC_EXTERN;
5372     pcc->insns_flags2 = PPC_NONE;
5373     pcc->msr_mask = 0x000000000005FF77ULL;
5374     pcc->mmu_model = POWERPC_MMU_32B;
5375     pcc->excp_model = POWERPC_EXCP_7x0;
5376     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5377     pcc->bfd_mach = bfd_mach_ppc_750;
5378     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5379                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5380 }
5381
5382 static void init_proc_750cl (CPUPPCState *env)
5383 {
5384     gen_spr_ne_601(env);
5385     gen_spr_7xx(env);
5386     /* XXX : not implemented */
5387     spr_register(env, SPR_L2CR, "L2CR",
5388                  SPR_NOACCESS, SPR_NOACCESS,
5389                  &spr_read_generic, &spr_write_generic,
5390                  0x00000000);
5391     /* Time base */
5392     gen_tbl(env);
5393     /* Thermal management */
5394     /* Those registers are fake on 750CL */
5395     spr_register(env, SPR_THRM1, "THRM1",
5396                  SPR_NOACCESS, SPR_NOACCESS,
5397                  &spr_read_generic, &spr_write_generic,
5398                  0x00000000);
5399     spr_register(env, SPR_THRM2, "THRM2",
5400                  SPR_NOACCESS, SPR_NOACCESS,
5401                  &spr_read_generic, &spr_write_generic,
5402                  0x00000000);
5403     spr_register(env, SPR_THRM3, "THRM3",
5404                  SPR_NOACCESS, SPR_NOACCESS,
5405                  &spr_read_generic, &spr_write_generic,
5406                  0x00000000);
5407     /* XXX: not implemented */
5408     spr_register(env, SPR_750_TDCL, "TDCL",
5409                  SPR_NOACCESS, SPR_NOACCESS,
5410                  &spr_read_generic, &spr_write_generic,
5411                  0x00000000);
5412     spr_register(env, SPR_750_TDCH, "TDCH",
5413                  SPR_NOACCESS, SPR_NOACCESS,
5414                  &spr_read_generic, &spr_write_generic,
5415                  0x00000000);
5416     /* DMA */
5417     /* XXX : not implemented */
5418     spr_register(env, SPR_750_WPAR, "WPAR",
5419                  SPR_NOACCESS, SPR_NOACCESS,
5420                  &spr_read_generic, &spr_write_generic,
5421                  0x00000000);
5422     spr_register(env, SPR_750_DMAL, "DMAL",
5423                  SPR_NOACCESS, SPR_NOACCESS,
5424                  &spr_read_generic, &spr_write_generic,
5425                  0x00000000);
5426     spr_register(env, SPR_750_DMAU, "DMAU",
5427                  SPR_NOACCESS, SPR_NOACCESS,
5428                  &spr_read_generic, &spr_write_generic,
5429                  0x00000000);
5430     /* Hardware implementation registers */
5431     /* XXX : not implemented */
5432     spr_register(env, SPR_HID0, "HID0",
5433                  SPR_NOACCESS, SPR_NOACCESS,
5434                  &spr_read_generic, &spr_write_generic,
5435                  0x00000000);
5436     /* XXX : not implemented */
5437     spr_register(env, SPR_HID1, "HID1",
5438                  SPR_NOACCESS, SPR_NOACCESS,
5439                  &spr_read_generic, &spr_write_generic,
5440                  0x00000000);
5441     /* XXX : not implemented */
5442     spr_register(env, SPR_750CL_HID2, "HID2",
5443                  SPR_NOACCESS, SPR_NOACCESS,
5444                  &spr_read_generic, &spr_write_generic,
5445                  0x00000000);
5446     /* XXX : not implemented */
5447     spr_register(env, SPR_750CL_HID4, "HID4",
5448                  SPR_NOACCESS, SPR_NOACCESS,
5449                  &spr_read_generic, &spr_write_generic,
5450                  0x00000000);
5451     /* Quantization registers */
5452     /* XXX : not implemented */
5453     spr_register(env, SPR_750_GQR0, "GQR0",
5454                  SPR_NOACCESS, SPR_NOACCESS,
5455                  &spr_read_generic, &spr_write_generic,
5456                  0x00000000);
5457     /* XXX : not implemented */
5458     spr_register(env, SPR_750_GQR1, "GQR1",
5459                  SPR_NOACCESS, SPR_NOACCESS,
5460                  &spr_read_generic, &spr_write_generic,
5461                  0x00000000);
5462     /* XXX : not implemented */
5463     spr_register(env, SPR_750_GQR2, "GQR2",
5464                  SPR_NOACCESS, SPR_NOACCESS,
5465                  &spr_read_generic, &spr_write_generic,
5466                  0x00000000);
5467     /* XXX : not implemented */
5468     spr_register(env, SPR_750_GQR3, "GQR3",
5469                  SPR_NOACCESS, SPR_NOACCESS,
5470                  &spr_read_generic, &spr_write_generic,
5471                  0x00000000);
5472     /* XXX : not implemented */
5473     spr_register(env, SPR_750_GQR4, "GQR4",
5474                  SPR_NOACCESS, SPR_NOACCESS,
5475                  &spr_read_generic, &spr_write_generic,
5476                  0x00000000);
5477     /* XXX : not implemented */
5478     spr_register(env, SPR_750_GQR5, "GQR5",
5479                  SPR_NOACCESS, SPR_NOACCESS,
5480                  &spr_read_generic, &spr_write_generic,
5481                  0x00000000);
5482     /* XXX : not implemented */
5483     spr_register(env, SPR_750_GQR6, "GQR6",
5484                  SPR_NOACCESS, SPR_NOACCESS,
5485                  &spr_read_generic, &spr_write_generic,
5486                  0x00000000);
5487     /* XXX : not implemented */
5488     spr_register(env, SPR_750_GQR7, "GQR7",
5489                  SPR_NOACCESS, SPR_NOACCESS,
5490                  &spr_read_generic, &spr_write_generic,
5491                  0x00000000);
5492     /* Memory management */
5493     gen_low_BATs(env);
5494     /* PowerPC 750cl has 8 DBATs and 8 IBATs */
5495     gen_high_BATs(env);
5496     init_excp_750cl(env);
5497     env->dcache_line_size = 32;
5498     env->icache_line_size = 32;
5499     /* Allocate hardware IRQ controller */
5500     ppc6xx_irq_init(env);
5501 }
5502
5503 POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
5504 {
5505     DeviceClass *dc = DEVICE_CLASS(oc);
5506     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5507
5508     dc->desc = "PowerPC 750 CL";
5509     pcc->init_proc = init_proc_750cl;
5510     pcc->check_pow = check_pow_hid0;
5511     /* XXX: not implemented:
5512      * cache lock instructions:
5513      * dcbz_l
5514      * floating point paired instructions
5515      * psq_lux
5516      * psq_lx
5517      * psq_stux
5518      * psq_stx
5519      * ps_abs
5520      * ps_add
5521      * ps_cmpo0
5522      * ps_cmpo1
5523      * ps_cmpu0
5524      * ps_cmpu1
5525      * ps_div
5526      * ps_madd
5527      * ps_madds0
5528      * ps_madds1
5529      * ps_merge00
5530      * ps_merge01
5531      * ps_merge10
5532      * ps_merge11
5533      * ps_mr
5534      * ps_msub
5535      * ps_mul
5536      * ps_muls0
5537      * ps_muls1
5538      * ps_nabs
5539      * ps_neg
5540      * ps_nmadd
5541      * ps_nmsub
5542      * ps_res
5543      * ps_rsqrte
5544      * ps_sel
5545      * ps_sub
5546      * ps_sum0
5547      * ps_sum1
5548      */
5549     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5550                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5551                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5552                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5553                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5554                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5555                        PPC_SEGMENT | PPC_EXTERN;
5556     pcc->insns_flags2 = PPC_NONE;
5557     pcc->msr_mask = 0x000000000005FF77ULL;
5558     pcc->mmu_model = POWERPC_MMU_32B;
5559     pcc->excp_model = POWERPC_EXCP_7x0;
5560     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5561     pcc->bfd_mach = bfd_mach_ppc_750;
5562     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5563                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5564 }
5565
5566 static void init_proc_750cx (CPUPPCState *env)
5567 {
5568     gen_spr_ne_601(env);
5569     gen_spr_7xx(env);
5570     /* XXX : not implemented */
5571     spr_register(env, SPR_L2CR, "L2CR",
5572                  SPR_NOACCESS, SPR_NOACCESS,
5573                  &spr_read_generic, &spr_write_generic,
5574                  0x00000000);
5575     /* Time base */
5576     gen_tbl(env);
5577     /* Thermal management */
5578     gen_spr_thrm(env);
5579     /* This register is not implemented but is present for compatibility */
5580     spr_register(env, SPR_SDA, "SDA",
5581                  SPR_NOACCESS, SPR_NOACCESS,
5582                  &spr_read_generic, &spr_write_generic,
5583                  0x00000000);
5584     /* Hardware implementation registers */
5585     /* XXX : not implemented */
5586     spr_register(env, SPR_HID0, "HID0",
5587                  SPR_NOACCESS, SPR_NOACCESS,
5588                  &spr_read_generic, &spr_write_generic,
5589                  0x00000000);
5590     /* XXX : not implemented */
5591     spr_register(env, SPR_HID1, "HID1",
5592                  SPR_NOACCESS, SPR_NOACCESS,
5593                  &spr_read_generic, &spr_write_generic,
5594                  0x00000000);
5595     /* Memory management */
5596     gen_low_BATs(env);
5597     /* PowerPC 750cx has 8 DBATs and 8 IBATs */
5598     gen_high_BATs(env);
5599     init_excp_750cx(env);
5600     env->dcache_line_size = 32;
5601     env->icache_line_size = 32;
5602     /* Allocate hardware IRQ controller */
5603     ppc6xx_irq_init(env);
5604 }
5605
5606 POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
5607 {
5608     DeviceClass *dc = DEVICE_CLASS(oc);
5609     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5610
5611     dc->desc = "PowerPC 750CX";
5612     pcc->init_proc = init_proc_750cx;
5613     pcc->check_pow = check_pow_hid0;
5614     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5615                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5616                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5617                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5618                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5619                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5620                        PPC_SEGMENT | PPC_EXTERN;
5621     pcc->insns_flags2 = PPC_NONE;
5622     pcc->msr_mask = 0x000000000005FF77ULL;
5623     pcc->mmu_model = POWERPC_MMU_32B;
5624     pcc->excp_model = POWERPC_EXCP_7x0;
5625     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5626     pcc->bfd_mach = bfd_mach_ppc_750;
5627     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5628                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5629 }
5630
5631 static void init_proc_750fx (CPUPPCState *env)
5632 {
5633     gen_spr_ne_601(env);
5634     gen_spr_7xx(env);
5635     /* XXX : not implemented */
5636     spr_register(env, SPR_L2CR, "L2CR",
5637                  SPR_NOACCESS, SPR_NOACCESS,
5638                  &spr_read_generic, &spr_write_generic,
5639                  0x00000000);
5640     /* Time base */
5641     gen_tbl(env);
5642     /* Thermal management */
5643     gen_spr_thrm(env);
5644     /* XXX : not implemented */
5645     spr_register(env, SPR_750_THRM4, "THRM4",
5646                  SPR_NOACCESS, SPR_NOACCESS,
5647                  &spr_read_generic, &spr_write_generic,
5648                  0x00000000);
5649     /* Hardware implementation registers */
5650     /* XXX : not implemented */
5651     spr_register(env, SPR_HID0, "HID0",
5652                  SPR_NOACCESS, SPR_NOACCESS,
5653                  &spr_read_generic, &spr_write_generic,
5654                  0x00000000);
5655     /* XXX : not implemented */
5656     spr_register(env, SPR_HID1, "HID1",
5657                  SPR_NOACCESS, SPR_NOACCESS,
5658                  &spr_read_generic, &spr_write_generic,
5659                  0x00000000);
5660     /* XXX : not implemented */
5661     spr_register(env, SPR_750FX_HID2, "HID2",
5662                  SPR_NOACCESS, SPR_NOACCESS,
5663                  &spr_read_generic, &spr_write_generic,
5664                  0x00000000);
5665     /* Memory management */
5666     gen_low_BATs(env);
5667     /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5668     gen_high_BATs(env);
5669     init_excp_7x0(env);
5670     env->dcache_line_size = 32;
5671     env->icache_line_size = 32;
5672     /* Allocate hardware IRQ controller */
5673     ppc6xx_irq_init(env);
5674 }
5675
5676 POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
5677 {
5678     DeviceClass *dc = DEVICE_CLASS(oc);
5679     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5680
5681     dc->desc = "PowerPC 750FX";
5682     pcc->init_proc = init_proc_750fx;
5683     pcc->check_pow = check_pow_hid0;
5684     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5685                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5686                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5687                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5688                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5689                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5690                        PPC_SEGMENT | PPC_EXTERN;
5691     pcc->insns_flags2 = PPC_NONE;
5692     pcc->msr_mask = 0x000000000005FF77ULL;
5693     pcc->mmu_model = POWERPC_MMU_32B;
5694     pcc->excp_model = POWERPC_EXCP_7x0;
5695     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5696     pcc->bfd_mach = bfd_mach_ppc_750;
5697     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5698                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5699 }
5700
5701 static void init_proc_750gx (CPUPPCState *env)
5702 {
5703     gen_spr_ne_601(env);
5704     gen_spr_7xx(env);
5705     /* XXX : not implemented (XXX: different from 750fx) */
5706     spr_register(env, SPR_L2CR, "L2CR",
5707                  SPR_NOACCESS, SPR_NOACCESS,
5708                  &spr_read_generic, &spr_write_generic,
5709                  0x00000000);
5710     /* Time base */
5711     gen_tbl(env);
5712     /* Thermal management */
5713     gen_spr_thrm(env);
5714     /* XXX : not implemented */
5715     spr_register(env, SPR_750_THRM4, "THRM4",
5716                  SPR_NOACCESS, SPR_NOACCESS,
5717                  &spr_read_generic, &spr_write_generic,
5718                  0x00000000);
5719     /* Hardware implementation registers */
5720     /* XXX : not implemented (XXX: different from 750fx) */
5721     spr_register(env, SPR_HID0, "HID0",
5722                  SPR_NOACCESS, SPR_NOACCESS,
5723                  &spr_read_generic, &spr_write_generic,
5724                  0x00000000);
5725     /* XXX : not implemented */
5726     spr_register(env, SPR_HID1, "HID1",
5727                  SPR_NOACCESS, SPR_NOACCESS,
5728                  &spr_read_generic, &spr_write_generic,
5729                  0x00000000);
5730     /* XXX : not implemented (XXX: different from 750fx) */
5731     spr_register(env, SPR_750FX_HID2, "HID2",
5732                  SPR_NOACCESS, SPR_NOACCESS,
5733                  &spr_read_generic, &spr_write_generic,
5734                  0x00000000);
5735     /* Memory management */
5736     gen_low_BATs(env);
5737     /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5738     gen_high_BATs(env);
5739     init_excp_7x0(env);
5740     env->dcache_line_size = 32;
5741     env->icache_line_size = 32;
5742     /* Allocate hardware IRQ controller */
5743     ppc6xx_irq_init(env);
5744 }
5745
5746 POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
5747 {
5748     DeviceClass *dc = DEVICE_CLASS(oc);
5749     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5750
5751     dc->desc = "PowerPC 750GX";
5752     pcc->init_proc = init_proc_750gx;
5753     pcc->check_pow = check_pow_hid0;
5754     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5755                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5756                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5757                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5758                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5759                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5760                        PPC_SEGMENT | PPC_EXTERN;
5761     pcc->insns_flags2 = PPC_NONE;
5762     pcc->msr_mask = 0x000000000005FF77ULL;
5763     pcc->mmu_model = POWERPC_MMU_32B;
5764     pcc->excp_model = POWERPC_EXCP_7x0;
5765     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5766     pcc->bfd_mach = bfd_mach_ppc_750;
5767     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5768                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5769 }
5770
5771 static void init_proc_745 (CPUPPCState *env)
5772 {
5773     gen_spr_ne_601(env);
5774     gen_spr_7xx(env);
5775     gen_spr_G2_755(env);
5776     /* Time base */
5777     gen_tbl(env);
5778     /* Thermal management */
5779     gen_spr_thrm(env);
5780     /* Hardware implementation registers */
5781     /* XXX : not implemented */
5782     spr_register(env, SPR_HID0, "HID0",
5783                  SPR_NOACCESS, SPR_NOACCESS,
5784                  &spr_read_generic, &spr_write_generic,
5785                  0x00000000);
5786     /* XXX : not implemented */
5787     spr_register(env, SPR_HID1, "HID1",
5788                  SPR_NOACCESS, SPR_NOACCESS,
5789                  &spr_read_generic, &spr_write_generic,
5790                  0x00000000);
5791     /* XXX : not implemented */
5792     spr_register(env, SPR_HID2, "HID2",
5793                  SPR_NOACCESS, SPR_NOACCESS,
5794                  &spr_read_generic, &spr_write_generic,
5795                  0x00000000);
5796     /* Memory management */
5797     gen_low_BATs(env);
5798     gen_high_BATs(env);
5799     gen_6xx_7xx_soft_tlb(env, 64, 2);
5800     init_excp_7x5(env);
5801     env->dcache_line_size = 32;
5802     env->icache_line_size = 32;
5803     /* Allocate hardware IRQ controller */
5804     ppc6xx_irq_init(env);
5805 }
5806
5807 POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
5808 {
5809     DeviceClass *dc = DEVICE_CLASS(oc);
5810     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5811
5812     dc->desc = "PowerPC 745";
5813     pcc->init_proc = init_proc_745;
5814     pcc->check_pow = check_pow_hid0;
5815     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5816                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5817                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5818                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5819                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5820                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5821                        PPC_SEGMENT | PPC_EXTERN;
5822     pcc->insns_flags2 = PPC_NONE;
5823     pcc->msr_mask = 0x000000000005FF77ULL;
5824     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5825     pcc->excp_model = POWERPC_EXCP_7x5;
5826     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5827     pcc->bfd_mach = bfd_mach_ppc_750;
5828     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5829                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5830 }
5831
5832 static void init_proc_755 (CPUPPCState *env)
5833 {
5834     gen_spr_ne_601(env);
5835     gen_spr_7xx(env);
5836     gen_spr_G2_755(env);
5837     /* Time base */
5838     gen_tbl(env);
5839     /* L2 cache control */
5840     /* XXX : not implemented */
5841     spr_register(env, SPR_L2CR, "L2CR",
5842                  SPR_NOACCESS, SPR_NOACCESS,
5843                  &spr_read_generic, &spr_write_generic,
5844                  0x00000000);
5845     /* XXX : not implemented */
5846     spr_register(env, SPR_L2PMCR, "L2PMCR",
5847                  SPR_NOACCESS, SPR_NOACCESS,
5848                  &spr_read_generic, &spr_write_generic,
5849                  0x00000000);
5850     /* Thermal management */
5851     gen_spr_thrm(env);
5852     /* Hardware implementation registers */
5853     /* XXX : not implemented */
5854     spr_register(env, SPR_HID0, "HID0",
5855                  SPR_NOACCESS, SPR_NOACCESS,
5856                  &spr_read_generic, &spr_write_generic,
5857                  0x00000000);
5858     /* XXX : not implemented */
5859     spr_register(env, SPR_HID1, "HID1",
5860                  SPR_NOACCESS, SPR_NOACCESS,
5861                  &spr_read_generic, &spr_write_generic,
5862                  0x00000000);
5863     /* XXX : not implemented */
5864     spr_register(env, SPR_HID2, "HID2",
5865                  SPR_NOACCESS, SPR_NOACCESS,
5866                  &spr_read_generic, &spr_write_generic,
5867                  0x00000000);
5868     /* Memory management */
5869     gen_low_BATs(env);
5870     gen_high_BATs(env);
5871     gen_6xx_7xx_soft_tlb(env, 64, 2);
5872     init_excp_7x5(env);
5873     env->dcache_line_size = 32;
5874     env->icache_line_size = 32;
5875     /* Allocate hardware IRQ controller */
5876     ppc6xx_irq_init(env);
5877 }
5878
5879 POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
5880 {
5881     DeviceClass *dc = DEVICE_CLASS(oc);
5882     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5883
5884     dc->desc = "PowerPC 755";
5885     pcc->init_proc = init_proc_755;
5886     pcc->check_pow = check_pow_hid0;
5887     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5888                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5889                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5890                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5891                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5892                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5893                        PPC_SEGMENT | PPC_EXTERN;
5894     pcc->insns_flags2 = PPC_NONE;
5895     pcc->msr_mask = 0x000000000005FF77ULL;
5896     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5897     pcc->excp_model = POWERPC_EXCP_7x5;
5898     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5899     pcc->bfd_mach = bfd_mach_ppc_750;
5900     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5901                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5902 }
5903
5904 static void init_proc_7400 (CPUPPCState *env)
5905 {
5906     gen_spr_ne_601(env);
5907     gen_spr_7xx(env);
5908     /* Time base */
5909     gen_tbl(env);
5910     /* 74xx specific SPR */
5911     gen_spr_74xx(env);
5912     /* XXX : not implemented */
5913     spr_register(env, SPR_UBAMR, "UBAMR",
5914                  &spr_read_ureg, SPR_NOACCESS,
5915                  &spr_read_ureg, SPR_NOACCESS,
5916                  0x00000000);
5917     /* XXX: this seems not implemented on all revisions. */
5918     /* XXX : not implemented */
5919     spr_register(env, SPR_MSSCR1, "MSSCR1",
5920                  SPR_NOACCESS, SPR_NOACCESS,
5921                  &spr_read_generic, &spr_write_generic,
5922                  0x00000000);
5923     /* Thermal management */
5924     gen_spr_thrm(env);
5925     /* Memory management */
5926     gen_low_BATs(env);
5927     init_excp_7400(env);
5928     env->dcache_line_size = 32;
5929     env->icache_line_size = 32;
5930     /* Allocate hardware IRQ controller */
5931     ppc6xx_irq_init(env);
5932 }
5933
5934 POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
5935 {
5936     DeviceClass *dc = DEVICE_CLASS(oc);
5937     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5938
5939     dc->desc = "PowerPC 7400 (aka G4)";
5940     pcc->init_proc = init_proc_7400;
5941     pcc->check_pow = check_pow_hid0;
5942     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5943                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5944                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5945                        PPC_FLOAT_STFIWX |
5946                        PPC_CACHE | PPC_CACHE_ICBI |
5947                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5948                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
5949                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5950                        PPC_MEM_TLBIA |
5951                        PPC_SEGMENT | PPC_EXTERN |
5952                        PPC_ALTIVEC;
5953     pcc->insns_flags2 = PPC_NONE;
5954     pcc->msr_mask = 0x000000000205FF77ULL;
5955     pcc->mmu_model = POWERPC_MMU_32B;
5956     pcc->excp_model = POWERPC_EXCP_74xx;
5957     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5958     pcc->bfd_mach = bfd_mach_ppc_7400;
5959     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5960                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5961                  POWERPC_FLAG_BUS_CLK;
5962 }
5963
5964 static void init_proc_7410 (CPUPPCState *env)
5965 {
5966     gen_spr_ne_601(env);
5967     gen_spr_7xx(env);
5968     /* Time base */
5969     gen_tbl(env);
5970     /* 74xx specific SPR */
5971     gen_spr_74xx(env);
5972     /* XXX : not implemented */
5973     spr_register(env, SPR_UBAMR, "UBAMR",
5974                  &spr_read_ureg, SPR_NOACCESS,
5975                  &spr_read_ureg, SPR_NOACCESS,
5976                  0x00000000);
5977     /* Thermal management */
5978     gen_spr_thrm(env);
5979     /* L2PMCR */
5980     /* XXX : not implemented */
5981     spr_register(env, SPR_L2PMCR, "L2PMCR",
5982                  SPR_NOACCESS, SPR_NOACCESS,
5983                  &spr_read_generic, &spr_write_generic,
5984                  0x00000000);
5985     /* LDSTDB */
5986     /* XXX : not implemented */
5987     spr_register(env, SPR_LDSTDB, "LDSTDB",
5988                  SPR_NOACCESS, SPR_NOACCESS,
5989                  &spr_read_generic, &spr_write_generic,
5990                  0x00000000);
5991     /* Memory management */
5992     gen_low_BATs(env);
5993     init_excp_7400(env);
5994     env->dcache_line_size = 32;
5995     env->icache_line_size = 32;
5996     /* Allocate hardware IRQ controller */
5997     ppc6xx_irq_init(env);
5998 }
5999
6000 POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
6001 {
6002     DeviceClass *dc = DEVICE_CLASS(oc);
6003     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6004
6005     dc->desc = "PowerPC 7410 (aka G4)";
6006     pcc->init_proc = init_proc_7410;
6007     pcc->check_pow = check_pow_hid0;
6008     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6009                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6010                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6011                        PPC_FLOAT_STFIWX |
6012                        PPC_CACHE | PPC_CACHE_ICBI |
6013                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6014                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6015                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6016                        PPC_MEM_TLBIA |
6017                        PPC_SEGMENT | PPC_EXTERN |
6018                        PPC_ALTIVEC;
6019     pcc->insns_flags2 = PPC_NONE;
6020     pcc->msr_mask = 0x000000000205FF77ULL;
6021     pcc->mmu_model = POWERPC_MMU_32B;
6022     pcc->excp_model = POWERPC_EXCP_74xx;
6023     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6024     pcc->bfd_mach = bfd_mach_ppc_7400;
6025     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6026                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6027                  POWERPC_FLAG_BUS_CLK;
6028 }
6029
6030 static void init_proc_7440 (CPUPPCState *env)
6031 {
6032     gen_spr_ne_601(env);
6033     gen_spr_7xx(env);
6034     /* Time base */
6035     gen_tbl(env);
6036     /* 74xx specific SPR */
6037     gen_spr_74xx(env);
6038     /* XXX : not implemented */
6039     spr_register(env, SPR_UBAMR, "UBAMR",
6040                  &spr_read_ureg, SPR_NOACCESS,
6041                  &spr_read_ureg, SPR_NOACCESS,
6042                  0x00000000);
6043     /* LDSTCR */
6044     /* XXX : not implemented */
6045     spr_register(env, SPR_LDSTCR, "LDSTCR",
6046                  SPR_NOACCESS, SPR_NOACCESS,
6047                  &spr_read_generic, &spr_write_generic,
6048                  0x00000000);
6049     /* ICTRL */
6050     /* XXX : not implemented */
6051     spr_register(env, SPR_ICTRL, "ICTRL",
6052                  SPR_NOACCESS, SPR_NOACCESS,
6053                  &spr_read_generic, &spr_write_generic,
6054                  0x00000000);
6055     /* MSSSR0 */
6056     /* XXX : not implemented */
6057     spr_register(env, SPR_MSSSR0, "MSSSR0",
6058                  SPR_NOACCESS, SPR_NOACCESS,
6059                  &spr_read_generic, &spr_write_generic,
6060                  0x00000000);
6061     /* PMC */
6062     /* XXX : not implemented */
6063     spr_register(env, SPR_PMC5, "PMC5",
6064                  SPR_NOACCESS, SPR_NOACCESS,
6065                  &spr_read_generic, &spr_write_generic,
6066                  0x00000000);
6067     /* XXX : not implemented */
6068     spr_register(env, SPR_UPMC5, "UPMC5",
6069                  &spr_read_ureg, SPR_NOACCESS,
6070                  &spr_read_ureg, SPR_NOACCESS,
6071                  0x00000000);
6072     /* XXX : not implemented */
6073     spr_register(env, SPR_PMC6, "PMC6",
6074                  SPR_NOACCESS, SPR_NOACCESS,
6075                  &spr_read_generic, &spr_write_generic,
6076                  0x00000000);
6077     /* XXX : not implemented */
6078     spr_register(env, SPR_UPMC6, "UPMC6",
6079                  &spr_read_ureg, SPR_NOACCESS,
6080                  &spr_read_ureg, SPR_NOACCESS,
6081                  0x00000000);
6082     /* Memory management */
6083     gen_low_BATs(env);
6084     gen_74xx_soft_tlb(env, 128, 2);
6085     init_excp_7450(env);
6086     env->dcache_line_size = 32;
6087     env->icache_line_size = 32;
6088     /* Allocate hardware IRQ controller */
6089     ppc6xx_irq_init(env);
6090 }
6091
6092 POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
6093 {
6094     DeviceClass *dc = DEVICE_CLASS(oc);
6095     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6096
6097     dc->desc = "PowerPC 7440 (aka G4)";
6098     pcc->init_proc = init_proc_7440;
6099     pcc->check_pow = check_pow_hid0_74xx;
6100     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6101                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6102                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6103                        PPC_FLOAT_STFIWX |
6104                        PPC_CACHE | PPC_CACHE_ICBI |
6105                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6106                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6107                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6108                        PPC_MEM_TLBIA | PPC_74xx_TLB |
6109                        PPC_SEGMENT | PPC_EXTERN |
6110                        PPC_ALTIVEC;
6111     pcc->insns_flags2 = PPC_NONE;
6112     pcc->msr_mask = 0x000000000205FF77ULL;
6113     pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6114     pcc->excp_model = POWERPC_EXCP_74xx;
6115     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6116     pcc->bfd_mach = bfd_mach_ppc_7400;
6117     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6118                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6119                  POWERPC_FLAG_BUS_CLK;
6120 }
6121
6122 static void init_proc_7450 (CPUPPCState *env)
6123 {
6124     gen_spr_ne_601(env);
6125     gen_spr_7xx(env);
6126     /* Time base */
6127     gen_tbl(env);
6128     /* 74xx specific SPR */
6129     gen_spr_74xx(env);
6130     /* Level 3 cache control */
6131     gen_l3_ctrl(env);
6132     /* L3ITCR1 */
6133     /* XXX : not implemented */
6134     spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6135                  SPR_NOACCESS, SPR_NOACCESS,
6136                  &spr_read_generic, &spr_write_generic,
6137                  0x00000000);
6138     /* L3ITCR2 */
6139     /* XXX : not implemented */
6140     spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6141                  SPR_NOACCESS, SPR_NOACCESS,
6142                  &spr_read_generic, &spr_write_generic,
6143                  0x00000000);
6144     /* L3ITCR3 */
6145     /* XXX : not implemented */
6146     spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6147                  SPR_NOACCESS, SPR_NOACCESS,
6148                  &spr_read_generic, &spr_write_generic,
6149                  0x00000000);
6150     /* L3OHCR */
6151     /* XXX : not implemented */
6152     spr_register(env, SPR_L3OHCR, "L3OHCR",
6153                  SPR_NOACCESS, SPR_NOACCESS,
6154                  &spr_read_generic, &spr_write_generic,
6155                  0x00000000);
6156     /* XXX : not implemented */
6157     spr_register(env, SPR_UBAMR, "UBAMR",
6158                  &spr_read_ureg, SPR_NOACCESS,
6159                  &spr_read_ureg, SPR_NOACCESS,
6160                  0x00000000);
6161     /* LDSTCR */
6162     /* XXX : not implemented */
6163     spr_register(env, SPR_LDSTCR, "LDSTCR",
6164                  SPR_NOACCESS, SPR_NOACCESS,
6165                  &spr_read_generic, &spr_write_generic,
6166                  0x00000000);
6167     /* ICTRL */
6168     /* XXX : not implemented */
6169     spr_register(env, SPR_ICTRL, "ICTRL",
6170                  SPR_NOACCESS, SPR_NOACCESS,
6171                  &spr_read_generic, &spr_write_generic,
6172                  0x00000000);
6173     /* MSSSR0 */
6174     /* XXX : not implemented */
6175     spr_register(env, SPR_MSSSR0, "MSSSR0",
6176                  SPR_NOACCESS, SPR_NOACCESS,
6177                  &spr_read_generic, &spr_write_generic,
6178                  0x00000000);
6179     /* PMC */
6180     /* XXX : not implemented */
6181     spr_register(env, SPR_PMC5, "PMC5",
6182                  SPR_NOACCESS, SPR_NOACCESS,
6183                  &spr_read_generic, &spr_write_generic,
6184                  0x00000000);
6185     /* XXX : not implemented */
6186     spr_register(env, SPR_UPMC5, "UPMC5",
6187                  &spr_read_ureg, SPR_NOACCESS,
6188                  &spr_read_ureg, SPR_NOACCESS,
6189                  0x00000000);
6190     /* XXX : not implemented */
6191     spr_register(env, SPR_PMC6, "PMC6",
6192                  SPR_NOACCESS, SPR_NOACCESS,
6193                  &spr_read_generic, &spr_write_generic,
6194                  0x00000000);
6195     /* XXX : not implemented */
6196     spr_register(env, SPR_UPMC6, "UPMC6",
6197                  &spr_read_ureg, SPR_NOACCESS,
6198                  &spr_read_ureg, SPR_NOACCESS,
6199                  0x00000000);
6200     /* Memory management */
6201     gen_low_BATs(env);
6202     gen_74xx_soft_tlb(env, 128, 2);
6203     init_excp_7450(env);
6204     env->dcache_line_size = 32;
6205     env->icache_line_size = 32;
6206     /* Allocate hardware IRQ controller */
6207     ppc6xx_irq_init(env);
6208 }
6209
6210 POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
6211 {
6212     DeviceClass *dc = DEVICE_CLASS(oc);
6213     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6214
6215     dc->desc = "PowerPC 7450 (aka G4)";
6216     pcc->init_proc = init_proc_7450;
6217     pcc->check_pow = check_pow_hid0_74xx;
6218     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6219                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6220                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6221                        PPC_FLOAT_STFIWX |
6222                        PPC_CACHE | PPC_CACHE_ICBI |
6223                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6224                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6225                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6226                        PPC_MEM_TLBIA | PPC_74xx_TLB |
6227                        PPC_SEGMENT | PPC_EXTERN |
6228                        PPC_ALTIVEC;
6229     pcc->insns_flags2 = PPC_NONE;
6230     pcc->msr_mask = 0x000000000205FF77ULL;
6231     pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6232     pcc->excp_model = POWERPC_EXCP_74xx;
6233     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6234     pcc->bfd_mach = bfd_mach_ppc_7400;
6235     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6236                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6237                  POWERPC_FLAG_BUS_CLK;
6238 }
6239
6240 static void init_proc_7445 (CPUPPCState *env)
6241 {
6242     gen_spr_ne_601(env);
6243     gen_spr_7xx(env);
6244     /* Time base */
6245     gen_tbl(env);
6246     /* 74xx specific SPR */
6247     gen_spr_74xx(env);
6248     /* LDSTCR */
6249     /* XXX : not implemented */
6250     spr_register(env, SPR_LDSTCR, "LDSTCR",
6251                  SPR_NOACCESS, SPR_NOACCESS,
6252                  &spr_read_generic, &spr_write_generic,
6253                  0x00000000);
6254     /* ICTRL */
6255     /* XXX : not implemented */
6256     spr_register(env, SPR_ICTRL, "ICTRL",
6257                  SPR_NOACCESS, SPR_NOACCESS,
6258                  &spr_read_generic, &spr_write_generic,
6259                  0x00000000);
6260     /* MSSSR0 */
6261     /* XXX : not implemented */
6262     spr_register(env, SPR_MSSSR0, "MSSSR0",
6263                  SPR_NOACCESS, SPR_NOACCESS,
6264                  &spr_read_generic, &spr_write_generic,
6265                  0x00000000);
6266     /* PMC */
6267     /* XXX : not implemented */
6268     spr_register(env, SPR_PMC5, "PMC5",
6269                  SPR_NOACCESS, SPR_NOACCESS,
6270                  &spr_read_generic, &spr_write_generic,
6271                  0x00000000);
6272     /* XXX : not implemented */
6273     spr_register(env, SPR_UPMC5, "UPMC5",
6274                  &spr_read_ureg, SPR_NOACCESS,
6275                  &spr_read_ureg, SPR_NOACCESS,
6276                  0x00000000);
6277     /* XXX : not implemented */
6278     spr_register(env, SPR_PMC6, "PMC6",
6279                  SPR_NOACCESS, SPR_NOACCESS,
6280                  &spr_read_generic, &spr_write_generic,
6281                  0x00000000);
6282     /* XXX : not implemented */
6283     spr_register(env, SPR_UPMC6, "UPMC6",
6284                  &spr_read_ureg, SPR_NOACCESS,
6285                  &spr_read_ureg, SPR_NOACCESS,
6286                  0x00000000);
6287     /* SPRGs */
6288     spr_register(env, SPR_SPRG4, "SPRG4",
6289                  SPR_NOACCESS, SPR_NOACCESS,
6290                  &spr_read_generic, &spr_write_generic,
6291                  0x00000000);
6292     spr_register(env, SPR_USPRG4, "USPRG4",
6293                  &spr_read_ureg, SPR_NOACCESS,
6294                  &spr_read_ureg, SPR_NOACCESS,
6295                  0x00000000);
6296     spr_register(env, SPR_SPRG5, "SPRG5",
6297                  SPR_NOACCESS, SPR_NOACCESS,
6298                  &spr_read_generic, &spr_write_generic,
6299                  0x00000000);
6300     spr_register(env, SPR_USPRG5, "USPRG5",
6301                  &spr_read_ureg, SPR_NOACCESS,
6302                  &spr_read_ureg, SPR_NOACCESS,
6303                  0x00000000);
6304     spr_register(env, SPR_SPRG6, "SPRG6",
6305                  SPR_NOACCESS, SPR_NOACCESS,
6306                  &spr_read_generic, &spr_write_generic,
6307                  0x00000000);
6308     spr_register(env, SPR_USPRG6, "USPRG6",
6309                  &spr_read_ureg, SPR_NOACCESS,
6310                  &spr_read_ureg, SPR_NOACCESS,
6311                  0x00000000);
6312     spr_register(env, SPR_SPRG7, "SPRG7",
6313                  SPR_NOACCESS, SPR_NOACCESS,
6314                  &spr_read_generic, &spr_write_generic,
6315                  0x00000000);
6316     spr_register(env, SPR_USPRG7, "USPRG7",
6317                  &spr_read_ureg, SPR_NOACCESS,
6318                  &spr_read_ureg, SPR_NOACCESS,
6319                  0x00000000);
6320     /* Memory management */
6321     gen_low_BATs(env);
6322     gen_high_BATs(env);
6323     gen_74xx_soft_tlb(env, 128, 2);
6324     init_excp_7450(env);
6325     env->dcache_line_size = 32;
6326     env->icache_line_size = 32;
6327     /* Allocate hardware IRQ controller */
6328     ppc6xx_irq_init(env);
6329 }
6330
6331 POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
6332 {
6333     DeviceClass *dc = DEVICE_CLASS(oc);
6334     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6335
6336     dc->desc = "PowerPC 7445 (aka G4)";
6337     pcc->init_proc = init_proc_7445;
6338     pcc->check_pow = check_pow_hid0_74xx;
6339     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6340                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6341                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6342                        PPC_FLOAT_STFIWX |
6343                        PPC_CACHE | PPC_CACHE_ICBI |
6344                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6345                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6346                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6347                        PPC_MEM_TLBIA | PPC_74xx_TLB |
6348                        PPC_SEGMENT | PPC_EXTERN |
6349                        PPC_ALTIVEC;
6350     pcc->insns_flags2 = PPC_NONE;
6351     pcc->msr_mask = 0x000000000205FF77ULL;
6352     pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6353     pcc->excp_model = POWERPC_EXCP_74xx;
6354     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6355     pcc->bfd_mach = bfd_mach_ppc_7400;
6356     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6357                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6358                  POWERPC_FLAG_BUS_CLK;
6359 }
6360
6361 static void init_proc_7455 (CPUPPCState *env)
6362 {
6363     gen_spr_ne_601(env);
6364     gen_spr_7xx(env);
6365     /* Time base */
6366     gen_tbl(env);
6367     /* 74xx specific SPR */
6368     gen_spr_74xx(env);
6369     /* Level 3 cache control */
6370     gen_l3_ctrl(env);
6371     /* LDSTCR */
6372     /* XXX : not implemented */
6373     spr_register(env, SPR_LDSTCR, "LDSTCR",
6374                  SPR_NOACCESS, SPR_NOACCESS,
6375                  &spr_read_generic, &spr_write_generic,
6376                  0x00000000);
6377     /* ICTRL */
6378     /* XXX : not implemented */
6379     spr_register(env, SPR_ICTRL, "ICTRL",
6380                  SPR_NOACCESS, SPR_NOACCESS,
6381                  &spr_read_generic, &spr_write_generic,
6382                  0x00000000);
6383     /* MSSSR0 */
6384     /* XXX : not implemented */
6385     spr_register(env, SPR_MSSSR0, "MSSSR0",
6386                  SPR_NOACCESS, SPR_NOACCESS,
6387                  &spr_read_generic, &spr_write_generic,
6388                  0x00000000);
6389     /* PMC */
6390     /* XXX : not implemented */
6391     spr_register(env, SPR_PMC5, "PMC5",
6392                  SPR_NOACCESS, SPR_NOACCESS,
6393                  &spr_read_generic, &spr_write_generic,
6394                  0x00000000);
6395     /* XXX : not implemented */
6396     spr_register(env, SPR_UPMC5, "UPMC5",
6397                  &spr_read_ureg, SPR_NOACCESS,
6398                  &spr_read_ureg, SPR_NOACCESS,
6399                  0x00000000);
6400     /* XXX : not implemented */
6401     spr_register(env, SPR_PMC6, "PMC6",
6402                  SPR_NOACCESS, SPR_NOACCESS,
6403                  &spr_read_generic, &spr_write_generic,
6404                  0x00000000);
6405     /* XXX : not implemented */
6406     spr_register(env, SPR_UPMC6, "UPMC6",
6407                  &spr_read_ureg, SPR_NOACCESS,
6408                  &spr_read_ureg, SPR_NOACCESS,
6409                  0x00000000);
6410     /* SPRGs */
6411     spr_register(env, SPR_SPRG4, "SPRG4",
6412                  SPR_NOACCESS, SPR_NOACCESS,
6413                  &spr_read_generic, &spr_write_generic,
6414                  0x00000000);
6415     spr_register(env, SPR_USPRG4, "USPRG4",
6416                  &spr_read_ureg, SPR_NOACCESS,
6417                  &spr_read_ureg, SPR_NOACCESS,
6418                  0x00000000);
6419     spr_register(env, SPR_SPRG5, "SPRG5",
6420                  SPR_NOACCESS, SPR_NOACCESS,
6421                  &spr_read_generic, &spr_write_generic,
6422                  0x00000000);
6423     spr_register(env, SPR_USPRG5, "USPRG5",
6424                  &spr_read_ureg, SPR_NOACCESS,
6425                  &spr_read_ureg, SPR_NOACCESS,
6426                  0x00000000);
6427     spr_register(env, SPR_SPRG6, "SPRG6",
6428                  SPR_NOACCESS, SPR_NOACCESS,
6429                  &spr_read_generic, &spr_write_generic,
6430                  0x00000000);
6431     spr_register(env, SPR_USPRG6, "USPRG6",
6432                  &spr_read_ureg, SPR_NOACCESS,
6433                  &spr_read_ureg, SPR_NOACCESS,
6434                  0x00000000);
6435     spr_register(env, SPR_SPRG7, "SPRG7",
6436                  SPR_NOACCESS, SPR_NOACCESS,
6437                  &spr_read_generic, &spr_write_generic,
6438                  0x00000000);
6439     spr_register(env, SPR_USPRG7, "USPRG7",
6440                  &spr_read_ureg, SPR_NOACCESS,
6441                  &spr_read_ureg, SPR_NOACCESS,
6442                  0x00000000);
6443     /* Memory management */
6444     gen_low_BATs(env);
6445     gen_high_BATs(env);
6446     gen_74xx_soft_tlb(env, 128, 2);
6447     init_excp_7450(env);
6448     env->dcache_line_size = 32;
6449     env->icache_line_size = 32;
6450     /* Allocate hardware IRQ controller */
6451     ppc6xx_irq_init(env);
6452 }
6453
6454 POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
6455 {
6456     DeviceClass *dc = DEVICE_CLASS(oc);
6457     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6458
6459     dc->desc = "PowerPC 7455 (aka G4)";
6460     pcc->init_proc = init_proc_7455;
6461     pcc->check_pow = check_pow_hid0_74xx;
6462     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6463                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6464                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6465                        PPC_FLOAT_STFIWX |
6466                        PPC_CACHE | PPC_CACHE_ICBI |
6467                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6468                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6469                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6470                        PPC_MEM_TLBIA | PPC_74xx_TLB |
6471                        PPC_SEGMENT | PPC_EXTERN |
6472                        PPC_ALTIVEC;
6473     pcc->insns_flags2 = PPC_NONE;
6474     pcc->msr_mask = 0x000000000205FF77ULL;
6475     pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6476     pcc->excp_model = POWERPC_EXCP_74xx;
6477     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6478     pcc->bfd_mach = bfd_mach_ppc_7400;
6479     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6480                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6481                  POWERPC_FLAG_BUS_CLK;
6482 }
6483
6484 static void init_proc_7457 (CPUPPCState *env)
6485 {
6486     gen_spr_ne_601(env);
6487     gen_spr_7xx(env);
6488     /* Time base */
6489     gen_tbl(env);
6490     /* 74xx specific SPR */
6491     gen_spr_74xx(env);
6492     /* Level 3 cache control */
6493     gen_l3_ctrl(env);
6494     /* L3ITCR1 */
6495     /* XXX : not implemented */
6496     spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6497                  SPR_NOACCESS, SPR_NOACCESS,
6498                  &spr_read_generic, &spr_write_generic,
6499                  0x00000000);
6500     /* L3ITCR2 */
6501     /* XXX : not implemented */
6502     spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6503                  SPR_NOACCESS, SPR_NOACCESS,
6504                  &spr_read_generic, &spr_write_generic,
6505                  0x00000000);
6506     /* L3ITCR3 */
6507     /* XXX : not implemented */
6508     spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6509                  SPR_NOACCESS, SPR_NOACCESS,
6510                  &spr_read_generic, &spr_write_generic,
6511                  0x00000000);
6512     /* L3OHCR */
6513     /* XXX : not implemented */
6514     spr_register(env, SPR_L3OHCR, "L3OHCR",
6515                  SPR_NOACCESS, SPR_NOACCESS,
6516                  &spr_read_generic, &spr_write_generic,
6517                  0x00000000);
6518     /* LDSTCR */
6519     /* XXX : not implemented */
6520     spr_register(env, SPR_LDSTCR, "LDSTCR",
6521                  SPR_NOACCESS, SPR_NOACCESS,
6522                  &spr_read_generic, &spr_write_generic,
6523                  0x00000000);
6524     /* ICTRL */
6525     /* XXX : not implemented */
6526     spr_register(env, SPR_ICTRL, "ICTRL",
6527                  SPR_NOACCESS, SPR_NOACCESS,
6528                  &spr_read_generic, &spr_write_generic,
6529                  0x00000000);
6530     /* MSSSR0 */
6531     /* XXX : not implemented */
6532     spr_register(env, SPR_MSSSR0, "MSSSR0",
6533                  SPR_NOACCESS, SPR_NOACCESS,
6534                  &spr_read_generic, &spr_write_generic,
6535                  0x00000000);
6536     /* PMC */
6537     /* XXX : not implemented */
6538     spr_register(env, SPR_PMC5, "PMC5",
6539                  SPR_NOACCESS, SPR_NOACCESS,
6540                  &spr_read_generic, &spr_write_generic,
6541                  0x00000000);
6542     /* XXX : not implemented */
6543     spr_register(env, SPR_UPMC5, "UPMC5",
6544                  &spr_read_ureg, SPR_NOACCESS,
6545                  &spr_read_ureg, SPR_NOACCESS,
6546                  0x00000000);
6547     /* XXX : not implemented */
6548     spr_register(env, SPR_PMC6, "PMC6",
6549                  SPR_NOACCESS, SPR_NOACCESS,
6550                  &spr_read_generic, &spr_write_generic,
6551                  0x00000000);
6552     /* XXX : not implemented */
6553     spr_register(env, SPR_UPMC6, "UPMC6",
6554                  &spr_read_ureg, SPR_NOACCESS,
6555                  &spr_read_ureg, SPR_NOACCESS,
6556                  0x00000000);
6557     /* SPRGs */
6558     spr_register(env, SPR_SPRG4, "SPRG4",
6559                  SPR_NOACCESS, SPR_NOACCESS,
6560                  &spr_read_generic, &spr_write_generic,
6561                  0x00000000);
6562     spr_register(env, SPR_USPRG4, "USPRG4",
6563                  &spr_read_ureg, SPR_NOACCESS,
6564                  &spr_read_ureg, SPR_NOACCESS,
6565                  0x00000000);
6566     spr_register(env, SPR_SPRG5, "SPRG5",
6567                  SPR_NOACCESS, SPR_NOACCESS,
6568                  &spr_read_generic, &spr_write_generic,
6569                  0x00000000);
6570     spr_register(env, SPR_USPRG5, "USPRG5",
6571                  &spr_read_ureg, SPR_NOACCESS,
6572                  &spr_read_ureg, SPR_NOACCESS,
6573                  0x00000000);
6574     spr_register(env, SPR_SPRG6, "SPRG6",
6575                  SPR_NOACCESS, SPR_NOACCESS,
6576                  &spr_read_generic, &spr_write_generic,
6577                  0x00000000);
6578     spr_register(env, SPR_USPRG6, "USPRG6",
6579                  &spr_read_ureg, SPR_NOACCESS,
6580                  &spr_read_ureg, SPR_NOACCESS,
6581                  0x00000000);
6582     spr_register(env, SPR_SPRG7, "SPRG7",
6583                  SPR_NOACCESS, SPR_NOACCESS,
6584                  &spr_read_generic, &spr_write_generic,
6585                  0x00000000);
6586     spr_register(env, SPR_USPRG7, "USPRG7",
6587                  &spr_read_ureg, SPR_NOACCESS,
6588                  &spr_read_ureg, SPR_NOACCESS,
6589                  0x00000000);
6590     /* Memory management */
6591     gen_low_BATs(env);
6592     gen_high_BATs(env);
6593     gen_74xx_soft_tlb(env, 128, 2);
6594     init_excp_7450(env);
6595     env->dcache_line_size = 32;
6596     env->icache_line_size = 32;
6597     /* Allocate hardware IRQ controller */
6598     ppc6xx_irq_init(env);
6599 }
6600
6601 POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
6602 {
6603     DeviceClass *dc = DEVICE_CLASS(oc);
6604     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6605
6606     dc->desc = "PowerPC 7457 (aka G4)";
6607     pcc->init_proc = init_proc_7457;
6608     pcc->check_pow = check_pow_hid0_74xx;
6609     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6610                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6611                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6612                        PPC_FLOAT_STFIWX |
6613                        PPC_CACHE | PPC_CACHE_ICBI |
6614                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6615                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6616                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6617                        PPC_MEM_TLBIA | PPC_74xx_TLB |
6618                        PPC_SEGMENT | PPC_EXTERN |
6619                        PPC_ALTIVEC;
6620     pcc->insns_flags2 = PPC_NONE;
6621     pcc->msr_mask = 0x000000000205FF77ULL;
6622     pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6623     pcc->excp_model = POWERPC_EXCP_74xx;
6624     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6625     pcc->bfd_mach = bfd_mach_ppc_7400;
6626     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6627                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6628                  POWERPC_FLAG_BUS_CLK;
6629 }
6630
6631 #if defined (TARGET_PPC64)
6632 #if defined(CONFIG_USER_ONLY)
6633 #define POWERPC970_HID5_INIT 0x00000080
6634 #else
6635 #define POWERPC970_HID5_INIT 0x00000000
6636 #endif
6637
6638 static int check_pow_970 (CPUPPCState *env)
6639 {
6640     if (env->spr[SPR_HID0] & 0x00600000)
6641         return 1;
6642
6643     return 0;
6644 }
6645
6646 static void init_proc_970 (CPUPPCState *env)
6647 {
6648     gen_spr_ne_601(env);
6649     gen_spr_7xx(env);
6650     /* Time base */
6651     gen_tbl(env);
6652     /* Hardware implementation registers */
6653     /* XXX : not implemented */
6654     spr_register(env, SPR_HID0, "HID0",
6655                  SPR_NOACCESS, SPR_NOACCESS,
6656                  &spr_read_generic, &spr_write_clear,
6657                  0x60000000);
6658     /* XXX : not implemented */
6659     spr_register(env, SPR_HID1, "HID1",
6660                  SPR_NOACCESS, SPR_NOACCESS,
6661                  &spr_read_generic, &spr_write_generic,
6662                  0x00000000);
6663     /* XXX : not implemented */
6664     spr_register(env, SPR_750FX_HID2, "HID2",
6665                  SPR_NOACCESS, SPR_NOACCESS,
6666                  &spr_read_generic, &spr_write_generic,
6667                  0x00000000);
6668     /* XXX : not implemented */
6669     spr_register(env, SPR_970_HID5, "HID5",
6670                  SPR_NOACCESS, SPR_NOACCESS,
6671                  &spr_read_generic, &spr_write_generic,
6672                  POWERPC970_HID5_INIT);
6673     /* XXX : not implemented */
6674     spr_register(env, SPR_L2CR, "L2CR",
6675                  SPR_NOACCESS, SPR_NOACCESS,
6676                  &spr_read_generic, &spr_write_generic,
6677                  0x00000000);
6678     /* Memory management */
6679     /* XXX: not correct */
6680     gen_low_BATs(env);
6681     /* XXX : not implemented */
6682     spr_register(env, SPR_MMUCFG, "MMUCFG",
6683                  SPR_NOACCESS, SPR_NOACCESS,
6684                  &spr_read_generic, SPR_NOACCESS,
6685                  0x00000000); /* TOFIX */
6686     /* XXX : not implemented */
6687     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6688                  SPR_NOACCESS, SPR_NOACCESS,
6689                  &spr_read_generic, &spr_write_generic,
6690                  0x00000000); /* TOFIX */
6691     spr_register(env, SPR_HIOR, "SPR_HIOR",
6692                  SPR_NOACCESS, SPR_NOACCESS,
6693                  &spr_read_hior, &spr_write_hior,
6694                  0x00000000);
6695 #if !defined(CONFIG_USER_ONLY)
6696     env->slb_nr = 32;
6697 #endif
6698     init_excp_970(env);
6699     env->dcache_line_size = 128;
6700     env->icache_line_size = 128;
6701     /* Allocate hardware IRQ controller */
6702     ppc970_irq_init(env);
6703     /* Can't find information on what this should be on reset.  This
6704      * value is the one used by 74xx processors. */
6705     vscr_init(env, 0x00010000);
6706 }
6707
6708 POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
6709 {
6710     DeviceClass *dc = DEVICE_CLASS(oc);
6711     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6712
6713     dc->desc = "PowerPC 970";
6714     pcc->init_proc = init_proc_970;
6715     pcc->check_pow = check_pow_970;
6716     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6717                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6718                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6719                        PPC_FLOAT_STFIWX |
6720                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6721                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6722                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6723                        PPC_64B | PPC_ALTIVEC |
6724                        PPC_SEGMENT_64B | PPC_SLBI;
6725     pcc->insns_flags2 = PPC_NONE;
6726     pcc->msr_mask = 0x900000000204FF36ULL;
6727     pcc->mmu_model = POWERPC_MMU_64B;
6728     pcc->excp_model = POWERPC_EXCP_970;
6729     pcc->bus_model = PPC_FLAGS_INPUT_970;
6730     pcc->bfd_mach = bfd_mach_ppc64;
6731     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6732                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6733                  POWERPC_FLAG_BUS_CLK;
6734 }
6735
6736 static int check_pow_970FX (CPUPPCState *env)
6737 {
6738     if (env->spr[SPR_HID0] & 0x00600000)
6739         return 1;
6740
6741     return 0;
6742 }
6743
6744 static void init_proc_970FX (CPUPPCState *env)
6745 {
6746     gen_spr_ne_601(env);
6747     gen_spr_7xx(env);
6748     /* Time base */
6749     gen_tbl(env);
6750     /* Hardware implementation registers */
6751     /* XXX : not implemented */
6752     spr_register(env, SPR_HID0, "HID0",
6753                  SPR_NOACCESS, SPR_NOACCESS,
6754                  &spr_read_generic, &spr_write_clear,
6755                  0x60000000);
6756     /* XXX : not implemented */
6757     spr_register(env, SPR_HID1, "HID1",
6758                  SPR_NOACCESS, SPR_NOACCESS,
6759                  &spr_read_generic, &spr_write_generic,
6760                  0x00000000);
6761     /* XXX : not implemented */
6762     spr_register(env, SPR_750FX_HID2, "HID2",
6763                  SPR_NOACCESS, SPR_NOACCESS,
6764                  &spr_read_generic, &spr_write_generic,
6765                  0x00000000);
6766     /* XXX : not implemented */
6767     spr_register(env, SPR_970_HID5, "HID5",
6768                  SPR_NOACCESS, SPR_NOACCESS,
6769                  &spr_read_generic, &spr_write_generic,
6770                  POWERPC970_HID5_INIT);
6771     /* XXX : not implemented */
6772     spr_register(env, SPR_L2CR, "L2CR",
6773                  SPR_NOACCESS, SPR_NOACCESS,
6774                  &spr_read_generic, &spr_write_generic,
6775                  0x00000000);
6776     /* Memory management */
6777     /* XXX: not correct */
6778     gen_low_BATs(env);
6779     /* XXX : not implemented */
6780     spr_register(env, SPR_MMUCFG, "MMUCFG",
6781                  SPR_NOACCESS, SPR_NOACCESS,
6782                  &spr_read_generic, SPR_NOACCESS,
6783                  0x00000000); /* TOFIX */
6784     /* XXX : not implemented */
6785     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6786                  SPR_NOACCESS, SPR_NOACCESS,
6787                  &spr_read_generic, &spr_write_generic,
6788                  0x00000000); /* TOFIX */
6789     spr_register(env, SPR_HIOR, "SPR_HIOR",
6790                  SPR_NOACCESS, SPR_NOACCESS,
6791                  &spr_read_hior, &spr_write_hior,
6792                  0x00000000);
6793     spr_register(env, SPR_CTRL, "SPR_CTRL",
6794                  SPR_NOACCESS, SPR_NOACCESS,
6795                  &spr_read_generic, &spr_write_generic,
6796                  0x00000000);
6797     spr_register(env, SPR_UCTRL, "SPR_UCTRL",
6798                  SPR_NOACCESS, SPR_NOACCESS,
6799                  &spr_read_generic, &spr_write_generic,
6800                  0x00000000);
6801     spr_register(env, SPR_VRSAVE, "SPR_VRSAVE",
6802                  &spr_read_generic, &spr_write_generic,
6803                  &spr_read_generic, &spr_write_generic,
6804                  0x00000000);
6805 #if !defined(CONFIG_USER_ONLY)
6806     env->slb_nr = 64;
6807 #endif
6808     init_excp_970(env);
6809     env->dcache_line_size = 128;
6810     env->icache_line_size = 128;
6811     /* Allocate hardware IRQ controller */
6812     ppc970_irq_init(env);
6813     /* Can't find information on what this should be on reset.  This
6814      * value is the one used by 74xx processors. */
6815     vscr_init(env, 0x00010000);
6816 }
6817
6818 POWERPC_FAMILY(970FX)(ObjectClass *oc, void *data)
6819 {
6820     DeviceClass *dc = DEVICE_CLASS(oc);
6821     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6822
6823     dc->desc = "PowerPC 970FX (aka G5)";
6824     pcc->init_proc = init_proc_970FX;
6825     pcc->check_pow = check_pow_970FX;
6826     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6827                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6828                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6829                        PPC_FLOAT_STFIWX |
6830                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6831                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6832                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6833                        PPC_64B | PPC_ALTIVEC |
6834                        PPC_SEGMENT_64B | PPC_SLBI;
6835     pcc->insns_flags2 = PPC_NONE;
6836     pcc->msr_mask = 0x800000000204FF36ULL;
6837     pcc->mmu_model = POWERPC_MMU_64B;
6838     pcc->excp_model = POWERPC_EXCP_970;
6839     pcc->bus_model = PPC_FLAGS_INPUT_970;
6840     pcc->bfd_mach = bfd_mach_ppc64;
6841     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6842                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6843                  POWERPC_FLAG_BUS_CLK;
6844 }
6845
6846 static int check_pow_970GX (CPUPPCState *env)
6847 {
6848     if (env->spr[SPR_HID0] & 0x00600000)
6849         return 1;
6850
6851     return 0;
6852 }
6853
6854 static void init_proc_970GX (CPUPPCState *env)
6855 {
6856     gen_spr_ne_601(env);
6857     gen_spr_7xx(env);
6858     /* Time base */
6859     gen_tbl(env);
6860     /* Hardware implementation registers */
6861     /* XXX : not implemented */
6862     spr_register(env, SPR_HID0, "HID0",
6863                  SPR_NOACCESS, SPR_NOACCESS,
6864                  &spr_read_generic, &spr_write_clear,
6865                  0x60000000);
6866     /* XXX : not implemented */
6867     spr_register(env, SPR_HID1, "HID1",
6868                  SPR_NOACCESS, SPR_NOACCESS,
6869                  &spr_read_generic, &spr_write_generic,
6870                  0x00000000);
6871     /* XXX : not implemented */
6872     spr_register(env, SPR_750FX_HID2, "HID2",
6873                  SPR_NOACCESS, SPR_NOACCESS,
6874                  &spr_read_generic, &spr_write_generic,
6875                  0x00000000);
6876     /* XXX : not implemented */
6877     spr_register(env, SPR_970_HID5, "HID5",
6878                  SPR_NOACCESS, SPR_NOACCESS,
6879                  &spr_read_generic, &spr_write_generic,
6880                  POWERPC970_HID5_INIT);
6881     /* XXX : not implemented */
6882     spr_register(env, SPR_L2CR, "L2CR",
6883                  SPR_NOACCESS, SPR_NOACCESS,
6884                  &spr_read_generic, &spr_write_generic,
6885                  0x00000000);
6886     /* Memory management */
6887     /* XXX: not correct */
6888     gen_low_BATs(env);
6889     /* XXX : not implemented */
6890     spr_register(env, SPR_MMUCFG, "MMUCFG",
6891                  SPR_NOACCESS, SPR_NOACCESS,
6892                  &spr_read_generic, SPR_NOACCESS,
6893                  0x00000000); /* TOFIX */
6894     /* XXX : not implemented */
6895     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6896                  SPR_NOACCESS, SPR_NOACCESS,
6897                  &spr_read_generic, &spr_write_generic,
6898                  0x00000000); /* TOFIX */
6899     spr_register(env, SPR_HIOR, "SPR_HIOR",
6900                  SPR_NOACCESS, SPR_NOACCESS,
6901                  &spr_read_hior, &spr_write_hior,
6902                  0x00000000);
6903 #if !defined(CONFIG_USER_ONLY)
6904     env->slb_nr = 32;
6905 #endif
6906     init_excp_970(env);
6907     env->dcache_line_size = 128;
6908     env->icache_line_size = 128;
6909     /* Allocate hardware IRQ controller */
6910     ppc970_irq_init(env);
6911     /* Can't find information on what this should be on reset.  This
6912      * value is the one used by 74xx processors. */
6913     vscr_init(env, 0x00010000);
6914 }
6915
6916 POWERPC_FAMILY(970GX)(ObjectClass *oc, void *data)
6917 {
6918     DeviceClass *dc = DEVICE_CLASS(oc);
6919     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6920
6921     dc->desc = "PowerPC 970 GX";
6922     pcc->init_proc = init_proc_970GX;
6923     pcc->check_pow = check_pow_970GX;
6924     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6925                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6926                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6927                        PPC_FLOAT_STFIWX |
6928                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6929                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6930                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6931                        PPC_64B | PPC_ALTIVEC |
6932                        PPC_SEGMENT_64B | PPC_SLBI;
6933     pcc->insns_flags2 = PPC_NONE;
6934     pcc->msr_mask = 0x800000000204FF36ULL;
6935     pcc->mmu_model = POWERPC_MMU_64B;
6936     pcc->excp_model = POWERPC_EXCP_970;
6937     pcc->bus_model = PPC_FLAGS_INPUT_970;
6938     pcc->bfd_mach = bfd_mach_ppc64;
6939     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6940                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6941                  POWERPC_FLAG_BUS_CLK;
6942 }
6943
6944 static int check_pow_970MP (CPUPPCState *env)
6945 {
6946     if (env->spr[SPR_HID0] & 0x01C00000)
6947         return 1;
6948
6949     return 0;
6950 }
6951
6952 static void init_proc_970MP (CPUPPCState *env)
6953 {
6954     gen_spr_ne_601(env);
6955     gen_spr_7xx(env);
6956     /* Time base */
6957     gen_tbl(env);
6958     /* Hardware implementation registers */
6959     /* XXX : not implemented */
6960     spr_register(env, SPR_HID0, "HID0",
6961                  SPR_NOACCESS, SPR_NOACCESS,
6962                  &spr_read_generic, &spr_write_clear,
6963                  0x60000000);
6964     /* XXX : not implemented */
6965     spr_register(env, SPR_HID1, "HID1",
6966                  SPR_NOACCESS, SPR_NOACCESS,
6967                  &spr_read_generic, &spr_write_generic,
6968                  0x00000000);
6969     /* XXX : not implemented */
6970     spr_register(env, SPR_750FX_HID2, "HID2",
6971                  SPR_NOACCESS, SPR_NOACCESS,
6972                  &spr_read_generic, &spr_write_generic,
6973                  0x00000000);
6974     /* XXX : not implemented */
6975     spr_register(env, SPR_970_HID5, "HID5",
6976                  SPR_NOACCESS, SPR_NOACCESS,
6977                  &spr_read_generic, &spr_write_generic,
6978                  POWERPC970_HID5_INIT);
6979     /* XXX : not implemented */
6980     spr_register(env, SPR_L2CR, "L2CR",
6981                  SPR_NOACCESS, SPR_NOACCESS,
6982                  &spr_read_generic, &spr_write_generic,
6983                  0x00000000);
6984     /* Memory management */
6985     /* XXX: not correct */
6986     gen_low_BATs(env);
6987     /* XXX : not implemented */
6988     spr_register(env, SPR_MMUCFG, "MMUCFG",
6989                  SPR_NOACCESS, SPR_NOACCESS,
6990                  &spr_read_generic, SPR_NOACCESS,
6991                  0x00000000); /* TOFIX */
6992     /* XXX : not implemented */
6993     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6994                  SPR_NOACCESS, SPR_NOACCESS,
6995                  &spr_read_generic, &spr_write_generic,
6996                  0x00000000); /* TOFIX */
6997     spr_register(env, SPR_HIOR, "SPR_HIOR",
6998                  SPR_NOACCESS, SPR_NOACCESS,
6999                  &spr_read_hior, &spr_write_hior,
7000                  0x00000000);
7001 #if !defined(CONFIG_USER_ONLY)
7002     env->slb_nr = 32;
7003 #endif
7004     init_excp_970(env);
7005     env->dcache_line_size = 128;
7006     env->icache_line_size = 128;
7007     /* Allocate hardware IRQ controller */
7008     ppc970_irq_init(env);
7009     /* Can't find information on what this should be on reset.  This
7010      * value is the one used by 74xx processors. */
7011     vscr_init(env, 0x00010000);
7012 }
7013
7014 POWERPC_FAMILY(970MP)(ObjectClass *oc, void *data)
7015 {
7016     DeviceClass *dc = DEVICE_CLASS(oc);
7017     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7018
7019     dc->desc = "PowerPC 970 MP";
7020     pcc->init_proc = init_proc_970MP;
7021     pcc->check_pow = check_pow_970MP;
7022     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7023                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7024                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7025                        PPC_FLOAT_STFIWX |
7026                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7027                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
7028                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7029                        PPC_64B | PPC_ALTIVEC |
7030                        PPC_SEGMENT_64B | PPC_SLBI;
7031     pcc->insns_flags2 = PPC_NONE;
7032     pcc->msr_mask = 0x900000000204FF36ULL;
7033     pcc->mmu_model = POWERPC_MMU_64B;
7034     pcc->excp_model = POWERPC_EXCP_970;
7035     pcc->bus_model = PPC_FLAGS_INPUT_970;
7036     pcc->bfd_mach = bfd_mach_ppc64;
7037     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7038                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7039                  POWERPC_FLAG_BUS_CLK;
7040 }
7041
7042 static void init_proc_POWER7 (CPUPPCState *env)
7043 {
7044     gen_spr_ne_601(env);
7045     gen_spr_7xx(env);
7046     /* Time base */
7047     gen_tbl(env);
7048     /* Processor identification */
7049     spr_register(env, SPR_PIR, "PIR",
7050                  SPR_NOACCESS, SPR_NOACCESS,
7051                  &spr_read_generic, &spr_write_pir,
7052                  0x00000000);
7053 #if !defined(CONFIG_USER_ONLY)
7054     /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
7055     spr_register_kvm(env, SPR_PURR,   "PURR",
7056                      &spr_read_purr, SPR_NOACCESS,
7057                      &spr_read_purr, SPR_NOACCESS,
7058                      KVM_REG_PPC_PURR, 0x00000000);
7059     spr_register_kvm(env, SPR_SPURR,   "SPURR",
7060                      &spr_read_purr, SPR_NOACCESS,
7061                      &spr_read_purr, SPR_NOACCESS,
7062                      KVM_REG_PPC_SPURR, 0x00000000);
7063     spr_register(env, SPR_CFAR, "SPR_CFAR",
7064                  SPR_NOACCESS, SPR_NOACCESS,
7065                  &spr_read_cfar, &spr_write_cfar,
7066                  0x00000000);
7067     spr_register_kvm(env, SPR_DSCR, "SPR_DSCR",
7068                      SPR_NOACCESS, SPR_NOACCESS,
7069                      &spr_read_generic, &spr_write_generic,
7070                      KVM_REG_PPC_DSCR, 0x00000000);
7071 #endif /* !CONFIG_USER_ONLY */
7072     /* Memory management */
7073     /* XXX : not implemented */
7074     spr_register(env, SPR_MMUCFG, "MMUCFG",
7075                  SPR_NOACCESS, SPR_NOACCESS,
7076                  &spr_read_generic, SPR_NOACCESS,
7077                  0x00000000); /* TOFIX */
7078     /* XXX : not implemented */
7079     spr_register(env, SPR_CTRL, "SPR_CTRLT",
7080                  SPR_NOACCESS, SPR_NOACCESS,
7081                  &spr_read_generic, &spr_write_generic,
7082                  0x80800000);
7083     spr_register(env, SPR_UCTRL, "SPR_CTRLF",
7084                  SPR_NOACCESS, SPR_NOACCESS,
7085                  &spr_read_generic, &spr_write_generic,
7086                  0x80800000);
7087     spr_register(env, SPR_VRSAVE, "SPR_VRSAVE",
7088                  &spr_read_generic, &spr_write_generic,
7089                  &spr_read_generic, &spr_write_generic,
7090                  0x00000000);
7091 #if !defined(CONFIG_USER_ONLY)
7092     env->slb_nr = 32;
7093 #endif
7094     init_excp_POWER7(env);
7095     env->dcache_line_size = 128;
7096     env->icache_line_size = 128;
7097     /* Allocate hardware IRQ controller */
7098     ppcPOWER7_irq_init(env);
7099     /* Can't find information on what this should be on reset.  This
7100      * value is the one used by 74xx processors. */
7101     vscr_init(env, 0x00010000);
7102 }
7103
7104 POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
7105 {
7106     DeviceClass *dc = DEVICE_CLASS(oc);
7107     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7108
7109     dc->desc = "POWER7";
7110     pcc->init_proc = init_proc_POWER7;
7111     pcc->check_pow = check_pow_nocheck;
7112     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7113                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7114                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7115                        PPC_FLOAT_STFIWX |
7116                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7117                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
7118                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7119                        PPC_64B | PPC_ALTIVEC |
7120                        PPC_SEGMENT_64B | PPC_SLBI |
7121                        PPC_POPCNTB | PPC_POPCNTWD;
7122     pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX;
7123     pcc->msr_mask = 0x800000000204FF36ULL;
7124     pcc->mmu_model = POWERPC_MMU_2_06;
7125     pcc->excp_model = POWERPC_EXCP_POWER7;
7126     pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
7127     pcc->bfd_mach = bfd_mach_ppc64;
7128     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7129                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7130                  POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR;
7131 }
7132
7133 static void init_proc_620 (CPUPPCState *env)
7134 {
7135     gen_spr_ne_601(env);
7136     gen_spr_620(env);
7137     /* Time base */
7138     gen_tbl(env);
7139     /* Hardware implementation registers */
7140     /* XXX : not implemented */
7141     spr_register(env, SPR_HID0, "HID0",
7142                  SPR_NOACCESS, SPR_NOACCESS,
7143                  &spr_read_generic, &spr_write_generic,
7144                  0x00000000);
7145     /* Memory management */
7146     gen_low_BATs(env);
7147     init_excp_620(env);
7148     env->dcache_line_size = 64;
7149     env->icache_line_size = 64;
7150     /* Allocate hardware IRQ controller */
7151     ppc6xx_irq_init(env);
7152 }
7153
7154 POWERPC_FAMILY(620)(ObjectClass *oc, void *data)
7155 {
7156     DeviceClass *dc = DEVICE_CLASS(oc);
7157     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7158
7159     dc->desc = "PowerPC 620";
7160     pcc->init_proc = init_proc_620;
7161     pcc->check_pow = check_pow_nocheck; /* Check this */
7162     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7163                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7164                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7165                        PPC_FLOAT_STFIWX |
7166                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7167                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
7168                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7169                        PPC_SEGMENT | PPC_EXTERN |
7170                        PPC_64B | PPC_SLBI;
7171     pcc->insns_flags2 = PPC_NONE;
7172     pcc->msr_mask = 0x800000000005FF77ULL;
7173     pcc->mmu_model = POWERPC_MMU_620;
7174     pcc->excp_model = POWERPC_EXCP_970;
7175     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7176     pcc->bfd_mach = bfd_mach_ppc64;
7177     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
7178                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
7179 }
7180
7181 #endif /* defined (TARGET_PPC64) */
7182
7183
7184 /*****************************************************************************/
7185 /* Generic CPU instantiation routine                                         */
7186 static void init_ppc_proc(PowerPCCPU *cpu)
7187 {
7188     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7189     CPUPPCState *env = &cpu->env;
7190 #if !defined(CONFIG_USER_ONLY)
7191     int i;
7192
7193     env->irq_inputs = NULL;
7194     /* Set all exception vectors to an invalid address */
7195     for (i = 0; i < POWERPC_EXCP_NB; i++)
7196         env->excp_vectors[i] = (target_ulong)(-1ULL);
7197     env->hreset_excp_prefix = 0x00000000;
7198     env->ivor_mask = 0x00000000;
7199     env->ivpr_mask = 0x00000000;
7200     /* Default MMU definitions */
7201     env->nb_BATs = 0;
7202     env->nb_tlb = 0;
7203     env->nb_ways = 0;
7204     env->tlb_type = TLB_NONE;
7205 #endif
7206     /* Register SPR common to all PowerPC implementations */
7207     gen_spr_generic(env);
7208     spr_register(env, SPR_PVR, "PVR",
7209                  /* Linux permits userspace to read PVR */
7210 #if defined(CONFIG_LINUX_USER)
7211                  &spr_read_generic,
7212 #else
7213                  SPR_NOACCESS,
7214 #endif
7215                  SPR_NOACCESS,
7216                  &spr_read_generic, SPR_NOACCESS,
7217                  pcc->pvr);
7218     /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
7219     if (pcc->svr != POWERPC_SVR_NONE) {
7220         if (pcc->svr & POWERPC_SVR_E500) {
7221             spr_register(env, SPR_E500_SVR, "SVR",
7222                          SPR_NOACCESS, SPR_NOACCESS,
7223                          &spr_read_generic, SPR_NOACCESS,
7224                          pcc->svr & ~POWERPC_SVR_E500);
7225         } else {
7226             spr_register(env, SPR_SVR, "SVR",
7227                          SPR_NOACCESS, SPR_NOACCESS,
7228                          &spr_read_generic, SPR_NOACCESS,
7229                          pcc->svr);
7230         }
7231     }
7232     /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
7233     (*pcc->init_proc)(env);
7234 #if !defined(CONFIG_USER_ONLY)
7235     env->excp_prefix = env->hreset_excp_prefix;
7236 #endif
7237     /* MSR bits & flags consistency checks */
7238     if (env->msr_mask & (1 << 25)) {
7239         switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
7240         case POWERPC_FLAG_SPE:
7241         case POWERPC_FLAG_VRE:
7242             break;
7243         default:
7244             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7245                     "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
7246             exit(1);
7247         }
7248     } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
7249         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7250                 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
7251         exit(1);
7252     }
7253     if (env->msr_mask & (1 << 17)) {
7254         switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
7255         case POWERPC_FLAG_TGPR:
7256         case POWERPC_FLAG_CE:
7257             break;
7258         default:
7259             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7260                     "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
7261             exit(1);
7262         }
7263     } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
7264         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7265                 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
7266         exit(1);
7267     }
7268     if (env->msr_mask & (1 << 10)) {
7269         switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
7270                               POWERPC_FLAG_UBLE)) {
7271         case POWERPC_FLAG_SE:
7272         case POWERPC_FLAG_DWE:
7273         case POWERPC_FLAG_UBLE:
7274             break;
7275         default:
7276             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7277                     "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
7278                     "POWERPC_FLAG_UBLE\n");
7279             exit(1);
7280         }
7281     } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
7282                              POWERPC_FLAG_UBLE)) {
7283         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7284                 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
7285                 "POWERPC_FLAG_UBLE\n");
7286             exit(1);
7287     }
7288     if (env->msr_mask & (1 << 9)) {
7289         switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
7290         case POWERPC_FLAG_BE:
7291         case POWERPC_FLAG_DE:
7292             break;
7293         default:
7294             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7295                     "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
7296             exit(1);
7297         }
7298     } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
7299         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7300                 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
7301         exit(1);
7302     }
7303     if (env->msr_mask & (1 << 2)) {
7304         switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
7305         case POWERPC_FLAG_PX:
7306         case POWERPC_FLAG_PMM:
7307             break;
7308         default:
7309             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7310                     "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
7311             exit(1);
7312         }
7313     } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
7314         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7315                 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
7316         exit(1);
7317     }
7318     if ((env->flags & (POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_BUS_CLK)) == 0) {
7319         fprintf(stderr, "PowerPC flags inconsistency\n"
7320                 "Should define the time-base and decrementer clock source\n");
7321         exit(1);
7322     }
7323     /* Allocate TLBs buffer when needed */
7324 #if !defined(CONFIG_USER_ONLY)
7325     if (env->nb_tlb != 0) {
7326         int nb_tlb = env->nb_tlb;
7327         if (env->id_tlbs != 0)
7328             nb_tlb *= 2;
7329         switch (env->tlb_type) {
7330         case TLB_6XX:
7331             env->tlb.tlb6 = g_malloc0(nb_tlb * sizeof(ppc6xx_tlb_t));
7332             break;
7333         case TLB_EMB:
7334             env->tlb.tlbe = g_malloc0(nb_tlb * sizeof(ppcemb_tlb_t));
7335             break;
7336         case TLB_MAS:
7337             env->tlb.tlbm = g_malloc0(nb_tlb * sizeof(ppcmas_tlb_t));
7338             break;
7339         }
7340         /* Pre-compute some useful values */
7341         env->tlb_per_way = env->nb_tlb / env->nb_ways;
7342     }
7343     if (env->irq_inputs == NULL) {
7344         fprintf(stderr, "WARNING: no internal IRQ controller registered.\n"
7345                 " Attempt QEMU to crash very soon !\n");
7346     }
7347 #endif
7348     if (env->check_pow == NULL) {
7349         fprintf(stderr, "WARNING: no power management check handler "
7350                 "registered.\n"
7351                 " Attempt QEMU to crash very soon !\n");
7352     }
7353 }
7354
7355 #if defined(PPC_DUMP_CPU)
7356 static void dump_ppc_sprs (CPUPPCState *env)
7357 {
7358     ppc_spr_t *spr;
7359 #if !defined(CONFIG_USER_ONLY)
7360     uint32_t sr, sw;
7361 #endif
7362     uint32_t ur, uw;
7363     int i, j, n;
7364
7365     printf("Special purpose registers:\n");
7366     for (i = 0; i < 32; i++) {
7367         for (j = 0; j < 32; j++) {
7368             n = (i << 5) | j;
7369             spr = &env->spr_cb[n];
7370             uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
7371             ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
7372 #if !defined(CONFIG_USER_ONLY)
7373             sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
7374             sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
7375             if (sw || sr || uw || ur) {
7376                 printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
7377                        (i << 5) | j, (i << 5) | j, spr->name,
7378                        sw ? 'w' : '-', sr ? 'r' : '-',
7379                        uw ? 'w' : '-', ur ? 'r' : '-');
7380             }
7381 #else
7382             if (uw || ur) {
7383                 printf("SPR: %4d (%03x) %-8s u%c%c\n",
7384                        (i << 5) | j, (i << 5) | j, spr->name,
7385                        uw ? 'w' : '-', ur ? 'r' : '-');
7386             }
7387 #endif
7388         }
7389     }
7390     fflush(stdout);
7391     fflush(stderr);
7392 }
7393 #endif
7394
7395 /*****************************************************************************/
7396 #include <stdlib.h>
7397 #include <string.h>
7398
7399 /* Opcode types */
7400 enum {
7401     PPC_DIRECT   = 0, /* Opcode routine        */
7402     PPC_INDIRECT = 1, /* Indirect opcode table */
7403 };
7404
7405 static inline int is_indirect_opcode (void *handler)
7406 {
7407     return ((uintptr_t)handler & 0x03) == PPC_INDIRECT;
7408 }
7409
7410 static inline opc_handler_t **ind_table(void *handler)
7411 {
7412     return (opc_handler_t **)((uintptr_t)handler & ~3);
7413 }
7414
7415 /* Instruction table creation */
7416 /* Opcodes tables creation */
7417 static void fill_new_table (opc_handler_t **table, int len)
7418 {
7419     int i;
7420
7421     for (i = 0; i < len; i++)
7422         table[i] = &invalid_handler;
7423 }
7424
7425 static int create_new_table (opc_handler_t **table, unsigned char idx)
7426 {
7427     opc_handler_t **tmp;
7428
7429     tmp = malloc(0x20 * sizeof(opc_handler_t));
7430     fill_new_table(tmp, 0x20);
7431     table[idx] = (opc_handler_t *)((uintptr_t)tmp | PPC_INDIRECT);
7432
7433     return 0;
7434 }
7435
7436 static int insert_in_table (opc_handler_t **table, unsigned char idx,
7437                             opc_handler_t *handler)
7438 {
7439     if (table[idx] != &invalid_handler)
7440         return -1;
7441     table[idx] = handler;
7442
7443     return 0;
7444 }
7445
7446 static int register_direct_insn (opc_handler_t **ppc_opcodes,
7447                                  unsigned char idx, opc_handler_t *handler)
7448 {
7449     if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
7450         printf("*** ERROR: opcode %02x already assigned in main "
7451                "opcode table\n", idx);
7452 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
7453         printf("           Registered handler '%s' - new handler '%s'\n",
7454                ppc_opcodes[idx]->oname, handler->oname);
7455 #endif
7456         return -1;
7457     }
7458
7459     return 0;
7460 }
7461
7462 static int register_ind_in_table (opc_handler_t **table,
7463                                   unsigned char idx1, unsigned char idx2,
7464                                   opc_handler_t *handler)
7465 {
7466     if (table[idx1] == &invalid_handler) {
7467         if (create_new_table(table, idx1) < 0) {
7468             printf("*** ERROR: unable to create indirect table "
7469                    "idx=%02x\n", idx1);
7470             return -1;
7471         }
7472     } else {
7473         if (!is_indirect_opcode(table[idx1])) {
7474             printf("*** ERROR: idx %02x already assigned to a direct "
7475                    "opcode\n", idx1);
7476 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
7477             printf("           Registered handler '%s' - new handler '%s'\n",
7478                    ind_table(table[idx1])[idx2]->oname, handler->oname);
7479 #endif
7480             return -1;
7481         }
7482     }
7483     if (handler != NULL &&
7484         insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
7485         printf("*** ERROR: opcode %02x already assigned in "
7486                "opcode table %02x\n", idx2, idx1);
7487 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
7488         printf("           Registered handler '%s' - new handler '%s'\n",
7489                ind_table(table[idx1])[idx2]->oname, handler->oname);
7490 #endif
7491         return -1;
7492     }
7493
7494     return 0;
7495 }
7496
7497 static int register_ind_insn (opc_handler_t **ppc_opcodes,
7498                               unsigned char idx1, unsigned char idx2,
7499                               opc_handler_t *handler)
7500 {
7501     int ret;
7502
7503     ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
7504
7505     return ret;
7506 }
7507
7508 static int register_dblind_insn (opc_handler_t **ppc_opcodes,
7509                                  unsigned char idx1, unsigned char idx2,
7510                                  unsigned char idx3, opc_handler_t *handler)
7511 {
7512     if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
7513         printf("*** ERROR: unable to join indirect table idx "
7514                "[%02x-%02x]\n", idx1, idx2);
7515         return -1;
7516     }
7517     if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
7518                               handler) < 0) {
7519         printf("*** ERROR: unable to insert opcode "
7520                "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
7521         return -1;
7522     }
7523
7524     return 0;
7525 }
7526
7527 static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
7528 {
7529     if (insn->opc2 != 0xFF) {
7530         if (insn->opc3 != 0xFF) {
7531             if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
7532                                      insn->opc3, &insn->handler) < 0)
7533                 return -1;
7534         } else {
7535             if (register_ind_insn(ppc_opcodes, insn->opc1,
7536                                   insn->opc2, &insn->handler) < 0)
7537                 return -1;
7538         }
7539     } else {
7540         if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
7541             return -1;
7542     }
7543
7544     return 0;
7545 }
7546
7547 static int test_opcode_table (opc_handler_t **table, int len)
7548 {
7549     int i, count, tmp;
7550
7551     for (i = 0, count = 0; i < len; i++) {
7552         /* Consistency fixup */
7553         if (table[i] == NULL)
7554             table[i] = &invalid_handler;
7555         if (table[i] != &invalid_handler) {
7556             if (is_indirect_opcode(table[i])) {
7557                 tmp = test_opcode_table(ind_table(table[i]), 0x20);
7558                 if (tmp == 0) {
7559                     free(table[i]);
7560                     table[i] = &invalid_handler;
7561                 } else {
7562                     count++;
7563                 }
7564             } else {
7565                 count++;
7566             }
7567         }
7568     }
7569
7570     return count;
7571 }
7572
7573 static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
7574 {
7575     if (test_opcode_table(ppc_opcodes, 0x40) == 0)
7576         printf("*** WARNING: no opcode defined !\n");
7577 }
7578
7579 /*****************************************************************************/
7580 static void create_ppc_opcodes(PowerPCCPU *cpu, Error **errp)
7581 {
7582     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7583     CPUPPCState *env = &cpu->env;
7584     opcode_t *opc;
7585
7586     fill_new_table(env->opcodes, 0x40);
7587     for (opc = opcodes; opc < &opcodes[ARRAY_SIZE(opcodes)]; opc++) {
7588         if (((opc->handler.type & pcc->insns_flags) != 0) ||
7589             ((opc->handler.type2 & pcc->insns_flags2) != 0)) {
7590             if (register_insn(env->opcodes, opc) < 0) {
7591                 error_setg(errp, "ERROR initializing PowerPC instruction "
7592                            "0x%02x 0x%02x 0x%02x", opc->opc1, opc->opc2,
7593                            opc->opc3);
7594                 return;
7595             }
7596         }
7597     }
7598     fix_opcode_tables(env->opcodes);
7599     fflush(stdout);
7600     fflush(stderr);
7601 }
7602
7603 #if defined(PPC_DUMP_CPU)
7604 static void dump_ppc_insns (CPUPPCState *env)
7605 {
7606     opc_handler_t **table, *handler;
7607     const char *p, *q;
7608     uint8_t opc1, opc2, opc3;
7609
7610     printf("Instructions set:\n");
7611     /* opc1 is 6 bits long */
7612     for (opc1 = 0x00; opc1 < 0x40; opc1++) {
7613         table = env->opcodes;
7614         handler = table[opc1];
7615         if (is_indirect_opcode(handler)) {
7616             /* opc2 is 5 bits long */
7617             for (opc2 = 0; opc2 < 0x20; opc2++) {
7618                 table = env->opcodes;
7619                 handler = env->opcodes[opc1];
7620                 table = ind_table(handler);
7621                 handler = table[opc2];
7622                 if (is_indirect_opcode(handler)) {
7623                     table = ind_table(handler);
7624                     /* opc3 is 5 bits long */
7625                     for (opc3 = 0; opc3 < 0x20; opc3++) {
7626                         handler = table[opc3];
7627                         if (handler->handler != &gen_invalid) {
7628                             /* Special hack to properly dump SPE insns */
7629                             p = strchr(handler->oname, '_');
7630                             if (p == NULL) {
7631                                 printf("INSN: %02x %02x %02x (%02d %04d) : "
7632                                        "%s\n",
7633                                        opc1, opc2, opc3, opc1,
7634                                        (opc3 << 5) | opc2,
7635                                        handler->oname);
7636                             } else {
7637                                 q = "speundef";
7638                                 if ((p - handler->oname) != strlen(q) ||
7639                                     memcmp(handler->oname, q, strlen(q)) != 0) {
7640                                     /* First instruction */
7641                                     printf("INSN: %02x %02x %02x (%02d %04d) : "
7642                                            "%.*s\n",
7643                                            opc1, opc2 << 1, opc3, opc1,
7644                                            (opc3 << 6) | (opc2 << 1),
7645                                            (int)(p - handler->oname),
7646                                            handler->oname);
7647                                 }
7648                                 if (strcmp(p + 1, q) != 0) {
7649                                     /* Second instruction */
7650                                     printf("INSN: %02x %02x %02x (%02d %04d) : "
7651                                            "%s\n",
7652                                            opc1, (opc2 << 1) | 1, opc3, opc1,
7653                                            (opc3 << 6) | (opc2 << 1) | 1,
7654                                            p + 1);
7655                                 }
7656                             }
7657                         }
7658                     }
7659                 } else {
7660                     if (handler->handler != &gen_invalid) {
7661                         printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
7662                                opc1, opc2, opc1, opc2, handler->oname);
7663                     }
7664                 }
7665             }
7666         } else {
7667             if (handler->handler != &gen_invalid) {
7668                 printf("INSN: %02x -- -- (%02d ----) : %s\n",
7669                        opc1, opc1, handler->oname);
7670             }
7671         }
7672     }
7673 }
7674 #endif
7675
7676 static int gdb_get_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7677 {
7678     if (n < 32) {
7679         stfq_p(mem_buf, env->fpr[n]);
7680         return 8;
7681     }
7682     if (n == 32) {
7683         stl_p(mem_buf, env->fpscr);
7684         return 4;
7685     }
7686     return 0;
7687 }
7688
7689 static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7690 {
7691     if (n < 32) {
7692         env->fpr[n] = ldfq_p(mem_buf);
7693         return 8;
7694     }
7695     if (n == 32) {
7696         /* FPSCR not implemented  */
7697         return 4;
7698     }
7699     return 0;
7700 }
7701
7702 static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7703 {
7704     if (n < 32) {
7705 #ifdef HOST_WORDS_BIGENDIAN
7706         stq_p(mem_buf, env->avr[n].u64[0]);
7707         stq_p(mem_buf+8, env->avr[n].u64[1]);
7708 #else
7709         stq_p(mem_buf, env->avr[n].u64[1]);
7710         stq_p(mem_buf+8, env->avr[n].u64[0]);
7711 #endif
7712         return 16;
7713     }
7714     if (n == 32) {
7715         stl_p(mem_buf, env->vscr);
7716         return 4;
7717     }
7718     if (n == 33) {
7719         stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
7720         return 4;
7721     }
7722     return 0;
7723 }
7724
7725 static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7726 {
7727     if (n < 32) {
7728 #ifdef HOST_WORDS_BIGENDIAN
7729         env->avr[n].u64[0] = ldq_p(mem_buf);
7730         env->avr[n].u64[1] = ldq_p(mem_buf+8);
7731 #else
7732         env->avr[n].u64[1] = ldq_p(mem_buf);
7733         env->avr[n].u64[0] = ldq_p(mem_buf+8);
7734 #endif
7735         return 16;
7736     }
7737     if (n == 32) {
7738         env->vscr = ldl_p(mem_buf);
7739         return 4;
7740     }
7741     if (n == 33) {
7742         env->spr[SPR_VRSAVE] = (target_ulong)ldl_p(mem_buf);
7743         return 4;
7744     }
7745     return 0;
7746 }
7747
7748 static int gdb_get_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7749 {
7750     if (n < 32) {
7751 #if defined(TARGET_PPC64)
7752         stl_p(mem_buf, env->gpr[n] >> 32);
7753 #else
7754         stl_p(mem_buf, env->gprh[n]);
7755 #endif
7756         return 4;
7757     }
7758     if (n == 32) {
7759         stq_p(mem_buf, env->spe_acc);
7760         return 8;
7761     }
7762     if (n == 33) {
7763         stl_p(mem_buf, env->spe_fscr);
7764         return 4;
7765     }
7766     return 0;
7767 }
7768
7769 static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7770 {
7771     if (n < 32) {
7772 #if defined(TARGET_PPC64)
7773         target_ulong lo = (uint32_t)env->gpr[n];
7774         target_ulong hi = (target_ulong)ldl_p(mem_buf) << 32;
7775         env->gpr[n] = lo | hi;
7776 #else
7777         env->gprh[n] = ldl_p(mem_buf);
7778 #endif
7779         return 4;
7780     }
7781     if (n == 32) {
7782         env->spe_acc = ldq_p(mem_buf);
7783         return 8;
7784     }
7785     if (n == 33) {
7786         env->spe_fscr = ldl_p(mem_buf);
7787         return 4;
7788     }
7789     return 0;
7790 }
7791
7792 static int ppc_fixup_cpu(PowerPCCPU *cpu)
7793 {
7794     CPUPPCState *env = &cpu->env;
7795
7796     /* TCG doesn't (yet) emulate some groups of instructions that
7797      * are implemented on some otherwise supported CPUs (e.g. VSX
7798      * and decimal floating point instructions on POWER7).  We
7799      * remove unsupported instruction groups from the cpu state's
7800      * instruction masks and hope the guest can cope.  For at
7801      * least the pseries machine, the unavailability of these
7802      * instructions can be advertised to the guest via the device
7803      * tree. */
7804     if ((env->insns_flags & ~PPC_TCG_INSNS)
7805         || (env->insns_flags2 & ~PPC_TCG_INSNS2)) {
7806         fprintf(stderr, "Warning: Disabling some instructions which are not "
7807                 "emulated by TCG (0x%" PRIx64 ", 0x%" PRIx64 ")\n",
7808                 env->insns_flags & ~PPC_TCG_INSNS,
7809                 env->insns_flags2 & ~PPC_TCG_INSNS2);
7810     }
7811     env->insns_flags &= PPC_TCG_INSNS;
7812     env->insns_flags2 &= PPC_TCG_INSNS2;
7813     return 0;
7814 }
7815
7816 static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
7817 {
7818     PowerPCCPU *cpu = POWERPC_CPU(dev);
7819     CPUPPCState *env = &cpu->env;
7820     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7821     Error *local_err = NULL;
7822 #if !defined(CONFIG_USER_ONLY)
7823     int max_smt = kvm_enabled() ? kvmppc_smt_threads() : 1;
7824 #endif
7825
7826 #if !defined(CONFIG_USER_ONLY)
7827     if (smp_threads > max_smt) {
7828         error_setg(errp, "Cannot support more than %d threads on PPC with %s",
7829                    max_smt, kvm_enabled() ? "KVM" : "TCG");
7830         return;
7831     }
7832 #endif
7833
7834     if (kvm_enabled()) {
7835         if (kvmppc_fixup_cpu(cpu) != 0) {
7836             error_setg(errp, "Unable to virtualize selected CPU with KVM");
7837             return;
7838         }
7839     } else {
7840         if (ppc_fixup_cpu(cpu) != 0) {
7841             error_setg(errp, "Unable to emulate selected CPU with TCG");
7842             return;
7843         }
7844     }
7845
7846 #if defined(TARGET_PPCEMB)
7847     if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
7848         error_setg(errp, "CPU does not possess a BookE MMU. "
7849                    "Please use qemu-system-ppc or qemu-system-ppc64 instead "
7850                    "or choose another CPU model.");
7851         return;
7852     }
7853 #endif
7854
7855     create_ppc_opcodes(cpu, &local_err);
7856     if (local_err != NULL) {
7857         error_propagate(errp, local_err);
7858         return;
7859     }
7860     init_ppc_proc(cpu);
7861
7862     if (pcc->insns_flags & PPC_FLOAT) {
7863         gdb_register_coprocessor(env, gdb_get_float_reg, gdb_set_float_reg,
7864                                  33, "power-fpu.xml", 0);
7865     }
7866     if (pcc->insns_flags & PPC_ALTIVEC) {
7867         gdb_register_coprocessor(env, gdb_get_avr_reg, gdb_set_avr_reg,
7868                                  34, "power-altivec.xml", 0);
7869     }
7870     if (pcc->insns_flags & PPC_SPE) {
7871         gdb_register_coprocessor(env, gdb_get_spe_reg, gdb_set_spe_reg,
7872                                  34, "power-spe.xml", 0);
7873     }
7874
7875     qemu_init_vcpu(env);
7876
7877     pcc->parent_realize(dev, errp);
7878
7879 #if defined(PPC_DUMP_CPU)
7880     {
7881         const char *mmu_model, *excp_model, *bus_model;
7882         switch (env->mmu_model) {
7883         case POWERPC_MMU_32B:
7884             mmu_model = "PowerPC 32";
7885             break;
7886         case POWERPC_MMU_SOFT_6xx:
7887             mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
7888             break;
7889         case POWERPC_MMU_SOFT_74xx:
7890             mmu_model = "PowerPC 74xx with software driven TLBs";
7891             break;
7892         case POWERPC_MMU_SOFT_4xx:
7893             mmu_model = "PowerPC 4xx with software driven TLBs";
7894             break;
7895         case POWERPC_MMU_SOFT_4xx_Z:
7896             mmu_model = "PowerPC 4xx with software driven TLBs "
7897                 "and zones protections";
7898             break;
7899         case POWERPC_MMU_REAL:
7900             mmu_model = "PowerPC real mode only";
7901             break;
7902         case POWERPC_MMU_MPC8xx:
7903             mmu_model = "PowerPC MPC8xx";
7904             break;
7905         case POWERPC_MMU_BOOKE:
7906             mmu_model = "PowerPC BookE";
7907             break;
7908         case POWERPC_MMU_BOOKE206:
7909             mmu_model = "PowerPC BookE 2.06";
7910             break;
7911         case POWERPC_MMU_601:
7912             mmu_model = "PowerPC 601";
7913             break;
7914 #if defined (TARGET_PPC64)
7915         case POWERPC_MMU_64B:
7916             mmu_model = "PowerPC 64";
7917             break;
7918         case POWERPC_MMU_620:
7919             mmu_model = "PowerPC 620";
7920             break;
7921 #endif
7922         default:
7923             mmu_model = "Unknown or invalid";
7924             break;
7925         }
7926         switch (env->excp_model) {
7927         case POWERPC_EXCP_STD:
7928             excp_model = "PowerPC";
7929             break;
7930         case POWERPC_EXCP_40x:
7931             excp_model = "PowerPC 40x";
7932             break;
7933         case POWERPC_EXCP_601:
7934             excp_model = "PowerPC 601";
7935             break;
7936         case POWERPC_EXCP_602:
7937             excp_model = "PowerPC 602";
7938             break;
7939         case POWERPC_EXCP_603:
7940             excp_model = "PowerPC 603";
7941             break;
7942         case POWERPC_EXCP_603E:
7943             excp_model = "PowerPC 603e";
7944             break;
7945         case POWERPC_EXCP_604:
7946             excp_model = "PowerPC 604";
7947             break;
7948         case POWERPC_EXCP_7x0:
7949             excp_model = "PowerPC 740/750";
7950             break;
7951         case POWERPC_EXCP_7x5:
7952             excp_model = "PowerPC 745/755";
7953             break;
7954         case POWERPC_EXCP_74xx:
7955             excp_model = "PowerPC 74xx";
7956             break;
7957         case POWERPC_EXCP_BOOKE:
7958             excp_model = "PowerPC BookE";
7959             break;
7960 #if defined (TARGET_PPC64)
7961         case POWERPC_EXCP_970:
7962             excp_model = "PowerPC 970";
7963             break;
7964 #endif
7965         default:
7966             excp_model = "Unknown or invalid";
7967             break;
7968         }
7969         switch (env->bus_model) {
7970         case PPC_FLAGS_INPUT_6xx:
7971             bus_model = "PowerPC 6xx";
7972             break;
7973         case PPC_FLAGS_INPUT_BookE:
7974             bus_model = "PowerPC BookE";
7975             break;
7976         case PPC_FLAGS_INPUT_405:
7977             bus_model = "PowerPC 405";
7978             break;
7979         case PPC_FLAGS_INPUT_401:
7980             bus_model = "PowerPC 401/403";
7981             break;
7982         case PPC_FLAGS_INPUT_RCPU:
7983             bus_model = "RCPU / MPC8xx";
7984             break;
7985 #if defined (TARGET_PPC64)
7986         case PPC_FLAGS_INPUT_970:
7987             bus_model = "PowerPC 970";
7988             break;
7989 #endif
7990         default:
7991             bus_model = "Unknown or invalid";
7992             break;
7993         }
7994         printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
7995                "    MMU model        : %s\n",
7996                pcc->name, pcc->pvr, pcc->msr_mask, mmu_model);
7997 #if !defined(CONFIG_USER_ONLY)
7998         if (env->tlb != NULL) {
7999             printf("                       %d %s TLB in %d ways\n",
8000                    env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
8001                    env->nb_ways);
8002         }
8003 #endif
8004         printf("    Exceptions model : %s\n"
8005                "    Bus model        : %s\n",
8006                excp_model, bus_model);
8007         printf("    MSR features     :\n");
8008         if (env->flags & POWERPC_FLAG_SPE)
8009             printf("                        signal processing engine enable"
8010                    "\n");
8011         else if (env->flags & POWERPC_FLAG_VRE)
8012             printf("                        vector processor enable\n");
8013         if (env->flags & POWERPC_FLAG_TGPR)
8014             printf("                        temporary GPRs\n");
8015         else if (env->flags & POWERPC_FLAG_CE)
8016             printf("                        critical input enable\n");
8017         if (env->flags & POWERPC_FLAG_SE)
8018             printf("                        single-step trace mode\n");
8019         else if (env->flags & POWERPC_FLAG_DWE)
8020             printf("                        debug wait enable\n");
8021         else if (env->flags & POWERPC_FLAG_UBLE)
8022             printf("                        user BTB lock enable\n");
8023         if (env->flags & POWERPC_FLAG_BE)
8024             printf("                        branch-step trace mode\n");
8025         else if (env->flags & POWERPC_FLAG_DE)
8026             printf("                        debug interrupt enable\n");
8027         if (env->flags & POWERPC_FLAG_PX)
8028             printf("                        inclusive protection\n");
8029         else if (env->flags & POWERPC_FLAG_PMM)
8030             printf("                        performance monitor mark\n");
8031         if (env->flags == POWERPC_FLAG_NONE)
8032             printf("                        none\n");
8033         printf("    Time-base/decrementer clock source: %s\n",
8034                env->flags & POWERPC_FLAG_RTC_CLK ? "RTC clock" : "bus clock");
8035     }
8036     dump_ppc_insns(env);
8037     dump_ppc_sprs(env);
8038     fflush(stdout);
8039 #endif
8040 }
8041
8042 static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
8043 {
8044     ObjectClass *oc = (ObjectClass *)a;
8045     uint32_t pvr = *(uint32_t *)b;
8046     PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
8047
8048     /* -cpu host does a PVR lookup during construction */
8049     if (unlikely(strcmp(object_class_get_name(oc),
8050                         TYPE_HOST_POWERPC_CPU) == 0)) {
8051         return -1;
8052     }
8053
8054 #if defined(TARGET_PPCEMB)
8055     if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
8056         return -1;
8057     }
8058 #endif
8059
8060     return pcc->pvr == pvr ? 0 : -1;
8061 }
8062
8063 PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
8064 {
8065     GSList *list, *item;
8066     PowerPCCPUClass *pcc = NULL;
8067
8068     list = object_class_get_list(TYPE_POWERPC_CPU, false);
8069     item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
8070     if (item != NULL) {
8071         pcc = POWERPC_CPU_CLASS(item->data);
8072     }
8073     g_slist_free(list);
8074
8075     return pcc;
8076 }
8077
8078 static gint ppc_cpu_compare_class_name(gconstpointer a, gconstpointer b)
8079 {
8080     ObjectClass *oc = (ObjectClass *)a;
8081     const char *name = b;
8082 #if defined(TARGET_PPCEMB)
8083     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8084 #endif
8085
8086     if (strncasecmp(name, object_class_get_name(oc), strlen(name)) == 0 &&
8087 #if defined(TARGET_PPCEMB)
8088         pcc->mmu_model == POWERPC_MMU_BOOKE &&
8089 #endif
8090         strcmp(object_class_get_name(oc) + strlen(name),
8091                "-" TYPE_POWERPC_CPU) == 0) {
8092         return 0;
8093     }
8094     return -1;
8095 }
8096
8097 #include <ctype.h>
8098
8099 static ObjectClass *ppc_cpu_class_by_name(const char *name)
8100 {
8101     GSList *list, *item;
8102     ObjectClass *ret = NULL;
8103     const char *p;
8104     int i, len;
8105
8106     /* Check if the given name is a PVR */
8107     len = strlen(name);
8108     if (len == 10 && name[0] == '0' && name[1] == 'x') {
8109         p = name + 2;
8110         goto check_pvr;
8111     } else if (len == 8) {
8112         p = name;
8113     check_pvr:
8114         for (i = 0; i < 8; i++) {
8115             if (!qemu_isxdigit(*p++))
8116                 break;
8117         }
8118         if (i == 8) {
8119             ret = OBJECT_CLASS(ppc_cpu_class_by_pvr(strtoul(name, NULL, 16)));
8120             return ret;
8121         }
8122     }
8123
8124     for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
8125         if (strcmp(ppc_cpu_aliases[i].alias, name) == 0) {
8126             return ppc_cpu_class_by_name(ppc_cpu_aliases[i].model);
8127         }
8128     }
8129
8130     list = object_class_get_list(TYPE_POWERPC_CPU, false);
8131     item = g_slist_find_custom(list, name, ppc_cpu_compare_class_name);
8132     if (item != NULL) {
8133         ret = OBJECT_CLASS(item->data);
8134     }
8135     g_slist_free(list);
8136
8137     return ret;
8138 }
8139
8140 PowerPCCPU *cpu_ppc_init(const char *cpu_model)
8141 {
8142     PowerPCCPU *cpu;
8143     CPUPPCState *env;
8144     ObjectClass *oc;
8145     Error *err = NULL;
8146
8147     oc = ppc_cpu_class_by_name(cpu_model);
8148     if (oc == NULL) {
8149         return NULL;
8150     }
8151
8152     cpu = POWERPC_CPU(object_new(object_class_get_name(oc)));
8153     env = &cpu->env;
8154     env->cpu_model_str = cpu_model;
8155
8156     object_property_set_bool(OBJECT(cpu), true, "realized", &err);
8157     if (err != NULL) {
8158         fprintf(stderr, "%s\n", error_get_pretty(err));
8159         error_free(err);
8160         object_unref(OBJECT(cpu));
8161         return NULL;
8162     }
8163
8164     return cpu;
8165 }
8166
8167 /* Sort by PVR, ordering special case "host" last. */
8168 static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
8169 {
8170     ObjectClass *oc_a = (ObjectClass *)a;
8171     ObjectClass *oc_b = (ObjectClass *)b;
8172     PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
8173     PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
8174     const char *name_a = object_class_get_name(oc_a);
8175     const char *name_b = object_class_get_name(oc_b);
8176
8177     if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
8178         return 1;
8179     } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
8180         return -1;
8181     } else {
8182         /* Avoid an integer overflow during subtraction */
8183         if (pcc_a->pvr < pcc_b->pvr) {
8184             return -1;
8185         } else if (pcc_a->pvr > pcc_b->pvr) {
8186             return 1;
8187         } else {
8188             return 0;
8189         }
8190     }
8191 }
8192
8193 static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
8194 {
8195     ObjectClass *oc = data;
8196     CPUListState *s = user_data;
8197     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8198     const char *typename = object_class_get_name(oc);
8199     char *name;
8200     int i;
8201
8202 #if defined(TARGET_PPCEMB)
8203     if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
8204         return;
8205     }
8206 #endif
8207     if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) {
8208         return;
8209     }
8210
8211     name = g_strndup(typename,
8212                      strlen(typename) - strlen("-" TYPE_POWERPC_CPU));
8213     (*s->cpu_fprintf)(s->file, "PowerPC %-16s PVR %08x\n",
8214                       name, pcc->pvr);
8215     for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
8216         const PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
8217         ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
8218
8219         if (alias_oc != oc) {
8220             continue;
8221         }
8222         (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
8223                           alias->alias, name);
8224     }
8225     g_free(name);
8226 }
8227
8228 void ppc_cpu_list(FILE *f, fprintf_function cpu_fprintf)
8229 {
8230     CPUListState s = {
8231         .file = f,
8232         .cpu_fprintf = cpu_fprintf,
8233     };
8234     GSList *list;
8235
8236     list = object_class_get_list(TYPE_POWERPC_CPU, false);
8237     list = g_slist_sort(list, ppc_cpu_list_compare);
8238     g_slist_foreach(list, ppc_cpu_list_entry, &s);
8239     g_slist_free(list);
8240
8241 #ifdef CONFIG_KVM
8242     cpu_fprintf(f, "\n");
8243     cpu_fprintf(f, "PowerPC %-16s\n", "host");
8244 #endif
8245 }
8246
8247 static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
8248 {
8249     ObjectClass *oc = data;
8250     CpuDefinitionInfoList **first = user_data;
8251     const char *typename;
8252     CpuDefinitionInfoList *entry;
8253     CpuDefinitionInfo *info;
8254 #if defined(TARGET_PPCEMB)
8255     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8256
8257     if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
8258         return;
8259     }
8260 #endif
8261
8262     typename = object_class_get_name(oc);
8263     info = g_malloc0(sizeof(*info));
8264     info->name = g_strndup(typename,
8265                            strlen(typename) - strlen("-" TYPE_POWERPC_CPU));
8266
8267     entry = g_malloc0(sizeof(*entry));
8268     entry->value = info;
8269     entry->next = *first;
8270     *first = entry;
8271 }
8272
8273 CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
8274 {
8275     CpuDefinitionInfoList *cpu_list = NULL;
8276     GSList *list;
8277     int i;
8278
8279     list = object_class_get_list(TYPE_POWERPC_CPU, false);
8280     g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
8281     g_slist_free(list);
8282
8283     for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
8284         const PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
8285         ObjectClass *oc;
8286         CpuDefinitionInfoList *entry;
8287         CpuDefinitionInfo *info;
8288
8289         oc = ppc_cpu_class_by_name(alias->model);
8290         if (oc == NULL) {
8291             continue;
8292         }
8293
8294         info = g_malloc0(sizeof(*info));
8295         info->name = g_strdup(alias->alias);
8296
8297         entry = g_malloc0(sizeof(*entry));
8298         entry->value = info;
8299         entry->next = cpu_list;
8300         cpu_list = entry;
8301     }
8302
8303     return cpu_list;
8304 }
8305
8306 /* CPUClass::reset() */
8307 static void ppc_cpu_reset(CPUState *s)
8308 {
8309     PowerPCCPU *cpu = POWERPC_CPU(s);
8310     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8311     CPUPPCState *env = &cpu->env;
8312     target_ulong msr;
8313
8314     if (qemu_loglevel_mask(CPU_LOG_RESET)) {
8315         qemu_log("CPU Reset (CPU %d)\n", s->cpu_index);
8316         log_cpu_state(env, 0);
8317     }
8318
8319     pcc->parent_reset(s);
8320
8321     msr = (target_ulong)0;
8322     if (0) {
8323         /* XXX: find a suitable condition to enable the hypervisor mode */
8324         msr |= (target_ulong)MSR_HVB;
8325     }
8326     msr |= (target_ulong)0 << MSR_AP; /* TO BE CHECKED */
8327     msr |= (target_ulong)0 << MSR_SA; /* TO BE CHECKED */
8328     msr |= (target_ulong)1 << MSR_EP;
8329 #if defined(DO_SINGLE_STEP) && 0
8330     /* Single step trace mode */
8331     msr |= (target_ulong)1 << MSR_SE;
8332     msr |= (target_ulong)1 << MSR_BE;
8333 #endif
8334 #if defined(CONFIG_USER_ONLY)
8335     msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */
8336     msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */
8337     msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */
8338     msr |= (target_ulong)1 << MSR_PR;
8339 #else
8340     env->excp_prefix = env->hreset_excp_prefix;
8341     env->nip = env->hreset_vector | env->excp_prefix;
8342     if (env->mmu_model != POWERPC_MMU_REAL) {
8343         ppc_tlb_invalidate_all(env);
8344     }
8345 #endif
8346     env->msr = msr & env->msr_mask;
8347 #if defined(TARGET_PPC64)
8348     if (env->mmu_model & POWERPC_MMU_64) {
8349         env->msr |= (1ULL << MSR_SF);
8350     }
8351 #endif
8352     hreg_compute_hflags(env);
8353     env->reserve_addr = (target_ulong)-1ULL;
8354     /* Be sure no exception or interrupt is pending */
8355     env->pending_interrupts = 0;
8356     env->exception_index = POWERPC_EXCP_NONE;
8357     env->error_code = 0;
8358
8359 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
8360     env->vpa_addr = 0;
8361     env->slb_shadow_addr = 0;
8362     env->slb_shadow_size = 0;
8363     env->dtl_addr = 0;
8364     env->dtl_size = 0;
8365 #endif /* TARGET_PPC64 */
8366
8367     /* Flush all TLBs */
8368     tlb_flush(env, 1);
8369 }
8370
8371 static void ppc_cpu_initfn(Object *obj)
8372 {
8373     CPUState *cs = CPU(obj);
8374     PowerPCCPU *cpu = POWERPC_CPU(obj);
8375     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8376     CPUPPCState *env = &cpu->env;
8377
8378     cs->env_ptr = env;
8379     cpu_exec_init(env);
8380
8381     env->msr_mask = pcc->msr_mask;
8382     env->mmu_model = pcc->mmu_model;
8383     env->excp_model = pcc->excp_model;
8384     env->bus_model = pcc->bus_model;
8385     env->insns_flags = pcc->insns_flags;
8386     env->insns_flags2 = pcc->insns_flags2;
8387     env->flags = pcc->flags;
8388     env->bfd_mach = pcc->bfd_mach;
8389     env->check_pow = pcc->check_pow;
8390
8391 #if defined(TARGET_PPC64)
8392     if (pcc->sps) {
8393         env->sps = *pcc->sps;
8394     } else if (env->mmu_model & POWERPC_MMU_64) {
8395         /* Use default sets of page sizes */
8396         static const struct ppc_segment_page_sizes defsps = {
8397             .sps = {
8398                 { .page_shift = 12, /* 4K */
8399                   .slb_enc = 0,
8400                   .enc = { { .page_shift = 12, .pte_enc = 0 } }
8401                 },
8402                 { .page_shift = 24, /* 16M */
8403                   .slb_enc = 0x100,
8404                   .enc = { { .page_shift = 24, .pte_enc = 0 } }
8405                 },
8406             },
8407         };
8408         env->sps = defsps;
8409     }
8410 #endif /* defined(TARGET_PPC64) */
8411
8412     if (tcg_enabled()) {
8413         ppc_translate_init();
8414     }
8415 }
8416
8417 static void ppc_cpu_class_init(ObjectClass *oc, void *data)
8418 {
8419     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8420     CPUClass *cc = CPU_CLASS(oc);
8421     DeviceClass *dc = DEVICE_CLASS(oc);
8422
8423     pcc->parent_realize = dc->realize;
8424     dc->realize = ppc_cpu_realizefn;
8425
8426     pcc->parent_reset = cc->reset;
8427     cc->reset = ppc_cpu_reset;
8428
8429     cc->class_by_name = ppc_cpu_class_by_name;
8430 }
8431
8432 static const TypeInfo ppc_cpu_type_info = {
8433     .name = TYPE_POWERPC_CPU,
8434     .parent = TYPE_CPU,
8435     .instance_size = sizeof(PowerPCCPU),
8436     .instance_init = ppc_cpu_initfn,
8437     .abstract = true,
8438     .class_size = sizeof(PowerPCCPUClass),
8439     .class_init = ppc_cpu_class_init,
8440 };
8441
8442 static void ppc_cpu_register_types(void)
8443 {
8444     type_register_static(&ppc_cpu_type_info);
8445 }
8446
8447 type_init(ppc_cpu_register_types)
This page took 0.491429 seconds and 4 git commands to generate.