2 * PowerPC CPU initialization for qemu.
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 * Copyright 2011 Freescale Semiconductor, Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21 #include "qemu/osdep.h"
22 #include "disas/dis-asm.h"
23 #include "exec/gdbstub.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"
45 #include "helper_regs.h"
47 #include "spr_common.h"
48 #include "power8-pmu.h"
50 /* #define PPC_DEBUG_SPR */
51 /* #define USE_APPLE_GDB */
53 static inline void vscr_init(CPUPPCState
*env
, uint32_t val
)
55 /* Altivec always uses round-to-nearest */
56 set_float_rounding_mode(float_round_nearest_even
, &env
->vec_status
);
57 ppc_store_vscr(env
, val
);
60 static void register_745_sprs(CPUPPCState
*env
)
63 spr_register(env
, SPR_SPRG4
, "SPRG4",
64 SPR_NOACCESS
, SPR_NOACCESS
,
65 &spr_read_generic
, &spr_write_generic
,
67 spr_register(env
, SPR_SPRG5
, "SPRG5",
68 SPR_NOACCESS
, SPR_NOACCESS
,
69 &spr_read_generic
, &spr_write_generic
,
71 spr_register(env
, SPR_SPRG6
, "SPRG6",
72 SPR_NOACCESS
, SPR_NOACCESS
,
73 &spr_read_generic
, &spr_write_generic
,
75 spr_register(env
, SPR_SPRG7
, "SPRG7",
76 SPR_NOACCESS
, SPR_NOACCESS
,
77 &spr_read_generic
, &spr_write_generic
,
80 /* Hardware implementation registers */
81 spr_register(env
, SPR_HID0
, "HID0",
82 SPR_NOACCESS
, SPR_NOACCESS
,
83 &spr_read_generic
, &spr_write_generic
,
86 spr_register(env
, SPR_HID1
, "HID1",
87 SPR_NOACCESS
, SPR_NOACCESS
,
88 &spr_read_generic
, &spr_write_generic
,
91 spr_register(env
, SPR_HID2
, "HID2",
92 SPR_NOACCESS
, SPR_NOACCESS
,
93 &spr_read_generic
, &spr_write_generic
,
97 static void register_755_sprs(CPUPPCState
*env
)
99 /* L2 cache control */
100 spr_register(env
, SPR_L2CR
, "L2CR",
101 SPR_NOACCESS
, SPR_NOACCESS
,
102 &spr_read_generic
, spr_access_nop
,
105 spr_register(env
, SPR_L2PMCR
, "L2PMCR",
106 SPR_NOACCESS
, SPR_NOACCESS
,
107 &spr_read_generic
, &spr_write_generic
,
111 /* SPR common to all 7xx PowerPC implementations */
112 static void register_7xx_sprs(CPUPPCState
*env
)
115 spr_register_kvm(env
, SPR_DABR
, "DABR",
116 SPR_NOACCESS
, SPR_NOACCESS
,
117 &spr_read_generic
, &spr_write_generic
,
118 KVM_REG_PPC_DABR
, 0x00000000);
120 spr_register(env
, SPR_IABR
, "IABR",
121 SPR_NOACCESS
, SPR_NOACCESS
,
122 &spr_read_generic
, &spr_write_generic
,
124 /* Cache management */
125 spr_register(env
, SPR_ICTC
, "ICTC",
126 SPR_NOACCESS
, SPR_NOACCESS
,
127 &spr_read_generic
, &spr_write_generic
,
129 /* Performance monitors */
130 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
131 SPR_NOACCESS
, SPR_NOACCESS
,
132 &spr_read_generic
, &spr_write_generic
,
135 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
136 SPR_NOACCESS
, SPR_NOACCESS
,
137 &spr_read_generic
, &spr_write_generic
,
140 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
141 SPR_NOACCESS
, SPR_NOACCESS
,
142 &spr_read_generic
, &spr_write_generic
,
145 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
146 SPR_NOACCESS
, SPR_NOACCESS
,
147 &spr_read_generic
, &spr_write_generic
,
150 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
151 SPR_NOACCESS
, SPR_NOACCESS
,
152 &spr_read_generic
, &spr_write_generic
,
155 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
156 SPR_NOACCESS
, SPR_NOACCESS
,
157 &spr_read_generic
, &spr_write_generic
,
160 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
161 SPR_NOACCESS
, SPR_NOACCESS
,
162 &spr_read_generic
, SPR_NOACCESS
,
165 spr_register(env
, SPR_7XX_UMMCR0
, "UMMCR0",
166 &spr_read_ureg
, SPR_NOACCESS
,
167 &spr_read_ureg
, SPR_NOACCESS
,
170 spr_register(env
, SPR_7XX_UMMCR1
, "UMMCR1",
171 &spr_read_ureg
, SPR_NOACCESS
,
172 &spr_read_ureg
, SPR_NOACCESS
,
175 spr_register(env
, SPR_7XX_UPMC1
, "UPMC1",
176 &spr_read_ureg
, SPR_NOACCESS
,
177 &spr_read_ureg
, SPR_NOACCESS
,
180 spr_register(env
, SPR_7XX_UPMC2
, "UPMC2",
181 &spr_read_ureg
, SPR_NOACCESS
,
182 &spr_read_ureg
, SPR_NOACCESS
,
185 spr_register(env
, SPR_7XX_UPMC3
, "UPMC3",
186 &spr_read_ureg
, SPR_NOACCESS
,
187 &spr_read_ureg
, SPR_NOACCESS
,
190 spr_register(env
, SPR_7XX_UPMC4
, "UPMC4",
191 &spr_read_ureg
, SPR_NOACCESS
,
192 &spr_read_ureg
, SPR_NOACCESS
,
195 spr_register(env
, SPR_7XX_USIAR
, "USIAR",
196 &spr_read_ureg
, SPR_NOACCESS
,
197 &spr_read_ureg
, SPR_NOACCESS
,
199 /* External access control */
200 spr_register(env
, SPR_EAR
, "EAR",
201 SPR_NOACCESS
, SPR_NOACCESS
,
202 &spr_read_generic
, &spr_write_generic
,
205 /* Hardware implementation registers */
206 spr_register(env
, SPR_HID0
, "HID0",
207 SPR_NOACCESS
, SPR_NOACCESS
,
208 &spr_read_generic
, &spr_write_generic
,
211 spr_register(env
, SPR_HID1
, "HID1",
212 SPR_NOACCESS
, SPR_NOACCESS
,
213 &spr_read_generic
, &spr_write_generic
,
218 static void register_amr_sprs(CPUPPCState
*env
)
220 #ifndef CONFIG_USER_ONLY
222 * Virtual Page Class Key protection
224 * The AMR is accessible either via SPR 13 or SPR 29. 13 is
225 * userspace accessible, 29 is privileged. So we only need to set
226 * the kvm ONE_REG id on one of them, we use 29
228 spr_register(env
, SPR_UAMR
, "UAMR",
229 &spr_read_generic
, &spr_write_amr
,
230 &spr_read_generic
, &spr_write_amr
,
232 spr_register_kvm_hv(env
, SPR_AMR
, "AMR",
233 SPR_NOACCESS
, SPR_NOACCESS
,
234 &spr_read_generic
, &spr_write_amr
,
235 &spr_read_generic
, &spr_write_generic
,
237 spr_register_kvm_hv(env
, SPR_UAMOR
, "UAMOR",
238 SPR_NOACCESS
, SPR_NOACCESS
,
239 &spr_read_generic
, &spr_write_uamor
,
240 &spr_read_generic
, &spr_write_generic
,
241 KVM_REG_PPC_UAMOR
, 0);
242 spr_register_hv(env
, SPR_AMOR
, "AMOR",
243 SPR_NOACCESS
, SPR_NOACCESS
,
244 SPR_NOACCESS
, SPR_NOACCESS
,
245 &spr_read_generic
, &spr_write_generic
,
247 #endif /* !CONFIG_USER_ONLY */
250 static void register_iamr_sprs(CPUPPCState
*env
)
252 #ifndef CONFIG_USER_ONLY
253 spr_register_kvm_hv(env
, SPR_IAMR
, "IAMR",
254 SPR_NOACCESS
, SPR_NOACCESS
,
255 &spr_read_generic
, &spr_write_iamr
,
256 &spr_read_generic
, &spr_write_generic
,
257 KVM_REG_PPC_IAMR
, 0);
258 #endif /* !CONFIG_USER_ONLY */
260 #endif /* TARGET_PPC64 */
262 /* SPR specific to PowerPC 604 implementation */
263 static void register_604_sprs(CPUPPCState
*env
)
265 /* Processor identification */
266 spr_register(env
, SPR_PIR
, "PIR",
267 SPR_NOACCESS
, SPR_NOACCESS
,
268 &spr_read_generic
, &spr_write_pir
,
271 spr_register(env
, SPR_IABR
, "IABR",
272 SPR_NOACCESS
, SPR_NOACCESS
,
273 &spr_read_generic
, &spr_write_generic
,
276 spr_register_kvm(env
, SPR_DABR
, "DABR",
277 SPR_NOACCESS
, SPR_NOACCESS
,
278 &spr_read_generic
, &spr_write_generic
,
279 KVM_REG_PPC_DABR
, 0x00000000);
280 /* Performance counters */
281 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
282 SPR_NOACCESS
, SPR_NOACCESS
,
283 &spr_read_generic
, &spr_write_generic
,
286 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
287 SPR_NOACCESS
, SPR_NOACCESS
,
288 &spr_read_generic
, &spr_write_generic
,
291 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
292 SPR_NOACCESS
, SPR_NOACCESS
,
293 &spr_read_generic
, &spr_write_generic
,
296 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
297 SPR_NOACCESS
, SPR_NOACCESS
,
298 &spr_read_generic
, SPR_NOACCESS
,
301 spr_register(env
, SPR_SDA
, "SDA",
302 SPR_NOACCESS
, SPR_NOACCESS
,
303 &spr_read_generic
, SPR_NOACCESS
,
305 /* External access control */
306 spr_register(env
, SPR_EAR
, "EAR",
307 SPR_NOACCESS
, SPR_NOACCESS
,
308 &spr_read_generic
, &spr_write_generic
,
311 /* Hardware implementation registers */
312 spr_register(env
, SPR_HID0
, "HID0",
313 SPR_NOACCESS
, SPR_NOACCESS
,
314 &spr_read_generic
, &spr_write_generic
,
318 static void register_604e_sprs(CPUPPCState
*env
)
320 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
321 SPR_NOACCESS
, SPR_NOACCESS
,
322 &spr_read_generic
, &spr_write_generic
,
325 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
326 SPR_NOACCESS
, SPR_NOACCESS
,
327 &spr_read_generic
, &spr_write_generic
,
330 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
331 SPR_NOACCESS
, SPR_NOACCESS
,
332 &spr_read_generic
, &spr_write_generic
,
334 /* Hardware implementation registers */
335 spr_register(env
, SPR_HID1
, "HID1",
336 SPR_NOACCESS
, SPR_NOACCESS
,
337 &spr_read_generic
, &spr_write_generic
,
341 /* SPR specific to PowerPC 603 implementation */
342 static void register_603_sprs(CPUPPCState
*env
)
344 /* External access control */
345 spr_register(env
, SPR_EAR
, "EAR",
346 SPR_NOACCESS
, SPR_NOACCESS
,
347 &spr_read_generic
, &spr_write_generic
,
350 spr_register(env
, SPR_IABR
, "IABR",
351 SPR_NOACCESS
, SPR_NOACCESS
,
352 &spr_read_generic
, &spr_write_generic
,
355 spr_register(env
, SPR_HID0
, "HID0",
356 SPR_NOACCESS
, SPR_NOACCESS
,
357 &spr_read_generic
, &spr_write_generic
,
360 spr_register(env
, SPR_HID1
, "HID1",
361 SPR_NOACCESS
, SPR_NOACCESS
,
362 &spr_read_generic
, &spr_write_generic
,
366 static void register_e300_sprs(CPUPPCState
*env
)
368 /* hardware implementation registers */
369 spr_register(env
, SPR_HID2
, "HID2",
370 SPR_NOACCESS
, SPR_NOACCESS
,
371 &spr_read_generic
, &spr_write_generic
,
374 spr_register(env
, SPR_DABR
, "DABR",
375 SPR_NOACCESS
, SPR_NOACCESS
,
376 &spr_read_generic
, &spr_write_generic
,
379 spr_register(env
, SPR_DABR2
, "DABR2",
380 SPR_NOACCESS
, SPR_NOACCESS
,
381 &spr_read_generic
, &spr_write_generic
,
384 spr_register(env
, SPR_IABR2
, "IABR2",
385 SPR_NOACCESS
, SPR_NOACCESS
,
386 &spr_read_generic
, &spr_write_generic
,
389 spr_register(env
, SPR_IBCR
, "IBCR",
390 SPR_NOACCESS
, SPR_NOACCESS
,
391 &spr_read_generic
, &spr_write_generic
,
394 spr_register(env
, SPR_DBCR
, "DBCR",
395 SPR_NOACCESS
, SPR_NOACCESS
,
396 &spr_read_generic
, &spr_write_generic
,
400 /* SPR specific to PowerPC G2 implementation */
401 static void register_G2_sprs(CPUPPCState
*env
)
403 /* Memory base address */
405 spr_register(env
, SPR_MBAR
, "MBAR",
406 SPR_NOACCESS
, SPR_NOACCESS
,
407 &spr_read_generic
, &spr_write_generic
,
409 /* Exception processing */
410 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
411 SPR_NOACCESS
, SPR_NOACCESS
,
412 &spr_read_generic
, &spr_write_generic
,
414 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
415 SPR_NOACCESS
, SPR_NOACCESS
,
416 &spr_read_generic
, &spr_write_generic
,
419 spr_register(env
, SPR_DABR
, "DABR",
420 SPR_NOACCESS
, SPR_NOACCESS
,
421 &spr_read_generic
, &spr_write_generic
,
424 spr_register(env
, SPR_DABR2
, "DABR2",
425 SPR_NOACCESS
, SPR_NOACCESS
,
426 &spr_read_generic
, &spr_write_generic
,
429 spr_register(env
, SPR_IABR
, "IABR",
430 SPR_NOACCESS
, SPR_NOACCESS
,
431 &spr_read_generic
, &spr_write_generic
,
434 spr_register(env
, SPR_IABR2
, "IABR2",
435 SPR_NOACCESS
, SPR_NOACCESS
,
436 &spr_read_generic
, &spr_write_generic
,
439 spr_register(env
, SPR_IBCR
, "IBCR",
440 SPR_NOACCESS
, SPR_NOACCESS
,
441 &spr_read_generic
, &spr_write_generic
,
444 spr_register(env
, SPR_DBCR
, "DBCR",
445 SPR_NOACCESS
, SPR_NOACCESS
,
446 &spr_read_generic
, &spr_write_generic
,
449 /* External access control */
450 spr_register(env
, SPR_EAR
, "EAR",
451 SPR_NOACCESS
, SPR_NOACCESS
,
452 &spr_read_generic
, &spr_write_generic
,
454 /* Hardware implementation register */
455 spr_register(env
, SPR_HID0
, "HID0",
456 SPR_NOACCESS
, SPR_NOACCESS
,
457 &spr_read_generic
, &spr_write_generic
,
460 spr_register(env
, SPR_HID1
, "HID1",
461 SPR_NOACCESS
, SPR_NOACCESS
,
462 &spr_read_generic
, &spr_write_generic
,
465 spr_register(env
, SPR_HID2
, "HID2",
466 SPR_NOACCESS
, SPR_NOACCESS
,
467 &spr_read_generic
, &spr_write_generic
,
471 spr_register(env
, SPR_SPRG4
, "SPRG4",
472 SPR_NOACCESS
, SPR_NOACCESS
,
473 &spr_read_generic
, &spr_write_generic
,
475 spr_register(env
, SPR_SPRG5
, "SPRG5",
476 SPR_NOACCESS
, SPR_NOACCESS
,
477 &spr_read_generic
, &spr_write_generic
,
479 spr_register(env
, SPR_SPRG6
, "SPRG6",
480 SPR_NOACCESS
, SPR_NOACCESS
,
481 &spr_read_generic
, &spr_write_generic
,
483 spr_register(env
, SPR_SPRG7
, "SPRG7",
484 SPR_NOACCESS
, SPR_NOACCESS
,
485 &spr_read_generic
, &spr_write_generic
,
489 static void register_74xx_sprs(CPUPPCState
*env
)
492 spr_register_kvm(env
, SPR_DABR
, "DABR",
493 SPR_NOACCESS
, SPR_NOACCESS
,
494 &spr_read_generic
, &spr_write_generic
,
495 KVM_REG_PPC_DABR
, 0x00000000);
497 spr_register(env
, SPR_IABR
, "IABR",
498 SPR_NOACCESS
, SPR_NOACCESS
,
499 &spr_read_generic
, &spr_write_generic
,
501 /* Cache management */
502 spr_register(env
, SPR_ICTC
, "ICTC",
503 SPR_NOACCESS
, SPR_NOACCESS
,
504 &spr_read_generic
, &spr_write_generic
,
506 /* Performance monitors */
507 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
508 SPR_NOACCESS
, SPR_NOACCESS
,
509 &spr_read_generic
, &spr_write_generic
,
512 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
513 SPR_NOACCESS
, SPR_NOACCESS
,
514 &spr_read_generic
, &spr_write_generic
,
517 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
518 SPR_NOACCESS
, SPR_NOACCESS
,
519 &spr_read_generic
, &spr_write_generic
,
522 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
523 SPR_NOACCESS
, SPR_NOACCESS
,
524 &spr_read_generic
, &spr_write_generic
,
527 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
528 SPR_NOACCESS
, SPR_NOACCESS
,
529 &spr_read_generic
, &spr_write_generic
,
532 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
533 SPR_NOACCESS
, SPR_NOACCESS
,
534 &spr_read_generic
, &spr_write_generic
,
537 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
538 SPR_NOACCESS
, SPR_NOACCESS
,
539 &spr_read_generic
, SPR_NOACCESS
,
542 spr_register(env
, SPR_7XX_UMMCR0
, "UMMCR0",
543 &spr_read_ureg
, SPR_NOACCESS
,
544 &spr_read_ureg
, SPR_NOACCESS
,
547 spr_register(env
, SPR_7XX_UMMCR1
, "UMMCR1",
548 &spr_read_ureg
, SPR_NOACCESS
,
549 &spr_read_ureg
, SPR_NOACCESS
,
552 spr_register(env
, SPR_7XX_UPMC1
, "UPMC1",
553 &spr_read_ureg
, SPR_NOACCESS
,
554 &spr_read_ureg
, SPR_NOACCESS
,
557 spr_register(env
, SPR_7XX_UPMC2
, "UPMC2",
558 &spr_read_ureg
, SPR_NOACCESS
,
559 &spr_read_ureg
, SPR_NOACCESS
,
562 spr_register(env
, SPR_7XX_UPMC3
, "UPMC3",
563 &spr_read_ureg
, SPR_NOACCESS
,
564 &spr_read_ureg
, SPR_NOACCESS
,
567 spr_register(env
, SPR_7XX_UPMC4
, "UPMC4",
568 &spr_read_ureg
, SPR_NOACCESS
,
569 &spr_read_ureg
, SPR_NOACCESS
,
572 spr_register(env
, SPR_7XX_USIAR
, "USIAR",
573 &spr_read_ureg
, SPR_NOACCESS
,
574 &spr_read_ureg
, SPR_NOACCESS
,
576 /* External access control */
577 spr_register(env
, SPR_EAR
, "EAR",
578 SPR_NOACCESS
, SPR_NOACCESS
,
579 &spr_read_generic
, &spr_write_generic
,
582 /* Processor identification */
583 spr_register(env
, SPR_PIR
, "PIR",
584 SPR_NOACCESS
, SPR_NOACCESS
,
585 &spr_read_generic
, &spr_write_pir
,
588 spr_register(env
, SPR_74XX_MMCR2
, "MMCR2",
589 SPR_NOACCESS
, SPR_NOACCESS
,
590 &spr_read_generic
, &spr_write_generic
,
593 spr_register(env
, SPR_74XX_UMMCR2
, "UMMCR2",
594 &spr_read_ureg
, SPR_NOACCESS
,
595 &spr_read_ureg
, SPR_NOACCESS
,
598 spr_register(env
, SPR_BAMR
, "BAMR",
599 SPR_NOACCESS
, SPR_NOACCESS
,
600 &spr_read_generic
, &spr_write_generic
,
603 spr_register(env
, SPR_MSSCR0
, "MSSCR0",
604 SPR_NOACCESS
, SPR_NOACCESS
,
605 &spr_read_generic
, &spr_write_generic
,
607 /* Hardware implementation registers */
608 spr_register(env
, SPR_HID0
, "HID0",
609 SPR_NOACCESS
, SPR_NOACCESS
,
610 &spr_read_generic
, &spr_write_generic
,
613 spr_register(env
, SPR_HID1
, "HID1",
614 SPR_NOACCESS
, SPR_NOACCESS
,
615 &spr_read_generic
, &spr_write_generic
,
618 spr_register(env
, SPR_VRSAVE
, "VRSAVE",
619 &spr_read_generic
, &spr_write_generic
,
620 &spr_read_generic
, &spr_write_generic
,
623 spr_register(env
, SPR_L2CR
, "L2CR",
624 SPR_NOACCESS
, SPR_NOACCESS
,
625 &spr_read_generic
, spr_access_nop
,
629 static void register_l3_ctrl(CPUPPCState
*env
)
632 spr_register(env
, SPR_L3CR
, "L3CR",
633 SPR_NOACCESS
, SPR_NOACCESS
,
634 &spr_read_generic
, &spr_write_generic
,
637 spr_register(env
, SPR_L3ITCR0
, "L3ITCR0",
638 SPR_NOACCESS
, SPR_NOACCESS
,
639 &spr_read_generic
, &spr_write_generic
,
642 spr_register(env
, SPR_L3PM
, "L3PM",
643 SPR_NOACCESS
, SPR_NOACCESS
,
644 &spr_read_generic
, &spr_write_generic
,
648 /* PowerPC BookE SPR */
649 static void register_BookE_sprs(CPUPPCState
*env
, uint64_t ivor_mask
)
651 const char *ivor_names
[64] = {
652 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
653 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
654 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
655 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
656 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
657 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
658 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
659 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
660 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
661 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
662 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
663 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
664 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
665 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
666 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
667 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
669 #define SPR_BOOKE_IVORxx (-1)
670 int ivor_sprn
[64] = {
671 SPR_BOOKE_IVOR0
, SPR_BOOKE_IVOR1
, SPR_BOOKE_IVOR2
, SPR_BOOKE_IVOR3
,
672 SPR_BOOKE_IVOR4
, SPR_BOOKE_IVOR5
, SPR_BOOKE_IVOR6
, SPR_BOOKE_IVOR7
,
673 SPR_BOOKE_IVOR8
, SPR_BOOKE_IVOR9
, SPR_BOOKE_IVOR10
, SPR_BOOKE_IVOR11
,
674 SPR_BOOKE_IVOR12
, SPR_BOOKE_IVOR13
, SPR_BOOKE_IVOR14
, SPR_BOOKE_IVOR15
,
675 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
676 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
677 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
678 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
679 SPR_BOOKE_IVOR32
, SPR_BOOKE_IVOR33
, SPR_BOOKE_IVOR34
, SPR_BOOKE_IVOR35
,
680 SPR_BOOKE_IVOR36
, SPR_BOOKE_IVOR37
, SPR_BOOKE_IVOR38
, SPR_BOOKE_IVOR39
,
681 SPR_BOOKE_IVOR40
, SPR_BOOKE_IVOR41
, SPR_BOOKE_IVOR42
, SPR_BOOKE_IVORxx
,
682 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
683 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
684 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
685 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
686 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
690 /* Interrupt processing */
691 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
692 SPR_NOACCESS
, SPR_NOACCESS
,
693 &spr_read_generic
, &spr_write_generic
,
695 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
696 SPR_NOACCESS
, SPR_NOACCESS
,
697 &spr_read_generic
, &spr_write_generic
,
700 spr_register(env
, SPR_BOOKE_IAC1
, "IAC1",
701 SPR_NOACCESS
, SPR_NOACCESS
,
702 &spr_read_generic
, &spr_write_generic
,
705 spr_register(env
, SPR_BOOKE_IAC2
, "IAC2",
706 SPR_NOACCESS
, SPR_NOACCESS
,
707 &spr_read_generic
, &spr_write_generic
,
710 spr_register(env
, SPR_BOOKE_DAC1
, "DAC1",
711 SPR_NOACCESS
, SPR_NOACCESS
,
712 &spr_read_generic
, &spr_write_generic
,
715 spr_register(env
, SPR_BOOKE_DAC2
, "DAC2",
716 SPR_NOACCESS
, SPR_NOACCESS
,
717 &spr_read_generic
, &spr_write_generic
,
720 spr_register(env
, SPR_BOOKE_DBCR0
, "DBCR0",
721 SPR_NOACCESS
, SPR_NOACCESS
,
722 &spr_read_generic
, &spr_write_40x_dbcr0
,
725 spr_register(env
, SPR_BOOKE_DBCR1
, "DBCR1",
726 SPR_NOACCESS
, SPR_NOACCESS
,
727 &spr_read_generic
, &spr_write_generic
,
730 spr_register(env
, SPR_BOOKE_DBCR2
, "DBCR2",
731 SPR_NOACCESS
, SPR_NOACCESS
,
732 &spr_read_generic
, &spr_write_generic
,
734 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
735 SPR_NOACCESS
, SPR_NOACCESS
,
736 &spr_read_generic
, &spr_write_generic
,
738 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
739 SPR_NOACCESS
, SPR_NOACCESS
,
740 &spr_read_generic
, &spr_write_generic
,
743 spr_register(env
, SPR_BOOKE_DBSR
, "DBSR",
744 SPR_NOACCESS
, SPR_NOACCESS
,
745 &spr_read_generic
, &spr_write_clear
,
747 spr_register(env
, SPR_BOOKE_DEAR
, "DEAR",
748 SPR_NOACCESS
, SPR_NOACCESS
,
749 &spr_read_generic
, &spr_write_generic
,
751 spr_register(env
, SPR_BOOKE_ESR
, "ESR",
752 SPR_NOACCESS
, SPR_NOACCESS
,
753 &spr_read_generic
, &spr_write_generic
,
755 spr_register(env
, SPR_BOOKE_IVPR
, "IVPR",
756 SPR_NOACCESS
, SPR_NOACCESS
,
757 &spr_read_generic
, &spr_write_excp_prefix
,
759 /* Exception vectors */
760 for (i
= 0; i
< 64; i
++) {
761 if (ivor_mask
& (1ULL << i
)) {
762 if (ivor_sprn
[i
] == SPR_BOOKE_IVORxx
) {
763 fprintf(stderr
, "ERROR: IVOR %d SPR is not defined\n", i
);
766 spr_register(env
, ivor_sprn
[i
], ivor_names
[i
],
767 SPR_NOACCESS
, SPR_NOACCESS
,
768 &spr_read_generic
, &spr_write_excp_vector
,
772 spr_register(env
, SPR_BOOKE_PID
, "PID",
773 SPR_NOACCESS
, SPR_NOACCESS
,
774 &spr_read_generic
, &spr_write_booke_pid
,
776 spr_register(env
, SPR_BOOKE_TCR
, "TCR",
777 SPR_NOACCESS
, SPR_NOACCESS
,
778 &spr_read_generic
, &spr_write_booke_tcr
,
780 spr_register(env
, SPR_BOOKE_TSR
, "TSR",
781 SPR_NOACCESS
, SPR_NOACCESS
,
782 &spr_read_generic
, &spr_write_booke_tsr
,
785 spr_register(env
, SPR_DECR
, "DECR",
786 SPR_NOACCESS
, SPR_NOACCESS
,
787 &spr_read_decr
, &spr_write_decr
,
789 spr_register(env
, SPR_BOOKE_DECAR
, "DECAR",
790 SPR_NOACCESS
, SPR_NOACCESS
,
791 SPR_NOACCESS
, &spr_write_generic
,
794 spr_register(env
, SPR_USPRG0
, "USPRG0",
795 &spr_read_generic
, &spr_write_generic
,
796 &spr_read_generic
, &spr_write_generic
,
798 spr_register(env
, SPR_SPRG4
, "SPRG4",
799 SPR_NOACCESS
, SPR_NOACCESS
,
800 &spr_read_generic
, &spr_write_generic
,
802 spr_register(env
, SPR_SPRG5
, "SPRG5",
803 SPR_NOACCESS
, SPR_NOACCESS
,
804 &spr_read_generic
, &spr_write_generic
,
806 spr_register(env
, SPR_SPRG6
, "SPRG6",
807 SPR_NOACCESS
, SPR_NOACCESS
,
808 &spr_read_generic
, &spr_write_generic
,
810 spr_register(env
, SPR_SPRG7
, "SPRG7",
811 SPR_NOACCESS
, SPR_NOACCESS
,
812 &spr_read_generic
, &spr_write_generic
,
814 spr_register(env
, SPR_BOOKE_SPRG8
, "SPRG8",
815 SPR_NOACCESS
, SPR_NOACCESS
,
816 &spr_read_generic
, &spr_write_generic
,
818 spr_register(env
, SPR_BOOKE_SPRG9
, "SPRG9",
819 SPR_NOACCESS
, SPR_NOACCESS
,
820 &spr_read_generic
, &spr_write_generic
,
824 #if !defined(CONFIG_USER_ONLY)
825 static inline uint32_t register_tlbncfg(uint32_t assoc
, uint32_t minsize
,
826 uint32_t maxsize
, uint32_t flags
,
829 return (assoc
<< TLBnCFG_ASSOC_SHIFT
) |
830 (minsize
<< TLBnCFG_MINSIZE_SHIFT
) |
831 (maxsize
<< TLBnCFG_MAXSIZE_SHIFT
) |
834 #endif /* !CONFIG_USER_ONLY */
836 /* BookE 2.06 storage control registers */
837 static void register_BookE206_sprs(CPUPPCState
*env
, uint32_t mas_mask
,
838 uint32_t *tlbncfg
, uint32_t mmucfg
)
840 #if !defined(CONFIG_USER_ONLY)
841 const char *mas_names
[8] = {
842 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
845 SPR_BOOKE_MAS0
, SPR_BOOKE_MAS1
, SPR_BOOKE_MAS2
, SPR_BOOKE_MAS3
,
846 SPR_BOOKE_MAS4
, SPR_BOOKE_MAS5
, SPR_BOOKE_MAS6
, SPR_BOOKE_MAS7
,
850 /* TLB assist registers */
851 for (i
= 0; i
< 8; i
++) {
852 if (mas_mask
& (1 << i
)) {
853 spr_register(env
, mas_sprn
[i
], mas_names
[i
],
854 SPR_NOACCESS
, SPR_NOACCESS
,
856 (i
== 2 && (env
->insns_flags
& PPC_64B
))
857 ? &spr_write_generic
: &spr_write_generic32
,
861 if (env
->nb_pids
> 1) {
862 spr_register(env
, SPR_BOOKE_PID1
, "PID1",
863 SPR_NOACCESS
, SPR_NOACCESS
,
864 &spr_read_generic
, &spr_write_booke_pid
,
867 if (env
->nb_pids
> 2) {
868 spr_register(env
, SPR_BOOKE_PID2
, "PID2",
869 SPR_NOACCESS
, SPR_NOACCESS
,
870 &spr_read_generic
, &spr_write_booke_pid
,
874 spr_register(env
, SPR_BOOKE_EPLC
, "EPLC",
875 SPR_NOACCESS
, SPR_NOACCESS
,
876 &spr_read_generic
, &spr_write_eplc
,
878 spr_register(env
, SPR_BOOKE_EPSC
, "EPSC",
879 SPR_NOACCESS
, SPR_NOACCESS
,
880 &spr_read_generic
, &spr_write_epsc
,
883 spr_register(env
, SPR_MMUCFG
, "MMUCFG",
884 SPR_NOACCESS
, SPR_NOACCESS
,
885 &spr_read_generic
, SPR_NOACCESS
,
887 switch (env
->nb_ways
) {
889 spr_register(env
, SPR_BOOKE_TLB3CFG
, "TLB3CFG",
890 SPR_NOACCESS
, SPR_NOACCESS
,
891 &spr_read_generic
, SPR_NOACCESS
,
895 spr_register(env
, SPR_BOOKE_TLB2CFG
, "TLB2CFG",
896 SPR_NOACCESS
, SPR_NOACCESS
,
897 &spr_read_generic
, SPR_NOACCESS
,
901 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
902 SPR_NOACCESS
, SPR_NOACCESS
,
903 &spr_read_generic
, SPR_NOACCESS
,
907 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
908 SPR_NOACCESS
, SPR_NOACCESS
,
909 &spr_read_generic
, SPR_NOACCESS
,
919 /* SPR specific to PowerPC 440 implementation */
920 static void register_440_sprs(CPUPPCState
*env
)
923 spr_register(env
, SPR_440_DNV0
, "DNV0",
924 SPR_NOACCESS
, SPR_NOACCESS
,
925 &spr_read_generic
, &spr_write_generic
,
928 spr_register(env
, SPR_440_DNV1
, "DNV1",
929 SPR_NOACCESS
, SPR_NOACCESS
,
930 &spr_read_generic
, &spr_write_generic
,
933 spr_register(env
, SPR_440_DNV2
, "DNV2",
934 SPR_NOACCESS
, SPR_NOACCESS
,
935 &spr_read_generic
, &spr_write_generic
,
938 spr_register(env
, SPR_440_DNV3
, "DNV3",
939 SPR_NOACCESS
, SPR_NOACCESS
,
940 &spr_read_generic
, &spr_write_generic
,
943 spr_register(env
, SPR_440_DTV0
, "DTV0",
944 SPR_NOACCESS
, SPR_NOACCESS
,
945 &spr_read_generic
, &spr_write_generic
,
948 spr_register(env
, SPR_440_DTV1
, "DTV1",
949 SPR_NOACCESS
, SPR_NOACCESS
,
950 &spr_read_generic
, &spr_write_generic
,
953 spr_register(env
, SPR_440_DTV2
, "DTV2",
954 SPR_NOACCESS
, SPR_NOACCESS
,
955 &spr_read_generic
, &spr_write_generic
,
958 spr_register(env
, SPR_440_DTV3
, "DTV3",
959 SPR_NOACCESS
, SPR_NOACCESS
,
960 &spr_read_generic
, &spr_write_generic
,
963 spr_register(env
, SPR_440_DVLIM
, "DVLIM",
964 SPR_NOACCESS
, SPR_NOACCESS
,
965 &spr_read_generic
, &spr_write_generic
,
968 spr_register(env
, SPR_440_INV0
, "INV0",
969 SPR_NOACCESS
, SPR_NOACCESS
,
970 &spr_read_generic
, &spr_write_generic
,
973 spr_register(env
, SPR_440_INV1
, "INV1",
974 SPR_NOACCESS
, SPR_NOACCESS
,
975 &spr_read_generic
, &spr_write_generic
,
978 spr_register(env
, SPR_440_INV2
, "INV2",
979 SPR_NOACCESS
, SPR_NOACCESS
,
980 &spr_read_generic
, &spr_write_generic
,
983 spr_register(env
, SPR_440_INV3
, "INV3",
984 SPR_NOACCESS
, SPR_NOACCESS
,
985 &spr_read_generic
, &spr_write_generic
,
988 spr_register(env
, SPR_440_ITV0
, "ITV0",
989 SPR_NOACCESS
, SPR_NOACCESS
,
990 &spr_read_generic
, &spr_write_generic
,
993 spr_register(env
, SPR_440_ITV1
, "ITV1",
994 SPR_NOACCESS
, SPR_NOACCESS
,
995 &spr_read_generic
, &spr_write_generic
,
998 spr_register(env
, SPR_440_ITV2
, "ITV2",
999 SPR_NOACCESS
, SPR_NOACCESS
,
1000 &spr_read_generic
, &spr_write_generic
,
1003 spr_register(env
, SPR_440_ITV3
, "ITV3",
1004 SPR_NOACCESS
, SPR_NOACCESS
,
1005 &spr_read_generic
, &spr_write_generic
,
1008 spr_register(env
, SPR_440_IVLIM
, "IVLIM",
1009 SPR_NOACCESS
, SPR_NOACCESS
,
1010 &spr_read_generic
, &spr_write_generic
,
1013 spr_register(env
, SPR_BOOKE_DCDBTRH
, "DCDBTRH",
1014 SPR_NOACCESS
, SPR_NOACCESS
,
1015 &spr_read_generic
, SPR_NOACCESS
,
1018 spr_register(env
, SPR_BOOKE_DCDBTRL
, "DCDBTRL",
1019 SPR_NOACCESS
, SPR_NOACCESS
,
1020 &spr_read_generic
, SPR_NOACCESS
,
1023 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1024 SPR_NOACCESS
, SPR_NOACCESS
,
1025 &spr_read_generic
, SPR_NOACCESS
,
1028 spr_register(env
, SPR_BOOKE_ICDBTRH
, "ICDBTRH",
1029 SPR_NOACCESS
, SPR_NOACCESS
,
1030 &spr_read_generic
, SPR_NOACCESS
,
1033 spr_register(env
, SPR_BOOKE_ICDBTRL
, "ICDBTRL",
1034 SPR_NOACCESS
, SPR_NOACCESS
,
1035 &spr_read_generic
, SPR_NOACCESS
,
1038 spr_register(env
, SPR_440_DBDR
, "DBDR",
1039 SPR_NOACCESS
, SPR_NOACCESS
,
1040 &spr_read_generic
, &spr_write_generic
,
1042 /* Processor control */
1043 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1044 SPR_NOACCESS
, SPR_NOACCESS
,
1045 &spr_read_generic
, &spr_write_generic
,
1047 spr_register(env
, SPR_440_RSTCFG
, "RSTCFG",
1048 SPR_NOACCESS
, SPR_NOACCESS
,
1049 &spr_read_generic
, SPR_NOACCESS
,
1051 /* Storage control */
1052 spr_register(env
, SPR_440_MMUCR
, "MMUCR",
1053 SPR_NOACCESS
, SPR_NOACCESS
,
1054 &spr_read_generic
, &spr_write_generic
,
1057 /* Processor identification */
1058 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
1059 SPR_NOACCESS
, SPR_NOACCESS
,
1060 &spr_read_generic
, &spr_write_pir
,
1063 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
1064 SPR_NOACCESS
, SPR_NOACCESS
,
1065 &spr_read_generic
, &spr_write_generic
,
1068 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
1069 SPR_NOACCESS
, SPR_NOACCESS
,
1070 &spr_read_generic
, &spr_write_generic
,
1073 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
1074 SPR_NOACCESS
, SPR_NOACCESS
,
1075 &spr_read_generic
, &spr_write_generic
,
1078 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
1079 SPR_NOACCESS
, SPR_NOACCESS
,
1080 &spr_read_generic
, &spr_write_generic
,
1084 /* SPR shared between PowerPC 40x implementations */
1085 static void register_40x_sprs(CPUPPCState
*env
)
1088 /* not emulated, as QEMU do not emulate caches */
1089 spr_register(env
, SPR_40x_DCCR
, "DCCR",
1090 SPR_NOACCESS
, SPR_NOACCESS
,
1091 &spr_read_generic
, &spr_write_generic
,
1093 /* not emulated, as QEMU do not emulate caches */
1094 spr_register(env
, SPR_40x_ICCR
, "ICCR",
1095 SPR_NOACCESS
, SPR_NOACCESS
,
1096 &spr_read_generic
, &spr_write_generic
,
1098 /* not emulated, as QEMU do not emulate caches */
1099 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1100 SPR_NOACCESS
, SPR_NOACCESS
,
1101 &spr_read_generic
, SPR_NOACCESS
,
1104 spr_register(env
, SPR_40x_DEAR
, "DEAR",
1105 SPR_NOACCESS
, SPR_NOACCESS
,
1106 &spr_read_generic
, &spr_write_generic
,
1108 spr_register(env
, SPR_40x_ESR
, "ESR",
1109 SPR_NOACCESS
, SPR_NOACCESS
,
1110 &spr_read_generic
, &spr_write_generic
,
1112 spr_register(env
, SPR_40x_EVPR
, "EVPR",
1113 SPR_NOACCESS
, SPR_NOACCESS
,
1114 &spr_read_generic
, &spr_write_excp_prefix
,
1116 spr_register(env
, SPR_40x_SRR2
, "SRR2",
1117 &spr_read_generic
, &spr_write_generic
,
1118 &spr_read_generic
, &spr_write_generic
,
1120 spr_register(env
, SPR_40x_SRR3
, "SRR3",
1121 &spr_read_generic
, &spr_write_generic
,
1122 &spr_read_generic
, &spr_write_generic
,
1125 spr_register(env
, SPR_40x_PIT
, "PIT",
1126 SPR_NOACCESS
, SPR_NOACCESS
,
1127 &spr_read_40x_pit
, &spr_write_40x_pit
,
1129 spr_register(env
, SPR_40x_TCR
, "TCR",
1130 SPR_NOACCESS
, SPR_NOACCESS
,
1131 &spr_read_generic
, &spr_write_40x_tcr
,
1133 spr_register(env
, SPR_40x_TSR
, "TSR",
1134 SPR_NOACCESS
, SPR_NOACCESS
,
1135 &spr_read_generic
, &spr_write_40x_tsr
,
1139 /* SPR specific to PowerPC 405 implementation */
1140 static void register_405_sprs(CPUPPCState
*env
)
1143 spr_register(env
, SPR_40x_PID
, "PID",
1144 SPR_NOACCESS
, SPR_NOACCESS
,
1145 &spr_read_generic
, &spr_write_40x_pid
,
1147 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1148 SPR_NOACCESS
, SPR_NOACCESS
,
1149 &spr_read_generic
, &spr_write_generic
,
1151 /* Debug interface */
1152 spr_register(env
, SPR_40x_DBCR0
, "DBCR0",
1153 SPR_NOACCESS
, SPR_NOACCESS
,
1154 &spr_read_generic
, &spr_write_40x_dbcr0
,
1157 spr_register(env
, SPR_405_DBCR1
, "DBCR1",
1158 SPR_NOACCESS
, SPR_NOACCESS
,
1159 &spr_read_generic
, &spr_write_generic
,
1162 spr_register(env
, SPR_40x_DBSR
, "DBSR",
1163 SPR_NOACCESS
, SPR_NOACCESS
,
1164 &spr_read_generic
, &spr_write_clear
,
1165 /* Last reset was system reset */
1168 spr_register(env
, SPR_40x_DAC1
, "DAC1",
1169 SPR_NOACCESS
, SPR_NOACCESS
,
1170 &spr_read_generic
, &spr_write_generic
,
1172 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1173 SPR_NOACCESS
, SPR_NOACCESS
,
1174 &spr_read_generic
, &spr_write_generic
,
1177 spr_register(env
, SPR_405_DVC1
, "DVC1",
1178 SPR_NOACCESS
, SPR_NOACCESS
,
1179 &spr_read_generic
, &spr_write_generic
,
1182 spr_register(env
, SPR_405_DVC2
, "DVC2",
1183 SPR_NOACCESS
, SPR_NOACCESS
,
1184 &spr_read_generic
, &spr_write_generic
,
1187 spr_register(env
, SPR_40x_IAC1
, "IAC1",
1188 SPR_NOACCESS
, SPR_NOACCESS
,
1189 &spr_read_generic
, &spr_write_generic
,
1191 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1192 SPR_NOACCESS
, SPR_NOACCESS
,
1193 &spr_read_generic
, &spr_write_generic
,
1196 spr_register(env
, SPR_405_IAC3
, "IAC3",
1197 SPR_NOACCESS
, SPR_NOACCESS
,
1198 &spr_read_generic
, &spr_write_generic
,
1201 spr_register(env
, SPR_405_IAC4
, "IAC4",
1202 SPR_NOACCESS
, SPR_NOACCESS
,
1203 &spr_read_generic
, &spr_write_generic
,
1205 /* Storage control */
1206 spr_register(env
, SPR_405_SLER
, "SLER",
1207 SPR_NOACCESS
, SPR_NOACCESS
,
1208 &spr_read_generic
, &spr_write_40x_sler
,
1210 spr_register(env
, SPR_40x_ZPR
, "ZPR",
1211 SPR_NOACCESS
, SPR_NOACCESS
,
1212 &spr_read_generic
, &spr_write_generic
,
1215 spr_register(env
, SPR_405_SU0R
, "SU0R",
1216 SPR_NOACCESS
, SPR_NOACCESS
,
1217 &spr_read_generic
, &spr_write_generic
,
1220 spr_register(env
, SPR_USPRG0
, "USPRG0",
1221 &spr_read_ureg
, SPR_NOACCESS
,
1222 &spr_read_ureg
, SPR_NOACCESS
,
1224 spr_register(env
, SPR_SPRG4
, "SPRG4",
1225 SPR_NOACCESS
, SPR_NOACCESS
,
1226 &spr_read_generic
, &spr_write_generic
,
1228 spr_register(env
, SPR_SPRG5
, "SPRG5",
1229 SPR_NOACCESS
, SPR_NOACCESS
,
1230 spr_read_generic
, &spr_write_generic
,
1232 spr_register(env
, SPR_SPRG6
, "SPRG6",
1233 SPR_NOACCESS
, SPR_NOACCESS
,
1234 spr_read_generic
, &spr_write_generic
,
1236 spr_register(env
, SPR_SPRG7
, "SPRG7",
1237 SPR_NOACCESS
, SPR_NOACCESS
,
1238 spr_read_generic
, &spr_write_generic
,
1241 /* Bus access control */
1242 /* not emulated, as QEMU never does speculative access */
1243 spr_register(env
, SPR_40x_SGR
, "SGR",
1244 SPR_NOACCESS
, SPR_NOACCESS
,
1245 &spr_read_generic
, &spr_write_generic
,
1247 /* not emulated, as QEMU do not emulate caches */
1248 spr_register(env
, SPR_40x_DCWR
, "DCWR",
1249 SPR_NOACCESS
, SPR_NOACCESS
,
1250 &spr_read_generic
, &spr_write_generic
,
1255 static void register_5xx_8xx_sprs(CPUPPCState
*env
)
1257 /* Exception processing */
1258 spr_register_kvm(env
, SPR_DSISR
, "DSISR",
1259 SPR_NOACCESS
, SPR_NOACCESS
,
1260 &spr_read_generic
, &spr_write_generic
,
1261 KVM_REG_PPC_DSISR
, 0x00000000);
1262 spr_register_kvm(env
, SPR_DAR
, "DAR",
1263 SPR_NOACCESS
, SPR_NOACCESS
,
1264 &spr_read_generic
, &spr_write_generic
,
1265 KVM_REG_PPC_DAR
, 0x00000000);
1267 spr_register(env
, SPR_DECR
, "DECR",
1268 SPR_NOACCESS
, SPR_NOACCESS
,
1269 &spr_read_decr
, &spr_write_decr
,
1272 spr_register(env
, SPR_MPC_EIE
, "EIE",
1273 SPR_NOACCESS
, SPR_NOACCESS
,
1274 &spr_read_generic
, &spr_write_generic
,
1277 spr_register(env
, SPR_MPC_EID
, "EID",
1278 SPR_NOACCESS
, SPR_NOACCESS
,
1279 &spr_read_generic
, &spr_write_generic
,
1282 spr_register(env
, SPR_MPC_NRI
, "NRI",
1283 SPR_NOACCESS
, SPR_NOACCESS
,
1284 &spr_read_generic
, &spr_write_generic
,
1287 spr_register(env
, SPR_MPC_CMPA
, "CMPA",
1288 SPR_NOACCESS
, SPR_NOACCESS
,
1289 &spr_read_generic
, &spr_write_generic
,
1292 spr_register(env
, SPR_MPC_CMPB
, "CMPB",
1293 SPR_NOACCESS
, SPR_NOACCESS
,
1294 &spr_read_generic
, &spr_write_generic
,
1297 spr_register(env
, SPR_MPC_CMPC
, "CMPC",
1298 SPR_NOACCESS
, SPR_NOACCESS
,
1299 &spr_read_generic
, &spr_write_generic
,
1302 spr_register(env
, SPR_MPC_CMPD
, "CMPD",
1303 SPR_NOACCESS
, SPR_NOACCESS
,
1304 &spr_read_generic
, &spr_write_generic
,
1307 spr_register(env
, SPR_MPC_ECR
, "ECR",
1308 SPR_NOACCESS
, SPR_NOACCESS
,
1309 &spr_read_generic
, &spr_write_generic
,
1312 spr_register(env
, SPR_MPC_DER
, "DER",
1313 SPR_NOACCESS
, SPR_NOACCESS
,
1314 &spr_read_generic
, &spr_write_generic
,
1317 spr_register(env
, SPR_MPC_COUNTA
, "COUNTA",
1318 SPR_NOACCESS
, SPR_NOACCESS
,
1319 &spr_read_generic
, &spr_write_generic
,
1322 spr_register(env
, SPR_MPC_COUNTB
, "COUNTB",
1323 SPR_NOACCESS
, SPR_NOACCESS
,
1324 &spr_read_generic
, &spr_write_generic
,
1327 spr_register(env
, SPR_MPC_CMPE
, "CMPE",
1328 SPR_NOACCESS
, SPR_NOACCESS
,
1329 &spr_read_generic
, &spr_write_generic
,
1332 spr_register(env
, SPR_MPC_CMPF
, "CMPF",
1333 SPR_NOACCESS
, SPR_NOACCESS
,
1334 &spr_read_generic
, &spr_write_generic
,
1337 spr_register(env
, SPR_MPC_CMPG
, "CMPG",
1338 SPR_NOACCESS
, SPR_NOACCESS
,
1339 &spr_read_generic
, &spr_write_generic
,
1342 spr_register(env
, SPR_MPC_CMPH
, "CMPH",
1343 SPR_NOACCESS
, SPR_NOACCESS
,
1344 &spr_read_generic
, &spr_write_generic
,
1347 spr_register(env
, SPR_MPC_LCTRL1
, "LCTRL1",
1348 SPR_NOACCESS
, SPR_NOACCESS
,
1349 &spr_read_generic
, &spr_write_generic
,
1352 spr_register(env
, SPR_MPC_LCTRL2
, "LCTRL2",
1353 SPR_NOACCESS
, SPR_NOACCESS
,
1354 &spr_read_generic
, &spr_write_generic
,
1357 spr_register(env
, SPR_MPC_BAR
, "BAR",
1358 SPR_NOACCESS
, SPR_NOACCESS
,
1359 &spr_read_generic
, &spr_write_generic
,
1362 spr_register(env
, SPR_MPC_DPDR
, "DPDR",
1363 SPR_NOACCESS
, SPR_NOACCESS
,
1364 &spr_read_generic
, &spr_write_generic
,
1367 spr_register(env
, SPR_MPC_IMMR
, "IMMR",
1368 SPR_NOACCESS
, SPR_NOACCESS
,
1369 &spr_read_generic
, &spr_write_generic
,
1373 static void register_5xx_sprs(CPUPPCState
*env
)
1375 spr_register(env
, SPR_RCPU_MI_GRA
, "MI_GRA",
1376 SPR_NOACCESS
, SPR_NOACCESS
,
1377 &spr_read_generic
, &spr_write_generic
,
1380 spr_register(env
, SPR_RCPU_L2U_GRA
, "L2U_GRA",
1381 SPR_NOACCESS
, SPR_NOACCESS
,
1382 &spr_read_generic
, &spr_write_generic
,
1385 spr_register(env
, SPR_RPCU_BBCMCR
, "L2U_BBCMCR",
1386 SPR_NOACCESS
, SPR_NOACCESS
,
1387 &spr_read_generic
, &spr_write_generic
,
1390 spr_register(env
, SPR_RCPU_L2U_MCR
, "L2U_MCR",
1391 SPR_NOACCESS
, SPR_NOACCESS
,
1392 &spr_read_generic
, &spr_write_generic
,
1395 spr_register(env
, SPR_RCPU_MI_RBA0
, "MI_RBA0",
1396 SPR_NOACCESS
, SPR_NOACCESS
,
1397 &spr_read_generic
, &spr_write_generic
,
1400 spr_register(env
, SPR_RCPU_MI_RBA1
, "MI_RBA1",
1401 SPR_NOACCESS
, SPR_NOACCESS
,
1402 &spr_read_generic
, &spr_write_generic
,
1405 spr_register(env
, SPR_RCPU_MI_RBA2
, "MI_RBA2",
1406 SPR_NOACCESS
, SPR_NOACCESS
,
1407 &spr_read_generic
, &spr_write_generic
,
1410 spr_register(env
, SPR_RCPU_MI_RBA3
, "MI_RBA3",
1411 SPR_NOACCESS
, SPR_NOACCESS
,
1412 &spr_read_generic
, &spr_write_generic
,
1415 spr_register(env
, SPR_RCPU_L2U_RBA0
, "L2U_RBA0",
1416 SPR_NOACCESS
, SPR_NOACCESS
,
1417 &spr_read_generic
, &spr_write_generic
,
1420 spr_register(env
, SPR_RCPU_L2U_RBA1
, "L2U_RBA1",
1421 SPR_NOACCESS
, SPR_NOACCESS
,
1422 &spr_read_generic
, &spr_write_generic
,
1425 spr_register(env
, SPR_RCPU_L2U_RBA2
, "L2U_RBA2",
1426 SPR_NOACCESS
, SPR_NOACCESS
,
1427 &spr_read_generic
, &spr_write_generic
,
1430 spr_register(env
, SPR_RCPU_L2U_RBA3
, "L2U_RBA3",
1431 SPR_NOACCESS
, SPR_NOACCESS
,
1432 &spr_read_generic
, &spr_write_generic
,
1435 spr_register(env
, SPR_RCPU_MI_RA0
, "MI_RA0",
1436 SPR_NOACCESS
, SPR_NOACCESS
,
1437 &spr_read_generic
, &spr_write_generic
,
1440 spr_register(env
, SPR_RCPU_MI_RA1
, "MI_RA1",
1441 SPR_NOACCESS
, SPR_NOACCESS
,
1442 &spr_read_generic
, &spr_write_generic
,
1445 spr_register(env
, SPR_RCPU_MI_RA2
, "MI_RA2",
1446 SPR_NOACCESS
, SPR_NOACCESS
,
1447 &spr_read_generic
, &spr_write_generic
,
1450 spr_register(env
, SPR_RCPU_MI_RA3
, "MI_RA3",
1451 SPR_NOACCESS
, SPR_NOACCESS
,
1452 &spr_read_generic
, &spr_write_generic
,
1455 spr_register(env
, SPR_RCPU_L2U_RA0
, "L2U_RA0",
1456 SPR_NOACCESS
, SPR_NOACCESS
,
1457 &spr_read_generic
, &spr_write_generic
,
1460 spr_register(env
, SPR_RCPU_L2U_RA1
, "L2U_RA1",
1461 SPR_NOACCESS
, SPR_NOACCESS
,
1462 &spr_read_generic
, &spr_write_generic
,
1465 spr_register(env
, SPR_RCPU_L2U_RA2
, "L2U_RA2",
1466 SPR_NOACCESS
, SPR_NOACCESS
,
1467 &spr_read_generic
, &spr_write_generic
,
1470 spr_register(env
, SPR_RCPU_L2U_RA3
, "L2U_RA3",
1471 SPR_NOACCESS
, SPR_NOACCESS
,
1472 &spr_read_generic
, &spr_write_generic
,
1475 spr_register(env
, SPR_RCPU_FPECR
, "FPECR",
1476 SPR_NOACCESS
, SPR_NOACCESS
,
1477 &spr_read_generic
, &spr_write_generic
,
1481 static void register_8xx_sprs(CPUPPCState
*env
)
1484 spr_register(env
, SPR_MPC_IC_CST
, "IC_CST",
1485 SPR_NOACCESS
, SPR_NOACCESS
,
1486 &spr_read_generic
, &spr_write_generic
,
1489 spr_register(env
, SPR_MPC_IC_ADR
, "IC_ADR",
1490 SPR_NOACCESS
, SPR_NOACCESS
,
1491 &spr_read_generic
, &spr_write_generic
,
1494 spr_register(env
, SPR_MPC_IC_DAT
, "IC_DAT",
1495 SPR_NOACCESS
, SPR_NOACCESS
,
1496 &spr_read_generic
, &spr_write_generic
,
1499 spr_register(env
, SPR_MPC_DC_CST
, "DC_CST",
1500 SPR_NOACCESS
, SPR_NOACCESS
,
1501 &spr_read_generic
, &spr_write_generic
,
1504 spr_register(env
, SPR_MPC_DC_ADR
, "DC_ADR",
1505 SPR_NOACCESS
, SPR_NOACCESS
,
1506 &spr_read_generic
, &spr_write_generic
,
1509 spr_register(env
, SPR_MPC_DC_DAT
, "DC_DAT",
1510 SPR_NOACCESS
, SPR_NOACCESS
,
1511 &spr_read_generic
, &spr_write_generic
,
1514 spr_register(env
, SPR_MPC_MI_CTR
, "MI_CTR",
1515 SPR_NOACCESS
, SPR_NOACCESS
,
1516 &spr_read_generic
, &spr_write_generic
,
1519 spr_register(env
, SPR_MPC_MI_AP
, "MI_AP",
1520 SPR_NOACCESS
, SPR_NOACCESS
,
1521 &spr_read_generic
, &spr_write_generic
,
1524 spr_register(env
, SPR_MPC_MI_EPN
, "MI_EPN",
1525 SPR_NOACCESS
, SPR_NOACCESS
,
1526 &spr_read_generic
, &spr_write_generic
,
1529 spr_register(env
, SPR_MPC_MI_TWC
, "MI_TWC",
1530 SPR_NOACCESS
, SPR_NOACCESS
,
1531 &spr_read_generic
, &spr_write_generic
,
1534 spr_register(env
, SPR_MPC_MI_RPN
, "MI_RPN",
1535 SPR_NOACCESS
, SPR_NOACCESS
,
1536 &spr_read_generic
, &spr_write_generic
,
1539 spr_register(env
, SPR_MPC_MI_DBCAM
, "MI_DBCAM",
1540 SPR_NOACCESS
, SPR_NOACCESS
,
1541 &spr_read_generic
, &spr_write_generic
,
1544 spr_register(env
, SPR_MPC_MI_DBRAM0
, "MI_DBRAM0",
1545 SPR_NOACCESS
, SPR_NOACCESS
,
1546 &spr_read_generic
, &spr_write_generic
,
1549 spr_register(env
, SPR_MPC_MI_DBRAM1
, "MI_DBRAM1",
1550 SPR_NOACCESS
, SPR_NOACCESS
,
1551 &spr_read_generic
, &spr_write_generic
,
1554 spr_register(env
, SPR_MPC_MD_CTR
, "MD_CTR",
1555 SPR_NOACCESS
, SPR_NOACCESS
,
1556 &spr_read_generic
, &spr_write_generic
,
1559 spr_register(env
, SPR_MPC_MD_CASID
, "MD_CASID",
1560 SPR_NOACCESS
, SPR_NOACCESS
,
1561 &spr_read_generic
, &spr_write_generic
,
1564 spr_register(env
, SPR_MPC_MD_AP
, "MD_AP",
1565 SPR_NOACCESS
, SPR_NOACCESS
,
1566 &spr_read_generic
, &spr_write_generic
,
1569 spr_register(env
, SPR_MPC_MD_EPN
, "MD_EPN",
1570 SPR_NOACCESS
, SPR_NOACCESS
,
1571 &spr_read_generic
, &spr_write_generic
,
1574 spr_register(env
, SPR_MPC_MD_TWB
, "MD_TWB",
1575 SPR_NOACCESS
, SPR_NOACCESS
,
1576 &spr_read_generic
, &spr_write_generic
,
1579 spr_register(env
, SPR_MPC_MD_TWC
, "MD_TWC",
1580 SPR_NOACCESS
, SPR_NOACCESS
,
1581 &spr_read_generic
, &spr_write_generic
,
1584 spr_register(env
, SPR_MPC_MD_RPN
, "MD_RPN",
1585 SPR_NOACCESS
, SPR_NOACCESS
,
1586 &spr_read_generic
, &spr_write_generic
,
1589 spr_register(env
, SPR_MPC_MD_TW
, "MD_TW",
1590 SPR_NOACCESS
, SPR_NOACCESS
,
1591 &spr_read_generic
, &spr_write_generic
,
1594 spr_register(env
, SPR_MPC_MD_DBCAM
, "MD_DBCAM",
1595 SPR_NOACCESS
, SPR_NOACCESS
,
1596 &spr_read_generic
, &spr_write_generic
,
1599 spr_register(env
, SPR_MPC_MD_DBRAM0
, "MD_DBRAM0",
1600 SPR_NOACCESS
, SPR_NOACCESS
,
1601 &spr_read_generic
, &spr_write_generic
,
1604 spr_register(env
, SPR_MPC_MD_DBRAM1
, "MD_DBRAM1",
1605 SPR_NOACCESS
, SPR_NOACCESS
,
1606 &spr_read_generic
, &spr_write_generic
,
1611 * AMR => SPR 29 (Power 2.04)
1612 * CTRL => SPR 136 (Power 2.04)
1613 * CTRL => SPR 152 (Power 2.04)
1614 * SCOMC => SPR 276 (64 bits ?)
1615 * SCOMD => SPR 277 (64 bits ?)
1616 * TBU40 => SPR 286 (Power 2.04 hypv)
1617 * HSPRG0 => SPR 304 (Power 2.04 hypv)
1618 * HSPRG1 => SPR 305 (Power 2.04 hypv)
1619 * HDSISR => SPR 306 (Power 2.04 hypv)
1620 * HDAR => SPR 307 (Power 2.04 hypv)
1621 * PURR => SPR 309 (Power 2.04 hypv)
1622 * HDEC => SPR 310 (Power 2.04 hypv)
1623 * HIOR => SPR 311 (hypv)
1624 * RMOR => SPR 312 (970)
1625 * HRMOR => SPR 313 (Power 2.04 hypv)
1626 * HSRR0 => SPR 314 (Power 2.04 hypv)
1627 * HSRR1 => SPR 315 (Power 2.04 hypv)
1628 * LPIDR => SPR 317 (970)
1629 * EPR => SPR 702 (Power 2.04 emb)
1630 * perf => 768-783 (Power 2.04)
1631 * perf => 784-799 (Power 2.04)
1632 * PPR => SPR 896 (Power 2.04)
1633 * DABRX => 1015 (Power 2.04 hypv)
1634 * FPECR => SPR 1022 (?)
1635 * ... and more (thermal management, performance counters, ...)
1638 /*****************************************************************************/
1639 /* Exception vectors models */
1640 static void init_excp_4xx_softmmu(CPUPPCState
*env
)
1642 #if !defined(CONFIG_USER_ONLY)
1643 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000100;
1644 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1645 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1646 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1647 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1648 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1649 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1650 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1651 env
->excp_vectors
[POWERPC_EXCP_PIT
] = 0x00001000;
1652 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00001010;
1653 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00001020;
1654 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001100;
1655 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001200;
1656 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00002000;
1657 env
->ivor_mask
= 0x0000FFF0UL
;
1658 env
->ivpr_mask
= 0xFFFF0000UL
;
1659 /* Hardware reset vector */
1660 env
->hreset_vector
= 0xFFFFFFFCUL
;
1664 static void init_excp_MPC5xx(CPUPPCState
*env
)
1666 #if !defined(CONFIG_USER_ONLY)
1667 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1668 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1669 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1670 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1671 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1672 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1673 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1674 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1675 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1676 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
1677 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
1678 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
1679 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
1680 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
1681 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
1682 env
->ivor_mask
= 0x0000FFF0UL
;
1683 env
->ivpr_mask
= 0xFFFF0000UL
;
1684 /* Hardware reset vector */
1685 env
->hreset_vector
= 0x00000100UL
;
1689 static void init_excp_MPC8xx(CPUPPCState
*env
)
1691 #if !defined(CONFIG_USER_ONLY)
1692 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1693 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1694 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1695 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1696 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1697 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1698 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1699 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1700 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1701 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1702 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1703 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
1704 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
1705 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001100;
1706 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001200;
1707 env
->excp_vectors
[POWERPC_EXCP_ITLBE
] = 0x00001300;
1708 env
->excp_vectors
[POWERPC_EXCP_DTLBE
] = 0x00001400;
1709 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
1710 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
1711 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
1712 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
1713 env
->ivor_mask
= 0x0000FFF0UL
;
1714 env
->ivpr_mask
= 0xFFFF0000UL
;
1715 /* Hardware reset vector */
1716 env
->hreset_vector
= 0x00000100UL
;
1720 static void init_excp_G2(CPUPPCState
*env
)
1722 #if !defined(CONFIG_USER_ONLY)
1723 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1724 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1725 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1726 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1727 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1728 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1729 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1730 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1731 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1732 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000A00;
1733 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1734 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1735 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
1736 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
1737 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
1738 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1739 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1740 /* Hardware reset vector */
1741 env
->hreset_vector
= 0x00000100UL
;
1745 static void init_excp_e200(CPUPPCState
*env
, target_ulong ivpr_mask
)
1747 #if !defined(CONFIG_USER_ONLY)
1748 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000FFC;
1749 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
1750 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
1751 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
1752 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
1753 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
1754 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
1755 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
1756 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
1757 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
1758 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
1759 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
1760 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
1761 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
1762 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
1763 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
1764 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
1766 * These two are the same IVOR as POWERPC_EXCP_VPU and
1767 * POWERPC_EXCP_VPUA. We deal with that when dispatching at
1770 env
->excp_vectors
[POWERPC_EXCP_SPEU
] = 0x00000000;
1771 env
->excp_vectors
[POWERPC_EXCP_EFPDI
] = 0x00000000;
1773 env
->excp_vectors
[POWERPC_EXCP_EFPRI
] = 0x00000000;
1774 env
->ivor_mask
= 0x0000FFF7UL
;
1775 env
->ivpr_mask
= ivpr_mask
;
1776 /* Hardware reset vector */
1777 env
->hreset_vector
= 0xFFFFFFFCUL
;
1781 static void init_excp_BookE(CPUPPCState
*env
)
1783 #if !defined(CONFIG_USER_ONLY)
1784 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
1785 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
1786 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
1787 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
1788 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
1789 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
1790 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
1791 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
1792 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
1793 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
1794 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
1795 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
1796 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
1797 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
1798 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
1799 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
1800 env
->ivor_mask
= 0x0000FFF0UL
;
1801 env
->ivpr_mask
= 0xFFFF0000UL
;
1802 /* Hardware reset vector */
1803 env
->hreset_vector
= 0xFFFFFFFCUL
;
1807 static void init_excp_603(CPUPPCState
*env
)
1809 #if !defined(CONFIG_USER_ONLY)
1810 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1811 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1812 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1813 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1814 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1815 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1816 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1817 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1818 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1819 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1820 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1821 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
1822 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
1823 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
1824 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1825 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1826 /* Hardware reset vector */
1827 env
->hreset_vector
= 0x00000100UL
;
1831 static void init_excp_604(CPUPPCState
*env
)
1833 #if !defined(CONFIG_USER_ONLY)
1834 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1835 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1836 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1837 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1838 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1839 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1840 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1841 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1842 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1843 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1844 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1845 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
1846 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1847 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1848 /* Hardware reset vector */
1849 env
->hreset_vector
= 0x00000100UL
;
1853 static void init_excp_7x0(CPUPPCState
*env
)
1855 #if !defined(CONFIG_USER_ONLY)
1856 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1857 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1858 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1859 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1860 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1861 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1862 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1863 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1864 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1865 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1866 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1867 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
1868 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1869 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1870 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
1871 /* Hardware reset vector */
1872 env
->hreset_vector
= 0x00000100UL
;
1876 static void init_excp_750cl(CPUPPCState
*env
)
1878 #if !defined(CONFIG_USER_ONLY)
1879 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1880 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1881 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1882 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1883 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1884 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1885 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1886 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1887 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1888 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1889 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1890 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
1891 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1892 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1893 /* Hardware reset vector */
1894 env
->hreset_vector
= 0x00000100UL
;
1898 static void init_excp_750cx(CPUPPCState
*env
)
1900 #if !defined(CONFIG_USER_ONLY)
1901 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1902 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1903 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1904 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1905 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1906 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1907 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1908 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1909 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1910 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1911 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1912 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
1913 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1914 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
1915 /* Hardware reset vector */
1916 env
->hreset_vector
= 0x00000100UL
;
1920 /* XXX: Check if this is correct */
1921 static void init_excp_7x5(CPUPPCState
*env
)
1923 #if !defined(CONFIG_USER_ONLY)
1924 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1925 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1926 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1927 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1928 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1929 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1930 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1931 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1932 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1933 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1934 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1935 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
1936 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
1937 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
1938 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
1939 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1940 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1941 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
1942 /* Hardware reset vector */
1943 env
->hreset_vector
= 0x00000100UL
;
1947 static void init_excp_7400(CPUPPCState
*env
)
1949 #if !defined(CONFIG_USER_ONLY)
1950 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1951 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1952 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1953 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1954 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1955 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1956 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1957 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1958 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1959 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1960 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1961 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
1962 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
1963 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1964 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1965 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
1966 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
1967 /* Hardware reset vector */
1968 env
->hreset_vector
= 0x00000100UL
;
1972 static void init_excp_7450(CPUPPCState
*env
)
1974 #if !defined(CONFIG_USER_ONLY)
1975 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1976 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1977 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1978 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1979 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1980 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1981 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1982 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1983 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1984 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1985 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1986 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
1987 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
1988 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
1989 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
1990 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
1991 /* Hardware reset vector */
1992 env
->hreset_vector
= 0x00000100UL
;
1996 #if defined(TARGET_PPC64)
1997 static void init_excp_970(CPUPPCState
*env
)
1999 #if !defined(CONFIG_USER_ONLY)
2000 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2001 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2002 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2003 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
2004 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2005 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
2006 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2007 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2008 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2009 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2010 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2011 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
2012 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2013 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2014 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2015 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2016 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2017 env
->excp_vectors
[POWERPC_EXCP_MAINT
] = 0x00001600;
2018 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001700;
2019 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001800;
2020 /* Hardware reset vector */
2021 env
->hreset_vector
= 0x0000000000000100ULL
;
2025 static void init_excp_POWER7(CPUPPCState
*env
)
2027 #if !defined(CONFIG_USER_ONLY)
2028 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2029 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2030 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2031 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
2032 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2033 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
2034 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2035 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2036 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2037 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2038 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2039 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
2040 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2041 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2042 env
->excp_vectors
[POWERPC_EXCP_HDSI
] = 0x00000E00;
2043 env
->excp_vectors
[POWERPC_EXCP_HISI
] = 0x00000E20;
2044 env
->excp_vectors
[POWERPC_EXCP_HV_EMU
] = 0x00000E40;
2045 env
->excp_vectors
[POWERPC_EXCP_HV_MAINT
] = 0x00000E60;
2046 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2047 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2048 env
->excp_vectors
[POWERPC_EXCP_VSXU
] = 0x00000F40;
2049 /* Hardware reset vector */
2050 env
->hreset_vector
= 0x0000000000000100ULL
;
2054 static void init_excp_POWER8(CPUPPCState
*env
)
2056 init_excp_POWER7(env
);
2058 #if !defined(CONFIG_USER_ONLY)
2059 env
->excp_vectors
[POWERPC_EXCP_SDOOR
] = 0x00000A00;
2060 env
->excp_vectors
[POWERPC_EXCP_FU
] = 0x00000F60;
2061 env
->excp_vectors
[POWERPC_EXCP_HV_FU
] = 0x00000F80;
2062 env
->excp_vectors
[POWERPC_EXCP_SDOOR_HV
] = 0x00000E80;
2064 /* Userland exceptions without vector value in PowerISA v3.1 */
2065 env
->excp_vectors
[POWERPC_EXCP_PERFM_EBB
] = 0x0;
2066 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL_EBB
] = 0x0;
2070 static void init_excp_POWER9(CPUPPCState
*env
)
2072 init_excp_POWER8(env
);
2074 #if !defined(CONFIG_USER_ONLY)
2075 env
->excp_vectors
[POWERPC_EXCP_HVIRT
] = 0x00000EA0;
2076 env
->excp_vectors
[POWERPC_EXCP_SYSCALL_VECTORED
] = 0x00017000;
2080 static void init_excp_POWER10(CPUPPCState
*env
)
2082 init_excp_POWER9(env
);
2087 static int check_pow_hid0(CPUPPCState
*env
)
2089 if (env
->spr
[SPR_HID0
] & 0x00E00000) {
2096 static int check_pow_hid0_74xx(CPUPPCState
*env
)
2098 if (env
->spr
[SPR_HID0
] & 0x00600000) {
2105 static void init_proc_405(CPUPPCState
*env
)
2107 register_40x_sprs(env
);
2108 register_405_sprs(env
);
2109 register_usprgh_sprs(env
);
2111 /* Memory management */
2112 #if !defined(CONFIG_USER_ONLY)
2116 env
->tlb_type
= TLB_EMB
;
2118 init_excp_4xx_softmmu(env
);
2119 env
->dcache_line_size
= 32;
2120 env
->icache_line_size
= 32;
2121 /* Allocate hardware IRQ controller */
2122 ppc40x_irq_init(env_archcpu(env
));
2124 SET_FIT_PERIOD(8, 12, 16, 20);
2125 SET_WDT_PERIOD(16, 20, 24, 28);
2128 POWERPC_FAMILY(405)(ObjectClass
*oc
, void *data
)
2130 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2131 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2133 dc
->desc
= "PowerPC 405";
2134 pcc
->init_proc
= init_proc_405
;
2135 pcc
->check_pow
= check_pow_nocheck
;
2136 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
2137 PPC_DCR
| PPC_WRTEE
|
2138 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_40x_ICBT
|
2139 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2140 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
2141 PPC_40x_TLB
| PPC_MEM_TLBIA
| PPC_MEM_TLBSYNC
|
2142 PPC_4xx_COMMON
| PPC_405_MAC
| PPC_40x_EXCP
;
2143 pcc
->msr_mask
= (1ull << MSR_WE
) |
2153 pcc
->mmu_model
= POWERPC_MMU_SOFT_4xx
;
2154 pcc
->excp_model
= POWERPC_EXCP_40x
;
2155 pcc
->bus_model
= PPC_FLAGS_INPUT_405
;
2156 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2157 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2158 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2161 static void init_proc_440EP(CPUPPCState
*env
)
2163 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2164 register_440_sprs(env
);
2165 register_usprgh_sprs(env
);
2167 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
2168 SPR_NOACCESS
, SPR_NOACCESS
,
2169 &spr_read_generic
, &spr_write_generic
,
2171 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
2172 SPR_NOACCESS
, SPR_NOACCESS
,
2173 &spr_read_generic
, &spr_write_generic
,
2175 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
2176 SPR_NOACCESS
, SPR_NOACCESS
,
2177 &spr_read_generic
, &spr_write_generic
,
2180 spr_register(env
, SPR_440_CCR1
, "CCR1",
2181 SPR_NOACCESS
, SPR_NOACCESS
,
2182 &spr_read_generic
, &spr_write_generic
,
2184 /* Memory management */
2185 #if !defined(CONFIG_USER_ONLY)
2189 env
->tlb_type
= TLB_EMB
;
2191 init_excp_BookE(env
);
2192 env
->dcache_line_size
= 32;
2193 env
->icache_line_size
= 32;
2194 ppc40x_irq_init(env_archcpu(env
));
2196 SET_FIT_PERIOD(12, 16, 20, 24);
2197 SET_WDT_PERIOD(20, 24, 28, 32);
2200 POWERPC_FAMILY(440EP
)(ObjectClass
*oc
, void *data
)
2202 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2203 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2205 dc
->desc
= "PowerPC 440 EP";
2206 pcc
->init_proc
= init_proc_440EP
;
2207 pcc
->check_pow
= check_pow_nocheck
;
2208 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2209 PPC_FLOAT
| PPC_FLOAT_FRES
| PPC_FLOAT_FSEL
|
2210 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
2212 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2213 PPC_CACHE
| PPC_CACHE_ICBI
|
2214 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2215 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2216 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2218 pcc
->msr_mask
= (1ull << MSR_POW
) |
2230 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2231 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2232 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2233 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2234 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2235 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2238 POWERPC_FAMILY(460EX
)(ObjectClass
*oc
, void *data
)
2240 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2241 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2243 dc
->desc
= "PowerPC 460 EX";
2244 pcc
->init_proc
= init_proc_440EP
;
2245 pcc
->check_pow
= check_pow_nocheck
;
2246 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2247 PPC_FLOAT
| PPC_FLOAT_FRES
| PPC_FLOAT_FSEL
|
2248 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
2250 PPC_DCR
| PPC_DCRX
| PPC_WRTEE
| PPC_RFMCI
|
2251 PPC_CACHE
| PPC_CACHE_ICBI
|
2252 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2253 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2254 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2256 pcc
->msr_mask
= (1ull << MSR_POW
) |
2268 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2269 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2270 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2271 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2272 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2273 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2276 static void init_proc_440GP(CPUPPCState
*env
)
2278 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2279 register_440_sprs(env
);
2280 register_usprgh_sprs(env
);
2282 /* Memory management */
2283 #if !defined(CONFIG_USER_ONLY)
2287 env
->tlb_type
= TLB_EMB
;
2289 init_excp_BookE(env
);
2290 env
->dcache_line_size
= 32;
2291 env
->icache_line_size
= 32;
2292 /* XXX: TODO: allocate internal IRQ controller */
2294 SET_FIT_PERIOD(12, 16, 20, 24);
2295 SET_WDT_PERIOD(20, 24, 28, 32);
2298 POWERPC_FAMILY(440GP
)(ObjectClass
*oc
, void *data
)
2300 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2301 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2303 dc
->desc
= "PowerPC 440 GP";
2304 pcc
->init_proc
= init_proc_440GP
;
2305 pcc
->check_pow
= check_pow_nocheck
;
2306 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2307 PPC_DCR
| PPC_DCRX
| PPC_WRTEE
| PPC_MFAPIDI
|
2308 PPC_CACHE
| PPC_CACHE_ICBI
|
2309 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2310 PPC_MEM_TLBSYNC
| PPC_TLBIVA
| PPC_MFTB
|
2311 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2313 pcc
->msr_mask
= (1ull << MSR_POW
) |
2325 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2326 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2327 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2328 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2329 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2330 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2333 static void init_proc_440x5(CPUPPCState
*env
)
2335 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2336 register_440_sprs(env
);
2337 register_usprgh_sprs(env
);
2339 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
2340 SPR_NOACCESS
, SPR_NOACCESS
,
2341 &spr_read_generic
, &spr_write_generic
,
2343 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
2344 SPR_NOACCESS
, SPR_NOACCESS
,
2345 &spr_read_generic
, &spr_write_generic
,
2347 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
2348 SPR_NOACCESS
, SPR_NOACCESS
,
2349 &spr_read_generic
, &spr_write_generic
,
2352 spr_register(env
, SPR_440_CCR1
, "CCR1",
2353 SPR_NOACCESS
, SPR_NOACCESS
,
2354 &spr_read_generic
, &spr_write_generic
,
2356 /* Memory management */
2357 #if !defined(CONFIG_USER_ONLY)
2361 env
->tlb_type
= TLB_EMB
;
2363 init_excp_BookE(env
);
2364 env
->dcache_line_size
= 32;
2365 env
->icache_line_size
= 32;
2366 ppc40x_irq_init(env_archcpu(env
));
2368 SET_FIT_PERIOD(12, 16, 20, 24);
2369 SET_WDT_PERIOD(20, 24, 28, 32);
2372 POWERPC_FAMILY(440x5
)(ObjectClass
*oc
, void *data
)
2374 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2375 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2377 dc
->desc
= "PowerPC 440x5";
2378 pcc
->init_proc
= init_proc_440x5
;
2379 pcc
->check_pow
= check_pow_nocheck
;
2380 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2381 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2382 PPC_CACHE
| PPC_CACHE_ICBI
|
2383 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2384 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2385 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2387 pcc
->msr_mask
= (1ull << MSR_POW
) |
2399 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2400 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2401 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2402 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2403 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2404 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2407 POWERPC_FAMILY(440x5wDFPU
)(ObjectClass
*oc
, void *data
)
2409 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2410 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2412 dc
->desc
= "PowerPC 440x5 with double precision FPU";
2413 pcc
->init_proc
= init_proc_440x5
;
2414 pcc
->check_pow
= check_pow_nocheck
;
2415 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2416 PPC_FLOAT
| PPC_FLOAT_FSQRT
|
2418 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2419 PPC_CACHE
| PPC_CACHE_ICBI
|
2420 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2421 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2422 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2424 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
2425 pcc
->msr_mask
= (1ull << MSR_POW
) |
2437 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2438 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2439 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2440 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2441 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2442 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2445 static void init_proc_MPC5xx(CPUPPCState
*env
)
2447 register_5xx_8xx_sprs(env
);
2448 register_5xx_sprs(env
);
2449 init_excp_MPC5xx(env
);
2450 env
->dcache_line_size
= 32;
2451 env
->icache_line_size
= 32;
2452 /* XXX: TODO: allocate internal IRQ controller */
2455 POWERPC_FAMILY(MPC5xx
)(ObjectClass
*oc
, void *data
)
2457 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2458 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2460 dc
->desc
= "Freescale 5xx cores (aka RCPU)";
2461 pcc
->init_proc
= init_proc_MPC5xx
;
2462 pcc
->check_pow
= check_pow_none
;
2463 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2464 PPC_MEM_EIEIO
| PPC_MEM_SYNC
|
2465 PPC_CACHE_ICBI
| PPC_FLOAT
| PPC_FLOAT_STFIWX
|
2467 pcc
->msr_mask
= (1ull << MSR_ILE
) |
2479 pcc
->mmu_model
= POWERPC_MMU_REAL
;
2480 pcc
->excp_model
= POWERPC_EXCP_6xx
;
2481 pcc
->bus_model
= PPC_FLAGS_INPUT_RCPU
;
2482 pcc
->bfd_mach
= bfd_mach_ppc_505
;
2483 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
2484 POWERPC_FLAG_BUS_CLK
;
2487 static void init_proc_MPC8xx(CPUPPCState
*env
)
2489 register_5xx_8xx_sprs(env
);
2490 register_8xx_sprs(env
);
2491 init_excp_MPC8xx(env
);
2492 env
->dcache_line_size
= 32;
2493 env
->icache_line_size
= 32;
2494 /* XXX: TODO: allocate internal IRQ controller */
2497 POWERPC_FAMILY(MPC8xx
)(ObjectClass
*oc
, void *data
)
2499 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2500 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2502 dc
->desc
= "Freescale 8xx cores (aka PowerQUICC)";
2503 pcc
->init_proc
= init_proc_MPC8xx
;
2504 pcc
->check_pow
= check_pow_none
;
2505 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2506 PPC_MEM_EIEIO
| PPC_MEM_SYNC
|
2507 PPC_CACHE_ICBI
| PPC_MFTB
;
2508 pcc
->msr_mask
= (1ull << MSR_ILE
) |
2520 pcc
->mmu_model
= POWERPC_MMU_MPC8xx
;
2521 pcc
->excp_model
= POWERPC_EXCP_6xx
;
2522 pcc
->bus_model
= PPC_FLAGS_INPUT_RCPU
;
2523 pcc
->bfd_mach
= bfd_mach_ppc_860
;
2524 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
2525 POWERPC_FLAG_BUS_CLK
;
2528 /* Freescale 82xx cores (aka PowerQUICC-II) */
2530 static void init_proc_G2(CPUPPCState
*env
)
2532 register_non_embedded_sprs(env
);
2533 register_sdr1_sprs(env
);
2534 register_G2_sprs(env
);
2536 /* Memory management */
2537 register_low_BATs(env
);
2538 register_high_BATs(env
);
2539 register_6xx_7xx_soft_tlb(env
, 64, 2);
2541 env
->dcache_line_size
= 32;
2542 env
->icache_line_size
= 32;
2543 /* Allocate hardware IRQ controller */
2544 ppc6xx_irq_init(env_archcpu(env
));
2547 POWERPC_FAMILY(G2
)(ObjectClass
*oc
, void *data
)
2549 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2550 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2552 dc
->desc
= "PowerPC G2";
2553 pcc
->init_proc
= init_proc_G2
;
2554 pcc
->check_pow
= check_pow_hid0
;
2555 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
2556 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
2558 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
2559 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
2560 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
2561 PPC_SEGMENT
| PPC_EXTERN
;
2562 pcc
->msr_mask
= (1ull << MSR_POW
) |
2563 (1ull << MSR_TGPR
) |
2577 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
2578 pcc
->excp_model
= POWERPC_EXCP_6xx
;
2579 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
2580 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
2581 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
2582 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
2585 POWERPC_FAMILY(G2LE
)(ObjectClass
*oc
, void *data
)
2587 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2588 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2590 dc
->desc
= "PowerPC G2LE";
2591 pcc
->init_proc
= init_proc_G2
;
2592 pcc
->check_pow
= check_pow_hid0
;
2593 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
2594 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
2596 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
2597 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
2598 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
2599 PPC_SEGMENT
| PPC_EXTERN
;
2600 pcc
->msr_mask
= (1ull << MSR_POW
) |
2601 (1ull << MSR_TGPR
) |
2617 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
2618 pcc
->excp_model
= POWERPC_EXCP_6xx
;
2619 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
2620 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
2621 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
2622 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
2625 static void init_proc_e200(CPUPPCState
*env
)
2627 register_BookE_sprs(env
, 0x000000070000FFFFULL
);
2629 spr_register(env
, SPR_BOOKE_SPEFSCR
, "SPEFSCR",
2630 &spr_read_spefscr
, &spr_write_spefscr
,
2631 &spr_read_spefscr
, &spr_write_spefscr
,
2633 /* Memory management */
2634 register_BookE206_sprs(env
, 0x0000005D, NULL
, 0);
2635 register_usprgh_sprs(env
);
2637 spr_register(env
, SPR_HID0
, "HID0",
2638 SPR_NOACCESS
, SPR_NOACCESS
,
2639 &spr_read_generic
, &spr_write_generic
,
2642 spr_register(env
, SPR_HID1
, "HID1",
2643 SPR_NOACCESS
, SPR_NOACCESS
,
2644 &spr_read_generic
, &spr_write_generic
,
2647 spr_register(env
, SPR_Exxx_ALTCTXCR
, "ALTCTXCR",
2648 SPR_NOACCESS
, SPR_NOACCESS
,
2649 &spr_read_generic
, &spr_write_generic
,
2652 spr_register(env
, SPR_Exxx_BUCSR
, "BUCSR",
2653 SPR_NOACCESS
, SPR_NOACCESS
,
2654 &spr_read_generic
, &spr_write_generic
,
2657 spr_register(env
, SPR_Exxx_CTXCR
, "CTXCR",
2658 SPR_NOACCESS
, SPR_NOACCESS
,
2659 &spr_read_generic
, &spr_write_generic
,
2662 spr_register(env
, SPR_Exxx_DBCNT
, "DBCNT",
2663 SPR_NOACCESS
, SPR_NOACCESS
,
2664 &spr_read_generic
, &spr_write_generic
,
2667 spr_register(env
, SPR_Exxx_DBCR3
, "DBCR3",
2668 SPR_NOACCESS
, SPR_NOACCESS
,
2669 &spr_read_generic
, &spr_write_generic
,
2672 spr_register(env
, SPR_Exxx_L1CFG0
, "L1CFG0",
2673 &spr_read_generic
, SPR_NOACCESS
,
2674 &spr_read_generic
, SPR_NOACCESS
,
2677 spr_register(env
, SPR_Exxx_L1CSR0
, "L1CSR0",
2678 SPR_NOACCESS
, SPR_NOACCESS
,
2679 &spr_read_generic
, &spr_write_generic
,
2682 spr_register(env
, SPR_Exxx_L1FINV0
, "L1FINV0",
2683 SPR_NOACCESS
, SPR_NOACCESS
,
2684 &spr_read_generic
, &spr_write_generic
,
2687 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
2688 SPR_NOACCESS
, SPR_NOACCESS
,
2689 &spr_read_generic
, &spr_write_generic
,
2692 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
2693 SPR_NOACCESS
, SPR_NOACCESS
,
2694 &spr_read_generic
, &spr_write_generic
,
2697 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
2698 SPR_NOACCESS
, SPR_NOACCESS
,
2699 &spr_read_generic
, &spr_write_generic
,
2702 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
2703 SPR_NOACCESS
, SPR_NOACCESS
,
2704 &spr_read_generic
, &spr_write_generic
,
2707 spr_register(env
, SPR_MMUCSR0
, "MMUCSR0",
2708 SPR_NOACCESS
, SPR_NOACCESS
,
2709 &spr_read_generic
, &spr_write_generic
,
2710 0x00000000); /* TOFIX */
2711 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
2712 SPR_NOACCESS
, SPR_NOACCESS
,
2713 &spr_read_generic
, &spr_write_generic
,
2715 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
2716 SPR_NOACCESS
, SPR_NOACCESS
,
2717 &spr_read_generic
, &spr_write_generic
,
2719 #if !defined(CONFIG_USER_ONLY)
2723 env
->tlb_type
= TLB_EMB
;
2725 init_excp_e200(env
, 0xFFFF0000UL
);
2726 env
->dcache_line_size
= 32;
2727 env
->icache_line_size
= 32;
2728 /* XXX: TODO: allocate internal IRQ controller */
2731 POWERPC_FAMILY(e200
)(ObjectClass
*oc
, void *data
)
2733 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2734 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2736 dc
->desc
= "e200 core";
2737 pcc
->init_proc
= init_proc_e200
;
2738 pcc
->check_pow
= check_pow_hid0
;
2740 * XXX: unimplemented instructions:
2747 * all SPE multiply-accumulate instructions
2749 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
2750 PPC_SPE
| PPC_SPE_SINGLE
|
2751 PPC_WRTEE
| PPC_RFDI
|
2752 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
2753 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2754 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
|
2756 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
2770 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
2771 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2772 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2773 pcc
->bfd_mach
= bfd_mach_ppc_860
;
2774 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
2775 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
2776 POWERPC_FLAG_BUS_CLK
;
2779 enum fsl_e500_version
{
2787 static void init_proc_e500(CPUPPCState
*env
, int version
)
2789 uint32_t tlbncfg
[2];
2791 uint64_t ivpr_mask
= 0xFFFF0000ULL
;
2792 uint32_t l1cfg0
= 0x3800 /* 8 ways */
2793 | 0x0020; /* 32 kb */
2794 uint32_t l1cfg1
= 0x3800 /* 8 ways */
2795 | 0x0020; /* 32 kb */
2796 uint32_t mmucfg
= 0;
2797 #if !defined(CONFIG_USER_ONLY)
2802 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
2803 * complain when accessing them.
2804 * register_BookE_sprs(env, 0x0000000F0000FD7FULL);
2810 ivor_mask
= 0x0000000F0000FFFFULL
;
2814 ivor_mask
= 0x000003FE0000FFFFULL
;
2817 ivor_mask
= 0x000003FF0000FFFFULL
;
2820 register_BookE_sprs(env
, ivor_mask
);
2822 spr_register(env
, SPR_USPRG3
, "USPRG3",
2823 &spr_read_ureg
, SPR_NOACCESS
,
2824 &spr_read_ureg
, SPR_NOACCESS
,
2827 /* Processor identification */
2828 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
2829 SPR_NOACCESS
, SPR_NOACCESS
,
2830 &spr_read_generic
, &spr_write_pir
,
2833 spr_register(env
, SPR_BOOKE_SPEFSCR
, "SPEFSCR",
2834 &spr_read_spefscr
, &spr_write_spefscr
,
2835 &spr_read_spefscr
, &spr_write_spefscr
,
2837 #if !defined(CONFIG_USER_ONLY)
2838 /* Memory management */
2844 tlbncfg
[0] = register_tlbncfg(2, 1, 1, 0, 256);
2845 tlbncfg
[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 16);
2848 tlbncfg
[0] = register_tlbncfg(4, 1, 1, 0, 512);
2849 tlbncfg
[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 16);
2853 tlbncfg
[0] = register_tlbncfg(4, 1, 1, 0, 512);
2854 tlbncfg
[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 64);
2859 tlbncfg
[0] = 0x08052400;
2860 tlbncfg
[1] = 0x40028040;
2863 cpu_abort(env_cpu(env
), "Unknown CPU: " TARGET_FMT_lx
"\n",
2871 env
->dcache_line_size
= 32;
2872 env
->icache_line_size
= 32;
2876 env
->dcache_line_size
= 64;
2877 env
->icache_line_size
= 64;
2878 l1cfg0
|= 0x1000000; /* 64 byte cache block size */
2879 l1cfg1
|= 0x1000000; /* 64 byte cache block size */
2882 env
->dcache_line_size
= 32;
2883 env
->icache_line_size
= 32;
2884 l1cfg0
|= 0x0F83820;
2885 l1cfg1
|= 0x0B83820;
2888 cpu_abort(env_cpu(env
), "Unknown CPU: " TARGET_FMT_lx
"\n",
2891 register_BookE206_sprs(env
, 0x000000DF, tlbncfg
, mmucfg
);
2892 register_usprgh_sprs(env
);
2894 spr_register(env
, SPR_HID0
, "HID0",
2895 SPR_NOACCESS
, SPR_NOACCESS
,
2896 &spr_read_generic
, &spr_write_generic
,
2899 spr_register(env
, SPR_HID1
, "HID1",
2900 SPR_NOACCESS
, SPR_NOACCESS
,
2901 &spr_read_generic
, &spr_write_generic
,
2904 spr_register(env
, SPR_Exxx_BBEAR
, "BBEAR",
2905 SPR_NOACCESS
, SPR_NOACCESS
,
2906 &spr_read_generic
, &spr_write_generic
,
2909 spr_register(env
, SPR_Exxx_BBTAR
, "BBTAR",
2910 SPR_NOACCESS
, SPR_NOACCESS
,
2911 &spr_read_generic
, &spr_write_generic
,
2914 spr_register(env
, SPR_Exxx_MCAR
, "MCAR",
2915 SPR_NOACCESS
, SPR_NOACCESS
,
2916 &spr_read_generic
, &spr_write_generic
,
2919 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
2920 SPR_NOACCESS
, SPR_NOACCESS
,
2921 &spr_read_generic
, &spr_write_generic
,
2924 spr_register(env
, SPR_Exxx_NPIDR
, "NPIDR",
2925 SPR_NOACCESS
, SPR_NOACCESS
,
2926 &spr_read_generic
, &spr_write_generic
,
2929 spr_register(env
, SPR_Exxx_BUCSR
, "BUCSR",
2930 SPR_NOACCESS
, SPR_NOACCESS
,
2931 &spr_read_generic
, &spr_write_generic
,
2934 spr_register(env
, SPR_Exxx_L1CFG0
, "L1CFG0",
2935 &spr_read_generic
, SPR_NOACCESS
,
2936 &spr_read_generic
, SPR_NOACCESS
,
2938 spr_register(env
, SPR_Exxx_L1CFG1
, "L1CFG1",
2939 &spr_read_generic
, SPR_NOACCESS
,
2940 &spr_read_generic
, SPR_NOACCESS
,
2942 spr_register(env
, SPR_Exxx_L1CSR0
, "L1CSR0",
2943 SPR_NOACCESS
, SPR_NOACCESS
,
2944 &spr_read_generic
, &spr_write_e500_l1csr0
,
2946 spr_register(env
, SPR_Exxx_L1CSR1
, "L1CSR1",
2947 SPR_NOACCESS
, SPR_NOACCESS
,
2948 &spr_read_generic
, &spr_write_e500_l1csr1
,
2950 if (version
!= fsl_e500v1
&& version
!= fsl_e500v2
) {
2951 spr_register(env
, SPR_Exxx_L2CSR0
, "L2CSR0",
2952 SPR_NOACCESS
, SPR_NOACCESS
,
2953 &spr_read_generic
, &spr_write_e500_l2csr0
,
2956 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
2957 SPR_NOACCESS
, SPR_NOACCESS
,
2958 &spr_read_generic
, &spr_write_generic
,
2960 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
2961 SPR_NOACCESS
, SPR_NOACCESS
,
2962 &spr_read_generic
, &spr_write_generic
,
2964 spr_register(env
, SPR_MMUCSR0
, "MMUCSR0",
2965 SPR_NOACCESS
, SPR_NOACCESS
,
2966 &spr_read_generic
, &spr_write_booke206_mmucsr0
,
2968 spr_register(env
, SPR_BOOKE_EPR
, "EPR",
2969 SPR_NOACCESS
, SPR_NOACCESS
,
2970 &spr_read_generic
, SPR_NOACCESS
,
2972 /* XXX better abstract into Emb.xxx features */
2973 if ((version
== fsl_e5500
) || (version
== fsl_e6500
)) {
2974 spr_register(env
, SPR_BOOKE_EPCR
, "EPCR",
2975 SPR_NOACCESS
, SPR_NOACCESS
,
2976 &spr_read_generic
, &spr_write_generic
,
2978 spr_register(env
, SPR_BOOKE_MAS7_MAS3
, "MAS7_MAS3",
2979 SPR_NOACCESS
, SPR_NOACCESS
,
2980 &spr_read_mas73
, &spr_write_mas73
,
2982 ivpr_mask
= (target_ulong
)~0xFFFFULL
;
2985 if (version
== fsl_e6500
) {
2986 /* Thread identification */
2987 spr_register(env
, SPR_TIR
, "TIR",
2988 SPR_NOACCESS
, SPR_NOACCESS
,
2989 &spr_read_generic
, SPR_NOACCESS
,
2991 spr_register(env
, SPR_BOOKE_TLB0PS
, "TLB0PS",
2992 SPR_NOACCESS
, SPR_NOACCESS
,
2993 &spr_read_generic
, SPR_NOACCESS
,
2995 spr_register(env
, SPR_BOOKE_TLB1PS
, "TLB1PS",
2996 SPR_NOACCESS
, SPR_NOACCESS
,
2997 &spr_read_generic
, SPR_NOACCESS
,
3001 #if !defined(CONFIG_USER_ONLY)
3003 env
->tlb_type
= TLB_MAS
;
3004 for (i
= 0; i
< BOOKE206_MAX_TLBN
; i
++) {
3005 env
->nb_tlb
+= booke206_tlb_size(env
, i
);
3009 init_excp_e200(env
, ivpr_mask
);
3010 /* Allocate hardware IRQ controller */
3011 ppce500_irq_init(env_archcpu(env
));
3014 static void init_proc_e500v1(CPUPPCState
*env
)
3016 init_proc_e500(env
, fsl_e500v1
);
3019 POWERPC_FAMILY(e500v1
)(ObjectClass
*oc
, void *data
)
3021 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3022 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3024 dc
->desc
= "e500v1 core";
3025 pcc
->init_proc
= init_proc_e500v1
;
3026 pcc
->check_pow
= check_pow_hid0
;
3027 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3028 PPC_SPE
| PPC_SPE_SINGLE
|
3029 PPC_WRTEE
| PPC_RFDI
|
3030 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3031 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3032 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3033 pcc
->insns_flags2
= PPC2_BOOKE206
;
3034 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3048 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3049 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3050 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3051 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3052 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3053 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3054 POWERPC_FLAG_BUS_CLK
;
3057 static void init_proc_e500v2(CPUPPCState
*env
)
3059 init_proc_e500(env
, fsl_e500v2
);
3062 POWERPC_FAMILY(e500v2
)(ObjectClass
*oc
, void *data
)
3064 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3065 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3067 dc
->desc
= "e500v2 core";
3068 pcc
->init_proc
= init_proc_e500v2
;
3069 pcc
->check_pow
= check_pow_hid0
;
3070 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3071 PPC_SPE
| PPC_SPE_SINGLE
| PPC_SPE_DOUBLE
|
3072 PPC_WRTEE
| PPC_RFDI
|
3073 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3074 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3075 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3076 pcc
->insns_flags2
= PPC2_BOOKE206
;
3077 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3091 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3092 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3093 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3094 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3095 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3096 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3097 POWERPC_FLAG_BUS_CLK
;
3100 static void init_proc_e500mc(CPUPPCState
*env
)
3102 init_proc_e500(env
, fsl_e500mc
);
3105 POWERPC_FAMILY(e500mc
)(ObjectClass
*oc
, void *data
)
3107 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3108 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3110 dc
->desc
= "e500mc core";
3111 pcc
->init_proc
= init_proc_e500mc
;
3112 pcc
->check_pow
= check_pow_none
;
3113 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3114 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3115 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3116 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3117 PPC_FLOAT
| PPC_FLOAT_FRES
|
3118 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3119 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3120 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3121 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
;
3122 pcc
->msr_mask
= (1ull << MSR_GS
) |
3123 (1ull << MSR_UCLE
) |
3136 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3137 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3138 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3139 /* FIXME: figure out the correct flag for e500mc */
3140 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3141 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3142 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3146 static void init_proc_e5500(CPUPPCState
*env
)
3148 init_proc_e500(env
, fsl_e5500
);
3151 POWERPC_FAMILY(e5500
)(ObjectClass
*oc
, void *data
)
3153 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3154 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3156 dc
->desc
= "e5500 core";
3157 pcc
->init_proc
= init_proc_e5500
;
3158 pcc
->check_pow
= check_pow_none
;
3159 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3160 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3161 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3162 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3163 PPC_FLOAT
| PPC_FLOAT_FRES
|
3164 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3165 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3166 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
|
3167 PPC_64B
| PPC_POPCNTB
| PPC_POPCNTWD
;
3168 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
| PPC2_PERM_ISA206
|
3170 pcc
->msr_mask
= (1ull << MSR_CM
) |
3172 (1ull << MSR_UCLE
) |
3185 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3186 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3187 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3188 /* FIXME: figure out the correct flag for e5500 */
3189 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3190 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3191 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3194 static void init_proc_e6500(CPUPPCState
*env
)
3196 init_proc_e500(env
, fsl_e6500
);
3199 POWERPC_FAMILY(e6500
)(ObjectClass
*oc
, void *data
)
3201 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3202 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3204 dc
->desc
= "e6500 core";
3205 pcc
->init_proc
= init_proc_e6500
;
3206 pcc
->check_pow
= check_pow_none
;
3207 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3208 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3209 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3210 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3211 PPC_FLOAT
| PPC_FLOAT_FRES
|
3212 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3213 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3214 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
|
3215 PPC_64B
| PPC_POPCNTB
| PPC_POPCNTWD
| PPC_ALTIVEC
;
3216 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
| PPC2_PERM_ISA206
|
3217 PPC2_FP_CVT_S64
| PPC2_ATOMIC_ISA206
;
3218 pcc
->msr_mask
= (1ull << MSR_CM
) |
3220 (1ull << MSR_UCLE
) |
3234 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3235 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3236 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3237 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3238 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3239 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_VRE
;
3244 /* Non-embedded PowerPC */
3245 static void init_proc_603(CPUPPCState
*env
)
3247 register_non_embedded_sprs(env
);
3248 register_sdr1_sprs(env
);
3249 register_603_sprs(env
);
3251 /* Memory management */
3252 register_low_BATs(env
);
3253 register_6xx_7xx_soft_tlb(env
, 64, 2);
3255 env
->dcache_line_size
= 32;
3256 env
->icache_line_size
= 32;
3257 /* Allocate hardware IRQ controller */
3258 ppc6xx_irq_init(env_archcpu(env
));
3261 POWERPC_FAMILY(603)(ObjectClass
*oc
, void *data
)
3263 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3264 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3266 dc
->desc
= "PowerPC 603";
3267 pcc
->init_proc
= init_proc_603
;
3268 pcc
->check_pow
= check_pow_hid0
;
3269 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3270 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3271 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3272 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3273 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3274 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3275 PPC_SEGMENT
| PPC_EXTERN
;
3276 pcc
->msr_mask
= (1ull << MSR_POW
) |
3277 (1ull << MSR_TGPR
) |
3292 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3293 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3294 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3295 pcc
->bfd_mach
= bfd_mach_ppc_603
;
3296 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3297 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3300 POWERPC_FAMILY(603E
)(ObjectClass
*oc
, void *data
)
3302 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3303 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3305 dc
->desc
= "PowerPC 603e";
3306 pcc
->init_proc
= init_proc_603
;
3307 pcc
->check_pow
= check_pow_hid0
;
3308 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3309 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3310 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3311 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3312 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3313 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3314 PPC_SEGMENT
| PPC_EXTERN
;
3315 pcc
->msr_mask
= (1ull << MSR_POW
) |
3316 (1ull << MSR_TGPR
) |
3331 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3332 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3333 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3334 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
3335 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3336 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3339 static void init_proc_e300(CPUPPCState
*env
)
3342 register_e300_sprs(env
);
3345 POWERPC_FAMILY(e300
)(ObjectClass
*oc
, void *data
)
3347 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3348 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3350 dc
->desc
= "e300 core";
3351 pcc
->init_proc
= init_proc_e300
;
3352 pcc
->check_pow
= check_pow_hid0
;
3353 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3354 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3356 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3357 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3358 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3359 PPC_SEGMENT
| PPC_EXTERN
;
3360 pcc
->msr_mask
= (1ull << MSR_POW
) |
3361 (1ull << MSR_TGPR
) |
3377 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3378 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3379 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3380 pcc
->bfd_mach
= bfd_mach_ppc_603
;
3381 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3382 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3385 static void init_proc_604(CPUPPCState
*env
)
3387 register_non_embedded_sprs(env
);
3388 register_sdr1_sprs(env
);
3389 register_604_sprs(env
);
3391 /* Memory management */
3392 register_low_BATs(env
);
3394 env
->dcache_line_size
= 32;
3395 env
->icache_line_size
= 32;
3396 /* Allocate hardware IRQ controller */
3397 ppc6xx_irq_init(env_archcpu(env
));
3400 POWERPC_FAMILY(604)(ObjectClass
*oc
, void *data
)
3402 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3403 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3405 dc
->desc
= "PowerPC 604";
3406 pcc
->init_proc
= init_proc_604
;
3407 pcc
->check_pow
= check_pow_nocheck
;
3408 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3409 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3410 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3411 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3412 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3413 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3414 PPC_SEGMENT
| PPC_EXTERN
;
3415 pcc
->msr_mask
= (1ull << MSR_POW
) |
3431 pcc
->mmu_model
= POWERPC_MMU_32B
;
3432 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3433 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3434 pcc
->bfd_mach
= bfd_mach_ppc_604
;
3435 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3436 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3439 static void init_proc_604E(CPUPPCState
*env
)
3442 register_604e_sprs(env
);
3445 POWERPC_FAMILY(604E
)(ObjectClass
*oc
, void *data
)
3447 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3448 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3450 dc
->desc
= "PowerPC 604E";
3451 pcc
->init_proc
= init_proc_604E
;
3452 pcc
->check_pow
= check_pow_nocheck
;
3453 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3454 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3455 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3456 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3457 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3458 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3459 PPC_SEGMENT
| PPC_EXTERN
;
3460 pcc
->msr_mask
= (1ull << MSR_POW
) |
3476 pcc
->mmu_model
= POWERPC_MMU_32B
;
3477 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3478 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3479 pcc
->bfd_mach
= bfd_mach_ppc_604
;
3480 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3481 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3484 static void init_proc_740(CPUPPCState
*env
)
3486 register_non_embedded_sprs(env
);
3487 register_sdr1_sprs(env
);
3488 register_7xx_sprs(env
);
3489 /* Thermal management */
3490 register_thrm_sprs(env
);
3492 /* Memory management */
3493 register_low_BATs(env
);
3495 env
->dcache_line_size
= 32;
3496 env
->icache_line_size
= 32;
3497 /* Allocate hardware IRQ controller */
3498 ppc6xx_irq_init(env_archcpu(env
));
3501 POWERPC_FAMILY(740)(ObjectClass
*oc
, void *data
)
3503 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3504 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3506 dc
->desc
= "PowerPC 740";
3507 pcc
->init_proc
= init_proc_740
;
3508 pcc
->check_pow
= check_pow_hid0
;
3509 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3510 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3511 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3512 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3513 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3514 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3515 PPC_SEGMENT
| PPC_EXTERN
;
3516 pcc
->msr_mask
= (1ull << MSR_POW
) |
3532 pcc
->mmu_model
= POWERPC_MMU_32B
;
3533 pcc
->excp_model
= POWERPC_EXCP_7xx
;
3534 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3535 pcc
->bfd_mach
= bfd_mach_ppc_750
;
3536 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3537 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3540 static void init_proc_750(CPUPPCState
*env
)
3542 register_non_embedded_sprs(env
);
3543 register_sdr1_sprs(env
);
3544 register_7xx_sprs(env
);
3546 spr_register(env
, SPR_L2CR
, "L2CR",
3547 SPR_NOACCESS
, SPR_NOACCESS
,
3548 &spr_read_generic
, spr_access_nop
,
3550 /* Thermal management */
3551 register_thrm_sprs(env
);
3553 /* Memory management */
3554 register_low_BATs(env
);
3556 * XXX: high BATs are also present but are known to be bugged on
3560 env
->dcache_line_size
= 32;
3561 env
->icache_line_size
= 32;
3562 /* Allocate hardware IRQ controller */
3563 ppc6xx_irq_init(env_archcpu(env
));
3566 POWERPC_FAMILY(750)(ObjectClass
*oc
, void *data
)
3568 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3569 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3571 dc
->desc
= "PowerPC 750";
3572 pcc
->init_proc
= init_proc_750
;
3573 pcc
->check_pow
= check_pow_hid0
;
3574 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3575 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3576 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3577 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3578 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3579 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3580 PPC_SEGMENT
| PPC_EXTERN
;
3581 pcc
->msr_mask
= (1ull << MSR_POW
) |
3597 pcc
->mmu_model
= POWERPC_MMU_32B
;
3598 pcc
->excp_model
= POWERPC_EXCP_7xx
;
3599 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3600 pcc
->bfd_mach
= bfd_mach_ppc_750
;
3601 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3602 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3605 static void init_proc_750cl(CPUPPCState
*env
)
3607 register_non_embedded_sprs(env
);
3608 register_sdr1_sprs(env
);
3609 register_7xx_sprs(env
);
3611 spr_register(env
, SPR_L2CR
, "L2CR",
3612 SPR_NOACCESS
, SPR_NOACCESS
,
3613 &spr_read_generic
, spr_access_nop
,
3615 /* Thermal management */
3616 /* Those registers are fake on 750CL */
3617 spr_register(env
, SPR_THRM1
, "THRM1",
3618 SPR_NOACCESS
, SPR_NOACCESS
,
3619 &spr_read_generic
, &spr_write_generic
,
3621 spr_register(env
, SPR_THRM2
, "THRM2",
3622 SPR_NOACCESS
, SPR_NOACCESS
,
3623 &spr_read_generic
, &spr_write_generic
,
3625 spr_register(env
, SPR_THRM3
, "THRM3",
3626 SPR_NOACCESS
, SPR_NOACCESS
,
3627 &spr_read_generic
, &spr_write_generic
,
3630 spr_register(env
, SPR_750_TDCL
, "TDCL",
3631 SPR_NOACCESS
, SPR_NOACCESS
,
3632 &spr_read_generic
, &spr_write_generic
,
3634 spr_register(env
, SPR_750_TDCH
, "TDCH",
3635 SPR_NOACCESS
, SPR_NOACCESS
,
3636 &spr_read_generic
, &spr_write_generic
,
3639 spr_register(env
, SPR_750_WPAR
, "WPAR",
3640 SPR_NOACCESS
, SPR_NOACCESS
,
3641 &spr_read_generic
, &spr_write_generic
,
3643 spr_register(env
, SPR_750_DMAL
, "DMAL",
3644 SPR_NOACCESS
, SPR_NOACCESS
,
3645 &spr_read_generic
, &spr_write_generic
,
3647 spr_register(env
, SPR_750_DMAU
, "DMAU",
3648 SPR_NOACCESS
, SPR_NOACCESS
,
3649 &spr_read_generic
, &spr_write_generic
,
3651 /* Hardware implementation registers */
3652 spr_register(env
, SPR_750CL_HID2
, "HID2",
3653 SPR_NOACCESS
, SPR_NOACCESS
,
3654 &spr_read_generic
, &spr_write_generic
,
3657 spr_register(env
, SPR_750CL_HID4
, "HID4",
3658 SPR_NOACCESS
, SPR_NOACCESS
,
3659 &spr_read_generic
, &spr_write_generic
,
3661 /* Quantization registers */
3662 spr_register(env
, SPR_750_GQR0
, "GQR0",
3663 SPR_NOACCESS
, SPR_NOACCESS
,
3664 &spr_read_generic
, &spr_write_generic
,
3667 spr_register(env
, SPR_750_GQR1
, "GQR1",
3668 SPR_NOACCESS
, SPR_NOACCESS
,
3669 &spr_read_generic
, &spr_write_generic
,
3672 spr_register(env
, SPR_750_GQR2
, "GQR2",
3673 SPR_NOACCESS
, SPR_NOACCESS
,
3674 &spr_read_generic
, &spr_write_generic
,
3677 spr_register(env
, SPR_750_GQR3
, "GQR3",
3678 SPR_NOACCESS
, SPR_NOACCESS
,
3679 &spr_read_generic
, &spr_write_generic
,
3682 spr_register(env
, SPR_750_GQR4
, "GQR4",
3683 SPR_NOACCESS
, SPR_NOACCESS
,
3684 &spr_read_generic
, &spr_write_generic
,
3687 spr_register(env
, SPR_750_GQR5
, "GQR5",
3688 SPR_NOACCESS
, SPR_NOACCESS
,
3689 &spr_read_generic
, &spr_write_generic
,
3692 spr_register(env
, SPR_750_GQR6
, "GQR6",
3693 SPR_NOACCESS
, SPR_NOACCESS
,
3694 &spr_read_generic
, &spr_write_generic
,
3697 spr_register(env
, SPR_750_GQR7
, "GQR7",
3698 SPR_NOACCESS
, SPR_NOACCESS
,
3699 &spr_read_generic
, &spr_write_generic
,
3701 /* Memory management */
3702 register_low_BATs(env
);
3703 /* PowerPC 750cl has 8 DBATs and 8 IBATs */
3704 register_high_BATs(env
);
3705 init_excp_750cl(env
);
3706 env
->dcache_line_size
= 32;
3707 env
->icache_line_size
= 32;
3708 /* Allocate hardware IRQ controller */
3709 ppc6xx_irq_init(env_archcpu(env
));
3712 POWERPC_FAMILY(750cl
)(ObjectClass
*oc
, void *data
)
3714 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3715 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3717 dc
->desc
= "PowerPC 750 CL";
3718 pcc
->init_proc
= init_proc_750cl
;
3719 pcc
->check_pow
= check_pow_hid0
;
3721 * XXX: not implemented:
3722 * cache lock instructions:
3724 * floating point paired instructions
3759 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3760 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3761 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3762 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3763 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3764 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3765 PPC_SEGMENT
| PPC_EXTERN
;
3766 pcc
->msr_mask
= (1ull << MSR_POW
) |
3782 pcc
->mmu_model
= POWERPC_MMU_32B
;
3783 pcc
->excp_model
= POWERPC_EXCP_7xx
;
3784 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3785 pcc
->bfd_mach
= bfd_mach_ppc_750
;
3786 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3787 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3790 static void init_proc_750cx(CPUPPCState
*env
)
3792 register_non_embedded_sprs(env
);
3793 register_sdr1_sprs(env
);
3794 register_7xx_sprs(env
);
3796 spr_register(env
, SPR_L2CR
, "L2CR",
3797 SPR_NOACCESS
, SPR_NOACCESS
,
3798 &spr_read_generic
, spr_access_nop
,
3800 /* Thermal management */
3801 register_thrm_sprs(env
);
3803 spr_register(env
, SPR_SDA
, "SDA",
3804 SPR_NOACCESS
, SPR_NOACCESS
,
3805 &spr_read_generic
, &spr_write_generic
,
3808 /* Memory management */
3809 register_low_BATs(env
);
3810 /* PowerPC 750cx has 8 DBATs and 8 IBATs */
3811 register_high_BATs(env
);
3812 init_excp_750cx(env
);
3813 env
->dcache_line_size
= 32;
3814 env
->icache_line_size
= 32;
3815 /* Allocate hardware IRQ controller */
3816 ppc6xx_irq_init(env_archcpu(env
));
3819 POWERPC_FAMILY(750cx
)(ObjectClass
*oc
, void *data
)
3821 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3822 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3824 dc
->desc
= "PowerPC 750CX";
3825 pcc
->init_proc
= init_proc_750cx
;
3826 pcc
->check_pow
= check_pow_hid0
;
3827 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3828 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3829 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3830 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3831 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3832 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3833 PPC_SEGMENT
| PPC_EXTERN
;
3834 pcc
->msr_mask
= (1ull << MSR_POW
) |
3850 pcc
->mmu_model
= POWERPC_MMU_32B
;
3851 pcc
->excp_model
= POWERPC_EXCP_7xx
;
3852 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3853 pcc
->bfd_mach
= bfd_mach_ppc_750
;
3854 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3855 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3858 static void init_proc_750fx(CPUPPCState
*env
)
3860 register_non_embedded_sprs(env
);
3861 register_sdr1_sprs(env
);
3862 register_7xx_sprs(env
);
3864 spr_register(env
, SPR_L2CR
, "L2CR",
3865 SPR_NOACCESS
, SPR_NOACCESS
,
3866 &spr_read_generic
, spr_access_nop
,
3868 /* Thermal management */
3869 register_thrm_sprs(env
);
3871 spr_register(env
, SPR_750_THRM4
, "THRM4",
3872 SPR_NOACCESS
, SPR_NOACCESS
,
3873 &spr_read_generic
, &spr_write_generic
,
3875 /* Hardware implementation registers */
3876 spr_register(env
, SPR_750FX_HID2
, "HID2",
3877 SPR_NOACCESS
, SPR_NOACCESS
,
3878 &spr_read_generic
, &spr_write_generic
,
3880 /* Memory management */
3881 register_low_BATs(env
);
3882 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
3883 register_high_BATs(env
);
3885 env
->dcache_line_size
= 32;
3886 env
->icache_line_size
= 32;
3887 /* Allocate hardware IRQ controller */
3888 ppc6xx_irq_init(env_archcpu(env
));
3891 POWERPC_FAMILY(750fx
)(ObjectClass
*oc
, void *data
)
3893 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3894 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3896 dc
->desc
= "PowerPC 750FX";
3897 pcc
->init_proc
= init_proc_750fx
;
3898 pcc
->check_pow
= check_pow_hid0
;
3899 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3900 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3901 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3902 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3903 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3904 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3905 PPC_SEGMENT
| PPC_EXTERN
;
3906 pcc
->msr_mask
= (1ull << MSR_POW
) |
3922 pcc
->mmu_model
= POWERPC_MMU_32B
;
3923 pcc
->excp_model
= POWERPC_EXCP_7xx
;
3924 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3925 pcc
->bfd_mach
= bfd_mach_ppc_750
;
3926 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3927 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3930 static void init_proc_750gx(CPUPPCState
*env
)
3932 register_non_embedded_sprs(env
);
3933 register_sdr1_sprs(env
);
3934 register_7xx_sprs(env
);
3936 spr_register(env
, SPR_L2CR
, "L2CR",
3937 SPR_NOACCESS
, SPR_NOACCESS
,
3938 &spr_read_generic
, spr_access_nop
,
3940 /* Thermal management */
3941 register_thrm_sprs(env
);
3943 spr_register(env
, SPR_750_THRM4
, "THRM4",
3944 SPR_NOACCESS
, SPR_NOACCESS
,
3945 &spr_read_generic
, &spr_write_generic
,
3947 /* Hardware implementation registers */
3948 spr_register(env
, SPR_750FX_HID2
, "HID2",
3949 SPR_NOACCESS
, SPR_NOACCESS
,
3950 &spr_read_generic
, &spr_write_generic
,
3952 /* Memory management */
3953 register_low_BATs(env
);
3954 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
3955 register_high_BATs(env
);
3957 env
->dcache_line_size
= 32;
3958 env
->icache_line_size
= 32;
3959 /* Allocate hardware IRQ controller */
3960 ppc6xx_irq_init(env_archcpu(env
));
3963 POWERPC_FAMILY(750gx
)(ObjectClass
*oc
, void *data
)
3965 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3966 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3968 dc
->desc
= "PowerPC 750GX";
3969 pcc
->init_proc
= init_proc_750gx
;
3970 pcc
->check_pow
= check_pow_hid0
;
3971 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3972 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3973 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3974 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3975 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3976 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3977 PPC_SEGMENT
| PPC_EXTERN
;
3978 pcc
->msr_mask
= (1ull << MSR_POW
) |
3994 pcc
->mmu_model
= POWERPC_MMU_32B
;
3995 pcc
->excp_model
= POWERPC_EXCP_7xx
;
3996 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3997 pcc
->bfd_mach
= bfd_mach_ppc_750
;
3998 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3999 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4002 static void init_proc_745(CPUPPCState
*env
)
4004 register_non_embedded_sprs(env
);
4005 register_sdr1_sprs(env
);
4006 register_7xx_sprs(env
);
4007 register_745_sprs(env
);
4008 /* Thermal management */
4009 register_thrm_sprs(env
);
4011 /* Memory management */
4012 register_low_BATs(env
);
4013 register_high_BATs(env
);
4014 register_6xx_7xx_soft_tlb(env
, 64, 2);
4016 env
->dcache_line_size
= 32;
4017 env
->icache_line_size
= 32;
4018 /* Allocate hardware IRQ controller */
4019 ppc6xx_irq_init(env_archcpu(env
));
4022 POWERPC_FAMILY(745)(ObjectClass
*oc
, void *data
)
4024 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4025 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4027 dc
->desc
= "PowerPC 745";
4028 pcc
->init_proc
= init_proc_745
;
4029 pcc
->check_pow
= check_pow_hid0
;
4030 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4031 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4032 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4033 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4034 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4035 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
4036 PPC_SEGMENT
| PPC_EXTERN
;
4037 pcc
->msr_mask
= (1ull << MSR_POW
) |
4053 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
4054 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4055 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4056 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4057 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4058 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4061 static void init_proc_755(CPUPPCState
*env
)
4064 register_755_sprs(env
);
4067 POWERPC_FAMILY(755)(ObjectClass
*oc
, void *data
)
4069 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4070 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4072 dc
->desc
= "PowerPC 755";
4073 pcc
->init_proc
= init_proc_755
;
4074 pcc
->check_pow
= check_pow_hid0
;
4075 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4076 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4077 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4078 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4079 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4080 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
4081 PPC_SEGMENT
| PPC_EXTERN
;
4082 pcc
->msr_mask
= (1ull << MSR_POW
) |
4098 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
4099 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4100 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4101 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4102 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4103 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4106 static void init_proc_7400(CPUPPCState
*env
)
4108 register_non_embedded_sprs(env
);
4109 register_sdr1_sprs(env
);
4110 register_74xx_sprs(env
);
4111 vscr_init(env
, 0x00010000);
4113 spr_register(env
, SPR_UBAMR
, "UBAMR",
4114 &spr_read_ureg
, SPR_NOACCESS
,
4115 &spr_read_ureg
, SPR_NOACCESS
,
4118 spr_register(env
, SPR_MSSCR1
, "MSSCR1",
4119 SPR_NOACCESS
, SPR_NOACCESS
,
4120 &spr_read_generic
, &spr_write_generic
,
4122 /* Thermal management */
4123 register_thrm_sprs(env
);
4124 /* Memory management */
4125 register_low_BATs(env
);
4126 init_excp_7400(env
);
4127 env
->dcache_line_size
= 32;
4128 env
->icache_line_size
= 32;
4129 /* Allocate hardware IRQ controller */
4130 ppc6xx_irq_init(env_archcpu(env
));
4133 POWERPC_FAMILY(7400)(ObjectClass
*oc
, void *data
)
4135 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4136 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4138 dc
->desc
= "PowerPC 7400 (aka G4)";
4139 pcc
->init_proc
= init_proc_7400
;
4140 pcc
->check_pow
= check_pow_hid0
;
4141 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4142 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4143 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4145 PPC_CACHE
| PPC_CACHE_ICBI
|
4146 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4147 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4148 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4150 PPC_SEGMENT
| PPC_EXTERN
|
4152 pcc
->msr_mask
= (1ull << MSR_VR
) |
4169 pcc
->mmu_model
= POWERPC_MMU_32B
;
4170 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4171 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4172 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4173 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4174 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4175 POWERPC_FLAG_BUS_CLK
;
4178 static void init_proc_7410(CPUPPCState
*env
)
4180 register_non_embedded_sprs(env
);
4181 register_sdr1_sprs(env
);
4182 register_74xx_sprs(env
);
4183 vscr_init(env
, 0x00010000);
4185 spr_register(env
, SPR_UBAMR
, "UBAMR",
4186 &spr_read_ureg
, SPR_NOACCESS
,
4187 &spr_read_ureg
, SPR_NOACCESS
,
4189 /* Thermal management */
4190 register_thrm_sprs(env
);
4193 spr_register(env
, SPR_L2PMCR
, "L2PMCR",
4194 SPR_NOACCESS
, SPR_NOACCESS
,
4195 &spr_read_generic
, &spr_write_generic
,
4199 spr_register(env
, SPR_LDSTDB
, "LDSTDB",
4200 SPR_NOACCESS
, SPR_NOACCESS
,
4201 &spr_read_generic
, &spr_write_generic
,
4203 /* Memory management */
4204 register_low_BATs(env
);
4205 init_excp_7400(env
);
4206 env
->dcache_line_size
= 32;
4207 env
->icache_line_size
= 32;
4208 /* Allocate hardware IRQ controller */
4209 ppc6xx_irq_init(env_archcpu(env
));
4212 POWERPC_FAMILY(7410)(ObjectClass
*oc
, void *data
)
4214 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4215 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4217 dc
->desc
= "PowerPC 7410 (aka G4)";
4218 pcc
->init_proc
= init_proc_7410
;
4219 pcc
->check_pow
= check_pow_hid0
;
4220 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4221 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4222 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4224 PPC_CACHE
| PPC_CACHE_ICBI
|
4225 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4226 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4227 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4229 PPC_SEGMENT
| PPC_EXTERN
|
4231 pcc
->msr_mask
= (1ull << MSR_VR
) |
4248 pcc
->mmu_model
= POWERPC_MMU_32B
;
4249 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4250 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4251 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4252 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4253 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4254 POWERPC_FLAG_BUS_CLK
;
4257 static void init_proc_7440(CPUPPCState
*env
)
4259 register_non_embedded_sprs(env
);
4260 register_sdr1_sprs(env
);
4261 register_74xx_sprs(env
);
4262 vscr_init(env
, 0x00010000);
4264 spr_register(env
, SPR_UBAMR
, "UBAMR",
4265 &spr_read_ureg
, SPR_NOACCESS
,
4266 &spr_read_ureg
, SPR_NOACCESS
,
4269 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4270 SPR_NOACCESS
, SPR_NOACCESS
,
4271 &spr_read_generic
, &spr_write_generic
,
4274 spr_register(env
, SPR_ICTRL
, "ICTRL",
4275 SPR_NOACCESS
, SPR_NOACCESS
,
4276 &spr_read_generic
, &spr_write_generic
,
4279 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4280 SPR_NOACCESS
, SPR_NOACCESS
,
4281 &spr_read_generic
, &spr_write_generic
,
4284 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4285 SPR_NOACCESS
, SPR_NOACCESS
,
4286 &spr_read_generic
, &spr_write_generic
,
4289 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4290 &spr_read_ureg
, SPR_NOACCESS
,
4291 &spr_read_ureg
, SPR_NOACCESS
,
4294 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4295 SPR_NOACCESS
, SPR_NOACCESS
,
4296 &spr_read_generic
, &spr_write_generic
,
4299 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4300 &spr_read_ureg
, SPR_NOACCESS
,
4301 &spr_read_ureg
, SPR_NOACCESS
,
4303 /* Memory management */
4304 register_low_BATs(env
);
4305 init_excp_7450(env
);
4306 env
->dcache_line_size
= 32;
4307 env
->icache_line_size
= 32;
4308 /* Allocate hardware IRQ controller */
4309 ppc6xx_irq_init(env_archcpu(env
));
4312 POWERPC_FAMILY(7440)(ObjectClass
*oc
, void *data
)
4314 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4315 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4317 dc
->desc
= "PowerPC 7440 (aka G4)";
4318 pcc
->init_proc
= init_proc_7440
;
4319 pcc
->check_pow
= check_pow_hid0_74xx
;
4320 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4321 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4322 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4324 PPC_CACHE
| PPC_CACHE_ICBI
|
4325 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4326 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4327 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4329 PPC_SEGMENT
| PPC_EXTERN
|
4331 pcc
->msr_mask
= (1ull << MSR_VR
) |
4348 pcc
->mmu_model
= POWERPC_MMU_32B
;
4349 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4350 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4351 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4352 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4353 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4354 POWERPC_FLAG_BUS_CLK
;
4357 static void init_proc_7450(CPUPPCState
*env
)
4359 register_non_embedded_sprs(env
);
4360 register_sdr1_sprs(env
);
4361 register_74xx_sprs(env
);
4362 vscr_init(env
, 0x00010000);
4363 /* Level 3 cache control */
4364 register_l3_ctrl(env
);
4366 spr_register(env
, SPR_L3ITCR1
, "L3ITCR1",
4367 SPR_NOACCESS
, SPR_NOACCESS
,
4368 &spr_read_generic
, &spr_write_generic
,
4371 spr_register(env
, SPR_L3ITCR2
, "L3ITCR2",
4372 SPR_NOACCESS
, SPR_NOACCESS
,
4373 &spr_read_generic
, &spr_write_generic
,
4376 spr_register(env
, SPR_L3ITCR3
, "L3ITCR3",
4377 SPR_NOACCESS
, SPR_NOACCESS
,
4378 &spr_read_generic
, &spr_write_generic
,
4381 spr_register(env
, SPR_L3OHCR
, "L3OHCR",
4382 SPR_NOACCESS
, SPR_NOACCESS
,
4383 &spr_read_generic
, &spr_write_generic
,
4386 spr_register(env
, SPR_UBAMR
, "UBAMR",
4387 &spr_read_ureg
, SPR_NOACCESS
,
4388 &spr_read_ureg
, SPR_NOACCESS
,
4391 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4392 SPR_NOACCESS
, SPR_NOACCESS
,
4393 &spr_read_generic
, &spr_write_generic
,
4396 spr_register(env
, SPR_ICTRL
, "ICTRL",
4397 SPR_NOACCESS
, SPR_NOACCESS
,
4398 &spr_read_generic
, &spr_write_generic
,
4401 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4402 SPR_NOACCESS
, SPR_NOACCESS
,
4403 &spr_read_generic
, &spr_write_generic
,
4406 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4407 SPR_NOACCESS
, SPR_NOACCESS
,
4408 &spr_read_generic
, &spr_write_generic
,
4411 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4412 &spr_read_ureg
, SPR_NOACCESS
,
4413 &spr_read_ureg
, SPR_NOACCESS
,
4416 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4417 SPR_NOACCESS
, SPR_NOACCESS
,
4418 &spr_read_generic
, &spr_write_generic
,
4421 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4422 &spr_read_ureg
, SPR_NOACCESS
,
4423 &spr_read_ureg
, SPR_NOACCESS
,
4425 /* Memory management */
4426 register_low_BATs(env
);
4427 init_excp_7450(env
);
4428 env
->dcache_line_size
= 32;
4429 env
->icache_line_size
= 32;
4430 /* Allocate hardware IRQ controller */
4431 ppc6xx_irq_init(env_archcpu(env
));
4434 POWERPC_FAMILY(7450)(ObjectClass
*oc
, void *data
)
4436 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4437 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4439 dc
->desc
= "PowerPC 7450 (aka G4)";
4440 pcc
->init_proc
= init_proc_7450
;
4441 pcc
->check_pow
= check_pow_hid0_74xx
;
4442 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4443 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4444 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4446 PPC_CACHE
| PPC_CACHE_ICBI
|
4447 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4448 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4449 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4451 PPC_SEGMENT
| PPC_EXTERN
|
4453 pcc
->msr_mask
= (1ull << MSR_VR
) |
4470 pcc
->mmu_model
= POWERPC_MMU_32B
;
4471 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4472 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4473 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4474 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4475 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4476 POWERPC_FLAG_BUS_CLK
;
4479 static void init_proc_7445(CPUPPCState
*env
)
4481 register_non_embedded_sprs(env
);
4482 register_sdr1_sprs(env
);
4483 register_74xx_sprs(env
);
4484 vscr_init(env
, 0x00010000);
4486 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4487 SPR_NOACCESS
, SPR_NOACCESS
,
4488 &spr_read_generic
, &spr_write_generic
,
4491 spr_register(env
, SPR_ICTRL
, "ICTRL",
4492 SPR_NOACCESS
, SPR_NOACCESS
,
4493 &spr_read_generic
, &spr_write_generic
,
4496 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4497 SPR_NOACCESS
, SPR_NOACCESS
,
4498 &spr_read_generic
, &spr_write_generic
,
4501 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4502 SPR_NOACCESS
, SPR_NOACCESS
,
4503 &spr_read_generic
, &spr_write_generic
,
4506 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4507 &spr_read_ureg
, SPR_NOACCESS
,
4508 &spr_read_ureg
, SPR_NOACCESS
,
4511 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4512 SPR_NOACCESS
, SPR_NOACCESS
,
4513 &spr_read_generic
, &spr_write_generic
,
4516 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4517 &spr_read_ureg
, SPR_NOACCESS
,
4518 &spr_read_ureg
, SPR_NOACCESS
,
4521 spr_register(env
, SPR_SPRG4
, "SPRG4",
4522 SPR_NOACCESS
, SPR_NOACCESS
,
4523 &spr_read_generic
, &spr_write_generic
,
4525 spr_register(env
, SPR_USPRG4
, "USPRG4",
4526 &spr_read_ureg
, SPR_NOACCESS
,
4527 &spr_read_ureg
, SPR_NOACCESS
,
4529 spr_register(env
, SPR_SPRG5
, "SPRG5",
4530 SPR_NOACCESS
, SPR_NOACCESS
,
4531 &spr_read_generic
, &spr_write_generic
,
4533 spr_register(env
, SPR_USPRG5
, "USPRG5",
4534 &spr_read_ureg
, SPR_NOACCESS
,
4535 &spr_read_ureg
, SPR_NOACCESS
,
4537 spr_register(env
, SPR_SPRG6
, "SPRG6",
4538 SPR_NOACCESS
, SPR_NOACCESS
,
4539 &spr_read_generic
, &spr_write_generic
,
4541 spr_register(env
, SPR_USPRG6
, "USPRG6",
4542 &spr_read_ureg
, SPR_NOACCESS
,
4543 &spr_read_ureg
, SPR_NOACCESS
,
4545 spr_register(env
, SPR_SPRG7
, "SPRG7",
4546 SPR_NOACCESS
, SPR_NOACCESS
,
4547 &spr_read_generic
, &spr_write_generic
,
4549 spr_register(env
, SPR_USPRG7
, "USPRG7",
4550 &spr_read_ureg
, SPR_NOACCESS
,
4551 &spr_read_ureg
, SPR_NOACCESS
,
4553 /* Memory management */
4554 register_low_BATs(env
);
4555 register_high_BATs(env
);
4556 init_excp_7450(env
);
4557 env
->dcache_line_size
= 32;
4558 env
->icache_line_size
= 32;
4559 /* Allocate hardware IRQ controller */
4560 ppc6xx_irq_init(env_archcpu(env
));
4563 POWERPC_FAMILY(7445)(ObjectClass
*oc
, void *data
)
4565 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4566 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4568 dc
->desc
= "PowerPC 7445 (aka G4)";
4569 pcc
->init_proc
= init_proc_7445
;
4570 pcc
->check_pow
= check_pow_hid0_74xx
;
4571 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4572 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4573 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4575 PPC_CACHE
| PPC_CACHE_ICBI
|
4576 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4577 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4578 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4580 PPC_SEGMENT
| PPC_EXTERN
|
4582 pcc
->msr_mask
= (1ull << MSR_VR
) |
4599 pcc
->mmu_model
= POWERPC_MMU_32B
;
4600 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4601 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4602 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4603 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4604 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4605 POWERPC_FLAG_BUS_CLK
;
4608 static void init_proc_7455(CPUPPCState
*env
)
4610 register_non_embedded_sprs(env
);
4611 register_sdr1_sprs(env
);
4612 register_74xx_sprs(env
);
4613 vscr_init(env
, 0x00010000);
4614 /* Level 3 cache control */
4615 register_l3_ctrl(env
);
4617 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4618 SPR_NOACCESS
, SPR_NOACCESS
,
4619 &spr_read_generic
, &spr_write_generic
,
4622 spr_register(env
, SPR_ICTRL
, "ICTRL",
4623 SPR_NOACCESS
, SPR_NOACCESS
,
4624 &spr_read_generic
, &spr_write_generic
,
4627 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4628 SPR_NOACCESS
, SPR_NOACCESS
,
4629 &spr_read_generic
, &spr_write_generic
,
4632 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4633 SPR_NOACCESS
, SPR_NOACCESS
,
4634 &spr_read_generic
, &spr_write_generic
,
4637 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4638 &spr_read_ureg
, SPR_NOACCESS
,
4639 &spr_read_ureg
, SPR_NOACCESS
,
4642 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4643 SPR_NOACCESS
, SPR_NOACCESS
,
4644 &spr_read_generic
, &spr_write_generic
,
4647 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4648 &spr_read_ureg
, SPR_NOACCESS
,
4649 &spr_read_ureg
, SPR_NOACCESS
,
4652 spr_register(env
, SPR_SPRG4
, "SPRG4",
4653 SPR_NOACCESS
, SPR_NOACCESS
,
4654 &spr_read_generic
, &spr_write_generic
,
4656 spr_register(env
, SPR_USPRG4
, "USPRG4",
4657 &spr_read_ureg
, SPR_NOACCESS
,
4658 &spr_read_ureg
, SPR_NOACCESS
,
4660 spr_register(env
, SPR_SPRG5
, "SPRG5",
4661 SPR_NOACCESS
, SPR_NOACCESS
,
4662 &spr_read_generic
, &spr_write_generic
,
4664 spr_register(env
, SPR_USPRG5
, "USPRG5",
4665 &spr_read_ureg
, SPR_NOACCESS
,
4666 &spr_read_ureg
, SPR_NOACCESS
,
4668 spr_register(env
, SPR_SPRG6
, "SPRG6",
4669 SPR_NOACCESS
, SPR_NOACCESS
,
4670 &spr_read_generic
, &spr_write_generic
,
4672 spr_register(env
, SPR_USPRG6
, "USPRG6",
4673 &spr_read_ureg
, SPR_NOACCESS
,
4674 &spr_read_ureg
, SPR_NOACCESS
,
4676 spr_register(env
, SPR_SPRG7
, "SPRG7",
4677 SPR_NOACCESS
, SPR_NOACCESS
,
4678 &spr_read_generic
, &spr_write_generic
,
4680 spr_register(env
, SPR_USPRG7
, "USPRG7",
4681 &spr_read_ureg
, SPR_NOACCESS
,
4682 &spr_read_ureg
, SPR_NOACCESS
,
4684 /* Memory management */
4685 register_low_BATs(env
);
4686 register_high_BATs(env
);
4687 init_excp_7450(env
);
4688 env
->dcache_line_size
= 32;
4689 env
->icache_line_size
= 32;
4690 /* Allocate hardware IRQ controller */
4691 ppc6xx_irq_init(env_archcpu(env
));
4694 POWERPC_FAMILY(7455)(ObjectClass
*oc
, void *data
)
4696 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4697 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4699 dc
->desc
= "PowerPC 7455 (aka G4)";
4700 pcc
->init_proc
= init_proc_7455
;
4701 pcc
->check_pow
= check_pow_hid0_74xx
;
4702 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4703 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4704 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4706 PPC_CACHE
| PPC_CACHE_ICBI
|
4707 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4708 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4709 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4711 PPC_SEGMENT
| PPC_EXTERN
|
4713 pcc
->msr_mask
= (1ull << MSR_VR
) |
4730 pcc
->mmu_model
= POWERPC_MMU_32B
;
4731 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4732 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4733 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4734 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4735 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4736 POWERPC_FLAG_BUS_CLK
;
4739 static void init_proc_7457(CPUPPCState
*env
)
4741 register_non_embedded_sprs(env
);
4742 register_sdr1_sprs(env
);
4743 register_74xx_sprs(env
);
4744 vscr_init(env
, 0x00010000);
4745 /* Level 3 cache control */
4746 register_l3_ctrl(env
);
4748 spr_register(env
, SPR_L3ITCR1
, "L3ITCR1",
4749 SPR_NOACCESS
, SPR_NOACCESS
,
4750 &spr_read_generic
, &spr_write_generic
,
4753 spr_register(env
, SPR_L3ITCR2
, "L3ITCR2",
4754 SPR_NOACCESS
, SPR_NOACCESS
,
4755 &spr_read_generic
, &spr_write_generic
,
4758 spr_register(env
, SPR_L3ITCR3
, "L3ITCR3",
4759 SPR_NOACCESS
, SPR_NOACCESS
,
4760 &spr_read_generic
, &spr_write_generic
,
4763 spr_register(env
, SPR_L3OHCR
, "L3OHCR",
4764 SPR_NOACCESS
, SPR_NOACCESS
,
4765 &spr_read_generic
, &spr_write_generic
,
4768 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4769 SPR_NOACCESS
, SPR_NOACCESS
,
4770 &spr_read_generic
, &spr_write_generic
,
4773 spr_register(env
, SPR_ICTRL
, "ICTRL",
4774 SPR_NOACCESS
, SPR_NOACCESS
,
4775 &spr_read_generic
, &spr_write_generic
,
4778 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4779 SPR_NOACCESS
, SPR_NOACCESS
,
4780 &spr_read_generic
, &spr_write_generic
,
4783 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4784 SPR_NOACCESS
, SPR_NOACCESS
,
4785 &spr_read_generic
, &spr_write_generic
,
4788 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4789 &spr_read_ureg
, SPR_NOACCESS
,
4790 &spr_read_ureg
, SPR_NOACCESS
,
4793 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4794 SPR_NOACCESS
, SPR_NOACCESS
,
4795 &spr_read_generic
, &spr_write_generic
,
4798 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4799 &spr_read_ureg
, SPR_NOACCESS
,
4800 &spr_read_ureg
, SPR_NOACCESS
,
4803 spr_register(env
, SPR_SPRG4
, "SPRG4",
4804 SPR_NOACCESS
, SPR_NOACCESS
,
4805 &spr_read_generic
, &spr_write_generic
,
4807 spr_register(env
, SPR_USPRG4
, "USPRG4",
4808 &spr_read_ureg
, SPR_NOACCESS
,
4809 &spr_read_ureg
, SPR_NOACCESS
,
4811 spr_register(env
, SPR_SPRG5
, "SPRG5",
4812 SPR_NOACCESS
, SPR_NOACCESS
,
4813 &spr_read_generic
, &spr_write_generic
,
4815 spr_register(env
, SPR_USPRG5
, "USPRG5",
4816 &spr_read_ureg
, SPR_NOACCESS
,
4817 &spr_read_ureg
, SPR_NOACCESS
,
4819 spr_register(env
, SPR_SPRG6
, "SPRG6",
4820 SPR_NOACCESS
, SPR_NOACCESS
,
4821 &spr_read_generic
, &spr_write_generic
,
4823 spr_register(env
, SPR_USPRG6
, "USPRG6",
4824 &spr_read_ureg
, SPR_NOACCESS
,
4825 &spr_read_ureg
, SPR_NOACCESS
,
4827 spr_register(env
, SPR_SPRG7
, "SPRG7",
4828 SPR_NOACCESS
, SPR_NOACCESS
,
4829 &spr_read_generic
, &spr_write_generic
,
4831 spr_register(env
, SPR_USPRG7
, "USPRG7",
4832 &spr_read_ureg
, SPR_NOACCESS
,
4833 &spr_read_ureg
, SPR_NOACCESS
,
4835 /* Memory management */
4836 register_low_BATs(env
);
4837 register_high_BATs(env
);
4838 init_excp_7450(env
);
4839 env
->dcache_line_size
= 32;
4840 env
->icache_line_size
= 32;
4841 /* Allocate hardware IRQ controller */
4842 ppc6xx_irq_init(env_archcpu(env
));
4845 POWERPC_FAMILY(7457)(ObjectClass
*oc
, void *data
)
4847 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4848 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4850 dc
->desc
= "PowerPC 7457 (aka G4)";
4851 pcc
->init_proc
= init_proc_7457
;
4852 pcc
->check_pow
= check_pow_hid0_74xx
;
4853 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4854 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4855 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4857 PPC_CACHE
| PPC_CACHE_ICBI
|
4858 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4859 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4860 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4862 PPC_SEGMENT
| PPC_EXTERN
|
4864 pcc
->msr_mask
= (1ull << MSR_VR
) |
4881 pcc
->mmu_model
= POWERPC_MMU_32B
;
4882 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4883 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4884 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4885 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4886 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4887 POWERPC_FLAG_BUS_CLK
;
4890 static void init_proc_e600(CPUPPCState
*env
)
4892 register_non_embedded_sprs(env
);
4893 register_sdr1_sprs(env
);
4894 register_74xx_sprs(env
);
4895 vscr_init(env
, 0x00010000);
4897 spr_register(env
, SPR_UBAMR
, "UBAMR",
4898 &spr_read_ureg
, SPR_NOACCESS
,
4899 &spr_read_ureg
, SPR_NOACCESS
,
4902 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4903 SPR_NOACCESS
, SPR_NOACCESS
,
4904 &spr_read_generic
, &spr_write_generic
,
4907 spr_register(env
, SPR_ICTRL
, "ICTRL",
4908 SPR_NOACCESS
, SPR_NOACCESS
,
4909 &spr_read_generic
, &spr_write_generic
,
4912 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4913 SPR_NOACCESS
, SPR_NOACCESS
,
4914 &spr_read_generic
, &spr_write_generic
,
4917 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4918 SPR_NOACCESS
, SPR_NOACCESS
,
4919 &spr_read_generic
, &spr_write_generic
,
4922 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4923 &spr_read_ureg
, SPR_NOACCESS
,
4924 &spr_read_ureg
, SPR_NOACCESS
,
4927 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4928 SPR_NOACCESS
, SPR_NOACCESS
,
4929 &spr_read_generic
, &spr_write_generic
,
4932 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4933 &spr_read_ureg
, SPR_NOACCESS
,
4934 &spr_read_ureg
, SPR_NOACCESS
,
4937 spr_register(env
, SPR_SPRG4
, "SPRG4",
4938 SPR_NOACCESS
, SPR_NOACCESS
,
4939 &spr_read_generic
, &spr_write_generic
,
4941 spr_register(env
, SPR_USPRG4
, "USPRG4",
4942 &spr_read_ureg
, SPR_NOACCESS
,
4943 &spr_read_ureg
, SPR_NOACCESS
,
4945 spr_register(env
, SPR_SPRG5
, "SPRG5",
4946 SPR_NOACCESS
, SPR_NOACCESS
,
4947 &spr_read_generic
, &spr_write_generic
,
4949 spr_register(env
, SPR_USPRG5
, "USPRG5",
4950 &spr_read_ureg
, SPR_NOACCESS
,
4951 &spr_read_ureg
, SPR_NOACCESS
,
4953 spr_register(env
, SPR_SPRG6
, "SPRG6",
4954 SPR_NOACCESS
, SPR_NOACCESS
,
4955 &spr_read_generic
, &spr_write_generic
,
4957 spr_register(env
, SPR_USPRG6
, "USPRG6",
4958 &spr_read_ureg
, SPR_NOACCESS
,
4959 &spr_read_ureg
, SPR_NOACCESS
,
4961 spr_register(env
, SPR_SPRG7
, "SPRG7",
4962 SPR_NOACCESS
, SPR_NOACCESS
,
4963 &spr_read_generic
, &spr_write_generic
,
4965 spr_register(env
, SPR_USPRG7
, "USPRG7",
4966 &spr_read_ureg
, SPR_NOACCESS
,
4967 &spr_read_ureg
, SPR_NOACCESS
,
4969 /* Memory management */
4970 register_low_BATs(env
);
4971 register_high_BATs(env
);
4972 init_excp_7450(env
);
4973 env
->dcache_line_size
= 32;
4974 env
->icache_line_size
= 32;
4975 /* Allocate hardware IRQ controller */
4976 ppc6xx_irq_init(env_archcpu(env
));
4979 POWERPC_FAMILY(e600
)(ObjectClass
*oc
, void *data
)
4981 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4982 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4984 dc
->desc
= "PowerPC e600";
4985 pcc
->init_proc
= init_proc_e600
;
4986 pcc
->check_pow
= check_pow_hid0_74xx
;
4987 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4988 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4989 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4991 PPC_CACHE
| PPC_CACHE_ICBI
|
4992 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4993 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4994 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4996 PPC_SEGMENT
| PPC_EXTERN
|
4998 pcc
->insns_flags2
= PPC_NONE
;
4999 pcc
->msr_mask
= (1ull << MSR_VR
) |
5016 pcc
->mmu_model
= POWERPC_MMU_32B
;
5017 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5018 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5019 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5020 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5021 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5022 POWERPC_FLAG_BUS_CLK
;
5025 #if defined(TARGET_PPC64)
5026 #if defined(CONFIG_USER_ONLY)
5027 #define POWERPC970_HID5_INIT 0x00000080
5029 #define POWERPC970_HID5_INIT 0x00000000
5032 static int check_pow_970(CPUPPCState
*env
)
5034 if (env
->spr
[SPR_HID0
] & (HID0_DEEPNAP
| HID0_DOZE
| HID0_NAP
)) {
5041 static void register_970_hid_sprs(CPUPPCState
*env
)
5043 /* Hardware implementation registers */
5044 spr_register(env
, SPR_HID0
, "HID0",
5045 SPR_NOACCESS
, SPR_NOACCESS
,
5046 &spr_read_generic
, &spr_write_clear
,
5048 spr_register(env
, SPR_HID1
, "HID1",
5049 SPR_NOACCESS
, SPR_NOACCESS
,
5050 &spr_read_generic
, &spr_write_generic
,
5052 spr_register(env
, SPR_970_HID5
, "HID5",
5053 SPR_NOACCESS
, SPR_NOACCESS
,
5054 &spr_read_generic
, &spr_write_generic
,
5055 POWERPC970_HID5_INIT
);
5058 static void register_970_hior_sprs(CPUPPCState
*env
)
5060 spr_register(env
, SPR_HIOR
, "SPR_HIOR",
5061 SPR_NOACCESS
, SPR_NOACCESS
,
5062 &spr_read_hior
, &spr_write_hior
,
5066 static void register_book3s_ctrl_sprs(CPUPPCState
*env
)
5068 spr_register(env
, SPR_CTRL
, "SPR_CTRL",
5069 SPR_NOACCESS
, SPR_NOACCESS
,
5070 SPR_NOACCESS
, &spr_write_CTRL
,
5072 spr_register(env
, SPR_UCTRL
, "SPR_UCTRL",
5073 &spr_read_ureg
, SPR_NOACCESS
,
5074 &spr_read_ureg
, SPR_NOACCESS
,
5078 static void register_book3s_altivec_sprs(CPUPPCState
*env
)
5080 if (!(env
->insns_flags
& PPC_ALTIVEC
)) {
5084 spr_register_kvm(env
, SPR_VRSAVE
, "VRSAVE",
5085 &spr_read_generic
, &spr_write_generic
,
5086 &spr_read_generic
, &spr_write_generic
,
5087 KVM_REG_PPC_VRSAVE
, 0x00000000);
5091 static void register_book3s_dbg_sprs(CPUPPCState
*env
)
5094 * TODO: different specs define different scopes for these,
5095 * will have to address this:
5096 * 970: super/write and super/read
5097 * powerisa 2.03..2.04: hypv/write and super/read.
5098 * powerisa 2.05 and newer: hypv/write and hypv/read.
5100 spr_register_kvm(env
, SPR_DABR
, "DABR",
5101 SPR_NOACCESS
, SPR_NOACCESS
,
5102 &spr_read_generic
, &spr_write_generic
,
5103 KVM_REG_PPC_DABR
, 0x00000000);
5104 spr_register_kvm(env
, SPR_DABRX
, "DABRX",
5105 SPR_NOACCESS
, SPR_NOACCESS
,
5106 &spr_read_generic
, &spr_write_generic
,
5107 KVM_REG_PPC_DABRX
, 0x00000000);
5110 static void register_book3s_207_dbg_sprs(CPUPPCState
*env
)
5112 spr_register_kvm_hv(env
, SPR_DAWR0
, "DAWR0",
5113 SPR_NOACCESS
, SPR_NOACCESS
,
5114 SPR_NOACCESS
, SPR_NOACCESS
,
5115 &spr_read_generic
, &spr_write_generic
,
5116 KVM_REG_PPC_DAWR
, 0x00000000);
5117 spr_register_kvm_hv(env
, SPR_DAWRX0
, "DAWRX0",
5118 SPR_NOACCESS
, SPR_NOACCESS
,
5119 SPR_NOACCESS
, SPR_NOACCESS
,
5120 &spr_read_generic
, &spr_write_generic
,
5121 KVM_REG_PPC_DAWRX
, 0x00000000);
5122 spr_register_kvm_hv(env
, SPR_CIABR
, "CIABR",
5123 SPR_NOACCESS
, SPR_NOACCESS
,
5124 SPR_NOACCESS
, SPR_NOACCESS
,
5125 &spr_read_generic
, &spr_write_generic
,
5126 KVM_REG_PPC_CIABR
, 0x00000000);
5129 static void register_970_dbg_sprs(CPUPPCState
*env
)
5132 spr_register(env
, SPR_IABR
, "IABR",
5133 SPR_NOACCESS
, SPR_NOACCESS
,
5134 &spr_read_generic
, &spr_write_generic
,
5138 static void register_book3s_pmu_sup_sprs(CPUPPCState
*env
)
5140 spr_register_kvm(env
, SPR_POWER_MMCR0
, "MMCR0",
5141 SPR_NOACCESS
, SPR_NOACCESS
,
5142 &spr_read_generic
, &spr_write_MMCR0
,
5143 KVM_REG_PPC_MMCR0
, 0x80000000);
5144 spr_register_kvm(env
, SPR_POWER_MMCR1
, "MMCR1",
5145 SPR_NOACCESS
, SPR_NOACCESS
,
5146 &spr_read_generic
, &spr_write_MMCR1
,
5147 KVM_REG_PPC_MMCR1
, 0x00000000);
5148 spr_register_kvm(env
, SPR_POWER_MMCRA
, "MMCRA",
5149 SPR_NOACCESS
, SPR_NOACCESS
,
5150 &spr_read_generic
, &spr_write_generic
,
5151 KVM_REG_PPC_MMCRA
, 0x00000000);
5152 spr_register_kvm(env
, SPR_POWER_PMC1
, "PMC1",
5153 SPR_NOACCESS
, SPR_NOACCESS
,
5154 &spr_read_PMC
, &spr_write_PMC
,
5155 KVM_REG_PPC_PMC1
, 0x00000000);
5156 spr_register_kvm(env
, SPR_POWER_PMC2
, "PMC2",
5157 SPR_NOACCESS
, SPR_NOACCESS
,
5158 &spr_read_PMC
, &spr_write_PMC
,
5159 KVM_REG_PPC_PMC2
, 0x00000000);
5160 spr_register_kvm(env
, SPR_POWER_PMC3
, "PMC3",
5161 SPR_NOACCESS
, SPR_NOACCESS
,
5162 &spr_read_PMC
, &spr_write_PMC
,
5163 KVM_REG_PPC_PMC3
, 0x00000000);
5164 spr_register_kvm(env
, SPR_POWER_PMC4
, "PMC4",
5165 SPR_NOACCESS
, SPR_NOACCESS
,
5166 &spr_read_PMC
, &spr_write_PMC
,
5167 KVM_REG_PPC_PMC4
, 0x00000000);
5168 spr_register_kvm(env
, SPR_POWER_PMC5
, "PMC5",
5169 SPR_NOACCESS
, SPR_NOACCESS
,
5170 &spr_read_PMC
, &spr_write_PMC
,
5171 KVM_REG_PPC_PMC5
, 0x00000000);
5172 spr_register_kvm(env
, SPR_POWER_PMC6
, "PMC6",
5173 SPR_NOACCESS
, SPR_NOACCESS
,
5174 &spr_read_PMC
, &spr_write_PMC
,
5175 KVM_REG_PPC_PMC6
, 0x00000000);
5176 spr_register_kvm(env
, SPR_POWER_SIAR
, "SIAR",
5177 SPR_NOACCESS
, SPR_NOACCESS
,
5178 &spr_read_generic
, &spr_write_generic
,
5179 KVM_REG_PPC_SIAR
, 0x00000000);
5180 spr_register_kvm(env
, SPR_POWER_SDAR
, "SDAR",
5181 SPR_NOACCESS
, SPR_NOACCESS
,
5182 &spr_read_generic
, &spr_write_generic
,
5183 KVM_REG_PPC_SDAR
, 0x00000000);
5186 static void register_book3s_pmu_user_sprs(CPUPPCState
*env
)
5188 spr_register(env
, SPR_POWER_UMMCR0
, "UMMCR0",
5189 &spr_read_MMCR0_ureg
, &spr_write_MMCR0_ureg
,
5190 &spr_read_ureg
, &spr_write_ureg
,
5192 spr_register(env
, SPR_POWER_UMMCR1
, "UMMCR1",
5193 &spr_read_ureg
, SPR_NOACCESS
,
5194 &spr_read_ureg
, &spr_write_ureg
,
5196 spr_register(env
, SPR_POWER_UMMCRA
, "UMMCRA",
5197 &spr_read_ureg
, SPR_NOACCESS
,
5198 &spr_read_ureg
, &spr_write_ureg
,
5200 spr_register(env
, SPR_POWER_UPMC1
, "UPMC1",
5201 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5202 &spr_read_ureg
, &spr_write_ureg
,
5204 spr_register(env
, SPR_POWER_UPMC2
, "UPMC2",
5205 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5206 &spr_read_ureg
, &spr_write_ureg
,
5208 spr_register(env
, SPR_POWER_UPMC3
, "UPMC3",
5209 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5210 &spr_read_ureg
, &spr_write_ureg
,
5212 spr_register(env
, SPR_POWER_UPMC4
, "UPMC4",
5213 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5214 &spr_read_ureg
, &spr_write_ureg
,
5216 spr_register(env
, SPR_POWER_UPMC5
, "UPMC5",
5217 &spr_read_PMC56_ureg
, &spr_write_PMC56_ureg
,
5218 &spr_read_ureg
, &spr_write_ureg
,
5220 spr_register(env
, SPR_POWER_UPMC6
, "UPMC6",
5221 &spr_read_PMC56_ureg
, &spr_write_PMC56_ureg
,
5222 &spr_read_ureg
, &spr_write_ureg
,
5224 spr_register(env
, SPR_POWER_USIAR
, "USIAR",
5225 &spr_read_ureg
, SPR_NOACCESS
,
5226 &spr_read_ureg
, &spr_write_ureg
,
5228 spr_register(env
, SPR_POWER_USDAR
, "USDAR",
5229 &spr_read_ureg
, SPR_NOACCESS
,
5230 &spr_read_ureg
, &spr_write_ureg
,
5234 static void register_970_pmu_sup_sprs(CPUPPCState
*env
)
5236 spr_register_kvm(env
, SPR_970_PMC7
, "PMC7",
5237 SPR_NOACCESS
, SPR_NOACCESS
,
5238 &spr_read_generic
, &spr_write_generic
,
5239 KVM_REG_PPC_PMC7
, 0x00000000);
5240 spr_register_kvm(env
, SPR_970_PMC8
, "PMC8",
5241 SPR_NOACCESS
, SPR_NOACCESS
,
5242 &spr_read_generic
, &spr_write_generic
,
5243 KVM_REG_PPC_PMC8
, 0x00000000);
5246 static void register_970_pmu_user_sprs(CPUPPCState
*env
)
5248 spr_register(env
, SPR_970_UPMC7
, "UPMC7",
5249 &spr_read_ureg
, SPR_NOACCESS
,
5250 &spr_read_ureg
, &spr_write_ureg
,
5252 spr_register(env
, SPR_970_UPMC8
, "UPMC8",
5253 &spr_read_ureg
, SPR_NOACCESS
,
5254 &spr_read_ureg
, &spr_write_ureg
,
5258 static void register_power8_pmu_sup_sprs(CPUPPCState
*env
)
5260 spr_register_kvm(env
, SPR_POWER_MMCR2
, "MMCR2",
5261 SPR_NOACCESS
, SPR_NOACCESS
,
5262 &spr_read_generic
, &spr_write_generic
,
5263 KVM_REG_PPC_MMCR2
, 0x00000000);
5264 spr_register_kvm(env
, SPR_POWER_MMCRS
, "MMCRS",
5265 SPR_NOACCESS
, SPR_NOACCESS
,
5266 &spr_read_generic
, &spr_write_generic
,
5267 KVM_REG_PPC_MMCRS
, 0x00000000);
5268 spr_register_kvm(env
, SPR_POWER_SIER
, "SIER",
5269 SPR_NOACCESS
, SPR_NOACCESS
,
5270 &spr_read_generic
, &spr_write_generic
,
5271 KVM_REG_PPC_SIER
, 0x00000000);
5272 spr_register_kvm(env
, SPR_POWER_SPMC1
, "SPMC1",
5273 SPR_NOACCESS
, SPR_NOACCESS
,
5274 &spr_read_generic
, &spr_write_generic
,
5275 KVM_REG_PPC_SPMC1
, 0x00000000);
5276 spr_register_kvm(env
, SPR_POWER_SPMC2
, "SPMC2",
5277 SPR_NOACCESS
, SPR_NOACCESS
,
5278 &spr_read_generic
, &spr_write_generic
,
5279 KVM_REG_PPC_SPMC2
, 0x00000000);
5280 spr_register_kvm(env
, SPR_TACR
, "TACR",
5281 SPR_NOACCESS
, SPR_NOACCESS
,
5282 &spr_read_generic
, &spr_write_generic
,
5283 KVM_REG_PPC_TACR
, 0x00000000);
5284 spr_register_kvm(env
, SPR_TCSCR
, "TCSCR",
5285 SPR_NOACCESS
, SPR_NOACCESS
,
5286 &spr_read_generic
, &spr_write_generic
,
5287 KVM_REG_PPC_TCSCR
, 0x00000000);
5288 spr_register_kvm(env
, SPR_CSIGR
, "CSIGR",
5289 SPR_NOACCESS
, SPR_NOACCESS
,
5290 &spr_read_generic
, &spr_write_generic
,
5291 KVM_REG_PPC_CSIGR
, 0x00000000);
5294 static void register_power8_pmu_user_sprs(CPUPPCState
*env
)
5296 spr_register(env
, SPR_POWER_UMMCR2
, "UMMCR2",
5297 &spr_read_MMCR2_ureg
, &spr_write_MMCR2_ureg
,
5298 &spr_read_ureg
, &spr_write_ureg
,
5300 spr_register(env
, SPR_POWER_USIER
, "USIER",
5301 &spr_read_generic
, SPR_NOACCESS
,
5302 &spr_read_generic
, &spr_write_generic
,
5306 static void register_power5p_ear_sprs(CPUPPCState
*env
)
5308 /* External access control */
5309 spr_register(env
, SPR_EAR
, "EAR",
5310 SPR_NOACCESS
, SPR_NOACCESS
,
5311 &spr_read_generic
, &spr_write_generic
,
5315 static void register_power5p_tb_sprs(CPUPPCState
*env
)
5317 /* TBU40 (High 40 bits of the Timebase register */
5318 spr_register_hv(env
, SPR_TBU40
, "TBU40",
5319 SPR_NOACCESS
, SPR_NOACCESS
,
5320 SPR_NOACCESS
, SPR_NOACCESS
,
5321 SPR_NOACCESS
, &spr_write_tbu40
,
5325 static void register_970_lpar_sprs(CPUPPCState
*env
)
5327 #if !defined(CONFIG_USER_ONLY)
5329 * PPC970: HID4 covers things later controlled by the LPCR and
5330 * RMOR in later CPUs, but with a different encoding. We only
5331 * support the 970 in "Apple mode" which has all hypervisor
5332 * facilities disabled by strapping, so we can basically just
5335 spr_register(env
, SPR_970_HID4
, "HID4",
5336 SPR_NOACCESS
, SPR_NOACCESS
,
5337 &spr_read_generic
, &spr_write_generic
,
5342 static void register_power5p_lpar_sprs(CPUPPCState
*env
)
5344 #if !defined(CONFIG_USER_ONLY)
5345 /* Logical partitionning */
5346 spr_register_kvm_hv(env
, SPR_LPCR
, "LPCR",
5347 SPR_NOACCESS
, SPR_NOACCESS
,
5348 SPR_NOACCESS
, SPR_NOACCESS
,
5349 &spr_read_generic
, &spr_write_lpcr
,
5350 KVM_REG_PPC_LPCR
, LPCR_LPES0
| LPCR_LPES1
);
5351 spr_register_hv(env
, SPR_HDEC
, "HDEC",
5352 SPR_NOACCESS
, SPR_NOACCESS
,
5353 SPR_NOACCESS
, SPR_NOACCESS
,
5354 &spr_read_hdecr
, &spr_write_hdecr
, 0);
5358 static void register_book3s_ids_sprs(CPUPPCState
*env
)
5360 /* FIXME: Will need to deal with thread vs core only SPRs */
5362 /* Processor identification */
5363 spr_register_hv(env
, SPR_PIR
, "PIR",
5364 SPR_NOACCESS
, SPR_NOACCESS
,
5365 &spr_read_generic
, SPR_NOACCESS
,
5366 &spr_read_generic
, NULL
,
5368 spr_register_hv(env
, SPR_HID0
, "HID0",
5369 SPR_NOACCESS
, SPR_NOACCESS
,
5370 SPR_NOACCESS
, SPR_NOACCESS
,
5371 &spr_read_generic
, &spr_write_generic
,
5373 spr_register_hv(env
, SPR_TSCR
, "TSCR",
5374 SPR_NOACCESS
, SPR_NOACCESS
,
5375 SPR_NOACCESS
, SPR_NOACCESS
,
5376 &spr_read_generic
, &spr_write_generic
,
5378 spr_register_hv(env
, SPR_HMER
, "HMER",
5379 SPR_NOACCESS
, SPR_NOACCESS
,
5380 SPR_NOACCESS
, SPR_NOACCESS
,
5381 &spr_read_generic
, &spr_write_hmer
,
5383 spr_register_hv(env
, SPR_HMEER
, "HMEER",
5384 SPR_NOACCESS
, SPR_NOACCESS
,
5385 SPR_NOACCESS
, SPR_NOACCESS
,
5386 &spr_read_generic
, &spr_write_generic
,
5388 spr_register_hv(env
, SPR_TFMR
, "TFMR",
5389 SPR_NOACCESS
, SPR_NOACCESS
,
5390 SPR_NOACCESS
, SPR_NOACCESS
,
5391 &spr_read_generic
, &spr_write_generic
,
5393 spr_register_hv(env
, SPR_LPIDR
, "LPIDR",
5394 SPR_NOACCESS
, SPR_NOACCESS
,
5395 SPR_NOACCESS
, SPR_NOACCESS
,
5396 &spr_read_generic
, &spr_write_lpidr
,
5398 spr_register_hv(env
, SPR_HFSCR
, "HFSCR",
5399 SPR_NOACCESS
, SPR_NOACCESS
,
5400 SPR_NOACCESS
, SPR_NOACCESS
,
5401 &spr_read_generic
, &spr_write_generic
,
5403 spr_register_hv(env
, SPR_MMCRC
, "MMCRC",
5404 SPR_NOACCESS
, SPR_NOACCESS
,
5405 SPR_NOACCESS
, SPR_NOACCESS
,
5406 &spr_read_generic
, &spr_write_generic
,
5408 spr_register_hv(env
, SPR_MMCRH
, "MMCRH",
5409 SPR_NOACCESS
, SPR_NOACCESS
,
5410 SPR_NOACCESS
, SPR_NOACCESS
,
5411 &spr_read_generic
, &spr_write_generic
,
5413 spr_register_hv(env
, SPR_HSPRG0
, "HSPRG0",
5414 SPR_NOACCESS
, SPR_NOACCESS
,
5415 SPR_NOACCESS
, SPR_NOACCESS
,
5416 &spr_read_generic
, &spr_write_generic
,
5418 spr_register_hv(env
, SPR_HSPRG1
, "HSPRG1",
5419 SPR_NOACCESS
, SPR_NOACCESS
,
5420 SPR_NOACCESS
, SPR_NOACCESS
,
5421 &spr_read_generic
, &spr_write_generic
,
5423 spr_register_hv(env
, SPR_HSRR0
, "HSRR0",
5424 SPR_NOACCESS
, SPR_NOACCESS
,
5425 SPR_NOACCESS
, SPR_NOACCESS
,
5426 &spr_read_generic
, &spr_write_generic
,
5428 spr_register_hv(env
, SPR_HSRR1
, "HSRR1",
5429 SPR_NOACCESS
, SPR_NOACCESS
,
5430 SPR_NOACCESS
, SPR_NOACCESS
,
5431 &spr_read_generic
, &spr_write_generic
,
5433 spr_register_hv(env
, SPR_HDAR
, "HDAR",
5434 SPR_NOACCESS
, SPR_NOACCESS
,
5435 SPR_NOACCESS
, SPR_NOACCESS
,
5436 &spr_read_generic
, &spr_write_generic
,
5438 spr_register_hv(env
, SPR_HDSISR
, "HDSISR",
5439 SPR_NOACCESS
, SPR_NOACCESS
,
5440 SPR_NOACCESS
, SPR_NOACCESS
,
5441 &spr_read_generic
, &spr_write_generic
,
5443 spr_register_hv(env
, SPR_HRMOR
, "HRMOR",
5444 SPR_NOACCESS
, SPR_NOACCESS
,
5445 SPR_NOACCESS
, SPR_NOACCESS
,
5446 &spr_read_generic
, &spr_write_generic
,
5450 static void register_rmor_sprs(CPUPPCState
*env
)
5452 spr_register_hv(env
, SPR_RMOR
, "RMOR",
5453 SPR_NOACCESS
, SPR_NOACCESS
,
5454 SPR_NOACCESS
, SPR_NOACCESS
,
5455 &spr_read_generic
, &spr_write_generic
,
5459 static void register_power8_ids_sprs(CPUPPCState
*env
)
5461 /* Thread identification */
5462 spr_register(env
, SPR_TIR
, "TIR",
5463 SPR_NOACCESS
, SPR_NOACCESS
,
5464 &spr_read_generic
, SPR_NOACCESS
,
5468 static void register_book3s_purr_sprs(CPUPPCState
*env
)
5470 #if !defined(CONFIG_USER_ONLY)
5471 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
5472 spr_register_kvm_hv(env
, SPR_PURR
, "PURR",
5473 &spr_read_purr
, SPR_NOACCESS
,
5474 &spr_read_purr
, SPR_NOACCESS
,
5475 &spr_read_purr
, &spr_write_purr
,
5476 KVM_REG_PPC_PURR
, 0x00000000);
5477 spr_register_kvm_hv(env
, SPR_SPURR
, "SPURR",
5478 &spr_read_purr
, SPR_NOACCESS
,
5479 &spr_read_purr
, SPR_NOACCESS
,
5480 &spr_read_purr
, &spr_write_purr
,
5481 KVM_REG_PPC_SPURR
, 0x00000000);
5485 static void register_power6_dbg_sprs(CPUPPCState
*env
)
5487 #if !defined(CONFIG_USER_ONLY)
5488 spr_register(env
, SPR_CFAR
, "SPR_CFAR",
5489 SPR_NOACCESS
, SPR_NOACCESS
,
5490 &spr_read_cfar
, &spr_write_cfar
,
5495 static void register_power5p_common_sprs(CPUPPCState
*env
)
5497 spr_register_kvm(env
, SPR_PPR
, "PPR",
5498 &spr_read_generic
, &spr_write_generic
,
5499 &spr_read_generic
, &spr_write_generic
,
5500 KVM_REG_PPC_PPR
, 0x00000000);
5503 static void register_power6_common_sprs(CPUPPCState
*env
)
5505 #if !defined(CONFIG_USER_ONLY)
5506 spr_register_kvm(env
, SPR_DSCR
, "SPR_DSCR",
5507 SPR_NOACCESS
, SPR_NOACCESS
,
5508 &spr_read_generic
, &spr_write_generic
,
5509 KVM_REG_PPC_DSCR
, 0x00000000);
5512 * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
5513 * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
5515 spr_register_hv(env
, SPR_PCR
, "PCR",
5516 SPR_NOACCESS
, SPR_NOACCESS
,
5517 SPR_NOACCESS
, SPR_NOACCESS
,
5518 &spr_read_generic
, &spr_write_pcr
,
5522 static void register_power8_tce_address_control_sprs(CPUPPCState
*env
)
5524 spr_register_kvm(env
, SPR_TAR
, "TAR",
5525 &spr_read_tar
, &spr_write_tar
,
5526 &spr_read_generic
, &spr_write_generic
,
5527 KVM_REG_PPC_TAR
, 0x00000000);
5530 static void register_power8_tm_sprs(CPUPPCState
*env
)
5532 spr_register_kvm(env
, SPR_TFHAR
, "TFHAR",
5533 &spr_read_tm
, &spr_write_tm
,
5534 &spr_read_tm
, &spr_write_tm
,
5535 KVM_REG_PPC_TFHAR
, 0x00000000);
5536 spr_register_kvm(env
, SPR_TFIAR
, "TFIAR",
5537 &spr_read_tm
, &spr_write_tm
,
5538 &spr_read_tm
, &spr_write_tm
,
5539 KVM_REG_PPC_TFIAR
, 0x00000000);
5540 spr_register_kvm(env
, SPR_TEXASR
, "TEXASR",
5541 &spr_read_tm
, &spr_write_tm
,
5542 &spr_read_tm
, &spr_write_tm
,
5543 KVM_REG_PPC_TEXASR
, 0x00000000);
5544 spr_register(env
, SPR_TEXASRU
, "TEXASRU",
5545 &spr_read_tm_upper32
, &spr_write_tm_upper32
,
5546 &spr_read_tm_upper32
, &spr_write_tm_upper32
,
5550 static void register_power8_ebb_sprs(CPUPPCState
*env
)
5552 spr_register(env
, SPR_BESCRS
, "BESCRS",
5553 &spr_read_ebb
, &spr_write_ebb
,
5554 &spr_read_generic
, &spr_write_generic
,
5556 spr_register(env
, SPR_BESCRSU
, "BESCRSU",
5557 &spr_read_ebb_upper32
, &spr_write_ebb_upper32
,
5558 &spr_read_prev_upper32
, &spr_write_prev_upper32
,
5560 spr_register(env
, SPR_BESCRR
, "BESCRR",
5561 &spr_read_ebb
, &spr_write_ebb
,
5562 &spr_read_generic
, &spr_write_generic
,
5564 spr_register(env
, SPR_BESCRRU
, "BESCRRU",
5565 &spr_read_ebb_upper32
, &spr_write_ebb_upper32
,
5566 &spr_read_prev_upper32
, &spr_write_prev_upper32
,
5568 spr_register_kvm(env
, SPR_EBBHR
, "EBBHR",
5569 &spr_read_ebb
, &spr_write_ebb
,
5570 &spr_read_generic
, &spr_write_generic
,
5571 KVM_REG_PPC_EBBHR
, 0x00000000);
5572 spr_register_kvm(env
, SPR_EBBRR
, "EBBRR",
5573 &spr_read_ebb
, &spr_write_ebb
,
5574 &spr_read_generic
, &spr_write_generic
,
5575 KVM_REG_PPC_EBBRR
, 0x00000000);
5576 spr_register_kvm(env
, SPR_BESCR
, "BESCR",
5577 &spr_read_ebb
, &spr_write_ebb
,
5578 &spr_read_generic
, &spr_write_generic
,
5579 KVM_REG_PPC_BESCR
, 0x00000000);
5582 /* Virtual Time Base */
5583 static void register_vtb_sprs(CPUPPCState
*env
)
5585 spr_register_kvm_hv(env
, SPR_VTB
, "VTB",
5586 SPR_NOACCESS
, SPR_NOACCESS
,
5587 &spr_read_vtb
, SPR_NOACCESS
,
5588 &spr_read_vtb
, &spr_write_vtb
,
5589 KVM_REG_PPC_VTB
, 0x00000000);
5592 static void register_power8_fscr_sprs(CPUPPCState
*env
)
5594 #if defined(CONFIG_USER_ONLY)
5595 target_ulong initval
= 1ULL << FSCR_TAR
;
5597 target_ulong initval
= 0;
5599 spr_register_kvm(env
, SPR_FSCR
, "FSCR",
5600 SPR_NOACCESS
, SPR_NOACCESS
,
5601 &spr_read_generic
, &spr_write_generic
,
5602 KVM_REG_PPC_FSCR
, initval
);
5605 static void register_power8_pspb_sprs(CPUPPCState
*env
)
5607 spr_register_kvm(env
, SPR_PSPB
, "PSPB",
5608 SPR_NOACCESS
, SPR_NOACCESS
,
5609 &spr_read_generic
, &spr_write_generic32
,
5610 KVM_REG_PPC_PSPB
, 0);
5613 static void register_power8_dpdes_sprs(CPUPPCState
*env
)
5615 #if !defined(CONFIG_USER_ONLY)
5616 /* Directed Privileged Door-bell Exception State, used for IPI */
5617 spr_register_kvm_hv(env
, SPR_DPDES
, "DPDES",
5618 SPR_NOACCESS
, SPR_NOACCESS
,
5619 &spr_read_dpdes
, SPR_NOACCESS
,
5620 &spr_read_dpdes
, &spr_write_dpdes
,
5621 KVM_REG_PPC_DPDES
, 0x00000000);
5625 static void register_power8_ic_sprs(CPUPPCState
*env
)
5627 #if !defined(CONFIG_USER_ONLY)
5628 spr_register_hv(env
, SPR_IC
, "IC",
5629 SPR_NOACCESS
, SPR_NOACCESS
,
5630 &spr_read_generic
, SPR_NOACCESS
,
5631 &spr_read_generic
, &spr_write_generic
,
5636 static void register_power8_book4_sprs(CPUPPCState
*env
)
5638 /* Add a number of P8 book4 registers */
5639 #if !defined(CONFIG_USER_ONLY)
5640 spr_register_kvm(env
, SPR_ACOP
, "ACOP",
5641 SPR_NOACCESS
, SPR_NOACCESS
,
5642 &spr_read_generic
, &spr_write_generic
,
5643 KVM_REG_PPC_ACOP
, 0);
5644 spr_register_kvm(env
, SPR_BOOKS_PID
, "PID",
5645 SPR_NOACCESS
, SPR_NOACCESS
,
5646 &spr_read_generic
, &spr_write_pidr
,
5647 KVM_REG_PPC_PID
, 0);
5648 spr_register_kvm(env
, SPR_WORT
, "WORT",
5649 SPR_NOACCESS
, SPR_NOACCESS
,
5650 &spr_read_generic
, &spr_write_generic
,
5651 KVM_REG_PPC_WORT
, 0);
5655 static void register_power7_book4_sprs(CPUPPCState
*env
)
5657 /* Add a number of P7 book4 registers */
5658 #if !defined(CONFIG_USER_ONLY)
5659 spr_register_kvm(env
, SPR_ACOP
, "ACOP",
5660 SPR_NOACCESS
, SPR_NOACCESS
,
5661 &spr_read_generic
, &spr_write_generic
,
5662 KVM_REG_PPC_ACOP
, 0);
5663 spr_register_kvm(env
, SPR_BOOKS_PID
, "PID",
5664 SPR_NOACCESS
, SPR_NOACCESS
,
5665 &spr_read_generic
, &spr_write_generic
,
5666 KVM_REG_PPC_PID
, 0);
5670 static void register_power8_rpr_sprs(CPUPPCState
*env
)
5672 #if !defined(CONFIG_USER_ONLY)
5673 spr_register_hv(env
, SPR_RPR
, "RPR",
5674 SPR_NOACCESS
, SPR_NOACCESS
,
5675 SPR_NOACCESS
, SPR_NOACCESS
,
5676 &spr_read_generic
, &spr_write_generic
,
5677 0x00000103070F1F3F);
5681 static void register_power9_mmu_sprs(CPUPPCState
*env
)
5683 #if !defined(CONFIG_USER_ONLY)
5684 /* Partition Table Control */
5685 spr_register_kvm_hv(env
, SPR_PTCR
, "PTCR",
5686 SPR_NOACCESS
, SPR_NOACCESS
,
5687 SPR_NOACCESS
, SPR_NOACCESS
,
5688 &spr_read_generic
, &spr_write_ptcr
,
5689 KVM_REG_PPC_PTCR
, 0x00000000);
5690 /* Address Segment Descriptor Register */
5691 spr_register_hv(env
, SPR_ASDR
, "ASDR",
5692 SPR_NOACCESS
, SPR_NOACCESS
,
5693 SPR_NOACCESS
, SPR_NOACCESS
,
5694 &spr_read_generic
, &spr_write_generic
,
5695 0x0000000000000000);
5700 * Initialize PMU counter overflow timers for Power8 and
5701 * newer Power chips when using TCG.
5703 static void init_tcg_pmu_power8(CPUPPCState
*env
)
5705 /* Init PMU overflow timers */
5706 if (tcg_enabled()) {
5707 cpu_ppc_pmu_init(env
);
5711 static void init_proc_book3s_common(CPUPPCState
*env
)
5713 register_non_embedded_sprs(env
);
5714 register_book3s_altivec_sprs(env
);
5715 register_book3s_pmu_sup_sprs(env
);
5716 register_book3s_pmu_user_sprs(env
);
5717 register_book3s_ctrl_sprs(env
);
5719 * Can't find information on what this should be on reset. This
5720 * value is the one used by 74xx processors.
5722 vscr_init(env
, 0x00010000);
5724 spr_register(env
, SPR_USPRG3
, "USPRG3",
5725 &spr_read_ureg
, SPR_NOACCESS
,
5726 &spr_read_ureg
, SPR_NOACCESS
,
5730 static void init_proc_970(CPUPPCState
*env
)
5732 /* Common Registers */
5733 init_proc_book3s_common(env
);
5734 register_sdr1_sprs(env
);
5735 register_book3s_dbg_sprs(env
);
5737 /* 970 Specific Registers */
5738 register_970_hid_sprs(env
);
5739 register_970_hior_sprs(env
);
5740 register_low_BATs(env
);
5741 register_970_pmu_sup_sprs(env
);
5742 register_970_pmu_user_sprs(env
);
5743 register_970_lpar_sprs(env
);
5744 register_970_dbg_sprs(env
);
5747 env
->dcache_line_size
= 128;
5748 env
->icache_line_size
= 128;
5750 /* Allocate hardware IRQ controller */
5752 ppc970_irq_init(env_archcpu(env
));
5755 POWERPC_FAMILY(970)(ObjectClass
*oc
, void *data
)
5757 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5758 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5760 dc
->desc
= "PowerPC 970";
5761 pcc
->init_proc
= init_proc_970
;
5762 pcc
->check_pow
= check_pow_970
;
5763 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5764 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5765 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5767 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
5768 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5769 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5770 PPC_64B
| PPC_ALTIVEC
|
5771 PPC_SEGMENT_64B
| PPC_SLBI
;
5772 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
5773 pcc
->msr_mask
= (1ull << MSR_SF
) |
5788 pcc
->mmu_model
= POWERPC_MMU_64B
;
5789 #if defined(CONFIG_SOFTMMU)
5790 pcc
->hash64_opts
= &ppc_hash64_opts_basic
;
5792 pcc
->excp_model
= POWERPC_EXCP_970
;
5793 pcc
->bus_model
= PPC_FLAGS_INPUT_970
;
5794 pcc
->bfd_mach
= bfd_mach_ppc64
;
5795 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5796 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5797 POWERPC_FLAG_BUS_CLK
;
5798 pcc
->l1_dcache_size
= 0x8000;
5799 pcc
->l1_icache_size
= 0x10000;
5802 static void init_proc_power5plus(CPUPPCState
*env
)
5804 /* Common Registers */
5805 init_proc_book3s_common(env
);
5806 register_sdr1_sprs(env
);
5807 register_book3s_dbg_sprs(env
);
5809 /* POWER5+ Specific Registers */
5810 register_970_hid_sprs(env
);
5811 register_970_hior_sprs(env
);
5812 register_low_BATs(env
);
5813 register_970_pmu_sup_sprs(env
);
5814 register_970_pmu_user_sprs(env
);
5815 register_power5p_common_sprs(env
);
5816 register_power5p_lpar_sprs(env
);
5817 register_power5p_ear_sprs(env
);
5818 register_power5p_tb_sprs(env
);
5821 env
->dcache_line_size
= 128;
5822 env
->icache_line_size
= 128;
5824 /* Allocate hardware IRQ controller */
5826 ppc970_irq_init(env_archcpu(env
));
5829 POWERPC_FAMILY(POWER5P
)(ObjectClass
*oc
, void *data
)
5831 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5832 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5834 dc
->fw_name
= "PowerPC,POWER5";
5835 dc
->desc
= "POWER5+";
5836 pcc
->init_proc
= init_proc_power5plus
;
5837 pcc
->check_pow
= check_pow_970
;
5838 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5839 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5840 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5843 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
5844 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5845 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5848 PPC_SEGMENT_64B
| PPC_SLBI
;
5849 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
5850 pcc
->msr_mask
= (1ull << MSR_SF
) |
5865 pcc
->lpcr_mask
= LPCR_RMLS
| LPCR_ILE
| LPCR_LPES0
| LPCR_LPES1
|
5866 LPCR_RMI
| LPCR_HDICE
;
5867 pcc
->mmu_model
= POWERPC_MMU_2_03
;
5868 #if defined(CONFIG_SOFTMMU)
5869 pcc
->hash64_opts
= &ppc_hash64_opts_basic
;
5870 pcc
->lrg_decr_bits
= 32;
5872 pcc
->excp_model
= POWERPC_EXCP_970
;
5873 pcc
->bus_model
= PPC_FLAGS_INPUT_970
;
5874 pcc
->bfd_mach
= bfd_mach_ppc64
;
5875 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5876 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5877 POWERPC_FLAG_BUS_CLK
;
5878 pcc
->l1_dcache_size
= 0x8000;
5879 pcc
->l1_icache_size
= 0x10000;
5882 static void init_proc_POWER7(CPUPPCState
*env
)
5884 /* Common Registers */
5885 init_proc_book3s_common(env
);
5886 register_sdr1_sprs(env
);
5887 register_book3s_dbg_sprs(env
);
5889 /* POWER7 Specific Registers */
5890 register_book3s_ids_sprs(env
);
5891 register_rmor_sprs(env
);
5892 register_amr_sprs(env
);
5893 register_book3s_purr_sprs(env
);
5894 register_power5p_common_sprs(env
);
5895 register_power5p_lpar_sprs(env
);
5896 register_power5p_ear_sprs(env
);
5897 register_power5p_tb_sprs(env
);
5898 register_power6_common_sprs(env
);
5899 register_power6_dbg_sprs(env
);
5900 register_power7_book4_sprs(env
);
5903 env
->dcache_line_size
= 128;
5904 env
->icache_line_size
= 128;
5906 /* Allocate hardware IRQ controller */
5907 init_excp_POWER7(env
);
5908 ppcPOWER7_irq_init(env_archcpu(env
));
5911 static bool ppc_pvr_match_power7(PowerPCCPUClass
*pcc
, uint32_t pvr
)
5913 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER7P_BASE
) {
5916 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER7_BASE
) {
5922 static bool cpu_has_work_POWER7(CPUState
*cs
)
5924 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
5925 CPUPPCState
*env
= &cpu
->env
;
5928 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
5931 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
5932 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE0
)) {
5935 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
5936 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE1
)) {
5939 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
)) &&
5940 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE2
)) {
5943 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HMI
)) &&
5944 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE2
)) {
5947 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
5952 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
5956 POWERPC_FAMILY(POWER7
)(ObjectClass
*oc
, void *data
)
5958 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5959 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5960 CPUClass
*cc
= CPU_CLASS(oc
);
5962 dc
->fw_name
= "PowerPC,POWER7";
5963 dc
->desc
= "POWER7";
5964 pcc
->pvr_match
= ppc_pvr_match_power7
;
5965 pcc
->pcr_mask
= PCR_VEC_DIS
| PCR_VSX_DIS
| PCR_COMPAT_2_05
;
5966 pcc
->pcr_supported
= PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
5967 pcc
->init_proc
= init_proc_POWER7
;
5968 pcc
->check_pow
= check_pow_nocheck
;
5969 cc
->has_work
= cpu_has_work_POWER7
;
5970 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
5971 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5972 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5973 PPC_FLOAT_FRSQRTES
|
5976 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
5977 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5978 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5979 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
5980 PPC_SEGMENT_64B
| PPC_SLBI
|
5981 PPC_POPCNTB
| PPC_POPCNTWD
|
5983 pcc
->insns_flags2
= PPC2_VSX
| PPC2_DFP
| PPC2_DBRX
| PPC2_ISA205
|
5984 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
5985 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
5986 PPC2_FP_TST_ISA206
| PPC2_FP_CVT_S64
|
5988 pcc
->msr_mask
= (1ull << MSR_SF
) |
6004 pcc
->lpcr_mask
= LPCR_VPM0
| LPCR_VPM1
| LPCR_ISL
| LPCR_DPFD
|
6005 LPCR_VRMASD
| LPCR_RMLS
| LPCR_ILE
|
6006 LPCR_P7_PECE0
| LPCR_P7_PECE1
| LPCR_P7_PECE2
|
6007 LPCR_MER
| LPCR_TC
|
6008 LPCR_LPES0
| LPCR_LPES1
| LPCR_HDICE
;
6009 pcc
->lpcr_pm
= LPCR_P7_PECE0
| LPCR_P7_PECE1
| LPCR_P7_PECE2
;
6010 pcc
->mmu_model
= POWERPC_MMU_2_06
;
6011 #if defined(CONFIG_SOFTMMU)
6012 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
6013 pcc
->lrg_decr_bits
= 32;
6015 pcc
->excp_model
= POWERPC_EXCP_POWER7
;
6016 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER7
;
6017 pcc
->bfd_mach
= bfd_mach_ppc64
;
6018 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6019 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6020 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
6022 pcc
->l1_dcache_size
= 0x8000;
6023 pcc
->l1_icache_size
= 0x8000;
6026 static void init_proc_POWER8(CPUPPCState
*env
)
6028 /* Common Registers */
6029 init_proc_book3s_common(env
);
6030 register_sdr1_sprs(env
);
6031 register_book3s_207_dbg_sprs(env
);
6033 /* Common TCG PMU */
6034 init_tcg_pmu_power8(env
);
6036 /* POWER8 Specific Registers */
6037 register_book3s_ids_sprs(env
);
6038 register_rmor_sprs(env
);
6039 register_amr_sprs(env
);
6040 register_iamr_sprs(env
);
6041 register_book3s_purr_sprs(env
);
6042 register_power5p_common_sprs(env
);
6043 register_power5p_lpar_sprs(env
);
6044 register_power5p_ear_sprs(env
);
6045 register_power5p_tb_sprs(env
);
6046 register_power6_common_sprs(env
);
6047 register_power6_dbg_sprs(env
);
6048 register_power8_tce_address_control_sprs(env
);
6049 register_power8_ids_sprs(env
);
6050 register_power8_ebb_sprs(env
);
6051 register_power8_fscr_sprs(env
);
6052 register_power8_pmu_sup_sprs(env
);
6053 register_power8_pmu_user_sprs(env
);
6054 register_power8_tm_sprs(env
);
6055 register_power8_pspb_sprs(env
);
6056 register_power8_dpdes_sprs(env
);
6057 register_vtb_sprs(env
);
6058 register_power8_ic_sprs(env
);
6059 register_power8_book4_sprs(env
);
6060 register_power8_rpr_sprs(env
);
6063 env
->dcache_line_size
= 128;
6064 env
->icache_line_size
= 128;
6066 /* Allocate hardware IRQ controller */
6067 init_excp_POWER8(env
);
6068 ppcPOWER7_irq_init(env_archcpu(env
));
6071 static bool ppc_pvr_match_power8(PowerPCCPUClass
*pcc
, uint32_t pvr
)
6073 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8NVL_BASE
) {
6076 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8E_BASE
) {
6079 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8_BASE
) {
6085 static bool cpu_has_work_POWER8(CPUState
*cs
)
6087 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
6088 CPUPPCState
*env
= &cpu
->env
;
6091 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
6094 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
6095 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE2
)) {
6098 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
6099 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE3
)) {
6102 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
)) &&
6103 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE4
)) {
6106 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HMI
)) &&
6107 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE4
)) {
6110 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
6111 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE0
)) {
6114 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
6115 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE1
)) {
6118 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
6123 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
6127 POWERPC_FAMILY(POWER8
)(ObjectClass
*oc
, void *data
)
6129 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6130 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6131 CPUClass
*cc
= CPU_CLASS(oc
);
6133 dc
->fw_name
= "PowerPC,POWER8";
6134 dc
->desc
= "POWER8";
6135 pcc
->pvr_match
= ppc_pvr_match_power8
;
6136 pcc
->pcr_mask
= PCR_TM_DIS
| PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
6137 pcc
->pcr_supported
= PCR_COMPAT_2_07
| PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
6138 pcc
->init_proc
= init_proc_POWER8
;
6139 pcc
->check_pow
= check_pow_nocheck
;
6140 cc
->has_work
= cpu_has_work_POWER8
;
6141 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
6142 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6143 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6144 PPC_FLOAT_FRSQRTES
|
6147 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6148 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6149 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6150 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
6151 PPC_SEGMENT_64B
| PPC_SLBI
|
6152 PPC_POPCNTB
| PPC_POPCNTWD
|
6154 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
6155 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
6156 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
6157 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
6158 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
6159 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
6160 PPC2_TM
| PPC2_PM_ISA206
;
6161 pcc
->msr_mask
= (1ull << MSR_SF
) |
6181 pcc
->lpcr_mask
= LPCR_VPM0
| LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
|
6182 LPCR_DPFD
| LPCR_VRMASD
| LPCR_RMLS
| LPCR_ILE
|
6183 LPCR_AIL
| LPCR_ONL
| LPCR_P8_PECE0
| LPCR_P8_PECE1
|
6184 LPCR_P8_PECE2
| LPCR_P8_PECE3
| LPCR_P8_PECE4
|
6185 LPCR_MER
| LPCR_TC
| LPCR_LPES0
| LPCR_HDICE
;
6186 pcc
->lpcr_pm
= LPCR_P8_PECE0
| LPCR_P8_PECE1
| LPCR_P8_PECE2
|
6187 LPCR_P8_PECE3
| LPCR_P8_PECE4
;
6188 pcc
->mmu_model
= POWERPC_MMU_2_07
;
6189 #if defined(CONFIG_SOFTMMU)
6190 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
6191 pcc
->lrg_decr_bits
= 32;
6192 pcc
->n_host_threads
= 8;
6194 pcc
->excp_model
= POWERPC_EXCP_POWER8
;
6195 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER7
;
6196 pcc
->bfd_mach
= bfd_mach_ppc64
;
6197 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6198 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6199 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
6200 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
;
6201 pcc
->l1_dcache_size
= 0x8000;
6202 pcc
->l1_icache_size
= 0x8000;
6205 #ifdef CONFIG_SOFTMMU
6207 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
6208 * Encoded as array of int_32s in the form:
6209 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
6211 * y -> radix mode supported page size (encoded as a shift)
6213 static struct ppc_radix_page_info POWER9_radix_page_info
= {
6216 0x0000000c, /* 4K - enc: 0x0 */
6217 0xa0000010, /* 64K - enc: 0x5 */
6218 0x20000015, /* 2M - enc: 0x1 */
6219 0x4000001e /* 1G - enc: 0x2 */
6222 #endif /* CONFIG_SOFTMMU */
6224 static void init_proc_POWER9(CPUPPCState
*env
)
6226 /* Common Registers */
6227 init_proc_book3s_common(env
);
6228 register_book3s_207_dbg_sprs(env
);
6230 /* Common TCG PMU */
6231 init_tcg_pmu_power8(env
);
6233 /* POWER8 Specific Registers */
6234 register_book3s_ids_sprs(env
);
6235 register_amr_sprs(env
);
6236 register_iamr_sprs(env
);
6237 register_book3s_purr_sprs(env
);
6238 register_power5p_common_sprs(env
);
6239 register_power5p_lpar_sprs(env
);
6240 register_power5p_ear_sprs(env
);
6241 register_power5p_tb_sprs(env
);
6242 register_power6_common_sprs(env
);
6243 register_power6_dbg_sprs(env
);
6244 register_power8_tce_address_control_sprs(env
);
6245 register_power8_ids_sprs(env
);
6246 register_power8_ebb_sprs(env
);
6247 register_power8_fscr_sprs(env
);
6248 register_power8_pmu_sup_sprs(env
);
6249 register_power8_pmu_user_sprs(env
);
6250 register_power8_tm_sprs(env
);
6251 register_power8_pspb_sprs(env
);
6252 register_power8_dpdes_sprs(env
);
6253 register_vtb_sprs(env
);
6254 register_power8_ic_sprs(env
);
6255 register_power8_book4_sprs(env
);
6256 register_power8_rpr_sprs(env
);
6257 register_power9_mmu_sprs(env
);
6259 /* POWER9 Specific registers */
6260 spr_register_kvm(env
, SPR_TIDR
, "TIDR", NULL
, NULL
,
6261 spr_read_generic
, spr_write_generic
,
6262 KVM_REG_PPC_TIDR
, 0);
6264 /* FIXME: Filter fields properly based on privilege level */
6265 spr_register_kvm_hv(env
, SPR_PSSCR
, "PSSCR", NULL
, NULL
, NULL
, NULL
,
6266 spr_read_generic
, spr_write_generic
,
6267 KVM_REG_PPC_PSSCR
, 0);
6270 env
->dcache_line_size
= 128;
6271 env
->icache_line_size
= 128;
6273 /* Allocate hardware IRQ controller */
6274 init_excp_POWER9(env
);
6275 ppcPOWER9_irq_init(env_archcpu(env
));
6278 static bool ppc_pvr_match_power9(PowerPCCPUClass
*pcc
, uint32_t pvr
)
6280 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER9_BASE
) {
6286 static bool cpu_has_work_POWER9(CPUState
*cs
)
6288 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
6289 CPUPPCState
*env
= &cpu
->env
;
6292 uint64_t psscr
= env
->spr
[SPR_PSSCR
];
6294 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
6298 /* If EC is clear, just return true on any pending interrupt */
6299 if (!(psscr
& PSSCR_EC
)) {
6302 /* External Exception */
6303 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
6304 (env
->spr
[SPR_LPCR
] & LPCR_EEE
)) {
6305 bool heic
= !!(env
->spr
[SPR_LPCR
] & LPCR_HEIC
);
6306 if (heic
== 0 || !msr_hv
|| msr_pr
) {
6310 /* Decrementer Exception */
6311 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
6312 (env
->spr
[SPR_LPCR
] & LPCR_DEE
)) {
6315 /* Machine Check or Hypervisor Maintenance Exception */
6316 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
|
6317 1u << PPC_INTERRUPT_HMI
)) && (env
->spr
[SPR_LPCR
] & LPCR_OEE
)) {
6320 /* Privileged Doorbell Exception */
6321 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
6322 (env
->spr
[SPR_LPCR
] & LPCR_PDEE
)) {
6325 /* Hypervisor Doorbell Exception */
6326 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
6327 (env
->spr
[SPR_LPCR
] & LPCR_HDEE
)) {
6330 /* Hypervisor virtualization exception */
6331 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HVIRT
)) &&
6332 (env
->spr
[SPR_LPCR
] & LPCR_HVEE
)) {
6335 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
6340 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
6344 POWERPC_FAMILY(POWER9
)(ObjectClass
*oc
, void *data
)
6346 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6347 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6348 CPUClass
*cc
= CPU_CLASS(oc
);
6350 dc
->fw_name
= "PowerPC,POWER9";
6351 dc
->desc
= "POWER9";
6352 pcc
->pvr_match
= ppc_pvr_match_power9
;
6353 pcc
->pcr_mask
= PCR_COMPAT_2_05
| PCR_COMPAT_2_06
| PCR_COMPAT_2_07
;
6354 pcc
->pcr_supported
= PCR_COMPAT_3_00
| PCR_COMPAT_2_07
| PCR_COMPAT_2_06
|
6356 pcc
->init_proc
= init_proc_POWER9
;
6357 pcc
->check_pow
= check_pow_nocheck
;
6358 cc
->has_work
= cpu_has_work_POWER9
;
6359 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
6360 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6361 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6362 PPC_FLOAT_FRSQRTES
|
6365 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6366 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6368 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
6369 PPC_SEGMENT_64B
| PPC_SLBI
|
6370 PPC_POPCNTB
| PPC_POPCNTWD
|
6372 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
6373 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
6374 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
6375 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
6376 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
6377 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
6378 PPC2_TM
| PPC2_ISA300
| PPC2_PRCNTL
;
6379 pcc
->msr_mask
= (1ull << MSR_SF
) |
6397 pcc
->lpcr_mask
= LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
| LPCR_DPFD
|
6398 (LPCR_PECE_U_MASK
& LPCR_HVEE
) | LPCR_ILE
| LPCR_AIL
|
6399 LPCR_UPRT
| LPCR_EVIRT
| LPCR_ONL
| LPCR_HR
| LPCR_LD
|
6400 (LPCR_PECE_L_MASK
& (LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
|
6401 LPCR_DEE
| LPCR_OEE
))
6402 | LPCR_MER
| LPCR_GTSE
| LPCR_TC
|
6403 LPCR_HEIC
| LPCR_LPES0
| LPCR_HVICE
| LPCR_HDICE
;
6404 pcc
->lpcr_pm
= LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
| LPCR_DEE
| LPCR_OEE
;
6405 pcc
->mmu_model
= POWERPC_MMU_3_00
;
6406 #if defined(CONFIG_SOFTMMU)
6407 /* segment page size remain the same */
6408 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
6409 pcc
->radix_page_info
= &POWER9_radix_page_info
;
6410 pcc
->lrg_decr_bits
= 56;
6411 pcc
->n_host_threads
= 4;
6413 pcc
->excp_model
= POWERPC_EXCP_POWER9
;
6414 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER9
;
6415 pcc
->bfd_mach
= bfd_mach_ppc64
;
6416 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6417 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6418 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
6419 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
| POWERPC_FLAG_SCV
;
6420 pcc
->l1_dcache_size
= 0x8000;
6421 pcc
->l1_icache_size
= 0x8000;
6424 #ifdef CONFIG_SOFTMMU
6426 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
6427 * Encoded as array of int_32s in the form:
6428 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
6430 * y -> radix mode supported page size (encoded as a shift)
6432 static struct ppc_radix_page_info POWER10_radix_page_info
= {
6435 0x0000000c, /* 4K - enc: 0x0 */
6436 0xa0000010, /* 64K - enc: 0x5 */
6437 0x20000015, /* 2M - enc: 0x1 */
6438 0x4000001e /* 1G - enc: 0x2 */
6441 #endif /* CONFIG_SOFTMMU */
6443 static void init_proc_POWER10(CPUPPCState
*env
)
6445 /* Common Registers */
6446 init_proc_book3s_common(env
);
6447 register_book3s_207_dbg_sprs(env
);
6449 /* Common TCG PMU */
6450 init_tcg_pmu_power8(env
);
6452 /* POWER8 Specific Registers */
6453 register_book3s_ids_sprs(env
);
6454 register_amr_sprs(env
);
6455 register_iamr_sprs(env
);
6456 register_book3s_purr_sprs(env
);
6457 register_power5p_common_sprs(env
);
6458 register_power5p_lpar_sprs(env
);
6459 register_power5p_ear_sprs(env
);
6460 register_power6_common_sprs(env
);
6461 register_power6_dbg_sprs(env
);
6462 register_power8_tce_address_control_sprs(env
);
6463 register_power8_ids_sprs(env
);
6464 register_power8_ebb_sprs(env
);
6465 register_power8_fscr_sprs(env
);
6466 register_power8_pmu_sup_sprs(env
);
6467 register_power8_pmu_user_sprs(env
);
6468 register_power8_tm_sprs(env
);
6469 register_power8_pspb_sprs(env
);
6470 register_vtb_sprs(env
);
6471 register_power8_ic_sprs(env
);
6472 register_power8_book4_sprs(env
);
6473 register_power8_rpr_sprs(env
);
6474 register_power9_mmu_sprs(env
);
6476 /* FIXME: Filter fields properly based on privilege level */
6477 spr_register_kvm_hv(env
, SPR_PSSCR
, "PSSCR", NULL
, NULL
, NULL
, NULL
,
6478 spr_read_generic
, spr_write_generic
,
6479 KVM_REG_PPC_PSSCR
, 0);
6482 env
->dcache_line_size
= 128;
6483 env
->icache_line_size
= 128;
6485 /* Allocate hardware IRQ controller */
6486 init_excp_POWER10(env
);
6487 ppcPOWER9_irq_init(env_archcpu(env
));
6490 static bool ppc_pvr_match_power10(PowerPCCPUClass
*pcc
, uint32_t pvr
)
6492 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER10_BASE
) {
6498 static bool cpu_has_work_POWER10(CPUState
*cs
)
6500 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
6501 CPUPPCState
*env
= &cpu
->env
;
6504 uint64_t psscr
= env
->spr
[SPR_PSSCR
];
6506 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
6510 /* If EC is clear, just return true on any pending interrupt */
6511 if (!(psscr
& PSSCR_EC
)) {
6514 /* External Exception */
6515 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
6516 (env
->spr
[SPR_LPCR
] & LPCR_EEE
)) {
6517 bool heic
= !!(env
->spr
[SPR_LPCR
] & LPCR_HEIC
);
6518 if (heic
== 0 || !msr_hv
|| msr_pr
) {
6522 /* Decrementer Exception */
6523 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
6524 (env
->spr
[SPR_LPCR
] & LPCR_DEE
)) {
6527 /* Machine Check or Hypervisor Maintenance Exception */
6528 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
|
6529 1u << PPC_INTERRUPT_HMI
)) && (env
->spr
[SPR_LPCR
] & LPCR_OEE
)) {
6532 /* Privileged Doorbell Exception */
6533 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
6534 (env
->spr
[SPR_LPCR
] & LPCR_PDEE
)) {
6537 /* Hypervisor Doorbell Exception */
6538 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
6539 (env
->spr
[SPR_LPCR
] & LPCR_HDEE
)) {
6542 /* Hypervisor virtualization exception */
6543 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HVIRT
)) &&
6544 (env
->spr
[SPR_LPCR
] & LPCR_HVEE
)) {
6547 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
6552 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
6556 POWERPC_FAMILY(POWER10
)(ObjectClass
*oc
, void *data
)
6558 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6559 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6560 CPUClass
*cc
= CPU_CLASS(oc
);
6562 dc
->fw_name
= "PowerPC,POWER10";
6563 dc
->desc
= "POWER10";
6564 pcc
->pvr_match
= ppc_pvr_match_power10
;
6565 pcc
->pcr_mask
= PCR_COMPAT_2_05
| PCR_COMPAT_2_06
| PCR_COMPAT_2_07
|
6567 pcc
->pcr_supported
= PCR_COMPAT_3_10
| PCR_COMPAT_3_00
| PCR_COMPAT_2_07
|
6568 PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
6569 pcc
->init_proc
= init_proc_POWER10
;
6570 pcc
->check_pow
= check_pow_nocheck
;
6571 cc
->has_work
= cpu_has_work_POWER10
;
6572 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
6573 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6574 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6575 PPC_FLOAT_FRSQRTES
|
6578 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6579 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6581 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
6582 PPC_SEGMENT_64B
| PPC_SLBI
|
6583 PPC_POPCNTB
| PPC_POPCNTWD
|
6585 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
6586 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
6587 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
6588 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
6589 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
6590 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
6591 PPC2_TM
| PPC2_ISA300
| PPC2_PRCNTL
| PPC2_ISA310
;
6592 pcc
->msr_mask
= (1ull << MSR_SF
) |
6610 pcc
->lpcr_mask
= LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
| LPCR_DPFD
|
6611 (LPCR_PECE_U_MASK
& LPCR_HVEE
) | LPCR_ILE
| LPCR_AIL
|
6612 LPCR_UPRT
| LPCR_EVIRT
| LPCR_ONL
| LPCR_HR
| LPCR_LD
|
6613 (LPCR_PECE_L_MASK
& (LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
|
6614 LPCR_DEE
| LPCR_OEE
))
6615 | LPCR_MER
| LPCR_GTSE
| LPCR_TC
|
6616 LPCR_HEIC
| LPCR_LPES0
| LPCR_HVICE
| LPCR_HDICE
;
6617 /* DD2 adds an extra HAIL bit */
6618 pcc
->lpcr_mask
|= LPCR_HAIL
;
6620 pcc
->lpcr_pm
= LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
| LPCR_DEE
| LPCR_OEE
;
6621 pcc
->mmu_model
= POWERPC_MMU_3_00
;
6622 #if defined(CONFIG_SOFTMMU)
6623 /* segment page size remain the same */
6624 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
6625 pcc
->radix_page_info
= &POWER10_radix_page_info
;
6626 pcc
->lrg_decr_bits
= 56;
6628 pcc
->excp_model
= POWERPC_EXCP_POWER10
;
6629 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER9
;
6630 pcc
->bfd_mach
= bfd_mach_ppc64
;
6631 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6632 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6633 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
6634 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
| POWERPC_FLAG_SCV
;
6635 pcc
->l1_dcache_size
= 0x8000;
6636 pcc
->l1_icache_size
= 0x8000;
6639 #if !defined(CONFIG_USER_ONLY)
6640 void cpu_ppc_set_vhyp(PowerPCCPU
*cpu
, PPCVirtualHypervisor
*vhyp
)
6642 CPUPPCState
*env
= &cpu
->env
;
6647 * With a virtual hypervisor mode we never allow the CPU to go
6648 * hypervisor mode itself
6650 env
->msr_mask
&= ~MSR_HVB
;
6653 #endif /* !defined(CONFIG_USER_ONLY) */
6655 #endif /* defined(TARGET_PPC64) */
6657 /*****************************************************************************/
6658 /* Generic CPU instantiation routine */
6659 static void init_ppc_proc(PowerPCCPU
*cpu
)
6661 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
6662 CPUPPCState
*env
= &cpu
->env
;
6663 #if !defined(CONFIG_USER_ONLY)
6666 env
->irq_inputs
= NULL
;
6667 /* Set all exception vectors to an invalid address */
6668 for (i
= 0; i
< POWERPC_EXCP_NB
; i
++) {
6669 env
->excp_vectors
[i
] = (target_ulong
)(-1ULL);
6671 env
->ivor_mask
= 0x00000000;
6672 env
->ivpr_mask
= 0x00000000;
6673 /* Default MMU definitions */
6677 env
->tlb_type
= TLB_NONE
;
6679 /* Register SPR common to all PowerPC implementations */
6680 register_generic_sprs(cpu
);
6682 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
6683 (*pcc
->init_proc
)(env
);
6685 #if !defined(CONFIG_USER_ONLY)
6686 ppc_gdb_gen_spr_xml(cpu
);
6689 /* MSR bits & flags consistency checks */
6690 if (env
->msr_mask
& (1 << 25)) {
6691 switch (env
->flags
& (POWERPC_FLAG_SPE
| POWERPC_FLAG_VRE
)) {
6692 case POWERPC_FLAG_SPE
:
6693 case POWERPC_FLAG_VRE
:
6696 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6697 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
6700 } else if (env
->flags
& (POWERPC_FLAG_SPE
| POWERPC_FLAG_VRE
)) {
6701 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6702 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
6705 if (env
->msr_mask
& (1 << 17)) {
6706 switch (env
->flags
& (POWERPC_FLAG_TGPR
| POWERPC_FLAG_CE
)) {
6707 case POWERPC_FLAG_TGPR
:
6708 case POWERPC_FLAG_CE
:
6711 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6712 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
6715 } else if (env
->flags
& (POWERPC_FLAG_TGPR
| POWERPC_FLAG_CE
)) {
6716 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6717 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
6720 if (env
->msr_mask
& (1 << 10)) {
6721 switch (env
->flags
& (POWERPC_FLAG_SE
| POWERPC_FLAG_DWE
|
6722 POWERPC_FLAG_UBLE
)) {
6723 case POWERPC_FLAG_SE
:
6724 case POWERPC_FLAG_DWE
:
6725 case POWERPC_FLAG_UBLE
:
6728 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6729 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
6730 "POWERPC_FLAG_UBLE\n");
6733 } else if (env
->flags
& (POWERPC_FLAG_SE
| POWERPC_FLAG_DWE
|
6734 POWERPC_FLAG_UBLE
)) {
6735 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6736 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
6737 "POWERPC_FLAG_UBLE\n");
6740 if (env
->msr_mask
& (1 << 9)) {
6741 switch (env
->flags
& (POWERPC_FLAG_BE
| POWERPC_FLAG_DE
)) {
6742 case POWERPC_FLAG_BE
:
6743 case POWERPC_FLAG_DE
:
6746 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6747 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
6750 } else if (env
->flags
& (POWERPC_FLAG_BE
| POWERPC_FLAG_DE
)) {
6751 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6752 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
6755 if (env
->msr_mask
& (1 << 2)) {
6756 switch (env
->flags
& (POWERPC_FLAG_PX
| POWERPC_FLAG_PMM
)) {
6757 case POWERPC_FLAG_PX
:
6758 case POWERPC_FLAG_PMM
:
6761 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6762 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
6765 } else if (env
->flags
& (POWERPC_FLAG_PX
| POWERPC_FLAG_PMM
)) {
6766 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
6767 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
6770 if ((env
->flags
& POWERPC_FLAG_BUS_CLK
) == 0) {
6771 fprintf(stderr
, "PowerPC flags inconsistency\n"
6772 "Should define the time-base and decrementer clock source\n");
6775 /* Allocate TLBs buffer when needed */
6776 #if !defined(CONFIG_USER_ONLY)
6777 if (env
->nb_tlb
!= 0) {
6778 int nb_tlb
= env
->nb_tlb
;
6779 if (env
->id_tlbs
!= 0) {
6782 switch (env
->tlb_type
) {
6784 env
->tlb
.tlb6
= g_new0(ppc6xx_tlb_t
, nb_tlb
);
6787 env
->tlb
.tlbe
= g_new0(ppcemb_tlb_t
, nb_tlb
);
6790 env
->tlb
.tlbm
= g_new0(ppcmas_tlb_t
, nb_tlb
);
6793 /* Pre-compute some useful values */
6794 env
->tlb_per_way
= env
->nb_tlb
/ env
->nb_ways
;
6796 if (env
->irq_inputs
== NULL
) {
6797 warn_report("no internal IRQ controller registered."
6798 " Attempt QEMU to crash very soon !");
6801 if (env
->check_pow
== NULL
) {
6802 warn_report("no power management check handler registered."
6803 " Attempt QEMU to crash very soon !");
6808 static void ppc_cpu_realize(DeviceState
*dev
, Error
**errp
)
6810 CPUState
*cs
= CPU(dev
);
6811 PowerPCCPU
*cpu
= POWERPC_CPU(dev
);
6812 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
6813 Error
*local_err
= NULL
;
6815 cpu_exec_realizefn(cs
, &local_err
);
6816 if (local_err
!= NULL
) {
6817 error_propagate(errp
, local_err
);
6820 if (cpu
->vcpu_id
== UNASSIGNED_CPU_INDEX
) {
6821 cpu
->vcpu_id
= cs
->cpu_index
;
6824 if (tcg_enabled()) {
6825 if (ppc_fixup_cpu(cpu
) != 0) {
6826 error_setg(errp
, "Unable to emulate selected CPU with TCG");
6831 create_ppc_opcodes(cpu
, &local_err
);
6832 if (local_err
!= NULL
) {
6833 error_propagate(errp
, local_err
);
6838 ppc_gdb_init(cs
, pcc
);
6841 pcc
->parent_realize(dev
, errp
);
6846 cpu_exec_unrealizefn(cs
);
6849 static void ppc_cpu_unrealize(DeviceState
*dev
)
6851 PowerPCCPU
*cpu
= POWERPC_CPU(dev
);
6852 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
6854 pcc
->parent_unrealize(dev
);
6856 cpu_remove_sync(CPU(cpu
));
6858 destroy_ppc_opcodes(cpu
);
6861 static gint
ppc_cpu_compare_class_pvr(gconstpointer a
, gconstpointer b
)
6863 ObjectClass
*oc
= (ObjectClass
*)a
;
6864 uint32_t pvr
= *(uint32_t *)b
;
6865 PowerPCCPUClass
*pcc
= (PowerPCCPUClass
*)a
;
6867 /* -cpu host does a PVR lookup during construction */
6868 if (unlikely(strcmp(object_class_get_name(oc
),
6869 TYPE_HOST_POWERPC_CPU
) == 0)) {
6873 return pcc
->pvr
== pvr
? 0 : -1;
6876 PowerPCCPUClass
*ppc_cpu_class_by_pvr(uint32_t pvr
)
6878 GSList
*list
, *item
;
6879 PowerPCCPUClass
*pcc
= NULL
;
6881 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
6882 item
= g_slist_find_custom(list
, &pvr
, ppc_cpu_compare_class_pvr
);
6884 pcc
= POWERPC_CPU_CLASS(item
->data
);
6891 static gint
ppc_cpu_compare_class_pvr_mask(gconstpointer a
, gconstpointer b
)
6893 ObjectClass
*oc
= (ObjectClass
*)a
;
6894 uint32_t pvr
= *(uint32_t *)b
;
6895 PowerPCCPUClass
*pcc
= (PowerPCCPUClass
*)a
;
6897 /* -cpu host does a PVR lookup during construction */
6898 if (unlikely(strcmp(object_class_get_name(oc
),
6899 TYPE_HOST_POWERPC_CPU
) == 0)) {
6903 if (pcc
->pvr_match(pcc
, pvr
)) {
6910 PowerPCCPUClass
*ppc_cpu_class_by_pvr_mask(uint32_t pvr
)
6912 GSList
*list
, *item
;
6913 PowerPCCPUClass
*pcc
= NULL
;
6915 list
= object_class_get_list(TYPE_POWERPC_CPU
, true);
6916 item
= g_slist_find_custom(list
, &pvr
, ppc_cpu_compare_class_pvr_mask
);
6918 pcc
= POWERPC_CPU_CLASS(item
->data
);
6925 static const char *ppc_cpu_lookup_alias(const char *alias
)
6929 for (ai
= 0; ppc_cpu_aliases
[ai
].alias
!= NULL
; ai
++) {
6930 if (strcmp(ppc_cpu_aliases
[ai
].alias
, alias
) == 0) {
6931 return ppc_cpu_aliases
[ai
].model
;
6938 static ObjectClass
*ppc_cpu_class_by_name(const char *name
)
6940 char *cpu_model
, *typename
;
6946 * Lookup by PVR if cpu_model is valid 8 digit hex number (excl:
6947 * 0x prefix if present)
6949 if (!qemu_strtoul(name
, &p
, 16, &pvr
)) {
6951 len
= (len
== 10) && (name
[1] == 'x') ? len
- 2 : len
;
6952 if ((len
== 8) && (*p
== '\0')) {
6953 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr
));
6957 cpu_model
= g_ascii_strdown(name
, -1);
6958 p
= ppc_cpu_lookup_alias(cpu_model
);
6961 cpu_model
= g_strdup(p
);
6964 typename
= g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX
, cpu_model
);
6965 oc
= object_class_by_name(typename
);
6972 PowerPCCPUClass
*ppc_cpu_get_family_class(PowerPCCPUClass
*pcc
)
6974 ObjectClass
*oc
= OBJECT_CLASS(pcc
);
6976 while (oc
&& !object_class_is_abstract(oc
)) {
6977 oc
= object_class_get_parent(oc
);
6981 return POWERPC_CPU_CLASS(oc
);
6984 /* Sort by PVR, ordering special case "host" last. */
6985 static gint
ppc_cpu_list_compare(gconstpointer a
, gconstpointer b
)
6987 ObjectClass
*oc_a
= (ObjectClass
*)a
;
6988 ObjectClass
*oc_b
= (ObjectClass
*)b
;
6989 PowerPCCPUClass
*pcc_a
= POWERPC_CPU_CLASS(oc_a
);
6990 PowerPCCPUClass
*pcc_b
= POWERPC_CPU_CLASS(oc_b
);
6991 const char *name_a
= object_class_get_name(oc_a
);
6992 const char *name_b
= object_class_get_name(oc_b
);
6994 if (strcmp(name_a
, TYPE_HOST_POWERPC_CPU
) == 0) {
6996 } else if (strcmp(name_b
, TYPE_HOST_POWERPC_CPU
) == 0) {
6999 /* Avoid an integer overflow during subtraction */
7000 if (pcc_a
->pvr
< pcc_b
->pvr
) {
7002 } else if (pcc_a
->pvr
> pcc_b
->pvr
) {
7010 static void ppc_cpu_list_entry(gpointer data
, gpointer user_data
)
7012 ObjectClass
*oc
= data
;
7013 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7014 DeviceClass
*family
= DEVICE_CLASS(ppc_cpu_get_family_class(pcc
));
7015 const char *typename
= object_class_get_name(oc
);
7019 if (unlikely(strcmp(typename
, TYPE_HOST_POWERPC_CPU
) == 0)) {
7023 name
= g_strndup(typename
,
7024 strlen(typename
) - strlen(POWERPC_CPU_TYPE_SUFFIX
));
7025 qemu_printf("PowerPC %-16s PVR %08x\n", name
, pcc
->pvr
);
7026 for (i
= 0; ppc_cpu_aliases
[i
].alias
!= NULL
; i
++) {
7027 PowerPCCPUAlias
*alias
= &ppc_cpu_aliases
[i
];
7028 ObjectClass
*alias_oc
= ppc_cpu_class_by_name(alias
->model
);
7030 if (alias_oc
!= oc
) {
7034 * If running with KVM, we might update the family alias later, so
7035 * avoid printing the wrong alias here and use "preferred" instead
7037 if (strcmp(alias
->alias
, family
->desc
) == 0) {
7038 qemu_printf("PowerPC %-16s (alias for preferred %s CPU)\n",
7039 alias
->alias
, family
->desc
);
7041 qemu_printf("PowerPC %-16s (alias for %s)\n",
7042 alias
->alias
, name
);
7048 void ppc_cpu_list(void)
7052 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
7053 list
= g_slist_sort(list
, ppc_cpu_list_compare
);
7054 g_slist_foreach(list
, ppc_cpu_list_entry
, NULL
);
7059 qemu_printf("PowerPC %s\n", "host");
7063 static void ppc_cpu_defs_entry(gpointer data
, gpointer user_data
)
7065 ObjectClass
*oc
= data
;
7066 CpuDefinitionInfoList
**first
= user_data
;
7067 const char *typename
;
7068 CpuDefinitionInfo
*info
;
7070 typename
= object_class_get_name(oc
);
7071 info
= g_malloc0(sizeof(*info
));
7072 info
->name
= g_strndup(typename
,
7073 strlen(typename
) - strlen(POWERPC_CPU_TYPE_SUFFIX
));
7075 QAPI_LIST_PREPEND(*first
, info
);
7078 CpuDefinitionInfoList
*qmp_query_cpu_definitions(Error
**errp
)
7080 CpuDefinitionInfoList
*cpu_list
= NULL
;
7084 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
7085 g_slist_foreach(list
, ppc_cpu_defs_entry
, &cpu_list
);
7088 for (i
= 0; ppc_cpu_aliases
[i
].alias
!= NULL
; i
++) {
7089 PowerPCCPUAlias
*alias
= &ppc_cpu_aliases
[i
];
7091 CpuDefinitionInfo
*info
;
7093 oc
= ppc_cpu_class_by_name(alias
->model
);
7098 info
= g_malloc0(sizeof(*info
));
7099 info
->name
= g_strdup(alias
->alias
);
7100 info
->q_typename
= g_strdup(object_class_get_name(oc
));
7102 QAPI_LIST_PREPEND(cpu_list
, info
);
7108 static void ppc_cpu_set_pc(CPUState
*cs
, vaddr value
)
7110 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7112 cpu
->env
.nip
= value
;
7115 static bool ppc_cpu_has_work(CPUState
*cs
)
7117 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7118 CPUPPCState
*env
= &cpu
->env
;
7120 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
7123 static void ppc_cpu_reset(DeviceState
*dev
)
7125 CPUState
*s
= CPU(dev
);
7126 PowerPCCPU
*cpu
= POWERPC_CPU(s
);
7127 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7128 CPUPPCState
*env
= &cpu
->env
;
7132 pcc
->parent_reset(dev
);
7134 msr
= (target_ulong
)0;
7135 msr
|= (target_ulong
)MSR_HVB
;
7136 msr
|= (target_ulong
)1 << MSR_EP
;
7137 #if defined(DO_SINGLE_STEP) && 0
7138 /* Single step trace mode */
7139 msr
|= (target_ulong
)1 << MSR_SE
;
7140 msr
|= (target_ulong
)1 << MSR_BE
;
7142 #if defined(CONFIG_USER_ONLY)
7143 msr
|= (target_ulong
)1 << MSR_FP
; /* Allow floating point usage */
7144 msr
|= (target_ulong
)1 << MSR_FE0
; /* Allow floating point exceptions */
7145 msr
|= (target_ulong
)1 << MSR_FE1
;
7146 msr
|= (target_ulong
)1 << MSR_VR
; /* Allow altivec usage */
7147 msr
|= (target_ulong
)1 << MSR_VSX
; /* Allow VSX usage */
7148 msr
|= (target_ulong
)1 << MSR_SPE
; /* Allow SPE usage */
7149 msr
|= (target_ulong
)1 << MSR_PR
;
7150 #if defined(TARGET_PPC64)
7151 msr
|= (target_ulong
)1 << MSR_TM
; /* Transactional memory */
7153 #if !TARGET_BIG_ENDIAN
7154 msr
|= (target_ulong
)1 << MSR_LE
; /* Little-endian user mode */
7155 if (!((env
->msr_mask
>> MSR_LE
) & 1)) {
7156 fprintf(stderr
, "Selected CPU does not support little-endian.\n");
7162 #if defined(TARGET_PPC64)
7163 if (mmu_is_64bit(env
->mmu_model
)) {
7164 msr
|= (1ULL << MSR_SF
);
7168 hreg_store_msr(env
, msr
, 1);
7170 #if !defined(CONFIG_USER_ONLY)
7171 env
->nip
= env
->hreset_vector
| env
->excp_prefix
;
7173 if (tcg_enabled()) {
7174 if (env
->mmu_model
!= POWERPC_MMU_REAL
) {
7175 ppc_tlb_invalidate_all(env
);
7177 pmu_update_summaries(env
);
7180 hreg_compute_hflags(env
);
7181 env
->reserve_addr
= (target_ulong
)-1ULL;
7182 /* Be sure no exception or interrupt is pending */
7183 env
->pending_interrupts
= 0;
7184 s
->exception_index
= POWERPC_EXCP_NONE
;
7185 env
->error_code
= 0;
7188 /* tininess for underflow is detected before rounding */
7189 set_float_detect_tininess(float_tininess_before_rounding
,
7192 for (i
= 0; i
< ARRAY_SIZE(env
->spr_cb
); i
++) {
7193 ppc_spr_t
*spr
= &env
->spr_cb
[i
];
7198 env
->spr
[i
] = spr
->default_value
;
7202 #ifndef CONFIG_USER_ONLY
7204 static bool ppc_cpu_is_big_endian(CPUState
*cs
)
7206 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7207 CPUPPCState
*env
= &cpu
->env
;
7209 cpu_synchronize_state(cs
);
7215 static void ppc_cpu_exec_enter(CPUState
*cs
)
7217 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7220 PPCVirtualHypervisorClass
*vhc
=
7221 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu
->vhyp
);
7222 vhc
->cpu_exec_enter(cpu
->vhyp
, cpu
);
7226 static void ppc_cpu_exec_exit(CPUState
*cs
)
7228 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7231 PPCVirtualHypervisorClass
*vhc
=
7232 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu
->vhyp
);
7233 vhc
->cpu_exec_exit(cpu
->vhyp
, cpu
);
7236 #endif /* CONFIG_TCG */
7238 #endif /* !CONFIG_USER_ONLY */
7240 static void ppc_cpu_instance_init(Object
*obj
)
7242 PowerPCCPU
*cpu
= POWERPC_CPU(obj
);
7243 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7244 CPUPPCState
*env
= &cpu
->env
;
7246 cpu_set_cpustate_pointers(cpu
);
7247 cpu
->vcpu_id
= UNASSIGNED_CPU_INDEX
;
7249 env
->msr_mask
= pcc
->msr_mask
;
7250 env
->mmu_model
= pcc
->mmu_model
;
7251 env
->excp_model
= pcc
->excp_model
;
7252 env
->bus_model
= pcc
->bus_model
;
7253 env
->insns_flags
= pcc
->insns_flags
;
7254 env
->insns_flags2
= pcc
->insns_flags2
;
7255 env
->flags
= pcc
->flags
;
7256 env
->bfd_mach
= pcc
->bfd_mach
;
7257 env
->check_pow
= pcc
->check_pow
;
7260 * Mark HV mode as supported if the CPU has an MSR_HV bit in the
7261 * msr_mask. The mask can later be cleared by PAPR mode but the hv
7262 * mode support will remain, thus enforcing that we cannot use
7263 * priv. instructions in guest in PAPR mode. For 970 we currently
7264 * simply don't set HV in msr_mask thus simulating an "Apple mode"
7265 * 970. If we ever want to support 970 HV mode, we'll have to add
7266 * a processor attribute of some sort.
7268 #if !defined(CONFIG_USER_ONLY)
7269 env
->has_hv_mode
= !!(env
->msr_mask
& MSR_HVB
);
7272 ppc_hash64_init(cpu
);
7275 static void ppc_cpu_instance_finalize(Object
*obj
)
7277 PowerPCCPU
*cpu
= POWERPC_CPU(obj
);
7279 ppc_hash64_finalize(cpu
);
7282 static bool ppc_pvr_match_default(PowerPCCPUClass
*pcc
, uint32_t pvr
)
7284 return pcc
->pvr
== pvr
;
7287 static void ppc_disas_set_info(CPUState
*cs
, disassemble_info
*info
)
7289 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7290 CPUPPCState
*env
= &cpu
->env
;
7292 if ((env
->hflags
>> MSR_LE
) & 1) {
7293 info
->endian
= BFD_ENDIAN_LITTLE
;
7295 info
->mach
= env
->bfd_mach
;
7296 if (!env
->bfd_mach
) {
7298 info
->mach
= bfd_mach_ppc64
;
7300 info
->mach
= bfd_mach_ppc
;
7303 info
->disassembler_options
= (char *)"any";
7304 info
->print_insn
= print_insn_ppc
;
7306 info
->cap_arch
= CS_ARCH_PPC
;
7308 info
->cap_mode
= CS_MODE_64
;
7312 static Property ppc_cpu_properties
[] = {
7313 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU
, pre_2_8_migration
, false),
7314 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU
, pre_2_10_migration
,
7316 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU
, pre_3_0_migration
,
7318 DEFINE_PROP_END_OF_LIST(),
7321 #ifndef CONFIG_USER_ONLY
7322 #include "hw/core/sysemu-cpu-ops.h"
7324 static const struct SysemuCPUOps ppc_sysemu_ops
= {
7325 .get_phys_page_debug
= ppc_cpu_get_phys_page_debug
,
7326 .write_elf32_note
= ppc32_cpu_write_elf32_note
,
7327 .write_elf64_note
= ppc64_cpu_write_elf64_note
,
7328 .virtio_is_big_endian
= ppc_cpu_is_big_endian
,
7329 .legacy_vmsd
= &vmstate_ppc_cpu
,
7334 #include "hw/core/tcg-cpu-ops.h"
7336 static const struct TCGCPUOps ppc_tcg_ops
= {
7337 .initialize
= ppc_translate_init
,
7339 #ifdef CONFIG_USER_ONLY
7340 .record_sigsegv
= ppc_cpu_record_sigsegv
,
7342 .tlb_fill
= ppc_cpu_tlb_fill
,
7343 .cpu_exec_interrupt
= ppc_cpu_exec_interrupt
,
7344 .do_interrupt
= ppc_cpu_do_interrupt
,
7345 .cpu_exec_enter
= ppc_cpu_exec_enter
,
7346 .cpu_exec_exit
= ppc_cpu_exec_exit
,
7347 .do_unaligned_access
= ppc_cpu_do_unaligned_access
,
7348 #endif /* !CONFIG_USER_ONLY */
7350 #endif /* CONFIG_TCG */
7352 static void ppc_cpu_class_init(ObjectClass
*oc
, void *data
)
7354 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7355 CPUClass
*cc
= CPU_CLASS(oc
);
7356 DeviceClass
*dc
= DEVICE_CLASS(oc
);
7358 device_class_set_parent_realize(dc
, ppc_cpu_realize
,
7359 &pcc
->parent_realize
);
7360 device_class_set_parent_unrealize(dc
, ppc_cpu_unrealize
,
7361 &pcc
->parent_unrealize
);
7362 pcc
->pvr_match
= ppc_pvr_match_default
;
7363 device_class_set_props(dc
, ppc_cpu_properties
);
7365 device_class_set_parent_reset(dc
, ppc_cpu_reset
, &pcc
->parent_reset
);
7367 cc
->class_by_name
= ppc_cpu_class_by_name
;
7368 cc
->has_work
= ppc_cpu_has_work
;
7369 cc
->dump_state
= ppc_cpu_dump_state
;
7370 cc
->set_pc
= ppc_cpu_set_pc
;
7371 cc
->gdb_read_register
= ppc_cpu_gdb_read_register
;
7372 cc
->gdb_write_register
= ppc_cpu_gdb_write_register
;
7373 #ifndef CONFIG_USER_ONLY
7374 cc
->sysemu_ops
= &ppc_sysemu_ops
;
7377 cc
->gdb_num_core_regs
= 71;
7378 #ifndef CONFIG_USER_ONLY
7379 cc
->gdb_get_dynamic_xml
= ppc_gdb_get_dynamic_xml
;
7381 #ifdef USE_APPLE_GDB
7382 cc
->gdb_read_register
= ppc_cpu_gdb_read_register_apple
;
7383 cc
->gdb_write_register
= ppc_cpu_gdb_write_register_apple
;
7384 cc
->gdb_num_core_regs
= 71 + 32;
7387 cc
->gdb_arch_name
= ppc_gdb_arch_name
;
7388 #if defined(TARGET_PPC64)
7389 cc
->gdb_core_xml_file
= "power64-core.xml";
7391 cc
->gdb_core_xml_file
= "power-core.xml";
7393 cc
->disas_set_info
= ppc_disas_set_info
;
7395 dc
->fw_name
= "PowerPC,UNKNOWN";
7398 cc
->tcg_ops
= &ppc_tcg_ops
;
7399 #endif /* CONFIG_TCG */
7402 static const TypeInfo ppc_cpu_type_info
= {
7403 .name
= TYPE_POWERPC_CPU
,
7405 .instance_size
= sizeof(PowerPCCPU
),
7406 .instance_align
= __alignof__(PowerPCCPU
),
7407 .instance_init
= ppc_cpu_instance_init
,
7408 .instance_finalize
= ppc_cpu_instance_finalize
,
7410 .class_size
= sizeof(PowerPCCPUClass
),
7411 .class_init
= ppc_cpu_class_init
,
7414 #ifndef CONFIG_USER_ONLY
7415 static const TypeInfo ppc_vhyp_type_info
= {
7416 .name
= TYPE_PPC_VIRTUAL_HYPERVISOR
,
7417 .parent
= TYPE_INTERFACE
,
7418 .class_size
= sizeof(PPCVirtualHypervisorClass
),
7422 static void ppc_cpu_register_types(void)
7424 type_register_static(&ppc_cpu_type_info
);
7425 #ifndef CONFIG_USER_ONLY
7426 type_register_static(&ppc_vhyp_type_info
);
7430 void ppc_cpu_dump_state(CPUState
*cs
, FILE *f
, int flags
)
7435 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7436 CPUPPCState
*env
= &cpu
->env
;
7439 qemu_fprintf(f
, "NIP " TARGET_FMT_lx
" LR " TARGET_FMT_lx
" CTR "
7440 TARGET_FMT_lx
" XER " TARGET_FMT_lx
" CPU#%d\n",
7441 env
->nip
, env
->lr
, env
->ctr
, cpu_read_xer(env
),
7443 qemu_fprintf(f
, "MSR " TARGET_FMT_lx
" HID0 " TARGET_FMT_lx
" HF "
7444 "%08x iidx %d didx %d\n",
7445 env
->msr
, env
->spr
[SPR_HID0
], env
->hflags
,
7446 cpu_mmu_index(env
, true), cpu_mmu_index(env
, false));
7447 #if !defined(NO_TIMER_DUMP)
7448 qemu_fprintf(f
, "TB %08" PRIu32
" %08" PRIu64
7449 #if !defined(CONFIG_USER_ONLY)
7450 " DECR " TARGET_FMT_lu
7453 cpu_ppc_load_tbu(env
), cpu_ppc_load_tbl(env
)
7454 #if !defined(CONFIG_USER_ONLY)
7455 , cpu_ppc_load_decr(env
)
7459 for (i
= 0; i
< 32; i
++) {
7460 if ((i
& (RGPL
- 1)) == 0) {
7461 qemu_fprintf(f
, "GPR%02d", i
);
7463 qemu_fprintf(f
, " %016" PRIx64
, ppc_dump_gpr(env
, i
));
7464 if ((i
& (RGPL
- 1)) == (RGPL
- 1)) {
7465 qemu_fprintf(f
, "\n");
7468 qemu_fprintf(f
, "CR ");
7469 for (i
= 0; i
< 8; i
++)
7470 qemu_fprintf(f
, "%01x", env
->crf
[i
]);
7471 qemu_fprintf(f
, " [");
7472 for (i
= 0; i
< 8; i
++) {
7474 if (env
->crf
[i
] & 0x08) {
7476 } else if (env
->crf
[i
] & 0x04) {
7478 } else if (env
->crf
[i
] & 0x02) {
7481 qemu_fprintf(f
, " %c%c", a
, env
->crf
[i
] & 0x01 ? 'O' : ' ');
7483 qemu_fprintf(f
, " ] RES " TARGET_FMT_lx
"\n",
7486 if (flags
& CPU_DUMP_FPU
) {
7487 for (i
= 0; i
< 32; i
++) {
7488 if ((i
& (RFPL
- 1)) == 0) {
7489 qemu_fprintf(f
, "FPR%02d", i
);
7491 qemu_fprintf(f
, " %016" PRIx64
, *cpu_fpr_ptr(env
, i
));
7492 if ((i
& (RFPL
- 1)) == (RFPL
- 1)) {
7493 qemu_fprintf(f
, "\n");
7496 qemu_fprintf(f
, "FPSCR " TARGET_FMT_lx
"\n", env
->fpscr
);
7499 #if !defined(CONFIG_USER_ONLY)
7500 qemu_fprintf(f
, " SRR0 " TARGET_FMT_lx
" SRR1 " TARGET_FMT_lx
7501 " PVR " TARGET_FMT_lx
" VRSAVE " TARGET_FMT_lx
"\n",
7502 env
->spr
[SPR_SRR0
], env
->spr
[SPR_SRR1
],
7503 env
->spr
[SPR_PVR
], env
->spr
[SPR_VRSAVE
]);
7505 qemu_fprintf(f
, "SPRG0 " TARGET_FMT_lx
" SPRG1 " TARGET_FMT_lx
7506 " SPRG2 " TARGET_FMT_lx
" SPRG3 " TARGET_FMT_lx
"\n",
7507 env
->spr
[SPR_SPRG0
], env
->spr
[SPR_SPRG1
],
7508 env
->spr
[SPR_SPRG2
], env
->spr
[SPR_SPRG3
]);
7510 qemu_fprintf(f
, "SPRG4 " TARGET_FMT_lx
" SPRG5 " TARGET_FMT_lx
7511 " SPRG6 " TARGET_FMT_lx
" SPRG7 " TARGET_FMT_lx
"\n",
7512 env
->spr
[SPR_SPRG4
], env
->spr
[SPR_SPRG5
],
7513 env
->spr
[SPR_SPRG6
], env
->spr
[SPR_SPRG7
]);
7515 switch (env
->excp_model
) {
7516 #if defined(TARGET_PPC64)
7517 case POWERPC_EXCP_POWER7
:
7518 case POWERPC_EXCP_POWER8
:
7519 case POWERPC_EXCP_POWER9
:
7520 case POWERPC_EXCP_POWER10
:
7521 qemu_fprintf(f
, "HSRR0 " TARGET_FMT_lx
" HSRR1 " TARGET_FMT_lx
"\n",
7522 env
->spr
[SPR_HSRR0
], env
->spr
[SPR_HSRR1
]);
7525 case POWERPC_EXCP_BOOKE
:
7526 qemu_fprintf(f
, "CSRR0 " TARGET_FMT_lx
" CSRR1 " TARGET_FMT_lx
7527 " MCSRR0 " TARGET_FMT_lx
" MCSRR1 " TARGET_FMT_lx
"\n",
7528 env
->spr
[SPR_BOOKE_CSRR0
], env
->spr
[SPR_BOOKE_CSRR1
],
7529 env
->spr
[SPR_BOOKE_MCSRR0
], env
->spr
[SPR_BOOKE_MCSRR1
]);
7531 qemu_fprintf(f
, " TCR " TARGET_FMT_lx
" TSR " TARGET_FMT_lx
7532 " ESR " TARGET_FMT_lx
" DEAR " TARGET_FMT_lx
"\n",
7533 env
->spr
[SPR_BOOKE_TCR
], env
->spr
[SPR_BOOKE_TSR
],
7534 env
->spr
[SPR_BOOKE_ESR
], env
->spr
[SPR_BOOKE_DEAR
]);
7536 qemu_fprintf(f
, " PIR " TARGET_FMT_lx
" DECAR " TARGET_FMT_lx
7537 " IVPR " TARGET_FMT_lx
" EPCR " TARGET_FMT_lx
"\n",
7538 env
->spr
[SPR_BOOKE_PIR
], env
->spr
[SPR_BOOKE_DECAR
],
7539 env
->spr
[SPR_BOOKE_IVPR
], env
->spr
[SPR_BOOKE_EPCR
]);
7541 qemu_fprintf(f
, " MCSR " TARGET_FMT_lx
" SPRG8 " TARGET_FMT_lx
7542 " EPR " TARGET_FMT_lx
"\n",
7543 env
->spr
[SPR_BOOKE_MCSR
], env
->spr
[SPR_BOOKE_SPRG8
],
7544 env
->spr
[SPR_BOOKE_EPR
]);
7547 qemu_fprintf(f
, " MCAR " TARGET_FMT_lx
" PID1 " TARGET_FMT_lx
7548 " PID2 " TARGET_FMT_lx
" SVR " TARGET_FMT_lx
"\n",
7549 env
->spr
[SPR_Exxx_MCAR
], env
->spr
[SPR_BOOKE_PID1
],
7550 env
->spr
[SPR_BOOKE_PID2
], env
->spr
[SPR_E500_SVR
]);
7553 * IVORs are left out as they are large and do not change often --
7554 * they can be read with "p $ivor0", "p $ivor1", etc.
7557 case POWERPC_EXCP_40x
:
7558 qemu_fprintf(f
, " TCR " TARGET_FMT_lx
" TSR " TARGET_FMT_lx
7559 " ESR " TARGET_FMT_lx
" DEAR " TARGET_FMT_lx
"\n",
7560 env
->spr
[SPR_40x_TCR
], env
->spr
[SPR_40x_TSR
],
7561 env
->spr
[SPR_40x_ESR
], env
->spr
[SPR_40x_DEAR
]);
7563 qemu_fprintf(f
, " EVPR " TARGET_FMT_lx
" SRR2 " TARGET_FMT_lx
7564 " SRR3 " TARGET_FMT_lx
" PID " TARGET_FMT_lx
"\n",
7565 env
->spr
[SPR_40x_EVPR
], env
->spr
[SPR_40x_SRR2
],
7566 env
->spr
[SPR_40x_SRR3
], env
->spr
[SPR_40x_PID
]);
7572 #if defined(TARGET_PPC64)
7573 if (env
->flags
& POWERPC_FLAG_CFAR
) {
7574 qemu_fprintf(f
, " CFAR " TARGET_FMT_lx
"\n", env
->cfar
);
7578 if (env
->spr_cb
[SPR_LPCR
].name
) {
7579 qemu_fprintf(f
, " LPCR " TARGET_FMT_lx
"\n", env
->spr
[SPR_LPCR
]);
7582 switch (env
->mmu_model
) {
7583 case POWERPC_MMU_32B
:
7584 case POWERPC_MMU_SOFT_6xx
:
7585 #if defined(TARGET_PPC64)
7586 case POWERPC_MMU_64B
:
7587 case POWERPC_MMU_2_03
:
7588 case POWERPC_MMU_2_06
:
7589 case POWERPC_MMU_2_07
:
7590 case POWERPC_MMU_3_00
:
7592 if (env
->spr_cb
[SPR_SDR1
].name
) { /* SDR1 Exists */
7593 qemu_fprintf(f
, " SDR1 " TARGET_FMT_lx
" ", env
->spr
[SPR_SDR1
]);
7595 if (env
->spr_cb
[SPR_PTCR
].name
) { /* PTCR Exists */
7596 qemu_fprintf(f
, " PTCR " TARGET_FMT_lx
" ", env
->spr
[SPR_PTCR
]);
7598 qemu_fprintf(f
, " DAR " TARGET_FMT_lx
" DSISR " TARGET_FMT_lx
"\n",
7599 env
->spr
[SPR_DAR
], env
->spr
[SPR_DSISR
]);
7601 case POWERPC_MMU_BOOKE206
:
7602 qemu_fprintf(f
, " MAS0 " TARGET_FMT_lx
" MAS1 " TARGET_FMT_lx
7603 " MAS2 " TARGET_FMT_lx
" MAS3 " TARGET_FMT_lx
"\n",
7604 env
->spr
[SPR_BOOKE_MAS0
], env
->spr
[SPR_BOOKE_MAS1
],
7605 env
->spr
[SPR_BOOKE_MAS2
], env
->spr
[SPR_BOOKE_MAS3
]);
7607 qemu_fprintf(f
, " MAS4 " TARGET_FMT_lx
" MAS6 " TARGET_FMT_lx
7608 " MAS7 " TARGET_FMT_lx
" PID " TARGET_FMT_lx
"\n",
7609 env
->spr
[SPR_BOOKE_MAS4
], env
->spr
[SPR_BOOKE_MAS6
],
7610 env
->spr
[SPR_BOOKE_MAS7
], env
->spr
[SPR_BOOKE_PID
]);
7612 qemu_fprintf(f
, "MMUCFG " TARGET_FMT_lx
" TLB0CFG " TARGET_FMT_lx
7613 " TLB1CFG " TARGET_FMT_lx
"\n",
7614 env
->spr
[SPR_MMUCFG
], env
->spr
[SPR_BOOKE_TLB0CFG
],
7615 env
->spr
[SPR_BOOKE_TLB1CFG
]);
7625 type_init(ppc_cpu_register_types
)