2 * PowerPC CPU initialization for qemu.
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 * Copyright 2011 Freescale Semiconductor, Inc.
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.
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.
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/>.
21 #include "disas/bfd.h"
22 #include "exec/gdbstub.h"
24 #include "sysemu/arch_init.h"
25 #include "sysemu/cpus.h"
26 #include "sysemu/hw_accel.h"
27 #include "cpu-models.h"
28 #include "mmu-hash32.h"
29 #include "mmu-hash64.h"
30 #include "qemu/error-report.h"
31 #include "qapi/error.h"
32 #include "qapi/qmp/qnull.h"
33 #include "qapi/visitor.h"
34 #include "hw/qdev-properties.h"
35 #include "hw/ppc/ppc.h"
36 #include "mmu-book3s-v3.h"
37 #include "sysemu/qtest.h"
38 #include "qemu/cutils.h"
39 #include "disas/capstone.h"
40 #include "fpu/softfloat.h"
41 #include "qapi/qapi-commands-target.h"
43 //#define PPC_DUMP_CPU
44 //#define PPC_DEBUG_SPR
45 //#define PPC_DUMP_SPR_ACCESSES
46 /* #define USE_APPLE_GDB */
49 * do nothing but store/retrieve spr value
51 static void spr_load_dump_spr(int sprn)
53 #ifdef PPC_DUMP_SPR_ACCESSES
54 TCGv_i32 t0 = tcg_const_i32(sprn);
55 gen_helper_load_dump_spr(cpu_env, t0);
56 tcg_temp_free_i32(t0);
60 static void spr_read_generic (DisasContext *ctx, int gprn, int sprn)
62 gen_load_spr(cpu_gpr[gprn], sprn);
63 spr_load_dump_spr(sprn);
66 static void spr_store_dump_spr(int sprn)
68 #ifdef PPC_DUMP_SPR_ACCESSES
69 TCGv_i32 t0 = tcg_const_i32(sprn);
70 gen_helper_store_dump_spr(cpu_env, t0);
71 tcg_temp_free_i32(t0);
75 static void spr_write_generic(DisasContext *ctx, int sprn, int gprn)
77 gen_store_spr(sprn, cpu_gpr[gprn]);
78 spr_store_dump_spr(sprn);
81 #if !defined(CONFIG_USER_ONLY)
82 static void spr_write_generic32(DisasContext *ctx, int sprn, int gprn)
85 TCGv t0 = tcg_temp_new();
86 tcg_gen_ext32u_tl(t0, cpu_gpr[gprn]);
87 gen_store_spr(sprn, t0);
89 spr_store_dump_spr(sprn);
91 spr_write_generic(ctx, sprn, gprn);
95 static void spr_write_clear(DisasContext *ctx, int sprn, int gprn)
97 TCGv t0 = tcg_temp_new();
98 TCGv t1 = tcg_temp_new();
99 gen_load_spr(t0, sprn);
100 tcg_gen_neg_tl(t1, cpu_gpr[gprn]);
101 tcg_gen_and_tl(t0, t0, t1);
102 gen_store_spr(sprn, t0);
107 static void spr_access_nop(DisasContext *ctx, int sprn, int gprn)
113 /* SPR common to all PowerPC */
115 static void spr_read_xer(DisasContext *ctx, int gprn, int sprn)
117 gen_read_xer(ctx, cpu_gpr[gprn]);
120 static void spr_write_xer(DisasContext *ctx, int sprn, int gprn)
122 gen_write_xer(cpu_gpr[gprn]);
126 static void spr_read_lr(DisasContext *ctx, int gprn, int sprn)
128 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_lr);
131 static void spr_write_lr(DisasContext *ctx, int sprn, int gprn)
133 tcg_gen_mov_tl(cpu_lr, cpu_gpr[gprn]);
137 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
138 static void spr_read_cfar(DisasContext *ctx, int gprn, int sprn)
140 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_cfar);
143 static void spr_write_cfar(DisasContext *ctx, int sprn, int gprn)
145 tcg_gen_mov_tl(cpu_cfar, cpu_gpr[gprn]);
147 #endif /* defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) */
150 static void spr_read_ctr(DisasContext *ctx, int gprn, int sprn)
152 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_ctr);
155 static void spr_write_ctr(DisasContext *ctx, int sprn, int gprn)
157 tcg_gen_mov_tl(cpu_ctr, cpu_gpr[gprn]);
160 /* User read access to SPR */
166 static void spr_read_ureg(DisasContext *ctx, int gprn, int sprn)
168 gen_load_spr(cpu_gpr[gprn], sprn + 0x10);
171 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
172 static void spr_write_ureg(DisasContext *ctx, int sprn, int gprn)
174 gen_store_spr(sprn + 0x10, cpu_gpr[gprn]);
178 /* SPR common to all non-embedded PowerPC */
180 #if !defined(CONFIG_USER_ONLY)
181 static void spr_read_decr(DisasContext *ctx, int gprn, int sprn)
183 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
186 gen_helper_load_decr(cpu_gpr[gprn], cpu_env);
187 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
189 gen_stop_exception(ctx);
193 static void spr_write_decr(DisasContext *ctx, int sprn, int gprn)
195 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
198 gen_helper_store_decr(cpu_env, cpu_gpr[gprn]);
199 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
201 gen_stop_exception(ctx);
206 /* SPR common to all non-embedded PowerPC, except 601 */
208 static void spr_read_tbl(DisasContext *ctx, int gprn, int sprn)
210 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
213 gen_helper_load_tbl(cpu_gpr[gprn], cpu_env);
214 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
216 gen_stop_exception(ctx);
220 static void spr_read_tbu(DisasContext *ctx, int gprn, int sprn)
222 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
225 gen_helper_load_tbu(cpu_gpr[gprn], cpu_env);
226 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
228 gen_stop_exception(ctx);
232 __attribute__ (( unused ))
233 static void spr_read_atbl(DisasContext *ctx, int gprn, int sprn)
235 gen_helper_load_atbl(cpu_gpr[gprn], cpu_env);
238 __attribute__ (( unused ))
239 static void spr_read_atbu(DisasContext *ctx, int gprn, int sprn)
241 gen_helper_load_atbu(cpu_gpr[gprn], cpu_env);
244 #if !defined(CONFIG_USER_ONLY)
245 static void spr_write_tbl(DisasContext *ctx, int sprn, int gprn)
247 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
250 gen_helper_store_tbl(cpu_env, cpu_gpr[gprn]);
251 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
253 gen_stop_exception(ctx);
257 static void spr_write_tbu(DisasContext *ctx, int sprn, int gprn)
259 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
262 gen_helper_store_tbu(cpu_env, cpu_gpr[gprn]);
263 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
265 gen_stop_exception(ctx);
269 __attribute__ (( unused ))
270 static void spr_write_atbl(DisasContext *ctx, int sprn, int gprn)
272 gen_helper_store_atbl(cpu_env, cpu_gpr[gprn]);
275 __attribute__ (( unused ))
276 static void spr_write_atbu(DisasContext *ctx, int sprn, int gprn)
278 gen_helper_store_atbu(cpu_env, cpu_gpr[gprn]);
281 #if defined(TARGET_PPC64)
282 __attribute__ (( unused ))
283 static void spr_read_purr(DisasContext *ctx, int gprn, int sprn)
285 gen_helper_load_purr(cpu_gpr[gprn], cpu_env);
289 static void spr_read_hdecr(DisasContext *ctx, int gprn, int sprn)
291 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
294 gen_helper_load_hdecr(cpu_gpr[gprn], cpu_env);
295 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
297 gen_stop_exception(ctx);
301 static void spr_write_hdecr(DisasContext *ctx, int sprn, int gprn)
303 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
306 gen_helper_store_hdecr(cpu_env, cpu_gpr[gprn]);
307 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
309 gen_stop_exception(ctx);
316 #if !defined(CONFIG_USER_ONLY)
317 /* IBAT0U...IBAT0U */
318 /* IBAT0L...IBAT7L */
319 static void spr_read_ibat(DisasContext *ctx, int gprn, int sprn)
321 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
324 static void spr_read_ibat_h(DisasContext *ctx, int gprn, int sprn)
326 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][((sprn - SPR_IBAT4U) / 2) + 4]));
329 static void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn)
331 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
332 gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
333 tcg_temp_free_i32(t0);
336 static void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn)
338 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4U) / 2) + 4);
339 gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
340 tcg_temp_free_i32(t0);
343 static void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn)
345 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2);
346 gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
347 tcg_temp_free_i32(t0);
350 static void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn)
352 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4L) / 2) + 4);
353 gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
354 tcg_temp_free_i32(t0);
357 /* DBAT0U...DBAT7U */
358 /* DBAT0L...DBAT7L */
359 static void spr_read_dbat(DisasContext *ctx, int gprn, int sprn)
361 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][(sprn - SPR_DBAT0U) / 2]));
364 static void spr_read_dbat_h(DisasContext *ctx, int gprn, int sprn)
366 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][((sprn - SPR_DBAT4U) / 2) + 4]));
369 static void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn)
371 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2);
372 gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
373 tcg_temp_free_i32(t0);
376 static void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn)
378 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4);
379 gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
380 tcg_temp_free_i32(t0);
383 static void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn)
385 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2);
386 gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
387 tcg_temp_free_i32(t0);
390 static void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn)
392 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4);
393 gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
394 tcg_temp_free_i32(t0);
398 static void spr_write_sdr1(DisasContext *ctx, int sprn, int gprn)
400 gen_helper_store_sdr1(cpu_env, cpu_gpr[gprn]);
403 #if defined(TARGET_PPC64)
404 /* 64 bits PowerPC specific SPRs */
406 static void spr_write_pidr(DisasContext *ctx, int sprn, int gprn)
408 gen_helper_store_pidr(cpu_env, cpu_gpr[gprn]);
411 static void spr_write_lpidr(DisasContext *ctx, int sprn, int gprn)
413 gen_helper_store_lpidr(cpu_env, cpu_gpr[gprn]);
416 static void spr_read_hior(DisasContext *ctx, int gprn, int sprn)
418 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, excp_prefix));
421 static void spr_write_hior(DisasContext *ctx, int sprn, int gprn)
423 TCGv t0 = tcg_temp_new();
424 tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL);
425 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
428 static void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn)
430 gen_helper_store_ptcr(cpu_env, cpu_gpr[gprn]);
433 static void spr_write_pcr(DisasContext *ctx, int sprn, int gprn)
435 gen_helper_store_pcr(cpu_env, cpu_gpr[gprn]);
440 /* PowerPC 601 specific registers */
442 static void spr_read_601_rtcl(DisasContext *ctx, int gprn, int sprn)
444 gen_helper_load_601_rtcl(cpu_gpr[gprn], cpu_env);
447 static void spr_read_601_rtcu(DisasContext *ctx, int gprn, int sprn)
449 gen_helper_load_601_rtcu(cpu_gpr[gprn], cpu_env);
452 #if !defined(CONFIG_USER_ONLY)
453 static void spr_write_601_rtcu(DisasContext *ctx, int sprn, int gprn)
455 gen_helper_store_601_rtcu(cpu_env, cpu_gpr[gprn]);
458 static void spr_write_601_rtcl(DisasContext *ctx, int sprn, int gprn)
460 gen_helper_store_601_rtcl(cpu_env, cpu_gpr[gprn]);
463 static void spr_write_hid0_601(DisasContext *ctx, int sprn, int gprn)
465 gen_helper_store_hid0_601(cpu_env, cpu_gpr[gprn]);
466 /* Must stop the translation as endianness may have changed */
467 gen_stop_exception(ctx);
472 #if !defined(CONFIG_USER_ONLY)
473 static void spr_read_601_ubat(DisasContext *ctx, int gprn, int sprn)
475 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
478 static void spr_write_601_ubatu(DisasContext *ctx, int sprn, int gprn)
480 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
481 gen_helper_store_601_batl(cpu_env, t0, cpu_gpr[gprn]);
482 tcg_temp_free_i32(t0);
485 static void spr_write_601_ubatl(DisasContext *ctx, int sprn, int gprn)
487 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
488 gen_helper_store_601_batu(cpu_env, t0, cpu_gpr[gprn]);
489 tcg_temp_free_i32(t0);
493 /* PowerPC 40x specific registers */
494 #if !defined(CONFIG_USER_ONLY)
495 static void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn)
497 gen_helper_load_40x_pit(cpu_gpr[gprn], cpu_env);
500 static void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn)
502 gen_helper_store_40x_pit(cpu_env, cpu_gpr[gprn]);
505 static void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn)
507 gen_store_spr(sprn, cpu_gpr[gprn]);
508 gen_helper_store_40x_dbcr0(cpu_env, cpu_gpr[gprn]);
509 /* We must stop translation as we may have rebooted */
510 gen_stop_exception(ctx);
513 static void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn)
515 gen_helper_store_40x_sler(cpu_env, cpu_gpr[gprn]);
518 static void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn)
520 gen_helper_store_booke_tcr(cpu_env, cpu_gpr[gprn]);
523 static void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn)
525 gen_helper_store_booke_tsr(cpu_env, cpu_gpr[gprn]);
529 /* PowerPC 403 specific registers */
530 /* PBL1 / PBU1 / PBL2 / PBU2 */
531 #if !defined(CONFIG_USER_ONLY)
532 static void spr_read_403_pbr(DisasContext *ctx, int gprn, int sprn)
534 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, pb[sprn - SPR_403_PBL1]));
537 static void spr_write_403_pbr(DisasContext *ctx, int sprn, int gprn)
539 TCGv_i32 t0 = tcg_const_i32(sprn - SPR_403_PBL1);
540 gen_helper_store_403_pbr(cpu_env, t0, cpu_gpr[gprn]);
541 tcg_temp_free_i32(t0);
544 static void spr_write_pir(DisasContext *ctx, int sprn, int gprn)
546 TCGv t0 = tcg_temp_new();
547 tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF);
548 gen_store_spr(SPR_PIR, t0);
553 /* SPE specific registers */
554 static void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn)
556 TCGv_i32 t0 = tcg_temp_new_i32();
557 tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
558 tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0);
559 tcg_temp_free_i32(t0);
562 static void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn)
564 TCGv_i32 t0 = tcg_temp_new_i32();
565 tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]);
566 tcg_gen_st_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
567 tcg_temp_free_i32(t0);
570 #if !defined(CONFIG_USER_ONLY)
571 /* Callback used to write the exception vector base */
572 static void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn)
574 TCGv t0 = tcg_temp_new();
575 tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivpr_mask));
576 tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
577 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
578 gen_store_spr(sprn, t0);
582 static void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn)
586 if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
587 sprn_offs = sprn - SPR_BOOKE_IVOR0;
588 } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
589 sprn_offs = sprn - SPR_BOOKE_IVOR32 + 32;
590 } else if (sprn >= SPR_BOOKE_IVOR38 && sprn <= SPR_BOOKE_IVOR42) {
591 sprn_offs = sprn - SPR_BOOKE_IVOR38 + 38;
593 printf("Trying to write an unknown exception vector %d %03x\n",
595 gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
599 TCGv t0 = tcg_temp_new();
600 tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivor_mask));
601 tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
602 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_vectors[sprn_offs]));
603 gen_store_spr(sprn, t0);
608 static inline void vscr_init(CPUPPCState *env, uint32_t val)
610 /* Altivec always uses round-to-nearest */
611 set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
612 helper_mtvscr(env, val);
615 #ifdef CONFIG_USER_ONLY
616 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
617 oea_read, oea_write, one_reg_id, initial_value) \
618 _spr_register(env, num, name, uea_read, uea_write, initial_value)
619 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
620 oea_read, oea_write, hea_read, hea_write, \
621 one_reg_id, initial_value) \
622 _spr_register(env, num, name, uea_read, uea_write, initial_value)
624 #if !defined(CONFIG_KVM)
625 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
626 oea_read, oea_write, one_reg_id, initial_value) \
627 _spr_register(env, num, name, uea_read, uea_write, \
628 oea_read, oea_write, oea_read, oea_write, initial_value)
629 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
630 oea_read, oea_write, hea_read, hea_write, \
631 one_reg_id, initial_value) \
632 _spr_register(env, num, name, uea_read, uea_write, \
633 oea_read, oea_write, hea_read, hea_write, initial_value)
635 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
636 oea_read, oea_write, one_reg_id, initial_value) \
637 _spr_register(env, num, name, uea_read, uea_write, \
638 oea_read, oea_write, oea_read, oea_write, \
639 one_reg_id, initial_value)
640 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
641 oea_read, oea_write, hea_read, hea_write, \
642 one_reg_id, initial_value) \
643 _spr_register(env, num, name, uea_read, uea_write, \
644 oea_read, oea_write, hea_read, hea_write, \
645 one_reg_id, initial_value)
649 #define spr_register(env, num, name, uea_read, uea_write, \
650 oea_read, oea_write, initial_value) \
651 spr_register_kvm(env, num, name, uea_read, uea_write, \
652 oea_read, oea_write, 0, initial_value)
654 #define spr_register_hv(env, num, name, uea_read, uea_write, \
655 oea_read, oea_write, hea_read, hea_write, \
657 spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
658 oea_read, oea_write, hea_read, hea_write, \
661 static inline void _spr_register(CPUPPCState *env, int num,
663 void (*uea_read)(DisasContext *ctx, int gprn, int sprn),
664 void (*uea_write)(DisasContext *ctx, int sprn, int gprn),
665 #if !defined(CONFIG_USER_ONLY)
667 void (*oea_read)(DisasContext *ctx, int gprn, int sprn),
668 void (*oea_write)(DisasContext *ctx, int sprn, int gprn),
669 void (*hea_read)(DisasContext *opaque, int gprn, int sprn),
670 void (*hea_write)(DisasContext *opaque, int sprn, int gprn),
672 #if defined(CONFIG_KVM)
675 target_ulong initial_value)
679 spr = &env->spr_cb[num];
680 if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
681 #if !defined(CONFIG_USER_ONLY)
682 spr->oea_read != NULL || spr->oea_write != NULL ||
684 spr->uea_read != NULL || spr->uea_write != NULL) {
685 printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
688 #if defined(PPC_DEBUG_SPR)
689 printf("*** register spr %d (%03x) %s val " TARGET_FMT_lx "\n", num, num,
690 name, initial_value);
693 spr->uea_read = uea_read;
694 spr->uea_write = uea_write;
695 #if !defined(CONFIG_USER_ONLY)
696 spr->oea_read = oea_read;
697 spr->oea_write = oea_write;
698 spr->hea_read = hea_read;
699 spr->hea_write = hea_write;
701 #if defined(CONFIG_KVM)
702 spr->one_reg_id = one_reg_id,
704 env->spr[num] = spr->default_value = initial_value;
707 /* Generic PowerPC SPRs */
708 static void gen_spr_generic(CPUPPCState *env)
710 /* Integer processing */
711 spr_register(env, SPR_XER, "XER",
712 &spr_read_xer, &spr_write_xer,
713 &spr_read_xer, &spr_write_xer,
716 spr_register(env, SPR_LR, "LR",
717 &spr_read_lr, &spr_write_lr,
718 &spr_read_lr, &spr_write_lr,
720 spr_register(env, SPR_CTR, "CTR",
721 &spr_read_ctr, &spr_write_ctr,
722 &spr_read_ctr, &spr_write_ctr,
724 /* Interrupt processing */
725 spr_register(env, SPR_SRR0, "SRR0",
726 SPR_NOACCESS, SPR_NOACCESS,
727 &spr_read_generic, &spr_write_generic,
729 spr_register(env, SPR_SRR1, "SRR1",
730 SPR_NOACCESS, SPR_NOACCESS,
731 &spr_read_generic, &spr_write_generic,
733 /* Processor control */
734 spr_register(env, SPR_SPRG0, "SPRG0",
735 SPR_NOACCESS, SPR_NOACCESS,
736 &spr_read_generic, &spr_write_generic,
738 spr_register(env, SPR_SPRG1, "SPRG1",
739 SPR_NOACCESS, SPR_NOACCESS,
740 &spr_read_generic, &spr_write_generic,
742 spr_register(env, SPR_SPRG2, "SPRG2",
743 SPR_NOACCESS, SPR_NOACCESS,
744 &spr_read_generic, &spr_write_generic,
746 spr_register(env, SPR_SPRG3, "SPRG3",
747 SPR_NOACCESS, SPR_NOACCESS,
748 &spr_read_generic, &spr_write_generic,
752 /* SPR common to all non-embedded PowerPC, including 601 */
753 static void gen_spr_ne_601(CPUPPCState *env)
755 /* Exception processing */
756 spr_register_kvm(env, SPR_DSISR, "DSISR",
757 SPR_NOACCESS, SPR_NOACCESS,
758 &spr_read_generic, &spr_write_generic,
759 KVM_REG_PPC_DSISR, 0x00000000);
760 spr_register_kvm(env, SPR_DAR, "DAR",
761 SPR_NOACCESS, SPR_NOACCESS,
762 &spr_read_generic, &spr_write_generic,
763 KVM_REG_PPC_DAR, 0x00000000);
765 spr_register(env, SPR_DECR, "DECR",
766 SPR_NOACCESS, SPR_NOACCESS,
767 &spr_read_decr, &spr_write_decr,
771 /* Storage Description Register 1 */
772 static void gen_spr_sdr1(CPUPPCState *env)
774 #ifndef CONFIG_USER_ONLY
775 if (env->has_hv_mode) {
776 /* SDR1 is a hypervisor resource on CPUs which have a
778 spr_register_hv(env, SPR_SDR1, "SDR1",
779 SPR_NOACCESS, SPR_NOACCESS,
780 SPR_NOACCESS, SPR_NOACCESS,
781 &spr_read_generic, &spr_write_sdr1,
784 spr_register(env, SPR_SDR1, "SDR1",
785 SPR_NOACCESS, SPR_NOACCESS,
786 &spr_read_generic, &spr_write_sdr1,
793 static void gen_low_BATs(CPUPPCState *env)
795 #if !defined(CONFIG_USER_ONLY)
796 spr_register(env, SPR_IBAT0U, "IBAT0U",
797 SPR_NOACCESS, SPR_NOACCESS,
798 &spr_read_ibat, &spr_write_ibatu,
800 spr_register(env, SPR_IBAT0L, "IBAT0L",
801 SPR_NOACCESS, SPR_NOACCESS,
802 &spr_read_ibat, &spr_write_ibatl,
804 spr_register(env, SPR_IBAT1U, "IBAT1U",
805 SPR_NOACCESS, SPR_NOACCESS,
806 &spr_read_ibat, &spr_write_ibatu,
808 spr_register(env, SPR_IBAT1L, "IBAT1L",
809 SPR_NOACCESS, SPR_NOACCESS,
810 &spr_read_ibat, &spr_write_ibatl,
812 spr_register(env, SPR_IBAT2U, "IBAT2U",
813 SPR_NOACCESS, SPR_NOACCESS,
814 &spr_read_ibat, &spr_write_ibatu,
816 spr_register(env, SPR_IBAT2L, "IBAT2L",
817 SPR_NOACCESS, SPR_NOACCESS,
818 &spr_read_ibat, &spr_write_ibatl,
820 spr_register(env, SPR_IBAT3U, "IBAT3U",
821 SPR_NOACCESS, SPR_NOACCESS,
822 &spr_read_ibat, &spr_write_ibatu,
824 spr_register(env, SPR_IBAT3L, "IBAT3L",
825 SPR_NOACCESS, SPR_NOACCESS,
826 &spr_read_ibat, &spr_write_ibatl,
828 spr_register(env, SPR_DBAT0U, "DBAT0U",
829 SPR_NOACCESS, SPR_NOACCESS,
830 &spr_read_dbat, &spr_write_dbatu,
832 spr_register(env, SPR_DBAT0L, "DBAT0L",
833 SPR_NOACCESS, SPR_NOACCESS,
834 &spr_read_dbat, &spr_write_dbatl,
836 spr_register(env, SPR_DBAT1U, "DBAT1U",
837 SPR_NOACCESS, SPR_NOACCESS,
838 &spr_read_dbat, &spr_write_dbatu,
840 spr_register(env, SPR_DBAT1L, "DBAT1L",
841 SPR_NOACCESS, SPR_NOACCESS,
842 &spr_read_dbat, &spr_write_dbatl,
844 spr_register(env, SPR_DBAT2U, "DBAT2U",
845 SPR_NOACCESS, SPR_NOACCESS,
846 &spr_read_dbat, &spr_write_dbatu,
848 spr_register(env, SPR_DBAT2L, "DBAT2L",
849 SPR_NOACCESS, SPR_NOACCESS,
850 &spr_read_dbat, &spr_write_dbatl,
852 spr_register(env, SPR_DBAT3U, "DBAT3U",
853 SPR_NOACCESS, SPR_NOACCESS,
854 &spr_read_dbat, &spr_write_dbatu,
856 spr_register(env, SPR_DBAT3L, "DBAT3L",
857 SPR_NOACCESS, SPR_NOACCESS,
858 &spr_read_dbat, &spr_write_dbatl,
865 static void gen_high_BATs(CPUPPCState *env)
867 #if !defined(CONFIG_USER_ONLY)
868 spr_register(env, SPR_IBAT4U, "IBAT4U",
869 SPR_NOACCESS, SPR_NOACCESS,
870 &spr_read_ibat_h, &spr_write_ibatu_h,
872 spr_register(env, SPR_IBAT4L, "IBAT4L",
873 SPR_NOACCESS, SPR_NOACCESS,
874 &spr_read_ibat_h, &spr_write_ibatl_h,
876 spr_register(env, SPR_IBAT5U, "IBAT5U",
877 SPR_NOACCESS, SPR_NOACCESS,
878 &spr_read_ibat_h, &spr_write_ibatu_h,
880 spr_register(env, SPR_IBAT5L, "IBAT5L",
881 SPR_NOACCESS, SPR_NOACCESS,
882 &spr_read_ibat_h, &spr_write_ibatl_h,
884 spr_register(env, SPR_IBAT6U, "IBAT6U",
885 SPR_NOACCESS, SPR_NOACCESS,
886 &spr_read_ibat_h, &spr_write_ibatu_h,
888 spr_register(env, SPR_IBAT6L, "IBAT6L",
889 SPR_NOACCESS, SPR_NOACCESS,
890 &spr_read_ibat_h, &spr_write_ibatl_h,
892 spr_register(env, SPR_IBAT7U, "IBAT7U",
893 SPR_NOACCESS, SPR_NOACCESS,
894 &spr_read_ibat_h, &spr_write_ibatu_h,
896 spr_register(env, SPR_IBAT7L, "IBAT7L",
897 SPR_NOACCESS, SPR_NOACCESS,
898 &spr_read_ibat_h, &spr_write_ibatl_h,
900 spr_register(env, SPR_DBAT4U, "DBAT4U",
901 SPR_NOACCESS, SPR_NOACCESS,
902 &spr_read_dbat_h, &spr_write_dbatu_h,
904 spr_register(env, SPR_DBAT4L, "DBAT4L",
905 SPR_NOACCESS, SPR_NOACCESS,
906 &spr_read_dbat_h, &spr_write_dbatl_h,
908 spr_register(env, SPR_DBAT5U, "DBAT5U",
909 SPR_NOACCESS, SPR_NOACCESS,
910 &spr_read_dbat_h, &spr_write_dbatu_h,
912 spr_register(env, SPR_DBAT5L, "DBAT5L",
913 SPR_NOACCESS, SPR_NOACCESS,
914 &spr_read_dbat_h, &spr_write_dbatl_h,
916 spr_register(env, SPR_DBAT6U, "DBAT6U",
917 SPR_NOACCESS, SPR_NOACCESS,
918 &spr_read_dbat_h, &spr_write_dbatu_h,
920 spr_register(env, SPR_DBAT6L, "DBAT6L",
921 SPR_NOACCESS, SPR_NOACCESS,
922 &spr_read_dbat_h, &spr_write_dbatl_h,
924 spr_register(env, SPR_DBAT7U, "DBAT7U",
925 SPR_NOACCESS, SPR_NOACCESS,
926 &spr_read_dbat_h, &spr_write_dbatu_h,
928 spr_register(env, SPR_DBAT7L, "DBAT7L",
929 SPR_NOACCESS, SPR_NOACCESS,
930 &spr_read_dbat_h, &spr_write_dbatl_h,
936 /* Generic PowerPC time base */
937 static void gen_tbl(CPUPPCState *env)
939 spr_register(env, SPR_VTBL, "TBL",
940 &spr_read_tbl, SPR_NOACCESS,
941 &spr_read_tbl, SPR_NOACCESS,
943 spr_register(env, SPR_TBL, "TBL",
944 &spr_read_tbl, SPR_NOACCESS,
945 &spr_read_tbl, &spr_write_tbl,
947 spr_register(env, SPR_VTBU, "TBU",
948 &spr_read_tbu, SPR_NOACCESS,
949 &spr_read_tbu, SPR_NOACCESS,
951 spr_register(env, SPR_TBU, "TBU",
952 &spr_read_tbu, SPR_NOACCESS,
953 &spr_read_tbu, &spr_write_tbu,
957 /* Softare table search registers */
958 static void gen_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways)
960 #if !defined(CONFIG_USER_ONLY)
961 env->nb_tlb = nb_tlbs;
962 env->nb_ways = nb_ways;
964 env->tlb_type = TLB_6XX;
965 spr_register(env, SPR_DMISS, "DMISS",
966 SPR_NOACCESS, SPR_NOACCESS,
967 &spr_read_generic, SPR_NOACCESS,
969 spr_register(env, SPR_DCMP, "DCMP",
970 SPR_NOACCESS, SPR_NOACCESS,
971 &spr_read_generic, SPR_NOACCESS,
973 spr_register(env, SPR_HASH1, "HASH1",
974 SPR_NOACCESS, SPR_NOACCESS,
975 &spr_read_generic, SPR_NOACCESS,
977 spr_register(env, SPR_HASH2, "HASH2",
978 SPR_NOACCESS, SPR_NOACCESS,
979 &spr_read_generic, SPR_NOACCESS,
981 spr_register(env, SPR_IMISS, "IMISS",
982 SPR_NOACCESS, SPR_NOACCESS,
983 &spr_read_generic, SPR_NOACCESS,
985 spr_register(env, SPR_ICMP, "ICMP",
986 SPR_NOACCESS, SPR_NOACCESS,
987 &spr_read_generic, SPR_NOACCESS,
989 spr_register(env, SPR_RPA, "RPA",
990 SPR_NOACCESS, SPR_NOACCESS,
991 &spr_read_generic, &spr_write_generic,
996 /* SPR common to MPC755 and G2 */
997 static void gen_spr_G2_755(CPUPPCState *env)
1000 spr_register(env, SPR_SPRG4, "SPRG4",
1001 SPR_NOACCESS, SPR_NOACCESS,
1002 &spr_read_generic, &spr_write_generic,
1004 spr_register(env, SPR_SPRG5, "SPRG5",
1005 SPR_NOACCESS, SPR_NOACCESS,
1006 &spr_read_generic, &spr_write_generic,
1008 spr_register(env, SPR_SPRG6, "SPRG6",
1009 SPR_NOACCESS, SPR_NOACCESS,
1010 &spr_read_generic, &spr_write_generic,
1012 spr_register(env, SPR_SPRG7, "SPRG7",
1013 SPR_NOACCESS, SPR_NOACCESS,
1014 &spr_read_generic, &spr_write_generic,
1018 /* SPR common to all 7xx PowerPC implementations */
1019 static void gen_spr_7xx(CPUPPCState *env)
1022 /* XXX : not implemented */
1023 spr_register_kvm(env, SPR_DABR, "DABR",
1024 SPR_NOACCESS, SPR_NOACCESS,
1025 &spr_read_generic, &spr_write_generic,
1026 KVM_REG_PPC_DABR, 0x00000000);
1027 /* XXX : not implemented */
1028 spr_register(env, SPR_IABR, "IABR",
1029 SPR_NOACCESS, SPR_NOACCESS,
1030 &spr_read_generic, &spr_write_generic,
1032 /* Cache management */
1033 /* XXX : not implemented */
1034 spr_register(env, SPR_ICTC, "ICTC",
1035 SPR_NOACCESS, SPR_NOACCESS,
1036 &spr_read_generic, &spr_write_generic,
1038 /* Performance monitors */
1039 /* XXX : not implemented */
1040 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
1041 SPR_NOACCESS, SPR_NOACCESS,
1042 &spr_read_generic, &spr_write_generic,
1044 /* XXX : not implemented */
1045 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
1046 SPR_NOACCESS, SPR_NOACCESS,
1047 &spr_read_generic, &spr_write_generic,
1049 /* XXX : not implemented */
1050 spr_register(env, SPR_7XX_PMC1, "PMC1",
1051 SPR_NOACCESS, SPR_NOACCESS,
1052 &spr_read_generic, &spr_write_generic,
1054 /* XXX : not implemented */
1055 spr_register(env, SPR_7XX_PMC2, "PMC2",
1056 SPR_NOACCESS, SPR_NOACCESS,
1057 &spr_read_generic, &spr_write_generic,
1059 /* XXX : not implemented */
1060 spr_register(env, SPR_7XX_PMC3, "PMC3",
1061 SPR_NOACCESS, SPR_NOACCESS,
1062 &spr_read_generic, &spr_write_generic,
1064 /* XXX : not implemented */
1065 spr_register(env, SPR_7XX_PMC4, "PMC4",
1066 SPR_NOACCESS, SPR_NOACCESS,
1067 &spr_read_generic, &spr_write_generic,
1069 /* XXX : not implemented */
1070 spr_register(env, SPR_7XX_SIAR, "SIAR",
1071 SPR_NOACCESS, SPR_NOACCESS,
1072 &spr_read_generic, SPR_NOACCESS,
1074 /* XXX : not implemented */
1075 spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
1076 &spr_read_ureg, SPR_NOACCESS,
1077 &spr_read_ureg, SPR_NOACCESS,
1079 /* XXX : not implemented */
1080 spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
1081 &spr_read_ureg, SPR_NOACCESS,
1082 &spr_read_ureg, SPR_NOACCESS,
1084 /* XXX : not implemented */
1085 spr_register(env, SPR_7XX_UPMC1, "UPMC1",
1086 &spr_read_ureg, SPR_NOACCESS,
1087 &spr_read_ureg, SPR_NOACCESS,
1089 /* XXX : not implemented */
1090 spr_register(env, SPR_7XX_UPMC2, "UPMC2",
1091 &spr_read_ureg, SPR_NOACCESS,
1092 &spr_read_ureg, SPR_NOACCESS,
1094 /* XXX : not implemented */
1095 spr_register(env, SPR_7XX_UPMC3, "UPMC3",
1096 &spr_read_ureg, SPR_NOACCESS,
1097 &spr_read_ureg, SPR_NOACCESS,
1099 /* XXX : not implemented */
1100 spr_register(env, SPR_7XX_UPMC4, "UPMC4",
1101 &spr_read_ureg, SPR_NOACCESS,
1102 &spr_read_ureg, SPR_NOACCESS,
1104 /* XXX : not implemented */
1105 spr_register(env, SPR_7XX_USIAR, "USIAR",
1106 &spr_read_ureg, SPR_NOACCESS,
1107 &spr_read_ureg, SPR_NOACCESS,
1109 /* External access control */
1110 /* XXX : not implemented */
1111 spr_register(env, SPR_EAR, "EAR",
1112 SPR_NOACCESS, SPR_NOACCESS,
1113 &spr_read_generic, &spr_write_generic,
1118 #ifndef CONFIG_USER_ONLY
1119 static void spr_write_amr(DisasContext *ctx, int sprn, int gprn)
1121 TCGv t0 = tcg_temp_new();
1122 TCGv t1 = tcg_temp_new();
1123 TCGv t2 = tcg_temp_new();
1125 /* Note, the HV=1 PR=0 case is handled earlier by simply using
1126 * spr_write_generic for HV mode in the SPR table
1129 /* Build insertion mask into t1 based on context */
1131 gen_load_spr(t1, SPR_UAMOR);
1133 gen_load_spr(t1, SPR_AMOR);
1136 /* Mask new bits into t2 */
1137 tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
1139 /* Load AMR and clear new bits in t0 */
1140 gen_load_spr(t0, SPR_AMR);
1141 tcg_gen_andc_tl(t0, t0, t1);
1143 /* Or'in new bits and write it out */
1144 tcg_gen_or_tl(t0, t0, t2);
1145 gen_store_spr(SPR_AMR, t0);
1146 spr_store_dump_spr(SPR_AMR);
1153 static void spr_write_uamor(DisasContext *ctx, int sprn, int gprn)
1155 TCGv t0 = tcg_temp_new();
1156 TCGv t1 = tcg_temp_new();
1157 TCGv t2 = tcg_temp_new();
1159 /* Note, the HV=1 case is handled earlier by simply using
1160 * spr_write_generic for HV mode in the SPR table
1163 /* Build insertion mask into t1 based on context */
1164 gen_load_spr(t1, SPR_AMOR);
1166 /* Mask new bits into t2 */
1167 tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
1169 /* Load AMR and clear new bits in t0 */
1170 gen_load_spr(t0, SPR_UAMOR);
1171 tcg_gen_andc_tl(t0, t0, t1);
1173 /* Or'in new bits and write it out */
1174 tcg_gen_or_tl(t0, t0, t2);
1175 gen_store_spr(SPR_UAMOR, t0);
1176 spr_store_dump_spr(SPR_UAMOR);
1183 static void spr_write_iamr(DisasContext *ctx, int sprn, int gprn)
1185 TCGv t0 = tcg_temp_new();
1186 TCGv t1 = tcg_temp_new();
1187 TCGv t2 = tcg_temp_new();
1189 /* Note, the HV=1 case is handled earlier by simply using
1190 * spr_write_generic for HV mode in the SPR table
1193 /* Build insertion mask into t1 based on context */
1194 gen_load_spr(t1, SPR_AMOR);
1196 /* Mask new bits into t2 */
1197 tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
1199 /* Load AMR and clear new bits in t0 */
1200 gen_load_spr(t0, SPR_IAMR);
1201 tcg_gen_andc_tl(t0, t0, t1);
1203 /* Or'in new bits and write it out */
1204 tcg_gen_or_tl(t0, t0, t2);
1205 gen_store_spr(SPR_IAMR, t0);
1206 spr_store_dump_spr(SPR_IAMR);
1212 #endif /* CONFIG_USER_ONLY */
1214 static void gen_spr_amr(CPUPPCState *env)
1216 #ifndef CONFIG_USER_ONLY
1217 /* Virtual Page Class Key protection */
1218 /* The AMR is accessible either via SPR 13 or SPR 29. 13 is
1219 * userspace accessible, 29 is privileged. So we only need to set
1220 * the kvm ONE_REG id on one of them, we use 29 */
1221 spr_register(env, SPR_UAMR, "UAMR",
1222 &spr_read_generic, &spr_write_amr,
1223 &spr_read_generic, &spr_write_amr,
1225 spr_register_kvm_hv(env, SPR_AMR, "AMR",
1226 SPR_NOACCESS, SPR_NOACCESS,
1227 &spr_read_generic, &spr_write_amr,
1228 &spr_read_generic, &spr_write_generic,
1229 KVM_REG_PPC_AMR, 0);
1230 spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR",
1231 SPR_NOACCESS, SPR_NOACCESS,
1232 &spr_read_generic, &spr_write_uamor,
1233 &spr_read_generic, &spr_write_generic,
1234 KVM_REG_PPC_UAMOR, 0);
1235 spr_register_hv(env, SPR_AMOR, "AMOR",
1236 SPR_NOACCESS, SPR_NOACCESS,
1237 SPR_NOACCESS, SPR_NOACCESS,
1238 &spr_read_generic, &spr_write_generic,
1240 #endif /* !CONFIG_USER_ONLY */
1243 static void gen_spr_iamr(CPUPPCState *env)
1245 #ifndef CONFIG_USER_ONLY
1246 spr_register_kvm_hv(env, SPR_IAMR, "IAMR",
1247 SPR_NOACCESS, SPR_NOACCESS,
1248 &spr_read_generic, &spr_write_iamr,
1249 &spr_read_generic, &spr_write_generic,
1250 KVM_REG_PPC_IAMR, 0);
1251 #endif /* !CONFIG_USER_ONLY */
1253 #endif /* TARGET_PPC64 */
1255 #ifndef CONFIG_USER_ONLY
1256 static void spr_read_thrm(DisasContext *ctx, int gprn, int sprn)
1258 gen_helper_fixup_thrm(cpu_env);
1259 gen_load_spr(cpu_gpr[gprn], sprn);
1260 spr_load_dump_spr(sprn);
1262 #endif /* !CONFIG_USER_ONLY */
1264 static void gen_spr_thrm(CPUPPCState *env)
1266 /* Thermal management */
1267 /* XXX : not implemented */
1268 spr_register(env, SPR_THRM1, "THRM1",
1269 SPR_NOACCESS, SPR_NOACCESS,
1270 &spr_read_thrm, &spr_write_generic,
1272 /* XXX : not implemented */
1273 spr_register(env, SPR_THRM2, "THRM2",
1274 SPR_NOACCESS, SPR_NOACCESS,
1275 &spr_read_thrm, &spr_write_generic,
1277 /* XXX : not implemented */
1278 spr_register(env, SPR_THRM3, "THRM3",
1279 SPR_NOACCESS, SPR_NOACCESS,
1280 &spr_read_thrm, &spr_write_generic,
1284 /* SPR specific to PowerPC 604 implementation */
1285 static void gen_spr_604(CPUPPCState *env)
1287 /* Processor identification */
1288 spr_register(env, SPR_PIR, "PIR",
1289 SPR_NOACCESS, SPR_NOACCESS,
1290 &spr_read_generic, &spr_write_pir,
1293 /* XXX : not implemented */
1294 spr_register(env, SPR_IABR, "IABR",
1295 SPR_NOACCESS, SPR_NOACCESS,
1296 &spr_read_generic, &spr_write_generic,
1298 /* XXX : not implemented */
1299 spr_register_kvm(env, SPR_DABR, "DABR",
1300 SPR_NOACCESS, SPR_NOACCESS,
1301 &spr_read_generic, &spr_write_generic,
1302 KVM_REG_PPC_DABR, 0x00000000);
1303 /* Performance counters */
1304 /* XXX : not implemented */
1305 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
1306 SPR_NOACCESS, SPR_NOACCESS,
1307 &spr_read_generic, &spr_write_generic,
1309 /* XXX : not implemented */
1310 spr_register(env, SPR_7XX_PMC1, "PMC1",
1311 SPR_NOACCESS, SPR_NOACCESS,
1312 &spr_read_generic, &spr_write_generic,
1314 /* XXX : not implemented */
1315 spr_register(env, SPR_7XX_PMC2, "PMC2",
1316 SPR_NOACCESS, SPR_NOACCESS,
1317 &spr_read_generic, &spr_write_generic,
1319 /* XXX : not implemented */
1320 spr_register(env, SPR_7XX_SIAR, "SIAR",
1321 SPR_NOACCESS, SPR_NOACCESS,
1322 &spr_read_generic, SPR_NOACCESS,
1324 /* XXX : not implemented */
1325 spr_register(env, SPR_SDA, "SDA",
1326 SPR_NOACCESS, SPR_NOACCESS,
1327 &spr_read_generic, SPR_NOACCESS,
1329 /* External access control */
1330 /* XXX : not implemented */
1331 spr_register(env, SPR_EAR, "EAR",
1332 SPR_NOACCESS, SPR_NOACCESS,
1333 &spr_read_generic, &spr_write_generic,
1337 /* SPR specific to PowerPC 603 implementation */
1338 static void gen_spr_603(CPUPPCState *env)
1340 /* External access control */
1341 /* XXX : not implemented */
1342 spr_register(env, SPR_EAR, "EAR",
1343 SPR_NOACCESS, SPR_NOACCESS,
1344 &spr_read_generic, &spr_write_generic,
1347 /* XXX : not implemented */
1348 spr_register(env, SPR_IABR, "IABR",
1349 SPR_NOACCESS, SPR_NOACCESS,
1350 &spr_read_generic, &spr_write_generic,
1355 /* SPR specific to PowerPC G2 implementation */
1356 static void gen_spr_G2(CPUPPCState *env)
1358 /* Memory base address */
1360 /* XXX : not implemented */
1361 spr_register(env, SPR_MBAR, "MBAR",
1362 SPR_NOACCESS, SPR_NOACCESS,
1363 &spr_read_generic, &spr_write_generic,
1365 /* Exception processing */
1366 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1367 SPR_NOACCESS, SPR_NOACCESS,
1368 &spr_read_generic, &spr_write_generic,
1370 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1371 SPR_NOACCESS, SPR_NOACCESS,
1372 &spr_read_generic, &spr_write_generic,
1375 /* XXX : not implemented */
1376 spr_register(env, SPR_DABR, "DABR",
1377 SPR_NOACCESS, SPR_NOACCESS,
1378 &spr_read_generic, &spr_write_generic,
1380 /* XXX : not implemented */
1381 spr_register(env, SPR_DABR2, "DABR2",
1382 SPR_NOACCESS, SPR_NOACCESS,
1383 &spr_read_generic, &spr_write_generic,
1385 /* XXX : not implemented */
1386 spr_register(env, SPR_IABR, "IABR",
1387 SPR_NOACCESS, SPR_NOACCESS,
1388 &spr_read_generic, &spr_write_generic,
1390 /* XXX : not implemented */
1391 spr_register(env, SPR_IABR2, "IABR2",
1392 SPR_NOACCESS, SPR_NOACCESS,
1393 &spr_read_generic, &spr_write_generic,
1395 /* XXX : not implemented */
1396 spr_register(env, SPR_IBCR, "IBCR",
1397 SPR_NOACCESS, SPR_NOACCESS,
1398 &spr_read_generic, &spr_write_generic,
1400 /* XXX : not implemented */
1401 spr_register(env, SPR_DBCR, "DBCR",
1402 SPR_NOACCESS, SPR_NOACCESS,
1403 &spr_read_generic, &spr_write_generic,
1407 /* SPR specific to PowerPC 602 implementation */
1408 static void gen_spr_602(CPUPPCState *env)
1411 /* XXX : not implemented */
1412 spr_register(env, SPR_SER, "SER",
1413 SPR_NOACCESS, SPR_NOACCESS,
1414 &spr_read_generic, &spr_write_generic,
1416 /* XXX : not implemented */
1417 spr_register(env, SPR_SEBR, "SEBR",
1418 SPR_NOACCESS, SPR_NOACCESS,
1419 &spr_read_generic, &spr_write_generic,
1421 /* XXX : not implemented */
1422 spr_register(env, SPR_ESASRR, "ESASRR",
1423 SPR_NOACCESS, SPR_NOACCESS,
1424 &spr_read_generic, &spr_write_generic,
1426 /* Floating point status */
1427 /* XXX : not implemented */
1428 spr_register(env, SPR_SP, "SP",
1429 SPR_NOACCESS, SPR_NOACCESS,
1430 &spr_read_generic, &spr_write_generic,
1432 /* XXX : not implemented */
1433 spr_register(env, SPR_LT, "LT",
1434 SPR_NOACCESS, SPR_NOACCESS,
1435 &spr_read_generic, &spr_write_generic,
1437 /* Watchdog timer */
1438 /* XXX : not implemented */
1439 spr_register(env, SPR_TCR, "TCR",
1440 SPR_NOACCESS, SPR_NOACCESS,
1441 &spr_read_generic, &spr_write_generic,
1443 /* Interrupt base */
1444 spr_register(env, SPR_IBR, "IBR",
1445 SPR_NOACCESS, SPR_NOACCESS,
1446 &spr_read_generic, &spr_write_generic,
1448 /* XXX : not implemented */
1449 spr_register(env, SPR_IABR, "IABR",
1450 SPR_NOACCESS, SPR_NOACCESS,
1451 &spr_read_generic, &spr_write_generic,
1455 /* SPR specific to PowerPC 601 implementation */
1456 static void gen_spr_601(CPUPPCState *env)
1458 /* Multiplication/division register */
1460 spr_register(env, SPR_MQ, "MQ",
1461 &spr_read_generic, &spr_write_generic,
1462 &spr_read_generic, &spr_write_generic,
1465 spr_register(env, SPR_601_RTCU, "RTCU",
1466 SPR_NOACCESS, SPR_NOACCESS,
1467 SPR_NOACCESS, &spr_write_601_rtcu,
1469 spr_register(env, SPR_601_VRTCU, "RTCU",
1470 &spr_read_601_rtcu, SPR_NOACCESS,
1471 &spr_read_601_rtcu, SPR_NOACCESS,
1473 spr_register(env, SPR_601_RTCL, "RTCL",
1474 SPR_NOACCESS, SPR_NOACCESS,
1475 SPR_NOACCESS, &spr_write_601_rtcl,
1477 spr_register(env, SPR_601_VRTCL, "RTCL",
1478 &spr_read_601_rtcl, SPR_NOACCESS,
1479 &spr_read_601_rtcl, SPR_NOACCESS,
1483 spr_register(env, SPR_601_UDECR, "UDECR",
1484 &spr_read_decr, SPR_NOACCESS,
1485 &spr_read_decr, SPR_NOACCESS,
1488 /* External access control */
1489 /* XXX : not implemented */
1490 spr_register(env, SPR_EAR, "EAR",
1491 SPR_NOACCESS, SPR_NOACCESS,
1492 &spr_read_generic, &spr_write_generic,
1494 /* Memory management */
1495 #if !defined(CONFIG_USER_ONLY)
1496 spr_register(env, SPR_IBAT0U, "IBAT0U",
1497 SPR_NOACCESS, SPR_NOACCESS,
1498 &spr_read_601_ubat, &spr_write_601_ubatu,
1500 spr_register(env, SPR_IBAT0L, "IBAT0L",
1501 SPR_NOACCESS, SPR_NOACCESS,
1502 &spr_read_601_ubat, &spr_write_601_ubatl,
1504 spr_register(env, SPR_IBAT1U, "IBAT1U",
1505 SPR_NOACCESS, SPR_NOACCESS,
1506 &spr_read_601_ubat, &spr_write_601_ubatu,
1508 spr_register(env, SPR_IBAT1L, "IBAT1L",
1509 SPR_NOACCESS, SPR_NOACCESS,
1510 &spr_read_601_ubat, &spr_write_601_ubatl,
1512 spr_register(env, SPR_IBAT2U, "IBAT2U",
1513 SPR_NOACCESS, SPR_NOACCESS,
1514 &spr_read_601_ubat, &spr_write_601_ubatu,
1516 spr_register(env, SPR_IBAT2L, "IBAT2L",
1517 SPR_NOACCESS, SPR_NOACCESS,
1518 &spr_read_601_ubat, &spr_write_601_ubatl,
1520 spr_register(env, SPR_IBAT3U, "IBAT3U",
1521 SPR_NOACCESS, SPR_NOACCESS,
1522 &spr_read_601_ubat, &spr_write_601_ubatu,
1524 spr_register(env, SPR_IBAT3L, "IBAT3L",
1525 SPR_NOACCESS, SPR_NOACCESS,
1526 &spr_read_601_ubat, &spr_write_601_ubatl,
1532 static void gen_spr_74xx(CPUPPCState *env)
1534 /* Processor identification */
1535 spr_register(env, SPR_PIR, "PIR",
1536 SPR_NOACCESS, SPR_NOACCESS,
1537 &spr_read_generic, &spr_write_pir,
1539 /* XXX : not implemented */
1540 spr_register(env, SPR_74XX_MMCR2, "MMCR2",
1541 SPR_NOACCESS, SPR_NOACCESS,
1542 &spr_read_generic, &spr_write_generic,
1544 /* XXX : not implemented */
1545 spr_register(env, SPR_74XX_UMMCR2, "UMMCR2",
1546 &spr_read_ureg, SPR_NOACCESS,
1547 &spr_read_ureg, SPR_NOACCESS,
1549 /* XXX: not implemented */
1550 spr_register(env, SPR_BAMR, "BAMR",
1551 SPR_NOACCESS, SPR_NOACCESS,
1552 &spr_read_generic, &spr_write_generic,
1554 /* XXX : not implemented */
1555 spr_register(env, SPR_MSSCR0, "MSSCR0",
1556 SPR_NOACCESS, SPR_NOACCESS,
1557 &spr_read_generic, &spr_write_generic,
1559 /* Hardware implementation registers */
1560 /* XXX : not implemented */
1561 spr_register(env, SPR_HID0, "HID0",
1562 SPR_NOACCESS, SPR_NOACCESS,
1563 &spr_read_generic, &spr_write_generic,
1565 /* XXX : not implemented */
1566 spr_register(env, SPR_HID1, "HID1",
1567 SPR_NOACCESS, SPR_NOACCESS,
1568 &spr_read_generic, &spr_write_generic,
1571 spr_register(env, SPR_VRSAVE, "VRSAVE",
1572 &spr_read_generic, &spr_write_generic,
1573 &spr_read_generic, &spr_write_generic,
1575 /* XXX : not implemented */
1576 spr_register(env, SPR_L2CR, "L2CR",
1577 SPR_NOACCESS, SPR_NOACCESS,
1578 &spr_read_generic, spr_access_nop,
1580 /* Not strictly an SPR */
1581 vscr_init(env, 0x00010000);
1584 static void gen_l3_ctrl(CPUPPCState *env)
1587 /* XXX : not implemented */
1588 spr_register(env, SPR_L3CR, "L3CR",
1589 SPR_NOACCESS, SPR_NOACCESS,
1590 &spr_read_generic, &spr_write_generic,
1593 /* XXX : not implemented */
1594 spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1595 SPR_NOACCESS, SPR_NOACCESS,
1596 &spr_read_generic, &spr_write_generic,
1599 /* XXX : not implemented */
1600 spr_register(env, SPR_L3PM, "L3PM",
1601 SPR_NOACCESS, SPR_NOACCESS,
1602 &spr_read_generic, &spr_write_generic,
1606 static void gen_74xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways)
1608 #if !defined(CONFIG_USER_ONLY)
1609 env->nb_tlb = nb_tlbs;
1610 env->nb_ways = nb_ways;
1612 env->tlb_type = TLB_6XX;
1613 /* XXX : not implemented */
1614 spr_register(env, SPR_PTEHI, "PTEHI",
1615 SPR_NOACCESS, SPR_NOACCESS,
1616 &spr_read_generic, &spr_write_generic,
1618 /* XXX : not implemented */
1619 spr_register(env, SPR_PTELO, "PTELO",
1620 SPR_NOACCESS, SPR_NOACCESS,
1621 &spr_read_generic, &spr_write_generic,
1623 /* XXX : not implemented */
1624 spr_register(env, SPR_TLBMISS, "TLBMISS",
1625 SPR_NOACCESS, SPR_NOACCESS,
1626 &spr_read_generic, &spr_write_generic,
1631 #if !defined(CONFIG_USER_ONLY)
1632 static void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn)
1634 TCGv t0 = tcg_temp_new();
1636 tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR0_DCE | L1CSR0_CPE);
1637 gen_store_spr(sprn, t0);
1641 static void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn)
1643 TCGv t0 = tcg_temp_new();
1645 tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR1_ICE | L1CSR1_CPE);
1646 gen_store_spr(sprn, t0);
1650 static void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn)
1652 gen_helper_booke206_tlbflush(cpu_env, cpu_gpr[gprn]);
1655 static void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn)
1657 TCGv_i32 t0 = tcg_const_i32(sprn);
1658 gen_helper_booke_setpid(cpu_env, t0, cpu_gpr[gprn]);
1659 tcg_temp_free_i32(t0);
1661 static void spr_write_eplc(DisasContext *ctx, int sprn, int gprn)
1663 gen_helper_booke_set_eplc(cpu_env, cpu_gpr[gprn]);
1665 static void spr_write_epsc(DisasContext *ctx, int sprn, int gprn)
1667 gen_helper_booke_set_epsc(cpu_env, cpu_gpr[gprn]);
1672 static void gen_spr_usprg3(CPUPPCState *env)
1674 spr_register(env, SPR_USPRG3, "USPRG3",
1675 &spr_read_ureg, SPR_NOACCESS,
1676 &spr_read_ureg, SPR_NOACCESS,
1680 static void gen_spr_usprgh(CPUPPCState *env)
1682 spr_register(env, SPR_USPRG4, "USPRG4",
1683 &spr_read_ureg, SPR_NOACCESS,
1684 &spr_read_ureg, SPR_NOACCESS,
1686 spr_register(env, SPR_USPRG5, "USPRG5",
1687 &spr_read_ureg, SPR_NOACCESS,
1688 &spr_read_ureg, SPR_NOACCESS,
1690 spr_register(env, SPR_USPRG6, "USPRG6",
1691 &spr_read_ureg, SPR_NOACCESS,
1692 &spr_read_ureg, SPR_NOACCESS,
1694 spr_register(env, SPR_USPRG7, "USPRG7",
1695 &spr_read_ureg, SPR_NOACCESS,
1696 &spr_read_ureg, SPR_NOACCESS,
1700 /* PowerPC BookE SPR */
1701 static void gen_spr_BookE(CPUPPCState *env, uint64_t ivor_mask)
1703 const char *ivor_names[64] = {
1704 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
1705 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
1706 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
1707 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1708 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1709 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1710 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1711 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1712 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1713 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1714 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1715 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1716 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1717 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1718 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1719 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1721 #define SPR_BOOKE_IVORxx (-1)
1722 int ivor_sprn[64] = {
1723 SPR_BOOKE_IVOR0, SPR_BOOKE_IVOR1, SPR_BOOKE_IVOR2, SPR_BOOKE_IVOR3,
1724 SPR_BOOKE_IVOR4, SPR_BOOKE_IVOR5, SPR_BOOKE_IVOR6, SPR_BOOKE_IVOR7,
1725 SPR_BOOKE_IVOR8, SPR_BOOKE_IVOR9, SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1726 SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1727 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1728 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1729 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1730 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1731 SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1732 SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
1733 SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
1734 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1735 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1736 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1737 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1738 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1742 /* Interrupt processing */
1743 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1744 SPR_NOACCESS, SPR_NOACCESS,
1745 &spr_read_generic, &spr_write_generic,
1747 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1748 SPR_NOACCESS, SPR_NOACCESS,
1749 &spr_read_generic, &spr_write_generic,
1752 /* XXX : not implemented */
1753 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1754 SPR_NOACCESS, SPR_NOACCESS,
1755 &spr_read_generic, &spr_write_generic,
1757 /* XXX : not implemented */
1758 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1759 SPR_NOACCESS, SPR_NOACCESS,
1760 &spr_read_generic, &spr_write_generic,
1762 /* XXX : not implemented */
1763 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1764 SPR_NOACCESS, SPR_NOACCESS,
1765 &spr_read_generic, &spr_write_generic,
1767 /* XXX : not implemented */
1768 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1769 SPR_NOACCESS, SPR_NOACCESS,
1770 &spr_read_generic, &spr_write_generic,
1772 /* XXX : not implemented */
1773 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1774 SPR_NOACCESS, SPR_NOACCESS,
1775 &spr_read_generic, &spr_write_40x_dbcr0,
1777 /* XXX : not implemented */
1778 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1779 SPR_NOACCESS, SPR_NOACCESS,
1780 &spr_read_generic, &spr_write_generic,
1782 /* XXX : not implemented */
1783 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1784 SPR_NOACCESS, SPR_NOACCESS,
1785 &spr_read_generic, &spr_write_generic,
1787 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1788 SPR_NOACCESS, SPR_NOACCESS,
1789 &spr_read_generic, &spr_write_generic,
1791 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1792 SPR_NOACCESS, SPR_NOACCESS,
1793 &spr_read_generic, &spr_write_generic,
1795 /* XXX : not implemented */
1796 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1797 SPR_NOACCESS, SPR_NOACCESS,
1798 &spr_read_generic, &spr_write_clear,
1800 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1801 SPR_NOACCESS, SPR_NOACCESS,
1802 &spr_read_generic, &spr_write_generic,
1804 spr_register(env, SPR_BOOKE_ESR, "ESR",
1805 SPR_NOACCESS, SPR_NOACCESS,
1806 &spr_read_generic, &spr_write_generic,
1808 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1809 SPR_NOACCESS, SPR_NOACCESS,
1810 &spr_read_generic, &spr_write_excp_prefix,
1812 /* Exception vectors */
1813 for (i = 0; i < 64; i++) {
1814 if (ivor_mask & (1ULL << i)) {
1815 if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1816 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1819 spr_register(env, ivor_sprn[i], ivor_names[i],
1820 SPR_NOACCESS, SPR_NOACCESS,
1821 &spr_read_generic, &spr_write_excp_vector,
1825 spr_register(env, SPR_BOOKE_PID, "PID",
1826 SPR_NOACCESS, SPR_NOACCESS,
1827 &spr_read_generic, &spr_write_booke_pid,
1829 spr_register(env, SPR_BOOKE_TCR, "TCR",
1830 SPR_NOACCESS, SPR_NOACCESS,
1831 &spr_read_generic, &spr_write_booke_tcr,
1833 spr_register(env, SPR_BOOKE_TSR, "TSR",
1834 SPR_NOACCESS, SPR_NOACCESS,
1835 &spr_read_generic, &spr_write_booke_tsr,
1838 spr_register(env, SPR_DECR, "DECR",
1839 SPR_NOACCESS, SPR_NOACCESS,
1840 &spr_read_decr, &spr_write_decr,
1842 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1843 SPR_NOACCESS, SPR_NOACCESS,
1844 SPR_NOACCESS, &spr_write_generic,
1847 spr_register(env, SPR_USPRG0, "USPRG0",
1848 &spr_read_generic, &spr_write_generic,
1849 &spr_read_generic, &spr_write_generic,
1851 spr_register(env, SPR_SPRG4, "SPRG4",
1852 SPR_NOACCESS, SPR_NOACCESS,
1853 &spr_read_generic, &spr_write_generic,
1855 spr_register(env, SPR_SPRG5, "SPRG5",
1856 SPR_NOACCESS, SPR_NOACCESS,
1857 &spr_read_generic, &spr_write_generic,
1859 spr_register(env, SPR_SPRG6, "SPRG6",
1860 SPR_NOACCESS, SPR_NOACCESS,
1861 &spr_read_generic, &spr_write_generic,
1863 spr_register(env, SPR_SPRG7, "SPRG7",
1864 SPR_NOACCESS, SPR_NOACCESS,
1865 &spr_read_generic, &spr_write_generic,
1867 spr_register(env, SPR_BOOKE_SPRG8, "SPRG8",
1868 SPR_NOACCESS, SPR_NOACCESS,
1869 &spr_read_generic, &spr_write_generic,
1871 spr_register(env, SPR_BOOKE_SPRG9, "SPRG9",
1872 SPR_NOACCESS, SPR_NOACCESS,
1873 &spr_read_generic, &spr_write_generic,
1877 static inline uint32_t gen_tlbncfg(uint32_t assoc, uint32_t minsize,
1878 uint32_t maxsize, uint32_t flags,
1881 return (assoc << TLBnCFG_ASSOC_SHIFT) |
1882 (minsize << TLBnCFG_MINSIZE_SHIFT) |
1883 (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
1887 /* BookE 2.06 storage control registers */
1888 static void gen_spr_BookE206(CPUPPCState *env, uint32_t mas_mask,
1889 uint32_t *tlbncfg, uint32_t mmucfg)
1891 #if !defined(CONFIG_USER_ONLY)
1892 const char *mas_names[8] = {
1893 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1896 SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1897 SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1901 /* TLB assist registers */
1902 /* XXX : not implemented */
1903 for (i = 0; i < 8; i++) {
1904 void (*uea_write)(DisasContext *ctx, int sprn, int gprn) = &spr_write_generic32;
1905 if (i == 2 && (mas_mask & (1 << i)) && (env->insns_flags & PPC_64B)) {
1906 uea_write = &spr_write_generic;
1908 if (mas_mask & (1 << i)) {
1909 spr_register(env, mas_sprn[i], mas_names[i],
1910 SPR_NOACCESS, SPR_NOACCESS,
1911 &spr_read_generic, uea_write,
1915 if (env->nb_pids > 1) {
1916 /* XXX : not implemented */
1917 spr_register(env, SPR_BOOKE_PID1, "PID1",
1918 SPR_NOACCESS, SPR_NOACCESS,
1919 &spr_read_generic, &spr_write_booke_pid,
1922 if (env->nb_pids > 2) {
1923 /* XXX : not implemented */
1924 spr_register(env, SPR_BOOKE_PID2, "PID2",
1925 SPR_NOACCESS, SPR_NOACCESS,
1926 &spr_read_generic, &spr_write_booke_pid,
1930 spr_register(env, SPR_BOOKE_EPLC, "EPLC",
1931 SPR_NOACCESS, SPR_NOACCESS,
1932 &spr_read_generic, &spr_write_eplc,
1934 spr_register(env, SPR_BOOKE_EPSC, "EPSC",
1935 SPR_NOACCESS, SPR_NOACCESS,
1936 &spr_read_generic, &spr_write_epsc,
1939 /* XXX : not implemented */
1940 spr_register(env, SPR_MMUCFG, "MMUCFG",
1941 SPR_NOACCESS, SPR_NOACCESS,
1942 &spr_read_generic, SPR_NOACCESS,
1944 switch (env->nb_ways) {
1946 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1947 SPR_NOACCESS, SPR_NOACCESS,
1948 &spr_read_generic, SPR_NOACCESS,
1952 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1953 SPR_NOACCESS, SPR_NOACCESS,
1954 &spr_read_generic, SPR_NOACCESS,
1958 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1959 SPR_NOACCESS, SPR_NOACCESS,
1960 &spr_read_generic, SPR_NOACCESS,
1964 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1965 SPR_NOACCESS, SPR_NOACCESS,
1966 &spr_read_generic, SPR_NOACCESS,
1975 gen_spr_usprgh(env);
1978 /* SPR specific to PowerPC 440 implementation */
1979 static void gen_spr_440(CPUPPCState *env)
1982 /* XXX : not implemented */
1983 spr_register(env, SPR_440_DNV0, "DNV0",
1984 SPR_NOACCESS, SPR_NOACCESS,
1985 &spr_read_generic, &spr_write_generic,
1987 /* XXX : not implemented */
1988 spr_register(env, SPR_440_DNV1, "DNV1",
1989 SPR_NOACCESS, SPR_NOACCESS,
1990 &spr_read_generic, &spr_write_generic,
1992 /* XXX : not implemented */
1993 spr_register(env, SPR_440_DNV2, "DNV2",
1994 SPR_NOACCESS, SPR_NOACCESS,
1995 &spr_read_generic, &spr_write_generic,
1997 /* XXX : not implemented */
1998 spr_register(env, SPR_440_DNV3, "DNV3",
1999 SPR_NOACCESS, SPR_NOACCESS,
2000 &spr_read_generic, &spr_write_generic,
2002 /* XXX : not implemented */
2003 spr_register(env, SPR_440_DTV0, "DTV0",
2004 SPR_NOACCESS, SPR_NOACCESS,
2005 &spr_read_generic, &spr_write_generic,
2007 /* XXX : not implemented */
2008 spr_register(env, SPR_440_DTV1, "DTV1",
2009 SPR_NOACCESS, SPR_NOACCESS,
2010 &spr_read_generic, &spr_write_generic,
2012 /* XXX : not implemented */
2013 spr_register(env, SPR_440_DTV2, "DTV2",
2014 SPR_NOACCESS, SPR_NOACCESS,
2015 &spr_read_generic, &spr_write_generic,
2017 /* XXX : not implemented */
2018 spr_register(env, SPR_440_DTV3, "DTV3",
2019 SPR_NOACCESS, SPR_NOACCESS,
2020 &spr_read_generic, &spr_write_generic,
2022 /* XXX : not implemented */
2023 spr_register(env, SPR_440_DVLIM, "DVLIM",
2024 SPR_NOACCESS, SPR_NOACCESS,
2025 &spr_read_generic, &spr_write_generic,
2027 /* XXX : not implemented */
2028 spr_register(env, SPR_440_INV0, "INV0",
2029 SPR_NOACCESS, SPR_NOACCESS,
2030 &spr_read_generic, &spr_write_generic,
2032 /* XXX : not implemented */
2033 spr_register(env, SPR_440_INV1, "INV1",
2034 SPR_NOACCESS, SPR_NOACCESS,
2035 &spr_read_generic, &spr_write_generic,
2037 /* XXX : not implemented */
2038 spr_register(env, SPR_440_INV2, "INV2",
2039 SPR_NOACCESS, SPR_NOACCESS,
2040 &spr_read_generic, &spr_write_generic,
2042 /* XXX : not implemented */
2043 spr_register(env, SPR_440_INV3, "INV3",
2044 SPR_NOACCESS, SPR_NOACCESS,
2045 &spr_read_generic, &spr_write_generic,
2047 /* XXX : not implemented */
2048 spr_register(env, SPR_440_ITV0, "ITV0",
2049 SPR_NOACCESS, SPR_NOACCESS,
2050 &spr_read_generic, &spr_write_generic,
2052 /* XXX : not implemented */
2053 spr_register(env, SPR_440_ITV1, "ITV1",
2054 SPR_NOACCESS, SPR_NOACCESS,
2055 &spr_read_generic, &spr_write_generic,
2057 /* XXX : not implemented */
2058 spr_register(env, SPR_440_ITV2, "ITV2",
2059 SPR_NOACCESS, SPR_NOACCESS,
2060 &spr_read_generic, &spr_write_generic,
2062 /* XXX : not implemented */
2063 spr_register(env, SPR_440_ITV3, "ITV3",
2064 SPR_NOACCESS, SPR_NOACCESS,
2065 &spr_read_generic, &spr_write_generic,
2067 /* XXX : not implemented */
2068 spr_register(env, SPR_440_IVLIM, "IVLIM",
2069 SPR_NOACCESS, SPR_NOACCESS,
2070 &spr_read_generic, &spr_write_generic,
2073 /* XXX : not implemented */
2074 spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
2075 SPR_NOACCESS, SPR_NOACCESS,
2076 &spr_read_generic, SPR_NOACCESS,
2078 /* XXX : not implemented */
2079 spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
2080 SPR_NOACCESS, SPR_NOACCESS,
2081 &spr_read_generic, SPR_NOACCESS,
2083 /* XXX : not implemented */
2084 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
2085 SPR_NOACCESS, SPR_NOACCESS,
2086 &spr_read_generic, SPR_NOACCESS,
2088 /* XXX : not implemented */
2089 spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
2090 SPR_NOACCESS, SPR_NOACCESS,
2091 &spr_read_generic, SPR_NOACCESS,
2093 /* XXX : not implemented */
2094 spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
2095 SPR_NOACCESS, SPR_NOACCESS,
2096 &spr_read_generic, SPR_NOACCESS,
2098 /* XXX : not implemented */
2099 spr_register(env, SPR_440_DBDR, "DBDR",
2100 SPR_NOACCESS, SPR_NOACCESS,
2101 &spr_read_generic, &spr_write_generic,
2103 /* Processor control */
2104 spr_register(env, SPR_4xx_CCR0, "CCR0",
2105 SPR_NOACCESS, SPR_NOACCESS,
2106 &spr_read_generic, &spr_write_generic,
2108 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
2109 SPR_NOACCESS, SPR_NOACCESS,
2110 &spr_read_generic, SPR_NOACCESS,
2112 /* Storage control */
2113 spr_register(env, SPR_440_MMUCR, "MMUCR",
2114 SPR_NOACCESS, SPR_NOACCESS,
2115 &spr_read_generic, &spr_write_generic,
2119 /* SPR shared between PowerPC 40x implementations */
2120 static void gen_spr_40x(CPUPPCState *env)
2123 /* not emulated, as QEMU do not emulate caches */
2124 spr_register(env, SPR_40x_DCCR, "DCCR",
2125 SPR_NOACCESS, SPR_NOACCESS,
2126 &spr_read_generic, &spr_write_generic,
2128 /* not emulated, as QEMU do not emulate caches */
2129 spr_register(env, SPR_40x_ICCR, "ICCR",
2130 SPR_NOACCESS, SPR_NOACCESS,
2131 &spr_read_generic, &spr_write_generic,
2133 /* not emulated, as QEMU do not emulate caches */
2134 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
2135 SPR_NOACCESS, SPR_NOACCESS,
2136 &spr_read_generic, SPR_NOACCESS,
2139 spr_register(env, SPR_40x_DEAR, "DEAR",
2140 SPR_NOACCESS, SPR_NOACCESS,
2141 &spr_read_generic, &spr_write_generic,
2143 spr_register(env, SPR_40x_ESR, "ESR",
2144 SPR_NOACCESS, SPR_NOACCESS,
2145 &spr_read_generic, &spr_write_generic,
2147 spr_register(env, SPR_40x_EVPR, "EVPR",
2148 SPR_NOACCESS, SPR_NOACCESS,
2149 &spr_read_generic, &spr_write_excp_prefix,
2151 spr_register(env, SPR_40x_SRR2, "SRR2",
2152 &spr_read_generic, &spr_write_generic,
2153 &spr_read_generic, &spr_write_generic,
2155 spr_register(env, SPR_40x_SRR3, "SRR3",
2156 &spr_read_generic, &spr_write_generic,
2157 &spr_read_generic, &spr_write_generic,
2160 spr_register(env, SPR_40x_PIT, "PIT",
2161 SPR_NOACCESS, SPR_NOACCESS,
2162 &spr_read_40x_pit, &spr_write_40x_pit,
2164 spr_register(env, SPR_40x_TCR, "TCR",
2165 SPR_NOACCESS, SPR_NOACCESS,
2166 &spr_read_generic, &spr_write_booke_tcr,
2168 spr_register(env, SPR_40x_TSR, "TSR",
2169 SPR_NOACCESS, SPR_NOACCESS,
2170 &spr_read_generic, &spr_write_booke_tsr,
2174 /* SPR specific to PowerPC 405 implementation */
2175 static void gen_spr_405(CPUPPCState *env)
2178 spr_register(env, SPR_40x_PID, "PID",
2179 SPR_NOACCESS, SPR_NOACCESS,
2180 &spr_read_generic, &spr_write_generic,
2182 spr_register(env, SPR_4xx_CCR0, "CCR0",
2183 SPR_NOACCESS, SPR_NOACCESS,
2184 &spr_read_generic, &spr_write_generic,
2186 /* Debug interface */
2187 /* XXX : not implemented */
2188 spr_register(env, SPR_40x_DBCR0, "DBCR0",
2189 SPR_NOACCESS, SPR_NOACCESS,
2190 &spr_read_generic, &spr_write_40x_dbcr0,
2192 /* XXX : not implemented */
2193 spr_register(env, SPR_405_DBCR1, "DBCR1",
2194 SPR_NOACCESS, SPR_NOACCESS,
2195 &spr_read_generic, &spr_write_generic,
2197 /* XXX : not implemented */
2198 spr_register(env, SPR_40x_DBSR, "DBSR",
2199 SPR_NOACCESS, SPR_NOACCESS,
2200 &spr_read_generic, &spr_write_clear,
2201 /* Last reset was system reset */
2203 /* XXX : not implemented */
2204 spr_register(env, SPR_40x_DAC1, "DAC1",
2205 SPR_NOACCESS, SPR_NOACCESS,
2206 &spr_read_generic, &spr_write_generic,
2208 spr_register(env, SPR_40x_DAC2, "DAC2",
2209 SPR_NOACCESS, SPR_NOACCESS,
2210 &spr_read_generic, &spr_write_generic,
2212 /* XXX : not implemented */
2213 spr_register(env, SPR_405_DVC1, "DVC1",
2214 SPR_NOACCESS, SPR_NOACCESS,
2215 &spr_read_generic, &spr_write_generic,
2217 /* XXX : not implemented */
2218 spr_register(env, SPR_405_DVC2, "DVC2",
2219 SPR_NOACCESS, SPR_NOACCESS,
2220 &spr_read_generic, &spr_write_generic,
2222 /* XXX : not implemented */
2223 spr_register(env, SPR_40x_IAC1, "IAC1",
2224 SPR_NOACCESS, SPR_NOACCESS,
2225 &spr_read_generic, &spr_write_generic,
2227 spr_register(env, SPR_40x_IAC2, "IAC2",
2228 SPR_NOACCESS, SPR_NOACCESS,
2229 &spr_read_generic, &spr_write_generic,
2231 /* XXX : not implemented */
2232 spr_register(env, SPR_405_IAC3, "IAC3",
2233 SPR_NOACCESS, SPR_NOACCESS,
2234 &spr_read_generic, &spr_write_generic,
2236 /* XXX : not implemented */
2237 spr_register(env, SPR_405_IAC4, "IAC4",
2238 SPR_NOACCESS, SPR_NOACCESS,
2239 &spr_read_generic, &spr_write_generic,
2241 /* Storage control */
2242 /* XXX: TODO: not implemented */
2243 spr_register(env, SPR_405_SLER, "SLER",
2244 SPR_NOACCESS, SPR_NOACCESS,
2245 &spr_read_generic, &spr_write_40x_sler,
2247 spr_register(env, SPR_40x_ZPR, "ZPR",
2248 SPR_NOACCESS, SPR_NOACCESS,
2249 &spr_read_generic, &spr_write_generic,
2251 /* XXX : not implemented */
2252 spr_register(env, SPR_405_SU0R, "SU0R",
2253 SPR_NOACCESS, SPR_NOACCESS,
2254 &spr_read_generic, &spr_write_generic,
2257 spr_register(env, SPR_USPRG0, "USPRG0",
2258 &spr_read_ureg, SPR_NOACCESS,
2259 &spr_read_ureg, SPR_NOACCESS,
2261 spr_register(env, SPR_SPRG4, "SPRG4",
2262 SPR_NOACCESS, SPR_NOACCESS,
2263 &spr_read_generic, &spr_write_generic,
2265 spr_register(env, SPR_SPRG5, "SPRG5",
2266 SPR_NOACCESS, SPR_NOACCESS,
2267 spr_read_generic, &spr_write_generic,
2269 spr_register(env, SPR_SPRG6, "SPRG6",
2270 SPR_NOACCESS, SPR_NOACCESS,
2271 spr_read_generic, &spr_write_generic,
2273 spr_register(env, SPR_SPRG7, "SPRG7",
2274 SPR_NOACCESS, SPR_NOACCESS,
2275 spr_read_generic, &spr_write_generic,
2277 gen_spr_usprgh(env);
2280 /* SPR shared between PowerPC 401 & 403 implementations */
2281 static void gen_spr_401_403(CPUPPCState *env)
2284 spr_register(env, SPR_403_VTBL, "TBL",
2285 &spr_read_tbl, SPR_NOACCESS,
2286 &spr_read_tbl, SPR_NOACCESS,
2288 spr_register(env, SPR_403_TBL, "TBL",
2289 SPR_NOACCESS, SPR_NOACCESS,
2290 SPR_NOACCESS, &spr_write_tbl,
2292 spr_register(env, SPR_403_VTBU, "TBU",
2293 &spr_read_tbu, SPR_NOACCESS,
2294 &spr_read_tbu, SPR_NOACCESS,
2296 spr_register(env, SPR_403_TBU, "TBU",
2297 SPR_NOACCESS, SPR_NOACCESS,
2298 SPR_NOACCESS, &spr_write_tbu,
2301 /* not emulated, as QEMU do not emulate caches */
2302 spr_register(env, SPR_403_CDBCR, "CDBCR",
2303 SPR_NOACCESS, SPR_NOACCESS,
2304 &spr_read_generic, &spr_write_generic,
2308 /* SPR specific to PowerPC 401 implementation */
2309 static void gen_spr_401(CPUPPCState *env)
2311 /* Debug interface */
2312 /* XXX : not implemented */
2313 spr_register(env, SPR_40x_DBCR0, "DBCR",
2314 SPR_NOACCESS, SPR_NOACCESS,
2315 &spr_read_generic, &spr_write_40x_dbcr0,
2317 /* XXX : not implemented */
2318 spr_register(env, SPR_40x_DBSR, "DBSR",
2319 SPR_NOACCESS, SPR_NOACCESS,
2320 &spr_read_generic, &spr_write_clear,
2321 /* Last reset was system reset */
2323 /* XXX : not implemented */
2324 spr_register(env, SPR_40x_DAC1, "DAC",
2325 SPR_NOACCESS, SPR_NOACCESS,
2326 &spr_read_generic, &spr_write_generic,
2328 /* XXX : not implemented */
2329 spr_register(env, SPR_40x_IAC1, "IAC",
2330 SPR_NOACCESS, SPR_NOACCESS,
2331 &spr_read_generic, &spr_write_generic,
2333 /* Storage control */
2334 /* XXX: TODO: not implemented */
2335 spr_register(env, SPR_405_SLER, "SLER",
2336 SPR_NOACCESS, SPR_NOACCESS,
2337 &spr_read_generic, &spr_write_40x_sler,
2339 /* not emulated, as QEMU never does speculative access */
2340 spr_register(env, SPR_40x_SGR, "SGR",
2341 SPR_NOACCESS, SPR_NOACCESS,
2342 &spr_read_generic, &spr_write_generic,
2344 /* not emulated, as QEMU do not emulate caches */
2345 spr_register(env, SPR_40x_DCWR, "DCWR",
2346 SPR_NOACCESS, SPR_NOACCESS,
2347 &spr_read_generic, &spr_write_generic,
2351 static void gen_spr_401x2(CPUPPCState *env)
2354 spr_register(env, SPR_40x_PID, "PID",
2355 SPR_NOACCESS, SPR_NOACCESS,
2356 &spr_read_generic, &spr_write_generic,
2358 spr_register(env, SPR_40x_ZPR, "ZPR",
2359 SPR_NOACCESS, SPR_NOACCESS,
2360 &spr_read_generic, &spr_write_generic,
2364 /* SPR specific to PowerPC 403 implementation */
2365 static void gen_spr_403(CPUPPCState *env)
2367 /* Debug interface */
2368 /* XXX : not implemented */
2369 spr_register(env, SPR_40x_DBCR0, "DBCR0",
2370 SPR_NOACCESS, SPR_NOACCESS,
2371 &spr_read_generic, &spr_write_40x_dbcr0,
2373 /* XXX : not implemented */
2374 spr_register(env, SPR_40x_DBSR, "DBSR",
2375 SPR_NOACCESS, SPR_NOACCESS,
2376 &spr_read_generic, &spr_write_clear,
2377 /* Last reset was system reset */
2379 /* XXX : not implemented */
2380 spr_register(env, SPR_40x_DAC1, "DAC1",
2381 SPR_NOACCESS, SPR_NOACCESS,
2382 &spr_read_generic, &spr_write_generic,
2384 /* XXX : not implemented */
2385 spr_register(env, SPR_40x_DAC2, "DAC2",
2386 SPR_NOACCESS, SPR_NOACCESS,
2387 &spr_read_generic, &spr_write_generic,
2389 /* XXX : not implemented */
2390 spr_register(env, SPR_40x_IAC1, "IAC1",
2391 SPR_NOACCESS, SPR_NOACCESS,
2392 &spr_read_generic, &spr_write_generic,
2394 /* XXX : not implemented */
2395 spr_register(env, SPR_40x_IAC2, "IAC2",
2396 SPR_NOACCESS, SPR_NOACCESS,
2397 &spr_read_generic, &spr_write_generic,
2401 static void gen_spr_403_real(CPUPPCState *env)
2403 spr_register(env, SPR_403_PBL1, "PBL1",
2404 SPR_NOACCESS, SPR_NOACCESS,
2405 &spr_read_403_pbr, &spr_write_403_pbr,
2407 spr_register(env, SPR_403_PBU1, "PBU1",
2408 SPR_NOACCESS, SPR_NOACCESS,
2409 &spr_read_403_pbr, &spr_write_403_pbr,
2411 spr_register(env, SPR_403_PBL2, "PBL2",
2412 SPR_NOACCESS, SPR_NOACCESS,
2413 &spr_read_403_pbr, &spr_write_403_pbr,
2415 spr_register(env, SPR_403_PBU2, "PBU2",
2416 SPR_NOACCESS, SPR_NOACCESS,
2417 &spr_read_403_pbr, &spr_write_403_pbr,
2421 static void gen_spr_403_mmu(CPUPPCState *env)
2424 spr_register(env, SPR_40x_PID, "PID",
2425 SPR_NOACCESS, SPR_NOACCESS,
2426 &spr_read_generic, &spr_write_generic,
2428 spr_register(env, SPR_40x_ZPR, "ZPR",
2429 SPR_NOACCESS, SPR_NOACCESS,
2430 &spr_read_generic, &spr_write_generic,
2434 /* SPR specific to PowerPC compression coprocessor extension */
2435 static void gen_spr_compress(CPUPPCState *env)
2437 /* XXX : not implemented */
2438 spr_register(env, SPR_401_SKR, "SKR",
2439 SPR_NOACCESS, SPR_NOACCESS,
2440 &spr_read_generic, &spr_write_generic,
2444 static void gen_spr_5xx_8xx(CPUPPCState *env)
2446 /* Exception processing */
2447 spr_register_kvm(env, SPR_DSISR, "DSISR",
2448 SPR_NOACCESS, SPR_NOACCESS,
2449 &spr_read_generic, &spr_write_generic,
2450 KVM_REG_PPC_DSISR, 0x00000000);
2451 spr_register_kvm(env, SPR_DAR, "DAR",
2452 SPR_NOACCESS, SPR_NOACCESS,
2453 &spr_read_generic, &spr_write_generic,
2454 KVM_REG_PPC_DAR, 0x00000000);
2456 spr_register(env, SPR_DECR, "DECR",
2457 SPR_NOACCESS, SPR_NOACCESS,
2458 &spr_read_decr, &spr_write_decr,
2460 /* XXX : not implemented */
2461 spr_register(env, SPR_MPC_EIE, "EIE",
2462 SPR_NOACCESS, SPR_NOACCESS,
2463 &spr_read_generic, &spr_write_generic,
2465 /* XXX : not implemented */
2466 spr_register(env, SPR_MPC_EID, "EID",
2467 SPR_NOACCESS, SPR_NOACCESS,
2468 &spr_read_generic, &spr_write_generic,
2470 /* XXX : not implemented */
2471 spr_register(env, SPR_MPC_NRI, "NRI",
2472 SPR_NOACCESS, SPR_NOACCESS,
2473 &spr_read_generic, &spr_write_generic,
2475 /* XXX : not implemented */
2476 spr_register(env, SPR_MPC_CMPA, "CMPA",
2477 SPR_NOACCESS, SPR_NOACCESS,
2478 &spr_read_generic, &spr_write_generic,
2480 /* XXX : not implemented */
2481 spr_register(env, SPR_MPC_CMPB, "CMPB",
2482 SPR_NOACCESS, SPR_NOACCESS,
2483 &spr_read_generic, &spr_write_generic,
2485 /* XXX : not implemented */
2486 spr_register(env, SPR_MPC_CMPC, "CMPC",
2487 SPR_NOACCESS, SPR_NOACCESS,
2488 &spr_read_generic, &spr_write_generic,
2490 /* XXX : not implemented */
2491 spr_register(env, SPR_MPC_CMPD, "CMPD",
2492 SPR_NOACCESS, SPR_NOACCESS,
2493 &spr_read_generic, &spr_write_generic,
2495 /* XXX : not implemented */
2496 spr_register(env, SPR_MPC_ECR, "ECR",
2497 SPR_NOACCESS, SPR_NOACCESS,
2498 &spr_read_generic, &spr_write_generic,
2500 /* XXX : not implemented */
2501 spr_register(env, SPR_MPC_DER, "DER",
2502 SPR_NOACCESS, SPR_NOACCESS,
2503 &spr_read_generic, &spr_write_generic,
2505 /* XXX : not implemented */
2506 spr_register(env, SPR_MPC_COUNTA, "COUNTA",
2507 SPR_NOACCESS, SPR_NOACCESS,
2508 &spr_read_generic, &spr_write_generic,
2510 /* XXX : not implemented */
2511 spr_register(env, SPR_MPC_COUNTB, "COUNTB",
2512 SPR_NOACCESS, SPR_NOACCESS,
2513 &spr_read_generic, &spr_write_generic,
2515 /* XXX : not implemented */
2516 spr_register(env, SPR_MPC_CMPE, "CMPE",
2517 SPR_NOACCESS, SPR_NOACCESS,
2518 &spr_read_generic, &spr_write_generic,
2520 /* XXX : not implemented */
2521 spr_register(env, SPR_MPC_CMPF, "CMPF",
2522 SPR_NOACCESS, SPR_NOACCESS,
2523 &spr_read_generic, &spr_write_generic,
2525 /* XXX : not implemented */
2526 spr_register(env, SPR_MPC_CMPG, "CMPG",
2527 SPR_NOACCESS, SPR_NOACCESS,
2528 &spr_read_generic, &spr_write_generic,
2530 /* XXX : not implemented */
2531 spr_register(env, SPR_MPC_CMPH, "CMPH",
2532 SPR_NOACCESS, SPR_NOACCESS,
2533 &spr_read_generic, &spr_write_generic,
2535 /* XXX : not implemented */
2536 spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
2537 SPR_NOACCESS, SPR_NOACCESS,
2538 &spr_read_generic, &spr_write_generic,
2540 /* XXX : not implemented */
2541 spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
2542 SPR_NOACCESS, SPR_NOACCESS,
2543 &spr_read_generic, &spr_write_generic,
2545 /* XXX : not implemented */
2546 spr_register(env, SPR_MPC_BAR, "BAR",
2547 SPR_NOACCESS, SPR_NOACCESS,
2548 &spr_read_generic, &spr_write_generic,
2550 /* XXX : not implemented */
2551 spr_register(env, SPR_MPC_DPDR, "DPDR",
2552 SPR_NOACCESS, SPR_NOACCESS,
2553 &spr_read_generic, &spr_write_generic,
2555 /* XXX : not implemented */
2556 spr_register(env, SPR_MPC_IMMR, "IMMR",
2557 SPR_NOACCESS, SPR_NOACCESS,
2558 &spr_read_generic, &spr_write_generic,
2562 static void gen_spr_5xx(CPUPPCState *env)
2564 /* XXX : not implemented */
2565 spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
2566 SPR_NOACCESS, SPR_NOACCESS,
2567 &spr_read_generic, &spr_write_generic,
2569 /* XXX : not implemented */
2570 spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
2571 SPR_NOACCESS, SPR_NOACCESS,
2572 &spr_read_generic, &spr_write_generic,
2574 /* XXX : not implemented */
2575 spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
2576 SPR_NOACCESS, SPR_NOACCESS,
2577 &spr_read_generic, &spr_write_generic,
2579 /* XXX : not implemented */
2580 spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
2581 SPR_NOACCESS, SPR_NOACCESS,
2582 &spr_read_generic, &spr_write_generic,
2584 /* XXX : not implemented */
2585 spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
2586 SPR_NOACCESS, SPR_NOACCESS,
2587 &spr_read_generic, &spr_write_generic,
2589 /* XXX : not implemented */
2590 spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
2591 SPR_NOACCESS, SPR_NOACCESS,
2592 &spr_read_generic, &spr_write_generic,
2594 /* XXX : not implemented */
2595 spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
2596 SPR_NOACCESS, SPR_NOACCESS,
2597 &spr_read_generic, &spr_write_generic,
2599 /* XXX : not implemented */
2600 spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
2601 SPR_NOACCESS, SPR_NOACCESS,
2602 &spr_read_generic, &spr_write_generic,
2604 /* XXX : not implemented */
2605 spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
2606 SPR_NOACCESS, SPR_NOACCESS,
2607 &spr_read_generic, &spr_write_generic,
2609 /* XXX : not implemented */
2610 spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
2611 SPR_NOACCESS, SPR_NOACCESS,
2612 &spr_read_generic, &spr_write_generic,
2614 /* XXX : not implemented */
2615 spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
2616 SPR_NOACCESS, SPR_NOACCESS,
2617 &spr_read_generic, &spr_write_generic,
2619 /* XXX : not implemented */
2620 spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
2621 SPR_NOACCESS, SPR_NOACCESS,
2622 &spr_read_generic, &spr_write_generic,
2624 /* XXX : not implemented */
2625 spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
2626 SPR_NOACCESS, SPR_NOACCESS,
2627 &spr_read_generic, &spr_write_generic,
2629 /* XXX : not implemented */
2630 spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
2631 SPR_NOACCESS, SPR_NOACCESS,
2632 &spr_read_generic, &spr_write_generic,
2634 /* XXX : not implemented */
2635 spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
2636 SPR_NOACCESS, SPR_NOACCESS,
2637 &spr_read_generic, &spr_write_generic,
2639 /* XXX : not implemented */
2640 spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
2641 SPR_NOACCESS, SPR_NOACCESS,
2642 &spr_read_generic, &spr_write_generic,
2644 /* XXX : not implemented */
2645 spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
2646 SPR_NOACCESS, SPR_NOACCESS,
2647 &spr_read_generic, &spr_write_generic,
2649 /* XXX : not implemented */
2650 spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
2651 SPR_NOACCESS, SPR_NOACCESS,
2652 &spr_read_generic, &spr_write_generic,
2654 /* XXX : not implemented */
2655 spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
2656 SPR_NOACCESS, SPR_NOACCESS,
2657 &spr_read_generic, &spr_write_generic,
2659 /* XXX : not implemented */
2660 spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
2661 SPR_NOACCESS, SPR_NOACCESS,
2662 &spr_read_generic, &spr_write_generic,
2664 /* XXX : not implemented */
2665 spr_register(env, SPR_RCPU_FPECR, "FPECR",
2666 SPR_NOACCESS, SPR_NOACCESS,
2667 &spr_read_generic, &spr_write_generic,
2671 static void gen_spr_8xx(CPUPPCState *env)
2673 /* XXX : not implemented */
2674 spr_register(env, SPR_MPC_IC_CST, "IC_CST",
2675 SPR_NOACCESS, SPR_NOACCESS,
2676 &spr_read_generic, &spr_write_generic,
2678 /* XXX : not implemented */
2679 spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
2680 SPR_NOACCESS, SPR_NOACCESS,
2681 &spr_read_generic, &spr_write_generic,
2683 /* XXX : not implemented */
2684 spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
2685 SPR_NOACCESS, SPR_NOACCESS,
2686 &spr_read_generic, &spr_write_generic,
2688 /* XXX : not implemented */
2689 spr_register(env, SPR_MPC_DC_CST, "DC_CST",
2690 SPR_NOACCESS, SPR_NOACCESS,
2691 &spr_read_generic, &spr_write_generic,
2693 /* XXX : not implemented */
2694 spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
2695 SPR_NOACCESS, SPR_NOACCESS,
2696 &spr_read_generic, &spr_write_generic,
2698 /* XXX : not implemented */
2699 spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
2700 SPR_NOACCESS, SPR_NOACCESS,
2701 &spr_read_generic, &spr_write_generic,
2703 /* XXX : not implemented */
2704 spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
2705 SPR_NOACCESS, SPR_NOACCESS,
2706 &spr_read_generic, &spr_write_generic,
2708 /* XXX : not implemented */
2709 spr_register(env, SPR_MPC_MI_AP, "MI_AP",
2710 SPR_NOACCESS, SPR_NOACCESS,
2711 &spr_read_generic, &spr_write_generic,
2713 /* XXX : not implemented */
2714 spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
2715 SPR_NOACCESS, SPR_NOACCESS,
2716 &spr_read_generic, &spr_write_generic,
2718 /* XXX : not implemented */
2719 spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
2720 SPR_NOACCESS, SPR_NOACCESS,
2721 &spr_read_generic, &spr_write_generic,
2723 /* XXX : not implemented */
2724 spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
2725 SPR_NOACCESS, SPR_NOACCESS,
2726 &spr_read_generic, &spr_write_generic,
2728 /* XXX : not implemented */
2729 spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
2730 SPR_NOACCESS, SPR_NOACCESS,
2731 &spr_read_generic, &spr_write_generic,
2733 /* XXX : not implemented */
2734 spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
2735 SPR_NOACCESS, SPR_NOACCESS,
2736 &spr_read_generic, &spr_write_generic,
2738 /* XXX : not implemented */
2739 spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
2740 SPR_NOACCESS, SPR_NOACCESS,
2741 &spr_read_generic, &spr_write_generic,
2743 /* XXX : not implemented */
2744 spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
2745 SPR_NOACCESS, SPR_NOACCESS,
2746 &spr_read_generic, &spr_write_generic,
2748 /* XXX : not implemented */
2749 spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
2750 SPR_NOACCESS, SPR_NOACCESS,
2751 &spr_read_generic, &spr_write_generic,
2753 /* XXX : not implemented */
2754 spr_register(env, SPR_MPC_MD_AP, "MD_AP",
2755 SPR_NOACCESS, SPR_NOACCESS,
2756 &spr_read_generic, &spr_write_generic,
2758 /* XXX : not implemented */
2759 spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2760 SPR_NOACCESS, SPR_NOACCESS,
2761 &spr_read_generic, &spr_write_generic,
2763 /* XXX : not implemented */
2764 spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2765 SPR_NOACCESS, SPR_NOACCESS,
2766 &spr_read_generic, &spr_write_generic,
2768 /* XXX : not implemented */
2769 spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2770 SPR_NOACCESS, SPR_NOACCESS,
2771 &spr_read_generic, &spr_write_generic,
2773 /* XXX : not implemented */
2774 spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2775 SPR_NOACCESS, SPR_NOACCESS,
2776 &spr_read_generic, &spr_write_generic,
2778 /* XXX : not implemented */
2779 spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2780 SPR_NOACCESS, SPR_NOACCESS,
2781 &spr_read_generic, &spr_write_generic,
2783 /* XXX : not implemented */
2784 spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2785 SPR_NOACCESS, SPR_NOACCESS,
2786 &spr_read_generic, &spr_write_generic,
2788 /* XXX : not implemented */
2789 spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2790 SPR_NOACCESS, SPR_NOACCESS,
2791 &spr_read_generic, &spr_write_generic,
2793 /* XXX : not implemented */
2794 spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2795 SPR_NOACCESS, SPR_NOACCESS,
2796 &spr_read_generic, &spr_write_generic,
2802 * AMR => SPR 29 (Power 2.04)
2803 * CTRL => SPR 136 (Power 2.04)
2804 * CTRL => SPR 152 (Power 2.04)
2805 * SCOMC => SPR 276 (64 bits ?)
2806 * SCOMD => SPR 277 (64 bits ?)
2807 * TBU40 => SPR 286 (Power 2.04 hypv)
2808 * HSPRG0 => SPR 304 (Power 2.04 hypv)
2809 * HSPRG1 => SPR 305 (Power 2.04 hypv)
2810 * HDSISR => SPR 306 (Power 2.04 hypv)
2811 * HDAR => SPR 307 (Power 2.04 hypv)
2812 * PURR => SPR 309 (Power 2.04 hypv)
2813 * HDEC => SPR 310 (Power 2.04 hypv)
2814 * HIOR => SPR 311 (hypv)
2815 * RMOR => SPR 312 (970)
2816 * HRMOR => SPR 313 (Power 2.04 hypv)
2817 * HSRR0 => SPR 314 (Power 2.04 hypv)
2818 * HSRR1 => SPR 315 (Power 2.04 hypv)
2819 * LPIDR => SPR 317 (970)
2820 * EPR => SPR 702 (Power 2.04 emb)
2821 * perf => 768-783 (Power 2.04)
2822 * perf => 784-799 (Power 2.04)
2823 * PPR => SPR 896 (Power 2.04)
2824 * DABRX => 1015 (Power 2.04 hypv)
2825 * FPECR => SPR 1022 (?)
2826 * ... and more (thermal management, performance counters, ...)
2829 /*****************************************************************************/
2830 /* Exception vectors models */
2831 static void init_excp_4xx_real(CPUPPCState *env)
2833 #if !defined(CONFIG_USER_ONLY)
2834 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2835 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2836 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2837 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2838 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2839 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2840 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2841 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2842 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2843 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2844 env->ivor_mask = 0x0000FFF0UL;
2845 env->ivpr_mask = 0xFFFF0000UL;
2846 /* Hardware reset vector */
2847 env->hreset_vector = 0xFFFFFFFCUL;
2851 static void init_excp_4xx_softmmu(CPUPPCState *env)
2853 #if !defined(CONFIG_USER_ONLY)
2854 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2855 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2856 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2857 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2858 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2859 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2860 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2861 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2862 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2863 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2864 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2865 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100;
2866 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200;
2867 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2868 env->ivor_mask = 0x0000FFF0UL;
2869 env->ivpr_mask = 0xFFFF0000UL;
2870 /* Hardware reset vector */
2871 env->hreset_vector = 0xFFFFFFFCUL;
2875 static void init_excp_MPC5xx(CPUPPCState *env)
2877 #if !defined(CONFIG_USER_ONLY)
2878 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2879 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2880 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2881 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2882 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2883 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2884 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2885 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2886 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2887 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2888 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2889 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2890 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2891 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2892 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2893 env->ivor_mask = 0x0000FFF0UL;
2894 env->ivpr_mask = 0xFFFF0000UL;
2895 /* Hardware reset vector */
2896 env->hreset_vector = 0x00000100UL;
2900 static void init_excp_MPC8xx(CPUPPCState *env)
2902 #if !defined(CONFIG_USER_ONLY)
2903 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2904 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2905 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2906 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2907 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2908 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2909 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2910 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2911 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2912 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2913 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2914 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2915 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2916 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001100;
2917 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001200;
2918 env->excp_vectors[POWERPC_EXCP_ITLBE] = 0x00001300;
2919 env->excp_vectors[POWERPC_EXCP_DTLBE] = 0x00001400;
2920 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2921 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2922 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2923 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2924 env->ivor_mask = 0x0000FFF0UL;
2925 env->ivpr_mask = 0xFFFF0000UL;
2926 /* Hardware reset vector */
2927 env->hreset_vector = 0x00000100UL;
2931 static void init_excp_G2(CPUPPCState *env)
2933 #if !defined(CONFIG_USER_ONLY)
2934 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2935 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2936 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2937 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2938 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2939 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2940 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2941 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2942 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2943 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2944 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2945 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2946 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2947 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2948 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2949 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2950 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2951 /* Hardware reset vector */
2952 env->hreset_vector = 0x00000100UL;
2956 static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
2958 #if !defined(CONFIG_USER_ONLY)
2959 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000FFC;
2960 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2961 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2962 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2963 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2964 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2965 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2966 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2967 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2968 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2969 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2970 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2971 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2972 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2973 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2974 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2975 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2976 env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000;
2977 env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000;
2978 env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000;
2979 env->ivor_mask = 0x0000FFF7UL;
2980 env->ivpr_mask = ivpr_mask;
2981 /* Hardware reset vector */
2982 env->hreset_vector = 0xFFFFFFFCUL;
2986 static void init_excp_BookE(CPUPPCState *env)
2988 #if !defined(CONFIG_USER_ONLY)
2989 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2990 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2991 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2992 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2993 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2994 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2995 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2996 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2997 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2998 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2999 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
3000 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
3001 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
3002 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
3003 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
3004 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
3005 env->ivor_mask = 0x0000FFF0UL;
3006 env->ivpr_mask = 0xFFFF0000UL;
3007 /* Hardware reset vector */
3008 env->hreset_vector = 0xFFFFFFFCUL;
3012 static void init_excp_601(CPUPPCState *env)
3014 #if !defined(CONFIG_USER_ONLY)
3015 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3016 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3017 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3018 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3019 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3020 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3021 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3022 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3023 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3024 env->excp_vectors[POWERPC_EXCP_IO] = 0x00000A00;
3025 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3026 env->excp_vectors[POWERPC_EXCP_RUNM] = 0x00002000;
3027 /* Hardware reset vector */
3028 env->hreset_vector = 0x00000100UL;
3032 static void init_excp_602(CPUPPCState *env)
3034 #if !defined(CONFIG_USER_ONLY)
3035 /* XXX: exception prefix has a special behavior on 602 */
3036 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3037 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3038 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3039 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3040 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3041 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3042 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3043 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3044 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3045 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3046 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3047 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3048 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3049 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3050 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3051 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3052 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001500;
3053 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001600;
3054 /* Hardware reset vector */
3055 env->hreset_vector = 0x00000100UL;
3059 static void init_excp_603(CPUPPCState *env)
3061 #if !defined(CONFIG_USER_ONLY)
3062 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3063 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3064 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3065 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3066 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3067 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3068 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3069 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3070 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3071 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3072 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3073 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3074 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3075 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3076 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3077 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3078 /* Hardware reset vector */
3079 env->hreset_vector = 0x00000100UL;
3083 static void init_excp_604(CPUPPCState *env)
3085 #if !defined(CONFIG_USER_ONLY)
3086 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3087 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3088 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3089 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3090 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3091 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3092 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3093 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3094 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3095 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3096 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3097 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3098 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3099 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3100 /* Hardware reset vector */
3101 env->hreset_vector = 0x00000100UL;
3105 static void init_excp_7x0(CPUPPCState *env)
3107 #if !defined(CONFIG_USER_ONLY)
3108 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3109 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3110 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3111 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3112 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3113 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3114 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3115 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3116 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3117 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3118 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3119 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3120 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3121 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3122 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3123 /* Hardware reset vector */
3124 env->hreset_vector = 0x00000100UL;
3128 static void init_excp_750cl(CPUPPCState *env)
3130 #if !defined(CONFIG_USER_ONLY)
3131 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3132 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3133 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3134 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3135 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3136 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3137 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3138 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3139 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3140 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3141 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3142 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3143 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3144 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3145 /* Hardware reset vector */
3146 env->hreset_vector = 0x00000100UL;
3150 static void init_excp_750cx(CPUPPCState *env)
3152 #if !defined(CONFIG_USER_ONLY)
3153 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3154 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3155 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3156 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3157 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3158 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3159 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3160 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3161 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3162 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3163 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3164 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3165 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3166 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3167 /* Hardware reset vector */
3168 env->hreset_vector = 0x00000100UL;
3172 /* XXX: Check if this is correct */
3173 static void init_excp_7x5(CPUPPCState *env)
3175 #if !defined(CONFIG_USER_ONLY)
3176 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3177 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3178 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3179 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3180 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3181 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3182 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3183 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3184 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3185 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3186 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3187 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3188 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3189 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3190 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3191 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3192 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3193 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3194 /* Hardware reset vector */
3195 env->hreset_vector = 0x00000100UL;
3199 static void init_excp_7400(CPUPPCState *env)
3201 #if !defined(CONFIG_USER_ONLY)
3202 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3203 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3204 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3205 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3206 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3207 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3208 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3209 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3210 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3211 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3212 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3213 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3214 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3215 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3216 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3217 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
3218 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3219 /* Hardware reset vector */
3220 env->hreset_vector = 0x00000100UL;
3224 static void init_excp_7450(CPUPPCState *env)
3226 #if !defined(CONFIG_USER_ONLY)
3227 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3228 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3229 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3230 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3231 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3232 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3233 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3234 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3235 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3236 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3237 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3238 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3239 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3240 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3241 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3242 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3243 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3244 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3245 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
3246 /* Hardware reset vector */
3247 env->hreset_vector = 0x00000100UL;
3251 #if defined(TARGET_PPC64)
3252 static void init_excp_970(CPUPPCState *env)
3254 #if !defined(CONFIG_USER_ONLY)
3255 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3256 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3257 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3258 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
3259 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3260 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
3261 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3262 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3263 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3264 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3265 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3266 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
3267 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3268 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3269 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3270 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3271 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3272 env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
3273 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
3274 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800;
3275 /* Hardware reset vector */
3276 env->hreset_vector = 0x0000000000000100ULL;
3280 static void init_excp_POWER7(CPUPPCState *env)
3282 #if !defined(CONFIG_USER_ONLY)
3283 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3284 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3285 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3286 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
3287 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3288 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
3289 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3290 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3291 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3292 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3293 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3294 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
3295 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3296 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3297 env->excp_vectors[POWERPC_EXCP_HDSI] = 0x00000E00;
3298 env->excp_vectors[POWERPC_EXCP_HISI] = 0x00000E20;
3299 env->excp_vectors[POWERPC_EXCP_HV_EMU] = 0x00000E40;
3300 env->excp_vectors[POWERPC_EXCP_HV_MAINT] = 0x00000E60;
3301 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3302 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3303 env->excp_vectors[POWERPC_EXCP_VSXU] = 0x00000F40;
3304 /* Hardware reset vector */
3305 env->hreset_vector = 0x0000000000000100ULL;
3309 static void init_excp_POWER8(CPUPPCState *env)
3311 init_excp_POWER7(env);
3313 #if !defined(CONFIG_USER_ONLY)
3314 env->excp_vectors[POWERPC_EXCP_SDOOR] = 0x00000A00;
3315 env->excp_vectors[POWERPC_EXCP_FU] = 0x00000F60;
3316 env->excp_vectors[POWERPC_EXCP_HV_FU] = 0x00000F80;
3317 env->excp_vectors[POWERPC_EXCP_SDOOR_HV] = 0x00000E80;
3321 static void init_excp_POWER9(CPUPPCState *env)
3323 init_excp_POWER8(env);
3325 #if !defined(CONFIG_USER_ONLY)
3326 env->excp_vectors[POWERPC_EXCP_HVIRT] = 0x00000EA0;
3332 /*****************************************************************************/
3333 /* Power management enable checks */
3334 static int check_pow_none(CPUPPCState *env)
3339 static int check_pow_nocheck(CPUPPCState *env)
3344 static int check_pow_hid0(CPUPPCState *env)
3346 if (env->spr[SPR_HID0] & 0x00E00000)
3352 static int check_pow_hid0_74xx(CPUPPCState *env)
3354 if (env->spr[SPR_HID0] & 0x00600000)
3360 static bool ppc_cpu_interrupts_big_endian_always(PowerPCCPU *cpu)
3366 static bool ppc_cpu_interrupts_big_endian_lpcr(PowerPCCPU *cpu)
3368 return !(cpu->env.spr[SPR_LPCR] & LPCR_ILE);
3372 /*****************************************************************************/
3373 /* PowerPC implementations definitions */
3375 #define POWERPC_FAMILY(_name) \
3377 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
3379 static const TypeInfo \
3380 glue(glue(ppc_, _name), _cpu_family_type_info) = { \
3381 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \
3382 .parent = TYPE_POWERPC_CPU, \
3384 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \
3387 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \
3389 type_register_static( \
3390 &glue(glue(ppc_, _name), _cpu_family_type_info)); \
3393 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \
3395 static void glue(glue(ppc_, _name), _cpu_family_class_init)
3397 static void init_proc_401(CPUPPCState *env)
3400 gen_spr_401_403(env);
3402 init_excp_4xx_real(env);
3403 env->dcache_line_size = 32;
3404 env->icache_line_size = 32;
3405 /* Allocate hardware IRQ controller */
3406 ppc40x_irq_init(ppc_env_get_cpu(env));
3408 SET_FIT_PERIOD(12, 16, 20, 24);
3409 SET_WDT_PERIOD(16, 20, 24, 28);
3412 POWERPC_FAMILY(401)(ObjectClass *oc, void *data)
3414 DeviceClass *dc = DEVICE_CLASS(oc);
3415 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3417 dc->desc = "PowerPC 401";
3418 pcc->init_proc = init_proc_401;
3419 pcc->check_pow = check_pow_nocheck;
3420 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3421 PPC_WRTEE | PPC_DCR |
3422 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3424 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3425 PPC_4xx_COMMON | PPC_40x_EXCP;
3426 pcc->msr_mask = (1ull << MSR_KEY) |
3435 pcc->mmu_model = POWERPC_MMU_REAL;
3436 pcc->excp_model = POWERPC_EXCP_40x;
3437 pcc->bus_model = PPC_FLAGS_INPUT_401;
3438 pcc->bfd_mach = bfd_mach_ppc_403;
3439 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3440 POWERPC_FLAG_BUS_CLK;
3443 static void init_proc_401x2(CPUPPCState *env)
3446 gen_spr_401_403(env);
3448 gen_spr_compress(env);
3449 /* Memory management */
3450 #if !defined(CONFIG_USER_ONLY)
3454 env->tlb_type = TLB_EMB;
3456 init_excp_4xx_softmmu(env);
3457 env->dcache_line_size = 32;
3458 env->icache_line_size = 32;
3459 /* Allocate hardware IRQ controller */
3460 ppc40x_irq_init(ppc_env_get_cpu(env));
3462 SET_FIT_PERIOD(12, 16, 20, 24);
3463 SET_WDT_PERIOD(16, 20, 24, 28);
3466 POWERPC_FAMILY(401x2)(ObjectClass *oc, void *data)
3468 DeviceClass *dc = DEVICE_CLASS(oc);
3469 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3471 dc->desc = "PowerPC 401x2";
3472 pcc->init_proc = init_proc_401x2;
3473 pcc->check_pow = check_pow_nocheck;
3474 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3475 PPC_DCR | PPC_WRTEE |
3476 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3477 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3478 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3479 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3480 PPC_4xx_COMMON | PPC_40x_EXCP;
3481 pcc->msr_mask = (1ull << 20) |
3493 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3494 pcc->excp_model = POWERPC_EXCP_40x;
3495 pcc->bus_model = PPC_FLAGS_INPUT_401;
3496 pcc->bfd_mach = bfd_mach_ppc_403;
3497 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3498 POWERPC_FLAG_BUS_CLK;
3501 static void init_proc_401x3(CPUPPCState *env)
3504 gen_spr_401_403(env);
3507 gen_spr_compress(env);
3508 init_excp_4xx_softmmu(env);
3509 env->dcache_line_size = 32;
3510 env->icache_line_size = 32;
3511 /* Allocate hardware IRQ controller */
3512 ppc40x_irq_init(ppc_env_get_cpu(env));
3514 SET_FIT_PERIOD(12, 16, 20, 24);
3515 SET_WDT_PERIOD(16, 20, 24, 28);
3518 POWERPC_FAMILY(401x3)(ObjectClass *oc, void *data)
3520 DeviceClass *dc = DEVICE_CLASS(oc);
3521 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3523 dc->desc = "PowerPC 401x3";
3524 pcc->init_proc = init_proc_401x3;
3525 pcc->check_pow = check_pow_nocheck;
3526 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3527 PPC_DCR | PPC_WRTEE |
3528 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3529 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3530 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3531 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3532 PPC_4xx_COMMON | PPC_40x_EXCP;
3533 pcc->msr_mask = (1ull << 20) |
3546 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3547 pcc->excp_model = POWERPC_EXCP_40x;
3548 pcc->bus_model = PPC_FLAGS_INPUT_401;
3549 pcc->bfd_mach = bfd_mach_ppc_403;
3550 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3551 POWERPC_FLAG_BUS_CLK;
3554 static void init_proc_IOP480(CPUPPCState *env)
3557 gen_spr_401_403(env);
3559 gen_spr_compress(env);
3560 /* Memory management */
3561 #if !defined(CONFIG_USER_ONLY)
3565 env->tlb_type = TLB_EMB;
3567 init_excp_4xx_softmmu(env);
3568 env->dcache_line_size = 32;
3569 env->icache_line_size = 32;
3570 /* Allocate hardware IRQ controller */
3571 ppc40x_irq_init(ppc_env_get_cpu(env));
3573 SET_FIT_PERIOD(8, 12, 16, 20);
3574 SET_WDT_PERIOD(16, 20, 24, 28);
3577 POWERPC_FAMILY(IOP480)(ObjectClass *oc, void *data)
3579 DeviceClass *dc = DEVICE_CLASS(oc);
3580 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3582 dc->desc = "IOP480";
3583 pcc->init_proc = init_proc_IOP480;
3584 pcc->check_pow = check_pow_nocheck;
3585 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3586 PPC_DCR | PPC_WRTEE |
3587 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3588 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3589 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3590 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3591 PPC_4xx_COMMON | PPC_40x_EXCP;
3592 pcc->msr_mask = (1ull << 20) |
3604 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3605 pcc->excp_model = POWERPC_EXCP_40x;
3606 pcc->bus_model = PPC_FLAGS_INPUT_401;
3607 pcc->bfd_mach = bfd_mach_ppc_403;
3608 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3609 POWERPC_FLAG_BUS_CLK;
3612 static void init_proc_403(CPUPPCState *env)
3615 gen_spr_401_403(env);
3617 gen_spr_403_real(env);
3618 init_excp_4xx_real(env);
3619 env->dcache_line_size = 32;
3620 env->icache_line_size = 32;
3621 /* Allocate hardware IRQ controller */
3622 ppc40x_irq_init(ppc_env_get_cpu(env));
3624 SET_FIT_PERIOD(8, 12, 16, 20);
3625 SET_WDT_PERIOD(16, 20, 24, 28);
3628 POWERPC_FAMILY(403)(ObjectClass *oc, void *data)
3630 DeviceClass *dc = DEVICE_CLASS(oc);
3631 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3633 dc->desc = "PowerPC 403";
3634 pcc->init_proc = init_proc_403;
3635 pcc->check_pow = check_pow_nocheck;
3636 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3637 PPC_DCR | PPC_WRTEE |
3638 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3640 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3641 PPC_4xx_COMMON | PPC_40x_EXCP;
3642 pcc->msr_mask = (1ull << MSR_POW) |
3651 pcc->mmu_model = POWERPC_MMU_REAL;
3652 pcc->excp_model = POWERPC_EXCP_40x;
3653 pcc->bus_model = PPC_FLAGS_INPUT_401;
3654 pcc->bfd_mach = bfd_mach_ppc_403;
3655 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3656 POWERPC_FLAG_BUS_CLK;
3659 static void init_proc_403GCX(CPUPPCState *env)
3662 gen_spr_401_403(env);
3664 gen_spr_403_real(env);
3665 gen_spr_403_mmu(env);
3666 /* Bus access control */
3667 /* not emulated, as QEMU never does speculative access */
3668 spr_register(env, SPR_40x_SGR, "SGR",
3669 SPR_NOACCESS, SPR_NOACCESS,
3670 &spr_read_generic, &spr_write_generic,
3672 /* not emulated, as QEMU do not emulate caches */
3673 spr_register(env, SPR_40x_DCWR, "DCWR",
3674 SPR_NOACCESS, SPR_NOACCESS,
3675 &spr_read_generic, &spr_write_generic,
3677 /* Memory management */
3678 #if !defined(CONFIG_USER_ONLY)
3682 env->tlb_type = TLB_EMB;
3684 init_excp_4xx_softmmu(env);
3685 env->dcache_line_size = 32;
3686 env->icache_line_size = 32;
3687 /* Allocate hardware IRQ controller */
3688 ppc40x_irq_init(ppc_env_get_cpu(env));
3690 SET_FIT_PERIOD(8, 12, 16, 20);
3691 SET_WDT_PERIOD(16, 20, 24, 28);
3694 POWERPC_FAMILY(403GCX)(ObjectClass *oc, void *data)
3696 DeviceClass *dc = DEVICE_CLASS(oc);
3697 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3699 dc->desc = "PowerPC 403 GCX";
3700 pcc->init_proc = init_proc_403GCX;
3701 pcc->check_pow = check_pow_nocheck;
3702 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3703 PPC_DCR | PPC_WRTEE |
3704 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3706 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3707 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3708 PPC_4xx_COMMON | PPC_40x_EXCP;
3709 pcc->msr_mask = (1ull << MSR_POW) |
3718 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3719 pcc->excp_model = POWERPC_EXCP_40x;
3720 pcc->bus_model = PPC_FLAGS_INPUT_401;
3721 pcc->bfd_mach = bfd_mach_ppc_403;
3722 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3723 POWERPC_FLAG_BUS_CLK;
3726 static void init_proc_405(CPUPPCState *env)
3732 /* Bus access control */
3733 /* not emulated, as QEMU never does speculative access */
3734 spr_register(env, SPR_40x_SGR, "SGR",
3735 SPR_NOACCESS, SPR_NOACCESS,
3736 &spr_read_generic, &spr_write_generic,
3738 /* not emulated, as QEMU do not emulate caches */
3739 spr_register(env, SPR_40x_DCWR, "DCWR",
3740 SPR_NOACCESS, SPR_NOACCESS,
3741 &spr_read_generic, &spr_write_generic,
3743 /* Memory management */
3744 #if !defined(CONFIG_USER_ONLY)
3748 env->tlb_type = TLB_EMB;
3750 init_excp_4xx_softmmu(env);
3751 env->dcache_line_size = 32;
3752 env->icache_line_size = 32;
3753 /* Allocate hardware IRQ controller */
3754 ppc40x_irq_init(ppc_env_get_cpu(env));
3756 SET_FIT_PERIOD(8, 12, 16, 20);
3757 SET_WDT_PERIOD(16, 20, 24, 28);
3760 POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
3762 DeviceClass *dc = DEVICE_CLASS(oc);
3763 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3765 dc->desc = "PowerPC 405";
3766 pcc->init_proc = init_proc_405;
3767 pcc->check_pow = check_pow_nocheck;
3768 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3769 PPC_DCR | PPC_WRTEE |
3770 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3771 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3772 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3773 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3774 PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
3775 pcc->msr_mask = (1ull << MSR_POW) |
3784 pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
3785 pcc->excp_model = POWERPC_EXCP_40x;
3786 pcc->bus_model = PPC_FLAGS_INPUT_405;
3787 pcc->bfd_mach = bfd_mach_ppc_403;
3788 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3789 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3792 static void init_proc_440EP(CPUPPCState *env)
3796 gen_spr_BookE(env, 0x000000000000FFFFULL);
3798 gen_spr_usprgh(env);
3799 /* Processor identification */
3800 spr_register(env, SPR_BOOKE_PIR, "PIR",
3801 SPR_NOACCESS, SPR_NOACCESS,
3802 &spr_read_generic, &spr_write_pir,
3804 /* XXX : not implemented */
3805 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3806 SPR_NOACCESS, SPR_NOACCESS,
3807 &spr_read_generic, &spr_write_generic,
3809 /* XXX : not implemented */
3810 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3811 SPR_NOACCESS, SPR_NOACCESS,
3812 &spr_read_generic, &spr_write_generic,
3814 /* XXX : not implemented */
3815 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3816 SPR_NOACCESS, SPR_NOACCESS,
3817 &spr_read_generic, &spr_write_generic,
3819 /* XXX : not implemented */
3820 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3821 SPR_NOACCESS, SPR_NOACCESS,
3822 &spr_read_generic, &spr_write_generic,
3824 /* XXX : not implemented */
3825 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3826 SPR_NOACCESS, SPR_NOACCESS,
3827 &spr_read_generic, &spr_write_generic,
3829 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3830 SPR_NOACCESS, SPR_NOACCESS,
3831 &spr_read_generic, &spr_write_generic,
3833 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3834 SPR_NOACCESS, SPR_NOACCESS,
3835 &spr_read_generic, &spr_write_generic,
3837 /* XXX : not implemented */
3838 spr_register(env, SPR_440_CCR1, "CCR1",
3839 SPR_NOACCESS, SPR_NOACCESS,
3840 &spr_read_generic, &spr_write_generic,
3842 /* Memory management */
3843 #if !defined(CONFIG_USER_ONLY)
3847 env->tlb_type = TLB_EMB;
3849 init_excp_BookE(env);
3850 env->dcache_line_size = 32;
3851 env->icache_line_size = 32;
3852 ppc40x_irq_init(ppc_env_get_cpu(env));
3854 SET_FIT_PERIOD(12, 16, 20, 24);
3855 SET_WDT_PERIOD(20, 24, 28, 32);
3858 POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
3860 DeviceClass *dc = DEVICE_CLASS(oc);
3861 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3863 dc->desc = "PowerPC 440 EP";
3864 pcc->init_proc = init_proc_440EP;
3865 pcc->check_pow = check_pow_nocheck;
3866 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3867 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3868 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3870 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3871 PPC_CACHE | PPC_CACHE_ICBI |
3872 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3873 PPC_MEM_TLBSYNC | PPC_MFTB |
3874 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3876 pcc->msr_mask = (1ull << MSR_POW) |
3888 pcc->mmu_model = POWERPC_MMU_BOOKE;
3889 pcc->excp_model = POWERPC_EXCP_BOOKE;
3890 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3891 pcc->bfd_mach = bfd_mach_ppc_403;
3892 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3893 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3896 POWERPC_FAMILY(460EX)(ObjectClass *oc, void *data)
3898 DeviceClass *dc = DEVICE_CLASS(oc);
3899 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3901 dc->desc = "PowerPC 460 EX";
3902 pcc->init_proc = init_proc_440EP;
3903 pcc->check_pow = check_pow_nocheck;
3904 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3905 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3906 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3908 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_RFMCI |
3909 PPC_CACHE | PPC_CACHE_ICBI |
3910 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3911 PPC_MEM_TLBSYNC | PPC_MFTB |
3912 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3914 pcc->msr_mask = (1ull << MSR_POW) |
3926 pcc->mmu_model = POWERPC_MMU_BOOKE;
3927 pcc->excp_model = POWERPC_EXCP_BOOKE;
3928 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3929 pcc->bfd_mach = bfd_mach_ppc_403;
3930 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3931 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3934 static void init_proc_440GP(CPUPPCState *env)
3938 gen_spr_BookE(env, 0x000000000000FFFFULL);
3940 gen_spr_usprgh(env);
3941 /* Processor identification */
3942 spr_register(env, SPR_BOOKE_PIR, "PIR",
3943 SPR_NOACCESS, SPR_NOACCESS,
3944 &spr_read_generic, &spr_write_pir,
3946 /* XXX : not implemented */
3947 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3948 SPR_NOACCESS, SPR_NOACCESS,
3949 &spr_read_generic, &spr_write_generic,
3951 /* XXX : not implemented */
3952 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3953 SPR_NOACCESS, SPR_NOACCESS,
3954 &spr_read_generic, &spr_write_generic,
3956 /* XXX : not implemented */
3957 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3958 SPR_NOACCESS, SPR_NOACCESS,
3959 &spr_read_generic, &spr_write_generic,
3961 /* XXX : not implemented */
3962 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3963 SPR_NOACCESS, SPR_NOACCESS,
3964 &spr_read_generic, &spr_write_generic,
3966 /* Memory management */
3967 #if !defined(CONFIG_USER_ONLY)
3971 env->tlb_type = TLB_EMB;
3973 init_excp_BookE(env);
3974 env->dcache_line_size = 32;
3975 env->icache_line_size = 32;
3976 /* XXX: TODO: allocate internal IRQ controller */
3978 SET_FIT_PERIOD(12, 16, 20, 24);
3979 SET_WDT_PERIOD(20, 24, 28, 32);
3982 POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
3984 DeviceClass *dc = DEVICE_CLASS(oc);
3985 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3987 dc->desc = "PowerPC 440 GP";
3988 pcc->init_proc = init_proc_440GP;
3989 pcc->check_pow = check_pow_nocheck;
3990 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3991 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
3992 PPC_CACHE | PPC_CACHE_ICBI |
3993 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3994 PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
3995 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3997 pcc->msr_mask = (1ull << MSR_POW) |
4009 pcc->mmu_model = POWERPC_MMU_BOOKE;
4010 pcc->excp_model = POWERPC_EXCP_BOOKE;
4011 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4012 pcc->bfd_mach = bfd_mach_ppc_403;
4013 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4014 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4017 static void init_proc_440x4(CPUPPCState *env)
4021 gen_spr_BookE(env, 0x000000000000FFFFULL);
4023 gen_spr_usprgh(env);
4024 /* Processor identification */
4025 spr_register(env, SPR_BOOKE_PIR, "PIR",
4026 SPR_NOACCESS, SPR_NOACCESS,
4027 &spr_read_generic, &spr_write_pir,
4029 /* XXX : not implemented */
4030 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4031 SPR_NOACCESS, SPR_NOACCESS,
4032 &spr_read_generic, &spr_write_generic,
4034 /* XXX : not implemented */
4035 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4036 SPR_NOACCESS, SPR_NOACCESS,
4037 &spr_read_generic, &spr_write_generic,
4039 /* XXX : not implemented */
4040 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
4041 SPR_NOACCESS, SPR_NOACCESS,
4042 &spr_read_generic, &spr_write_generic,
4044 /* XXX : not implemented */
4045 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
4046 SPR_NOACCESS, SPR_NOACCESS,
4047 &spr_read_generic, &spr_write_generic,
4049 /* Memory management */
4050 #if !defined(CONFIG_USER_ONLY)
4054 env->tlb_type = TLB_EMB;
4056 init_excp_BookE(env);
4057 env->dcache_line_size = 32;
4058 env->icache_line_size = 32;
4059 /* XXX: TODO: allocate internal IRQ controller */
4061 SET_FIT_PERIOD(12, 16, 20, 24);
4062 SET_WDT_PERIOD(20, 24, 28, 32);
4065 POWERPC_FAMILY(440x4)(ObjectClass *oc, void *data)
4067 DeviceClass *dc = DEVICE_CLASS(oc);
4068 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4070 dc->desc = "PowerPC 440x4";
4071 pcc->init_proc = init_proc_440x4;
4072 pcc->check_pow = check_pow_nocheck;
4073 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4074 PPC_DCR | PPC_WRTEE |
4075 PPC_CACHE | PPC_CACHE_ICBI |
4076 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4077 PPC_MEM_TLBSYNC | PPC_MFTB |
4078 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4080 pcc->msr_mask = (1ull << MSR_POW) |
4092 pcc->mmu_model = POWERPC_MMU_BOOKE;
4093 pcc->excp_model = POWERPC_EXCP_BOOKE;
4094 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4095 pcc->bfd_mach = bfd_mach_ppc_403;
4096 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4097 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4100 static void init_proc_440x5(CPUPPCState *env)
4104 gen_spr_BookE(env, 0x000000000000FFFFULL);
4106 gen_spr_usprgh(env);
4107 /* Processor identification */
4108 spr_register(env, SPR_BOOKE_PIR, "PIR",
4109 SPR_NOACCESS, SPR_NOACCESS,
4110 &spr_read_generic, &spr_write_pir,
4112 /* XXX : not implemented */
4113 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4114 SPR_NOACCESS, SPR_NOACCESS,
4115 &spr_read_generic, &spr_write_generic,
4117 /* XXX : not implemented */
4118 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4119 SPR_NOACCESS, SPR_NOACCESS,
4120 &spr_read_generic, &spr_write_generic,
4122 /* XXX : not implemented */
4123 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
4124 SPR_NOACCESS, SPR_NOACCESS,
4125 &spr_read_generic, &spr_write_generic,
4127 /* XXX : not implemented */
4128 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
4129 SPR_NOACCESS, SPR_NOACCESS,
4130 &spr_read_generic, &spr_write_generic,
4132 /* XXX : not implemented */
4133 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4134 SPR_NOACCESS, SPR_NOACCESS,
4135 &spr_read_generic, &spr_write_generic,
4137 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4138 SPR_NOACCESS, SPR_NOACCESS,
4139 &spr_read_generic, &spr_write_generic,
4141 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4142 SPR_NOACCESS, SPR_NOACCESS,
4143 &spr_read_generic, &spr_write_generic,
4145 /* XXX : not implemented */
4146 spr_register(env, SPR_440_CCR1, "CCR1",
4147 SPR_NOACCESS, SPR_NOACCESS,
4148 &spr_read_generic, &spr_write_generic,
4150 /* Memory management */
4151 #if !defined(CONFIG_USER_ONLY)
4155 env->tlb_type = TLB_EMB;
4157 init_excp_BookE(env);
4158 env->dcache_line_size = 32;
4159 env->icache_line_size = 32;
4160 ppc40x_irq_init(ppc_env_get_cpu(env));
4162 SET_FIT_PERIOD(12, 16, 20, 24);
4163 SET_WDT_PERIOD(20, 24, 28, 32);
4166 POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
4168 DeviceClass *dc = DEVICE_CLASS(oc);
4169 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4171 dc->desc = "PowerPC 440x5";
4172 pcc->init_proc = init_proc_440x5;
4173 pcc->check_pow = check_pow_nocheck;
4174 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4175 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
4176 PPC_CACHE | PPC_CACHE_ICBI |
4177 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4178 PPC_MEM_TLBSYNC | PPC_MFTB |
4179 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4181 pcc->msr_mask = (1ull << MSR_POW) |
4193 pcc->mmu_model = POWERPC_MMU_BOOKE;
4194 pcc->excp_model = POWERPC_EXCP_BOOKE;
4195 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4196 pcc->bfd_mach = bfd_mach_ppc_403;
4197 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4198 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4201 POWERPC_FAMILY(440x5wDFPU)(ObjectClass *oc, void *data)
4203 DeviceClass *dc = DEVICE_CLASS(oc);
4204 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4206 dc->desc = "PowerPC 440x5 with double precision FPU";
4207 pcc->init_proc = init_proc_440x5;
4208 pcc->check_pow = check_pow_nocheck;
4209 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4210 PPC_FLOAT | PPC_FLOAT_FSQRT |
4212 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
4213 PPC_CACHE | PPC_CACHE_ICBI |
4214 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4215 PPC_MEM_TLBSYNC | PPC_MFTB |
4216 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4218 pcc->insns_flags2 = PPC2_FP_CVT_S64;
4219 pcc->msr_mask = (1ull << MSR_POW) |
4231 pcc->mmu_model = POWERPC_MMU_BOOKE;
4232 pcc->excp_model = POWERPC_EXCP_BOOKE;
4233 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4234 pcc->bfd_mach = bfd_mach_ppc_403;
4235 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4236 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4239 static void init_proc_MPC5xx(CPUPPCState *env)
4243 gen_spr_5xx_8xx(env);
4245 init_excp_MPC5xx(env);
4246 env->dcache_line_size = 32;
4247 env->icache_line_size = 32;
4248 /* XXX: TODO: allocate internal IRQ controller */
4251 POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
4253 DeviceClass *dc = DEVICE_CLASS(oc);
4254 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4256 dc->desc = "Freescale 5xx cores (aka RCPU)";
4257 pcc->init_proc = init_proc_MPC5xx;
4258 pcc->check_pow = check_pow_none;
4259 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4260 PPC_MEM_EIEIO | PPC_MEM_SYNC |
4261 PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
4263 pcc->msr_mask = (1ull << MSR_ILE) |
4275 pcc->mmu_model = POWERPC_MMU_REAL;
4276 pcc->excp_model = POWERPC_EXCP_603;
4277 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4278 pcc->bfd_mach = bfd_mach_ppc_505;
4279 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4280 POWERPC_FLAG_BUS_CLK;
4283 static void init_proc_MPC8xx(CPUPPCState *env)
4287 gen_spr_5xx_8xx(env);
4289 init_excp_MPC8xx(env);
4290 env->dcache_line_size = 32;
4291 env->icache_line_size = 32;
4292 /* XXX: TODO: allocate internal IRQ controller */
4295 POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
4297 DeviceClass *dc = DEVICE_CLASS(oc);
4298 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4300 dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
4301 pcc->init_proc = init_proc_MPC8xx;
4302 pcc->check_pow = check_pow_none;
4303 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4304 PPC_MEM_EIEIO | PPC_MEM_SYNC |
4305 PPC_CACHE_ICBI | PPC_MFTB;
4306 pcc->msr_mask = (1ull << MSR_ILE) |
4318 pcc->mmu_model = POWERPC_MMU_MPC8xx;
4319 pcc->excp_model = POWERPC_EXCP_603;
4320 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4321 pcc->bfd_mach = bfd_mach_ppc_860;
4322 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4323 POWERPC_FLAG_BUS_CLK;
4326 /* Freescale 82xx cores (aka PowerQUICC-II) */
4328 static void init_proc_G2(CPUPPCState *env)
4330 gen_spr_ne_601(env);
4332 gen_spr_G2_755(env);
4336 /* External access control */
4337 /* XXX : not implemented */
4338 spr_register(env, SPR_EAR, "EAR",
4339 SPR_NOACCESS, SPR_NOACCESS,
4340 &spr_read_generic, &spr_write_generic,
4342 /* Hardware implementation register */
4343 /* XXX : not implemented */
4344 spr_register(env, SPR_HID0, "HID0",
4345 SPR_NOACCESS, SPR_NOACCESS,
4346 &spr_read_generic, &spr_write_generic,
4348 /* XXX : not implemented */
4349 spr_register(env, SPR_HID1, "HID1",
4350 SPR_NOACCESS, SPR_NOACCESS,
4351 &spr_read_generic, &spr_write_generic,
4353 /* XXX : not implemented */
4354 spr_register(env, SPR_HID2, "HID2",
4355 SPR_NOACCESS, SPR_NOACCESS,
4356 &spr_read_generic, &spr_write_generic,
4358 /* Memory management */
4361 gen_6xx_7xx_soft_tlb(env, 64, 2);
4363 env->dcache_line_size = 32;
4364 env->icache_line_size = 32;
4365 /* Allocate hardware IRQ controller */
4366 ppc6xx_irq_init(ppc_env_get_cpu(env));
4369 POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
4371 DeviceClass *dc = DEVICE_CLASS(oc);
4372 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4374 dc->desc = "PowerPC G2";
4375 pcc->init_proc = init_proc_G2;
4376 pcc->check_pow = check_pow_hid0;
4377 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4378 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4380 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4381 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4382 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4383 PPC_SEGMENT | PPC_EXTERN;
4384 pcc->msr_mask = (1ull << MSR_POW) |
4385 (1ull << MSR_TGPR) |
4399 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4400 pcc->excp_model = POWERPC_EXCP_G2;
4401 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4402 pcc->bfd_mach = bfd_mach_ppc_ec603e;
4403 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4404 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4407 static void init_proc_G2LE(CPUPPCState *env)
4409 gen_spr_ne_601(env);
4411 gen_spr_G2_755(env);
4415 /* External access control */
4416 /* XXX : not implemented */
4417 spr_register(env, SPR_EAR, "EAR",
4418 SPR_NOACCESS, SPR_NOACCESS,
4419 &spr_read_generic, &spr_write_generic,
4421 /* Hardware implementation register */
4422 /* XXX : not implemented */
4423 spr_register(env, SPR_HID0, "HID0",
4424 SPR_NOACCESS, SPR_NOACCESS,
4425 &spr_read_generic, &spr_write_generic,
4427 /* XXX : not implemented */
4428 spr_register(env, SPR_HID1, "HID1",
4429 SPR_NOACCESS, SPR_NOACCESS,
4430 &spr_read_generic, &spr_write_generic,
4432 /* XXX : not implemented */
4433 spr_register(env, SPR_HID2, "HID2",
4434 SPR_NOACCESS, SPR_NOACCESS,
4435 &spr_read_generic, &spr_write_generic,
4438 /* Memory management */
4441 gen_6xx_7xx_soft_tlb(env, 64, 2);
4443 env->dcache_line_size = 32;
4444 env->icache_line_size = 32;
4445 /* Allocate hardware IRQ controller */
4446 ppc6xx_irq_init(ppc_env_get_cpu(env));
4449 POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
4451 DeviceClass *dc = DEVICE_CLASS(oc);
4452 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4454 dc->desc = "PowerPC G2LE";
4455 pcc->init_proc = init_proc_G2LE;
4456 pcc->check_pow = check_pow_hid0;
4457 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4458 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4460 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4461 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4462 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4463 PPC_SEGMENT | PPC_EXTERN;
4464 pcc->msr_mask = (1ull << MSR_POW) |
4465 (1ull << MSR_TGPR) |
4481 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4482 pcc->excp_model = POWERPC_EXCP_G2;
4483 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4484 pcc->bfd_mach = bfd_mach_ppc_ec603e;
4485 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4486 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4489 static void init_proc_e200(CPUPPCState *env)
4493 gen_spr_BookE(env, 0x000000070000FFFFULL);
4494 /* XXX : not implemented */
4495 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4496 &spr_read_spefscr, &spr_write_spefscr,
4497 &spr_read_spefscr, &spr_write_spefscr,
4499 /* Memory management */
4500 gen_spr_BookE206(env, 0x0000005D, NULL, 0);
4501 /* XXX : not implemented */
4502 spr_register(env, SPR_HID0, "HID0",
4503 SPR_NOACCESS, SPR_NOACCESS,
4504 &spr_read_generic, &spr_write_generic,
4506 /* XXX : not implemented */
4507 spr_register(env, SPR_HID1, "HID1",
4508 SPR_NOACCESS, SPR_NOACCESS,
4509 &spr_read_generic, &spr_write_generic,
4511 /* XXX : not implemented */
4512 spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
4513 SPR_NOACCESS, SPR_NOACCESS,
4514 &spr_read_generic, &spr_write_generic,
4516 /* XXX : not implemented */
4517 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4518 SPR_NOACCESS, SPR_NOACCESS,
4519 &spr_read_generic, &spr_write_generic,
4521 /* XXX : not implemented */
4522 spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
4523 SPR_NOACCESS, SPR_NOACCESS,
4524 &spr_read_generic, &spr_write_generic,
4526 /* XXX : not implemented */
4527 spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
4528 SPR_NOACCESS, SPR_NOACCESS,
4529 &spr_read_generic, &spr_write_generic,
4531 /* XXX : not implemented */
4532 spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
4533 SPR_NOACCESS, SPR_NOACCESS,
4534 &spr_read_generic, &spr_write_generic,
4536 /* XXX : not implemented */
4537 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4538 &spr_read_generic, SPR_NOACCESS,
4539 &spr_read_generic, SPR_NOACCESS,
4541 /* XXX : not implemented */
4542 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4543 SPR_NOACCESS, SPR_NOACCESS,
4544 &spr_read_generic, &spr_write_generic,
4546 /* XXX : not implemented */
4547 spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
4548 SPR_NOACCESS, SPR_NOACCESS,
4549 &spr_read_generic, &spr_write_generic,
4551 /* XXX : not implemented */
4552 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
4553 SPR_NOACCESS, SPR_NOACCESS,
4554 &spr_read_generic, &spr_write_generic,
4556 /* XXX : not implemented */
4557 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
4558 SPR_NOACCESS, SPR_NOACCESS,
4559 &spr_read_generic, &spr_write_generic,
4561 /* XXX : not implemented */
4562 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4563 SPR_NOACCESS, SPR_NOACCESS,
4564 &spr_read_generic, &spr_write_generic,
4566 /* XXX : not implemented */
4567 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4568 SPR_NOACCESS, SPR_NOACCESS,
4569 &spr_read_generic, &spr_write_generic,
4571 /* XXX : not implemented */
4572 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4573 SPR_NOACCESS, SPR_NOACCESS,
4574 &spr_read_generic, &spr_write_generic,
4575 0x00000000); /* TOFIX */
4576 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
4577 SPR_NOACCESS, SPR_NOACCESS,
4578 &spr_read_generic, &spr_write_generic,
4580 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
4581 SPR_NOACCESS, SPR_NOACCESS,
4582 &spr_read_generic, &spr_write_generic,
4584 #if !defined(CONFIG_USER_ONLY)
4588 env->tlb_type = TLB_EMB;
4590 init_excp_e200(env, 0xFFFF0000UL);
4591 env->dcache_line_size = 32;
4592 env->icache_line_size = 32;
4593 /* XXX: TODO: allocate internal IRQ controller */
4596 POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
4598 DeviceClass *dc = DEVICE_CLASS(oc);
4599 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4601 dc->desc = "e200 core";
4602 pcc->init_proc = init_proc_e200;
4603 pcc->check_pow = check_pow_hid0;
4604 /* XXX: unimplemented instructions:
4611 * all SPE multiply-accumulate instructions
4613 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4614 PPC_SPE | PPC_SPE_SINGLE |
4615 PPC_WRTEE | PPC_RFDI |
4616 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4617 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4618 PPC_MEM_TLBSYNC | PPC_TLBIVAX |
4620 pcc->msr_mask = (1ull << MSR_UCLE) |
4634 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4635 pcc->excp_model = POWERPC_EXCP_BOOKE;
4636 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4637 pcc->bfd_mach = bfd_mach_ppc_860;
4638 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4639 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4640 POWERPC_FLAG_BUS_CLK;
4643 static void init_proc_e300(CPUPPCState *env)
4645 gen_spr_ne_601(env);
4650 /* hardware implementation registers */
4651 /* XXX : not implemented */
4652 spr_register(env, SPR_HID0, "HID0",
4653 SPR_NOACCESS, SPR_NOACCESS,
4654 &spr_read_generic, &spr_write_generic,
4656 /* XXX : not implemented */
4657 spr_register(env, SPR_HID1, "HID1",
4658 SPR_NOACCESS, SPR_NOACCESS,
4659 &spr_read_generic, &spr_write_generic,
4661 /* XXX : not implemented */
4662 spr_register(env, SPR_HID2, "HID2",
4663 SPR_NOACCESS, SPR_NOACCESS,
4664 &spr_read_generic, &spr_write_generic,
4667 /* XXX : not implemented */
4668 spr_register(env, SPR_DABR, "DABR",
4669 SPR_NOACCESS, SPR_NOACCESS,
4670 &spr_read_generic, &spr_write_generic,
4672 /* XXX : not implemented */
4673 spr_register(env, SPR_DABR2, "DABR2",
4674 SPR_NOACCESS, SPR_NOACCESS,
4675 &spr_read_generic, &spr_write_generic,
4677 /* XXX : not implemented */
4678 spr_register(env, SPR_IABR2, "IABR2",
4679 SPR_NOACCESS, SPR_NOACCESS,
4680 &spr_read_generic, &spr_write_generic,
4682 /* XXX : not implemented */
4683 spr_register(env, SPR_IBCR, "IBCR",
4684 SPR_NOACCESS, SPR_NOACCESS,
4685 &spr_read_generic, &spr_write_generic,
4687 /* XXX : not implemented */
4688 spr_register(env, SPR_DBCR, "DBCR",
4689 SPR_NOACCESS, SPR_NOACCESS,
4690 &spr_read_generic, &spr_write_generic,
4692 /* Memory management */
4695 gen_6xx_7xx_soft_tlb(env, 64, 2);
4697 env->dcache_line_size = 32;
4698 env->icache_line_size = 32;
4699 /* Allocate hardware IRQ controller */
4700 ppc6xx_irq_init(ppc_env_get_cpu(env));
4703 POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
4705 DeviceClass *dc = DEVICE_CLASS(oc);
4706 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4708 dc->desc = "e300 core";
4709 pcc->init_proc = init_proc_e300;
4710 pcc->check_pow = check_pow_hid0;
4711 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4712 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4714 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4715 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4716 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4717 PPC_SEGMENT | PPC_EXTERN;
4718 pcc->msr_mask = (1ull << MSR_POW) |
4719 (1ull << MSR_TGPR) |
4735 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4736 pcc->excp_model = POWERPC_EXCP_603;
4737 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4738 pcc->bfd_mach = bfd_mach_ppc_603;
4739 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4740 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4743 #if !defined(CONFIG_USER_ONLY)
4744 static void spr_write_mas73(DisasContext *ctx, int sprn, int gprn)
4746 TCGv val = tcg_temp_new();
4747 tcg_gen_ext32u_tl(val, cpu_gpr[gprn]);
4748 gen_store_spr(SPR_BOOKE_MAS3, val);
4749 tcg_gen_shri_tl(val, cpu_gpr[gprn], 32);
4750 gen_store_spr(SPR_BOOKE_MAS7, val);
4754 static void spr_read_mas73(DisasContext *ctx, int gprn, int sprn)
4756 TCGv mas7 = tcg_temp_new();
4757 TCGv mas3 = tcg_temp_new();
4758 gen_load_spr(mas7, SPR_BOOKE_MAS7);
4759 tcg_gen_shli_tl(mas7, mas7, 32);
4760 gen_load_spr(mas3, SPR_BOOKE_MAS3);
4761 tcg_gen_or_tl(cpu_gpr[gprn], mas3, mas7);
4762 tcg_temp_free(mas3);
4763 tcg_temp_free(mas7);
4768 enum fsl_e500_version {
4776 static void init_proc_e500(CPUPPCState *env, int version)
4778 PowerPCCPU *cpu = ppc_env_get_cpu(env);
4779 uint32_t tlbncfg[2];
4781 uint64_t ivpr_mask = 0xFFFF0000ULL;
4782 uint32_t l1cfg0 = 0x3800 /* 8 ways */
4783 | 0x0020; /* 32 kb */
4784 uint32_t l1cfg1 = 0x3800 /* 8 ways */
4785 | 0x0020; /* 32 kb */
4786 uint32_t mmucfg = 0;
4787 #if !defined(CONFIG_USER_ONLY)
4794 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
4795 * complain when accessing them.
4796 * gen_spr_BookE(env, 0x0000000F0000FD7FULL);
4802 ivor_mask = 0x0000000F0000FFFFULL;
4806 ivor_mask = 0x000003FE0000FFFFULL;
4809 ivor_mask = 0x000003FF0000FFFFULL;
4812 gen_spr_BookE(env, ivor_mask);
4813 gen_spr_usprg3(env);
4814 /* Processor identification */
4815 spr_register(env, SPR_BOOKE_PIR, "PIR",
4816 SPR_NOACCESS, SPR_NOACCESS,
4817 &spr_read_generic, &spr_write_pir,
4819 /* XXX : not implemented */
4820 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4821 &spr_read_spefscr, &spr_write_spefscr,
4822 &spr_read_spefscr, &spr_write_spefscr,
4824 #if !defined(CONFIG_USER_ONLY)
4825 /* Memory management */
4831 tlbncfg[0] = gen_tlbncfg(2, 1, 1, 0, 256);
4832 tlbncfg[1] = gen_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4835 tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4836 tlbncfg[1] = gen_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4840 tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4841 tlbncfg[1] = gen_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
4846 tlbncfg[0] = 0x08052400;
4847 tlbncfg[1] = 0x40028040;
4850 cpu_abort(CPU(cpu), "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4857 env->dcache_line_size = 32;
4858 env->icache_line_size = 32;
4862 env->dcache_line_size = 64;
4863 env->icache_line_size = 64;
4864 l1cfg0 |= 0x1000000; /* 64 byte cache block size */
4865 l1cfg1 |= 0x1000000; /* 64 byte cache block size */
4868 env->dcache_line_size = 32;
4869 env->icache_line_size = 32;
4870 l1cfg0 |= 0x0F83820;
4871 l1cfg1 |= 0x0B83820;
4874 cpu_abort(CPU(cpu), "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4876 gen_spr_BookE206(env, 0x000000DF, tlbncfg, mmucfg);
4877 /* XXX : not implemented */
4878 spr_register(env, SPR_HID0, "HID0",
4879 SPR_NOACCESS, SPR_NOACCESS,
4880 &spr_read_generic, &spr_write_generic,
4882 /* XXX : not implemented */
4883 spr_register(env, SPR_HID1, "HID1",
4884 SPR_NOACCESS, SPR_NOACCESS,
4885 &spr_read_generic, &spr_write_generic,
4887 /* XXX : not implemented */
4888 spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
4889 SPR_NOACCESS, SPR_NOACCESS,
4890 &spr_read_generic, &spr_write_generic,
4892 /* XXX : not implemented */
4893 spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
4894 SPR_NOACCESS, SPR_NOACCESS,
4895 &spr_read_generic, &spr_write_generic,
4897 /* XXX : not implemented */
4898 spr_register(env, SPR_Exxx_MCAR, "MCAR",
4899 SPR_NOACCESS, SPR_NOACCESS,
4900 &spr_read_generic, &spr_write_generic,
4902 /* XXX : not implemented */
4903 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4904 SPR_NOACCESS, SPR_NOACCESS,
4905 &spr_read_generic, &spr_write_generic,
4907 /* XXX : not implemented */
4908 spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
4909 SPR_NOACCESS, SPR_NOACCESS,
4910 &spr_read_generic, &spr_write_generic,
4912 /* XXX : not implemented */
4913 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4914 SPR_NOACCESS, SPR_NOACCESS,
4915 &spr_read_generic, &spr_write_generic,
4917 /* XXX : not implemented */
4918 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4919 &spr_read_generic, SPR_NOACCESS,
4920 &spr_read_generic, SPR_NOACCESS,
4922 spr_register(env, SPR_Exxx_L1CFG1, "L1CFG1",
4923 &spr_read_generic, SPR_NOACCESS,
4924 &spr_read_generic, SPR_NOACCESS,
4926 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4927 SPR_NOACCESS, SPR_NOACCESS,
4928 &spr_read_generic, &spr_write_e500_l1csr0,
4930 spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
4931 SPR_NOACCESS, SPR_NOACCESS,
4932 &spr_read_generic, &spr_write_e500_l1csr1,
4934 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4935 SPR_NOACCESS, SPR_NOACCESS,
4936 &spr_read_generic, &spr_write_generic,
4938 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4939 SPR_NOACCESS, SPR_NOACCESS,
4940 &spr_read_generic, &spr_write_generic,
4942 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4943 SPR_NOACCESS, SPR_NOACCESS,
4944 &spr_read_generic, &spr_write_booke206_mmucsr0,
4946 spr_register(env, SPR_BOOKE_EPR, "EPR",
4947 SPR_NOACCESS, SPR_NOACCESS,
4948 &spr_read_generic, SPR_NOACCESS,
4950 /* XXX better abstract into Emb.xxx features */
4951 if ((version == fsl_e5500) || (version == fsl_e6500)) {
4952 spr_register(env, SPR_BOOKE_EPCR, "EPCR",
4953 SPR_NOACCESS, SPR_NOACCESS,
4954 &spr_read_generic, &spr_write_generic,
4956 spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
4957 SPR_NOACCESS, SPR_NOACCESS,
4958 &spr_read_mas73, &spr_write_mas73,
4960 ivpr_mask = (target_ulong)~0xFFFFULL;
4963 if (version == fsl_e6500) {
4964 /* Thread identification */
4965 spr_register(env, SPR_TIR, "TIR",
4966 SPR_NOACCESS, SPR_NOACCESS,
4967 &spr_read_generic, SPR_NOACCESS,
4969 spr_register(env, SPR_BOOKE_TLB0PS, "TLB0PS",
4970 SPR_NOACCESS, SPR_NOACCESS,
4971 &spr_read_generic, SPR_NOACCESS,
4973 spr_register(env, SPR_BOOKE_TLB1PS, "TLB1PS",
4974 SPR_NOACCESS, SPR_NOACCESS,
4975 &spr_read_generic, SPR_NOACCESS,
4979 #if !defined(CONFIG_USER_ONLY)
4981 env->tlb_type = TLB_MAS;
4982 for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
4983 env->nb_tlb += booke206_tlb_size(env, i);
4987 init_excp_e200(env, ivpr_mask);
4988 /* Allocate hardware IRQ controller */
4989 ppce500_irq_init(ppc_env_get_cpu(env));
4992 static void init_proc_e500v1(CPUPPCState *env)
4994 init_proc_e500(env, fsl_e500v1);
4997 POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
4999 DeviceClass *dc = DEVICE_CLASS(oc);
5000 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5002 dc->desc = "e500v1 core";
5003 pcc->init_proc = init_proc_e500v1;
5004 pcc->check_pow = check_pow_hid0;
5005 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
5006 PPC_SPE | PPC_SPE_SINGLE |
5007 PPC_WRTEE | PPC_RFDI |
5008 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5009 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5010 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
5011 pcc->insns_flags2 = PPC2_BOOKE206;
5012 pcc->msr_mask = (1ull << MSR_UCLE) |
5026 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5027 pcc->excp_model = POWERPC_EXCP_BOOKE;
5028 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5029 pcc->bfd_mach = bfd_mach_ppc_860;
5030 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
5031 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
5032 POWERPC_FLAG_BUS_CLK;
5035 static void init_proc_e500v2(CPUPPCState *env)
5037 init_proc_e500(env, fsl_e500v2);
5040 POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
5042 DeviceClass *dc = DEVICE_CLASS(oc);
5043 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5045 dc->desc = "e500v2 core";
5046 pcc->init_proc = init_proc_e500v2;
5047 pcc->check_pow = check_pow_hid0;
5048 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
5049 PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
5050 PPC_WRTEE | PPC_RFDI |
5051 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5052 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5053 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
5054 pcc->insns_flags2 = PPC2_BOOKE206;
5055 pcc->msr_mask = (1ull << MSR_UCLE) |
5069 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5070 pcc->excp_model = POWERPC_EXCP_BOOKE;
5071 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5072 pcc->bfd_mach = bfd_mach_ppc_860;
5073 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
5074 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
5075 POWERPC_FLAG_BUS_CLK;
5078 static void init_proc_e500mc(CPUPPCState *env)
5080 init_proc_e500(env, fsl_e500mc);
5083 POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
5085 DeviceClass *dc = DEVICE_CLASS(oc);
5086 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5088 dc->desc = "e500mc core";
5089 pcc->init_proc = init_proc_e500mc;
5090 pcc->check_pow = check_pow_none;
5091 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
5092 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
5093 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5094 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5095 PPC_FLOAT | PPC_FLOAT_FRES |
5096 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
5097 PPC_FLOAT_STFIWX | PPC_WAIT |
5098 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
5099 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
5100 pcc->msr_mask = (1ull << MSR_GS) |
5101 (1ull << MSR_UCLE) |
5114 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5115 pcc->excp_model = POWERPC_EXCP_BOOKE;
5116 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5117 /* FIXME: figure out the correct flag for e500mc */
5118 pcc->bfd_mach = bfd_mach_ppc_e500;
5119 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
5120 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5124 static void init_proc_e5500(CPUPPCState *env)
5126 init_proc_e500(env, fsl_e5500);
5129 POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
5131 DeviceClass *dc = DEVICE_CLASS(oc);
5132 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5134 dc->desc = "e5500 core";
5135 pcc->init_proc = init_proc_e5500;
5136 pcc->check_pow = check_pow_none;
5137 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
5138 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
5139 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5140 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5141 PPC_FLOAT | PPC_FLOAT_FRES |
5142 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
5143 PPC_FLOAT_STFIWX | PPC_WAIT |
5144 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
5145 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
5146 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 | \
5148 pcc->msr_mask = (1ull << MSR_CM) |
5150 (1ull << MSR_UCLE) |
5163 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5164 pcc->excp_model = POWERPC_EXCP_BOOKE;
5165 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5166 /* FIXME: figure out the correct flag for e5500 */
5167 pcc->bfd_mach = bfd_mach_ppc_e500;
5168 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
5169 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5172 static void init_proc_e6500(CPUPPCState *env)
5174 init_proc_e500(env, fsl_e6500);
5177 POWERPC_FAMILY(e6500)(ObjectClass *oc, void *data)
5179 DeviceClass *dc = DEVICE_CLASS(oc);
5180 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5182 dc->desc = "e6500 core";
5183 pcc->init_proc = init_proc_e6500;
5184 pcc->check_pow = check_pow_none;
5185 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
5186 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
5187 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5188 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5189 PPC_FLOAT | PPC_FLOAT_FRES |
5190 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
5191 PPC_FLOAT_STFIWX | PPC_WAIT |
5192 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
5193 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD | PPC_ALTIVEC;
5194 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 | \
5195 PPC2_FP_CVT_S64 | PPC2_ATOMIC_ISA206;
5196 pcc->msr_mask = (1ull << MSR_CM) |
5198 (1ull << MSR_UCLE) |
5212 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5213 pcc->excp_model = POWERPC_EXCP_BOOKE;
5214 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5215 pcc->bfd_mach = bfd_mach_ppc_e500;
5216 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
5217 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_VRE;
5222 /* Non-embedded PowerPC */
5224 #define POWERPC_MSRR_601 (0x0000000000001040ULL)
5226 static void init_proc_601(CPUPPCState *env)
5228 gen_spr_ne_601(env);
5231 /* Hardware implementation registers */
5232 /* XXX : not implemented */
5233 spr_register(env, SPR_HID0, "HID0",
5234 SPR_NOACCESS, SPR_NOACCESS,
5235 &spr_read_generic, &spr_write_hid0_601,
5237 /* XXX : not implemented */
5238 spr_register(env, SPR_HID1, "HID1",
5239 SPR_NOACCESS, SPR_NOACCESS,
5240 &spr_read_generic, &spr_write_generic,
5242 /* XXX : not implemented */
5243 spr_register(env, SPR_601_HID2, "HID2",
5244 SPR_NOACCESS, SPR_NOACCESS,
5245 &spr_read_generic, &spr_write_generic,
5247 /* XXX : not implemented */
5248 spr_register(env, SPR_601_HID5, "HID5",
5249 SPR_NOACCESS, SPR_NOACCESS,
5250 &spr_read_generic, &spr_write_generic,
5252 /* Memory management */
5254 /* XXX: beware that dcache line size is 64
5255 * but dcbz uses 32 bytes "sectors"
5256 * XXX: this breaks clcs instruction !
5258 env->dcache_line_size = 32;
5259 env->icache_line_size = 64;
5260 /* Allocate hardware IRQ controller */
5261 ppc6xx_irq_init(ppc_env_get_cpu(env));
5264 POWERPC_FAMILY(601)(ObjectClass *oc, void *data)
5266 DeviceClass *dc = DEVICE_CLASS(oc);
5267 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5269 dc->desc = "PowerPC 601";
5270 pcc->init_proc = init_proc_601;
5271 pcc->check_pow = check_pow_none;
5272 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
5274 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5275 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
5276 PPC_SEGMENT | PPC_EXTERN;
5277 pcc->msr_mask = (1ull << MSR_EE) |
5287 pcc->mmu_model = POWERPC_MMU_601;
5288 #if defined(CONFIG_SOFTMMU)
5289 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5291 pcc->excp_model = POWERPC_EXCP_601;
5292 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5293 pcc->bfd_mach = bfd_mach_ppc_601;
5294 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
5297 #define POWERPC_MSRR_601v (0x0000000000001040ULL)
5299 static void init_proc_601v(CPUPPCState *env)
5302 /* XXX : not implemented */
5303 spr_register(env, SPR_601_HID15, "HID15",
5304 SPR_NOACCESS, SPR_NOACCESS,
5305 &spr_read_generic, &spr_write_generic,
5309 POWERPC_FAMILY(601v)(ObjectClass *oc, void *data)
5311 DeviceClass *dc = DEVICE_CLASS(oc);
5312 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5314 dc->desc = "PowerPC 601v";
5315 pcc->init_proc = init_proc_601v;
5316 pcc->check_pow = check_pow_none;
5317 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
5319 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5320 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
5321 PPC_SEGMENT | PPC_EXTERN;
5322 pcc->msr_mask = (1ull << MSR_EE) |
5332 pcc->mmu_model = POWERPC_MMU_601;
5333 #if defined(CONFIG_SOFTMMU)
5334 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5336 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5337 pcc->bfd_mach = bfd_mach_ppc_601;
5338 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
5341 static void init_proc_602(CPUPPCState *env)
5343 gen_spr_ne_601(env);
5348 /* hardware implementation registers */
5349 /* XXX : not implemented */
5350 spr_register(env, SPR_HID0, "HID0",
5351 SPR_NOACCESS, SPR_NOACCESS,
5352 &spr_read_generic, &spr_write_generic,
5354 /* XXX : not implemented */
5355 spr_register(env, SPR_HID1, "HID1",
5356 SPR_NOACCESS, SPR_NOACCESS,
5357 &spr_read_generic, &spr_write_generic,
5359 /* Memory management */
5361 gen_6xx_7xx_soft_tlb(env, 64, 2);
5363 env->dcache_line_size = 32;
5364 env->icache_line_size = 32;
5365 /* Allocate hardware IRQ controller */
5366 ppc6xx_irq_init(ppc_env_get_cpu(env));
5369 POWERPC_FAMILY(602)(ObjectClass *oc, void *data)
5371 DeviceClass *dc = DEVICE_CLASS(oc);
5372 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5374 dc->desc = "PowerPC 602";
5375 pcc->init_proc = init_proc_602;
5376 pcc->check_pow = check_pow_hid0;
5377 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5378 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5379 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5380 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5381 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5382 PPC_MEM_TLBIE | PPC_6xx_TLB | PPC_MEM_TLBSYNC |
5383 PPC_SEGMENT | PPC_602_SPEC;
5384 pcc->msr_mask = (1ull << MSR_VSX) |
5387 (1ull << MSR_TGPR) |
5402 /* XXX: 602 MMU is quite specific. Should add a special case */
5403 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5404 pcc->excp_model = POWERPC_EXCP_602;
5405 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5406 pcc->bfd_mach = bfd_mach_ppc_602;
5407 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5408 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5411 static void init_proc_603(CPUPPCState *env)
5413 gen_spr_ne_601(env);
5418 /* hardware implementation registers */
5419 /* XXX : not implemented */
5420 spr_register(env, SPR_HID0, "HID0",
5421 SPR_NOACCESS, SPR_NOACCESS,
5422 &spr_read_generic, &spr_write_generic,
5424 /* XXX : not implemented */
5425 spr_register(env, SPR_HID1, "HID1",
5426 SPR_NOACCESS, SPR_NOACCESS,
5427 &spr_read_generic, &spr_write_generic,
5429 /* Memory management */
5431 gen_6xx_7xx_soft_tlb(env, 64, 2);
5433 env->dcache_line_size = 32;
5434 env->icache_line_size = 32;
5435 /* Allocate hardware IRQ controller */
5436 ppc6xx_irq_init(ppc_env_get_cpu(env));
5439 POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
5441 DeviceClass *dc = DEVICE_CLASS(oc);
5442 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5444 dc->desc = "PowerPC 603";
5445 pcc->init_proc = init_proc_603;
5446 pcc->check_pow = check_pow_hid0;
5447 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5448 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5449 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5450 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5451 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5452 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5453 PPC_SEGMENT | PPC_EXTERN;
5454 pcc->msr_mask = (1ull << MSR_POW) |
5455 (1ull << MSR_TGPR) |
5470 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5471 pcc->excp_model = POWERPC_EXCP_603;
5472 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5473 pcc->bfd_mach = bfd_mach_ppc_603;
5474 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5475 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5478 static void init_proc_603E(CPUPPCState *env)
5480 gen_spr_ne_601(env);
5485 /* hardware implementation registers */
5486 /* XXX : not implemented */
5487 spr_register(env, SPR_HID0, "HID0",
5488 SPR_NOACCESS, SPR_NOACCESS,
5489 &spr_read_generic, &spr_write_generic,
5491 /* XXX : not implemented */
5492 spr_register(env, SPR_HID1, "HID1",
5493 SPR_NOACCESS, SPR_NOACCESS,
5494 &spr_read_generic, &spr_write_generic,
5496 /* Memory management */
5498 gen_6xx_7xx_soft_tlb(env, 64, 2);
5500 env->dcache_line_size = 32;
5501 env->icache_line_size = 32;
5502 /* Allocate hardware IRQ controller */
5503 ppc6xx_irq_init(ppc_env_get_cpu(env));
5506 POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
5508 DeviceClass *dc = DEVICE_CLASS(oc);
5509 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5511 dc->desc = "PowerPC 603e";
5512 pcc->init_proc = init_proc_603E;
5513 pcc->check_pow = check_pow_hid0;
5514 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5515 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5516 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5517 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5518 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5519 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5520 PPC_SEGMENT | PPC_EXTERN;
5521 pcc->msr_mask = (1ull << MSR_POW) |
5522 (1ull << MSR_TGPR) |
5537 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5538 pcc->excp_model = POWERPC_EXCP_603E;
5539 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5540 pcc->bfd_mach = bfd_mach_ppc_ec603e;
5541 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5542 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5545 static void init_proc_604(CPUPPCState *env)
5547 gen_spr_ne_601(env);
5552 /* Hardware implementation registers */
5553 /* XXX : not implemented */
5554 spr_register(env, SPR_HID0, "HID0",
5555 SPR_NOACCESS, SPR_NOACCESS,
5556 &spr_read_generic, &spr_write_generic,
5558 /* Memory management */
5561 env->dcache_line_size = 32;
5562 env->icache_line_size = 32;
5563 /* Allocate hardware IRQ controller */
5564 ppc6xx_irq_init(ppc_env_get_cpu(env));
5567 POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
5569 DeviceClass *dc = DEVICE_CLASS(oc);
5570 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5572 dc->desc = "PowerPC 604";
5573 pcc->init_proc = init_proc_604;
5574 pcc->check_pow = check_pow_nocheck;
5575 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5576 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5577 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5578 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5579 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5580 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5581 PPC_SEGMENT | PPC_EXTERN;
5582 pcc->msr_mask = (1ull << MSR_POW) |
5598 pcc->mmu_model = POWERPC_MMU_32B;
5599 #if defined(CONFIG_SOFTMMU)
5600 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5602 pcc->excp_model = POWERPC_EXCP_604;
5603 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5604 pcc->bfd_mach = bfd_mach_ppc_604;
5605 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5606 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5609 static void init_proc_604E(CPUPPCState *env)
5611 gen_spr_ne_601(env);
5614 /* XXX : not implemented */
5615 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
5616 SPR_NOACCESS, SPR_NOACCESS,
5617 &spr_read_generic, &spr_write_generic,
5619 /* XXX : not implemented */
5620 spr_register(env, SPR_7XX_PMC3, "PMC3",
5621 SPR_NOACCESS, SPR_NOACCESS,
5622 &spr_read_generic, &spr_write_generic,
5624 /* XXX : not implemented */
5625 spr_register(env, SPR_7XX_PMC4, "PMC4",
5626 SPR_NOACCESS, SPR_NOACCESS,
5627 &spr_read_generic, &spr_write_generic,
5631 /* Hardware implementation registers */
5632 /* XXX : not implemented */
5633 spr_register(env, SPR_HID0, "HID0",
5634 SPR_NOACCESS, SPR_NOACCESS,
5635 &spr_read_generic, &spr_write_generic,
5637 /* XXX : not implemented */
5638 spr_register(env, SPR_HID1, "HID1",
5639 SPR_NOACCESS, SPR_NOACCESS,
5640 &spr_read_generic, &spr_write_generic,
5642 /* Memory management */
5645 env->dcache_line_size = 32;
5646 env->icache_line_size = 32;
5647 /* Allocate hardware IRQ controller */
5648 ppc6xx_irq_init(ppc_env_get_cpu(env));
5651 POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
5653 DeviceClass *dc = DEVICE_CLASS(oc);
5654 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5656 dc->desc = "PowerPC 604E";
5657 pcc->init_proc = init_proc_604E;
5658 pcc->check_pow = check_pow_nocheck;
5659 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5660 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5661 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5662 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5663 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5664 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5665 PPC_SEGMENT | PPC_EXTERN;
5666 pcc->msr_mask = (1ull << MSR_POW) |
5682 pcc->mmu_model = POWERPC_MMU_32B;
5683 #if defined(CONFIG_SOFTMMU)
5684 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5686 pcc->excp_model = POWERPC_EXCP_604;
5687 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5688 pcc->bfd_mach = bfd_mach_ppc_604;
5689 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5690 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5693 static void init_proc_740(CPUPPCState *env)
5695 gen_spr_ne_601(env);
5700 /* Thermal management */
5702 /* Hardware implementation registers */
5703 /* XXX : not implemented */
5704 spr_register(env, SPR_HID0, "HID0",
5705 SPR_NOACCESS, SPR_NOACCESS,
5706 &spr_read_generic, &spr_write_generic,
5708 /* XXX : not implemented */
5709 spr_register(env, SPR_HID1, "HID1",
5710 SPR_NOACCESS, SPR_NOACCESS,
5711 &spr_read_generic, &spr_write_generic,
5713 /* Memory management */
5716 env->dcache_line_size = 32;
5717 env->icache_line_size = 32;
5718 /* Allocate hardware IRQ controller */
5719 ppc6xx_irq_init(ppc_env_get_cpu(env));
5722 POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
5724 DeviceClass *dc = DEVICE_CLASS(oc);
5725 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5727 dc->desc = "PowerPC 740";
5728 pcc->init_proc = init_proc_740;
5729 pcc->check_pow = check_pow_hid0;
5730 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5731 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5732 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5733 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5734 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5735 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5736 PPC_SEGMENT | PPC_EXTERN;
5737 pcc->msr_mask = (1ull << MSR_POW) |
5753 pcc->mmu_model = POWERPC_MMU_32B;
5754 #if defined(CONFIG_SOFTMMU)
5755 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5757 pcc->excp_model = POWERPC_EXCP_7x0;
5758 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5759 pcc->bfd_mach = bfd_mach_ppc_750;
5760 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5761 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5764 static void init_proc_750(CPUPPCState *env)
5766 gen_spr_ne_601(env);
5769 /* XXX : not implemented */
5770 spr_register(env, SPR_L2CR, "L2CR",
5771 SPR_NOACCESS, SPR_NOACCESS,
5772 &spr_read_generic, spr_access_nop,
5776 /* Thermal management */
5778 /* Hardware implementation registers */
5779 /* XXX : not implemented */
5780 spr_register(env, SPR_HID0, "HID0",
5781 SPR_NOACCESS, SPR_NOACCESS,
5782 &spr_read_generic, &spr_write_generic,
5784 /* XXX : not implemented */
5785 spr_register(env, SPR_HID1, "HID1",
5786 SPR_NOACCESS, SPR_NOACCESS,
5787 &spr_read_generic, &spr_write_generic,
5789 /* Memory management */
5791 /* XXX: high BATs are also present but are known to be bugged on
5795 env->dcache_line_size = 32;
5796 env->icache_line_size = 32;
5797 /* Allocate hardware IRQ controller */
5798 ppc6xx_irq_init(ppc_env_get_cpu(env));
5801 POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
5803 DeviceClass *dc = DEVICE_CLASS(oc);
5804 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5806 dc->desc = "PowerPC 750";
5807 pcc->init_proc = init_proc_750;
5808 pcc->check_pow = check_pow_hid0;
5809 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5810 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5811 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5812 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5813 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5814 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5815 PPC_SEGMENT | PPC_EXTERN;
5816 pcc->msr_mask = (1ull << MSR_POW) |
5832 pcc->mmu_model = POWERPC_MMU_32B;
5833 #if defined(CONFIG_SOFTMMU)
5834 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5836 pcc->excp_model = POWERPC_EXCP_7x0;
5837 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5838 pcc->bfd_mach = bfd_mach_ppc_750;
5839 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5840 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5843 static void init_proc_750cl(CPUPPCState *env)
5845 gen_spr_ne_601(env);
5848 /* XXX : not implemented */
5849 spr_register(env, SPR_L2CR, "L2CR",
5850 SPR_NOACCESS, SPR_NOACCESS,
5851 &spr_read_generic, spr_access_nop,
5855 /* Thermal management */
5856 /* Those registers are fake on 750CL */
5857 spr_register(env, SPR_THRM1, "THRM1",
5858 SPR_NOACCESS, SPR_NOACCESS,
5859 &spr_read_generic, &spr_write_generic,
5861 spr_register(env, SPR_THRM2, "THRM2",
5862 SPR_NOACCESS, SPR_NOACCESS,
5863 &spr_read_generic, &spr_write_generic,
5865 spr_register(env, SPR_THRM3, "THRM3",
5866 SPR_NOACCESS, SPR_NOACCESS,
5867 &spr_read_generic, &spr_write_generic,
5869 /* XXX: not implemented */
5870 spr_register(env, SPR_750_TDCL, "TDCL",
5871 SPR_NOACCESS, SPR_NOACCESS,
5872 &spr_read_generic, &spr_write_generic,
5874 spr_register(env, SPR_750_TDCH, "TDCH",
5875 SPR_NOACCESS, SPR_NOACCESS,
5876 &spr_read_generic, &spr_write_generic,
5879 /* XXX : not implemented */
5880 spr_register(env, SPR_750_WPAR, "WPAR",
5881 SPR_NOACCESS, SPR_NOACCESS,
5882 &spr_read_generic, &spr_write_generic,
5884 spr_register(env, SPR_750_DMAL, "DMAL",
5885 SPR_NOACCESS, SPR_NOACCESS,
5886 &spr_read_generic, &spr_write_generic,
5888 spr_register(env, SPR_750_DMAU, "DMAU",
5889 SPR_NOACCESS, SPR_NOACCESS,
5890 &spr_read_generic, &spr_write_generic,
5892 /* Hardware implementation registers */
5893 /* XXX : not implemented */
5894 spr_register(env, SPR_HID0, "HID0",
5895 SPR_NOACCESS, SPR_NOACCESS,
5896 &spr_read_generic, &spr_write_generic,
5898 /* XXX : not implemented */
5899 spr_register(env, SPR_HID1, "HID1",
5900 SPR_NOACCESS, SPR_NOACCESS,
5901 &spr_read_generic, &spr_write_generic,
5903 /* XXX : not implemented */
5904 spr_register(env, SPR_750CL_HID2, "HID2",
5905 SPR_NOACCESS, SPR_NOACCESS,
5906 &spr_read_generic, &spr_write_generic,
5908 /* XXX : not implemented */
5909 spr_register(env, SPR_750CL_HID4, "HID4",
5910 SPR_NOACCESS, SPR_NOACCESS,
5911 &spr_read_generic, &spr_write_generic,
5913 /* Quantization registers */
5914 /* XXX : not implemented */
5915 spr_register(env, SPR_750_GQR0, "GQR0",
5916 SPR_NOACCESS, SPR_NOACCESS,
5917 &spr_read_generic, &spr_write_generic,
5919 /* XXX : not implemented */
5920 spr_register(env, SPR_750_GQR1, "GQR1",
5921 SPR_NOACCESS, SPR_NOACCESS,
5922 &spr_read_generic, &spr_write_generic,
5924 /* XXX : not implemented */
5925 spr_register(env, SPR_750_GQR2, "GQR2",
5926 SPR_NOACCESS, SPR_NOACCESS,
5927 &spr_read_generic, &spr_write_generic,
5929 /* XXX : not implemented */
5930 spr_register(env, SPR_750_GQR3, "GQR3",
5931 SPR_NOACCESS, SPR_NOACCESS,
5932 &spr_read_generic, &spr_write_generic,
5934 /* XXX : not implemented */
5935 spr_register(env, SPR_750_GQR4, "GQR4",
5936 SPR_NOACCESS, SPR_NOACCESS,
5937 &spr_read_generic, &spr_write_generic,
5939 /* XXX : not implemented */
5940 spr_register(env, SPR_750_GQR5, "GQR5",
5941 SPR_NOACCESS, SPR_NOACCESS,
5942 &spr_read_generic, &spr_write_generic,
5944 /* XXX : not implemented */
5945 spr_register(env, SPR_750_GQR6, "GQR6",
5946 SPR_NOACCESS, SPR_NOACCESS,
5947 &spr_read_generic, &spr_write_generic,
5949 /* XXX : not implemented */
5950 spr_register(env, SPR_750_GQR7, "GQR7",
5951 SPR_NOACCESS, SPR_NOACCESS,
5952 &spr_read_generic, &spr_write_generic,
5954 /* Memory management */
5956 /* PowerPC 750cl has 8 DBATs and 8 IBATs */
5958 init_excp_750cl(env);
5959 env->dcache_line_size = 32;
5960 env->icache_line_size = 32;
5961 /* Allocate hardware IRQ controller */
5962 ppc6xx_irq_init(ppc_env_get_cpu(env));
5965 POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
5967 DeviceClass *dc = DEVICE_CLASS(oc);
5968 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5970 dc->desc = "PowerPC 750 CL";
5971 pcc->init_proc = init_proc_750cl;
5972 pcc->check_pow = check_pow_hid0;
5973 /* XXX: not implemented:
5974 * cache lock instructions:
5976 * floating point paired instructions
6011 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6012 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6013 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6014 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6015 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6016 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6017 PPC_SEGMENT | PPC_EXTERN;
6018 pcc->msr_mask = (1ull << MSR_POW) |
6034 pcc->mmu_model = POWERPC_MMU_32B;
6035 #if defined(CONFIG_SOFTMMU)
6036 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6038 pcc->excp_model = POWERPC_EXCP_7x0;
6039 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6040 pcc->bfd_mach = bfd_mach_ppc_750;
6041 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6042 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6045 static void init_proc_750cx(CPUPPCState *env)
6047 gen_spr_ne_601(env);
6050 /* XXX : not implemented */
6051 spr_register(env, SPR_L2CR, "L2CR",
6052 SPR_NOACCESS, SPR_NOACCESS,
6053 &spr_read_generic, spr_access_nop,
6057 /* Thermal management */
6059 /* This register is not implemented but is present for compatibility */
6060 spr_register(env, SPR_SDA, "SDA",
6061 SPR_NOACCESS, SPR_NOACCESS,
6062 &spr_read_generic, &spr_write_generic,
6064 /* Hardware implementation registers */
6065 /* XXX : not implemented */
6066 spr_register(env, SPR_HID0, "HID0",
6067 SPR_NOACCESS, SPR_NOACCESS,
6068 &spr_read_generic, &spr_write_generic,
6070 /* XXX : not implemented */
6071 spr_register(env, SPR_HID1, "HID1",
6072 SPR_NOACCESS, SPR_NOACCESS,
6073 &spr_read_generic, &spr_write_generic,
6075 /* Memory management */
6077 /* PowerPC 750cx has 8 DBATs and 8 IBATs */
6079 init_excp_750cx(env);
6080 env->dcache_line_size = 32;
6081 env->icache_line_size = 32;
6082 /* Allocate hardware IRQ controller */
6083 ppc6xx_irq_init(ppc_env_get_cpu(env));
6086 POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
6088 DeviceClass *dc = DEVICE_CLASS(oc);
6089 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6091 dc->desc = "PowerPC 750CX";
6092 pcc->init_proc = init_proc_750cx;
6093 pcc->check_pow = check_pow_hid0;
6094 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6095 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6096 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6097 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6098 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6099 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6100 PPC_SEGMENT | PPC_EXTERN;
6101 pcc->msr_mask = (1ull << MSR_POW) |
6117 pcc->mmu_model = POWERPC_MMU_32B;
6118 #if defined(CONFIG_SOFTMMU)
6119 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6121 pcc->excp_model = POWERPC_EXCP_7x0;
6122 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6123 pcc->bfd_mach = bfd_mach_ppc_750;
6124 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6125 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6128 static void init_proc_750fx(CPUPPCState *env)
6130 gen_spr_ne_601(env);
6133 /* XXX : not implemented */
6134 spr_register(env, SPR_L2CR, "L2CR",
6135 SPR_NOACCESS, SPR_NOACCESS,
6136 &spr_read_generic, spr_access_nop,
6140 /* Thermal management */
6142 /* XXX : not implemented */
6143 spr_register(env, SPR_750_THRM4, "THRM4",
6144 SPR_NOACCESS, SPR_NOACCESS,
6145 &spr_read_generic, &spr_write_generic,
6147 /* Hardware implementation registers */
6148 /* XXX : not implemented */
6149 spr_register(env, SPR_HID0, "HID0",
6150 SPR_NOACCESS, SPR_NOACCESS,
6151 &spr_read_generic, &spr_write_generic,
6153 /* XXX : not implemented */
6154 spr_register(env, SPR_HID1, "HID1",
6155 SPR_NOACCESS, SPR_NOACCESS,
6156 &spr_read_generic, &spr_write_generic,
6158 /* XXX : not implemented */
6159 spr_register(env, SPR_750FX_HID2, "HID2",
6160 SPR_NOACCESS, SPR_NOACCESS,
6161 &spr_read_generic, &spr_write_generic,
6163 /* Memory management */
6165 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
6168 env->dcache_line_size = 32;
6169 env->icache_line_size = 32;
6170 /* Allocate hardware IRQ controller */
6171 ppc6xx_irq_init(ppc_env_get_cpu(env));
6174 POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
6176 DeviceClass *dc = DEVICE_CLASS(oc);
6177 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6179 dc->desc = "PowerPC 750FX";
6180 pcc->init_proc = init_proc_750fx;
6181 pcc->check_pow = check_pow_hid0;
6182 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6183 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6184 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6185 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6186 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6187 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6188 PPC_SEGMENT | PPC_EXTERN;
6189 pcc->msr_mask = (1ull << MSR_POW) |
6205 pcc->mmu_model = POWERPC_MMU_32B;
6206 #if defined(CONFIG_SOFTMMU)
6207 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6209 pcc->excp_model = POWERPC_EXCP_7x0;
6210 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6211 pcc->bfd_mach = bfd_mach_ppc_750;
6212 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6213 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6216 static void init_proc_750gx(CPUPPCState *env)
6218 gen_spr_ne_601(env);
6221 /* XXX : not implemented (XXX: different from 750fx) */
6222 spr_register(env, SPR_L2CR, "L2CR",
6223 SPR_NOACCESS, SPR_NOACCESS,
6224 &spr_read_generic, spr_access_nop,
6228 /* Thermal management */
6230 /* XXX : not implemented */
6231 spr_register(env, SPR_750_THRM4, "THRM4",
6232 SPR_NOACCESS, SPR_NOACCESS,
6233 &spr_read_generic, &spr_write_generic,
6235 /* Hardware implementation registers */
6236 /* XXX : not implemented (XXX: different from 750fx) */
6237 spr_register(env, SPR_HID0, "HID0",
6238 SPR_NOACCESS, SPR_NOACCESS,
6239 &spr_read_generic, &spr_write_generic,
6241 /* XXX : not implemented */
6242 spr_register(env, SPR_HID1, "HID1",
6243 SPR_NOACCESS, SPR_NOACCESS,
6244 &spr_read_generic, &spr_write_generic,
6246 /* XXX : not implemented (XXX: different from 750fx) */
6247 spr_register(env, SPR_750FX_HID2, "HID2",
6248 SPR_NOACCESS, SPR_NOACCESS,
6249 &spr_read_generic, &spr_write_generic,
6251 /* Memory management */
6253 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
6256 env->dcache_line_size = 32;
6257 env->icache_line_size = 32;
6258 /* Allocate hardware IRQ controller */
6259 ppc6xx_irq_init(ppc_env_get_cpu(env));
6262 POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
6264 DeviceClass *dc = DEVICE_CLASS(oc);
6265 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6267 dc->desc = "PowerPC 750GX";
6268 pcc->init_proc = init_proc_750gx;
6269 pcc->check_pow = check_pow_hid0;
6270 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6271 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6272 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6273 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6274 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6275 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6276 PPC_SEGMENT | PPC_EXTERN;
6277 pcc->msr_mask = (1ull << MSR_POW) |
6293 pcc->mmu_model = POWERPC_MMU_32B;
6294 #if defined(CONFIG_SOFTMMU)
6295 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6297 pcc->excp_model = POWERPC_EXCP_7x0;
6298 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6299 pcc->bfd_mach = bfd_mach_ppc_750;
6300 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6301 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6304 static void init_proc_745(CPUPPCState *env)
6306 gen_spr_ne_601(env);
6309 gen_spr_G2_755(env);
6312 /* Thermal management */
6314 /* Hardware implementation registers */
6315 /* XXX : not implemented */
6316 spr_register(env, SPR_HID0, "HID0",
6317 SPR_NOACCESS, SPR_NOACCESS,
6318 &spr_read_generic, &spr_write_generic,
6320 /* XXX : not implemented */
6321 spr_register(env, SPR_HID1, "HID1",
6322 SPR_NOACCESS, SPR_NOACCESS,
6323 &spr_read_generic, &spr_write_generic,
6325 /* XXX : not implemented */
6326 spr_register(env, SPR_HID2, "HID2",
6327 SPR_NOACCESS, SPR_NOACCESS,
6328 &spr_read_generic, &spr_write_generic,
6330 /* Memory management */
6333 gen_6xx_7xx_soft_tlb(env, 64, 2);
6335 env->dcache_line_size = 32;
6336 env->icache_line_size = 32;
6337 /* Allocate hardware IRQ controller */
6338 ppc6xx_irq_init(ppc_env_get_cpu(env));
6341 POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
6343 DeviceClass *dc = DEVICE_CLASS(oc);
6344 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6346 dc->desc = "PowerPC 745";
6347 pcc->init_proc = init_proc_745;
6348 pcc->check_pow = check_pow_hid0;
6349 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6350 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6351 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6352 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6353 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6354 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
6355 PPC_SEGMENT | PPC_EXTERN;
6356 pcc->msr_mask = (1ull << MSR_POW) |
6372 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
6373 pcc->excp_model = POWERPC_EXCP_7x5;
6374 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6375 pcc->bfd_mach = bfd_mach_ppc_750;
6376 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6377 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6380 static void init_proc_755(CPUPPCState *env)
6382 gen_spr_ne_601(env);
6385 gen_spr_G2_755(env);
6388 /* L2 cache control */
6389 /* XXX : not implemented */
6390 spr_register(env, SPR_L2CR, "L2CR",
6391 SPR_NOACCESS, SPR_NOACCESS,
6392 &spr_read_generic, spr_access_nop,
6394 /* XXX : not implemented */
6395 spr_register(env, SPR_L2PMCR, "L2PMCR",
6396 SPR_NOACCESS, SPR_NOACCESS,
6397 &spr_read_generic, &spr_write_generic,
6399 /* Thermal management */
6401 /* Hardware implementation registers */
6402 /* XXX : not implemented */
6403 spr_register(env, SPR_HID0, "HID0",
6404 SPR_NOACCESS, SPR_NOACCESS,
6405 &spr_read_generic, &spr_write_generic,
6407 /* XXX : not implemented */
6408 spr_register(env, SPR_HID1, "HID1",
6409 SPR_NOACCESS, SPR_NOACCESS,
6410 &spr_read_generic, &spr_write_generic,
6412 /* XXX : not implemented */
6413 spr_register(env, SPR_HID2, "HID2",
6414 SPR_NOACCESS, SPR_NOACCESS,
6415 &spr_read_generic, &spr_write_generic,
6417 /* Memory management */
6420 gen_6xx_7xx_soft_tlb(env, 64, 2);
6422 env->dcache_line_size = 32;
6423 env->icache_line_size = 32;
6424 /* Allocate hardware IRQ controller */
6425 ppc6xx_irq_init(ppc_env_get_cpu(env));
6428 POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
6430 DeviceClass *dc = DEVICE_CLASS(oc);
6431 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6433 dc->desc = "PowerPC 755";
6434 pcc->init_proc = init_proc_755;
6435 pcc->check_pow = check_pow_hid0;
6436 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6437 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6438 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6439 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6440 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6441 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
6442 PPC_SEGMENT | PPC_EXTERN;
6443 pcc->msr_mask = (1ull << MSR_POW) |
6459 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
6460 pcc->excp_model = POWERPC_EXCP_7x5;
6461 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6462 pcc->bfd_mach = bfd_mach_ppc_750;
6463 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6464 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6467 static void init_proc_7400(CPUPPCState *env)
6469 gen_spr_ne_601(env);
6474 /* 74xx specific SPR */
6476 /* XXX : not implemented */
6477 spr_register(env, SPR_UBAMR, "UBAMR",
6478 &spr_read_ureg, SPR_NOACCESS,
6479 &spr_read_ureg, SPR_NOACCESS,
6481 /* XXX: this seems not implemented on all revisions. */
6482 /* XXX : not implemented */
6483 spr_register(env, SPR_MSSCR1, "MSSCR1",
6484 SPR_NOACCESS, SPR_NOACCESS,
6485 &spr_read_generic, &spr_write_generic,
6487 /* Thermal management */
6489 /* Memory management */
6491 init_excp_7400(env);
6492 env->dcache_line_size = 32;
6493 env->icache_line_size = 32;
6494 /* Allocate hardware IRQ controller */
6495 ppc6xx_irq_init(ppc_env_get_cpu(env));
6498 POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
6500 DeviceClass *dc = DEVICE_CLASS(oc);
6501 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6503 dc->desc = "PowerPC 7400 (aka G4)";
6504 pcc->init_proc = init_proc_7400;
6505 pcc->check_pow = check_pow_hid0;
6506 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6507 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6508 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6510 PPC_CACHE | PPC_CACHE_ICBI |
6511 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6512 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6513 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6515 PPC_SEGMENT | PPC_EXTERN |
6517 pcc->msr_mask = (1ull << MSR_VR) |
6534 pcc->mmu_model = POWERPC_MMU_32B;
6535 #if defined(CONFIG_SOFTMMU)
6536 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6538 pcc->excp_model = POWERPC_EXCP_74xx;
6539 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6540 pcc->bfd_mach = bfd_mach_ppc_7400;
6541 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6542 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6543 POWERPC_FLAG_BUS_CLK;
6546 static void init_proc_7410(CPUPPCState *env)
6548 gen_spr_ne_601(env);
6553 /* 74xx specific SPR */
6555 /* XXX : not implemented */
6556 spr_register(env, SPR_UBAMR, "UBAMR",
6557 &spr_read_ureg, SPR_NOACCESS,
6558 &spr_read_ureg, SPR_NOACCESS,
6560 /* Thermal management */
6563 /* XXX : not implemented */
6564 spr_register(env, SPR_L2PMCR, "L2PMCR",
6565 SPR_NOACCESS, SPR_NOACCESS,
6566 &spr_read_generic, &spr_write_generic,
6569 /* XXX : not implemented */
6570 spr_register(env, SPR_LDSTDB, "LDSTDB",
6571 SPR_NOACCESS, SPR_NOACCESS,
6572 &spr_read_generic, &spr_write_generic,
6574 /* Memory management */
6576 init_excp_7400(env);
6577 env->dcache_line_size = 32;
6578 env->icache_line_size = 32;
6579 /* Allocate hardware IRQ controller */
6580 ppc6xx_irq_init(ppc_env_get_cpu(env));
6583 POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
6585 DeviceClass *dc = DEVICE_CLASS(oc);
6586 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6588 dc->desc = "PowerPC 7410 (aka G4)";
6589 pcc->init_proc = init_proc_7410;
6590 pcc->check_pow = check_pow_hid0;
6591 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6592 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6593 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6595 PPC_CACHE | PPC_CACHE_ICBI |
6596 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6597 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6598 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6600 PPC_SEGMENT | PPC_EXTERN |
6602 pcc->msr_mask = (1ull << MSR_VR) |
6619 pcc->mmu_model = POWERPC_MMU_32B;
6620 #if defined(CONFIG_SOFTMMU)
6621 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
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;
6631 static void init_proc_7440(CPUPPCState *env)
6633 gen_spr_ne_601(env);
6638 /* 74xx specific SPR */
6640 /* XXX : not implemented */
6641 spr_register(env, SPR_UBAMR, "UBAMR",
6642 &spr_read_ureg, SPR_NOACCESS,
6643 &spr_read_ureg, SPR_NOACCESS,
6646 /* XXX : not implemented */
6647 spr_register(env, SPR_LDSTCR, "LDSTCR",
6648 SPR_NOACCESS, SPR_NOACCESS,
6649 &spr_read_generic, &spr_write_generic,
6652 /* XXX : not implemented */
6653 spr_register(env, SPR_ICTRL, "ICTRL",
6654 SPR_NOACCESS, SPR_NOACCESS,
6655 &spr_read_generic, &spr_write_generic,
6658 /* XXX : not implemented */
6659 spr_register(env, SPR_MSSSR0, "MSSSR0",
6660 SPR_NOACCESS, SPR_NOACCESS,
6661 &spr_read_generic, &spr_write_generic,
6664 /* XXX : not implemented */
6665 spr_register(env, SPR_7XX_PMC5, "PMC5",
6666 SPR_NOACCESS, SPR_NOACCESS,
6667 &spr_read_generic, &spr_write_generic,
6669 /* XXX : not implemented */
6670 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6671 &spr_read_ureg, SPR_NOACCESS,
6672 &spr_read_ureg, SPR_NOACCESS,
6674 /* XXX : not implemented */
6675 spr_register(env, SPR_7XX_PMC6, "PMC6",
6676 SPR_NOACCESS, SPR_NOACCESS,
6677 &spr_read_generic, &spr_write_generic,
6679 /* XXX : not implemented */
6680 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6681 &spr_read_ureg, SPR_NOACCESS,
6682 &spr_read_ureg, SPR_NOACCESS,
6684 /* Memory management */
6686 gen_74xx_soft_tlb(env, 128, 2);
6687 init_excp_7450(env);
6688 env->dcache_line_size = 32;
6689 env->icache_line_size = 32;
6690 /* Allocate hardware IRQ controller */
6691 ppc6xx_irq_init(ppc_env_get_cpu(env));
6694 POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
6696 DeviceClass *dc = DEVICE_CLASS(oc);
6697 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6699 dc->desc = "PowerPC 7440 (aka G4)";
6700 pcc->init_proc = init_proc_7440;
6701 pcc->check_pow = check_pow_hid0_74xx;
6702 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6703 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6704 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6706 PPC_CACHE | PPC_CACHE_ICBI |
6707 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6708 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6709 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6710 PPC_MEM_TLBIA | PPC_74xx_TLB |
6711 PPC_SEGMENT | PPC_EXTERN |
6713 pcc->msr_mask = (1ull << MSR_VR) |
6730 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6731 pcc->excp_model = POWERPC_EXCP_74xx;
6732 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6733 pcc->bfd_mach = bfd_mach_ppc_7400;
6734 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6735 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6736 POWERPC_FLAG_BUS_CLK;
6739 static void init_proc_7450(CPUPPCState *env)
6741 gen_spr_ne_601(env);
6746 /* 74xx specific SPR */
6748 /* Level 3 cache control */
6751 /* XXX : not implemented */
6752 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6753 SPR_NOACCESS, SPR_NOACCESS,
6754 &spr_read_generic, &spr_write_generic,
6757 /* XXX : not implemented */
6758 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6759 SPR_NOACCESS, SPR_NOACCESS,
6760 &spr_read_generic, &spr_write_generic,
6763 /* XXX : not implemented */
6764 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6765 SPR_NOACCESS, SPR_NOACCESS,
6766 &spr_read_generic, &spr_write_generic,
6769 /* XXX : not implemented */
6770 spr_register(env, SPR_L3OHCR, "L3OHCR",
6771 SPR_NOACCESS, SPR_NOACCESS,
6772 &spr_read_generic, &spr_write_generic,
6774 /* XXX : not implemented */
6775 spr_register(env, SPR_UBAMR, "UBAMR",
6776 &spr_read_ureg, SPR_NOACCESS,
6777 &spr_read_ureg, SPR_NOACCESS,
6780 /* XXX : not implemented */
6781 spr_register(env, SPR_LDSTCR, "LDSTCR",
6782 SPR_NOACCESS, SPR_NOACCESS,
6783 &spr_read_generic, &spr_write_generic,
6786 /* XXX : not implemented */
6787 spr_register(env, SPR_ICTRL, "ICTRL",
6788 SPR_NOACCESS, SPR_NOACCESS,
6789 &spr_read_generic, &spr_write_generic,
6792 /* XXX : not implemented */
6793 spr_register(env, SPR_MSSSR0, "MSSSR0",
6794 SPR_NOACCESS, SPR_NOACCESS,
6795 &spr_read_generic, &spr_write_generic,
6798 /* XXX : not implemented */
6799 spr_register(env, SPR_7XX_PMC5, "PMC5",
6800 SPR_NOACCESS, SPR_NOACCESS,
6801 &spr_read_generic, &spr_write_generic,
6803 /* XXX : not implemented */
6804 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6805 &spr_read_ureg, SPR_NOACCESS,
6806 &spr_read_ureg, SPR_NOACCESS,
6808 /* XXX : not implemented */
6809 spr_register(env, SPR_7XX_PMC6, "PMC6",
6810 SPR_NOACCESS, SPR_NOACCESS,
6811 &spr_read_generic, &spr_write_generic,
6813 /* XXX : not implemented */
6814 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6815 &spr_read_ureg, SPR_NOACCESS,
6816 &spr_read_ureg, SPR_NOACCESS,
6818 /* Memory management */
6820 gen_74xx_soft_tlb(env, 128, 2);
6821 init_excp_7450(env);
6822 env->dcache_line_size = 32;
6823 env->icache_line_size = 32;
6824 /* Allocate hardware IRQ controller */
6825 ppc6xx_irq_init(ppc_env_get_cpu(env));
6828 POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
6830 DeviceClass *dc = DEVICE_CLASS(oc);
6831 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6833 dc->desc = "PowerPC 7450 (aka G4)";
6834 pcc->init_proc = init_proc_7450;
6835 pcc->check_pow = check_pow_hid0_74xx;
6836 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6837 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6838 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6840 PPC_CACHE | PPC_CACHE_ICBI |
6841 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6842 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6843 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6844 PPC_MEM_TLBIA | PPC_74xx_TLB |
6845 PPC_SEGMENT | PPC_EXTERN |
6847 pcc->msr_mask = (1ull << MSR_VR) |
6864 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6865 pcc->excp_model = POWERPC_EXCP_74xx;
6866 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6867 pcc->bfd_mach = bfd_mach_ppc_7400;
6868 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6869 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6870 POWERPC_FLAG_BUS_CLK;
6873 static void init_proc_7445(CPUPPCState *env)
6875 gen_spr_ne_601(env);
6880 /* 74xx specific SPR */
6883 /* XXX : not implemented */
6884 spr_register(env, SPR_LDSTCR, "LDSTCR",
6885 SPR_NOACCESS, SPR_NOACCESS,
6886 &spr_read_generic, &spr_write_generic,
6889 /* XXX : not implemented */
6890 spr_register(env, SPR_ICTRL, "ICTRL",
6891 SPR_NOACCESS, SPR_NOACCESS,
6892 &spr_read_generic, &spr_write_generic,
6895 /* XXX : not implemented */
6896 spr_register(env, SPR_MSSSR0, "MSSSR0",
6897 SPR_NOACCESS, SPR_NOACCESS,
6898 &spr_read_generic, &spr_write_generic,
6901 /* XXX : not implemented */
6902 spr_register(env, SPR_7XX_PMC5, "PMC5",
6903 SPR_NOACCESS, SPR_NOACCESS,
6904 &spr_read_generic, &spr_write_generic,
6906 /* XXX : not implemented */
6907 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6908 &spr_read_ureg, SPR_NOACCESS,
6909 &spr_read_ureg, SPR_NOACCESS,
6911 /* XXX : not implemented */
6912 spr_register(env, SPR_7XX_PMC6, "PMC6",
6913 SPR_NOACCESS, SPR_NOACCESS,
6914 &spr_read_generic, &spr_write_generic,
6916 /* XXX : not implemented */
6917 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6918 &spr_read_ureg, SPR_NOACCESS,
6919 &spr_read_ureg, SPR_NOACCESS,
6922 spr_register(env, SPR_SPRG4, "SPRG4",
6923 SPR_NOACCESS, SPR_NOACCESS,
6924 &spr_read_generic, &spr_write_generic,
6926 spr_register(env, SPR_USPRG4, "USPRG4",
6927 &spr_read_ureg, SPR_NOACCESS,
6928 &spr_read_ureg, SPR_NOACCESS,
6930 spr_register(env, SPR_SPRG5, "SPRG5",
6931 SPR_NOACCESS, SPR_NOACCESS,
6932 &spr_read_generic, &spr_write_generic,
6934 spr_register(env, SPR_USPRG5, "USPRG5",
6935 &spr_read_ureg, SPR_NOACCESS,
6936 &spr_read_ureg, SPR_NOACCESS,
6938 spr_register(env, SPR_SPRG6, "SPRG6",
6939 SPR_NOACCESS, SPR_NOACCESS,
6940 &spr_read_generic, &spr_write_generic,
6942 spr_register(env, SPR_USPRG6, "USPRG6",
6943 &spr_read_ureg, SPR_NOACCESS,
6944 &spr_read_ureg, SPR_NOACCESS,
6946 spr_register(env, SPR_SPRG7, "SPRG7",
6947 SPR_NOACCESS, SPR_NOACCESS,
6948 &spr_read_generic, &spr_write_generic,
6950 spr_register(env, SPR_USPRG7, "USPRG7",
6951 &spr_read_ureg, SPR_NOACCESS,
6952 &spr_read_ureg, SPR_NOACCESS,
6954 /* Memory management */
6957 gen_74xx_soft_tlb(env, 128, 2);
6958 init_excp_7450(env);
6959 env->dcache_line_size = 32;
6960 env->icache_line_size = 32;
6961 /* Allocate hardware IRQ controller */
6962 ppc6xx_irq_init(ppc_env_get_cpu(env));
6965 POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
6967 DeviceClass *dc = DEVICE_CLASS(oc);
6968 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6970 dc->desc = "PowerPC 7445 (aka G4)";
6971 pcc->init_proc = init_proc_7445;
6972 pcc->check_pow = check_pow_hid0_74xx;
6973 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6974 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6975 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6977 PPC_CACHE | PPC_CACHE_ICBI |
6978 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6979 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6980 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6981 PPC_MEM_TLBIA | PPC_74xx_TLB |
6982 PPC_SEGMENT | PPC_EXTERN |
6984 pcc->msr_mask = (1ull << MSR_VR) |
7001 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
7002 pcc->excp_model = POWERPC_EXCP_74xx;
7003 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7004 pcc->bfd_mach = bfd_mach_ppc_7400;
7005 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7006 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7007 POWERPC_FLAG_BUS_CLK;
7010 static void init_proc_7455(CPUPPCState *env)
7012 gen_spr_ne_601(env);
7017 /* 74xx specific SPR */
7019 /* Level 3 cache control */
7022 /* XXX : not implemented */
7023 spr_register(env, SPR_LDSTCR, "LDSTCR",
7024 SPR_NOACCESS, SPR_NOACCESS,
7025 &spr_read_generic, &spr_write_generic,
7028 /* XXX : not implemented */
7029 spr_register(env, SPR_ICTRL, "ICTRL",
7030 SPR_NOACCESS, SPR_NOACCESS,
7031 &spr_read_generic, &spr_write_generic,
7034 /* XXX : not implemented */
7035 spr_register(env, SPR_MSSSR0, "MSSSR0",
7036 SPR_NOACCESS, SPR_NOACCESS,
7037 &spr_read_generic, &spr_write_generic,
7040 /* XXX : not implemented */
7041 spr_register(env, SPR_7XX_PMC5, "PMC5",
7042 SPR_NOACCESS, SPR_NOACCESS,
7043 &spr_read_generic, &spr_write_generic,
7045 /* XXX : not implemented */
7046 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
7047 &spr_read_ureg, SPR_NOACCESS,
7048 &spr_read_ureg, SPR_NOACCESS,
7050 /* XXX : not implemented */
7051 spr_register(env, SPR_7XX_PMC6, "PMC6",
7052 SPR_NOACCESS, SPR_NOACCESS,
7053 &spr_read_generic, &spr_write_generic,
7055 /* XXX : not implemented */
7056 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
7057 &spr_read_ureg, SPR_NOACCESS,
7058 &spr_read_ureg, SPR_NOACCESS,
7061 spr_register(env, SPR_SPRG4, "SPRG4",
7062 SPR_NOACCESS, SPR_NOACCESS,
7063 &spr_read_generic, &spr_write_generic,
7065 spr_register(env, SPR_USPRG4, "USPRG4",
7066 &spr_read_ureg, SPR_NOACCESS,
7067 &spr_read_ureg, SPR_NOACCESS,
7069 spr_register(env, SPR_SPRG5, "SPRG5",
7070 SPR_NOACCESS, SPR_NOACCESS,
7071 &spr_read_generic, &spr_write_generic,
7073 spr_register(env, SPR_USPRG5, "USPRG5",
7074 &spr_read_ureg, SPR_NOACCESS,
7075 &spr_read_ureg, SPR_NOACCESS,
7077 spr_register(env, SPR_SPRG6, "SPRG6",
7078 SPR_NOACCESS, SPR_NOACCESS,
7079 &spr_read_generic, &spr_write_generic,
7081 spr_register(env, SPR_USPRG6, "USPRG6",
7082 &spr_read_ureg, SPR_NOACCESS,
7083 &spr_read_ureg, SPR_NOACCESS,
7085 spr_register(env, SPR_SPRG7, "SPRG7",
7086 SPR_NOACCESS, SPR_NOACCESS,
7087 &spr_read_generic, &spr_write_generic,
7089 spr_register(env, SPR_USPRG7, "USPRG7",
7090 &spr_read_ureg, SPR_NOACCESS,
7091 &spr_read_ureg, SPR_NOACCESS,
7093 /* Memory management */
7096 gen_74xx_soft_tlb(env, 128, 2);
7097 init_excp_7450(env);
7098 env->dcache_line_size = 32;
7099 env->icache_line_size = 32;
7100 /* Allocate hardware IRQ controller */
7101 ppc6xx_irq_init(ppc_env_get_cpu(env));
7104 POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
7106 DeviceClass *dc = DEVICE_CLASS(oc);
7107 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7109 dc->desc = "PowerPC 7455 (aka G4)";
7110 pcc->init_proc = init_proc_7455;
7111 pcc->check_pow = check_pow_hid0_74xx;
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 |
7116 PPC_CACHE | PPC_CACHE_ICBI |
7117 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
7118 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7119 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7120 PPC_MEM_TLBIA | PPC_74xx_TLB |
7121 PPC_SEGMENT | PPC_EXTERN |
7123 pcc->msr_mask = (1ull << MSR_VR) |
7140 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
7141 pcc->excp_model = POWERPC_EXCP_74xx;
7142 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7143 pcc->bfd_mach = bfd_mach_ppc_7400;
7144 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7145 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7146 POWERPC_FLAG_BUS_CLK;
7149 static void init_proc_7457(CPUPPCState *env)
7151 gen_spr_ne_601(env);
7156 /* 74xx specific SPR */
7158 /* Level 3 cache control */
7161 /* XXX : not implemented */
7162 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
7163 SPR_NOACCESS, SPR_NOACCESS,
7164 &spr_read_generic, &spr_write_generic,
7167 /* XXX : not implemented */
7168 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
7169 SPR_NOACCESS, SPR_NOACCESS,
7170 &spr_read_generic, &spr_write_generic,
7173 /* XXX : not implemented */
7174 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
7175 SPR_NOACCESS, SPR_NOACCESS,
7176 &spr_read_generic, &spr_write_generic,
7179 /* XXX : not implemented */
7180 spr_register(env, SPR_L3OHCR, "L3OHCR",
7181 SPR_NOACCESS, SPR_NOACCESS,
7182 &spr_read_generic, &spr_write_generic,
7185 /* XXX : not implemented */
7186 spr_register(env, SPR_LDSTCR, "LDSTCR",
7187 SPR_NOACCESS, SPR_NOACCESS,
7188 &spr_read_generic, &spr_write_generic,
7191 /* XXX : not implemented */
7192 spr_register(env, SPR_ICTRL, "ICTRL",
7193 SPR_NOACCESS, SPR_NOACCESS,
7194 &spr_read_generic, &spr_write_generic,
7197 /* XXX : not implemented */
7198 spr_register(env, SPR_MSSSR0, "MSSSR0",
7199 SPR_NOACCESS, SPR_NOACCESS,
7200 &spr_read_generic, &spr_write_generic,
7203 /* XXX : not implemented */
7204 spr_register(env, SPR_7XX_PMC5, "PMC5",
7205 SPR_NOACCESS, SPR_NOACCESS,
7206 &spr_read_generic, &spr_write_generic,
7208 /* XXX : not implemented */
7209 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
7210 &spr_read_ureg, SPR_NOACCESS,
7211 &spr_read_ureg, SPR_NOACCESS,
7213 /* XXX : not implemented */
7214 spr_register(env, SPR_7XX_PMC6, "PMC6",
7215 SPR_NOACCESS, SPR_NOACCESS,
7216 &spr_read_generic, &spr_write_generic,
7218 /* XXX : not implemented */
7219 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
7220 &spr_read_ureg, SPR_NOACCESS,
7221 &spr_read_ureg, SPR_NOACCESS,
7224 spr_register(env, SPR_SPRG4, "SPRG4",
7225 SPR_NOACCESS, SPR_NOACCESS,
7226 &spr_read_generic, &spr_write_generic,
7228 spr_register(env, SPR_USPRG4, "USPRG4",
7229 &spr_read_ureg, SPR_NOACCESS,
7230 &spr_read_ureg, SPR_NOACCESS,
7232 spr_register(env, SPR_SPRG5, "SPRG5",
7233 SPR_NOACCESS, SPR_NOACCESS,
7234 &spr_read_generic, &spr_write_generic,
7236 spr_register(env, SPR_USPRG5, "USPRG5",
7237 &spr_read_ureg, SPR_NOACCESS,
7238 &spr_read_ureg, SPR_NOACCESS,
7240 spr_register(env, SPR_SPRG6, "SPRG6",
7241 SPR_NOACCESS, SPR_NOACCESS,
7242 &spr_read_generic, &spr_write_generic,
7244 spr_register(env, SPR_USPRG6, "USPRG6",
7245 &spr_read_ureg, SPR_NOACCESS,
7246 &spr_read_ureg, SPR_NOACCESS,
7248 spr_register(env, SPR_SPRG7, "SPRG7",
7249 SPR_NOACCESS, SPR_NOACCESS,
7250 &spr_read_generic, &spr_write_generic,
7252 spr_register(env, SPR_USPRG7, "USPRG7",
7253 &spr_read_ureg, SPR_NOACCESS,
7254 &spr_read_ureg, SPR_NOACCESS,
7256 /* Memory management */
7259 gen_74xx_soft_tlb(env, 128, 2);
7260 init_excp_7450(env);
7261 env->dcache_line_size = 32;
7262 env->icache_line_size = 32;
7263 /* Allocate hardware IRQ controller */
7264 ppc6xx_irq_init(ppc_env_get_cpu(env));
7267 POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
7269 DeviceClass *dc = DEVICE_CLASS(oc);
7270 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7272 dc->desc = "PowerPC 7457 (aka G4)";
7273 pcc->init_proc = init_proc_7457;
7274 pcc->check_pow = check_pow_hid0_74xx;
7275 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7276 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7277 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7279 PPC_CACHE | PPC_CACHE_ICBI |
7280 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
7281 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7282 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7283 PPC_MEM_TLBIA | PPC_74xx_TLB |
7284 PPC_SEGMENT | PPC_EXTERN |
7286 pcc->msr_mask = (1ull << MSR_VR) |
7303 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
7304 pcc->excp_model = POWERPC_EXCP_74xx;
7305 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7306 pcc->bfd_mach = bfd_mach_ppc_7400;
7307 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7308 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7309 POWERPC_FLAG_BUS_CLK;
7312 static void init_proc_e600(CPUPPCState *env)
7314 gen_spr_ne_601(env);
7319 /* 74xx specific SPR */
7321 /* XXX : not implemented */
7322 spr_register(env, SPR_UBAMR, "UBAMR",
7323 &spr_read_ureg, SPR_NOACCESS,
7324 &spr_read_ureg, SPR_NOACCESS,
7326 /* XXX : not implemented */
7327 spr_register(env, SPR_LDSTCR, "LDSTCR",
7328 SPR_NOACCESS, SPR_NOACCESS,
7329 &spr_read_generic, &spr_write_generic,
7331 /* XXX : not implemented */
7332 spr_register(env, SPR_ICTRL, "ICTRL",
7333 SPR_NOACCESS, SPR_NOACCESS,
7334 &spr_read_generic, &spr_write_generic,
7336 /* XXX : not implemented */
7337 spr_register(env, SPR_MSSSR0, "MSSSR0",
7338 SPR_NOACCESS, SPR_NOACCESS,
7339 &spr_read_generic, &spr_write_generic,
7341 /* XXX : not implemented */
7342 spr_register(env, SPR_7XX_PMC5, "PMC5",
7343 SPR_NOACCESS, SPR_NOACCESS,
7344 &spr_read_generic, &spr_write_generic,
7346 /* XXX : not implemented */
7347 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
7348 &spr_read_ureg, SPR_NOACCESS,
7349 &spr_read_ureg, SPR_NOACCESS,
7351 /* XXX : not implemented */
7352 spr_register(env, SPR_7XX_PMC6, "PMC6",
7353 SPR_NOACCESS, SPR_NOACCESS,
7354 &spr_read_generic, &spr_write_generic,
7356 /* XXX : not implemented */
7357 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
7358 &spr_read_ureg, SPR_NOACCESS,
7359 &spr_read_ureg, SPR_NOACCESS,
7362 spr_register(env, SPR_SPRG4, "SPRG4",
7363 SPR_NOACCESS, SPR_NOACCESS,
7364 &spr_read_generic, &spr_write_generic,
7366 spr_register(env, SPR_USPRG4, "USPRG4",
7367 &spr_read_ureg, SPR_NOACCESS,
7368 &spr_read_ureg, SPR_NOACCESS,
7370 spr_register(env, SPR_SPRG5, "SPRG5",
7371 SPR_NOACCESS, SPR_NOACCESS,
7372 &spr_read_generic, &spr_write_generic,
7374 spr_register(env, SPR_USPRG5, "USPRG5",
7375 &spr_read_ureg, SPR_NOACCESS,
7376 &spr_read_ureg, SPR_NOACCESS,
7378 spr_register(env, SPR_SPRG6, "SPRG6",
7379 SPR_NOACCESS, SPR_NOACCESS,
7380 &spr_read_generic, &spr_write_generic,
7382 spr_register(env, SPR_USPRG6, "USPRG6",
7383 &spr_read_ureg, SPR_NOACCESS,
7384 &spr_read_ureg, SPR_NOACCESS,
7386 spr_register(env, SPR_SPRG7, "SPRG7",
7387 SPR_NOACCESS, SPR_NOACCESS,
7388 &spr_read_generic, &spr_write_generic,
7390 spr_register(env, SPR_USPRG7, "USPRG7",
7391 &spr_read_ureg, SPR_NOACCESS,
7392 &spr_read_ureg, SPR_NOACCESS,
7394 /* Memory management */
7397 gen_74xx_soft_tlb(env, 128, 2);
7398 init_excp_7450(env);
7399 env->dcache_line_size = 32;
7400 env->icache_line_size = 32;
7401 /* Allocate hardware IRQ controller */
7402 ppc6xx_irq_init(ppc_env_get_cpu(env));
7405 POWERPC_FAMILY(e600)(ObjectClass *oc, void *data)
7407 DeviceClass *dc = DEVICE_CLASS(oc);
7408 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7410 dc->desc = "PowerPC e600";
7411 pcc->init_proc = init_proc_e600;
7412 pcc->check_pow = check_pow_hid0_74xx;
7413 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7414 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7415 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7417 PPC_CACHE | PPC_CACHE_ICBI |
7418 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
7419 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7420 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7421 PPC_MEM_TLBIA | PPC_74xx_TLB |
7422 PPC_SEGMENT | PPC_EXTERN |
7424 pcc->insns_flags2 = PPC_NONE;
7425 pcc->msr_mask = (1ull << MSR_VR) |
7442 pcc->mmu_model = POWERPC_MMU_32B;
7443 #if defined(CONFIG_SOFTMMU)
7444 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
7446 pcc->excp_model = POWERPC_EXCP_74xx;
7447 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7448 pcc->bfd_mach = bfd_mach_ppc_7400;
7449 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7450 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7451 POWERPC_FLAG_BUS_CLK;
7454 #if defined(TARGET_PPC64)
7455 #if defined(CONFIG_USER_ONLY)
7456 #define POWERPC970_HID5_INIT 0x00000080
7458 #define POWERPC970_HID5_INIT 0x00000000
7461 static void gen_fscr_facility_check(DisasContext *ctx, int facility_sprn,
7462 int bit, int sprn, int cause)
7464 TCGv_i32 t1 = tcg_const_i32(bit);
7465 TCGv_i32 t2 = tcg_const_i32(sprn);
7466 TCGv_i32 t3 = tcg_const_i32(cause);
7468 gen_helper_fscr_facility_check(cpu_env, t1, t2, t3);
7470 tcg_temp_free_i32(t3);
7471 tcg_temp_free_i32(t2);
7472 tcg_temp_free_i32(t1);
7475 static void gen_msr_facility_check(DisasContext *ctx, int facility_sprn,
7476 int bit, int sprn, int cause)
7478 TCGv_i32 t1 = tcg_const_i32(bit);
7479 TCGv_i32 t2 = tcg_const_i32(sprn);
7480 TCGv_i32 t3 = tcg_const_i32(cause);
7482 gen_helper_msr_facility_check(cpu_env, t1, t2, t3);
7484 tcg_temp_free_i32(t3);
7485 tcg_temp_free_i32(t2);
7486 tcg_temp_free_i32(t1);
7489 static void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn)
7491 TCGv spr_up = tcg_temp_new();
7492 TCGv spr = tcg_temp_new();
7494 gen_load_spr(spr, sprn - 1);
7495 tcg_gen_shri_tl(spr_up, spr, 32);
7496 tcg_gen_ext32u_tl(cpu_gpr[gprn], spr_up);
7499 tcg_temp_free(spr_up);
7502 static void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn)
7504 TCGv spr = tcg_temp_new();
7506 gen_load_spr(spr, sprn - 1);
7507 tcg_gen_deposit_tl(spr, spr, cpu_gpr[gprn], 32, 32);
7508 gen_store_spr(sprn - 1, spr);
7513 static int check_pow_970(CPUPPCState *env)
7515 if (env->spr[SPR_HID0] & (HID0_DEEPNAP | HID0_DOZE | HID0_NAP)) {
7522 static void gen_spr_970_hid(CPUPPCState *env)
7524 /* Hardware implementation registers */
7525 /* XXX : not implemented */
7526 spr_register(env, SPR_HID0, "HID0",
7527 SPR_NOACCESS, SPR_NOACCESS,
7528 &spr_read_generic, &spr_write_clear,
7530 spr_register(env, SPR_HID1, "HID1",
7531 SPR_NOACCESS, SPR_NOACCESS,
7532 &spr_read_generic, &spr_write_generic,
7534 spr_register(env, SPR_970_HID5, "HID5",
7535 SPR_NOACCESS, SPR_NOACCESS,
7536 &spr_read_generic, &spr_write_generic,
7537 POWERPC970_HID5_INIT);
7540 static void gen_spr_970_hior(CPUPPCState *env)
7542 spr_register(env, SPR_HIOR, "SPR_HIOR",
7543 SPR_NOACCESS, SPR_NOACCESS,
7544 &spr_read_hior, &spr_write_hior,
7548 static void gen_spr_book3s_ctrl(CPUPPCState *env)
7550 spr_register(env, SPR_CTRL, "SPR_CTRL",
7551 SPR_NOACCESS, SPR_NOACCESS,
7552 SPR_NOACCESS, &spr_write_generic,
7554 spr_register(env, SPR_UCTRL, "SPR_UCTRL",
7555 &spr_read_ureg, SPR_NOACCESS,
7556 &spr_read_ureg, SPR_NOACCESS,
7560 static void gen_spr_book3s_altivec(CPUPPCState *env)
7562 if (!(env->insns_flags & PPC_ALTIVEC)) {
7566 spr_register_kvm(env, SPR_VRSAVE, "VRSAVE",
7567 &spr_read_generic, &spr_write_generic,
7568 &spr_read_generic, &spr_write_generic,
7569 KVM_REG_PPC_VRSAVE, 0x00000000);
7571 /* Can't find information on what this should be on reset. This
7572 * value is the one used by 74xx processors. */
7573 vscr_init(env, 0x00010000);
7576 static void gen_spr_book3s_dbg(CPUPPCState *env)
7579 * TODO: different specs define different scopes for these,
7580 * will have to address this:
7581 * 970: super/write and super/read
7582 * powerisa 2.03..2.04: hypv/write and super/read.
7583 * powerisa 2.05 and newer: hypv/write and hypv/read.
7585 spr_register_kvm(env, SPR_DABR, "DABR",
7586 SPR_NOACCESS, SPR_NOACCESS,
7587 &spr_read_generic, &spr_write_generic,
7588 KVM_REG_PPC_DABR, 0x00000000);
7589 spr_register_kvm(env, SPR_DABRX, "DABRX",
7590 SPR_NOACCESS, SPR_NOACCESS,
7591 &spr_read_generic, &spr_write_generic,
7592 KVM_REG_PPC_DABRX, 0x00000000);
7595 static void gen_spr_book3s_207_dbg(CPUPPCState *env)
7597 spr_register_kvm_hv(env, SPR_DAWR, "DAWR",
7598 SPR_NOACCESS, SPR_NOACCESS,
7599 SPR_NOACCESS, SPR_NOACCESS,
7600 &spr_read_generic, &spr_write_generic,
7601 KVM_REG_PPC_DAWR, 0x00000000);
7602 spr_register_kvm_hv(env, SPR_DAWRX, "DAWRX",
7603 SPR_NOACCESS, SPR_NOACCESS,
7604 SPR_NOACCESS, SPR_NOACCESS,
7605 &spr_read_generic, &spr_write_generic,
7606 KVM_REG_PPC_DAWRX, 0x00000000);
7607 spr_register_kvm_hv(env, SPR_CIABR, "CIABR",
7608 SPR_NOACCESS, SPR_NOACCESS,
7609 SPR_NOACCESS, SPR_NOACCESS,
7610 &spr_read_generic, &spr_write_generic,
7611 KVM_REG_PPC_CIABR, 0x00000000);
7614 static void gen_spr_970_dbg(CPUPPCState *env)
7617 spr_register(env, SPR_IABR, "IABR",
7618 SPR_NOACCESS, SPR_NOACCESS,
7619 &spr_read_generic, &spr_write_generic,
7623 static void gen_spr_book3s_pmu_sup(CPUPPCState *env)
7625 spr_register_kvm(env, SPR_POWER_MMCR0, "MMCR0",
7626 SPR_NOACCESS, SPR_NOACCESS,
7627 &spr_read_generic, &spr_write_generic,
7628 KVM_REG_PPC_MMCR0, 0x00000000);
7629 spr_register_kvm(env, SPR_POWER_MMCR1, "MMCR1",
7630 SPR_NOACCESS, SPR_NOACCESS,
7631 &spr_read_generic, &spr_write_generic,
7632 KVM_REG_PPC_MMCR1, 0x00000000);
7633 spr_register_kvm(env, SPR_POWER_MMCRA, "MMCRA",
7634 SPR_NOACCESS, SPR_NOACCESS,
7635 &spr_read_generic, &spr_write_generic,
7636 KVM_REG_PPC_MMCRA, 0x00000000);
7637 spr_register_kvm(env, SPR_POWER_PMC1, "PMC1",
7638 SPR_NOACCESS, SPR_NOACCESS,
7639 &spr_read_generic, &spr_write_generic,
7640 KVM_REG_PPC_PMC1, 0x00000000);
7641 spr_register_kvm(env, SPR_POWER_PMC2, "PMC2",
7642 SPR_NOACCESS, SPR_NOACCESS,
7643 &spr_read_generic, &spr_write_generic,
7644 KVM_REG_PPC_PMC2, 0x00000000);
7645 spr_register_kvm(env, SPR_POWER_PMC3, "PMC3",
7646 SPR_NOACCESS, SPR_NOACCESS,
7647 &spr_read_generic, &spr_write_generic,
7648 KVM_REG_PPC_PMC3, 0x00000000);
7649 spr_register_kvm(env, SPR_POWER_PMC4, "PMC4",
7650 SPR_NOACCESS, SPR_NOACCESS,
7651 &spr_read_generic, &spr_write_generic,
7652 KVM_REG_PPC_PMC4, 0x00000000);
7653 spr_register_kvm(env, SPR_POWER_PMC5, "PMC5",
7654 SPR_NOACCESS, SPR_NOACCESS,
7655 &spr_read_generic, &spr_write_generic,
7656 KVM_REG_PPC_PMC5, 0x00000000);
7657 spr_register_kvm(env, SPR_POWER_PMC6, "PMC6",
7658 SPR_NOACCESS, SPR_NOACCESS,
7659 &spr_read_generic, &spr_write_generic,
7660 KVM_REG_PPC_PMC6, 0x00000000);
7661 spr_register_kvm(env, SPR_POWER_SIAR, "SIAR",
7662 SPR_NOACCESS, SPR_NOACCESS,
7663 &spr_read_generic, &spr_write_generic,
7664 KVM_REG_PPC_SIAR, 0x00000000);
7665 spr_register_kvm(env, SPR_POWER_SDAR, "SDAR",
7666 SPR_NOACCESS, SPR_NOACCESS,
7667 &spr_read_generic, &spr_write_generic,
7668 KVM_REG_PPC_SDAR, 0x00000000);
7671 static void gen_spr_book3s_pmu_user(CPUPPCState *env)
7673 spr_register(env, SPR_POWER_UMMCR0, "UMMCR0",
7674 &spr_read_ureg, SPR_NOACCESS,
7675 &spr_read_ureg, &spr_write_ureg,
7677 spr_register(env, SPR_POWER_UMMCR1, "UMMCR1",
7678 &spr_read_ureg, SPR_NOACCESS,
7679 &spr_read_ureg, &spr_write_ureg,
7681 spr_register(env, SPR_POWER_UMMCRA, "UMMCRA",
7682 &spr_read_ureg, SPR_NOACCESS,
7683 &spr_read_ureg, &spr_write_ureg,
7685 spr_register(env, SPR_POWER_UPMC1, "UPMC1",
7686 &spr_read_ureg, SPR_NOACCESS,
7687 &spr_read_ureg, &spr_write_ureg,
7689 spr_register(env, SPR_POWER_UPMC2, "UPMC2",
7690 &spr_read_ureg, SPR_NOACCESS,
7691 &spr_read_ureg, &spr_write_ureg,
7693 spr_register(env, SPR_POWER_UPMC3, "UPMC3",
7694 &spr_read_ureg, SPR_NOACCESS,
7695 &spr_read_ureg, &spr_write_ureg,
7697 spr_register(env, SPR_POWER_UPMC4, "UPMC4",
7698 &spr_read_ureg, SPR_NOACCESS,
7699 &spr_read_ureg, &spr_write_ureg,
7701 spr_register(env, SPR_POWER_UPMC5, "UPMC5",
7702 &spr_read_ureg, SPR_NOACCESS,
7703 &spr_read_ureg, &spr_write_ureg,
7705 spr_register(env, SPR_POWER_UPMC6, "UPMC6",
7706 &spr_read_ureg, SPR_NOACCESS,
7707 &spr_read_ureg, &spr_write_ureg,
7709 spr_register(env, SPR_POWER_USIAR, "USIAR",
7710 &spr_read_ureg, SPR_NOACCESS,
7711 &spr_read_ureg, &spr_write_ureg,
7713 spr_register(env, SPR_POWER_USDAR, "USDAR",
7714 &spr_read_ureg, SPR_NOACCESS,
7715 &spr_read_ureg, &spr_write_ureg,
7719 static void gen_spr_970_pmu_sup(CPUPPCState *env)
7721 spr_register_kvm(env, SPR_970_PMC7, "PMC7",
7722 SPR_NOACCESS, SPR_NOACCESS,
7723 &spr_read_generic, &spr_write_generic,
7724 KVM_REG_PPC_PMC7, 0x00000000);
7725 spr_register_kvm(env, SPR_970_PMC8, "PMC8",
7726 SPR_NOACCESS, SPR_NOACCESS,
7727 &spr_read_generic, &spr_write_generic,
7728 KVM_REG_PPC_PMC8, 0x00000000);
7731 static void gen_spr_970_pmu_user(CPUPPCState *env)
7733 spr_register(env, SPR_970_UPMC7, "UPMC7",
7734 &spr_read_ureg, SPR_NOACCESS,
7735 &spr_read_ureg, &spr_write_ureg,
7737 spr_register(env, SPR_970_UPMC8, "UPMC8",
7738 &spr_read_ureg, SPR_NOACCESS,
7739 &spr_read_ureg, &spr_write_ureg,
7743 static void gen_spr_power8_pmu_sup(CPUPPCState *env)
7745 spr_register_kvm(env, SPR_POWER_MMCR2, "MMCR2",
7746 SPR_NOACCESS, SPR_NOACCESS,
7747 &spr_read_generic, &spr_write_generic,
7748 KVM_REG_PPC_MMCR2, 0x00000000);
7749 spr_register_kvm(env, SPR_POWER_MMCRS, "MMCRS",
7750 SPR_NOACCESS, SPR_NOACCESS,
7751 &spr_read_generic, &spr_write_generic,
7752 KVM_REG_PPC_MMCRS, 0x00000000);
7753 spr_register_kvm(env, SPR_POWER_SIER, "SIER",
7754 SPR_NOACCESS, SPR_NOACCESS,
7755 &spr_read_generic, &spr_write_generic,
7756 KVM_REG_PPC_SIER, 0x00000000);
7757 spr_register_kvm(env, SPR_POWER_SPMC1, "SPMC1",
7758 SPR_NOACCESS, SPR_NOACCESS,
7759 &spr_read_generic, &spr_write_generic,
7760 KVM_REG_PPC_SPMC1, 0x00000000);
7761 spr_register_kvm(env, SPR_POWER_SPMC2, "SPMC2",
7762 SPR_NOACCESS, SPR_NOACCESS,
7763 &spr_read_generic, &spr_write_generic,
7764 KVM_REG_PPC_SPMC2, 0x00000000);
7765 spr_register_kvm(env, SPR_TACR, "TACR",
7766 SPR_NOACCESS, SPR_NOACCESS,
7767 &spr_read_generic, &spr_write_generic,
7768 KVM_REG_PPC_TACR, 0x00000000);
7769 spr_register_kvm(env, SPR_TCSCR, "TCSCR",
7770 SPR_NOACCESS, SPR_NOACCESS,
7771 &spr_read_generic, &spr_write_generic,
7772 KVM_REG_PPC_TCSCR, 0x00000000);
7773 spr_register_kvm(env, SPR_CSIGR, "CSIGR",
7774 SPR_NOACCESS, SPR_NOACCESS,
7775 &spr_read_generic, &spr_write_generic,
7776 KVM_REG_PPC_CSIGR, 0x00000000);
7779 static void gen_spr_power8_pmu_user(CPUPPCState *env)
7781 spr_register(env, SPR_POWER_UMMCR2, "UMMCR2",
7782 &spr_read_ureg, SPR_NOACCESS,
7783 &spr_read_ureg, &spr_write_ureg,
7785 spr_register(env, SPR_POWER_USIER, "USIER",
7786 &spr_read_generic, SPR_NOACCESS,
7787 &spr_read_generic, &spr_write_generic,
7791 static void gen_spr_power5p_ear(CPUPPCState *env)
7793 /* External access control */
7794 spr_register(env, SPR_EAR, "EAR",
7795 SPR_NOACCESS, SPR_NOACCESS,
7796 &spr_read_generic, &spr_write_generic,
7800 #if !defined(CONFIG_USER_ONLY)
7801 static void spr_write_hmer(DisasContext *ctx, int sprn, int gprn)
7803 TCGv hmer = tcg_temp_new();
7805 gen_load_spr(hmer, sprn);
7806 tcg_gen_and_tl(hmer, cpu_gpr[gprn], hmer);
7807 gen_store_spr(sprn, hmer);
7808 spr_store_dump_spr(sprn);
7809 tcg_temp_free(hmer);
7812 static void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn)
7814 gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]);
7817 static void spr_write_970_hid4(DisasContext *ctx, int sprn, int gprn)
7819 #if defined(TARGET_PPC64)
7820 spr_write_generic(ctx, sprn, gprn);
7821 gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]);
7825 #endif /* !defined(CONFIG_USER_ONLY) */
7827 static void gen_spr_970_lpar(CPUPPCState *env)
7829 #if !defined(CONFIG_USER_ONLY)
7830 /* Logical partitionning */
7831 /* PPC970: HID4 is effectively the LPCR */
7832 spr_register(env, SPR_970_HID4, "HID4",
7833 SPR_NOACCESS, SPR_NOACCESS,
7834 &spr_read_generic, &spr_write_970_hid4,
7839 static void gen_spr_power5p_lpar(CPUPPCState *env)
7841 #if !defined(CONFIG_USER_ONLY)
7842 /* Logical partitionning */
7843 spr_register_kvm_hv(env, SPR_LPCR, "LPCR",
7844 SPR_NOACCESS, SPR_NOACCESS,
7845 SPR_NOACCESS, SPR_NOACCESS,
7846 &spr_read_generic, &spr_write_lpcr,
7847 KVM_REG_PPC_LPCR, LPCR_LPES0 | LPCR_LPES1);
7848 spr_register_hv(env, SPR_HDEC, "HDEC",
7849 SPR_NOACCESS, SPR_NOACCESS,
7850 SPR_NOACCESS, SPR_NOACCESS,
7851 &spr_read_hdecr, &spr_write_hdecr, 0);
7855 static void gen_spr_book3s_ids(CPUPPCState *env)
7857 /* FIXME: Will need to deal with thread vs core only SPRs */
7859 /* Processor identification */
7860 spr_register_hv(env, SPR_PIR, "PIR",
7861 SPR_NOACCESS, SPR_NOACCESS,
7862 &spr_read_generic, SPR_NOACCESS,
7863 &spr_read_generic, NULL,
7865 spr_register_hv(env, SPR_HID0, "HID0",
7866 SPR_NOACCESS, SPR_NOACCESS,
7867 SPR_NOACCESS, SPR_NOACCESS,
7868 &spr_read_generic, &spr_write_generic,
7870 spr_register_hv(env, SPR_TSCR, "TSCR",
7871 SPR_NOACCESS, SPR_NOACCESS,
7872 SPR_NOACCESS, SPR_NOACCESS,
7873 &spr_read_generic, &spr_write_generic,
7875 spr_register_hv(env, SPR_HMER, "HMER",
7876 SPR_NOACCESS, SPR_NOACCESS,
7877 SPR_NOACCESS, SPR_NOACCESS,
7878 &spr_read_generic, &spr_write_hmer,
7880 spr_register_hv(env, SPR_HMEER, "HMEER",
7881 SPR_NOACCESS, SPR_NOACCESS,
7882 SPR_NOACCESS, SPR_NOACCESS,
7883 &spr_read_generic, &spr_write_generic,
7885 spr_register_hv(env, SPR_TFMR, "TFMR",
7886 SPR_NOACCESS, SPR_NOACCESS,
7887 SPR_NOACCESS, SPR_NOACCESS,
7888 &spr_read_generic, &spr_write_generic,
7890 spr_register_hv(env, SPR_LPIDR, "LPIDR",
7891 SPR_NOACCESS, SPR_NOACCESS,
7892 SPR_NOACCESS, SPR_NOACCESS,
7893 &spr_read_generic, &spr_write_lpidr,
7895 spr_register_hv(env, SPR_HFSCR, "HFSCR",
7896 SPR_NOACCESS, SPR_NOACCESS,
7897 SPR_NOACCESS, SPR_NOACCESS,
7898 &spr_read_generic, &spr_write_generic,
7900 spr_register_hv(env, SPR_MMCRC, "MMCRC",
7901 SPR_NOACCESS, SPR_NOACCESS,
7902 SPR_NOACCESS, SPR_NOACCESS,
7903 &spr_read_generic, &spr_write_generic,
7905 spr_register_hv(env, SPR_MMCRH, "MMCRH",
7906 SPR_NOACCESS, SPR_NOACCESS,
7907 SPR_NOACCESS, SPR_NOACCESS,
7908 &spr_read_generic, &spr_write_generic,
7910 spr_register_hv(env, SPR_HSPRG0, "HSPRG0",
7911 SPR_NOACCESS, SPR_NOACCESS,
7912 SPR_NOACCESS, SPR_NOACCESS,
7913 &spr_read_generic, &spr_write_generic,
7915 spr_register_hv(env, SPR_HSPRG1, "HSPRG1",
7916 SPR_NOACCESS, SPR_NOACCESS,
7917 SPR_NOACCESS, SPR_NOACCESS,
7918 &spr_read_generic, &spr_write_generic,
7920 spr_register_hv(env, SPR_HSRR0, "HSRR0",
7921 SPR_NOACCESS, SPR_NOACCESS,
7922 SPR_NOACCESS, SPR_NOACCESS,
7923 &spr_read_generic, &spr_write_generic,
7925 spr_register_hv(env, SPR_HSRR1, "HSRR1",
7926 SPR_NOACCESS, SPR_NOACCESS,
7927 SPR_NOACCESS, SPR_NOACCESS,
7928 &spr_read_generic, &spr_write_generic,
7930 spr_register_hv(env, SPR_HDAR, "HDAR",
7931 SPR_NOACCESS, SPR_NOACCESS,
7932 SPR_NOACCESS, SPR_NOACCESS,
7933 &spr_read_generic, &spr_write_generic,
7935 spr_register_hv(env, SPR_HDSISR, "HDSISR",
7936 SPR_NOACCESS, SPR_NOACCESS,
7937 SPR_NOACCESS, SPR_NOACCESS,
7938 &spr_read_generic, &spr_write_generic,
7940 spr_register_hv(env, SPR_RMOR, "RMOR",
7941 SPR_NOACCESS, SPR_NOACCESS,
7942 SPR_NOACCESS, SPR_NOACCESS,
7943 &spr_read_generic, &spr_write_generic,
7945 spr_register_hv(env, SPR_HRMOR, "HRMOR",
7946 SPR_NOACCESS, SPR_NOACCESS,
7947 SPR_NOACCESS, SPR_NOACCESS,
7948 &spr_read_generic, &spr_write_generic,
7952 static void gen_spr_power8_ids(CPUPPCState *env)
7954 /* Thread identification */
7955 spr_register(env, SPR_TIR, "TIR",
7956 SPR_NOACCESS, SPR_NOACCESS,
7957 &spr_read_generic, SPR_NOACCESS,
7961 static void gen_spr_book3s_purr(CPUPPCState *env)
7963 #if !defined(CONFIG_USER_ONLY)
7964 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
7965 spr_register_kvm(env, SPR_PURR, "PURR",
7966 &spr_read_purr, SPR_NOACCESS,
7967 &spr_read_purr, SPR_NOACCESS,
7968 KVM_REG_PPC_PURR, 0x00000000);
7969 spr_register_kvm(env, SPR_SPURR, "SPURR",
7970 &spr_read_purr, SPR_NOACCESS,
7971 &spr_read_purr, SPR_NOACCESS,
7972 KVM_REG_PPC_SPURR, 0x00000000);
7976 static void gen_spr_power6_dbg(CPUPPCState *env)
7978 #if !defined(CONFIG_USER_ONLY)
7979 spr_register(env, SPR_CFAR, "SPR_CFAR",
7980 SPR_NOACCESS, SPR_NOACCESS,
7981 &spr_read_cfar, &spr_write_cfar,
7986 static void gen_spr_power5p_common(CPUPPCState *env)
7988 spr_register_kvm(env, SPR_PPR, "PPR",
7989 &spr_read_generic, &spr_write_generic,
7990 &spr_read_generic, &spr_write_generic,
7991 KVM_REG_PPC_PPR, 0x00000000);
7994 static void gen_spr_power6_common(CPUPPCState *env)
7996 #if !defined(CONFIG_USER_ONLY)
7997 spr_register_kvm(env, SPR_DSCR, "SPR_DSCR",
7998 SPR_NOACCESS, SPR_NOACCESS,
7999 &spr_read_generic, &spr_write_generic,
8000 KVM_REG_PPC_DSCR, 0x00000000);
8003 * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
8004 * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
8006 spr_register_hv(env, SPR_PCR, "PCR",
8007 SPR_NOACCESS, SPR_NOACCESS,
8008 SPR_NOACCESS, SPR_NOACCESS,
8009 &spr_read_generic, &spr_write_pcr,
8013 static void spr_read_tar(DisasContext *ctx, int gprn, int sprn)
8015 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_TAR, sprn, FSCR_IC_TAR);
8016 spr_read_generic(ctx, gprn, sprn);
8019 static void spr_write_tar(DisasContext *ctx, int sprn, int gprn)
8021 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_TAR, sprn, FSCR_IC_TAR);
8022 spr_write_generic(ctx, sprn, gprn);
8025 static void gen_spr_power8_tce_address_control(CPUPPCState *env)
8027 spr_register_kvm(env, SPR_TAR, "TAR",
8028 &spr_read_tar, &spr_write_tar,
8029 &spr_read_generic, &spr_write_generic,
8030 KVM_REG_PPC_TAR, 0x00000000);
8033 static void spr_read_tm(DisasContext *ctx, int gprn, int sprn)
8035 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8036 spr_read_generic(ctx, gprn, sprn);
8039 static void spr_write_tm(DisasContext *ctx, int sprn, int gprn)
8041 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8042 spr_write_generic(ctx, sprn, gprn);
8045 static void spr_read_tm_upper32(DisasContext *ctx, int gprn, int sprn)
8047 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8048 spr_read_prev_upper32(ctx, gprn, sprn);
8051 static void spr_write_tm_upper32(DisasContext *ctx, int sprn, int gprn)
8053 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8054 spr_write_prev_upper32(ctx, sprn, gprn);
8057 static void gen_spr_power8_tm(CPUPPCState *env)
8059 spr_register_kvm(env, SPR_TFHAR, "TFHAR",
8060 &spr_read_tm, &spr_write_tm,
8061 &spr_read_tm, &spr_write_tm,
8062 KVM_REG_PPC_TFHAR, 0x00000000);
8063 spr_register_kvm(env, SPR_TFIAR, "TFIAR",
8064 &spr_read_tm, &spr_write_tm,
8065 &spr_read_tm, &spr_write_tm,
8066 KVM_REG_PPC_TFIAR, 0x00000000);
8067 spr_register_kvm(env, SPR_TEXASR, "TEXASR",
8068 &spr_read_tm, &spr_write_tm,
8069 &spr_read_tm, &spr_write_tm,
8070 KVM_REG_PPC_TEXASR, 0x00000000);
8071 spr_register(env, SPR_TEXASRU, "TEXASRU",
8072 &spr_read_tm_upper32, &spr_write_tm_upper32,
8073 &spr_read_tm_upper32, &spr_write_tm_upper32,
8077 static void spr_read_ebb(DisasContext *ctx, int gprn, int sprn)
8079 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8080 spr_read_generic(ctx, gprn, sprn);
8083 static void spr_write_ebb(DisasContext *ctx, int sprn, int gprn)
8085 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8086 spr_write_generic(ctx, sprn, gprn);
8089 static void spr_read_ebb_upper32(DisasContext *ctx, int gprn, int sprn)
8091 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8092 spr_read_prev_upper32(ctx, gprn, sprn);
8095 static void spr_write_ebb_upper32(DisasContext *ctx, int sprn, int gprn)
8097 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8098 spr_write_prev_upper32(ctx, sprn, gprn);
8101 static void gen_spr_power8_ebb(CPUPPCState *env)
8103 spr_register(env, SPR_BESCRS, "BESCRS",
8104 &spr_read_ebb, &spr_write_ebb,
8105 &spr_read_generic, &spr_write_generic,
8107 spr_register(env, SPR_BESCRSU, "BESCRSU",
8108 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
8109 &spr_read_prev_upper32, &spr_write_prev_upper32,
8111 spr_register(env, SPR_BESCRR, "BESCRR",
8112 &spr_read_ebb, &spr_write_ebb,
8113 &spr_read_generic, &spr_write_generic,
8115 spr_register(env, SPR_BESCRRU, "BESCRRU",
8116 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
8117 &spr_read_prev_upper32, &spr_write_prev_upper32,
8119 spr_register_kvm(env, SPR_EBBHR, "EBBHR",
8120 &spr_read_ebb, &spr_write_ebb,
8121 &spr_read_generic, &spr_write_generic,
8122 KVM_REG_PPC_EBBHR, 0x00000000);
8123 spr_register_kvm(env, SPR_EBBRR, "EBBRR",
8124 &spr_read_ebb, &spr_write_ebb,
8125 &spr_read_generic, &spr_write_generic,
8126 KVM_REG_PPC_EBBRR, 0x00000000);
8127 spr_register_kvm(env, SPR_BESCR, "BESCR",
8128 &spr_read_ebb, &spr_write_ebb,
8129 &spr_read_generic, &spr_write_generic,
8130 KVM_REG_PPC_BESCR, 0x00000000);
8133 /* Virtual Time Base */
8134 static void gen_spr_vtb(CPUPPCState *env)
8136 spr_register_kvm(env, SPR_VTB, "VTB",
8137 SPR_NOACCESS, SPR_NOACCESS,
8138 &spr_read_tbl, SPR_NOACCESS,
8139 KVM_REG_PPC_VTB, 0x00000000);
8142 static void gen_spr_power8_fscr(CPUPPCState *env)
8144 #if defined(CONFIG_USER_ONLY)
8145 target_ulong initval = 1ULL << FSCR_TAR;
8147 target_ulong initval = 0;
8149 spr_register_kvm(env, SPR_FSCR, "FSCR",
8150 SPR_NOACCESS, SPR_NOACCESS,
8151 &spr_read_generic, &spr_write_generic,
8152 KVM_REG_PPC_FSCR, initval);
8155 static void gen_spr_power8_pspb(CPUPPCState *env)
8157 spr_register_kvm(env, SPR_PSPB, "PSPB",
8158 SPR_NOACCESS, SPR_NOACCESS,
8159 &spr_read_generic, &spr_write_generic32,
8160 KVM_REG_PPC_PSPB, 0);
8163 static void gen_spr_power8_ic(CPUPPCState *env)
8165 #if !defined(CONFIG_USER_ONLY)
8166 spr_register_hv(env, SPR_IC, "IC",
8167 SPR_NOACCESS, SPR_NOACCESS,
8168 &spr_read_generic, SPR_NOACCESS,
8169 &spr_read_generic, &spr_write_generic,
8174 static void gen_spr_power8_book4(CPUPPCState *env)
8176 /* Add a number of P8 book4 registers */
8177 #if !defined(CONFIG_USER_ONLY)
8178 spr_register_kvm(env, SPR_ACOP, "ACOP",
8179 SPR_NOACCESS, SPR_NOACCESS,
8180 &spr_read_generic, &spr_write_generic,
8181 KVM_REG_PPC_ACOP, 0);
8182 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
8183 SPR_NOACCESS, SPR_NOACCESS,
8184 &spr_read_generic, &spr_write_pidr,
8185 KVM_REG_PPC_PID, 0);
8186 spr_register_kvm(env, SPR_WORT, "WORT",
8187 SPR_NOACCESS, SPR_NOACCESS,
8188 &spr_read_generic, &spr_write_generic,
8189 KVM_REG_PPC_WORT, 0);
8193 static void gen_spr_power7_book4(CPUPPCState *env)
8195 /* Add a number of P7 book4 registers */
8196 #if !defined(CONFIG_USER_ONLY)
8197 spr_register_kvm(env, SPR_ACOP, "ACOP",
8198 SPR_NOACCESS, SPR_NOACCESS,
8199 &spr_read_generic, &spr_write_generic,
8200 KVM_REG_PPC_ACOP, 0);
8201 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
8202 SPR_NOACCESS, SPR_NOACCESS,
8203 &spr_read_generic, &spr_write_generic,
8204 KVM_REG_PPC_PID, 0);
8208 static void gen_spr_power8_rpr(CPUPPCState *env)
8210 #if !defined(CONFIG_USER_ONLY)
8211 spr_register_hv(env, SPR_RPR, "RPR",
8212 SPR_NOACCESS, SPR_NOACCESS,
8213 SPR_NOACCESS, SPR_NOACCESS,
8214 &spr_read_generic, &spr_write_generic,
8215 0x00000103070F1F3F);
8219 static void gen_spr_power9_mmu(CPUPPCState *env)
8221 #if !defined(CONFIG_USER_ONLY)
8222 /* Partition Table Control */
8223 spr_register_kvm_hv(env, SPR_PTCR, "PTCR",
8224 SPR_NOACCESS, SPR_NOACCESS,
8225 SPR_NOACCESS, SPR_NOACCESS,
8226 &spr_read_generic, &spr_write_ptcr,
8227 KVM_REG_PPC_PTCR, 0x00000000);
8231 static void init_proc_book3s_common(CPUPPCState *env)
8233 gen_spr_ne_601(env);
8235 gen_spr_usprg3(env);
8236 gen_spr_book3s_altivec(env);
8237 gen_spr_book3s_pmu_sup(env);
8238 gen_spr_book3s_pmu_user(env);
8239 gen_spr_book3s_ctrl(env);
8242 static void init_proc_970(CPUPPCState *env)
8244 /* Common Registers */
8245 init_proc_book3s_common(env);
8247 gen_spr_book3s_dbg(env);
8249 /* 970 Specific Registers */
8250 gen_spr_970_hid(env);
8251 gen_spr_970_hior(env);
8253 gen_spr_970_pmu_sup(env);
8254 gen_spr_970_pmu_user(env);
8255 gen_spr_970_lpar(env);
8256 gen_spr_970_dbg(env);
8259 env->dcache_line_size = 128;
8260 env->icache_line_size = 128;
8262 /* Allocate hardware IRQ controller */
8264 ppc970_irq_init(ppc_env_get_cpu(env));
8267 POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
8269 DeviceClass *dc = DEVICE_CLASS(oc);
8270 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8272 dc->desc = "PowerPC 970";
8273 pcc->init_proc = init_proc_970;
8274 pcc->check_pow = check_pow_970;
8275 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
8276 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8277 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8279 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8280 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8281 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8282 PPC_64B | PPC_ALTIVEC |
8283 PPC_SEGMENT_64B | PPC_SLBI;
8284 pcc->insns_flags2 = PPC2_FP_CVT_S64;
8285 pcc->msr_mask = (1ull << MSR_SF) |
8300 pcc->mmu_model = POWERPC_MMU_64B;
8301 #if defined(CONFIG_SOFTMMU)
8302 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8303 pcc->hash64_opts = &ppc_hash64_opts_basic;
8305 pcc->excp_model = POWERPC_EXCP_970;
8306 pcc->bus_model = PPC_FLAGS_INPUT_970;
8307 pcc->bfd_mach = bfd_mach_ppc64;
8308 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8309 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8310 POWERPC_FLAG_BUS_CLK;
8311 pcc->l1_dcache_size = 0x8000;
8312 pcc->l1_icache_size = 0x10000;
8315 static void init_proc_power5plus(CPUPPCState *env)
8317 /* Common Registers */
8318 init_proc_book3s_common(env);
8320 gen_spr_book3s_dbg(env);
8322 /* POWER5+ Specific Registers */
8323 gen_spr_970_hid(env);
8324 gen_spr_970_hior(env);
8326 gen_spr_970_pmu_sup(env);
8327 gen_spr_970_pmu_user(env);
8328 gen_spr_power5p_common(env);
8329 gen_spr_power5p_lpar(env);
8330 gen_spr_power5p_ear(env);
8333 env->dcache_line_size = 128;
8334 env->icache_line_size = 128;
8336 /* Allocate hardware IRQ controller */
8338 ppc970_irq_init(ppc_env_get_cpu(env));
8341 POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
8343 DeviceClass *dc = DEVICE_CLASS(oc);
8344 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8346 dc->fw_name = "PowerPC,POWER5";
8347 dc->desc = "POWER5+";
8348 pcc->init_proc = init_proc_power5plus;
8349 pcc->check_pow = check_pow_970;
8350 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
8351 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8352 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8354 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8355 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8356 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8358 PPC_SEGMENT_64B | PPC_SLBI;
8359 pcc->insns_flags2 = PPC2_FP_CVT_S64;
8360 pcc->msr_mask = (1ull << MSR_SF) |
8375 pcc->mmu_model = POWERPC_MMU_2_03;
8376 #if defined(CONFIG_SOFTMMU)
8377 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8378 pcc->hash64_opts = &ppc_hash64_opts_basic;
8379 pcc->lrg_decr_bits = 32;
8381 pcc->excp_model = POWERPC_EXCP_970;
8382 pcc->bus_model = PPC_FLAGS_INPUT_970;
8383 pcc->bfd_mach = bfd_mach_ppc64;
8384 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8385 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8386 POWERPC_FLAG_BUS_CLK;
8387 pcc->l1_dcache_size = 0x8000;
8388 pcc->l1_icache_size = 0x10000;
8392 * The CPU used to have a "compat" property which set the
8393 * compatibility mode PVR. However, this was conceptually broken - it
8394 * only makes sense on the pseries machine type (otherwise the guest
8395 * owns the PCR and can control the compatibility mode itself). It's
8396 * been replaced with the 'max-cpu-compat' property on the pseries
8397 * machine type. For backwards compatibility, pseries specially
8398 * parses the -cpu parameter and converts old compat= parameters into
8399 * the appropriate machine parameters. This stub implementation of
8400 * the parameter catches any uses on explicitly created CPUs.
8402 static void getset_compat_deprecated(Object *obj, Visitor *v, const char *name,
8403 void *opaque, Error **errp)
8407 if (!qtest_enabled()) {
8408 warn_report("CPU 'compat' property is deprecated and has no effect; "
8409 "use max-cpu-compat machine property instead");
8411 visit_type_null(v, name, &null, NULL);
8412 qobject_unref(null);
8415 static const PropertyInfo ppc_compat_deprecated_propinfo = {
8417 .description = "compatibility mode (deprecated)",
8418 .get = getset_compat_deprecated,
8419 .set = getset_compat_deprecated,
8421 static Property powerpc_servercpu_properties[] = {
8424 .info = &ppc_compat_deprecated_propinfo,
8426 DEFINE_PROP_END_OF_LIST(),
8429 static void init_proc_POWER7(CPUPPCState *env)
8431 /* Common Registers */
8432 init_proc_book3s_common(env);
8434 gen_spr_book3s_dbg(env);
8436 /* POWER7 Specific Registers */
8437 gen_spr_book3s_ids(env);
8439 gen_spr_book3s_purr(env);
8440 gen_spr_power5p_common(env);
8441 gen_spr_power5p_lpar(env);
8442 gen_spr_power5p_ear(env);
8443 gen_spr_power6_common(env);
8444 gen_spr_power6_dbg(env);
8445 gen_spr_power7_book4(env);
8448 env->dcache_line_size = 128;
8449 env->icache_line_size = 128;
8451 /* Allocate hardware IRQ controller */
8452 init_excp_POWER7(env);
8453 ppcPOWER7_irq_init(ppc_env_get_cpu(env));
8456 static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr)
8458 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7P_BASE) {
8461 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7_BASE) {
8467 static bool cpu_has_work_POWER7(CPUState *cs)
8469 PowerPCCPU *cpu = POWERPC_CPU(cs);
8470 CPUPPCState *env = &cpu->env;
8473 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8476 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8477 (env->spr[SPR_LPCR] & LPCR_P7_PECE0)) {
8480 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8481 (env->spr[SPR_LPCR] & LPCR_P7_PECE1)) {
8484 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
8485 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
8488 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
8489 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
8492 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8497 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8501 POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
8503 DeviceClass *dc = DEVICE_CLASS(oc);
8504 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8505 CPUClass *cc = CPU_CLASS(oc);
8507 dc->fw_name = "PowerPC,POWER7";
8508 dc->desc = "POWER7";
8509 dc->props = powerpc_servercpu_properties;
8510 pcc->pvr_match = ppc_pvr_match_power7;
8511 pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05;
8512 pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
8513 pcc->init_proc = init_proc_POWER7;
8514 pcc->check_pow = check_pow_nocheck;
8515 cc->has_work = cpu_has_work_POWER7;
8516 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8517 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8518 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8519 PPC_FLOAT_FRSQRTES |
8522 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8523 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8524 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8525 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8526 PPC_SEGMENT_64B | PPC_SLBI |
8527 PPC_POPCNTB | PPC_POPCNTWD |
8529 pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205 |
8530 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8531 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8532 PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 |
8534 pcc->msr_mask = (1ull << MSR_SF) |
8550 pcc->mmu_model = POWERPC_MMU_2_06;
8551 #if defined(CONFIG_SOFTMMU)
8552 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8553 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8554 pcc->lrg_decr_bits = 32;
8556 pcc->excp_model = POWERPC_EXCP_POWER7;
8557 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
8558 pcc->bfd_mach = bfd_mach_ppc64;
8559 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8560 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8561 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8563 pcc->l1_dcache_size = 0x8000;
8564 pcc->l1_icache_size = 0x8000;
8565 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8566 pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
8569 static void init_proc_POWER8(CPUPPCState *env)
8571 /* Common Registers */
8572 init_proc_book3s_common(env);
8574 gen_spr_book3s_207_dbg(env);
8576 /* POWER8 Specific Registers */
8577 gen_spr_book3s_ids(env);
8580 gen_spr_book3s_purr(env);
8581 gen_spr_power5p_common(env);
8582 gen_spr_power5p_lpar(env);
8583 gen_spr_power5p_ear(env);
8584 gen_spr_power6_common(env);
8585 gen_spr_power6_dbg(env);
8586 gen_spr_power8_tce_address_control(env);
8587 gen_spr_power8_ids(env);
8588 gen_spr_power8_ebb(env);
8589 gen_spr_power8_fscr(env);
8590 gen_spr_power8_pmu_sup(env);
8591 gen_spr_power8_pmu_user(env);
8592 gen_spr_power8_tm(env);
8593 gen_spr_power8_pspb(env);
8595 gen_spr_power8_ic(env);
8596 gen_spr_power8_book4(env);
8597 gen_spr_power8_rpr(env);
8600 env->dcache_line_size = 128;
8601 env->icache_line_size = 128;
8603 /* Allocate hardware IRQ controller */
8604 init_excp_POWER8(env);
8605 ppcPOWER7_irq_init(ppc_env_get_cpu(env));
8608 static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr)
8610 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8NVL_BASE) {
8613 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8E_BASE) {
8616 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8_BASE) {
8622 static bool cpu_has_work_POWER8(CPUState *cs)
8624 PowerPCCPU *cpu = POWERPC_CPU(cs);
8625 CPUPPCState *env = &cpu->env;
8628 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8631 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8632 (env->spr[SPR_LPCR] & LPCR_P8_PECE2)) {
8635 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8636 (env->spr[SPR_LPCR] & LPCR_P8_PECE3)) {
8639 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
8640 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
8643 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
8644 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
8647 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
8648 (env->spr[SPR_LPCR] & LPCR_P8_PECE0)) {
8651 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
8652 (env->spr[SPR_LPCR] & LPCR_P8_PECE1)) {
8655 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8660 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8664 POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
8666 DeviceClass *dc = DEVICE_CLASS(oc);
8667 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8668 CPUClass *cc = CPU_CLASS(oc);
8670 dc->fw_name = "PowerPC,POWER8";
8671 dc->desc = "POWER8";
8672 dc->props = powerpc_servercpu_properties;
8673 pcc->pvr_match = ppc_pvr_match_power8;
8674 pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
8675 pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
8676 pcc->init_proc = init_proc_POWER8;
8677 pcc->check_pow = check_pow_nocheck;
8678 cc->has_work = cpu_has_work_POWER8;
8679 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8680 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8681 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8682 PPC_FLOAT_FRSQRTES |
8685 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8686 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8687 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8688 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8689 PPC_SEGMENT_64B | PPC_SLBI |
8690 PPC_POPCNTB | PPC_POPCNTWD |
8692 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
8693 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8694 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8695 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
8696 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
8697 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
8698 PPC2_TM | PPC2_PM_ISA206;
8699 pcc->msr_mask = (1ull << MSR_SF) |
8719 pcc->mmu_model = POWERPC_MMU_2_07;
8720 #if defined(CONFIG_SOFTMMU)
8721 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8722 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8723 pcc->lrg_decr_bits = 32;
8725 pcc->excp_model = POWERPC_EXCP_POWER8;
8726 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
8727 pcc->bfd_mach = bfd_mach_ppc64;
8728 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8729 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8730 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8731 POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
8732 pcc->l1_dcache_size = 0x8000;
8733 pcc->l1_icache_size = 0x8000;
8734 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8735 pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
8736 LPCR_P8_PECE3 | LPCR_P8_PECE4;
8739 #ifdef CONFIG_SOFTMMU
8741 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
8742 * Encoded as array of int_32s in the form:
8743 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
8745 * y -> radix mode supported page size (encoded as a shift)
8747 static struct ppc_radix_page_info POWER9_radix_page_info = {
8750 0x0000000c, /* 4K - enc: 0x0 */
8751 0xa0000010, /* 64K - enc: 0x5 */
8752 0x20000015, /* 2M - enc: 0x1 */
8753 0x4000001e /* 1G - enc: 0x2 */
8756 #endif /* CONFIG_SOFTMMU */
8758 static void init_proc_POWER9(CPUPPCState *env)
8760 /* Common Registers */
8761 init_proc_book3s_common(env);
8762 gen_spr_book3s_207_dbg(env);
8764 /* POWER8 Specific Registers */
8765 gen_spr_book3s_ids(env);
8768 gen_spr_book3s_purr(env);
8769 gen_spr_power5p_common(env);
8770 gen_spr_power5p_lpar(env);
8771 gen_spr_power5p_ear(env);
8772 gen_spr_power6_common(env);
8773 gen_spr_power6_dbg(env);
8774 gen_spr_power8_tce_address_control(env);
8775 gen_spr_power8_ids(env);
8776 gen_spr_power8_ebb(env);
8777 gen_spr_power8_fscr(env);
8778 gen_spr_power8_pmu_sup(env);
8779 gen_spr_power8_pmu_user(env);
8780 gen_spr_power8_tm(env);
8781 gen_spr_power8_pspb(env);
8783 gen_spr_power8_ic(env);
8784 gen_spr_power8_book4(env);
8785 gen_spr_power8_rpr(env);
8786 gen_spr_power9_mmu(env);
8788 /* POWER9 Specific registers */
8789 spr_register_kvm(env, SPR_TIDR, "TIDR", NULL, NULL,
8790 spr_read_generic, spr_write_generic,
8791 KVM_REG_PPC_TIDR, 0);
8793 /* FIXME: Filter fields properly based on privilege level */
8794 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
8795 spr_read_generic, spr_write_generic,
8796 KVM_REG_PPC_PSSCR, 0);
8799 env->dcache_line_size = 128;
8800 env->icache_line_size = 128;
8802 /* Allocate hardware IRQ controller */
8803 init_excp_POWER9(env);
8804 ppcPOWER9_irq_init(ppc_env_get_cpu(env));
8807 static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr)
8809 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER9_BASE) {
8815 static bool cpu_has_work_POWER9(CPUState *cs)
8817 PowerPCCPU *cpu = POWERPC_CPU(cs);
8818 CPUPPCState *env = &cpu->env;
8821 uint64_t psscr = env->spr[SPR_PSSCR];
8823 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8827 /* If EC is clear, just return true on any pending interrupt */
8828 if (!(psscr & PSSCR_EC)) {
8831 /* External Exception */
8832 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8833 (env->spr[SPR_LPCR] & LPCR_EEE)) {
8834 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
8835 if (heic == 0 || !msr_hv || msr_pr) {
8839 /* Decrementer Exception */
8840 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8841 (env->spr[SPR_LPCR] & LPCR_DEE)) {
8844 /* Machine Check or Hypervisor Maintenance Exception */
8845 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK |
8846 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) {
8849 /* Privileged Doorbell Exception */
8850 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
8851 (env->spr[SPR_LPCR] & LPCR_PDEE)) {
8854 /* Hypervisor Doorbell Exception */
8855 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
8856 (env->spr[SPR_LPCR] & LPCR_HDEE)) {
8859 /* Hypervisor virtualization exception */
8860 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) &&
8861 (env->spr[SPR_LPCR] & LPCR_HVEE)) {
8864 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8869 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8873 POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
8875 DeviceClass *dc = DEVICE_CLASS(oc);
8876 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8877 CPUClass *cc = CPU_CLASS(oc);
8879 dc->fw_name = "PowerPC,POWER9";
8880 dc->desc = "POWER9";
8881 dc->props = powerpc_servercpu_properties;
8882 pcc->pvr_match = ppc_pvr_match_power9;
8883 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07;
8884 pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 |
8886 pcc->init_proc = init_proc_POWER9;
8887 pcc->check_pow = check_pow_nocheck;
8888 cc->has_work = cpu_has_work_POWER9;
8889 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8890 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8891 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8892 PPC_FLOAT_FRSQRTES |
8895 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8896 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8898 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8899 PPC_SEGMENT_64B | PPC_SLBI |
8900 PPC_POPCNTB | PPC_POPCNTWD |
8902 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
8903 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8904 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8905 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
8906 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
8907 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
8908 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
8909 pcc->msr_mask = (1ull << MSR_SF) |
8927 pcc->mmu_model = POWERPC_MMU_3_00;
8928 #if defined(CONFIG_SOFTMMU)
8929 pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault;
8930 /* segment page size remain the same */
8931 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8932 pcc->radix_page_info = &POWER9_radix_page_info;
8933 pcc->lrg_decr_bits = 56;
8935 pcc->excp_model = POWERPC_EXCP_POWER9;
8936 pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
8937 pcc->bfd_mach = bfd_mach_ppc64;
8938 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8939 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8940 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8941 POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
8942 pcc->l1_dcache_size = 0x8000;
8943 pcc->l1_icache_size = 0x8000;
8944 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8945 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
8948 #if !defined(CONFIG_USER_ONLY)
8949 void cpu_ppc_set_vhyp(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp)
8951 CPUPPCState *env = &cpu->env;
8956 * With a virtual hypervisor mode we never allow the CPU to go
8957 * hypervisor mode itself
8959 env->msr_mask &= ~MSR_HVB;
8962 #endif /* !defined(CONFIG_USER_ONLY) */
8964 #endif /* defined(TARGET_PPC64) */
8966 /*****************************************************************************/
8967 /* Generic CPU instantiation routine */
8968 static void init_ppc_proc(PowerPCCPU *cpu)
8970 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8971 CPUPPCState *env = &cpu->env;
8972 #if !defined(CONFIG_USER_ONLY)
8975 env->irq_inputs = NULL;
8976 /* Set all exception vectors to an invalid address */
8977 for (i = 0; i < POWERPC_EXCP_NB; i++)
8978 env->excp_vectors[i] = (target_ulong)(-1ULL);
8979 env->ivor_mask = 0x00000000;
8980 env->ivpr_mask = 0x00000000;
8981 /* Default MMU definitions */
8985 env->tlb_type = TLB_NONE;
8987 /* Register SPR common to all PowerPC implementations */
8988 gen_spr_generic(env);
8989 spr_register(env, SPR_PVR, "PVR",
8990 /* Linux permits userspace to read PVR */
8991 #if defined(CONFIG_LINUX_USER)
8997 &spr_read_generic, SPR_NOACCESS,
8999 /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
9000 if (pcc->svr != POWERPC_SVR_NONE) {
9001 if (pcc->svr & POWERPC_SVR_E500) {
9002 spr_register(env, SPR_E500_SVR, "SVR",
9003 SPR_NOACCESS, SPR_NOACCESS,
9004 &spr_read_generic, SPR_NOACCESS,
9005 pcc->svr & ~POWERPC_SVR_E500);
9007 spr_register(env, SPR_SVR, "SVR",
9008 SPR_NOACCESS, SPR_NOACCESS,
9009 &spr_read_generic, SPR_NOACCESS,
9013 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
9014 (*pcc->init_proc)(env);
9016 #if !defined(CONFIG_USER_ONLY)
9017 ppc_gdb_gen_spr_xml(cpu);
9020 /* MSR bits & flags consistency checks */
9021 if (env->msr_mask & (1 << 25)) {
9022 switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
9023 case POWERPC_FLAG_SPE:
9024 case POWERPC_FLAG_VRE:
9027 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9028 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
9031 } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
9032 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9033 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
9036 if (env->msr_mask & (1 << 17)) {
9037 switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
9038 case POWERPC_FLAG_TGPR:
9039 case POWERPC_FLAG_CE:
9042 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9043 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
9046 } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
9047 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9048 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
9051 if (env->msr_mask & (1 << 10)) {
9052 switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
9053 POWERPC_FLAG_UBLE)) {
9054 case POWERPC_FLAG_SE:
9055 case POWERPC_FLAG_DWE:
9056 case POWERPC_FLAG_UBLE:
9059 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9060 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
9061 "POWERPC_FLAG_UBLE\n");
9064 } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
9065 POWERPC_FLAG_UBLE)) {
9066 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9067 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
9068 "POWERPC_FLAG_UBLE\n");
9071 if (env->msr_mask & (1 << 9)) {
9072 switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
9073 case POWERPC_FLAG_BE:
9074 case POWERPC_FLAG_DE:
9077 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9078 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
9081 } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
9082 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9083 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
9086 if (env->msr_mask & (1 << 2)) {
9087 switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9088 case POWERPC_FLAG_PX:
9089 case POWERPC_FLAG_PMM:
9092 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9093 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
9096 } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9097 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9098 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
9101 if ((env->flags & (POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_BUS_CLK)) == 0) {
9102 fprintf(stderr, "PowerPC flags inconsistency\n"
9103 "Should define the time-base and decrementer clock source\n");
9106 /* Allocate TLBs buffer when needed */
9107 #if !defined(CONFIG_USER_ONLY)
9108 if (env->nb_tlb != 0) {
9109 int nb_tlb = env->nb_tlb;
9110 if (env->id_tlbs != 0)
9112 switch (env->tlb_type) {
9114 env->tlb.tlb6 = g_new0(ppc6xx_tlb_t, nb_tlb);
9117 env->tlb.tlbe = g_new0(ppcemb_tlb_t, nb_tlb);
9120 env->tlb.tlbm = g_new0(ppcmas_tlb_t, nb_tlb);
9123 /* Pre-compute some useful values */
9124 env->tlb_per_way = env->nb_tlb / env->nb_ways;
9126 if (env->irq_inputs == NULL) {
9127 warn_report("no internal IRQ controller registered."
9128 " Attempt QEMU to crash very soon !");
9131 if (env->check_pow == NULL) {
9132 warn_report("no power management check handler registered."
9133 " Attempt QEMU to crash very soon !");
9137 #if defined(PPC_DUMP_CPU)
9138 static void dump_ppc_sprs(CPUPPCState *env)
9141 #if !defined(CONFIG_USER_ONLY)
9147 printf("Special purpose registers:\n");
9148 for (i = 0; i < 32; i++) {
9149 for (j = 0; j < 32; j++) {
9151 spr = &env->spr_cb[n];
9152 uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
9153 ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
9154 #if !defined(CONFIG_USER_ONLY)
9155 sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
9156 sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
9157 if (sw || sr || uw || ur) {
9158 printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
9159 (i << 5) | j, (i << 5) | j, spr->name,
9160 sw ? 'w' : '-', sr ? 'r' : '-',
9161 uw ? 'w' : '-', ur ? 'r' : '-');
9165 printf("SPR: %4d (%03x) %-8s u%c%c\n",
9166 (i << 5) | j, (i << 5) | j, spr->name,
9167 uw ? 'w' : '-', ur ? 'r' : '-');
9177 /*****************************************************************************/
9181 PPC_DIRECT = 0, /* Opcode routine */
9182 PPC_INDIRECT = 1, /* Indirect opcode table */
9185 #define PPC_OPCODE_MASK 0x3
9187 static inline int is_indirect_opcode(void *handler)
9189 return ((uintptr_t)handler & PPC_OPCODE_MASK) == PPC_INDIRECT;
9192 static inline opc_handler_t **ind_table(void *handler)
9194 return (opc_handler_t **)((uintptr_t)handler & ~PPC_OPCODE_MASK);
9197 /* Instruction table creation */
9198 /* Opcodes tables creation */
9199 static void fill_new_table(opc_handler_t **table, int len)
9203 for (i = 0; i < len; i++)
9204 table[i] = &invalid_handler;
9207 static int create_new_table(opc_handler_t **table, unsigned char idx)
9209 opc_handler_t **tmp;
9211 tmp = g_new(opc_handler_t *, PPC_CPU_INDIRECT_OPCODES_LEN);
9212 fill_new_table(tmp, PPC_CPU_INDIRECT_OPCODES_LEN);
9213 table[idx] = (opc_handler_t *)((uintptr_t)tmp | PPC_INDIRECT);
9218 static int insert_in_table(opc_handler_t **table, unsigned char idx,
9219 opc_handler_t *handler)
9221 if (table[idx] != &invalid_handler)
9223 table[idx] = handler;
9228 static int register_direct_insn(opc_handler_t **ppc_opcodes,
9229 unsigned char idx, opc_handler_t *handler)
9231 if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
9232 printf("*** ERROR: opcode %02x already assigned in main "
9233 "opcode table\n", idx);
9234 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9235 printf(" Registered handler '%s' - new handler '%s'\n",
9236 ppc_opcodes[idx]->oname, handler->oname);
9244 static int register_ind_in_table(opc_handler_t **table,
9245 unsigned char idx1, unsigned char idx2,
9246 opc_handler_t *handler)
9248 if (table[idx1] == &invalid_handler) {
9249 if (create_new_table(table, idx1) < 0) {
9250 printf("*** ERROR: unable to create indirect table "
9251 "idx=%02x\n", idx1);
9255 if (!is_indirect_opcode(table[idx1])) {
9256 printf("*** ERROR: idx %02x already assigned to a direct "
9258 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9259 printf(" Registered handler '%s' - new handler '%s'\n",
9260 ind_table(table[idx1])[idx2]->oname, handler->oname);
9265 if (handler != NULL &&
9266 insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
9267 printf("*** ERROR: opcode %02x already assigned in "
9268 "opcode table %02x\n", idx2, idx1);
9269 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9270 printf(" Registered handler '%s' - new handler '%s'\n",
9271 ind_table(table[idx1])[idx2]->oname, handler->oname);
9279 static int register_ind_insn(opc_handler_t **ppc_opcodes,
9280 unsigned char idx1, unsigned char idx2,
9281 opc_handler_t *handler)
9283 return register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
9286 static int register_dblind_insn(opc_handler_t **ppc_opcodes,
9287 unsigned char idx1, unsigned char idx2,
9288 unsigned char idx3, opc_handler_t *handler)
9290 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
9291 printf("*** ERROR: unable to join indirect table idx "
9292 "[%02x-%02x]\n", idx1, idx2);
9295 if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
9297 printf("*** ERROR: unable to insert opcode "
9298 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
9305 static int register_trplind_insn(opc_handler_t **ppc_opcodes,
9306 unsigned char idx1, unsigned char idx2,
9307 unsigned char idx3, unsigned char idx4,
9308 opc_handler_t *handler)
9310 opc_handler_t **table;
9312 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
9313 printf("*** ERROR: unable to join indirect table idx "
9314 "[%02x-%02x]\n", idx1, idx2);
9317 table = ind_table(ppc_opcodes[idx1]);
9318 if (register_ind_in_table(table, idx2, idx3, NULL) < 0) {
9319 printf("*** ERROR: unable to join 2nd-level indirect table idx "
9320 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
9323 table = ind_table(table[idx2]);
9324 if (register_ind_in_table(table, idx3, idx4, handler) < 0) {
9325 printf("*** ERROR: unable to insert opcode "
9326 "[%02x-%02x-%02x-%02x]\n", idx1, idx2, idx3, idx4);
9331 static int register_insn(opc_handler_t **ppc_opcodes, opcode_t *insn)
9333 if (insn->opc2 != 0xFF) {
9334 if (insn->opc3 != 0xFF) {
9335 if (insn->opc4 != 0xFF) {
9336 if (register_trplind_insn(ppc_opcodes, insn->opc1, insn->opc2,
9337 insn->opc3, insn->opc4,
9338 &insn->handler) < 0) {
9342 if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
9343 insn->opc3, &insn->handler) < 0)
9347 if (register_ind_insn(ppc_opcodes, insn->opc1,
9348 insn->opc2, &insn->handler) < 0)
9352 if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
9359 static int test_opcode_table(opc_handler_t **table, int len)
9363 for (i = 0, count = 0; i < len; i++) {
9364 /* Consistency fixup */
9365 if (table[i] == NULL)
9366 table[i] = &invalid_handler;
9367 if (table[i] != &invalid_handler) {
9368 if (is_indirect_opcode(table[i])) {
9369 tmp = test_opcode_table(ind_table(table[i]),
9370 PPC_CPU_INDIRECT_OPCODES_LEN);
9373 table[i] = &invalid_handler;
9386 static void fix_opcode_tables(opc_handler_t **ppc_opcodes)
9388 if (test_opcode_table(ppc_opcodes, PPC_CPU_OPCODES_LEN) == 0)
9389 printf("*** WARNING: no opcode defined !\n");
9392 /*****************************************************************************/
9393 static void create_ppc_opcodes(PowerPCCPU *cpu, Error **errp)
9395 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
9396 CPUPPCState *env = &cpu->env;
9399 fill_new_table(env->opcodes, PPC_CPU_OPCODES_LEN);
9400 for (opc = opcodes; opc < &opcodes[ARRAY_SIZE(opcodes)]; opc++) {
9401 if (((opc->handler.type & pcc->insns_flags) != 0) ||
9402 ((opc->handler.type2 & pcc->insns_flags2) != 0)) {
9403 if (register_insn(env->opcodes, opc) < 0) {
9404 error_setg(errp, "ERROR initializing PowerPC instruction "
9405 "0x%02x 0x%02x 0x%02x", opc->opc1, opc->opc2,
9411 fix_opcode_tables(env->opcodes);
9416 #if defined(PPC_DUMP_CPU)
9417 static void dump_ppc_insns(CPUPPCState *env)
9419 opc_handler_t **table, *handler;
9421 uint8_t opc1, opc2, opc3, opc4;
9423 printf("Instructions set:\n");
9424 /* opc1 is 6 bits long */
9425 for (opc1 = 0x00; opc1 < PPC_CPU_OPCODES_LEN; opc1++) {
9426 table = env->opcodes;
9427 handler = table[opc1];
9428 if (is_indirect_opcode(handler)) {
9429 /* opc2 is 5 bits long */
9430 for (opc2 = 0; opc2 < PPC_CPU_INDIRECT_OPCODES_LEN; opc2++) {
9431 table = env->opcodes;
9432 handler = env->opcodes[opc1];
9433 table = ind_table(handler);
9434 handler = table[opc2];
9435 if (is_indirect_opcode(handler)) {
9436 table = ind_table(handler);
9437 /* opc3 is 5 bits long */
9438 for (opc3 = 0; opc3 < PPC_CPU_INDIRECT_OPCODES_LEN;
9440 handler = table[opc3];
9441 if (is_indirect_opcode(handler)) {
9442 table = ind_table(handler);
9443 /* opc4 is 5 bits long */
9444 for (opc4 = 0; opc4 < PPC_CPU_INDIRECT_OPCODES_LEN;
9446 handler = table[opc4];
9447 if (handler->handler != &gen_invalid) {
9448 printf("INSN: %02x %02x %02x %02x -- "
9449 "(%02d %04d %02d) : %s\n",
9450 opc1, opc2, opc3, opc4,
9451 opc1, (opc3 << 5) | opc2, opc4,
9456 if (handler->handler != &gen_invalid) {
9457 /* Special hack to properly dump SPE insns */
9458 p = strchr(handler->oname, '_');
9460 printf("INSN: %02x %02x %02x (%02d %04d) : "
9462 opc1, opc2, opc3, opc1,
9467 if ((p - handler->oname) != strlen(q)
9468 || (memcmp(handler->oname, q, strlen(q))
9470 /* First instruction */
9471 printf("INSN: %02x %02x %02x"
9472 "(%02d %04d) : %.*s\n",
9473 opc1, opc2 << 1, opc3, opc1,
9474 (opc3 << 6) | (opc2 << 1),
9475 (int)(p - handler->oname),
9478 if (strcmp(p + 1, q) != 0) {
9479 /* Second instruction */
9480 printf("INSN: %02x %02x %02x "
9481 "(%02d %04d) : %s\n", opc1,
9482 (opc2 << 1) | 1, opc3, opc1,
9483 (opc3 << 6) | (opc2 << 1) | 1,
9491 if (handler->handler != &gen_invalid) {
9492 printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
9493 opc1, opc2, opc1, opc2, handler->oname);
9498 if (handler->handler != &gen_invalid) {
9499 printf("INSN: %02x -- -- (%02d ----) : %s\n",
9500 opc1, opc1, handler->oname);
9507 static bool avr_need_swap(CPUPPCState *env)
9509 #ifdef HOST_WORDS_BIGENDIAN
9516 #if !defined(CONFIG_USER_ONLY)
9517 static int gdb_find_spr_idx(CPUPPCState *env, int n)
9521 for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
9522 ppc_spr_t *spr = &env->spr_cb[i];
9524 if (spr->name && spr->gdb_id == n) {
9531 static int gdb_get_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9536 reg = gdb_find_spr_idx(env, n);
9541 len = TARGET_LONG_SIZE;
9542 stn_p(mem_buf, len, env->spr[reg]);
9543 ppc_maybe_bswap_register(env, mem_buf, len);
9547 static int gdb_set_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9552 reg = gdb_find_spr_idx(env, n);
9557 len = TARGET_LONG_SIZE;
9558 ppc_maybe_bswap_register(env, mem_buf, len);
9559 env->spr[reg] = ldn_p(mem_buf, len);
9565 static int gdb_get_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9568 stfq_p(mem_buf, *cpu_fpr_ptr(env, n));
9569 ppc_maybe_bswap_register(env, mem_buf, 8);
9573 stl_p(mem_buf, env->fpscr);
9574 ppc_maybe_bswap_register(env, mem_buf, 4);
9580 static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9583 ppc_maybe_bswap_register(env, mem_buf, 8);
9584 *cpu_fpr_ptr(env, n) = ldfq_p(mem_buf);
9588 ppc_maybe_bswap_register(env, mem_buf, 4);
9589 helper_store_fpscr(env, ldl_p(mem_buf), 0xffffffff);
9595 static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9598 ppc_avr_t *avr = cpu_avr_ptr(env, n);
9599 if (!avr_need_swap(env)) {
9600 stq_p(mem_buf, avr->u64[0]);
9601 stq_p(mem_buf + 8, avr->u64[1]);
9603 stq_p(mem_buf, avr->u64[1]);
9604 stq_p(mem_buf + 8, avr->u64[0]);
9606 ppc_maybe_bswap_register(env, mem_buf, 8);
9607 ppc_maybe_bswap_register(env, mem_buf + 8, 8);
9611 stl_p(mem_buf, helper_mfvscr(env));
9612 ppc_maybe_bswap_register(env, mem_buf, 4);
9616 stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
9617 ppc_maybe_bswap_register(env, mem_buf, 4);
9623 static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9626 ppc_avr_t *avr = cpu_avr_ptr(env, n);
9627 ppc_maybe_bswap_register(env, mem_buf, 8);
9628 ppc_maybe_bswap_register(env, mem_buf + 8, 8);
9629 if (!avr_need_swap(env)) {
9630 avr->u64[0] = ldq_p(mem_buf);
9631 avr->u64[1] = ldq_p(mem_buf + 8);
9633 avr->u64[1] = ldq_p(mem_buf);
9634 avr->u64[0] = ldq_p(mem_buf + 8);
9639 ppc_maybe_bswap_register(env, mem_buf, 4);
9640 helper_mtvscr(env, ldl_p(mem_buf));
9644 ppc_maybe_bswap_register(env, mem_buf, 4);
9645 env->spr[SPR_VRSAVE] = (target_ulong)ldl_p(mem_buf);
9651 static int gdb_get_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9654 #if defined(TARGET_PPC64)
9655 stl_p(mem_buf, env->gpr[n] >> 32);
9656 ppc_maybe_bswap_register(env, mem_buf, 4);
9658 stl_p(mem_buf, env->gprh[n]);
9663 stq_p(mem_buf, env->spe_acc);
9664 ppc_maybe_bswap_register(env, mem_buf, 8);
9668 stl_p(mem_buf, env->spe_fscr);
9669 ppc_maybe_bswap_register(env, mem_buf, 4);
9675 static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9678 #if defined(TARGET_PPC64)
9679 target_ulong lo = (uint32_t)env->gpr[n];
9682 ppc_maybe_bswap_register(env, mem_buf, 4);
9684 hi = (target_ulong)ldl_p(mem_buf) << 32;
9685 env->gpr[n] = lo | hi;
9687 env->gprh[n] = ldl_p(mem_buf);
9692 ppc_maybe_bswap_register(env, mem_buf, 8);
9693 env->spe_acc = ldq_p(mem_buf);
9697 ppc_maybe_bswap_register(env, mem_buf, 4);
9698 env->spe_fscr = ldl_p(mem_buf);
9704 static int gdb_get_vsx_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9707 stq_p(mem_buf, *cpu_vsrl_ptr(env, n));
9708 ppc_maybe_bswap_register(env, mem_buf, 8);
9714 static int gdb_set_vsx_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9717 ppc_maybe_bswap_register(env, mem_buf, 8);
9718 *cpu_vsrl_ptr(env, n) = ldq_p(mem_buf);
9724 static int ppc_fixup_cpu(PowerPCCPU *cpu)
9726 CPUPPCState *env = &cpu->env;
9728 /* TCG doesn't (yet) emulate some groups of instructions that
9729 * are implemented on some otherwise supported CPUs (e.g. VSX
9730 * and decimal floating point instructions on POWER7). We
9731 * remove unsupported instruction groups from the cpu state's
9732 * instruction masks and hope the guest can cope. For at
9733 * least the pseries machine, the unavailability of these
9734 * instructions can be advertised to the guest via the device
9736 if ((env->insns_flags & ~PPC_TCG_INSNS)
9737 || (env->insns_flags2 & ~PPC_TCG_INSNS2)) {
9738 warn_report("Disabling some instructions which are not "
9739 "emulated by TCG (0x%" PRIx64 ", 0x%" PRIx64 ")",
9740 env->insns_flags & ~PPC_TCG_INSNS,
9741 env->insns_flags2 & ~PPC_TCG_INSNS2);
9743 env->insns_flags &= PPC_TCG_INSNS;
9744 env->insns_flags2 &= PPC_TCG_INSNS2;
9748 static void ppc_cpu_realize(DeviceState *dev, Error **errp)
9750 CPUState *cs = CPU(dev);
9751 PowerPCCPU *cpu = POWERPC_CPU(dev);
9752 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
9753 Error *local_err = NULL;
9755 cpu_exec_realizefn(cs, &local_err);
9756 if (local_err != NULL) {
9757 error_propagate(errp, local_err);
9760 if (cpu->vcpu_id == UNASSIGNED_CPU_INDEX) {
9761 cpu->vcpu_id = cs->cpu_index;
9764 if (tcg_enabled()) {
9765 if (ppc_fixup_cpu(cpu) != 0) {
9766 error_setg(errp, "Unable to emulate selected CPU with TCG");
9771 create_ppc_opcodes(cpu, &local_err);
9772 if (local_err != NULL) {
9773 error_propagate(errp, local_err);
9778 if (pcc->insns_flags & PPC_FLOAT) {
9779 gdb_register_coprocessor(cs, gdb_get_float_reg, gdb_set_float_reg,
9780 33, "power-fpu.xml", 0);
9782 if (pcc->insns_flags & PPC_ALTIVEC) {
9783 gdb_register_coprocessor(cs, gdb_get_avr_reg, gdb_set_avr_reg,
9784 34, "power-altivec.xml", 0);
9786 if (pcc->insns_flags & PPC_SPE) {
9787 gdb_register_coprocessor(cs, gdb_get_spe_reg, gdb_set_spe_reg,
9788 34, "power-spe.xml", 0);
9790 if (pcc->insns_flags2 & PPC2_VSX) {
9791 gdb_register_coprocessor(cs, gdb_get_vsx_reg, gdb_set_vsx_reg,
9792 32, "power-vsx.xml", 0);
9794 #ifndef CONFIG_USER_ONLY
9795 gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg,
9796 pcc->gdb_num_sprs, "power-spr.xml", 0);
9800 pcc->parent_realize(dev, errp);
9802 #if defined(PPC_DUMP_CPU)
9804 CPUPPCState *env = &cpu->env;
9805 const char *mmu_model, *excp_model, *bus_model;
9806 switch (env->mmu_model) {
9807 case POWERPC_MMU_32B:
9808 mmu_model = "PowerPC 32";
9810 case POWERPC_MMU_SOFT_6xx:
9811 mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
9813 case POWERPC_MMU_SOFT_74xx:
9814 mmu_model = "PowerPC 74xx with software driven TLBs";
9816 case POWERPC_MMU_SOFT_4xx:
9817 mmu_model = "PowerPC 4xx with software driven TLBs";
9819 case POWERPC_MMU_SOFT_4xx_Z:
9820 mmu_model = "PowerPC 4xx with software driven TLBs "
9821 "and zones protections";
9823 case POWERPC_MMU_REAL:
9824 mmu_model = "PowerPC real mode only";
9826 case POWERPC_MMU_MPC8xx:
9827 mmu_model = "PowerPC MPC8xx";
9829 case POWERPC_MMU_BOOKE:
9830 mmu_model = "PowerPC BookE";
9832 case POWERPC_MMU_BOOKE206:
9833 mmu_model = "PowerPC BookE 2.06";
9835 case POWERPC_MMU_601:
9836 mmu_model = "PowerPC 601";
9838 #if defined(TARGET_PPC64)
9839 case POWERPC_MMU_64B:
9840 mmu_model = "PowerPC 64";
9844 mmu_model = "Unknown or invalid";
9847 switch (env->excp_model) {
9848 case POWERPC_EXCP_STD:
9849 excp_model = "PowerPC";
9851 case POWERPC_EXCP_40x:
9852 excp_model = "PowerPC 40x";
9854 case POWERPC_EXCP_601:
9855 excp_model = "PowerPC 601";
9857 case POWERPC_EXCP_602:
9858 excp_model = "PowerPC 602";
9860 case POWERPC_EXCP_603:
9861 excp_model = "PowerPC 603";
9863 case POWERPC_EXCP_603E:
9864 excp_model = "PowerPC 603e";
9866 case POWERPC_EXCP_604:
9867 excp_model = "PowerPC 604";
9869 case POWERPC_EXCP_7x0:
9870 excp_model = "PowerPC 740/750";
9872 case POWERPC_EXCP_7x5:
9873 excp_model = "PowerPC 745/755";
9875 case POWERPC_EXCP_74xx:
9876 excp_model = "PowerPC 74xx";
9878 case POWERPC_EXCP_BOOKE:
9879 excp_model = "PowerPC BookE";
9881 #if defined(TARGET_PPC64)
9882 case POWERPC_EXCP_970:
9883 excp_model = "PowerPC 970";
9887 excp_model = "Unknown or invalid";
9890 switch (env->bus_model) {
9891 case PPC_FLAGS_INPUT_6xx:
9892 bus_model = "PowerPC 6xx";
9894 case PPC_FLAGS_INPUT_BookE:
9895 bus_model = "PowerPC BookE";
9897 case PPC_FLAGS_INPUT_405:
9898 bus_model = "PowerPC 405";
9900 case PPC_FLAGS_INPUT_401:
9901 bus_model = "PowerPC 401/403";
9903 case PPC_FLAGS_INPUT_RCPU:
9904 bus_model = "RCPU / MPC8xx";
9906 #if defined(TARGET_PPC64)
9907 case PPC_FLAGS_INPUT_970:
9908 bus_model = "PowerPC 970";
9912 bus_model = "Unknown or invalid";
9915 printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
9916 " MMU model : %s\n",
9917 object_class_get_name(OBJECT_CLASS(pcc)),
9918 pcc->pvr, pcc->msr_mask, mmu_model);
9919 #if !defined(CONFIG_USER_ONLY)
9920 if (env->tlb.tlb6) {
9921 printf(" %d %s TLB in %d ways\n",
9922 env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
9926 printf(" Exceptions model : %s\n"
9927 " Bus model : %s\n",
9928 excp_model, bus_model);
9929 printf(" MSR features :\n");
9930 if (env->flags & POWERPC_FLAG_SPE)
9931 printf(" signal processing engine enable"
9933 else if (env->flags & POWERPC_FLAG_VRE)
9934 printf(" vector processor enable\n");
9935 if (env->flags & POWERPC_FLAG_TGPR)
9936 printf(" temporary GPRs\n");
9937 else if (env->flags & POWERPC_FLAG_CE)
9938 printf(" critical input enable\n");
9939 if (env->flags & POWERPC_FLAG_SE)
9940 printf(" single-step trace mode\n");
9941 else if (env->flags & POWERPC_FLAG_DWE)
9942 printf(" debug wait enable\n");
9943 else if (env->flags & POWERPC_FLAG_UBLE)
9944 printf(" user BTB lock enable\n");
9945 if (env->flags & POWERPC_FLAG_BE)
9946 printf(" branch-step trace mode\n");
9947 else if (env->flags & POWERPC_FLAG_DE)
9948 printf(" debug interrupt enable\n");
9949 if (env->flags & POWERPC_FLAG_PX)
9950 printf(" inclusive protection\n");
9951 else if (env->flags & POWERPC_FLAG_PMM)
9952 printf(" performance monitor mark\n");
9953 if (env->flags == POWERPC_FLAG_NONE)
9955 printf(" Time-base/decrementer clock source: %s\n",
9956 env->flags & POWERPC_FLAG_RTC_CLK ? "RTC clock" : "bus clock");
9957 dump_ppc_insns(env);
9965 cpu_exec_unrealizefn(cs);
9968 static void ppc_cpu_unrealize(DeviceState *dev, Error **errp)
9970 PowerPCCPU *cpu = POWERPC_CPU(dev);
9971 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
9972 CPUPPCState *env = &cpu->env;
9973 Error *local_err = NULL;
9974 opc_handler_t **table, **table_2;
9977 pcc->parent_unrealize(dev, &local_err);
9978 if (local_err != NULL) {
9979 error_propagate(errp, local_err);
9983 for (i = 0; i < PPC_CPU_OPCODES_LEN; i++) {
9984 if (env->opcodes[i] == &invalid_handler) {
9987 if (is_indirect_opcode(env->opcodes[i])) {
9988 table = ind_table(env->opcodes[i]);
9989 for (j = 0; j < PPC_CPU_INDIRECT_OPCODES_LEN; j++) {
9990 if (table[j] == &invalid_handler) {
9993 if (is_indirect_opcode(table[j])) {
9994 table_2 = ind_table(table[j]);
9995 for (k = 0; k < PPC_CPU_INDIRECT_OPCODES_LEN; k++) {
9996 if (table_2[k] != &invalid_handler &&
9997 is_indirect_opcode(table_2[k])) {
9998 g_free((opc_handler_t *)((uintptr_t)table_2[k] &
10002 g_free((opc_handler_t *)((uintptr_t)table[j] &
10006 g_free((opc_handler_t *)((uintptr_t)env->opcodes[i] &
10012 static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
10014 ObjectClass *oc = (ObjectClass *)a;
10015 uint32_t pvr = *(uint32_t *)b;
10016 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
10018 /* -cpu host does a PVR lookup during construction */
10019 if (unlikely(strcmp(object_class_get_name(oc),
10020 TYPE_HOST_POWERPC_CPU) == 0)) {
10024 return pcc->pvr == pvr ? 0 : -1;
10027 PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
10029 GSList *list, *item;
10030 PowerPCCPUClass *pcc = NULL;
10032 list = object_class_get_list(TYPE_POWERPC_CPU, false);
10033 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
10034 if (item != NULL) {
10035 pcc = POWERPC_CPU_CLASS(item->data);
10037 g_slist_free(list);
10042 static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b)
10044 ObjectClass *oc = (ObjectClass *)a;
10045 uint32_t pvr = *(uint32_t *)b;
10046 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
10048 /* -cpu host does a PVR lookup during construction */
10049 if (unlikely(strcmp(object_class_get_name(oc),
10050 TYPE_HOST_POWERPC_CPU) == 0)) {
10054 if (pcc->pvr_match(pcc, pvr)) {
10061 PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr)
10063 GSList *list, *item;
10064 PowerPCCPUClass *pcc = NULL;
10066 list = object_class_get_list(TYPE_POWERPC_CPU, true);
10067 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr_mask);
10068 if (item != NULL) {
10069 pcc = POWERPC_CPU_CLASS(item->data);
10071 g_slist_free(list);
10076 static const char *ppc_cpu_lookup_alias(const char *alias)
10080 for (ai = 0; ppc_cpu_aliases[ai].alias != NULL; ai++) {
10081 if (strcmp(ppc_cpu_aliases[ai].alias, alias) == 0) {
10082 return ppc_cpu_aliases[ai].model;
10089 static ObjectClass *ppc_cpu_class_by_name(const char *name)
10091 char *cpu_model, *typename;
10096 /* Lookup by PVR if cpu_model is valid 8 digit hex number
10097 * (excl: 0x prefix if present)
10099 if (!qemu_strtoul(name, &p, 16, &pvr)) {
10100 int len = p - name;
10101 len = (len == 10) && (name[1] == 'x') ? len - 2 : len;
10102 if ((len == 8) && (*p == '\0')) {
10103 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr));
10107 cpu_model = g_ascii_strdown(name, -1);
10108 p = ppc_cpu_lookup_alias(cpu_model);
10111 cpu_model = g_strdup(p);
10114 typename = g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX, cpu_model);
10115 oc = object_class_by_name(typename);
10122 static void ppc_cpu_parse_featurestr(const char *type, char *features,
10125 Object *machine = qdev_get_machine();
10126 const PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(object_class_by_name(type));
10132 if (object_property_find(machine, "max-cpu-compat", NULL)) {
10135 char *s = features;
10136 Error *local_err = NULL;
10137 char *compat_str = NULL;
10140 * Backwards compatibility hack:
10142 * CPUs had a "compat=" property which didn't make sense for
10143 * anything except pseries. It was replaced by "max-cpu-compat"
10144 * machine option. This supports old command lines like
10145 * -cpu POWER8,compat=power7
10146 * By stripping the compat option and applying it to the machine
10147 * before passing it on to the cpu level parser.
10149 inpieces = g_strsplit(features, ",", 0);
10151 for (i = 0; inpieces[i]; i++) {
10152 if (g_str_has_prefix(inpieces[i], "compat=")) {
10153 compat_str = inpieces[i];
10156 if ((i != 0) && (s != features)) {
10157 s = g_stpcpy(s, ",");
10159 s = g_stpcpy(s, inpieces[i]);
10163 char *v = compat_str + strlen("compat=");
10164 object_property_set_str(machine, v, "max-cpu-compat", &local_err);
10166 g_strfreev(inpieces);
10168 error_propagate(errp, local_err);
10173 /* do property processing with generic handler */
10174 pcc->parent_parse_features(type, features, errp);
10177 PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
10179 ObjectClass *oc = OBJECT_CLASS(pcc);
10181 while (oc && !object_class_is_abstract(oc)) {
10182 oc = object_class_get_parent(oc);
10186 return POWERPC_CPU_CLASS(oc);
10189 /* Sort by PVR, ordering special case "host" last. */
10190 static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
10192 ObjectClass *oc_a = (ObjectClass *)a;
10193 ObjectClass *oc_b = (ObjectClass *)b;
10194 PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
10195 PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
10196 const char *name_a = object_class_get_name(oc_a);
10197 const char *name_b = object_class_get_name(oc_b);
10199 if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
10201 } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
10204 /* Avoid an integer overflow during subtraction */
10205 if (pcc_a->pvr < pcc_b->pvr) {
10207 } else if (pcc_a->pvr > pcc_b->pvr) {
10215 static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
10217 ObjectClass *oc = data;
10218 CPUListState *s = user_data;
10219 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
10220 DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
10221 const char *typename = object_class_get_name(oc);
10225 if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) {
10229 name = g_strndup(typename,
10230 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
10231 (*s->cpu_fprintf)(s->file, "PowerPC %-16s PVR %08x\n",
10233 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
10234 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
10235 ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
10237 if (alias_oc != oc) {
10241 * If running with KVM, we might update the family alias later, so
10242 * avoid printing the wrong alias here and use "preferred" instead
10244 if (strcmp(alias->alias, family->desc) == 0) {
10245 (*s->cpu_fprintf)(s->file,
10246 "PowerPC %-16s (alias for preferred %s CPU)\n",
10247 alias->alias, family->desc);
10249 (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
10250 alias->alias, name);
10256 void ppc_cpu_list(FILE *f, fprintf_function cpu_fprintf)
10260 .cpu_fprintf = cpu_fprintf,
10264 list = object_class_get_list(TYPE_POWERPC_CPU, false);
10265 list = g_slist_sort(list, ppc_cpu_list_compare);
10266 g_slist_foreach(list, ppc_cpu_list_entry, &s);
10267 g_slist_free(list);
10270 cpu_fprintf(f, "\n");
10271 cpu_fprintf(f, "PowerPC %-16s\n", "host");
10275 static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
10277 ObjectClass *oc = data;
10278 CpuDefinitionInfoList **first = user_data;
10279 const char *typename;
10280 CpuDefinitionInfoList *entry;
10281 CpuDefinitionInfo *info;
10283 typename = object_class_get_name(oc);
10284 info = g_malloc0(sizeof(*info));
10285 info->name = g_strndup(typename,
10286 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
10288 entry = g_malloc0(sizeof(*entry));
10289 entry->value = info;
10290 entry->next = *first;
10294 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
10296 CpuDefinitionInfoList *cpu_list = NULL;
10300 list = object_class_get_list(TYPE_POWERPC_CPU, false);
10301 g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
10302 g_slist_free(list);
10304 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
10305 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
10307 CpuDefinitionInfoList *entry;
10308 CpuDefinitionInfo *info;
10310 oc = ppc_cpu_class_by_name(alias->model);
10315 info = g_malloc0(sizeof(*info));
10316 info->name = g_strdup(alias->alias);
10317 info->q_typename = g_strdup(object_class_get_name(oc));
10319 entry = g_malloc0(sizeof(*entry));
10320 entry->value = info;
10321 entry->next = cpu_list;
10328 static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
10330 PowerPCCPU *cpu = POWERPC_CPU(cs);
10332 cpu->env.nip = value;
10335 static bool ppc_cpu_has_work(CPUState *cs)
10337 PowerPCCPU *cpu = POWERPC_CPU(cs);
10338 CPUPPCState *env = &cpu->env;
10340 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
10343 /* CPUClass::reset() */
10344 static void ppc_cpu_reset(CPUState *s)
10346 PowerPCCPU *cpu = POWERPC_CPU(s);
10347 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
10348 CPUPPCState *env = &cpu->env;
10352 pcc->parent_reset(s);
10354 msr = (target_ulong)0;
10355 msr |= (target_ulong)MSR_HVB;
10356 msr |= (target_ulong)0 << MSR_AP; /* TO BE CHECKED */
10357 msr |= (target_ulong)0 << MSR_SA; /* TO BE CHECKED */
10358 msr |= (target_ulong)1 << MSR_EP;
10359 #if defined(DO_SINGLE_STEP) && 0
10360 /* Single step trace mode */
10361 msr |= (target_ulong)1 << MSR_SE;
10362 msr |= (target_ulong)1 << MSR_BE;
10364 #if defined(CONFIG_USER_ONLY)
10365 msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */
10366 msr |= (target_ulong)1 << MSR_FE0; /* Allow floating point exceptions */
10367 msr |= (target_ulong)1 << MSR_FE1;
10368 msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */
10369 msr |= (target_ulong)1 << MSR_VSX; /* Allow VSX usage */
10370 msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */
10371 msr |= (target_ulong)1 << MSR_PR;
10372 #if defined(TARGET_PPC64)
10373 msr |= (target_ulong)1 << MSR_TM; /* Transactional memory */
10375 #if !defined(TARGET_WORDS_BIGENDIAN)
10376 msr |= (target_ulong)1 << MSR_LE; /* Little-endian user mode */
10377 if (!((env->msr_mask >> MSR_LE) & 1)) {
10378 fprintf(stderr, "Selected CPU does not support little-endian.\n");
10384 #if defined(TARGET_PPC64)
10385 if (env->mmu_model & POWERPC_MMU_64) {
10386 msr |= (1ULL << MSR_SF);
10390 hreg_store_msr(env, msr, 1);
10392 #if !defined(CONFIG_USER_ONLY)
10393 env->nip = env->hreset_vector | env->excp_prefix;
10394 if (env->mmu_model != POWERPC_MMU_REAL) {
10395 ppc_tlb_invalidate_all(env);
10399 hreg_compute_hflags(env);
10400 env->reserve_addr = (target_ulong)-1ULL;
10401 /* Be sure no exception or interrupt is pending */
10402 env->pending_interrupts = 0;
10403 s->exception_index = POWERPC_EXCP_NONE;
10404 env->error_code = 0;
10406 for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
10407 ppc_spr_t *spr = &env->spr_cb[i];
10412 env->spr[i] = spr->default_value;
10416 #ifndef CONFIG_USER_ONLY
10417 static bool ppc_cpu_is_big_endian(CPUState *cs)
10419 PowerPCCPU *cpu = POWERPC_CPU(cs);
10420 CPUPPCState *env = &cpu->env;
10422 cpu_synchronize_state(cs);
10428 static void ppc_cpu_instance_init(Object *obj)
10430 CPUState *cs = CPU(obj);
10431 PowerPCCPU *cpu = POWERPC_CPU(obj);
10432 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
10433 CPUPPCState *env = &cpu->env;
10436 cpu->vcpu_id = UNASSIGNED_CPU_INDEX;
10438 env->msr_mask = pcc->msr_mask;
10439 env->mmu_model = pcc->mmu_model;
10440 env->excp_model = pcc->excp_model;
10441 env->bus_model = pcc->bus_model;
10442 env->insns_flags = pcc->insns_flags;
10443 env->insns_flags2 = pcc->insns_flags2;
10444 env->flags = pcc->flags;
10445 env->bfd_mach = pcc->bfd_mach;
10446 env->check_pow = pcc->check_pow;
10448 /* Mark HV mode as supported if the CPU has an MSR_HV bit
10449 * in the msr_mask. The mask can later be cleared by PAPR
10450 * mode but the hv mode support will remain, thus enforcing
10451 * that we cannot use priv. instructions in guest in PAPR
10452 * mode. For 970 we currently simply don't set HV in msr_mask
10453 * thus simulating an "Apple mode" 970. If we ever want to
10454 * support 970 HV mode, we'll have to add a processor attribute
10457 #if !defined(CONFIG_USER_ONLY)
10458 env->has_hv_mode = !!(env->msr_mask & MSR_HVB);
10461 ppc_hash64_init(cpu);
10464 static void ppc_cpu_instance_finalize(Object *obj)
10466 PowerPCCPU *cpu = POWERPC_CPU(obj);
10468 ppc_hash64_finalize(cpu);
10471 static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr)
10473 return pcc->pvr == pvr;
10476 static gchar *ppc_gdb_arch_name(CPUState *cs)
10478 #if defined(TARGET_PPC64)
10479 return g_strdup("powerpc:common64");
10481 return g_strdup("powerpc:common");
10485 static void ppc_disas_set_info(CPUState *cs, disassemble_info *info)
10487 PowerPCCPU *cpu = POWERPC_CPU(cs);
10488 CPUPPCState *env = &cpu->env;
10490 if ((env->hflags >> MSR_LE) & 1) {
10491 info->endian = BFD_ENDIAN_LITTLE;
10493 info->mach = env->bfd_mach;
10494 if (!env->bfd_mach) {
10495 #ifdef TARGET_PPC64
10496 info->mach = bfd_mach_ppc64;
10498 info->mach = bfd_mach_ppc;
10501 info->disassembler_options = (char *)"any";
10502 info->print_insn = print_insn_ppc;
10504 info->cap_arch = CS_ARCH_PPC;
10505 #ifdef TARGET_PPC64
10506 info->cap_mode = CS_MODE_64;
10510 static Property ppc_cpu_properties[] = {
10511 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU, pre_2_8_migration, false),
10512 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU, pre_2_10_migration,
10514 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU, pre_3_0_migration,
10516 DEFINE_PROP_END_OF_LIST(),
10519 static void ppc_cpu_class_init(ObjectClass *oc, void *data)
10521 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
10522 CPUClass *cc = CPU_CLASS(oc);
10523 DeviceClass *dc = DEVICE_CLASS(oc);
10525 device_class_set_parent_realize(dc, ppc_cpu_realize,
10526 &pcc->parent_realize);
10527 device_class_set_parent_unrealize(dc, ppc_cpu_unrealize,
10528 &pcc->parent_unrealize);
10529 pcc->pvr_match = ppc_pvr_match_default;
10530 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_always;
10531 dc->props = ppc_cpu_properties;
10533 pcc->parent_reset = cc->reset;
10534 cc->reset = ppc_cpu_reset;
10536 cc->class_by_name = ppc_cpu_class_by_name;
10537 pcc->parent_parse_features = cc->parse_features;
10538 cc->parse_features = ppc_cpu_parse_featurestr;
10539 cc->has_work = ppc_cpu_has_work;
10540 cc->do_interrupt = ppc_cpu_do_interrupt;
10541 cc->cpu_exec_interrupt = ppc_cpu_exec_interrupt;
10542 cc->dump_state = ppc_cpu_dump_state;
10543 cc->dump_statistics = ppc_cpu_dump_statistics;
10544 cc->set_pc = ppc_cpu_set_pc;
10545 cc->gdb_read_register = ppc_cpu_gdb_read_register;
10546 cc->gdb_write_register = ppc_cpu_gdb_write_register;
10547 cc->do_unaligned_access = ppc_cpu_do_unaligned_access;
10548 #ifdef CONFIG_USER_ONLY
10549 cc->handle_mmu_fault = ppc_cpu_handle_mmu_fault;
10551 cc->get_phys_page_debug = ppc_cpu_get_phys_page_debug;
10552 cc->vmsd = &vmstate_ppc_cpu;
10554 #if defined(CONFIG_SOFTMMU)
10555 cc->write_elf64_note = ppc64_cpu_write_elf64_note;
10556 cc->write_elf32_note = ppc32_cpu_write_elf32_note;
10559 cc->gdb_num_core_regs = 71;
10560 #ifndef CONFIG_USER_ONLY
10561 cc->gdb_get_dynamic_xml = ppc_gdb_get_dynamic_xml;
10563 #ifdef USE_APPLE_GDB
10564 cc->gdb_read_register = ppc_cpu_gdb_read_register_apple;
10565 cc->gdb_write_register = ppc_cpu_gdb_write_register_apple;
10566 cc->gdb_num_core_regs = 71 + 32;
10569 cc->gdb_arch_name = ppc_gdb_arch_name;
10570 #if defined(TARGET_PPC64)
10571 cc->gdb_core_xml_file = "power64-core.xml";
10573 cc->gdb_core_xml_file = "power-core.xml";
10575 #ifndef CONFIG_USER_ONLY
10576 cc->virtio_is_big_endian = ppc_cpu_is_big_endian;
10579 cc->tcg_initialize = ppc_translate_init;
10581 cc->disas_set_info = ppc_disas_set_info;
10583 dc->fw_name = "PowerPC,UNKNOWN";
10586 static const TypeInfo ppc_cpu_type_info = {
10587 .name = TYPE_POWERPC_CPU,
10588 .parent = TYPE_CPU,
10589 .instance_size = sizeof(PowerPCCPU),
10590 .instance_init = ppc_cpu_instance_init,
10591 .instance_finalize = ppc_cpu_instance_finalize,
10593 .class_size = sizeof(PowerPCCPUClass),
10594 .class_init = ppc_cpu_class_init,
10597 static const TypeInfo ppc_vhyp_type_info = {
10598 .name = TYPE_PPC_VIRTUAL_HYPERVISOR,
10599 .parent = TYPE_INTERFACE,
10600 .class_size = sizeof(PPCVirtualHypervisorClass),
10603 static void ppc_cpu_register_types(void)
10605 type_register_static(&ppc_cpu_type_info);
10606 type_register_static(&ppc_vhyp_type_info);
10609 type_init(ppc_cpu_register_types)