1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "disas/bfd.h"
22#include "exec/gdbstub.h"
23#include "kvm_ppc.h"
24#include "sysemu/arch_init.h"
25#include "sysemu/cpus.h"
26#include "sysemu/hw_accel.h"
27#include "cpu-models.h"
28#include "mmu-hash32.h"
29#include "mmu-hash64.h"
30#include "qemu/error-report.h"
31#include "qapi/error.h"
32#include "qapi/qmp/qnull.h"
33#include "qapi/visitor.h"
34#include "hw/qdev-properties.h"
35#include "hw/ppc/ppc.h"
36#include "mmu-book3s-v3.h"
37#include "sysemu/qtest.h"
38#include "qemu/cutils.h"
39#include "disas/capstone.h"
40#include "fpu/softfloat.h"
41#include "qapi/qapi-commands-target.h"
42
43
44
45
46
47
48
49
50
51static void spr_load_dump_spr(int sprn)
52{
53#ifdef PPC_DUMP_SPR_ACCESSES
54 TCGv_i32 t0 = tcg_const_i32(sprn);
55 gen_helper_load_dump_spr(cpu_env, t0);
56 tcg_temp_free_i32(t0);
57#endif
58}
59
60static void spr_read_generic (DisasContext *ctx, int gprn, int sprn)
61{
62 gen_load_spr(cpu_gpr[gprn], sprn);
63 spr_load_dump_spr(sprn);
64}
65
66static void spr_store_dump_spr(int sprn)
67{
68#ifdef PPC_DUMP_SPR_ACCESSES
69 TCGv_i32 t0 = tcg_const_i32(sprn);
70 gen_helper_store_dump_spr(cpu_env, t0);
71 tcg_temp_free_i32(t0);
72#endif
73}
74
75static void spr_write_generic(DisasContext *ctx, int sprn, int gprn)
76{
77 gen_store_spr(sprn, cpu_gpr[gprn]);
78 spr_store_dump_spr(sprn);
79}
80
81#if !defined(CONFIG_USER_ONLY)
82static void spr_write_generic32(DisasContext *ctx, int sprn, int gprn)
83{
84#ifdef TARGET_PPC64
85 TCGv t0 = tcg_temp_new();
86 tcg_gen_ext32u_tl(t0, cpu_gpr[gprn]);
87 gen_store_spr(sprn, t0);
88 tcg_temp_free(t0);
89 spr_store_dump_spr(sprn);
90#else
91 spr_write_generic(ctx, sprn, gprn);
92#endif
93}
94
95static void spr_write_clear(DisasContext *ctx, int sprn, int gprn)
96{
97 TCGv t0 = tcg_temp_new();
98 TCGv t1 = tcg_temp_new();
99 gen_load_spr(t0, sprn);
100 tcg_gen_neg_tl(t1, cpu_gpr[gprn]);
101 tcg_gen_and_tl(t0, t0, t1);
102 gen_store_spr(sprn, t0);
103 tcg_temp_free(t0);
104 tcg_temp_free(t1);
105}
106
107static void spr_access_nop(DisasContext *ctx, int sprn, int gprn)
108{
109}
110
111#endif
112
113
114
115static void spr_read_xer(DisasContext *ctx, int gprn, int sprn)
116{
117 gen_read_xer(ctx, cpu_gpr[gprn]);
118}
119
120static void spr_write_xer(DisasContext *ctx, int sprn, int gprn)
121{
122 gen_write_xer(cpu_gpr[gprn]);
123}
124
125
126static void spr_read_lr(DisasContext *ctx, int gprn, int sprn)
127{
128 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_lr);
129}
130
131static void spr_write_lr(DisasContext *ctx, int sprn, int gprn)
132{
133 tcg_gen_mov_tl(cpu_lr, cpu_gpr[gprn]);
134}
135
136
137#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
138static void spr_read_cfar(DisasContext *ctx, int gprn, int sprn)
139{
140 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_cfar);
141}
142
143static void spr_write_cfar(DisasContext *ctx, int sprn, int gprn)
144{
145 tcg_gen_mov_tl(cpu_cfar, cpu_gpr[gprn]);
146}
147#endif
148
149
150static void spr_read_ctr(DisasContext *ctx, int gprn, int sprn)
151{
152 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_ctr);
153}
154
155static void spr_write_ctr(DisasContext *ctx, int sprn, int gprn)
156{
157 tcg_gen_mov_tl(cpu_ctr, cpu_gpr[gprn]);
158}
159
160
161
162
163
164
165
166static void spr_read_ureg(DisasContext *ctx, int gprn, int sprn)
167{
168 gen_load_spr(cpu_gpr[gprn], sprn + 0x10);
169}
170
171#if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
172static void spr_write_ureg(DisasContext *ctx, int sprn, int gprn)
173{
174 gen_store_spr(sprn + 0x10, cpu_gpr[gprn]);
175}
176#endif
177
178
179
180#if !defined(CONFIG_USER_ONLY)
181static void spr_read_decr(DisasContext *ctx, int gprn, int sprn)
182{
183 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
184 gen_io_start();
185 }
186 gen_helper_load_decr(cpu_gpr[gprn], cpu_env);
187 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
188 gen_io_end();
189 gen_stop_exception(ctx);
190 }
191}
192
193static void spr_write_decr(DisasContext *ctx, int sprn, int gprn)
194{
195 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
196 gen_io_start();
197 }
198 gen_helper_store_decr(cpu_env, cpu_gpr[gprn]);
199 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
200 gen_io_end();
201 gen_stop_exception(ctx);
202 }
203}
204#endif
205
206
207
208static void spr_read_tbl(DisasContext *ctx, int gprn, int sprn)
209{
210 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
211 gen_io_start();
212 }
213 gen_helper_load_tbl(cpu_gpr[gprn], cpu_env);
214 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
215 gen_io_end();
216 gen_stop_exception(ctx);
217 }
218}
219
220static void spr_read_tbu(DisasContext *ctx, int gprn, int sprn)
221{
222 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
223 gen_io_start();
224 }
225 gen_helper_load_tbu(cpu_gpr[gprn], cpu_env);
226 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
227 gen_io_end();
228 gen_stop_exception(ctx);
229 }
230}
231
232__attribute__ (( unused ))
233static void spr_read_atbl(DisasContext *ctx, int gprn, int sprn)
234{
235 gen_helper_load_atbl(cpu_gpr[gprn], cpu_env);
236}
237
238__attribute__ (( unused ))
239static void spr_read_atbu(DisasContext *ctx, int gprn, int sprn)
240{
241 gen_helper_load_atbu(cpu_gpr[gprn], cpu_env);
242}
243
244#if !defined(CONFIG_USER_ONLY)
245static void spr_write_tbl(DisasContext *ctx, int sprn, int gprn)
246{
247 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
248 gen_io_start();
249 }
250 gen_helper_store_tbl(cpu_env, cpu_gpr[gprn]);
251 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
252 gen_io_end();
253 gen_stop_exception(ctx);
254 }
255}
256
257static void spr_write_tbu(DisasContext *ctx, int sprn, int gprn)
258{
259 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
260 gen_io_start();
261 }
262 gen_helper_store_tbu(cpu_env, cpu_gpr[gprn]);
263 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
264 gen_io_end();
265 gen_stop_exception(ctx);
266 }
267}
268
269__attribute__ (( unused ))
270static void spr_write_atbl(DisasContext *ctx, int sprn, int gprn)
271{
272 gen_helper_store_atbl(cpu_env, cpu_gpr[gprn]);
273}
274
275__attribute__ (( unused ))
276static void spr_write_atbu(DisasContext *ctx, int sprn, int gprn)
277{
278 gen_helper_store_atbu(cpu_env, cpu_gpr[gprn]);
279}
280
281#if defined(TARGET_PPC64)
282__attribute__ (( unused ))
283static void spr_read_purr(DisasContext *ctx, int gprn, int sprn)
284{
285 gen_helper_load_purr(cpu_gpr[gprn], cpu_env);
286}
287
288
289static void spr_read_hdecr(DisasContext *ctx, int gprn, int sprn)
290{
291 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
292 gen_io_start();
293 }
294 gen_helper_load_hdecr(cpu_gpr[gprn], cpu_env);
295 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
296 gen_io_end();
297 gen_stop_exception(ctx);
298 }
299}
300
301static void spr_write_hdecr(DisasContext *ctx, int sprn, int gprn)
302{
303 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
304 gen_io_start();
305 }
306 gen_helper_store_hdecr(cpu_env, cpu_gpr[gprn]);
307 if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
308 gen_io_end();
309 gen_stop_exception(ctx);
310 }
311}
312
313#endif
314#endif
315
316#if !defined(CONFIG_USER_ONLY)
317
318
319static void spr_read_ibat(DisasContext *ctx, int gprn, int sprn)
320{
321 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
322}
323
324static void spr_read_ibat_h(DisasContext *ctx, int gprn, int sprn)
325{
326 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][((sprn - SPR_IBAT4U) / 2) + 4]));
327}
328
329static void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn)
330{
331 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
332 gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
333 tcg_temp_free_i32(t0);
334}
335
336static void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn)
337{
338 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4U) / 2) + 4);
339 gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
340 tcg_temp_free_i32(t0);
341}
342
343static void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn)
344{
345 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2);
346 gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
347 tcg_temp_free_i32(t0);
348}
349
350static void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn)
351{
352 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4L) / 2) + 4);
353 gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
354 tcg_temp_free_i32(t0);
355}
356
357
358
359static void spr_read_dbat(DisasContext *ctx, int gprn, int sprn)
360{
361 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][(sprn - SPR_DBAT0U) / 2]));
362}
363
364static void spr_read_dbat_h(DisasContext *ctx, int gprn, int sprn)
365{
366 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][((sprn - SPR_DBAT4U) / 2) + 4]));
367}
368
369static void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn)
370{
371 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2);
372 gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
373 tcg_temp_free_i32(t0);
374}
375
376static void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn)
377{
378 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4);
379 gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
380 tcg_temp_free_i32(t0);
381}
382
383static void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn)
384{
385 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2);
386 gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
387 tcg_temp_free_i32(t0);
388}
389
390static void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn)
391{
392 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4);
393 gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
394 tcg_temp_free_i32(t0);
395}
396
397
398static void spr_write_sdr1(DisasContext *ctx, int sprn, int gprn)
399{
400 gen_helper_store_sdr1(cpu_env, cpu_gpr[gprn]);
401}
402
403#if defined(TARGET_PPC64)
404
405
406static void spr_write_pidr(DisasContext *ctx, int sprn, int gprn)
407{
408 gen_helper_store_pidr(cpu_env, cpu_gpr[gprn]);
409}
410
411static void spr_write_lpidr(DisasContext *ctx, int sprn, int gprn)
412{
413 gen_helper_store_lpidr(cpu_env, cpu_gpr[gprn]);
414}
415
416static void spr_read_hior(DisasContext *ctx, int gprn, int sprn)
417{
418 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, excp_prefix));
419}
420
421static void spr_write_hior(DisasContext *ctx, int sprn, int gprn)
422{
423 TCGv t0 = tcg_temp_new();
424 tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL);
425 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
426 tcg_temp_free(t0);
427}
428static void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn)
429{
430 gen_helper_store_ptcr(cpu_env, cpu_gpr[gprn]);
431}
432
433static void spr_write_pcr(DisasContext *ctx, int sprn, int gprn)
434{
435 gen_helper_store_pcr(cpu_env, cpu_gpr[gprn]);
436}
437#endif
438#endif
439
440
441
442static void spr_read_601_rtcl(DisasContext *ctx, int gprn, int sprn)
443{
444 gen_helper_load_601_rtcl(cpu_gpr[gprn], cpu_env);
445}
446
447static void spr_read_601_rtcu(DisasContext *ctx, int gprn, int sprn)
448{
449 gen_helper_load_601_rtcu(cpu_gpr[gprn], cpu_env);
450}
451
452#if !defined(CONFIG_USER_ONLY)
453static void spr_write_601_rtcu(DisasContext *ctx, int sprn, int gprn)
454{
455 gen_helper_store_601_rtcu(cpu_env, cpu_gpr[gprn]);
456}
457
458static void spr_write_601_rtcl(DisasContext *ctx, int sprn, int gprn)
459{
460 gen_helper_store_601_rtcl(cpu_env, cpu_gpr[gprn]);
461}
462
463static void spr_write_hid0_601(DisasContext *ctx, int sprn, int gprn)
464{
465 gen_helper_store_hid0_601(cpu_env, cpu_gpr[gprn]);
466
467 gen_stop_exception(ctx);
468}
469#endif
470
471
472#if !defined(CONFIG_USER_ONLY)
473static void spr_read_601_ubat(DisasContext *ctx, int gprn, int sprn)
474{
475 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
476}
477
478static void spr_write_601_ubatu(DisasContext *ctx, int sprn, int gprn)
479{
480 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
481 gen_helper_store_601_batl(cpu_env, t0, cpu_gpr[gprn]);
482 tcg_temp_free_i32(t0);
483}
484
485static void spr_write_601_ubatl(DisasContext *ctx, int sprn, int gprn)
486{
487 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
488 gen_helper_store_601_batu(cpu_env, t0, cpu_gpr[gprn]);
489 tcg_temp_free_i32(t0);
490}
491#endif
492
493
494#if !defined(CONFIG_USER_ONLY)
495static void spr_read_40x_pit(DisasContext *ctx, int gprn, int sprn)
496{
497 gen_helper_load_40x_pit(cpu_gpr[gprn], cpu_env);
498}
499
500static void spr_write_40x_pit(DisasContext *ctx, int sprn, int gprn)
501{
502 gen_helper_store_40x_pit(cpu_env, cpu_gpr[gprn]);
503}
504
505static void spr_write_40x_dbcr0(DisasContext *ctx, int sprn, int gprn)
506{
507 gen_store_spr(sprn, cpu_gpr[gprn]);
508 gen_helper_store_40x_dbcr0(cpu_env, cpu_gpr[gprn]);
509
510 gen_stop_exception(ctx);
511}
512
513static void spr_write_40x_sler(DisasContext *ctx, int sprn, int gprn)
514{
515 gen_helper_store_40x_sler(cpu_env, cpu_gpr[gprn]);
516}
517
518static void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn)
519{
520 gen_helper_store_booke_tcr(cpu_env, cpu_gpr[gprn]);
521}
522
523static void spr_write_booke_tsr(DisasContext *ctx, int sprn, int gprn)
524{
525 gen_helper_store_booke_tsr(cpu_env, cpu_gpr[gprn]);
526}
527#endif
528
529
530
531#if !defined(CONFIG_USER_ONLY)
532static void spr_read_403_pbr(DisasContext *ctx, int gprn, int sprn)
533{
534 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, pb[sprn - SPR_403_PBL1]));
535}
536
537static void spr_write_403_pbr(DisasContext *ctx, int sprn, int gprn)
538{
539 TCGv_i32 t0 = tcg_const_i32(sprn - SPR_403_PBL1);
540 gen_helper_store_403_pbr(cpu_env, t0, cpu_gpr[gprn]);
541 tcg_temp_free_i32(t0);
542}
543
544static void spr_write_pir(DisasContext *ctx, int sprn, int gprn)
545{
546 TCGv t0 = tcg_temp_new();
547 tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF);
548 gen_store_spr(SPR_PIR, t0);
549 tcg_temp_free(t0);
550}
551#endif
552
553
554static void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn)
555{
556 TCGv_i32 t0 = tcg_temp_new_i32();
557 tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
558 tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0);
559 tcg_temp_free_i32(t0);
560}
561
562static void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn)
563{
564 TCGv_i32 t0 = tcg_temp_new_i32();
565 tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]);
566 tcg_gen_st_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
567 tcg_temp_free_i32(t0);
568}
569
570#if !defined(CONFIG_USER_ONLY)
571
572static void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn)
573{
574 TCGv t0 = tcg_temp_new();
575 tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivpr_mask));
576 tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
577 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
578 gen_store_spr(sprn, t0);
579 tcg_temp_free(t0);
580}
581
582static void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn)
583{
584 int sprn_offs;
585
586 if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
587 sprn_offs = sprn - SPR_BOOKE_IVOR0;
588 } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
589 sprn_offs = sprn - SPR_BOOKE_IVOR32 + 32;
590 } else if (sprn >= SPR_BOOKE_IVOR38 && sprn <= SPR_BOOKE_IVOR42) {
591 sprn_offs = sprn - SPR_BOOKE_IVOR38 + 38;
592 } else {
593 printf("Trying to write an unknown exception vector %d %03x\n",
594 sprn, sprn);
595 gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
596 return;
597 }
598
599 TCGv t0 = tcg_temp_new();
600 tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivor_mask));
601 tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
602 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_vectors[sprn_offs]));
603 gen_store_spr(sprn, t0);
604 tcg_temp_free(t0);
605}
606#endif
607
608static inline void vscr_init(CPUPPCState *env, uint32_t val)
609{
610
611 set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
612 helper_mtvscr(env, val);
613}
614
615#ifdef CONFIG_USER_ONLY
616#define spr_register_kvm(env, num, name, uea_read, uea_write, \
617 oea_read, oea_write, one_reg_id, initial_value) \
618 _spr_register(env, num, name, uea_read, uea_write, initial_value)
619#define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
620 oea_read, oea_write, hea_read, hea_write, \
621 one_reg_id, initial_value) \
622 _spr_register(env, num, name, uea_read, uea_write, initial_value)
623#else
624#if !defined(CONFIG_KVM)
625#define spr_register_kvm(env, num, name, uea_read, uea_write, \
626 oea_read, oea_write, one_reg_id, initial_value) \
627 _spr_register(env, num, name, uea_read, uea_write, \
628 oea_read, oea_write, oea_read, oea_write, initial_value)
629#define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
630 oea_read, oea_write, hea_read, hea_write, \
631 one_reg_id, initial_value) \
632 _spr_register(env, num, name, uea_read, uea_write, \
633 oea_read, oea_write, hea_read, hea_write, initial_value)
634#else
635#define spr_register_kvm(env, num, name, uea_read, uea_write, \
636 oea_read, oea_write, one_reg_id, initial_value) \
637 _spr_register(env, num, name, uea_read, uea_write, \
638 oea_read, oea_write, oea_read, oea_write, \
639 one_reg_id, initial_value)
640#define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
641 oea_read, oea_write, hea_read, hea_write, \
642 one_reg_id, initial_value) \
643 _spr_register(env, num, name, uea_read, uea_write, \
644 oea_read, oea_write, hea_read, hea_write, \
645 one_reg_id, initial_value)
646#endif
647#endif
648
649#define spr_register(env, num, name, uea_read, uea_write, \
650 oea_read, oea_write, initial_value) \
651 spr_register_kvm(env, num, name, uea_read, uea_write, \
652 oea_read, oea_write, 0, initial_value)
653
654#define spr_register_hv(env, num, name, uea_read, uea_write, \
655 oea_read, oea_write, hea_read, hea_write, \
656 initial_value) \
657 spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
658 oea_read, oea_write, hea_read, hea_write, \
659 0, initial_value)
660
661static inline void _spr_register(CPUPPCState *env, int num,
662 const char *name,
663 void (*uea_read)(DisasContext *ctx, int gprn, int sprn),
664 void (*uea_write)(DisasContext *ctx, int sprn, int gprn),
665#if !defined(CONFIG_USER_ONLY)
666
667 void (*oea_read)(DisasContext *ctx, int gprn, int sprn),
668 void (*oea_write)(DisasContext *ctx, int sprn, int gprn),
669 void (*hea_read)(DisasContext *opaque, int gprn, int sprn),
670 void (*hea_write)(DisasContext *opaque, int sprn, int gprn),
671#endif
672#if defined(CONFIG_KVM)
673 uint64_t one_reg_id,
674#endif
675 target_ulong initial_value)
676{
677 ppc_spr_t *spr;
678
679 spr = &env->spr_cb[num];
680 if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
681#if !defined(CONFIG_USER_ONLY)
682 spr->oea_read != NULL || spr->oea_write != NULL ||
683#endif
684 spr->uea_read != NULL || spr->uea_write != NULL) {
685 printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
686 exit(1);
687 }
688#if defined(PPC_DEBUG_SPR)
689 printf("*** register spr %d (%03x) %s val " TARGET_FMT_lx "\n", num, num,
690 name, initial_value);
691#endif
692 spr->name = name;
693 spr->uea_read = uea_read;
694 spr->uea_write = uea_write;
695#if !defined(CONFIG_USER_ONLY)
696 spr->oea_read = oea_read;
697 spr->oea_write = oea_write;
698 spr->hea_read = hea_read;
699 spr->hea_write = hea_write;
700#endif
701#if defined(CONFIG_KVM)
702 spr->one_reg_id = one_reg_id,
703#endif
704 env->spr[num] = spr->default_value = initial_value;
705}
706
707
708static void gen_spr_generic(CPUPPCState *env)
709{
710
711 spr_register(env, SPR_XER, "XER",
712 &spr_read_xer, &spr_write_xer,
713 &spr_read_xer, &spr_write_xer,
714 0x00000000);
715
716 spr_register(env, SPR_LR, "LR",
717 &spr_read_lr, &spr_write_lr,
718 &spr_read_lr, &spr_write_lr,
719 0x00000000);
720 spr_register(env, SPR_CTR, "CTR",
721 &spr_read_ctr, &spr_write_ctr,
722 &spr_read_ctr, &spr_write_ctr,
723 0x00000000);
724
725 spr_register(env, SPR_SRR0, "SRR0",
726 SPR_NOACCESS, SPR_NOACCESS,
727 &spr_read_generic, &spr_write_generic,
728 0x00000000);
729 spr_register(env, SPR_SRR1, "SRR1",
730 SPR_NOACCESS, SPR_NOACCESS,
731 &spr_read_generic, &spr_write_generic,
732 0x00000000);
733
734 spr_register(env, SPR_SPRG0, "SPRG0",
735 SPR_NOACCESS, SPR_NOACCESS,
736 &spr_read_generic, &spr_write_generic,
737 0x00000000);
738 spr_register(env, SPR_SPRG1, "SPRG1",
739 SPR_NOACCESS, SPR_NOACCESS,
740 &spr_read_generic, &spr_write_generic,
741 0x00000000);
742 spr_register(env, SPR_SPRG2, "SPRG2",
743 SPR_NOACCESS, SPR_NOACCESS,
744 &spr_read_generic, &spr_write_generic,
745 0x00000000);
746 spr_register(env, SPR_SPRG3, "SPRG3",
747 SPR_NOACCESS, SPR_NOACCESS,
748 &spr_read_generic, &spr_write_generic,
749 0x00000000);
750}
751
752
753static void gen_spr_ne_601(CPUPPCState *env)
754{
755
756 spr_register_kvm(env, SPR_DSISR, "DSISR",
757 SPR_NOACCESS, SPR_NOACCESS,
758 &spr_read_generic, &spr_write_generic,
759 KVM_REG_PPC_DSISR, 0x00000000);
760 spr_register_kvm(env, SPR_DAR, "DAR",
761 SPR_NOACCESS, SPR_NOACCESS,
762 &spr_read_generic, &spr_write_generic,
763 KVM_REG_PPC_DAR, 0x00000000);
764
765 spr_register(env, SPR_DECR, "DECR",
766 SPR_NOACCESS, SPR_NOACCESS,
767 &spr_read_decr, &spr_write_decr,
768 0x00000000);
769}
770
771
772static void gen_spr_sdr1(CPUPPCState *env)
773{
774#ifndef CONFIG_USER_ONLY
775 if (env->has_hv_mode) {
776
777
778 spr_register_hv(env, SPR_SDR1, "SDR1",
779 SPR_NOACCESS, SPR_NOACCESS,
780 SPR_NOACCESS, SPR_NOACCESS,
781 &spr_read_generic, &spr_write_sdr1,
782 0x00000000);
783 } else {
784 spr_register(env, SPR_SDR1, "SDR1",
785 SPR_NOACCESS, SPR_NOACCESS,
786 &spr_read_generic, &spr_write_sdr1,
787 0x00000000);
788 }
789#endif
790}
791
792
793static void gen_low_BATs(CPUPPCState *env)
794{
795#if !defined(CONFIG_USER_ONLY)
796 spr_register(env, SPR_IBAT0U, "IBAT0U",
797 SPR_NOACCESS, SPR_NOACCESS,
798 &spr_read_ibat, &spr_write_ibatu,
799 0x00000000);
800 spr_register(env, SPR_IBAT0L, "IBAT0L",
801 SPR_NOACCESS, SPR_NOACCESS,
802 &spr_read_ibat, &spr_write_ibatl,
803 0x00000000);
804 spr_register(env, SPR_IBAT1U, "IBAT1U",
805 SPR_NOACCESS, SPR_NOACCESS,
806 &spr_read_ibat, &spr_write_ibatu,
807 0x00000000);
808 spr_register(env, SPR_IBAT1L, "IBAT1L",
809 SPR_NOACCESS, SPR_NOACCESS,
810 &spr_read_ibat, &spr_write_ibatl,
811 0x00000000);
812 spr_register(env, SPR_IBAT2U, "IBAT2U",
813 SPR_NOACCESS, SPR_NOACCESS,
814 &spr_read_ibat, &spr_write_ibatu,
815 0x00000000);
816 spr_register(env, SPR_IBAT2L, "IBAT2L",
817 SPR_NOACCESS, SPR_NOACCESS,
818 &spr_read_ibat, &spr_write_ibatl,
819 0x00000000);
820 spr_register(env, SPR_IBAT3U, "IBAT3U",
821 SPR_NOACCESS, SPR_NOACCESS,
822 &spr_read_ibat, &spr_write_ibatu,
823 0x00000000);
824 spr_register(env, SPR_IBAT3L, "IBAT3L",
825 SPR_NOACCESS, SPR_NOACCESS,
826 &spr_read_ibat, &spr_write_ibatl,
827 0x00000000);
828 spr_register(env, SPR_DBAT0U, "DBAT0U",
829 SPR_NOACCESS, SPR_NOACCESS,
830 &spr_read_dbat, &spr_write_dbatu,
831 0x00000000);
832 spr_register(env, SPR_DBAT0L, "DBAT0L",
833 SPR_NOACCESS, SPR_NOACCESS,
834 &spr_read_dbat, &spr_write_dbatl,
835 0x00000000);
836 spr_register(env, SPR_DBAT1U, "DBAT1U",
837 SPR_NOACCESS, SPR_NOACCESS,
838 &spr_read_dbat, &spr_write_dbatu,
839 0x00000000);
840 spr_register(env, SPR_DBAT1L, "DBAT1L",
841 SPR_NOACCESS, SPR_NOACCESS,
842 &spr_read_dbat, &spr_write_dbatl,
843 0x00000000);
844 spr_register(env, SPR_DBAT2U, "DBAT2U",
845 SPR_NOACCESS, SPR_NOACCESS,
846 &spr_read_dbat, &spr_write_dbatu,
847 0x00000000);
848 spr_register(env, SPR_DBAT2L, "DBAT2L",
849 SPR_NOACCESS, SPR_NOACCESS,
850 &spr_read_dbat, &spr_write_dbatl,
851 0x00000000);
852 spr_register(env, SPR_DBAT3U, "DBAT3U",
853 SPR_NOACCESS, SPR_NOACCESS,
854 &spr_read_dbat, &spr_write_dbatu,
855 0x00000000);
856 spr_register(env, SPR_DBAT3L, "DBAT3L",
857 SPR_NOACCESS, SPR_NOACCESS,
858 &spr_read_dbat, &spr_write_dbatl,
859 0x00000000);
860 env->nb_BATs += 4;
861#endif
862}
863
864
865static void gen_high_BATs(CPUPPCState *env)
866{
867#if !defined(CONFIG_USER_ONLY)
868 spr_register(env, SPR_IBAT4U, "IBAT4U",
869 SPR_NOACCESS, SPR_NOACCESS,
870 &spr_read_ibat_h, &spr_write_ibatu_h,
871 0x00000000);
872 spr_register(env, SPR_IBAT4L, "IBAT4L",
873 SPR_NOACCESS, SPR_NOACCESS,
874 &spr_read_ibat_h, &spr_write_ibatl_h,
875 0x00000000);
876 spr_register(env, SPR_IBAT5U, "IBAT5U",
877 SPR_NOACCESS, SPR_NOACCESS,
878 &spr_read_ibat_h, &spr_write_ibatu_h,
879 0x00000000);
880 spr_register(env, SPR_IBAT5L, "IBAT5L",
881 SPR_NOACCESS, SPR_NOACCESS,
882 &spr_read_ibat_h, &spr_write_ibatl_h,
883 0x00000000);
884 spr_register(env, SPR_IBAT6U, "IBAT6U",
885 SPR_NOACCESS, SPR_NOACCESS,
886 &spr_read_ibat_h, &spr_write_ibatu_h,
887 0x00000000);
888 spr_register(env, SPR_IBAT6L, "IBAT6L",
889 SPR_NOACCESS, SPR_NOACCESS,
890 &spr_read_ibat_h, &spr_write_ibatl_h,
891 0x00000000);
892 spr_register(env, SPR_IBAT7U, "IBAT7U",
893 SPR_NOACCESS, SPR_NOACCESS,
894 &spr_read_ibat_h, &spr_write_ibatu_h,
895 0x00000000);
896 spr_register(env, SPR_IBAT7L, "IBAT7L",
897 SPR_NOACCESS, SPR_NOACCESS,
898 &spr_read_ibat_h, &spr_write_ibatl_h,
899 0x00000000);
900 spr_register(env, SPR_DBAT4U, "DBAT4U",
901 SPR_NOACCESS, SPR_NOACCESS,
902 &spr_read_dbat_h, &spr_write_dbatu_h,
903 0x00000000);
904 spr_register(env, SPR_DBAT4L, "DBAT4L",
905 SPR_NOACCESS, SPR_NOACCESS,
906 &spr_read_dbat_h, &spr_write_dbatl_h,
907 0x00000000);
908 spr_register(env, SPR_DBAT5U, "DBAT5U",
909 SPR_NOACCESS, SPR_NOACCESS,
910 &spr_read_dbat_h, &spr_write_dbatu_h,
911 0x00000000);
912 spr_register(env, SPR_DBAT5L, "DBAT5L",
913 SPR_NOACCESS, SPR_NOACCESS,
914 &spr_read_dbat_h, &spr_write_dbatl_h,
915 0x00000000);
916 spr_register(env, SPR_DBAT6U, "DBAT6U",
917 SPR_NOACCESS, SPR_NOACCESS,
918 &spr_read_dbat_h, &spr_write_dbatu_h,
919 0x00000000);
920 spr_register(env, SPR_DBAT6L, "DBAT6L",
921 SPR_NOACCESS, SPR_NOACCESS,
922 &spr_read_dbat_h, &spr_write_dbatl_h,
923 0x00000000);
924 spr_register(env, SPR_DBAT7U, "DBAT7U",
925 SPR_NOACCESS, SPR_NOACCESS,
926 &spr_read_dbat_h, &spr_write_dbatu_h,
927 0x00000000);
928 spr_register(env, SPR_DBAT7L, "DBAT7L",
929 SPR_NOACCESS, SPR_NOACCESS,
930 &spr_read_dbat_h, &spr_write_dbatl_h,
931 0x00000000);
932 env->nb_BATs += 4;
933#endif
934}
935
936
937static void gen_tbl(CPUPPCState *env)
938{
939 spr_register(env, SPR_VTBL, "TBL",
940 &spr_read_tbl, SPR_NOACCESS,
941 &spr_read_tbl, SPR_NOACCESS,
942 0x00000000);
943 spr_register(env, SPR_TBL, "TBL",
944 &spr_read_tbl, SPR_NOACCESS,
945 &spr_read_tbl, &spr_write_tbl,
946 0x00000000);
947 spr_register(env, SPR_VTBU, "TBU",
948 &spr_read_tbu, SPR_NOACCESS,
949 &spr_read_tbu, SPR_NOACCESS,
950 0x00000000);
951 spr_register(env, SPR_TBU, "TBU",
952 &spr_read_tbu, SPR_NOACCESS,
953 &spr_read_tbu, &spr_write_tbu,
954 0x00000000);
955}
956
957
958static void gen_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways)
959{
960#if !defined(CONFIG_USER_ONLY)
961 env->nb_tlb = nb_tlbs;
962 env->nb_ways = nb_ways;
963 env->id_tlbs = 1;
964 env->tlb_type = TLB_6XX;
965 spr_register(env, SPR_DMISS, "DMISS",
966 SPR_NOACCESS, SPR_NOACCESS,
967 &spr_read_generic, SPR_NOACCESS,
968 0x00000000);
969 spr_register(env, SPR_DCMP, "DCMP",
970 SPR_NOACCESS, SPR_NOACCESS,
971 &spr_read_generic, SPR_NOACCESS,
972 0x00000000);
973 spr_register(env, SPR_HASH1, "HASH1",
974 SPR_NOACCESS, SPR_NOACCESS,
975 &spr_read_generic, SPR_NOACCESS,
976 0x00000000);
977 spr_register(env, SPR_HASH2, "HASH2",
978 SPR_NOACCESS, SPR_NOACCESS,
979 &spr_read_generic, SPR_NOACCESS,
980 0x00000000);
981 spr_register(env, SPR_IMISS, "IMISS",
982 SPR_NOACCESS, SPR_NOACCESS,
983 &spr_read_generic, SPR_NOACCESS,
984 0x00000000);
985 spr_register(env, SPR_ICMP, "ICMP",
986 SPR_NOACCESS, SPR_NOACCESS,
987 &spr_read_generic, SPR_NOACCESS,
988 0x00000000);
989 spr_register(env, SPR_RPA, "RPA",
990 SPR_NOACCESS, SPR_NOACCESS,
991 &spr_read_generic, &spr_write_generic,
992 0x00000000);
993#endif
994}
995
996
997static void gen_spr_G2_755(CPUPPCState *env)
998{
999
1000 spr_register(env, SPR_SPRG4, "SPRG4",
1001 SPR_NOACCESS, SPR_NOACCESS,
1002 &spr_read_generic, &spr_write_generic,
1003 0x00000000);
1004 spr_register(env, SPR_SPRG5, "SPRG5",
1005 SPR_NOACCESS, SPR_NOACCESS,
1006 &spr_read_generic, &spr_write_generic,
1007 0x00000000);
1008 spr_register(env, SPR_SPRG6, "SPRG6",
1009 SPR_NOACCESS, SPR_NOACCESS,
1010 &spr_read_generic, &spr_write_generic,
1011 0x00000000);
1012 spr_register(env, SPR_SPRG7, "SPRG7",
1013 SPR_NOACCESS, SPR_NOACCESS,
1014 &spr_read_generic, &spr_write_generic,
1015 0x00000000);
1016}
1017
1018
1019static void gen_spr_7xx(CPUPPCState *env)
1020{
1021
1022
1023 spr_register_kvm(env, SPR_DABR, "DABR",
1024 SPR_NOACCESS, SPR_NOACCESS,
1025 &spr_read_generic, &spr_write_generic,
1026 KVM_REG_PPC_DABR, 0x00000000);
1027
1028 spr_register(env, SPR_IABR, "IABR",
1029 SPR_NOACCESS, SPR_NOACCESS,
1030 &spr_read_generic, &spr_write_generic,
1031 0x00000000);
1032
1033
1034 spr_register(env, SPR_ICTC, "ICTC",
1035 SPR_NOACCESS, SPR_NOACCESS,
1036 &spr_read_generic, &spr_write_generic,
1037 0x00000000);
1038
1039
1040 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
1041 SPR_NOACCESS, SPR_NOACCESS,
1042 &spr_read_generic, &spr_write_generic,
1043 0x00000000);
1044
1045 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
1046 SPR_NOACCESS, SPR_NOACCESS,
1047 &spr_read_generic, &spr_write_generic,
1048 0x00000000);
1049
1050 spr_register(env, SPR_7XX_PMC1, "PMC1",
1051 SPR_NOACCESS, SPR_NOACCESS,
1052 &spr_read_generic, &spr_write_generic,
1053 0x00000000);
1054
1055 spr_register(env, SPR_7XX_PMC2, "PMC2",
1056 SPR_NOACCESS, SPR_NOACCESS,
1057 &spr_read_generic, &spr_write_generic,
1058 0x00000000);
1059
1060 spr_register(env, SPR_7XX_PMC3, "PMC3",
1061 SPR_NOACCESS, SPR_NOACCESS,
1062 &spr_read_generic, &spr_write_generic,
1063 0x00000000);
1064
1065 spr_register(env, SPR_7XX_PMC4, "PMC4",
1066 SPR_NOACCESS, SPR_NOACCESS,
1067 &spr_read_generic, &spr_write_generic,
1068 0x00000000);
1069
1070 spr_register(env, SPR_7XX_SIAR, "SIAR",
1071 SPR_NOACCESS, SPR_NOACCESS,
1072 &spr_read_generic, SPR_NOACCESS,
1073 0x00000000);
1074
1075 spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
1076 &spr_read_ureg, SPR_NOACCESS,
1077 &spr_read_ureg, SPR_NOACCESS,
1078 0x00000000);
1079
1080 spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
1081 &spr_read_ureg, SPR_NOACCESS,
1082 &spr_read_ureg, SPR_NOACCESS,
1083 0x00000000);
1084
1085 spr_register(env, SPR_7XX_UPMC1, "UPMC1",
1086 &spr_read_ureg, SPR_NOACCESS,
1087 &spr_read_ureg, SPR_NOACCESS,
1088 0x00000000);
1089
1090 spr_register(env, SPR_7XX_UPMC2, "UPMC2",
1091 &spr_read_ureg, SPR_NOACCESS,
1092 &spr_read_ureg, SPR_NOACCESS,
1093 0x00000000);
1094
1095 spr_register(env, SPR_7XX_UPMC3, "UPMC3",
1096 &spr_read_ureg, SPR_NOACCESS,
1097 &spr_read_ureg, SPR_NOACCESS,
1098 0x00000000);
1099
1100 spr_register(env, SPR_7XX_UPMC4, "UPMC4",
1101 &spr_read_ureg, SPR_NOACCESS,
1102 &spr_read_ureg, SPR_NOACCESS,
1103 0x00000000);
1104
1105 spr_register(env, SPR_7XX_USIAR, "USIAR",
1106 &spr_read_ureg, SPR_NOACCESS,
1107 &spr_read_ureg, SPR_NOACCESS,
1108 0x00000000);
1109
1110
1111 spr_register(env, SPR_EAR, "EAR",
1112 SPR_NOACCESS, SPR_NOACCESS,
1113 &spr_read_generic, &spr_write_generic,
1114 0x00000000);
1115}
1116
1117#ifdef TARGET_PPC64
1118#ifndef CONFIG_USER_ONLY
1119static void spr_write_amr(DisasContext *ctx, int sprn, int gprn)
1120{
1121 TCGv t0 = tcg_temp_new();
1122 TCGv t1 = tcg_temp_new();
1123 TCGv t2 = tcg_temp_new();
1124
1125
1126
1127
1128
1129
1130 if (ctx->pr) {
1131 gen_load_spr(t1, SPR_UAMOR);
1132 } else {
1133 gen_load_spr(t1, SPR_AMOR);
1134 }
1135
1136
1137 tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
1138
1139
1140 gen_load_spr(t0, SPR_AMR);
1141 tcg_gen_andc_tl(t0, t0, t1);
1142
1143
1144 tcg_gen_or_tl(t0, t0, t2);
1145 gen_store_spr(SPR_AMR, t0);
1146 spr_store_dump_spr(SPR_AMR);
1147
1148 tcg_temp_free(t0);
1149 tcg_temp_free(t1);
1150 tcg_temp_free(t2);
1151}
1152
1153static void spr_write_uamor(DisasContext *ctx, int sprn, int gprn)
1154{
1155 TCGv t0 = tcg_temp_new();
1156 TCGv t1 = tcg_temp_new();
1157 TCGv t2 = tcg_temp_new();
1158
1159
1160
1161
1162
1163
1164 gen_load_spr(t1, SPR_AMOR);
1165
1166
1167 tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
1168
1169
1170 gen_load_spr(t0, SPR_UAMOR);
1171 tcg_gen_andc_tl(t0, t0, t1);
1172
1173
1174 tcg_gen_or_tl(t0, t0, t2);
1175 gen_store_spr(SPR_UAMOR, t0);
1176 spr_store_dump_spr(SPR_UAMOR);
1177
1178 tcg_temp_free(t0);
1179 tcg_temp_free(t1);
1180 tcg_temp_free(t2);
1181}
1182
1183static void spr_write_iamr(DisasContext *ctx, int sprn, int gprn)
1184{
1185 TCGv t0 = tcg_temp_new();
1186 TCGv t1 = tcg_temp_new();
1187 TCGv t2 = tcg_temp_new();
1188
1189
1190
1191
1192
1193
1194 gen_load_spr(t1, SPR_AMOR);
1195
1196
1197 tcg_gen_and_tl(t2, t1, cpu_gpr[gprn]);
1198
1199
1200 gen_load_spr(t0, SPR_IAMR);
1201 tcg_gen_andc_tl(t0, t0, t1);
1202
1203
1204 tcg_gen_or_tl(t0, t0, t2);
1205 gen_store_spr(SPR_IAMR, t0);
1206 spr_store_dump_spr(SPR_IAMR);
1207
1208 tcg_temp_free(t0);
1209 tcg_temp_free(t1);
1210 tcg_temp_free(t2);
1211}
1212#endif
1213
1214static void gen_spr_amr(CPUPPCState *env)
1215{
1216#ifndef CONFIG_USER_ONLY
1217
1218
1219
1220
1221 spr_register(env, SPR_UAMR, "UAMR",
1222 &spr_read_generic, &spr_write_amr,
1223 &spr_read_generic, &spr_write_amr,
1224 0);
1225 spr_register_kvm_hv(env, SPR_AMR, "AMR",
1226 SPR_NOACCESS, SPR_NOACCESS,
1227 &spr_read_generic, &spr_write_amr,
1228 &spr_read_generic, &spr_write_generic,
1229 KVM_REG_PPC_AMR, 0);
1230 spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR",
1231 SPR_NOACCESS, SPR_NOACCESS,
1232 &spr_read_generic, &spr_write_uamor,
1233 &spr_read_generic, &spr_write_generic,
1234 KVM_REG_PPC_UAMOR, 0);
1235 spr_register_hv(env, SPR_AMOR, "AMOR",
1236 SPR_NOACCESS, SPR_NOACCESS,
1237 SPR_NOACCESS, SPR_NOACCESS,
1238 &spr_read_generic, &spr_write_generic,
1239 0);
1240#endif
1241}
1242
1243static void gen_spr_iamr(CPUPPCState *env)
1244{
1245#ifndef CONFIG_USER_ONLY
1246 spr_register_kvm_hv(env, SPR_IAMR, "IAMR",
1247 SPR_NOACCESS, SPR_NOACCESS,
1248 &spr_read_generic, &spr_write_iamr,
1249 &spr_read_generic, &spr_write_generic,
1250 KVM_REG_PPC_IAMR, 0);
1251#endif
1252}
1253#endif
1254
1255#ifndef CONFIG_USER_ONLY
1256static void spr_read_thrm(DisasContext *ctx, int gprn, int sprn)
1257{
1258 gen_helper_fixup_thrm(cpu_env);
1259 gen_load_spr(cpu_gpr[gprn], sprn);
1260 spr_load_dump_spr(sprn);
1261}
1262#endif
1263
1264static void gen_spr_thrm(CPUPPCState *env)
1265{
1266
1267
1268 spr_register(env, SPR_THRM1, "THRM1",
1269 SPR_NOACCESS, SPR_NOACCESS,
1270 &spr_read_thrm, &spr_write_generic,
1271 0x00000000);
1272
1273 spr_register(env, SPR_THRM2, "THRM2",
1274 SPR_NOACCESS, SPR_NOACCESS,
1275 &spr_read_thrm, &spr_write_generic,
1276 0x00000000);
1277
1278 spr_register(env, SPR_THRM3, "THRM3",
1279 SPR_NOACCESS, SPR_NOACCESS,
1280 &spr_read_thrm, &spr_write_generic,
1281 0x00000000);
1282}
1283
1284
1285static void gen_spr_604(CPUPPCState *env)
1286{
1287
1288 spr_register(env, SPR_PIR, "PIR",
1289 SPR_NOACCESS, SPR_NOACCESS,
1290 &spr_read_generic, &spr_write_pir,
1291 0x00000000);
1292
1293
1294 spr_register(env, SPR_IABR, "IABR",
1295 SPR_NOACCESS, SPR_NOACCESS,
1296 &spr_read_generic, &spr_write_generic,
1297 0x00000000);
1298
1299 spr_register_kvm(env, SPR_DABR, "DABR",
1300 SPR_NOACCESS, SPR_NOACCESS,
1301 &spr_read_generic, &spr_write_generic,
1302 KVM_REG_PPC_DABR, 0x00000000);
1303
1304
1305 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
1306 SPR_NOACCESS, SPR_NOACCESS,
1307 &spr_read_generic, &spr_write_generic,
1308 0x00000000);
1309
1310 spr_register(env, SPR_7XX_PMC1, "PMC1",
1311 SPR_NOACCESS, SPR_NOACCESS,
1312 &spr_read_generic, &spr_write_generic,
1313 0x00000000);
1314
1315 spr_register(env, SPR_7XX_PMC2, "PMC2",
1316 SPR_NOACCESS, SPR_NOACCESS,
1317 &spr_read_generic, &spr_write_generic,
1318 0x00000000);
1319
1320 spr_register(env, SPR_7XX_SIAR, "SIAR",
1321 SPR_NOACCESS, SPR_NOACCESS,
1322 &spr_read_generic, SPR_NOACCESS,
1323 0x00000000);
1324
1325 spr_register(env, SPR_SDA, "SDA",
1326 SPR_NOACCESS, SPR_NOACCESS,
1327 &spr_read_generic, SPR_NOACCESS,
1328 0x00000000);
1329
1330
1331 spr_register(env, SPR_EAR, "EAR",
1332 SPR_NOACCESS, SPR_NOACCESS,
1333 &spr_read_generic, &spr_write_generic,
1334 0x00000000);
1335}
1336
1337
1338static void gen_spr_603(CPUPPCState *env)
1339{
1340
1341
1342 spr_register(env, SPR_EAR, "EAR",
1343 SPR_NOACCESS, SPR_NOACCESS,
1344 &spr_read_generic, &spr_write_generic,
1345 0x00000000);
1346
1347
1348 spr_register(env, SPR_IABR, "IABR",
1349 SPR_NOACCESS, SPR_NOACCESS,
1350 &spr_read_generic, &spr_write_generic,
1351 0x00000000);
1352
1353}
1354
1355
1356static void gen_spr_G2(CPUPPCState *env)
1357{
1358
1359
1360
1361 spr_register(env, SPR_MBAR, "MBAR",
1362 SPR_NOACCESS, SPR_NOACCESS,
1363 &spr_read_generic, &spr_write_generic,
1364 0x00000000);
1365
1366 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1367 SPR_NOACCESS, SPR_NOACCESS,
1368 &spr_read_generic, &spr_write_generic,
1369 0x00000000);
1370 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1371 SPR_NOACCESS, SPR_NOACCESS,
1372 &spr_read_generic, &spr_write_generic,
1373 0x00000000);
1374
1375
1376 spr_register(env, SPR_DABR, "DABR",
1377 SPR_NOACCESS, SPR_NOACCESS,
1378 &spr_read_generic, &spr_write_generic,
1379 0x00000000);
1380
1381 spr_register(env, SPR_DABR2, "DABR2",
1382 SPR_NOACCESS, SPR_NOACCESS,
1383 &spr_read_generic, &spr_write_generic,
1384 0x00000000);
1385
1386 spr_register(env, SPR_IABR, "IABR",
1387 SPR_NOACCESS, SPR_NOACCESS,
1388 &spr_read_generic, &spr_write_generic,
1389 0x00000000);
1390
1391 spr_register(env, SPR_IABR2, "IABR2",
1392 SPR_NOACCESS, SPR_NOACCESS,
1393 &spr_read_generic, &spr_write_generic,
1394 0x00000000);
1395
1396 spr_register(env, SPR_IBCR, "IBCR",
1397 SPR_NOACCESS, SPR_NOACCESS,
1398 &spr_read_generic, &spr_write_generic,
1399 0x00000000);
1400
1401 spr_register(env, SPR_DBCR, "DBCR",
1402 SPR_NOACCESS, SPR_NOACCESS,
1403 &spr_read_generic, &spr_write_generic,
1404 0x00000000);
1405}
1406
1407
1408static void gen_spr_602(CPUPPCState *env)
1409{
1410
1411
1412 spr_register(env, SPR_SER, "SER",
1413 SPR_NOACCESS, SPR_NOACCESS,
1414 &spr_read_generic, &spr_write_generic,
1415 0x00000000);
1416
1417 spr_register(env, SPR_SEBR, "SEBR",
1418 SPR_NOACCESS, SPR_NOACCESS,
1419 &spr_read_generic, &spr_write_generic,
1420 0x00000000);
1421
1422 spr_register(env, SPR_ESASRR, "ESASRR",
1423 SPR_NOACCESS, SPR_NOACCESS,
1424 &spr_read_generic, &spr_write_generic,
1425 0x00000000);
1426
1427
1428 spr_register(env, SPR_SP, "SP",
1429 SPR_NOACCESS, SPR_NOACCESS,
1430 &spr_read_generic, &spr_write_generic,
1431 0x00000000);
1432
1433 spr_register(env, SPR_LT, "LT",
1434 SPR_NOACCESS, SPR_NOACCESS,
1435 &spr_read_generic, &spr_write_generic,
1436 0x00000000);
1437
1438
1439 spr_register(env, SPR_TCR, "TCR",
1440 SPR_NOACCESS, SPR_NOACCESS,
1441 &spr_read_generic, &spr_write_generic,
1442 0x00000000);
1443
1444 spr_register(env, SPR_IBR, "IBR",
1445 SPR_NOACCESS, SPR_NOACCESS,
1446 &spr_read_generic, &spr_write_generic,
1447 0x00000000);
1448
1449 spr_register(env, SPR_IABR, "IABR",
1450 SPR_NOACCESS, SPR_NOACCESS,
1451 &spr_read_generic, &spr_write_generic,
1452 0x00000000);
1453}
1454
1455
1456static void gen_spr_601(CPUPPCState *env)
1457{
1458
1459
1460 spr_register(env, SPR_MQ, "MQ",
1461 &spr_read_generic, &spr_write_generic,
1462 &spr_read_generic, &spr_write_generic,
1463 0x00000000);
1464
1465 spr_register(env, SPR_601_RTCU, "RTCU",
1466 SPR_NOACCESS, SPR_NOACCESS,
1467 SPR_NOACCESS, &spr_write_601_rtcu,
1468 0x00000000);
1469 spr_register(env, SPR_601_VRTCU, "RTCU",
1470 &spr_read_601_rtcu, SPR_NOACCESS,
1471 &spr_read_601_rtcu, SPR_NOACCESS,
1472 0x00000000);
1473 spr_register(env, SPR_601_RTCL, "RTCL",
1474 SPR_NOACCESS, SPR_NOACCESS,
1475 SPR_NOACCESS, &spr_write_601_rtcl,
1476 0x00000000);
1477 spr_register(env, SPR_601_VRTCL, "RTCL",
1478 &spr_read_601_rtcl, SPR_NOACCESS,
1479 &spr_read_601_rtcl, SPR_NOACCESS,
1480 0x00000000);
1481
1482#if 0
1483 spr_register(env, SPR_601_UDECR, "UDECR",
1484 &spr_read_decr, SPR_NOACCESS,
1485 &spr_read_decr, SPR_NOACCESS,
1486 0x00000000);
1487#endif
1488
1489
1490 spr_register(env, SPR_EAR, "EAR",
1491 SPR_NOACCESS, SPR_NOACCESS,
1492 &spr_read_generic, &spr_write_generic,
1493 0x00000000);
1494
1495#if !defined(CONFIG_USER_ONLY)
1496 spr_register(env, SPR_IBAT0U, "IBAT0U",
1497 SPR_NOACCESS, SPR_NOACCESS,
1498 &spr_read_601_ubat, &spr_write_601_ubatu,
1499 0x00000000);
1500 spr_register(env, SPR_IBAT0L, "IBAT0L",
1501 SPR_NOACCESS, SPR_NOACCESS,
1502 &spr_read_601_ubat, &spr_write_601_ubatl,
1503 0x00000000);
1504 spr_register(env, SPR_IBAT1U, "IBAT1U",
1505 SPR_NOACCESS, SPR_NOACCESS,
1506 &spr_read_601_ubat, &spr_write_601_ubatu,
1507 0x00000000);
1508 spr_register(env, SPR_IBAT1L, "IBAT1L",
1509 SPR_NOACCESS, SPR_NOACCESS,
1510 &spr_read_601_ubat, &spr_write_601_ubatl,
1511 0x00000000);
1512 spr_register(env, SPR_IBAT2U, "IBAT2U",
1513 SPR_NOACCESS, SPR_NOACCESS,
1514 &spr_read_601_ubat, &spr_write_601_ubatu,
1515 0x00000000);
1516 spr_register(env, SPR_IBAT2L, "IBAT2L",
1517 SPR_NOACCESS, SPR_NOACCESS,
1518 &spr_read_601_ubat, &spr_write_601_ubatl,
1519 0x00000000);
1520 spr_register(env, SPR_IBAT3U, "IBAT3U",
1521 SPR_NOACCESS, SPR_NOACCESS,
1522 &spr_read_601_ubat, &spr_write_601_ubatu,
1523 0x00000000);
1524 spr_register(env, SPR_IBAT3L, "IBAT3L",
1525 SPR_NOACCESS, SPR_NOACCESS,
1526 &spr_read_601_ubat, &spr_write_601_ubatl,
1527 0x00000000);
1528 env->nb_BATs = 4;
1529#endif
1530}
1531
1532static void gen_spr_74xx(CPUPPCState *env)
1533{
1534
1535 spr_register(env, SPR_PIR, "PIR",
1536 SPR_NOACCESS, SPR_NOACCESS,
1537 &spr_read_generic, &spr_write_pir,
1538 0x00000000);
1539
1540 spr_register(env, SPR_74XX_MMCR2, "MMCR2",
1541 SPR_NOACCESS, SPR_NOACCESS,
1542 &spr_read_generic, &spr_write_generic,
1543 0x00000000);
1544
1545 spr_register(env, SPR_74XX_UMMCR2, "UMMCR2",
1546 &spr_read_ureg, SPR_NOACCESS,
1547 &spr_read_ureg, SPR_NOACCESS,
1548 0x00000000);
1549
1550 spr_register(env, SPR_BAMR, "BAMR",
1551 SPR_NOACCESS, SPR_NOACCESS,
1552 &spr_read_generic, &spr_write_generic,
1553 0x00000000);
1554
1555 spr_register(env, SPR_MSSCR0, "MSSCR0",
1556 SPR_NOACCESS, SPR_NOACCESS,
1557 &spr_read_generic, &spr_write_generic,
1558 0x00000000);
1559
1560
1561 spr_register(env, SPR_HID0, "HID0",
1562 SPR_NOACCESS, SPR_NOACCESS,
1563 &spr_read_generic, &spr_write_generic,
1564 0x00000000);
1565
1566 spr_register(env, SPR_HID1, "HID1",
1567 SPR_NOACCESS, SPR_NOACCESS,
1568 &spr_read_generic, &spr_write_generic,
1569 0x00000000);
1570
1571 spr_register(env, SPR_VRSAVE, "VRSAVE",
1572 &spr_read_generic, &spr_write_generic,
1573 &spr_read_generic, &spr_write_generic,
1574 0x00000000);
1575
1576 spr_register(env, SPR_L2CR, "L2CR",
1577 SPR_NOACCESS, SPR_NOACCESS,
1578 &spr_read_generic, spr_access_nop,
1579 0x00000000);
1580
1581 vscr_init(env, 0x00010000);
1582}
1583
1584static void gen_l3_ctrl(CPUPPCState *env)
1585{
1586
1587
1588 spr_register(env, SPR_L3CR, "L3CR",
1589 SPR_NOACCESS, SPR_NOACCESS,
1590 &spr_read_generic, &spr_write_generic,
1591 0x00000000);
1592
1593
1594 spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1595 SPR_NOACCESS, SPR_NOACCESS,
1596 &spr_read_generic, &spr_write_generic,
1597 0x00000000);
1598
1599
1600 spr_register(env, SPR_L3PM, "L3PM",
1601 SPR_NOACCESS, SPR_NOACCESS,
1602 &spr_read_generic, &spr_write_generic,
1603 0x00000000);
1604}
1605
1606static void gen_74xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways)
1607{
1608#if !defined(CONFIG_USER_ONLY)
1609 env->nb_tlb = nb_tlbs;
1610 env->nb_ways = nb_ways;
1611 env->id_tlbs = 1;
1612 env->tlb_type = TLB_6XX;
1613
1614 spr_register(env, SPR_PTEHI, "PTEHI",
1615 SPR_NOACCESS, SPR_NOACCESS,
1616 &spr_read_generic, &spr_write_generic,
1617 0x00000000);
1618
1619 spr_register(env, SPR_PTELO, "PTELO",
1620 SPR_NOACCESS, SPR_NOACCESS,
1621 &spr_read_generic, &spr_write_generic,
1622 0x00000000);
1623
1624 spr_register(env, SPR_TLBMISS, "TLBMISS",
1625 SPR_NOACCESS, SPR_NOACCESS,
1626 &spr_read_generic, &spr_write_generic,
1627 0x00000000);
1628#endif
1629}
1630
1631#if !defined(CONFIG_USER_ONLY)
1632static void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn)
1633{
1634 TCGv t0 = tcg_temp_new();
1635
1636 tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR0_DCE | L1CSR0_CPE);
1637 gen_store_spr(sprn, t0);
1638 tcg_temp_free(t0);
1639}
1640
1641static void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn)
1642{
1643 TCGv t0 = tcg_temp_new();
1644
1645 tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR1_ICE | L1CSR1_CPE);
1646 gen_store_spr(sprn, t0);
1647 tcg_temp_free(t0);
1648}
1649
1650static void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn)
1651{
1652 gen_helper_booke206_tlbflush(cpu_env, cpu_gpr[gprn]);
1653}
1654
1655static void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn)
1656{
1657 TCGv_i32 t0 = tcg_const_i32(sprn);
1658 gen_helper_booke_setpid(cpu_env, t0, cpu_gpr[gprn]);
1659 tcg_temp_free_i32(t0);
1660}
1661static void spr_write_eplc(DisasContext *ctx, int sprn, int gprn)
1662{
1663 gen_helper_booke_set_eplc(cpu_env, cpu_gpr[gprn]);
1664}
1665static void spr_write_epsc(DisasContext *ctx, int sprn, int gprn)
1666{
1667 gen_helper_booke_set_epsc(cpu_env, cpu_gpr[gprn]);
1668}
1669
1670#endif
1671
1672static void gen_spr_usprg3(CPUPPCState *env)
1673{
1674 spr_register(env, SPR_USPRG3, "USPRG3",
1675 &spr_read_ureg, SPR_NOACCESS,
1676 &spr_read_ureg, SPR_NOACCESS,
1677 0x00000000);
1678}
1679
1680static void gen_spr_usprgh(CPUPPCState *env)
1681{
1682 spr_register(env, SPR_USPRG4, "USPRG4",
1683 &spr_read_ureg, SPR_NOACCESS,
1684 &spr_read_ureg, SPR_NOACCESS,
1685 0x00000000);
1686 spr_register(env, SPR_USPRG5, "USPRG5",
1687 &spr_read_ureg, SPR_NOACCESS,
1688 &spr_read_ureg, SPR_NOACCESS,
1689 0x00000000);
1690 spr_register(env, SPR_USPRG6, "USPRG6",
1691 &spr_read_ureg, SPR_NOACCESS,
1692 &spr_read_ureg, SPR_NOACCESS,
1693 0x00000000);
1694 spr_register(env, SPR_USPRG7, "USPRG7",
1695 &spr_read_ureg, SPR_NOACCESS,
1696 &spr_read_ureg, SPR_NOACCESS,
1697 0x00000000);
1698}
1699
1700
1701static void gen_spr_BookE(CPUPPCState *env, uint64_t ivor_mask)
1702{
1703 const char *ivor_names[64] = {
1704 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
1705 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
1706 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
1707 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1708 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1709 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1710 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1711 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1712 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1713 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1714 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1715 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1716 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1717 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1718 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1719 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1720 };
1721#define SPR_BOOKE_IVORxx (-1)
1722 int ivor_sprn[64] = {
1723 SPR_BOOKE_IVOR0, SPR_BOOKE_IVOR1, SPR_BOOKE_IVOR2, SPR_BOOKE_IVOR3,
1724 SPR_BOOKE_IVOR4, SPR_BOOKE_IVOR5, SPR_BOOKE_IVOR6, SPR_BOOKE_IVOR7,
1725 SPR_BOOKE_IVOR8, SPR_BOOKE_IVOR9, SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1726 SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1727 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1728 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1729 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1730 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1731 SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1732 SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
1733 SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
1734 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1735 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1736 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1737 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1738 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1739 };
1740 int i;
1741
1742
1743 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1744 SPR_NOACCESS, SPR_NOACCESS,
1745 &spr_read_generic, &spr_write_generic,
1746 0x00000000);
1747 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1748 SPR_NOACCESS, SPR_NOACCESS,
1749 &spr_read_generic, &spr_write_generic,
1750 0x00000000);
1751
1752
1753 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1754 SPR_NOACCESS, SPR_NOACCESS,
1755 &spr_read_generic, &spr_write_generic,
1756 0x00000000);
1757
1758 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1759 SPR_NOACCESS, SPR_NOACCESS,
1760 &spr_read_generic, &spr_write_generic,
1761 0x00000000);
1762
1763 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1764 SPR_NOACCESS, SPR_NOACCESS,
1765 &spr_read_generic, &spr_write_generic,
1766 0x00000000);
1767
1768 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1769 SPR_NOACCESS, SPR_NOACCESS,
1770 &spr_read_generic, &spr_write_generic,
1771 0x00000000);
1772
1773 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1774 SPR_NOACCESS, SPR_NOACCESS,
1775 &spr_read_generic, &spr_write_40x_dbcr0,
1776 0x00000000);
1777
1778 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1779 SPR_NOACCESS, SPR_NOACCESS,
1780 &spr_read_generic, &spr_write_generic,
1781 0x00000000);
1782
1783 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1784 SPR_NOACCESS, SPR_NOACCESS,
1785 &spr_read_generic, &spr_write_generic,
1786 0x00000000);
1787 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1788 SPR_NOACCESS, SPR_NOACCESS,
1789 &spr_read_generic, &spr_write_generic,
1790 0x00000000);
1791 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1792 SPR_NOACCESS, SPR_NOACCESS,
1793 &spr_read_generic, &spr_write_generic,
1794 0x00000000);
1795
1796 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1797 SPR_NOACCESS, SPR_NOACCESS,
1798 &spr_read_generic, &spr_write_clear,
1799 0x00000000);
1800 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1801 SPR_NOACCESS, SPR_NOACCESS,
1802 &spr_read_generic, &spr_write_generic,
1803 0x00000000);
1804 spr_register(env, SPR_BOOKE_ESR, "ESR",
1805 SPR_NOACCESS, SPR_NOACCESS,
1806 &spr_read_generic, &spr_write_generic,
1807 0x00000000);
1808 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1809 SPR_NOACCESS, SPR_NOACCESS,
1810 &spr_read_generic, &spr_write_excp_prefix,
1811 0x00000000);
1812
1813 for (i = 0; i < 64; i++) {
1814 if (ivor_mask & (1ULL << i)) {
1815 if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1816 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1817 exit(1);
1818 }
1819 spr_register(env, ivor_sprn[i], ivor_names[i],
1820 SPR_NOACCESS, SPR_NOACCESS,
1821 &spr_read_generic, &spr_write_excp_vector,
1822 0x00000000);
1823 }
1824 }
1825 spr_register(env, SPR_BOOKE_PID, "PID",
1826 SPR_NOACCESS, SPR_NOACCESS,
1827 &spr_read_generic, &spr_write_booke_pid,
1828 0x00000000);
1829 spr_register(env, SPR_BOOKE_TCR, "TCR",
1830 SPR_NOACCESS, SPR_NOACCESS,
1831 &spr_read_generic, &spr_write_booke_tcr,
1832 0x00000000);
1833 spr_register(env, SPR_BOOKE_TSR, "TSR",
1834 SPR_NOACCESS, SPR_NOACCESS,
1835 &spr_read_generic, &spr_write_booke_tsr,
1836 0x00000000);
1837
1838 spr_register(env, SPR_DECR, "DECR",
1839 SPR_NOACCESS, SPR_NOACCESS,
1840 &spr_read_decr, &spr_write_decr,
1841 0x00000000);
1842 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1843 SPR_NOACCESS, SPR_NOACCESS,
1844 SPR_NOACCESS, &spr_write_generic,
1845 0x00000000);
1846
1847 spr_register(env, SPR_USPRG0, "USPRG0",
1848 &spr_read_generic, &spr_write_generic,
1849 &spr_read_generic, &spr_write_generic,
1850 0x00000000);
1851 spr_register(env, SPR_SPRG4, "SPRG4",
1852 SPR_NOACCESS, SPR_NOACCESS,
1853 &spr_read_generic, &spr_write_generic,
1854 0x00000000);
1855 spr_register(env, SPR_SPRG5, "SPRG5",
1856 SPR_NOACCESS, SPR_NOACCESS,
1857 &spr_read_generic, &spr_write_generic,
1858 0x00000000);
1859 spr_register(env, SPR_SPRG6, "SPRG6",
1860 SPR_NOACCESS, SPR_NOACCESS,
1861 &spr_read_generic, &spr_write_generic,
1862 0x00000000);
1863 spr_register(env, SPR_SPRG7, "SPRG7",
1864 SPR_NOACCESS, SPR_NOACCESS,
1865 &spr_read_generic, &spr_write_generic,
1866 0x00000000);
1867 spr_register(env, SPR_BOOKE_SPRG8, "SPRG8",
1868 SPR_NOACCESS, SPR_NOACCESS,
1869 &spr_read_generic, &spr_write_generic,
1870 0x00000000);
1871 spr_register(env, SPR_BOOKE_SPRG9, "SPRG9",
1872 SPR_NOACCESS, SPR_NOACCESS,
1873 &spr_read_generic, &spr_write_generic,
1874 0x00000000);
1875}
1876
1877static inline uint32_t gen_tlbncfg(uint32_t assoc, uint32_t minsize,
1878 uint32_t maxsize, uint32_t flags,
1879 uint32_t nentries)
1880{
1881 return (assoc << TLBnCFG_ASSOC_SHIFT) |
1882 (minsize << TLBnCFG_MINSIZE_SHIFT) |
1883 (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
1884 flags | nentries;
1885}
1886
1887
1888static void gen_spr_BookE206(CPUPPCState *env, uint32_t mas_mask,
1889 uint32_t *tlbncfg, uint32_t mmucfg)
1890{
1891#if !defined(CONFIG_USER_ONLY)
1892 const char *mas_names[8] = {
1893 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1894 };
1895 int mas_sprn[8] = {
1896 SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1897 SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1898 };
1899 int i;
1900
1901
1902
1903 for (i = 0; i < 8; i++) {
1904 void (*uea_write)(DisasContext *ctx, int sprn, int gprn) = &spr_write_generic32;
1905 if (i == 2 && (mas_mask & (1 << i)) && (env->insns_flags & PPC_64B)) {
1906 uea_write = &spr_write_generic;
1907 }
1908 if (mas_mask & (1 << i)) {
1909 spr_register(env, mas_sprn[i], mas_names[i],
1910 SPR_NOACCESS, SPR_NOACCESS,
1911 &spr_read_generic, uea_write,
1912 0x00000000);
1913 }
1914 }
1915 if (env->nb_pids > 1) {
1916
1917 spr_register(env, SPR_BOOKE_PID1, "PID1",
1918 SPR_NOACCESS, SPR_NOACCESS,
1919 &spr_read_generic, &spr_write_booke_pid,
1920 0x00000000);
1921 }
1922 if (env->nb_pids > 2) {
1923
1924 spr_register(env, SPR_BOOKE_PID2, "PID2",
1925 SPR_NOACCESS, SPR_NOACCESS,
1926 &spr_read_generic, &spr_write_booke_pid,
1927 0x00000000);
1928 }
1929
1930 spr_register(env, SPR_BOOKE_EPLC, "EPLC",
1931 SPR_NOACCESS, SPR_NOACCESS,
1932 &spr_read_generic, &spr_write_eplc,
1933 0x00000000);
1934 spr_register(env, SPR_BOOKE_EPSC, "EPSC",
1935 SPR_NOACCESS, SPR_NOACCESS,
1936 &spr_read_generic, &spr_write_epsc,
1937 0x00000000);
1938
1939
1940 spr_register(env, SPR_MMUCFG, "MMUCFG",
1941 SPR_NOACCESS, SPR_NOACCESS,
1942 &spr_read_generic, SPR_NOACCESS,
1943 mmucfg);
1944 switch (env->nb_ways) {
1945 case 4:
1946 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1947 SPR_NOACCESS, SPR_NOACCESS,
1948 &spr_read_generic, SPR_NOACCESS,
1949 tlbncfg[3]);
1950
1951 case 3:
1952 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1953 SPR_NOACCESS, SPR_NOACCESS,
1954 &spr_read_generic, SPR_NOACCESS,
1955 tlbncfg[2]);
1956
1957 case 2:
1958 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1959 SPR_NOACCESS, SPR_NOACCESS,
1960 &spr_read_generic, SPR_NOACCESS,
1961 tlbncfg[1]);
1962
1963 case 1:
1964 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1965 SPR_NOACCESS, SPR_NOACCESS,
1966 &spr_read_generic, SPR_NOACCESS,
1967 tlbncfg[0]);
1968
1969 case 0:
1970 default:
1971 break;
1972 }
1973#endif
1974
1975 gen_spr_usprgh(env);
1976}
1977
1978
1979static void gen_spr_440(CPUPPCState *env)
1980{
1981
1982
1983 spr_register(env, SPR_440_DNV0, "DNV0",
1984 SPR_NOACCESS, SPR_NOACCESS,
1985 &spr_read_generic, &spr_write_generic,
1986 0x00000000);
1987
1988 spr_register(env, SPR_440_DNV1, "DNV1",
1989 SPR_NOACCESS, SPR_NOACCESS,
1990 &spr_read_generic, &spr_write_generic,
1991 0x00000000);
1992
1993 spr_register(env, SPR_440_DNV2, "DNV2",
1994 SPR_NOACCESS, SPR_NOACCESS,
1995 &spr_read_generic, &spr_write_generic,
1996 0x00000000);
1997
1998 spr_register(env, SPR_440_DNV3, "DNV3",
1999 SPR_NOACCESS, SPR_NOACCESS,
2000 &spr_read_generic, &spr_write_generic,
2001 0x00000000);
2002
2003 spr_register(env, SPR_440_DTV0, "DTV0",
2004 SPR_NOACCESS, SPR_NOACCESS,
2005 &spr_read_generic, &spr_write_generic,
2006 0x00000000);
2007
2008 spr_register(env, SPR_440_DTV1, "DTV1",
2009 SPR_NOACCESS, SPR_NOACCESS,
2010 &spr_read_generic, &spr_write_generic,
2011 0x00000000);
2012
2013 spr_register(env, SPR_440_DTV2, "DTV2",
2014 SPR_NOACCESS, SPR_NOACCESS,
2015 &spr_read_generic, &spr_write_generic,
2016 0x00000000);
2017
2018 spr_register(env, SPR_440_DTV3, "DTV3",
2019 SPR_NOACCESS, SPR_NOACCESS,
2020 &spr_read_generic, &spr_write_generic,
2021 0x00000000);
2022
2023 spr_register(env, SPR_440_DVLIM, "DVLIM",
2024 SPR_NOACCESS, SPR_NOACCESS,
2025 &spr_read_generic, &spr_write_generic,
2026 0x00000000);
2027
2028 spr_register(env, SPR_440_INV0, "INV0",
2029 SPR_NOACCESS, SPR_NOACCESS,
2030 &spr_read_generic, &spr_write_generic,
2031 0x00000000);
2032
2033 spr_register(env, SPR_440_INV1, "INV1",
2034 SPR_NOACCESS, SPR_NOACCESS,
2035 &spr_read_generic, &spr_write_generic,
2036 0x00000000);
2037
2038 spr_register(env, SPR_440_INV2, "INV2",
2039 SPR_NOACCESS, SPR_NOACCESS,
2040 &spr_read_generic, &spr_write_generic,
2041 0x00000000);
2042
2043 spr_register(env, SPR_440_INV3, "INV3",
2044 SPR_NOACCESS, SPR_NOACCESS,
2045 &spr_read_generic, &spr_write_generic,
2046 0x00000000);
2047
2048 spr_register(env, SPR_440_ITV0, "ITV0",
2049 SPR_NOACCESS, SPR_NOACCESS,
2050 &spr_read_generic, &spr_write_generic,
2051 0x00000000);
2052
2053 spr_register(env, SPR_440_ITV1, "ITV1",
2054 SPR_NOACCESS, SPR_NOACCESS,
2055 &spr_read_generic, &spr_write_generic,
2056 0x00000000);
2057
2058 spr_register(env, SPR_440_ITV2, "ITV2",
2059 SPR_NOACCESS, SPR_NOACCESS,
2060 &spr_read_generic, &spr_write_generic,
2061 0x00000000);
2062
2063 spr_register(env, SPR_440_ITV3, "ITV3",
2064 SPR_NOACCESS, SPR_NOACCESS,
2065 &spr_read_generic, &spr_write_generic,
2066 0x00000000);
2067
2068 spr_register(env, SPR_440_IVLIM, "IVLIM",
2069 SPR_NOACCESS, SPR_NOACCESS,
2070 &spr_read_generic, &spr_write_generic,
2071 0x00000000);
2072
2073
2074 spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
2075 SPR_NOACCESS, SPR_NOACCESS,
2076 &spr_read_generic, SPR_NOACCESS,
2077 0x00000000);
2078
2079 spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
2080 SPR_NOACCESS, SPR_NOACCESS,
2081 &spr_read_generic, SPR_NOACCESS,
2082 0x00000000);
2083
2084 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
2085 SPR_NOACCESS, SPR_NOACCESS,
2086 &spr_read_generic, SPR_NOACCESS,
2087 0x00000000);
2088
2089 spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
2090 SPR_NOACCESS, SPR_NOACCESS,
2091 &spr_read_generic, SPR_NOACCESS,
2092 0x00000000);
2093
2094 spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
2095 SPR_NOACCESS, SPR_NOACCESS,
2096 &spr_read_generic, SPR_NOACCESS,
2097 0x00000000);
2098
2099 spr_register(env, SPR_440_DBDR, "DBDR",
2100 SPR_NOACCESS, SPR_NOACCESS,
2101 &spr_read_generic, &spr_write_generic,
2102 0x00000000);
2103
2104 spr_register(env, SPR_4xx_CCR0, "CCR0",
2105 SPR_NOACCESS, SPR_NOACCESS,
2106 &spr_read_generic, &spr_write_generic,
2107 0x00000000);
2108 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
2109 SPR_NOACCESS, SPR_NOACCESS,
2110 &spr_read_generic, SPR_NOACCESS,
2111 0x00000000);
2112
2113 spr_register(env, SPR_440_MMUCR, "MMUCR",
2114 SPR_NOACCESS, SPR_NOACCESS,
2115 &spr_read_generic, &spr_write_generic,
2116 0x00000000);
2117}
2118
2119
2120static void gen_spr_40x(CPUPPCState *env)
2121{
2122
2123
2124 spr_register(env, SPR_40x_DCCR, "DCCR",
2125 SPR_NOACCESS, SPR_NOACCESS,
2126 &spr_read_generic, &spr_write_generic,
2127 0x00000000);
2128
2129 spr_register(env, SPR_40x_ICCR, "ICCR",
2130 SPR_NOACCESS, SPR_NOACCESS,
2131 &spr_read_generic, &spr_write_generic,
2132 0x00000000);
2133
2134 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
2135 SPR_NOACCESS, SPR_NOACCESS,
2136 &spr_read_generic, SPR_NOACCESS,
2137 0x00000000);
2138
2139 spr_register(env, SPR_40x_DEAR, "DEAR",
2140 SPR_NOACCESS, SPR_NOACCESS,
2141 &spr_read_generic, &spr_write_generic,
2142 0x00000000);
2143 spr_register(env, SPR_40x_ESR, "ESR",
2144 SPR_NOACCESS, SPR_NOACCESS,
2145 &spr_read_generic, &spr_write_generic,
2146 0x00000000);
2147 spr_register(env, SPR_40x_EVPR, "EVPR",
2148 SPR_NOACCESS, SPR_NOACCESS,
2149 &spr_read_generic, &spr_write_excp_prefix,
2150 0x00000000);
2151 spr_register(env, SPR_40x_SRR2, "SRR2",
2152 &spr_read_generic, &spr_write_generic,
2153 &spr_read_generic, &spr_write_generic,
2154 0x00000000);
2155 spr_register(env, SPR_40x_SRR3, "SRR3",
2156 &spr_read_generic, &spr_write_generic,
2157 &spr_read_generic, &spr_write_generic,
2158 0x00000000);
2159
2160 spr_register(env, SPR_40x_PIT, "PIT",
2161 SPR_NOACCESS, SPR_NOACCESS,
2162 &spr_read_40x_pit, &spr_write_40x_pit,
2163 0x00000000);
2164 spr_register(env, SPR_40x_TCR, "TCR",
2165 SPR_NOACCESS, SPR_NOACCESS,
2166 &spr_read_generic, &spr_write_booke_tcr,
2167 0x00000000);
2168 spr_register(env, SPR_40x_TSR, "TSR",
2169 SPR_NOACCESS, SPR_NOACCESS,
2170 &spr_read_generic, &spr_write_booke_tsr,
2171 0x00000000);
2172}
2173
2174
2175static void gen_spr_405(CPUPPCState *env)
2176{
2177
2178 spr_register(env, SPR_40x_PID, "PID",
2179 SPR_NOACCESS, SPR_NOACCESS,
2180 &spr_read_generic, &spr_write_generic,
2181 0x00000000);
2182 spr_register(env, SPR_4xx_CCR0, "CCR0",
2183 SPR_NOACCESS, SPR_NOACCESS,
2184 &spr_read_generic, &spr_write_generic,
2185 0x00700000);
2186
2187
2188 spr_register(env, SPR_40x_DBCR0, "DBCR0",
2189 SPR_NOACCESS, SPR_NOACCESS,
2190 &spr_read_generic, &spr_write_40x_dbcr0,
2191 0x00000000);
2192
2193 spr_register(env, SPR_405_DBCR1, "DBCR1",
2194 SPR_NOACCESS, SPR_NOACCESS,
2195 &spr_read_generic, &spr_write_generic,
2196 0x00000000);
2197
2198 spr_register(env, SPR_40x_DBSR, "DBSR",
2199 SPR_NOACCESS, SPR_NOACCESS,
2200 &spr_read_generic, &spr_write_clear,
2201
2202 0x00000300);
2203
2204 spr_register(env, SPR_40x_DAC1, "DAC1",
2205 SPR_NOACCESS, SPR_NOACCESS,
2206 &spr_read_generic, &spr_write_generic,
2207 0x00000000);
2208 spr_register(env, SPR_40x_DAC2, "DAC2",
2209 SPR_NOACCESS, SPR_NOACCESS,
2210 &spr_read_generic, &spr_write_generic,
2211 0x00000000);
2212
2213 spr_register(env, SPR_405_DVC1, "DVC1",
2214 SPR_NOACCESS, SPR_NOACCESS,
2215 &spr_read_generic, &spr_write_generic,
2216 0x00000000);
2217
2218 spr_register(env, SPR_405_DVC2, "DVC2",
2219 SPR_NOACCESS, SPR_NOACCESS,
2220 &spr_read_generic, &spr_write_generic,
2221 0x00000000);
2222
2223 spr_register(env, SPR_40x_IAC1, "IAC1",
2224 SPR_NOACCESS, SPR_NOACCESS,
2225 &spr_read_generic, &spr_write_generic,
2226 0x00000000);
2227 spr_register(env, SPR_40x_IAC2, "IAC2",
2228 SPR_NOACCESS, SPR_NOACCESS,
2229 &spr_read_generic, &spr_write_generic,
2230 0x00000000);
2231
2232 spr_register(env, SPR_405_IAC3, "IAC3",
2233 SPR_NOACCESS, SPR_NOACCESS,
2234 &spr_read_generic, &spr_write_generic,
2235 0x00000000);
2236
2237 spr_register(env, SPR_405_IAC4, "IAC4",
2238 SPR_NOACCESS, SPR_NOACCESS,
2239 &spr_read_generic, &spr_write_generic,
2240 0x00000000);
2241
2242
2243 spr_register(env, SPR_405_SLER, "SLER",
2244 SPR_NOACCESS, SPR_NOACCESS,
2245 &spr_read_generic, &spr_write_40x_sler,
2246 0x00000000);
2247 spr_register(env, SPR_40x_ZPR, "ZPR",
2248 SPR_NOACCESS, SPR_NOACCESS,
2249 &spr_read_generic, &spr_write_generic,
2250 0x00000000);
2251
2252 spr_register(env, SPR_405_SU0R, "SU0R",
2253 SPR_NOACCESS, SPR_NOACCESS,
2254 &spr_read_generic, &spr_write_generic,
2255 0x00000000);
2256
2257 spr_register(env, SPR_USPRG0, "USPRG0",
2258 &spr_read_ureg, SPR_NOACCESS,
2259 &spr_read_ureg, SPR_NOACCESS,
2260 0x00000000);
2261 spr_register(env, SPR_SPRG4, "SPRG4",
2262 SPR_NOACCESS, SPR_NOACCESS,
2263 &spr_read_generic, &spr_write_generic,
2264 0x00000000);
2265 spr_register(env, SPR_SPRG5, "SPRG5",
2266 SPR_NOACCESS, SPR_NOACCESS,
2267 spr_read_generic, &spr_write_generic,
2268 0x00000000);
2269 spr_register(env, SPR_SPRG6, "SPRG6",
2270 SPR_NOACCESS, SPR_NOACCESS,
2271 spr_read_generic, &spr_write_generic,
2272 0x00000000);
2273 spr_register(env, SPR_SPRG7, "SPRG7",
2274 SPR_NOACCESS, SPR_NOACCESS,
2275 spr_read_generic, &spr_write_generic,
2276 0x00000000);
2277 gen_spr_usprgh(env);
2278}
2279
2280
2281static void gen_spr_401_403(CPUPPCState *env)
2282{
2283
2284 spr_register(env, SPR_403_VTBL, "TBL",
2285 &spr_read_tbl, SPR_NOACCESS,
2286 &spr_read_tbl, SPR_NOACCESS,
2287 0x00000000);
2288 spr_register(env, SPR_403_TBL, "TBL",
2289 SPR_NOACCESS, SPR_NOACCESS,
2290 SPR_NOACCESS, &spr_write_tbl,
2291 0x00000000);
2292 spr_register(env, SPR_403_VTBU, "TBU",
2293 &spr_read_tbu, SPR_NOACCESS,
2294 &spr_read_tbu, SPR_NOACCESS,
2295 0x00000000);
2296 spr_register(env, SPR_403_TBU, "TBU",
2297 SPR_NOACCESS, SPR_NOACCESS,
2298 SPR_NOACCESS, &spr_write_tbu,
2299 0x00000000);
2300
2301
2302 spr_register(env, SPR_403_CDBCR, "CDBCR",
2303 SPR_NOACCESS, SPR_NOACCESS,
2304 &spr_read_generic, &spr_write_generic,
2305 0x00000000);
2306}
2307
2308
2309static void gen_spr_401(CPUPPCState *env)
2310{
2311
2312
2313 spr_register(env, SPR_40x_DBCR0, "DBCR",
2314 SPR_NOACCESS, SPR_NOACCESS,
2315 &spr_read_generic, &spr_write_40x_dbcr0,
2316 0x00000000);
2317
2318 spr_register(env, SPR_40x_DBSR, "DBSR",
2319 SPR_NOACCESS, SPR_NOACCESS,
2320 &spr_read_generic, &spr_write_clear,
2321
2322 0x00000300);
2323
2324 spr_register(env, SPR_40x_DAC1, "DAC",
2325 SPR_NOACCESS, SPR_NOACCESS,
2326 &spr_read_generic, &spr_write_generic,
2327 0x00000000);
2328
2329 spr_register(env, SPR_40x_IAC1, "IAC",
2330 SPR_NOACCESS, SPR_NOACCESS,
2331 &spr_read_generic, &spr_write_generic,
2332 0x00000000);
2333
2334
2335 spr_register(env, SPR_405_SLER, "SLER",
2336 SPR_NOACCESS, SPR_NOACCESS,
2337 &spr_read_generic, &spr_write_40x_sler,
2338 0x00000000);
2339
2340 spr_register(env, SPR_40x_SGR, "SGR",
2341 SPR_NOACCESS, SPR_NOACCESS,
2342 &spr_read_generic, &spr_write_generic,
2343 0xFFFFFFFF);
2344
2345 spr_register(env, SPR_40x_DCWR, "DCWR",
2346 SPR_NOACCESS, SPR_NOACCESS,
2347 &spr_read_generic, &spr_write_generic,
2348 0x00000000);
2349}
2350
2351static void gen_spr_401x2(CPUPPCState *env)
2352{
2353 gen_spr_401(env);
2354 spr_register(env, SPR_40x_PID, "PID",
2355 SPR_NOACCESS, SPR_NOACCESS,
2356 &spr_read_generic, &spr_write_generic,
2357 0x00000000);
2358 spr_register(env, SPR_40x_ZPR, "ZPR",
2359 SPR_NOACCESS, SPR_NOACCESS,
2360 &spr_read_generic, &spr_write_generic,
2361 0x00000000);
2362}
2363
2364
2365static void gen_spr_403(CPUPPCState *env)
2366{
2367
2368
2369 spr_register(env, SPR_40x_DBCR0, "DBCR0",
2370 SPR_NOACCESS, SPR_NOACCESS,
2371 &spr_read_generic, &spr_write_40x_dbcr0,
2372 0x00000000);
2373
2374 spr_register(env, SPR_40x_DBSR, "DBSR",
2375 SPR_NOACCESS, SPR_NOACCESS,
2376 &spr_read_generic, &spr_write_clear,
2377
2378 0x00000300);
2379
2380 spr_register(env, SPR_40x_DAC1, "DAC1",
2381 SPR_NOACCESS, SPR_NOACCESS,
2382 &spr_read_generic, &spr_write_generic,
2383 0x00000000);
2384
2385 spr_register(env, SPR_40x_DAC2, "DAC2",
2386 SPR_NOACCESS, SPR_NOACCESS,
2387 &spr_read_generic, &spr_write_generic,
2388 0x00000000);
2389
2390 spr_register(env, SPR_40x_IAC1, "IAC1",
2391 SPR_NOACCESS, SPR_NOACCESS,
2392 &spr_read_generic, &spr_write_generic,
2393 0x00000000);
2394
2395 spr_register(env, SPR_40x_IAC2, "IAC2",
2396 SPR_NOACCESS, SPR_NOACCESS,
2397 &spr_read_generic, &spr_write_generic,
2398 0x00000000);
2399}
2400
2401static void gen_spr_403_real(CPUPPCState *env)
2402{
2403 spr_register(env, SPR_403_PBL1, "PBL1",
2404 SPR_NOACCESS, SPR_NOACCESS,
2405 &spr_read_403_pbr, &spr_write_403_pbr,
2406 0x00000000);
2407 spr_register(env, SPR_403_PBU1, "PBU1",
2408 SPR_NOACCESS, SPR_NOACCESS,
2409 &spr_read_403_pbr, &spr_write_403_pbr,
2410 0x00000000);
2411 spr_register(env, SPR_403_PBL2, "PBL2",
2412 SPR_NOACCESS, SPR_NOACCESS,
2413 &spr_read_403_pbr, &spr_write_403_pbr,
2414 0x00000000);
2415 spr_register(env, SPR_403_PBU2, "PBU2",
2416 SPR_NOACCESS, SPR_NOACCESS,
2417 &spr_read_403_pbr, &spr_write_403_pbr,
2418 0x00000000);
2419}
2420
2421static void gen_spr_403_mmu(CPUPPCState *env)
2422{
2423
2424 spr_register(env, SPR_40x_PID, "PID",
2425 SPR_NOACCESS, SPR_NOACCESS,
2426 &spr_read_generic, &spr_write_generic,
2427 0x00000000);
2428 spr_register(env, SPR_40x_ZPR, "ZPR",
2429 SPR_NOACCESS, SPR_NOACCESS,
2430 &spr_read_generic, &spr_write_generic,
2431 0x00000000);
2432}
2433
2434
2435static void gen_spr_compress(CPUPPCState *env)
2436{
2437
2438 spr_register(env, SPR_401_SKR, "SKR",
2439 SPR_NOACCESS, SPR_NOACCESS,
2440 &spr_read_generic, &spr_write_generic,
2441 0x00000000);
2442}
2443
2444static void gen_spr_5xx_8xx(CPUPPCState *env)
2445{
2446
2447 spr_register_kvm(env, SPR_DSISR, "DSISR",
2448 SPR_NOACCESS, SPR_NOACCESS,
2449 &spr_read_generic, &spr_write_generic,
2450 KVM_REG_PPC_DSISR, 0x00000000);
2451 spr_register_kvm(env, SPR_DAR, "DAR",
2452 SPR_NOACCESS, SPR_NOACCESS,
2453 &spr_read_generic, &spr_write_generic,
2454 KVM_REG_PPC_DAR, 0x00000000);
2455
2456 spr_register(env, SPR_DECR, "DECR",
2457 SPR_NOACCESS, SPR_NOACCESS,
2458 &spr_read_decr, &spr_write_decr,
2459 0x00000000);
2460
2461 spr_register(env, SPR_MPC_EIE, "EIE",
2462 SPR_NOACCESS, SPR_NOACCESS,
2463 &spr_read_generic, &spr_write_generic,
2464 0x00000000);
2465
2466 spr_register(env, SPR_MPC_EID, "EID",
2467 SPR_NOACCESS, SPR_NOACCESS,
2468 &spr_read_generic, &spr_write_generic,
2469 0x00000000);
2470
2471 spr_register(env, SPR_MPC_NRI, "NRI",
2472 SPR_NOACCESS, SPR_NOACCESS,
2473 &spr_read_generic, &spr_write_generic,
2474 0x00000000);
2475
2476 spr_register(env, SPR_MPC_CMPA, "CMPA",
2477 SPR_NOACCESS, SPR_NOACCESS,
2478 &spr_read_generic, &spr_write_generic,
2479 0x00000000);
2480
2481 spr_register(env, SPR_MPC_CMPB, "CMPB",
2482 SPR_NOACCESS, SPR_NOACCESS,
2483 &spr_read_generic, &spr_write_generic,
2484 0x00000000);
2485
2486 spr_register(env, SPR_MPC_CMPC, "CMPC",
2487 SPR_NOACCESS, SPR_NOACCESS,
2488 &spr_read_generic, &spr_write_generic,
2489 0x00000000);
2490
2491 spr_register(env, SPR_MPC_CMPD, "CMPD",
2492 SPR_NOACCESS, SPR_NOACCESS,
2493 &spr_read_generic, &spr_write_generic,
2494 0x00000000);
2495
2496 spr_register(env, SPR_MPC_ECR, "ECR",
2497 SPR_NOACCESS, SPR_NOACCESS,
2498 &spr_read_generic, &spr_write_generic,
2499 0x00000000);
2500
2501 spr_register(env, SPR_MPC_DER, "DER",
2502 SPR_NOACCESS, SPR_NOACCESS,
2503 &spr_read_generic, &spr_write_generic,
2504 0x00000000);
2505
2506 spr_register(env, SPR_MPC_COUNTA, "COUNTA",
2507 SPR_NOACCESS, SPR_NOACCESS,
2508 &spr_read_generic, &spr_write_generic,
2509 0x00000000);
2510
2511 spr_register(env, SPR_MPC_COUNTB, "COUNTB",
2512 SPR_NOACCESS, SPR_NOACCESS,
2513 &spr_read_generic, &spr_write_generic,
2514 0x00000000);
2515
2516 spr_register(env, SPR_MPC_CMPE, "CMPE",
2517 SPR_NOACCESS, SPR_NOACCESS,
2518 &spr_read_generic, &spr_write_generic,
2519 0x00000000);
2520
2521 spr_register(env, SPR_MPC_CMPF, "CMPF",
2522 SPR_NOACCESS, SPR_NOACCESS,
2523 &spr_read_generic, &spr_write_generic,
2524 0x00000000);
2525
2526 spr_register(env, SPR_MPC_CMPG, "CMPG",
2527 SPR_NOACCESS, SPR_NOACCESS,
2528 &spr_read_generic, &spr_write_generic,
2529 0x00000000);
2530
2531 spr_register(env, SPR_MPC_CMPH, "CMPH",
2532 SPR_NOACCESS, SPR_NOACCESS,
2533 &spr_read_generic, &spr_write_generic,
2534 0x00000000);
2535
2536 spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
2537 SPR_NOACCESS, SPR_NOACCESS,
2538 &spr_read_generic, &spr_write_generic,
2539 0x00000000);
2540
2541 spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
2542 SPR_NOACCESS, SPR_NOACCESS,
2543 &spr_read_generic, &spr_write_generic,
2544 0x00000000);
2545
2546 spr_register(env, SPR_MPC_BAR, "BAR",
2547 SPR_NOACCESS, SPR_NOACCESS,
2548 &spr_read_generic, &spr_write_generic,
2549 0x00000000);
2550
2551 spr_register(env, SPR_MPC_DPDR, "DPDR",
2552 SPR_NOACCESS, SPR_NOACCESS,
2553 &spr_read_generic, &spr_write_generic,
2554 0x00000000);
2555
2556 spr_register(env, SPR_MPC_IMMR, "IMMR",
2557 SPR_NOACCESS, SPR_NOACCESS,
2558 &spr_read_generic, &spr_write_generic,
2559 0x00000000);
2560}
2561
2562static void gen_spr_5xx(CPUPPCState *env)
2563{
2564
2565 spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
2566 SPR_NOACCESS, SPR_NOACCESS,
2567 &spr_read_generic, &spr_write_generic,
2568 0x00000000);
2569
2570 spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
2571 SPR_NOACCESS, SPR_NOACCESS,
2572 &spr_read_generic, &spr_write_generic,
2573 0x00000000);
2574
2575 spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
2576 SPR_NOACCESS, SPR_NOACCESS,
2577 &spr_read_generic, &spr_write_generic,
2578 0x00000000);
2579
2580 spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
2581 SPR_NOACCESS, SPR_NOACCESS,
2582 &spr_read_generic, &spr_write_generic,
2583 0x00000000);
2584
2585 spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
2586 SPR_NOACCESS, SPR_NOACCESS,
2587 &spr_read_generic, &spr_write_generic,
2588 0x00000000);
2589
2590 spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
2591 SPR_NOACCESS, SPR_NOACCESS,
2592 &spr_read_generic, &spr_write_generic,
2593 0x00000000);
2594
2595 spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
2596 SPR_NOACCESS, SPR_NOACCESS,
2597 &spr_read_generic, &spr_write_generic,
2598 0x00000000);
2599
2600 spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
2601 SPR_NOACCESS, SPR_NOACCESS,
2602 &spr_read_generic, &spr_write_generic,
2603 0x00000000);
2604
2605 spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
2606 SPR_NOACCESS, SPR_NOACCESS,
2607 &spr_read_generic, &spr_write_generic,
2608 0x00000000);
2609
2610 spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
2611 SPR_NOACCESS, SPR_NOACCESS,
2612 &spr_read_generic, &spr_write_generic,
2613 0x00000000);
2614
2615 spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
2616 SPR_NOACCESS, SPR_NOACCESS,
2617 &spr_read_generic, &spr_write_generic,
2618 0x00000000);
2619
2620 spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
2621 SPR_NOACCESS, SPR_NOACCESS,
2622 &spr_read_generic, &spr_write_generic,
2623 0x00000000);
2624
2625 spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
2626 SPR_NOACCESS, SPR_NOACCESS,
2627 &spr_read_generic, &spr_write_generic,
2628 0x00000000);
2629
2630 spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
2631 SPR_NOACCESS, SPR_NOACCESS,
2632 &spr_read_generic, &spr_write_generic,
2633 0x00000000);
2634
2635 spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
2636 SPR_NOACCESS, SPR_NOACCESS,
2637 &spr_read_generic, &spr_write_generic,
2638 0x00000000);
2639
2640 spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
2641 SPR_NOACCESS, SPR_NOACCESS,
2642 &spr_read_generic, &spr_write_generic,
2643 0x00000000);
2644
2645 spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
2646 SPR_NOACCESS, SPR_NOACCESS,
2647 &spr_read_generic, &spr_write_generic,
2648 0x00000000);
2649
2650 spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
2651 SPR_NOACCESS, SPR_NOACCESS,
2652 &spr_read_generic, &spr_write_generic,
2653 0x00000000);
2654
2655 spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
2656 SPR_NOACCESS, SPR_NOACCESS,
2657 &spr_read_generic, &spr_write_generic,
2658 0x00000000);
2659
2660 spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
2661 SPR_NOACCESS, SPR_NOACCESS,
2662 &spr_read_generic, &spr_write_generic,
2663 0x00000000);
2664
2665 spr_register(env, SPR_RCPU_FPECR, "FPECR",
2666 SPR_NOACCESS, SPR_NOACCESS,
2667 &spr_read_generic, &spr_write_generic,
2668 0x00000000);
2669}
2670
2671static void gen_spr_8xx(CPUPPCState *env)
2672{
2673
2674 spr_register(env, SPR_MPC_IC_CST, "IC_CST",
2675 SPR_NOACCESS, SPR_NOACCESS,
2676 &spr_read_generic, &spr_write_generic,
2677 0x00000000);
2678
2679 spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
2680 SPR_NOACCESS, SPR_NOACCESS,
2681 &spr_read_generic, &spr_write_generic,
2682 0x00000000);
2683
2684 spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
2685 SPR_NOACCESS, SPR_NOACCESS,
2686 &spr_read_generic, &spr_write_generic,
2687 0x00000000);
2688
2689 spr_register(env, SPR_MPC_DC_CST, "DC_CST",
2690 SPR_NOACCESS, SPR_NOACCESS,
2691 &spr_read_generic, &spr_write_generic,
2692 0x00000000);
2693
2694 spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
2695 SPR_NOACCESS, SPR_NOACCESS,
2696 &spr_read_generic, &spr_write_generic,
2697 0x00000000);
2698
2699 spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
2700 SPR_NOACCESS, SPR_NOACCESS,
2701 &spr_read_generic, &spr_write_generic,
2702 0x00000000);
2703
2704 spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
2705 SPR_NOACCESS, SPR_NOACCESS,
2706 &spr_read_generic, &spr_write_generic,
2707 0x00000000);
2708
2709 spr_register(env, SPR_MPC_MI_AP, "MI_AP",
2710 SPR_NOACCESS, SPR_NOACCESS,
2711 &spr_read_generic, &spr_write_generic,
2712 0x00000000);
2713
2714 spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
2715 SPR_NOACCESS, SPR_NOACCESS,
2716 &spr_read_generic, &spr_write_generic,
2717 0x00000000);
2718
2719 spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
2720 SPR_NOACCESS, SPR_NOACCESS,
2721 &spr_read_generic, &spr_write_generic,
2722 0x00000000);
2723
2724 spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
2725 SPR_NOACCESS, SPR_NOACCESS,
2726 &spr_read_generic, &spr_write_generic,
2727 0x00000000);
2728
2729 spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
2730 SPR_NOACCESS, SPR_NOACCESS,
2731 &spr_read_generic, &spr_write_generic,
2732 0x00000000);
2733
2734 spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
2735 SPR_NOACCESS, SPR_NOACCESS,
2736 &spr_read_generic, &spr_write_generic,
2737 0x00000000);
2738
2739 spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
2740 SPR_NOACCESS, SPR_NOACCESS,
2741 &spr_read_generic, &spr_write_generic,
2742 0x00000000);
2743
2744 spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
2745 SPR_NOACCESS, SPR_NOACCESS,
2746 &spr_read_generic, &spr_write_generic,
2747 0x00000000);
2748
2749 spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
2750 SPR_NOACCESS, SPR_NOACCESS,
2751 &spr_read_generic, &spr_write_generic,
2752 0x00000000);
2753
2754 spr_register(env, SPR_MPC_MD_AP, "MD_AP",
2755 SPR_NOACCESS, SPR_NOACCESS,
2756 &spr_read_generic, &spr_write_generic,
2757 0x00000000);
2758
2759 spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2760 SPR_NOACCESS, SPR_NOACCESS,
2761 &spr_read_generic, &spr_write_generic,
2762 0x00000000);
2763
2764 spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2765 SPR_NOACCESS, SPR_NOACCESS,
2766 &spr_read_generic, &spr_write_generic,
2767 0x00000000);
2768
2769 spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2770 SPR_NOACCESS, SPR_NOACCESS,
2771 &spr_read_generic, &spr_write_generic,
2772 0x00000000);
2773
2774 spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2775 SPR_NOACCESS, SPR_NOACCESS,
2776 &spr_read_generic, &spr_write_generic,
2777 0x00000000);
2778
2779 spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2780 SPR_NOACCESS, SPR_NOACCESS,
2781 &spr_read_generic, &spr_write_generic,
2782 0x00000000);
2783
2784 spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2785 SPR_NOACCESS, SPR_NOACCESS,
2786 &spr_read_generic, &spr_write_generic,
2787 0x00000000);
2788
2789 spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2790 SPR_NOACCESS, SPR_NOACCESS,
2791 &spr_read_generic, &spr_write_generic,
2792 0x00000000);
2793
2794 spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2795 SPR_NOACCESS, SPR_NOACCESS,
2796 &spr_read_generic, &spr_write_generic,
2797 0x00000000);
2798}
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831static void init_excp_4xx_real(CPUPPCState *env)
2832{
2833#if !defined(CONFIG_USER_ONLY)
2834 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2835 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2836 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2837 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2838 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2839 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2840 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2841 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2842 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2843 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2844 env->ivor_mask = 0x0000FFF0UL;
2845 env->ivpr_mask = 0xFFFF0000UL;
2846
2847 env->hreset_vector = 0xFFFFFFFCUL;
2848#endif
2849}
2850
2851static void init_excp_4xx_softmmu(CPUPPCState *env)
2852{
2853#if !defined(CONFIG_USER_ONLY)
2854 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2855 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2856 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2857 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2858 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2859 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2860 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2861 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2862 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2863 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2864 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2865 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100;
2866 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200;
2867 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2868 env->ivor_mask = 0x0000FFF0UL;
2869 env->ivpr_mask = 0xFFFF0000UL;
2870
2871 env->hreset_vector = 0xFFFFFFFCUL;
2872#endif
2873}
2874
2875static void init_excp_MPC5xx(CPUPPCState *env)
2876{
2877#if !defined(CONFIG_USER_ONLY)
2878 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2879 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2880 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2881 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2882 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2883 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2884 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2885 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2886 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2887 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2888 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2889 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2890 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2891 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2892 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2893 env->ivor_mask = 0x0000FFF0UL;
2894 env->ivpr_mask = 0xFFFF0000UL;
2895
2896 env->hreset_vector = 0x00000100UL;
2897#endif
2898}
2899
2900static void init_excp_MPC8xx(CPUPPCState *env)
2901{
2902#if !defined(CONFIG_USER_ONLY)
2903 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2904 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2905 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2906 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2907 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2908 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2909 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2910 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2911 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2912 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2913 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2914 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2915 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2916 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001100;
2917 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001200;
2918 env->excp_vectors[POWERPC_EXCP_ITLBE] = 0x00001300;
2919 env->excp_vectors[POWERPC_EXCP_DTLBE] = 0x00001400;
2920 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2921 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2922 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2923 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2924 env->ivor_mask = 0x0000FFF0UL;
2925 env->ivpr_mask = 0xFFFF0000UL;
2926
2927 env->hreset_vector = 0x00000100UL;
2928#endif
2929}
2930
2931static void init_excp_G2(CPUPPCState *env)
2932{
2933#if !defined(CONFIG_USER_ONLY)
2934 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2935 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2936 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2937 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2938 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2939 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2940 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2941 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2942 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2943 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2944 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2945 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2946 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2947 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2948 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2949 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2950 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2951
2952 env->hreset_vector = 0x00000100UL;
2953#endif
2954}
2955
2956static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
2957{
2958#if !defined(CONFIG_USER_ONLY)
2959 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000FFC;
2960 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2961 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2962 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2963 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2964 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2965 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2966 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2967 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2968 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2969 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2970 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2971 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2972 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2973 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2974 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2975 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2976 env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000;
2977 env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000;
2978 env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000;
2979 env->ivor_mask = 0x0000FFF7UL;
2980 env->ivpr_mask = ivpr_mask;
2981
2982 env->hreset_vector = 0xFFFFFFFCUL;
2983#endif
2984}
2985
2986static void init_excp_BookE(CPUPPCState *env)
2987{
2988#if !defined(CONFIG_USER_ONLY)
2989 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2990 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2991 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2992 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2993 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2994 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2995 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2996 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2997 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2998 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2999 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
3000 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
3001 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
3002 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
3003 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
3004 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
3005 env->ivor_mask = 0x0000FFF0UL;
3006 env->ivpr_mask = 0xFFFF0000UL;
3007
3008 env->hreset_vector = 0xFFFFFFFCUL;
3009#endif
3010}
3011
3012static void init_excp_601(CPUPPCState *env)
3013{
3014#if !defined(CONFIG_USER_ONLY)
3015 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3016 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3017 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3018 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3019 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3020 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3021 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3022 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3023 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3024 env->excp_vectors[POWERPC_EXCP_IO] = 0x00000A00;
3025 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3026 env->excp_vectors[POWERPC_EXCP_RUNM] = 0x00002000;
3027
3028 env->hreset_vector = 0x00000100UL;
3029#endif
3030}
3031
3032static void init_excp_602(CPUPPCState *env)
3033{
3034#if !defined(CONFIG_USER_ONLY)
3035
3036 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3037 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3038 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3039 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3040 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3041 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3042 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3043 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3044 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3045 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3046 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3047 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3048 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3049 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3050 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3051 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3052 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001500;
3053 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001600;
3054
3055 env->hreset_vector = 0x00000100UL;
3056#endif
3057}
3058
3059static void init_excp_603(CPUPPCState *env)
3060{
3061#if !defined(CONFIG_USER_ONLY)
3062 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3063 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3064 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3065 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3066 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3067 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3068 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3069 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3070 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3071 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3072 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3073 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3074 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3075 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3076 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3077 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3078
3079 env->hreset_vector = 0x00000100UL;
3080#endif
3081}
3082
3083static void init_excp_604(CPUPPCState *env)
3084{
3085#if !defined(CONFIG_USER_ONLY)
3086 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3087 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3088 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3089 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3090 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3091 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3092 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3093 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3094 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3095 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3096 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3097 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3098 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3099 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3100
3101 env->hreset_vector = 0x00000100UL;
3102#endif
3103}
3104
3105static void init_excp_7x0(CPUPPCState *env)
3106{
3107#if !defined(CONFIG_USER_ONLY)
3108 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3109 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3110 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3111 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3112 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3113 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3114 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3115 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3116 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3117 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3118 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3119 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3120 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3121 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3122 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3123
3124 env->hreset_vector = 0x00000100UL;
3125#endif
3126}
3127
3128static void init_excp_750cl(CPUPPCState *env)
3129{
3130#if !defined(CONFIG_USER_ONLY)
3131 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3132 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3133 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3134 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3135 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3136 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3137 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3138 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3139 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3140 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3141 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3142 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3143 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3144 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3145
3146 env->hreset_vector = 0x00000100UL;
3147#endif
3148}
3149
3150static void init_excp_750cx(CPUPPCState *env)
3151{
3152#if !defined(CONFIG_USER_ONLY)
3153 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3154 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3155 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3156 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3157 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3158 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3159 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3160 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3161 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3162 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3163 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3164 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3165 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3166 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3167
3168 env->hreset_vector = 0x00000100UL;
3169#endif
3170}
3171
3172
3173static void init_excp_7x5(CPUPPCState *env)
3174{
3175#if !defined(CONFIG_USER_ONLY)
3176 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3177 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3178 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3179 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3180 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3181 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3182 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3183 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3184 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3185 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3186 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3187 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3188 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3189 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3190 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3191 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3192 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3193 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3194
3195 env->hreset_vector = 0x00000100UL;
3196#endif
3197}
3198
3199static void init_excp_7400(CPUPPCState *env)
3200{
3201#if !defined(CONFIG_USER_ONLY)
3202 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3203 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3204 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3205 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3206 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3207 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3208 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3209 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3210 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3211 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3212 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3213 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3214 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3215 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3216 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3217 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
3218 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3219
3220 env->hreset_vector = 0x00000100UL;
3221#endif
3222}
3223
3224static void init_excp_7450(CPUPPCState *env)
3225{
3226#if !defined(CONFIG_USER_ONLY)
3227 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3228 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3229 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3230 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3231 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3232 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3233 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3234 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3235 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3236 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3237 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3238 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3239 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3240 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3241 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3242 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3243 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3244 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3245 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
3246
3247 env->hreset_vector = 0x00000100UL;
3248#endif
3249}
3250
3251#if defined(TARGET_PPC64)
3252static void init_excp_970(CPUPPCState *env)
3253{
3254#if !defined(CONFIG_USER_ONLY)
3255 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3256 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3257 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3258 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
3259 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3260 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
3261 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3262 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3263 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3264 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3265 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3266 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
3267 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3268 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3269 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3270 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3271 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3272 env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
3273 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
3274 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800;
3275
3276 env->hreset_vector = 0x0000000000000100ULL;
3277#endif
3278}
3279
3280static void init_excp_POWER7(CPUPPCState *env)
3281{
3282#if !defined(CONFIG_USER_ONLY)
3283 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3284 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3285 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3286 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
3287 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3288 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
3289 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3290 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3291 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3292 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3293 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3294 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
3295 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3296 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3297 env->excp_vectors[POWERPC_EXCP_HDSI] = 0x00000E00;
3298 env->excp_vectors[POWERPC_EXCP_HISI] = 0x00000E20;
3299 env->excp_vectors[POWERPC_EXCP_HV_EMU] = 0x00000E40;
3300 env->excp_vectors[POWERPC_EXCP_HV_MAINT] = 0x00000E60;
3301 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3302 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3303 env->excp_vectors[POWERPC_EXCP_VSXU] = 0x00000F40;
3304
3305 env->hreset_vector = 0x0000000000000100ULL;
3306#endif
3307}
3308
3309static void init_excp_POWER8(CPUPPCState *env)
3310{
3311 init_excp_POWER7(env);
3312
3313#if !defined(CONFIG_USER_ONLY)
3314 env->excp_vectors[POWERPC_EXCP_SDOOR] = 0x00000A00;
3315 env->excp_vectors[POWERPC_EXCP_FU] = 0x00000F60;
3316 env->excp_vectors[POWERPC_EXCP_HV_FU] = 0x00000F80;
3317 env->excp_vectors[POWERPC_EXCP_SDOOR_HV] = 0x00000E80;
3318#endif
3319}
3320
3321static void init_excp_POWER9(CPUPPCState *env)
3322{
3323 init_excp_POWER8(env);
3324
3325#if !defined(CONFIG_USER_ONLY)
3326 env->excp_vectors[POWERPC_EXCP_HVIRT] = 0x00000EA0;
3327#endif
3328}
3329
3330#endif
3331
3332
3333
3334static int check_pow_none(CPUPPCState *env)
3335{
3336 return 0;
3337}
3338
3339static int check_pow_nocheck(CPUPPCState *env)
3340{
3341 return 1;
3342}
3343
3344static int check_pow_hid0(CPUPPCState *env)
3345{
3346 if (env->spr[SPR_HID0] & 0x00E00000)
3347 return 1;
3348
3349 return 0;
3350}
3351
3352static int check_pow_hid0_74xx(CPUPPCState *env)
3353{
3354 if (env->spr[SPR_HID0] & 0x00600000)
3355 return 1;
3356
3357 return 0;
3358}
3359
3360static bool ppc_cpu_interrupts_big_endian_always(PowerPCCPU *cpu)
3361{
3362 return true;
3363}
3364
3365#ifdef TARGET_PPC64
3366static bool ppc_cpu_interrupts_big_endian_lpcr(PowerPCCPU *cpu)
3367{
3368 return !(cpu->env.spr[SPR_LPCR] & LPCR_ILE);
3369}
3370#endif
3371
3372
3373
3374
3375#define POWERPC_FAMILY(_name) \
3376 static void \
3377 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
3378 \
3379 static const TypeInfo \
3380 glue(glue(ppc_, _name), _cpu_family_type_info) = { \
3381 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \
3382 .parent = TYPE_POWERPC_CPU, \
3383 .abstract = true, \
3384 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \
3385 }; \
3386 \
3387 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \
3388 { \
3389 type_register_static( \
3390 &glue(glue(ppc_, _name), _cpu_family_type_info)); \
3391 } \
3392 \
3393 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \
3394 \
3395 static void glue(glue(ppc_, _name), _cpu_family_class_init)
3396
3397static void init_proc_401(CPUPPCState *env)
3398{
3399 gen_spr_40x(env);
3400 gen_spr_401_403(env);
3401 gen_spr_401(env);
3402 init_excp_4xx_real(env);
3403 env->dcache_line_size = 32;
3404 env->icache_line_size = 32;
3405
3406 ppc40x_irq_init(ppc_env_get_cpu(env));
3407
3408 SET_FIT_PERIOD(12, 16, 20, 24);
3409 SET_WDT_PERIOD(16, 20, 24, 28);
3410}
3411
3412POWERPC_FAMILY(401)(ObjectClass *oc, void *data)
3413{
3414 DeviceClass *dc = DEVICE_CLASS(oc);
3415 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3416
3417 dc->desc = "PowerPC 401";
3418 pcc->init_proc = init_proc_401;
3419 pcc->check_pow = check_pow_nocheck;
3420 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3421 PPC_WRTEE | PPC_DCR |
3422 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3423 PPC_CACHE_DCBZ |
3424 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3425 PPC_4xx_COMMON | PPC_40x_EXCP;
3426 pcc->msr_mask = (1ull << MSR_KEY) |
3427 (1ull << MSR_POW) |
3428 (1ull << MSR_CE) |
3429 (1ull << MSR_ILE) |
3430 (1ull << MSR_EE) |
3431 (1ull << MSR_PR) |
3432 (1ull << MSR_ME) |
3433 (1ull << MSR_DE) |
3434 (1ull << MSR_LE);
3435 pcc->mmu_model = POWERPC_MMU_REAL;
3436 pcc->excp_model = POWERPC_EXCP_40x;
3437 pcc->bus_model = PPC_FLAGS_INPUT_401;
3438 pcc->bfd_mach = bfd_mach_ppc_403;
3439 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3440 POWERPC_FLAG_BUS_CLK;
3441}
3442
3443static void init_proc_401x2(CPUPPCState *env)
3444{
3445 gen_spr_40x(env);
3446 gen_spr_401_403(env);
3447 gen_spr_401x2(env);
3448 gen_spr_compress(env);
3449
3450#if !defined(CONFIG_USER_ONLY)
3451 env->nb_tlb = 64;
3452 env->nb_ways = 1;
3453 env->id_tlbs = 0;
3454 env->tlb_type = TLB_EMB;
3455#endif
3456 init_excp_4xx_softmmu(env);
3457 env->dcache_line_size = 32;
3458 env->icache_line_size = 32;
3459
3460 ppc40x_irq_init(ppc_env_get_cpu(env));
3461
3462 SET_FIT_PERIOD(12, 16, 20, 24);
3463 SET_WDT_PERIOD(16, 20, 24, 28);
3464}
3465
3466POWERPC_FAMILY(401x2)(ObjectClass *oc, void *data)
3467{
3468 DeviceClass *dc = DEVICE_CLASS(oc);
3469 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3470
3471 dc->desc = "PowerPC 401x2";
3472 pcc->init_proc = init_proc_401x2;
3473 pcc->check_pow = check_pow_nocheck;
3474 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3475 PPC_DCR | PPC_WRTEE |
3476 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3477 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3478 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3479 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3480 PPC_4xx_COMMON | PPC_40x_EXCP;
3481 pcc->msr_mask = (1ull << 20) |
3482 (1ull << MSR_KEY) |
3483 (1ull << MSR_POW) |
3484 (1ull << MSR_CE) |
3485 (1ull << MSR_ILE) |
3486 (1ull << MSR_EE) |
3487 (1ull << MSR_PR) |
3488 (1ull << MSR_ME) |
3489 (1ull << MSR_DE) |
3490 (1ull << MSR_IR) |
3491 (1ull << MSR_DR) |
3492 (1ull << MSR_LE);
3493 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3494 pcc->excp_model = POWERPC_EXCP_40x;
3495 pcc->bus_model = PPC_FLAGS_INPUT_401;
3496 pcc->bfd_mach = bfd_mach_ppc_403;
3497 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3498 POWERPC_FLAG_BUS_CLK;
3499}
3500
3501static void init_proc_401x3(CPUPPCState *env)
3502{
3503 gen_spr_40x(env);
3504 gen_spr_401_403(env);
3505 gen_spr_401(env);
3506 gen_spr_401x2(env);
3507 gen_spr_compress(env);
3508 init_excp_4xx_softmmu(env);
3509 env->dcache_line_size = 32;
3510 env->icache_line_size = 32;
3511
3512 ppc40x_irq_init(ppc_env_get_cpu(env));
3513
3514 SET_FIT_PERIOD(12, 16, 20, 24);
3515 SET_WDT_PERIOD(16, 20, 24, 28);
3516}
3517
3518POWERPC_FAMILY(401x3)(ObjectClass *oc, void *data)
3519{
3520 DeviceClass *dc = DEVICE_CLASS(oc);
3521 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3522
3523 dc->desc = "PowerPC 401x3";
3524 pcc->init_proc = init_proc_401x3;
3525 pcc->check_pow = check_pow_nocheck;
3526 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3527 PPC_DCR | PPC_WRTEE |
3528 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3529 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3530 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3531 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3532 PPC_4xx_COMMON | PPC_40x_EXCP;
3533 pcc->msr_mask = (1ull << 20) |
3534 (1ull << MSR_KEY) |
3535 (1ull << MSR_POW) |
3536 (1ull << MSR_CE) |
3537 (1ull << MSR_ILE) |
3538 (1ull << MSR_EE) |
3539 (1ull << MSR_PR) |
3540 (1ull << MSR_ME) |
3541 (1ull << MSR_DWE) |
3542 (1ull << MSR_DE) |
3543 (1ull << MSR_IR) |
3544 (1ull << MSR_DR) |
3545 (1ull << MSR_LE);
3546 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3547 pcc->excp_model = POWERPC_EXCP_40x;
3548 pcc->bus_model = PPC_FLAGS_INPUT_401;
3549 pcc->bfd_mach = bfd_mach_ppc_403;
3550 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3551 POWERPC_FLAG_BUS_CLK;
3552}
3553
3554static void init_proc_IOP480(CPUPPCState *env)
3555{
3556 gen_spr_40x(env);
3557 gen_spr_401_403(env);
3558 gen_spr_401x2(env);
3559 gen_spr_compress(env);
3560
3561#if !defined(CONFIG_USER_ONLY)
3562 env->nb_tlb = 64;
3563 env->nb_ways = 1;
3564 env->id_tlbs = 0;
3565 env->tlb_type = TLB_EMB;
3566#endif
3567 init_excp_4xx_softmmu(env);
3568 env->dcache_line_size = 32;
3569 env->icache_line_size = 32;
3570
3571 ppc40x_irq_init(ppc_env_get_cpu(env));
3572
3573 SET_FIT_PERIOD(8, 12, 16, 20);
3574 SET_WDT_PERIOD(16, 20, 24, 28);
3575}
3576
3577POWERPC_FAMILY(IOP480)(ObjectClass *oc, void *data)
3578{
3579 DeviceClass *dc = DEVICE_CLASS(oc);
3580 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3581
3582 dc->desc = "IOP480";
3583 pcc->init_proc = init_proc_IOP480;
3584 pcc->check_pow = check_pow_nocheck;
3585 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3586 PPC_DCR | PPC_WRTEE |
3587 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3588 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3589 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3590 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3591 PPC_4xx_COMMON | PPC_40x_EXCP;
3592 pcc->msr_mask = (1ull << 20) |
3593 (1ull << MSR_KEY) |
3594 (1ull << MSR_POW) |
3595 (1ull << MSR_CE) |
3596 (1ull << MSR_ILE) |
3597 (1ull << MSR_EE) |
3598 (1ull << MSR_PR) |
3599 (1ull << MSR_ME) |
3600 (1ull << MSR_DE) |
3601 (1ull << MSR_IR) |
3602 (1ull << MSR_DR) |
3603 (1ull << MSR_LE);
3604 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3605 pcc->excp_model = POWERPC_EXCP_40x;
3606 pcc->bus_model = PPC_FLAGS_INPUT_401;
3607 pcc->bfd_mach = bfd_mach_ppc_403;
3608 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3609 POWERPC_FLAG_BUS_CLK;
3610}
3611
3612static void init_proc_403(CPUPPCState *env)
3613{
3614 gen_spr_40x(env);
3615 gen_spr_401_403(env);
3616 gen_spr_403(env);
3617 gen_spr_403_real(env);
3618 init_excp_4xx_real(env);
3619 env->dcache_line_size = 32;
3620 env->icache_line_size = 32;
3621
3622 ppc40x_irq_init(ppc_env_get_cpu(env));
3623
3624 SET_FIT_PERIOD(8, 12, 16, 20);
3625 SET_WDT_PERIOD(16, 20, 24, 28);
3626}
3627
3628POWERPC_FAMILY(403)(ObjectClass *oc, void *data)
3629{
3630 DeviceClass *dc = DEVICE_CLASS(oc);
3631 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3632
3633 dc->desc = "PowerPC 403";
3634 pcc->init_proc = init_proc_403;
3635 pcc->check_pow = check_pow_nocheck;
3636 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3637 PPC_DCR | PPC_WRTEE |
3638 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3639 PPC_CACHE_DCBZ |
3640 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3641 PPC_4xx_COMMON | PPC_40x_EXCP;
3642 pcc->msr_mask = (1ull << MSR_POW) |
3643 (1ull << MSR_CE) |
3644 (1ull << MSR_ILE) |
3645 (1ull << MSR_EE) |
3646 (1ull << MSR_PR) |
3647 (1ull << MSR_ME) |
3648 (1ull << MSR_PE) |
3649 (1ull << MSR_PX) |
3650 (1ull << MSR_LE);
3651 pcc->mmu_model = POWERPC_MMU_REAL;
3652 pcc->excp_model = POWERPC_EXCP_40x;
3653 pcc->bus_model = PPC_FLAGS_INPUT_401;
3654 pcc->bfd_mach = bfd_mach_ppc_403;
3655 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3656 POWERPC_FLAG_BUS_CLK;
3657}
3658
3659static void init_proc_403GCX(CPUPPCState *env)
3660{
3661 gen_spr_40x(env);
3662 gen_spr_401_403(env);
3663 gen_spr_403(env);
3664 gen_spr_403_real(env);
3665 gen_spr_403_mmu(env);
3666
3667
3668 spr_register(env, SPR_40x_SGR, "SGR",
3669 SPR_NOACCESS, SPR_NOACCESS,
3670 &spr_read_generic, &spr_write_generic,
3671 0xFFFFFFFF);
3672
3673 spr_register(env, SPR_40x_DCWR, "DCWR",
3674 SPR_NOACCESS, SPR_NOACCESS,
3675 &spr_read_generic, &spr_write_generic,
3676 0x00000000);
3677
3678#if !defined(CONFIG_USER_ONLY)
3679 env->nb_tlb = 64;
3680 env->nb_ways = 1;
3681 env->id_tlbs = 0;
3682 env->tlb_type = TLB_EMB;
3683#endif
3684 init_excp_4xx_softmmu(env);
3685 env->dcache_line_size = 32;
3686 env->icache_line_size = 32;
3687
3688 ppc40x_irq_init(ppc_env_get_cpu(env));
3689
3690 SET_FIT_PERIOD(8, 12, 16, 20);
3691 SET_WDT_PERIOD(16, 20, 24, 28);
3692}
3693
3694POWERPC_FAMILY(403GCX)(ObjectClass *oc, void *data)
3695{
3696 DeviceClass *dc = DEVICE_CLASS(oc);
3697 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3698
3699 dc->desc = "PowerPC 403 GCX";
3700 pcc->init_proc = init_proc_403GCX;
3701 pcc->check_pow = check_pow_nocheck;
3702 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3703 PPC_DCR | PPC_WRTEE |
3704 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3705 PPC_CACHE_DCBZ |
3706 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3707 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3708 PPC_4xx_COMMON | PPC_40x_EXCP;
3709 pcc->msr_mask = (1ull << MSR_POW) |
3710 (1ull << MSR_CE) |
3711 (1ull << MSR_ILE) |
3712 (1ull << MSR_EE) |
3713 (1ull << MSR_PR) |
3714 (1ull << MSR_ME) |
3715 (1ull << MSR_PE) |
3716 (1ull << MSR_PX) |
3717 (1ull << MSR_LE);
3718 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3719 pcc->excp_model = POWERPC_EXCP_40x;
3720 pcc->bus_model = PPC_FLAGS_INPUT_401;
3721 pcc->bfd_mach = bfd_mach_ppc_403;
3722 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3723 POWERPC_FLAG_BUS_CLK;
3724}
3725
3726static void init_proc_405(CPUPPCState *env)
3727{
3728
3729 gen_tbl(env);
3730 gen_spr_40x(env);
3731 gen_spr_405(env);
3732
3733
3734 spr_register(env, SPR_40x_SGR, "SGR",
3735 SPR_NOACCESS, SPR_NOACCESS,
3736 &spr_read_generic, &spr_write_generic,
3737 0xFFFFFFFF);
3738
3739 spr_register(env, SPR_40x_DCWR, "DCWR",
3740 SPR_NOACCESS, SPR_NOACCESS,
3741 &spr_read_generic, &spr_write_generic,
3742 0x00000000);
3743
3744#if !defined(CONFIG_USER_ONLY)
3745 env->nb_tlb = 64;
3746 env->nb_ways = 1;
3747 env->id_tlbs = 0;
3748 env->tlb_type = TLB_EMB;
3749#endif
3750 init_excp_4xx_softmmu(env);
3751 env->dcache_line_size = 32;
3752 env->icache_line_size = 32;
3753
3754 ppc40x_irq_init(ppc_env_get_cpu(env));
3755
3756 SET_FIT_PERIOD(8, 12, 16, 20);
3757 SET_WDT_PERIOD(16, 20, 24, 28);
3758}
3759
3760POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
3761{
3762 DeviceClass *dc = DEVICE_CLASS(oc);
3763 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3764
3765 dc->desc = "PowerPC 405";
3766 pcc->init_proc = init_proc_405;
3767 pcc->check_pow = check_pow_nocheck;
3768 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3769 PPC_DCR | PPC_WRTEE |
3770 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3771 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3772 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3773 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3774 PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
3775 pcc->msr_mask = (1ull << MSR_POW) |
3776 (1ull << MSR_CE) |
3777 (1ull << MSR_EE) |
3778 (1ull << MSR_PR) |
3779 (1ull << MSR_FP) |
3780 (1ull << MSR_DWE) |
3781 (1ull << MSR_DE) |
3782 (1ull << MSR_IR) |
3783 (1ull << MSR_DR);
3784 pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
3785 pcc->excp_model = POWERPC_EXCP_40x;
3786 pcc->bus_model = PPC_FLAGS_INPUT_405;
3787 pcc->bfd_mach = bfd_mach_ppc_403;
3788 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3789 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3790}
3791
3792static void init_proc_440EP(CPUPPCState *env)
3793{
3794
3795 gen_tbl(env);
3796 gen_spr_BookE(env, 0x000000000000FFFFULL);
3797 gen_spr_440(env);
3798 gen_spr_usprgh(env);
3799
3800 spr_register(env, SPR_BOOKE_PIR, "PIR",
3801 SPR_NOACCESS, SPR_NOACCESS,
3802 &spr_read_generic, &spr_write_pir,
3803 0x00000000);
3804
3805 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3806 SPR_NOACCESS, SPR_NOACCESS,
3807 &spr_read_generic, &spr_write_generic,
3808 0x00000000);
3809
3810 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3811 SPR_NOACCESS, SPR_NOACCESS,
3812 &spr_read_generic, &spr_write_generic,
3813 0x00000000);
3814
3815 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3816 SPR_NOACCESS, SPR_NOACCESS,
3817 &spr_read_generic, &spr_write_generic,
3818 0x00000000);
3819
3820 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3821 SPR_NOACCESS, SPR_NOACCESS,
3822 &spr_read_generic, &spr_write_generic,
3823 0x00000000);
3824
3825 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3826 SPR_NOACCESS, SPR_NOACCESS,
3827 &spr_read_generic, &spr_write_generic,
3828 0x00000000);
3829 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3830 SPR_NOACCESS, SPR_NOACCESS,
3831 &spr_read_generic, &spr_write_generic,
3832 0x00000000);
3833 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3834 SPR_NOACCESS, SPR_NOACCESS,
3835 &spr_read_generic, &spr_write_generic,
3836 0x00000000);
3837
3838 spr_register(env, SPR_440_CCR1, "CCR1",
3839 SPR_NOACCESS, SPR_NOACCESS,
3840 &spr_read_generic, &spr_write_generic,
3841 0x00000000);
3842
3843#if !defined(CONFIG_USER_ONLY)
3844 env->nb_tlb = 64;
3845 env->nb_ways = 1;
3846 env->id_tlbs = 0;
3847 env->tlb_type = TLB_EMB;
3848#endif
3849 init_excp_BookE(env);
3850 env->dcache_line_size = 32;
3851 env->icache_line_size = 32;
3852 ppc40x_irq_init(ppc_env_get_cpu(env));
3853
3854 SET_FIT_PERIOD(12, 16, 20, 24);
3855 SET_WDT_PERIOD(20, 24, 28, 32);
3856}
3857
3858POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
3859{
3860 DeviceClass *dc = DEVICE_CLASS(oc);
3861 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3862
3863 dc->desc = "PowerPC 440 EP";
3864 pcc->init_proc = init_proc_440EP;
3865 pcc->check_pow = check_pow_nocheck;
3866 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3867 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3868 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3869 PPC_FLOAT_STFIWX |
3870 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3871 PPC_CACHE | PPC_CACHE_ICBI |
3872 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3873 PPC_MEM_TLBSYNC | PPC_MFTB |
3874 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3875 PPC_440_SPEC;
3876 pcc->msr_mask = (1ull << MSR_POW) |
3877 (1ull << MSR_CE) |
3878 (1ull << MSR_EE) |
3879 (1ull << MSR_PR) |
3880 (1ull << MSR_FP) |
3881 (1ull << MSR_ME) |
3882 (1ull << MSR_FE0) |
3883 (1ull << MSR_DWE) |
3884 (1ull << MSR_DE) |
3885 (1ull << MSR_FE1) |
3886 (1ull << MSR_IR) |
3887 (1ull << MSR_DR);
3888 pcc->mmu_model = POWERPC_MMU_BOOKE;
3889 pcc->excp_model = POWERPC_EXCP_BOOKE;
3890 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3891 pcc->bfd_mach = bfd_mach_ppc_403;
3892 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3893 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3894}
3895
3896POWERPC_FAMILY(460EX)(ObjectClass *oc, void *data)
3897{
3898 DeviceClass *dc = DEVICE_CLASS(oc);
3899 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3900
3901 dc->desc = "PowerPC 460 EX";
3902 pcc->init_proc = init_proc_440EP;
3903 pcc->check_pow = check_pow_nocheck;
3904 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3905 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3906 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3907 PPC_FLOAT_STFIWX |
3908 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_RFMCI |
3909 PPC_CACHE | PPC_CACHE_ICBI |
3910 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3911 PPC_MEM_TLBSYNC | PPC_MFTB |
3912 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3913 PPC_440_SPEC;
3914 pcc->msr_mask = (1ull << MSR_POW) |
3915 (1ull << MSR_CE) |
3916 (1ull << MSR_EE) |
3917 (1ull << MSR_PR) |
3918 (1ull << MSR_FP) |
3919 (1ull << MSR_ME) |
3920 (1ull << MSR_FE0) |
3921 (1ull << MSR_DWE) |
3922 (1ull << MSR_DE) |
3923 (1ull << MSR_FE1) |
3924 (1ull << MSR_IR) |
3925 (1ull << MSR_DR);
3926 pcc->mmu_model = POWERPC_MMU_BOOKE;
3927 pcc->excp_model = POWERPC_EXCP_BOOKE;
3928 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3929 pcc->bfd_mach = bfd_mach_ppc_403;
3930 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3931 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3932}
3933
3934static void init_proc_440GP(CPUPPCState *env)
3935{
3936
3937 gen_tbl(env);
3938 gen_spr_BookE(env, 0x000000000000FFFFULL);
3939 gen_spr_440(env);
3940 gen_spr_usprgh(env);
3941
3942 spr_register(env, SPR_BOOKE_PIR, "PIR",
3943 SPR_NOACCESS, SPR_NOACCESS,
3944 &spr_read_generic, &spr_write_pir,
3945 0x00000000);
3946
3947 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3948 SPR_NOACCESS, SPR_NOACCESS,
3949 &spr_read_generic, &spr_write_generic,
3950 0x00000000);
3951
3952 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3953 SPR_NOACCESS, SPR_NOACCESS,
3954 &spr_read_generic, &spr_write_generic,
3955 0x00000000);
3956
3957 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3958 SPR_NOACCESS, SPR_NOACCESS,
3959 &spr_read_generic, &spr_write_generic,
3960 0x00000000);
3961
3962 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3963 SPR_NOACCESS, SPR_NOACCESS,
3964 &spr_read_generic, &spr_write_generic,
3965 0x00000000);
3966
3967#if !defined(CONFIG_USER_ONLY)
3968 env->nb_tlb = 64;
3969 env->nb_ways = 1;
3970 env->id_tlbs = 0;
3971 env->tlb_type = TLB_EMB;
3972#endif
3973 init_excp_BookE(env);
3974 env->dcache_line_size = 32;
3975 env->icache_line_size = 32;
3976
3977
3978 SET_FIT_PERIOD(12, 16, 20, 24);
3979 SET_WDT_PERIOD(20, 24, 28, 32);
3980}
3981
3982POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
3983{
3984 DeviceClass *dc = DEVICE_CLASS(oc);
3985 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3986
3987 dc->desc = "PowerPC 440 GP";
3988 pcc->init_proc = init_proc_440GP;
3989 pcc->check_pow = check_pow_nocheck;
3990 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3991 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
3992 PPC_CACHE | PPC_CACHE_ICBI |
3993 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3994 PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
3995 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3996 PPC_440_SPEC;
3997 pcc->msr_mask = (1ull << MSR_POW) |
3998 (1ull << MSR_CE) |
3999 (1ull << MSR_EE) |
4000 (1ull << MSR_PR) |
4001 (1ull << MSR_FP) |
4002 (1ull << MSR_ME) |
4003 (1ull << MSR_FE0) |
4004 (1ull << MSR_DWE) |
4005 (1ull << MSR_DE) |
4006 (1ull << MSR_FE1) |
4007 (1ull << MSR_IR) |
4008 (1ull << MSR_DR);
4009 pcc->mmu_model = POWERPC_MMU_BOOKE;
4010 pcc->excp_model = POWERPC_EXCP_BOOKE;
4011 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4012 pcc->bfd_mach = bfd_mach_ppc_403;
4013 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4014 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4015}
4016
4017static void init_proc_440x4(CPUPPCState *env)
4018{
4019
4020 gen_tbl(env);
4021 gen_spr_BookE(env, 0x000000000000FFFFULL);
4022 gen_spr_440(env);
4023 gen_spr_usprgh(env);
4024
4025 spr_register(env, SPR_BOOKE_PIR, "PIR",
4026 SPR_NOACCESS, SPR_NOACCESS,
4027 &spr_read_generic, &spr_write_pir,
4028 0x00000000);
4029
4030 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4031 SPR_NOACCESS, SPR_NOACCESS,
4032 &spr_read_generic, &spr_write_generic,
4033 0x00000000);
4034
4035 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4036 SPR_NOACCESS, SPR_NOACCESS,
4037 &spr_read_generic, &spr_write_generic,
4038 0x00000000);
4039
4040 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
4041 SPR_NOACCESS, SPR_NOACCESS,
4042 &spr_read_generic, &spr_write_generic,
4043 0x00000000);
4044
4045 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
4046 SPR_NOACCESS, SPR_NOACCESS,
4047 &spr_read_generic, &spr_write_generic,
4048 0x00000000);
4049
4050#if !defined(CONFIG_USER_ONLY)
4051 env->nb_tlb = 64;
4052 env->nb_ways = 1;
4053 env->id_tlbs = 0;
4054 env->tlb_type = TLB_EMB;
4055#endif
4056 init_excp_BookE(env);
4057 env->dcache_line_size = 32;
4058 env->icache_line_size = 32;
4059
4060
4061 SET_FIT_PERIOD(12, 16, 20, 24);
4062 SET_WDT_PERIOD(20, 24, 28, 32);
4063}
4064
4065POWERPC_FAMILY(440x4)(ObjectClass *oc, void *data)
4066{
4067 DeviceClass *dc = DEVICE_CLASS(oc);
4068 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4069
4070 dc->desc = "PowerPC 440x4";
4071 pcc->init_proc = init_proc_440x4;
4072 pcc->check_pow = check_pow_nocheck;
4073 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4074 PPC_DCR | PPC_WRTEE |
4075 PPC_CACHE | PPC_CACHE_ICBI |
4076 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4077 PPC_MEM_TLBSYNC | PPC_MFTB |
4078 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4079 PPC_440_SPEC;
4080 pcc->msr_mask = (1ull << MSR_POW) |
4081 (1ull << MSR_CE) |
4082 (1ull << MSR_EE) |
4083 (1ull << MSR_PR) |
4084 (1ull << MSR_FP) |
4085 (1ull << MSR_ME) |
4086 (1ull << MSR_FE0) |
4087 (1ull << MSR_DWE) |
4088 (1ull << MSR_DE) |
4089 (1ull << MSR_FE1) |
4090 (1ull << MSR_IR) |
4091 (1ull << MSR_DR);
4092 pcc->mmu_model = POWERPC_MMU_BOOKE;
4093 pcc->excp_model = POWERPC_EXCP_BOOKE;
4094 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4095 pcc->bfd_mach = bfd_mach_ppc_403;
4096 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4097 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4098}
4099
4100static void init_proc_440x5(CPUPPCState *env)
4101{
4102
4103 gen_tbl(env);
4104 gen_spr_BookE(env, 0x000000000000FFFFULL);
4105 gen_spr_440(env);
4106 gen_spr_usprgh(env);
4107
4108 spr_register(env, SPR_BOOKE_PIR, "PIR",
4109 SPR_NOACCESS, SPR_NOACCESS,
4110 &spr_read_generic, &spr_write_pir,
4111 0x00000000);
4112
4113 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4114 SPR_NOACCESS, SPR_NOACCESS,
4115 &spr_read_generic, &spr_write_generic,
4116 0x00000000);
4117
4118 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4119 SPR_NOACCESS, SPR_NOACCESS,
4120 &spr_read_generic, &spr_write_generic,
4121 0x00000000);
4122
4123 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
4124 SPR_NOACCESS, SPR_NOACCESS,
4125 &spr_read_generic, &spr_write_generic,
4126 0x00000000);
4127
4128 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
4129 SPR_NOACCESS, SPR_NOACCESS,
4130 &spr_read_generic, &spr_write_generic,
4131 0x00000000);
4132
4133 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4134 SPR_NOACCESS, SPR_NOACCESS,
4135 &spr_read_generic, &spr_write_generic,
4136 0x00000000);
4137 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4138 SPR_NOACCESS, SPR_NOACCESS,
4139 &spr_read_generic, &spr_write_generic,
4140 0x00000000);
4141 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4142 SPR_NOACCESS, SPR_NOACCESS,
4143 &spr_read_generic, &spr_write_generic,
4144 0x00000000);
4145
4146 spr_register(env, SPR_440_CCR1, "CCR1",
4147 SPR_NOACCESS, SPR_NOACCESS,
4148 &spr_read_generic, &spr_write_generic,
4149 0x00000000);
4150
4151#if !defined(CONFIG_USER_ONLY)
4152 env->nb_tlb = 64;
4153 env->nb_ways = 1;
4154 env->id_tlbs = 0;
4155 env->tlb_type = TLB_EMB;
4156#endif
4157 init_excp_BookE(env);
4158 env->dcache_line_size = 32;
4159 env->icache_line_size = 32;
4160 ppc40x_irq_init(ppc_env_get_cpu(env));
4161
4162 SET_FIT_PERIOD(12, 16, 20, 24);
4163 SET_WDT_PERIOD(20, 24, 28, 32);
4164}
4165
4166POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
4167{
4168 DeviceClass *dc = DEVICE_CLASS(oc);
4169 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4170
4171 dc->desc = "PowerPC 440x5";
4172 pcc->init_proc = init_proc_440x5;
4173 pcc->check_pow = check_pow_nocheck;
4174 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4175 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
4176 PPC_CACHE | PPC_CACHE_ICBI |
4177 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4178 PPC_MEM_TLBSYNC | PPC_MFTB |
4179 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4180 PPC_440_SPEC;
4181 pcc->msr_mask = (1ull << MSR_POW) |
4182 (1ull << MSR_CE) |
4183 (1ull << MSR_EE) |
4184 (1ull << MSR_PR) |
4185 (1ull << MSR_FP) |
4186 (1ull << MSR_ME) |
4187 (1ull << MSR_FE0) |
4188 (1ull << MSR_DWE) |
4189 (1ull << MSR_DE) |
4190 (1ull << MSR_FE1) |
4191 (1ull << MSR_IR) |
4192 (1ull << MSR_DR);
4193 pcc->mmu_model = POWERPC_MMU_BOOKE;
4194 pcc->excp_model = POWERPC_EXCP_BOOKE;
4195 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4196 pcc->bfd_mach = bfd_mach_ppc_403;
4197 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4198 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4199}
4200
4201POWERPC_FAMILY(440x5wDFPU)(ObjectClass *oc, void *data)
4202{
4203 DeviceClass *dc = DEVICE_CLASS(oc);
4204 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4205
4206 dc->desc = "PowerPC 440x5 with double precision FPU";
4207 pcc->init_proc = init_proc_440x5;
4208 pcc->check_pow = check_pow_nocheck;
4209 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4210 PPC_FLOAT | PPC_FLOAT_FSQRT |
4211 PPC_FLOAT_STFIWX |
4212 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
4213 PPC_CACHE | PPC_CACHE_ICBI |
4214 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4215 PPC_MEM_TLBSYNC | PPC_MFTB |
4216 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4217 PPC_440_SPEC;
4218 pcc->insns_flags2 = PPC2_FP_CVT_S64;
4219 pcc->msr_mask = (1ull << MSR_POW) |
4220 (1ull << MSR_CE) |
4221 (1ull << MSR_EE) |
4222 (1ull << MSR_PR) |
4223 (1ull << MSR_FP) |
4224 (1ull << MSR_ME) |
4225 (1ull << MSR_FE0) |
4226 (1ull << MSR_DWE) |
4227 (1ull << MSR_DE) |
4228 (1ull << MSR_FE1) |
4229 (1ull << MSR_IR) |
4230 (1ull << MSR_DR);
4231 pcc->mmu_model = POWERPC_MMU_BOOKE;
4232 pcc->excp_model = POWERPC_EXCP_BOOKE;
4233 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4234 pcc->bfd_mach = bfd_mach_ppc_403;
4235 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4236 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4237}
4238
4239static void init_proc_MPC5xx(CPUPPCState *env)
4240{
4241
4242 gen_tbl(env);
4243 gen_spr_5xx_8xx(env);
4244 gen_spr_5xx(env);
4245 init_excp_MPC5xx(env);
4246 env->dcache_line_size = 32;
4247 env->icache_line_size = 32;
4248
4249}
4250
4251POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
4252{
4253 DeviceClass *dc = DEVICE_CLASS(oc);
4254 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4255
4256 dc->desc = "Freescale 5xx cores (aka RCPU)";
4257 pcc->init_proc = init_proc_MPC5xx;
4258 pcc->check_pow = check_pow_none;
4259 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4260 PPC_MEM_EIEIO | PPC_MEM_SYNC |
4261 PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
4262 PPC_MFTB;
4263 pcc->msr_mask = (1ull << MSR_ILE) |
4264 (1ull << MSR_EE) |
4265 (1ull << MSR_PR) |
4266 (1ull << MSR_FP) |
4267 (1ull << MSR_ME) |
4268 (1ull << MSR_FE0) |
4269 (1ull << MSR_SE) |
4270 (1ull << MSR_DE) |
4271 (1ull << MSR_FE1) |
4272 (1ull << MSR_EP) |
4273 (1ull << MSR_RI) |
4274 (1ull << MSR_LE);
4275 pcc->mmu_model = POWERPC_MMU_REAL;
4276 pcc->excp_model = POWERPC_EXCP_603;
4277 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4278 pcc->bfd_mach = bfd_mach_ppc_505;
4279 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4280 POWERPC_FLAG_BUS_CLK;
4281}
4282
4283static void init_proc_MPC8xx(CPUPPCState *env)
4284{
4285
4286 gen_tbl(env);
4287 gen_spr_5xx_8xx(env);
4288 gen_spr_8xx(env);
4289 init_excp_MPC8xx(env);
4290 env->dcache_line_size = 32;
4291 env->icache_line_size = 32;
4292
4293}
4294
4295POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
4296{
4297 DeviceClass *dc = DEVICE_CLASS(oc);
4298 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4299
4300 dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
4301 pcc->init_proc = init_proc_MPC8xx;
4302 pcc->check_pow = check_pow_none;
4303 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4304 PPC_MEM_EIEIO | PPC_MEM_SYNC |
4305 PPC_CACHE_ICBI | PPC_MFTB;
4306 pcc->msr_mask = (1ull << MSR_ILE) |
4307 (1ull << MSR_EE) |
4308 (1ull << MSR_PR) |
4309 (1ull << MSR_FP) |
4310 (1ull << MSR_ME) |
4311 (1ull << MSR_SE) |
4312 (1ull << MSR_DE) |
4313 (1ull << MSR_EP) |
4314 (1ull << MSR_IR) |
4315 (1ull << MSR_DR) |
4316 (1ull << MSR_RI) |
4317 (1ull << MSR_LE);
4318 pcc->mmu_model = POWERPC_MMU_MPC8xx;
4319 pcc->excp_model = POWERPC_EXCP_603;
4320 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4321 pcc->bfd_mach = bfd_mach_ppc_860;
4322 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4323 POWERPC_FLAG_BUS_CLK;
4324}
4325
4326
4327
4328static void init_proc_G2(CPUPPCState *env)
4329{
4330 gen_spr_ne_601(env);
4331 gen_spr_sdr1(env);
4332 gen_spr_G2_755(env);
4333 gen_spr_G2(env);
4334
4335 gen_tbl(env);
4336
4337
4338 spr_register(env, SPR_EAR, "EAR",
4339 SPR_NOACCESS, SPR_NOACCESS,
4340 &spr_read_generic, &spr_write_generic,
4341 0x00000000);
4342
4343
4344 spr_register(env, SPR_HID0, "HID0",
4345 SPR_NOACCESS, SPR_NOACCESS,
4346 &spr_read_generic, &spr_write_generic,
4347 0x00000000);
4348
4349 spr_register(env, SPR_HID1, "HID1",
4350 SPR_NOACCESS, SPR_NOACCESS,
4351 &spr_read_generic, &spr_write_generic,
4352 0x00000000);
4353
4354 spr_register(env, SPR_HID2, "HID2",
4355 SPR_NOACCESS, SPR_NOACCESS,
4356 &spr_read_generic, &spr_write_generic,
4357 0x00000000);
4358
4359 gen_low_BATs(env);
4360 gen_high_BATs(env);
4361 gen_6xx_7xx_soft_tlb(env, 64, 2);
4362 init_excp_G2(env);
4363 env->dcache_line_size = 32;
4364 env->icache_line_size = 32;
4365
4366 ppc6xx_irq_init(ppc_env_get_cpu(env));
4367}
4368
4369POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
4370{
4371 DeviceClass *dc = DEVICE_CLASS(oc);
4372 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4373
4374 dc->desc = "PowerPC G2";
4375 pcc->init_proc = init_proc_G2;
4376 pcc->check_pow = check_pow_hid0;
4377 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4378 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4379 PPC_FLOAT_STFIWX |
4380 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4381 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4382 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4383 PPC_SEGMENT | PPC_EXTERN;
4384 pcc->msr_mask = (1ull << MSR_POW) |
4385 (1ull << MSR_TGPR) |
4386 (1ull << MSR_EE) |
4387 (1ull << MSR_PR) |
4388 (1ull << MSR_FP) |
4389 (1ull << MSR_ME) |
4390 (1ull << MSR_FE0) |
4391 (1ull << MSR_SE) |
4392 (1ull << MSR_DE) |
4393 (1ull << MSR_FE1) |
4394 (1ull << MSR_AL) |
4395 (1ull << MSR_EP) |
4396 (1ull << MSR_IR) |
4397 (1ull << MSR_DR) |
4398 (1ull << MSR_RI);
4399 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4400 pcc->excp_model = POWERPC_EXCP_G2;
4401 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4402 pcc->bfd_mach = bfd_mach_ppc_ec603e;
4403 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4404 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4405}
4406
4407static void init_proc_G2LE(CPUPPCState *env)
4408{
4409 gen_spr_ne_601(env);
4410 gen_spr_sdr1(env);
4411 gen_spr_G2_755(env);
4412 gen_spr_G2(env);
4413
4414 gen_tbl(env);
4415
4416
4417 spr_register(env, SPR_EAR, "EAR",
4418 SPR_NOACCESS, SPR_NOACCESS,
4419 &spr_read_generic, &spr_write_generic,
4420 0x00000000);
4421
4422
4423 spr_register(env, SPR_HID0, "HID0",
4424 SPR_NOACCESS, SPR_NOACCESS,
4425 &spr_read_generic, &spr_write_generic,
4426 0x00000000);
4427
4428 spr_register(env, SPR_HID1, "HID1",
4429 SPR_NOACCESS, SPR_NOACCESS,
4430 &spr_read_generic, &spr_write_generic,
4431 0x00000000);
4432
4433 spr_register(env, SPR_HID2, "HID2",
4434 SPR_NOACCESS, SPR_NOACCESS,
4435 &spr_read_generic, &spr_write_generic,
4436 0x00000000);
4437
4438
4439 gen_low_BATs(env);
4440 gen_high_BATs(env);
4441 gen_6xx_7xx_soft_tlb(env, 64, 2);
4442 init_excp_G2(env);
4443 env->dcache_line_size = 32;
4444 env->icache_line_size = 32;
4445
4446 ppc6xx_irq_init(ppc_env_get_cpu(env));
4447}
4448
4449POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
4450{
4451 DeviceClass *dc = DEVICE_CLASS(oc);
4452 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4453
4454 dc->desc = "PowerPC G2LE";
4455 pcc->init_proc = init_proc_G2LE;
4456 pcc->check_pow = check_pow_hid0;
4457 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4458 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4459 PPC_FLOAT_STFIWX |
4460 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4461 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4462 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4463 PPC_SEGMENT | PPC_EXTERN;
4464 pcc->msr_mask = (1ull << MSR_POW) |
4465 (1ull << MSR_TGPR) |
4466 (1ull << MSR_ILE) |
4467 (1ull << MSR_EE) |
4468 (1ull << MSR_PR) |
4469 (1ull << MSR_FP) |
4470 (1ull << MSR_ME) |
4471 (1ull << MSR_FE0) |
4472 (1ull << MSR_SE) |
4473 (1ull << MSR_DE) |
4474 (1ull << MSR_FE1) |
4475 (1ull << MSR_AL) |
4476 (1ull << MSR_EP) |
4477 (1ull << MSR_IR) |
4478 (1ull << MSR_DR) |
4479 (1ull << MSR_RI) |
4480 (1ull << MSR_LE);
4481 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4482 pcc->excp_model = POWERPC_EXCP_G2;
4483 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4484 pcc->bfd_mach = bfd_mach_ppc_ec603e;
4485 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4486 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4487}
4488
4489static void init_proc_e200(CPUPPCState *env)
4490{
4491
4492 gen_tbl(env);
4493 gen_spr_BookE(env, 0x000000070000FFFFULL);
4494
4495 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4496 &spr_read_spefscr, &spr_write_spefscr,
4497 &spr_read_spefscr, &spr_write_spefscr,
4498 0x00000000);
4499
4500 gen_spr_BookE206(env, 0x0000005D, NULL, 0);
4501
4502 spr_register(env, SPR_HID0, "HID0",
4503 SPR_NOACCESS, SPR_NOACCESS,
4504 &spr_read_generic, &spr_write_generic,
4505 0x00000000);
4506
4507 spr_register(env, SPR_HID1, "HID1",
4508 SPR_NOACCESS, SPR_NOACCESS,
4509 &spr_read_generic, &spr_write_generic,
4510 0x00000000);
4511
4512 spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
4513 SPR_NOACCESS, SPR_NOACCESS,
4514 &spr_read_generic, &spr_write_generic,
4515 0x00000000);
4516
4517 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4518 SPR_NOACCESS, SPR_NOACCESS,
4519 &spr_read_generic, &spr_write_generic,
4520 0x00000000);
4521
4522 spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
4523 SPR_NOACCESS, SPR_NOACCESS,
4524 &spr_read_generic, &spr_write_generic,
4525 0x00000000);
4526
4527 spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
4528 SPR_NOACCESS, SPR_NOACCESS,
4529 &spr_read_generic, &spr_write_generic,
4530 0x00000000);
4531
4532 spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
4533 SPR_NOACCESS, SPR_NOACCESS,
4534 &spr_read_generic, &spr_write_generic,
4535 0x00000000);
4536
4537 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4538 &spr_read_generic, SPR_NOACCESS,
4539 &spr_read_generic, SPR_NOACCESS,
4540 0x00000000);
4541
4542 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4543 SPR_NOACCESS, SPR_NOACCESS,
4544 &spr_read_generic, &spr_write_generic,
4545 0x00000000);
4546
4547 spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
4548 SPR_NOACCESS, SPR_NOACCESS,
4549 &spr_read_generic, &spr_write_generic,
4550 0x00000000);
4551
4552 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
4553 SPR_NOACCESS, SPR_NOACCESS,
4554 &spr_read_generic, &spr_write_generic,
4555 0x00000000);
4556
4557 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
4558 SPR_NOACCESS, SPR_NOACCESS,
4559 &spr_read_generic, &spr_write_generic,
4560 0x00000000);
4561
4562 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4563 SPR_NOACCESS, SPR_NOACCESS,
4564 &spr_read_generic, &spr_write_generic,
4565 0x00000000);
4566
4567 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4568 SPR_NOACCESS, SPR_NOACCESS,
4569 &spr_read_generic, &spr_write_generic,
4570 0x00000000);
4571
4572 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4573 SPR_NOACCESS, SPR_NOACCESS,
4574 &spr_read_generic, &spr_write_generic,
4575 0x00000000);
4576 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
4577 SPR_NOACCESS, SPR_NOACCESS,
4578 &spr_read_generic, &spr_write_generic,
4579 0x00000000);
4580 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
4581 SPR_NOACCESS, SPR_NOACCESS,
4582 &spr_read_generic, &spr_write_generic,
4583 0x00000000);
4584#if !defined(CONFIG_USER_ONLY)
4585 env->nb_tlb = 64;
4586 env->nb_ways = 1;
4587 env->id_tlbs = 0;
4588 env->tlb_type = TLB_EMB;
4589#endif
4590 init_excp_e200(env, 0xFFFF0000UL);
4591 env->dcache_line_size = 32;
4592 env->icache_line_size = 32;
4593
4594}
4595
4596POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
4597{
4598 DeviceClass *dc = DEVICE_CLASS(oc);
4599 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4600
4601 dc->desc = "e200 core";
4602 pcc->init_proc = init_proc_e200;
4603 pcc->check_pow = check_pow_hid0;
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4614 PPC_SPE | PPC_SPE_SINGLE |
4615 PPC_WRTEE | PPC_RFDI |
4616 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4617 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4618 PPC_MEM_TLBSYNC | PPC_TLBIVAX |
4619 PPC_BOOKE;
4620 pcc->msr_mask = (1ull << MSR_UCLE) |
4621 (1ull << MSR_SPE) |
4622 (1ull << MSR_POW) |
4623 (1ull << MSR_CE) |
4624 (1ull << MSR_EE) |
4625 (1ull << MSR_PR) |
4626 (1ull << MSR_FP) |
4627 (1ull << MSR_ME) |
4628 (1ull << MSR_FE0) |
4629 (1ull << MSR_DWE) |
4630 (1ull << MSR_DE) |
4631 (1ull << MSR_FE1) |
4632 (1ull << MSR_IR) |
4633 (1ull << MSR_DR);
4634 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4635 pcc->excp_model = POWERPC_EXCP_BOOKE;
4636 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4637 pcc->bfd_mach = bfd_mach_ppc_860;
4638 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4639 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4640 POWERPC_FLAG_BUS_CLK;
4641}
4642
4643static void init_proc_e300(CPUPPCState *env)
4644{
4645 gen_spr_ne_601(env);
4646 gen_spr_sdr1(env);
4647 gen_spr_603(env);
4648
4649 gen_tbl(env);
4650
4651
4652 spr_register(env, SPR_HID0, "HID0",
4653 SPR_NOACCESS, SPR_NOACCESS,
4654 &spr_read_generic, &spr_write_generic,
4655 0x00000000);
4656
4657 spr_register(env, SPR_HID1, "HID1",
4658 SPR_NOACCESS, SPR_NOACCESS,
4659 &spr_read_generic, &spr_write_generic,
4660 0x00000000);
4661
4662 spr_register(env, SPR_HID2, "HID2",
4663 SPR_NOACCESS, SPR_NOACCESS,
4664 &spr_read_generic, &spr_write_generic,
4665 0x00000000);
4666
4667
4668 spr_register(env, SPR_DABR, "DABR",
4669 SPR_NOACCESS, SPR_NOACCESS,
4670 &spr_read_generic, &spr_write_generic,
4671 0x00000000);
4672
4673 spr_register(env, SPR_DABR2, "DABR2",
4674 SPR_NOACCESS, SPR_NOACCESS,
4675 &spr_read_generic, &spr_write_generic,
4676 0x00000000);
4677
4678 spr_register(env, SPR_IABR2, "IABR2",
4679 SPR_NOACCESS, SPR_NOACCESS,
4680 &spr_read_generic, &spr_write_generic,
4681 0x00000000);
4682
4683 spr_register(env, SPR_IBCR, "IBCR",
4684 SPR_NOACCESS, SPR_NOACCESS,
4685 &spr_read_generic, &spr_write_generic,
4686 0x00000000);
4687
4688 spr_register(env, SPR_DBCR, "DBCR",
4689 SPR_NOACCESS, SPR_NOACCESS,
4690 &spr_read_generic, &spr_write_generic,
4691 0x00000000);
4692
4693 gen_low_BATs(env);
4694 gen_high_BATs(env);
4695 gen_6xx_7xx_soft_tlb(env, 64, 2);
4696 init_excp_603(env);
4697 env->dcache_line_size = 32;
4698 env->icache_line_size = 32;
4699
4700 ppc6xx_irq_init(ppc_env_get_cpu(env));
4701}
4702
4703POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
4704{
4705 DeviceClass *dc = DEVICE_CLASS(oc);
4706 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4707
4708 dc->desc = "e300 core";
4709 pcc->init_proc = init_proc_e300;
4710 pcc->check_pow = check_pow_hid0;
4711 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4712 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4713 PPC_FLOAT_STFIWX |
4714 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4715 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4716 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4717 PPC_SEGMENT | PPC_EXTERN;
4718 pcc->msr_mask = (1ull << MSR_POW) |
4719 (1ull << MSR_TGPR) |
4720 (1ull << MSR_ILE) |
4721 (1ull << MSR_EE) |
4722 (1ull << MSR_PR) |
4723 (1ull << MSR_FP) |
4724 (1ull << MSR_ME) |
4725 (1ull << MSR_FE0) |
4726 (1ull << MSR_SE) |
4727 (1ull << MSR_DE) |
4728 (1ull << MSR_FE1) |
4729 (1ull << MSR_AL) |
4730 (1ull << MSR_EP) |
4731 (1ull << MSR_IR) |
4732 (1ull << MSR_DR) |
4733 (1ull << MSR_RI) |
4734 (1ull << MSR_LE);
4735 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4736 pcc->excp_model = POWERPC_EXCP_603;
4737 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4738 pcc->bfd_mach = bfd_mach_ppc_603;
4739 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4740 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4741}
4742
4743#if !defined(CONFIG_USER_ONLY)
4744static void spr_write_mas73(DisasContext *ctx, int sprn, int gprn)
4745{
4746 TCGv val = tcg_temp_new();
4747 tcg_gen_ext32u_tl(val, cpu_gpr[gprn]);
4748 gen_store_spr(SPR_BOOKE_MAS3, val);
4749 tcg_gen_shri_tl(val, cpu_gpr[gprn], 32);
4750 gen_store_spr(SPR_BOOKE_MAS7, val);
4751 tcg_temp_free(val);
4752}
4753
4754static void spr_read_mas73(DisasContext *ctx, int gprn, int sprn)
4755{
4756 TCGv mas7 = tcg_temp_new();
4757 TCGv mas3 = tcg_temp_new();
4758 gen_load_spr(mas7, SPR_BOOKE_MAS7);
4759 tcg_gen_shli_tl(mas7, mas7, 32);
4760 gen_load_spr(mas3, SPR_BOOKE_MAS3);
4761 tcg_gen_or_tl(cpu_gpr[gprn], mas3, mas7);
4762 tcg_temp_free(mas3);
4763 tcg_temp_free(mas7);
4764}
4765
4766#endif
4767
4768enum fsl_e500_version {
4769 fsl_e500v1,
4770 fsl_e500v2,
4771 fsl_e500mc,
4772 fsl_e5500,
4773 fsl_e6500,
4774};
4775
4776static void init_proc_e500(CPUPPCState *env, int version)
4777{
4778 PowerPCCPU *cpu = ppc_env_get_cpu(env);
4779 uint32_t tlbncfg[2];
4780 uint64_t ivor_mask;
4781 uint64_t ivpr_mask = 0xFFFF0000ULL;
4782 uint32_t l1cfg0 = 0x3800
4783 | 0x0020;
4784 uint32_t l1cfg1 = 0x3800
4785 | 0x0020;
4786 uint32_t mmucfg = 0;
4787#if !defined(CONFIG_USER_ONLY)
4788 int i;
4789#endif
4790
4791
4792 gen_tbl(env);
4793
4794
4795
4796
4797
4798 switch (version) {
4799 case fsl_e500v1:
4800 case fsl_e500v2:
4801 default:
4802 ivor_mask = 0x0000000F0000FFFFULL;
4803 break;
4804 case fsl_e500mc:
4805 case fsl_e5500:
4806 ivor_mask = 0x000003FE0000FFFFULL;
4807 break;
4808 case fsl_e6500:
4809 ivor_mask = 0x000003FF0000FFFFULL;
4810 break;
4811 }
4812 gen_spr_BookE(env, ivor_mask);
4813 gen_spr_usprg3(env);
4814
4815 spr_register(env, SPR_BOOKE_PIR, "PIR",
4816 SPR_NOACCESS, SPR_NOACCESS,
4817 &spr_read_generic, &spr_write_pir,
4818 0x00000000);
4819
4820 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4821 &spr_read_spefscr, &spr_write_spefscr,
4822 &spr_read_spefscr, &spr_write_spefscr,
4823 0x00000000);
4824#if !defined(CONFIG_USER_ONLY)
4825
4826 env->nb_pids = 3;
4827 env->nb_ways = 2;
4828 env->id_tlbs = 0;
4829 switch (version) {
4830 case fsl_e500v1:
4831 tlbncfg[0] = gen_tlbncfg(2, 1, 1, 0, 256);
4832 tlbncfg[1] = gen_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4833 break;
4834 case fsl_e500v2:
4835 tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4836 tlbncfg[1] = gen_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4837 break;
4838 case fsl_e500mc:
4839 case fsl_e5500:
4840 tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4841 tlbncfg[1] = gen_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
4842 break;
4843 case fsl_e6500:
4844 mmucfg = 0x6510B45;
4845 env->nb_pids = 1;
4846 tlbncfg[0] = 0x08052400;
4847 tlbncfg[1] = 0x40028040;
4848 break;
4849 default:
4850 cpu_abort(CPU(cpu), "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4851 }
4852#endif
4853
4854 switch (version) {
4855 case fsl_e500v1:
4856 case fsl_e500v2:
4857 env->dcache_line_size = 32;
4858 env->icache_line_size = 32;
4859 break;
4860 case fsl_e500mc:
4861 case fsl_e5500:
4862 env->dcache_line_size = 64;
4863 env->icache_line_size = 64;
4864 l1cfg0 |= 0x1000000;
4865 l1cfg1 |= 0x1000000;
4866 break;
4867 case fsl_e6500:
4868 env->dcache_line_size = 32;
4869 env->icache_line_size = 32;
4870 l1cfg0 |= 0x0F83820;
4871 l1cfg1 |= 0x0B83820;
4872 break;
4873 default:
4874 cpu_abort(CPU(cpu), "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4875 }
4876 gen_spr_BookE206(env, 0x000000DF, tlbncfg, mmucfg);
4877
4878 spr_register(env, SPR_HID0, "HID0",
4879 SPR_NOACCESS, SPR_NOACCESS,
4880 &spr_read_generic, &spr_write_generic,
4881 0x00000000);
4882
4883 spr_register(env, SPR_HID1, "HID1",
4884 SPR_NOACCESS, SPR_NOACCESS,
4885 &spr_read_generic, &spr_write_generic,
4886 0x00000000);
4887
4888 spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
4889 SPR_NOACCESS, SPR_NOACCESS,
4890 &spr_read_generic, &spr_write_generic,
4891 0x00000000);
4892
4893 spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
4894 SPR_NOACCESS, SPR_NOACCESS,
4895 &spr_read_generic, &spr_write_generic,
4896 0x00000000);
4897
4898 spr_register(env, SPR_Exxx_MCAR, "MCAR",
4899 SPR_NOACCESS, SPR_NOACCESS,
4900 &spr_read_generic, &spr_write_generic,
4901 0x00000000);
4902
4903 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4904 SPR_NOACCESS, SPR_NOACCESS,
4905 &spr_read_generic, &spr_write_generic,
4906 0x00000000);
4907
4908 spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
4909 SPR_NOACCESS, SPR_NOACCESS,
4910 &spr_read_generic, &spr_write_generic,
4911 0x00000000);
4912
4913 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4914 SPR_NOACCESS, SPR_NOACCESS,
4915 &spr_read_generic, &spr_write_generic,
4916 0x00000000);
4917
4918 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4919 &spr_read_generic, SPR_NOACCESS,
4920 &spr_read_generic, SPR_NOACCESS,
4921 l1cfg0);
4922 spr_register(env, SPR_Exxx_L1CFG1, "L1CFG1",
4923 &spr_read_generic, SPR_NOACCESS,
4924 &spr_read_generic, SPR_NOACCESS,
4925 l1cfg1);
4926 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4927 SPR_NOACCESS, SPR_NOACCESS,
4928 &spr_read_generic, &spr_write_e500_l1csr0,
4929 0x00000000);
4930 spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
4931 SPR_NOACCESS, SPR_NOACCESS,
4932 &spr_read_generic, &spr_write_e500_l1csr1,
4933 0x00000000);
4934 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4935 SPR_NOACCESS, SPR_NOACCESS,
4936 &spr_read_generic, &spr_write_generic,
4937 0x00000000);
4938 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4939 SPR_NOACCESS, SPR_NOACCESS,
4940 &spr_read_generic, &spr_write_generic,
4941 0x00000000);
4942 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4943 SPR_NOACCESS, SPR_NOACCESS,
4944 &spr_read_generic, &spr_write_booke206_mmucsr0,
4945 0x00000000);
4946 spr_register(env, SPR_BOOKE_EPR, "EPR",
4947 SPR_NOACCESS, SPR_NOACCESS,
4948 &spr_read_generic, SPR_NOACCESS,
4949 0x00000000);
4950
4951 if ((version == fsl_e5500) || (version == fsl_e6500)) {
4952 spr_register(env, SPR_BOOKE_EPCR, "EPCR",
4953 SPR_NOACCESS, SPR_NOACCESS,
4954 &spr_read_generic, &spr_write_generic,
4955 0x00000000);
4956 spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
4957 SPR_NOACCESS, SPR_NOACCESS,
4958 &spr_read_mas73, &spr_write_mas73,
4959 0x00000000);
4960 ivpr_mask = (target_ulong)~0xFFFFULL;
4961 }
4962
4963 if (version == fsl_e6500) {
4964
4965 spr_register(env, SPR_TIR, "TIR",
4966 SPR_NOACCESS, SPR_NOACCESS,
4967 &spr_read_generic, SPR_NOACCESS,
4968 0x00000000);
4969 spr_register(env, SPR_BOOKE_TLB0PS, "TLB0PS",
4970 SPR_NOACCESS, SPR_NOACCESS,
4971 &spr_read_generic, SPR_NOACCESS,
4972 0x00000004);
4973 spr_register(env, SPR_BOOKE_TLB1PS, "TLB1PS",
4974 SPR_NOACCESS, SPR_NOACCESS,
4975 &spr_read_generic, SPR_NOACCESS,
4976 0x7FFFFFFC);
4977 }
4978
4979#if !defined(CONFIG_USER_ONLY)
4980 env->nb_tlb = 0;
4981 env->tlb_type = TLB_MAS;
4982 for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
4983 env->nb_tlb += booke206_tlb_size(env, i);
4984 }
4985#endif
4986
4987 init_excp_e200(env, ivpr_mask);
4988
4989 ppce500_irq_init(ppc_env_get_cpu(env));
4990}
4991
4992static void init_proc_e500v1(CPUPPCState *env)
4993{
4994 init_proc_e500(env, fsl_e500v1);
4995}
4996
4997POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
4998{
4999 DeviceClass *dc = DEVICE_CLASS(oc);
5000 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5001
5002 dc->desc = "e500v1 core";
5003 pcc->init_proc = init_proc_e500v1;
5004 pcc->check_pow = check_pow_hid0;
5005 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
5006 PPC_SPE | PPC_SPE_SINGLE |
5007 PPC_WRTEE | PPC_RFDI |
5008 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5009 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5010 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
5011 pcc->insns_flags2 = PPC2_BOOKE206;
5012 pcc->msr_mask = (1ull << MSR_UCLE) |
5013 (1ull << MSR_SPE) |
5014 (1ull << MSR_POW) |
5015 (1ull << MSR_CE) |
5016 (1ull << MSR_EE) |
5017 (1ull << MSR_PR) |
5018 (1ull << MSR_FP) |
5019 (1ull << MSR_ME) |
5020 (1ull << MSR_FE0) |
5021 (1ull << MSR_DWE) |
5022 (1ull << MSR_DE) |
5023 (1ull << MSR_FE1) |
5024 (1ull << MSR_IR) |
5025 (1ull << MSR_DR);
5026 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5027 pcc->excp_model = POWERPC_EXCP_BOOKE;
5028 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5029 pcc->bfd_mach = bfd_mach_ppc_860;
5030 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
5031 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
5032 POWERPC_FLAG_BUS_CLK;
5033}
5034
5035static void init_proc_e500v2(CPUPPCState *env)
5036{
5037 init_proc_e500(env, fsl_e500v2);
5038}
5039
5040POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
5041{
5042 DeviceClass *dc = DEVICE_CLASS(oc);
5043 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5044
5045 dc->desc = "e500v2 core";
5046 pcc->init_proc = init_proc_e500v2;
5047 pcc->check_pow = check_pow_hid0;
5048 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
5049 PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
5050 PPC_WRTEE | PPC_RFDI |
5051 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5052 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5053 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
5054 pcc->insns_flags2 = PPC2_BOOKE206;
5055 pcc->msr_mask = (1ull << MSR_UCLE) |
5056 (1ull << MSR_SPE) |
5057 (1ull << MSR_POW) |
5058 (1ull << MSR_CE) |
5059 (1ull << MSR_EE) |
5060 (1ull << MSR_PR) |
5061 (1ull << MSR_FP) |
5062 (1ull << MSR_ME) |
5063 (1ull << MSR_FE0) |
5064 (1ull << MSR_DWE) |
5065 (1ull << MSR_DE) |
5066 (1ull << MSR_FE1) |
5067 (1ull << MSR_IR) |
5068 (1ull << MSR_DR);
5069 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5070 pcc->excp_model = POWERPC_EXCP_BOOKE;
5071 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5072 pcc->bfd_mach = bfd_mach_ppc_860;
5073 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
5074 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
5075 POWERPC_FLAG_BUS_CLK;
5076}
5077
5078static void init_proc_e500mc(CPUPPCState *env)
5079{
5080 init_proc_e500(env, fsl_e500mc);
5081}
5082
5083POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
5084{
5085 DeviceClass *dc = DEVICE_CLASS(oc);
5086 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5087
5088 dc->desc = "e500mc core";
5089 pcc->init_proc = init_proc_e500mc;
5090 pcc->check_pow = check_pow_none;
5091 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
5092 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
5093 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5094 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5095 PPC_FLOAT | PPC_FLOAT_FRES |
5096 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
5097 PPC_FLOAT_STFIWX | PPC_WAIT |
5098 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
5099 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
5100 pcc->msr_mask = (1ull << MSR_GS) |
5101 (1ull << MSR_UCLE) |
5102 (1ull << MSR_CE) |
5103 (1ull << MSR_EE) |
5104 (1ull << MSR_PR) |
5105 (1ull << MSR_FP) |
5106 (1ull << MSR_ME) |
5107 (1ull << MSR_FE0) |
5108 (1ull << MSR_DE) |
5109 (1ull << MSR_FE1) |
5110 (1ull << MSR_IR) |
5111 (1ull << MSR_DR) |
5112 (1ull << MSR_PX) |
5113 (1ull << MSR_RI);
5114 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5115 pcc->excp_model = POWERPC_EXCP_BOOKE;
5116 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5117
5118 pcc->bfd_mach = bfd_mach_ppc_e500;
5119 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
5120 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5121}
5122
5123#ifdef TARGET_PPC64
5124static void init_proc_e5500(CPUPPCState *env)
5125{
5126 init_proc_e500(env, fsl_e5500);
5127}
5128
5129POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
5130{
5131 DeviceClass *dc = DEVICE_CLASS(oc);
5132 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5133
5134 dc->desc = "e5500 core";
5135 pcc->init_proc = init_proc_e5500;
5136 pcc->check_pow = check_pow_none;
5137 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
5138 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
5139 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5140 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5141 PPC_FLOAT | PPC_FLOAT_FRES |
5142 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
5143 PPC_FLOAT_STFIWX | PPC_WAIT |
5144 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
5145 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
5146 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 | \
5147 PPC2_FP_CVT_S64;
5148 pcc->msr_mask = (1ull << MSR_CM) |
5149 (1ull << MSR_GS) |
5150 (1ull << MSR_UCLE) |
5151 (1ull << MSR_CE) |
5152 (1ull << MSR_EE) |
5153 (1ull << MSR_PR) |
5154 (1ull << MSR_FP) |
5155 (1ull << MSR_ME) |
5156 (1ull << MSR_FE0) |
5157 (1ull << MSR_DE) |
5158 (1ull << MSR_FE1) |
5159 (1ull << MSR_IR) |
5160 (1ull << MSR_DR) |
5161 (1ull << MSR_PX) |
5162 (1ull << MSR_RI);
5163 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5164 pcc->excp_model = POWERPC_EXCP_BOOKE;
5165 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5166
5167 pcc->bfd_mach = bfd_mach_ppc_e500;
5168 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
5169 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5170}
5171
5172static void init_proc_e6500(CPUPPCState *env)
5173{
5174 init_proc_e500(env, fsl_e6500);
5175}
5176
5177POWERPC_FAMILY(e6500)(ObjectClass *oc, void *data)
5178{
5179 DeviceClass *dc = DEVICE_CLASS(oc);
5180 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5181
5182 dc->desc = "e6500 core";
5183 pcc->init_proc = init_proc_e6500;
5184 pcc->check_pow = check_pow_none;
5185 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
5186 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
5187 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
5188 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
5189 PPC_FLOAT | PPC_FLOAT_FRES |
5190 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
5191 PPC_FLOAT_STFIWX | PPC_WAIT |
5192 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
5193 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD | PPC_ALTIVEC;
5194 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 | \
5195 PPC2_FP_CVT_S64 | PPC2_ATOMIC_ISA206;
5196 pcc->msr_mask = (1ull << MSR_CM) |
5197 (1ull << MSR_GS) |
5198 (1ull << MSR_UCLE) |
5199 (1ull << MSR_CE) |
5200 (1ull << MSR_EE) |
5201 (1ull << MSR_PR) |
5202 (1ull << MSR_FP) |
5203 (1ull << MSR_ME) |
5204 (1ull << MSR_FE0) |
5205 (1ull << MSR_DE) |
5206 (1ull << MSR_FE1) |
5207 (1ull << MSR_IS) |
5208 (1ull << MSR_DS) |
5209 (1ull << MSR_PX) |
5210 (1ull << MSR_RI) |
5211 (1ull << MSR_VR);
5212 pcc->mmu_model = POWERPC_MMU_BOOKE206;
5213 pcc->excp_model = POWERPC_EXCP_BOOKE;
5214 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
5215 pcc->bfd_mach = bfd_mach_ppc_e500;
5216 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
5217 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_VRE;
5218}
5219
5220#endif
5221
5222
5223
5224#define POWERPC_MSRR_601 (0x0000000000001040ULL)
5225
5226static void init_proc_601(CPUPPCState *env)
5227{
5228 gen_spr_ne_601(env);
5229 gen_spr_sdr1(env);
5230 gen_spr_601(env);
5231
5232
5233 spr_register(env, SPR_HID0, "HID0",
5234 SPR_NOACCESS, SPR_NOACCESS,
5235 &spr_read_generic, &spr_write_hid0_601,
5236 0x80010080);
5237
5238 spr_register(env, SPR_HID1, "HID1",
5239 SPR_NOACCESS, SPR_NOACCESS,
5240 &spr_read_generic, &spr_write_generic,
5241 0x00000000);
5242
5243 spr_register(env, SPR_601_HID2, "HID2",
5244 SPR_NOACCESS, SPR_NOACCESS,
5245 &spr_read_generic, &spr_write_generic,
5246 0x00000000);
5247
5248 spr_register(env, SPR_601_HID5, "HID5",
5249 SPR_NOACCESS, SPR_NOACCESS,
5250 &spr_read_generic, &spr_write_generic,
5251 0x00000000);
5252
5253 init_excp_601(env);
5254
5255
5256
5257
5258 env->dcache_line_size = 32;
5259 env->icache_line_size = 64;
5260
5261 ppc6xx_irq_init(ppc_env_get_cpu(env));
5262}
5263
5264POWERPC_FAMILY(601)(ObjectClass *oc, void *data)
5265{
5266 DeviceClass *dc = DEVICE_CLASS(oc);
5267 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5268
5269 dc->desc = "PowerPC 601";
5270 pcc->init_proc = init_proc_601;
5271 pcc->check_pow = check_pow_none;
5272 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
5273 PPC_FLOAT |
5274 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5275 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
5276 PPC_SEGMENT | PPC_EXTERN;
5277 pcc->msr_mask = (1ull << MSR_EE) |
5278 (1ull << MSR_PR) |
5279 (1ull << MSR_FP) |
5280 (1ull << MSR_ME) |
5281 (1ull << MSR_FE0) |
5282 (1ull << MSR_SE) |
5283 (1ull << MSR_FE1) |
5284 (1ull << MSR_EP) |
5285 (1ull << MSR_IR) |
5286 (1ull << MSR_DR);
5287 pcc->mmu_model = POWERPC_MMU_601;
5288#if defined(CONFIG_SOFTMMU)
5289 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5290#endif
5291 pcc->excp_model = POWERPC_EXCP_601;
5292 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5293 pcc->bfd_mach = bfd_mach_ppc_601;
5294 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
5295}
5296
5297#define POWERPC_MSRR_601v (0x0000000000001040ULL)
5298
5299static void init_proc_601v(CPUPPCState *env)
5300{
5301 init_proc_601(env);
5302
5303 spr_register(env, SPR_601_HID15, "HID15",
5304 SPR_NOACCESS, SPR_NOACCESS,
5305 &spr_read_generic, &spr_write_generic,
5306 0x00000000);
5307}
5308
5309POWERPC_FAMILY(601v)(ObjectClass *oc, void *data)
5310{
5311 DeviceClass *dc = DEVICE_CLASS(oc);
5312 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5313
5314 dc->desc = "PowerPC 601v";
5315 pcc->init_proc = init_proc_601v;
5316 pcc->check_pow = check_pow_none;
5317 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
5318 PPC_FLOAT |
5319 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5320 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
5321 PPC_SEGMENT | PPC_EXTERN;
5322 pcc->msr_mask = (1ull << MSR_EE) |
5323 (1ull << MSR_PR) |
5324 (1ull << MSR_FP) |
5325 (1ull << MSR_ME) |
5326 (1ull << MSR_FE0) |
5327 (1ull << MSR_SE) |
5328 (1ull << MSR_FE1) |
5329 (1ull << MSR_EP) |
5330 (1ull << MSR_IR) |
5331 (1ull << MSR_DR);
5332 pcc->mmu_model = POWERPC_MMU_601;
5333#if defined(CONFIG_SOFTMMU)
5334 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5335#endif
5336 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5337 pcc->bfd_mach = bfd_mach_ppc_601;
5338 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
5339}
5340
5341static void init_proc_602(CPUPPCState *env)
5342{
5343 gen_spr_ne_601(env);
5344 gen_spr_sdr1(env);
5345 gen_spr_602(env);
5346
5347 gen_tbl(env);
5348
5349
5350 spr_register(env, SPR_HID0, "HID0",
5351 SPR_NOACCESS, SPR_NOACCESS,
5352 &spr_read_generic, &spr_write_generic,
5353 0x00000000);
5354
5355 spr_register(env, SPR_HID1, "HID1",
5356 SPR_NOACCESS, SPR_NOACCESS,
5357 &spr_read_generic, &spr_write_generic,
5358 0x00000000);
5359
5360 gen_low_BATs(env);
5361 gen_6xx_7xx_soft_tlb(env, 64, 2);
5362 init_excp_602(env);
5363 env->dcache_line_size = 32;
5364 env->icache_line_size = 32;
5365
5366 ppc6xx_irq_init(ppc_env_get_cpu(env));
5367}
5368
5369POWERPC_FAMILY(602)(ObjectClass *oc, void *data)
5370{
5371 DeviceClass *dc = DEVICE_CLASS(oc);
5372 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5373
5374 dc->desc = "PowerPC 602";
5375 pcc->init_proc = init_proc_602;
5376 pcc->check_pow = check_pow_hid0;
5377 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5378 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5379 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5380 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5381 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5382 PPC_MEM_TLBIE | PPC_6xx_TLB | PPC_MEM_TLBSYNC |
5383 PPC_SEGMENT | PPC_602_SPEC;
5384 pcc->msr_mask = (1ull << MSR_VSX) |
5385 (1ull << MSR_SA) |
5386 (1ull << MSR_POW) |
5387 (1ull << MSR_TGPR) |
5388 (1ull << MSR_ILE) |
5389 (1ull << MSR_EE) |
5390 (1ull << MSR_PR) |
5391 (1ull << MSR_FP) |
5392 (1ull << MSR_ME) |
5393 (1ull << MSR_FE0) |
5394 (1ull << MSR_SE) |
5395 (1ull << MSR_DE) |
5396 (1ull << MSR_FE1) |
5397 (1ull << MSR_EP) |
5398 (1ull << MSR_IR) |
5399 (1ull << MSR_DR) |
5400 (1ull << MSR_RI) |
5401 (1ull << MSR_LE);
5402
5403 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5404 pcc->excp_model = POWERPC_EXCP_602;
5405 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5406 pcc->bfd_mach = bfd_mach_ppc_602;
5407 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5408 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5409}
5410
5411static void init_proc_603(CPUPPCState *env)
5412{
5413 gen_spr_ne_601(env);
5414 gen_spr_sdr1(env);
5415 gen_spr_603(env);
5416
5417 gen_tbl(env);
5418
5419
5420 spr_register(env, SPR_HID0, "HID0",
5421 SPR_NOACCESS, SPR_NOACCESS,
5422 &spr_read_generic, &spr_write_generic,
5423 0x00000000);
5424
5425 spr_register(env, SPR_HID1, "HID1",
5426 SPR_NOACCESS, SPR_NOACCESS,
5427 &spr_read_generic, &spr_write_generic,
5428 0x00000000);
5429
5430 gen_low_BATs(env);
5431 gen_6xx_7xx_soft_tlb(env, 64, 2);
5432 init_excp_603(env);
5433 env->dcache_line_size = 32;
5434 env->icache_line_size = 32;
5435
5436 ppc6xx_irq_init(ppc_env_get_cpu(env));
5437}
5438
5439POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
5440{
5441 DeviceClass *dc = DEVICE_CLASS(oc);
5442 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5443
5444 dc->desc = "PowerPC 603";
5445 pcc->init_proc = init_proc_603;
5446 pcc->check_pow = check_pow_hid0;
5447 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5448 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5449 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5450 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5451 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5452 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5453 PPC_SEGMENT | PPC_EXTERN;
5454 pcc->msr_mask = (1ull << MSR_POW) |
5455 (1ull << MSR_TGPR) |
5456 (1ull << MSR_ILE) |
5457 (1ull << MSR_EE) |
5458 (1ull << MSR_PR) |
5459 (1ull << MSR_FP) |
5460 (1ull << MSR_ME) |
5461 (1ull << MSR_FE0) |
5462 (1ull << MSR_SE) |
5463 (1ull << MSR_DE) |
5464 (1ull << MSR_FE1) |
5465 (1ull << MSR_EP) |
5466 (1ull << MSR_IR) |
5467 (1ull << MSR_DR) |
5468 (1ull << MSR_RI) |
5469 (1ull << MSR_LE);
5470 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5471 pcc->excp_model = POWERPC_EXCP_603;
5472 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5473 pcc->bfd_mach = bfd_mach_ppc_603;
5474 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5475 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5476}
5477
5478static void init_proc_603E(CPUPPCState *env)
5479{
5480 gen_spr_ne_601(env);
5481 gen_spr_sdr1(env);
5482 gen_spr_603(env);
5483
5484 gen_tbl(env);
5485
5486
5487 spr_register(env, SPR_HID0, "HID0",
5488 SPR_NOACCESS, SPR_NOACCESS,
5489 &spr_read_generic, &spr_write_generic,
5490 0x00000000);
5491
5492 spr_register(env, SPR_HID1, "HID1",
5493 SPR_NOACCESS, SPR_NOACCESS,
5494 &spr_read_generic, &spr_write_generic,
5495 0x00000000);
5496
5497 gen_low_BATs(env);
5498 gen_6xx_7xx_soft_tlb(env, 64, 2);
5499 init_excp_603(env);
5500 env->dcache_line_size = 32;
5501 env->icache_line_size = 32;
5502
5503 ppc6xx_irq_init(ppc_env_get_cpu(env));
5504}
5505
5506POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
5507{
5508 DeviceClass *dc = DEVICE_CLASS(oc);
5509 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5510
5511 dc->desc = "PowerPC 603e";
5512 pcc->init_proc = init_proc_603E;
5513 pcc->check_pow = check_pow_hid0;
5514 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5515 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5516 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5517 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5518 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5519 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5520 PPC_SEGMENT | PPC_EXTERN;
5521 pcc->msr_mask = (1ull << MSR_POW) |
5522 (1ull << MSR_TGPR) |
5523 (1ull << MSR_ILE) |
5524 (1ull << MSR_EE) |
5525 (1ull << MSR_PR) |
5526 (1ull << MSR_FP) |
5527 (1ull << MSR_ME) |
5528 (1ull << MSR_FE0) |
5529 (1ull << MSR_SE) |
5530 (1ull << MSR_DE) |
5531 (1ull << MSR_FE1) |
5532 (1ull << MSR_EP) |
5533 (1ull << MSR_IR) |
5534 (1ull << MSR_DR) |
5535 (1ull << MSR_RI) |
5536 (1ull << MSR_LE);
5537 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5538 pcc->excp_model = POWERPC_EXCP_603E;
5539 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5540 pcc->bfd_mach = bfd_mach_ppc_ec603e;
5541 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5542 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5543}
5544
5545static void init_proc_604(CPUPPCState *env)
5546{
5547 gen_spr_ne_601(env);
5548 gen_spr_sdr1(env);
5549 gen_spr_604(env);
5550
5551 gen_tbl(env);
5552
5553
5554 spr_register(env, SPR_HID0, "HID0",
5555 SPR_NOACCESS, SPR_NOACCESS,
5556 &spr_read_generic, &spr_write_generic,
5557 0x00000000);
5558
5559 gen_low_BATs(env);
5560 init_excp_604(env);
5561 env->dcache_line_size = 32;
5562 env->icache_line_size = 32;
5563
5564 ppc6xx_irq_init(ppc_env_get_cpu(env));
5565}
5566
5567POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
5568{
5569 DeviceClass *dc = DEVICE_CLASS(oc);
5570 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5571
5572 dc->desc = "PowerPC 604";
5573 pcc->init_proc = init_proc_604;
5574 pcc->check_pow = check_pow_nocheck;
5575 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5576 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5577 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5578 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5579 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5580 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5581 PPC_SEGMENT | PPC_EXTERN;
5582 pcc->msr_mask = (1ull << MSR_POW) |
5583 (1ull << MSR_ILE) |
5584 (1ull << MSR_EE) |
5585 (1ull << MSR_PR) |
5586 (1ull << MSR_FP) |
5587 (1ull << MSR_ME) |
5588 (1ull << MSR_FE0) |
5589 (1ull << MSR_SE) |
5590 (1ull << MSR_DE) |
5591 (1ull << MSR_FE1) |
5592 (1ull << MSR_EP) |
5593 (1ull << MSR_IR) |
5594 (1ull << MSR_DR) |
5595 (1ull << MSR_PMM) |
5596 (1ull << MSR_RI) |
5597 (1ull << MSR_LE);
5598 pcc->mmu_model = POWERPC_MMU_32B;
5599#if defined(CONFIG_SOFTMMU)
5600 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5601#endif
5602 pcc->excp_model = POWERPC_EXCP_604;
5603 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5604 pcc->bfd_mach = bfd_mach_ppc_604;
5605 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5606 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5607}
5608
5609static void init_proc_604E(CPUPPCState *env)
5610{
5611 gen_spr_ne_601(env);
5612 gen_spr_sdr1(env);
5613 gen_spr_604(env);
5614
5615 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
5616 SPR_NOACCESS, SPR_NOACCESS,
5617 &spr_read_generic, &spr_write_generic,
5618 0x00000000);
5619
5620 spr_register(env, SPR_7XX_PMC3, "PMC3",
5621 SPR_NOACCESS, SPR_NOACCESS,
5622 &spr_read_generic, &spr_write_generic,
5623 0x00000000);
5624
5625 spr_register(env, SPR_7XX_PMC4, "PMC4",
5626 SPR_NOACCESS, SPR_NOACCESS,
5627 &spr_read_generic, &spr_write_generic,
5628 0x00000000);
5629
5630 gen_tbl(env);
5631
5632
5633 spr_register(env, SPR_HID0, "HID0",
5634 SPR_NOACCESS, SPR_NOACCESS,
5635 &spr_read_generic, &spr_write_generic,
5636 0x00000000);
5637
5638 spr_register(env, SPR_HID1, "HID1",
5639 SPR_NOACCESS, SPR_NOACCESS,
5640 &spr_read_generic, &spr_write_generic,
5641 0x00000000);
5642
5643 gen_low_BATs(env);
5644 init_excp_604(env);
5645 env->dcache_line_size = 32;
5646 env->icache_line_size = 32;
5647
5648 ppc6xx_irq_init(ppc_env_get_cpu(env));
5649}
5650
5651POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
5652{
5653 DeviceClass *dc = DEVICE_CLASS(oc);
5654 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5655
5656 dc->desc = "PowerPC 604E";
5657 pcc->init_proc = init_proc_604E;
5658 pcc->check_pow = check_pow_nocheck;
5659 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5660 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5661 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5662 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5663 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5664 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5665 PPC_SEGMENT | PPC_EXTERN;
5666 pcc->msr_mask = (1ull << MSR_POW) |
5667 (1ull << MSR_ILE) |
5668 (1ull << MSR_EE) |
5669 (1ull << MSR_PR) |
5670 (1ull << MSR_FP) |
5671 (1ull << MSR_ME) |
5672 (1ull << MSR_FE0) |
5673 (1ull << MSR_SE) |
5674 (1ull << MSR_DE) |
5675 (1ull << MSR_FE1) |
5676 (1ull << MSR_EP) |
5677 (1ull << MSR_IR) |
5678 (1ull << MSR_DR) |
5679 (1ull << MSR_PMM) |
5680 (1ull << MSR_RI) |
5681 (1ull << MSR_LE);
5682 pcc->mmu_model = POWERPC_MMU_32B;
5683#if defined(CONFIG_SOFTMMU)
5684 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5685#endif
5686 pcc->excp_model = POWERPC_EXCP_604;
5687 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5688 pcc->bfd_mach = bfd_mach_ppc_604;
5689 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5690 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5691}
5692
5693static void init_proc_740(CPUPPCState *env)
5694{
5695 gen_spr_ne_601(env);
5696 gen_spr_sdr1(env);
5697 gen_spr_7xx(env);
5698
5699 gen_tbl(env);
5700
5701 gen_spr_thrm(env);
5702
5703
5704 spr_register(env, SPR_HID0, "HID0",
5705 SPR_NOACCESS, SPR_NOACCESS,
5706 &spr_read_generic, &spr_write_generic,
5707 0x00000000);
5708
5709 spr_register(env, SPR_HID1, "HID1",
5710 SPR_NOACCESS, SPR_NOACCESS,
5711 &spr_read_generic, &spr_write_generic,
5712 0x00000000);
5713
5714 gen_low_BATs(env);
5715 init_excp_7x0(env);
5716 env->dcache_line_size = 32;
5717 env->icache_line_size = 32;
5718
5719 ppc6xx_irq_init(ppc_env_get_cpu(env));
5720}
5721
5722POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
5723{
5724 DeviceClass *dc = DEVICE_CLASS(oc);
5725 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5726
5727 dc->desc = "PowerPC 740";
5728 pcc->init_proc = init_proc_740;
5729 pcc->check_pow = check_pow_hid0;
5730 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5731 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5732 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5733 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5734 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5735 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5736 PPC_SEGMENT | PPC_EXTERN;
5737 pcc->msr_mask = (1ull << MSR_POW) |
5738 (1ull << MSR_ILE) |
5739 (1ull << MSR_EE) |
5740 (1ull << MSR_PR) |
5741 (1ull << MSR_FP) |
5742 (1ull << MSR_ME) |
5743 (1ull << MSR_FE0) |
5744 (1ull << MSR_SE) |
5745 (1ull << MSR_DE) |
5746 (1ull << MSR_FE1) |
5747 (1ull << MSR_EP) |
5748 (1ull << MSR_IR) |
5749 (1ull << MSR_DR) |
5750 (1ull << MSR_PMM) |
5751 (1ull << MSR_RI) |
5752 (1ull << MSR_LE);
5753 pcc->mmu_model = POWERPC_MMU_32B;
5754#if defined(CONFIG_SOFTMMU)
5755 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5756#endif
5757 pcc->excp_model = POWERPC_EXCP_7x0;
5758 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5759 pcc->bfd_mach = bfd_mach_ppc_750;
5760 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5761 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5762}
5763
5764static void init_proc_750(CPUPPCState *env)
5765{
5766 gen_spr_ne_601(env);
5767 gen_spr_sdr1(env);
5768 gen_spr_7xx(env);
5769
5770 spr_register(env, SPR_L2CR, "L2CR",
5771 SPR_NOACCESS, SPR_NOACCESS,
5772 &spr_read_generic, spr_access_nop,
5773 0x00000000);
5774
5775 gen_tbl(env);
5776
5777 gen_spr_thrm(env);
5778
5779
5780 spr_register(env, SPR_HID0, "HID0",
5781 SPR_NOACCESS, SPR_NOACCESS,
5782 &spr_read_generic, &spr_write_generic,
5783 0x00000000);
5784
5785 spr_register(env, SPR_HID1, "HID1",
5786 SPR_NOACCESS, SPR_NOACCESS,
5787 &spr_read_generic, &spr_write_generic,
5788 0x00000000);
5789
5790 gen_low_BATs(env);
5791
5792
5793
5794 init_excp_7x0(env);
5795 env->dcache_line_size = 32;
5796 env->icache_line_size = 32;
5797
5798 ppc6xx_irq_init(ppc_env_get_cpu(env));
5799}
5800
5801POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
5802{
5803 DeviceClass *dc = DEVICE_CLASS(oc);
5804 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5805
5806 dc->desc = "PowerPC 750";
5807 pcc->init_proc = init_proc_750;
5808 pcc->check_pow = check_pow_hid0;
5809 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5810 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5811 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5812 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5813 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5814 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5815 PPC_SEGMENT | PPC_EXTERN;
5816 pcc->msr_mask = (1ull << MSR_POW) |
5817 (1ull << MSR_ILE) |
5818 (1ull << MSR_EE) |
5819 (1ull << MSR_PR) |
5820 (1ull << MSR_FP) |
5821 (1ull << MSR_ME) |
5822 (1ull << MSR_FE0) |
5823 (1ull << MSR_SE) |
5824 (1ull << MSR_DE) |
5825 (1ull << MSR_FE1) |
5826 (1ull << MSR_EP) |
5827 (1ull << MSR_IR) |
5828 (1ull << MSR_DR) |
5829 (1ull << MSR_PMM) |
5830 (1ull << MSR_RI) |
5831 (1ull << MSR_LE);
5832 pcc->mmu_model = POWERPC_MMU_32B;
5833#if defined(CONFIG_SOFTMMU)
5834 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5835#endif
5836 pcc->excp_model = POWERPC_EXCP_7x0;
5837 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5838 pcc->bfd_mach = bfd_mach_ppc_750;
5839 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5840 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5841}
5842
5843static void init_proc_750cl(CPUPPCState *env)
5844{
5845 gen_spr_ne_601(env);
5846 gen_spr_sdr1(env);
5847 gen_spr_7xx(env);
5848
5849 spr_register(env, SPR_L2CR, "L2CR",
5850 SPR_NOACCESS, SPR_NOACCESS,
5851 &spr_read_generic, spr_access_nop,
5852 0x00000000);
5853
5854 gen_tbl(env);
5855
5856
5857 spr_register(env, SPR_THRM1, "THRM1",
5858 SPR_NOACCESS, SPR_NOACCESS,
5859 &spr_read_generic, &spr_write_generic,
5860 0x00000000);
5861 spr_register(env, SPR_THRM2, "THRM2",
5862 SPR_NOACCESS, SPR_NOACCESS,
5863 &spr_read_generic, &spr_write_generic,
5864 0x00000000);
5865 spr_register(env, SPR_THRM3, "THRM3",
5866 SPR_NOACCESS, SPR_NOACCESS,
5867 &spr_read_generic, &spr_write_generic,
5868 0x00000000);
5869
5870 spr_register(env, SPR_750_TDCL, "TDCL",
5871 SPR_NOACCESS, SPR_NOACCESS,
5872 &spr_read_generic, &spr_write_generic,
5873 0x00000000);
5874 spr_register(env, SPR_750_TDCH, "TDCH",
5875 SPR_NOACCESS, SPR_NOACCESS,
5876 &spr_read_generic, &spr_write_generic,
5877 0x00000000);
5878
5879
5880 spr_register(env, SPR_750_WPAR, "WPAR",
5881 SPR_NOACCESS, SPR_NOACCESS,
5882 &spr_read_generic, &spr_write_generic,
5883 0x00000000);
5884 spr_register(env, SPR_750_DMAL, "DMAL",
5885 SPR_NOACCESS, SPR_NOACCESS,
5886 &spr_read_generic, &spr_write_generic,
5887 0x00000000);
5888 spr_register(env, SPR_750_DMAU, "DMAU",
5889 SPR_NOACCESS, SPR_NOACCESS,
5890 &spr_read_generic, &spr_write_generic,
5891 0x00000000);
5892
5893
5894 spr_register(env, SPR_HID0, "HID0",
5895 SPR_NOACCESS, SPR_NOACCESS,
5896 &spr_read_generic, &spr_write_generic,
5897 0x00000000);
5898
5899 spr_register(env, SPR_HID1, "HID1",
5900 SPR_NOACCESS, SPR_NOACCESS,
5901 &spr_read_generic, &spr_write_generic,
5902 0x00000000);
5903
5904 spr_register(env, SPR_750CL_HID2, "HID2",
5905 SPR_NOACCESS, SPR_NOACCESS,
5906 &spr_read_generic, &spr_write_generic,
5907 0x00000000);
5908
5909 spr_register(env, SPR_750CL_HID4, "HID4",
5910 SPR_NOACCESS, SPR_NOACCESS,
5911 &spr_read_generic, &spr_write_generic,
5912 0x00000000);
5913
5914
5915 spr_register(env, SPR_750_GQR0, "GQR0",
5916 SPR_NOACCESS, SPR_NOACCESS,
5917 &spr_read_generic, &spr_write_generic,
5918 0x00000000);
5919
5920 spr_register(env, SPR_750_GQR1, "GQR1",
5921 SPR_NOACCESS, SPR_NOACCESS,
5922 &spr_read_generic, &spr_write_generic,
5923 0x00000000);
5924
5925 spr_register(env, SPR_750_GQR2, "GQR2",
5926 SPR_NOACCESS, SPR_NOACCESS,
5927 &spr_read_generic, &spr_write_generic,
5928 0x00000000);
5929
5930 spr_register(env, SPR_750_GQR3, "GQR3",
5931 SPR_NOACCESS, SPR_NOACCESS,
5932 &spr_read_generic, &spr_write_generic,
5933 0x00000000);
5934
5935 spr_register(env, SPR_750_GQR4, "GQR4",
5936 SPR_NOACCESS, SPR_NOACCESS,
5937 &spr_read_generic, &spr_write_generic,
5938 0x00000000);
5939
5940 spr_register(env, SPR_750_GQR5, "GQR5",
5941 SPR_NOACCESS, SPR_NOACCESS,
5942 &spr_read_generic, &spr_write_generic,
5943 0x00000000);
5944
5945 spr_register(env, SPR_750_GQR6, "GQR6",
5946 SPR_NOACCESS, SPR_NOACCESS,
5947 &spr_read_generic, &spr_write_generic,
5948 0x00000000);
5949
5950 spr_register(env, SPR_750_GQR7, "GQR7",
5951 SPR_NOACCESS, SPR_NOACCESS,
5952 &spr_read_generic, &spr_write_generic,
5953 0x00000000);
5954
5955 gen_low_BATs(env);
5956
5957 gen_high_BATs(env);
5958 init_excp_750cl(env);
5959 env->dcache_line_size = 32;
5960 env->icache_line_size = 32;
5961
5962 ppc6xx_irq_init(ppc_env_get_cpu(env));
5963}
5964
5965POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
5966{
5967 DeviceClass *dc = DEVICE_CLASS(oc);
5968 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5969
5970 dc->desc = "PowerPC 750 CL";
5971 pcc->init_proc = init_proc_750cl;
5972 pcc->check_pow = check_pow_hid0;
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6012 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6013 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6014 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6015 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6016 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6017 PPC_SEGMENT | PPC_EXTERN;
6018 pcc->msr_mask = (1ull << MSR_POW) |
6019 (1ull << MSR_ILE) |
6020 (1ull << MSR_EE) |
6021 (1ull << MSR_PR) |
6022 (1ull << MSR_FP) |
6023 (1ull << MSR_ME) |
6024 (1ull << MSR_FE0) |
6025 (1ull << MSR_SE) |
6026 (1ull << MSR_DE) |
6027 (1ull << MSR_FE1) |
6028 (1ull << MSR_EP) |
6029 (1ull << MSR_IR) |
6030 (1ull << MSR_DR) |
6031 (1ull << MSR_PMM) |
6032 (1ull << MSR_RI) |
6033 (1ull << MSR_LE);
6034 pcc->mmu_model = POWERPC_MMU_32B;
6035#if defined(CONFIG_SOFTMMU)
6036 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6037#endif
6038 pcc->excp_model = POWERPC_EXCP_7x0;
6039 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6040 pcc->bfd_mach = bfd_mach_ppc_750;
6041 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6042 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6043}
6044
6045static void init_proc_750cx(CPUPPCState *env)
6046{
6047 gen_spr_ne_601(env);
6048 gen_spr_sdr1(env);
6049 gen_spr_7xx(env);
6050
6051 spr_register(env, SPR_L2CR, "L2CR",
6052 SPR_NOACCESS, SPR_NOACCESS,
6053 &spr_read_generic, spr_access_nop,
6054 0x00000000);
6055
6056 gen_tbl(env);
6057
6058 gen_spr_thrm(env);
6059
6060 spr_register(env, SPR_SDA, "SDA",
6061 SPR_NOACCESS, SPR_NOACCESS,
6062 &spr_read_generic, &spr_write_generic,
6063 0x00000000);
6064
6065
6066 spr_register(env, SPR_HID0, "HID0",
6067 SPR_NOACCESS, SPR_NOACCESS,
6068 &spr_read_generic, &spr_write_generic,
6069 0x00000000);
6070
6071 spr_register(env, SPR_HID1, "HID1",
6072 SPR_NOACCESS, SPR_NOACCESS,
6073 &spr_read_generic, &spr_write_generic,
6074 0x00000000);
6075
6076 gen_low_BATs(env);
6077
6078 gen_high_BATs(env);
6079 init_excp_750cx(env);
6080 env->dcache_line_size = 32;
6081 env->icache_line_size = 32;
6082
6083 ppc6xx_irq_init(ppc_env_get_cpu(env));
6084}
6085
6086POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
6087{
6088 DeviceClass *dc = DEVICE_CLASS(oc);
6089 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6090
6091 dc->desc = "PowerPC 750CX";
6092 pcc->init_proc = init_proc_750cx;
6093 pcc->check_pow = check_pow_hid0;
6094 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6095 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6096 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6097 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6098 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6099 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6100 PPC_SEGMENT | PPC_EXTERN;
6101 pcc->msr_mask = (1ull << MSR_POW) |
6102 (1ull << MSR_ILE) |
6103 (1ull << MSR_EE) |
6104 (1ull << MSR_PR) |
6105 (1ull << MSR_FP) |
6106 (1ull << MSR_ME) |
6107 (1ull << MSR_FE0) |
6108 (1ull << MSR_SE) |
6109 (1ull << MSR_DE) |
6110 (1ull << MSR_FE1) |
6111 (1ull << MSR_EP) |
6112 (1ull << MSR_IR) |
6113 (1ull << MSR_DR) |
6114 (1ull << MSR_PMM) |
6115 (1ull << MSR_RI) |
6116 (1ull << MSR_LE);
6117 pcc->mmu_model = POWERPC_MMU_32B;
6118#if defined(CONFIG_SOFTMMU)
6119 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6120#endif
6121 pcc->excp_model = POWERPC_EXCP_7x0;
6122 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6123 pcc->bfd_mach = bfd_mach_ppc_750;
6124 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6125 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6126}
6127
6128static void init_proc_750fx(CPUPPCState *env)
6129{
6130 gen_spr_ne_601(env);
6131 gen_spr_sdr1(env);
6132 gen_spr_7xx(env);
6133
6134 spr_register(env, SPR_L2CR, "L2CR",
6135 SPR_NOACCESS, SPR_NOACCESS,
6136 &spr_read_generic, spr_access_nop,
6137 0x00000000);
6138
6139 gen_tbl(env);
6140
6141 gen_spr_thrm(env);
6142
6143 spr_register(env, SPR_750_THRM4, "THRM4",
6144 SPR_NOACCESS, SPR_NOACCESS,
6145 &spr_read_generic, &spr_write_generic,
6146 0x00000000);
6147
6148
6149 spr_register(env, SPR_HID0, "HID0",
6150 SPR_NOACCESS, SPR_NOACCESS,
6151 &spr_read_generic, &spr_write_generic,
6152 0x00000000);
6153
6154 spr_register(env, SPR_HID1, "HID1",
6155 SPR_NOACCESS, SPR_NOACCESS,
6156 &spr_read_generic, &spr_write_generic,
6157 0x00000000);
6158
6159 spr_register(env, SPR_750FX_HID2, "HID2",
6160 SPR_NOACCESS, SPR_NOACCESS,
6161 &spr_read_generic, &spr_write_generic,
6162 0x00000000);
6163
6164 gen_low_BATs(env);
6165
6166 gen_high_BATs(env);
6167 init_excp_7x0(env);
6168 env->dcache_line_size = 32;
6169 env->icache_line_size = 32;
6170
6171 ppc6xx_irq_init(ppc_env_get_cpu(env));
6172}
6173
6174POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
6175{
6176 DeviceClass *dc = DEVICE_CLASS(oc);
6177 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6178
6179 dc->desc = "PowerPC 750FX";
6180 pcc->init_proc = init_proc_750fx;
6181 pcc->check_pow = check_pow_hid0;
6182 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6183 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6184 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6185 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6186 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6187 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6188 PPC_SEGMENT | PPC_EXTERN;
6189 pcc->msr_mask = (1ull << MSR_POW) |
6190 (1ull << MSR_ILE) |
6191 (1ull << MSR_EE) |
6192 (1ull << MSR_PR) |
6193 (1ull << MSR_FP) |
6194 (1ull << MSR_ME) |
6195 (1ull << MSR_FE0) |
6196 (1ull << MSR_SE) |
6197 (1ull << MSR_DE) |
6198 (1ull << MSR_FE1) |
6199 (1ull << MSR_EP) |
6200 (1ull << MSR_IR) |
6201 (1ull << MSR_DR) |
6202 (1ull << MSR_PMM) |
6203 (1ull << MSR_RI) |
6204 (1ull << MSR_LE);
6205 pcc->mmu_model = POWERPC_MMU_32B;
6206#if defined(CONFIG_SOFTMMU)
6207 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6208#endif
6209 pcc->excp_model = POWERPC_EXCP_7x0;
6210 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6211 pcc->bfd_mach = bfd_mach_ppc_750;
6212 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6213 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6214}
6215
6216static void init_proc_750gx(CPUPPCState *env)
6217{
6218 gen_spr_ne_601(env);
6219 gen_spr_sdr1(env);
6220 gen_spr_7xx(env);
6221
6222 spr_register(env, SPR_L2CR, "L2CR",
6223 SPR_NOACCESS, SPR_NOACCESS,
6224 &spr_read_generic, spr_access_nop,
6225 0x00000000);
6226
6227 gen_tbl(env);
6228
6229 gen_spr_thrm(env);
6230
6231 spr_register(env, SPR_750_THRM4, "THRM4",
6232 SPR_NOACCESS, SPR_NOACCESS,
6233 &spr_read_generic, &spr_write_generic,
6234 0x00000000);
6235
6236
6237 spr_register(env, SPR_HID0, "HID0",
6238 SPR_NOACCESS, SPR_NOACCESS,
6239 &spr_read_generic, &spr_write_generic,
6240 0x00000000);
6241
6242 spr_register(env, SPR_HID1, "HID1",
6243 SPR_NOACCESS, SPR_NOACCESS,
6244 &spr_read_generic, &spr_write_generic,
6245 0x00000000);
6246
6247 spr_register(env, SPR_750FX_HID2, "HID2",
6248 SPR_NOACCESS, SPR_NOACCESS,
6249 &spr_read_generic, &spr_write_generic,
6250 0x00000000);
6251
6252 gen_low_BATs(env);
6253
6254 gen_high_BATs(env);
6255 init_excp_7x0(env);
6256 env->dcache_line_size = 32;
6257 env->icache_line_size = 32;
6258
6259 ppc6xx_irq_init(ppc_env_get_cpu(env));
6260}
6261
6262POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
6263{
6264 DeviceClass *dc = DEVICE_CLASS(oc);
6265 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6266
6267 dc->desc = "PowerPC 750GX";
6268 pcc->init_proc = init_proc_750gx;
6269 pcc->check_pow = check_pow_hid0;
6270 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6271 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6272 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6273 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6274 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6275 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6276 PPC_SEGMENT | PPC_EXTERN;
6277 pcc->msr_mask = (1ull << MSR_POW) |
6278 (1ull << MSR_ILE) |
6279 (1ull << MSR_EE) |
6280 (1ull << MSR_PR) |
6281 (1ull << MSR_FP) |
6282 (1ull << MSR_ME) |
6283 (1ull << MSR_FE0) |
6284 (1ull << MSR_SE) |
6285 (1ull << MSR_DE) |
6286 (1ull << MSR_FE1) |
6287 (1ull << MSR_EP) |
6288 (1ull << MSR_IR) |
6289 (1ull << MSR_DR) |
6290 (1ull << MSR_PMM) |
6291 (1ull << MSR_RI) |
6292 (1ull << MSR_LE);
6293 pcc->mmu_model = POWERPC_MMU_32B;
6294#if defined(CONFIG_SOFTMMU)
6295 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6296#endif
6297 pcc->excp_model = POWERPC_EXCP_7x0;
6298 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6299 pcc->bfd_mach = bfd_mach_ppc_750;
6300 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6301 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6302}
6303
6304static void init_proc_745(CPUPPCState *env)
6305{
6306 gen_spr_ne_601(env);
6307 gen_spr_sdr1(env);
6308 gen_spr_7xx(env);
6309 gen_spr_G2_755(env);
6310
6311 gen_tbl(env);
6312
6313 gen_spr_thrm(env);
6314
6315
6316 spr_register(env, SPR_HID0, "HID0",
6317 SPR_NOACCESS, SPR_NOACCESS,
6318 &spr_read_generic, &spr_write_generic,
6319 0x00000000);
6320
6321 spr_register(env, SPR_HID1, "HID1",
6322 SPR_NOACCESS, SPR_NOACCESS,
6323 &spr_read_generic, &spr_write_generic,
6324 0x00000000);
6325
6326 spr_register(env, SPR_HID2, "HID2",
6327 SPR_NOACCESS, SPR_NOACCESS,
6328 &spr_read_generic, &spr_write_generic,
6329 0x00000000);
6330
6331 gen_low_BATs(env);
6332 gen_high_BATs(env);
6333 gen_6xx_7xx_soft_tlb(env, 64, 2);
6334 init_excp_7x5(env);
6335 env->dcache_line_size = 32;
6336 env->icache_line_size = 32;
6337
6338 ppc6xx_irq_init(ppc_env_get_cpu(env));
6339}
6340
6341POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
6342{
6343 DeviceClass *dc = DEVICE_CLASS(oc);
6344 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6345
6346 dc->desc = "PowerPC 745";
6347 pcc->init_proc = init_proc_745;
6348 pcc->check_pow = check_pow_hid0;
6349 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6350 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6351 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6352 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6353 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6354 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
6355 PPC_SEGMENT | PPC_EXTERN;
6356 pcc->msr_mask = (1ull << MSR_POW) |
6357 (1ull << MSR_ILE) |
6358 (1ull << MSR_EE) |
6359 (1ull << MSR_PR) |
6360 (1ull << MSR_FP) |
6361 (1ull << MSR_ME) |
6362 (1ull << MSR_FE0) |
6363 (1ull << MSR_SE) |
6364 (1ull << MSR_DE) |
6365 (1ull << MSR_FE1) |
6366 (1ull << MSR_EP) |
6367 (1ull << MSR_IR) |
6368 (1ull << MSR_DR) |
6369 (1ull << MSR_PMM) |
6370 (1ull << MSR_RI) |
6371 (1ull << MSR_LE);
6372 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
6373 pcc->excp_model = POWERPC_EXCP_7x5;
6374 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6375 pcc->bfd_mach = bfd_mach_ppc_750;
6376 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6377 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6378}
6379
6380static void init_proc_755(CPUPPCState *env)
6381{
6382 gen_spr_ne_601(env);
6383 gen_spr_sdr1(env);
6384 gen_spr_7xx(env);
6385 gen_spr_G2_755(env);
6386
6387 gen_tbl(env);
6388
6389
6390 spr_register(env, SPR_L2CR, "L2CR",
6391 SPR_NOACCESS, SPR_NOACCESS,
6392 &spr_read_generic, spr_access_nop,
6393 0x00000000);
6394
6395 spr_register(env, SPR_L2PMCR, "L2PMCR",
6396 SPR_NOACCESS, SPR_NOACCESS,
6397 &spr_read_generic, &spr_write_generic,
6398 0x00000000);
6399
6400 gen_spr_thrm(env);
6401
6402
6403 spr_register(env, SPR_HID0, "HID0",
6404 SPR_NOACCESS, SPR_NOACCESS,
6405 &spr_read_generic, &spr_write_generic,
6406 0x00000000);
6407
6408 spr_register(env, SPR_HID1, "HID1",
6409 SPR_NOACCESS, SPR_NOACCESS,
6410 &spr_read_generic, &spr_write_generic,
6411 0x00000000);
6412
6413 spr_register(env, SPR_HID2, "HID2",
6414 SPR_NOACCESS, SPR_NOACCESS,
6415 &spr_read_generic, &spr_write_generic,
6416 0x00000000);
6417
6418 gen_low_BATs(env);
6419 gen_high_BATs(env);
6420 gen_6xx_7xx_soft_tlb(env, 64, 2);
6421 init_excp_7x5(env);
6422 env->dcache_line_size = 32;
6423 env->icache_line_size = 32;
6424
6425 ppc6xx_irq_init(ppc_env_get_cpu(env));
6426}
6427
6428POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
6429{
6430 DeviceClass *dc = DEVICE_CLASS(oc);
6431 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6432
6433 dc->desc = "PowerPC 755";
6434 pcc->init_proc = init_proc_755;
6435 pcc->check_pow = check_pow_hid0;
6436 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6437 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6438 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
6439 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6440 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6441 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
6442 PPC_SEGMENT | PPC_EXTERN;
6443 pcc->msr_mask = (1ull << MSR_POW) |
6444 (1ull << MSR_ILE) |
6445 (1ull << MSR_EE) |
6446 (1ull << MSR_PR) |
6447 (1ull << MSR_FP) |
6448 (1ull << MSR_ME) |
6449 (1ull << MSR_FE0) |
6450 (1ull << MSR_SE) |
6451 (1ull << MSR_DE) |
6452 (1ull << MSR_FE1) |
6453 (1ull << MSR_EP) |
6454 (1ull << MSR_IR) |
6455 (1ull << MSR_DR) |
6456 (1ull << MSR_PMM) |
6457 (1ull << MSR_RI) |
6458 (1ull << MSR_LE);
6459 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
6460 pcc->excp_model = POWERPC_EXCP_7x5;
6461 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6462 pcc->bfd_mach = bfd_mach_ppc_750;
6463 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
6464 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
6465}
6466
6467static void init_proc_7400(CPUPPCState *env)
6468{
6469 gen_spr_ne_601(env);
6470 gen_spr_sdr1(env);
6471 gen_spr_7xx(env);
6472
6473 gen_tbl(env);
6474
6475 gen_spr_74xx(env);
6476
6477 spr_register(env, SPR_UBAMR, "UBAMR",
6478 &spr_read_ureg, SPR_NOACCESS,
6479 &spr_read_ureg, SPR_NOACCESS,
6480 0x00000000);
6481
6482
6483 spr_register(env, SPR_MSSCR1, "MSSCR1",
6484 SPR_NOACCESS, SPR_NOACCESS,
6485 &spr_read_generic, &spr_write_generic,
6486 0x00000000);
6487
6488 gen_spr_thrm(env);
6489
6490 gen_low_BATs(env);
6491 init_excp_7400(env);
6492 env->dcache_line_size = 32;
6493 env->icache_line_size = 32;
6494
6495 ppc6xx_irq_init(ppc_env_get_cpu(env));
6496}
6497
6498POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
6499{
6500 DeviceClass *dc = DEVICE_CLASS(oc);
6501 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6502
6503 dc->desc = "PowerPC 7400 (aka G4)";
6504 pcc->init_proc = init_proc_7400;
6505 pcc->check_pow = check_pow_hid0;
6506 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6507 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6508 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6509 PPC_FLOAT_STFIWX |
6510 PPC_CACHE | PPC_CACHE_ICBI |
6511 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6512 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6513 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6514 PPC_MEM_TLBIA |
6515 PPC_SEGMENT | PPC_EXTERN |
6516 PPC_ALTIVEC;
6517 pcc->msr_mask = (1ull << MSR_VR) |
6518 (1ull << MSR_POW) |
6519 (1ull << MSR_ILE) |
6520 (1ull << MSR_EE) |
6521 (1ull << MSR_PR) |
6522 (1ull << MSR_FP) |
6523 (1ull << MSR_ME) |
6524 (1ull << MSR_FE0) |
6525 (1ull << MSR_SE) |
6526 (1ull << MSR_DE) |
6527 (1ull << MSR_FE1) |
6528 (1ull << MSR_EP) |
6529 (1ull << MSR_IR) |
6530 (1ull << MSR_DR) |
6531 (1ull << MSR_PMM) |
6532 (1ull << MSR_RI) |
6533 (1ull << MSR_LE);
6534 pcc->mmu_model = POWERPC_MMU_32B;
6535#if defined(CONFIG_SOFTMMU)
6536 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6537#endif
6538 pcc->excp_model = POWERPC_EXCP_74xx;
6539 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6540 pcc->bfd_mach = bfd_mach_ppc_7400;
6541 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6542 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6543 POWERPC_FLAG_BUS_CLK;
6544}
6545
6546static void init_proc_7410(CPUPPCState *env)
6547{
6548 gen_spr_ne_601(env);
6549 gen_spr_sdr1(env);
6550 gen_spr_7xx(env);
6551
6552 gen_tbl(env);
6553
6554 gen_spr_74xx(env);
6555
6556 spr_register(env, SPR_UBAMR, "UBAMR",
6557 &spr_read_ureg, SPR_NOACCESS,
6558 &spr_read_ureg, SPR_NOACCESS,
6559 0x00000000);
6560
6561 gen_spr_thrm(env);
6562
6563
6564 spr_register(env, SPR_L2PMCR, "L2PMCR",
6565 SPR_NOACCESS, SPR_NOACCESS,
6566 &spr_read_generic, &spr_write_generic,
6567 0x00000000);
6568
6569
6570 spr_register(env, SPR_LDSTDB, "LDSTDB",
6571 SPR_NOACCESS, SPR_NOACCESS,
6572 &spr_read_generic, &spr_write_generic,
6573 0x00000000);
6574
6575 gen_low_BATs(env);
6576 init_excp_7400(env);
6577 env->dcache_line_size = 32;
6578 env->icache_line_size = 32;
6579
6580 ppc6xx_irq_init(ppc_env_get_cpu(env));
6581}
6582
6583POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
6584{
6585 DeviceClass *dc = DEVICE_CLASS(oc);
6586 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6587
6588 dc->desc = "PowerPC 7410 (aka G4)";
6589 pcc->init_proc = init_proc_7410;
6590 pcc->check_pow = check_pow_hid0;
6591 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6592 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6593 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6594 PPC_FLOAT_STFIWX |
6595 PPC_CACHE | PPC_CACHE_ICBI |
6596 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6597 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6598 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6599 PPC_MEM_TLBIA |
6600 PPC_SEGMENT | PPC_EXTERN |
6601 PPC_ALTIVEC;
6602 pcc->msr_mask = (1ull << MSR_VR) |
6603 (1ull << MSR_POW) |
6604 (1ull << MSR_ILE) |
6605 (1ull << MSR_EE) |
6606 (1ull << MSR_PR) |
6607 (1ull << MSR_FP) |
6608 (1ull << MSR_ME) |
6609 (1ull << MSR_FE0) |
6610 (1ull << MSR_SE) |
6611 (1ull << MSR_DE) |
6612 (1ull << MSR_FE1) |
6613 (1ull << MSR_EP) |
6614 (1ull << MSR_IR) |
6615 (1ull << MSR_DR) |
6616 (1ull << MSR_PMM) |
6617 (1ull << MSR_RI) |
6618 (1ull << MSR_LE);
6619 pcc->mmu_model = POWERPC_MMU_32B;
6620#if defined(CONFIG_SOFTMMU)
6621 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6622#endif
6623 pcc->excp_model = POWERPC_EXCP_74xx;
6624 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6625 pcc->bfd_mach = bfd_mach_ppc_7400;
6626 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6627 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6628 POWERPC_FLAG_BUS_CLK;
6629}
6630
6631static void init_proc_7440(CPUPPCState *env)
6632{
6633 gen_spr_ne_601(env);
6634 gen_spr_sdr1(env);
6635 gen_spr_7xx(env);
6636
6637 gen_tbl(env);
6638
6639 gen_spr_74xx(env);
6640
6641 spr_register(env, SPR_UBAMR, "UBAMR",
6642 &spr_read_ureg, SPR_NOACCESS,
6643 &spr_read_ureg, SPR_NOACCESS,
6644 0x00000000);
6645
6646
6647 spr_register(env, SPR_LDSTCR, "LDSTCR",
6648 SPR_NOACCESS, SPR_NOACCESS,
6649 &spr_read_generic, &spr_write_generic,
6650 0x00000000);
6651
6652
6653 spr_register(env, SPR_ICTRL, "ICTRL",
6654 SPR_NOACCESS, SPR_NOACCESS,
6655 &spr_read_generic, &spr_write_generic,
6656 0x00000000);
6657
6658
6659 spr_register(env, SPR_MSSSR0, "MSSSR0",
6660 SPR_NOACCESS, SPR_NOACCESS,
6661 &spr_read_generic, &spr_write_generic,
6662 0x00000000);
6663
6664
6665 spr_register(env, SPR_7XX_PMC5, "PMC5",
6666 SPR_NOACCESS, SPR_NOACCESS,
6667 &spr_read_generic, &spr_write_generic,
6668 0x00000000);
6669
6670 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6671 &spr_read_ureg, SPR_NOACCESS,
6672 &spr_read_ureg, SPR_NOACCESS,
6673 0x00000000);
6674
6675 spr_register(env, SPR_7XX_PMC6, "PMC6",
6676 SPR_NOACCESS, SPR_NOACCESS,
6677 &spr_read_generic, &spr_write_generic,
6678 0x00000000);
6679
6680 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6681 &spr_read_ureg, SPR_NOACCESS,
6682 &spr_read_ureg, SPR_NOACCESS,
6683 0x00000000);
6684
6685 gen_low_BATs(env);
6686 gen_74xx_soft_tlb(env, 128, 2);
6687 init_excp_7450(env);
6688 env->dcache_line_size = 32;
6689 env->icache_line_size = 32;
6690
6691 ppc6xx_irq_init(ppc_env_get_cpu(env));
6692}
6693
6694POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
6695{
6696 DeviceClass *dc = DEVICE_CLASS(oc);
6697 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6698
6699 dc->desc = "PowerPC 7440 (aka G4)";
6700 pcc->init_proc = init_proc_7440;
6701 pcc->check_pow = check_pow_hid0_74xx;
6702 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6703 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6704 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6705 PPC_FLOAT_STFIWX |
6706 PPC_CACHE | PPC_CACHE_ICBI |
6707 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6708 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6709 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6710 PPC_MEM_TLBIA | PPC_74xx_TLB |
6711 PPC_SEGMENT | PPC_EXTERN |
6712 PPC_ALTIVEC;
6713 pcc->msr_mask = (1ull << MSR_VR) |
6714 (1ull << MSR_POW) |
6715 (1ull << MSR_ILE) |
6716 (1ull << MSR_EE) |
6717 (1ull << MSR_PR) |
6718 (1ull << MSR_FP) |
6719 (1ull << MSR_ME) |
6720 (1ull << MSR_FE0) |
6721 (1ull << MSR_SE) |
6722 (1ull << MSR_DE) |
6723 (1ull << MSR_FE1) |
6724 (1ull << MSR_EP) |
6725 (1ull << MSR_IR) |
6726 (1ull << MSR_DR) |
6727 (1ull << MSR_PMM) |
6728 (1ull << MSR_RI) |
6729 (1ull << MSR_LE);
6730 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6731 pcc->excp_model = POWERPC_EXCP_74xx;
6732 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6733 pcc->bfd_mach = bfd_mach_ppc_7400;
6734 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6735 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6736 POWERPC_FLAG_BUS_CLK;
6737}
6738
6739static void init_proc_7450(CPUPPCState *env)
6740{
6741 gen_spr_ne_601(env);
6742 gen_spr_sdr1(env);
6743 gen_spr_7xx(env);
6744
6745 gen_tbl(env);
6746
6747 gen_spr_74xx(env);
6748
6749 gen_l3_ctrl(env);
6750
6751
6752 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6753 SPR_NOACCESS, SPR_NOACCESS,
6754 &spr_read_generic, &spr_write_generic,
6755 0x00000000);
6756
6757
6758 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6759 SPR_NOACCESS, SPR_NOACCESS,
6760 &spr_read_generic, &spr_write_generic,
6761 0x00000000);
6762
6763
6764 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6765 SPR_NOACCESS, SPR_NOACCESS,
6766 &spr_read_generic, &spr_write_generic,
6767 0x00000000);
6768
6769
6770 spr_register(env, SPR_L3OHCR, "L3OHCR",
6771 SPR_NOACCESS, SPR_NOACCESS,
6772 &spr_read_generic, &spr_write_generic,
6773 0x00000000);
6774
6775 spr_register(env, SPR_UBAMR, "UBAMR",
6776 &spr_read_ureg, SPR_NOACCESS,
6777 &spr_read_ureg, SPR_NOACCESS,
6778 0x00000000);
6779
6780
6781 spr_register(env, SPR_LDSTCR, "LDSTCR",
6782 SPR_NOACCESS, SPR_NOACCESS,
6783 &spr_read_generic, &spr_write_generic,
6784 0x00000000);
6785
6786
6787 spr_register(env, SPR_ICTRL, "ICTRL",
6788 SPR_NOACCESS, SPR_NOACCESS,
6789 &spr_read_generic, &spr_write_generic,
6790 0x00000000);
6791
6792
6793 spr_register(env, SPR_MSSSR0, "MSSSR0",
6794 SPR_NOACCESS, SPR_NOACCESS,
6795 &spr_read_generic, &spr_write_generic,
6796 0x00000000);
6797
6798
6799 spr_register(env, SPR_7XX_PMC5, "PMC5",
6800 SPR_NOACCESS, SPR_NOACCESS,
6801 &spr_read_generic, &spr_write_generic,
6802 0x00000000);
6803
6804 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6805 &spr_read_ureg, SPR_NOACCESS,
6806 &spr_read_ureg, SPR_NOACCESS,
6807 0x00000000);
6808
6809 spr_register(env, SPR_7XX_PMC6, "PMC6",
6810 SPR_NOACCESS, SPR_NOACCESS,
6811 &spr_read_generic, &spr_write_generic,
6812 0x00000000);
6813
6814 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6815 &spr_read_ureg, SPR_NOACCESS,
6816 &spr_read_ureg, SPR_NOACCESS,
6817 0x00000000);
6818
6819 gen_low_BATs(env);
6820 gen_74xx_soft_tlb(env, 128, 2);
6821 init_excp_7450(env);
6822 env->dcache_line_size = 32;
6823 env->icache_line_size = 32;
6824
6825 ppc6xx_irq_init(ppc_env_get_cpu(env));
6826}
6827
6828POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
6829{
6830 DeviceClass *dc = DEVICE_CLASS(oc);
6831 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6832
6833 dc->desc = "PowerPC 7450 (aka G4)";
6834 pcc->init_proc = init_proc_7450;
6835 pcc->check_pow = check_pow_hid0_74xx;
6836 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6837 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6838 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6839 PPC_FLOAT_STFIWX |
6840 PPC_CACHE | PPC_CACHE_ICBI |
6841 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6842 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6843 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6844 PPC_MEM_TLBIA | PPC_74xx_TLB |
6845 PPC_SEGMENT | PPC_EXTERN |
6846 PPC_ALTIVEC;
6847 pcc->msr_mask = (1ull << MSR_VR) |
6848 (1ull << MSR_POW) |
6849 (1ull << MSR_ILE) |
6850 (1ull << MSR_EE) |
6851 (1ull << MSR_PR) |
6852 (1ull << MSR_FP) |
6853 (1ull << MSR_ME) |
6854 (1ull << MSR_FE0) |
6855 (1ull << MSR_SE) |
6856 (1ull << MSR_DE) |
6857 (1ull << MSR_FE1) |
6858 (1ull << MSR_EP) |
6859 (1ull << MSR_IR) |
6860 (1ull << MSR_DR) |
6861 (1ull << MSR_PMM) |
6862 (1ull << MSR_RI) |
6863 (1ull << MSR_LE);
6864 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6865 pcc->excp_model = POWERPC_EXCP_74xx;
6866 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6867 pcc->bfd_mach = bfd_mach_ppc_7400;
6868 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6869 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6870 POWERPC_FLAG_BUS_CLK;
6871}
6872
6873static void init_proc_7445(CPUPPCState *env)
6874{
6875 gen_spr_ne_601(env);
6876 gen_spr_sdr1(env);
6877 gen_spr_7xx(env);
6878
6879 gen_tbl(env);
6880
6881 gen_spr_74xx(env);
6882
6883
6884 spr_register(env, SPR_LDSTCR, "LDSTCR",
6885 SPR_NOACCESS, SPR_NOACCESS,
6886 &spr_read_generic, &spr_write_generic,
6887 0x00000000);
6888
6889
6890 spr_register(env, SPR_ICTRL, "ICTRL",
6891 SPR_NOACCESS, SPR_NOACCESS,
6892 &spr_read_generic, &spr_write_generic,
6893 0x00000000);
6894
6895
6896 spr_register(env, SPR_MSSSR0, "MSSSR0",
6897 SPR_NOACCESS, SPR_NOACCESS,
6898 &spr_read_generic, &spr_write_generic,
6899 0x00000000);
6900
6901
6902 spr_register(env, SPR_7XX_PMC5, "PMC5",
6903 SPR_NOACCESS, SPR_NOACCESS,
6904 &spr_read_generic, &spr_write_generic,
6905 0x00000000);
6906
6907 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6908 &spr_read_ureg, SPR_NOACCESS,
6909 &spr_read_ureg, SPR_NOACCESS,
6910 0x00000000);
6911
6912 spr_register(env, SPR_7XX_PMC6, "PMC6",
6913 SPR_NOACCESS, SPR_NOACCESS,
6914 &spr_read_generic, &spr_write_generic,
6915 0x00000000);
6916
6917 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6918 &spr_read_ureg, SPR_NOACCESS,
6919 &spr_read_ureg, SPR_NOACCESS,
6920 0x00000000);
6921
6922 spr_register(env, SPR_SPRG4, "SPRG4",
6923 SPR_NOACCESS, SPR_NOACCESS,
6924 &spr_read_generic, &spr_write_generic,
6925 0x00000000);
6926 spr_register(env, SPR_USPRG4, "USPRG4",
6927 &spr_read_ureg, SPR_NOACCESS,
6928 &spr_read_ureg, SPR_NOACCESS,
6929 0x00000000);
6930 spr_register(env, SPR_SPRG5, "SPRG5",
6931 SPR_NOACCESS, SPR_NOACCESS,
6932 &spr_read_generic, &spr_write_generic,
6933 0x00000000);
6934 spr_register(env, SPR_USPRG5, "USPRG5",
6935 &spr_read_ureg, SPR_NOACCESS,
6936 &spr_read_ureg, SPR_NOACCESS,
6937 0x00000000);
6938 spr_register(env, SPR_SPRG6, "SPRG6",
6939 SPR_NOACCESS, SPR_NOACCESS,
6940 &spr_read_generic, &spr_write_generic,
6941 0x00000000);
6942 spr_register(env, SPR_USPRG6, "USPRG6",
6943 &spr_read_ureg, SPR_NOACCESS,
6944 &spr_read_ureg, SPR_NOACCESS,
6945 0x00000000);
6946 spr_register(env, SPR_SPRG7, "SPRG7",
6947 SPR_NOACCESS, SPR_NOACCESS,
6948 &spr_read_generic, &spr_write_generic,
6949 0x00000000);
6950 spr_register(env, SPR_USPRG7, "USPRG7",
6951 &spr_read_ureg, SPR_NOACCESS,
6952 &spr_read_ureg, SPR_NOACCESS,
6953 0x00000000);
6954
6955 gen_low_BATs(env);
6956 gen_high_BATs(env);
6957 gen_74xx_soft_tlb(env, 128, 2);
6958 init_excp_7450(env);
6959 env->dcache_line_size = 32;
6960 env->icache_line_size = 32;
6961
6962 ppc6xx_irq_init(ppc_env_get_cpu(env));
6963}
6964
6965POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
6966{
6967 DeviceClass *dc = DEVICE_CLASS(oc);
6968 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6969
6970 dc->desc = "PowerPC 7445 (aka G4)";
6971 pcc->init_proc = init_proc_7445;
6972 pcc->check_pow = check_pow_hid0_74xx;
6973 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6974 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6975 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6976 PPC_FLOAT_STFIWX |
6977 PPC_CACHE | PPC_CACHE_ICBI |
6978 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6979 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6980 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6981 PPC_MEM_TLBIA | PPC_74xx_TLB |
6982 PPC_SEGMENT | PPC_EXTERN |
6983 PPC_ALTIVEC;
6984 pcc->msr_mask = (1ull << MSR_VR) |
6985 (1ull << MSR_POW) |
6986 (1ull << MSR_ILE) |
6987 (1ull << MSR_EE) |
6988 (1ull << MSR_PR) |
6989 (1ull << MSR_FP) |
6990 (1ull << MSR_ME) |
6991 (1ull << MSR_FE0) |
6992 (1ull << MSR_SE) |
6993 (1ull << MSR_DE) |
6994 (1ull << MSR_FE1) |
6995 (1ull << MSR_EP) |
6996 (1ull << MSR_IR) |
6997 (1ull << MSR_DR) |
6998 (1ull << MSR_PMM) |
6999 (1ull << MSR_RI) |
7000 (1ull << MSR_LE);
7001 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
7002 pcc->excp_model = POWERPC_EXCP_74xx;
7003 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7004 pcc->bfd_mach = bfd_mach_ppc_7400;
7005 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7006 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7007 POWERPC_FLAG_BUS_CLK;
7008}
7009
7010static void init_proc_7455(CPUPPCState *env)
7011{
7012 gen_spr_ne_601(env);
7013 gen_spr_sdr1(env);
7014 gen_spr_7xx(env);
7015
7016 gen_tbl(env);
7017
7018 gen_spr_74xx(env);
7019
7020 gen_l3_ctrl(env);
7021
7022
7023 spr_register(env, SPR_LDSTCR, "LDSTCR",
7024 SPR_NOACCESS, SPR_NOACCESS,
7025 &spr_read_generic, &spr_write_generic,
7026 0x00000000);
7027
7028
7029 spr_register(env, SPR_ICTRL, "ICTRL",
7030 SPR_NOACCESS, SPR_NOACCESS,
7031 &spr_read_generic, &spr_write_generic,
7032 0x00000000);
7033
7034
7035 spr_register(env, SPR_MSSSR0, "MSSSR0",
7036 SPR_NOACCESS, SPR_NOACCESS,
7037 &spr_read_generic, &spr_write_generic,
7038 0x00000000);
7039
7040
7041 spr_register(env, SPR_7XX_PMC5, "PMC5",
7042 SPR_NOACCESS, SPR_NOACCESS,
7043 &spr_read_generic, &spr_write_generic,
7044 0x00000000);
7045
7046 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
7047 &spr_read_ureg, SPR_NOACCESS,
7048 &spr_read_ureg, SPR_NOACCESS,
7049 0x00000000);
7050
7051 spr_register(env, SPR_7XX_PMC6, "PMC6",
7052 SPR_NOACCESS, SPR_NOACCESS,
7053 &spr_read_generic, &spr_write_generic,
7054 0x00000000);
7055
7056 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
7057 &spr_read_ureg, SPR_NOACCESS,
7058 &spr_read_ureg, SPR_NOACCESS,
7059 0x00000000);
7060
7061 spr_register(env, SPR_SPRG4, "SPRG4",
7062 SPR_NOACCESS, SPR_NOACCESS,
7063 &spr_read_generic, &spr_write_generic,
7064 0x00000000);
7065 spr_register(env, SPR_USPRG4, "USPRG4",
7066 &spr_read_ureg, SPR_NOACCESS,
7067 &spr_read_ureg, SPR_NOACCESS,
7068 0x00000000);
7069 spr_register(env, SPR_SPRG5, "SPRG5",
7070 SPR_NOACCESS, SPR_NOACCESS,
7071 &spr_read_generic, &spr_write_generic,
7072 0x00000000);
7073 spr_register(env, SPR_USPRG5, "USPRG5",
7074 &spr_read_ureg, SPR_NOACCESS,
7075 &spr_read_ureg, SPR_NOACCESS,
7076 0x00000000);
7077 spr_register(env, SPR_SPRG6, "SPRG6",
7078 SPR_NOACCESS, SPR_NOACCESS,
7079 &spr_read_generic, &spr_write_generic,
7080 0x00000000);
7081 spr_register(env, SPR_USPRG6, "USPRG6",
7082 &spr_read_ureg, SPR_NOACCESS,
7083 &spr_read_ureg, SPR_NOACCESS,
7084 0x00000000);
7085 spr_register(env, SPR_SPRG7, "SPRG7",
7086 SPR_NOACCESS, SPR_NOACCESS,
7087 &spr_read_generic, &spr_write_generic,
7088 0x00000000);
7089 spr_register(env, SPR_USPRG7, "USPRG7",
7090 &spr_read_ureg, SPR_NOACCESS,
7091 &spr_read_ureg, SPR_NOACCESS,
7092 0x00000000);
7093
7094 gen_low_BATs(env);
7095 gen_high_BATs(env);
7096 gen_74xx_soft_tlb(env, 128, 2);
7097 init_excp_7450(env);
7098 env->dcache_line_size = 32;
7099 env->icache_line_size = 32;
7100
7101 ppc6xx_irq_init(ppc_env_get_cpu(env));
7102}
7103
7104POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
7105{
7106 DeviceClass *dc = DEVICE_CLASS(oc);
7107 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7108
7109 dc->desc = "PowerPC 7455 (aka G4)";
7110 pcc->init_proc = init_proc_7455;
7111 pcc->check_pow = check_pow_hid0_74xx;
7112 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7113 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7114 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7115 PPC_FLOAT_STFIWX |
7116 PPC_CACHE | PPC_CACHE_ICBI |
7117 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
7118 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7119 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7120 PPC_MEM_TLBIA | PPC_74xx_TLB |
7121 PPC_SEGMENT | PPC_EXTERN |
7122 PPC_ALTIVEC;
7123 pcc->msr_mask = (1ull << MSR_VR) |
7124 (1ull << MSR_POW) |
7125 (1ull << MSR_ILE) |
7126 (1ull << MSR_EE) |
7127 (1ull << MSR_PR) |
7128 (1ull << MSR_FP) |
7129 (1ull << MSR_ME) |
7130 (1ull << MSR_FE0) |
7131 (1ull << MSR_SE) |
7132 (1ull << MSR_DE) |
7133 (1ull << MSR_FE1) |
7134 (1ull << MSR_EP) |
7135 (1ull << MSR_IR) |
7136 (1ull << MSR_DR) |
7137 (1ull << MSR_PMM) |
7138 (1ull << MSR_RI) |
7139 (1ull << MSR_LE);
7140 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
7141 pcc->excp_model = POWERPC_EXCP_74xx;
7142 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7143 pcc->bfd_mach = bfd_mach_ppc_7400;
7144 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7145 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7146 POWERPC_FLAG_BUS_CLK;
7147}
7148
7149static void init_proc_7457(CPUPPCState *env)
7150{
7151 gen_spr_ne_601(env);
7152 gen_spr_sdr1(env);
7153 gen_spr_7xx(env);
7154
7155 gen_tbl(env);
7156
7157 gen_spr_74xx(env);
7158
7159 gen_l3_ctrl(env);
7160
7161
7162 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
7163 SPR_NOACCESS, SPR_NOACCESS,
7164 &spr_read_generic, &spr_write_generic,
7165 0x00000000);
7166
7167
7168 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
7169 SPR_NOACCESS, SPR_NOACCESS,
7170 &spr_read_generic, &spr_write_generic,
7171 0x00000000);
7172
7173
7174 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
7175 SPR_NOACCESS, SPR_NOACCESS,
7176 &spr_read_generic, &spr_write_generic,
7177 0x00000000);
7178
7179
7180 spr_register(env, SPR_L3OHCR, "L3OHCR",
7181 SPR_NOACCESS, SPR_NOACCESS,
7182 &spr_read_generic, &spr_write_generic,
7183 0x00000000);
7184
7185
7186 spr_register(env, SPR_LDSTCR, "LDSTCR",
7187 SPR_NOACCESS, SPR_NOACCESS,
7188 &spr_read_generic, &spr_write_generic,
7189 0x00000000);
7190
7191
7192 spr_register(env, SPR_ICTRL, "ICTRL",
7193 SPR_NOACCESS, SPR_NOACCESS,
7194 &spr_read_generic, &spr_write_generic,
7195 0x00000000);
7196
7197
7198 spr_register(env, SPR_MSSSR0, "MSSSR0",
7199 SPR_NOACCESS, SPR_NOACCESS,
7200 &spr_read_generic, &spr_write_generic,
7201 0x00000000);
7202
7203
7204 spr_register(env, SPR_7XX_PMC5, "PMC5",
7205 SPR_NOACCESS, SPR_NOACCESS,
7206 &spr_read_generic, &spr_write_generic,
7207 0x00000000);
7208
7209 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
7210 &spr_read_ureg, SPR_NOACCESS,
7211 &spr_read_ureg, SPR_NOACCESS,
7212 0x00000000);
7213
7214 spr_register(env, SPR_7XX_PMC6, "PMC6",
7215 SPR_NOACCESS, SPR_NOACCESS,
7216 &spr_read_generic, &spr_write_generic,
7217 0x00000000);
7218
7219 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
7220 &spr_read_ureg, SPR_NOACCESS,
7221 &spr_read_ureg, SPR_NOACCESS,
7222 0x00000000);
7223
7224 spr_register(env, SPR_SPRG4, "SPRG4",
7225 SPR_NOACCESS, SPR_NOACCESS,
7226 &spr_read_generic, &spr_write_generic,
7227 0x00000000);
7228 spr_register(env, SPR_USPRG4, "USPRG4",
7229 &spr_read_ureg, SPR_NOACCESS,
7230 &spr_read_ureg, SPR_NOACCESS,
7231 0x00000000);
7232 spr_register(env, SPR_SPRG5, "SPRG5",
7233 SPR_NOACCESS, SPR_NOACCESS,
7234 &spr_read_generic, &spr_write_generic,
7235 0x00000000);
7236 spr_register(env, SPR_USPRG5, "USPRG5",
7237 &spr_read_ureg, SPR_NOACCESS,
7238 &spr_read_ureg, SPR_NOACCESS,
7239 0x00000000);
7240 spr_register(env, SPR_SPRG6, "SPRG6",
7241 SPR_NOACCESS, SPR_NOACCESS,
7242 &spr_read_generic, &spr_write_generic,
7243 0x00000000);
7244 spr_register(env, SPR_USPRG6, "USPRG6",
7245 &spr_read_ureg, SPR_NOACCESS,
7246 &spr_read_ureg, SPR_NOACCESS,
7247 0x00000000);
7248 spr_register(env, SPR_SPRG7, "SPRG7",
7249 SPR_NOACCESS, SPR_NOACCESS,
7250 &spr_read_generic, &spr_write_generic,
7251 0x00000000);
7252 spr_register(env, SPR_USPRG7, "USPRG7",
7253 &spr_read_ureg, SPR_NOACCESS,
7254 &spr_read_ureg, SPR_NOACCESS,
7255 0x00000000);
7256
7257 gen_low_BATs(env);
7258 gen_high_BATs(env);
7259 gen_74xx_soft_tlb(env, 128, 2);
7260 init_excp_7450(env);
7261 env->dcache_line_size = 32;
7262 env->icache_line_size = 32;
7263
7264 ppc6xx_irq_init(ppc_env_get_cpu(env));
7265}
7266
7267POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
7268{
7269 DeviceClass *dc = DEVICE_CLASS(oc);
7270 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7271
7272 dc->desc = "PowerPC 7457 (aka G4)";
7273 pcc->init_proc = init_proc_7457;
7274 pcc->check_pow = check_pow_hid0_74xx;
7275 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7276 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7277 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7278 PPC_FLOAT_STFIWX |
7279 PPC_CACHE | PPC_CACHE_ICBI |
7280 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
7281 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7282 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7283 PPC_MEM_TLBIA | PPC_74xx_TLB |
7284 PPC_SEGMENT | PPC_EXTERN |
7285 PPC_ALTIVEC;
7286 pcc->msr_mask = (1ull << MSR_VR) |
7287 (1ull << MSR_POW) |
7288 (1ull << MSR_ILE) |
7289 (1ull << MSR_EE) |
7290 (1ull << MSR_PR) |
7291 (1ull << MSR_FP) |
7292 (1ull << MSR_ME) |
7293 (1ull << MSR_FE0) |
7294 (1ull << MSR_SE) |
7295 (1ull << MSR_DE) |
7296 (1ull << MSR_FE1) |
7297 (1ull << MSR_EP) |
7298 (1ull << MSR_IR) |
7299 (1ull << MSR_DR) |
7300 (1ull << MSR_PMM) |
7301 (1ull << MSR_RI) |
7302 (1ull << MSR_LE);
7303 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
7304 pcc->excp_model = POWERPC_EXCP_74xx;
7305 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7306 pcc->bfd_mach = bfd_mach_ppc_7400;
7307 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7308 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7309 POWERPC_FLAG_BUS_CLK;
7310}
7311
7312static void init_proc_e600(CPUPPCState *env)
7313{
7314 gen_spr_ne_601(env);
7315 gen_spr_sdr1(env);
7316 gen_spr_7xx(env);
7317
7318 gen_tbl(env);
7319
7320 gen_spr_74xx(env);
7321
7322 spr_register(env, SPR_UBAMR, "UBAMR",
7323 &spr_read_ureg, SPR_NOACCESS,
7324 &spr_read_ureg, SPR_NOACCESS,
7325 0x00000000);
7326
7327 spr_register(env, SPR_LDSTCR, "LDSTCR",
7328 SPR_NOACCESS, SPR_NOACCESS,
7329 &spr_read_generic, &spr_write_generic,
7330 0x00000000);
7331
7332 spr_register(env, SPR_ICTRL, "ICTRL",
7333 SPR_NOACCESS, SPR_NOACCESS,
7334 &spr_read_generic, &spr_write_generic,
7335 0x00000000);
7336
7337 spr_register(env, SPR_MSSSR0, "MSSSR0",
7338 SPR_NOACCESS, SPR_NOACCESS,
7339 &spr_read_generic, &spr_write_generic,
7340 0x00000000);
7341
7342 spr_register(env, SPR_7XX_PMC5, "PMC5",
7343 SPR_NOACCESS, SPR_NOACCESS,
7344 &spr_read_generic, &spr_write_generic,
7345 0x00000000);
7346
7347 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
7348 &spr_read_ureg, SPR_NOACCESS,
7349 &spr_read_ureg, SPR_NOACCESS,
7350 0x00000000);
7351
7352 spr_register(env, SPR_7XX_PMC6, "PMC6",
7353 SPR_NOACCESS, SPR_NOACCESS,
7354 &spr_read_generic, &spr_write_generic,
7355 0x00000000);
7356
7357 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
7358 &spr_read_ureg, SPR_NOACCESS,
7359 &spr_read_ureg, SPR_NOACCESS,
7360 0x00000000);
7361
7362 spr_register(env, SPR_SPRG4, "SPRG4",
7363 SPR_NOACCESS, SPR_NOACCESS,
7364 &spr_read_generic, &spr_write_generic,
7365 0x00000000);
7366 spr_register(env, SPR_USPRG4, "USPRG4",
7367 &spr_read_ureg, SPR_NOACCESS,
7368 &spr_read_ureg, SPR_NOACCESS,
7369 0x00000000);
7370 spr_register(env, SPR_SPRG5, "SPRG5",
7371 SPR_NOACCESS, SPR_NOACCESS,
7372 &spr_read_generic, &spr_write_generic,
7373 0x00000000);
7374 spr_register(env, SPR_USPRG5, "USPRG5",
7375 &spr_read_ureg, SPR_NOACCESS,
7376 &spr_read_ureg, SPR_NOACCESS,
7377 0x00000000);
7378 spr_register(env, SPR_SPRG6, "SPRG6",
7379 SPR_NOACCESS, SPR_NOACCESS,
7380 &spr_read_generic, &spr_write_generic,
7381 0x00000000);
7382 spr_register(env, SPR_USPRG6, "USPRG6",
7383 &spr_read_ureg, SPR_NOACCESS,
7384 &spr_read_ureg, SPR_NOACCESS,
7385 0x00000000);
7386 spr_register(env, SPR_SPRG7, "SPRG7",
7387 SPR_NOACCESS, SPR_NOACCESS,
7388 &spr_read_generic, &spr_write_generic,
7389 0x00000000);
7390 spr_register(env, SPR_USPRG7, "USPRG7",
7391 &spr_read_ureg, SPR_NOACCESS,
7392 &spr_read_ureg, SPR_NOACCESS,
7393 0x00000000);
7394
7395 gen_low_BATs(env);
7396 gen_high_BATs(env);
7397 gen_74xx_soft_tlb(env, 128, 2);
7398 init_excp_7450(env);
7399 env->dcache_line_size = 32;
7400 env->icache_line_size = 32;
7401
7402 ppc6xx_irq_init(ppc_env_get_cpu(env));
7403}
7404
7405POWERPC_FAMILY(e600)(ObjectClass *oc, void *data)
7406{
7407 DeviceClass *dc = DEVICE_CLASS(oc);
7408 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7409
7410 dc->desc = "PowerPC e600";
7411 pcc->init_proc = init_proc_e600;
7412 pcc->check_pow = check_pow_hid0_74xx;
7413 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7414 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7415 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7416 PPC_FLOAT_STFIWX |
7417 PPC_CACHE | PPC_CACHE_ICBI |
7418 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
7419 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7420 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7421 PPC_MEM_TLBIA | PPC_74xx_TLB |
7422 PPC_SEGMENT | PPC_EXTERN |
7423 PPC_ALTIVEC;
7424 pcc->insns_flags2 = PPC_NONE;
7425 pcc->msr_mask = (1ull << MSR_VR) |
7426 (1ull << MSR_POW) |
7427 (1ull << MSR_ILE) |
7428 (1ull << MSR_EE) |
7429 (1ull << MSR_PR) |
7430 (1ull << MSR_FP) |
7431 (1ull << MSR_ME) |
7432 (1ull << MSR_FE0) |
7433 (1ull << MSR_SE) |
7434 (1ull << MSR_DE) |
7435 (1ull << MSR_FE1) |
7436 (1ull << MSR_EP) |
7437 (1ull << MSR_IR) |
7438 (1ull << MSR_DR) |
7439 (1ull << MSR_PMM) |
7440 (1ull << MSR_RI) |
7441 (1ull << MSR_LE);
7442 pcc->mmu_model = POWERPC_MMU_32B;
7443#if defined(CONFIG_SOFTMMU)
7444 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
7445#endif
7446 pcc->excp_model = POWERPC_EXCP_74xx;
7447 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7448 pcc->bfd_mach = bfd_mach_ppc_7400;
7449 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7450 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7451 POWERPC_FLAG_BUS_CLK;
7452}
7453
7454#if defined(TARGET_PPC64)
7455#if defined(CONFIG_USER_ONLY)
7456#define POWERPC970_HID5_INIT 0x00000080
7457#else
7458#define POWERPC970_HID5_INIT 0x00000000
7459#endif
7460
7461static void gen_fscr_facility_check(DisasContext *ctx, int facility_sprn,
7462 int bit, int sprn, int cause)
7463{
7464 TCGv_i32 t1 = tcg_const_i32(bit);
7465 TCGv_i32 t2 = tcg_const_i32(sprn);
7466 TCGv_i32 t3 = tcg_const_i32(cause);
7467
7468 gen_helper_fscr_facility_check(cpu_env, t1, t2, t3);
7469
7470 tcg_temp_free_i32(t3);
7471 tcg_temp_free_i32(t2);
7472 tcg_temp_free_i32(t1);
7473}
7474
7475static void gen_msr_facility_check(DisasContext *ctx, int facility_sprn,
7476 int bit, int sprn, int cause)
7477{
7478 TCGv_i32 t1 = tcg_const_i32(bit);
7479 TCGv_i32 t2 = tcg_const_i32(sprn);
7480 TCGv_i32 t3 = tcg_const_i32(cause);
7481
7482 gen_helper_msr_facility_check(cpu_env, t1, t2, t3);
7483
7484 tcg_temp_free_i32(t3);
7485 tcg_temp_free_i32(t2);
7486 tcg_temp_free_i32(t1);
7487}
7488
7489static void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn)
7490{
7491 TCGv spr_up = tcg_temp_new();
7492 TCGv spr = tcg_temp_new();
7493
7494 gen_load_spr(spr, sprn - 1);
7495 tcg_gen_shri_tl(spr_up, spr, 32);
7496 tcg_gen_ext32u_tl(cpu_gpr[gprn], spr_up);
7497
7498 tcg_temp_free(spr);
7499 tcg_temp_free(spr_up);
7500}
7501
7502static void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn)
7503{
7504 TCGv spr = tcg_temp_new();
7505
7506 gen_load_spr(spr, sprn - 1);
7507 tcg_gen_deposit_tl(spr, spr, cpu_gpr[gprn], 32, 32);
7508 gen_store_spr(sprn - 1, spr);
7509
7510 tcg_temp_free(spr);
7511}
7512
7513static int check_pow_970(CPUPPCState *env)
7514{
7515 if (env->spr[SPR_HID0] & (HID0_DEEPNAP | HID0_DOZE | HID0_NAP)) {
7516 return 1;
7517 }
7518
7519 return 0;
7520}
7521
7522static void gen_spr_970_hid(CPUPPCState *env)
7523{
7524
7525
7526 spr_register(env, SPR_HID0, "HID0",
7527 SPR_NOACCESS, SPR_NOACCESS,
7528 &spr_read_generic, &spr_write_clear,
7529 0x60000000);
7530 spr_register(env, SPR_HID1, "HID1",
7531 SPR_NOACCESS, SPR_NOACCESS,
7532 &spr_read_generic, &spr_write_generic,
7533 0x00000000);
7534 spr_register(env, SPR_970_HID5, "HID5",
7535 SPR_NOACCESS, SPR_NOACCESS,
7536 &spr_read_generic, &spr_write_generic,
7537 POWERPC970_HID5_INIT);
7538}
7539
7540static void gen_spr_970_hior(CPUPPCState *env)
7541{
7542 spr_register(env, SPR_HIOR, "SPR_HIOR",
7543 SPR_NOACCESS, SPR_NOACCESS,
7544 &spr_read_hior, &spr_write_hior,
7545 0x00000000);
7546}
7547
7548static void gen_spr_book3s_ctrl(CPUPPCState *env)
7549{
7550 spr_register(env, SPR_CTRL, "SPR_CTRL",
7551 SPR_NOACCESS, SPR_NOACCESS,
7552 SPR_NOACCESS, &spr_write_generic,
7553 0x00000000);
7554 spr_register(env, SPR_UCTRL, "SPR_UCTRL",
7555 &spr_read_ureg, SPR_NOACCESS,
7556 &spr_read_ureg, SPR_NOACCESS,
7557 0x00000000);
7558}
7559
7560static void gen_spr_book3s_altivec(CPUPPCState *env)
7561{
7562 if (!(env->insns_flags & PPC_ALTIVEC)) {
7563 return;
7564 }
7565
7566 spr_register_kvm(env, SPR_VRSAVE, "VRSAVE",
7567 &spr_read_generic, &spr_write_generic,
7568 &spr_read_generic, &spr_write_generic,
7569 KVM_REG_PPC_VRSAVE, 0x00000000);
7570
7571
7572
7573 vscr_init(env, 0x00010000);
7574}
7575
7576static void gen_spr_book3s_dbg(CPUPPCState *env)
7577{
7578
7579
7580
7581
7582
7583
7584
7585 spr_register_kvm(env, SPR_DABR, "DABR",
7586 SPR_NOACCESS, SPR_NOACCESS,
7587 &spr_read_generic, &spr_write_generic,
7588 KVM_REG_PPC_DABR, 0x00000000);
7589 spr_register_kvm(env, SPR_DABRX, "DABRX",
7590 SPR_NOACCESS, SPR_NOACCESS,
7591 &spr_read_generic, &spr_write_generic,
7592 KVM_REG_PPC_DABRX, 0x00000000);
7593}
7594
7595static void gen_spr_book3s_207_dbg(CPUPPCState *env)
7596{
7597 spr_register_kvm_hv(env, SPR_DAWR, "DAWR",
7598 SPR_NOACCESS, SPR_NOACCESS,
7599 SPR_NOACCESS, SPR_NOACCESS,
7600 &spr_read_generic, &spr_write_generic,
7601 KVM_REG_PPC_DAWR, 0x00000000);
7602 spr_register_kvm_hv(env, SPR_DAWRX, "DAWRX",
7603 SPR_NOACCESS, SPR_NOACCESS,
7604 SPR_NOACCESS, SPR_NOACCESS,
7605 &spr_read_generic, &spr_write_generic,
7606 KVM_REG_PPC_DAWRX, 0x00000000);
7607 spr_register_kvm_hv(env, SPR_CIABR, "CIABR",
7608 SPR_NOACCESS, SPR_NOACCESS,
7609 SPR_NOACCESS, SPR_NOACCESS,
7610 &spr_read_generic, &spr_write_generic,
7611 KVM_REG_PPC_CIABR, 0x00000000);
7612}
7613
7614static void gen_spr_970_dbg(CPUPPCState *env)
7615{
7616
7617 spr_register(env, SPR_IABR, "IABR",
7618 SPR_NOACCESS, SPR_NOACCESS,
7619 &spr_read_generic, &spr_write_generic,
7620 0x00000000);
7621}
7622
7623static void gen_spr_book3s_pmu_sup(CPUPPCState *env)
7624{
7625 spr_register_kvm(env, SPR_POWER_MMCR0, "MMCR0",
7626 SPR_NOACCESS, SPR_NOACCESS,
7627 &spr_read_generic, &spr_write_generic,
7628 KVM_REG_PPC_MMCR0, 0x00000000);
7629 spr_register_kvm(env, SPR_POWER_MMCR1, "MMCR1",
7630 SPR_NOACCESS, SPR_NOACCESS,
7631 &spr_read_generic, &spr_write_generic,
7632 KVM_REG_PPC_MMCR1, 0x00000000);
7633 spr_register_kvm(env, SPR_POWER_MMCRA, "MMCRA",
7634 SPR_NOACCESS, SPR_NOACCESS,
7635 &spr_read_generic, &spr_write_generic,
7636 KVM_REG_PPC_MMCRA, 0x00000000);
7637 spr_register_kvm(env, SPR_POWER_PMC1, "PMC1",
7638 SPR_NOACCESS, SPR_NOACCESS,
7639 &spr_read_generic, &spr_write_generic,
7640 KVM_REG_PPC_PMC1, 0x00000000);
7641 spr_register_kvm(env, SPR_POWER_PMC2, "PMC2",
7642 SPR_NOACCESS, SPR_NOACCESS,
7643 &spr_read_generic, &spr_write_generic,
7644 KVM_REG_PPC_PMC2, 0x00000000);
7645 spr_register_kvm(env, SPR_POWER_PMC3, "PMC3",
7646 SPR_NOACCESS, SPR_NOACCESS,
7647 &spr_read_generic, &spr_write_generic,
7648 KVM_REG_PPC_PMC3, 0x00000000);
7649 spr_register_kvm(env, SPR_POWER_PMC4, "PMC4",
7650 SPR_NOACCESS, SPR_NOACCESS,
7651 &spr_read_generic, &spr_write_generic,
7652 KVM_REG_PPC_PMC4, 0x00000000);
7653 spr_register_kvm(env, SPR_POWER_PMC5, "PMC5",
7654 SPR_NOACCESS, SPR_NOACCESS,
7655 &spr_read_generic, &spr_write_generic,
7656 KVM_REG_PPC_PMC5, 0x00000000);
7657 spr_register_kvm(env, SPR_POWER_PMC6, "PMC6",
7658 SPR_NOACCESS, SPR_NOACCESS,
7659 &spr_read_generic, &spr_write_generic,
7660 KVM_REG_PPC_PMC6, 0x00000000);
7661 spr_register_kvm(env, SPR_POWER_SIAR, "SIAR",
7662 SPR_NOACCESS, SPR_NOACCESS,
7663 &spr_read_generic, &spr_write_generic,
7664 KVM_REG_PPC_SIAR, 0x00000000);
7665 spr_register_kvm(env, SPR_POWER_SDAR, "SDAR",
7666 SPR_NOACCESS, SPR_NOACCESS,
7667 &spr_read_generic, &spr_write_generic,
7668 KVM_REG_PPC_SDAR, 0x00000000);
7669}
7670
7671static void gen_spr_book3s_pmu_user(CPUPPCState *env)
7672{
7673 spr_register(env, SPR_POWER_UMMCR0, "UMMCR0",
7674 &spr_read_ureg, SPR_NOACCESS,
7675 &spr_read_ureg, &spr_write_ureg,
7676 0x00000000);
7677 spr_register(env, SPR_POWER_UMMCR1, "UMMCR1",
7678 &spr_read_ureg, SPR_NOACCESS,
7679 &spr_read_ureg, &spr_write_ureg,
7680 0x00000000);
7681 spr_register(env, SPR_POWER_UMMCRA, "UMMCRA",
7682 &spr_read_ureg, SPR_NOACCESS,
7683 &spr_read_ureg, &spr_write_ureg,
7684 0x00000000);
7685 spr_register(env, SPR_POWER_UPMC1, "UPMC1",
7686 &spr_read_ureg, SPR_NOACCESS,
7687 &spr_read_ureg, &spr_write_ureg,
7688 0x00000000);
7689 spr_register(env, SPR_POWER_UPMC2, "UPMC2",
7690 &spr_read_ureg, SPR_NOACCESS,
7691 &spr_read_ureg, &spr_write_ureg,
7692 0x00000000);
7693 spr_register(env, SPR_POWER_UPMC3, "UPMC3",
7694 &spr_read_ureg, SPR_NOACCESS,
7695 &spr_read_ureg, &spr_write_ureg,
7696 0x00000000);
7697 spr_register(env, SPR_POWER_UPMC4, "UPMC4",
7698 &spr_read_ureg, SPR_NOACCESS,
7699 &spr_read_ureg, &spr_write_ureg,
7700 0x00000000);
7701 spr_register(env, SPR_POWER_UPMC5, "UPMC5",
7702 &spr_read_ureg, SPR_NOACCESS,
7703 &spr_read_ureg, &spr_write_ureg,
7704 0x00000000);
7705 spr_register(env, SPR_POWER_UPMC6, "UPMC6",
7706 &spr_read_ureg, SPR_NOACCESS,
7707 &spr_read_ureg, &spr_write_ureg,
7708 0x00000000);
7709 spr_register(env, SPR_POWER_USIAR, "USIAR",
7710 &spr_read_ureg, SPR_NOACCESS,
7711 &spr_read_ureg, &spr_write_ureg,
7712 0x00000000);
7713 spr_register(env, SPR_POWER_USDAR, "USDAR",
7714 &spr_read_ureg, SPR_NOACCESS,
7715 &spr_read_ureg, &spr_write_ureg,
7716 0x00000000);
7717}
7718
7719static void gen_spr_970_pmu_sup(CPUPPCState *env)
7720{
7721 spr_register_kvm(env, SPR_970_PMC7, "PMC7",
7722 SPR_NOACCESS, SPR_NOACCESS,
7723 &spr_read_generic, &spr_write_generic,
7724 KVM_REG_PPC_PMC7, 0x00000000);
7725 spr_register_kvm(env, SPR_970_PMC8, "PMC8",
7726 SPR_NOACCESS, SPR_NOACCESS,
7727 &spr_read_generic, &spr_write_generic,
7728 KVM_REG_PPC_PMC8, 0x00000000);
7729}
7730
7731static void gen_spr_970_pmu_user(CPUPPCState *env)
7732{
7733 spr_register(env, SPR_970_UPMC7, "UPMC7",
7734 &spr_read_ureg, SPR_NOACCESS,
7735 &spr_read_ureg, &spr_write_ureg,
7736 0x00000000);
7737 spr_register(env, SPR_970_UPMC8, "UPMC8",
7738 &spr_read_ureg, SPR_NOACCESS,
7739 &spr_read_ureg, &spr_write_ureg,
7740 0x00000000);
7741}
7742
7743static void gen_spr_power8_pmu_sup(CPUPPCState *env)
7744{
7745 spr_register_kvm(env, SPR_POWER_MMCR2, "MMCR2",
7746 SPR_NOACCESS, SPR_NOACCESS,
7747 &spr_read_generic, &spr_write_generic,
7748 KVM_REG_PPC_MMCR2, 0x00000000);
7749 spr_register_kvm(env, SPR_POWER_MMCRS, "MMCRS",
7750 SPR_NOACCESS, SPR_NOACCESS,
7751 &spr_read_generic, &spr_write_generic,
7752 KVM_REG_PPC_MMCRS, 0x00000000);
7753 spr_register_kvm(env, SPR_POWER_SIER, "SIER",
7754 SPR_NOACCESS, SPR_NOACCESS,
7755 &spr_read_generic, &spr_write_generic,
7756 KVM_REG_PPC_SIER, 0x00000000);
7757 spr_register_kvm(env, SPR_POWER_SPMC1, "SPMC1",
7758 SPR_NOACCESS, SPR_NOACCESS,
7759 &spr_read_generic, &spr_write_generic,
7760 KVM_REG_PPC_SPMC1, 0x00000000);
7761 spr_register_kvm(env, SPR_POWER_SPMC2, "SPMC2",
7762 SPR_NOACCESS, SPR_NOACCESS,
7763 &spr_read_generic, &spr_write_generic,
7764 KVM_REG_PPC_SPMC2, 0x00000000);
7765 spr_register_kvm(env, SPR_TACR, "TACR",
7766 SPR_NOACCESS, SPR_NOACCESS,
7767 &spr_read_generic, &spr_write_generic,
7768 KVM_REG_PPC_TACR, 0x00000000);
7769 spr_register_kvm(env, SPR_TCSCR, "TCSCR",
7770 SPR_NOACCESS, SPR_NOACCESS,
7771 &spr_read_generic, &spr_write_generic,
7772 KVM_REG_PPC_TCSCR, 0x00000000);
7773 spr_register_kvm(env, SPR_CSIGR, "CSIGR",
7774 SPR_NOACCESS, SPR_NOACCESS,
7775 &spr_read_generic, &spr_write_generic,
7776 KVM_REG_PPC_CSIGR, 0x00000000);
7777}
7778
7779static void gen_spr_power8_pmu_user(CPUPPCState *env)
7780{
7781 spr_register(env, SPR_POWER_UMMCR2, "UMMCR2",
7782 &spr_read_ureg, SPR_NOACCESS,
7783 &spr_read_ureg, &spr_write_ureg,
7784 0x00000000);
7785 spr_register(env, SPR_POWER_USIER, "USIER",
7786 &spr_read_generic, SPR_NOACCESS,
7787 &spr_read_generic, &spr_write_generic,
7788 0x00000000);
7789}
7790
7791static void gen_spr_power5p_ear(CPUPPCState *env)
7792{
7793
7794 spr_register(env, SPR_EAR, "EAR",
7795 SPR_NOACCESS, SPR_NOACCESS,
7796 &spr_read_generic, &spr_write_generic,
7797 0x00000000);
7798}
7799
7800#if !defined(CONFIG_USER_ONLY)
7801static void spr_write_hmer(DisasContext *ctx, int sprn, int gprn)
7802{
7803 TCGv hmer = tcg_temp_new();
7804
7805 gen_load_spr(hmer, sprn);
7806 tcg_gen_and_tl(hmer, cpu_gpr[gprn], hmer);
7807 gen_store_spr(sprn, hmer);
7808 spr_store_dump_spr(sprn);
7809 tcg_temp_free(hmer);
7810}
7811
7812static void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn)
7813{
7814 gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]);
7815}
7816
7817static void spr_write_970_hid4(DisasContext *ctx, int sprn, int gprn)
7818{
7819#if defined(TARGET_PPC64)
7820 spr_write_generic(ctx, sprn, gprn);
7821 gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]);
7822#endif
7823}
7824
7825#endif
7826
7827static void gen_spr_970_lpar(CPUPPCState *env)
7828{
7829#if !defined(CONFIG_USER_ONLY)
7830
7831
7832 spr_register(env, SPR_970_HID4, "HID4",
7833 SPR_NOACCESS, SPR_NOACCESS,
7834 &spr_read_generic, &spr_write_970_hid4,
7835 0x00000000);
7836#endif
7837}
7838
7839static void gen_spr_power5p_lpar(CPUPPCState *env)
7840{
7841#if !defined(CONFIG_USER_ONLY)
7842
7843 spr_register_kvm_hv(env, SPR_LPCR, "LPCR",
7844 SPR_NOACCESS, SPR_NOACCESS,
7845 SPR_NOACCESS, SPR_NOACCESS,
7846 &spr_read_generic, &spr_write_lpcr,
7847 KVM_REG_PPC_LPCR, LPCR_LPES0 | LPCR_LPES1);
7848 spr_register_hv(env, SPR_HDEC, "HDEC",
7849 SPR_NOACCESS, SPR_NOACCESS,
7850 SPR_NOACCESS, SPR_NOACCESS,
7851 &spr_read_hdecr, &spr_write_hdecr, 0);
7852#endif
7853}
7854
7855static void gen_spr_book3s_ids(CPUPPCState *env)
7856{
7857
7858
7859
7860 spr_register_hv(env, SPR_PIR, "PIR",
7861 SPR_NOACCESS, SPR_NOACCESS,
7862 &spr_read_generic, SPR_NOACCESS,
7863 &spr_read_generic, NULL,
7864 0x00000000);
7865 spr_register_hv(env, SPR_HID0, "HID0",
7866 SPR_NOACCESS, SPR_NOACCESS,
7867 SPR_NOACCESS, SPR_NOACCESS,
7868 &spr_read_generic, &spr_write_generic,
7869 0x00000000);
7870 spr_register_hv(env, SPR_TSCR, "TSCR",
7871 SPR_NOACCESS, SPR_NOACCESS,
7872 SPR_NOACCESS, SPR_NOACCESS,
7873 &spr_read_generic, &spr_write_generic,
7874 0x00000000);
7875 spr_register_hv(env, SPR_HMER, "HMER",
7876 SPR_NOACCESS, SPR_NOACCESS,
7877 SPR_NOACCESS, SPR_NOACCESS,
7878 &spr_read_generic, &spr_write_hmer,
7879 0x00000000);
7880 spr_register_hv(env, SPR_HMEER, "HMEER",
7881 SPR_NOACCESS, SPR_NOACCESS,
7882 SPR_NOACCESS, SPR_NOACCESS,
7883 &spr_read_generic, &spr_write_generic,
7884 0x00000000);
7885 spr_register_hv(env, SPR_TFMR, "TFMR",
7886 SPR_NOACCESS, SPR_NOACCESS,
7887 SPR_NOACCESS, SPR_NOACCESS,
7888 &spr_read_generic, &spr_write_generic,
7889 0x00000000);
7890 spr_register_hv(env, SPR_LPIDR, "LPIDR",
7891 SPR_NOACCESS, SPR_NOACCESS,
7892 SPR_NOACCESS, SPR_NOACCESS,
7893 &spr_read_generic, &spr_write_lpidr,
7894 0x00000000);
7895 spr_register_hv(env, SPR_HFSCR, "HFSCR",
7896 SPR_NOACCESS, SPR_NOACCESS,
7897 SPR_NOACCESS, SPR_NOACCESS,
7898 &spr_read_generic, &spr_write_generic,
7899 0x00000000);
7900 spr_register_hv(env, SPR_MMCRC, "MMCRC",
7901 SPR_NOACCESS, SPR_NOACCESS,
7902 SPR_NOACCESS, SPR_NOACCESS,
7903 &spr_read_generic, &spr_write_generic,
7904 0x00000000);
7905 spr_register_hv(env, SPR_MMCRH, "MMCRH",
7906 SPR_NOACCESS, SPR_NOACCESS,
7907 SPR_NOACCESS, SPR_NOACCESS,
7908 &spr_read_generic, &spr_write_generic,
7909 0x00000000);
7910 spr_register_hv(env, SPR_HSPRG0, "HSPRG0",
7911 SPR_NOACCESS, SPR_NOACCESS,
7912 SPR_NOACCESS, SPR_NOACCESS,
7913 &spr_read_generic, &spr_write_generic,
7914 0x00000000);
7915 spr_register_hv(env, SPR_HSPRG1, "HSPRG1",
7916 SPR_NOACCESS, SPR_NOACCESS,
7917 SPR_NOACCESS, SPR_NOACCESS,
7918 &spr_read_generic, &spr_write_generic,
7919 0x00000000);
7920 spr_register_hv(env, SPR_HSRR0, "HSRR0",
7921 SPR_NOACCESS, SPR_NOACCESS,
7922 SPR_NOACCESS, SPR_NOACCESS,
7923 &spr_read_generic, &spr_write_generic,
7924 0x00000000);
7925 spr_register_hv(env, SPR_HSRR1, "HSRR1",
7926 SPR_NOACCESS, SPR_NOACCESS,
7927 SPR_NOACCESS, SPR_NOACCESS,
7928 &spr_read_generic, &spr_write_generic,
7929 0x00000000);
7930 spr_register_hv(env, SPR_HDAR, "HDAR",
7931 SPR_NOACCESS, SPR_NOACCESS,
7932 SPR_NOACCESS, SPR_NOACCESS,
7933 &spr_read_generic, &spr_write_generic,
7934 0x00000000);
7935 spr_register_hv(env, SPR_HDSISR, "HDSISR",
7936 SPR_NOACCESS, SPR_NOACCESS,
7937 SPR_NOACCESS, SPR_NOACCESS,
7938 &spr_read_generic, &spr_write_generic,
7939 0x00000000);
7940 spr_register_hv(env, SPR_RMOR, "RMOR",
7941 SPR_NOACCESS, SPR_NOACCESS,
7942 SPR_NOACCESS, SPR_NOACCESS,
7943 &spr_read_generic, &spr_write_generic,
7944 0x00000000);
7945 spr_register_hv(env, SPR_HRMOR, "HRMOR",
7946 SPR_NOACCESS, SPR_NOACCESS,
7947 SPR_NOACCESS, SPR_NOACCESS,
7948 &spr_read_generic, &spr_write_generic,
7949 0x00000000);
7950}
7951
7952static void gen_spr_power8_ids(CPUPPCState *env)
7953{
7954
7955 spr_register(env, SPR_TIR, "TIR",
7956 SPR_NOACCESS, SPR_NOACCESS,
7957 &spr_read_generic, SPR_NOACCESS,
7958 0x00000000);
7959}
7960
7961static void gen_spr_book3s_purr(CPUPPCState *env)
7962{
7963#if !defined(CONFIG_USER_ONLY)
7964
7965 spr_register_kvm(env, SPR_PURR, "PURR",
7966 &spr_read_purr, SPR_NOACCESS,
7967 &spr_read_purr, SPR_NOACCESS,
7968 KVM_REG_PPC_PURR, 0x00000000);
7969 spr_register_kvm(env, SPR_SPURR, "SPURR",
7970 &spr_read_purr, SPR_NOACCESS,
7971 &spr_read_purr, SPR_NOACCESS,
7972 KVM_REG_PPC_SPURR, 0x00000000);
7973#endif
7974}
7975
7976static void gen_spr_power6_dbg(CPUPPCState *env)
7977{
7978#if !defined(CONFIG_USER_ONLY)
7979 spr_register(env, SPR_CFAR, "SPR_CFAR",
7980 SPR_NOACCESS, SPR_NOACCESS,
7981 &spr_read_cfar, &spr_write_cfar,
7982 0x00000000);
7983#endif
7984}
7985
7986static void gen_spr_power5p_common(CPUPPCState *env)
7987{
7988 spr_register_kvm(env, SPR_PPR, "PPR",
7989 &spr_read_generic, &spr_write_generic,
7990 &spr_read_generic, &spr_write_generic,
7991 KVM_REG_PPC_PPR, 0x00000000);
7992}
7993
7994static void gen_spr_power6_common(CPUPPCState *env)
7995{
7996#if !defined(CONFIG_USER_ONLY)
7997 spr_register_kvm(env, SPR_DSCR, "SPR_DSCR",
7998 SPR_NOACCESS, SPR_NOACCESS,
7999 &spr_read_generic, &spr_write_generic,
8000 KVM_REG_PPC_DSCR, 0x00000000);
8001#endif
8002
8003
8004
8005
8006 spr_register_hv(env, SPR_PCR, "PCR",
8007 SPR_NOACCESS, SPR_NOACCESS,
8008 SPR_NOACCESS, SPR_NOACCESS,
8009 &spr_read_generic, &spr_write_pcr,
8010 0x00000000);
8011}
8012
8013static void spr_read_tar(DisasContext *ctx, int gprn, int sprn)
8014{
8015 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_TAR, sprn, FSCR_IC_TAR);
8016 spr_read_generic(ctx, gprn, sprn);
8017}
8018
8019static void spr_write_tar(DisasContext *ctx, int sprn, int gprn)
8020{
8021 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_TAR, sprn, FSCR_IC_TAR);
8022 spr_write_generic(ctx, sprn, gprn);
8023}
8024
8025static void gen_spr_power8_tce_address_control(CPUPPCState *env)
8026{
8027 spr_register_kvm(env, SPR_TAR, "TAR",
8028 &spr_read_tar, &spr_write_tar,
8029 &spr_read_generic, &spr_write_generic,
8030 KVM_REG_PPC_TAR, 0x00000000);
8031}
8032
8033static void spr_read_tm(DisasContext *ctx, int gprn, int sprn)
8034{
8035 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8036 spr_read_generic(ctx, gprn, sprn);
8037}
8038
8039static void spr_write_tm(DisasContext *ctx, int sprn, int gprn)
8040{
8041 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8042 spr_write_generic(ctx, sprn, gprn);
8043}
8044
8045static void spr_read_tm_upper32(DisasContext *ctx, int gprn, int sprn)
8046{
8047 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8048 spr_read_prev_upper32(ctx, gprn, sprn);
8049}
8050
8051static void spr_write_tm_upper32(DisasContext *ctx, int sprn, int gprn)
8052{
8053 gen_msr_facility_check(ctx, SPR_FSCR, MSR_TM, sprn, FSCR_IC_TM);
8054 spr_write_prev_upper32(ctx, sprn, gprn);
8055}
8056
8057static void gen_spr_power8_tm(CPUPPCState *env)
8058{
8059 spr_register_kvm(env, SPR_TFHAR, "TFHAR",
8060 &spr_read_tm, &spr_write_tm,
8061 &spr_read_tm, &spr_write_tm,
8062 KVM_REG_PPC_TFHAR, 0x00000000);
8063 spr_register_kvm(env, SPR_TFIAR, "TFIAR",
8064 &spr_read_tm, &spr_write_tm,
8065 &spr_read_tm, &spr_write_tm,
8066 KVM_REG_PPC_TFIAR, 0x00000000);
8067 spr_register_kvm(env, SPR_TEXASR, "TEXASR",
8068 &spr_read_tm, &spr_write_tm,
8069 &spr_read_tm, &spr_write_tm,
8070 KVM_REG_PPC_TEXASR, 0x00000000);
8071 spr_register(env, SPR_TEXASRU, "TEXASRU",
8072 &spr_read_tm_upper32, &spr_write_tm_upper32,
8073 &spr_read_tm_upper32, &spr_write_tm_upper32,
8074 0x00000000);
8075}
8076
8077static void spr_read_ebb(DisasContext *ctx, int gprn, int sprn)
8078{
8079 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8080 spr_read_generic(ctx, gprn, sprn);
8081}
8082
8083static void spr_write_ebb(DisasContext *ctx, int sprn, int gprn)
8084{
8085 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8086 spr_write_generic(ctx, sprn, gprn);
8087}
8088
8089static void spr_read_ebb_upper32(DisasContext *ctx, int gprn, int sprn)
8090{
8091 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8092 spr_read_prev_upper32(ctx, gprn, sprn);
8093}
8094
8095static void spr_write_ebb_upper32(DisasContext *ctx, int sprn, int gprn)
8096{
8097 gen_fscr_facility_check(ctx, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
8098 spr_write_prev_upper32(ctx, sprn, gprn);
8099}
8100
8101static void gen_spr_power8_ebb(CPUPPCState *env)
8102{
8103 spr_register(env, SPR_BESCRS, "BESCRS",
8104 &spr_read_ebb, &spr_write_ebb,
8105 &spr_read_generic, &spr_write_generic,
8106 0x00000000);
8107 spr_register(env, SPR_BESCRSU, "BESCRSU",
8108 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
8109 &spr_read_prev_upper32, &spr_write_prev_upper32,
8110 0x00000000);
8111 spr_register(env, SPR_BESCRR, "BESCRR",
8112 &spr_read_ebb, &spr_write_ebb,
8113 &spr_read_generic, &spr_write_generic,
8114 0x00000000);
8115 spr_register(env, SPR_BESCRRU, "BESCRRU",
8116 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
8117 &spr_read_prev_upper32, &spr_write_prev_upper32,
8118 0x00000000);
8119 spr_register_kvm(env, SPR_EBBHR, "EBBHR",
8120 &spr_read_ebb, &spr_write_ebb,
8121 &spr_read_generic, &spr_write_generic,
8122 KVM_REG_PPC_EBBHR, 0x00000000);
8123 spr_register_kvm(env, SPR_EBBRR, "EBBRR",
8124 &spr_read_ebb, &spr_write_ebb,
8125 &spr_read_generic, &spr_write_generic,
8126 KVM_REG_PPC_EBBRR, 0x00000000);
8127 spr_register_kvm(env, SPR_BESCR, "BESCR",
8128 &spr_read_ebb, &spr_write_ebb,
8129 &spr_read_generic, &spr_write_generic,
8130 KVM_REG_PPC_BESCR, 0x00000000);
8131}
8132
8133
8134static void gen_spr_vtb(CPUPPCState *env)
8135{
8136 spr_register_kvm(env, SPR_VTB, "VTB",
8137 SPR_NOACCESS, SPR_NOACCESS,
8138 &spr_read_tbl, SPR_NOACCESS,
8139 KVM_REG_PPC_VTB, 0x00000000);
8140}
8141
8142static void gen_spr_power8_fscr(CPUPPCState *env)
8143{
8144#if defined(CONFIG_USER_ONLY)
8145 target_ulong initval = 1ULL << FSCR_TAR;
8146#else
8147 target_ulong initval = 0;
8148#endif
8149 spr_register_kvm(env, SPR_FSCR, "FSCR",
8150 SPR_NOACCESS, SPR_NOACCESS,
8151 &spr_read_generic, &spr_write_generic,
8152 KVM_REG_PPC_FSCR, initval);
8153}
8154
8155static void gen_spr_power8_pspb(CPUPPCState *env)
8156{
8157 spr_register_kvm(env, SPR_PSPB, "PSPB",
8158 SPR_NOACCESS, SPR_NOACCESS,
8159 &spr_read_generic, &spr_write_generic32,
8160 KVM_REG_PPC_PSPB, 0);
8161}
8162
8163static void gen_spr_power8_ic(CPUPPCState *env)
8164{
8165#if !defined(CONFIG_USER_ONLY)
8166 spr_register_hv(env, SPR_IC, "IC",
8167 SPR_NOACCESS, SPR_NOACCESS,
8168 &spr_read_generic, SPR_NOACCESS,
8169 &spr_read_generic, &spr_write_generic,
8170 0);
8171#endif
8172}
8173
8174static void gen_spr_power8_book4(CPUPPCState *env)
8175{
8176
8177#if !defined(CONFIG_USER_ONLY)
8178 spr_register_kvm(env, SPR_ACOP, "ACOP",
8179 SPR_NOACCESS, SPR_NOACCESS,
8180 &spr_read_generic, &spr_write_generic,
8181 KVM_REG_PPC_ACOP, 0);
8182 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
8183 SPR_NOACCESS, SPR_NOACCESS,
8184 &spr_read_generic, &spr_write_pidr,
8185 KVM_REG_PPC_PID, 0);
8186 spr_register_kvm(env, SPR_WORT, "WORT",
8187 SPR_NOACCESS, SPR_NOACCESS,
8188 &spr_read_generic, &spr_write_generic,
8189 KVM_REG_PPC_WORT, 0);
8190#endif
8191}
8192
8193static void gen_spr_power7_book4(CPUPPCState *env)
8194{
8195
8196#if !defined(CONFIG_USER_ONLY)
8197 spr_register_kvm(env, SPR_ACOP, "ACOP",
8198 SPR_NOACCESS, SPR_NOACCESS,
8199 &spr_read_generic, &spr_write_generic,
8200 KVM_REG_PPC_ACOP, 0);
8201 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
8202 SPR_NOACCESS, SPR_NOACCESS,
8203 &spr_read_generic, &spr_write_generic,
8204 KVM_REG_PPC_PID, 0);
8205#endif
8206}
8207
8208static void gen_spr_power8_rpr(CPUPPCState *env)
8209{
8210#if !defined(CONFIG_USER_ONLY)
8211 spr_register_hv(env, SPR_RPR, "RPR",
8212 SPR_NOACCESS, SPR_NOACCESS,
8213 SPR_NOACCESS, SPR_NOACCESS,
8214 &spr_read_generic, &spr_write_generic,
8215 0x00000103070F1F3F);
8216#endif
8217}
8218
8219static void gen_spr_power9_mmu(CPUPPCState *env)
8220{
8221#if !defined(CONFIG_USER_ONLY)
8222
8223 spr_register_kvm_hv(env, SPR_PTCR, "PTCR",
8224 SPR_NOACCESS, SPR_NOACCESS,
8225 SPR_NOACCESS, SPR_NOACCESS,
8226 &spr_read_generic, &spr_write_ptcr,
8227 KVM_REG_PPC_PTCR, 0x00000000);
8228#endif
8229}
8230
8231static void init_proc_book3s_common(CPUPPCState *env)
8232{
8233 gen_spr_ne_601(env);
8234 gen_tbl(env);
8235 gen_spr_usprg3(env);
8236 gen_spr_book3s_altivec(env);
8237 gen_spr_book3s_pmu_sup(env);
8238 gen_spr_book3s_pmu_user(env);
8239 gen_spr_book3s_ctrl(env);
8240}
8241
8242static void init_proc_970(CPUPPCState *env)
8243{
8244
8245 init_proc_book3s_common(env);
8246 gen_spr_sdr1(env);
8247 gen_spr_book3s_dbg(env);
8248
8249
8250 gen_spr_970_hid(env);
8251 gen_spr_970_hior(env);
8252 gen_low_BATs(env);
8253 gen_spr_970_pmu_sup(env);
8254 gen_spr_970_pmu_user(env);
8255 gen_spr_970_lpar(env);
8256 gen_spr_970_dbg(env);
8257
8258
8259 env->dcache_line_size = 128;
8260 env->icache_line_size = 128;
8261
8262
8263 init_excp_970(env);
8264 ppc970_irq_init(ppc_env_get_cpu(env));
8265}
8266
8267POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
8268{
8269 DeviceClass *dc = DEVICE_CLASS(oc);
8270 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8271
8272 dc->desc = "PowerPC 970";
8273 pcc->init_proc = init_proc_970;
8274 pcc->check_pow = check_pow_970;
8275 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
8276 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8277 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8278 PPC_FLOAT_STFIWX |
8279 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8280 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8281 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8282 PPC_64B | PPC_ALTIVEC |
8283 PPC_SEGMENT_64B | PPC_SLBI;
8284 pcc->insns_flags2 = PPC2_FP_CVT_S64;
8285 pcc->msr_mask = (1ull << MSR_SF) |
8286 (1ull << MSR_VR) |
8287 (1ull << MSR_POW) |
8288 (1ull << MSR_EE) |
8289 (1ull << MSR_PR) |
8290 (1ull << MSR_FP) |
8291 (1ull << MSR_ME) |
8292 (1ull << MSR_FE0) |
8293 (1ull << MSR_SE) |
8294 (1ull << MSR_DE) |
8295 (1ull << MSR_FE1) |
8296 (1ull << MSR_IR) |
8297 (1ull << MSR_DR) |
8298 (1ull << MSR_PMM) |
8299 (1ull << MSR_RI);
8300 pcc->mmu_model = POWERPC_MMU_64B;
8301#if defined(CONFIG_SOFTMMU)
8302 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8303 pcc->hash64_opts = &ppc_hash64_opts_basic;
8304#endif
8305 pcc->excp_model = POWERPC_EXCP_970;
8306 pcc->bus_model = PPC_FLAGS_INPUT_970;
8307 pcc->bfd_mach = bfd_mach_ppc64;
8308 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8309 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8310 POWERPC_FLAG_BUS_CLK;
8311 pcc->l1_dcache_size = 0x8000;
8312 pcc->l1_icache_size = 0x10000;
8313}
8314
8315static void init_proc_power5plus(CPUPPCState *env)
8316{
8317
8318 init_proc_book3s_common(env);
8319 gen_spr_sdr1(env);
8320 gen_spr_book3s_dbg(env);
8321
8322
8323 gen_spr_970_hid(env);
8324 gen_spr_970_hior(env);
8325 gen_low_BATs(env);
8326 gen_spr_970_pmu_sup(env);
8327 gen_spr_970_pmu_user(env);
8328 gen_spr_power5p_common(env);
8329 gen_spr_power5p_lpar(env);
8330 gen_spr_power5p_ear(env);
8331
8332
8333 env->dcache_line_size = 128;
8334 env->icache_line_size = 128;
8335
8336
8337 init_excp_970(env);
8338 ppc970_irq_init(ppc_env_get_cpu(env));
8339}
8340
8341POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
8342{
8343 DeviceClass *dc = DEVICE_CLASS(oc);
8344 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8345
8346 dc->fw_name = "PowerPC,POWER5";
8347 dc->desc = "POWER5+";
8348 pcc->init_proc = init_proc_power5plus;
8349 pcc->check_pow = check_pow_970;
8350 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
8351 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8352 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8353 PPC_FLOAT_STFIWX |
8354 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8355 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8356 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8357 PPC_64B |
8358 PPC_SEGMENT_64B | PPC_SLBI;
8359 pcc->insns_flags2 = PPC2_FP_CVT_S64;
8360 pcc->msr_mask = (1ull << MSR_SF) |
8361 (1ull << MSR_VR) |
8362 (1ull << MSR_POW) |
8363 (1ull << MSR_EE) |
8364 (1ull << MSR_PR) |
8365 (1ull << MSR_FP) |
8366 (1ull << MSR_ME) |
8367 (1ull << MSR_FE0) |
8368 (1ull << MSR_SE) |
8369 (1ull << MSR_DE) |
8370 (1ull << MSR_FE1) |
8371 (1ull << MSR_IR) |
8372 (1ull << MSR_DR) |
8373 (1ull << MSR_PMM) |
8374 (1ull << MSR_RI);
8375 pcc->mmu_model = POWERPC_MMU_2_03;
8376#if defined(CONFIG_SOFTMMU)
8377 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8378 pcc->hash64_opts = &ppc_hash64_opts_basic;
8379 pcc->lrg_decr_bits = 32;
8380#endif
8381 pcc->excp_model = POWERPC_EXCP_970;
8382 pcc->bus_model = PPC_FLAGS_INPUT_970;
8383 pcc->bfd_mach = bfd_mach_ppc64;
8384 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8385 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8386 POWERPC_FLAG_BUS_CLK;
8387 pcc->l1_dcache_size = 0x8000;
8388 pcc->l1_icache_size = 0x10000;
8389}
8390
8391
8392
8393
8394
8395
8396
8397
8398
8399
8400
8401
8402static void getset_compat_deprecated(Object *obj, Visitor *v, const char *name,
8403 void *opaque, Error **errp)
8404{
8405 QNull *null = NULL;
8406
8407 if (!qtest_enabled()) {
8408 warn_report("CPU 'compat' property is deprecated and has no effect; "
8409 "use max-cpu-compat machine property instead");
8410 }
8411 visit_type_null(v, name, &null, NULL);
8412 qobject_unref(null);
8413}
8414
8415static const PropertyInfo ppc_compat_deprecated_propinfo = {
8416 .name = "str",
8417 .description = "compatibility mode (deprecated)",
8418 .get = getset_compat_deprecated,
8419 .set = getset_compat_deprecated,
8420};
8421static Property powerpc_servercpu_properties[] = {
8422 {
8423 .name = "compat",
8424 .info = &ppc_compat_deprecated_propinfo,
8425 },
8426 DEFINE_PROP_END_OF_LIST(),
8427};
8428
8429static void init_proc_POWER7(CPUPPCState *env)
8430{
8431
8432 init_proc_book3s_common(env);
8433 gen_spr_sdr1(env);
8434 gen_spr_book3s_dbg(env);
8435
8436
8437 gen_spr_book3s_ids(env);
8438 gen_spr_amr(env);
8439 gen_spr_book3s_purr(env);
8440 gen_spr_power5p_common(env);
8441 gen_spr_power5p_lpar(env);
8442 gen_spr_power5p_ear(env);
8443 gen_spr_power6_common(env);
8444 gen_spr_power6_dbg(env);
8445 gen_spr_power7_book4(env);
8446
8447
8448 env->dcache_line_size = 128;
8449 env->icache_line_size = 128;
8450
8451
8452 init_excp_POWER7(env);
8453 ppcPOWER7_irq_init(ppc_env_get_cpu(env));
8454}
8455
8456static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr)
8457{
8458 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7P_BASE) {
8459 return true;
8460 }
8461 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7_BASE) {
8462 return true;
8463 }
8464 return false;
8465}
8466
8467static bool cpu_has_work_POWER7(CPUState *cs)
8468{
8469 PowerPCCPU *cpu = POWERPC_CPU(cs);
8470 CPUPPCState *env = &cpu->env;
8471
8472 if (cs->halted) {
8473 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8474 return false;
8475 }
8476 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8477 (env->spr[SPR_LPCR] & LPCR_P7_PECE0)) {
8478 return true;
8479 }
8480 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8481 (env->spr[SPR_LPCR] & LPCR_P7_PECE1)) {
8482 return true;
8483 }
8484 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
8485 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
8486 return true;
8487 }
8488 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
8489 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
8490 return true;
8491 }
8492 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8493 return true;
8494 }
8495 return false;
8496 } else {
8497 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8498 }
8499}
8500
8501POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
8502{
8503 DeviceClass *dc = DEVICE_CLASS(oc);
8504 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8505 CPUClass *cc = CPU_CLASS(oc);
8506
8507 dc->fw_name = "PowerPC,POWER7";
8508 dc->desc = "POWER7";
8509 dc->props = powerpc_servercpu_properties;
8510 pcc->pvr_match = ppc_pvr_match_power7;
8511 pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05;
8512 pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
8513 pcc->init_proc = init_proc_POWER7;
8514 pcc->check_pow = check_pow_nocheck;
8515 cc->has_work = cpu_has_work_POWER7;
8516 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8517 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8518 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8519 PPC_FLOAT_FRSQRTES |
8520 PPC_FLOAT_STFIWX |
8521 PPC_FLOAT_EXT |
8522 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8523 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8524 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8525 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8526 PPC_SEGMENT_64B | PPC_SLBI |
8527 PPC_POPCNTB | PPC_POPCNTWD |
8528 PPC_CILDST;
8529 pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205 |
8530 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8531 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8532 PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 |
8533 PPC2_PM_ISA206;
8534 pcc->msr_mask = (1ull << MSR_SF) |
8535 (1ull << MSR_VR) |
8536 (1ull << MSR_VSX) |
8537 (1ull << MSR_EE) |
8538 (1ull << MSR_PR) |
8539 (1ull << MSR_FP) |
8540 (1ull << MSR_ME) |
8541 (1ull << MSR_FE0) |
8542 (1ull << MSR_SE) |
8543 (1ull << MSR_DE) |
8544 (1ull << MSR_FE1) |
8545 (1ull << MSR_IR) |
8546 (1ull << MSR_DR) |
8547 (1ull << MSR_PMM) |
8548 (1ull << MSR_RI) |
8549 (1ull << MSR_LE);
8550 pcc->mmu_model = POWERPC_MMU_2_06;
8551#if defined(CONFIG_SOFTMMU)
8552 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8553 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8554 pcc->lrg_decr_bits = 32;
8555#endif
8556 pcc->excp_model = POWERPC_EXCP_POWER7;
8557 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
8558 pcc->bfd_mach = bfd_mach_ppc64;
8559 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8560 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8561 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8562 POWERPC_FLAG_VSX;
8563 pcc->l1_dcache_size = 0x8000;
8564 pcc->l1_icache_size = 0x8000;
8565 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8566 pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
8567}
8568
8569static void init_proc_POWER8(CPUPPCState *env)
8570{
8571
8572 init_proc_book3s_common(env);
8573 gen_spr_sdr1(env);
8574 gen_spr_book3s_207_dbg(env);
8575
8576
8577 gen_spr_book3s_ids(env);
8578 gen_spr_amr(env);
8579 gen_spr_iamr(env);
8580 gen_spr_book3s_purr(env);
8581 gen_spr_power5p_common(env);
8582 gen_spr_power5p_lpar(env);
8583 gen_spr_power5p_ear(env);
8584 gen_spr_power6_common(env);
8585 gen_spr_power6_dbg(env);
8586 gen_spr_power8_tce_address_control(env);
8587 gen_spr_power8_ids(env);
8588 gen_spr_power8_ebb(env);
8589 gen_spr_power8_fscr(env);
8590 gen_spr_power8_pmu_sup(env);
8591 gen_spr_power8_pmu_user(env);
8592 gen_spr_power8_tm(env);
8593 gen_spr_power8_pspb(env);
8594 gen_spr_vtb(env);
8595 gen_spr_power8_ic(env);
8596 gen_spr_power8_book4(env);
8597 gen_spr_power8_rpr(env);
8598
8599
8600 env->dcache_line_size = 128;
8601 env->icache_line_size = 128;
8602
8603
8604 init_excp_POWER8(env);
8605 ppcPOWER7_irq_init(ppc_env_get_cpu(env));
8606}
8607
8608static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr)
8609{
8610 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8NVL_BASE) {
8611 return true;
8612 }
8613 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8E_BASE) {
8614 return true;
8615 }
8616 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8_BASE) {
8617 return true;
8618 }
8619 return false;
8620}
8621
8622static bool cpu_has_work_POWER8(CPUState *cs)
8623{
8624 PowerPCCPU *cpu = POWERPC_CPU(cs);
8625 CPUPPCState *env = &cpu->env;
8626
8627 if (cs->halted) {
8628 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8629 return false;
8630 }
8631 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8632 (env->spr[SPR_LPCR] & LPCR_P8_PECE2)) {
8633 return true;
8634 }
8635 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8636 (env->spr[SPR_LPCR] & LPCR_P8_PECE3)) {
8637 return true;
8638 }
8639 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
8640 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
8641 return true;
8642 }
8643 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
8644 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
8645 return true;
8646 }
8647 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
8648 (env->spr[SPR_LPCR] & LPCR_P8_PECE0)) {
8649 return true;
8650 }
8651 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
8652 (env->spr[SPR_LPCR] & LPCR_P8_PECE1)) {
8653 return true;
8654 }
8655 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8656 return true;
8657 }
8658 return false;
8659 } else {
8660 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8661 }
8662}
8663
8664POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
8665{
8666 DeviceClass *dc = DEVICE_CLASS(oc);
8667 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8668 CPUClass *cc = CPU_CLASS(oc);
8669
8670 dc->fw_name = "PowerPC,POWER8";
8671 dc->desc = "POWER8";
8672 dc->props = powerpc_servercpu_properties;
8673 pcc->pvr_match = ppc_pvr_match_power8;
8674 pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
8675 pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
8676 pcc->init_proc = init_proc_POWER8;
8677 pcc->check_pow = check_pow_nocheck;
8678 cc->has_work = cpu_has_work_POWER8;
8679 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8680 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8681 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8682 PPC_FLOAT_FRSQRTES |
8683 PPC_FLOAT_STFIWX |
8684 PPC_FLOAT_EXT |
8685 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8686 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8687 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
8688 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8689 PPC_SEGMENT_64B | PPC_SLBI |
8690 PPC_POPCNTB | PPC_POPCNTWD |
8691 PPC_CILDST;
8692 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
8693 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8694 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8695 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
8696 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
8697 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
8698 PPC2_TM | PPC2_PM_ISA206;
8699 pcc->msr_mask = (1ull << MSR_SF) |
8700 (1ull << MSR_SHV) |
8701 (1ull << MSR_TM) |
8702 (1ull << MSR_VR) |
8703 (1ull << MSR_VSX) |
8704 (1ull << MSR_EE) |
8705 (1ull << MSR_PR) |
8706 (1ull << MSR_FP) |
8707 (1ull << MSR_ME) |
8708 (1ull << MSR_FE0) |
8709 (1ull << MSR_SE) |
8710 (1ull << MSR_DE) |
8711 (1ull << MSR_FE1) |
8712 (1ull << MSR_IR) |
8713 (1ull << MSR_DR) |
8714 (1ull << MSR_PMM) |
8715 (1ull << MSR_RI) |
8716 (1ull << MSR_TS0) |
8717 (1ull << MSR_TS1) |
8718 (1ull << MSR_LE);
8719 pcc->mmu_model = POWERPC_MMU_2_07;
8720#if defined(CONFIG_SOFTMMU)
8721 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
8722 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8723 pcc->lrg_decr_bits = 32;
8724#endif
8725 pcc->excp_model = POWERPC_EXCP_POWER8;
8726 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
8727 pcc->bfd_mach = bfd_mach_ppc64;
8728 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8729 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8730 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8731 POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
8732 pcc->l1_dcache_size = 0x8000;
8733 pcc->l1_icache_size = 0x8000;
8734 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8735 pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
8736 LPCR_P8_PECE3 | LPCR_P8_PECE4;
8737}
8738
8739#ifdef CONFIG_SOFTMMU
8740
8741
8742
8743
8744
8745
8746
8747static struct ppc_radix_page_info POWER9_radix_page_info = {
8748 .count = 4,
8749 .entries = {
8750 0x0000000c,
8751 0xa0000010,
8752 0x20000015,
8753 0x4000001e
8754 }
8755};
8756#endif
8757
8758static void init_proc_POWER9(CPUPPCState *env)
8759{
8760
8761 init_proc_book3s_common(env);
8762 gen_spr_book3s_207_dbg(env);
8763
8764
8765 gen_spr_book3s_ids(env);
8766 gen_spr_amr(env);
8767 gen_spr_iamr(env);
8768 gen_spr_book3s_purr(env);
8769 gen_spr_power5p_common(env);
8770 gen_spr_power5p_lpar(env);
8771 gen_spr_power5p_ear(env);
8772 gen_spr_power6_common(env);
8773 gen_spr_power6_dbg(env);
8774 gen_spr_power8_tce_address_control(env);
8775 gen_spr_power8_ids(env);
8776 gen_spr_power8_ebb(env);
8777 gen_spr_power8_fscr(env);
8778 gen_spr_power8_pmu_sup(env);
8779 gen_spr_power8_pmu_user(env);
8780 gen_spr_power8_tm(env);
8781 gen_spr_power8_pspb(env);
8782 gen_spr_vtb(env);
8783 gen_spr_power8_ic(env);
8784 gen_spr_power8_book4(env);
8785 gen_spr_power8_rpr(env);
8786 gen_spr_power9_mmu(env);
8787
8788
8789 spr_register_kvm(env, SPR_TIDR, "TIDR", NULL, NULL,
8790 spr_read_generic, spr_write_generic,
8791 KVM_REG_PPC_TIDR, 0);
8792
8793
8794 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
8795 spr_read_generic, spr_write_generic,
8796 KVM_REG_PPC_PSSCR, 0);
8797
8798
8799 env->dcache_line_size = 128;
8800 env->icache_line_size = 128;
8801
8802
8803 init_excp_POWER9(env);
8804 ppcPOWER9_irq_init(ppc_env_get_cpu(env));
8805}
8806
8807static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr)
8808{
8809 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER9_BASE) {
8810 return true;
8811 }
8812 return false;
8813}
8814
8815static bool cpu_has_work_POWER9(CPUState *cs)
8816{
8817 PowerPCCPU *cpu = POWERPC_CPU(cs);
8818 CPUPPCState *env = &cpu->env;
8819
8820 if (cs->halted) {
8821 uint64_t psscr = env->spr[SPR_PSSCR];
8822
8823 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8824 return false;
8825 }
8826
8827
8828 if (!(psscr & PSSCR_EC)) {
8829 return true;
8830 }
8831
8832 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8833 (env->spr[SPR_LPCR] & LPCR_EEE)) {
8834 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
8835 if (heic == 0 || !msr_hv || msr_pr) {
8836 return true;
8837 }
8838 }
8839
8840 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8841 (env->spr[SPR_LPCR] & LPCR_DEE)) {
8842 return true;
8843 }
8844
8845 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK |
8846 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) {
8847 return true;
8848 }
8849
8850 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
8851 (env->spr[SPR_LPCR] & LPCR_PDEE)) {
8852 return true;
8853 }
8854
8855 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
8856 (env->spr[SPR_LPCR] & LPCR_HDEE)) {
8857 return true;
8858 }
8859
8860 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) &&
8861 (env->spr[SPR_LPCR] & LPCR_HVEE)) {
8862 return true;
8863 }
8864 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8865 return true;
8866 }
8867 return false;
8868 } else {
8869 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8870 }
8871}
8872
8873POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
8874{
8875 DeviceClass *dc = DEVICE_CLASS(oc);
8876 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8877 CPUClass *cc = CPU_CLASS(oc);
8878
8879 dc->fw_name = "PowerPC,POWER9";
8880 dc->desc = "POWER9";
8881 dc->props = powerpc_servercpu_properties;
8882 pcc->pvr_match = ppc_pvr_match_power9;
8883 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07;
8884 pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 |
8885 PCR_COMPAT_2_05;
8886 pcc->init_proc = init_proc_POWER9;
8887 pcc->check_pow = check_pow_nocheck;
8888 cc->has_work = cpu_has_work_POWER9;
8889 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8890 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8891 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8892 PPC_FLOAT_FRSQRTES |
8893 PPC_FLOAT_STFIWX |
8894 PPC_FLOAT_EXT |
8895 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8896 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8897 PPC_MEM_TLBSYNC |
8898 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8899 PPC_SEGMENT_64B | PPC_SLBI |
8900 PPC_POPCNTB | PPC_POPCNTWD |
8901 PPC_CILDST;
8902 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
8903 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8904 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8905 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
8906 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
8907 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
8908 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
8909 pcc->msr_mask = (1ull << MSR_SF) |
8910 (1ull << MSR_SHV) |
8911 (1ull << MSR_TM) |
8912 (1ull << MSR_VR) |
8913 (1ull << MSR_VSX) |
8914 (1ull << MSR_EE) |
8915 (1ull << MSR_PR) |
8916 (1ull << MSR_FP) |
8917 (1ull << MSR_ME) |
8918 (1ull << MSR_FE0) |
8919 (1ull << MSR_SE) |
8920 (1ull << MSR_DE) |
8921 (1ull << MSR_FE1) |
8922 (1ull << MSR_IR) |
8923 (1ull << MSR_DR) |
8924 (1ull << MSR_PMM) |
8925 (1ull << MSR_RI) |
8926 (1ull << MSR_LE);
8927 pcc->mmu_model = POWERPC_MMU_3_00;
8928#if defined(CONFIG_SOFTMMU)
8929 pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault;
8930
8931 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8932 pcc->radix_page_info = &POWER9_radix_page_info;
8933 pcc->lrg_decr_bits = 56;
8934#endif
8935 pcc->excp_model = POWERPC_EXCP_POWER9;
8936 pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
8937 pcc->bfd_mach = bfd_mach_ppc64;
8938 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8939 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8940 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8941 POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
8942 pcc->l1_dcache_size = 0x8000;
8943 pcc->l1_icache_size = 0x8000;
8944 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8945 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
8946}
8947
8948#if !defined(CONFIG_USER_ONLY)
8949void cpu_ppc_set_vhyp(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp)
8950{
8951 CPUPPCState *env = &cpu->env;
8952
8953 cpu->vhyp = vhyp;
8954
8955
8956
8957
8958
8959 env->msr_mask &= ~MSR_HVB;
8960}
8961
8962#endif
8963
8964#endif
8965
8966
8967
8968static void init_ppc_proc(PowerPCCPU *cpu)
8969{
8970 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8971 CPUPPCState *env = &cpu->env;
8972#if !defined(CONFIG_USER_ONLY)
8973 int i;
8974
8975 env->irq_inputs = NULL;
8976
8977 for (i = 0; i < POWERPC_EXCP_NB; i++)
8978 env->excp_vectors[i] = (target_ulong)(-1ULL);
8979 env->ivor_mask = 0x00000000;
8980 env->ivpr_mask = 0x00000000;
8981
8982 env->nb_BATs = 0;
8983 env->nb_tlb = 0;
8984 env->nb_ways = 0;
8985 env->tlb_type = TLB_NONE;
8986#endif
8987
8988 gen_spr_generic(env);
8989 spr_register(env, SPR_PVR, "PVR",
8990
8991#if defined(CONFIG_LINUX_USER)
8992 &spr_read_generic,
8993#else
8994 SPR_NOACCESS,
8995#endif
8996 SPR_NOACCESS,
8997 &spr_read_generic, SPR_NOACCESS,
8998 pcc->pvr);
8999
9000 if (pcc->svr != POWERPC_SVR_NONE) {
9001 if (pcc->svr & POWERPC_SVR_E500) {
9002 spr_register(env, SPR_E500_SVR, "SVR",
9003 SPR_NOACCESS, SPR_NOACCESS,
9004 &spr_read_generic, SPR_NOACCESS,
9005 pcc->svr & ~POWERPC_SVR_E500);
9006 } else {
9007 spr_register(env, SPR_SVR, "SVR",
9008 SPR_NOACCESS, SPR_NOACCESS,
9009 &spr_read_generic, SPR_NOACCESS,
9010 pcc->svr);
9011 }
9012 }
9013
9014 (*pcc->init_proc)(env);
9015
9016#if !defined(CONFIG_USER_ONLY)
9017 ppc_gdb_gen_spr_xml(cpu);
9018#endif
9019
9020
9021 if (env->msr_mask & (1 << 25)) {
9022 switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
9023 case POWERPC_FLAG_SPE:
9024 case POWERPC_FLAG_VRE:
9025 break;
9026 default:
9027 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9028 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
9029 exit(1);
9030 }
9031 } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
9032 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9033 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
9034 exit(1);
9035 }
9036 if (env->msr_mask & (1 << 17)) {
9037 switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
9038 case POWERPC_FLAG_TGPR:
9039 case POWERPC_FLAG_CE:
9040 break;
9041 default:
9042 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9043 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
9044 exit(1);
9045 }
9046 } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
9047 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9048 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
9049 exit(1);
9050 }
9051 if (env->msr_mask & (1 << 10)) {
9052 switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
9053 POWERPC_FLAG_UBLE)) {
9054 case POWERPC_FLAG_SE:
9055 case POWERPC_FLAG_DWE:
9056 case POWERPC_FLAG_UBLE:
9057 break;
9058 default:
9059 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9060 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
9061 "POWERPC_FLAG_UBLE\n");
9062 exit(1);
9063 }
9064 } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
9065 POWERPC_FLAG_UBLE)) {
9066 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9067 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
9068 "POWERPC_FLAG_UBLE\n");
9069 exit(1);
9070 }
9071 if (env->msr_mask & (1 << 9)) {
9072 switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
9073 case POWERPC_FLAG_BE:
9074 case POWERPC_FLAG_DE:
9075 break;
9076 default:
9077 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9078 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
9079 exit(1);
9080 }
9081 } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
9082 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9083 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
9084 exit(1);
9085 }
9086 if (env->msr_mask & (1 << 2)) {
9087 switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9088 case POWERPC_FLAG_PX:
9089 case POWERPC_FLAG_PMM:
9090 break;
9091 default:
9092 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9093 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
9094 exit(1);
9095 }
9096 } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
9097 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
9098 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
9099 exit(1);
9100 }
9101 if ((env->flags & (POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_BUS_CLK)) == 0) {
9102 fprintf(stderr, "PowerPC flags inconsistency\n"
9103 "Should define the time-base and decrementer clock source\n");
9104 exit(1);
9105 }
9106
9107#if !defined(CONFIG_USER_ONLY)
9108 if (env->nb_tlb != 0) {
9109 int nb_tlb = env->nb_tlb;
9110 if (env->id_tlbs != 0)
9111 nb_tlb *= 2;
9112 switch (env->tlb_type) {
9113 case TLB_6XX:
9114 env->tlb.tlb6 = g_new0(ppc6xx_tlb_t, nb_tlb);
9115 break;
9116 case TLB_EMB:
9117 env->tlb.tlbe = g_new0(ppcemb_tlb_t, nb_tlb);
9118 break;
9119 case TLB_MAS:
9120 env->tlb.tlbm = g_new0(ppcmas_tlb_t, nb_tlb);
9121 break;
9122 }
9123
9124 env->tlb_per_way = env->nb_tlb / env->nb_ways;
9125 }
9126 if (env->irq_inputs == NULL) {
9127 warn_report("no internal IRQ controller registered."
9128 " Attempt QEMU to crash very soon !");
9129 }
9130#endif
9131 if (env->check_pow == NULL) {
9132 warn_report("no power management check handler registered."
9133 " Attempt QEMU to crash very soon !");
9134 }
9135}
9136
9137#if defined(PPC_DUMP_CPU)
9138static void dump_ppc_sprs(CPUPPCState *env)
9139{
9140 ppc_spr_t *spr;
9141#if !defined(CONFIG_USER_ONLY)
9142 uint32_t sr, sw;
9143#endif
9144 uint32_t ur, uw;
9145 int i, j, n;
9146
9147 printf("Special purpose registers:\n");
9148 for (i = 0; i < 32; i++) {
9149 for (j = 0; j < 32; j++) {
9150 n = (i << 5) | j;
9151 spr = &env->spr_cb[n];
9152 uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
9153 ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
9154#if !defined(CONFIG_USER_ONLY)
9155 sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
9156 sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
9157 if (sw || sr || uw || ur) {
9158 printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
9159 (i << 5) | j, (i << 5) | j, spr->name,
9160 sw ? 'w' : '-', sr ? 'r' : '-',
9161 uw ? 'w' : '-', ur ? 'r' : '-');
9162 }
9163#else
9164 if (uw || ur) {
9165 printf("SPR: %4d (%03x) %-8s u%c%c\n",
9166 (i << 5) | j, (i << 5) | j, spr->name,
9167 uw ? 'w' : '-', ur ? 'r' : '-');
9168 }
9169#endif
9170 }
9171 }
9172 fflush(stdout);
9173 fflush(stderr);
9174}
9175#endif
9176
9177
9178
9179
9180enum {
9181 PPC_DIRECT = 0,
9182 PPC_INDIRECT = 1,
9183};
9184
9185#define PPC_OPCODE_MASK 0x3
9186
9187static inline int is_indirect_opcode(void *handler)
9188{
9189 return ((uintptr_t)handler & PPC_OPCODE_MASK) == PPC_INDIRECT;
9190}
9191
9192static inline opc_handler_t **ind_table(void *handler)
9193{
9194 return (opc_handler_t **)((uintptr_t)handler & ~PPC_OPCODE_MASK);
9195}
9196
9197
9198
9199static void fill_new_table(opc_handler_t **table, int len)
9200{
9201 int i;
9202
9203 for (i = 0; i < len; i++)
9204 table[i] = &invalid_handler;
9205}
9206
9207static int create_new_table(opc_handler_t **table, unsigned char idx)
9208{
9209 opc_handler_t **tmp;
9210
9211 tmp = g_new(opc_handler_t *, PPC_CPU_INDIRECT_OPCODES_LEN);
9212 fill_new_table(tmp, PPC_CPU_INDIRECT_OPCODES_LEN);
9213 table[idx] = (opc_handler_t *)((uintptr_t)tmp | PPC_INDIRECT);
9214
9215 return 0;
9216}
9217
9218static int insert_in_table(opc_handler_t **table, unsigned char idx,
9219 opc_handler_t *handler)
9220{
9221 if (table[idx] != &invalid_handler)
9222 return -1;
9223 table[idx] = handler;
9224
9225 return 0;
9226}
9227
9228static int register_direct_insn(opc_handler_t **ppc_opcodes,
9229 unsigned char idx, opc_handler_t *handler)
9230{
9231 if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
9232 printf("*** ERROR: opcode %02x already assigned in main "
9233 "opcode table\n", idx);
9234#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9235 printf(" Registered handler '%s' - new handler '%s'\n",
9236 ppc_opcodes[idx]->oname, handler->oname);
9237#endif
9238 return -1;
9239 }
9240
9241 return 0;
9242}
9243
9244static int register_ind_in_table(opc_handler_t **table,
9245 unsigned char idx1, unsigned char idx2,
9246 opc_handler_t *handler)
9247{
9248 if (table[idx1] == &invalid_handler) {
9249 if (create_new_table(table, idx1) < 0) {
9250 printf("*** ERROR: unable to create indirect table "
9251 "idx=%02x\n", idx1);
9252 return -1;
9253 }
9254 } else {
9255 if (!is_indirect_opcode(table[idx1])) {
9256 printf("*** ERROR: idx %02x already assigned to a direct "
9257 "opcode\n", idx1);
9258#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9259 printf(" Registered handler '%s' - new handler '%s'\n",
9260 ind_table(table[idx1])[idx2]->oname, handler->oname);
9261#endif
9262 return -1;
9263 }
9264 }
9265 if (handler != NULL &&
9266 insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
9267 printf("*** ERROR: opcode %02x already assigned in "
9268 "opcode table %02x\n", idx2, idx1);
9269#if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
9270 printf(" Registered handler '%s' - new handler '%s'\n",
9271 ind_table(table[idx1])[idx2]->oname, handler->oname);
9272#endif
9273 return -1;
9274 }
9275
9276 return 0;
9277}
9278
9279static int register_ind_insn(opc_handler_t **ppc_opcodes,
9280 unsigned char idx1, unsigned char idx2,
9281 opc_handler_t *handler)
9282{
9283 return register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
9284}
9285
9286static int register_dblind_insn(opc_handler_t **ppc_opcodes,
9287 unsigned char idx1, unsigned char idx2,
9288 unsigned char idx3, opc_handler_t *handler)
9289{
9290 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
9291 printf("*** ERROR: unable to join indirect table idx "
9292 "[%02x-%02x]\n", idx1, idx2);
9293 return -1;
9294 }
9295 if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
9296 handler) < 0) {
9297 printf("*** ERROR: unable to insert opcode "
9298 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
9299 return -1;
9300 }
9301
9302 return 0;
9303}
9304
9305static int register_trplind_insn(opc_handler_t **ppc_opcodes,
9306 unsigned char idx1, unsigned char idx2,
9307 unsigned char idx3, unsigned char idx4,
9308 opc_handler_t *handler)
9309{
9310 opc_handler_t **table;
9311
9312 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
9313 printf("*** ERROR: unable to join indirect table idx "
9314 "[%02x-%02x]\n", idx1, idx2);
9315 return -1;
9316 }
9317 table = ind_table(ppc_opcodes[idx1]);
9318 if (register_ind_in_table(table, idx2, idx3, NULL) < 0) {
9319 printf("*** ERROR: unable to join 2nd-level indirect table idx "
9320 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
9321 return -1;
9322 }
9323 table = ind_table(table[idx2]);
9324 if (register_ind_in_table(table, idx3, idx4, handler) < 0) {
9325 printf("*** ERROR: unable to insert opcode "
9326 "[%02x-%02x-%02x-%02x]\n", idx1, idx2, idx3, idx4);
9327 return -1;
9328 }
9329 return 0;
9330}
9331static int register_insn(opc_handler_t **ppc_opcodes, opcode_t *insn)
9332{
9333 if (insn->opc2 != 0xFF) {
9334 if (insn->opc3 != 0xFF) {
9335 if (insn->opc4 != 0xFF) {
9336 if (register_trplind_insn(ppc_opcodes, insn->opc1, insn->opc2,
9337 insn->opc3, insn->opc4,
9338 &insn->handler) < 0) {
9339 return -1;
9340 }
9341 } else {
9342 if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
9343 insn->opc3, &insn->handler) < 0)
9344 return -1;
9345 }
9346 } else {
9347 if (register_ind_insn(ppc_opcodes, insn->opc1,
9348 insn->opc2, &insn->handler) < 0)
9349 return -1;
9350 }
9351 } else {
9352 if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
9353 return -1;
9354 }
9355
9356 return 0;
9357}
9358
9359static int test_opcode_table(opc_handler_t **table, int len)
9360{
9361 int i, count, tmp;
9362
9363 for (i = 0, count = 0; i < len; i++) {
9364
9365 if (table[i] == NULL)
9366 table[i] = &invalid_handler;
9367 if (table[i] != &invalid_handler) {
9368 if (is_indirect_opcode(table[i])) {
9369 tmp = test_opcode_table(ind_table(table[i]),
9370 PPC_CPU_INDIRECT_OPCODES_LEN);
9371 if (tmp == 0) {
9372 free(table[i]);
9373 table[i] = &invalid_handler;
9374 } else {
9375 count++;
9376 }
9377 } else {
9378 count++;
9379 }
9380 }
9381 }
9382
9383 return count;
9384}
9385
9386static void fix_opcode_tables(opc_handler_t **ppc_opcodes)
9387{
9388 if (test_opcode_table(ppc_opcodes, PPC_CPU_OPCODES_LEN) == 0)
9389 printf("*** WARNING: no opcode defined !\n");
9390}
9391
9392
9393static void create_ppc_opcodes(PowerPCCPU *cpu, Error **errp)
9394{
9395 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
9396 CPUPPCState *env = &cpu->env;
9397 opcode_t *opc;
9398
9399 fill_new_table(env->opcodes, PPC_CPU_OPCODES_LEN);
9400 for (opc = opcodes; opc < &opcodes[ARRAY_SIZE(opcodes)]; opc++) {
9401 if (((opc->handler.type & pcc->insns_flags) != 0) ||
9402 ((opc->handler.type2 & pcc->insns_flags2) != 0)) {
9403 if (register_insn(env->opcodes, opc) < 0) {
9404 error_setg(errp, "ERROR initializing PowerPC instruction "
9405 "0x%02x 0x%02x 0x%02x", opc->opc1, opc->opc2,
9406 opc->opc3);
9407 return;
9408 }
9409 }
9410 }
9411 fix_opcode_tables(env->opcodes);
9412 fflush(stdout);
9413 fflush(stderr);
9414}
9415
9416#if defined(PPC_DUMP_CPU)
9417static void dump_ppc_insns(CPUPPCState *env)
9418{
9419 opc_handler_t **table, *handler;
9420 const char *p, *q;
9421 uint8_t opc1, opc2, opc3, opc4;
9422
9423 printf("Instructions set:\n");
9424
9425 for (opc1 = 0x00; opc1 < PPC_CPU_OPCODES_LEN; opc1++) {
9426 table = env->opcodes;
9427 handler = table[opc1];
9428 if (is_indirect_opcode(handler)) {
9429
9430 for (opc2 = 0; opc2 < PPC_CPU_INDIRECT_OPCODES_LEN; opc2++) {
9431 table = env->opcodes;
9432 handler = env->opcodes[opc1];
9433 table = ind_table(handler);
9434 handler = table[opc2];
9435 if (is_indirect_opcode(handler)) {
9436 table = ind_table(handler);
9437
9438 for (opc3 = 0; opc3 < PPC_CPU_INDIRECT_OPCODES_LEN;
9439 opc3++) {
9440 handler = table[opc3];
9441 if (is_indirect_opcode(handler)) {
9442 table = ind_table(handler);
9443
9444 for (opc4 = 0; opc4 < PPC_CPU_INDIRECT_OPCODES_LEN;
9445 opc4++) {
9446 handler = table[opc4];
9447 if (handler->handler != &gen_invalid) {
9448 printf("INSN: %02x %02x %02x %02x -- "
9449 "(%02d %04d %02d) : %s\n",
9450 opc1, opc2, opc3, opc4,
9451 opc1, (opc3 << 5) | opc2, opc4,
9452 handler->oname);
9453 }
9454 }
9455 } else {
9456 if (handler->handler != &gen_invalid) {
9457
9458 p = strchr(handler->oname, '_');
9459 if (p == NULL) {
9460 printf("INSN: %02x %02x %02x (%02d %04d) : "
9461 "%s\n",
9462 opc1, opc2, opc3, opc1,
9463 (opc3 << 5) | opc2,
9464 handler->oname);
9465 } else {
9466 q = "speundef";
9467 if ((p - handler->oname) != strlen(q)
9468 || (memcmp(handler->oname, q, strlen(q))
9469 != 0)) {
9470
9471 printf("INSN: %02x %02x %02x"
9472 "(%02d %04d) : %.*s\n",
9473 opc1, opc2 << 1, opc3, opc1,
9474 (opc3 << 6) | (opc2 << 1),
9475 (int)(p - handler->oname),
9476 handler->oname);
9477 }
9478 if (strcmp(p + 1, q) != 0) {
9479
9480 printf("INSN: %02x %02x %02x "
9481 "(%02d %04d) : %s\n", opc1,
9482 (opc2 << 1) | 1, opc3, opc1,
9483 (opc3 << 6) | (opc2 << 1) | 1,
9484 p + 1);
9485 }
9486 }
9487 }
9488 }
9489 }
9490 } else {
9491 if (handler->handler != &gen_invalid) {
9492 printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
9493 opc1, opc2, opc1, opc2, handler->oname);
9494 }
9495 }
9496 }
9497 } else {
9498 if (handler->handler != &gen_invalid) {
9499 printf("INSN: %02x -- -- (%02d ----) : %s\n",
9500 opc1, opc1, handler->oname);
9501 }
9502 }
9503 }
9504}
9505#endif
9506
9507static bool avr_need_swap(CPUPPCState *env)
9508{
9509#ifdef HOST_WORDS_BIGENDIAN
9510 return msr_le;
9511#else
9512 return !msr_le;
9513#endif
9514}
9515
9516#if !defined(CONFIG_USER_ONLY)
9517static int gdb_find_spr_idx(CPUPPCState *env, int n)
9518{
9519 int i;
9520
9521 for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
9522 ppc_spr_t *spr = &env->spr_cb[i];
9523
9524 if (spr->name && spr->gdb_id == n) {
9525 return i;
9526 }
9527 }
9528 return -1;
9529}
9530
9531static int gdb_get_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9532{
9533 int reg;
9534 int len;
9535
9536 reg = gdb_find_spr_idx(env, n);
9537 if (reg < 0) {
9538 return 0;
9539 }
9540
9541 len = TARGET_LONG_SIZE;
9542 stn_p(mem_buf, len, env->spr[reg]);
9543 ppc_maybe_bswap_register(env, mem_buf, len);
9544 return len;
9545}
9546
9547static int gdb_set_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9548{
9549 int reg;
9550 int len;
9551
9552 reg = gdb_find_spr_idx(env, n);
9553 if (reg < 0) {
9554 return 0;
9555 }
9556
9557 len = TARGET_LONG_SIZE;
9558 ppc_maybe_bswap_register(env, mem_buf, len);
9559 env->spr[reg] = ldn_p(mem_buf, len);
9560
9561 return len;
9562}
9563#endif
9564
9565static int gdb_get_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9566{
9567 if (n < 32) {
9568 stfq_p(mem_buf, *cpu_fpr_ptr(env, n));
9569 ppc_maybe_bswap_register(env, mem_buf, 8);
9570 return 8;
9571 }
9572 if (n == 32) {
9573 stl_p(mem_buf, env->fpscr);
9574 ppc_maybe_bswap_register(env, mem_buf, 4);
9575 return 4;
9576 }
9577 return 0;
9578}
9579
9580static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9581{
9582 if (n < 32) {
9583 ppc_maybe_bswap_register(env, mem_buf, 8);
9584 *cpu_fpr_ptr(env, n) = ldfq_p(mem_buf);
9585 return 8;
9586 }
9587 if (n == 32) {
9588 ppc_maybe_bswap_register(env, mem_buf, 4);
9589 helper_store_fpscr(env, ldl_p(mem_buf), 0xffffffff);
9590 return 4;
9591 }
9592 return 0;
9593}
9594
9595static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9596{
9597 if (n < 32) {
9598 ppc_avr_t *avr = cpu_avr_ptr(env, n);
9599 if (!avr_need_swap(env)) {
9600 stq_p(mem_buf, avr->u64[0]);
9601 stq_p(mem_buf + 8, avr->u64[1]);
9602 } else {
9603 stq_p(mem_buf, avr->u64[1]);
9604 stq_p(mem_buf + 8, avr->u64[0]);
9605 }
9606 ppc_maybe_bswap_register(env, mem_buf, 8);
9607 ppc_maybe_bswap_register(env, mem_buf + 8, 8);
9608 return 16;
9609 }
9610 if (n == 32) {
9611 stl_p(mem_buf, helper_mfvscr(env));
9612 ppc_maybe_bswap_register(env, mem_buf, 4);
9613 return 4;
9614 }
9615 if (n == 33) {
9616 stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
9617 ppc_maybe_bswap_register(env, mem_buf, 4);
9618 return 4;
9619 }
9620 return 0;
9621}
9622
9623static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9624{
9625 if (n < 32) {
9626 ppc_avr_t *avr = cpu_avr_ptr(env, n);
9627 ppc_maybe_bswap_register(env, mem_buf, 8);
9628 ppc_maybe_bswap_register(env, mem_buf + 8, 8);
9629 if (!avr_need_swap(env)) {
9630 avr->u64[0] = ldq_p(mem_buf);
9631 avr->u64[1] = ldq_p(mem_buf + 8);
9632 } else {
9633 avr->u64[1] = ldq_p(mem_buf);
9634 avr->u64[0] = ldq_p(mem_buf + 8);
9635 }
9636 return 16;
9637 }
9638 if (n == 32) {
9639 ppc_maybe_bswap_register(env, mem_buf, 4);
9640 helper_mtvscr(env, ldl_p(mem_buf));
9641 return 4;
9642 }
9643 if (n == 33) {
9644 ppc_maybe_bswap_register(env, mem_buf, 4);
9645 env->spr[SPR_VRSAVE] = (target_ulong)ldl_p(mem_buf);
9646 return 4;
9647 }
9648 return 0;
9649}
9650
9651static int gdb_get_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9652{
9653 if (n < 32) {
9654#if defined(TARGET_PPC64)
9655 stl_p(mem_buf, env->gpr[n] >> 32);
9656 ppc_maybe_bswap_register(env, mem_buf, 4);
9657#else
9658 stl_p(mem_buf, env->gprh[n]);
9659#endif
9660 return 4;
9661 }
9662 if (n == 32) {
9663 stq_p(mem_buf, env->spe_acc);
9664 ppc_maybe_bswap_register(env, mem_buf, 8);
9665 return 8;
9666 }
9667 if (n == 33) {
9668 stl_p(mem_buf, env->spe_fscr);
9669 ppc_maybe_bswap_register(env, mem_buf, 4);
9670 return 4;
9671 }
9672 return 0;
9673}
9674
9675static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9676{
9677 if (n < 32) {
9678#if defined(TARGET_PPC64)
9679 target_ulong lo = (uint32_t)env->gpr[n];
9680 target_ulong hi;
9681
9682 ppc_maybe_bswap_register(env, mem_buf, 4);
9683
9684 hi = (target_ulong)ldl_p(mem_buf) << 32;
9685 env->gpr[n] = lo | hi;
9686#else
9687 env->gprh[n] = ldl_p(mem_buf);
9688#endif
9689 return 4;
9690 }
9691 if (n == 32) {
9692 ppc_maybe_bswap_register(env, mem_buf, 8);
9693 env->spe_acc = ldq_p(mem_buf);
9694 return 8;
9695 }
9696 if (n == 33) {
9697 ppc_maybe_bswap_register(env, mem_buf, 4);
9698 env->spe_fscr = ldl_p(mem_buf);
9699 return 4;
9700 }
9701 return 0;
9702}
9703
9704static int gdb_get_vsx_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9705{
9706 if (n < 32) {
9707 stq_p(mem_buf, *cpu_vsrl_ptr(env, n));
9708 ppc_maybe_bswap_register(env, mem_buf, 8);
9709 return 8;
9710 }
9711 return 0;
9712}
9713
9714static int gdb_set_vsx_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
9715{
9716 if (n < 32) {
9717 ppc_maybe_bswap_register(env, mem_buf, 8);
9718 *cpu_vsrl_ptr(env, n) = ldq_p(mem_buf);
9719 return 8;
9720 }
9721 return 0;
9722}
9723
9724static int ppc_fixup_cpu(PowerPCCPU *cpu)
9725{
9726 CPUPPCState *env = &cpu->env;
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736 if ((env->insns_flags & ~PPC_TCG_INSNS)
9737 || (env->insns_flags2 & ~PPC_TCG_INSNS2)) {
9738 warn_report("Disabling some instructions which are not "
9739 "emulated by TCG (0x%" PRIx64 ", 0x%" PRIx64 ")",
9740 env->insns_flags & ~PPC_TCG_INSNS,
9741 env->insns_flags2 & ~PPC_TCG_INSNS2);
9742 }
9743 env->insns_flags &= PPC_TCG_INSNS;
9744 env->insns_flags2 &= PPC_TCG_INSNS2;
9745 return 0;
9746}
9747
9748static void ppc_cpu_realize(DeviceState *dev, Error **errp)
9749{
9750 CPUState *cs = CPU(dev);
9751 PowerPCCPU *cpu = POWERPC_CPU(dev);
9752 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
9753 Error *local_err = NULL;
9754
9755 cpu_exec_realizefn(cs, &local_err);
9756 if (local_err != NULL) {
9757 error_propagate(errp, local_err);
9758 return;
9759 }
9760 if (cpu->vcpu_id == UNASSIGNED_CPU_INDEX) {
9761 cpu->vcpu_id = cs->cpu_index;
9762 }
9763
9764 if (tcg_enabled()) {
9765 if (ppc_fixup_cpu(cpu) != 0) {
9766 error_setg(errp, "Unable to emulate selected CPU with TCG");
9767 goto unrealize;
9768 }
9769 }
9770
9771 create_ppc_opcodes(cpu, &local_err);
9772 if (local_err != NULL) {
9773 error_propagate(errp, local_err);
9774 goto unrealize;
9775 }
9776 init_ppc_proc(cpu);
9777
9778 if (pcc->insns_flags & PPC_FLOAT) {
9779 gdb_register_coprocessor(cs, gdb_get_float_reg, gdb_set_float_reg,
9780 33, "power-fpu.xml", 0);
9781 }
9782 if (pcc->insns_flags & PPC_ALTIVEC) {
9783 gdb_register_coprocessor(cs, gdb_get_avr_reg, gdb_set_avr_reg,
9784 34, "power-altivec.xml", 0);
9785 }
9786 if (pcc->insns_flags & PPC_SPE) {
9787 gdb_register_coprocessor(cs, gdb_get_spe_reg, gdb_set_spe_reg,
9788 34, "power-spe.xml", 0);
9789 }
9790 if (pcc->insns_flags2 & PPC2_VSX) {
9791 gdb_register_coprocessor(cs, gdb_get_vsx_reg, gdb_set_vsx_reg,
9792 32, "power-vsx.xml", 0);
9793 }
9794#ifndef CONFIG_USER_ONLY
9795 gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg,
9796 pcc->gdb_num_sprs, "power-spr.xml", 0);
9797#endif
9798 qemu_init_vcpu(cs);
9799
9800 pcc->parent_realize(dev, errp);
9801
9802#if defined(PPC_DUMP_CPU)
9803 {
9804 CPUPPCState *env = &cpu->env;
9805 const char *mmu_model, *excp_model, *bus_model;
9806 switch (env->mmu_model) {
9807 case POWERPC_MMU_32B:
9808 mmu_model = "PowerPC 32";
9809 break;
9810 case POWERPC_MMU_SOFT_6xx:
9811 mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
9812 break;
9813 case POWERPC_MMU_SOFT_74xx:
9814 mmu_model = "PowerPC 74xx with software driven TLBs";
9815 break;
9816 case POWERPC_MMU_SOFT_4xx:
9817 mmu_model = "PowerPC 4xx with software driven TLBs";
9818 break;
9819 case POWERPC_MMU_SOFT_4xx_Z:
9820 mmu_model = "PowerPC 4xx with software driven TLBs "
9821 "and zones protections";
9822 break;
9823 case POWERPC_MMU_REAL:
9824 mmu_model = "PowerPC real mode only";
9825 break;
9826 case POWERPC_MMU_MPC8xx:
9827 mmu_model = "PowerPC MPC8xx";
9828 break;
9829 case POWERPC_MMU_BOOKE:
9830 mmu_model = "PowerPC BookE";
9831 break;
9832 case POWERPC_MMU_BOOKE206:
9833 mmu_model = "PowerPC BookE 2.06";
9834 break;
9835 case POWERPC_MMU_601:
9836 mmu_model = "PowerPC 601";
9837 break;
9838#if defined(TARGET_PPC64)
9839 case POWERPC_MMU_64B:
9840 mmu_model = "PowerPC 64";
9841 break;
9842#endif
9843 default:
9844 mmu_model = "Unknown or invalid";
9845 break;
9846 }
9847 switch (env->excp_model) {
9848 case POWERPC_EXCP_STD:
9849 excp_model = "PowerPC";
9850 break;
9851 case POWERPC_EXCP_40x:
9852 excp_model = "PowerPC 40x";
9853 break;
9854 case POWERPC_EXCP_601:
9855 excp_model = "PowerPC 601";
9856 break;
9857 case POWERPC_EXCP_602:
9858 excp_model = "PowerPC 602";
9859 break;
9860 case POWERPC_EXCP_603:
9861 excp_model = "PowerPC 603";
9862 break;
9863 case POWERPC_EXCP_603E:
9864 excp_model = "PowerPC 603e";
9865 break;
9866 case POWERPC_EXCP_604:
9867 excp_model = "PowerPC 604";
9868 break;
9869 case POWERPC_EXCP_7x0:
9870 excp_model = "PowerPC 740/750";
9871 break;
9872 case POWERPC_EXCP_7x5:
9873 excp_model = "PowerPC 745/755";
9874 break;
9875 case POWERPC_EXCP_74xx:
9876 excp_model = "PowerPC 74xx";
9877 break;
9878 case POWERPC_EXCP_BOOKE:
9879 excp_model = "PowerPC BookE";
9880 break;
9881#if defined(TARGET_PPC64)
9882 case POWERPC_EXCP_970:
9883 excp_model = "PowerPC 970";
9884 break;
9885#endif
9886 default:
9887 excp_model = "Unknown or invalid";
9888 break;
9889 }
9890 switch (env->bus_model) {
9891 case PPC_FLAGS_INPUT_6xx:
9892 bus_model = "PowerPC 6xx";
9893 break;
9894 case PPC_FLAGS_INPUT_BookE:
9895 bus_model = "PowerPC BookE";
9896 break;
9897 case PPC_FLAGS_INPUT_405:
9898 bus_model = "PowerPC 405";
9899 break;
9900 case PPC_FLAGS_INPUT_401:
9901 bus_model = "PowerPC 401/403";
9902 break;
9903 case PPC_FLAGS_INPUT_RCPU:
9904 bus_model = "RCPU / MPC8xx";
9905 break;
9906#if defined(TARGET_PPC64)
9907 case PPC_FLAGS_INPUT_970:
9908 bus_model = "PowerPC 970";
9909 break;
9910#endif
9911 default:
9912 bus_model = "Unknown or invalid";
9913 break;
9914 }
9915 printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
9916 " MMU model : %s\n",
9917 object_class_get_name(OBJECT_CLASS(pcc)),
9918 pcc->pvr, pcc->msr_mask, mmu_model);
9919#if !defined(CONFIG_USER_ONLY)
9920 if (env->tlb.tlb6) {
9921 printf(" %d %s TLB in %d ways\n",
9922 env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
9923 env->nb_ways);
9924 }
9925#endif
9926 printf(" Exceptions model : %s\n"
9927 " Bus model : %s\n",
9928 excp_model, bus_model);
9929 printf(" MSR features :\n");
9930 if (env->flags & POWERPC_FLAG_SPE)
9931 printf(" signal processing engine enable"
9932 "\n");
9933 else if (env->flags & POWERPC_FLAG_VRE)
9934 printf(" vector processor enable\n");
9935 if (env->flags & POWERPC_FLAG_TGPR)
9936 printf(" temporary GPRs\n");
9937 else if (env->flags & POWERPC_FLAG_CE)
9938 printf(" critical input enable\n");
9939 if (env->flags & POWERPC_FLAG_SE)
9940 printf(" single-step trace mode\n");
9941 else if (env->flags & POWERPC_FLAG_DWE)
9942 printf(" debug wait enable\n");
9943 else if (env->flags & POWERPC_FLAG_UBLE)
9944 printf(" user BTB lock enable\n");
9945 if (env->flags & POWERPC_FLAG_BE)
9946 printf(" branch-step trace mode\n");
9947 else if (env->flags & POWERPC_FLAG_DE)
9948 printf(" debug interrupt enable\n");
9949 if (env->flags & POWERPC_FLAG_PX)
9950 printf(" inclusive protection\n");
9951 else if (env->flags & POWERPC_FLAG_PMM)
9952 printf(" performance monitor mark\n");
9953 if (env->flags == POWERPC_FLAG_NONE)
9954 printf(" none\n");
9955 printf(" Time-base/decrementer clock source: %s\n",
9956 env->flags & POWERPC_FLAG_RTC_CLK ? "RTC clock" : "bus clock");
9957 dump_ppc_insns(env);
9958 dump_ppc_sprs(env);
9959 fflush(stdout);
9960 }
9961#endif
9962 return;
9963
9964unrealize:
9965 cpu_exec_unrealizefn(cs);
9966}
9967
9968static void ppc_cpu_unrealize(DeviceState *dev, Error **errp)
9969{
9970 PowerPCCPU *cpu = POWERPC_CPU(dev);
9971 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
9972 CPUPPCState *env = &cpu->env;
9973 Error *local_err = NULL;
9974 opc_handler_t **table, **table_2;
9975 int i, j, k;
9976
9977 pcc->parent_unrealize(dev, &local_err);
9978 if (local_err != NULL) {
9979 error_propagate(errp, local_err);
9980 return;
9981 }
9982
9983 for (i = 0; i < PPC_CPU_OPCODES_LEN; i++) {
9984 if (env->opcodes[i] == &invalid_handler) {
9985 continue;
9986 }
9987 if (is_indirect_opcode(env->opcodes[i])) {
9988 table = ind_table(env->opcodes[i]);
9989 for (j = 0; j < PPC_CPU_INDIRECT_OPCODES_LEN; j++) {
9990 if (table[j] == &invalid_handler) {
9991 continue;
9992 }
9993 if (is_indirect_opcode(table[j])) {
9994 table_2 = ind_table(table[j]);
9995 for (k = 0; k < PPC_CPU_INDIRECT_OPCODES_LEN; k++) {
9996 if (table_2[k] != &invalid_handler &&
9997 is_indirect_opcode(table_2[k])) {
9998 g_free((opc_handler_t *)((uintptr_t)table_2[k] &
9999 ~PPC_INDIRECT));
10000 }
10001 }
10002 g_free((opc_handler_t *)((uintptr_t)table[j] &
10003 ~PPC_INDIRECT));
10004 }
10005 }
10006 g_free((opc_handler_t *)((uintptr_t)env->opcodes[i] &
10007 ~PPC_INDIRECT));
10008 }
10009 }
10010}
10011
10012static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
10013{
10014 ObjectClass *oc = (ObjectClass *)a;
10015 uint32_t pvr = *(uint32_t *)b;
10016 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
10017
10018
10019 if (unlikely(strcmp(object_class_get_name(oc),
10020 TYPE_HOST_POWERPC_CPU) == 0)) {
10021 return -1;
10022 }
10023
10024 return pcc->pvr == pvr ? 0 : -1;
10025}
10026
10027PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
10028{
10029 GSList *list, *item;
10030 PowerPCCPUClass *pcc = NULL;
10031
10032 list = object_class_get_list(TYPE_POWERPC_CPU, false);
10033 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
10034 if (item != NULL) {
10035 pcc = POWERPC_CPU_CLASS(item->data);
10036 }
10037 g_slist_free(list);
10038
10039 return pcc;
10040}
10041
10042static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b)
10043{
10044 ObjectClass *oc = (ObjectClass *)a;
10045 uint32_t pvr = *(uint32_t *)b;
10046 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
10047
10048
10049 if (unlikely(strcmp(object_class_get_name(oc),
10050 TYPE_HOST_POWERPC_CPU) == 0)) {
10051 return -1;
10052 }
10053
10054 if (pcc->pvr_match(pcc, pvr)) {
10055 return 0;
10056 }
10057
10058 return -1;
10059}
10060
10061PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr)
10062{
10063 GSList *list, *item;
10064 PowerPCCPUClass *pcc = NULL;
10065
10066 list = object_class_get_list(TYPE_POWERPC_CPU, true);
10067 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr_mask);
10068 if (item != NULL) {
10069 pcc = POWERPC_CPU_CLASS(item->data);
10070 }
10071 g_slist_free(list);
10072
10073 return pcc;
10074}
10075
10076static const char *ppc_cpu_lookup_alias(const char *alias)
10077{
10078 int ai;
10079
10080 for (ai = 0; ppc_cpu_aliases[ai].alias != NULL; ai++) {
10081 if (strcmp(ppc_cpu_aliases[ai].alias, alias) == 0) {
10082 return ppc_cpu_aliases[ai].model;
10083 }
10084 }
10085
10086 return NULL;
10087}
10088
10089static ObjectClass *ppc_cpu_class_by_name(const char *name)
10090{
10091 char *cpu_model, *typename;
10092 ObjectClass *oc;
10093 const char *p;
10094 unsigned long pvr;
10095
10096
10097
10098
10099 if (!qemu_strtoul(name, &p, 16, &pvr)) {
10100 int len = p - name;
10101 len = (len == 10) && (name[1] == 'x') ? len - 2 : len;
10102 if ((len == 8) && (*p == '\0')) {
10103 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr));
10104 }
10105 }
10106
10107 cpu_model = g_ascii_strdown(name, -1);
10108 p = ppc_cpu_lookup_alias(cpu_model);
10109 if (p) {
10110 g_free(cpu_model);
10111 cpu_model = g_strdup(p);
10112 }
10113
10114 typename = g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX, cpu_model);
10115 oc = object_class_by_name(typename);
10116 g_free(typename);
10117 g_free(cpu_model);
10118
10119 return oc;
10120}
10121
10122static void ppc_cpu_parse_featurestr(const char *type, char *features,
10123 Error **errp)
10124{
10125 Object *machine = qdev_get_machine();
10126 const PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(object_class_by_name(type));
10127
10128 if (!features) {
10129 return;
10130 }
10131
10132 if (object_property_find(machine, "max-cpu-compat", NULL)) {
10133 int i;
10134 char **inpieces;
10135 char *s = features;
10136 Error *local_err = NULL;
10137 char *compat_str = NULL;
10138
10139
10140
10141
10142
10143
10144
10145
10146
10147
10148
10149 inpieces = g_strsplit(features, ",", 0);
10150 *s = '\0';
10151 for (i = 0; inpieces[i]; i++) {
10152 if (g_str_has_prefix(inpieces[i], "compat=")) {
10153 compat_str = inpieces[i];
10154 continue;
10155 }
10156 if ((i != 0) && (s != features)) {
10157 s = g_stpcpy(s, ",");
10158 }
10159 s = g_stpcpy(s, inpieces[i]);
10160 }
10161
10162 if (compat_str) {
10163 char *v = compat_str + strlen("compat=");
10164 object_property_set_str(machine, v, "max-cpu-compat", &local_err);
10165 }
10166 g_strfreev(inpieces);
10167 if (local_err) {
10168 error_propagate(errp, local_err);
10169 return;
10170 }
10171 }
10172
10173
10174 pcc->parent_parse_features(type, features, errp);
10175}
10176
10177PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
10178{
10179 ObjectClass *oc = OBJECT_CLASS(pcc);
10180
10181 while (oc && !object_class_is_abstract(oc)) {
10182 oc = object_class_get_parent(oc);
10183 }
10184 assert(oc);
10185
10186 return POWERPC_CPU_CLASS(oc);
10187}
10188
10189
10190static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
10191{
10192 ObjectClass *oc_a = (ObjectClass *)a;
10193 ObjectClass *oc_b = (ObjectClass *)b;
10194 PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
10195 PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
10196 const char *name_a = object_class_get_name(oc_a);
10197 const char *name_b = object_class_get_name(oc_b);
10198
10199 if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
10200 return 1;
10201 } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
10202 return -1;
10203 } else {
10204
10205 if (pcc_a->pvr < pcc_b->pvr) {
10206 return -1;
10207 } else if (pcc_a->pvr > pcc_b->pvr) {
10208 return 1;
10209 } else {
10210 return 0;
10211 }
10212 }
10213}
10214
10215static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
10216{
10217 ObjectClass *oc = data;
10218 CPUListState *s = user_data;
10219 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
10220 DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
10221 const char *typename = object_class_get_name(oc);
10222 char *name;
10223 int i;
10224
10225 if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) {
10226 return;
10227 }
10228
10229 name = g_strndup(typename,
10230 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
10231 (*s->cpu_fprintf)(s->file, "PowerPC %-16s PVR %08x\n",
10232 name, pcc->pvr);
10233 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
10234 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
10235 ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
10236
10237 if (alias_oc != oc) {
10238 continue;
10239 }
10240
10241
10242
10243
10244 if (strcmp(alias->alias, family->desc) == 0) {
10245 (*s->cpu_fprintf)(s->file,
10246 "PowerPC %-16s (alias for preferred %s CPU)\n",
10247 alias->alias, family->desc);
10248 } else {
10249 (*s->cpu_fprintf)(s->file, "PowerPC %-16s (alias for %s)\n",
10250 alias->alias, name);
10251 }
10252 }
10253 g_free(name);
10254}
10255
10256void ppc_cpu_list(FILE *f, fprintf_function cpu_fprintf)
10257{
10258 CPUListState s = {
10259 .file = f,
10260 .cpu_fprintf = cpu_fprintf,
10261 };
10262 GSList *list;
10263
10264 list = object_class_get_list(TYPE_POWERPC_CPU, false);
10265 list = g_slist_sort(list, ppc_cpu_list_compare);
10266 g_slist_foreach(list, ppc_cpu_list_entry, &s);
10267 g_slist_free(list);
10268
10269#ifdef CONFIG_KVM
10270 cpu_fprintf(f, "\n");
10271 cpu_fprintf(f, "PowerPC %-16s\n", "host");
10272#endif
10273}
10274
10275static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
10276{
10277 ObjectClass *oc = data;
10278 CpuDefinitionInfoList **first = user_data;
10279 const char *typename;
10280 CpuDefinitionInfoList *entry;
10281 CpuDefinitionInfo *info;
10282
10283 typename = object_class_get_name(oc);
10284 info = g_malloc0(sizeof(*info));
10285 info->name = g_strndup(typename,
10286 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
10287
10288 entry = g_malloc0(sizeof(*entry));
10289 entry->value = info;
10290 entry->next = *first;
10291 *first = entry;
10292}
10293
10294CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
10295{
10296 CpuDefinitionInfoList *cpu_list = NULL;
10297 GSList *list;
10298 int i;
10299
10300 list = object_class_get_list(TYPE_POWERPC_CPU, false);
10301 g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
10302 g_slist_free(list);
10303
10304 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
10305 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
10306 ObjectClass *oc;
10307 CpuDefinitionInfoList *entry;
10308 CpuDefinitionInfo *info;
10309
10310 oc = ppc_cpu_class_by_name(alias->model);
10311 if (oc == NULL) {
10312 continue;
10313 }
10314
10315 info = g_malloc0(sizeof(*info));
10316 info->name = g_strdup(alias->alias);
10317 info->q_typename = g_strdup(object_class_get_name(oc));
10318
10319 entry = g_malloc0(sizeof(*entry));
10320 entry->value = info;
10321 entry->next = cpu_list;
10322 cpu_list = entry;
10323 }
10324
10325 return cpu_list;
10326}
10327
10328static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
10329{
10330 PowerPCCPU *cpu = POWERPC_CPU(cs);
10331
10332 cpu->env.nip = value;
10333}
10334
10335static bool ppc_cpu_has_work(CPUState *cs)
10336{
10337 PowerPCCPU *cpu = POWERPC_CPU(cs);
10338 CPUPPCState *env = &cpu->env;
10339
10340 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
10341}
10342
10343
10344static void ppc_cpu_reset(CPUState *s)
10345{
10346 PowerPCCPU *cpu = POWERPC_CPU(s);
10347 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
10348 CPUPPCState *env = &cpu->env;
10349 target_ulong msr;
10350 int i;
10351
10352 pcc->parent_reset(s);
10353
10354 msr = (target_ulong)0;
10355 msr |= (target_ulong)MSR_HVB;
10356 msr |= (target_ulong)0 << MSR_AP;
10357 msr |= (target_ulong)0 << MSR_SA;
10358 msr |= (target_ulong)1 << MSR_EP;
10359#if defined(DO_SINGLE_STEP) && 0
10360
10361 msr |= (target_ulong)1 << MSR_SE;
10362 msr |= (target_ulong)1 << MSR_BE;
10363#endif
10364#if defined(CONFIG_USER_ONLY)
10365 msr |= (target_ulong)1 << MSR_FP;
10366 msr |= (target_ulong)1 << MSR_FE0;
10367 msr |= (target_ulong)1 << MSR_FE1;
10368 msr |= (target_ulong)1 << MSR_VR;
10369 msr |= (target_ulong)1 << MSR_VSX;
10370 msr |= (target_ulong)1 << MSR_SPE;
10371 msr |= (target_ulong)1 << MSR_PR;
10372#if defined(TARGET_PPC64)
10373 msr |= (target_ulong)1 << MSR_TM;
10374#endif
10375#if !defined(TARGET_WORDS_BIGENDIAN)
10376 msr |= (target_ulong)1 << MSR_LE;
10377 if (!((env->msr_mask >> MSR_LE) & 1)) {
10378 fprintf(stderr, "Selected CPU does not support little-endian.\n");
10379 exit(1);
10380 }
10381#endif
10382#endif
10383
10384#if defined(TARGET_PPC64)
10385 if (env->mmu_model & POWERPC_MMU_64) {
10386 msr |= (1ULL << MSR_SF);
10387 }
10388#endif
10389
10390 hreg_store_msr(env, msr, 1);
10391
10392#if !defined(CONFIG_USER_ONLY)
10393 env->nip = env->hreset_vector | env->excp_prefix;
10394 if (env->mmu_model != POWERPC_MMU_REAL) {
10395 ppc_tlb_invalidate_all(env);
10396 }
10397#endif
10398
10399 hreg_compute_hflags(env);
10400 env->reserve_addr = (target_ulong)-1ULL;
10401
10402 env->pending_interrupts = 0;
10403 s->exception_index = POWERPC_EXCP_NONE;
10404 env->error_code = 0;
10405
10406 for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
10407 ppc_spr_t *spr = &env->spr_cb[i];
10408
10409 if (!spr->name) {
10410 continue;
10411 }
10412 env->spr[i] = spr->default_value;
10413 }
10414}
10415
10416#ifndef CONFIG_USER_ONLY
10417static bool ppc_cpu_is_big_endian(CPUState *cs)
10418{
10419 PowerPCCPU *cpu = POWERPC_CPU(cs);
10420 CPUPPCState *env = &cpu->env;
10421
10422 cpu_synchronize_state(cs);
10423
10424 return !msr_le;
10425}
10426#endif
10427
10428static void ppc_cpu_instance_init(Object *obj)
10429{
10430 CPUState *cs = CPU(obj);
10431 PowerPCCPU *cpu = POWERPC_CPU(obj);
10432 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
10433 CPUPPCState *env = &cpu->env;
10434
10435 cs->env_ptr = env;
10436 cpu->vcpu_id = UNASSIGNED_CPU_INDEX;
10437
10438 env->msr_mask = pcc->msr_mask;
10439 env->mmu_model = pcc->mmu_model;
10440 env->excp_model = pcc->excp_model;
10441 env->bus_model = pcc->bus_model;
10442 env->insns_flags = pcc->insns_flags;
10443 env->insns_flags2 = pcc->insns_flags2;
10444 env->flags = pcc->flags;
10445 env->bfd_mach = pcc->bfd_mach;
10446 env->check_pow = pcc->check_pow;
10447
10448
10449
10450
10451
10452
10453
10454
10455
10456
10457#if !defined(CONFIG_USER_ONLY)
10458 env->has_hv_mode = !!(env->msr_mask & MSR_HVB);
10459#endif
10460
10461 ppc_hash64_init(cpu);
10462}
10463
10464static void ppc_cpu_instance_finalize(Object *obj)
10465{
10466 PowerPCCPU *cpu = POWERPC_CPU(obj);
10467
10468 ppc_hash64_finalize(cpu);
10469}
10470
10471static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr)
10472{
10473 return pcc->pvr == pvr;
10474}
10475
10476static gchar *ppc_gdb_arch_name(CPUState *cs)
10477{
10478#if defined(TARGET_PPC64)
10479 return g_strdup("powerpc:common64");
10480#else
10481 return g_strdup("powerpc:common");
10482#endif
10483}
10484
10485static void ppc_disas_set_info(CPUState *cs, disassemble_info *info)
10486{
10487 PowerPCCPU *cpu = POWERPC_CPU(cs);
10488 CPUPPCState *env = &cpu->env;
10489
10490 if ((env->hflags >> MSR_LE) & 1) {
10491 info->endian = BFD_ENDIAN_LITTLE;
10492 }
10493 info->mach = env->bfd_mach;
10494 if (!env->bfd_mach) {
10495#ifdef TARGET_PPC64
10496 info->mach = bfd_mach_ppc64;
10497#else
10498 info->mach = bfd_mach_ppc;
10499#endif
10500 }
10501 info->disassembler_options = (char *)"any";
10502 info->print_insn = print_insn_ppc;
10503
10504 info->cap_arch = CS_ARCH_PPC;
10505#ifdef TARGET_PPC64
10506 info->cap_mode = CS_MODE_64;
10507#endif
10508}
10509
10510static Property ppc_cpu_properties[] = {
10511 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU, pre_2_8_migration, false),
10512 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU, pre_2_10_migration,
10513 false),
10514 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU, pre_3_0_migration,
10515 false),
10516 DEFINE_PROP_END_OF_LIST(),
10517};
10518
10519static void ppc_cpu_class_init(ObjectClass *oc, void *data)
10520{
10521 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
10522 CPUClass *cc = CPU_CLASS(oc);
10523 DeviceClass *dc = DEVICE_CLASS(oc);
10524
10525 device_class_set_parent_realize(dc, ppc_cpu_realize,
10526 &pcc->parent_realize);
10527 device_class_set_parent_unrealize(dc, ppc_cpu_unrealize,
10528 &pcc->parent_unrealize);
10529 pcc->pvr_match = ppc_pvr_match_default;
10530 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_always;
10531 dc->props = ppc_cpu_properties;
10532
10533 pcc->parent_reset = cc->reset;
10534 cc->reset = ppc_cpu_reset;
10535
10536 cc->class_by_name = ppc_cpu_class_by_name;
10537 pcc->parent_parse_features = cc->parse_features;
10538 cc->parse_features = ppc_cpu_parse_featurestr;
10539 cc->has_work = ppc_cpu_has_work;
10540 cc->do_interrupt = ppc_cpu_do_interrupt;
10541 cc->cpu_exec_interrupt = ppc_cpu_exec_interrupt;
10542 cc->dump_state = ppc_cpu_dump_state;
10543 cc->dump_statistics = ppc_cpu_dump_statistics;
10544 cc->set_pc = ppc_cpu_set_pc;
10545 cc->gdb_read_register = ppc_cpu_gdb_read_register;
10546 cc->gdb_write_register = ppc_cpu_gdb_write_register;
10547 cc->do_unaligned_access = ppc_cpu_do_unaligned_access;
10548#ifdef CONFIG_USER_ONLY
10549 cc->handle_mmu_fault = ppc_cpu_handle_mmu_fault;
10550#else
10551 cc->get_phys_page_debug = ppc_cpu_get_phys_page_debug;
10552 cc->vmsd = &vmstate_ppc_cpu;
10553#endif
10554#if defined(CONFIG_SOFTMMU)
10555 cc->write_elf64_note = ppc64_cpu_write_elf64_note;
10556 cc->write_elf32_note = ppc32_cpu_write_elf32_note;
10557#endif
10558
10559 cc->gdb_num_core_regs = 71;
10560#ifndef CONFIG_USER_ONLY
10561 cc->gdb_get_dynamic_xml = ppc_gdb_get_dynamic_xml;
10562#endif
10563#ifdef USE_APPLE_GDB
10564 cc->gdb_read_register = ppc_cpu_gdb_read_register_apple;
10565 cc->gdb_write_register = ppc_cpu_gdb_write_register_apple;
10566 cc->gdb_num_core_regs = 71 + 32;
10567#endif
10568
10569 cc->gdb_arch_name = ppc_gdb_arch_name;
10570#if defined(TARGET_PPC64)
10571 cc->gdb_core_xml_file = "power64-core.xml";
10572#else
10573 cc->gdb_core_xml_file = "power-core.xml";
10574#endif
10575#ifndef CONFIG_USER_ONLY
10576 cc->virtio_is_big_endian = ppc_cpu_is_big_endian;
10577#endif
10578#ifdef CONFIG_TCG
10579 cc->tcg_initialize = ppc_translate_init;
10580#endif
10581 cc->disas_set_info = ppc_disas_set_info;
10582
10583 dc->fw_name = "PowerPC,UNKNOWN";
10584}
10585
10586static const TypeInfo ppc_cpu_type_info = {
10587 .name = TYPE_POWERPC_CPU,
10588 .parent = TYPE_CPU,
10589 .instance_size = sizeof(PowerPCCPU),
10590 .instance_init = ppc_cpu_instance_init,
10591 .instance_finalize = ppc_cpu_instance_finalize,
10592 .abstract = true,
10593 .class_size = sizeof(PowerPCCPUClass),
10594 .class_init = ppc_cpu_class_init,
10595};
10596
10597static const TypeInfo ppc_vhyp_type_info = {
10598 .name = TYPE_PPC_VIRTUAL_HYPERVISOR,
10599 .parent = TYPE_INTERFACE,
10600 .class_size = sizeof(PPCVirtualHypervisorClass),
10601};
10602
10603static void ppc_cpu_register_types(void)
10604{
10605 type_register_static(&ppc_cpu_type_info);
10606 type_register_static(&ppc_vhyp_type_info);
10607}
10608
10609type_init(ppc_cpu_register_types)
10610