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