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