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"
23 #include <sysemu/kvm.h>
25 #include "sysemu/arch_init.h"
26 #include "sysemu/cpus.h"
27 #include "cpu-models.h"
28 #include "mmu-hash32.h"
29 #include "mmu-hash64.h"
30 #include "qemu/error-report.h"
32 //#define PPC_DUMP_CPU
33 //#define PPC_DEBUG_SPR
34 //#define PPC_DUMP_SPR_ACCESSES
36 /* For user-mode emulation, we don't emulate any IRQ controller */
37 #if defined(CONFIG_USER_ONLY)
38 #define PPC_IRQ_INIT_FN(name) \
39 static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \
43 #define PPC_IRQ_INIT_FN(name) \
44 void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
50 PPC_IRQ_INIT_FN(POWER7
);
51 PPC_IRQ_INIT_FN(e500
);
54 * do nothing but store/retrieve spr value
56 static void spr_load_dump_spr(int sprn
)
58 #ifdef PPC_DUMP_SPR_ACCESSES
59 TCGv_i32 t0
= tcg_const_i32(sprn
);
60 gen_helper_load_dump_spr(cpu_env
, t0
);
61 tcg_temp_free_i32(t0
);
65 static void spr_read_generic (void *opaque
, int gprn
, int sprn
)
67 gen_load_spr(cpu_gpr
[gprn
], sprn
);
68 spr_load_dump_spr(sprn
);
71 static void spr_store_dump_spr(int sprn
)
73 #ifdef PPC_DUMP_SPR_ACCESSES
74 TCGv_i32 t0
= tcg_const_i32(sprn
);
75 gen_helper_store_dump_spr(cpu_env
, t0
);
76 tcg_temp_free_i32(t0
);
80 static void spr_write_generic (void *opaque
, int sprn
, int gprn
)
82 gen_store_spr(sprn
, cpu_gpr
[gprn
]);
83 spr_store_dump_spr(sprn
);
86 #if !defined(CONFIG_USER_ONLY)
87 static void spr_write_generic32(void *opaque
, int sprn
, int gprn
)
90 TCGv t0
= tcg_temp_new();
91 tcg_gen_ext32u_tl(t0
, cpu_gpr
[gprn
]);
92 gen_store_spr(sprn
, t0
);
94 spr_store_dump_spr(sprn
);
96 spr_write_generic(opaque
, sprn
, gprn
);
100 static void spr_write_clear (void *opaque
, int sprn
, int gprn
)
102 TCGv t0
= tcg_temp_new();
103 TCGv t1
= tcg_temp_new();
104 gen_load_spr(t0
, sprn
);
105 tcg_gen_neg_tl(t1
, cpu_gpr
[gprn
]);
106 tcg_gen_and_tl(t0
, t0
, t1
);
107 gen_store_spr(sprn
, t0
);
112 static void spr_access_nop(void *opaque
, int sprn
, int gprn
)
118 /* SPR common to all PowerPC */
120 static void spr_read_xer (void *opaque
, int gprn
, int sprn
)
122 gen_read_xer(cpu_gpr
[gprn
]);
125 static void spr_write_xer (void *opaque
, int sprn
, int gprn
)
127 gen_write_xer(cpu_gpr
[gprn
]);
131 static void spr_read_lr (void *opaque
, int gprn
, int sprn
)
133 tcg_gen_mov_tl(cpu_gpr
[gprn
], cpu_lr
);
136 static void spr_write_lr (void *opaque
, int sprn
, int gprn
)
138 tcg_gen_mov_tl(cpu_lr
, cpu_gpr
[gprn
]);
142 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
143 static void spr_read_cfar (void *opaque
, int gprn
, int sprn
)
145 tcg_gen_mov_tl(cpu_gpr
[gprn
], cpu_cfar
);
148 static void spr_write_cfar (void *opaque
, int sprn
, int gprn
)
150 tcg_gen_mov_tl(cpu_cfar
, cpu_gpr
[gprn
]);
152 #endif /* defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) */
155 static void spr_read_ctr (void *opaque
, int gprn
, int sprn
)
157 tcg_gen_mov_tl(cpu_gpr
[gprn
], cpu_ctr
);
160 static void spr_write_ctr (void *opaque
, int sprn
, int gprn
)
162 tcg_gen_mov_tl(cpu_ctr
, cpu_gpr
[gprn
]);
165 /* User read access to SPR */
171 static void spr_read_ureg (void *opaque
, int gprn
, int sprn
)
173 gen_load_spr(cpu_gpr
[gprn
], sprn
+ 0x10);
176 /* SPR common to all non-embedded PowerPC */
178 #if !defined(CONFIG_USER_ONLY)
179 static void spr_read_decr (void *opaque
, int gprn
, int sprn
)
184 gen_helper_load_decr(cpu_gpr
[gprn
], cpu_env
);
187 gen_stop_exception(opaque
);
191 static void spr_write_decr (void *opaque
, int sprn
, int gprn
)
196 gen_helper_store_decr(cpu_env
, cpu_gpr
[gprn
]);
199 gen_stop_exception(opaque
);
204 /* SPR common to all non-embedded PowerPC, except 601 */
206 static void spr_read_tbl (void *opaque
, int gprn
, int sprn
)
211 gen_helper_load_tbl(cpu_gpr
[gprn
], cpu_env
);
214 gen_stop_exception(opaque
);
218 static void spr_read_tbu (void *opaque
, int gprn
, int sprn
)
223 gen_helper_load_tbu(cpu_gpr
[gprn
], cpu_env
);
226 gen_stop_exception(opaque
);
230 __attribute__ (( unused
))
231 static void spr_read_atbl (void *opaque
, int gprn
, int sprn
)
233 gen_helper_load_atbl(cpu_gpr
[gprn
], cpu_env
);
236 __attribute__ (( unused
))
237 static void spr_read_atbu (void *opaque
, int gprn
, int sprn
)
239 gen_helper_load_atbu(cpu_gpr
[gprn
], cpu_env
);
242 #if !defined(CONFIG_USER_ONLY)
243 static void spr_write_tbl (void *opaque
, int sprn
, int gprn
)
248 gen_helper_store_tbl(cpu_env
, cpu_gpr
[gprn
]);
251 gen_stop_exception(opaque
);
255 static void spr_write_tbu (void *opaque
, int sprn
, int gprn
)
260 gen_helper_store_tbu(cpu_env
, cpu_gpr
[gprn
]);
263 gen_stop_exception(opaque
);
267 __attribute__ (( unused
))
268 static void spr_write_atbl (void *opaque
, int sprn
, int gprn
)
270 gen_helper_store_atbl(cpu_env
, cpu_gpr
[gprn
]);
273 __attribute__ (( unused
))
274 static void spr_write_atbu (void *opaque
, int sprn
, int gprn
)
276 gen_helper_store_atbu(cpu_env
, cpu_gpr
[gprn
]);
279 #if defined(TARGET_PPC64)
280 __attribute__ (( unused
))
281 static void spr_read_purr (void *opaque
, int gprn
, int sprn
)
283 gen_helper_load_purr(cpu_gpr
[gprn
], cpu_env
);
288 #if !defined(CONFIG_USER_ONLY)
289 /* IBAT0U...IBAT0U */
290 /* IBAT0L...IBAT7L */
291 static void spr_read_ibat (void *opaque
, int gprn
, int sprn
)
293 tcg_gen_ld_tl(cpu_gpr
[gprn
], cpu_env
, offsetof(CPUPPCState
, IBAT
[sprn
& 1][(sprn
- SPR_IBAT0U
) / 2]));
296 static void spr_read_ibat_h (void *opaque
, int gprn
, int sprn
)
298 tcg_gen_ld_tl(cpu_gpr
[gprn
], cpu_env
, offsetof(CPUPPCState
, IBAT
[sprn
& 1][(sprn
- SPR_IBAT4U
) / 2]));
301 static void spr_write_ibatu (void *opaque
, int sprn
, int gprn
)
303 TCGv_i32 t0
= tcg_const_i32((sprn
- SPR_IBAT0U
) / 2);
304 gen_helper_store_ibatu(cpu_env
, t0
, cpu_gpr
[gprn
]);
305 tcg_temp_free_i32(t0
);
308 static void spr_write_ibatu_h (void *opaque
, int sprn
, int gprn
)
310 TCGv_i32 t0
= tcg_const_i32(((sprn
- SPR_IBAT4U
) / 2) + 4);
311 gen_helper_store_ibatu(cpu_env
, t0
, cpu_gpr
[gprn
]);
312 tcg_temp_free_i32(t0
);
315 static void spr_write_ibatl (void *opaque
, int sprn
, int gprn
)
317 TCGv_i32 t0
= tcg_const_i32((sprn
- SPR_IBAT0L
) / 2);
318 gen_helper_store_ibatl(cpu_env
, t0
, cpu_gpr
[gprn
]);
319 tcg_temp_free_i32(t0
);
322 static void spr_write_ibatl_h (void *opaque
, int sprn
, int gprn
)
324 TCGv_i32 t0
= tcg_const_i32(((sprn
- SPR_IBAT4L
) / 2) + 4);
325 gen_helper_store_ibatl(cpu_env
, t0
, cpu_gpr
[gprn
]);
326 tcg_temp_free_i32(t0
);
329 /* DBAT0U...DBAT7U */
330 /* DBAT0L...DBAT7L */
331 static void spr_read_dbat (void *opaque
, int gprn
, int sprn
)
333 tcg_gen_ld_tl(cpu_gpr
[gprn
], cpu_env
, offsetof(CPUPPCState
, DBAT
[sprn
& 1][(sprn
- SPR_DBAT0U
) / 2]));
336 static void spr_read_dbat_h (void *opaque
, int gprn
, int sprn
)
338 tcg_gen_ld_tl(cpu_gpr
[gprn
], cpu_env
, offsetof(CPUPPCState
, DBAT
[sprn
& 1][((sprn
- SPR_DBAT4U
) / 2) + 4]));
341 static void spr_write_dbatu (void *opaque
, int sprn
, int gprn
)
343 TCGv_i32 t0
= tcg_const_i32((sprn
- SPR_DBAT0U
) / 2);
344 gen_helper_store_dbatu(cpu_env
, t0
, cpu_gpr
[gprn
]);
345 tcg_temp_free_i32(t0
);
348 static void spr_write_dbatu_h (void *opaque
, int sprn
, int gprn
)
350 TCGv_i32 t0
= tcg_const_i32(((sprn
- SPR_DBAT4U
) / 2) + 4);
351 gen_helper_store_dbatu(cpu_env
, t0
, cpu_gpr
[gprn
]);
352 tcg_temp_free_i32(t0
);
355 static void spr_write_dbatl (void *opaque
, int sprn
, int gprn
)
357 TCGv_i32 t0
= tcg_const_i32((sprn
- SPR_DBAT0L
) / 2);
358 gen_helper_store_dbatl(cpu_env
, t0
, cpu_gpr
[gprn
]);
359 tcg_temp_free_i32(t0
);
362 static void spr_write_dbatl_h (void *opaque
, int sprn
, int gprn
)
364 TCGv_i32 t0
= tcg_const_i32(((sprn
- SPR_DBAT4L
) / 2) + 4);
365 gen_helper_store_dbatl(cpu_env
, t0
, cpu_gpr
[gprn
]);
366 tcg_temp_free_i32(t0
);
370 static void spr_write_sdr1 (void *opaque
, int sprn
, int gprn
)
372 gen_helper_store_sdr1(cpu_env
, cpu_gpr
[gprn
]);
375 /* 64 bits PowerPC specific SPRs */
376 #if defined(TARGET_PPC64)
377 static void spr_read_hior (void *opaque
, int gprn
, int sprn
)
379 tcg_gen_ld_tl(cpu_gpr
[gprn
], cpu_env
, offsetof(CPUPPCState
, excp_prefix
));
382 static void spr_write_hior (void *opaque
, int sprn
, int gprn
)
384 TCGv t0
= tcg_temp_new();
385 tcg_gen_andi_tl(t0
, cpu_gpr
[gprn
], 0x3FFFFF00000ULL
);
386 tcg_gen_st_tl(t0
, cpu_env
, offsetof(CPUPPCState
, excp_prefix
));
392 /* PowerPC 601 specific registers */
394 static void spr_read_601_rtcl (void *opaque
, int gprn
, int sprn
)
396 gen_helper_load_601_rtcl(cpu_gpr
[gprn
], cpu_env
);
399 static void spr_read_601_rtcu (void *opaque
, int gprn
, int sprn
)
401 gen_helper_load_601_rtcu(cpu_gpr
[gprn
], cpu_env
);
404 #if !defined(CONFIG_USER_ONLY)
405 static void spr_write_601_rtcu (void *opaque
, int sprn
, int gprn
)
407 gen_helper_store_601_rtcu(cpu_env
, cpu_gpr
[gprn
]);
410 static void spr_write_601_rtcl (void *opaque
, int sprn
, int gprn
)
412 gen_helper_store_601_rtcl(cpu_env
, cpu_gpr
[gprn
]);
415 static void spr_write_hid0_601 (void *opaque
, int sprn
, int gprn
)
417 DisasContext
*ctx
= opaque
;
419 gen_helper_store_hid0_601(cpu_env
, cpu_gpr
[gprn
]);
420 /* Must stop the translation as endianness may have changed */
421 gen_stop_exception(ctx
);
426 #if !defined(CONFIG_USER_ONLY)
427 static void spr_read_601_ubat (void *opaque
, int gprn
, int sprn
)
429 tcg_gen_ld_tl(cpu_gpr
[gprn
], cpu_env
, offsetof(CPUPPCState
, IBAT
[sprn
& 1][(sprn
- SPR_IBAT0U
) / 2]));
432 static void spr_write_601_ubatu (void *opaque
, int sprn
, int gprn
)
434 TCGv_i32 t0
= tcg_const_i32((sprn
- SPR_IBAT0U
) / 2);
435 gen_helper_store_601_batl(cpu_env
, t0
, cpu_gpr
[gprn
]);
436 tcg_temp_free_i32(t0
);
439 static void spr_write_601_ubatl (void *opaque
, int sprn
, int gprn
)
441 TCGv_i32 t0
= tcg_const_i32((sprn
- SPR_IBAT0U
) / 2);
442 gen_helper_store_601_batu(cpu_env
, t0
, cpu_gpr
[gprn
]);
443 tcg_temp_free_i32(t0
);
447 /* PowerPC 40x specific registers */
448 #if !defined(CONFIG_USER_ONLY)
449 static void spr_read_40x_pit (void *opaque
, int gprn
, int sprn
)
451 gen_helper_load_40x_pit(cpu_gpr
[gprn
], cpu_env
);
454 static void spr_write_40x_pit (void *opaque
, int sprn
, int gprn
)
456 gen_helper_store_40x_pit(cpu_env
, cpu_gpr
[gprn
]);
459 static void spr_write_40x_dbcr0 (void *opaque
, int sprn
, int gprn
)
461 DisasContext
*ctx
= opaque
;
463 gen_helper_store_40x_dbcr0(cpu_env
, cpu_gpr
[gprn
]);
464 /* We must stop translation as we may have rebooted */
465 gen_stop_exception(ctx
);
468 static void spr_write_40x_sler (void *opaque
, int sprn
, int gprn
)
470 gen_helper_store_40x_sler(cpu_env
, cpu_gpr
[gprn
]);
473 static void spr_write_booke_tcr (void *opaque
, int sprn
, int gprn
)
475 gen_helper_store_booke_tcr(cpu_env
, cpu_gpr
[gprn
]);
478 static void spr_write_booke_tsr (void *opaque
, int sprn
, int gprn
)
480 gen_helper_store_booke_tsr(cpu_env
, cpu_gpr
[gprn
]);
484 /* PowerPC 403 specific registers */
485 /* PBL1 / PBU1 / PBL2 / PBU2 */
486 #if !defined(CONFIG_USER_ONLY)
487 static void spr_read_403_pbr (void *opaque
, int gprn
, int sprn
)
489 tcg_gen_ld_tl(cpu_gpr
[gprn
], cpu_env
, offsetof(CPUPPCState
, pb
[sprn
- SPR_403_PBL1
]));
492 static void spr_write_403_pbr (void *opaque
, int sprn
, int gprn
)
494 TCGv_i32 t0
= tcg_const_i32(sprn
- SPR_403_PBL1
);
495 gen_helper_store_403_pbr(cpu_env
, t0
, cpu_gpr
[gprn
]);
496 tcg_temp_free_i32(t0
);
499 static void spr_write_pir (void *opaque
, int sprn
, int gprn
)
501 TCGv t0
= tcg_temp_new();
502 tcg_gen_andi_tl(t0
, cpu_gpr
[gprn
], 0xF);
503 gen_store_spr(SPR_PIR
, t0
);
508 /* SPE specific registers */
509 static void spr_read_spefscr (void *opaque
, int gprn
, int sprn
)
511 TCGv_i32 t0
= tcg_temp_new_i32();
512 tcg_gen_ld_i32(t0
, cpu_env
, offsetof(CPUPPCState
, spe_fscr
));
513 tcg_gen_extu_i32_tl(cpu_gpr
[gprn
], t0
);
514 tcg_temp_free_i32(t0
);
517 static void spr_write_spefscr (void *opaque
, int sprn
, int gprn
)
519 TCGv_i32 t0
= tcg_temp_new_i32();
520 tcg_gen_trunc_tl_i32(t0
, cpu_gpr
[gprn
]);
521 tcg_gen_st_i32(t0
, cpu_env
, offsetof(CPUPPCState
, spe_fscr
));
522 tcg_temp_free_i32(t0
);
525 #if !defined(CONFIG_USER_ONLY)
526 /* Callback used to write the exception vector base */
527 static void spr_write_excp_prefix (void *opaque
, int sprn
, int gprn
)
529 TCGv t0
= tcg_temp_new();
530 tcg_gen_ld_tl(t0
, cpu_env
, offsetof(CPUPPCState
, ivpr_mask
));
531 tcg_gen_and_tl(t0
, t0
, cpu_gpr
[gprn
]);
532 tcg_gen_st_tl(t0
, cpu_env
, offsetof(CPUPPCState
, excp_prefix
));
533 gen_store_spr(sprn
, t0
);
537 static void spr_write_excp_vector (void *opaque
, int sprn
, int gprn
)
539 DisasContext
*ctx
= opaque
;
542 if (sprn
>= SPR_BOOKE_IVOR0
&& sprn
<= SPR_BOOKE_IVOR15
) {
543 sprn_offs
= sprn
- SPR_BOOKE_IVOR0
;
544 } else if (sprn
>= SPR_BOOKE_IVOR32
&& sprn
<= SPR_BOOKE_IVOR37
) {
545 sprn_offs
= sprn
- SPR_BOOKE_IVOR32
+ 32;
546 } else if (sprn
>= SPR_BOOKE_IVOR38
&& sprn
<= SPR_BOOKE_IVOR42
) {
547 sprn_offs
= sprn
- SPR_BOOKE_IVOR38
+ 38;
549 printf("Trying to write an unknown exception vector %d %03x\n",
551 gen_inval_exception(ctx
, POWERPC_EXCP_PRIV_REG
);
555 TCGv t0
= tcg_temp_new();
556 tcg_gen_ld_tl(t0
, cpu_env
, offsetof(CPUPPCState
, ivor_mask
));
557 tcg_gen_and_tl(t0
, t0
, cpu_gpr
[gprn
]);
558 tcg_gen_st_tl(t0
, cpu_env
, offsetof(CPUPPCState
, excp_vectors
[sprn_offs
]));
559 gen_store_spr(sprn
, t0
);
564 static inline void vscr_init (CPUPPCState
*env
, uint32_t val
)
567 /* Altivec always uses round-to-nearest */
568 set_float_rounding_mode(float_round_nearest_even
, &env
->vec_status
);
569 set_flush_to_zero(vscr_nj
, &env
->vec_status
);
572 #ifdef CONFIG_USER_ONLY
573 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
574 oea_read, oea_write, one_reg_id, initial_value) \
575 _spr_register(env, num, name, uea_read, uea_write, initial_value)
577 #if !defined(CONFIG_KVM)
578 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
579 oea_read, oea_write, one_reg_id, initial_value) \
580 _spr_register(env, num, name, uea_read, uea_write, \
581 oea_read, oea_write, initial_value)
583 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
584 oea_read, oea_write, one_reg_id, initial_value) \
585 _spr_register(env, num, name, uea_read, uea_write, \
586 oea_read, oea_write, one_reg_id, initial_value)
590 #define spr_register(env, num, name, uea_read, uea_write, \
591 oea_read, oea_write, initial_value) \
592 spr_register_kvm(env, num, name, uea_read, uea_write, \
593 oea_read, oea_write, 0, initial_value)
595 static inline void _spr_register(CPUPPCState
*env
, int num
,
597 void (*uea_read
)(void *opaque
, int gprn
, int sprn
),
598 void (*uea_write
)(void *opaque
, int sprn
, int gprn
),
599 #if !defined(CONFIG_USER_ONLY)
601 void (*oea_read
)(void *opaque
, int gprn
, int sprn
),
602 void (*oea_write
)(void *opaque
, int sprn
, int gprn
),
604 #if defined(CONFIG_KVM)
607 target_ulong initial_value
)
611 spr
= &env
->spr_cb
[num
];
612 if (spr
->name
!= NULL
||env
-> spr
[num
] != 0x00000000 ||
613 #if !defined(CONFIG_USER_ONLY)
614 spr
->oea_read
!= NULL
|| spr
->oea_write
!= NULL
||
616 spr
->uea_read
!= NULL
|| spr
->uea_write
!= NULL
) {
617 printf("Error: Trying to register SPR %d (%03x) twice !\n", num
, num
);
620 #if defined(PPC_DEBUG_SPR)
621 printf("*** register spr %d (%03x) %s val " TARGET_FMT_lx
"\n", num
, num
,
622 name
, initial_value
);
625 spr
->uea_read
= uea_read
;
626 spr
->uea_write
= uea_write
;
627 #if !defined(CONFIG_USER_ONLY)
628 spr
->oea_read
= oea_read
;
629 spr
->oea_write
= oea_write
;
631 #if defined(CONFIG_KVM)
632 spr
->one_reg_id
= one_reg_id
,
634 env
->spr
[num
] = initial_value
;
637 /* Generic PowerPC SPRs */
638 static void gen_spr_generic (CPUPPCState
*env
)
640 /* Integer processing */
641 spr_register(env
, SPR_XER
, "XER",
642 &spr_read_xer
, &spr_write_xer
,
643 &spr_read_xer
, &spr_write_xer
,
646 spr_register(env
, SPR_LR
, "LR",
647 &spr_read_lr
, &spr_write_lr
,
648 &spr_read_lr
, &spr_write_lr
,
650 spr_register(env
, SPR_CTR
, "CTR",
651 &spr_read_ctr
, &spr_write_ctr
,
652 &spr_read_ctr
, &spr_write_ctr
,
654 /* Interrupt processing */
655 spr_register(env
, SPR_SRR0
, "SRR0",
656 SPR_NOACCESS
, SPR_NOACCESS
,
657 &spr_read_generic
, &spr_write_generic
,
659 spr_register(env
, SPR_SRR1
, "SRR1",
660 SPR_NOACCESS
, SPR_NOACCESS
,
661 &spr_read_generic
, &spr_write_generic
,
663 /* Processor control */
664 spr_register(env
, SPR_SPRG0
, "SPRG0",
665 SPR_NOACCESS
, SPR_NOACCESS
,
666 &spr_read_generic
, &spr_write_generic
,
668 spr_register(env
, SPR_SPRG1
, "SPRG1",
669 SPR_NOACCESS
, SPR_NOACCESS
,
670 &spr_read_generic
, &spr_write_generic
,
672 spr_register(env
, SPR_SPRG2
, "SPRG2",
673 SPR_NOACCESS
, SPR_NOACCESS
,
674 &spr_read_generic
, &spr_write_generic
,
676 spr_register(env
, SPR_SPRG3
, "SPRG3",
677 SPR_NOACCESS
, SPR_NOACCESS
,
678 &spr_read_generic
, &spr_write_generic
,
682 /* SPR common to all non-embedded PowerPC, including 601 */
683 static void gen_spr_ne_601 (CPUPPCState
*env
)
685 /* Exception processing */
686 spr_register_kvm(env
, SPR_DSISR
, "DSISR",
687 SPR_NOACCESS
, SPR_NOACCESS
,
688 &spr_read_generic
, &spr_write_generic
,
689 KVM_REG_PPC_DSISR
, 0x00000000);
690 spr_register_kvm(env
, SPR_DAR
, "DAR",
691 SPR_NOACCESS
, SPR_NOACCESS
,
692 &spr_read_generic
, &spr_write_generic
,
693 KVM_REG_PPC_DAR
, 0x00000000);
695 spr_register(env
, SPR_DECR
, "DECR",
696 SPR_NOACCESS
, SPR_NOACCESS
,
697 &spr_read_decr
, &spr_write_decr
,
699 /* Memory management */
700 spr_register(env
, SPR_SDR1
, "SDR1",
701 SPR_NOACCESS
, SPR_NOACCESS
,
702 &spr_read_generic
, &spr_write_sdr1
,
707 static void gen_low_BATs (CPUPPCState
*env
)
709 #if !defined(CONFIG_USER_ONLY)
710 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
711 SPR_NOACCESS
, SPR_NOACCESS
,
712 &spr_read_ibat
, &spr_write_ibatu
,
714 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
715 SPR_NOACCESS
, SPR_NOACCESS
,
716 &spr_read_ibat
, &spr_write_ibatl
,
718 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
719 SPR_NOACCESS
, SPR_NOACCESS
,
720 &spr_read_ibat
, &spr_write_ibatu
,
722 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
723 SPR_NOACCESS
, SPR_NOACCESS
,
724 &spr_read_ibat
, &spr_write_ibatl
,
726 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
727 SPR_NOACCESS
, SPR_NOACCESS
,
728 &spr_read_ibat
, &spr_write_ibatu
,
730 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
731 SPR_NOACCESS
, SPR_NOACCESS
,
732 &spr_read_ibat
, &spr_write_ibatl
,
734 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
735 SPR_NOACCESS
, SPR_NOACCESS
,
736 &spr_read_ibat
, &spr_write_ibatu
,
738 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
739 SPR_NOACCESS
, SPR_NOACCESS
,
740 &spr_read_ibat
, &spr_write_ibatl
,
742 spr_register(env
, SPR_DBAT0U
, "DBAT0U",
743 SPR_NOACCESS
, SPR_NOACCESS
,
744 &spr_read_dbat
, &spr_write_dbatu
,
746 spr_register(env
, SPR_DBAT0L
, "DBAT0L",
747 SPR_NOACCESS
, SPR_NOACCESS
,
748 &spr_read_dbat
, &spr_write_dbatl
,
750 spr_register(env
, SPR_DBAT1U
, "DBAT1U",
751 SPR_NOACCESS
, SPR_NOACCESS
,
752 &spr_read_dbat
, &spr_write_dbatu
,
754 spr_register(env
, SPR_DBAT1L
, "DBAT1L",
755 SPR_NOACCESS
, SPR_NOACCESS
,
756 &spr_read_dbat
, &spr_write_dbatl
,
758 spr_register(env
, SPR_DBAT2U
, "DBAT2U",
759 SPR_NOACCESS
, SPR_NOACCESS
,
760 &spr_read_dbat
, &spr_write_dbatu
,
762 spr_register(env
, SPR_DBAT2L
, "DBAT2L",
763 SPR_NOACCESS
, SPR_NOACCESS
,
764 &spr_read_dbat
, &spr_write_dbatl
,
766 spr_register(env
, SPR_DBAT3U
, "DBAT3U",
767 SPR_NOACCESS
, SPR_NOACCESS
,
768 &spr_read_dbat
, &spr_write_dbatu
,
770 spr_register(env
, SPR_DBAT3L
, "DBAT3L",
771 SPR_NOACCESS
, SPR_NOACCESS
,
772 &spr_read_dbat
, &spr_write_dbatl
,
779 static void gen_high_BATs (CPUPPCState
*env
)
781 #if !defined(CONFIG_USER_ONLY)
782 spr_register(env
, SPR_IBAT4U
, "IBAT4U",
783 SPR_NOACCESS
, SPR_NOACCESS
,
784 &spr_read_ibat_h
, &spr_write_ibatu_h
,
786 spr_register(env
, SPR_IBAT4L
, "IBAT4L",
787 SPR_NOACCESS
, SPR_NOACCESS
,
788 &spr_read_ibat_h
, &spr_write_ibatl_h
,
790 spr_register(env
, SPR_IBAT5U
, "IBAT5U",
791 SPR_NOACCESS
, SPR_NOACCESS
,
792 &spr_read_ibat_h
, &spr_write_ibatu_h
,
794 spr_register(env
, SPR_IBAT5L
, "IBAT5L",
795 SPR_NOACCESS
, SPR_NOACCESS
,
796 &spr_read_ibat_h
, &spr_write_ibatl_h
,
798 spr_register(env
, SPR_IBAT6U
, "IBAT6U",
799 SPR_NOACCESS
, SPR_NOACCESS
,
800 &spr_read_ibat_h
, &spr_write_ibatu_h
,
802 spr_register(env
, SPR_IBAT6L
, "IBAT6L",
803 SPR_NOACCESS
, SPR_NOACCESS
,
804 &spr_read_ibat_h
, &spr_write_ibatl_h
,
806 spr_register(env
, SPR_IBAT7U
, "IBAT7U",
807 SPR_NOACCESS
, SPR_NOACCESS
,
808 &spr_read_ibat_h
, &spr_write_ibatu_h
,
810 spr_register(env
, SPR_IBAT7L
, "IBAT7L",
811 SPR_NOACCESS
, SPR_NOACCESS
,
812 &spr_read_ibat_h
, &spr_write_ibatl_h
,
814 spr_register(env
, SPR_DBAT4U
, "DBAT4U",
815 SPR_NOACCESS
, SPR_NOACCESS
,
816 &spr_read_dbat_h
, &spr_write_dbatu_h
,
818 spr_register(env
, SPR_DBAT4L
, "DBAT4L",
819 SPR_NOACCESS
, SPR_NOACCESS
,
820 &spr_read_dbat_h
, &spr_write_dbatl_h
,
822 spr_register(env
, SPR_DBAT5U
, "DBAT5U",
823 SPR_NOACCESS
, SPR_NOACCESS
,
824 &spr_read_dbat_h
, &spr_write_dbatu_h
,
826 spr_register(env
, SPR_DBAT5L
, "DBAT5L",
827 SPR_NOACCESS
, SPR_NOACCESS
,
828 &spr_read_dbat_h
, &spr_write_dbatl_h
,
830 spr_register(env
, SPR_DBAT6U
, "DBAT6U",
831 SPR_NOACCESS
, SPR_NOACCESS
,
832 &spr_read_dbat_h
, &spr_write_dbatu_h
,
834 spr_register(env
, SPR_DBAT6L
, "DBAT6L",
835 SPR_NOACCESS
, SPR_NOACCESS
,
836 &spr_read_dbat_h
, &spr_write_dbatl_h
,
838 spr_register(env
, SPR_DBAT7U
, "DBAT7U",
839 SPR_NOACCESS
, SPR_NOACCESS
,
840 &spr_read_dbat_h
, &spr_write_dbatu_h
,
842 spr_register(env
, SPR_DBAT7L
, "DBAT7L",
843 SPR_NOACCESS
, SPR_NOACCESS
,
844 &spr_read_dbat_h
, &spr_write_dbatl_h
,
850 /* Generic PowerPC time base */
851 static void gen_tbl (CPUPPCState
*env
)
853 spr_register(env
, SPR_VTBL
, "TBL",
854 &spr_read_tbl
, SPR_NOACCESS
,
855 &spr_read_tbl
, SPR_NOACCESS
,
857 spr_register(env
, SPR_TBL
, "TBL",
858 &spr_read_tbl
, SPR_NOACCESS
,
859 &spr_read_tbl
, &spr_write_tbl
,
861 spr_register(env
, SPR_VTBU
, "TBU",
862 &spr_read_tbu
, SPR_NOACCESS
,
863 &spr_read_tbu
, SPR_NOACCESS
,
865 spr_register(env
, SPR_TBU
, "TBU",
866 &spr_read_tbu
, SPR_NOACCESS
,
867 &spr_read_tbu
, &spr_write_tbu
,
871 /* Softare table search registers */
872 static void gen_6xx_7xx_soft_tlb (CPUPPCState
*env
, int nb_tlbs
, int nb_ways
)
874 #if !defined(CONFIG_USER_ONLY)
875 env
->nb_tlb
= nb_tlbs
;
876 env
->nb_ways
= nb_ways
;
878 env
->tlb_type
= TLB_6XX
;
879 spr_register(env
, SPR_DMISS
, "DMISS",
880 SPR_NOACCESS
, SPR_NOACCESS
,
881 &spr_read_generic
, SPR_NOACCESS
,
883 spr_register(env
, SPR_DCMP
, "DCMP",
884 SPR_NOACCESS
, SPR_NOACCESS
,
885 &spr_read_generic
, SPR_NOACCESS
,
887 spr_register(env
, SPR_HASH1
, "HASH1",
888 SPR_NOACCESS
, SPR_NOACCESS
,
889 &spr_read_generic
, SPR_NOACCESS
,
891 spr_register(env
, SPR_HASH2
, "HASH2",
892 SPR_NOACCESS
, SPR_NOACCESS
,
893 &spr_read_generic
, SPR_NOACCESS
,
895 spr_register(env
, SPR_IMISS
, "IMISS",
896 SPR_NOACCESS
, SPR_NOACCESS
,
897 &spr_read_generic
, SPR_NOACCESS
,
899 spr_register(env
, SPR_ICMP
, "ICMP",
900 SPR_NOACCESS
, SPR_NOACCESS
,
901 &spr_read_generic
, SPR_NOACCESS
,
903 spr_register(env
, SPR_RPA
, "RPA",
904 SPR_NOACCESS
, SPR_NOACCESS
,
905 &spr_read_generic
, &spr_write_generic
,
910 /* SPR common to MPC755 and G2 */
911 static void gen_spr_G2_755 (CPUPPCState
*env
)
914 spr_register(env
, SPR_SPRG4
, "SPRG4",
915 SPR_NOACCESS
, SPR_NOACCESS
,
916 &spr_read_generic
, &spr_write_generic
,
918 spr_register(env
, SPR_SPRG5
, "SPRG5",
919 SPR_NOACCESS
, SPR_NOACCESS
,
920 &spr_read_generic
, &spr_write_generic
,
922 spr_register(env
, SPR_SPRG6
, "SPRG6",
923 SPR_NOACCESS
, SPR_NOACCESS
,
924 &spr_read_generic
, &spr_write_generic
,
926 spr_register(env
, SPR_SPRG7
, "SPRG7",
927 SPR_NOACCESS
, SPR_NOACCESS
,
928 &spr_read_generic
, &spr_write_generic
,
932 /* SPR common to all 7xx PowerPC implementations */
933 static void gen_spr_7xx (CPUPPCState
*env
)
936 /* XXX : not implemented */
937 spr_register_kvm(env
, SPR_DABR
, "DABR",
938 SPR_NOACCESS
, SPR_NOACCESS
,
939 &spr_read_generic
, &spr_write_generic
,
940 KVM_REG_PPC_DABR
, 0x00000000);
941 /* XXX : not implemented */
942 spr_register(env
, SPR_IABR
, "IABR",
943 SPR_NOACCESS
, SPR_NOACCESS
,
944 &spr_read_generic
, &spr_write_generic
,
946 /* Cache management */
947 /* XXX : not implemented */
948 spr_register(env
, SPR_ICTC
, "ICTC",
949 SPR_NOACCESS
, SPR_NOACCESS
,
950 &spr_read_generic
, &spr_write_generic
,
952 /* Performance monitors */
953 /* XXX : not implemented */
954 spr_register(env
, SPR_MMCR0
, "MMCR0",
955 SPR_NOACCESS
, SPR_NOACCESS
,
956 &spr_read_generic
, &spr_write_generic
,
958 /* XXX : not implemented */
959 spr_register(env
, SPR_MMCR1
, "MMCR1",
960 SPR_NOACCESS
, SPR_NOACCESS
,
961 &spr_read_generic
, &spr_write_generic
,
963 /* XXX : not implemented */
964 spr_register(env
, SPR_PMC1
, "PMC1",
965 SPR_NOACCESS
, SPR_NOACCESS
,
966 &spr_read_generic
, &spr_write_generic
,
968 /* XXX : not implemented */
969 spr_register(env
, SPR_PMC2
, "PMC2",
970 SPR_NOACCESS
, SPR_NOACCESS
,
971 &spr_read_generic
, &spr_write_generic
,
973 /* XXX : not implemented */
974 spr_register(env
, SPR_PMC3
, "PMC3",
975 SPR_NOACCESS
, SPR_NOACCESS
,
976 &spr_read_generic
, &spr_write_generic
,
978 /* XXX : not implemented */
979 spr_register(env
, SPR_PMC4
, "PMC4",
980 SPR_NOACCESS
, SPR_NOACCESS
,
981 &spr_read_generic
, &spr_write_generic
,
983 /* XXX : not implemented */
984 spr_register(env
, SPR_SIAR
, "SIAR",
985 SPR_NOACCESS
, SPR_NOACCESS
,
986 &spr_read_generic
, SPR_NOACCESS
,
988 /* XXX : not implemented */
989 spr_register(env
, SPR_UMMCR0
, "UMMCR0",
990 &spr_read_ureg
, SPR_NOACCESS
,
991 &spr_read_ureg
, SPR_NOACCESS
,
993 /* XXX : not implemented */
994 spr_register(env
, SPR_UMMCR1
, "UMMCR1",
995 &spr_read_ureg
, SPR_NOACCESS
,
996 &spr_read_ureg
, SPR_NOACCESS
,
998 /* XXX : not implemented */
999 spr_register(env
, SPR_UPMC1
, "UPMC1",
1000 &spr_read_ureg
, SPR_NOACCESS
,
1001 &spr_read_ureg
, SPR_NOACCESS
,
1003 /* XXX : not implemented */
1004 spr_register(env
, SPR_UPMC2
, "UPMC2",
1005 &spr_read_ureg
, SPR_NOACCESS
,
1006 &spr_read_ureg
, SPR_NOACCESS
,
1008 /* XXX : not implemented */
1009 spr_register(env
, SPR_UPMC3
, "UPMC3",
1010 &spr_read_ureg
, SPR_NOACCESS
,
1011 &spr_read_ureg
, SPR_NOACCESS
,
1013 /* XXX : not implemented */
1014 spr_register(env
, SPR_UPMC4
, "UPMC4",
1015 &spr_read_ureg
, SPR_NOACCESS
,
1016 &spr_read_ureg
, SPR_NOACCESS
,
1018 /* XXX : not implemented */
1019 spr_register(env
, SPR_USIAR
, "USIAR",
1020 &spr_read_ureg
, SPR_NOACCESS
,
1021 &spr_read_ureg
, SPR_NOACCESS
,
1023 /* External access control */
1024 /* XXX : not implemented */
1025 spr_register(env
, SPR_EAR
, "EAR",
1026 SPR_NOACCESS
, SPR_NOACCESS
,
1027 &spr_read_generic
, &spr_write_generic
,
1032 #ifndef CONFIG_USER_ONLY
1033 static void spr_read_uamr (void *opaque
, int gprn
, int sprn
)
1035 gen_load_spr(cpu_gpr
[gprn
], SPR_AMR
);
1036 spr_load_dump_spr(SPR_AMR
);
1039 static void spr_write_uamr (void *opaque
, int sprn
, int gprn
)
1041 gen_store_spr(SPR_AMR
, cpu_gpr
[gprn
]);
1042 spr_store_dump_spr(SPR_AMR
);
1045 static void spr_write_uamr_pr (void *opaque
, int sprn
, int gprn
)
1047 TCGv t0
= tcg_temp_new();
1049 gen_load_spr(t0
, SPR_UAMOR
);
1050 tcg_gen_and_tl(t0
, t0
, cpu_gpr
[gprn
]);
1051 gen_store_spr(SPR_AMR
, t0
);
1052 spr_store_dump_spr(SPR_AMR
);
1054 #endif /* CONFIG_USER_ONLY */
1056 static void gen_spr_amr (CPUPPCState
*env
)
1058 #ifndef CONFIG_USER_ONLY
1059 /* Virtual Page Class Key protection */
1060 /* The AMR is accessible either via SPR 13 or SPR 29. 13 is
1061 * userspace accessible, 29 is privileged. So we only need to set
1062 * the kvm ONE_REG id on one of them, we use 29 */
1063 spr_register(env
, SPR_UAMR
, "UAMR",
1064 &spr_read_uamr
, &spr_write_uamr_pr
,
1065 &spr_read_uamr
, &spr_write_uamr
,
1067 spr_register_kvm(env
, SPR_AMR
, "AMR",
1068 SPR_NOACCESS
, SPR_NOACCESS
,
1069 &spr_read_generic
, &spr_write_generic
,
1070 KVM_REG_PPC_AMR
, 0);
1071 spr_register_kvm(env
, SPR_UAMOR
, "UAMOR",
1072 SPR_NOACCESS
, SPR_NOACCESS
,
1073 &spr_read_generic
, &spr_write_generic
,
1074 KVM_REG_PPC_UAMOR
, 0);
1075 #endif /* !CONFIG_USER_ONLY */
1077 #endif /* TARGET_PPC64 */
1079 static void gen_spr_thrm (CPUPPCState
*env
)
1081 /* Thermal management */
1082 /* XXX : not implemented */
1083 spr_register(env
, SPR_THRM1
, "THRM1",
1084 SPR_NOACCESS
, SPR_NOACCESS
,
1085 &spr_read_generic
, &spr_write_generic
,
1087 /* XXX : not implemented */
1088 spr_register(env
, SPR_THRM2
, "THRM2",
1089 SPR_NOACCESS
, SPR_NOACCESS
,
1090 &spr_read_generic
, &spr_write_generic
,
1092 /* XXX : not implemented */
1093 spr_register(env
, SPR_THRM3
, "THRM3",
1094 SPR_NOACCESS
, SPR_NOACCESS
,
1095 &spr_read_generic
, &spr_write_generic
,
1099 /* SPR specific to PowerPC 604 implementation */
1100 static void gen_spr_604 (CPUPPCState
*env
)
1102 /* Processor identification */
1103 spr_register(env
, SPR_PIR
, "PIR",
1104 SPR_NOACCESS
, SPR_NOACCESS
,
1105 &spr_read_generic
, &spr_write_pir
,
1108 /* XXX : not implemented */
1109 spr_register(env
, SPR_IABR
, "IABR",
1110 SPR_NOACCESS
, SPR_NOACCESS
,
1111 &spr_read_generic
, &spr_write_generic
,
1113 /* XXX : not implemented */
1114 spr_register_kvm(env
, SPR_DABR
, "DABR",
1115 SPR_NOACCESS
, SPR_NOACCESS
,
1116 &spr_read_generic
, &spr_write_generic
,
1117 KVM_REG_PPC_DABR
, 0x00000000);
1118 /* Performance counters */
1119 /* XXX : not implemented */
1120 spr_register(env
, SPR_MMCR0
, "MMCR0",
1121 SPR_NOACCESS
, SPR_NOACCESS
,
1122 &spr_read_generic
, &spr_write_generic
,
1124 /* XXX : not implemented */
1125 spr_register(env
, SPR_PMC1
, "PMC1",
1126 SPR_NOACCESS
, SPR_NOACCESS
,
1127 &spr_read_generic
, &spr_write_generic
,
1129 /* XXX : not implemented */
1130 spr_register(env
, SPR_PMC2
, "PMC2",
1131 SPR_NOACCESS
, SPR_NOACCESS
,
1132 &spr_read_generic
, &spr_write_generic
,
1134 /* XXX : not implemented */
1135 spr_register(env
, SPR_SIAR
, "SIAR",
1136 SPR_NOACCESS
, SPR_NOACCESS
,
1137 &spr_read_generic
, SPR_NOACCESS
,
1139 /* XXX : not implemented */
1140 spr_register(env
, SPR_SDA
, "SDA",
1141 SPR_NOACCESS
, SPR_NOACCESS
,
1142 &spr_read_generic
, SPR_NOACCESS
,
1144 /* External access control */
1145 /* XXX : not implemented */
1146 spr_register(env
, SPR_EAR
, "EAR",
1147 SPR_NOACCESS
, SPR_NOACCESS
,
1148 &spr_read_generic
, &spr_write_generic
,
1152 /* SPR specific to PowerPC 603 implementation */
1153 static void gen_spr_603 (CPUPPCState
*env
)
1155 /* External access control */
1156 /* XXX : not implemented */
1157 spr_register(env
, SPR_EAR
, "EAR",
1158 SPR_NOACCESS
, SPR_NOACCESS
,
1159 &spr_read_generic
, &spr_write_generic
,
1162 /* XXX : not implemented */
1163 spr_register(env
, SPR_IABR
, "IABR",
1164 SPR_NOACCESS
, SPR_NOACCESS
,
1165 &spr_read_generic
, &spr_write_generic
,
1170 /* SPR specific to PowerPC G2 implementation */
1171 static void gen_spr_G2 (CPUPPCState
*env
)
1173 /* Memory base address */
1175 /* XXX : not implemented */
1176 spr_register(env
, SPR_MBAR
, "MBAR",
1177 SPR_NOACCESS
, SPR_NOACCESS
,
1178 &spr_read_generic
, &spr_write_generic
,
1180 /* Exception processing */
1181 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
1182 SPR_NOACCESS
, SPR_NOACCESS
,
1183 &spr_read_generic
, &spr_write_generic
,
1185 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
1186 SPR_NOACCESS
, SPR_NOACCESS
,
1187 &spr_read_generic
, &spr_write_generic
,
1190 /* XXX : not implemented */
1191 spr_register(env
, SPR_DABR
, "DABR",
1192 SPR_NOACCESS
, SPR_NOACCESS
,
1193 &spr_read_generic
, &spr_write_generic
,
1195 /* XXX : not implemented */
1196 spr_register(env
, SPR_DABR2
, "DABR2",
1197 SPR_NOACCESS
, SPR_NOACCESS
,
1198 &spr_read_generic
, &spr_write_generic
,
1200 /* XXX : not implemented */
1201 spr_register(env
, SPR_IABR
, "IABR",
1202 SPR_NOACCESS
, SPR_NOACCESS
,
1203 &spr_read_generic
, &spr_write_generic
,
1205 /* XXX : not implemented */
1206 spr_register(env
, SPR_IABR2
, "IABR2",
1207 SPR_NOACCESS
, SPR_NOACCESS
,
1208 &spr_read_generic
, &spr_write_generic
,
1210 /* XXX : not implemented */
1211 spr_register(env
, SPR_IBCR
, "IBCR",
1212 SPR_NOACCESS
, SPR_NOACCESS
,
1213 &spr_read_generic
, &spr_write_generic
,
1215 /* XXX : not implemented */
1216 spr_register(env
, SPR_DBCR
, "DBCR",
1217 SPR_NOACCESS
, SPR_NOACCESS
,
1218 &spr_read_generic
, &spr_write_generic
,
1222 /* SPR specific to PowerPC 602 implementation */
1223 static void gen_spr_602 (CPUPPCState
*env
)
1226 /* XXX : not implemented */
1227 spr_register(env
, SPR_SER
, "SER",
1228 SPR_NOACCESS
, SPR_NOACCESS
,
1229 &spr_read_generic
, &spr_write_generic
,
1231 /* XXX : not implemented */
1232 spr_register(env
, SPR_SEBR
, "SEBR",
1233 SPR_NOACCESS
, SPR_NOACCESS
,
1234 &spr_read_generic
, &spr_write_generic
,
1236 /* XXX : not implemented */
1237 spr_register(env
, SPR_ESASRR
, "ESASRR",
1238 SPR_NOACCESS
, SPR_NOACCESS
,
1239 &spr_read_generic
, &spr_write_generic
,
1241 /* Floating point status */
1242 /* XXX : not implemented */
1243 spr_register(env
, SPR_SP
, "SP",
1244 SPR_NOACCESS
, SPR_NOACCESS
,
1245 &spr_read_generic
, &spr_write_generic
,
1247 /* XXX : not implemented */
1248 spr_register(env
, SPR_LT
, "LT",
1249 SPR_NOACCESS
, SPR_NOACCESS
,
1250 &spr_read_generic
, &spr_write_generic
,
1252 /* Watchdog timer */
1253 /* XXX : not implemented */
1254 spr_register(env
, SPR_TCR
, "TCR",
1255 SPR_NOACCESS
, SPR_NOACCESS
,
1256 &spr_read_generic
, &spr_write_generic
,
1258 /* Interrupt base */
1259 spr_register(env
, SPR_IBR
, "IBR",
1260 SPR_NOACCESS
, SPR_NOACCESS
,
1261 &spr_read_generic
, &spr_write_generic
,
1263 /* XXX : not implemented */
1264 spr_register(env
, SPR_IABR
, "IABR",
1265 SPR_NOACCESS
, SPR_NOACCESS
,
1266 &spr_read_generic
, &spr_write_generic
,
1270 /* SPR specific to PowerPC 601 implementation */
1271 static void gen_spr_601 (CPUPPCState
*env
)
1273 /* Multiplication/division register */
1275 spr_register(env
, SPR_MQ
, "MQ",
1276 &spr_read_generic
, &spr_write_generic
,
1277 &spr_read_generic
, &spr_write_generic
,
1280 spr_register(env
, SPR_601_RTCU
, "RTCU",
1281 SPR_NOACCESS
, SPR_NOACCESS
,
1282 SPR_NOACCESS
, &spr_write_601_rtcu
,
1284 spr_register(env
, SPR_601_VRTCU
, "RTCU",
1285 &spr_read_601_rtcu
, SPR_NOACCESS
,
1286 &spr_read_601_rtcu
, SPR_NOACCESS
,
1288 spr_register(env
, SPR_601_RTCL
, "RTCL",
1289 SPR_NOACCESS
, SPR_NOACCESS
,
1290 SPR_NOACCESS
, &spr_write_601_rtcl
,
1292 spr_register(env
, SPR_601_VRTCL
, "RTCL",
1293 &spr_read_601_rtcl
, SPR_NOACCESS
,
1294 &spr_read_601_rtcl
, SPR_NOACCESS
,
1298 spr_register(env
, SPR_601_UDECR
, "UDECR",
1299 &spr_read_decr
, SPR_NOACCESS
,
1300 &spr_read_decr
, SPR_NOACCESS
,
1303 /* External access control */
1304 /* XXX : not implemented */
1305 spr_register(env
, SPR_EAR
, "EAR",
1306 SPR_NOACCESS
, SPR_NOACCESS
,
1307 &spr_read_generic
, &spr_write_generic
,
1309 /* Memory management */
1310 #if !defined(CONFIG_USER_ONLY)
1311 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
1312 SPR_NOACCESS
, SPR_NOACCESS
,
1313 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1315 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
1316 SPR_NOACCESS
, SPR_NOACCESS
,
1317 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1319 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
1320 SPR_NOACCESS
, SPR_NOACCESS
,
1321 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1323 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
1324 SPR_NOACCESS
, SPR_NOACCESS
,
1325 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1327 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
1328 SPR_NOACCESS
, SPR_NOACCESS
,
1329 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1331 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
1332 SPR_NOACCESS
, SPR_NOACCESS
,
1333 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1335 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
1336 SPR_NOACCESS
, SPR_NOACCESS
,
1337 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1339 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
1340 SPR_NOACCESS
, SPR_NOACCESS
,
1341 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1347 static void gen_spr_74xx (CPUPPCState
*env
)
1349 /* Processor identification */
1350 spr_register(env
, SPR_PIR
, "PIR",
1351 SPR_NOACCESS
, SPR_NOACCESS
,
1352 &spr_read_generic
, &spr_write_pir
,
1354 /* XXX : not implemented */
1355 spr_register(env
, SPR_MMCR2
, "MMCR2",
1356 SPR_NOACCESS
, SPR_NOACCESS
,
1357 &spr_read_generic
, &spr_write_generic
,
1359 /* XXX : not implemented */
1360 spr_register(env
, SPR_UMMCR2
, "UMMCR2",
1361 &spr_read_ureg
, SPR_NOACCESS
,
1362 &spr_read_ureg
, SPR_NOACCESS
,
1364 /* XXX: not implemented */
1365 spr_register(env
, SPR_BAMR
, "BAMR",
1366 SPR_NOACCESS
, SPR_NOACCESS
,
1367 &spr_read_generic
, &spr_write_generic
,
1369 /* XXX : not implemented */
1370 spr_register(env
, SPR_MSSCR0
, "MSSCR0",
1371 SPR_NOACCESS
, SPR_NOACCESS
,
1372 &spr_read_generic
, &spr_write_generic
,
1374 /* Hardware implementation registers */
1375 /* XXX : not implemented */
1376 spr_register(env
, SPR_HID0
, "HID0",
1377 SPR_NOACCESS
, SPR_NOACCESS
,
1378 &spr_read_generic
, &spr_write_generic
,
1380 /* XXX : not implemented */
1381 spr_register(env
, SPR_HID1
, "HID1",
1382 SPR_NOACCESS
, SPR_NOACCESS
,
1383 &spr_read_generic
, &spr_write_generic
,
1386 spr_register(env
, SPR_VRSAVE
, "VRSAVE",
1387 &spr_read_generic
, &spr_write_generic
,
1388 &spr_read_generic
, &spr_write_generic
,
1390 /* XXX : not implemented */
1391 spr_register(env
, SPR_L2CR
, "L2CR",
1392 SPR_NOACCESS
, SPR_NOACCESS
,
1393 &spr_read_generic
, spr_access_nop
,
1395 /* Not strictly an SPR */
1396 vscr_init(env
, 0x00010000);
1399 static void gen_l3_ctrl (CPUPPCState
*env
)
1402 /* XXX : not implemented */
1403 spr_register(env
, SPR_L3CR
, "L3CR",
1404 SPR_NOACCESS
, SPR_NOACCESS
,
1405 &spr_read_generic
, &spr_write_generic
,
1408 /* XXX : not implemented */
1409 spr_register(env
, SPR_L3ITCR0
, "L3ITCR0",
1410 SPR_NOACCESS
, SPR_NOACCESS
,
1411 &spr_read_generic
, &spr_write_generic
,
1414 /* XXX : not implemented */
1415 spr_register(env
, SPR_L3PM
, "L3PM",
1416 SPR_NOACCESS
, SPR_NOACCESS
,
1417 &spr_read_generic
, &spr_write_generic
,
1421 static void gen_74xx_soft_tlb (CPUPPCState
*env
, int nb_tlbs
, int nb_ways
)
1423 #if !defined(CONFIG_USER_ONLY)
1424 env
->nb_tlb
= nb_tlbs
;
1425 env
->nb_ways
= nb_ways
;
1427 env
->tlb_type
= TLB_6XX
;
1428 /* XXX : not implemented */
1429 spr_register(env
, SPR_PTEHI
, "PTEHI",
1430 SPR_NOACCESS
, SPR_NOACCESS
,
1431 &spr_read_generic
, &spr_write_generic
,
1433 /* XXX : not implemented */
1434 spr_register(env
, SPR_PTELO
, "PTELO",
1435 SPR_NOACCESS
, SPR_NOACCESS
,
1436 &spr_read_generic
, &spr_write_generic
,
1438 /* XXX : not implemented */
1439 spr_register(env
, SPR_TLBMISS
, "TLBMISS",
1440 SPR_NOACCESS
, SPR_NOACCESS
,
1441 &spr_read_generic
, &spr_write_generic
,
1446 #if !defined(CONFIG_USER_ONLY)
1447 static void spr_write_e500_l1csr0 (void *opaque
, int sprn
, int gprn
)
1449 TCGv t0
= tcg_temp_new();
1451 tcg_gen_andi_tl(t0
, cpu_gpr
[gprn
], ~256);
1452 gen_store_spr(sprn
, t0
);
1456 static void spr_write_booke206_mmucsr0 (void *opaque
, int sprn
, int gprn
)
1458 TCGv_i32 t0
= tcg_const_i32(sprn
);
1459 gen_helper_booke206_tlbflush(cpu_env
, t0
);
1460 tcg_temp_free_i32(t0
);
1463 static void spr_write_booke_pid (void *opaque
, int sprn
, int gprn
)
1465 TCGv_i32 t0
= tcg_const_i32(sprn
);
1466 gen_helper_booke_setpid(cpu_env
, t0
, cpu_gpr
[gprn
]);
1467 tcg_temp_free_i32(t0
);
1471 static void gen_spr_usprgh (CPUPPCState
*env
)
1473 spr_register(env
, SPR_USPRG4
, "USPRG4",
1474 &spr_read_ureg
, SPR_NOACCESS
,
1475 &spr_read_ureg
, SPR_NOACCESS
,
1477 spr_register(env
, SPR_USPRG5
, "USPRG5",
1478 &spr_read_ureg
, SPR_NOACCESS
,
1479 &spr_read_ureg
, SPR_NOACCESS
,
1481 spr_register(env
, SPR_USPRG6
, "USPRG6",
1482 &spr_read_ureg
, SPR_NOACCESS
,
1483 &spr_read_ureg
, SPR_NOACCESS
,
1485 spr_register(env
, SPR_USPRG7
, "USPRG7",
1486 &spr_read_ureg
, SPR_NOACCESS
,
1487 &spr_read_ureg
, SPR_NOACCESS
,
1491 /* PowerPC BookE SPR */
1492 static void gen_spr_BookE (CPUPPCState
*env
, uint64_t ivor_mask
)
1494 const char *ivor_names
[64] = {
1495 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
1496 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
1497 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
1498 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1499 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1500 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1501 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1502 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1503 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1504 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1505 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1506 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1507 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1508 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1509 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1510 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1512 #define SPR_BOOKE_IVORxx (-1)
1513 int ivor_sprn
[64] = {
1514 SPR_BOOKE_IVOR0
, SPR_BOOKE_IVOR1
, SPR_BOOKE_IVOR2
, SPR_BOOKE_IVOR3
,
1515 SPR_BOOKE_IVOR4
, SPR_BOOKE_IVOR5
, SPR_BOOKE_IVOR6
, SPR_BOOKE_IVOR7
,
1516 SPR_BOOKE_IVOR8
, SPR_BOOKE_IVOR9
, SPR_BOOKE_IVOR10
, SPR_BOOKE_IVOR11
,
1517 SPR_BOOKE_IVOR12
, SPR_BOOKE_IVOR13
, SPR_BOOKE_IVOR14
, SPR_BOOKE_IVOR15
,
1518 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1519 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1520 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1521 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1522 SPR_BOOKE_IVOR32
, SPR_BOOKE_IVOR33
, SPR_BOOKE_IVOR34
, SPR_BOOKE_IVOR35
,
1523 SPR_BOOKE_IVOR36
, SPR_BOOKE_IVOR37
, SPR_BOOKE_IVOR38
, SPR_BOOKE_IVOR39
,
1524 SPR_BOOKE_IVOR40
, SPR_BOOKE_IVOR41
, SPR_BOOKE_IVOR42
, SPR_BOOKE_IVORxx
,
1525 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1526 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1527 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1528 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1529 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1533 /* Interrupt processing */
1534 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
1535 SPR_NOACCESS
, SPR_NOACCESS
,
1536 &spr_read_generic
, &spr_write_generic
,
1538 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
1539 SPR_NOACCESS
, SPR_NOACCESS
,
1540 &spr_read_generic
, &spr_write_generic
,
1543 /* XXX : not implemented */
1544 spr_register(env
, SPR_BOOKE_IAC1
, "IAC1",
1545 SPR_NOACCESS
, SPR_NOACCESS
,
1546 &spr_read_generic
, &spr_write_generic
,
1548 /* XXX : not implemented */
1549 spr_register(env
, SPR_BOOKE_IAC2
, "IAC2",
1550 SPR_NOACCESS
, SPR_NOACCESS
,
1551 &spr_read_generic
, &spr_write_generic
,
1553 /* XXX : not implemented */
1554 spr_register(env
, SPR_BOOKE_DAC1
, "DAC1",
1555 SPR_NOACCESS
, SPR_NOACCESS
,
1556 &spr_read_generic
, &spr_write_generic
,
1558 /* XXX : not implemented */
1559 spr_register(env
, SPR_BOOKE_DAC2
, "DAC2",
1560 SPR_NOACCESS
, SPR_NOACCESS
,
1561 &spr_read_generic
, &spr_write_generic
,
1563 /* XXX : not implemented */
1564 spr_register(env
, SPR_BOOKE_DBCR0
, "DBCR0",
1565 SPR_NOACCESS
, SPR_NOACCESS
,
1566 &spr_read_generic
, &spr_write_40x_dbcr0
,
1568 /* XXX : not implemented */
1569 spr_register(env
, SPR_BOOKE_DBCR1
, "DBCR1",
1570 SPR_NOACCESS
, SPR_NOACCESS
,
1571 &spr_read_generic
, &spr_write_generic
,
1573 /* XXX : not implemented */
1574 spr_register(env
, SPR_BOOKE_DBCR2
, "DBCR2",
1575 SPR_NOACCESS
, SPR_NOACCESS
,
1576 &spr_read_generic
, &spr_write_generic
,
1578 /* XXX : not implemented */
1579 spr_register(env
, SPR_BOOKE_DBSR
, "DBSR",
1580 SPR_NOACCESS
, SPR_NOACCESS
,
1581 &spr_read_generic
, &spr_write_clear
,
1583 spr_register(env
, SPR_BOOKE_DEAR
, "DEAR",
1584 SPR_NOACCESS
, SPR_NOACCESS
,
1585 &spr_read_generic
, &spr_write_generic
,
1587 spr_register(env
, SPR_BOOKE_ESR
, "ESR",
1588 SPR_NOACCESS
, SPR_NOACCESS
,
1589 &spr_read_generic
, &spr_write_generic
,
1591 spr_register(env
, SPR_BOOKE_IVPR
, "IVPR",
1592 SPR_NOACCESS
, SPR_NOACCESS
,
1593 &spr_read_generic
, &spr_write_excp_prefix
,
1595 /* Exception vectors */
1596 for (i
= 0; i
< 64; i
++) {
1597 if (ivor_mask
& (1ULL << i
)) {
1598 if (ivor_sprn
[i
] == SPR_BOOKE_IVORxx
) {
1599 fprintf(stderr
, "ERROR: IVOR %d SPR is not defined\n", i
);
1602 spr_register(env
, ivor_sprn
[i
], ivor_names
[i
],
1603 SPR_NOACCESS
, SPR_NOACCESS
,
1604 &spr_read_generic
, &spr_write_excp_vector
,
1608 spr_register(env
, SPR_BOOKE_PID
, "PID",
1609 SPR_NOACCESS
, SPR_NOACCESS
,
1610 &spr_read_generic
, &spr_write_booke_pid
,
1612 spr_register(env
, SPR_BOOKE_TCR
, "TCR",
1613 SPR_NOACCESS
, SPR_NOACCESS
,
1614 &spr_read_generic
, &spr_write_booke_tcr
,
1616 spr_register(env
, SPR_BOOKE_TSR
, "TSR",
1617 SPR_NOACCESS
, SPR_NOACCESS
,
1618 &spr_read_generic
, &spr_write_booke_tsr
,
1621 spr_register(env
, SPR_DECR
, "DECR",
1622 SPR_NOACCESS
, SPR_NOACCESS
,
1623 &spr_read_decr
, &spr_write_decr
,
1625 spr_register(env
, SPR_BOOKE_DECAR
, "DECAR",
1626 SPR_NOACCESS
, SPR_NOACCESS
,
1627 SPR_NOACCESS
, &spr_write_generic
,
1630 spr_register(env
, SPR_USPRG0
, "USPRG0",
1631 &spr_read_generic
, &spr_write_generic
,
1632 &spr_read_generic
, &spr_write_generic
,
1634 spr_register(env
, SPR_SPRG4
, "SPRG4",
1635 SPR_NOACCESS
, SPR_NOACCESS
,
1636 &spr_read_generic
, &spr_write_generic
,
1638 spr_register(env
, SPR_SPRG5
, "SPRG5",
1639 SPR_NOACCESS
, SPR_NOACCESS
,
1640 &spr_read_generic
, &spr_write_generic
,
1642 spr_register(env
, SPR_SPRG6
, "SPRG6",
1643 SPR_NOACCESS
, SPR_NOACCESS
,
1644 &spr_read_generic
, &spr_write_generic
,
1646 spr_register(env
, SPR_SPRG7
, "SPRG7",
1647 SPR_NOACCESS
, SPR_NOACCESS
,
1648 &spr_read_generic
, &spr_write_generic
,
1652 static inline uint32_t gen_tlbncfg(uint32_t assoc
, uint32_t minsize
,
1653 uint32_t maxsize
, uint32_t flags
,
1656 return (assoc
<< TLBnCFG_ASSOC_SHIFT
) |
1657 (minsize
<< TLBnCFG_MINSIZE_SHIFT
) |
1658 (maxsize
<< TLBnCFG_MAXSIZE_SHIFT
) |
1662 /* BookE 2.06 storage control registers */
1663 static void gen_spr_BookE206(CPUPPCState
*env
, uint32_t mas_mask
,
1666 #if !defined(CONFIG_USER_ONLY)
1667 const char *mas_names
[8] = {
1668 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1671 SPR_BOOKE_MAS0
, SPR_BOOKE_MAS1
, SPR_BOOKE_MAS2
, SPR_BOOKE_MAS3
,
1672 SPR_BOOKE_MAS4
, SPR_BOOKE_MAS5
, SPR_BOOKE_MAS6
, SPR_BOOKE_MAS7
,
1676 /* TLB assist registers */
1677 /* XXX : not implemented */
1678 for (i
= 0; i
< 8; i
++) {
1679 void (*uea_write
)(void *o
, int sprn
, int gprn
) = &spr_write_generic32
;
1680 if (i
== 2 && (mas_mask
& (1 << i
)) && (env
->insns_flags
& PPC_64B
)) {
1681 uea_write
= &spr_write_generic
;
1683 if (mas_mask
& (1 << i
)) {
1684 spr_register(env
, mas_sprn
[i
], mas_names
[i
],
1685 SPR_NOACCESS
, SPR_NOACCESS
,
1686 &spr_read_generic
, uea_write
,
1690 if (env
->nb_pids
> 1) {
1691 /* XXX : not implemented */
1692 spr_register(env
, SPR_BOOKE_PID1
, "PID1",
1693 SPR_NOACCESS
, SPR_NOACCESS
,
1694 &spr_read_generic
, &spr_write_booke_pid
,
1697 if (env
->nb_pids
> 2) {
1698 /* XXX : not implemented */
1699 spr_register(env
, SPR_BOOKE_PID2
, "PID2",
1700 SPR_NOACCESS
, SPR_NOACCESS
,
1701 &spr_read_generic
, &spr_write_booke_pid
,
1704 /* XXX : not implemented */
1705 spr_register(env
, SPR_MMUCFG
, "MMUCFG",
1706 SPR_NOACCESS
, SPR_NOACCESS
,
1707 &spr_read_generic
, SPR_NOACCESS
,
1708 0x00000000); /* TOFIX */
1709 switch (env
->nb_ways
) {
1711 spr_register(env
, SPR_BOOKE_TLB3CFG
, "TLB3CFG",
1712 SPR_NOACCESS
, SPR_NOACCESS
,
1713 &spr_read_generic
, SPR_NOACCESS
,
1717 spr_register(env
, SPR_BOOKE_TLB2CFG
, "TLB2CFG",
1718 SPR_NOACCESS
, SPR_NOACCESS
,
1719 &spr_read_generic
, SPR_NOACCESS
,
1723 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
1724 SPR_NOACCESS
, SPR_NOACCESS
,
1725 &spr_read_generic
, SPR_NOACCESS
,
1729 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
1730 SPR_NOACCESS
, SPR_NOACCESS
,
1731 &spr_read_generic
, SPR_NOACCESS
,
1740 gen_spr_usprgh(env
);
1743 /* SPR specific to PowerPC 440 implementation */
1744 static void gen_spr_440 (CPUPPCState
*env
)
1747 /* XXX : not implemented */
1748 spr_register(env
, SPR_440_DNV0
, "DNV0",
1749 SPR_NOACCESS
, SPR_NOACCESS
,
1750 &spr_read_generic
, &spr_write_generic
,
1752 /* XXX : not implemented */
1753 spr_register(env
, SPR_440_DNV1
, "DNV1",
1754 SPR_NOACCESS
, SPR_NOACCESS
,
1755 &spr_read_generic
, &spr_write_generic
,
1757 /* XXX : not implemented */
1758 spr_register(env
, SPR_440_DNV2
, "DNV2",
1759 SPR_NOACCESS
, SPR_NOACCESS
,
1760 &spr_read_generic
, &spr_write_generic
,
1762 /* XXX : not implemented */
1763 spr_register(env
, SPR_440_DNV3
, "DNV3",
1764 SPR_NOACCESS
, SPR_NOACCESS
,
1765 &spr_read_generic
, &spr_write_generic
,
1767 /* XXX : not implemented */
1768 spr_register(env
, SPR_440_DTV0
, "DTV0",
1769 SPR_NOACCESS
, SPR_NOACCESS
,
1770 &spr_read_generic
, &spr_write_generic
,
1772 /* XXX : not implemented */
1773 spr_register(env
, SPR_440_DTV1
, "DTV1",
1774 SPR_NOACCESS
, SPR_NOACCESS
,
1775 &spr_read_generic
, &spr_write_generic
,
1777 /* XXX : not implemented */
1778 spr_register(env
, SPR_440_DTV2
, "DTV2",
1779 SPR_NOACCESS
, SPR_NOACCESS
,
1780 &spr_read_generic
, &spr_write_generic
,
1782 /* XXX : not implemented */
1783 spr_register(env
, SPR_440_DTV3
, "DTV3",
1784 SPR_NOACCESS
, SPR_NOACCESS
,
1785 &spr_read_generic
, &spr_write_generic
,
1787 /* XXX : not implemented */
1788 spr_register(env
, SPR_440_DVLIM
, "DVLIM",
1789 SPR_NOACCESS
, SPR_NOACCESS
,
1790 &spr_read_generic
, &spr_write_generic
,
1792 /* XXX : not implemented */
1793 spr_register(env
, SPR_440_INV0
, "INV0",
1794 SPR_NOACCESS
, SPR_NOACCESS
,
1795 &spr_read_generic
, &spr_write_generic
,
1797 /* XXX : not implemented */
1798 spr_register(env
, SPR_440_INV1
, "INV1",
1799 SPR_NOACCESS
, SPR_NOACCESS
,
1800 &spr_read_generic
, &spr_write_generic
,
1802 /* XXX : not implemented */
1803 spr_register(env
, SPR_440_INV2
, "INV2",
1804 SPR_NOACCESS
, SPR_NOACCESS
,
1805 &spr_read_generic
, &spr_write_generic
,
1807 /* XXX : not implemented */
1808 spr_register(env
, SPR_440_INV3
, "INV3",
1809 SPR_NOACCESS
, SPR_NOACCESS
,
1810 &spr_read_generic
, &spr_write_generic
,
1812 /* XXX : not implemented */
1813 spr_register(env
, SPR_440_ITV0
, "ITV0",
1814 SPR_NOACCESS
, SPR_NOACCESS
,
1815 &spr_read_generic
, &spr_write_generic
,
1817 /* XXX : not implemented */
1818 spr_register(env
, SPR_440_ITV1
, "ITV1",
1819 SPR_NOACCESS
, SPR_NOACCESS
,
1820 &spr_read_generic
, &spr_write_generic
,
1822 /* XXX : not implemented */
1823 spr_register(env
, SPR_440_ITV2
, "ITV2",
1824 SPR_NOACCESS
, SPR_NOACCESS
,
1825 &spr_read_generic
, &spr_write_generic
,
1827 /* XXX : not implemented */
1828 spr_register(env
, SPR_440_ITV3
, "ITV3",
1829 SPR_NOACCESS
, SPR_NOACCESS
,
1830 &spr_read_generic
, &spr_write_generic
,
1832 /* XXX : not implemented */
1833 spr_register(env
, SPR_440_IVLIM
, "IVLIM",
1834 SPR_NOACCESS
, SPR_NOACCESS
,
1835 &spr_read_generic
, &spr_write_generic
,
1838 /* XXX : not implemented */
1839 spr_register(env
, SPR_BOOKE_DCDBTRH
, "DCDBTRH",
1840 SPR_NOACCESS
, SPR_NOACCESS
,
1841 &spr_read_generic
, SPR_NOACCESS
,
1843 /* XXX : not implemented */
1844 spr_register(env
, SPR_BOOKE_DCDBTRL
, "DCDBTRL",
1845 SPR_NOACCESS
, SPR_NOACCESS
,
1846 &spr_read_generic
, SPR_NOACCESS
,
1848 /* XXX : not implemented */
1849 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1850 SPR_NOACCESS
, SPR_NOACCESS
,
1851 &spr_read_generic
, SPR_NOACCESS
,
1853 /* XXX : not implemented */
1854 spr_register(env
, SPR_BOOKE_ICDBTRH
, "ICDBTRH",
1855 SPR_NOACCESS
, SPR_NOACCESS
,
1856 &spr_read_generic
, SPR_NOACCESS
,
1858 /* XXX : not implemented */
1859 spr_register(env
, SPR_BOOKE_ICDBTRL
, "ICDBTRL",
1860 SPR_NOACCESS
, SPR_NOACCESS
,
1861 &spr_read_generic
, SPR_NOACCESS
,
1863 /* XXX : not implemented */
1864 spr_register(env
, SPR_440_DBDR
, "DBDR",
1865 SPR_NOACCESS
, SPR_NOACCESS
,
1866 &spr_read_generic
, &spr_write_generic
,
1868 /* Processor control */
1869 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1870 SPR_NOACCESS
, SPR_NOACCESS
,
1871 &spr_read_generic
, &spr_write_generic
,
1873 spr_register(env
, SPR_440_RSTCFG
, "RSTCFG",
1874 SPR_NOACCESS
, SPR_NOACCESS
,
1875 &spr_read_generic
, SPR_NOACCESS
,
1877 /* Storage control */
1878 spr_register(env
, SPR_440_MMUCR
, "MMUCR",
1879 SPR_NOACCESS
, SPR_NOACCESS
,
1880 &spr_read_generic
, &spr_write_generic
,
1884 /* SPR shared between PowerPC 40x implementations */
1885 static void gen_spr_40x (CPUPPCState
*env
)
1888 /* not emulated, as QEMU do not emulate caches */
1889 spr_register(env
, SPR_40x_DCCR
, "DCCR",
1890 SPR_NOACCESS
, SPR_NOACCESS
,
1891 &spr_read_generic
, &spr_write_generic
,
1893 /* not emulated, as QEMU do not emulate caches */
1894 spr_register(env
, SPR_40x_ICCR
, "ICCR",
1895 SPR_NOACCESS
, SPR_NOACCESS
,
1896 &spr_read_generic
, &spr_write_generic
,
1898 /* not emulated, as QEMU do not emulate caches */
1899 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1900 SPR_NOACCESS
, SPR_NOACCESS
,
1901 &spr_read_generic
, SPR_NOACCESS
,
1904 spr_register(env
, SPR_40x_DEAR
, "DEAR",
1905 SPR_NOACCESS
, SPR_NOACCESS
,
1906 &spr_read_generic
, &spr_write_generic
,
1908 spr_register(env
, SPR_40x_ESR
, "ESR",
1909 SPR_NOACCESS
, SPR_NOACCESS
,
1910 &spr_read_generic
, &spr_write_generic
,
1912 spr_register(env
, SPR_40x_EVPR
, "EVPR",
1913 SPR_NOACCESS
, SPR_NOACCESS
,
1914 &spr_read_generic
, &spr_write_excp_prefix
,
1916 spr_register(env
, SPR_40x_SRR2
, "SRR2",
1917 &spr_read_generic
, &spr_write_generic
,
1918 &spr_read_generic
, &spr_write_generic
,
1920 spr_register(env
, SPR_40x_SRR3
, "SRR3",
1921 &spr_read_generic
, &spr_write_generic
,
1922 &spr_read_generic
, &spr_write_generic
,
1925 spr_register(env
, SPR_40x_PIT
, "PIT",
1926 SPR_NOACCESS
, SPR_NOACCESS
,
1927 &spr_read_40x_pit
, &spr_write_40x_pit
,
1929 spr_register(env
, SPR_40x_TCR
, "TCR",
1930 SPR_NOACCESS
, SPR_NOACCESS
,
1931 &spr_read_generic
, &spr_write_booke_tcr
,
1933 spr_register(env
, SPR_40x_TSR
, "TSR",
1934 SPR_NOACCESS
, SPR_NOACCESS
,
1935 &spr_read_generic
, &spr_write_booke_tsr
,
1939 /* SPR specific to PowerPC 405 implementation */
1940 static void gen_spr_405 (CPUPPCState
*env
)
1943 spr_register(env
, SPR_40x_PID
, "PID",
1944 SPR_NOACCESS
, SPR_NOACCESS
,
1945 &spr_read_generic
, &spr_write_generic
,
1947 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1948 SPR_NOACCESS
, SPR_NOACCESS
,
1949 &spr_read_generic
, &spr_write_generic
,
1951 /* Debug interface */
1952 /* XXX : not implemented */
1953 spr_register(env
, SPR_40x_DBCR0
, "DBCR0",
1954 SPR_NOACCESS
, SPR_NOACCESS
,
1955 &spr_read_generic
, &spr_write_40x_dbcr0
,
1957 /* XXX : not implemented */
1958 spr_register(env
, SPR_405_DBCR1
, "DBCR1",
1959 SPR_NOACCESS
, SPR_NOACCESS
,
1960 &spr_read_generic
, &spr_write_generic
,
1962 /* XXX : not implemented */
1963 spr_register(env
, SPR_40x_DBSR
, "DBSR",
1964 SPR_NOACCESS
, SPR_NOACCESS
,
1965 &spr_read_generic
, &spr_write_clear
,
1966 /* Last reset was system reset */
1968 /* XXX : not implemented */
1969 spr_register(env
, SPR_40x_DAC1
, "DAC1",
1970 SPR_NOACCESS
, SPR_NOACCESS
,
1971 &spr_read_generic
, &spr_write_generic
,
1973 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1974 SPR_NOACCESS
, SPR_NOACCESS
,
1975 &spr_read_generic
, &spr_write_generic
,
1977 /* XXX : not implemented */
1978 spr_register(env
, SPR_405_DVC1
, "DVC1",
1979 SPR_NOACCESS
, SPR_NOACCESS
,
1980 &spr_read_generic
, &spr_write_generic
,
1982 /* XXX : not implemented */
1983 spr_register(env
, SPR_405_DVC2
, "DVC2",
1984 SPR_NOACCESS
, SPR_NOACCESS
,
1985 &spr_read_generic
, &spr_write_generic
,
1987 /* XXX : not implemented */
1988 spr_register(env
, SPR_40x_IAC1
, "IAC1",
1989 SPR_NOACCESS
, SPR_NOACCESS
,
1990 &spr_read_generic
, &spr_write_generic
,
1992 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1993 SPR_NOACCESS
, SPR_NOACCESS
,
1994 &spr_read_generic
, &spr_write_generic
,
1996 /* XXX : not implemented */
1997 spr_register(env
, SPR_405_IAC3
, "IAC3",
1998 SPR_NOACCESS
, SPR_NOACCESS
,
1999 &spr_read_generic
, &spr_write_generic
,
2001 /* XXX : not implemented */
2002 spr_register(env
, SPR_405_IAC4
, "IAC4",
2003 SPR_NOACCESS
, SPR_NOACCESS
,
2004 &spr_read_generic
, &spr_write_generic
,
2006 /* Storage control */
2007 /* XXX: TODO: not implemented */
2008 spr_register(env
, SPR_405_SLER
, "SLER",
2009 SPR_NOACCESS
, SPR_NOACCESS
,
2010 &spr_read_generic
, &spr_write_40x_sler
,
2012 spr_register(env
, SPR_40x_ZPR
, "ZPR",
2013 SPR_NOACCESS
, SPR_NOACCESS
,
2014 &spr_read_generic
, &spr_write_generic
,
2016 /* XXX : not implemented */
2017 spr_register(env
, SPR_405_SU0R
, "SU0R",
2018 SPR_NOACCESS
, SPR_NOACCESS
,
2019 &spr_read_generic
, &spr_write_generic
,
2022 spr_register(env
, SPR_USPRG0
, "USPRG0",
2023 &spr_read_ureg
, SPR_NOACCESS
,
2024 &spr_read_ureg
, SPR_NOACCESS
,
2026 spr_register(env
, SPR_SPRG4
, "SPRG4",
2027 SPR_NOACCESS
, SPR_NOACCESS
,
2028 &spr_read_generic
, &spr_write_generic
,
2030 spr_register(env
, SPR_SPRG5
, "SPRG5",
2031 SPR_NOACCESS
, SPR_NOACCESS
,
2032 spr_read_generic
, &spr_write_generic
,
2034 spr_register(env
, SPR_SPRG6
, "SPRG6",
2035 SPR_NOACCESS
, SPR_NOACCESS
,
2036 spr_read_generic
, &spr_write_generic
,
2038 spr_register(env
, SPR_SPRG7
, "SPRG7",
2039 SPR_NOACCESS
, SPR_NOACCESS
,
2040 spr_read_generic
, &spr_write_generic
,
2042 gen_spr_usprgh(env
);
2045 /* SPR shared between PowerPC 401 & 403 implementations */
2046 static void gen_spr_401_403 (CPUPPCState
*env
)
2049 spr_register(env
, SPR_403_VTBL
, "TBL",
2050 &spr_read_tbl
, SPR_NOACCESS
,
2051 &spr_read_tbl
, SPR_NOACCESS
,
2053 spr_register(env
, SPR_403_TBL
, "TBL",
2054 SPR_NOACCESS
, SPR_NOACCESS
,
2055 SPR_NOACCESS
, &spr_write_tbl
,
2057 spr_register(env
, SPR_403_VTBU
, "TBU",
2058 &spr_read_tbu
, SPR_NOACCESS
,
2059 &spr_read_tbu
, SPR_NOACCESS
,
2061 spr_register(env
, SPR_403_TBU
, "TBU",
2062 SPR_NOACCESS
, SPR_NOACCESS
,
2063 SPR_NOACCESS
, &spr_write_tbu
,
2066 /* not emulated, as QEMU do not emulate caches */
2067 spr_register(env
, SPR_403_CDBCR
, "CDBCR",
2068 SPR_NOACCESS
, SPR_NOACCESS
,
2069 &spr_read_generic
, &spr_write_generic
,
2073 /* SPR specific to PowerPC 401 implementation */
2074 static void gen_spr_401 (CPUPPCState
*env
)
2076 /* Debug interface */
2077 /* XXX : not implemented */
2078 spr_register(env
, SPR_40x_DBCR0
, "DBCR",
2079 SPR_NOACCESS
, SPR_NOACCESS
,
2080 &spr_read_generic
, &spr_write_40x_dbcr0
,
2082 /* XXX : not implemented */
2083 spr_register(env
, SPR_40x_DBSR
, "DBSR",
2084 SPR_NOACCESS
, SPR_NOACCESS
,
2085 &spr_read_generic
, &spr_write_clear
,
2086 /* Last reset was system reset */
2088 /* XXX : not implemented */
2089 spr_register(env
, SPR_40x_DAC1
, "DAC",
2090 SPR_NOACCESS
, SPR_NOACCESS
,
2091 &spr_read_generic
, &spr_write_generic
,
2093 /* XXX : not implemented */
2094 spr_register(env
, SPR_40x_IAC1
, "IAC",
2095 SPR_NOACCESS
, SPR_NOACCESS
,
2096 &spr_read_generic
, &spr_write_generic
,
2098 /* Storage control */
2099 /* XXX: TODO: not implemented */
2100 spr_register(env
, SPR_405_SLER
, "SLER",
2101 SPR_NOACCESS
, SPR_NOACCESS
,
2102 &spr_read_generic
, &spr_write_40x_sler
,
2104 /* not emulated, as QEMU never does speculative access */
2105 spr_register(env
, SPR_40x_SGR
, "SGR",
2106 SPR_NOACCESS
, SPR_NOACCESS
,
2107 &spr_read_generic
, &spr_write_generic
,
2109 /* not emulated, as QEMU do not emulate caches */
2110 spr_register(env
, SPR_40x_DCWR
, "DCWR",
2111 SPR_NOACCESS
, SPR_NOACCESS
,
2112 &spr_read_generic
, &spr_write_generic
,
2116 static void gen_spr_401x2 (CPUPPCState
*env
)
2119 spr_register(env
, SPR_40x_PID
, "PID",
2120 SPR_NOACCESS
, SPR_NOACCESS
,
2121 &spr_read_generic
, &spr_write_generic
,
2123 spr_register(env
, SPR_40x_ZPR
, "ZPR",
2124 SPR_NOACCESS
, SPR_NOACCESS
,
2125 &spr_read_generic
, &spr_write_generic
,
2129 /* SPR specific to PowerPC 403 implementation */
2130 static void gen_spr_403 (CPUPPCState
*env
)
2132 /* Debug interface */
2133 /* XXX : not implemented */
2134 spr_register(env
, SPR_40x_DBCR0
, "DBCR0",
2135 SPR_NOACCESS
, SPR_NOACCESS
,
2136 &spr_read_generic
, &spr_write_40x_dbcr0
,
2138 /* XXX : not implemented */
2139 spr_register(env
, SPR_40x_DBSR
, "DBSR",
2140 SPR_NOACCESS
, SPR_NOACCESS
,
2141 &spr_read_generic
, &spr_write_clear
,
2142 /* Last reset was system reset */
2144 /* XXX : not implemented */
2145 spr_register(env
, SPR_40x_DAC1
, "DAC1",
2146 SPR_NOACCESS
, SPR_NOACCESS
,
2147 &spr_read_generic
, &spr_write_generic
,
2149 /* XXX : not implemented */
2150 spr_register(env
, SPR_40x_DAC2
, "DAC2",
2151 SPR_NOACCESS
, SPR_NOACCESS
,
2152 &spr_read_generic
, &spr_write_generic
,
2154 /* XXX : not implemented */
2155 spr_register(env
, SPR_40x_IAC1
, "IAC1",
2156 SPR_NOACCESS
, SPR_NOACCESS
,
2157 &spr_read_generic
, &spr_write_generic
,
2159 /* XXX : not implemented */
2160 spr_register(env
, SPR_40x_IAC2
, "IAC2",
2161 SPR_NOACCESS
, SPR_NOACCESS
,
2162 &spr_read_generic
, &spr_write_generic
,
2166 static void gen_spr_403_real (CPUPPCState
*env
)
2168 spr_register(env
, SPR_403_PBL1
, "PBL1",
2169 SPR_NOACCESS
, SPR_NOACCESS
,
2170 &spr_read_403_pbr
, &spr_write_403_pbr
,
2172 spr_register(env
, SPR_403_PBU1
, "PBU1",
2173 SPR_NOACCESS
, SPR_NOACCESS
,
2174 &spr_read_403_pbr
, &spr_write_403_pbr
,
2176 spr_register(env
, SPR_403_PBL2
, "PBL2",
2177 SPR_NOACCESS
, SPR_NOACCESS
,
2178 &spr_read_403_pbr
, &spr_write_403_pbr
,
2180 spr_register(env
, SPR_403_PBU2
, "PBU2",
2181 SPR_NOACCESS
, SPR_NOACCESS
,
2182 &spr_read_403_pbr
, &spr_write_403_pbr
,
2186 static void gen_spr_403_mmu (CPUPPCState
*env
)
2189 spr_register(env
, SPR_40x_PID
, "PID",
2190 SPR_NOACCESS
, SPR_NOACCESS
,
2191 &spr_read_generic
, &spr_write_generic
,
2193 spr_register(env
, SPR_40x_ZPR
, "ZPR",
2194 SPR_NOACCESS
, SPR_NOACCESS
,
2195 &spr_read_generic
, &spr_write_generic
,
2199 /* SPR specific to PowerPC compression coprocessor extension */
2200 static void gen_spr_compress (CPUPPCState
*env
)
2202 /* XXX : not implemented */
2203 spr_register(env
, SPR_401_SKR
, "SKR",
2204 SPR_NOACCESS
, SPR_NOACCESS
,
2205 &spr_read_generic
, &spr_write_generic
,
2209 static void gen_spr_5xx_8xx (CPUPPCState
*env
)
2211 /* Exception processing */
2212 spr_register_kvm(env
, SPR_DSISR
, "DSISR",
2213 SPR_NOACCESS
, SPR_NOACCESS
,
2214 &spr_read_generic
, &spr_write_generic
,
2215 KVM_REG_PPC_DSISR
, 0x00000000);
2216 spr_register_kvm(env
, SPR_DAR
, "DAR",
2217 SPR_NOACCESS
, SPR_NOACCESS
,
2218 &spr_read_generic
, &spr_write_generic
,
2219 KVM_REG_PPC_DAR
, 0x00000000);
2221 spr_register(env
, SPR_DECR
, "DECR",
2222 SPR_NOACCESS
, SPR_NOACCESS
,
2223 &spr_read_decr
, &spr_write_decr
,
2225 /* XXX : not implemented */
2226 spr_register(env
, SPR_MPC_EIE
, "EIE",
2227 SPR_NOACCESS
, SPR_NOACCESS
,
2228 &spr_read_generic
, &spr_write_generic
,
2230 /* XXX : not implemented */
2231 spr_register(env
, SPR_MPC_EID
, "EID",
2232 SPR_NOACCESS
, SPR_NOACCESS
,
2233 &spr_read_generic
, &spr_write_generic
,
2235 /* XXX : not implemented */
2236 spr_register(env
, SPR_MPC_NRI
, "NRI",
2237 SPR_NOACCESS
, SPR_NOACCESS
,
2238 &spr_read_generic
, &spr_write_generic
,
2240 /* XXX : not implemented */
2241 spr_register(env
, SPR_MPC_CMPA
, "CMPA",
2242 SPR_NOACCESS
, SPR_NOACCESS
,
2243 &spr_read_generic
, &spr_write_generic
,
2245 /* XXX : not implemented */
2246 spr_register(env
, SPR_MPC_CMPB
, "CMPB",
2247 SPR_NOACCESS
, SPR_NOACCESS
,
2248 &spr_read_generic
, &spr_write_generic
,
2250 /* XXX : not implemented */
2251 spr_register(env
, SPR_MPC_CMPC
, "CMPC",
2252 SPR_NOACCESS
, SPR_NOACCESS
,
2253 &spr_read_generic
, &spr_write_generic
,
2255 /* XXX : not implemented */
2256 spr_register(env
, SPR_MPC_CMPD
, "CMPD",
2257 SPR_NOACCESS
, SPR_NOACCESS
,
2258 &spr_read_generic
, &spr_write_generic
,
2260 /* XXX : not implemented */
2261 spr_register(env
, SPR_MPC_ECR
, "ECR",
2262 SPR_NOACCESS
, SPR_NOACCESS
,
2263 &spr_read_generic
, &spr_write_generic
,
2265 /* XXX : not implemented */
2266 spr_register(env
, SPR_MPC_DER
, "DER",
2267 SPR_NOACCESS
, SPR_NOACCESS
,
2268 &spr_read_generic
, &spr_write_generic
,
2270 /* XXX : not implemented */
2271 spr_register(env
, SPR_MPC_COUNTA
, "COUNTA",
2272 SPR_NOACCESS
, SPR_NOACCESS
,
2273 &spr_read_generic
, &spr_write_generic
,
2275 /* XXX : not implemented */
2276 spr_register(env
, SPR_MPC_COUNTB
, "COUNTB",
2277 SPR_NOACCESS
, SPR_NOACCESS
,
2278 &spr_read_generic
, &spr_write_generic
,
2280 /* XXX : not implemented */
2281 spr_register(env
, SPR_MPC_CMPE
, "CMPE",
2282 SPR_NOACCESS
, SPR_NOACCESS
,
2283 &spr_read_generic
, &spr_write_generic
,
2285 /* XXX : not implemented */
2286 spr_register(env
, SPR_MPC_CMPF
, "CMPF",
2287 SPR_NOACCESS
, SPR_NOACCESS
,
2288 &spr_read_generic
, &spr_write_generic
,
2290 /* XXX : not implemented */
2291 spr_register(env
, SPR_MPC_CMPG
, "CMPG",
2292 SPR_NOACCESS
, SPR_NOACCESS
,
2293 &spr_read_generic
, &spr_write_generic
,
2295 /* XXX : not implemented */
2296 spr_register(env
, SPR_MPC_CMPH
, "CMPH",
2297 SPR_NOACCESS
, SPR_NOACCESS
,
2298 &spr_read_generic
, &spr_write_generic
,
2300 /* XXX : not implemented */
2301 spr_register(env
, SPR_MPC_LCTRL1
, "LCTRL1",
2302 SPR_NOACCESS
, SPR_NOACCESS
,
2303 &spr_read_generic
, &spr_write_generic
,
2305 /* XXX : not implemented */
2306 spr_register(env
, SPR_MPC_LCTRL2
, "LCTRL2",
2307 SPR_NOACCESS
, SPR_NOACCESS
,
2308 &spr_read_generic
, &spr_write_generic
,
2310 /* XXX : not implemented */
2311 spr_register(env
, SPR_MPC_BAR
, "BAR",
2312 SPR_NOACCESS
, SPR_NOACCESS
,
2313 &spr_read_generic
, &spr_write_generic
,
2315 /* XXX : not implemented */
2316 spr_register(env
, SPR_MPC_DPDR
, "DPDR",
2317 SPR_NOACCESS
, SPR_NOACCESS
,
2318 &spr_read_generic
, &spr_write_generic
,
2320 /* XXX : not implemented */
2321 spr_register(env
, SPR_MPC_IMMR
, "IMMR",
2322 SPR_NOACCESS
, SPR_NOACCESS
,
2323 &spr_read_generic
, &spr_write_generic
,
2327 static void gen_spr_5xx (CPUPPCState
*env
)
2329 /* XXX : not implemented */
2330 spr_register(env
, SPR_RCPU_MI_GRA
, "MI_GRA",
2331 SPR_NOACCESS
, SPR_NOACCESS
,
2332 &spr_read_generic
, &spr_write_generic
,
2334 /* XXX : not implemented */
2335 spr_register(env
, SPR_RCPU_L2U_GRA
, "L2U_GRA",
2336 SPR_NOACCESS
, SPR_NOACCESS
,
2337 &spr_read_generic
, &spr_write_generic
,
2339 /* XXX : not implemented */
2340 spr_register(env
, SPR_RPCU_BBCMCR
, "L2U_BBCMCR",
2341 SPR_NOACCESS
, SPR_NOACCESS
,
2342 &spr_read_generic
, &spr_write_generic
,
2344 /* XXX : not implemented */
2345 spr_register(env
, SPR_RCPU_L2U_MCR
, "L2U_MCR",
2346 SPR_NOACCESS
, SPR_NOACCESS
,
2347 &spr_read_generic
, &spr_write_generic
,
2349 /* XXX : not implemented */
2350 spr_register(env
, SPR_RCPU_MI_RBA0
, "MI_RBA0",
2351 SPR_NOACCESS
, SPR_NOACCESS
,
2352 &spr_read_generic
, &spr_write_generic
,
2354 /* XXX : not implemented */
2355 spr_register(env
, SPR_RCPU_MI_RBA1
, "MI_RBA1",
2356 SPR_NOACCESS
, SPR_NOACCESS
,
2357 &spr_read_generic
, &spr_write_generic
,
2359 /* XXX : not implemented */
2360 spr_register(env
, SPR_RCPU_MI_RBA2
, "MI_RBA2",
2361 SPR_NOACCESS
, SPR_NOACCESS
,
2362 &spr_read_generic
, &spr_write_generic
,
2364 /* XXX : not implemented */
2365 spr_register(env
, SPR_RCPU_MI_RBA3
, "MI_RBA3",
2366 SPR_NOACCESS
, SPR_NOACCESS
,
2367 &spr_read_generic
, &spr_write_generic
,
2369 /* XXX : not implemented */
2370 spr_register(env
, SPR_RCPU_L2U_RBA0
, "L2U_RBA0",
2371 SPR_NOACCESS
, SPR_NOACCESS
,
2372 &spr_read_generic
, &spr_write_generic
,
2374 /* XXX : not implemented */
2375 spr_register(env
, SPR_RCPU_L2U_RBA1
, "L2U_RBA1",
2376 SPR_NOACCESS
, SPR_NOACCESS
,
2377 &spr_read_generic
, &spr_write_generic
,
2379 /* XXX : not implemented */
2380 spr_register(env
, SPR_RCPU_L2U_RBA2
, "L2U_RBA2",
2381 SPR_NOACCESS
, SPR_NOACCESS
,
2382 &spr_read_generic
, &spr_write_generic
,
2384 /* XXX : not implemented */
2385 spr_register(env
, SPR_RCPU_L2U_RBA3
, "L2U_RBA3",
2386 SPR_NOACCESS
, SPR_NOACCESS
,
2387 &spr_read_generic
, &spr_write_generic
,
2389 /* XXX : not implemented */
2390 spr_register(env
, SPR_RCPU_MI_RA0
, "MI_RA0",
2391 SPR_NOACCESS
, SPR_NOACCESS
,
2392 &spr_read_generic
, &spr_write_generic
,
2394 /* XXX : not implemented */
2395 spr_register(env
, SPR_RCPU_MI_RA1
, "MI_RA1",
2396 SPR_NOACCESS
, SPR_NOACCESS
,
2397 &spr_read_generic
, &spr_write_generic
,
2399 /* XXX : not implemented */
2400 spr_register(env
, SPR_RCPU_MI_RA2
, "MI_RA2",
2401 SPR_NOACCESS
, SPR_NOACCESS
,
2402 &spr_read_generic
, &spr_write_generic
,
2404 /* XXX : not implemented */
2405 spr_register(env
, SPR_RCPU_MI_RA3
, "MI_RA3",
2406 SPR_NOACCESS
, SPR_NOACCESS
,
2407 &spr_read_generic
, &spr_write_generic
,
2409 /* XXX : not implemented */
2410 spr_register(env
, SPR_RCPU_L2U_RA0
, "L2U_RA0",
2411 SPR_NOACCESS
, SPR_NOACCESS
,
2412 &spr_read_generic
, &spr_write_generic
,
2414 /* XXX : not implemented */
2415 spr_register(env
, SPR_RCPU_L2U_RA1
, "L2U_RA1",
2416 SPR_NOACCESS
, SPR_NOACCESS
,
2417 &spr_read_generic
, &spr_write_generic
,
2419 /* XXX : not implemented */
2420 spr_register(env
, SPR_RCPU_L2U_RA2
, "L2U_RA2",
2421 SPR_NOACCESS
, SPR_NOACCESS
,
2422 &spr_read_generic
, &spr_write_generic
,
2424 /* XXX : not implemented */
2425 spr_register(env
, SPR_RCPU_L2U_RA3
, "L2U_RA3",
2426 SPR_NOACCESS
, SPR_NOACCESS
,
2427 &spr_read_generic
, &spr_write_generic
,
2429 /* XXX : not implemented */
2430 spr_register(env
, SPR_RCPU_FPECR
, "FPECR",
2431 SPR_NOACCESS
, SPR_NOACCESS
,
2432 &spr_read_generic
, &spr_write_generic
,
2436 static void gen_spr_8xx (CPUPPCState
*env
)
2438 /* XXX : not implemented */
2439 spr_register(env
, SPR_MPC_IC_CST
, "IC_CST",
2440 SPR_NOACCESS
, SPR_NOACCESS
,
2441 &spr_read_generic
, &spr_write_generic
,
2443 /* XXX : not implemented */
2444 spr_register(env
, SPR_MPC_IC_ADR
, "IC_ADR",
2445 SPR_NOACCESS
, SPR_NOACCESS
,
2446 &spr_read_generic
, &spr_write_generic
,
2448 /* XXX : not implemented */
2449 spr_register(env
, SPR_MPC_IC_DAT
, "IC_DAT",
2450 SPR_NOACCESS
, SPR_NOACCESS
,
2451 &spr_read_generic
, &spr_write_generic
,
2453 /* XXX : not implemented */
2454 spr_register(env
, SPR_MPC_DC_CST
, "DC_CST",
2455 SPR_NOACCESS
, SPR_NOACCESS
,
2456 &spr_read_generic
, &spr_write_generic
,
2458 /* XXX : not implemented */
2459 spr_register(env
, SPR_MPC_DC_ADR
, "DC_ADR",
2460 SPR_NOACCESS
, SPR_NOACCESS
,
2461 &spr_read_generic
, &spr_write_generic
,
2463 /* XXX : not implemented */
2464 spr_register(env
, SPR_MPC_DC_DAT
, "DC_DAT",
2465 SPR_NOACCESS
, SPR_NOACCESS
,
2466 &spr_read_generic
, &spr_write_generic
,
2468 /* XXX : not implemented */
2469 spr_register(env
, SPR_MPC_MI_CTR
, "MI_CTR",
2470 SPR_NOACCESS
, SPR_NOACCESS
,
2471 &spr_read_generic
, &spr_write_generic
,
2473 /* XXX : not implemented */
2474 spr_register(env
, SPR_MPC_MI_AP
, "MI_AP",
2475 SPR_NOACCESS
, SPR_NOACCESS
,
2476 &spr_read_generic
, &spr_write_generic
,
2478 /* XXX : not implemented */
2479 spr_register(env
, SPR_MPC_MI_EPN
, "MI_EPN",
2480 SPR_NOACCESS
, SPR_NOACCESS
,
2481 &spr_read_generic
, &spr_write_generic
,
2483 /* XXX : not implemented */
2484 spr_register(env
, SPR_MPC_MI_TWC
, "MI_TWC",
2485 SPR_NOACCESS
, SPR_NOACCESS
,
2486 &spr_read_generic
, &spr_write_generic
,
2488 /* XXX : not implemented */
2489 spr_register(env
, SPR_MPC_MI_RPN
, "MI_RPN",
2490 SPR_NOACCESS
, SPR_NOACCESS
,
2491 &spr_read_generic
, &spr_write_generic
,
2493 /* XXX : not implemented */
2494 spr_register(env
, SPR_MPC_MI_DBCAM
, "MI_DBCAM",
2495 SPR_NOACCESS
, SPR_NOACCESS
,
2496 &spr_read_generic
, &spr_write_generic
,
2498 /* XXX : not implemented */
2499 spr_register(env
, SPR_MPC_MI_DBRAM0
, "MI_DBRAM0",
2500 SPR_NOACCESS
, SPR_NOACCESS
,
2501 &spr_read_generic
, &spr_write_generic
,
2503 /* XXX : not implemented */
2504 spr_register(env
, SPR_MPC_MI_DBRAM1
, "MI_DBRAM1",
2505 SPR_NOACCESS
, SPR_NOACCESS
,
2506 &spr_read_generic
, &spr_write_generic
,
2508 /* XXX : not implemented */
2509 spr_register(env
, SPR_MPC_MD_CTR
, "MD_CTR",
2510 SPR_NOACCESS
, SPR_NOACCESS
,
2511 &spr_read_generic
, &spr_write_generic
,
2513 /* XXX : not implemented */
2514 spr_register(env
, SPR_MPC_MD_CASID
, "MD_CASID",
2515 SPR_NOACCESS
, SPR_NOACCESS
,
2516 &spr_read_generic
, &spr_write_generic
,
2518 /* XXX : not implemented */
2519 spr_register(env
, SPR_MPC_MD_AP
, "MD_AP",
2520 SPR_NOACCESS
, SPR_NOACCESS
,
2521 &spr_read_generic
, &spr_write_generic
,
2523 /* XXX : not implemented */
2524 spr_register(env
, SPR_MPC_MD_EPN
, "MD_EPN",
2525 SPR_NOACCESS
, SPR_NOACCESS
,
2526 &spr_read_generic
, &spr_write_generic
,
2528 /* XXX : not implemented */
2529 spr_register(env
, SPR_MPC_MD_TWB
, "MD_TWB",
2530 SPR_NOACCESS
, SPR_NOACCESS
,
2531 &spr_read_generic
, &spr_write_generic
,
2533 /* XXX : not implemented */
2534 spr_register(env
, SPR_MPC_MD_TWC
, "MD_TWC",
2535 SPR_NOACCESS
, SPR_NOACCESS
,
2536 &spr_read_generic
, &spr_write_generic
,
2538 /* XXX : not implemented */
2539 spr_register(env
, SPR_MPC_MD_RPN
, "MD_RPN",
2540 SPR_NOACCESS
, SPR_NOACCESS
,
2541 &spr_read_generic
, &spr_write_generic
,
2543 /* XXX : not implemented */
2544 spr_register(env
, SPR_MPC_MD_TW
, "MD_TW",
2545 SPR_NOACCESS
, SPR_NOACCESS
,
2546 &spr_read_generic
, &spr_write_generic
,
2548 /* XXX : not implemented */
2549 spr_register(env
, SPR_MPC_MD_DBCAM
, "MD_DBCAM",
2550 SPR_NOACCESS
, SPR_NOACCESS
,
2551 &spr_read_generic
, &spr_write_generic
,
2553 /* XXX : not implemented */
2554 spr_register(env
, SPR_MPC_MD_DBRAM0
, "MD_DBRAM0",
2555 SPR_NOACCESS
, SPR_NOACCESS
,
2556 &spr_read_generic
, &spr_write_generic
,
2558 /* XXX : not implemented */
2559 spr_register(env
, SPR_MPC_MD_DBRAM1
, "MD_DBRAM1",
2560 SPR_NOACCESS
, SPR_NOACCESS
,
2561 &spr_read_generic
, &spr_write_generic
,
2567 * AMR => SPR 29 (Power 2.04)
2568 * CTRL => SPR 136 (Power 2.04)
2569 * CTRL => SPR 152 (Power 2.04)
2570 * SCOMC => SPR 276 (64 bits ?)
2571 * SCOMD => SPR 277 (64 bits ?)
2572 * TBU40 => SPR 286 (Power 2.04 hypv)
2573 * HSPRG0 => SPR 304 (Power 2.04 hypv)
2574 * HSPRG1 => SPR 305 (Power 2.04 hypv)
2575 * HDSISR => SPR 306 (Power 2.04 hypv)
2576 * HDAR => SPR 307 (Power 2.04 hypv)
2577 * PURR => SPR 309 (Power 2.04 hypv)
2578 * HDEC => SPR 310 (Power 2.04 hypv)
2579 * HIOR => SPR 311 (hypv)
2580 * RMOR => SPR 312 (970)
2581 * HRMOR => SPR 313 (Power 2.04 hypv)
2582 * HSRR0 => SPR 314 (Power 2.04 hypv)
2583 * HSRR1 => SPR 315 (Power 2.04 hypv)
2584 * LPIDR => SPR 317 (970)
2585 * EPR => SPR 702 (Power 2.04 emb)
2586 * perf => 768-783 (Power 2.04)
2587 * perf => 784-799 (Power 2.04)
2588 * PPR => SPR 896 (Power 2.04)
2589 * EPLC => SPR 947 (Power 2.04 emb)
2590 * EPSC => SPR 948 (Power 2.04 emb)
2591 * DABRX => 1015 (Power 2.04 hypv)
2592 * FPECR => SPR 1022 (?)
2593 * ... and more (thermal management, performance counters, ...)
2596 /*****************************************************************************/
2597 /* Exception vectors models */
2598 static void init_excp_4xx_real (CPUPPCState
*env
)
2600 #if !defined(CONFIG_USER_ONLY)
2601 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000100;
2602 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2603 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2604 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2605 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2606 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2607 env
->excp_vectors
[POWERPC_EXCP_PIT
] = 0x00001000;
2608 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00001010;
2609 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00001020;
2610 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00002000;
2611 env
->ivor_mask
= 0x0000FFF0UL
;
2612 env
->ivpr_mask
= 0xFFFF0000UL
;
2613 /* Hardware reset vector */
2614 env
->hreset_vector
= 0xFFFFFFFCUL
;
2618 static void init_excp_4xx_softmmu (CPUPPCState
*env
)
2620 #if !defined(CONFIG_USER_ONLY)
2621 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000100;
2622 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2623 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2624 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2625 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2626 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2627 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2628 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2629 env
->excp_vectors
[POWERPC_EXCP_PIT
] = 0x00001000;
2630 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00001010;
2631 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00001020;
2632 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001100;
2633 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001200;
2634 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00002000;
2635 env
->ivor_mask
= 0x0000FFF0UL
;
2636 env
->ivpr_mask
= 0xFFFF0000UL
;
2637 /* Hardware reset vector */
2638 env
->hreset_vector
= 0xFFFFFFFCUL
;
2642 static void init_excp_MPC5xx (CPUPPCState
*env
)
2644 #if !defined(CONFIG_USER_ONLY)
2645 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2646 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2647 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2648 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2649 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2650 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000900;
2651 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2652 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2653 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2654 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
2655 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
2656 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
2657 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
2658 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
2659 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
2660 env
->ivor_mask
= 0x0000FFF0UL
;
2661 env
->ivpr_mask
= 0xFFFF0000UL
;
2662 /* Hardware reset vector */
2663 env
->hreset_vector
= 0x00000100UL
;
2667 static void init_excp_MPC8xx (CPUPPCState
*env
)
2669 #if !defined(CONFIG_USER_ONLY)
2670 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2671 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2672 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2673 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2674 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2675 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2676 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2677 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000900;
2678 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2679 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2680 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2681 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
2682 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
2683 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001100;
2684 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001200;
2685 env
->excp_vectors
[POWERPC_EXCP_ITLBE
] = 0x00001300;
2686 env
->excp_vectors
[POWERPC_EXCP_DTLBE
] = 0x00001400;
2687 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
2688 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
2689 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
2690 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
2691 env
->ivor_mask
= 0x0000FFF0UL
;
2692 env
->ivpr_mask
= 0xFFFF0000UL
;
2693 /* Hardware reset vector */
2694 env
->hreset_vector
= 0x00000100UL
;
2698 static void init_excp_G2 (CPUPPCState
*env
)
2700 #if !defined(CONFIG_USER_ONLY)
2701 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2702 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2703 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2704 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2705 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2706 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2707 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2708 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2709 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2710 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000A00;
2711 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2712 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2713 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2714 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2715 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2716 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2717 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2718 /* Hardware reset vector */
2719 env
->hreset_vector
= 0x00000100UL
;
2723 static void init_excp_e200(CPUPPCState
*env
, target_ulong ivpr_mask
)
2725 #if !defined(CONFIG_USER_ONLY)
2726 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000FFC;
2727 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
2728 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
2729 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
2730 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
2731 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
2732 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
2733 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
2734 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
2735 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
2736 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
2737 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
2738 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
2739 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
2740 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
2741 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
2742 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
2743 env
->excp_vectors
[POWERPC_EXCP_SPEU
] = 0x00000000;
2744 env
->excp_vectors
[POWERPC_EXCP_EFPDI
] = 0x00000000;
2745 env
->excp_vectors
[POWERPC_EXCP_EFPRI
] = 0x00000000;
2746 env
->ivor_mask
= 0x0000FFF7UL
;
2747 env
->ivpr_mask
= ivpr_mask
;
2748 /* Hardware reset vector */
2749 env
->hreset_vector
= 0xFFFFFFFCUL
;
2753 static void init_excp_BookE (CPUPPCState
*env
)
2755 #if !defined(CONFIG_USER_ONLY)
2756 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
2757 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
2758 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
2759 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
2760 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
2761 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
2762 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
2763 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
2764 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
2765 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
2766 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
2767 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
2768 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
2769 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
2770 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
2771 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
2772 env
->ivor_mask
= 0x0000FFE0UL
;
2773 env
->ivpr_mask
= 0xFFFF0000UL
;
2774 /* Hardware reset vector */
2775 env
->hreset_vector
= 0xFFFFFFFCUL
;
2779 static void init_excp_601 (CPUPPCState
*env
)
2781 #if !defined(CONFIG_USER_ONLY)
2782 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2783 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2784 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2785 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2786 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2787 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2788 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2789 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2790 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2791 env
->excp_vectors
[POWERPC_EXCP_IO
] = 0x00000A00;
2792 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2793 env
->excp_vectors
[POWERPC_EXCP_RUNM
] = 0x00002000;
2794 /* Hardware reset vector */
2795 env
->hreset_vector
= 0x00000100UL
;
2799 static void init_excp_602 (CPUPPCState
*env
)
2801 #if !defined(CONFIG_USER_ONLY)
2802 /* XXX: exception prefix has a special behavior on 602 */
2803 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2804 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2805 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2806 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2807 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2808 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2809 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2810 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2811 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2812 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2813 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2814 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2815 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2816 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2817 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2818 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2819 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00001500;
2820 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001600;
2821 /* Hardware reset vector */
2822 env
->hreset_vector
= 0x00000100UL
;
2826 static void init_excp_603 (CPUPPCState
*env
)
2828 #if !defined(CONFIG_USER_ONLY)
2829 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2830 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2831 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2832 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2833 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2834 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2835 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2836 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2837 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2838 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2839 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2840 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2841 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2842 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2843 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2844 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2845 /* Hardware reset vector */
2846 env
->hreset_vector
= 0x00000100UL
;
2850 static void init_excp_604 (CPUPPCState
*env
)
2852 #if !defined(CONFIG_USER_ONLY)
2853 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2854 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2855 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2856 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2857 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2858 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2859 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2860 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2861 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2862 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2863 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2864 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2865 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2866 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2867 /* Hardware reset vector */
2868 env
->hreset_vector
= 0x00000100UL
;
2872 static void init_excp_7x0 (CPUPPCState
*env
)
2874 #if !defined(CONFIG_USER_ONLY)
2875 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2876 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2877 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2878 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2879 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2880 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2881 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2882 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2883 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2884 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2885 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2886 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2887 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2888 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2889 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2890 /* Hardware reset vector */
2891 env
->hreset_vector
= 0x00000100UL
;
2895 static void init_excp_750cl (CPUPPCState
*env
)
2897 #if !defined(CONFIG_USER_ONLY)
2898 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2899 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2900 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2901 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2902 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2903 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2904 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2905 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2906 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2907 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2908 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2909 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2910 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2911 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2912 /* Hardware reset vector */
2913 env
->hreset_vector
= 0x00000100UL
;
2917 static void init_excp_750cx (CPUPPCState
*env
)
2919 #if !defined(CONFIG_USER_ONLY)
2920 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2921 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2922 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2923 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2924 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2925 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2926 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2927 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2928 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2929 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2930 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2931 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2932 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2933 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2934 /* Hardware reset vector */
2935 env
->hreset_vector
= 0x00000100UL
;
2939 /* XXX: Check if this is correct */
2940 static void init_excp_7x5 (CPUPPCState
*env
)
2942 #if !defined(CONFIG_USER_ONLY)
2943 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2944 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2945 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2946 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2947 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2948 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2949 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2950 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2951 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2952 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2953 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2954 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2955 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2956 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2957 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2958 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2959 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2960 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2961 /* Hardware reset vector */
2962 env
->hreset_vector
= 0x00000100UL
;
2966 static void init_excp_7400 (CPUPPCState
*env
)
2968 #if !defined(CONFIG_USER_ONLY)
2969 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2970 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2971 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2972 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2973 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2974 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2975 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2976 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2977 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2978 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2979 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2980 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2981 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2982 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2983 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2984 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
2985 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2986 /* Hardware reset vector */
2987 env
->hreset_vector
= 0x00000100UL
;
2991 static void init_excp_7450 (CPUPPCState
*env
)
2993 #if !defined(CONFIG_USER_ONLY)
2994 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2995 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2996 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2997 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2998 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2999 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
3000 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
3001 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
3002 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
3003 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
3004 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
3005 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
3006 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
3007 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
3008 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
3009 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
3010 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
3011 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
3012 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
3013 /* Hardware reset vector */
3014 env
->hreset_vector
= 0x00000100UL
;
3018 #if defined (TARGET_PPC64)
3019 static void init_excp_970 (CPUPPCState
*env
)
3021 #if !defined(CONFIG_USER_ONLY)
3022 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
3023 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
3024 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
3025 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
3026 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
3027 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
3028 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
3029 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
3030 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
3031 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
3032 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
3033 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
3034 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
3035 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
3036 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
3037 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
3038 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
3039 env
->excp_vectors
[POWERPC_EXCP_MAINT
] = 0x00001600;
3040 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001700;
3041 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001800;
3042 /* Hardware reset vector */
3043 env
->hreset_vector
= 0x0000000000000100ULL
;
3047 static void init_excp_POWER7 (CPUPPCState
*env
)
3049 #if !defined(CONFIG_USER_ONLY)
3050 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
3051 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
3052 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
3053 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
3054 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
3055 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
3056 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
3057 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
3058 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
3059 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
3060 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
3061 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
3062 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
3063 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
3064 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
3065 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
3066 env
->excp_vectors
[POWERPC_EXCP_VSXU
] = 0x00000F40;
3067 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
3068 env
->excp_vectors
[POWERPC_EXCP_MAINT
] = 0x00001600;
3069 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001700;
3070 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001800;
3071 /* Hardware reset vector */
3072 env
->hreset_vector
= 0x0000000000000100ULL
;
3077 /*****************************************************************************/
3078 /* Power management enable checks */
3079 static int check_pow_none (CPUPPCState
*env
)
3084 static int check_pow_nocheck (CPUPPCState
*env
)
3089 static int check_pow_hid0 (CPUPPCState
*env
)
3091 if (env
->spr
[SPR_HID0
] & 0x00E00000)
3097 static int check_pow_hid0_74xx (CPUPPCState
*env
)
3099 if (env
->spr
[SPR_HID0
] & 0x00600000)
3105 /*****************************************************************************/
3106 /* PowerPC implementations definitions */
3108 #define POWERPC_FAMILY(_name) \
3110 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
3112 static const TypeInfo \
3113 glue(glue(ppc_, _name), _cpu_family_type_info) = { \