14f7b1ecbSPeter Maydell
23e770bf7SBruno Larsen (billionai) /*
33e770bf7SBruno Larsen (billionai) * PowerPC CPU initialization for qemu.
43e770bf7SBruno Larsen (billionai) *
53e770bf7SBruno Larsen (billionai) * Copyright (c) 2003-2007 Jocelyn Mayer
63e770bf7SBruno Larsen (billionai) * Copyright 2011 Freescale Semiconductor, Inc.
73e770bf7SBruno Larsen (billionai) *
83e770bf7SBruno Larsen (billionai) * This library is free software; you can redistribute it and/or
93e770bf7SBruno Larsen (billionai) * modify it under the terms of the GNU Lesser General Public
103e770bf7SBruno Larsen (billionai) * License as published by the Free Software Foundation; either
113e770bf7SBruno Larsen (billionai) * version 2.1 of the License, or (at your option) any later version.
123e770bf7SBruno Larsen (billionai) *
133e770bf7SBruno Larsen (billionai) * This library is distributed in the hope that it will be useful,
143e770bf7SBruno Larsen (billionai) * but WITHOUT ANY WARRANTY; without even the implied warranty of
153e770bf7SBruno Larsen (billionai) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
163e770bf7SBruno Larsen (billionai) * Lesser General Public License for more details.
173e770bf7SBruno Larsen (billionai) *
183e770bf7SBruno Larsen (billionai) * You should have received a copy of the GNU Lesser General Public
193e770bf7SBruno Larsen (billionai) * License along with this library; if not, see <http://www.gnu.org/licenses/>.
203e770bf7SBruno Larsen (billionai) */
213e770bf7SBruno Larsen (billionai)
223e770bf7SBruno Larsen (billionai) #include "qemu/osdep.h"
233e770bf7SBruno Larsen (billionai) #include "disas/dis-asm.h"
244ea5fe99SAlex Bennée #include "gdbstub/helpers.h"
253e770bf7SBruno Larsen (billionai) #include "sysemu/cpus.h"
263e770bf7SBruno Larsen (billionai) #include "sysemu/hw_accel.h"
273e770bf7SBruno Larsen (billionai) #include "sysemu/tcg.h"
283e770bf7SBruno Larsen (billionai) #include "cpu-models.h"
293e770bf7SBruno Larsen (billionai) #include "mmu-hash32.h"
303e770bf7SBruno Larsen (billionai) #include "mmu-hash64.h"
313e770bf7SBruno Larsen (billionai) #include "qemu/error-report.h"
323e770bf7SBruno Larsen (billionai) #include "qemu/module.h"
333e770bf7SBruno Larsen (billionai) #include "qemu/qemu-print.h"
343e770bf7SBruno Larsen (billionai) #include "qapi/error.h"
353e770bf7SBruno Larsen (billionai) #include "qapi/qmp/qnull.h"
363e770bf7SBruno Larsen (billionai) #include "qapi/visitor.h"
373e770bf7SBruno Larsen (billionai) #include "hw/qdev-properties.h"
383e770bf7SBruno Larsen (billionai) #include "hw/ppc/ppc.h"
393e770bf7SBruno Larsen (billionai) #include "mmu-book3s-v3.h"
403e770bf7SBruno Larsen (billionai) #include "qemu/cutils.h"
413e770bf7SBruno Larsen (billionai) #include "disas/capstone.h"
423e770bf7SBruno Larsen (billionai) #include "fpu/softfloat.h"
433e770bf7SBruno Larsen (billionai)
443e770bf7SBruno Larsen (billionai) #include "helper_regs.h"
453e770bf7SBruno Larsen (billionai) #include "internal.h"
4699e964efSFabiano Rosas #include "spr_common.h"
478f2e9d40SDaniel Henrique Barboza #include "power8-pmu.h"
483e770bf7SBruno Larsen (billionai)
49c7e89de1SMurilo Opsfelder Araujo #ifndef CONFIG_USER_ONLY
50c7e89de1SMurilo Opsfelder Araujo #include "hw/boards.h"
518a15cceeSBALATON Zoltan #include "hw/intc/intc.h"
52d0815cb8SPhilippe Mathieu-Daudé #include "kvm_ppc.h"
53c7e89de1SMurilo Opsfelder Araujo #endif
54c7e89de1SMurilo Opsfelder Araujo
55f41e7f76SHarsh Prateek Bora #include "cpu_init.h"
563e770bf7SBruno Larsen (billionai) /* #define PPC_DEBUG_SPR */
573e770bf7SBruno Larsen (billionai) /* #define USE_APPLE_GDB */
583e770bf7SBruno Larsen (billionai)
vscr_init(CPUPPCState * env,uint32_t val)593e770bf7SBruno Larsen (billionai) static inline void vscr_init(CPUPPCState *env, uint32_t val)
603e770bf7SBruno Larsen (billionai) {
613e770bf7SBruno Larsen (billionai) /* Altivec always uses round-to-nearest */
623e770bf7SBruno Larsen (billionai) set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
63c19940dbSBruno Larsen (billionai) ppc_store_vscr(env, val);
643e770bf7SBruno Larsen (billionai) }
653e770bf7SBruno Larsen (billionai)
register_745_sprs(CPUPPCState * env)66a5d1120bSFabiano Rosas static void register_745_sprs(CPUPPCState *env)
673e770bf7SBruno Larsen (billionai) {
683e770bf7SBruno Larsen (billionai) /* SGPRs */
693e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG4, "SPRG4",
703e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
713e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
723e770bf7SBruno Larsen (billionai) 0x00000000);
733e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG5, "SPRG5",
743e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
753e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
763e770bf7SBruno Larsen (billionai) 0x00000000);
773e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG6, "SPRG6",
783e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
793e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
803e770bf7SBruno Larsen (billionai) 0x00000000);
813e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG7, "SPRG7",
823e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
833e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
843e770bf7SBruno Larsen (billionai) 0x00000000);
85a5d1120bSFabiano Rosas
86a5d1120bSFabiano Rosas /* Hardware implementation registers */
87a5d1120bSFabiano Rosas spr_register(env, SPR_HID0, "HID0",
88a5d1120bSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
89a5d1120bSFabiano Rosas &spr_read_generic, &spr_write_generic,
90a5d1120bSFabiano Rosas 0x00000000);
91a5d1120bSFabiano Rosas
92a5d1120bSFabiano Rosas spr_register(env, SPR_HID1, "HID1",
93a5d1120bSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
94a5d1120bSFabiano Rosas &spr_read_generic, &spr_write_generic,
95a5d1120bSFabiano Rosas 0x00000000);
96a5d1120bSFabiano Rosas
97a5d1120bSFabiano Rosas spr_register(env, SPR_HID2, "HID2",
98a5d1120bSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
99a5d1120bSFabiano Rosas &spr_read_generic, &spr_write_generic,
100a5d1120bSFabiano Rosas 0x00000000);
1013e770bf7SBruno Larsen (billionai) }
1023e770bf7SBruno Larsen (billionai)
register_755_sprs(CPUPPCState * env)10328930245SFabiano Rosas static void register_755_sprs(CPUPPCState *env)
10428930245SFabiano Rosas {
10528930245SFabiano Rosas /* L2 cache control */
10628930245SFabiano Rosas spr_register(env, SPR_L2CR, "L2CR",
10728930245SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
10828930245SFabiano Rosas &spr_read_generic, spr_access_nop,
10928930245SFabiano Rosas 0x00000000);
11028930245SFabiano Rosas
11128930245SFabiano Rosas spr_register(env, SPR_L2PMCR, "L2PMCR",
11228930245SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
11328930245SFabiano Rosas &spr_read_generic, &spr_write_generic,
11428930245SFabiano Rosas 0x00000000);
11528930245SFabiano Rosas }
11628930245SFabiano Rosas
1173e770bf7SBruno Larsen (billionai) /* SPR common to all 7xx PowerPC implementations */
register_7xx_sprs(CPUPPCState * env)1183e770bf7SBruno Larsen (billionai) static void register_7xx_sprs(CPUPPCState *env)
1193e770bf7SBruno Larsen (billionai) {
1203e770bf7SBruno Larsen (billionai) /* Breakpoints */
1213e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_DABR, "DABR",
1223e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1233e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1243e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DABR, 0x00000000);
125acf629ebSFabiano Rosas
1263e770bf7SBruno Larsen (billionai) spr_register(env, SPR_IABR, "IABR",
1273e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1283e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1293e770bf7SBruno Larsen (billionai) 0x00000000);
1303e770bf7SBruno Larsen (billionai) /* Cache management */
1313e770bf7SBruno Larsen (billionai) spr_register(env, SPR_ICTC, "ICTC",
1323e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1333e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1343e770bf7SBruno Larsen (billionai) 0x00000000);
1353e770bf7SBruno Larsen (billionai) /* Performance monitors */
1363e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_MMCR0, "MMCR0",
1373e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1383e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1393e770bf7SBruno Larsen (billionai) 0x00000000);
140acf629ebSFabiano Rosas
1413e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_MMCR1, "MMCR1",
1423e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1433e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1443e770bf7SBruno Larsen (billionai) 0x00000000);
145acf629ebSFabiano Rosas
1463e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC1, "PMC1",
1473e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1483e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1493e770bf7SBruno Larsen (billionai) 0x00000000);
150acf629ebSFabiano Rosas
1513e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC2, "PMC2",
1523e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1533e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1543e770bf7SBruno Larsen (billionai) 0x00000000);
155acf629ebSFabiano Rosas
1563e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC3, "PMC3",
1573e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1583e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1593e770bf7SBruno Larsen (billionai) 0x00000000);
160acf629ebSFabiano Rosas
1613e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC4, "PMC4",
1623e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1633e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
1643e770bf7SBruno Larsen (billionai) 0x00000000);
165acf629ebSFabiano Rosas
1663e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_SIAR, "SIAR",
1673e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1683e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
1693e770bf7SBruno Larsen (billionai) 0x00000000);
170acf629ebSFabiano Rosas
1713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
1723e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1733e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1743e770bf7SBruno Larsen (billionai) 0x00000000);
175acf629ebSFabiano Rosas
1763e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
1773e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1783e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1793e770bf7SBruno Larsen (billionai) 0x00000000);
180acf629ebSFabiano Rosas
1813e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC1, "UPMC1",
1823e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1833e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1843e770bf7SBruno Larsen (billionai) 0x00000000);
185acf629ebSFabiano Rosas
1863e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC2, "UPMC2",
1873e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1883e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1893e770bf7SBruno Larsen (billionai) 0x00000000);
190acf629ebSFabiano Rosas
1913e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC3, "UPMC3",
1923e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1933e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1943e770bf7SBruno Larsen (billionai) 0x00000000);
195acf629ebSFabiano Rosas
1963e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC4, "UPMC4",
1973e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1983e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
1993e770bf7SBruno Larsen (billionai) 0x00000000);
200acf629ebSFabiano Rosas
2013e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_USIAR, "USIAR",
2023e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
2033e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
2043e770bf7SBruno Larsen (billionai) 0x00000000);
2053e770bf7SBruno Larsen (billionai) /* External access control */
2063e770bf7SBruno Larsen (billionai) spr_register(env, SPR_EAR, "EAR",
2073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2093e770bf7SBruno Larsen (billionai) 0x00000000);
2100301b39cSFabiano Rosas
2110301b39cSFabiano Rosas /* Hardware implementation registers */
2120301b39cSFabiano Rosas spr_register(env, SPR_HID0, "HID0",
2130301b39cSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
2140301b39cSFabiano Rosas &spr_read_generic, &spr_write_generic,
2150301b39cSFabiano Rosas 0x00000000);
2160301b39cSFabiano Rosas
2170301b39cSFabiano Rosas spr_register(env, SPR_HID1, "HID1",
2180301b39cSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
2190301b39cSFabiano Rosas &spr_read_generic, &spr_write_generic,
2200301b39cSFabiano Rosas 0x00000000);
2213e770bf7SBruno Larsen (billionai) }
2223e770bf7SBruno Larsen (billionai)
2233e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
register_amr_sprs(CPUPPCState * env)2243e770bf7SBruno Larsen (billionai) static void register_amr_sprs(CPUPPCState *env)
2253e770bf7SBruno Larsen (billionai) {
2263e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
2273e770bf7SBruno Larsen (billionai) /*
2283e770bf7SBruno Larsen (billionai) * Virtual Page Class Key protection
2293e770bf7SBruno Larsen (billionai) *
2303e770bf7SBruno Larsen (billionai) * The AMR is accessible either via SPR 13 or SPR 29. 13 is
2313e770bf7SBruno Larsen (billionai) * userspace accessible, 29 is privileged. So we only need to set
2323e770bf7SBruno Larsen (billionai) * the kvm ONE_REG id on one of them, we use 29
2333e770bf7SBruno Larsen (billionai) */
2343e770bf7SBruno Larsen (billionai) spr_register(env, SPR_UAMR, "UAMR",
2353e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_amr,
2363e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_amr,
2373e770bf7SBruno Larsen (billionai) 0);
2383e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_AMR, "AMR",
2393e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2403e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_amr,
2413e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2423e770bf7SBruno Larsen (billionai) KVM_REG_PPC_AMR, 0);
2433e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR",
2443e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2453e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_uamor,
2463e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2473e770bf7SBruno Larsen (billionai) KVM_REG_PPC_UAMOR, 0);
2483e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_AMOR, "AMOR",
2493e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
251e5c2ac9dSNicholas Piggin &spr_read_generic, &spr_core_lpar_write_generic,
2523e770bf7SBruno Larsen (billionai) 0);
2533e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
2543e770bf7SBruno Larsen (billionai) }
2553e770bf7SBruno Larsen (billionai)
register_iamr_sprs(CPUPPCState * env)2563e770bf7SBruno Larsen (billionai) static void register_iamr_sprs(CPUPPCState *env)
2573e770bf7SBruno Larsen (billionai) {
2583e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
2593e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_IAMR, "IAMR",
2603e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2613e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_iamr,
2623e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2633e770bf7SBruno Larsen (billionai) KVM_REG_PPC_IAMR, 0);
2643e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
2653e770bf7SBruno Larsen (billionai) }
2663e770bf7SBruno Larsen (billionai) #endif /* TARGET_PPC64 */
2673e770bf7SBruno Larsen (billionai)
2683e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 604 implementation */
register_604_sprs(CPUPPCState * env)2693e770bf7SBruno Larsen (billionai) static void register_604_sprs(CPUPPCState *env)
2703e770bf7SBruno Larsen (billionai) {
2713e770bf7SBruno Larsen (billionai) /* Processor identification */
2723e770bf7SBruno Larsen (billionai) spr_register(env, SPR_PIR, "PIR",
2733e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2743e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_pir,
2753e770bf7SBruno Larsen (billionai) 0x00000000);
2763e770bf7SBruno Larsen (billionai) /* Breakpoints */
2773e770bf7SBruno Larsen (billionai) spr_register(env, SPR_IABR, "IABR",
2783e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2793e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2803e770bf7SBruno Larsen (billionai) 0x00000000);
281acf629ebSFabiano Rosas
2823e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_DABR, "DABR",
2833e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2843e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2853e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DABR, 0x00000000);
2863e770bf7SBruno Larsen (billionai) /* Performance counters */
2873e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_MMCR0, "MMCR0",
2883e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2893e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2903e770bf7SBruno Larsen (billionai) 0x00000000);
291acf629ebSFabiano Rosas
2923e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC1, "PMC1",
2933e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2943e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
2953e770bf7SBruno Larsen (billionai) 0x00000000);
296acf629ebSFabiano Rosas
2973e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC2, "PMC2",
2983e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
2993e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
3003e770bf7SBruno Larsen (billionai) 0x00000000);
301acf629ebSFabiano Rosas
3023e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_SIAR, "SIAR",
3033e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
3043e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
3053e770bf7SBruno Larsen (billionai) 0x00000000);
306acf629ebSFabiano Rosas
3073e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SDA, "SDA",
3083e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
3093e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
3103e770bf7SBruno Larsen (billionai) 0x00000000);
3113e770bf7SBruno Larsen (billionai) /* External access control */
3123e770bf7SBruno Larsen (billionai) spr_register(env, SPR_EAR, "EAR",
3133e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
3143e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
3153e770bf7SBruno Larsen (billionai) 0x00000000);
31620f6fb99SFabiano Rosas
31720f6fb99SFabiano Rosas /* Hardware implementation registers */
31820f6fb99SFabiano Rosas spr_register(env, SPR_HID0, "HID0",
31920f6fb99SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
32020f6fb99SFabiano Rosas &spr_read_generic, &spr_write_generic,
32120f6fb99SFabiano Rosas 0x00000000);
3223e770bf7SBruno Larsen (billionai) }
3233e770bf7SBruno Larsen (billionai)
register_604e_sprs(CPUPPCState * env)3243b18ec76SFabiano Rosas static void register_604e_sprs(CPUPPCState *env)
3253b18ec76SFabiano Rosas {
3263b18ec76SFabiano Rosas spr_register(env, SPR_7XX_MMCR1, "MMCR1",
3273b18ec76SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
3283b18ec76SFabiano Rosas &spr_read_generic, &spr_write_generic,
3293b18ec76SFabiano Rosas 0x00000000);
3303b18ec76SFabiano Rosas
3313b18ec76SFabiano Rosas spr_register(env, SPR_7XX_PMC3, "PMC3",
3323b18ec76SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
3333b18ec76SFabiano Rosas &spr_read_generic, &spr_write_generic,
3343b18ec76SFabiano Rosas 0x00000000);
3353b18ec76SFabiano Rosas
3363b18ec76SFabiano Rosas spr_register(env, SPR_7XX_PMC4, "PMC4",
3373b18ec76SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
3383b18ec76SFabiano Rosas &spr_read_generic, &spr_write_generic,
3393b18ec76SFabiano Rosas 0x00000000);
3403b18ec76SFabiano Rosas /* Hardware implementation registers */
3413b18ec76SFabiano Rosas spr_register(env, SPR_HID1, "HID1",
3423b18ec76SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
3433b18ec76SFabiano Rosas &spr_read_generic, &spr_write_generic,
3443b18ec76SFabiano Rosas 0x00000000);
3453b18ec76SFabiano Rosas }
3463b18ec76SFabiano Rosas
3473e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 603 implementation */
register_603_sprs(CPUPPCState * env)3483e770bf7SBruno Larsen (billionai) static void register_603_sprs(CPUPPCState *env)
3493e770bf7SBruno Larsen (billionai) {
3503e770bf7SBruno Larsen (billionai) /* External access control */
3513e770bf7SBruno Larsen (billionai) spr_register(env, SPR_EAR, "EAR",
3523e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
3533e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
3543e770bf7SBruno Larsen (billionai) 0x00000000);
3553e770bf7SBruno Larsen (billionai) /* Breakpoints */
3563e770bf7SBruno Larsen (billionai) spr_register(env, SPR_IABR, "IABR",
3573e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
3583e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
3593e770bf7SBruno Larsen (billionai) 0x00000000);
3603e770bf7SBruno Larsen (billionai)
361d2b29d0aSFabiano Rosas spr_register(env, SPR_HID0, "HID0",
362d2b29d0aSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
363d2b29d0aSFabiano Rosas &spr_read_generic, &spr_write_generic,
364d2b29d0aSFabiano Rosas 0x00000000);
365d2b29d0aSFabiano Rosas
366d2b29d0aSFabiano Rosas spr_register(env, SPR_HID1, "HID1",
367d2b29d0aSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
368d2b29d0aSFabiano Rosas &spr_read_generic, &spr_write_generic,
369d2b29d0aSFabiano Rosas 0x00000000);
3703e770bf7SBruno Larsen (billionai) }
3713e770bf7SBruno Larsen (billionai)
register_e300_sprs(CPUPPCState * env)372a3a27674SFabiano Rosas static void register_e300_sprs(CPUPPCState *env)
373a3a27674SFabiano Rosas {
374a3a27674SFabiano Rosas /* hardware implementation registers */
375a3a27674SFabiano Rosas spr_register(env, SPR_HID2, "HID2",
376a3a27674SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
377a3a27674SFabiano Rosas &spr_read_generic, &spr_write_generic,
378a3a27674SFabiano Rosas 0x00000000);
379a3a27674SFabiano Rosas /* Breakpoints */
380a3a27674SFabiano Rosas spr_register(env, SPR_DABR, "DABR",
381a3a27674SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
382a3a27674SFabiano Rosas &spr_read_generic, &spr_write_generic,
383a3a27674SFabiano Rosas 0x00000000);
384a3a27674SFabiano Rosas
385a3a27674SFabiano Rosas spr_register(env, SPR_DABR2, "DABR2",
386a3a27674SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
387a3a27674SFabiano Rosas &spr_read_generic, &spr_write_generic,
388a3a27674SFabiano Rosas 0x00000000);
389a3a27674SFabiano Rosas
390a3a27674SFabiano Rosas spr_register(env, SPR_IABR2, "IABR2",
391a3a27674SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
392a3a27674SFabiano Rosas &spr_read_generic, &spr_write_generic,
393a3a27674SFabiano Rosas 0x00000000);
394a3a27674SFabiano Rosas
395a3a27674SFabiano Rosas spr_register(env, SPR_IBCR, "IBCR",
396a3a27674SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
397a3a27674SFabiano Rosas &spr_read_generic, &spr_write_generic,
398a3a27674SFabiano Rosas 0x00000000);
399a3a27674SFabiano Rosas
400a3a27674SFabiano Rosas spr_register(env, SPR_DBCR, "DBCR",
401a3a27674SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
402a3a27674SFabiano Rosas &spr_read_generic, &spr_write_generic,
403a3a27674SFabiano Rosas 0x00000000);
404a3a27674SFabiano Rosas }
405a3a27674SFabiano Rosas
4063e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC G2 implementation */
register_G2_sprs(CPUPPCState * env)4073e770bf7SBruno Larsen (billionai) static void register_G2_sprs(CPUPPCState *env)
4083e770bf7SBruno Larsen (billionai) {
4093e770bf7SBruno Larsen (billionai) /* Memory base address */
4103e770bf7SBruno Larsen (billionai) /* MBAR */
4113e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MBAR, "MBAR",
4123e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4133e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4143e770bf7SBruno Larsen (billionai) 0x00000000);
4153e770bf7SBruno Larsen (billionai) /* Exception processing */
4163e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
4173e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4183e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4193e770bf7SBruno Larsen (billionai) 0x00000000);
4203e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
4213e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4223e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4233e770bf7SBruno Larsen (billionai) 0x00000000);
4243e770bf7SBruno Larsen (billionai) /* Breakpoints */
4253e770bf7SBruno Larsen (billionai) spr_register(env, SPR_DABR, "DABR",
4263e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4273e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4283e770bf7SBruno Larsen (billionai) 0x00000000);
429acf629ebSFabiano Rosas
4303e770bf7SBruno Larsen (billionai) spr_register(env, SPR_DABR2, "DABR2",
4313e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4323e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4333e770bf7SBruno Larsen (billionai) 0x00000000);
434acf629ebSFabiano Rosas
4353e770bf7SBruno Larsen (billionai) spr_register(env, SPR_IABR, "IABR",
4363e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4373e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4383e770bf7SBruno Larsen (billionai) 0x00000000);
439acf629ebSFabiano Rosas
4403e770bf7SBruno Larsen (billionai) spr_register(env, SPR_IABR2, "IABR2",
4413e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4423e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4433e770bf7SBruno Larsen (billionai) 0x00000000);
444acf629ebSFabiano Rosas
4453e770bf7SBruno Larsen (billionai) spr_register(env, SPR_IBCR, "IBCR",
4463e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4473e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4483e770bf7SBruno Larsen (billionai) 0x00000000);
449acf629ebSFabiano Rosas
4503e770bf7SBruno Larsen (billionai) spr_register(env, SPR_DBCR, "DBCR",
4513e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
4523e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
4533e770bf7SBruno Larsen (billionai) 0x00000000);
454e599bcedSFabiano Rosas
455e599bcedSFabiano Rosas /* External access control */
456e599bcedSFabiano Rosas spr_register(env, SPR_EAR, "EAR",
457e599bcedSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
458e599bcedSFabiano Rosas &spr_read_generic, &spr_write_generic,
459e599bcedSFabiano Rosas 0x00000000);
460e599bcedSFabiano Rosas /* Hardware implementation register */
461e599bcedSFabiano Rosas spr_register(env, SPR_HID0, "HID0",
462e599bcedSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
463e599bcedSFabiano Rosas &spr_read_generic, &spr_write_generic,
464e599bcedSFabiano Rosas 0x00000000);
465e599bcedSFabiano Rosas
466e599bcedSFabiano Rosas spr_register(env, SPR_HID1, "HID1",
467e599bcedSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
468e599bcedSFabiano Rosas &spr_read_generic, &spr_write_generic,
469e599bcedSFabiano Rosas 0x00000000);
470e599bcedSFabiano Rosas
471e599bcedSFabiano Rosas spr_register(env, SPR_HID2, "HID2",
472e599bcedSFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
473e599bcedSFabiano Rosas &spr_read_generic, &spr_write_generic,
474e599bcedSFabiano Rosas 0x00000000);
475e599bcedSFabiano Rosas
4761a71c5d1SFabiano Rosas /* SGPRs */
4771a71c5d1SFabiano Rosas spr_register(env, SPR_SPRG4, "SPRG4",
4781a71c5d1SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
4791a71c5d1SFabiano Rosas &spr_read_generic, &spr_write_generic,
4801a71c5d1SFabiano Rosas 0x00000000);
4811a71c5d1SFabiano Rosas spr_register(env, SPR_SPRG5, "SPRG5",
4821a71c5d1SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
4831a71c5d1SFabiano Rosas &spr_read_generic, &spr_write_generic,
4841a71c5d1SFabiano Rosas 0x00000000);
4851a71c5d1SFabiano Rosas spr_register(env, SPR_SPRG6, "SPRG6",
4861a71c5d1SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
4871a71c5d1SFabiano Rosas &spr_read_generic, &spr_write_generic,
4881a71c5d1SFabiano Rosas 0x00000000);
4891a71c5d1SFabiano Rosas spr_register(env, SPR_SPRG7, "SPRG7",
4901a71c5d1SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
4911a71c5d1SFabiano Rosas &spr_read_generic, &spr_write_generic,
4921a71c5d1SFabiano Rosas 0x00000000);
4933e770bf7SBruno Larsen (billionai) }
4943e770bf7SBruno Larsen (billionai)
register_74xx_sprs(CPUPPCState * env)4953e770bf7SBruno Larsen (billionai) static void register_74xx_sprs(CPUPPCState *env)
4963e770bf7SBruno Larsen (billionai) {
497674f4509SFabiano Rosas /* Breakpoints */
498674f4509SFabiano Rosas spr_register_kvm(env, SPR_DABR, "DABR",
499674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
500674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
501674f4509SFabiano Rosas KVM_REG_PPC_DABR, 0x00000000);
502674f4509SFabiano Rosas
503674f4509SFabiano Rosas spr_register(env, SPR_IABR, "IABR",
504674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
505674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
506674f4509SFabiano Rosas 0x00000000);
507674f4509SFabiano Rosas /* Cache management */
508674f4509SFabiano Rosas spr_register(env, SPR_ICTC, "ICTC",
509674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
510674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
511674f4509SFabiano Rosas 0x00000000);
512674f4509SFabiano Rosas /* Performance monitors */
513674f4509SFabiano Rosas spr_register(env, SPR_7XX_MMCR0, "MMCR0",
514674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
515674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
516674f4509SFabiano Rosas 0x00000000);
517674f4509SFabiano Rosas
518674f4509SFabiano Rosas spr_register(env, SPR_7XX_MMCR1, "MMCR1",
519674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
520674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
521674f4509SFabiano Rosas 0x00000000);
522674f4509SFabiano Rosas
523674f4509SFabiano Rosas spr_register(env, SPR_7XX_PMC1, "PMC1",
524674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
525674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
526674f4509SFabiano Rosas 0x00000000);
527674f4509SFabiano Rosas
528674f4509SFabiano Rosas spr_register(env, SPR_7XX_PMC2, "PMC2",
529674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
530674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
531674f4509SFabiano Rosas 0x00000000);
532674f4509SFabiano Rosas
533674f4509SFabiano Rosas spr_register(env, SPR_7XX_PMC3, "PMC3",
534674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
535674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
536674f4509SFabiano Rosas 0x00000000);
537674f4509SFabiano Rosas
538674f4509SFabiano Rosas spr_register(env, SPR_7XX_PMC4, "PMC4",
539674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
540674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
541674f4509SFabiano Rosas 0x00000000);
542674f4509SFabiano Rosas
543674f4509SFabiano Rosas spr_register(env, SPR_7XX_SIAR, "SIAR",
544674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
545674f4509SFabiano Rosas &spr_read_generic, SPR_NOACCESS,
546674f4509SFabiano Rosas 0x00000000);
547674f4509SFabiano Rosas
548674f4509SFabiano Rosas spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
549674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
550674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
551674f4509SFabiano Rosas 0x00000000);
552674f4509SFabiano Rosas
553674f4509SFabiano Rosas spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
554674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
555674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
556674f4509SFabiano Rosas 0x00000000);
557674f4509SFabiano Rosas
558674f4509SFabiano Rosas spr_register(env, SPR_7XX_UPMC1, "UPMC1",
559674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
560674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
561674f4509SFabiano Rosas 0x00000000);
562674f4509SFabiano Rosas
563674f4509SFabiano Rosas spr_register(env, SPR_7XX_UPMC2, "UPMC2",
564674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
565674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
566674f4509SFabiano Rosas 0x00000000);
567674f4509SFabiano Rosas
568674f4509SFabiano Rosas spr_register(env, SPR_7XX_UPMC3, "UPMC3",
569674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
570674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
571674f4509SFabiano Rosas 0x00000000);
572674f4509SFabiano Rosas
573674f4509SFabiano Rosas spr_register(env, SPR_7XX_UPMC4, "UPMC4",
574674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
575674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
576674f4509SFabiano Rosas 0x00000000);
577674f4509SFabiano Rosas
578674f4509SFabiano Rosas spr_register(env, SPR_7XX_USIAR, "USIAR",
579674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
580674f4509SFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
581674f4509SFabiano Rosas 0x00000000);
582674f4509SFabiano Rosas /* External access control */
583674f4509SFabiano Rosas spr_register(env, SPR_EAR, "EAR",
584674f4509SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
585674f4509SFabiano Rosas &spr_read_generic, &spr_write_generic,
586674f4509SFabiano Rosas 0x00000000);
587674f4509SFabiano Rosas
5883e770bf7SBruno Larsen (billionai) /* Processor identification */
5893e770bf7SBruno Larsen (billionai) spr_register(env, SPR_PIR, "PIR",
5903e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5913e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_pir,
5923e770bf7SBruno Larsen (billionai) 0x00000000);
593acf629ebSFabiano Rosas
5943e770bf7SBruno Larsen (billionai) spr_register(env, SPR_74XX_MMCR2, "MMCR2",
5953e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5963e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
5973e770bf7SBruno Larsen (billionai) 0x00000000);
598acf629ebSFabiano Rosas
5993e770bf7SBruno Larsen (billionai) spr_register(env, SPR_74XX_UMMCR2, "UMMCR2",
6003e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
6013e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
6023e770bf7SBruno Larsen (billionai) 0x00000000);
603acf629ebSFabiano Rosas
6043e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BAMR, "BAMR",
6053e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6063e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6073e770bf7SBruno Larsen (billionai) 0x00000000);
608acf629ebSFabiano Rosas
6093e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSCR0, "MSSCR0",
6103e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6113e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6123e770bf7SBruno Larsen (billionai) 0x00000000);
6133e770bf7SBruno Larsen (billionai) /* Hardware implementation registers */
6143e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID0, "HID0",
6153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6163e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6173e770bf7SBruno Larsen (billionai) 0x00000000);
618acf629ebSFabiano Rosas
6193e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID1, "HID1",
6203e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6213e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6223e770bf7SBruno Larsen (billionai) 0x00000000);
6233e770bf7SBruno Larsen (billionai) /* Altivec */
6243e770bf7SBruno Larsen (billionai) spr_register(env, SPR_VRSAVE, "VRSAVE",
6253e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6263e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6273e770bf7SBruno Larsen (billionai) 0x00000000);
628acf629ebSFabiano Rosas
6293e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L2CR, "L2CR",
6303e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6313e770bf7SBruno Larsen (billionai) &spr_read_generic, spr_access_nop,
6323e770bf7SBruno Larsen (billionai) 0x00000000);
6333e770bf7SBruno Larsen (billionai) }
6343e770bf7SBruno Larsen (billionai)
register_l3_ctrl(CPUPPCState * env)6353e770bf7SBruno Larsen (billionai) static void register_l3_ctrl(CPUPPCState *env)
6363e770bf7SBruno Larsen (billionai) {
6373e770bf7SBruno Larsen (billionai) /* L3CR */
6383e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3CR, "L3CR",
6393e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6403e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6413e770bf7SBruno Larsen (billionai) 0x00000000);
6423e770bf7SBruno Larsen (billionai) /* L3ITCR0 */
6433e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3ITCR0, "L3ITCR0",
6443e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6453e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6463e770bf7SBruno Larsen (billionai) 0x00000000);
6473e770bf7SBruno Larsen (billionai) /* L3PM */
6483e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3PM, "L3PM",
6493e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6503e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
6513e770bf7SBruno Larsen (billionai) 0x00000000);
6523e770bf7SBruno Larsen (billionai) }
6533e770bf7SBruno Larsen (billionai)
6543e770bf7SBruno Larsen (billionai) /* PowerPC BookE SPR */
register_BookE_sprs(CPUPPCState * env,uint64_t ivor_mask)6553e770bf7SBruno Larsen (billionai) static void register_BookE_sprs(CPUPPCState *env, uint64_t ivor_mask)
6563e770bf7SBruno Larsen (billionai) {
6573e770bf7SBruno Larsen (billionai) const char *ivor_names[64] = {
6583e770bf7SBruno Larsen (billionai) "IVOR0", "IVOR1", "IVOR2", "IVOR3",
6593e770bf7SBruno Larsen (billionai) "IVOR4", "IVOR5", "IVOR6", "IVOR7",
6603e770bf7SBruno Larsen (billionai) "IVOR8", "IVOR9", "IVOR10", "IVOR11",
6613e770bf7SBruno Larsen (billionai) "IVOR12", "IVOR13", "IVOR14", "IVOR15",
6623e770bf7SBruno Larsen (billionai) "IVOR16", "IVOR17", "IVOR18", "IVOR19",
6633e770bf7SBruno Larsen (billionai) "IVOR20", "IVOR21", "IVOR22", "IVOR23",
6643e770bf7SBruno Larsen (billionai) "IVOR24", "IVOR25", "IVOR26", "IVOR27",
6653e770bf7SBruno Larsen (billionai) "IVOR28", "IVOR29", "IVOR30", "IVOR31",
6663e770bf7SBruno Larsen (billionai) "IVOR32", "IVOR33", "IVOR34", "IVOR35",
6673e770bf7SBruno Larsen (billionai) "IVOR36", "IVOR37", "IVOR38", "IVOR39",
6683e770bf7SBruno Larsen (billionai) "IVOR40", "IVOR41", "IVOR42", "IVOR43",
6693e770bf7SBruno Larsen (billionai) "IVOR44", "IVOR45", "IVOR46", "IVOR47",
6703e770bf7SBruno Larsen (billionai) "IVOR48", "IVOR49", "IVOR50", "IVOR51",
6713e770bf7SBruno Larsen (billionai) "IVOR52", "IVOR53", "IVOR54", "IVOR55",
6723e770bf7SBruno Larsen (billionai) "IVOR56", "IVOR57", "IVOR58", "IVOR59",
6733e770bf7SBruno Larsen (billionai) "IVOR60", "IVOR61", "IVOR62", "IVOR63",
6743e770bf7SBruno Larsen (billionai) };
6753e770bf7SBruno Larsen (billionai) #define SPR_BOOKE_IVORxx (-1)
6763e770bf7SBruno Larsen (billionai) int ivor_sprn[64] = {
6773e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVOR0, SPR_BOOKE_IVOR1, SPR_BOOKE_IVOR2, SPR_BOOKE_IVOR3,
6783e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVOR4, SPR_BOOKE_IVOR5, SPR_BOOKE_IVOR6, SPR_BOOKE_IVOR7,
6793e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVOR8, SPR_BOOKE_IVOR9, SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
6803e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
6813e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6823e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6833e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6843e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6853e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
6863e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
6873e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
6883e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6893e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6903e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6913e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6923e770bf7SBruno Larsen (billionai) SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
6933e770bf7SBruno Larsen (billionai) };
6943e770bf7SBruno Larsen (billionai) int i;
6953e770bf7SBruno Larsen (billionai)
6963e770bf7SBruno Larsen (billionai) /* Interrupt processing */
6973e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
6983e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
6993e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7003e770bf7SBruno Larsen (billionai) 0x00000000);
7013e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
7023e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7033e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7043e770bf7SBruno Larsen (billionai) 0x00000000);
7053e770bf7SBruno Larsen (billionai) /* Debug */
7063e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_IAC1, "IAC1",
7073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7093e770bf7SBruno Larsen (billionai) 0x00000000);
710acf629ebSFabiano Rosas
7113e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_IAC2, "IAC2",
7123e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7133e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7143e770bf7SBruno Larsen (billionai) 0x00000000);
715acf629ebSFabiano Rosas
7163e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DAC1, "DAC1",
7173e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7183e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7193e770bf7SBruno Larsen (billionai) 0x00000000);
720acf629ebSFabiano Rosas
7213e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DAC2, "DAC2",
7223e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7233e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7243e770bf7SBruno Larsen (billionai) 0x00000000);
725acf629ebSFabiano Rosas
7263e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
7273e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7283e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_40x_dbcr0,
7293e770bf7SBruno Larsen (billionai) 0x00000000);
730acf629ebSFabiano Rosas
7313e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
7323e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7333e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7343e770bf7SBruno Larsen (billionai) 0x00000000);
735acf629ebSFabiano Rosas
7363e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
7373e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7383e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7393e770bf7SBruno Larsen (billionai) 0x00000000);
7403e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
7413e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7423e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7433e770bf7SBruno Larsen (billionai) 0x00000000);
7443e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
7453e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7463e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7473e770bf7SBruno Larsen (billionai) 0x00000000);
748acf629ebSFabiano Rosas
7493e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DBSR, "DBSR",
7503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7513e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_clear,
7523e770bf7SBruno Larsen (billionai) 0x00000000);
7533e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DEAR, "DEAR",
7543e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7553e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7563e770bf7SBruno Larsen (billionai) 0x00000000);
7573e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_ESR, "ESR",
7583e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7593e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
7603e770bf7SBruno Larsen (billionai) 0x00000000);
7613e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_IVPR, "IVPR",
7623e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7633e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_excp_prefix,
7643e770bf7SBruno Larsen (billionai) 0x00000000);
7653e770bf7SBruno Larsen (billionai) /* Exception vectors */
7663e770bf7SBruno Larsen (billionai) for (i = 0; i < 64; i++) {
7673e770bf7SBruno Larsen (billionai) if (ivor_mask & (1ULL << i)) {
7683e770bf7SBruno Larsen (billionai) if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
7693e770bf7SBruno Larsen (billionai) fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
7703e770bf7SBruno Larsen (billionai) exit(1);
7713e770bf7SBruno Larsen (billionai) }
7723e770bf7SBruno Larsen (billionai) spr_register(env, ivor_sprn[i], ivor_names[i],
7733e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7743e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_excp_vector,
7753e770bf7SBruno Larsen (billionai) 0x00000000);
7763e770bf7SBruno Larsen (billionai) }
7773e770bf7SBruno Larsen (billionai) }
7783e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_PID, "PID",
7793e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7803e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_booke_pid,
7813e770bf7SBruno Larsen (billionai) 0x00000000);
7823e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TCR, "TCR",
7833e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7843e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_booke_tcr,
7853e770bf7SBruno Larsen (billionai) 0x00000000);
7863e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TSR, "TSR",
7873e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7883e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_booke_tsr,
7893e770bf7SBruno Larsen (billionai) 0x00000000);
7903e770bf7SBruno Larsen (billionai) /* Timer */
7913e770bf7SBruno Larsen (billionai) spr_register(env, SPR_DECR, "DECR",
7923e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
7933e770bf7SBruno Larsen (billionai) &spr_read_decr, &spr_write_decr,
7943e770bf7SBruno Larsen (billionai) 0x00000000);
7953e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DECAR, "DECAR",
7963e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
797e89294b2SNicholas Piggin SPR_NOACCESS, &spr_write_generic32,
7983e770bf7SBruno Larsen (billionai) 0x00000000);
7993e770bf7SBruno Larsen (billionai) /* SPRGs */
8003e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG0, "USPRG0",
8013e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8023e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8033e770bf7SBruno Larsen (billionai) 0x00000000);
8043e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG4, "SPRG4",
8053e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8063e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8073e770bf7SBruno Larsen (billionai) 0x00000000);
8083e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG5, "SPRG5",
8093e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8103e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8113e770bf7SBruno Larsen (billionai) 0x00000000);
8123e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG6, "SPRG6",
8133e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8143e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8153e770bf7SBruno Larsen (billionai) 0x00000000);
8163e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG7, "SPRG7",
8173e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8183e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8193e770bf7SBruno Larsen (billionai) 0x00000000);
8203e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_SPRG8, "SPRG8",
8213e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8223e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8233e770bf7SBruno Larsen (billionai) 0x00000000);
8243e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_SPRG9, "SPRG9",
8253e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8263e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
8273e770bf7SBruno Larsen (billionai) 0x00000000);
8283e770bf7SBruno Larsen (billionai) }
8293e770bf7SBruno Larsen (billionai)
8303e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
register_tlbncfg(uint32_t assoc,uint32_t minsize,uint32_t maxsize,uint32_t flags,uint32_t nentries)8313e770bf7SBruno Larsen (billionai) static inline uint32_t register_tlbncfg(uint32_t assoc, uint32_t minsize,
8323e770bf7SBruno Larsen (billionai) uint32_t maxsize, uint32_t flags,
8333e770bf7SBruno Larsen (billionai) uint32_t nentries)
8343e770bf7SBruno Larsen (billionai) {
8353e770bf7SBruno Larsen (billionai) return (assoc << TLBnCFG_ASSOC_SHIFT) |
8363e770bf7SBruno Larsen (billionai) (minsize << TLBnCFG_MINSIZE_SHIFT) |
8373e770bf7SBruno Larsen (billionai) (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
8383e770bf7SBruno Larsen (billionai) flags | nentries;
8393e770bf7SBruno Larsen (billionai) }
8403e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
8413e770bf7SBruno Larsen (billionai)
8423e770bf7SBruno Larsen (billionai) /* BookE 2.06 storage control registers */
register_BookE206_sprs(CPUPPCState * env,uint32_t mas_mask,uint32_t * tlbncfg,uint32_t mmucfg)8433e770bf7SBruno Larsen (billionai) static void register_BookE206_sprs(CPUPPCState *env, uint32_t mas_mask,
8443e770bf7SBruno Larsen (billionai) uint32_t *tlbncfg, uint32_t mmucfg)
8453e770bf7SBruno Larsen (billionai) {
8463e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
8473e770bf7SBruno Larsen (billionai) const char *mas_names[8] = {
8483e770bf7SBruno Larsen (billionai) "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
8493e770bf7SBruno Larsen (billionai) };
8503e770bf7SBruno Larsen (billionai) int mas_sprn[8] = {
8513e770bf7SBruno Larsen (billionai) SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
8523e770bf7SBruno Larsen (billionai) SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
8533e770bf7SBruno Larsen (billionai) };
8543e770bf7SBruno Larsen (billionai) int i;
8553e770bf7SBruno Larsen (billionai)
8563e770bf7SBruno Larsen (billionai) /* TLB assist registers */
8573e770bf7SBruno Larsen (billionai) for (i = 0; i < 8; i++) {
8583e770bf7SBruno Larsen (billionai) if (mas_mask & (1 << i)) {
8593e770bf7SBruno Larsen (billionai) spr_register(env, mas_sprn[i], mas_names[i],
8603e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
86152e9612eSBruno Larsen (billionai) &spr_read_generic,
86252e9612eSBruno Larsen (billionai) (i == 2 && (env->insns_flags & PPC_64B))
86352e9612eSBruno Larsen (billionai) ? &spr_write_generic : &spr_write_generic32,
8643e770bf7SBruno Larsen (billionai) 0x00000000);
8653e770bf7SBruno Larsen (billionai) }
8663e770bf7SBruno Larsen (billionai) }
8673e770bf7SBruno Larsen (billionai) if (env->nb_pids > 1) {
8683e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_PID1, "PID1",
8693e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8703e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_booke_pid,
8713e770bf7SBruno Larsen (billionai) 0x00000000);
8723e770bf7SBruno Larsen (billionai) }
8733e770bf7SBruno Larsen (billionai) if (env->nb_pids > 2) {
8743e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_PID2, "PID2",
8753e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8763e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_booke_pid,
8773e770bf7SBruno Larsen (billionai) 0x00000000);
8783e770bf7SBruno Larsen (billionai) }
8793e770bf7SBruno Larsen (billionai)
8803e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_EPLC, "EPLC",
8813e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8823e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_eplc,
8833e770bf7SBruno Larsen (billionai) 0x00000000);
8843e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_EPSC, "EPSC",
8853e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8863e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_epsc,
8873e770bf7SBruno Larsen (billionai) 0x00000000);
8883e770bf7SBruno Larsen (billionai)
8893e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MMUCFG, "MMUCFG",
8903e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8913e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
8923e770bf7SBruno Larsen (billionai) mmucfg);
8933e770bf7SBruno Larsen (billionai) switch (env->nb_ways) {
8943e770bf7SBruno Larsen (billionai) case 4:
8953e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
8963e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
8973e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
8983e770bf7SBruno Larsen (billionai) tlbncfg[3]);
8993e770bf7SBruno Larsen (billionai) /* Fallthru */
9003e770bf7SBruno Larsen (billionai) case 3:
9013e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
9023e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9033e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
9043e770bf7SBruno Larsen (billionai) tlbncfg[2]);
9053e770bf7SBruno Larsen (billionai) /* Fallthru */
9063e770bf7SBruno Larsen (billionai) case 2:
9073e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
9083e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9093e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
9103e770bf7SBruno Larsen (billionai) tlbncfg[1]);
9113e770bf7SBruno Larsen (billionai) /* Fallthru */
9123e770bf7SBruno Larsen (billionai) case 1:
9133e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
9143e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9153e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
9163e770bf7SBruno Larsen (billionai) tlbncfg[0]);
9173e770bf7SBruno Larsen (billionai) /* Fallthru */
9183e770bf7SBruno Larsen (billionai) case 0:
9193e770bf7SBruno Larsen (billionai) default:
9203e770bf7SBruno Larsen (billionai) break;
9213e770bf7SBruno Larsen (billionai) }
9223e770bf7SBruno Larsen (billionai) #endif
9233e770bf7SBruno Larsen (billionai) }
9243e770bf7SBruno Larsen (billionai)
9253e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 440 implementation */
register_440_sprs(CPUPPCState * env)9263e770bf7SBruno Larsen (billionai) static void register_440_sprs(CPUPPCState *env)
9273e770bf7SBruno Larsen (billionai) {
9283e770bf7SBruno Larsen (billionai) /* Cache control */
9293e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DNV0, "DNV0",
9303e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9313e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9323e770bf7SBruno Larsen (billionai) 0x00000000);
933acf629ebSFabiano Rosas
9343e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DNV1, "DNV1",
9353e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9363e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9373e770bf7SBruno Larsen (billionai) 0x00000000);
938acf629ebSFabiano Rosas
9393e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DNV2, "DNV2",
9403e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9413e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9423e770bf7SBruno Larsen (billionai) 0x00000000);
943acf629ebSFabiano Rosas
9443e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DNV3, "DNV3",
9453e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9463e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9473e770bf7SBruno Larsen (billionai) 0x00000000);
948acf629ebSFabiano Rosas
9493e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DTV0, "DTV0",
9503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9513e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9523e770bf7SBruno Larsen (billionai) 0x00000000);
953acf629ebSFabiano Rosas
9543e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DTV1, "DTV1",
9553e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9563e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9573e770bf7SBruno Larsen (billionai) 0x00000000);
958acf629ebSFabiano Rosas
9593e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DTV2, "DTV2",
9603e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9613e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9623e770bf7SBruno Larsen (billionai) 0x00000000);
963acf629ebSFabiano Rosas
9643e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DTV3, "DTV3",
9653e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9663e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9673e770bf7SBruno Larsen (billionai) 0x00000000);
968acf629ebSFabiano Rosas
9693e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DVLIM, "DVLIM",
9703e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9713e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9723e770bf7SBruno Larsen (billionai) 0x00000000);
973acf629ebSFabiano Rosas
9743e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_INV0, "INV0",
9753e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9763e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9773e770bf7SBruno Larsen (billionai) 0x00000000);
978acf629ebSFabiano Rosas
9793e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_INV1, "INV1",
9803e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9813e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9823e770bf7SBruno Larsen (billionai) 0x00000000);
983acf629ebSFabiano Rosas
9843e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_INV2, "INV2",
9853e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9863e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9873e770bf7SBruno Larsen (billionai) 0x00000000);
988acf629ebSFabiano Rosas
9893e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_INV3, "INV3",
9903e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9913e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9923e770bf7SBruno Larsen (billionai) 0x00000000);
993acf629ebSFabiano Rosas
9943e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_ITV0, "ITV0",
9953e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
9963e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
9973e770bf7SBruno Larsen (billionai) 0x00000000);
998acf629ebSFabiano Rosas
9993e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_ITV1, "ITV1",
10003e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10013e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10023e770bf7SBruno Larsen (billionai) 0x00000000);
1003acf629ebSFabiano Rosas
10043e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_ITV2, "ITV2",
10053e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10063e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10073e770bf7SBruno Larsen (billionai) 0x00000000);
1008acf629ebSFabiano Rosas
10093e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_ITV3, "ITV3",
10103e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10113e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10123e770bf7SBruno Larsen (billionai) 0x00000000);
1013acf629ebSFabiano Rosas
10143e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_IVLIM, "IVLIM",
10153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10163e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10173e770bf7SBruno Larsen (billionai) 0x00000000);
10183e770bf7SBruno Larsen (billionai) /* Cache debug */
10193e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
10203e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10213e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
10223e770bf7SBruno Larsen (billionai) 0x00000000);
1023acf629ebSFabiano Rosas
10243e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
10253e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10263e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
10273e770bf7SBruno Larsen (billionai) 0x00000000);
1028acf629ebSFabiano Rosas
10293e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
10303e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10313e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
10323e770bf7SBruno Larsen (billionai) 0x00000000);
1033acf629ebSFabiano Rosas
10343e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
10353e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10363e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
10373e770bf7SBruno Larsen (billionai) 0x00000000);
1038acf629ebSFabiano Rosas
10393e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
10403e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10413e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
10423e770bf7SBruno Larsen (billionai) 0x00000000);
1043acf629ebSFabiano Rosas
10443e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_DBDR, "DBDR",
10453e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10463e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10473e770bf7SBruno Larsen (billionai) 0x00000000);
10483e770bf7SBruno Larsen (billionai) /* Processor control */
10493e770bf7SBruno Larsen (billionai) spr_register(env, SPR_4xx_CCR0, "CCR0",
10503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10513e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10523e770bf7SBruno Larsen (billionai) 0x00000000);
10533e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_RSTCFG, "RSTCFG",
10543e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10553e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
10563e770bf7SBruno Larsen (billionai) 0x00000000);
10573e770bf7SBruno Larsen (billionai) /* Storage control */
10583e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_MMUCR, "MMUCR",
10593e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10603e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10613e770bf7SBruno Larsen (billionai) 0x00000000);
106249ed82b2SFabiano Rosas
106349ed82b2SFabiano Rosas /* Processor identification */
106449ed82b2SFabiano Rosas spr_register(env, SPR_BOOKE_PIR, "PIR",
106549ed82b2SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
106649ed82b2SFabiano Rosas &spr_read_generic, &spr_write_pir,
106749ed82b2SFabiano Rosas 0x00000000);
106849ed82b2SFabiano Rosas
106949ed82b2SFabiano Rosas spr_register(env, SPR_BOOKE_IAC3, "IAC3",
107049ed82b2SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
107149ed82b2SFabiano Rosas &spr_read_generic, &spr_write_generic,
107249ed82b2SFabiano Rosas 0x00000000);
107349ed82b2SFabiano Rosas
107449ed82b2SFabiano Rosas spr_register(env, SPR_BOOKE_IAC4, "IAC4",
107549ed82b2SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
107649ed82b2SFabiano Rosas &spr_read_generic, &spr_write_generic,
107749ed82b2SFabiano Rosas 0x00000000);
107849ed82b2SFabiano Rosas
107949ed82b2SFabiano Rosas spr_register(env, SPR_BOOKE_DVC1, "DVC1",
108049ed82b2SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
108149ed82b2SFabiano Rosas &spr_read_generic, &spr_write_generic,
108249ed82b2SFabiano Rosas 0x00000000);
108349ed82b2SFabiano Rosas
108449ed82b2SFabiano Rosas spr_register(env, SPR_BOOKE_DVC2, "DVC2",
108549ed82b2SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
108649ed82b2SFabiano Rosas &spr_read_generic, &spr_write_generic,
108749ed82b2SFabiano Rosas 0x00000000);
10883e770bf7SBruno Larsen (billionai) }
10893e770bf7SBruno Larsen (billionai)
10903e770bf7SBruno Larsen (billionai) /* SPR shared between PowerPC 40x implementations */
register_40x_sprs(CPUPPCState * env)10913e770bf7SBruno Larsen (billionai) static void register_40x_sprs(CPUPPCState *env)
10923e770bf7SBruno Larsen (billionai) {
10933e770bf7SBruno Larsen (billionai) /* Cache */
10943e770bf7SBruno Larsen (billionai) /* not emulated, as QEMU do not emulate caches */
10953e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_DCCR, "DCCR",
10963e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
10973e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
10983e770bf7SBruno Larsen (billionai) 0x00000000);
10993e770bf7SBruno Larsen (billionai) /* not emulated, as QEMU do not emulate caches */
11003e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_ICCR, "ICCR",
11013e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11023e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11033e770bf7SBruno Larsen (billionai) 0x00000000);
11043e770bf7SBruno Larsen (billionai) /* not emulated, as QEMU do not emulate caches */
11053e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
11063e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11073e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
11083e770bf7SBruno Larsen (billionai) 0x00000000);
11093e770bf7SBruno Larsen (billionai) /* Exception */
11103e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_DEAR, "DEAR",
11113e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11123e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11133e770bf7SBruno Larsen (billionai) 0x00000000);
11143e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_ESR, "ESR",
11153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11163e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11173e770bf7SBruno Larsen (billionai) 0x00000000);
11183e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_EVPR, "EVPR",
11193e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11203e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_excp_prefix,
11213e770bf7SBruno Larsen (billionai) 0x00000000);
11223e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_SRR2, "SRR2",
11233e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11243e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11253e770bf7SBruno Larsen (billionai) 0x00000000);
11263e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_SRR3, "SRR3",
11273e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11283e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11293e770bf7SBruno Larsen (billionai) 0x00000000);
11303e770bf7SBruno Larsen (billionai) /* Timers */
11313e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_PIT, "PIT",
11323e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11333e770bf7SBruno Larsen (billionai) &spr_read_40x_pit, &spr_write_40x_pit,
11343e770bf7SBruno Larsen (billionai) 0x00000000);
11353e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_TCR, "TCR",
11363e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1137cbd8f17dSCédric Le Goater &spr_read_generic, &spr_write_40x_tcr,
11383e770bf7SBruno Larsen (billionai) 0x00000000);
11393e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_TSR, "TSR",
11403e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1141cbd8f17dSCédric Le Goater &spr_read_generic, &spr_write_40x_tsr,
11423e770bf7SBruno Larsen (billionai) 0x00000000);
11433e770bf7SBruno Larsen (billionai) }
11443e770bf7SBruno Larsen (billionai)
11453e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 405 implementation */
register_405_sprs(CPUPPCState * env)11463e770bf7SBruno Larsen (billionai) static void register_405_sprs(CPUPPCState *env)
11473e770bf7SBruno Larsen (billionai) {
11483e770bf7SBruno Larsen (billionai) /* MMU */
11493e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_PID, "PID",
11503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
1151dd69d140SCédric Le Goater &spr_read_generic, &spr_write_40x_pid,
11523e770bf7SBruno Larsen (billionai) 0x00000000);
11533e770bf7SBruno Larsen (billionai) spr_register(env, SPR_4xx_CCR0, "CCR0",
11543e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11553e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11563e770bf7SBruno Larsen (billionai) 0x00700000);
11573e770bf7SBruno Larsen (billionai) /* Debug interface */
11583e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_DBCR0, "DBCR0",
11593e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11603e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_40x_dbcr0,
11613e770bf7SBruno Larsen (billionai) 0x00000000);
1162acf629ebSFabiano Rosas
11633e770bf7SBruno Larsen (billionai) spr_register(env, SPR_405_DBCR1, "DBCR1",
11643e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11653e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11663e770bf7SBruno Larsen (billionai) 0x00000000);
1167acf629ebSFabiano Rosas
11683e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_DBSR, "DBSR",
11693e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11703e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_clear,
11713e770bf7SBruno Larsen (billionai) /* Last reset was system reset */
11723e770bf7SBruno Larsen (billionai) 0x00000300);
1173acf629ebSFabiano Rosas
11743e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_DAC1, "DAC1",
11753e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11763e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11773e770bf7SBruno Larsen (billionai) 0x00000000);
11783e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_DAC2, "DAC2",
11793e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11803e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11813e770bf7SBruno Larsen (billionai) 0x00000000);
1182acf629ebSFabiano Rosas
11833e770bf7SBruno Larsen (billionai) spr_register(env, SPR_405_DVC1, "DVC1",
11843e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11853e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11863e770bf7SBruno Larsen (billionai) 0x00000000);
1187acf629ebSFabiano Rosas
11883e770bf7SBruno Larsen (billionai) spr_register(env, SPR_405_DVC2, "DVC2",
11893e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11903e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11913e770bf7SBruno Larsen (billionai) 0x00000000);
1192acf629ebSFabiano Rosas
11933e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_IAC1, "IAC1",
11943e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11953e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
11963e770bf7SBruno Larsen (billionai) 0x00000000);
11973e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_IAC2, "IAC2",
11983e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
11993e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12003e770bf7SBruno Larsen (billionai) 0x00000000);
1201acf629ebSFabiano Rosas
12023e770bf7SBruno Larsen (billionai) spr_register(env, SPR_405_IAC3, "IAC3",
12033e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12043e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12053e770bf7SBruno Larsen (billionai) 0x00000000);
1206acf629ebSFabiano Rosas
12073e770bf7SBruno Larsen (billionai) spr_register(env, SPR_405_IAC4, "IAC4",
12083e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12093e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12103e770bf7SBruno Larsen (billionai) 0x00000000);
12113e770bf7SBruno Larsen (billionai) /* Storage control */
12123e770bf7SBruno Larsen (billionai) spr_register(env, SPR_405_SLER, "SLER",
12133e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12143e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_40x_sler,
12153e770bf7SBruno Larsen (billionai) 0x00000000);
12163e770bf7SBruno Larsen (billionai) spr_register(env, SPR_40x_ZPR, "ZPR",
12173e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12183e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12193e770bf7SBruno Larsen (billionai) 0x00000000);
1220acf629ebSFabiano Rosas
12213e770bf7SBruno Larsen (billionai) spr_register(env, SPR_405_SU0R, "SU0R",
12223e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12233e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12243e770bf7SBruno Larsen (billionai) 0x00000000);
12253e770bf7SBruno Larsen (billionai) /* SPRG */
12263e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG0, "USPRG0",
12273e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
12283e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
12293e770bf7SBruno Larsen (billionai) 0x00000000);
12303e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG4, "SPRG4",
12313e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12323e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12333e770bf7SBruno Larsen (billionai) 0x00000000);
12343e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG5, "SPRG5",
12353e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12363e770bf7SBruno Larsen (billionai) spr_read_generic, &spr_write_generic,
12373e770bf7SBruno Larsen (billionai) 0x00000000);
12383e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG6, "SPRG6",
12393e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12403e770bf7SBruno Larsen (billionai) spr_read_generic, &spr_write_generic,
12413e770bf7SBruno Larsen (billionai) 0x00000000);
12423e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG7, "SPRG7",
12433e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12443e770bf7SBruno Larsen (billionai) spr_read_generic, &spr_write_generic,
12453e770bf7SBruno Larsen (billionai) 0x00000000);
1246acd1f788SFabiano Rosas
1247acd1f788SFabiano Rosas /* Bus access control */
1248acd1f788SFabiano Rosas /* not emulated, as QEMU never does speculative access */
1249acd1f788SFabiano Rosas spr_register(env, SPR_40x_SGR, "SGR",
1250acd1f788SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
1251acd1f788SFabiano Rosas &spr_read_generic, &spr_write_generic,
1252acd1f788SFabiano Rosas 0xFFFFFFFF);
1253acd1f788SFabiano Rosas /* not emulated, as QEMU do not emulate caches */
1254acd1f788SFabiano Rosas spr_register(env, SPR_40x_DCWR, "DCWR",
1255acd1f788SFabiano Rosas SPR_NOACCESS, SPR_NOACCESS,
1256acd1f788SFabiano Rosas &spr_read_generic, &spr_write_generic,
1257acd1f788SFabiano Rosas 0x00000000);
12583e770bf7SBruno Larsen (billionai) }
12593e770bf7SBruno Larsen (billionai)
12603e770bf7SBruno Larsen (billionai)
register_5xx_8xx_sprs(CPUPPCState * env)12613e770bf7SBruno Larsen (billionai) static void register_5xx_8xx_sprs(CPUPPCState *env)
12623e770bf7SBruno Larsen (billionai) {
12633e770bf7SBruno Larsen (billionai) /* Exception processing */
12643e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_DSISR, "DSISR",
12653e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12663e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12673e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DSISR, 0x00000000);
12683e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_DAR, "DAR",
12693e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12703e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12713e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DAR, 0x00000000);
12723e770bf7SBruno Larsen (billionai) /* Timer */
12733e770bf7SBruno Larsen (billionai) spr_register(env, SPR_DECR, "DECR",
12743e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12753e770bf7SBruno Larsen (billionai) &spr_read_decr, &spr_write_decr,
12763e770bf7SBruno Larsen (billionai) 0x00000000);
1277acf629ebSFabiano Rosas
12783e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_EIE, "EIE",
12793e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12803e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12813e770bf7SBruno Larsen (billionai) 0x00000000);
1282acf629ebSFabiano Rosas
12833e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_EID, "EID",
12843e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12853e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12863e770bf7SBruno Larsen (billionai) 0x00000000);
1287acf629ebSFabiano Rosas
12883e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_NRI, "NRI",
12893e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12903e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12913e770bf7SBruno Larsen (billionai) 0x00000000);
1292acf629ebSFabiano Rosas
12933e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPA, "CMPA",
12943e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
12953e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
12963e770bf7SBruno Larsen (billionai) 0x00000000);
1297acf629ebSFabiano Rosas
12983e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPB, "CMPB",
12993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13003e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13013e770bf7SBruno Larsen (billionai) 0x00000000);
1302acf629ebSFabiano Rosas
13033e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPC, "CMPC",
13043e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13053e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13063e770bf7SBruno Larsen (billionai) 0x00000000);
1307acf629ebSFabiano Rosas
13083e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPD, "CMPD",
13093e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13103e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13113e770bf7SBruno Larsen (billionai) 0x00000000);
1312acf629ebSFabiano Rosas
13133e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_ECR, "ECR",
13143e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13153e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13163e770bf7SBruno Larsen (billionai) 0x00000000);
1317acf629ebSFabiano Rosas
13183e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_DER, "DER",
13193e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13203e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13213e770bf7SBruno Larsen (billionai) 0x00000000);
1322acf629ebSFabiano Rosas
13233e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_COUNTA, "COUNTA",
13243e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13253e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13263e770bf7SBruno Larsen (billionai) 0x00000000);
1327acf629ebSFabiano Rosas
13283e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_COUNTB, "COUNTB",
13293e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13303e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13313e770bf7SBruno Larsen (billionai) 0x00000000);
1332acf629ebSFabiano Rosas
13333e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPE, "CMPE",
13343e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13353e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13363e770bf7SBruno Larsen (billionai) 0x00000000);
1337acf629ebSFabiano Rosas
13383e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPF, "CMPF",
13393e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13403e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13413e770bf7SBruno Larsen (billionai) 0x00000000);
1342acf629ebSFabiano Rosas
13433e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPG, "CMPG",
13443e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13453e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13463e770bf7SBruno Larsen (billionai) 0x00000000);
1347acf629ebSFabiano Rosas
13483e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_CMPH, "CMPH",
13493e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13503e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13513e770bf7SBruno Larsen (billionai) 0x00000000);
1352acf629ebSFabiano Rosas
13533e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
13543e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13553e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13563e770bf7SBruno Larsen (billionai) 0x00000000);
1357acf629ebSFabiano Rosas
13583e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
13593e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13603e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13613e770bf7SBruno Larsen (billionai) 0x00000000);
1362acf629ebSFabiano Rosas
13633e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_BAR, "BAR",
13643e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13653e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13663e770bf7SBruno Larsen (billionai) 0x00000000);
1367acf629ebSFabiano Rosas
13683e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_DPDR, "DPDR",
13693e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13703e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13713e770bf7SBruno Larsen (billionai) 0x00000000);
1372acf629ebSFabiano Rosas
13733e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_IMMR, "IMMR",
13743e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13753e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13763e770bf7SBruno Larsen (billionai) 0x00000000);
13773e770bf7SBruno Larsen (billionai) }
13783e770bf7SBruno Larsen (billionai)
register_5xx_sprs(CPUPPCState * env)13793e770bf7SBruno Larsen (billionai) static void register_5xx_sprs(CPUPPCState *env)
13803e770bf7SBruno Larsen (billionai) {
13813e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
13823e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13833e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13843e770bf7SBruno Larsen (billionai) 0x00000000);
1385acf629ebSFabiano Rosas
13863e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
13873e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13883e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13893e770bf7SBruno Larsen (billionai) 0x00000000);
1390acf629ebSFabiano Rosas
13913e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
13923e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13933e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13943e770bf7SBruno Larsen (billionai) 0x00000000);
1395acf629ebSFabiano Rosas
13963e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
13973e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
13983e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
13993e770bf7SBruno Larsen (billionai) 0x00000000);
1400acf629ebSFabiano Rosas
14013e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
14023e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14033e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14043e770bf7SBruno Larsen (billionai) 0x00000000);
1405acf629ebSFabiano Rosas
14063e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
14073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14093e770bf7SBruno Larsen (billionai) 0x00000000);
1410acf629ebSFabiano Rosas
14113e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
14123e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14133e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14143e770bf7SBruno Larsen (billionai) 0x00000000);
1415acf629ebSFabiano Rosas
14163e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
14173e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14183e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14193e770bf7SBruno Larsen (billionai) 0x00000000);
1420acf629ebSFabiano Rosas
14213e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
14223e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14233e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14243e770bf7SBruno Larsen (billionai) 0x00000000);
1425acf629ebSFabiano Rosas
14263e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
14273e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14283e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14293e770bf7SBruno Larsen (billionai) 0x00000000);
1430acf629ebSFabiano Rosas
14313e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
14323e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14333e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14343e770bf7SBruno Larsen (billionai) 0x00000000);
1435acf629ebSFabiano Rosas
14363e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
14373e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14383e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14393e770bf7SBruno Larsen (billionai) 0x00000000);
1440acf629ebSFabiano Rosas
14413e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
14423e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14433e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14443e770bf7SBruno Larsen (billionai) 0x00000000);
1445acf629ebSFabiano Rosas
14463e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
14473e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14483e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14493e770bf7SBruno Larsen (billionai) 0x00000000);
1450acf629ebSFabiano Rosas
14513e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
14523e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14533e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14543e770bf7SBruno Larsen (billionai) 0x00000000);
1455acf629ebSFabiano Rosas
14563e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
14573e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14583e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14593e770bf7SBruno Larsen (billionai) 0x00000000);
1460acf629ebSFabiano Rosas
14613e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
14623e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14633e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14643e770bf7SBruno Larsen (billionai) 0x00000000);
1465acf629ebSFabiano Rosas
14663e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
14673e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14683e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14693e770bf7SBruno Larsen (billionai) 0x00000000);
1470acf629ebSFabiano Rosas
14713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
14723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14733e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14743e770bf7SBruno Larsen (billionai) 0x00000000);
1475acf629ebSFabiano Rosas
14763e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
14773e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14783e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14793e770bf7SBruno Larsen (billionai) 0x00000000);
1480acf629ebSFabiano Rosas
14813e770bf7SBruno Larsen (billionai) spr_register(env, SPR_RCPU_FPECR, "FPECR",
14823e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14833e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14843e770bf7SBruno Larsen (billionai) 0x00000000);
14853e770bf7SBruno Larsen (billionai) }
14863e770bf7SBruno Larsen (billionai)
register_8xx_sprs(CPUPPCState * env)14873e770bf7SBruno Larsen (billionai) static void register_8xx_sprs(CPUPPCState *env)
14883e770bf7SBruno Larsen (billionai) {
1489acf629ebSFabiano Rosas
14903e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_IC_CST, "IC_CST",
14913e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14923e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14933e770bf7SBruno Larsen (billionai) 0x00000000);
1494acf629ebSFabiano Rosas
14953e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
14963e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
14973e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
14983e770bf7SBruno Larsen (billionai) 0x00000000);
1499acf629ebSFabiano Rosas
15003e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
15013e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15023e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15033e770bf7SBruno Larsen (billionai) 0x00000000);
1504acf629ebSFabiano Rosas
15053e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_DC_CST, "DC_CST",
15063e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15073e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15083e770bf7SBruno Larsen (billionai) 0x00000000);
1509acf629ebSFabiano Rosas
15103e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
15113e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15123e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15133e770bf7SBruno Larsen (billionai) 0x00000000);
1514acf629ebSFabiano Rosas
15153e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
15163e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15173e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15183e770bf7SBruno Larsen (billionai) 0x00000000);
1519acf629ebSFabiano Rosas
15203e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
15213e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15223e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15233e770bf7SBruno Larsen (billionai) 0x00000000);
1524acf629ebSFabiano Rosas
15253e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_AP, "MI_AP",
15263e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15273e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15283e770bf7SBruno Larsen (billionai) 0x00000000);
1529acf629ebSFabiano Rosas
15303e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
15313e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15323e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15333e770bf7SBruno Larsen (billionai) 0x00000000);
1534acf629ebSFabiano Rosas
15353e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
15363e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15373e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15383e770bf7SBruno Larsen (billionai) 0x00000000);
1539acf629ebSFabiano Rosas
15403e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
15413e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15423e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15433e770bf7SBruno Larsen (billionai) 0x00000000);
1544acf629ebSFabiano Rosas
15453e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
15463e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15473e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15483e770bf7SBruno Larsen (billionai) 0x00000000);
1549acf629ebSFabiano Rosas
15503e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
15513e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15523e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15533e770bf7SBruno Larsen (billionai) 0x00000000);
1554acf629ebSFabiano Rosas
15553e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
15563e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15573e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15583e770bf7SBruno Larsen (billionai) 0x00000000);
1559acf629ebSFabiano Rosas
15603e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
15613e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15623e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15633e770bf7SBruno Larsen (billionai) 0x00000000);
1564acf629ebSFabiano Rosas
15653e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
15663e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15673e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15683e770bf7SBruno Larsen (billionai) 0x00000000);
1569acf629ebSFabiano Rosas
15703e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_AP, "MD_AP",
15713e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15723e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15733e770bf7SBruno Larsen (billionai) 0x00000000);
1574acf629ebSFabiano Rosas
15753e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
15763e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15773e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15783e770bf7SBruno Larsen (billionai) 0x00000000);
1579acf629ebSFabiano Rosas
15803e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
15813e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15823e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15833e770bf7SBruno Larsen (billionai) 0x00000000);
1584acf629ebSFabiano Rosas
15853e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
15863e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15873e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15883e770bf7SBruno Larsen (billionai) 0x00000000);
1589acf629ebSFabiano Rosas
15903e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
15913e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15923e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15933e770bf7SBruno Larsen (billionai) 0x00000000);
1594acf629ebSFabiano Rosas
15953e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_TW, "MD_TW",
15963e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
15973e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
15983e770bf7SBruno Larsen (billionai) 0x00000000);
1599acf629ebSFabiano Rosas
16003e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
16013e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
16023e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
16033e770bf7SBruno Larsen (billionai) 0x00000000);
1604acf629ebSFabiano Rosas
16053e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
16063e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
16073e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
16083e770bf7SBruno Larsen (billionai) 0x00000000);
1609acf629ebSFabiano Rosas
16103e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
16113e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
16123e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
16133e770bf7SBruno Larsen (billionai) 0x00000000);
16143e770bf7SBruno Larsen (billionai) }
16153e770bf7SBruno Larsen (billionai)
16163e770bf7SBruno Larsen (billionai) /*
16173e770bf7SBruno Larsen (billionai) * AMR => SPR 29 (Power 2.04)
16183e770bf7SBruno Larsen (billionai) * CTRL => SPR 136 (Power 2.04)
16193e770bf7SBruno Larsen (billionai) * CTRL => SPR 152 (Power 2.04)
16203e770bf7SBruno Larsen (billionai) * SCOMC => SPR 276 (64 bits ?)
16213e770bf7SBruno Larsen (billionai) * SCOMD => SPR 277 (64 bits ?)
16223e770bf7SBruno Larsen (billionai) * TBU40 => SPR 286 (Power 2.04 hypv)
16233e770bf7SBruno Larsen (billionai) * HSPRG0 => SPR 304 (Power 2.04 hypv)
16243e770bf7SBruno Larsen (billionai) * HSPRG1 => SPR 305 (Power 2.04 hypv)
16253e770bf7SBruno Larsen (billionai) * HDSISR => SPR 306 (Power 2.04 hypv)
16263e770bf7SBruno Larsen (billionai) * HDAR => SPR 307 (Power 2.04 hypv)
16273e770bf7SBruno Larsen (billionai) * PURR => SPR 309 (Power 2.04 hypv)
16283e770bf7SBruno Larsen (billionai) * HDEC => SPR 310 (Power 2.04 hypv)
16293e770bf7SBruno Larsen (billionai) * HIOR => SPR 311 (hypv)
16303e770bf7SBruno Larsen (billionai) * RMOR => SPR 312 (970)
16313e770bf7SBruno Larsen (billionai) * HRMOR => SPR 313 (Power 2.04 hypv)
16323e770bf7SBruno Larsen (billionai) * HSRR0 => SPR 314 (Power 2.04 hypv)
16333e770bf7SBruno Larsen (billionai) * HSRR1 => SPR 315 (Power 2.04 hypv)
16343e770bf7SBruno Larsen (billionai) * LPIDR => SPR 317 (970)
1635a3c020d8SNicholas Piggin * HEIR => SPR 339 (Power 2.05 hypv) (64-bit reg from 3.1)
16363e770bf7SBruno Larsen (billionai) * EPR => SPR 702 (Power 2.04 emb)
16373e770bf7SBruno Larsen (billionai) * perf => 768-783 (Power 2.04)
16383e770bf7SBruno Larsen (billionai) * perf => 784-799 (Power 2.04)
16393e770bf7SBruno Larsen (billionai) * PPR => SPR 896 (Power 2.04)
16403e770bf7SBruno Larsen (billionai) * DABRX => 1015 (Power 2.04 hypv)
16413e770bf7SBruno Larsen (billionai) * FPECR => SPR 1022 (?)
16423e770bf7SBruno Larsen (billionai) * ... and more (thermal management, performance counters, ...)
16433e770bf7SBruno Larsen (billionai) */
16443e770bf7SBruno Larsen (billionai)
16453e770bf7SBruno Larsen (billionai) /*****************************************************************************/
16463e770bf7SBruno Larsen (billionai) /* Exception vectors models */
init_excp_4xx(CPUPPCState * env)1647870120b4SPhilippe Mathieu-Daudé static void init_excp_4xx(CPUPPCState *env)
16483e770bf7SBruno Larsen (billionai) {
16493e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
16503e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
16513e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
16523e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
16533e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
16543e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
16553e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
16563e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
16573e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
16583e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
16593e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
16603e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
16613e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100;
16623e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200;
16633e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
16643e770bf7SBruno Larsen (billionai) env->ivor_mask = 0x0000FFF0UL;
16653e770bf7SBruno Larsen (billionai) env->ivpr_mask = 0xFFFF0000UL;
16663e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
16673e770bf7SBruno Larsen (billionai) env->hreset_vector = 0xFFFFFFFCUL;
16683e770bf7SBruno Larsen (billionai) #endif
16693e770bf7SBruno Larsen (billionai) }
16703e770bf7SBruno Larsen (billionai)
init_excp_MPC5xx(CPUPPCState * env)16713e770bf7SBruno Larsen (billionai) static void init_excp_MPC5xx(CPUPPCState *env)
16723e770bf7SBruno Larsen (billionai) {
16733e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
16743e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
16753e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
16763e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
16773e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
16783e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
16796328a3bbSFabiano Rosas env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
16803e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
16813e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
16823e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
16833e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
16843e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
16853e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
16863e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
16873e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
16883e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
16893e770bf7SBruno Larsen (billionai) env->ivor_mask = 0x0000FFF0UL;
16903e770bf7SBruno Larsen (billionai) env->ivpr_mask = 0xFFFF0000UL;
16913e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
16923e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
16933e770bf7SBruno Larsen (billionai) #endif
16943e770bf7SBruno Larsen (billionai) }
16953e770bf7SBruno Larsen (billionai)
init_excp_MPC8xx(CPUPPCState * env)16963e770bf7SBruno Larsen (billionai) static void init_excp_MPC8xx(CPUPPCState *env)
16973e770bf7SBruno Larsen (billionai) {
16983e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
16993e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
17003e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
17013e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
17023e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
17033e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
17043e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
17053e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
17066328a3bbSFabiano Rosas env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
17073e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
17083e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
17093e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
17103e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
17113e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
17123e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001100;
17133e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001200;
17143e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ITLBE] = 0x00001300;
17153e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DTLBE] = 0x00001400;
17163e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
17173e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
17183e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
17193e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
17203e770bf7SBruno Larsen (billionai) env->ivor_mask = 0x0000FFF0UL;
17213e770bf7SBruno Larsen (billionai) env->ivpr_mask = 0xFFFF0000UL;
17223e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
17233e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
17243e770bf7SBruno Larsen (billionai) #endif
17253e770bf7SBruno Larsen (billionai) }
17263e770bf7SBruno Larsen (billionai)
init_excp_G2(CPUPPCState * env)17273e770bf7SBruno Larsen (billionai) static void init_excp_G2(CPUPPCState *env)
17283e770bf7SBruno Larsen (billionai) {
17293e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
17303e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
17313e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
17323e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
17333e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
17343e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
17353e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
17363e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
17373e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
17383e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
17393e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
17403e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
17413e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
17423e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
17433e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
17443e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
17453e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
17463e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
17473e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
17483e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
17493e770bf7SBruno Larsen (billionai) #endif
17503e770bf7SBruno Larsen (billionai) }
17513e770bf7SBruno Larsen (billionai)
init_excp_e200(CPUPPCState * env,target_ulong ivpr_mask)17523e770bf7SBruno Larsen (billionai) static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
17533e770bf7SBruno Larsen (billionai) {
17543e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
17553e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000FFC;
17563e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
17573e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
17583e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
17593e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
17603e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
17613e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
17623e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
17633e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
17643e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
17653e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
17663e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
17673e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
17683e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
17693e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
17703e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
17713e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
17727fc1dc83SFabiano Rosas /*
17737fc1dc83SFabiano Rosas * These two are the same IVOR as POWERPC_EXCP_VPU and
17747fc1dc83SFabiano Rosas * POWERPC_EXCP_VPUA. We deal with that when dispatching at
17757fc1dc83SFabiano Rosas * powerpc_excp().
17767fc1dc83SFabiano Rosas */
17773e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000;
17783e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000;
17797fc1dc83SFabiano Rosas
17803e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000;
17813e770bf7SBruno Larsen (billionai) env->ivor_mask = 0x0000FFF7UL;
17823e770bf7SBruno Larsen (billionai) env->ivpr_mask = ivpr_mask;
17833e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
17843e770bf7SBruno Larsen (billionai) env->hreset_vector = 0xFFFFFFFCUL;
17853e770bf7SBruno Larsen (billionai) #endif
17863e770bf7SBruno Larsen (billionai) }
17873e770bf7SBruno Larsen (billionai)
init_excp_BookE(CPUPPCState * env)17883e770bf7SBruno Larsen (billionai) static void init_excp_BookE(CPUPPCState *env)
17893e770bf7SBruno Larsen (billionai) {
17903e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
17913e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
17923e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
17933e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
17943e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
17953e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
17963e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
17973e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
17983e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
17993e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
18003e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
18013e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
18023e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
18033e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
18043e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
18053e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
18063e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
18073e770bf7SBruno Larsen (billionai) env->ivor_mask = 0x0000FFF0UL;
18083e770bf7SBruno Larsen (billionai) env->ivpr_mask = 0xFFFF0000UL;
18093e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
18103e770bf7SBruno Larsen (billionai) env->hreset_vector = 0xFFFFFFFCUL;
18113e770bf7SBruno Larsen (billionai) #endif
18123e770bf7SBruno Larsen (billionai) }
18133e770bf7SBruno Larsen (billionai)
init_excp_603(CPUPPCState * env)18143e770bf7SBruno Larsen (billionai) static void init_excp_603(CPUPPCState *env)
18153e770bf7SBruno Larsen (billionai) {
18163e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18173e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
18183e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
18193e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
18203e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
18213e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18223e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
18233e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
18243e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
18253e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
18263e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
18273e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
18283e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
18293e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
18303e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
18313e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
18323e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
18333e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
18343e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
18353e770bf7SBruno Larsen (billionai) #endif
18363e770bf7SBruno Larsen (billionai) }
18373e770bf7SBruno Larsen (billionai)
init_excp_604(CPUPPCState * env)18383e770bf7SBruno Larsen (billionai) static void init_excp_604(CPUPPCState *env)
18393e770bf7SBruno Larsen (billionai) {
18403e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18413e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
18423e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
18433e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
18443e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
18453e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18463e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
18473e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
18483e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
18493e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
18503e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
18513e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
18523e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
18533e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
18543e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
18553e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
18563e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
18573e770bf7SBruno Larsen (billionai) #endif
18583e770bf7SBruno Larsen (billionai) }
18593e770bf7SBruno Larsen (billionai)
init_excp_7x0(CPUPPCState * env)18603e770bf7SBruno Larsen (billionai) static void init_excp_7x0(CPUPPCState *env)
18613e770bf7SBruno Larsen (billionai) {
18623e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18633e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
18643e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
18653e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
18663e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
18673e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18683e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
18693e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
18703e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
18713e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
18723e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
18733e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
18743e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
18753e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
18763e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
18773e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
18783e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
18793e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
18803e770bf7SBruno Larsen (billionai) #endif
18813e770bf7SBruno Larsen (billionai) }
18823e770bf7SBruno Larsen (billionai)
init_excp_750cl(CPUPPCState * env)18833e770bf7SBruno Larsen (billionai) static void init_excp_750cl(CPUPPCState *env)
18843e770bf7SBruno Larsen (billionai) {
18853e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18863e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
18873e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
18883e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
18893e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
18903e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18913e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
18923e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
18933e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
18943e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
18953e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
18963e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
18973e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
18983e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
18993e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
19003e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
19013e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
19023e770bf7SBruno Larsen (billionai) #endif
19033e770bf7SBruno Larsen (billionai) }
19043e770bf7SBruno Larsen (billionai)
init_excp_750cx(CPUPPCState * env)19053e770bf7SBruno Larsen (billionai) static void init_excp_750cx(CPUPPCState *env)
19063e770bf7SBruno Larsen (billionai) {
19073e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19083e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
19093e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
19103e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
19113e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
19123e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19133e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
19143e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
19153e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
19163e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
19173e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
19183e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
19193e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
19203e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
19213e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
19223e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
19233e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
19243e770bf7SBruno Larsen (billionai) #endif
19253e770bf7SBruno Larsen (billionai) }
19263e770bf7SBruno Larsen (billionai)
19273e770bf7SBruno Larsen (billionai) /* XXX: Check if this is correct */
init_excp_7x5(CPUPPCState * env)19283e770bf7SBruno Larsen (billionai) static void init_excp_7x5(CPUPPCState *env)
19293e770bf7SBruno Larsen (billionai) {
19303e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19313e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
19323e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
19333e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
19343e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
19353e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19363e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
19373e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
19383e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
19393e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
19403e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
19413e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
19423e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
19433e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
19443e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
19453e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
19463e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
19473e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
19483e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
19493e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
19503e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
19513e770bf7SBruno Larsen (billionai) #endif
19523e770bf7SBruno Larsen (billionai) }
19533e770bf7SBruno Larsen (billionai)
init_excp_7400(CPUPPCState * env)19543e770bf7SBruno Larsen (billionai) static void init_excp_7400(CPUPPCState *env)
19553e770bf7SBruno Larsen (billionai) {
19563e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19573e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
19583e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
19593e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
19603e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
19613e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19623e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
19633e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
19643e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
19653e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
19663e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
19673e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
19683e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
19693e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
19703e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
19713e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
19723e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
19733e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
19743e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
19753e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
19763e770bf7SBruno Larsen (billionai) #endif
19773e770bf7SBruno Larsen (billionai) }
19783e770bf7SBruno Larsen (billionai)
init_excp_7450(CPUPPCState * env)19793e770bf7SBruno Larsen (billionai) static void init_excp_7450(CPUPPCState *env)
19803e770bf7SBruno Larsen (billionai) {
19813e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19823e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
19833e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
19843e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
19853e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
19863e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19873e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
19883e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
19893e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
19903e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
19913e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
19923e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
19933e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
19943e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
19953e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
19963e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
19973e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
19983e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
19993e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x00000100UL;
20003e770bf7SBruno Larsen (billionai) #endif
20013e770bf7SBruno Larsen (billionai) }
20023e770bf7SBruno Larsen (billionai)
20033e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
init_excp_970(CPUPPCState * env)20043e770bf7SBruno Larsen (billionai) static void init_excp_970(CPUPPCState *env)
20053e770bf7SBruno Larsen (billionai) {
20063e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20073e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
20083e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
20093e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
20103e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
20113e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
20123e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
20133e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
20143e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
20153e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
20163e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
20173e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
20183e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
20193e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
20203e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
20213e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
20223e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
20233e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
20243e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
20253e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
20263e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800;
20273e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
20283e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x0000000000000100ULL;
20293e770bf7SBruno Larsen (billionai) #endif
20303e770bf7SBruno Larsen (billionai) }
20313e770bf7SBruno Larsen (billionai)
init_excp_POWER7(CPUPPCState * env)20323e770bf7SBruno Larsen (billionai) static void init_excp_POWER7(CPUPPCState *env)
20333e770bf7SBruno Larsen (billionai) {
20343e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20353e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
20363e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
20373e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
20383e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
20393e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
20403e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
20413e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
20423e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
20433e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
20443e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
20453e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
20463e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
20473e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
20483e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
20493e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HDSI] = 0x00000E00;
20503e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HISI] = 0x00000E20;
20513e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HV_EMU] = 0x00000E40;
20523e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HV_MAINT] = 0x00000E60;
20533e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
20543e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
20553e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_VSXU] = 0x00000F40;
20563e770bf7SBruno Larsen (billionai) /* Hardware reset vector */
20573e770bf7SBruno Larsen (billionai) env->hreset_vector = 0x0000000000000100ULL;
20583e770bf7SBruno Larsen (billionai) #endif
20593e770bf7SBruno Larsen (billionai) }
20603e770bf7SBruno Larsen (billionai)
init_excp_POWER8(CPUPPCState * env)20613e770bf7SBruno Larsen (billionai) static void init_excp_POWER8(CPUPPCState *env)
20623e770bf7SBruno Larsen (billionai) {
20633e770bf7SBruno Larsen (billionai) init_excp_POWER7(env);
20643e770bf7SBruno Larsen (billionai)
20653e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20663e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SDOOR] = 0x00000A00;
20673e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_FU] = 0x00000F60;
20683e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HV_FU] = 0x00000F80;
20693e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SDOOR_HV] = 0x00000E80;
2070cb76bbc4SDaniel Henrique Barboza
2071cb76bbc4SDaniel Henrique Barboza /* Userland exceptions without vector value in PowerISA v3.1 */
2072cb76bbc4SDaniel Henrique Barboza env->excp_vectors[POWERPC_EXCP_PERFM_EBB] = 0x0;
2073cb76bbc4SDaniel Henrique Barboza env->excp_vectors[POWERPC_EXCP_EXTERNAL_EBB] = 0x0;
20743e770bf7SBruno Larsen (billionai) #endif
20753e770bf7SBruno Larsen (billionai) }
20763e770bf7SBruno Larsen (billionai)
init_excp_POWER9(CPUPPCState * env)20773e770bf7SBruno Larsen (billionai) static void init_excp_POWER9(CPUPPCState *env)
20783e770bf7SBruno Larsen (billionai) {
20793e770bf7SBruno Larsen (billionai) init_excp_POWER8(env);
20803e770bf7SBruno Larsen (billionai)
20813e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20823e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_HVIRT] = 0x00000EA0;
20833e770bf7SBruno Larsen (billionai) env->excp_vectors[POWERPC_EXCP_SYSCALL_VECTORED] = 0x00017000;
20843e770bf7SBruno Larsen (billionai) #endif
20853e770bf7SBruno Larsen (billionai) }
20863e770bf7SBruno Larsen (billionai)
init_excp_POWER10(CPUPPCState * env)20873e770bf7SBruno Larsen (billionai) static void init_excp_POWER10(CPUPPCState *env)
20883e770bf7SBruno Larsen (billionai) {
20893e770bf7SBruno Larsen (billionai) init_excp_POWER9(env);
20903e770bf7SBruno Larsen (billionai) }
20913e770bf7SBruno Larsen (billionai)
20923e770bf7SBruno Larsen (billionai) #endif
20933e770bf7SBruno Larsen (billionai)
check_pow_hid0(CPUPPCState * env)20943e770bf7SBruno Larsen (billionai) static int check_pow_hid0(CPUPPCState *env)
20953e770bf7SBruno Larsen (billionai) {
20963e770bf7SBruno Larsen (billionai) if (env->spr[SPR_HID0] & 0x00E00000) {
20973e770bf7SBruno Larsen (billionai) return 1;
20983e770bf7SBruno Larsen (billionai) }
20993e770bf7SBruno Larsen (billionai)
21003e770bf7SBruno Larsen (billionai) return 0;
21013e770bf7SBruno Larsen (billionai) }
21023e770bf7SBruno Larsen (billionai)
check_pow_hid0_74xx(CPUPPCState * env)21033e770bf7SBruno Larsen (billionai) static int check_pow_hid0_74xx(CPUPPCState *env)
21043e770bf7SBruno Larsen (billionai) {
21053e770bf7SBruno Larsen (billionai) if (env->spr[SPR_HID0] & 0x00600000) {
21063e770bf7SBruno Larsen (billionai) return 1;
21073e770bf7SBruno Larsen (billionai) }
21083e770bf7SBruno Larsen (billionai)
21093e770bf7SBruno Larsen (billionai) return 0;
21103e770bf7SBruno Larsen (billionai) }
21113e770bf7SBruno Larsen (billionai)
211245693f94SNicholas Piggin #if defined(TARGET_PPC64)
check_attn_hid0(CPUPPCState * env)211345693f94SNicholas Piggin static int check_attn_hid0(CPUPPCState *env)
211445693f94SNicholas Piggin {
211545693f94SNicholas Piggin if (env->spr[SPR_HID0] & HID0_ENABLE_ATTN) {
211645693f94SNicholas Piggin return 1;
211745693f94SNicholas Piggin }
211845693f94SNicholas Piggin
211945693f94SNicholas Piggin return 0;
212045693f94SNicholas Piggin }
212145693f94SNicholas Piggin
check_attn_hid0_power9(CPUPPCState * env)212245693f94SNicholas Piggin static int check_attn_hid0_power9(CPUPPCState *env)
212345693f94SNicholas Piggin {
212445693f94SNicholas Piggin if (env->spr[SPR_HID0] & HID0_POWER9_ENABLE_ATTN) {
212545693f94SNicholas Piggin return 1;
212645693f94SNicholas Piggin }
212745693f94SNicholas Piggin
212845693f94SNicholas Piggin return 0;
212945693f94SNicholas Piggin }
213045693f94SNicholas Piggin #endif
213145693f94SNicholas Piggin
init_tlbs_emb(CPUPPCState * env)2132581eea5dSBALATON Zoltan static void init_tlbs_emb(CPUPPCState *env)
2133581eea5dSBALATON Zoltan {
2134581eea5dSBALATON Zoltan #ifndef CONFIG_USER_ONLY
2135581eea5dSBALATON Zoltan env->nb_tlb = 64;
2136581eea5dSBALATON Zoltan env->nb_ways = 1;
2137581eea5dSBALATON Zoltan env->tlb_type = TLB_EMB;
2138581eea5dSBALATON Zoltan #endif
2139581eea5dSBALATON Zoltan }
2140581eea5dSBALATON Zoltan
init_proc_405(CPUPPCState * env)21413e770bf7SBruno Larsen (billionai) static void init_proc_405(CPUPPCState *env)
21423e770bf7SBruno Larsen (billionai) {
21433e770bf7SBruno Larsen (billionai) register_40x_sprs(env);
21443e770bf7SBruno Larsen (billionai) register_405_sprs(env);
21454ffb8c5eSFabiano Rosas register_usprgh_sprs(env);
2146acd1f788SFabiano Rosas
2147581eea5dSBALATON Zoltan init_tlbs_emb(env);
2148870120b4SPhilippe Mathieu-Daudé init_excp_4xx(env);
21493e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
21503e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
21513e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
21523e770bf7SBruno Larsen (billionai) ppc40x_irq_init(env_archcpu(env));
21533e770bf7SBruno Larsen (billionai)
21543e770bf7SBruno Larsen (billionai) SET_FIT_PERIOD(8, 12, 16, 20);
21553e770bf7SBruno Larsen (billionai) SET_WDT_PERIOD(16, 20, 24, 28);
21563e770bf7SBruno Larsen (billionai) }
21573e770bf7SBruno Larsen (billionai)
21583e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
21593e770bf7SBruno Larsen (billionai) {
21603e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
21613e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
21623e770bf7SBruno Larsen (billionai)
21633e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 405";
21643e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_405;
21653e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
216645693f94SNicholas Piggin pcc->check_attn = check_attn_none;
21673e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
21683e770bf7SBruno Larsen (billionai) PPC_DCR | PPC_WRTEE |
21693e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
21703e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
21713e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
21723e770bf7SBruno Larsen (billionai) PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
21733e770bf7SBruno Larsen (billionai) PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
2174645d843cSFabiano Rosas pcc->msr_mask = (1ull << MSR_WE) |
21753e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
21763e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
21773e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
21783e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
2179301e5d48SFabiano Rosas (1ull << MSR_ME) |
21803e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
21813e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
21823e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
21833e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
21843e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
21853e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_40x;
21863e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_405;
21873e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_403;
21883e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
21893e770bf7SBruno Larsen (billionai) POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
21903e770bf7SBruno Larsen (billionai) }
21913e770bf7SBruno Larsen (billionai)
init_proc_440EP(CPUPPCState * env)21923e770bf7SBruno Larsen (billionai) static void init_proc_440EP(CPUPPCState *env)
21933e770bf7SBruno Larsen (billionai) {
21943e770bf7SBruno Larsen (billionai) register_BookE_sprs(env, 0x000000000000FFFFULL);
21953e770bf7SBruno Larsen (billionai) register_440_sprs(env);
21963e770bf7SBruno Larsen (billionai) register_usprgh_sprs(env);
2197acf629ebSFabiano Rosas
21983e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSR, "MCSR",
21993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
22003e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
22013e770bf7SBruno Larsen (billionai) 0x00000000);
22023e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
22033e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
22043e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
22053e770bf7SBruno Larsen (billionai) 0x00000000);
22063e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
22073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
22083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
22093e770bf7SBruno Larsen (billionai) 0x00000000);
2210acf629ebSFabiano Rosas
22113e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_CCR1, "CCR1",
22123e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
22133e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
22143e770bf7SBruno Larsen (billionai) 0x00000000);
2215581eea5dSBALATON Zoltan
2216581eea5dSBALATON Zoltan init_tlbs_emb(env);
22173e770bf7SBruno Larsen (billionai) init_excp_BookE(env);
22183e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
22193e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
22203e770bf7SBruno Larsen (billionai) ppc40x_irq_init(env_archcpu(env));
22213e770bf7SBruno Larsen (billionai)
22223e770bf7SBruno Larsen (billionai) SET_FIT_PERIOD(12, 16, 20, 24);
22233e770bf7SBruno Larsen (billionai) SET_WDT_PERIOD(20, 24, 28, 32);
22243e770bf7SBruno Larsen (billionai) }
22253e770bf7SBruno Larsen (billionai)
22263e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
22273e770bf7SBruno Larsen (billionai) {
22283e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
22293e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
22303e770bf7SBruno Larsen (billionai)
22313e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 440 EP";
22323e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_440EP;
22333e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
223445693f94SNicholas Piggin pcc->check_attn = check_attn_none;
22353e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
22363e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
22373e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
22383e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
22393e770bf7SBruno Larsen (billionai) PPC_DCR | PPC_WRTEE | PPC_RFMCI |
22403e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
22413e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
22423e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_MFTB |
22433e770bf7SBruno Larsen (billionai) PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
22443e770bf7SBruno Larsen (billionai) PPC_440_SPEC;
22453e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
22463e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
22473e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
22483e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
22493e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
22503e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
22513e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
22523e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
22533e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
22543e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
22553e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
22563e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
22573e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE;
22583e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
22593e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
22603e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_403;
22613e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
22623e770bf7SBruno Larsen (billionai) POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
22633e770bf7SBruno Larsen (billionai) }
22643e770bf7SBruno Larsen (billionai)
22653e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(460EX)(ObjectClass *oc, void *data)
22663e770bf7SBruno Larsen (billionai) {
22673e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
22683e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
22693e770bf7SBruno Larsen (billionai)
22703e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 460 EX";
22713e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_440EP;
22723e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
227345693f94SNicholas Piggin pcc->check_attn = check_attn_none;
22743e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
22753e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
22763e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
22773e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
22783e770bf7SBruno Larsen (billionai) PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_RFMCI |
22793e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
22803e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
22813e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_MFTB |
22823e770bf7SBruno Larsen (billionai) PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
22833e770bf7SBruno Larsen (billionai) PPC_440_SPEC;
22843e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
22853e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
22863e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
22873e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
22883e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
22893e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
22903e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
22913e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
22923e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
22933e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
22943e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
22953e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
22963e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE;
22973e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
22983e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
22993e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_403;
23003e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
23013e770bf7SBruno Larsen (billionai) POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
23023e770bf7SBruno Larsen (billionai) }
23033e770bf7SBruno Larsen (billionai)
init_proc_440GP(CPUPPCState * env)23043e770bf7SBruno Larsen (billionai) static void init_proc_440GP(CPUPPCState *env)
23053e770bf7SBruno Larsen (billionai) {
23063e770bf7SBruno Larsen (billionai) register_BookE_sprs(env, 0x000000000000FFFFULL);
23073e770bf7SBruno Larsen (billionai) register_440_sprs(env);
23083e770bf7SBruno Larsen (billionai) register_usprgh_sprs(env);
2309acf629ebSFabiano Rosas
2310581eea5dSBALATON Zoltan init_tlbs_emb(env);
23113e770bf7SBruno Larsen (billionai) init_excp_BookE(env);
23123e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
23133e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
23143e770bf7SBruno Larsen (billionai) /* XXX: TODO: allocate internal IRQ controller */
23153e770bf7SBruno Larsen (billionai)
23163e770bf7SBruno Larsen (billionai) SET_FIT_PERIOD(12, 16, 20, 24);
23173e770bf7SBruno Larsen (billionai) SET_WDT_PERIOD(20, 24, 28, 32);
23183e770bf7SBruno Larsen (billionai) }
23193e770bf7SBruno Larsen (billionai)
23203e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
23213e770bf7SBruno Larsen (billionai) {
23223e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
23233e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
23243e770bf7SBruno Larsen (billionai)
23253e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 440 GP";
23263e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_440GP;
23273e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
232845693f94SNicholas Piggin pcc->check_attn = check_attn_none;
23293e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
23303e770bf7SBruno Larsen (billionai) PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
23313e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
23323e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
23333e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
23343e770bf7SBruno Larsen (billionai) PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
23353e770bf7SBruno Larsen (billionai) PPC_440_SPEC;
23363e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
23373e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
23383e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
23393e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
23403e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
23413e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
23423e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
23433e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
23443e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
23453e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
23463e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
23473e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
23483e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE;
23493e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
23503e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
23513e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_403;
23523e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
23533e770bf7SBruno Larsen (billionai) POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
23543e770bf7SBruno Larsen (billionai) }
23553e770bf7SBruno Larsen (billionai)
init_proc_440x5(CPUPPCState * env)23563e770bf7SBruno Larsen (billionai) static void init_proc_440x5(CPUPPCState *env)
23573e770bf7SBruno Larsen (billionai) {
23583e770bf7SBruno Larsen (billionai) register_BookE_sprs(env, 0x000000000000FFFFULL);
23593e770bf7SBruno Larsen (billionai) register_440_sprs(env);
23603e770bf7SBruno Larsen (billionai) register_usprgh_sprs(env);
2361acf629ebSFabiano Rosas
23623e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSR, "MCSR",
23633e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
23643e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
23653e770bf7SBruno Larsen (billionai) 0x00000000);
23663e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
23673e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
23683e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
23693e770bf7SBruno Larsen (billionai) 0x00000000);
23703e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
23713e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
23723e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
23733e770bf7SBruno Larsen (billionai) 0x00000000);
2374acf629ebSFabiano Rosas
23753e770bf7SBruno Larsen (billionai) spr_register(env, SPR_440_CCR1, "CCR1",
23763e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
23773e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
23783e770bf7SBruno Larsen (billionai) 0x00000000);
2379581eea5dSBALATON Zoltan
2380581eea5dSBALATON Zoltan init_tlbs_emb(env);
23813e770bf7SBruno Larsen (billionai) init_excp_BookE(env);
23823e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
23833e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
23843e770bf7SBruno Larsen (billionai) ppc40x_irq_init(env_archcpu(env));
23853e770bf7SBruno Larsen (billionai)
23863e770bf7SBruno Larsen (billionai) SET_FIT_PERIOD(12, 16, 20, 24);
23873e770bf7SBruno Larsen (billionai) SET_WDT_PERIOD(20, 24, 28, 32);
23883e770bf7SBruno Larsen (billionai) }
23893e770bf7SBruno Larsen (billionai)
23903e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
23913e770bf7SBruno Larsen (billionai) {
23923e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
23933e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
23943e770bf7SBruno Larsen (billionai)
23953e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 440x5";
23963e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_440x5;
23973e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
239845693f94SNicholas Piggin pcc->check_attn = check_attn_none;
23993e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
24003e770bf7SBruno Larsen (billionai) PPC_DCR | PPC_WRTEE | PPC_RFMCI |
24013e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
24023e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
24033e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_MFTB |
24043e770bf7SBruno Larsen (billionai) PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
24053e770bf7SBruno Larsen (billionai) PPC_440_SPEC;
24063e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
24073e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
24083e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
24093e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
24103e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
24113e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
24123e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
24133e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
24143e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
24153e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
24163e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
24173e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
24183e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE;
24193e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
24203e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
24213e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_403;
24223e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
24233e770bf7SBruno Larsen (billionai) POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
24243e770bf7SBruno Larsen (billionai) }
24253e770bf7SBruno Larsen (billionai)
24263e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440x5wDFPU)(ObjectClass *oc, void *data)
24273e770bf7SBruno Larsen (billionai) {
24283e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
24293e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
24303e770bf7SBruno Larsen (billionai)
24313e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 440x5 with double precision FPU";
24323e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_440x5;
24333e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
243445693f94SNicholas Piggin pcc->check_attn = check_attn_none;
24353e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
24363e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSQRT |
24373e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
24383e770bf7SBruno Larsen (billionai) PPC_DCR | PPC_WRTEE | PPC_RFMCI |
24393e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
24403e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
24413e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_MFTB |
24423e770bf7SBruno Larsen (billionai) PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
24433e770bf7SBruno Larsen (billionai) PPC_440_SPEC;
24443e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_FP_CVT_S64;
24453e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
24463e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
24473e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
24483e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
24493e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
24503e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
24513e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
24523e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
24533e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
24543e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
24553e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
24563e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
24573e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE;
24583e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
24593e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
24603e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_403;
24613e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
24623e770bf7SBruno Larsen (billionai) POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
24633e770bf7SBruno Larsen (billionai) }
24643e770bf7SBruno Larsen (billionai)
init_proc_MPC5xx(CPUPPCState * env)24653e770bf7SBruno Larsen (billionai) static void init_proc_MPC5xx(CPUPPCState *env)
24663e770bf7SBruno Larsen (billionai) {
24673e770bf7SBruno Larsen (billionai) register_5xx_8xx_sprs(env);
24683e770bf7SBruno Larsen (billionai) register_5xx_sprs(env);
24693e770bf7SBruno Larsen (billionai) init_excp_MPC5xx(env);
24703e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
24713e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
24723e770bf7SBruno Larsen (billionai) /* XXX: TODO: allocate internal IRQ controller */
24733e770bf7SBruno Larsen (billionai) }
24743e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(MPC5xx)24753e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
24763e770bf7SBruno Larsen (billionai) {
24773e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
24783e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
24793e770bf7SBruno Larsen (billionai)
24803e770bf7SBruno Larsen (billionai) dc->desc = "Freescale 5xx cores (aka RCPU)";
24813e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_MPC5xx;
24823e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_none;
248345693f94SNicholas Piggin pcc->check_attn = check_attn_none;
24843e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
24853e770bf7SBruno Larsen (billionai) PPC_MEM_EIEIO | PPC_MEM_SYNC |
24863e770bf7SBruno Larsen (billionai) PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
24873e770bf7SBruno Larsen (billionai) PPC_MFTB;
24883e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_ILE) |
24893e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
24903e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
24913e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
24923e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
24933e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
24943e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
24953e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
24963e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
24973e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
24983e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
24993e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
25003e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_REAL;
25019323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
25023e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
25033e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_505;
25043e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
25053e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
25063e770bf7SBruno Larsen (billionai) }
25073e770bf7SBruno Larsen (billionai)
init_proc_MPC8xx(CPUPPCState * env)25083e770bf7SBruno Larsen (billionai) static void init_proc_MPC8xx(CPUPPCState *env)
25093e770bf7SBruno Larsen (billionai) {
25103e770bf7SBruno Larsen (billionai) register_5xx_8xx_sprs(env);
25113e770bf7SBruno Larsen (billionai) register_8xx_sprs(env);
25123e770bf7SBruno Larsen (billionai) init_excp_MPC8xx(env);
25133e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
25143e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
25153e770bf7SBruno Larsen (billionai) /* XXX: TODO: allocate internal IRQ controller */
25163e770bf7SBruno Larsen (billionai) }
25173e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(MPC8xx)25183e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
25193e770bf7SBruno Larsen (billionai) {
25203e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
25213e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
25223e770bf7SBruno Larsen (billionai)
25233e770bf7SBruno Larsen (billionai) dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
25243e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_MPC8xx;
25253e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_none;
252645693f94SNicholas Piggin pcc->check_attn = check_attn_none;
25273e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
25283e770bf7SBruno Larsen (billionai) PPC_MEM_EIEIO | PPC_MEM_SYNC |
25293e770bf7SBruno Larsen (billionai) PPC_CACHE_ICBI | PPC_MFTB;
25303e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_ILE) |
25313e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
25323e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
25333e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
25343e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
25353e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
25363e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
25373e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
25383e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
25393e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
25403e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
25413e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
25423e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_MPC8xx;
25439323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
25443e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
25453e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_860;
25463e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
25473e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
25483e770bf7SBruno Larsen (billionai) }
25493e770bf7SBruno Larsen (billionai)
25503e770bf7SBruno Larsen (billionai) /* Freescale 82xx cores (aka PowerQUICC-II) */
25513e770bf7SBruno Larsen (billionai)
init_proc_G2(CPUPPCState * env)25523e770bf7SBruno Larsen (billionai) static void init_proc_G2(CPUPPCState *env)
25533e770bf7SBruno Larsen (billionai) {
2554217781afSFabiano Rosas register_non_embedded_sprs(env);
25553e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
25563e770bf7SBruno Larsen (billionai) register_G2_sprs(env);
2557acf629ebSFabiano Rosas
25583e770bf7SBruno Larsen (billionai) /* Memory management */
25593e770bf7SBruno Larsen (billionai) register_low_BATs(env);
25603e770bf7SBruno Larsen (billionai) register_high_BATs(env);
25613e770bf7SBruno Larsen (billionai) register_6xx_7xx_soft_tlb(env, 64, 2);
25623e770bf7SBruno Larsen (billionai) init_excp_G2(env);
25633e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
25643e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
25653e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
25663e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
25673e770bf7SBruno Larsen (billionai) }
25683e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(G2)25693e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
25703e770bf7SBruno Larsen (billionai) {
25713e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
25723e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
25733e770bf7SBruno Larsen (billionai)
25743e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC G2";
25753e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_G2;
25763e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
257745693f94SNicholas Piggin pcc->check_attn = check_attn_none;
25783e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
25793e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
25803e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
25813e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
25823e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
25833e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
25843e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
25853e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
25863e770bf7SBruno Larsen (billionai) (1ull << MSR_TGPR) |
25873e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
25883e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
25893e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
25903e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
25913e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
25923e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
25933e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
25943e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
25953e770bf7SBruno Larsen (billionai) (1ull << MSR_AL) |
25963e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
25973e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
25983e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
25993e770bf7SBruno Larsen (billionai) (1ull << MSR_RI);
26003e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
26019323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
26023e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
26033e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_ec603e;
26043e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
26053e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
26063e770bf7SBruno Larsen (billionai) }
26073e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(G2LE)26083e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
26093e770bf7SBruno Larsen (billionai) {
26103e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
26113e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
26123e770bf7SBruno Larsen (billionai)
26133e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC G2LE";
2614363bd7d0SFabiano Rosas pcc->init_proc = init_proc_G2;
26153e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
261645693f94SNicholas Piggin pcc->check_attn = check_attn_none;
26173e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
26183e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
26193e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
26203e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
26213e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
26223e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
26233e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
26243e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
26253e770bf7SBruno Larsen (billionai) (1ull << MSR_TGPR) |
26263e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
26273e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
26283e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
26293e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
26303e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
26313e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
26323e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
26333e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
26343e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
26353e770bf7SBruno Larsen (billionai) (1ull << MSR_AL) |
26363e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
26373e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
26383e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
26393e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
26403e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
26413e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
26429323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
26433e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
26443e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_ec603e;
26453e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
26463e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
26473e770bf7SBruno Larsen (billionai) }
26483e770bf7SBruno Larsen (billionai)
init_proc_e200(CPUPPCState * env)26493e770bf7SBruno Larsen (billionai) static void init_proc_e200(CPUPPCState *env)
26503e770bf7SBruno Larsen (billionai) {
26513e770bf7SBruno Larsen (billionai) register_BookE_sprs(env, 0x000000070000FFFFULL);
2652acf629ebSFabiano Rosas
26533e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
26543e770bf7SBruno Larsen (billionai) &spr_read_spefscr, &spr_write_spefscr,
26553e770bf7SBruno Larsen (billionai) &spr_read_spefscr, &spr_write_spefscr,
26563e770bf7SBruno Larsen (billionai) 0x00000000);
26573e770bf7SBruno Larsen (billionai) /* Memory management */
26583e770bf7SBruno Larsen (billionai) register_BookE206_sprs(env, 0x0000005D, NULL, 0);
26594ffb8c5eSFabiano Rosas register_usprgh_sprs(env);
2660acf629ebSFabiano Rosas
26613e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID0, "HID0",
26623e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
26633e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
26643e770bf7SBruno Larsen (billionai) 0x00000000);
2665acf629ebSFabiano Rosas
26663e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID1, "HID1",
26673e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
26683e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
26693e770bf7SBruno Larsen (billionai) 0x00000000);
2670acf629ebSFabiano Rosas
26713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
26723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
26733e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
26743e770bf7SBruno Larsen (billionai) 0x00000000);
2675acf629ebSFabiano Rosas
26763e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
26773e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
26783e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
26793e770bf7SBruno Larsen (billionai) 0x00000000);
2680acf629ebSFabiano Rosas
26813e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
26823e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
26833e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
26843e770bf7SBruno Larsen (billionai) 0x00000000);
2685acf629ebSFabiano Rosas
26863e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
26873e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
26883e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
26893e770bf7SBruno Larsen (billionai) 0x00000000);
2690acf629ebSFabiano Rosas
26913e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
26923e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
26933e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
26943e770bf7SBruno Larsen (billionai) 0x00000000);
2695acf629ebSFabiano Rosas
26963e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
26973e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
26983e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
26993e770bf7SBruno Larsen (billionai) 0x00000000);
2700acf629ebSFabiano Rosas
27013e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
27023e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27033e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27043e770bf7SBruno Larsen (billionai) 0x00000000);
2705acf629ebSFabiano Rosas
27063e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
27073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27093e770bf7SBruno Larsen (billionai) 0x00000000);
2710acf629ebSFabiano Rosas
27113e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
27123e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27133e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27143e770bf7SBruno Larsen (billionai) 0x00000000);
2715acf629ebSFabiano Rosas
27163e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
27173e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27183e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27193e770bf7SBruno Larsen (billionai) 0x00000000);
2720acf629ebSFabiano Rosas
27213e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_IAC3, "IAC3",
27223e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27233e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27243e770bf7SBruno Larsen (billionai) 0x00000000);
2725acf629ebSFabiano Rosas
27263e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_IAC4, "IAC4",
27273e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27283e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27293e770bf7SBruno Larsen (billionai) 0x00000000);
2730acf629ebSFabiano Rosas
27313e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MMUCSR0, "MMUCSR0",
27323e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27333e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27343e770bf7SBruno Larsen (billionai) 0x00000000); /* TOFIX */
27353e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
27363e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27373e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27383e770bf7SBruno Larsen (billionai) 0x00000000);
27393e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
27403e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
27413e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
27423e770bf7SBruno Larsen (billionai) 0x00000000);
2743581eea5dSBALATON Zoltan
2744581eea5dSBALATON Zoltan init_tlbs_emb(env);
27453e770bf7SBruno Larsen (billionai) init_excp_e200(env, 0xFFFF0000UL);
27463e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
27473e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
27483e770bf7SBruno Larsen (billionai) /* XXX: TODO: allocate internal IRQ controller */
27493e770bf7SBruno Larsen (billionai) }
27503e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(e200)27513e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
27523e770bf7SBruno Larsen (billionai) {
27533e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
27543e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
27553e770bf7SBruno Larsen (billionai)
27563e770bf7SBruno Larsen (billionai) dc->desc = "e200 core";
27573e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_e200;
27583e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
275945693f94SNicholas Piggin pcc->check_attn = check_attn_none;
27603e770bf7SBruno Larsen (billionai) /*
27613e770bf7SBruno Larsen (billionai) * XXX: unimplemented instructions:
27623e770bf7SBruno Larsen (billionai) * dcblc
27633e770bf7SBruno Larsen (billionai) * dcbtlst
27643e770bf7SBruno Larsen (billionai) * dcbtstls
27653e770bf7SBruno Larsen (billionai) * icblc
27663e770bf7SBruno Larsen (billionai) * icbtls
27673e770bf7SBruno Larsen (billionai) * tlbivax
27683e770bf7SBruno Larsen (billionai) * all SPE multiply-accumulate instructions
27693e770bf7SBruno Larsen (billionai) */
27703e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
27713e770bf7SBruno Larsen (billionai) PPC_SPE | PPC_SPE_SINGLE |
27723e770bf7SBruno Larsen (billionai) PPC_WRTEE | PPC_RFDI |
27733e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
27743e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
27753e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_TLBIVAX |
27763e770bf7SBruno Larsen (billionai) PPC_BOOKE;
27773e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_UCLE) |
27783e770bf7SBruno Larsen (billionai) (1ull << MSR_SPE) |
27793e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
27803e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
27813e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
27823e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
27833e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
27843e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
27853e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
27863e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
27873e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
27883e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
27893e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
27903e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
27913e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE206;
27923e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
27933e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
27943e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_860;
27953e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
27963e770bf7SBruno Larsen (billionai) POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
27973e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
27983e770bf7SBruno Larsen (billionai) }
27993e770bf7SBruno Larsen (billionai)
28003e770bf7SBruno Larsen (billionai) enum fsl_e500_version {
28013e770bf7SBruno Larsen (billionai) fsl_e500v1,
28023e770bf7SBruno Larsen (billionai) fsl_e500v2,
28033e770bf7SBruno Larsen (billionai) fsl_e500mc,
28043e770bf7SBruno Larsen (billionai) fsl_e5500,
28053e770bf7SBruno Larsen (billionai) fsl_e6500,
28063e770bf7SBruno Larsen (billionai) };
28073e770bf7SBruno Larsen (billionai)
init_proc_e500(CPUPPCState * env,int version)28083e770bf7SBruno Larsen (billionai) static void init_proc_e500(CPUPPCState *env, int version)
28093e770bf7SBruno Larsen (billionai) {
28103e770bf7SBruno Larsen (billionai) uint32_t tlbncfg[2];
28113e770bf7SBruno Larsen (billionai) uint64_t ivor_mask;
28123e770bf7SBruno Larsen (billionai) uint64_t ivpr_mask = 0xFFFF0000ULL;
28133e770bf7SBruno Larsen (billionai) uint32_t l1cfg0 = 0x3800 /* 8 ways */
28143e770bf7SBruno Larsen (billionai) | 0x0020; /* 32 kb */
28153e770bf7SBruno Larsen (billionai) uint32_t l1cfg1 = 0x3800 /* 8 ways */
28163e770bf7SBruno Larsen (billionai) | 0x0020; /* 32 kb */
28173e770bf7SBruno Larsen (billionai) uint32_t mmucfg = 0;
28183e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
28193e770bf7SBruno Larsen (billionai) int i;
28203e770bf7SBruno Larsen (billionai) #endif
28213e770bf7SBruno Larsen (billionai)
28223e770bf7SBruno Larsen (billionai) /*
28233e770bf7SBruno Larsen (billionai) * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
28243e770bf7SBruno Larsen (billionai) * complain when accessing them.
28253e770bf7SBruno Larsen (billionai) * register_BookE_sprs(env, 0x0000000F0000FD7FULL);
28263e770bf7SBruno Larsen (billionai) */
28273e770bf7SBruno Larsen (billionai) switch (version) {
28283e770bf7SBruno Larsen (billionai) case fsl_e500v1:
28293e770bf7SBruno Larsen (billionai) case fsl_e500v2:
28303e770bf7SBruno Larsen (billionai) default:
28313e770bf7SBruno Larsen (billionai) ivor_mask = 0x0000000F0000FFFFULL;
28323e770bf7SBruno Larsen (billionai) break;
28333e770bf7SBruno Larsen (billionai) case fsl_e500mc:
28343e770bf7SBruno Larsen (billionai) case fsl_e5500:
28353e770bf7SBruno Larsen (billionai) ivor_mask = 0x000003FE0000FFFFULL;
28363e770bf7SBruno Larsen (billionai) break;
28373e770bf7SBruno Larsen (billionai) case fsl_e6500:
28383e770bf7SBruno Larsen (billionai) ivor_mask = 0x000003FF0000FFFFULL;
28393e770bf7SBruno Larsen (billionai) break;
28403e770bf7SBruno Larsen (billionai) }
28413e770bf7SBruno Larsen (billionai) register_BookE_sprs(env, ivor_mask);
28422a48d83dSFabiano Rosas
28432a48d83dSFabiano Rosas spr_register(env, SPR_USPRG3, "USPRG3",
28442a48d83dSFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
28452a48d83dSFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
28462a48d83dSFabiano Rosas 0x00000000);
28472a48d83dSFabiano Rosas
28483e770bf7SBruno Larsen (billionai) /* Processor identification */
28493e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_PIR, "PIR",
28503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
28513e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_pir,
28523e770bf7SBruno Larsen (billionai) 0x00000000);
2853acf629ebSFabiano Rosas
28543e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
28553e770bf7SBruno Larsen (billionai) &spr_read_spefscr, &spr_write_spefscr,
28563e770bf7SBruno Larsen (billionai) &spr_read_spefscr, &spr_write_spefscr,
28573e770bf7SBruno Larsen (billionai) 0x00000000);
28583e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
28593e770bf7SBruno Larsen (billionai) /* Memory management */
28603e770bf7SBruno Larsen (billionai) env->nb_pids = 3;
28613e770bf7SBruno Larsen (billionai) env->nb_ways = 2;
28623e770bf7SBruno Larsen (billionai) switch (version) {
28633e770bf7SBruno Larsen (billionai) case fsl_e500v1:
28643e770bf7SBruno Larsen (billionai) tlbncfg[0] = register_tlbncfg(2, 1, 1, 0, 256);
28653e770bf7SBruno Larsen (billionai) tlbncfg[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
28663e770bf7SBruno Larsen (billionai) break;
28673e770bf7SBruno Larsen (billionai) case fsl_e500v2:
28683e770bf7SBruno Larsen (billionai) tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
28693e770bf7SBruno Larsen (billionai) tlbncfg[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
28703e770bf7SBruno Larsen (billionai) break;
28713e770bf7SBruno Larsen (billionai) case fsl_e500mc:
28723e770bf7SBruno Larsen (billionai) case fsl_e5500:
28733e770bf7SBruno Larsen (billionai) tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
28743e770bf7SBruno Larsen (billionai) tlbncfg[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
28753e770bf7SBruno Larsen (billionai) break;
28763e770bf7SBruno Larsen (billionai) case fsl_e6500:
28773e770bf7SBruno Larsen (billionai) mmucfg = 0x6510B45;
28783e770bf7SBruno Larsen (billionai) env->nb_pids = 1;
28793e770bf7SBruno Larsen (billionai) tlbncfg[0] = 0x08052400;
28803e770bf7SBruno Larsen (billionai) tlbncfg[1] = 0x40028040;
28813e770bf7SBruno Larsen (billionai) break;
28823e770bf7SBruno Larsen (billionai) default:
28833e770bf7SBruno Larsen (billionai) cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
28843e770bf7SBruno Larsen (billionai) env->spr[SPR_PVR]);
28853e770bf7SBruno Larsen (billionai) }
28863e770bf7SBruno Larsen (billionai) #endif
28873e770bf7SBruno Larsen (billionai) /* Cache sizes */
28883e770bf7SBruno Larsen (billionai) switch (version) {
28893e770bf7SBruno Larsen (billionai) case fsl_e500v1:
28903e770bf7SBruno Larsen (billionai) case fsl_e500v2:
28913e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
28923e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
28933e770bf7SBruno Larsen (billionai) break;
28943e770bf7SBruno Larsen (billionai) case fsl_e500mc:
28953e770bf7SBruno Larsen (billionai) case fsl_e5500:
28963e770bf7SBruno Larsen (billionai) env->dcache_line_size = 64;
28973e770bf7SBruno Larsen (billionai) env->icache_line_size = 64;
28983e770bf7SBruno Larsen (billionai) l1cfg0 |= 0x1000000; /* 64 byte cache block size */
28993e770bf7SBruno Larsen (billionai) l1cfg1 |= 0x1000000; /* 64 byte cache block size */
29003e770bf7SBruno Larsen (billionai) break;
29013e770bf7SBruno Larsen (billionai) case fsl_e6500:
29023e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
29033e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
29043e770bf7SBruno Larsen (billionai) l1cfg0 |= 0x0F83820;
29053e770bf7SBruno Larsen (billionai) l1cfg1 |= 0x0B83820;
29063e770bf7SBruno Larsen (billionai) break;
29073e770bf7SBruno Larsen (billionai) default:
29083e770bf7SBruno Larsen (billionai) cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
29093e770bf7SBruno Larsen (billionai) env->spr[SPR_PVR]);
29103e770bf7SBruno Larsen (billionai) }
29113e770bf7SBruno Larsen (billionai) register_BookE206_sprs(env, 0x000000DF, tlbncfg, mmucfg);
29124ffb8c5eSFabiano Rosas register_usprgh_sprs(env);
2913acf629ebSFabiano Rosas
29143e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID0, "HID0",
29153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29163e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29173e770bf7SBruno Larsen (billionai) 0x00000000);
2918acf629ebSFabiano Rosas
29193e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID1, "HID1",
29203e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29213e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29223e770bf7SBruno Larsen (billionai) 0x00000000);
2923acf629ebSFabiano Rosas
29243e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
29253e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29263e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29273e770bf7SBruno Larsen (billionai) 0x00000000);
2928acf629ebSFabiano Rosas
29293e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
29303e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29313e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29323e770bf7SBruno Larsen (billionai) 0x00000000);
2933acf629ebSFabiano Rosas
29343e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_MCAR, "MCAR",
29353e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29363e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29373e770bf7SBruno Larsen (billionai) 0x00000000);
2938acf629ebSFabiano Rosas
29393e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSR, "MCSR",
29403e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29413e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29423e770bf7SBruno Larsen (billionai) 0x00000000);
2943acf629ebSFabiano Rosas
29443e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
29453e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29463e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29473e770bf7SBruno Larsen (billionai) 0x00000000);
2948acf629ebSFabiano Rosas
29493e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
29503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29513e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29523e770bf7SBruno Larsen (billionai) 0x00000000);
2953acf629ebSFabiano Rosas
29543e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
29553e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
29563e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
29573e770bf7SBruno Larsen (billionai) l1cfg0);
29583e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L1CFG1, "L1CFG1",
29593e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
29603e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
29613e770bf7SBruno Larsen (billionai) l1cfg1);
29623e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
29633e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29643e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_e500_l1csr0,
29653e770bf7SBruno Larsen (billionai) 0x00000000);
29663e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
29673e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29683e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_e500_l1csr1,
29693e770bf7SBruno Larsen (billionai) 0x00000000);
29703e770bf7SBruno Larsen (billionai) if (version != fsl_e500v1 && version != fsl_e500v2) {
29713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_Exxx_L2CSR0, "L2CSR0",
29723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29733e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_e500_l2csr0,
29743e770bf7SBruno Larsen (billionai) 0x00000000);
29753e770bf7SBruno Larsen (billionai) }
29763e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
29773e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29783e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29793e770bf7SBruno Larsen (billionai) 0x00000000);
29803e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
29813e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29823e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29833e770bf7SBruno Larsen (billionai) 0x00000000);
29843e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MMUCSR0, "MMUCSR0",
29853e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29863e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_booke206_mmucsr0,
29873e770bf7SBruno Larsen (billionai) 0x00000000);
29883e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_EPR, "EPR",
29893e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29903e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
29913e770bf7SBruno Larsen (billionai) 0x00000000);
29923e770bf7SBruno Larsen (billionai) /* XXX better abstract into Emb.xxx features */
29933e770bf7SBruno Larsen (billionai) if ((version == fsl_e5500) || (version == fsl_e6500)) {
29943e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_EPCR, "EPCR",
29953e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
29963e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
29973e770bf7SBruno Larsen (billionai) 0x00000000);
29983e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
29993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
30003e770bf7SBruno Larsen (billionai) &spr_read_mas73, &spr_write_mas73,
30013e770bf7SBruno Larsen (billionai) 0x00000000);
30023e770bf7SBruno Larsen (billionai) ivpr_mask = (target_ulong)~0xFFFFULL;
30033e770bf7SBruno Larsen (billionai) }
30043e770bf7SBruno Larsen (billionai)
30053e770bf7SBruno Larsen (billionai) if (version == fsl_e6500) {
30063e770bf7SBruno Larsen (billionai) /* Thread identification */
30073e770bf7SBruno Larsen (billionai) spr_register(env, SPR_TIR, "TIR",
30083e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
30093e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
30103e770bf7SBruno Larsen (billionai) 0x00000000);
30113e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB0PS, "TLB0PS",
30123e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
30133e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
30143e770bf7SBruno Larsen (billionai) 0x00000004);
30153e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BOOKE_TLB1PS, "TLB1PS",
30163e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
30173e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
30183e770bf7SBruno Larsen (billionai) 0x7FFFFFFC);
30193e770bf7SBruno Larsen (billionai) }
30203e770bf7SBruno Larsen (billionai)
30213e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
30223e770bf7SBruno Larsen (billionai) env->nb_tlb = 0;
30233e770bf7SBruno Larsen (billionai) env->tlb_type = TLB_MAS;
30243e770bf7SBruno Larsen (billionai) for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
30253e770bf7SBruno Larsen (billionai) env->nb_tlb += booke206_tlb_size(env, i);
30263e770bf7SBruno Larsen (billionai) }
30273e770bf7SBruno Larsen (billionai) #endif
30283e770bf7SBruno Larsen (billionai)
30293e770bf7SBruno Larsen (billionai) init_excp_e200(env, ivpr_mask);
30303e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
30313e770bf7SBruno Larsen (billionai) ppce500_irq_init(env_archcpu(env));
30323e770bf7SBruno Larsen (billionai) }
30333e770bf7SBruno Larsen (billionai)
init_proc_e500v1(CPUPPCState * env)30343e770bf7SBruno Larsen (billionai) static void init_proc_e500v1(CPUPPCState *env)
30353e770bf7SBruno Larsen (billionai) {
30363e770bf7SBruno Larsen (billionai) init_proc_e500(env, fsl_e500v1);
30373e770bf7SBruno Larsen (billionai) }
30383e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(e500v1)30393e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
30403e770bf7SBruno Larsen (billionai) {
30413e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
30423e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
30433e770bf7SBruno Larsen (billionai)
30443e770bf7SBruno Larsen (billionai) dc->desc = "e500v1 core";
30453e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_e500v1;
30463e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
304745693f94SNicholas Piggin pcc->check_attn = check_attn_none;
30483e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
30493e770bf7SBruno Larsen (billionai) PPC_SPE | PPC_SPE_SINGLE |
30503e770bf7SBruno Larsen (billionai) PPC_WRTEE | PPC_RFDI |
30513e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
30523e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
30533e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
30543e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_BOOKE206;
30553e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_UCLE) |
30563e770bf7SBruno Larsen (billionai) (1ull << MSR_SPE) |
30573e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
30583e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
30593e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
30603e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
30613e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
30623e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
30633e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
30643e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
30653e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
30663e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
30673e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
30683e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
30693e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE206;
30703e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
30713e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
30723e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_860;
30733e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
30743e770bf7SBruno Larsen (billionai) POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
30753e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
30763e770bf7SBruno Larsen (billionai) }
30773e770bf7SBruno Larsen (billionai)
init_proc_e500v2(CPUPPCState * env)30783e770bf7SBruno Larsen (billionai) static void init_proc_e500v2(CPUPPCState *env)
30793e770bf7SBruno Larsen (billionai) {
30803e770bf7SBruno Larsen (billionai) init_proc_e500(env, fsl_e500v2);
30813e770bf7SBruno Larsen (billionai) }
30823e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(e500v2)30833e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
30843e770bf7SBruno Larsen (billionai) {
30853e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
30863e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
30873e770bf7SBruno Larsen (billionai)
30883e770bf7SBruno Larsen (billionai) dc->desc = "e500v2 core";
30893e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_e500v2;
30903e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
309145693f94SNicholas Piggin pcc->check_attn = check_attn_none;
30923e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
30933e770bf7SBruno Larsen (billionai) PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
30943e770bf7SBruno Larsen (billionai) PPC_WRTEE | PPC_RFDI |
30953e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
30963e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
30973e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
30983e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_BOOKE206;
30993e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_UCLE) |
31003e770bf7SBruno Larsen (billionai) (1ull << MSR_SPE) |
31013e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
31023e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
31033e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
31043e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
31053e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
31063e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
31073e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
31083e770bf7SBruno Larsen (billionai) (1ull << MSR_DWE) |
31093e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
31103e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
31113e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
31123e770bf7SBruno Larsen (billionai) (1ull << MSR_DR);
31133e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE206;
31143e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
31153e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
31163e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_860;
31173e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
31183e770bf7SBruno Larsen (billionai) POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
31193e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
31203e770bf7SBruno Larsen (billionai) }
31213e770bf7SBruno Larsen (billionai)
init_proc_e500mc(CPUPPCState * env)31223e770bf7SBruno Larsen (billionai) static void init_proc_e500mc(CPUPPCState *env)
31233e770bf7SBruno Larsen (billionai) {
31243e770bf7SBruno Larsen (billionai) init_proc_e500(env, fsl_e500mc);
31253e770bf7SBruno Larsen (billionai) }
31263e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(e500mc)31273e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
31283e770bf7SBruno Larsen (billionai) {
31293e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
31303e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
31313e770bf7SBruno Larsen (billionai)
31323e770bf7SBruno Larsen (billionai) dc->desc = "e500mc core";
31333e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_e500mc;
31343e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_none;
313545693f94SNicholas Piggin pcc->check_attn = check_attn_none;
31363e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
31373e770bf7SBruno Larsen (billionai) PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
31383e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
31393e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
31403e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FRES |
31413e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
31423e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX | PPC_WAIT |
31433e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
31443e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
31453e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_GS) |
31463e770bf7SBruno Larsen (billionai) (1ull << MSR_UCLE) |
31473e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
31483e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
31493e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
31503e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
31513e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
31523e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
31533e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
31543e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
31553e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
31563e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
31573e770bf7SBruno Larsen (billionai) (1ull << MSR_PX) |
31583e770bf7SBruno Larsen (billionai) (1ull << MSR_RI);
31593e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE206;
31603e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
31613e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
31623e770bf7SBruno Larsen (billionai) /* FIXME: figure out the correct flag for e500mc */
31633e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_e500;
31643e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
31653e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
31663e770bf7SBruno Larsen (billionai) }
31673e770bf7SBruno Larsen (billionai)
31683e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
init_proc_e5500(CPUPPCState * env)31693e770bf7SBruno Larsen (billionai) static void init_proc_e5500(CPUPPCState *env)
31703e770bf7SBruno Larsen (billionai) {
31713e770bf7SBruno Larsen (billionai) init_proc_e500(env, fsl_e5500);
31723e770bf7SBruno Larsen (billionai) }
31733e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(e5500)31743e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
31753e770bf7SBruno Larsen (billionai) {
31763e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
31773e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
31783e770bf7SBruno Larsen (billionai)
31793e770bf7SBruno Larsen (billionai) dc->desc = "e5500 core";
31803e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_e5500;
31813e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_none;
318245693f94SNicholas Piggin pcc->check_attn = check_attn_none;
31833e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
31843e770bf7SBruno Larsen (billionai) PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
31853e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
31863e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
31873e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FRES |
31883e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
31893e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX | PPC_WAIT |
31903e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
31913e770bf7SBruno Larsen (billionai) PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
31923e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
31933e770bf7SBruno Larsen (billionai) PPC2_FP_CVT_S64;
31943e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_CM) |
31953e770bf7SBruno Larsen (billionai) (1ull << MSR_GS) |
31963e770bf7SBruno Larsen (billionai) (1ull << MSR_UCLE) |
31973e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
31983e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
31993e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
32003e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
32013e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
32023e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
32033e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
32043e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
32053e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
32063e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
32073e770bf7SBruno Larsen (billionai) (1ull << MSR_PX) |
32083e770bf7SBruno Larsen (billionai) (1ull << MSR_RI);
32093e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE206;
32103e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
32113e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
32123e770bf7SBruno Larsen (billionai) /* FIXME: figure out the correct flag for e5500 */
32133e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_e500;
32143e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
32153e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
32163e770bf7SBruno Larsen (billionai) }
32173e770bf7SBruno Larsen (billionai)
init_proc_e6500(CPUPPCState * env)32183e770bf7SBruno Larsen (billionai) static void init_proc_e6500(CPUPPCState *env)
32193e770bf7SBruno Larsen (billionai) {
32203e770bf7SBruno Larsen (billionai) init_proc_e500(env, fsl_e6500);
32213e770bf7SBruno Larsen (billionai) }
32223e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(e6500)32233e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e6500)(ObjectClass *oc, void *data)
32243e770bf7SBruno Larsen (billionai) {
32253e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
32263e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
32273e770bf7SBruno Larsen (billionai)
32283e770bf7SBruno Larsen (billionai) dc->desc = "e6500 core";
32293e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_e6500;
32303e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_none;
323145693f94SNicholas Piggin pcc->check_attn = check_attn_none;
32323e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
32333e770bf7SBruno Larsen (billionai) PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
32343e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
32353e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
32363e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FRES |
32373e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
32383e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX | PPC_WAIT |
32393e770bf7SBruno Larsen (billionai) PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
32403e770bf7SBruno Larsen (billionai) PPC_64B | PPC_POPCNTB | PPC_POPCNTWD | PPC_ALTIVEC;
32413e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
32423e770bf7SBruno Larsen (billionai) PPC2_FP_CVT_S64 | PPC2_ATOMIC_ISA206;
32433e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_CM) |
32443e770bf7SBruno Larsen (billionai) (1ull << MSR_GS) |
32453e770bf7SBruno Larsen (billionai) (1ull << MSR_UCLE) |
32463e770bf7SBruno Larsen (billionai) (1ull << MSR_CE) |
32473e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
32483e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
32493e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
32503e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
32513e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
32523e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
32533e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
32543e770bf7SBruno Larsen (billionai) (1ull << MSR_IS) |
32553e770bf7SBruno Larsen (billionai) (1ull << MSR_DS) |
32563e770bf7SBruno Larsen (billionai) (1ull << MSR_PX) |
32573e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
32583e770bf7SBruno Larsen (billionai) (1ull << MSR_VR);
32593e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_BOOKE206;
32603e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_BOOKE;
32613e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_BookE;
32623e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_e500;
32633e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
32643e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_VRE;
32653e770bf7SBruno Larsen (billionai) }
32663e770bf7SBruno Larsen (billionai)
32673e770bf7SBruno Larsen (billionai) #endif
32683e770bf7SBruno Larsen (billionai)
32693e770bf7SBruno Larsen (billionai) /* Non-embedded PowerPC */
init_proc_603(CPUPPCState * env)32703e770bf7SBruno Larsen (billionai) static void init_proc_603(CPUPPCState *env)
32713e770bf7SBruno Larsen (billionai) {
3272217781afSFabiano Rosas register_non_embedded_sprs(env);
32733e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
32743e770bf7SBruno Larsen (billionai) register_603_sprs(env);
3275acf629ebSFabiano Rosas
32763e770bf7SBruno Larsen (billionai) /* Memory management */
32773e770bf7SBruno Larsen (billionai) register_low_BATs(env);
32783e770bf7SBruno Larsen (billionai) register_6xx_7xx_soft_tlb(env, 64, 2);
32793e770bf7SBruno Larsen (billionai) init_excp_603(env);
32803e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
32813e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
32823e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
32833e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
32843e770bf7SBruno Larsen (billionai) }
32853e770bf7SBruno Larsen (billionai)
32863e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
32873e770bf7SBruno Larsen (billionai) {
32883e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
32893e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
32903e770bf7SBruno Larsen (billionai)
32913e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 603";
32923e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_603;
32933e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
329445693f94SNicholas Piggin pcc->check_attn = check_attn_none;
32953e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
32963e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
32973e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
32983e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
32993e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
33003e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
33013e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
33023e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
33033e770bf7SBruno Larsen (billionai) (1ull << MSR_TGPR) |
33043e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
33053e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
33063e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
33073e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
33083e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
33093e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
33103e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
33113e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
33123e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
33133e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
33143e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
33153e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
33163e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
33173e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
33183e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
33199323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
33203e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
33213e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_603;
33223e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
33233e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
33243e770bf7SBruno Larsen (billionai) }
33253e770bf7SBruno Larsen (billionai)
33263e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
33273e770bf7SBruno Larsen (billionai) {
33283e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
33293e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
33303e770bf7SBruno Larsen (billionai)
33313e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 603e";
3332fd77f757SFabiano Rosas pcc->init_proc = init_proc_603;
33333e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
333445693f94SNicholas Piggin pcc->check_attn = check_attn_none;
33353e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
33363e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
33373e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
33383e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
33393e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
33403e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
33413e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
33423e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
33433e770bf7SBruno Larsen (billionai) (1ull << MSR_TGPR) |
33443e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
33453e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
33463e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
33473e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
33483e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
33493e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
33503e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
33513e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
33523e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
33533e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
33543e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
33553e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
33563e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
33573e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
33583e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
33599323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
33603e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
33613e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_ec603e;
33623e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
33633e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
33643e770bf7SBruno Larsen (billionai) }
33653e770bf7SBruno Larsen (billionai)
init_proc_e300(CPUPPCState * env)33669f33f3d8SFabiano Rosas static void init_proc_e300(CPUPPCState *env)
33679f33f3d8SFabiano Rosas {
33689f33f3d8SFabiano Rosas init_proc_603(env);
33699f33f3d8SFabiano Rosas register_e300_sprs(env);
33709f33f3d8SFabiano Rosas }
33719f33f3d8SFabiano Rosas
POWERPC_FAMILY(e300)33729f33f3d8SFabiano Rosas POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
33739f33f3d8SFabiano Rosas {
33749f33f3d8SFabiano Rosas DeviceClass *dc = DEVICE_CLASS(oc);
33759f33f3d8SFabiano Rosas PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
33769f33f3d8SFabiano Rosas
33779f33f3d8SFabiano Rosas dc->desc = "e300 core";
33789f33f3d8SFabiano Rosas pcc->init_proc = init_proc_e300;
33799f33f3d8SFabiano Rosas pcc->check_pow = check_pow_hid0;
338045693f94SNicholas Piggin pcc->check_attn = check_attn_none;
33819f33f3d8SFabiano Rosas pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
33829f33f3d8SFabiano Rosas PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
33839f33f3d8SFabiano Rosas PPC_FLOAT_STFIWX |
33849f33f3d8SFabiano Rosas PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
33859f33f3d8SFabiano Rosas PPC_MEM_SYNC | PPC_MEM_EIEIO |
33869f33f3d8SFabiano Rosas PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
33879f33f3d8SFabiano Rosas PPC_SEGMENT | PPC_EXTERN;
33889f33f3d8SFabiano Rosas pcc->msr_mask = (1ull << MSR_POW) |
33899f33f3d8SFabiano Rosas (1ull << MSR_TGPR) |
33909f33f3d8SFabiano Rosas (1ull << MSR_ILE) |
33919f33f3d8SFabiano Rosas (1ull << MSR_EE) |
33929f33f3d8SFabiano Rosas (1ull << MSR_PR) |
33939f33f3d8SFabiano Rosas (1ull << MSR_FP) |
33949f33f3d8SFabiano Rosas (1ull << MSR_ME) |
33959f33f3d8SFabiano Rosas (1ull << MSR_FE0) |
33969f33f3d8SFabiano Rosas (1ull << MSR_SE) |
33979f33f3d8SFabiano Rosas (1ull << MSR_DE) |
33989f33f3d8SFabiano Rosas (1ull << MSR_FE1) |
33999f33f3d8SFabiano Rosas (1ull << MSR_AL) |
34009f33f3d8SFabiano Rosas (1ull << MSR_EP) |
34019f33f3d8SFabiano Rosas (1ull << MSR_IR) |
34029f33f3d8SFabiano Rosas (1ull << MSR_DR) |
34039f33f3d8SFabiano Rosas (1ull << MSR_RI) |
34049f33f3d8SFabiano Rosas (1ull << MSR_LE);
34059f33f3d8SFabiano Rosas pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
34069f33f3d8SFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
34079f33f3d8SFabiano Rosas pcc->bus_model = PPC_FLAGS_INPUT_6xx;
34089f33f3d8SFabiano Rosas pcc->bfd_mach = bfd_mach_ppc_603;
34099f33f3d8SFabiano Rosas pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
34109f33f3d8SFabiano Rosas POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
34119f33f3d8SFabiano Rosas }
34129f33f3d8SFabiano Rosas
init_proc_604(CPUPPCState * env)34133e770bf7SBruno Larsen (billionai) static void init_proc_604(CPUPPCState *env)
34143e770bf7SBruno Larsen (billionai) {
3415217781afSFabiano Rosas register_non_embedded_sprs(env);
34163e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
34173e770bf7SBruno Larsen (billionai) register_604_sprs(env);
341820f6fb99SFabiano Rosas
34193e770bf7SBruno Larsen (billionai) /* Memory management */
34203e770bf7SBruno Larsen (billionai) register_low_BATs(env);
34213e770bf7SBruno Larsen (billionai) init_excp_604(env);
34223e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
34233e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
34243e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
34253e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
34263e770bf7SBruno Larsen (billionai) }
34273e770bf7SBruno Larsen (billionai)
34283e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
34293e770bf7SBruno Larsen (billionai) {
34303e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
34313e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
34323e770bf7SBruno Larsen (billionai)
34333e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 604";
34343e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_604;
34353e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
343645693f94SNicholas Piggin pcc->check_attn = check_attn_none;
34373e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
34383e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
34393e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
34403e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
34413e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
34423e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
34433e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
34443e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
34453e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
34463e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
34473e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
34483e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
34493e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
34503e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
34513e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
34523e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
34533e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
34543e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
34553e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
34563e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
34573e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
34583e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
34593e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
34603e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
34619323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
34623e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
34633e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_604;
34643e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
34653e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
34663e770bf7SBruno Larsen (billionai) }
34673e770bf7SBruno Larsen (billionai)
init_proc_604E(CPUPPCState * env)34683e770bf7SBruno Larsen (billionai) static void init_proc_604E(CPUPPCState *env)
34693e770bf7SBruno Larsen (billionai) {
34700df0ca16SFabiano Rosas init_proc_604(env);
34713b18ec76SFabiano Rosas register_604e_sprs(env);
34723e770bf7SBruno Larsen (billionai) }
34733e770bf7SBruno Larsen (billionai)
34743e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
34753e770bf7SBruno Larsen (billionai) {
34763e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
34773e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
34783e770bf7SBruno Larsen (billionai)
34793e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 604E";
34803e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_604E;
34813e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
348245693f94SNicholas Piggin pcc->check_attn = check_attn_none;
34833e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
34843e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
34853e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
34863e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
34873e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
34883e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
34893e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
34903e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
34913e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
34923e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
34933e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
34943e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
34953e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
34963e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
34973e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
34983e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
34993e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
35003e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
35013e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
35023e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
35033e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
35043e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
35053e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
35063e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
35079323650fSFabiano Rosas pcc->excp_model = POWERPC_EXCP_6xx;
35083e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
35093e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_604;
35103e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
35113e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
35123e770bf7SBruno Larsen (billionai) }
35133e770bf7SBruno Larsen (billionai)
init_proc_740(CPUPPCState * env)35143e770bf7SBruno Larsen (billionai) static void init_proc_740(CPUPPCState *env)
35153e770bf7SBruno Larsen (billionai) {
3516217781afSFabiano Rosas register_non_embedded_sprs(env);
35173e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
35183e770bf7SBruno Larsen (billionai) register_7xx_sprs(env);
35193e770bf7SBruno Larsen (billionai) /* Thermal management */
35203e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
3521acf629ebSFabiano Rosas
35223e770bf7SBruno Larsen (billionai) /* Memory management */
35233e770bf7SBruno Larsen (billionai) register_low_BATs(env);
35243e770bf7SBruno Larsen (billionai) init_excp_7x0(env);
35253e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
35263e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
35273e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
35283e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
35293e770bf7SBruno Larsen (billionai) }
35303e770bf7SBruno Larsen (billionai)
35313e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
35323e770bf7SBruno Larsen (billionai) {
35333e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
35343e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
35353e770bf7SBruno Larsen (billionai)
35363e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 740";
35373e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_740;
35383e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
353945693f94SNicholas Piggin pcc->check_attn = check_attn_none;
35403e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
35413e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
35423e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
35433e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
35443e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
35453e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
35463e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
35473e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
35483e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
35493e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
35503e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
35513e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
35523e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
35533e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
35543e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
35553e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
35563e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
35573e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
35583e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
35593e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
35603e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
35613e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
35623e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
35633e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
3564fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
35653e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
35663e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
35673e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
35683e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
35693e770bf7SBruno Larsen (billionai) }
35703e770bf7SBruno Larsen (billionai)
init_proc_750(CPUPPCState * env)35713e770bf7SBruno Larsen (billionai) static void init_proc_750(CPUPPCState *env)
35723e770bf7SBruno Larsen (billionai) {
3573217781afSFabiano Rosas register_non_embedded_sprs(env);
35743e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
35753e770bf7SBruno Larsen (billionai) register_7xx_sprs(env);
3576acf629ebSFabiano Rosas
35773e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L2CR, "L2CR",
35783e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
35793e770bf7SBruno Larsen (billionai) &spr_read_generic, spr_access_nop,
35803e770bf7SBruno Larsen (billionai) 0x00000000);
35813e770bf7SBruno Larsen (billionai) /* Thermal management */
35823e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
3583acf629ebSFabiano Rosas
35843e770bf7SBruno Larsen (billionai) /* Memory management */
35853e770bf7SBruno Larsen (billionai) register_low_BATs(env);
35863e770bf7SBruno Larsen (billionai) /*
35873e770bf7SBruno Larsen (billionai) * XXX: high BATs are also present but are known to be bugged on
35883e770bf7SBruno Larsen (billionai) * die version 1.x
35893e770bf7SBruno Larsen (billionai) */
35903e770bf7SBruno Larsen (billionai) init_excp_7x0(env);
35913e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
35923e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
35933e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
35943e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
35953e770bf7SBruno Larsen (billionai) }
35963e770bf7SBruno Larsen (billionai)
35973e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
35983e770bf7SBruno Larsen (billionai) {
35993e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
36003e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
36013e770bf7SBruno Larsen (billionai)
36023e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 750";
36033e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_750;
36043e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
360545693f94SNicholas Piggin pcc->check_attn = check_attn_none;
36063e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
36073e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
36083e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
36093e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
36103e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
36113e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
36123e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
36133e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
36143e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
36153e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
36163e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
36173e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
36183e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
36193e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
36203e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
36213e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
36223e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
36233e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
36243e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
36253e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
36263e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
36273e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
36283e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
36293e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
3630fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
36313e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
36323e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
36333e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
36343e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
36353e770bf7SBruno Larsen (billionai) }
36363e770bf7SBruno Larsen (billionai)
init_proc_750cl(CPUPPCState * env)36373e770bf7SBruno Larsen (billionai) static void init_proc_750cl(CPUPPCState *env)
36383e770bf7SBruno Larsen (billionai) {
3639217781afSFabiano Rosas register_non_embedded_sprs(env);
36403e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
36413e770bf7SBruno Larsen (billionai) register_7xx_sprs(env);
3642acf629ebSFabiano Rosas
36433e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L2CR, "L2CR",
36443e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36453e770bf7SBruno Larsen (billionai) &spr_read_generic, spr_access_nop,
36463e770bf7SBruno Larsen (billionai) 0x00000000);
36473e770bf7SBruno Larsen (billionai) /* Thermal management */
36483e770bf7SBruno Larsen (billionai) /* Those registers are fake on 750CL */
36493e770bf7SBruno Larsen (billionai) spr_register(env, SPR_THRM1, "THRM1",
36503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36513e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36523e770bf7SBruno Larsen (billionai) 0x00000000);
36533e770bf7SBruno Larsen (billionai) spr_register(env, SPR_THRM2, "THRM2",
36543e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36553e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36563e770bf7SBruno Larsen (billionai) 0x00000000);
36573e770bf7SBruno Larsen (billionai) spr_register(env, SPR_THRM3, "THRM3",
36583e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36593e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36603e770bf7SBruno Larsen (billionai) 0x00000000);
3661acf629ebSFabiano Rosas
36623e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_TDCL, "TDCL",
36633e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36643e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36653e770bf7SBruno Larsen (billionai) 0x00000000);
36663e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_TDCH, "TDCH",
36673e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36683e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36693e770bf7SBruno Larsen (billionai) 0x00000000);
36703e770bf7SBruno Larsen (billionai) /* DMA */
36713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_WPAR, "WPAR",
36723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36733e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36743e770bf7SBruno Larsen (billionai) 0x00000000);
36753e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_DMAL, "DMAL",
36763e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36773e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36783e770bf7SBruno Larsen (billionai) 0x00000000);
36793e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_DMAU, "DMAU",
36803e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36813e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36823e770bf7SBruno Larsen (billionai) 0x00000000);
36833e770bf7SBruno Larsen (billionai) /* Hardware implementation registers */
36843e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750CL_HID2, "HID2",
36853e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36863e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36873e770bf7SBruno Larsen (billionai) 0x00000000);
3688acf629ebSFabiano Rosas
36893e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750CL_HID4, "HID4",
36903e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36913e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36923e770bf7SBruno Larsen (billionai) 0x00000000);
36933e770bf7SBruno Larsen (billionai) /* Quantization registers */
36943e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR0, "GQR0",
36953e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
36963e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
36973e770bf7SBruno Larsen (billionai) 0x00000000);
3698acf629ebSFabiano Rosas
36993e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR1, "GQR1",
37003e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
37013e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
37023e770bf7SBruno Larsen (billionai) 0x00000000);
3703acf629ebSFabiano Rosas
37043e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR2, "GQR2",
37053e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
37063e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
37073e770bf7SBruno Larsen (billionai) 0x00000000);
3708acf629ebSFabiano Rosas
37093e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR3, "GQR3",
37103e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
37113e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
37123e770bf7SBruno Larsen (billionai) 0x00000000);
3713acf629ebSFabiano Rosas
37143e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR4, "GQR4",
37153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
37163e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
37173e770bf7SBruno Larsen (billionai) 0x00000000);
3718acf629ebSFabiano Rosas
37193e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR5, "GQR5",
37203e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
37213e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
37223e770bf7SBruno Larsen (billionai) 0x00000000);
3723acf629ebSFabiano Rosas
37243e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR6, "GQR6",
37253e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
37263e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
37273e770bf7SBruno Larsen (billionai) 0x00000000);
3728acf629ebSFabiano Rosas
37293e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_GQR7, "GQR7",
37303e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
37313e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
37323e770bf7SBruno Larsen (billionai) 0x00000000);
37333e770bf7SBruno Larsen (billionai) /* Memory management */
37343e770bf7SBruno Larsen (billionai) register_low_BATs(env);
37353e770bf7SBruno Larsen (billionai) /* PowerPC 750cl has 8 DBATs and 8 IBATs */
37363e770bf7SBruno Larsen (billionai) register_high_BATs(env);
37373e770bf7SBruno Larsen (billionai) init_excp_750cl(env);
37383e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
37393e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
37403e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
37413e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
37423e770bf7SBruno Larsen (billionai) }
37433e770bf7SBruno Larsen (billionai)
37443e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
37453e770bf7SBruno Larsen (billionai) {
37463e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
37473e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
37483e770bf7SBruno Larsen (billionai)
37493e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 750 CL";
37503e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_750cl;
37513e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
375245693f94SNicholas Piggin pcc->check_attn = check_attn_none;
37533e770bf7SBruno Larsen (billionai) /*
37543e770bf7SBruno Larsen (billionai) * XXX: not implemented:
37553e770bf7SBruno Larsen (billionai) * cache lock instructions:
37563e770bf7SBruno Larsen (billionai) * dcbz_l
37573e770bf7SBruno Larsen (billionai) * floating point paired instructions
37583e770bf7SBruno Larsen (billionai) * psq_lux
37593e770bf7SBruno Larsen (billionai) * psq_lx
37603e770bf7SBruno Larsen (billionai) * psq_stux
37613e770bf7SBruno Larsen (billionai) * psq_stx
37623e770bf7SBruno Larsen (billionai) * ps_abs
37633e770bf7SBruno Larsen (billionai) * ps_add
37643e770bf7SBruno Larsen (billionai) * ps_cmpo0
37653e770bf7SBruno Larsen (billionai) * ps_cmpo1
37663e770bf7SBruno Larsen (billionai) * ps_cmpu0
37673e770bf7SBruno Larsen (billionai) * ps_cmpu1
37683e770bf7SBruno Larsen (billionai) * ps_div
37693e770bf7SBruno Larsen (billionai) * ps_madd
37703e770bf7SBruno Larsen (billionai) * ps_madds0
37713e770bf7SBruno Larsen (billionai) * ps_madds1
37723e770bf7SBruno Larsen (billionai) * ps_merge00
37733e770bf7SBruno Larsen (billionai) * ps_merge01
37743e770bf7SBruno Larsen (billionai) * ps_merge10
37753e770bf7SBruno Larsen (billionai) * ps_merge11
37763e770bf7SBruno Larsen (billionai) * ps_mr
37773e770bf7SBruno Larsen (billionai) * ps_msub
37783e770bf7SBruno Larsen (billionai) * ps_mul
37793e770bf7SBruno Larsen (billionai) * ps_muls0
37803e770bf7SBruno Larsen (billionai) * ps_muls1
37813e770bf7SBruno Larsen (billionai) * ps_nabs
37823e770bf7SBruno Larsen (billionai) * ps_neg
37833e770bf7SBruno Larsen (billionai) * ps_nmadd
37843e770bf7SBruno Larsen (billionai) * ps_nmsub
37853e770bf7SBruno Larsen (billionai) * ps_res
37863e770bf7SBruno Larsen (billionai) * ps_rsqrte
37873e770bf7SBruno Larsen (billionai) * ps_sel
37883e770bf7SBruno Larsen (billionai) * ps_sub
37893e770bf7SBruno Larsen (billionai) * ps_sum0
37903e770bf7SBruno Larsen (billionai) * ps_sum1
37913e770bf7SBruno Larsen (billionai) */
37923e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
37933e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
37943e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
37953e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
37963e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
37973e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
37983e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
37993e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
38003e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
38013e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
38023e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
38033e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
38043e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
38053e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
38063e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
38073e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
38083e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
38093e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
38103e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
38113e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
38123e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
38133e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
38143e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
38153e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
3816fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
38173e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
38183e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
38193e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
38203e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
38213e770bf7SBruno Larsen (billionai) }
38223e770bf7SBruno Larsen (billionai)
init_proc_750cx(CPUPPCState * env)38233e770bf7SBruno Larsen (billionai) static void init_proc_750cx(CPUPPCState *env)
38243e770bf7SBruno Larsen (billionai) {
3825217781afSFabiano Rosas register_non_embedded_sprs(env);
38263e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
38273e770bf7SBruno Larsen (billionai) register_7xx_sprs(env);
3828acf629ebSFabiano Rosas
38293e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L2CR, "L2CR",
38303e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
38313e770bf7SBruno Larsen (billionai) &spr_read_generic, spr_access_nop,
38323e770bf7SBruno Larsen (billionai) 0x00000000);
38333e770bf7SBruno Larsen (billionai) /* Thermal management */
38343e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
3835acf629ebSFabiano Rosas
38363e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SDA, "SDA",
38373e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
38383e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
38393e770bf7SBruno Larsen (billionai) 0x00000000);
3840acf629ebSFabiano Rosas
38413e770bf7SBruno Larsen (billionai) /* Memory management */
38423e770bf7SBruno Larsen (billionai) register_low_BATs(env);
38433e770bf7SBruno Larsen (billionai) /* PowerPC 750cx has 8 DBATs and 8 IBATs */
38443e770bf7SBruno Larsen (billionai) register_high_BATs(env);
38453e770bf7SBruno Larsen (billionai) init_excp_750cx(env);
38463e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
38473e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
38483e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
38493e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
38503e770bf7SBruno Larsen (billionai) }
38513e770bf7SBruno Larsen (billionai)
38523e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
38533e770bf7SBruno Larsen (billionai) {
38543e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
38553e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
38563e770bf7SBruno Larsen (billionai)
38573e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 750CX";
38583e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_750cx;
38593e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
386045693f94SNicholas Piggin pcc->check_attn = check_attn_none;
38613e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
38623e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
38633e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
38643e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
38653e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
38663e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
38673e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
38683e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
38693e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
38703e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
38713e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
38723e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
38733e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
38743e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
38753e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
38763e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
38773e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
38783e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
38793e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
38803e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
38813e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
38823e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
38833e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
38843e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
3885fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
38863e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
38873e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
38883e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
38893e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
38903e770bf7SBruno Larsen (billionai) }
38913e770bf7SBruno Larsen (billionai)
init_proc_750fx(CPUPPCState * env)38923e770bf7SBruno Larsen (billionai) static void init_proc_750fx(CPUPPCState *env)
38933e770bf7SBruno Larsen (billionai) {
3894217781afSFabiano Rosas register_non_embedded_sprs(env);
38953e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
38963e770bf7SBruno Larsen (billionai) register_7xx_sprs(env);
3897acf629ebSFabiano Rosas
38983e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L2CR, "L2CR",
38993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
39003e770bf7SBruno Larsen (billionai) &spr_read_generic, spr_access_nop,
39013e770bf7SBruno Larsen (billionai) 0x00000000);
39023e770bf7SBruno Larsen (billionai) /* Thermal management */
39033e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
3904acf629ebSFabiano Rosas
39053e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_THRM4, "THRM4",
39063e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
39073e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
39083e770bf7SBruno Larsen (billionai) 0x00000000);
39093e770bf7SBruno Larsen (billionai) /* Hardware implementation registers */
39103e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750FX_HID2, "HID2",
39113e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
39123e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
39133e770bf7SBruno Larsen (billionai) 0x00000000);
39143e770bf7SBruno Larsen (billionai) /* Memory management */
39153e770bf7SBruno Larsen (billionai) register_low_BATs(env);
39163e770bf7SBruno Larsen (billionai) /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
39173e770bf7SBruno Larsen (billionai) register_high_BATs(env);
39183e770bf7SBruno Larsen (billionai) init_excp_7x0(env);
39193e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
39203e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
39213e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
39223e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
39233e770bf7SBruno Larsen (billionai) }
39243e770bf7SBruno Larsen (billionai)
39253e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
39263e770bf7SBruno Larsen (billionai) {
39273e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
39283e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
39293e770bf7SBruno Larsen (billionai)
39303e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 750FX";
39313e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_750fx;
39323e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
393345693f94SNicholas Piggin pcc->check_attn = check_attn_none;
39343e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
39353e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
39363e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
39373e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
39383e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
39393e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
39403e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
39413e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
39423e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
39433e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
39443e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
39453e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
39463e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
39473e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
39483e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
39493e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
39503e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
39513e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
39523e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
39533e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
39543e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
39553e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
39563e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
39573e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
3958fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
39593e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
39603e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
39613e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
39623e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
39633e770bf7SBruno Larsen (billionai) }
39643e770bf7SBruno Larsen (billionai)
init_proc_750gx(CPUPPCState * env)39653e770bf7SBruno Larsen (billionai) static void init_proc_750gx(CPUPPCState *env)
39663e770bf7SBruno Larsen (billionai) {
3967217781afSFabiano Rosas register_non_embedded_sprs(env);
39683e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
39693e770bf7SBruno Larsen (billionai) register_7xx_sprs(env);
3970acf629ebSFabiano Rosas
39713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L2CR, "L2CR",
39723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
39733e770bf7SBruno Larsen (billionai) &spr_read_generic, spr_access_nop,
39743e770bf7SBruno Larsen (billionai) 0x00000000);
39753e770bf7SBruno Larsen (billionai) /* Thermal management */
39763e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
3977acf629ebSFabiano Rosas
39783e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750_THRM4, "THRM4",
39793e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
39803e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
39813e770bf7SBruno Larsen (billionai) 0x00000000);
39823e770bf7SBruno Larsen (billionai) /* Hardware implementation registers */
39833e770bf7SBruno Larsen (billionai) spr_register(env, SPR_750FX_HID2, "HID2",
39843e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
39853e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
39863e770bf7SBruno Larsen (billionai) 0x00000000);
39873e770bf7SBruno Larsen (billionai) /* Memory management */
39883e770bf7SBruno Larsen (billionai) register_low_BATs(env);
39893e770bf7SBruno Larsen (billionai) /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
39903e770bf7SBruno Larsen (billionai) register_high_BATs(env);
39913e770bf7SBruno Larsen (billionai) init_excp_7x0(env);
39923e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
39933e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
39943e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
39953e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
39963e770bf7SBruno Larsen (billionai) }
39973e770bf7SBruno Larsen (billionai)
39983e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
39993e770bf7SBruno Larsen (billionai) {
40003e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
40013e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
40023e770bf7SBruno Larsen (billionai)
40033e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 750GX";
40043e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_750gx;
40053e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
400645693f94SNicholas Piggin pcc->check_attn = check_attn_none;
40073e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
40083e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
40093e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
40103e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
40113e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
40123e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
40133e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
40143e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
40153e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
40163e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
40173e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
40183e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
40193e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
40203e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
40213e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
40223e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
40233e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
40243e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
40253e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
40263e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
40273e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
40283e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
40293e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
40303e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
4031fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
40323e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
40333e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
40343e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
40353e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
40363e770bf7SBruno Larsen (billionai) }
40373e770bf7SBruno Larsen (billionai)
init_proc_745(CPUPPCState * env)40383e770bf7SBruno Larsen (billionai) static void init_proc_745(CPUPPCState *env)
40393e770bf7SBruno Larsen (billionai) {
4040217781afSFabiano Rosas register_non_embedded_sprs(env);
40413e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
40423e770bf7SBruno Larsen (billionai) register_7xx_sprs(env);
4043a5d1120bSFabiano Rosas register_745_sprs(env);
40443e770bf7SBruno Larsen (billionai) /* Thermal management */
40453e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
4046acf629ebSFabiano Rosas
40473e770bf7SBruno Larsen (billionai) /* Memory management */
40483e770bf7SBruno Larsen (billionai) register_low_BATs(env);
40493e770bf7SBruno Larsen (billionai) register_high_BATs(env);
40503e770bf7SBruno Larsen (billionai) register_6xx_7xx_soft_tlb(env, 64, 2);
40513e770bf7SBruno Larsen (billionai) init_excp_7x5(env);
40523e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
40533e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
40543e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
40553e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
40563e770bf7SBruno Larsen (billionai) }
40573e770bf7SBruno Larsen (billionai)
40583e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
40593e770bf7SBruno Larsen (billionai) {
40603e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
40613e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
40623e770bf7SBruno Larsen (billionai)
40633e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 745";
40643e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_745;
40653e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
406645693f94SNicholas Piggin pcc->check_attn = check_attn_none;
40673e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
40683e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
40693e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
40703e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
40713e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
40723e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
40733e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
40743e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
40753e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
40763e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
40773e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
40783e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
40793e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
40803e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
40813e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
40823e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
40833e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
40843e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
40853e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
40863e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
40873e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
40883e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
40893e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
40903e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4091fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
40923e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
40933e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
40943e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
40953e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
40963e770bf7SBruno Larsen (billionai) }
40973e770bf7SBruno Larsen (billionai)
init_proc_755(CPUPPCState * env)40983e770bf7SBruno Larsen (billionai) static void init_proc_755(CPUPPCState *env)
40993e770bf7SBruno Larsen (billionai) {
4100c1f21577SFabiano Rosas init_proc_745(env);
410128930245SFabiano Rosas register_755_sprs(env);
41023e770bf7SBruno Larsen (billionai) }
41033e770bf7SBruno Larsen (billionai)
41043e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
41053e770bf7SBruno Larsen (billionai) {
41063e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
41073e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
41083e770bf7SBruno Larsen (billionai)
41093e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 755";
41103e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_755;
41113e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
411245693f94SNicholas Piggin pcc->check_attn = check_attn_none;
41133e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
41143e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
41153e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
41163e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
41173e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
41183e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
41193e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN;
41203e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_POW) |
41213e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
41223e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
41233e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
41243e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
41253e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
41263e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
41273e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
41283e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
41293e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
41303e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
41313e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
41323e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
41333e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
41343e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
41353e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
41363e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4137fd7dc4bbSFabiano Rosas pcc->excp_model = POWERPC_EXCP_7xx;
41383e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
41393e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_750;
41403e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
41413e770bf7SBruno Larsen (billionai) POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
41423e770bf7SBruno Larsen (billionai) }
41433e770bf7SBruno Larsen (billionai)
init_proc_7400(CPUPPCState * env)41443e770bf7SBruno Larsen (billionai) static void init_proc_7400(CPUPPCState *env)
41453e770bf7SBruno Larsen (billionai) {
4146217781afSFabiano Rosas register_non_embedded_sprs(env);
41473e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
41483e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
41493e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
4150acf629ebSFabiano Rosas
41513e770bf7SBruno Larsen (billionai) spr_register(env, SPR_UBAMR, "UBAMR",
41523e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
41533e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
41543e770bf7SBruno Larsen (billionai) 0x00000000);
4155acf629ebSFabiano Rosas
41563e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSCR1, "MSSCR1",
41573e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
41583e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
41593e770bf7SBruno Larsen (billionai) 0x00000000);
41603e770bf7SBruno Larsen (billionai) /* Thermal management */
41613e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
41623e770bf7SBruno Larsen (billionai) /* Memory management */
41633e770bf7SBruno Larsen (billionai) register_low_BATs(env);
41643e770bf7SBruno Larsen (billionai) init_excp_7400(env);
41653e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
41663e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
41673e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
41683e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
41693e770bf7SBruno Larsen (billionai) }
41703e770bf7SBruno Larsen (billionai)
41713e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
41723e770bf7SBruno Larsen (billionai) {
41733e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
41743e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
41753e770bf7SBruno Larsen (billionai)
41763e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 7400 (aka G4)";
41773e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_7400;
41783e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
417945693f94SNicholas Piggin pcc->check_attn = check_attn_none;
41803e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
41813e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
41823e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
41833e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
41843e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
41853e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
41863e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
41873e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
41883e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIA |
41893e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
41903e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
41913e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
41923e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
41933e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
41943e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
41953e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
41963e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
41973e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
41983e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
41993e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
42003e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
42013e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
42023e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
42033e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
42043e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
42053e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
42063e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
42073e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
42083e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
42093e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
42103e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
42113e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
42123e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
42133e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
42143e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
42153e770bf7SBruno Larsen (billionai) }
42163e770bf7SBruno Larsen (billionai)
init_proc_7410(CPUPPCState * env)42173e770bf7SBruno Larsen (billionai) static void init_proc_7410(CPUPPCState *env)
42183e770bf7SBruno Larsen (billionai) {
4219217781afSFabiano Rosas register_non_embedded_sprs(env);
42203e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
42213e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
42223e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
4223acf629ebSFabiano Rosas
42243e770bf7SBruno Larsen (billionai) spr_register(env, SPR_UBAMR, "UBAMR",
42253e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
42263e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
42273e770bf7SBruno Larsen (billionai) 0x00000000);
42283e770bf7SBruno Larsen (billionai) /* Thermal management */
42293e770bf7SBruno Larsen (billionai) register_thrm_sprs(env);
42303e770bf7SBruno Larsen (billionai) /* L2PMCR */
4231acf629ebSFabiano Rosas
42323e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L2PMCR, "L2PMCR",
42333e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
42343e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
42353e770bf7SBruno Larsen (billionai) 0x00000000);
42363e770bf7SBruno Larsen (billionai) /* LDSTDB */
4237acf629ebSFabiano Rosas
42383e770bf7SBruno Larsen (billionai) spr_register(env, SPR_LDSTDB, "LDSTDB",
42393e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
42403e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
42413e770bf7SBruno Larsen (billionai) 0x00000000);
42423e770bf7SBruno Larsen (billionai) /* Memory management */
42433e770bf7SBruno Larsen (billionai) register_low_BATs(env);
42443e770bf7SBruno Larsen (billionai) init_excp_7400(env);
42453e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
42463e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
42473e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
42483e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
42493e770bf7SBruno Larsen (billionai) }
42503e770bf7SBruno Larsen (billionai)
42513e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
42523e770bf7SBruno Larsen (billionai) {
42533e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
42543e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
42553e770bf7SBruno Larsen (billionai)
42563e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 7410 (aka G4)";
42573e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_7410;
42583e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0;
425945693f94SNicholas Piggin pcc->check_attn = check_attn_none;
42603e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
42613e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
42623e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
42633e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
42643e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
42653e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
42663e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
42673e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
42683e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIA |
42693e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
42703e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
42713e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
42723e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
42733e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
42743e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
42753e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
42763e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
42773e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
42783e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
42793e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
42803e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
42813e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
42823e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
42833e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
42843e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
42853e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
42863e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
42873e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
42883e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
42893e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
42903e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
42913e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
42923e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
42933e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
42943e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
42953e770bf7SBruno Larsen (billionai) }
42963e770bf7SBruno Larsen (billionai)
init_proc_7440(CPUPPCState * env)42973e770bf7SBruno Larsen (billionai) static void init_proc_7440(CPUPPCState *env)
42983e770bf7SBruno Larsen (billionai) {
4299217781afSFabiano Rosas register_non_embedded_sprs(env);
43003e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
43013e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
43023e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
4303acf629ebSFabiano Rosas
43043e770bf7SBruno Larsen (billionai) spr_register(env, SPR_UBAMR, "UBAMR",
43053e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
43063e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
43073e770bf7SBruno Larsen (billionai) 0x00000000);
43083e770bf7SBruno Larsen (billionai) /* LDSTCR */
43093e770bf7SBruno Larsen (billionai) spr_register(env, SPR_LDSTCR, "LDSTCR",
43103e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
43113e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
43123e770bf7SBruno Larsen (billionai) 0x00000000);
43133e770bf7SBruno Larsen (billionai) /* ICTRL */
43143e770bf7SBruno Larsen (billionai) spr_register(env, SPR_ICTRL, "ICTRL",
43153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
43163e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
43173e770bf7SBruno Larsen (billionai) 0x00000000);
43183e770bf7SBruno Larsen (billionai) /* MSSSR0 */
43193e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSSR0, "MSSSR0",
43203e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
43213e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
43223e770bf7SBruno Larsen (billionai) 0x00000000);
43233e770bf7SBruno Larsen (billionai) /* PMC */
43243e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC5, "PMC5",
43253e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
43263e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
43273e770bf7SBruno Larsen (billionai) 0x00000000);
4328acf629ebSFabiano Rosas
43293e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC5, "UPMC5",
43303e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
43313e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
43323e770bf7SBruno Larsen (billionai) 0x00000000);
4333acf629ebSFabiano Rosas
43343e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC6, "PMC6",
43353e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
43363e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
43373e770bf7SBruno Larsen (billionai) 0x00000000);
4338acf629ebSFabiano Rosas
43393e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC6, "UPMC6",
43403e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
43413e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
43423e770bf7SBruno Larsen (billionai) 0x00000000);
43433e770bf7SBruno Larsen (billionai) /* Memory management */
43443e770bf7SBruno Larsen (billionai) register_low_BATs(env);
43453e770bf7SBruno Larsen (billionai) init_excp_7450(env);
43463e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
43473e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
43483e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
43493e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
43503e770bf7SBruno Larsen (billionai) }
43513e770bf7SBruno Larsen (billionai)
43523e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
43533e770bf7SBruno Larsen (billionai) {
43543e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
43553e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
43563e770bf7SBruno Larsen (billionai)
43573e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 7440 (aka G4)";
43583e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_7440;
43593e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0_74xx;
436045693f94SNicholas Piggin pcc->check_attn = check_attn_none;
43613e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
43623e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
43633e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
43643e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
43653e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
43663e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
43673e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
43683e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
43691da666cdSFabiano Rosas PPC_MEM_TLBIA |
43703e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
43713e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
43723e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
43733e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
43743e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
43753e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
43763e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
43773e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
43783e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
43793e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
43803e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
43813e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
43823e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
43833e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
43843e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
43853e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
43863e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
43873e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
43883e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
43891da666cdSFabiano Rosas pcc->mmu_model = POWERPC_MMU_32B;
43903e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
43913e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
43923e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
43933e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
43943e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
43953e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
43963e770bf7SBruno Larsen (billionai) }
43973e770bf7SBruno Larsen (billionai)
init_proc_7450(CPUPPCState * env)43983e770bf7SBruno Larsen (billionai) static void init_proc_7450(CPUPPCState *env)
43993e770bf7SBruno Larsen (billionai) {
4400217781afSFabiano Rosas register_non_embedded_sprs(env);
44013e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
44023e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
44033e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
44043e770bf7SBruno Larsen (billionai) /* Level 3 cache control */
44053e770bf7SBruno Larsen (billionai) register_l3_ctrl(env);
44063e770bf7SBruno Larsen (billionai) /* L3ITCR1 */
44073e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3ITCR1, "L3ITCR1",
44083e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44093e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44103e770bf7SBruno Larsen (billionai) 0x00000000);
44113e770bf7SBruno Larsen (billionai) /* L3ITCR2 */
44123e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3ITCR2, "L3ITCR2",
44133e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44143e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44153e770bf7SBruno Larsen (billionai) 0x00000000);
44163e770bf7SBruno Larsen (billionai) /* L3ITCR3 */
44173e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3ITCR3, "L3ITCR3",
44183e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44193e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44203e770bf7SBruno Larsen (billionai) 0x00000000);
44213e770bf7SBruno Larsen (billionai) /* L3OHCR */
44223e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3OHCR, "L3OHCR",
44233e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44243e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44253e770bf7SBruno Larsen (billionai) 0x00000000);
4426acf629ebSFabiano Rosas
44273e770bf7SBruno Larsen (billionai) spr_register(env, SPR_UBAMR, "UBAMR",
44283e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
44293e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
44303e770bf7SBruno Larsen (billionai) 0x00000000);
44313e770bf7SBruno Larsen (billionai) /* LDSTCR */
44323e770bf7SBruno Larsen (billionai) spr_register(env, SPR_LDSTCR, "LDSTCR",
44333e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44343e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44353e770bf7SBruno Larsen (billionai) 0x00000000);
44363e770bf7SBruno Larsen (billionai) /* ICTRL */
44373e770bf7SBruno Larsen (billionai) spr_register(env, SPR_ICTRL, "ICTRL",
44383e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44393e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44403e770bf7SBruno Larsen (billionai) 0x00000000);
44413e770bf7SBruno Larsen (billionai) /* MSSSR0 */
44423e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSSR0, "MSSSR0",
44433e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44443e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44453e770bf7SBruno Larsen (billionai) 0x00000000);
44463e770bf7SBruno Larsen (billionai) /* PMC */
44473e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC5, "PMC5",
44483e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44493e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44503e770bf7SBruno Larsen (billionai) 0x00000000);
4451acf629ebSFabiano Rosas
44523e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC5, "UPMC5",
44533e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
44543e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
44553e770bf7SBruno Larsen (billionai) 0x00000000);
4456acf629ebSFabiano Rosas
44573e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC6, "PMC6",
44583e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
44593e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
44603e770bf7SBruno Larsen (billionai) 0x00000000);
4461acf629ebSFabiano Rosas
44623e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC6, "UPMC6",
44633e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
44643e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
44653e770bf7SBruno Larsen (billionai) 0x00000000);
44663e770bf7SBruno Larsen (billionai) /* Memory management */
44673e770bf7SBruno Larsen (billionai) register_low_BATs(env);
44683e770bf7SBruno Larsen (billionai) init_excp_7450(env);
44693e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
44703e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
44713e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
44723e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
44733e770bf7SBruno Larsen (billionai) }
44743e770bf7SBruno Larsen (billionai)
44753e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
44763e770bf7SBruno Larsen (billionai) {
44773e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
44783e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
44793e770bf7SBruno Larsen (billionai)
44803e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 7450 (aka G4)";
44813e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_7450;
44823e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0_74xx;
448345693f94SNicholas Piggin pcc->check_attn = check_attn_none;
44843e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
44853e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
44863e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
44873e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
44883e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
44893e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
44903e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
44913e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
44921da666cdSFabiano Rosas PPC_MEM_TLBIA |
44933e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
44943e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
44953e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
44963e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
44973e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
44983e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
44993e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
45003e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
45013e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
45023e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
45033e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
45043e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
45053e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
45063e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
45073e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
45083e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
45093e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
45103e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
45113e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
45121da666cdSFabiano Rosas pcc->mmu_model = POWERPC_MMU_32B;
45133e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
45143e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
45153e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
45163e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
45173e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
45183e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
45193e770bf7SBruno Larsen (billionai) }
45203e770bf7SBruno Larsen (billionai)
init_proc_7445(CPUPPCState * env)45213e770bf7SBruno Larsen (billionai) static void init_proc_7445(CPUPPCState *env)
45223e770bf7SBruno Larsen (billionai) {
4523217781afSFabiano Rosas register_non_embedded_sprs(env);
45243e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
45253e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
45263e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
45273e770bf7SBruno Larsen (billionai) /* LDSTCR */
45283e770bf7SBruno Larsen (billionai) spr_register(env, SPR_LDSTCR, "LDSTCR",
45293e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45303e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45313e770bf7SBruno Larsen (billionai) 0x00000000);
45323e770bf7SBruno Larsen (billionai) /* ICTRL */
45333e770bf7SBruno Larsen (billionai) spr_register(env, SPR_ICTRL, "ICTRL",
45343e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45353e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45363e770bf7SBruno Larsen (billionai) 0x00000000);
45373e770bf7SBruno Larsen (billionai) /* MSSSR0 */
45383e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSSR0, "MSSSR0",
45393e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45403e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45413e770bf7SBruno Larsen (billionai) 0x00000000);
45423e770bf7SBruno Larsen (billionai) /* PMC */
45433e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC5, "PMC5",
45443e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45453e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45463e770bf7SBruno Larsen (billionai) 0x00000000);
4547acf629ebSFabiano Rosas
45483e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC5, "UPMC5",
45493e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45503e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45513e770bf7SBruno Larsen (billionai) 0x00000000);
4552acf629ebSFabiano Rosas
45533e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC6, "PMC6",
45543e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45553e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45563e770bf7SBruno Larsen (billionai) 0x00000000);
4557acf629ebSFabiano Rosas
45583e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC6, "UPMC6",
45593e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45603e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45613e770bf7SBruno Larsen (billionai) 0x00000000);
45623e770bf7SBruno Larsen (billionai) /* SPRGs */
45633e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG4, "SPRG4",
45643e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45653e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45663e770bf7SBruno Larsen (billionai) 0x00000000);
45673e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG4, "USPRG4",
45683e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45693e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45703e770bf7SBruno Larsen (billionai) 0x00000000);
45713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG5, "SPRG5",
45723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45733e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45743e770bf7SBruno Larsen (billionai) 0x00000000);
45753e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG5, "USPRG5",
45763e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45773e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45783e770bf7SBruno Larsen (billionai) 0x00000000);
45793e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG6, "SPRG6",
45803e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45813e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45823e770bf7SBruno Larsen (billionai) 0x00000000);
45833e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG6, "USPRG6",
45843e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45853e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45863e770bf7SBruno Larsen (billionai) 0x00000000);
45873e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG7, "SPRG7",
45883e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
45893e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
45903e770bf7SBruno Larsen (billionai) 0x00000000);
45913e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG7, "USPRG7",
45923e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45933e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
45943e770bf7SBruno Larsen (billionai) 0x00000000);
45953e770bf7SBruno Larsen (billionai) /* Memory management */
45963e770bf7SBruno Larsen (billionai) register_low_BATs(env);
45973e770bf7SBruno Larsen (billionai) register_high_BATs(env);
45983e770bf7SBruno Larsen (billionai) init_excp_7450(env);
45993e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
46003e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
46013e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
46023e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
46033e770bf7SBruno Larsen (billionai) }
46043e770bf7SBruno Larsen (billionai)
46053e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
46063e770bf7SBruno Larsen (billionai) {
46073e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
46083e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
46093e770bf7SBruno Larsen (billionai)
46103e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 7445 (aka G4)";
46113e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_7445;
46123e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0_74xx;
461345693f94SNicholas Piggin pcc->check_attn = check_attn_none;
46143e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
46153e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
46163e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
46173e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
46183e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
46193e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
46203e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
46213e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
46221da666cdSFabiano Rosas PPC_MEM_TLBIA |
46233e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
46243e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
46253e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
46263e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
46273e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
46283e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
46293e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
46303e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
46313e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
46323e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
46333e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
46343e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
46353e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
46363e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
46373e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
46383e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
46393e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
46403e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
46413e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
46421da666cdSFabiano Rosas pcc->mmu_model = POWERPC_MMU_32B;
46433e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
46443e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
46453e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
46463e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
46473e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
46483e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
46493e770bf7SBruno Larsen (billionai) }
46503e770bf7SBruno Larsen (billionai)
init_proc_7455(CPUPPCState * env)46513e770bf7SBruno Larsen (billionai) static void init_proc_7455(CPUPPCState *env)
46523e770bf7SBruno Larsen (billionai) {
4653217781afSFabiano Rosas register_non_embedded_sprs(env);
46543e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
46553e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
46563e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
46573e770bf7SBruno Larsen (billionai) /* Level 3 cache control */
46583e770bf7SBruno Larsen (billionai) register_l3_ctrl(env);
46593e770bf7SBruno Larsen (billionai) /* LDSTCR */
46603e770bf7SBruno Larsen (billionai) spr_register(env, SPR_LDSTCR, "LDSTCR",
46613e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
46623e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
46633e770bf7SBruno Larsen (billionai) 0x00000000);
46643e770bf7SBruno Larsen (billionai) /* ICTRL */
46653e770bf7SBruno Larsen (billionai) spr_register(env, SPR_ICTRL, "ICTRL",
46663e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
46673e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
46683e770bf7SBruno Larsen (billionai) 0x00000000);
46693e770bf7SBruno Larsen (billionai) /* MSSSR0 */
46703e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSSR0, "MSSSR0",
46713e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
46723e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
46733e770bf7SBruno Larsen (billionai) 0x00000000);
46743e770bf7SBruno Larsen (billionai) /* PMC */
46753e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC5, "PMC5",
46763e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
46773e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
46783e770bf7SBruno Larsen (billionai) 0x00000000);
4679acf629ebSFabiano Rosas
46803e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC5, "UPMC5",
46813e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
46823e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
46833e770bf7SBruno Larsen (billionai) 0x00000000);
4684acf629ebSFabiano Rosas
46853e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC6, "PMC6",
46863e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
46873e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
46883e770bf7SBruno Larsen (billionai) 0x00000000);
4689acf629ebSFabiano Rosas
46903e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC6, "UPMC6",
46913e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
46923e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
46933e770bf7SBruno Larsen (billionai) 0x00000000);
46943e770bf7SBruno Larsen (billionai) /* SPRGs */
46953e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG4, "SPRG4",
46963e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
46973e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
46983e770bf7SBruno Larsen (billionai) 0x00000000);
46993e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG4, "USPRG4",
47003e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47013e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47023e770bf7SBruno Larsen (billionai) 0x00000000);
47033e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG5, "SPRG5",
47043e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
47053e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
47063e770bf7SBruno Larsen (billionai) 0x00000000);
47073e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG5, "USPRG5",
47083e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47093e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47103e770bf7SBruno Larsen (billionai) 0x00000000);
47113e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG6, "SPRG6",
47123e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
47133e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
47143e770bf7SBruno Larsen (billionai) 0x00000000);
47153e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG6, "USPRG6",
47163e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47173e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47183e770bf7SBruno Larsen (billionai) 0x00000000);
47193e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG7, "SPRG7",
47203e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
47213e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
47223e770bf7SBruno Larsen (billionai) 0x00000000);
47233e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG7, "USPRG7",
47243e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47253e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
47263e770bf7SBruno Larsen (billionai) 0x00000000);
47273e770bf7SBruno Larsen (billionai) /* Memory management */
47283e770bf7SBruno Larsen (billionai) register_low_BATs(env);
47293e770bf7SBruno Larsen (billionai) register_high_BATs(env);
47303e770bf7SBruno Larsen (billionai) init_excp_7450(env);
47313e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
47323e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
47333e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
47343e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
47353e770bf7SBruno Larsen (billionai) }
47363e770bf7SBruno Larsen (billionai)
47373e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
47383e770bf7SBruno Larsen (billionai) {
47393e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
47403e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
47413e770bf7SBruno Larsen (billionai)
47423e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 7455 (aka G4)";
47433e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_7455;
47443e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0_74xx;
474545693f94SNicholas Piggin pcc->check_attn = check_attn_none;
47463e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
47473e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
47483e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
47493e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
47503e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
47513e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
47523e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
47533e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
47541da666cdSFabiano Rosas PPC_MEM_TLBIA |
47553e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
47563e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
47573e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
47583e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
47593e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
47603e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
47613e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
47623e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
47633e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
47643e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
47653e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
47663e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
47673e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
47683e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
47693e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
47703e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
47713e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
47723e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
47733e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
47741da666cdSFabiano Rosas pcc->mmu_model = POWERPC_MMU_32B;
47753e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
47763e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
47773e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
47783e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
47793e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
47803e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
47813e770bf7SBruno Larsen (billionai) }
47823e770bf7SBruno Larsen (billionai)
init_proc_7457(CPUPPCState * env)47833e770bf7SBruno Larsen (billionai) static void init_proc_7457(CPUPPCState *env)
47843e770bf7SBruno Larsen (billionai) {
4785217781afSFabiano Rosas register_non_embedded_sprs(env);
47863e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
47873e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
47883e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
47893e770bf7SBruno Larsen (billionai) /* Level 3 cache control */
47903e770bf7SBruno Larsen (billionai) register_l3_ctrl(env);
47913e770bf7SBruno Larsen (billionai) /* L3ITCR1 */
47923e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3ITCR1, "L3ITCR1",
47933e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
47943e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
47953e770bf7SBruno Larsen (billionai) 0x00000000);
47963e770bf7SBruno Larsen (billionai) /* L3ITCR2 */
47973e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3ITCR2, "L3ITCR2",
47983e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
47993e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48003e770bf7SBruno Larsen (billionai) 0x00000000);
48013e770bf7SBruno Larsen (billionai) /* L3ITCR3 */
48023e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3ITCR3, "L3ITCR3",
48033e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48043e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48053e770bf7SBruno Larsen (billionai) 0x00000000);
48063e770bf7SBruno Larsen (billionai) /* L3OHCR */
48073e770bf7SBruno Larsen (billionai) spr_register(env, SPR_L3OHCR, "L3OHCR",
48083e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48093e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48103e770bf7SBruno Larsen (billionai) 0x00000000);
48113e770bf7SBruno Larsen (billionai) /* LDSTCR */
48123e770bf7SBruno Larsen (billionai) spr_register(env, SPR_LDSTCR, "LDSTCR",
48133e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48143e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48153e770bf7SBruno Larsen (billionai) 0x00000000);
48163e770bf7SBruno Larsen (billionai) /* ICTRL */
48173e770bf7SBruno Larsen (billionai) spr_register(env, SPR_ICTRL, "ICTRL",
48183e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48193e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48203e770bf7SBruno Larsen (billionai) 0x00000000);
48213e770bf7SBruno Larsen (billionai) /* MSSSR0 */
48223e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSSR0, "MSSSR0",
48233e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48243e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48253e770bf7SBruno Larsen (billionai) 0x00000000);
48263e770bf7SBruno Larsen (billionai) /* PMC */
48273e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC5, "PMC5",
48283e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48293e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48303e770bf7SBruno Larsen (billionai) 0x00000000);
4831acf629ebSFabiano Rosas
48323e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC5, "UPMC5",
48333e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48343e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48353e770bf7SBruno Larsen (billionai) 0x00000000);
4836acf629ebSFabiano Rosas
48373e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC6, "PMC6",
48383e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48393e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48403e770bf7SBruno Larsen (billionai) 0x00000000);
4841acf629ebSFabiano Rosas
48423e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC6, "UPMC6",
48433e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48443e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48453e770bf7SBruno Larsen (billionai) 0x00000000);
48463e770bf7SBruno Larsen (billionai) /* SPRGs */
48473e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG4, "SPRG4",
48483e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48493e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48503e770bf7SBruno Larsen (billionai) 0x00000000);
48513e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG4, "USPRG4",
48523e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48533e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48543e770bf7SBruno Larsen (billionai) 0x00000000);
48553e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG5, "SPRG5",
48563e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48573e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48583e770bf7SBruno Larsen (billionai) 0x00000000);
48593e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG5, "USPRG5",
48603e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48613e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48623e770bf7SBruno Larsen (billionai) 0x00000000);
48633e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG6, "SPRG6",
48643e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48653e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48663e770bf7SBruno Larsen (billionai) 0x00000000);
48673e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG6, "USPRG6",
48683e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48693e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48703e770bf7SBruno Larsen (billionai) 0x00000000);
48713e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG7, "SPRG7",
48723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
48733e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
48743e770bf7SBruno Larsen (billionai) 0x00000000);
48753e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG7, "USPRG7",
48763e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48773e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
48783e770bf7SBruno Larsen (billionai) 0x00000000);
48793e770bf7SBruno Larsen (billionai) /* Memory management */
48803e770bf7SBruno Larsen (billionai) register_low_BATs(env);
48813e770bf7SBruno Larsen (billionai) register_high_BATs(env);
48823e770bf7SBruno Larsen (billionai) init_excp_7450(env);
48833e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
48843e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
48853e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
48863e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
48873e770bf7SBruno Larsen (billionai) }
48883e770bf7SBruno Larsen (billionai)
48893e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
48903e770bf7SBruno Larsen (billionai) {
48913e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
48923e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
48933e770bf7SBruno Larsen (billionai)
48943e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 7457 (aka G4)";
48953e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_7457;
48963e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0_74xx;
489745693f94SNicholas Piggin pcc->check_attn = check_attn_none;
48983e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
48993e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
49003e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
49013e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
49023e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
49033e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
49043e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
49053e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
49061da666cdSFabiano Rosas PPC_MEM_TLBIA |
49073e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
49083e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
49093e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
49103e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
49113e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
49123e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
49133e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
49143e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
49153e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
49163e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
49173e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
49183e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
49193e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
49203e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
49213e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
49223e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
49233e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
49243e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
49253e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
49261da666cdSFabiano Rosas pcc->mmu_model = POWERPC_MMU_32B;
49273e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
49283e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
49293e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
49303e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
49313e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
49323e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
49333e770bf7SBruno Larsen (billionai) }
49343e770bf7SBruno Larsen (billionai)
init_proc_e600(CPUPPCState * env)49353e770bf7SBruno Larsen (billionai) static void init_proc_e600(CPUPPCState *env)
49363e770bf7SBruno Larsen (billionai) {
4937217781afSFabiano Rosas register_non_embedded_sprs(env);
49383e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
49393e770bf7SBruno Larsen (billionai) register_74xx_sprs(env);
49403e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
4941acf629ebSFabiano Rosas
49423e770bf7SBruno Larsen (billionai) spr_register(env, SPR_UBAMR, "UBAMR",
49433e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49443e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49453e770bf7SBruno Larsen (billionai) 0x00000000);
4946acf629ebSFabiano Rosas
49473e770bf7SBruno Larsen (billionai) spr_register(env, SPR_LDSTCR, "LDSTCR",
49483e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
49493e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
49503e770bf7SBruno Larsen (billionai) 0x00000000);
4951acf629ebSFabiano Rosas
49523e770bf7SBruno Larsen (billionai) spr_register(env, SPR_ICTRL, "ICTRL",
49533e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
49543e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
49553e770bf7SBruno Larsen (billionai) 0x00000000);
4956acf629ebSFabiano Rosas
49573e770bf7SBruno Larsen (billionai) spr_register(env, SPR_MSSSR0, "MSSSR0",
49583e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
49593e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
49603e770bf7SBruno Larsen (billionai) 0x00000000);
4961acf629ebSFabiano Rosas
49623e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC5, "PMC5",
49633e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
49643e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
49653e770bf7SBruno Larsen (billionai) 0x00000000);
4966acf629ebSFabiano Rosas
49673e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC5, "UPMC5",
49683e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49693e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49703e770bf7SBruno Larsen (billionai) 0x00000000);
4971acf629ebSFabiano Rosas
49723e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_PMC6, "PMC6",
49733e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
49743e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
49753e770bf7SBruno Larsen (billionai) 0x00000000);
4976acf629ebSFabiano Rosas
49773e770bf7SBruno Larsen (billionai) spr_register(env, SPR_7XX_UPMC6, "UPMC6",
49783e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49793e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49803e770bf7SBruno Larsen (billionai) 0x00000000);
49813e770bf7SBruno Larsen (billionai) /* SPRGs */
49823e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG4, "SPRG4",
49833e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
49843e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
49853e770bf7SBruno Larsen (billionai) 0x00000000);
49863e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG4, "USPRG4",
49873e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49883e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49893e770bf7SBruno Larsen (billionai) 0x00000000);
49903e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG5, "SPRG5",
49913e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
49923e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
49933e770bf7SBruno Larsen (billionai) 0x00000000);
49943e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG5, "USPRG5",
49953e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49963e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
49973e770bf7SBruno Larsen (billionai) 0x00000000);
49983e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG6, "SPRG6",
49993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
50003e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
50013e770bf7SBruno Larsen (billionai) 0x00000000);
50023e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG6, "USPRG6",
50033e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
50043e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
50053e770bf7SBruno Larsen (billionai) 0x00000000);
50063e770bf7SBruno Larsen (billionai) spr_register(env, SPR_SPRG7, "SPRG7",
50073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
50083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
50093e770bf7SBruno Larsen (billionai) 0x00000000);
50103e770bf7SBruno Larsen (billionai) spr_register(env, SPR_USPRG7, "USPRG7",
50113e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
50123e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
50133e770bf7SBruno Larsen (billionai) 0x00000000);
50143e770bf7SBruno Larsen (billionai) /* Memory management */
50153e770bf7SBruno Larsen (billionai) register_low_BATs(env);
50163e770bf7SBruno Larsen (billionai) register_high_BATs(env);
50173e770bf7SBruno Larsen (billionai) init_excp_7450(env);
50183e770bf7SBruno Larsen (billionai) env->dcache_line_size = 32;
50193e770bf7SBruno Larsen (billionai) env->icache_line_size = 32;
50203e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
50213e770bf7SBruno Larsen (billionai) ppc6xx_irq_init(env_archcpu(env));
50223e770bf7SBruno Larsen (billionai) }
50233e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(e600)50243e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e600)(ObjectClass *oc, void *data)
50253e770bf7SBruno Larsen (billionai) {
50263e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
50273e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
50283e770bf7SBruno Larsen (billionai)
50293e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC e600";
50303e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_e600;
50313e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_hid0_74xx;
503245693f94SNicholas Piggin pcc->check_attn = check_attn_none;
50333e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
50343e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
50353e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
50363e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
50373e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI |
50383e770bf7SBruno Larsen (billionai) PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
50393e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
50403e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5041b137fb72SFabiano Rosas PPC_MEM_TLBIA |
50423e770bf7SBruno Larsen (billionai) PPC_SEGMENT | PPC_EXTERN |
50433e770bf7SBruno Larsen (billionai) PPC_ALTIVEC;
50443e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC_NONE;
50453e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_VR) |
50463e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
50473e770bf7SBruno Larsen (billionai) (1ull << MSR_ILE) |
50483e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
50493e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
50503e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
50513e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
50523e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
50533e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
50543e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
50553e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
50563e770bf7SBruno Larsen (billionai) (1ull << MSR_EP) |
50573e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
50583e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
50593e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
50603e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
50613e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
50623e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_32B;
50633e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_74xx;
50643e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_6xx;
50653e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc_7400;
50663e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
50673e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
50683e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
50693e770bf7SBruno Larsen (billionai) }
50703e770bf7SBruno Larsen (billionai)
50713e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
50723e770bf7SBruno Larsen (billionai) #if defined(CONFIG_USER_ONLY)
50733e770bf7SBruno Larsen (billionai) #define POWERPC970_HID5_INIT 0x00000080
50743e770bf7SBruno Larsen (billionai) #else
50753e770bf7SBruno Larsen (billionai) #define POWERPC970_HID5_INIT 0x00000000
50763e770bf7SBruno Larsen (billionai) #endif
50773e770bf7SBruno Larsen (billionai)
check_pow_970(CPUPPCState * env)50783e770bf7SBruno Larsen (billionai) static int check_pow_970(CPUPPCState *env)
50793e770bf7SBruno Larsen (billionai) {
50803e770bf7SBruno Larsen (billionai) if (env->spr[SPR_HID0] & (HID0_DEEPNAP | HID0_DOZE | HID0_NAP)) {
50813e770bf7SBruno Larsen (billionai) return 1;
50823e770bf7SBruno Larsen (billionai) }
50833e770bf7SBruno Larsen (billionai)
50843e770bf7SBruno Larsen (billionai) return 0;
50853e770bf7SBruno Larsen (billionai) }
50863e770bf7SBruno Larsen (billionai)
register_970_hid_sprs(CPUPPCState * env)50873e770bf7SBruno Larsen (billionai) static void register_970_hid_sprs(CPUPPCState *env)
50883e770bf7SBruno Larsen (billionai) {
50893e770bf7SBruno Larsen (billionai) /* Hardware implementation registers */
50903e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID0, "HID0",
50913e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
50923e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_clear,
50933e770bf7SBruno Larsen (billionai) 0x60000000);
50943e770bf7SBruno Larsen (billionai) spr_register(env, SPR_HID1, "HID1",
50953e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
50963e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
50973e770bf7SBruno Larsen (billionai) 0x00000000);
50983e770bf7SBruno Larsen (billionai) spr_register(env, SPR_970_HID5, "HID5",
50993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51003e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
51013e770bf7SBruno Larsen (billionai) POWERPC970_HID5_INIT);
51023e770bf7SBruno Larsen (billionai) }
51033e770bf7SBruno Larsen (billionai)
register_970_hior_sprs(CPUPPCState * env)51043e770bf7SBruno Larsen (billionai) static void register_970_hior_sprs(CPUPPCState *env)
51053e770bf7SBruno Larsen (billionai) {
5106a5116b95SNicholas Piggin spr_register(env, SPR_HIOR, "HIOR",
51073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51083e770bf7SBruno Larsen (billionai) &spr_read_hior, &spr_write_hior,
51093e770bf7SBruno Larsen (billionai) 0x00000000);
51103e770bf7SBruno Larsen (billionai) }
51113e770bf7SBruno Larsen (billionai)
register_book3s_ctrl_sprs(CPUPPCState * env)51123e770bf7SBruno Larsen (billionai) static void register_book3s_ctrl_sprs(CPUPPCState *env)
51133e770bf7SBruno Larsen (billionai) {
5114a5116b95SNicholas Piggin spr_register(env, SPR_CTRL, "CTRL",
51153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51167aeac354SDaniel Henrique Barboza SPR_NOACCESS, &spr_write_CTRL,
51173e770bf7SBruno Larsen (billionai) 0x00000000);
5118a5116b95SNicholas Piggin spr_register(env, SPR_UCTRL, "UCTRL",
51193e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
51203e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
51213e770bf7SBruno Larsen (billionai) 0x00000000);
51223e770bf7SBruno Larsen (billionai) }
51233e770bf7SBruno Larsen (billionai)
register_book3s_altivec_sprs(CPUPPCState * env)51243e770bf7SBruno Larsen (billionai) static void register_book3s_altivec_sprs(CPUPPCState *env)
51253e770bf7SBruno Larsen (billionai) {
51263e770bf7SBruno Larsen (billionai) if (!(env->insns_flags & PPC_ALTIVEC)) {
51273e770bf7SBruno Larsen (billionai) return;
51283e770bf7SBruno Larsen (billionai) }
51293e770bf7SBruno Larsen (billionai)
51303e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_VRSAVE, "VRSAVE",
5131fbda88f7SNicholas Piggin &spr_read_generic, &spr_write_generic32,
5132fbda88f7SNicholas Piggin &spr_read_generic, &spr_write_generic32,
51333e770bf7SBruno Larsen (billionai) KVM_REG_PPC_VRSAVE, 0x00000000);
51343e770bf7SBruno Larsen (billionai)
51353e770bf7SBruno Larsen (billionai) }
51363e770bf7SBruno Larsen (billionai)
register_book3s_dbg_sprs(CPUPPCState * env)51373e770bf7SBruno Larsen (billionai) static void register_book3s_dbg_sprs(CPUPPCState *env)
51383e770bf7SBruno Larsen (billionai) {
51393e770bf7SBruno Larsen (billionai) /*
51403e770bf7SBruno Larsen (billionai) * TODO: different specs define different scopes for these,
51413e770bf7SBruno Larsen (billionai) * will have to address this:
51423e770bf7SBruno Larsen (billionai) * 970: super/write and super/read
51433e770bf7SBruno Larsen (billionai) * powerisa 2.03..2.04: hypv/write and super/read.
51443e770bf7SBruno Larsen (billionai) * powerisa 2.05 and newer: hypv/write and hypv/read.
51453e770bf7SBruno Larsen (billionai) */
51463e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_DABR, "DABR",
51473e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51483e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
51493e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DABR, 0x00000000);
51503e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_DABRX, "DABRX",
51513e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51523e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
51533e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DABRX, 0x00000000);
51543e770bf7SBruno Larsen (billionai) }
51553e770bf7SBruno Larsen (billionai)
register_book3s_207_dbg_sprs(CPUPPCState * env)51563e770bf7SBruno Larsen (billionai) static void register_book3s_207_dbg_sprs(CPUPPCState *env)
51573e770bf7SBruno Larsen (billionai) {
51583e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_DAWR0, "DAWR0",
51593e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51603e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5161d5ee641cSNicholas Piggin &spr_read_generic, &spr_write_dawr0,
51623e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DAWR, 0x00000000);
51633e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_DAWRX0, "DAWRX0",
51643e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51653e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5166d5ee641cSNicholas Piggin &spr_read_generic, &spr_write_dawrx0,
51673e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DAWRX, 0x00000000);
51683e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_CIABR, "CIABR",
51693e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51703e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
517114192307SNicholas Piggin &spr_read_generic, &spr_write_ciabr,
51723e770bf7SBruno Larsen (billionai) KVM_REG_PPC_CIABR, 0x00000000);
51733e770bf7SBruno Larsen (billionai) }
51743e770bf7SBruno Larsen (billionai)
register_970_dbg_sprs(CPUPPCState * env)51753e770bf7SBruno Larsen (billionai) static void register_970_dbg_sprs(CPUPPCState *env)
51763e770bf7SBruno Larsen (billionai) {
51773e770bf7SBruno Larsen (billionai) /* Breakpoints */
51783e770bf7SBruno Larsen (billionai) spr_register(env, SPR_IABR, "IABR",
51793e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
51803e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
51813e770bf7SBruno Larsen (billionai) 0x00000000);
51823e770bf7SBruno Larsen (billionai) }
51833e770bf7SBruno Larsen (billionai)
register_book3s_pmu_sup_sprs(CPUPPCState * env)51843e770bf7SBruno Larsen (billionai) static void register_book3s_pmu_sup_sprs(CPUPPCState *env)
51853e770bf7SBruno Larsen (billionai) {
51863e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_MMCR0, "MMCR0",
51873e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5188c2eff582SDaniel Henrique Barboza &spr_read_generic, &spr_write_MMCR0,
5189c2eff582SDaniel Henrique Barboza KVM_REG_PPC_MMCR0, 0x80000000);
51903e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_MMCR1, "MMCR1",
51913e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5192a6f91249SDaniel Henrique Barboza &spr_read_generic, &spr_write_MMCR1,
51933e770bf7SBruno Larsen (billionai) KVM_REG_PPC_MMCR1, 0x00000000);
51943e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_MMCRA, "MMCRA",
51953e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5196a7138e28SGlenn Miles &spr_read_generic, &spr_write_MMCRA,
51973e770bf7SBruno Larsen (billionai) KVM_REG_PPC_MMCRA, 0x00000000);
51983e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_PMC1, "PMC1",
51993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5200308b9fadSDaniel Henrique Barboza &spr_read_PMC, &spr_write_PMC,
52013e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC1, 0x00000000);
52023e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_PMC2, "PMC2",
52033e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5204308b9fadSDaniel Henrique Barboza &spr_read_PMC, &spr_write_PMC,
52053e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC2, 0x00000000);
52063e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_PMC3, "PMC3",
52073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5208308b9fadSDaniel Henrique Barboza &spr_read_PMC, &spr_write_PMC,
52093e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC3, 0x00000000);
52103e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_PMC4, "PMC4",
52113e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5212308b9fadSDaniel Henrique Barboza &spr_read_PMC, &spr_write_PMC,
52133e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC4, 0x00000000);
52143e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_PMC5, "PMC5",
52153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5216308b9fadSDaniel Henrique Barboza &spr_read_PMC, &spr_write_PMC,
52173e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC5, 0x00000000);
52183e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_PMC6, "PMC6",
52193e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5220308b9fadSDaniel Henrique Barboza &spr_read_PMC, &spr_write_PMC,
52213e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC6, 0x00000000);
52223e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_SIAR, "SIAR",
52233e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
52243e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
52253e770bf7SBruno Larsen (billionai) KVM_REG_PPC_SIAR, 0x00000000);
52263e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_SDAR, "SDAR",
52273e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
52283e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
52293e770bf7SBruno Larsen (billionai) KVM_REG_PPC_SDAR, 0x00000000);
52303e770bf7SBruno Larsen (billionai) }
52313e770bf7SBruno Larsen (billionai)
register_book3s_pmu_user_sprs(CPUPPCState * env)52323e770bf7SBruno Larsen (billionai) static void register_book3s_pmu_user_sprs(CPUPPCState *env)
52333e770bf7SBruno Larsen (billionai) {
52343e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UMMCR0, "UMMCR0",
5235565cb109SGustavo Romero &spr_read_MMCR0_ureg, &spr_write_MMCR0_ureg,
52363e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
5237c2eff582SDaniel Henrique Barboza 0x80000000);
52383e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UMMCR1, "UMMCR1",
52393e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
52403e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52413e770bf7SBruno Larsen (billionai) 0x00000000);
52423e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UMMCRA, "UMMCRA",
52433e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
52443e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52453e770bf7SBruno Larsen (billionai) 0x00000000);
52463e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UPMC1, "UPMC1",
5247cedf7069SDaniel Henrique Barboza &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52483e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52493e770bf7SBruno Larsen (billionai) 0x00000000);
52503e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UPMC2, "UPMC2",
5251cedf7069SDaniel Henrique Barboza &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52523e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52533e770bf7SBruno Larsen (billionai) 0x00000000);
52543e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UPMC3, "UPMC3",
5255cedf7069SDaniel Henrique Barboza &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52563e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52573e770bf7SBruno Larsen (billionai) 0x00000000);
52583e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UPMC4, "UPMC4",
5259cedf7069SDaniel Henrique Barboza &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52603e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52613e770bf7SBruno Larsen (billionai) 0x00000000);
52623e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UPMC5, "UPMC5",
5263cedf7069SDaniel Henrique Barboza &spr_read_PMC56_ureg, &spr_write_PMC56_ureg,
52643e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52653e770bf7SBruno Larsen (billionai) 0x00000000);
52663e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UPMC6, "UPMC6",
5267cedf7069SDaniel Henrique Barboza &spr_read_PMC56_ureg, &spr_write_PMC56_ureg,
52683e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52693e770bf7SBruno Larsen (billionai) 0x00000000);
52703e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_USIAR, "USIAR",
52713e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
52723e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52733e770bf7SBruno Larsen (billionai) 0x00000000);
52743e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_USDAR, "USDAR",
52753e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
52763e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52773e770bf7SBruno Larsen (billionai) 0x00000000);
52783e770bf7SBruno Larsen (billionai) }
52793e770bf7SBruno Larsen (billionai)
register_970_pmu_sup_sprs(CPUPPCState * env)52803e770bf7SBruno Larsen (billionai) static void register_970_pmu_sup_sprs(CPUPPCState *env)
52813e770bf7SBruno Larsen (billionai) {
52823e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_970_PMC7, "PMC7",
52833e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
52843e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
52853e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC7, 0x00000000);
52863e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_970_PMC8, "PMC8",
52873e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
52883e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
52893e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PMC8, 0x00000000);
52903e770bf7SBruno Larsen (billionai) }
52913e770bf7SBruno Larsen (billionai)
register_970_pmu_user_sprs(CPUPPCState * env)52923e770bf7SBruno Larsen (billionai) static void register_970_pmu_user_sprs(CPUPPCState *env)
52933e770bf7SBruno Larsen (billionai) {
52943e770bf7SBruno Larsen (billionai) spr_register(env, SPR_970_UPMC7, "UPMC7",
52953e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
52963e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
52973e770bf7SBruno Larsen (billionai) 0x00000000);
52983e770bf7SBruno Larsen (billionai) spr_register(env, SPR_970_UPMC8, "UPMC8",
52993e770bf7SBruno Larsen (billionai) &spr_read_ureg, SPR_NOACCESS,
53003e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
53013e770bf7SBruno Larsen (billionai) 0x00000000);
53023e770bf7SBruno Larsen (billionai) }
53033e770bf7SBruno Larsen (billionai)
register_power8_pmu_sup_sprs(CPUPPCState * env)53043e770bf7SBruno Larsen (billionai) static void register_power8_pmu_sup_sprs(CPUPPCState *env)
53053e770bf7SBruno Larsen (billionai) {
53063e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_MMCR2, "MMCR2",
53073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53093e770bf7SBruno Larsen (billionai) KVM_REG_PPC_MMCR2, 0x00000000);
53103e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_MMCRS, "MMCRS",
53113e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53123e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53133e770bf7SBruno Larsen (billionai) KVM_REG_PPC_MMCRS, 0x00000000);
53143e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_SIER, "SIER",
53153e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53163e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53173e770bf7SBruno Larsen (billionai) KVM_REG_PPC_SIER, 0x00000000);
53183e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_SPMC1, "SPMC1",
53193e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53203e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53213e770bf7SBruno Larsen (billionai) KVM_REG_PPC_SPMC1, 0x00000000);
53223e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_POWER_SPMC2, "SPMC2",
53233e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53243e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53253e770bf7SBruno Larsen (billionai) KVM_REG_PPC_SPMC2, 0x00000000);
53263e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_TACR, "TACR",
53273e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53283e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53293e770bf7SBruno Larsen (billionai) KVM_REG_PPC_TACR, 0x00000000);
53303e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_TCSCR, "TCSCR",
53313e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53323e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53333e770bf7SBruno Larsen (billionai) KVM_REG_PPC_TCSCR, 0x00000000);
53343e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_CSIGR, "CSIGR",
53353e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53363e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53373e770bf7SBruno Larsen (billionai) KVM_REG_PPC_CSIGR, 0x00000000);
53383e770bf7SBruno Larsen (billionai) }
53393e770bf7SBruno Larsen (billionai)
register_power8_pmu_user_sprs(CPUPPCState * env)53403e770bf7SBruno Larsen (billionai) static void register_power8_pmu_user_sprs(CPUPPCState *env)
53413e770bf7SBruno Larsen (billionai) {
53423e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_UMMCR2, "UMMCR2",
53437b3ecf16SDaniel Henrique Barboza &spr_read_MMCR2_ureg, &spr_write_MMCR2_ureg,
53443e770bf7SBruno Larsen (billionai) &spr_read_ureg, &spr_write_ureg,
53453e770bf7SBruno Larsen (billionai) 0x00000000);
53463e770bf7SBruno Larsen (billionai) spr_register(env, SPR_POWER_USIER, "USIER",
53473e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
53483e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53493e770bf7SBruno Larsen (billionai) 0x00000000);
53503e770bf7SBruno Larsen (billionai) }
53513e770bf7SBruno Larsen (billionai)
register_power10_pmu_sup_sprs(CPUPPCState * env)53520b889323SMadhavan Srinivasan static void register_power10_pmu_sup_sprs(CPUPPCState *env)
53530b889323SMadhavan Srinivasan {
53540b889323SMadhavan Srinivasan spr_register_kvm(env, SPR_POWER_MMCR3, "MMCR3",
53550b889323SMadhavan Srinivasan SPR_NOACCESS, SPR_NOACCESS,
53560b889323SMadhavan Srinivasan &spr_read_generic, &spr_write_generic,
53570b889323SMadhavan Srinivasan KVM_REG_PPC_MMCR3, 0x00000000);
53580b889323SMadhavan Srinivasan spr_register_kvm(env, SPR_POWER_SIER2, "SIER2",
53590b889323SMadhavan Srinivasan SPR_NOACCESS, SPR_NOACCESS,
53600b889323SMadhavan Srinivasan &spr_read_generic, &spr_write_generic,
53610b889323SMadhavan Srinivasan KVM_REG_PPC_SIER2, 0x00000000);
53620b889323SMadhavan Srinivasan spr_register_kvm(env, SPR_POWER_SIER3, "SIER3",
53630b889323SMadhavan Srinivasan SPR_NOACCESS, SPR_NOACCESS,
53640b889323SMadhavan Srinivasan &spr_read_generic, &spr_write_generic,
53650b889323SMadhavan Srinivasan KVM_REG_PPC_SIER3, 0x00000000);
53660b889323SMadhavan Srinivasan }
53670b889323SMadhavan Srinivasan
register_power10_pmu_user_sprs(CPUPPCState * env)53680b889323SMadhavan Srinivasan static void register_power10_pmu_user_sprs(CPUPPCState *env)
53690b889323SMadhavan Srinivasan {
53700b889323SMadhavan Srinivasan spr_register(env, SPR_POWER_UMMCR3, "UMMCR3",
53710b889323SMadhavan Srinivasan &spr_read_generic, &spr_write_generic,
53720b889323SMadhavan Srinivasan &spr_read_generic, &spr_write_generic,
53730b889323SMadhavan Srinivasan 0x00000000);
53740b889323SMadhavan Srinivasan spr_register(env, SPR_POWER_USIER2, "USIER2",
53750b889323SMadhavan Srinivasan &spr_read_generic, SPR_NOACCESS,
53760b889323SMadhavan Srinivasan &spr_read_generic, &spr_write_generic,
53770b889323SMadhavan Srinivasan 0x00000000);
53780b889323SMadhavan Srinivasan spr_register(env, SPR_POWER_USIER3, "USIER3",
53790b889323SMadhavan Srinivasan &spr_read_generic, SPR_NOACCESS,
53800b889323SMadhavan Srinivasan &spr_read_generic, &spr_write_generic,
53810b889323SMadhavan Srinivasan 0x00000000);
53820b889323SMadhavan Srinivasan }
53830b889323SMadhavan Srinivasan
register_power5p_ear_sprs(CPUPPCState * env)53843e770bf7SBruno Larsen (billionai) static void register_power5p_ear_sprs(CPUPPCState *env)
53853e770bf7SBruno Larsen (billionai) {
53863e770bf7SBruno Larsen (billionai) /* External access control */
53873e770bf7SBruno Larsen (billionai) spr_register(env, SPR_EAR, "EAR",
53883e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53893e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
53903e770bf7SBruno Larsen (billionai) 0x00000000);
53913e770bf7SBruno Larsen (billionai) }
53923e770bf7SBruno Larsen (billionai)
register_power5p_tb_sprs(CPUPPCState * env)53933e770bf7SBruno Larsen (billionai) static void register_power5p_tb_sprs(CPUPPCState *env)
53943e770bf7SBruno Larsen (billionai) {
53953e770bf7SBruno Larsen (billionai) /* TBU40 (High 40 bits of the Timebase register */
53963e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_TBU40, "TBU40",
53973e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53983e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
53993e770bf7SBruno Larsen (billionai) SPR_NOACCESS, &spr_write_tbu40,
54003e770bf7SBruno Larsen (billionai) 0x00000000);
54013e770bf7SBruno Larsen (billionai) }
54023e770bf7SBruno Larsen (billionai)
register_970_lpar_sprs(CPUPPCState * env)54033e770bf7SBruno Larsen (billionai) static void register_970_lpar_sprs(CPUPPCState *env)
54043e770bf7SBruno Larsen (billionai) {
54053e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
54063e770bf7SBruno Larsen (billionai) /*
54073e770bf7SBruno Larsen (billionai) * PPC970: HID4 covers things later controlled by the LPCR and
54083e770bf7SBruno Larsen (billionai) * RMOR in later CPUs, but with a different encoding. We only
54093e770bf7SBruno Larsen (billionai) * support the 970 in "Apple mode" which has all hypervisor
54103e770bf7SBruno Larsen (billionai) * facilities disabled by strapping, so we can basically just
54113e770bf7SBruno Larsen (billionai) * ignore it
54123e770bf7SBruno Larsen (billionai) */
54133e770bf7SBruno Larsen (billionai) spr_register(env, SPR_970_HID4, "HID4",
54143e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54153e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54163e770bf7SBruno Larsen (billionai) 0x00000000);
54173e770bf7SBruno Larsen (billionai) #endif
54183e770bf7SBruno Larsen (billionai) }
54193e770bf7SBruno Larsen (billionai)
register_power5p_lpar_sprs(CPUPPCState * env)54203e770bf7SBruno Larsen (billionai) static void register_power5p_lpar_sprs(CPUPPCState *env)
54213e770bf7SBruno Larsen (billionai) {
54223e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
5423e6a19a64SMichael Tokarev /* Logical partitioning */
54243e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_LPCR, "LPCR",
54253e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54263e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54273e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_lpcr,
54283e770bf7SBruno Larsen (billionai) KVM_REG_PPC_LPCR, LPCR_LPES0 | LPCR_LPES1);
54293e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HDEC, "HDEC",
54303e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54313e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54323e770bf7SBruno Larsen (billionai) &spr_read_hdecr, &spr_write_hdecr, 0);
54333e770bf7SBruno Larsen (billionai) #endif
54343e770bf7SBruno Larsen (billionai) }
54353e770bf7SBruno Larsen (billionai)
register_book3s_ids_sprs(CPUPPCState * env)54363e770bf7SBruno Larsen (billionai) static void register_book3s_ids_sprs(CPUPPCState *env)
54373e770bf7SBruno Larsen (billionai) {
54383e770bf7SBruno Larsen (billionai) /* FIXME: Will need to deal with thread vs core only SPRs */
54393e770bf7SBruno Larsen (billionai)
54403e770bf7SBruno Larsen (billionai) /* Processor identification */
54413e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_PIR, "PIR",
54423e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54433e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
54443e770bf7SBruno Larsen (billionai) &spr_read_generic, NULL,
54453e770bf7SBruno Larsen (billionai) 0x00000000);
54463e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_LPIDR, "LPIDR",
54473e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54483e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54493e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_lpidr,
54503e770bf7SBruno Larsen (billionai) 0x00000000);
54513e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HFSCR, "HFSCR",
54523e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54533e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54543e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54553e770bf7SBruno Larsen (billionai) 0x00000000);
54563e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_MMCRC, "MMCRC",
54573e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54583e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5459e5c2ac9dSNicholas Piggin &spr_read_generic, &spr_core_write_generic32,
54603e770bf7SBruno Larsen (billionai) 0x00000000);
54613e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_MMCRH, "MMCRH",
54623e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54633e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54643e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54653e770bf7SBruno Larsen (billionai) 0x00000000);
54663e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HSPRG0, "HSPRG0",
54673e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54683e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54693e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54703e770bf7SBruno Larsen (billionai) 0x00000000);
54713e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HSPRG1, "HSPRG1",
54723e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54733e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54743e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54753e770bf7SBruno Larsen (billionai) 0x00000000);
54763e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HSRR0, "HSRR0",
54773e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54783e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54793e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54803e770bf7SBruno Larsen (billionai) 0x00000000);
54813e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HSRR1, "HSRR1",
54823e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54833e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54843e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54853e770bf7SBruno Larsen (billionai) 0x00000000);
54863e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HDAR, "HDAR",
54873e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54883e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54893e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
54903e770bf7SBruno Larsen (billionai) 0x00000000);
54913e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HDSISR, "HDSISR",
54923e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54933e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5494fbda88f7SNicholas Piggin &spr_read_generic, &spr_write_generic32,
54953e770bf7SBruno Larsen (billionai) 0x00000000);
54963e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_HRMOR, "HRMOR",
54973e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
54983e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5499e5c2ac9dSNicholas Piggin &spr_read_generic, &spr_core_write_generic,
55003e770bf7SBruno Larsen (billionai) 0x00000000);
55013e770bf7SBruno Larsen (billionai) }
55023e770bf7SBruno Larsen (billionai)
register_rmor_sprs(CPUPPCState * env)55033e770bf7SBruno Larsen (billionai) static void register_rmor_sprs(CPUPPCState *env)
55043e770bf7SBruno Larsen (billionai) {
55053e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_RMOR, "RMOR",
55063e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
55073e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
55083e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
55093e770bf7SBruno Larsen (billionai) 0x00000000);
55103e770bf7SBruno Larsen (billionai) }
55113e770bf7SBruno Larsen (billionai)
register_power8_ids_sprs(CPUPPCState * env)55123e770bf7SBruno Larsen (billionai) static void register_power8_ids_sprs(CPUPPCState *env)
55133e770bf7SBruno Larsen (billionai) {
55143e770bf7SBruno Larsen (billionai) /* Thread identification */
55153e770bf7SBruno Larsen (billionai) spr_register(env, SPR_TIR, "TIR",
55163e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
55173e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
55183e770bf7SBruno Larsen (billionai) 0x00000000);
55193e770bf7SBruno Larsen (billionai) }
55203e770bf7SBruno Larsen (billionai)
register_book3s_purr_sprs(CPUPPCState * env)55213e770bf7SBruno Larsen (billionai) static void register_book3s_purr_sprs(CPUPPCState *env)
55223e770bf7SBruno Larsen (billionai) {
55233e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
55243e770bf7SBruno Larsen (billionai) /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
55253e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_PURR, "PURR",
55263e770bf7SBruno Larsen (billionai) &spr_read_purr, SPR_NOACCESS,
55273e770bf7SBruno Larsen (billionai) &spr_read_purr, SPR_NOACCESS,
55283e770bf7SBruno Larsen (billionai) &spr_read_purr, &spr_write_purr,
55293e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PURR, 0x00000000);
55303e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_SPURR, "SPURR",
55313e770bf7SBruno Larsen (billionai) &spr_read_purr, SPR_NOACCESS,
55323e770bf7SBruno Larsen (billionai) &spr_read_purr, SPR_NOACCESS,
55333e770bf7SBruno Larsen (billionai) &spr_read_purr, &spr_write_purr,
55343e770bf7SBruno Larsen (billionai) KVM_REG_PPC_SPURR, 0x00000000);
55353e770bf7SBruno Larsen (billionai) #endif
55363e770bf7SBruno Larsen (billionai) }
55373e770bf7SBruno Larsen (billionai)
register_power6_dbg_sprs(CPUPPCState * env)55383e770bf7SBruno Larsen (billionai) static void register_power6_dbg_sprs(CPUPPCState *env)
55393e770bf7SBruno Larsen (billionai) {
55403e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
5541a5116b95SNicholas Piggin spr_register(env, SPR_CFAR, "CFAR",
55423e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
55433e770bf7SBruno Larsen (billionai) &spr_read_cfar, &spr_write_cfar,
55443e770bf7SBruno Larsen (billionai) 0x00000000);
55453e770bf7SBruno Larsen (billionai) #endif
55463e770bf7SBruno Larsen (billionai) }
55473e770bf7SBruno Larsen (billionai)
register_power5p_common_sprs(CPUPPCState * env)55483e770bf7SBruno Larsen (billionai) static void register_power5p_common_sprs(CPUPPCState *env)
55493e770bf7SBruno Larsen (billionai) {
55503e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_PPR, "PPR",
55513e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
55523e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
55533e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PPR, 0x00000000);
55543e770bf7SBruno Larsen (billionai) }
55553e770bf7SBruno Larsen (billionai)
register_power6_common_sprs(CPUPPCState * env)55563e770bf7SBruno Larsen (billionai) static void register_power6_common_sprs(CPUPPCState *env)
55573e770bf7SBruno Larsen (billionai) {
55583e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
5559a5116b95SNicholas Piggin spr_register_kvm(env, SPR_DSCR, "DSCR",
55603e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
55613e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
55623e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DSCR, 0x00000000);
55633e770bf7SBruno Larsen (billionai) #endif
55643e770bf7SBruno Larsen (billionai) /*
55653e770bf7SBruno Larsen (billionai) * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
55663e770bf7SBruno Larsen (billionai) * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
55673e770bf7SBruno Larsen (billionai) */
55683e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_PCR, "PCR",
55693e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
55703e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
55713e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_pcr,
55723e770bf7SBruno Larsen (billionai) 0x00000000);
55733e770bf7SBruno Larsen (billionai) }
55743e770bf7SBruno Larsen (billionai)
register_HEIR32_spr(CPUPPCState * env)5575a3c020d8SNicholas Piggin static void register_HEIR32_spr(CPUPPCState *env)
5576a3c020d8SNicholas Piggin {
5577a3c020d8SNicholas Piggin spr_register_hv(env, SPR_HEIR, "HEIR",
5578a3c020d8SNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5579a3c020d8SNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5580a3c020d8SNicholas Piggin &spr_read_generic, &spr_write_generic32,
5581a3c020d8SNicholas Piggin 0x00000000);
5582a3c020d8SNicholas Piggin }
5583a3c020d8SNicholas Piggin
register_HEIR64_spr(CPUPPCState * env)5584a3c020d8SNicholas Piggin static void register_HEIR64_spr(CPUPPCState *env)
5585a3c020d8SNicholas Piggin {
5586a3c020d8SNicholas Piggin spr_register_hv(env, SPR_HEIR, "HEIR",
5587a3c020d8SNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5588a3c020d8SNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5589a3c020d8SNicholas Piggin &spr_read_generic, &spr_write_generic,
5590a3c020d8SNicholas Piggin 0x00000000);
5591a3c020d8SNicholas Piggin }
5592a3c020d8SNicholas Piggin
register_power7_common_sprs(CPUPPCState * env)55931cbcbcb8SNicholas Piggin static void register_power7_common_sprs(CPUPPCState *env)
55941cbcbcb8SNicholas Piggin {
55951cbcbcb8SNicholas Piggin spr_register(env, SPR_PPR32, "PPR32",
55961cbcbcb8SNicholas Piggin &spr_read_ppr32, &spr_write_ppr32,
55971cbcbcb8SNicholas Piggin &spr_read_ppr32, &spr_write_ppr32,
55981cbcbcb8SNicholas Piggin 0x00000000);
55991cbcbcb8SNicholas Piggin }
56001cbcbcb8SNicholas Piggin
register_power8_tce_address_control_sprs(CPUPPCState * env)56013e770bf7SBruno Larsen (billionai) static void register_power8_tce_address_control_sprs(CPUPPCState *env)
56023e770bf7SBruno Larsen (billionai) {
56033e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_TAR, "TAR",
56043e770bf7SBruno Larsen (billionai) &spr_read_tar, &spr_write_tar,
56053e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
56063e770bf7SBruno Larsen (billionai) KVM_REG_PPC_TAR, 0x00000000);
56073e770bf7SBruno Larsen (billionai) }
56083e770bf7SBruno Larsen (billionai)
register_power8_tm_sprs(CPUPPCState * env)56093e770bf7SBruno Larsen (billionai) static void register_power8_tm_sprs(CPUPPCState *env)
56103e770bf7SBruno Larsen (billionai) {
56113e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_TFHAR, "TFHAR",
56123e770bf7SBruno Larsen (billionai) &spr_read_tm, &spr_write_tm,
56133e770bf7SBruno Larsen (billionai) &spr_read_tm, &spr_write_tm,
56143e770bf7SBruno Larsen (billionai) KVM_REG_PPC_TFHAR, 0x00000000);
56153e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_TFIAR, "TFIAR",
56163e770bf7SBruno Larsen (billionai) &spr_read_tm, &spr_write_tm,
56173e770bf7SBruno Larsen (billionai) &spr_read_tm, &spr_write_tm,
56183e770bf7SBruno Larsen (billionai) KVM_REG_PPC_TFIAR, 0x00000000);
56193e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_TEXASR, "TEXASR",
56203e770bf7SBruno Larsen (billionai) &spr_read_tm, &spr_write_tm,
56213e770bf7SBruno Larsen (billionai) &spr_read_tm, &spr_write_tm,
56223e770bf7SBruno Larsen (billionai) KVM_REG_PPC_TEXASR, 0x00000000);
56233e770bf7SBruno Larsen (billionai) spr_register(env, SPR_TEXASRU, "TEXASRU",
56243e770bf7SBruno Larsen (billionai) &spr_read_tm_upper32, &spr_write_tm_upper32,
56253e770bf7SBruno Larsen (billionai) &spr_read_tm_upper32, &spr_write_tm_upper32,
56263e770bf7SBruno Larsen (billionai) 0x00000000);
56273e770bf7SBruno Larsen (billionai) }
56283e770bf7SBruno Larsen (billionai)
register_power8_ebb_sprs(CPUPPCState * env)56293e770bf7SBruno Larsen (billionai) static void register_power8_ebb_sprs(CPUPPCState *env)
56303e770bf7SBruno Larsen (billionai) {
56313e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BESCRS, "BESCRS",
56323e770bf7SBruno Larsen (billionai) &spr_read_ebb, &spr_write_ebb,
56333e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
56343e770bf7SBruno Larsen (billionai) 0x00000000);
56353e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BESCRSU, "BESCRSU",
56363e770bf7SBruno Larsen (billionai) &spr_read_ebb_upper32, &spr_write_ebb_upper32,
56373e770bf7SBruno Larsen (billionai) &spr_read_prev_upper32, &spr_write_prev_upper32,
56383e770bf7SBruno Larsen (billionai) 0x00000000);
56393e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BESCRR, "BESCRR",
56403e770bf7SBruno Larsen (billionai) &spr_read_ebb, &spr_write_ebb,
56413e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
56423e770bf7SBruno Larsen (billionai) 0x00000000);
56433e770bf7SBruno Larsen (billionai) spr_register(env, SPR_BESCRRU, "BESCRRU",
56443e770bf7SBruno Larsen (billionai) &spr_read_ebb_upper32, &spr_write_ebb_upper32,
56453e770bf7SBruno Larsen (billionai) &spr_read_prev_upper32, &spr_write_prev_upper32,
56463e770bf7SBruno Larsen (billionai) 0x00000000);
56473e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_EBBHR, "EBBHR",
56483e770bf7SBruno Larsen (billionai) &spr_read_ebb, &spr_write_ebb,
56493e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
56503e770bf7SBruno Larsen (billionai) KVM_REG_PPC_EBBHR, 0x00000000);
56513e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_EBBRR, "EBBRR",
56523e770bf7SBruno Larsen (billionai) &spr_read_ebb, &spr_write_ebb,
56533e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
56543e770bf7SBruno Larsen (billionai) KVM_REG_PPC_EBBRR, 0x00000000);
56553e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_BESCR, "BESCR",
56563e770bf7SBruno Larsen (billionai) &spr_read_ebb, &spr_write_ebb,
56573e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
56583e770bf7SBruno Larsen (billionai) KVM_REG_PPC_BESCR, 0x00000000);
56593e770bf7SBruno Larsen (billionai) }
56603e770bf7SBruno Larsen (billionai)
56613e770bf7SBruno Larsen (billionai) /* Virtual Time Base */
register_vtb_sprs(CPUPPCState * env)56623e770bf7SBruno Larsen (billionai) static void register_vtb_sprs(CPUPPCState *env)
56633e770bf7SBruno Larsen (billionai) {
56643e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_VTB, "VTB",
56653e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
56663e770bf7SBruno Larsen (billionai) &spr_read_vtb, SPR_NOACCESS,
56673e770bf7SBruno Larsen (billionai) &spr_read_vtb, &spr_write_vtb,
56683e770bf7SBruno Larsen (billionai) KVM_REG_PPC_VTB, 0x00000000);
56693e770bf7SBruno Larsen (billionai) }
56703e770bf7SBruno Larsen (billionai)
register_power8_fscr_sprs(CPUPPCState * env)56713e770bf7SBruno Larsen (billionai) static void register_power8_fscr_sprs(CPUPPCState *env)
56723e770bf7SBruno Larsen (billionai) {
56733e770bf7SBruno Larsen (billionai) #if defined(CONFIG_USER_ONLY)
56743e770bf7SBruno Larsen (billionai) target_ulong initval = 1ULL << FSCR_TAR;
56753e770bf7SBruno Larsen (billionai) #else
56763e770bf7SBruno Larsen (billionai) target_ulong initval = 0;
56773e770bf7SBruno Larsen (billionai) #endif
56783e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_FSCR, "FSCR",
56793e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
56803e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
56813e770bf7SBruno Larsen (billionai) KVM_REG_PPC_FSCR, initval);
56823e770bf7SBruno Larsen (billionai) }
56833e770bf7SBruno Larsen (billionai)
register_power8_pspb_sprs(CPUPPCState * env)56843e770bf7SBruno Larsen (billionai) static void register_power8_pspb_sprs(CPUPPCState *env)
56853e770bf7SBruno Larsen (billionai) {
56863e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_PSPB, "PSPB",
56873e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
56883e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic32,
56893e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PSPB, 0);
56903e770bf7SBruno Larsen (billionai) }
56913e770bf7SBruno Larsen (billionai)
register_power8_dpdes_sprs(CPUPPCState * env)56923e770bf7SBruno Larsen (billionai) static void register_power8_dpdes_sprs(CPUPPCState *env)
56933e770bf7SBruno Larsen (billionai) {
56943e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
56953e770bf7SBruno Larsen (billionai) /* Directed Privileged Door-bell Exception State, used for IPI */
56963e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_DPDES, "DPDES",
56973e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
56983e770bf7SBruno Larsen (billionai) &spr_read_dpdes, SPR_NOACCESS,
56993e770bf7SBruno Larsen (billionai) &spr_read_dpdes, &spr_write_dpdes,
57003e770bf7SBruno Larsen (billionai) KVM_REG_PPC_DPDES, 0x00000000);
57013e770bf7SBruno Larsen (billionai) #endif
57023e770bf7SBruno Larsen (billionai) }
57033e770bf7SBruno Larsen (billionai)
register_power8_ic_sprs(CPUPPCState * env)57043e770bf7SBruno Larsen (billionai) static void register_power8_ic_sprs(CPUPPCState *env)
57053e770bf7SBruno Larsen (billionai) {
57063e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
57073e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_IC, "IC",
57083e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
57093e770bf7SBruno Larsen (billionai) &spr_read_generic, SPR_NOACCESS,
57103e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
57113e770bf7SBruno Larsen (billionai) 0);
57123e770bf7SBruno Larsen (billionai) #endif
57133e770bf7SBruno Larsen (billionai) }
57143e770bf7SBruno Larsen (billionai)
57156f967f4fSNicholas Piggin /* SPRs specific to IBM POWER CPUs */
register_power_common_book4_sprs(CPUPPCState * env)57166f967f4fSNicholas Piggin static void register_power_common_book4_sprs(CPUPPCState *env)
57176f967f4fSNicholas Piggin {
57186f967f4fSNicholas Piggin #if !defined(CONFIG_USER_ONLY)
57196f967f4fSNicholas Piggin spr_register_hv(env, SPR_HID0, "HID0",
57206f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57216f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57229cdfd1b9SNicholas Piggin &spr_read_generic, &spr_core_write_generic,
57236f967f4fSNicholas Piggin 0x00000000);
57246f967f4fSNicholas Piggin spr_register_hv(env, SPR_TSCR, "TSCR",
57256f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57266f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5727e5c2ac9dSNicholas Piggin &spr_read_generic, &spr_core_write_generic32,
57286f967f4fSNicholas Piggin 0x00000000);
57296f967f4fSNicholas Piggin spr_register_hv(env, SPR_HMER, "HMER",
57306f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57316f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57326f967f4fSNicholas Piggin &spr_read_generic, &spr_write_hmer,
57336f967f4fSNicholas Piggin 0x00000000);
57346f967f4fSNicholas Piggin spr_register_hv(env, SPR_HMEER, "HMEER",
57356f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57366f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5737e5c2ac9dSNicholas Piggin &spr_read_generic, &spr_core_write_generic,
57386f967f4fSNicholas Piggin 0x00000000);
57396f967f4fSNicholas Piggin spr_register_hv(env, SPR_TFMR, "TFMR",
57406f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57416f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5742b25f2ffaSNicholas Piggin &spr_read_tfmr, &spr_write_tfmr,
57436f967f4fSNicholas Piggin 0x00000000);
574499837aa8SJoel Stanley spr_register_hv(env, SPR_TRIG1, "TRIG1",
574599837aa8SJoel Stanley SPR_NOACCESS, SPR_NOACCESS,
574699837aa8SJoel Stanley &spr_access_nop, &spr_write_generic,
574799837aa8SJoel Stanley &spr_access_nop, &spr_write_generic,
574899837aa8SJoel Stanley 0x00000000);
574999837aa8SJoel Stanley spr_register_hv(env, SPR_TRIG2, "TRIG2",
575099837aa8SJoel Stanley SPR_NOACCESS, SPR_NOACCESS,
575199837aa8SJoel Stanley &spr_access_nop, &spr_write_generic,
575299837aa8SJoel Stanley &spr_access_nop, &spr_write_generic,
575399837aa8SJoel Stanley 0x00000000);
5754c9d5aedfSNicholas Piggin spr_register_hv(env, SPR_LDBAR, "LDBAR",
5755c9d5aedfSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5756c9d5aedfSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5757c9d5aedfSNicholas Piggin &spr_read_generic, &spr_core_lpar_write_generic,
5758c9d5aedfSNicholas Piggin 0x00000000);
5759c9d5aedfSNicholas Piggin spr_register_hv(env, SPR_POWER_TTR, "TTR",
5760c9d5aedfSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5761c9d5aedfSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
5762c9d5aedfSNicholas Piggin &spr_read_generic, &spr_core_write_generic,
5763c9d5aedfSNicholas Piggin 0x00000000);
57646f967f4fSNicholas Piggin #endif
57656f967f4fSNicholas Piggin }
57666f967f4fSNicholas Piggin
register_power9_book4_sprs(CPUPPCState * env)57676f967f4fSNicholas Piggin static void register_power9_book4_sprs(CPUPPCState *env)
57686f967f4fSNicholas Piggin {
57696f967f4fSNicholas Piggin /* Add a number of P9 book4 registers */
57706f967f4fSNicholas Piggin register_power_common_book4_sprs(env);
57716f967f4fSNicholas Piggin #if !defined(CONFIG_USER_ONLY)
57726f967f4fSNicholas Piggin spr_register_kvm(env, SPR_WORT, "WORT",
57736f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
57746f967f4fSNicholas Piggin &spr_read_generic, &spr_write_generic,
57756f967f4fSNicholas Piggin KVM_REG_PPC_WORT, 0);
57766f967f4fSNicholas Piggin #endif
57776f967f4fSNicholas Piggin }
57786f967f4fSNicholas Piggin
register_power8_book4_sprs(CPUPPCState * env)57793e770bf7SBruno Larsen (billionai) static void register_power8_book4_sprs(CPUPPCState *env)
57803e770bf7SBruno Larsen (billionai) {
57813e770bf7SBruno Larsen (billionai) /* Add a number of P8 book4 registers */
57826f967f4fSNicholas Piggin register_power_common_book4_sprs(env);
57833e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
57843e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_ACOP, "ACOP",
57853e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
57863e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
57873e770bf7SBruno Larsen (billionai) KVM_REG_PPC_ACOP, 0);
57886f967f4fSNicholas Piggin /* PID is only in BookE in ISA v2.07 */
5789a5116b95SNicholas Piggin spr_register_kvm(env, SPR_BOOKS_PID, "PIDR",
57903e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
57913e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_pidr,
57923e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PID, 0);
57933e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_WORT, "WORT",
57943e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
57953e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
57963e770bf7SBruno Larsen (billionai) KVM_REG_PPC_WORT, 0);
579760d30cffSNicholas Piggin /* SPRC/SPRD exist in earlier CPUs but only tested on POWER9/10 */
579860d30cffSNicholas Piggin spr_register_hv(env, SPR_POWER_SPRC, "SPRC",
579960d30cffSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
580060d30cffSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
580160d30cffSNicholas Piggin &spr_read_generic, &spr_write_sprc,
580260d30cffSNicholas Piggin 0x00000000);
580360d30cffSNicholas Piggin spr_register_hv(env, SPR_POWER_SPRD, "SPRD",
580460d30cffSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
580560d30cffSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
580660d30cffSNicholas Piggin &spr_read_sprd, &spr_write_sprd,
580760d30cffSNicholas Piggin 0x00000000);
58083e770bf7SBruno Larsen (billionai) #endif
58093e770bf7SBruno Larsen (billionai) }
58103e770bf7SBruno Larsen (billionai)
register_power7_book4_sprs(CPUPPCState * env)58113e770bf7SBruno Larsen (billionai) static void register_power7_book4_sprs(CPUPPCState *env)
58123e770bf7SBruno Larsen (billionai) {
58133e770bf7SBruno Larsen (billionai) /* Add a number of P7 book4 registers */
58143e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
58156f967f4fSNicholas Piggin register_power_common_book4_sprs(env);
58163e770bf7SBruno Larsen (billionai) spr_register_kvm(env, SPR_ACOP, "ACOP",
58173e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
58183e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
58193e770bf7SBruno Larsen (billionai) KVM_REG_PPC_ACOP, 0);
58206f967f4fSNicholas Piggin /* PID is only in BookE in ISA v2.06 */
5821a5116b95SNicholas Piggin spr_register_kvm(env, SPR_BOOKS_PID, "PIDR",
58223e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5823fbda88f7SNicholas Piggin &spr_read_generic, &spr_write_generic32,
58243e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PID, 0);
58253e770bf7SBruno Larsen (billionai) #endif
58263e770bf7SBruno Larsen (billionai) }
58273e770bf7SBruno Larsen (billionai)
register_power8_rpr_sprs(CPUPPCState * env)58283e770bf7SBruno Larsen (billionai) static void register_power8_rpr_sprs(CPUPPCState *env)
58293e770bf7SBruno Larsen (billionai) {
58303e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
58313e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_RPR, "RPR",
58323e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
58333e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
5834e5c2ac9dSNicholas Piggin &spr_read_generic, &spr_core_write_generic,
58353e770bf7SBruno Larsen (billionai) 0x00000103070F1F3F);
58363e770bf7SBruno Larsen (billionai) #endif
58373e770bf7SBruno Larsen (billionai) }
58383e770bf7SBruno Larsen (billionai)
register_power9_mmu_sprs(CPUPPCState * env)58393e770bf7SBruno Larsen (billionai) static void register_power9_mmu_sprs(CPUPPCState *env)
58403e770bf7SBruno Larsen (billionai) {
58413e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
58423e770bf7SBruno Larsen (billionai) /* Partition Table Control */
58433e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_PTCR, "PTCR",
58443e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
58453e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
58463e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_ptcr,
58473e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PTCR, 0x00000000);
58483e770bf7SBruno Larsen (billionai) /* Address Segment Descriptor Register */
58493e770bf7SBruno Larsen (billionai) spr_register_hv(env, SPR_ASDR, "ASDR",
58503e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
58513e770bf7SBruno Larsen (billionai) SPR_NOACCESS, SPR_NOACCESS,
58523e770bf7SBruno Larsen (billionai) &spr_read_generic, &spr_write_generic,
58533e770bf7SBruno Larsen (billionai) 0x0000000000000000);
58546f967f4fSNicholas Piggin /* PID is part of the BookS ISA from v3.0 */
5855a5116b95SNicholas Piggin spr_register_kvm(env, SPR_BOOKS_PID, "PIDR",
58566f967f4fSNicholas Piggin SPR_NOACCESS, SPR_NOACCESS,
58576f967f4fSNicholas Piggin &spr_read_generic, &spr_write_pidr,
58586f967f4fSNicholas Piggin KVM_REG_PPC_PID, 0);
58593e770bf7SBruno Larsen (billionai) #endif
58603e770bf7SBruno Larsen (billionai) }
58613e770bf7SBruno Larsen (billionai)
register_power10_hash_sprs(CPUPPCState * env)5862903f84ebSVíctor Colombo static void register_power10_hash_sprs(CPUPPCState *env)
5863903f84ebSVíctor Colombo {
5864903f84ebSVíctor Colombo /*
5865e6a19a64SMichael Tokarev * it's the OS responsibility to generate a random value for the registers
5866903f84ebSVíctor Colombo * in each process' context. So, initialize it with 0 here.
5867903f84ebSVíctor Colombo */
5868903f84ebSVíctor Colombo uint64_t hashkeyr_initial_value = 0, hashpkeyr_initial_value = 0;
5869903f84ebSVíctor Colombo #if defined(CONFIG_USER_ONLY)
5870903f84ebSVíctor Colombo /* in linux-user, setup the hash register with a random value */
5871903f84ebSVíctor Colombo GRand *rand = g_rand_new();
5872903f84ebSVíctor Colombo hashkeyr_initial_value =
5873903f84ebSVíctor Colombo ((uint64_t)g_rand_int(rand) << 32) | (uint64_t)g_rand_int(rand);
5874903f84ebSVíctor Colombo hashpkeyr_initial_value =
5875903f84ebSVíctor Colombo ((uint64_t)g_rand_int(rand) << 32) | (uint64_t)g_rand_int(rand);
5876903f84ebSVíctor Colombo g_rand_free(rand);
5877903f84ebSVíctor Colombo #endif
5878843b243fSShivaprasad G Bhat spr_register_kvm(env, SPR_HASHKEYR, "HASHKEYR",
5879903f84ebSVíctor Colombo SPR_NOACCESS, SPR_NOACCESS,
5880903f84ebSVíctor Colombo &spr_read_generic, &spr_write_generic,
5881843b243fSShivaprasad G Bhat KVM_REG_PPC_HASHKEYR, hashkeyr_initial_value);
5882c0840b46SShivaprasad G Bhat spr_register_kvm_hv(env, SPR_HASHPKEYR, "HASHPKEYR",
5883903f84ebSVíctor Colombo SPR_NOACCESS, SPR_NOACCESS,
5884903f84ebSVíctor Colombo SPR_NOACCESS, SPR_NOACCESS,
5885903f84ebSVíctor Colombo &spr_read_generic, &spr_write_generic,
5886c0840b46SShivaprasad G Bhat KVM_REG_PPC_HASHPKEYR, hashpkeyr_initial_value);
5887903f84ebSVíctor Colombo }
5888903f84ebSVíctor Colombo
register_power10_dexcr_sprs(CPUPPCState * env)5889395b5d5bSNicholas Miehlbradt static void register_power10_dexcr_sprs(CPUPPCState *env)
5890395b5d5bSNicholas Miehlbradt {
5891ca85beb4SShivaprasad G Bhat spr_register_kvm(env, SPR_DEXCR, "DEXCR",
5892395b5d5bSNicholas Miehlbradt SPR_NOACCESS, SPR_NOACCESS,
5893ca85beb4SShivaprasad G Bhat &spr_read_generic, &spr_write_generic, KVM_REG_PPC_DEXCR,
5894395b5d5bSNicholas Miehlbradt 0);
5895395b5d5bSNicholas Miehlbradt
5896a5116b95SNicholas Piggin spr_register(env, SPR_UDEXCR, "UDEXCR",
5897395b5d5bSNicholas Miehlbradt &spr_read_dexcr_ureg, SPR_NOACCESS,
5898395b5d5bSNicholas Miehlbradt &spr_read_dexcr_ureg, SPR_NOACCESS,
5899395b5d5bSNicholas Miehlbradt 0);
5900395b5d5bSNicholas Miehlbradt
5901395b5d5bSNicholas Miehlbradt spr_register_hv(env, SPR_HDEXCR, "HDEXCR",
5902395b5d5bSNicholas Miehlbradt SPR_NOACCESS, SPR_NOACCESS,
5903395b5d5bSNicholas Miehlbradt SPR_NOACCESS, SPR_NOACCESS,
5904978897a5SBenjamin Gray &spr_read_generic, &spr_write_generic,
5905395b5d5bSNicholas Miehlbradt 0);
5906395b5d5bSNicholas Miehlbradt
5907a5116b95SNicholas Piggin spr_register(env, SPR_UHDEXCR, "UHDEXCR",
5908395b5d5bSNicholas Miehlbradt &spr_read_dexcr_ureg, SPR_NOACCESS,
5909395b5d5bSNicholas Miehlbradt &spr_read_dexcr_ureg, SPR_NOACCESS,
5910395b5d5bSNicholas Miehlbradt 0);
5911395b5d5bSNicholas Miehlbradt }
5912395b5d5bSNicholas Miehlbradt
59138f2e9d40SDaniel Henrique Barboza /*
59148f2e9d40SDaniel Henrique Barboza * Initialize PMU counter overflow timers for Power8 and
59158f2e9d40SDaniel Henrique Barboza * newer Power chips when using TCG.
59168f2e9d40SDaniel Henrique Barboza */
init_tcg_pmu_power8(CPUPPCState * env)59178f2e9d40SDaniel Henrique Barboza static void init_tcg_pmu_power8(CPUPPCState *env)
59188f2e9d40SDaniel Henrique Barboza {
59198f2e9d40SDaniel Henrique Barboza /* Init PMU overflow timers */
592033edcde7SDaniel Henrique Barboza if (tcg_enabled()) {
59218f2e9d40SDaniel Henrique Barboza cpu_ppc_pmu_init(env);
59228f2e9d40SDaniel Henrique Barboza }
59238f2e9d40SDaniel Henrique Barboza }
59248f2e9d40SDaniel Henrique Barboza
init_proc_book3s_common(CPUPPCState * env)59253e770bf7SBruno Larsen (billionai) static void init_proc_book3s_common(CPUPPCState *env)
59263e770bf7SBruno Larsen (billionai) {
5927217781afSFabiano Rosas register_non_embedded_sprs(env);
59283e770bf7SBruno Larsen (billionai) register_book3s_altivec_sprs(env);
59293e770bf7SBruno Larsen (billionai) register_book3s_pmu_sup_sprs(env);
59303e770bf7SBruno Larsen (billionai) register_book3s_pmu_user_sprs(env);
59313e770bf7SBruno Larsen (billionai) register_book3s_ctrl_sprs(env);
59323e770bf7SBruno Larsen (billionai) /*
59333e770bf7SBruno Larsen (billionai) * Can't find information on what this should be on reset. This
59343e770bf7SBruno Larsen (billionai) * value is the one used by 74xx processors.
59353e770bf7SBruno Larsen (billionai) */
59363e770bf7SBruno Larsen (billionai) vscr_init(env, 0x00010000);
59372a48d83dSFabiano Rosas
59382a48d83dSFabiano Rosas spr_register(env, SPR_USPRG3, "USPRG3",
59392a48d83dSFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
59402a48d83dSFabiano Rosas &spr_read_ureg, SPR_NOACCESS,
59412a48d83dSFabiano Rosas 0x00000000);
59423e770bf7SBruno Larsen (billionai) }
59433e770bf7SBruno Larsen (billionai)
init_proc_970(CPUPPCState * env)59443e770bf7SBruno Larsen (billionai) static void init_proc_970(CPUPPCState *env)
59453e770bf7SBruno Larsen (billionai) {
59463e770bf7SBruno Larsen (billionai) /* Common Registers */
59473e770bf7SBruno Larsen (billionai) init_proc_book3s_common(env);
59483e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
59493e770bf7SBruno Larsen (billionai) register_book3s_dbg_sprs(env);
59503e770bf7SBruno Larsen (billionai)
59513e770bf7SBruno Larsen (billionai) /* 970 Specific Registers */
59523e770bf7SBruno Larsen (billionai) register_970_hid_sprs(env);
59533e770bf7SBruno Larsen (billionai) register_970_hior_sprs(env);
59543e770bf7SBruno Larsen (billionai) register_low_BATs(env);
59553e770bf7SBruno Larsen (billionai) register_970_pmu_sup_sprs(env);
59563e770bf7SBruno Larsen (billionai) register_970_pmu_user_sprs(env);
59573e770bf7SBruno Larsen (billionai) register_970_lpar_sprs(env);
59583e770bf7SBruno Larsen (billionai) register_970_dbg_sprs(env);
59593e770bf7SBruno Larsen (billionai)
59603e770bf7SBruno Larsen (billionai) /* env variables */
59613e770bf7SBruno Larsen (billionai) env->dcache_line_size = 128;
59623e770bf7SBruno Larsen (billionai) env->icache_line_size = 128;
59633e770bf7SBruno Larsen (billionai)
59643e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
59653e770bf7SBruno Larsen (billionai) init_excp_970(env);
59663e770bf7SBruno Larsen (billionai) ppc970_irq_init(env_archcpu(env));
59673e770bf7SBruno Larsen (billionai) }
59683e770bf7SBruno Larsen (billionai)
59693e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
59703e770bf7SBruno Larsen (billionai) {
59713e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
59723e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
59733e770bf7SBruno Larsen (billionai)
59743e770bf7SBruno Larsen (billionai) dc->desc = "PowerPC 970";
59753e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_970;
59763e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_970;
597745693f94SNicholas Piggin pcc->check_attn = check_attn_hid0;
59783e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
59793e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
59803e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
59813e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
59823e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
59833e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
59843e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
59853e770bf7SBruno Larsen (billionai) PPC_64B | PPC_ALTIVEC |
59863e770bf7SBruno Larsen (billionai) PPC_SEGMENT_64B | PPC_SLBI;
598703abfd90SNicholas Piggin pcc->insns_flags2 = PPC2_FP_CVT_S64 | PPC2_MEM_LWSYNC;
59883e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_SF) |
59893e770bf7SBruno Larsen (billionai) (1ull << MSR_VR) |
59903e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
59913e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
59923e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
59933e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
59943e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
59953e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
59963e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
59973e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
59983e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
59993e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
60003e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
60013e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
60023e770bf7SBruno Larsen (billionai) (1ull << MSR_RI);
60033e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_64B;
6004227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
60053e770bf7SBruno Larsen (billionai) pcc->hash64_opts = &ppc_hash64_opts_basic;
60063e770bf7SBruno Larsen (billionai) #endif
60073e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_970;
60083e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_970;
60093e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc64;
60103e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
60113e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
60123e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
60133e770bf7SBruno Larsen (billionai) pcc->l1_dcache_size = 0x8000;
60143e770bf7SBruno Larsen (billionai) pcc->l1_icache_size = 0x10000;
60153e770bf7SBruno Larsen (billionai) }
60163e770bf7SBruno Larsen (billionai)
init_proc_power5plus(CPUPPCState * env)60173e770bf7SBruno Larsen (billionai) static void init_proc_power5plus(CPUPPCState *env)
60183e770bf7SBruno Larsen (billionai) {
60193e770bf7SBruno Larsen (billionai) /* Common Registers */
60203e770bf7SBruno Larsen (billionai) init_proc_book3s_common(env);
60213e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
60223e770bf7SBruno Larsen (billionai) register_book3s_dbg_sprs(env);
60233e770bf7SBruno Larsen (billionai)
60243e770bf7SBruno Larsen (billionai) /* POWER5+ Specific Registers */
60253e770bf7SBruno Larsen (billionai) register_970_hid_sprs(env);
60263e770bf7SBruno Larsen (billionai) register_970_hior_sprs(env);
60273e770bf7SBruno Larsen (billionai) register_low_BATs(env);
60283e770bf7SBruno Larsen (billionai) register_970_pmu_sup_sprs(env);
60293e770bf7SBruno Larsen (billionai) register_970_pmu_user_sprs(env);
60303e770bf7SBruno Larsen (billionai) register_power5p_common_sprs(env);
60313e770bf7SBruno Larsen (billionai) register_power5p_lpar_sprs(env);
60323e770bf7SBruno Larsen (billionai) register_power5p_ear_sprs(env);
60333e770bf7SBruno Larsen (billionai) register_power5p_tb_sprs(env);
60343e770bf7SBruno Larsen (billionai)
60353e770bf7SBruno Larsen (billionai) /* env variables */
60363e770bf7SBruno Larsen (billionai) env->dcache_line_size = 128;
60373e770bf7SBruno Larsen (billionai) env->icache_line_size = 128;
60383e770bf7SBruno Larsen (billionai)
60393e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
60403e770bf7SBruno Larsen (billionai) init_excp_970(env);
60413e770bf7SBruno Larsen (billionai) ppc970_irq_init(env_archcpu(env));
60423e770bf7SBruno Larsen (billionai) }
60433e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(POWER5P)60443e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
60453e770bf7SBruno Larsen (billionai) {
60463e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
60473e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
60483e770bf7SBruno Larsen (billionai)
60493e770bf7SBruno Larsen (billionai) dc->fw_name = "PowerPC,POWER5";
60503e770bf7SBruno Larsen (billionai) dc->desc = "POWER5+";
60513e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_power5plus;
60523e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_970;
605345693f94SNicholas Piggin pcc->check_attn = check_attn_hid0;
60543e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
60553e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
60563e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
60573e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
605891137619SCédric Le Goater PPC_FLOAT_EXT |
60593e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
60603e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
60613e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
60623e770bf7SBruno Larsen (billionai) PPC_64B |
606323ab6d88SCédric Le Goater PPC_POPCNTB |
60643e770bf7SBruno Larsen (billionai) PPC_SEGMENT_64B | PPC_SLBI;
606503abfd90SNicholas Piggin pcc->insns_flags2 = PPC2_FP_CVT_S64 | PPC2_MEM_LWSYNC;
60663e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_SF) |
60673e770bf7SBruno Larsen (billionai) (1ull << MSR_VR) |
60683e770bf7SBruno Larsen (billionai) (1ull << MSR_POW) |
60693e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
60703e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
60713e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
60723e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
60733e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
60743e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
60753e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
60763e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
60773e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
60783e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
60793e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
60803e770bf7SBruno Larsen (billionai) (1ull << MSR_RI);
60813e770bf7SBruno Larsen (billionai) pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 |
60823e770bf7SBruno Larsen (billionai) LPCR_RMI | LPCR_HDICE;
60833e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_2_03;
6084227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
60853e770bf7SBruno Larsen (billionai) pcc->hash64_opts = &ppc_hash64_opts_basic;
60863e770bf7SBruno Larsen (billionai) pcc->lrg_decr_bits = 32;
60873e770bf7SBruno Larsen (billionai) #endif
60883e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_970;
60893e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_970;
60903e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc64;
60913e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
60923e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
60933e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK;
60943e770bf7SBruno Larsen (billionai) pcc->l1_dcache_size = 0x8000;
60953e770bf7SBruno Larsen (billionai) pcc->l1_icache_size = 0x10000;
60963e770bf7SBruno Larsen (billionai) }
60973e770bf7SBruno Larsen (billionai)
init_proc_POWER7(CPUPPCState * env)60983e770bf7SBruno Larsen (billionai) static void init_proc_POWER7(CPUPPCState *env)
60993e770bf7SBruno Larsen (billionai) {
61003e770bf7SBruno Larsen (billionai) /* Common Registers */
61013e770bf7SBruno Larsen (billionai) init_proc_book3s_common(env);
61023e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
61033e770bf7SBruno Larsen (billionai) register_book3s_dbg_sprs(env);
61043e770bf7SBruno Larsen (billionai)
61053e770bf7SBruno Larsen (billionai) /* POWER7 Specific Registers */
61063e770bf7SBruno Larsen (billionai) register_book3s_ids_sprs(env);
61073e770bf7SBruno Larsen (billionai) register_rmor_sprs(env);
61083e770bf7SBruno Larsen (billionai) register_amr_sprs(env);
61093e770bf7SBruno Larsen (billionai) register_book3s_purr_sprs(env);
61103e770bf7SBruno Larsen (billionai) register_power5p_common_sprs(env);
61113e770bf7SBruno Larsen (billionai) register_power5p_lpar_sprs(env);
61123e770bf7SBruno Larsen (billionai) register_power5p_ear_sprs(env);
61133e770bf7SBruno Larsen (billionai) register_power5p_tb_sprs(env);
61143e770bf7SBruno Larsen (billionai) register_power6_common_sprs(env);
6115a3c020d8SNicholas Piggin register_HEIR32_spr(env);
61163e770bf7SBruno Larsen (billionai) register_power6_dbg_sprs(env);
61171cbcbcb8SNicholas Piggin register_power7_common_sprs(env);
61183e770bf7SBruno Larsen (billionai) register_power7_book4_sprs(env);
61193e770bf7SBruno Larsen (billionai)
61203e770bf7SBruno Larsen (billionai) /* env variables */
61213e770bf7SBruno Larsen (billionai) env->dcache_line_size = 128;
61223e770bf7SBruno Larsen (billionai) env->icache_line_size = 128;
61233e770bf7SBruno Larsen (billionai)
61243e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
61253e770bf7SBruno Larsen (billionai) init_excp_POWER7(env);
61263e770bf7SBruno Larsen (billionai) ppcPOWER7_irq_init(env_archcpu(env));
61273e770bf7SBruno Larsen (billionai) }
61283e770bf7SBruno Larsen (billionai)
ppc_pvr_match_power7(PowerPCCPUClass * pcc,uint32_t pvr,bool best)612921d3a78eSNicholas Piggin static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
61303e770bf7SBruno Larsen (billionai) {
613121d3a78eSNicholas Piggin uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
613221d3a78eSNicholas Piggin uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
613321d3a78eSNicholas Piggin
613421d3a78eSNicholas Piggin if (!best) {
613521d3a78eSNicholas Piggin if (base == CPU_POWERPC_POWER7_BASE) {
61363e770bf7SBruno Larsen (billionai) return true;
61373e770bf7SBruno Larsen (billionai) }
613821d3a78eSNicholas Piggin if (base == CPU_POWERPC_POWER7P_BASE) {
61393e770bf7SBruno Larsen (billionai) return true;
61403e770bf7SBruno Larsen (billionai) }
614121d3a78eSNicholas Piggin }
614221d3a78eSNicholas Piggin
614321d3a78eSNicholas Piggin if (base != pcc_base) {
61443e770bf7SBruno Larsen (billionai) return false;
61453e770bf7SBruno Larsen (billionai) }
61463e770bf7SBruno Larsen (billionai)
614721d3a78eSNicholas Piggin return true;
614821d3a78eSNicholas Piggin }
614921d3a78eSNicholas Piggin
POWERPC_FAMILY(POWER7)61503e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
61513e770bf7SBruno Larsen (billionai) {
61523e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
61533e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
61543e770bf7SBruno Larsen (billionai)
61553e770bf7SBruno Larsen (billionai) dc->fw_name = "PowerPC,POWER7";
61563e770bf7SBruno Larsen (billionai) dc->desc = "POWER7";
6157c0b2f0ddSAditya Gupta pcc->spapr_logical_pvr = CPU_POWERPC_LOGICAL_2_06_PLUS;
61583e770bf7SBruno Larsen (billionai) pcc->pvr_match = ppc_pvr_match_power7;
61593e770bf7SBruno Larsen (billionai) pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05;
61603e770bf7SBruno Larsen (billionai) pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
61613e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_POWER7;
61623e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
616345693f94SNicholas Piggin pcc->check_attn = check_attn_hid0;
61643e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
61653e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
61663e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
61673e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTES |
61683e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
61693e770bf7SBruno Larsen (billionai) PPC_FLOAT_EXT |
61703e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
61713e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
61723e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
61733e770bf7SBruno Larsen (billionai) PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
61743e770bf7SBruno Larsen (billionai) PPC_SEGMENT_64B | PPC_SLBI |
61753e770bf7SBruno Larsen (billionai) PPC_POPCNTB | PPC_POPCNTWD |
61763e770bf7SBruno Larsen (billionai) PPC_CILDST;
61773e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205 |
61783e770bf7SBruno Larsen (billionai) PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
61793e770bf7SBruno Larsen (billionai) PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
61803e770bf7SBruno Larsen (billionai) PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 |
61814dc5f8abSMatheus Ferst PPC2_PM_ISA206 | PPC2_MEM_LWSYNC | PPC2_BCDA_ISA206;
61823e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_SF) |
61833e770bf7SBruno Larsen (billionai) (1ull << MSR_VR) |
61843e770bf7SBruno Larsen (billionai) (1ull << MSR_VSX) |
61853e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
61863e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
61873e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
61883e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
61893e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
61903e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
61913e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
61923e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
61933e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
61943e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
61953e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
61963e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
61973e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
61983e770bf7SBruno Larsen (billionai) pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
61993e770bf7SBruno Larsen (billionai) LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
62003e770bf7SBruno Larsen (billionai) LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
62013e770bf7SBruno Larsen (billionai) LPCR_MER | LPCR_TC |
62023e770bf7SBruno Larsen (billionai) LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE;
62033e770bf7SBruno Larsen (billionai) pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
62043e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_2_06;
6205227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
62063e770bf7SBruno Larsen (billionai) pcc->hash64_opts = &ppc_hash64_opts_POWER7;
62073e770bf7SBruno Larsen (billionai) pcc->lrg_decr_bits = 32;
62083e770bf7SBruno Larsen (billionai) #endif
62093e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_POWER7;
62103e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
62113e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc64;
62123e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
62133e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
62143e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
62153e770bf7SBruno Larsen (billionai) POWERPC_FLAG_VSX;
62163e770bf7SBruno Larsen (billionai) pcc->l1_dcache_size = 0x8000;
62173e770bf7SBruno Larsen (billionai) pcc->l1_icache_size = 0x8000;
62183e770bf7SBruno Larsen (billionai) }
62193e770bf7SBruno Larsen (billionai)
bhrb_init_state(CPUPPCState * env,target_long num_entries_log2)62204de4a470SGlenn Miles static void bhrb_init_state(CPUPPCState *env, target_long num_entries_log2)
62214de4a470SGlenn Miles {
62224de4a470SGlenn Miles if (env->flags & POWERPC_FLAG_BHRB) {
62234de4a470SGlenn Miles if (num_entries_log2 > BHRB_MAX_NUM_ENTRIES_LOG2) {
62244de4a470SGlenn Miles num_entries_log2 = BHRB_MAX_NUM_ENTRIES_LOG2;
62254de4a470SGlenn Miles }
62264de4a470SGlenn Miles env->bhrb_num_entries = 1 << num_entries_log2;
62274de4a470SGlenn Miles env->bhrb_base = (intptr_t)&env->bhrb[0];
62284de4a470SGlenn Miles env->bhrb_offset_mask = (env->bhrb_num_entries * sizeof(uint64_t)) - 1;
62294de4a470SGlenn Miles }
62304de4a470SGlenn Miles }
62314de4a470SGlenn Miles
bhrb_reset_state(CPUPPCState * env)62324de4a470SGlenn Miles static void bhrb_reset_state(CPUPPCState *env)
62334de4a470SGlenn Miles {
62344de4a470SGlenn Miles if (env->flags & POWERPC_FLAG_BHRB) {
62354de4a470SGlenn Miles env->bhrb_offset = 0;
62364de4a470SGlenn Miles env->bhrb_filter = 0;
62374de4a470SGlenn Miles memset(env->bhrb, 0, sizeof(env->bhrb));
62384de4a470SGlenn Miles }
62394de4a470SGlenn Miles }
62404de4a470SGlenn Miles
62414de4a470SGlenn Miles #define POWER8_BHRB_ENTRIES_LOG2 5
init_proc_POWER8(CPUPPCState * env)62423e770bf7SBruno Larsen (billionai) static void init_proc_POWER8(CPUPPCState *env)
62433e770bf7SBruno Larsen (billionai) {
62443e770bf7SBruno Larsen (billionai) /* Common Registers */
62453e770bf7SBruno Larsen (billionai) init_proc_book3s_common(env);
62463e770bf7SBruno Larsen (billionai) register_sdr1_sprs(env);
62473e770bf7SBruno Larsen (billionai) register_book3s_207_dbg_sprs(env);
62483e770bf7SBruno Larsen (billionai)
62498f2e9d40SDaniel Henrique Barboza /* Common TCG PMU */
62508f2e9d40SDaniel Henrique Barboza init_tcg_pmu_power8(env);
62518f2e9d40SDaniel Henrique Barboza
62523e770bf7SBruno Larsen (billionai) /* POWER8 Specific Registers */
62533e770bf7SBruno Larsen (billionai) register_book3s_ids_sprs(env);
62543e770bf7SBruno Larsen (billionai) register_rmor_sprs(env);
62553e770bf7SBruno Larsen (billionai) register_amr_sprs(env);
62563e770bf7SBruno Larsen (billionai) register_iamr_sprs(env);
62573e770bf7SBruno Larsen (billionai) register_book3s_purr_sprs(env);
62583e770bf7SBruno Larsen (billionai) register_power5p_common_sprs(env);
62593e770bf7SBruno Larsen (billionai) register_power5p_lpar_sprs(env);
62603e770bf7SBruno Larsen (billionai) register_power5p_ear_sprs(env);
62613e770bf7SBruno Larsen (billionai) register_power5p_tb_sprs(env);
62623e770bf7SBruno Larsen (billionai) register_power6_common_sprs(env);
6263a3c020d8SNicholas Piggin register_HEIR32_spr(env);
62643e770bf7SBruno Larsen (billionai) register_power6_dbg_sprs(env);
62651cbcbcb8SNicholas Piggin register_power7_common_sprs(env);
62663e770bf7SBruno Larsen (billionai) register_power8_tce_address_control_sprs(env);
62673e770bf7SBruno Larsen (billionai) register_power8_ids_sprs(env);
62683e770bf7SBruno Larsen (billionai) register_power8_ebb_sprs(env);
62693e770bf7SBruno Larsen (billionai) register_power8_fscr_sprs(env);
62703e770bf7SBruno Larsen (billionai) register_power8_pmu_sup_sprs(env);
62713e770bf7SBruno Larsen (billionai) register_power8_pmu_user_sprs(env);
62723e770bf7SBruno Larsen (billionai) register_power8_tm_sprs(env);
62733e770bf7SBruno Larsen (billionai) register_power8_pspb_sprs(env);
62743e770bf7SBruno Larsen (billionai) register_power8_dpdes_sprs(env);
62753e770bf7SBruno Larsen (billionai) register_vtb_sprs(env);
62763e770bf7SBruno Larsen (billionai) register_power8_ic_sprs(env);
62773e770bf7SBruno Larsen (billionai) register_power8_book4_sprs(env);
62783e770bf7SBruno Larsen (billionai) register_power8_rpr_sprs(env);
62793e770bf7SBruno Larsen (billionai)
62803e770bf7SBruno Larsen (billionai) /* env variables */
62813e770bf7SBruno Larsen (billionai) env->dcache_line_size = 128;
62823e770bf7SBruno Larsen (billionai) env->icache_line_size = 128;
62833e770bf7SBruno Larsen (billionai)
62844de4a470SGlenn Miles bhrb_init_state(env, POWER8_BHRB_ENTRIES_LOG2);
62854de4a470SGlenn Miles
62863e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
62873e770bf7SBruno Larsen (billionai) init_excp_POWER8(env);
62883e770bf7SBruno Larsen (billionai) ppcPOWER7_irq_init(env_archcpu(env));
62893e770bf7SBruno Larsen (billionai) }
62903e770bf7SBruno Larsen (billionai)
ppc_pvr_match_power8(PowerPCCPUClass * pcc,uint32_t pvr,bool best)629121d3a78eSNicholas Piggin static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
62923e770bf7SBruno Larsen (billionai) {
629321d3a78eSNicholas Piggin uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
629421d3a78eSNicholas Piggin uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
629521d3a78eSNicholas Piggin
629621d3a78eSNicholas Piggin if (!best) {
629721d3a78eSNicholas Piggin if (base == CPU_POWERPC_POWER8_BASE) {
62983e770bf7SBruno Larsen (billionai) return true;
62993e770bf7SBruno Larsen (billionai) }
630021d3a78eSNicholas Piggin if (base == CPU_POWERPC_POWER8E_BASE) {
63013e770bf7SBruno Larsen (billionai) return true;
63023e770bf7SBruno Larsen (billionai) }
630321d3a78eSNicholas Piggin if (base == CPU_POWERPC_POWER8NVL_BASE) {
63043e770bf7SBruno Larsen (billionai) return true;
63053e770bf7SBruno Larsen (billionai) }
630621d3a78eSNicholas Piggin }
630721d3a78eSNicholas Piggin if (base != pcc_base) {
63083e770bf7SBruno Larsen (billionai) return false;
63093e770bf7SBruno Larsen (billionai) }
63103e770bf7SBruno Larsen (billionai)
631121d3a78eSNicholas Piggin return true;
631221d3a78eSNicholas Piggin }
631321d3a78eSNicholas Piggin
POWERPC_FAMILY(POWER8)63143e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
63153e770bf7SBruno Larsen (billionai) {
63163e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
63173e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
63183e770bf7SBruno Larsen (billionai)
63193e770bf7SBruno Larsen (billionai) dc->fw_name = "PowerPC,POWER8";
63203e770bf7SBruno Larsen (billionai) dc->desc = "POWER8";
6321c0b2f0ddSAditya Gupta pcc->spapr_logical_pvr = CPU_POWERPC_LOGICAL_2_07;
63223e770bf7SBruno Larsen (billionai) pcc->pvr_match = ppc_pvr_match_power8;
63233e770bf7SBruno Larsen (billionai) pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
63243e770bf7SBruno Larsen (billionai) pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
63253e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_POWER8;
63263e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
632745693f94SNicholas Piggin pcc->check_attn = check_attn_hid0;
63283e770bf7SBruno Larsen (billionai) pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
63293e770bf7SBruno Larsen (billionai) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
63303e770bf7SBruno Larsen (billionai) PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
63313e770bf7SBruno Larsen (billionai) PPC_FLOAT_FRSQRTES |
63323e770bf7SBruno Larsen (billionai) PPC_FLOAT_STFIWX |
63333e770bf7SBruno Larsen (billionai) PPC_FLOAT_EXT |
63343e770bf7SBruno Larsen (billionai) PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
63353e770bf7SBruno Larsen (billionai) PPC_MEM_SYNC | PPC_MEM_EIEIO |
63363e770bf7SBruno Larsen (billionai) PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
63373e770bf7SBruno Larsen (billionai) PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
63383e770bf7SBruno Larsen (billionai) PPC_SEGMENT_64B | PPC_SLBI |
63393e770bf7SBruno Larsen (billionai) PPC_POPCNTB | PPC_POPCNTWD |
63403e770bf7SBruno Larsen (billionai) PPC_CILDST;
63413e770bf7SBruno Larsen (billionai) pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
63423e770bf7SBruno Larsen (billionai) PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
63433e770bf7SBruno Larsen (billionai) PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
63443e770bf7SBruno Larsen (billionai) PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
63453e770bf7SBruno Larsen (billionai) PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
63463e770bf7SBruno Larsen (billionai) PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
63474dc5f8abSMatheus Ferst PPC2_TM | PPC2_PM_ISA206 | PPC2_MEM_LWSYNC |
63484dc5f8abSMatheus Ferst PPC2_BCDA_ISA206;
63493e770bf7SBruno Larsen (billionai) pcc->msr_mask = (1ull << MSR_SF) |
63503e770bf7SBruno Larsen (billionai) (1ull << MSR_HV) |
63513e770bf7SBruno Larsen (billionai) (1ull << MSR_TM) |
63523e770bf7SBruno Larsen (billionai) (1ull << MSR_VR) |
63533e770bf7SBruno Larsen (billionai) (1ull << MSR_VSX) |
63543e770bf7SBruno Larsen (billionai) (1ull << MSR_EE) |
63553e770bf7SBruno Larsen (billionai) (1ull << MSR_PR) |
63563e770bf7SBruno Larsen (billionai) (1ull << MSR_FP) |
63573e770bf7SBruno Larsen (billionai) (1ull << MSR_ME) |
63583e770bf7SBruno Larsen (billionai) (1ull << MSR_FE0) |
63593e770bf7SBruno Larsen (billionai) (1ull << MSR_SE) |
63603e770bf7SBruno Larsen (billionai) (1ull << MSR_DE) |
63613e770bf7SBruno Larsen (billionai) (1ull << MSR_FE1) |
63623e770bf7SBruno Larsen (billionai) (1ull << MSR_IR) |
63633e770bf7SBruno Larsen (billionai) (1ull << MSR_DR) |
63643e770bf7SBruno Larsen (billionai) (1ull << MSR_PMM) |
63653e770bf7SBruno Larsen (billionai) (1ull << MSR_RI) |
63663e770bf7SBruno Larsen (billionai) (1ull << MSR_TS0) |
63673e770bf7SBruno Larsen (billionai) (1ull << MSR_TS1) |
63683e770bf7SBruno Larsen (billionai) (1ull << MSR_LE);
63693e770bf7SBruno Larsen (billionai) pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
63703e770bf7SBruno Larsen (billionai) LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
63713e770bf7SBruno Larsen (billionai) LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
63723e770bf7SBruno Larsen (billionai) LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
63733e770bf7SBruno Larsen (billionai) LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE;
63743e770bf7SBruno Larsen (billionai) pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
63753e770bf7SBruno Larsen (billionai) LPCR_P8_PECE3 | LPCR_P8_PECE4;
63763e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_2_07;
6377227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
63783e770bf7SBruno Larsen (billionai) pcc->hash64_opts = &ppc_hash64_opts_POWER7;
63793e770bf7SBruno Larsen (billionai) pcc->lrg_decr_bits = 32;
63803e770bf7SBruno Larsen (billionai) pcc->n_host_threads = 8;
63813e770bf7SBruno Larsen (billionai) #endif
63823e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_POWER8;
63833e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
63843e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc64;
63853e770bf7SBruno Larsen (billionai) pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
63863e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
63873e770bf7SBruno Larsen (billionai) POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
63883e770bf7SBruno Larsen (billionai) POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
63893e770bf7SBruno Larsen (billionai) pcc->l1_dcache_size = 0x8000;
63903e770bf7SBruno Larsen (billionai) pcc->l1_icache_size = 0x8000;
63913e770bf7SBruno Larsen (billionai) }
63923e770bf7SBruno Larsen (billionai)
6393227776b7SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
63943e770bf7SBruno Larsen (billionai) /*
63953e770bf7SBruno Larsen (billionai) * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
63963e770bf7SBruno Larsen (billionai) * Encoded as array of int_32s in the form:
63973e770bf7SBruno Larsen (billionai) * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
63983e770bf7SBruno Larsen (billionai) * x -> AP encoding
63993e770bf7SBruno Larsen (billionai) * y -> radix mode supported page size (encoded as a shift)
64003e770bf7SBruno Larsen (billionai) */
64013e770bf7SBruno Larsen (billionai) static struct ppc_radix_page_info POWER9_radix_page_info = {
64023e770bf7SBruno Larsen (billionai) .count = 4,
64033e770bf7SBruno Larsen (billionai) .entries = {
64043e770bf7SBruno Larsen (billionai) 0x0000000c, /* 4K - enc: 0x0 */
64053e770bf7SBruno Larsen (billionai) 0xa0000010, /* 64K - enc: 0x5 */
64063e770bf7SBruno Larsen (billionai) 0x20000015, /* 2M - enc: 0x1 */
64073e770bf7SBruno Larsen (billionai) 0x4000001e /* 1G - enc: 0x2 */
64083e770bf7SBruno Larsen (billionai) }
64093e770bf7SBruno Larsen (billionai) };
6410227776b7SPhilippe Mathieu-Daudé #endif /* CONFIG_USER_ONLY */
64113e770bf7SBruno Larsen (billionai)
64124de4a470SGlenn Miles #define POWER9_BHRB_ENTRIES_LOG2 5
register_power9_common_sprs(CPUPPCState * env)641357ff60c1SHarsh Prateek Bora static void register_power9_common_sprs(CPUPPCState *env)
64143e770bf7SBruno Larsen (billionai) {
64153e770bf7SBruno Larsen (billionai) /* Common Registers */
64163e770bf7SBruno Larsen (billionai) init_proc_book3s_common(env);
64173e770bf7SBruno Larsen (billionai) register_book3s_207_dbg_sprs(env);
64183e770bf7SBruno Larsen (billionai)
64198f2e9d40SDaniel Henrique Barboza /* Common TCG PMU */
64208f2e9d40SDaniel Henrique Barboza init_tcg_pmu_power8(env);
64218f2e9d40SDaniel Henrique Barboza
64223e770bf7SBruno Larsen (billionai) /* POWER8 Specific Registers */
64233e770bf7SBruno Larsen (billionai) register_book3s_ids_sprs(env);
64243e770bf7SBruno Larsen (billionai) register_amr_sprs(env);
64253e770bf7SBruno Larsen (billionai) register_iamr_sprs(env);
64263e770bf7SBruno Larsen (billionai) register_book3s_purr_sprs(env);
64273e770bf7SBruno Larsen (billionai) register_power5p_common_sprs(env);
64283e770bf7SBruno Larsen (billionai) register_power5p_lpar_sprs(env);
64293e770bf7SBruno Larsen (billionai) register_power5p_ear_sprs(env);
64303e770bf7SBruno Larsen (billionai) register_power5p_tb_sprs(env);
64313e770bf7SBruno Larsen (billionai) register_power6_common_sprs(env);
64323e770bf7SBruno Larsen (billionai) register_power6_dbg_sprs(env);
64331cbcbcb8SNicholas Piggin register_power7_common_sprs(env);
64343e770bf7SBruno Larsen (billionai) register_power8_tce_address_control_sprs(env);
64353e770bf7SBruno Larsen (billionai) register_power8_ids_sprs(env);
64363e770bf7SBruno Larsen (billionai) register_power8_ebb_sprs(env);
64373e770bf7SBruno Larsen (billionai) register_power8_fscr_sprs(env);
64383e770bf7SBruno Larsen (billionai) register_power8_pmu_sup_sprs(env);
64393e770bf7SBruno Larsen (billionai) register_power8_pmu_user_sprs(env);
64403e770bf7SBruno Larsen (billionai) register_power8_tm_sprs(env);
64413e770bf7SBruno Larsen (billionai) register_power8_pspb_sprs(env);
64423e770bf7SBruno Larsen (billionai) register_power8_dpdes_sprs(env);
64433e770bf7SBruno Larsen (billionai) register_vtb_sprs(env);
64443e770bf7SBruno Larsen (billionai) register_power8_ic_sprs(env);
64456f967f4fSNicholas Piggin register_power9_book4_sprs(env);
64463e770bf7SBruno Larsen (billionai) register_power8_rpr_sprs(env);
64473e770bf7SBruno Larsen (billionai) register_power9_mmu_sprs(env);
64483e770bf7SBruno Larsen (billionai)
64493e770bf7SBruno Larsen (billionai) /* FIXME: Filter fields properly based on privilege level */
64503e770bf7SBruno Larsen (billionai) spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
64513e770bf7SBruno Larsen (billionai) spr_read_generic, spr_write_generic,
64523e770bf7SBruno Larsen (billionai) KVM_REG_PPC_PSSCR, 0);
64533e770bf7SBruno Larsen (billionai)
645457ff60c1SHarsh Prateek Bora }
645557ff60c1SHarsh Prateek Bora
init_proc_POWER9(CPUPPCState * env)645657ff60c1SHarsh Prateek Bora static void init_proc_POWER9(CPUPPCState *env)
645757ff60c1SHarsh Prateek Bora {
645857ff60c1SHarsh Prateek Bora register_power9_common_sprs(env);
645957ff60c1SHarsh Prateek Bora register_HEIR32_spr(env);
646057ff60c1SHarsh Prateek Bora /* POWER9 Specific registers */
646157ff60c1SHarsh Prateek Bora spr_register_kvm(env, SPR_TIDR, "TIDR", NULL, NULL,
646257ff60c1SHarsh Prateek Bora spr_read_generic, spr_write_generic,
646357ff60c1SHarsh Prateek Bora KVM_REG_PPC_TIDR, 0);
64643e770bf7SBruno Larsen (billionai) /* env variables */
64653e770bf7SBruno Larsen (billionai) env->dcache_line_size = 128;
64663e770bf7SBruno Larsen (billionai) env->icache_line_size = 128;
64673e770bf7SBruno Larsen (billionai)
64684de4a470SGlenn Miles bhrb_init_state(env, POWER9_BHRB_ENTRIES_LOG2);
64694de4a470SGlenn Miles
64703e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
64713e770bf7SBruno Larsen (billionai) init_excp_POWER9(env);
64723e770bf7SBruno Larsen (billionai) ppcPOWER9_irq_init(env_archcpu(env));
64733e770bf7SBruno Larsen (billionai) }
64743e770bf7SBruno Larsen (billionai)
ppc_pvr_match_power9(PowerPCCPUClass * pcc,uint32_t pvr,bool best)647521d3a78eSNicholas Piggin static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
64763e770bf7SBruno Larsen (billionai) {
647721d3a78eSNicholas Piggin uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
647821d3a78eSNicholas Piggin uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
647921d3a78eSNicholas Piggin
648021d3a78eSNicholas Piggin if (!best) {
648121d3a78eSNicholas Piggin if (base == CPU_POWERPC_POWER9_BASE) {
64823e770bf7SBruno Larsen (billionai) return true;
64833e770bf7SBruno Larsen (billionai) }
648421d3a78eSNicholas Piggin }
648521d3a78eSNicholas Piggin
648621d3a78eSNicholas Piggin if (base != pcc_base) {
648721d3a78eSNicholas Piggin return false;
648821d3a78eSNicholas Piggin }
648921d3a78eSNicholas Piggin
6490277ee172SNicholas Piggin if ((pvr & 0x0f00) != (pcc->pvr & 0x0f00)) {
6491277ee172SNicholas Piggin /* Major DD version does not match */
6492277ee172SNicholas Piggin return false;
6493277ee172SNicholas Piggin }
6494277ee172SNicholas Piggin
64958f054d9eSNicholas Piggin if ((pvr & 0x0f00) == 0x200) {
6496277ee172SNicholas Piggin if ((pvr & 0xf) < 2) {
6497277ee172SNicholas Piggin /* DD2.0, DD2.1 match power9_v2.0 */
6498277ee172SNicholas Piggin if ((pcc->pvr & 0xf) == 0) {
6499277ee172SNicholas Piggin return true;
6500277ee172SNicholas Piggin }
6501277ee172SNicholas Piggin } else {
6502277ee172SNicholas Piggin /* DD2.2, DD2.3 match power9_v2.2 */
6503277ee172SNicholas Piggin if ((pcc->pvr & 0xf) == 2) {
6504277ee172SNicholas Piggin return true;
6505277ee172SNicholas Piggin }
6506277ee172SNicholas Piggin }
650721d3a78eSNicholas Piggin }
650821d3a78eSNicholas Piggin
65093e770bf7SBruno Larsen (billionai) return false;
65103e770bf7SBruno Larsen (billionai) }
65113e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(POWER9)65123e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
65133e770bf7SBruno Larsen (billionai) {
65143e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
65153e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
65163e770bf7SBruno Larsen (billionai)
65173e770bf7SBruno Larsen (billionai) dc->fw_name = "PowerPC,POWER9";
65183e770bf7SBruno Larsen (billionai) dc->desc = "POWER9";
6519c0b2f0ddSAditya Gupta pcc->spapr_logical_pvr = CPU_POWERPC_LOGICAL_3_00;
65203e770bf7SBruno Larsen (billionai) pcc->pvr_match = ppc_pvr_match_power9;
6521f41e7f76SHarsh Prateek Bora pcc->pcr_mask = PPC_PCR_MASK_POWER9;
6522f41e7f76SHarsh Prateek Bora pcc->pcr_supported = PPC_PCR_SUPPORTED_POWER9;
65233e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_POWER9;
65243e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
652545693f94SNicholas Piggin pcc->check_attn = check_attn_hid0_power9;
6526f41e7f76SHarsh Prateek Bora pcc->insns_flags = PPC_INSNS_FLAGS_POWER9;
6527f41e7f76SHarsh Prateek Bora pcc->insns_flags2 = PPC_INSNS_FLAGS2_POWER9;
6528f41e7f76SHarsh Prateek Bora pcc->msr_mask = PPC_MSR_MASK_POWER9;
6529f41e7f76SHarsh Prateek Bora pcc->lpcr_mask = PPC_LPCR_MASK_POWER9;
65303e770bf7SBruno Larsen (billionai) pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
65313e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_3_00;
6532227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
65333e770bf7SBruno Larsen (billionai) /* segment page size remain the same */
65343e770bf7SBruno Larsen (billionai) pcc->hash64_opts = &ppc_hash64_opts_POWER7;
65353e770bf7SBruno Larsen (billionai) pcc->radix_page_info = &POWER9_radix_page_info;
65363e770bf7SBruno Larsen (billionai) pcc->lrg_decr_bits = 56;
65373e770bf7SBruno Larsen (billionai) pcc->n_host_threads = 4;
65383e770bf7SBruno Larsen (billionai) #endif
65393e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_POWER9;
65403e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
65413e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc64;
6542f41e7f76SHarsh Prateek Bora pcc->flags = POWERPC_FLAGS_POWER9;
65433e770bf7SBruno Larsen (billionai) pcc->l1_dcache_size = 0x8000;
65443e770bf7SBruno Larsen (billionai) pcc->l1_icache_size = 0x8000;
65453e770bf7SBruno Larsen (billionai) }
65463e770bf7SBruno Larsen (billionai)
6547227776b7SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
65483e770bf7SBruno Larsen (billionai) /*
65493e770bf7SBruno Larsen (billionai) * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
65503e770bf7SBruno Larsen (billionai) * Encoded as array of int_32s in the form:
65513e770bf7SBruno Larsen (billionai) * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
65523e770bf7SBruno Larsen (billionai) * x -> AP encoding
65533e770bf7SBruno Larsen (billionai) * y -> radix mode supported page size (encoded as a shift)
65543e770bf7SBruno Larsen (billionai) */
65553e770bf7SBruno Larsen (billionai) static struct ppc_radix_page_info POWER10_radix_page_info = {
65563e770bf7SBruno Larsen (billionai) .count = 4,
65573e770bf7SBruno Larsen (billionai) .entries = {
65583e770bf7SBruno Larsen (billionai) 0x0000000c, /* 4K - enc: 0x0 */
65593e770bf7SBruno Larsen (billionai) 0xa0000010, /* 64K - enc: 0x5 */
65603e770bf7SBruno Larsen (billionai) 0x20000015, /* 2M - enc: 0x1 */
65613e770bf7SBruno Larsen (billionai) 0x4000001e /* 1G - enc: 0x2 */
65623e770bf7SBruno Larsen (billionai) }
65633e770bf7SBruno Larsen (billionai) };
6564227776b7SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */
65653e770bf7SBruno Larsen (billionai)
65664de4a470SGlenn Miles #define POWER10_BHRB_ENTRIES_LOG2 5
init_proc_POWER10(CPUPPCState * env)65673e770bf7SBruno Larsen (billionai) static void init_proc_POWER10(CPUPPCState *env)
65683e770bf7SBruno Larsen (billionai) {
656957ff60c1SHarsh Prateek Bora register_power9_common_sprs(env);
6570a3c020d8SNicholas Piggin register_HEIR64_spr(env);
6571903f84ebSVíctor Colombo register_power10_hash_sprs(env);
6572395b5d5bSNicholas Miehlbradt register_power10_dexcr_sprs(env);
65730b889323SMadhavan Srinivasan register_power10_pmu_sup_sprs(env);
65740b889323SMadhavan Srinivasan register_power10_pmu_user_sprs(env);
65753e770bf7SBruno Larsen (billionai) /* env variables */
65763e770bf7SBruno Larsen (billionai) env->dcache_line_size = 128;
65773e770bf7SBruno Larsen (billionai) env->icache_line_size = 128;
65783e770bf7SBruno Larsen (billionai)
65794de4a470SGlenn Miles bhrb_init_state(env, POWER10_BHRB_ENTRIES_LOG2);
65804de4a470SGlenn Miles
65813e770bf7SBruno Larsen (billionai) /* Allocate hardware IRQ controller */
65823e770bf7SBruno Larsen (billionai) init_excp_POWER10(env);
65833e770bf7SBruno Larsen (billionai) ppcPOWER9_irq_init(env_archcpu(env));
65843e770bf7SBruno Larsen (billionai) }
65853e770bf7SBruno Larsen (billionai)
ppc_pvr_match_power10(PowerPCCPUClass * pcc,uint32_t pvr,bool best)658621d3a78eSNicholas Piggin static bool ppc_pvr_match_power10(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
65873e770bf7SBruno Larsen (billionai) {
658821d3a78eSNicholas Piggin uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
658921d3a78eSNicholas Piggin uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
659021d3a78eSNicholas Piggin
659121d3a78eSNicholas Piggin if (!best) {
659221d3a78eSNicholas Piggin if (base == CPU_POWERPC_POWER10_BASE) {
65933e770bf7SBruno Larsen (billionai) return true;
65943e770bf7SBruno Larsen (billionai) }
659521d3a78eSNicholas Piggin }
659621d3a78eSNicholas Piggin
659721d3a78eSNicholas Piggin if (base != pcc_base) {
659821d3a78eSNicholas Piggin return false;
659921d3a78eSNicholas Piggin }
660021d3a78eSNicholas Piggin
660121d3a78eSNicholas Piggin if ((pvr & 0x0f00) == (pcc->pvr & 0x0f00)) {
66028f054d9eSNicholas Piggin /* Major DD version matches power10_v2.0 */
660321d3a78eSNicholas Piggin return true;
660421d3a78eSNicholas Piggin }
660521d3a78eSNicholas Piggin
66063e770bf7SBruno Larsen (billionai) return false;
66073e770bf7SBruno Larsen (billionai) }
66083e770bf7SBruno Larsen (billionai)
POWERPC_FAMILY(POWER10)66093e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
66103e770bf7SBruno Larsen (billionai) {
66113e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
66123e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
66133e770bf7SBruno Larsen (billionai)
66143e770bf7SBruno Larsen (billionai) dc->fw_name = "PowerPC,POWER10";
66153e770bf7SBruno Larsen (billionai) dc->desc = "POWER10";
6616c0b2f0ddSAditya Gupta pcc->spapr_logical_pvr = CPU_POWERPC_LOGICAL_3_10;
66173e770bf7SBruno Larsen (billionai) pcc->pvr_match = ppc_pvr_match_power10;
6618f41e7f76SHarsh Prateek Bora pcc->pcr_mask = PPC_PCR_MASK_POWER10;
6619f41e7f76SHarsh Prateek Bora pcc->pcr_supported = PPC_PCR_SUPPORTED_POWER10;
66203e770bf7SBruno Larsen (billionai) pcc->init_proc = init_proc_POWER10;
66213e770bf7SBruno Larsen (billionai) pcc->check_pow = check_pow_nocheck;
662245693f94SNicholas Piggin pcc->check_attn = check_attn_hid0_power9;
6623f41e7f76SHarsh Prateek Bora pcc->insns_flags = PPC_INSNS_FLAGS_POWER10;
6624f41e7f76SHarsh Prateek Bora pcc->insns_flags2 = PPC_INSNS_FLAGS2_POWER10;
6625f41e7f76SHarsh Prateek Bora pcc->msr_mask = PPC_MSR_MASK_POWER10;
6626f41e7f76SHarsh Prateek Bora pcc->lpcr_mask = PPC_LPCR_MASK_POWER10;
6627363fd548SCédric Le Goater
66283e770bf7SBruno Larsen (billionai) pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
66293e770bf7SBruno Larsen (billionai) pcc->mmu_model = POWERPC_MMU_3_00;
6630227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
66313e770bf7SBruno Larsen (billionai) /* segment page size remain the same */
66323e770bf7SBruno Larsen (billionai) pcc->hash64_opts = &ppc_hash64_opts_POWER7;
66333e770bf7SBruno Larsen (billionai) pcc->radix_page_info = &POWER10_radix_page_info;
66343e770bf7SBruno Larsen (billionai) pcc->lrg_decr_bits = 56;
66353e770bf7SBruno Larsen (billionai) #endif
66363e770bf7SBruno Larsen (billionai) pcc->excp_model = POWERPC_EXCP_POWER10;
66373e770bf7SBruno Larsen (billionai) pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
66383e770bf7SBruno Larsen (billionai) pcc->bfd_mach = bfd_mach_ppc64;
6639f41e7f76SHarsh Prateek Bora pcc->flags = POWERPC_FLAGS_POWER10;
66403e770bf7SBruno Larsen (billionai) pcc->l1_dcache_size = 0x8000;
66413e770bf7SBruno Larsen (billionai) pcc->l1_icache_size = 0x8000;
66423e770bf7SBruno Larsen (billionai) }
66433e770bf7SBruno Larsen (billionai)
init_proc_POWER11(CPUPPCState * env)6644c0d96407SAditya Gupta static void init_proc_POWER11(CPUPPCState *env)
6645c0d96407SAditya Gupta {
6646c0d96407SAditya Gupta init_proc_POWER10(env);
6647c0d96407SAditya Gupta }
6648c0d96407SAditya Gupta
ppc_pvr_match_power11(PowerPCCPUClass * pcc,uint32_t pvr,bool best)6649c0d96407SAditya Gupta static bool ppc_pvr_match_power11(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
6650c0d96407SAditya Gupta {
6651c0d96407SAditya Gupta uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
6652c0d96407SAditya Gupta uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
6653c0d96407SAditya Gupta
6654c0d96407SAditya Gupta if (!best && (base == CPU_POWERPC_POWER11_BASE)) {
6655c0d96407SAditya Gupta return true;
6656c0d96407SAditya Gupta }
6657c0d96407SAditya Gupta
6658c0d96407SAditya Gupta if (base != pcc_base) {
6659c0d96407SAditya Gupta return false;
6660c0d96407SAditya Gupta }
6661c0d96407SAditya Gupta
6662c0d96407SAditya Gupta if ((pvr & 0x0f00) == (pcc->pvr & 0x0f00)) {
6663c0d96407SAditya Gupta return true;
6664c0d96407SAditya Gupta }
6665c0d96407SAditya Gupta
6666c0d96407SAditya Gupta return false;
6667c0d96407SAditya Gupta }
6668c0d96407SAditya Gupta
POWERPC_FAMILY(POWER11)6669c0d96407SAditya Gupta POWERPC_FAMILY(POWER11)(ObjectClass *oc, void *data)
6670c0d96407SAditya Gupta {
6671c0d96407SAditya Gupta DeviceClass *dc = DEVICE_CLASS(oc);
6672c0d96407SAditya Gupta PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6673c0d96407SAditya Gupta
6674c0d96407SAditya Gupta dc->fw_name = "PowerPC,POWER11";
6675c0d96407SAditya Gupta dc->desc = "POWER11";
6676c0d96407SAditya Gupta pcc->spapr_logical_pvr = CPU_POWERPC_LOGICAL_3_10_P11;
6677c0d96407SAditya Gupta pcc->pvr_match = ppc_pvr_match_power11;
6678c0d96407SAditya Gupta pcc->pcr_mask = PPC_PCR_MASK_POWER11;
6679c0d96407SAditya Gupta pcc->pcr_supported = PPC_PCR_SUPPORTED_POWER11;
6680c0d96407SAditya Gupta pcc->init_proc = init_proc_POWER11;
6681c0d96407SAditya Gupta pcc->check_pow = check_pow_nocheck;
6682c0d96407SAditya Gupta pcc->check_attn = check_attn_hid0_power9;
6683c0d96407SAditya Gupta pcc->insns_flags = PPC_INSNS_FLAGS_POWER11;
6684c0d96407SAditya Gupta pcc->insns_flags2 = PPC_INSNS_FLAGS2_POWER11;
6685c0d96407SAditya Gupta pcc->msr_mask = PPC_MSR_MASK_POWER11;
6686c0d96407SAditya Gupta pcc->lpcr_mask = PPC_LPCR_MASK_POWER11;
6687c0d96407SAditya Gupta
6688c0d96407SAditya Gupta pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
6689c0d96407SAditya Gupta pcc->mmu_model = POWERPC_MMU_3_00;
6690c0d96407SAditya Gupta #if !defined(CONFIG_USER_ONLY)
6691c0d96407SAditya Gupta /* segment page size remain the same */
6692c0d96407SAditya Gupta pcc->hash64_opts = &ppc_hash64_opts_POWER7;
6693c0d96407SAditya Gupta pcc->radix_page_info = &POWER10_radix_page_info;
6694c0d96407SAditya Gupta pcc->lrg_decr_bits = 56;
6695c0d96407SAditya Gupta #endif
6696c0d96407SAditya Gupta pcc->excp_model = POWERPC_EXCP_POWER11;
6697c0d96407SAditya Gupta pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
6698c0d96407SAditya Gupta pcc->bfd_mach = bfd_mach_ppc64;
6699c0d96407SAditya Gupta pcc->flags = POWERPC_FLAGS_POWER11;
6700c0d96407SAditya Gupta pcc->l1_dcache_size = 0x8000;
6701c0d96407SAditya Gupta pcc->l1_icache_size = 0x8000;
6702c0d96407SAditya Gupta }
6703c0d96407SAditya Gupta
67043e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
cpu_ppc_set_vhyp(PowerPCCPU * cpu,PPCVirtualHypervisor * vhyp)67053e770bf7SBruno Larsen (billionai) void cpu_ppc_set_vhyp(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp)
67063e770bf7SBruno Larsen (billionai) {
67073e770bf7SBruno Larsen (billionai) CPUPPCState *env = &cpu->env;
67083e770bf7SBruno Larsen (billionai)
67093e770bf7SBruno Larsen (billionai) cpu->vhyp = vhyp;
6710c700b5e1SNicholas Piggin cpu->vhyp_class = PPC_VIRTUAL_HYPERVISOR_GET_CLASS(vhyp);
67113e770bf7SBruno Larsen (billionai)
67123e770bf7SBruno Larsen (billionai) /*
67133e770bf7SBruno Larsen (billionai) * With a virtual hypervisor mode we never allow the CPU to go
67143e770bf7SBruno Larsen (billionai) * hypervisor mode itself
67153e770bf7SBruno Larsen (billionai) */
67163e770bf7SBruno Larsen (billionai) env->msr_mask &= ~MSR_HVB;
67173e770bf7SBruno Larsen (billionai) }
67183e770bf7SBruno Larsen (billionai)
cpu_ppc_set_1lpar(PowerPCCPU * cpu)67193401ea3cSNicholas Piggin void cpu_ppc_set_1lpar(PowerPCCPU *cpu)
67203401ea3cSNicholas Piggin {
67213401ea3cSNicholas Piggin CPUPPCState *env = &cpu->env;
67223401ea3cSNicholas Piggin
67233401ea3cSNicholas Piggin /*
67243401ea3cSNicholas Piggin * pseries SMT means "LPAR per core" mode, e.g., msgsndp is usable
67253b5ea01eSNicholas Piggin * between threads. powernv be in either mode, and it mostly affects
67263b5ea01eSNicholas Piggin * supervisor visible registers and instructions.
67273401ea3cSNicholas Piggin */
67283401ea3cSNicholas Piggin if (env->flags & POWERPC_FLAG_SMT) {
67293401ea3cSNicholas Piggin env->flags |= POWERPC_FLAG_SMT_1LPAR;
67303401ea3cSNicholas Piggin }
67313401ea3cSNicholas Piggin }
67323e770bf7SBruno Larsen (billionai) #endif /* !defined(CONFIG_USER_ONLY) */
67333e770bf7SBruno Larsen (billionai)
67343e770bf7SBruno Larsen (billionai) #endif /* defined(TARGET_PPC64) */
67353e770bf7SBruno Larsen (billionai)
67363e770bf7SBruno Larsen (billionai) /*****************************************************************************/
67373e770bf7SBruno Larsen (billionai) /* Generic CPU instantiation routine */
init_ppc_proc(PowerPCCPU * cpu)67383e770bf7SBruno Larsen (billionai) static void init_ppc_proc(PowerPCCPU *cpu)
67393e770bf7SBruno Larsen (billionai) {
67403e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
67413e770bf7SBruno Larsen (billionai) CPUPPCState *env = &cpu->env;
67423e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
67433e770bf7SBruno Larsen (billionai) int i;
67443e770bf7SBruno Larsen (billionai)
67453e770bf7SBruno Larsen (billionai) /* Set all exception vectors to an invalid address */
67463e770bf7SBruno Larsen (billionai) for (i = 0; i < POWERPC_EXCP_NB; i++) {
67473e770bf7SBruno Larsen (billionai) env->excp_vectors[i] = (target_ulong)(-1ULL);
67483e770bf7SBruno Larsen (billionai) }
67493e770bf7SBruno Larsen (billionai) env->ivor_mask = 0x00000000;
67503e770bf7SBruno Larsen (billionai) env->ivpr_mask = 0x00000000;
67513e770bf7SBruno Larsen (billionai) /* Default MMU definitions */
67523e770bf7SBruno Larsen (billionai) env->nb_BATs = 0;
67533e770bf7SBruno Larsen (billionai) env->nb_tlb = 0;
67543e770bf7SBruno Larsen (billionai) env->nb_ways = 0;
67553e770bf7SBruno Larsen (billionai) env->tlb_type = TLB_NONE;
67563e770bf7SBruno Larsen (billionai) #endif
67573e770bf7SBruno Larsen (billionai) /* Register SPR common to all PowerPC implementations */
6758e78280a2SFabiano Rosas register_generic_sprs(cpu);
6759e78280a2SFabiano Rosas
67603e770bf7SBruno Larsen (billionai) /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
67613e770bf7SBruno Larsen (billionai) (*pcc->init_proc)(env);
67623e770bf7SBruno Larsen (billionai)
67633e770bf7SBruno Larsen (billionai) /* MSR bits & flags consistency checks */
67643e770bf7SBruno Larsen (billionai) if (env->msr_mask & (1 << 25)) {
67653e770bf7SBruno Larsen (billionai) switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
67663e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_SPE:
67673e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_VRE:
67683e770bf7SBruno Larsen (billionai) break;
67693e770bf7SBruno Larsen (billionai) default:
67703e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
67713e770bf7SBruno Larsen (billionai) "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
67723e770bf7SBruno Larsen (billionai) exit(1);
67733e770bf7SBruno Larsen (billionai) }
67743e770bf7SBruno Larsen (billionai) } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
67753e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
67763e770bf7SBruno Larsen (billionai) "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
67773e770bf7SBruno Larsen (billionai) exit(1);
67783e770bf7SBruno Larsen (billionai) }
67793e770bf7SBruno Larsen (billionai) if (env->msr_mask & (1 << 17)) {
67803e770bf7SBruno Larsen (billionai) switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
67813e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_TGPR:
67823e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_CE:
67833e770bf7SBruno Larsen (billionai) break;
67843e770bf7SBruno Larsen (billionai) default:
67853e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
67863e770bf7SBruno Larsen (billionai) "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
67873e770bf7SBruno Larsen (billionai) exit(1);
67883e770bf7SBruno Larsen (billionai) }
67893e770bf7SBruno Larsen (billionai) } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
67903e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
67913e770bf7SBruno Larsen (billionai) "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
67923e770bf7SBruno Larsen (billionai) exit(1);
67933e770bf7SBruno Larsen (billionai) }
67943e770bf7SBruno Larsen (billionai) if (env->msr_mask & (1 << 10)) {
67953e770bf7SBruno Larsen (billionai) switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
67963e770bf7SBruno Larsen (billionai) POWERPC_FLAG_UBLE)) {
67973e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_SE:
67983e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_DWE:
67993e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_UBLE:
68003e770bf7SBruno Larsen (billionai) break;
68013e770bf7SBruno Larsen (billionai) default:
68023e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68033e770bf7SBruno Larsen (billionai) "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
68043e770bf7SBruno Larsen (billionai) "POWERPC_FLAG_UBLE\n");
68053e770bf7SBruno Larsen (billionai) exit(1);
68063e770bf7SBruno Larsen (billionai) }
68073e770bf7SBruno Larsen (billionai) } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
68083e770bf7SBruno Larsen (billionai) POWERPC_FLAG_UBLE)) {
68093e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68103e770bf7SBruno Larsen (billionai) "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
68113e770bf7SBruno Larsen (billionai) "POWERPC_FLAG_UBLE\n");
68123e770bf7SBruno Larsen (billionai) exit(1);
68133e770bf7SBruno Larsen (billionai) }
68143e770bf7SBruno Larsen (billionai) if (env->msr_mask & (1 << 9)) {
68153e770bf7SBruno Larsen (billionai) switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
68163e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_BE:
68173e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_DE:
68183e770bf7SBruno Larsen (billionai) break;
68193e770bf7SBruno Larsen (billionai) default:
68203e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68213e770bf7SBruno Larsen (billionai) "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
68223e770bf7SBruno Larsen (billionai) exit(1);
68233e770bf7SBruno Larsen (billionai) }
68243e770bf7SBruno Larsen (billionai) } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
68253e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68263e770bf7SBruno Larsen (billionai) "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
68273e770bf7SBruno Larsen (billionai) exit(1);
68283e770bf7SBruno Larsen (billionai) }
68293e770bf7SBruno Larsen (billionai) if (env->msr_mask & (1 << 2)) {
68303e770bf7SBruno Larsen (billionai) switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
68313e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_PX:
68323e770bf7SBruno Larsen (billionai) case POWERPC_FLAG_PMM:
68333e770bf7SBruno Larsen (billionai) break;
68343e770bf7SBruno Larsen (billionai) default:
68353e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68363e770bf7SBruno Larsen (billionai) "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
68373e770bf7SBruno Larsen (billionai) exit(1);
68383e770bf7SBruno Larsen (billionai) }
68393e770bf7SBruno Larsen (billionai) } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
68403e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68413e770bf7SBruno Larsen (billionai) "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
68423e770bf7SBruno Larsen (billionai) exit(1);
68433e770bf7SBruno Larsen (billionai) }
6844005b69fdSCédric Le Goater if ((env->flags & POWERPC_FLAG_BUS_CLK) == 0) {
68453e770bf7SBruno Larsen (billionai) fprintf(stderr, "PowerPC flags inconsistency\n"
68463e770bf7SBruno Larsen (billionai) "Should define the time-base and decrementer clock source\n");
68473e770bf7SBruno Larsen (billionai) exit(1);
68483e770bf7SBruno Larsen (billionai) }
68493e770bf7SBruno Larsen (billionai) /* Allocate TLBs buffer when needed */
68503e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
68515fd257f5SBALATON Zoltan if (env->nb_tlb) {
68523e770bf7SBruno Larsen (billionai) switch (env->tlb_type) {
68533e770bf7SBruno Larsen (billionai) case TLB_6XX:
68545fd257f5SBALATON Zoltan /* 6xx has separate TLBs for instructions and data hence times 2 */
68555fd257f5SBALATON Zoltan env->tlb.tlb6 = g_new0(ppc6xx_tlb_t, 2 * env->nb_tlb);
68563e770bf7SBruno Larsen (billionai) break;
68573e770bf7SBruno Larsen (billionai) case TLB_EMB:
68585fd257f5SBALATON Zoltan env->tlb.tlbe = g_new0(ppcemb_tlb_t, env->nb_tlb);
68593e770bf7SBruno Larsen (billionai) break;
68603e770bf7SBruno Larsen (billionai) case TLB_MAS:
68615fd257f5SBALATON Zoltan env->tlb.tlbm = g_new0(ppcmas_tlb_t, env->nb_tlb);
68623e770bf7SBruno Larsen (billionai) break;
68633e770bf7SBruno Larsen (billionai) }
68643e770bf7SBruno Larsen (billionai) /* Pre-compute some useful values */
68653e770bf7SBruno Larsen (billionai) env->tlb_per_way = env->nb_tlb / env->nb_ways;
68663e770bf7SBruno Larsen (billionai) }
68673e770bf7SBruno Larsen (billionai) #endif
68683e770bf7SBruno Larsen (billionai) if (env->check_pow == NULL) {
68693e770bf7SBruno Larsen (billionai) warn_report("no power management check handler registered."
68703e770bf7SBruno Larsen (billionai) " Attempt QEMU to crash very soon !");
68713e770bf7SBruno Larsen (billionai) }
687245693f94SNicholas Piggin
687345693f94SNicholas Piggin if (env->check_attn == NULL) {
687445693f94SNicholas Piggin warn_report("no attn check handler registered."
687545693f94SNicholas Piggin " Attempt QEMU to crash very soon !");
687645693f94SNicholas Piggin }
68773e770bf7SBruno Larsen (billionai) }
68783e770bf7SBruno Larsen (billionai)
68793e770bf7SBruno Larsen (billionai)
ppc_cpu_realize(DeviceState * dev,Error ** errp)68803e770bf7SBruno Larsen (billionai) static void ppc_cpu_realize(DeviceState *dev, Error **errp)
68813e770bf7SBruno Larsen (billionai) {
68823e770bf7SBruno Larsen (billionai) CPUState *cs = CPU(dev);
68833e770bf7SBruno Larsen (billionai) PowerPCCPU *cpu = POWERPC_CPU(dev);
6884b769d4c8SNicholas Piggin CPUPPCState *env = &cpu->env;
68853e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
68863e770bf7SBruno Larsen (billionai) Error *local_err = NULL;
68873e770bf7SBruno Larsen (billionai)
68883e770bf7SBruno Larsen (billionai) cpu_exec_realizefn(cs, &local_err);
68893e770bf7SBruno Larsen (billionai) if (local_err != NULL) {
68903e770bf7SBruno Larsen (billionai) error_propagate(errp, local_err);
68913e770bf7SBruno Larsen (billionai) return;
68923e770bf7SBruno Larsen (billionai) }
68933e770bf7SBruno Larsen (billionai) if (cpu->vcpu_id == UNASSIGNED_CPU_INDEX) {
68943e770bf7SBruno Larsen (billionai) cpu->vcpu_id = cs->cpu_index;
68953e770bf7SBruno Larsen (billionai) }
68963e770bf7SBruno Larsen (billionai)
68973e770bf7SBruno Larsen (billionai) if (tcg_enabled()) {
68983e770bf7SBruno Larsen (billionai) if (ppc_fixup_cpu(cpu) != 0) {
68993e770bf7SBruno Larsen (billionai) error_setg(errp, "Unable to emulate selected CPU with TCG");
69003e770bf7SBruno Larsen (billionai) goto unrealize;
69013e770bf7SBruno Larsen (billionai) }
69023e770bf7SBruno Larsen (billionai) }
69033e770bf7SBruno Larsen (billionai)
69043e770bf7SBruno Larsen (billionai) create_ppc_opcodes(cpu, &local_err);
69053e770bf7SBruno Larsen (billionai) if (local_err != NULL) {
69063e770bf7SBruno Larsen (billionai) error_propagate(errp, local_err);
69073e770bf7SBruno Larsen (billionai) goto unrealize;
69083e770bf7SBruno Larsen (billionai) }
69093e770bf7SBruno Larsen (billionai) init_ppc_proc(cpu);
69103e770bf7SBruno Larsen (billionai)
69113e770bf7SBruno Larsen (billionai) ppc_gdb_init(cs, pcc);
69123e770bf7SBruno Larsen (billionai) qemu_init_vcpu(cs);
69133e770bf7SBruno Larsen (billionai)
69143e770bf7SBruno Larsen (billionai) pcc->parent_realize(dev, errp);
69153e770bf7SBruno Larsen (billionai)
691650d8cfb9SNicholas Piggin if (!ppc_cpu_core_single_threaded(cs)) {
6917b769d4c8SNicholas Piggin env->flags |= POWERPC_FLAG_SMT;
6918b769d4c8SNicholas Piggin }
6919b769d4c8SNicholas Piggin
69203e770bf7SBruno Larsen (billionai) return;
69213e770bf7SBruno Larsen (billionai)
69223e770bf7SBruno Larsen (billionai) unrealize:
69233e770bf7SBruno Larsen (billionai) cpu_exec_unrealizefn(cs);
69243e770bf7SBruno Larsen (billionai) }
69253e770bf7SBruno Larsen (billionai)
ppc_cpu_unrealize(DeviceState * dev)69263e770bf7SBruno Larsen (billionai) static void ppc_cpu_unrealize(DeviceState *dev)
69273e770bf7SBruno Larsen (billionai) {
69283e770bf7SBruno Larsen (billionai) PowerPCCPU *cpu = POWERPC_CPU(dev);
69293e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
69303e770bf7SBruno Larsen (billionai)
69313e770bf7SBruno Larsen (billionai) pcc->parent_unrealize(dev);
69323e770bf7SBruno Larsen (billionai)
69333e770bf7SBruno Larsen (billionai) cpu_remove_sync(CPU(cpu));
69343e770bf7SBruno Larsen (billionai)
69353e770bf7SBruno Larsen (billionai) destroy_ppc_opcodes(cpu);
69363e770bf7SBruno Larsen (billionai) }
69373e770bf7SBruno Larsen (billionai)
ppc_cpu_compare_class_pvr(gconstpointer a,gconstpointer b)69383e770bf7SBruno Larsen (billionai) static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
69393e770bf7SBruno Larsen (billionai) {
69403e770bf7SBruno Larsen (billionai) ObjectClass *oc = (ObjectClass *)a;
69413e770bf7SBruno Larsen (billionai) uint32_t pvr = *(uint32_t *)b;
69423e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
69433e770bf7SBruno Larsen (billionai)
69443e770bf7SBruno Larsen (billionai) /* -cpu host does a PVR lookup during construction */
69453e770bf7SBruno Larsen (billionai) if (unlikely(strcmp(object_class_get_name(oc),
69463e770bf7SBruno Larsen (billionai) TYPE_HOST_POWERPC_CPU) == 0)) {
69473e770bf7SBruno Larsen (billionai) return -1;
69483e770bf7SBruno Larsen (billionai) }
69493e770bf7SBruno Larsen (billionai)
69503e770bf7SBruno Larsen (billionai) return pcc->pvr == pvr ? 0 : -1;
69513e770bf7SBruno Larsen (billionai) }
69523e770bf7SBruno Larsen (billionai)
ppc_cpu_class_by_pvr(uint32_t pvr)69533e770bf7SBruno Larsen (billionai) PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
69543e770bf7SBruno Larsen (billionai) {
69553e770bf7SBruno Larsen (billionai) GSList *list, *item;
69563e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = NULL;
69573e770bf7SBruno Larsen (billionai)
69583e770bf7SBruno Larsen (billionai) list = object_class_get_list(TYPE_POWERPC_CPU, false);
69593e770bf7SBruno Larsen (billionai) item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
69603e770bf7SBruno Larsen (billionai) if (item != NULL) {
69613e770bf7SBruno Larsen (billionai) pcc = POWERPC_CPU_CLASS(item->data);
69623e770bf7SBruno Larsen (billionai) }
69633e770bf7SBruno Larsen (billionai) g_slist_free(list);
69643e770bf7SBruno Larsen (billionai)
69653e770bf7SBruno Larsen (billionai) return pcc;
69663e770bf7SBruno Larsen (billionai) }
69673e770bf7SBruno Larsen (billionai)
ppc_cpu_compare_class_pvr_mask(gconstpointer a,gconstpointer b)69683e770bf7SBruno Larsen (billionai) static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b)
69693e770bf7SBruno Larsen (billionai) {
69703e770bf7SBruno Larsen (billionai) ObjectClass *oc = (ObjectClass *)a;
69713e770bf7SBruno Larsen (billionai) uint32_t pvr = *(uint32_t *)b;
69723e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
69733e770bf7SBruno Larsen (billionai)
69743e770bf7SBruno Larsen (billionai) /* -cpu host does a PVR lookup during construction */
69753e770bf7SBruno Larsen (billionai) if (unlikely(strcmp(object_class_get_name(oc),
69763e770bf7SBruno Larsen (billionai) TYPE_HOST_POWERPC_CPU) == 0)) {
69773e770bf7SBruno Larsen (billionai) return -1;
69783e770bf7SBruno Larsen (billionai) }
69793e770bf7SBruno Larsen (billionai)
698021d3a78eSNicholas Piggin if (pcc->pvr_match(pcc, pvr, true)) {
69813e770bf7SBruno Larsen (billionai) return 0;
69823e770bf7SBruno Larsen (billionai) }
69833e770bf7SBruno Larsen (billionai)
69843e770bf7SBruno Larsen (billionai) return -1;
69853e770bf7SBruno Larsen (billionai) }
69863e770bf7SBruno Larsen (billionai)
ppc_cpu_class_by_pvr_mask(uint32_t pvr)69873e770bf7SBruno Larsen (billionai) PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr)
69883e770bf7SBruno Larsen (billionai) {
69893e770bf7SBruno Larsen (billionai) GSList *list, *item;
69903e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = NULL;
69913e770bf7SBruno Larsen (billionai)
69923e770bf7SBruno Larsen (billionai) list = object_class_get_list(TYPE_POWERPC_CPU, true);
69933e770bf7SBruno Larsen (billionai) item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr_mask);
69943e770bf7SBruno Larsen (billionai) if (item != NULL) {
69953e770bf7SBruno Larsen (billionai) pcc = POWERPC_CPU_CLASS(item->data);
69963e770bf7SBruno Larsen (billionai) }
69973e770bf7SBruno Larsen (billionai) g_slist_free(list);
69983e770bf7SBruno Larsen (billionai)
69993e770bf7SBruno Larsen (billionai) return pcc;
70003e770bf7SBruno Larsen (billionai) }
70013e770bf7SBruno Larsen (billionai)
ppc_cpu_lookup_alias(const char * alias)70023e770bf7SBruno Larsen (billionai) static const char *ppc_cpu_lookup_alias(const char *alias)
70033e770bf7SBruno Larsen (billionai) {
70043e770bf7SBruno Larsen (billionai) int ai;
70053e770bf7SBruno Larsen (billionai)
70063e770bf7SBruno Larsen (billionai) for (ai = 0; ppc_cpu_aliases[ai].alias != NULL; ai++) {
70073e770bf7SBruno Larsen (billionai) if (strcmp(ppc_cpu_aliases[ai].alias, alias) == 0) {
70083e770bf7SBruno Larsen (billionai) return ppc_cpu_aliases[ai].model;
70093e770bf7SBruno Larsen (billionai) }
70103e770bf7SBruno Larsen (billionai) }
70113e770bf7SBruno Larsen (billionai)
70123e770bf7SBruno Larsen (billionai) return NULL;
70133e770bf7SBruno Larsen (billionai) }
70143e770bf7SBruno Larsen (billionai)
ppc_cpu_class_by_name(const char * name)70150f3fea21SPhilippe Mathieu-Daudé ObjectClass *ppc_cpu_class_by_name(const char *name)
70163e770bf7SBruno Larsen (billionai) {
70173e770bf7SBruno Larsen (billionai) char *cpu_model, *typename;
70183e770bf7SBruno Larsen (billionai) ObjectClass *oc;
70193e770bf7SBruno Larsen (billionai) const char *p;
70203e770bf7SBruno Larsen (billionai) unsigned long pvr;
70213e770bf7SBruno Larsen (billionai)
70223e770bf7SBruno Larsen (billionai) /*
70233e770bf7SBruno Larsen (billionai) * Lookup by PVR if cpu_model is valid 8 digit hex number (excl:
70243e770bf7SBruno Larsen (billionai) * 0x prefix if present)
70253e770bf7SBruno Larsen (billionai) */
70263e770bf7SBruno Larsen (billionai) if (!qemu_strtoul(name, &p, 16, &pvr)) {
70273e770bf7SBruno Larsen (billionai) int len = p - name;
70283e770bf7SBruno Larsen (billionai) len = (len == 10) && (name[1] == 'x') ? len - 2 : len;
70293e770bf7SBruno Larsen (billionai) if ((len == 8) && (*p == '\0')) {
70303e770bf7SBruno Larsen (billionai) return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr));
70313e770bf7SBruno Larsen (billionai) }
70323e770bf7SBruno Larsen (billionai) }
70333e770bf7SBruno Larsen (billionai)
7034c7e89de1SMurilo Opsfelder Araujo /*
7035c7e89de1SMurilo Opsfelder Araujo * All ppc CPUs represent hardware that exists in the real world, i.e.: we
7036c7e89de1SMurilo Opsfelder Araujo * do not have a "max" CPU with all possible emulated features enabled.
7037c7e89de1SMurilo Opsfelder Araujo * Return the default CPU type for the machine because that has greater
7038c7e89de1SMurilo Opsfelder Araujo * chance of being useful as the "max" CPU.
7039c7e89de1SMurilo Opsfelder Araujo */
7040c7e89de1SMurilo Opsfelder Araujo #if !defined(CONFIG_USER_ONLY)
7041c7e89de1SMurilo Opsfelder Araujo if (strcmp(name, "max") == 0) {
7042c7e89de1SMurilo Opsfelder Araujo MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
7043c7e89de1SMurilo Opsfelder Araujo if (mc) {
7044c7e89de1SMurilo Opsfelder Araujo return object_class_by_name(mc->default_cpu_type);
7045c7e89de1SMurilo Opsfelder Araujo }
7046c7e89de1SMurilo Opsfelder Araujo }
7047c7e89de1SMurilo Opsfelder Araujo #endif
7048c7e89de1SMurilo Opsfelder Araujo
70493e770bf7SBruno Larsen (billionai) cpu_model = g_ascii_strdown(name, -1);
70503e770bf7SBruno Larsen (billionai) p = ppc_cpu_lookup_alias(cpu_model);
70513e770bf7SBruno Larsen (billionai) if (p) {
70523e770bf7SBruno Larsen (billionai) g_free(cpu_model);
70533e770bf7SBruno Larsen (billionai) cpu_model = g_strdup(p);
70543e770bf7SBruno Larsen (billionai) }
70553e770bf7SBruno Larsen (billionai)
70563e770bf7SBruno Larsen (billionai) typename = g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX, cpu_model);
70573e770bf7SBruno Larsen (billionai) oc = object_class_by_name(typename);
70583e770bf7SBruno Larsen (billionai) g_free(typename);
70593e770bf7SBruno Larsen (billionai) g_free(cpu_model);
70603e770bf7SBruno Larsen (billionai)
70613e770bf7SBruno Larsen (billionai) return oc;
70623e770bf7SBruno Larsen (billionai) }
70633e770bf7SBruno Larsen (billionai)
ppc_cpu_get_family_class(PowerPCCPUClass * pcc)70643e770bf7SBruno Larsen (billionai) PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
70653e770bf7SBruno Larsen (billionai) {
70663e770bf7SBruno Larsen (billionai) ObjectClass *oc = OBJECT_CLASS(pcc);
70673e770bf7SBruno Larsen (billionai)
70683e770bf7SBruno Larsen (billionai) while (oc && !object_class_is_abstract(oc)) {
70693e770bf7SBruno Larsen (billionai) oc = object_class_get_parent(oc);
70703e770bf7SBruno Larsen (billionai) }
70713e770bf7SBruno Larsen (billionai) assert(oc);
70723e770bf7SBruno Larsen (billionai)
70733e770bf7SBruno Larsen (billionai) return POWERPC_CPU_CLASS(oc);
70743e770bf7SBruno Larsen (billionai) }
70753e770bf7SBruno Larsen (billionai)
70763e770bf7SBruno Larsen (billionai) /* Sort by PVR, ordering special case "host" last. */
ppc_cpu_list_compare(gconstpointer a,gconstpointer b)70773e770bf7SBruno Larsen (billionai) static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
70783e770bf7SBruno Larsen (billionai) {
70793e770bf7SBruno Larsen (billionai) ObjectClass *oc_a = (ObjectClass *)a;
70803e770bf7SBruno Larsen (billionai) ObjectClass *oc_b = (ObjectClass *)b;
70813e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
70823e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
70833e770bf7SBruno Larsen (billionai) const char *name_a = object_class_get_name(oc_a);
70843e770bf7SBruno Larsen (billionai) const char *name_b = object_class_get_name(oc_b);
70853e770bf7SBruno Larsen (billionai)
70863e770bf7SBruno Larsen (billionai) if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
70873e770bf7SBruno Larsen (billionai) return 1;
70883e770bf7SBruno Larsen (billionai) } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
70893e770bf7SBruno Larsen (billionai) return -1;
70903e770bf7SBruno Larsen (billionai) } else {
70913e770bf7SBruno Larsen (billionai) /* Avoid an integer overflow during subtraction */
70923e770bf7SBruno Larsen (billionai) if (pcc_a->pvr < pcc_b->pvr) {
70933e770bf7SBruno Larsen (billionai) return -1;
70943e770bf7SBruno Larsen (billionai) } else if (pcc_a->pvr > pcc_b->pvr) {
70953e770bf7SBruno Larsen (billionai) return 1;
70963e770bf7SBruno Larsen (billionai) } else {
70973e770bf7SBruno Larsen (billionai) return 0;
70983e770bf7SBruno Larsen (billionai) }
70993e770bf7SBruno Larsen (billionai) }
71003e770bf7SBruno Larsen (billionai) }
71013e770bf7SBruno Larsen (billionai)
ppc_cpu_list_entry(gpointer data,gpointer user_data)71023e770bf7SBruno Larsen (billionai) static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
71033e770bf7SBruno Larsen (billionai) {
71043e770bf7SBruno Larsen (billionai) ObjectClass *oc = data;
71053e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
71063e770bf7SBruno Larsen (billionai) DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
71073e770bf7SBruno Larsen (billionai) const char *typename = object_class_get_name(oc);
71083e770bf7SBruno Larsen (billionai) char *name;
71093e770bf7SBruno Larsen (billionai) int i;
71103e770bf7SBruno Larsen (billionai)
71113e770bf7SBruno Larsen (billionai) if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) {
71123e770bf7SBruno Larsen (billionai) return;
71133e770bf7SBruno Larsen (billionai) }
71143e770bf7SBruno Larsen (billionai)
71154b26aa9fSGavin Shan name = cpu_model_from_type(typename);
71165b638f6eSThomas Huth qemu_printf(" %-16s PVR %08x\n", name, pcc->pvr);
71173e770bf7SBruno Larsen (billionai) for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
71183e770bf7SBruno Larsen (billionai) PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
71193e770bf7SBruno Larsen (billionai) ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
71203e770bf7SBruno Larsen (billionai)
71213e770bf7SBruno Larsen (billionai) if (alias_oc != oc) {
71223e770bf7SBruno Larsen (billionai) continue;
71233e770bf7SBruno Larsen (billionai) }
71243e770bf7SBruno Larsen (billionai) /*
71253e770bf7SBruno Larsen (billionai) * If running with KVM, we might update the family alias later, so
71263e770bf7SBruno Larsen (billionai) * avoid printing the wrong alias here and use "preferred" instead
71273e770bf7SBruno Larsen (billionai) */
71283e770bf7SBruno Larsen (billionai) if (strcmp(alias->alias, family->desc) == 0) {
71295b638f6eSThomas Huth qemu_printf(" %-16s (alias for preferred %s CPU)\n",
71303e770bf7SBruno Larsen (billionai) alias->alias, family->desc);
71313e770bf7SBruno Larsen (billionai) } else {
71325b638f6eSThomas Huth qemu_printf(" %-16s (alias for %s)\n",
71333e770bf7SBruno Larsen (billionai) alias->alias, name);
71343e770bf7SBruno Larsen (billionai) }
71353e770bf7SBruno Larsen (billionai) }
71363e770bf7SBruno Larsen (billionai) g_free(name);
71373e770bf7SBruno Larsen (billionai) }
71383e770bf7SBruno Larsen (billionai)
ppc_cpu_list(void)71393e770bf7SBruno Larsen (billionai) void ppc_cpu_list(void)
71403e770bf7SBruno Larsen (billionai) {
71413e770bf7SBruno Larsen (billionai) GSList *list;
71423e770bf7SBruno Larsen (billionai)
71435b638f6eSThomas Huth qemu_printf("Available CPUs:\n");
71443e770bf7SBruno Larsen (billionai) list = object_class_get_list(TYPE_POWERPC_CPU, false);
71453e770bf7SBruno Larsen (billionai) list = g_slist_sort(list, ppc_cpu_list_compare);
71463e770bf7SBruno Larsen (billionai) g_slist_foreach(list, ppc_cpu_list_entry, NULL);
71473e770bf7SBruno Larsen (billionai) g_slist_free(list);
71483e770bf7SBruno Larsen (billionai)
71493e770bf7SBruno Larsen (billionai) #ifdef CONFIG_KVM
71503e770bf7SBruno Larsen (billionai) qemu_printf("\n");
71515b638f6eSThomas Huth qemu_printf(" %s\n", "host");
71523e770bf7SBruno Larsen (billionai) #endif
71533e770bf7SBruno Larsen (billionai) }
71543e770bf7SBruno Larsen (billionai)
ppc_cpu_set_pc(CPUState * cs,vaddr value)71553e770bf7SBruno Larsen (billionai) static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
71563e770bf7SBruno Larsen (billionai) {
71573e770bf7SBruno Larsen (billionai) PowerPCCPU *cpu = POWERPC_CPU(cs);
71583e770bf7SBruno Larsen (billionai)
71593e770bf7SBruno Larsen (billionai) cpu->env.nip = value;
71603e770bf7SBruno Larsen (billionai) }
71613e770bf7SBruno Larsen (billionai)
ppc_cpu_get_pc(CPUState * cs)7162e4fdf9dfSRichard Henderson static vaddr ppc_cpu_get_pc(CPUState *cs)
7163e4fdf9dfSRichard Henderson {
7164e4fdf9dfSRichard Henderson PowerPCCPU *cpu = POWERPC_CPU(cs);
7165e4fdf9dfSRichard Henderson
7166e4fdf9dfSRichard Henderson return cpu->env.nip;
7167e4fdf9dfSRichard Henderson }
7168e4fdf9dfSRichard Henderson
7169049b4ad6SVaibhav Jain #ifdef CONFIG_TCG
ppc_restore_state_to_opc(CPUState * cs,const TranslationBlock * tb,const uint64_t * data)717061bd1d29SRichard Henderson static void ppc_restore_state_to_opc(CPUState *cs,
717161bd1d29SRichard Henderson const TranslationBlock *tb,
717261bd1d29SRichard Henderson const uint64_t *data)
717361bd1d29SRichard Henderson {
717461bd1d29SRichard Henderson PowerPCCPU *cpu = POWERPC_CPU(cs);
717561bd1d29SRichard Henderson
717661bd1d29SRichard Henderson cpu->env.nip = data[0];
717761bd1d29SRichard Henderson }
7178049b4ad6SVaibhav Jain #endif /* CONFIG_TCG */
717961bd1d29SRichard Henderson
ppc_cpu_has_work(CPUState * cs)71803e770bf7SBruno Larsen (billionai) static bool ppc_cpu_has_work(CPUState *cs)
71813e770bf7SBruno Larsen (billionai) {
7182ab9cfa04SMatheus Ferst return cs->interrupt_request & CPU_INTERRUPT_HARD;
71833e770bf7SBruno Larsen (billionai) }
71843e770bf7SBruno Larsen (billionai)
ppc_cpu_mmu_index(CPUState * cs,bool ifetch)7185f331e82cSRichard Henderson static int ppc_cpu_mmu_index(CPUState *cs, bool ifetch)
7186f331e82cSRichard Henderson {
7187f331e82cSRichard Henderson return ppc_env_mmu_index(cpu_env(cs), ifetch);
7188f331e82cSRichard Henderson }
7189f331e82cSRichard Henderson
ppc_cpu_reset_hold(Object * obj,ResetType type)7190ad80e367SPeter Maydell static void ppc_cpu_reset_hold(Object *obj, ResetType type)
71913e770bf7SBruno Larsen (billionai) {
7192348802b5SPhilippe Mathieu-Daudé CPUState *cs = CPU(obj);
7193348802b5SPhilippe Mathieu-Daudé PowerPCCPU *cpu = POWERPC_CPU(cs);
7194348802b5SPhilippe Mathieu-Daudé PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(obj);
71953e770bf7SBruno Larsen (billionai) CPUPPCState *env = &cpu->env;
71963e770bf7SBruno Larsen (billionai) target_ulong msr;
71973e770bf7SBruno Larsen (billionai) int i;
71983e770bf7SBruno Larsen (billionai)
7199a1c5d644SPeter Maydell if (pcc->parent_phases.hold) {
7200ad80e367SPeter Maydell pcc->parent_phases.hold(obj, type);
7201a1c5d644SPeter Maydell }
72023e770bf7SBruno Larsen (billionai)
72033e770bf7SBruno Larsen (billionai) msr = (target_ulong)0;
72043e770bf7SBruno Larsen (billionai) msr |= (target_ulong)MSR_HVB;
72053e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_EP;
72063e770bf7SBruno Larsen (billionai) #if defined(DO_SINGLE_STEP) && 0
72073e770bf7SBruno Larsen (billionai) /* Single step trace mode */
72083e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_SE;
72093e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_BE;
72103e770bf7SBruno Larsen (billionai) #endif
72113e770bf7SBruno Larsen (billionai) #if defined(CONFIG_USER_ONLY)
72123e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */
72133e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_FE0; /* Allow floating point exceptions */
72143e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_FE1;
72153e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */
72163e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_VSX; /* Allow VSX usage */
72173e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */
72183e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_PR;
72193e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
72203e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_TM; /* Transactional memory */
72213e770bf7SBruno Larsen (billionai) #endif
7222ee3eb3a7SMarc-André Lureau #if !TARGET_BIG_ENDIAN
72233e770bf7SBruno Larsen (billionai) msr |= (target_ulong)1 << MSR_LE; /* Little-endian user mode */
72243e770bf7SBruno Larsen (billionai) if (!((env->msr_mask >> MSR_LE) & 1)) {
72253e770bf7SBruno Larsen (billionai) fprintf(stderr, "Selected CPU does not support little-endian.\n");
72263e770bf7SBruno Larsen (billionai) exit(1);
72273e770bf7SBruno Larsen (billionai) }
72283e770bf7SBruno Larsen (billionai) #endif
72293e770bf7SBruno Larsen (billionai) #endif
72303e770bf7SBruno Larsen (billionai)
72313e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
72323e770bf7SBruno Larsen (billionai) if (mmu_is_64bit(env->mmu_model)) {
72333e770bf7SBruno Larsen (billionai) msr |= (1ULL << MSR_SF);
72343e770bf7SBruno Larsen (billionai) }
72353e770bf7SBruno Larsen (billionai) #endif
72363e770bf7SBruno Larsen (billionai)
72373e770bf7SBruno Larsen (billionai) hreg_store_msr(env, msr, 1);
72383e770bf7SBruno Larsen (billionai)
72393e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
72403e770bf7SBruno Larsen (billionai) env->nip = env->hreset_vector | env->excp_prefix;
724133edcde7SDaniel Henrique Barboza
724233edcde7SDaniel Henrique Barboza if (tcg_enabled()) {
7243348802b5SPhilippe Mathieu-Daudé cpu_breakpoint_remove_all(cs, BP_CPU);
7244348802b5SPhilippe Mathieu-Daudé cpu_watchpoint_remove_all(cs, BP_CPU);
72453e770bf7SBruno Larsen (billionai) if (env->mmu_model != POWERPC_MMU_REAL) {
72463e770bf7SBruno Larsen (billionai) ppc_tlb_invalidate_all(env);
72473e770bf7SBruno Larsen (billionai) }
7248a7138e28SGlenn Miles pmu_mmcr01a_updated(env);
724933edcde7SDaniel Henrique Barboza }
7250609b1c86SFrederic Barrat
7251609b1c86SFrederic Barrat /* clean any pending stop state */
7252609b1c86SFrederic Barrat env->resume_as_sreset = 0;
725333edcde7SDaniel Henrique Barboza #endif
72543e770bf7SBruno Larsen (billionai) hreg_compute_hflags(env);
72553e770bf7SBruno Larsen (billionai) env->reserve_addr = (target_ulong)-1ULL;
72563e770bf7SBruno Larsen (billionai) /* Be sure no exception or interrupt is pending */
72573e770bf7SBruno Larsen (billionai) env->pending_interrupts = 0;
7258348802b5SPhilippe Mathieu-Daudé cs->exception_index = POWERPC_EXCP_NONE;
72593e770bf7SBruno Larsen (billionai) env->error_code = 0;
72603e770bf7SBruno Larsen (billionai) ppc_irq_reset(cpu);
72613e770bf7SBruno Larsen (billionai)
72623e770bf7SBruno Larsen (billionai) /* tininess for underflow is detected before rounding */
72633e770bf7SBruno Larsen (billionai) set_float_detect_tininess(float_tininess_before_rounding,
72643e770bf7SBruno Larsen (billionai) &env->fp_status);
7265*5aaab56aSPeter Maydell /*
7266*5aaab56aSPeter Maydell * PowerPC propagation rules:
7267*5aaab56aSPeter Maydell * 1. A if it sNaN or qNaN
7268*5aaab56aSPeter Maydell * 2. B if it sNaN or qNaN
7269*5aaab56aSPeter Maydell * A signaling NaN is always silenced before returning it.
7270*5aaab56aSPeter Maydell */
7271*5aaab56aSPeter Maydell set_float_2nan_prop_rule(float_2nan_prop_ab, &env->fp_status);
7272*5aaab56aSPeter Maydell set_float_2nan_prop_rule(float_2nan_prop_ab, &env->vec_status);
72733e770bf7SBruno Larsen (billionai)
72743e770bf7SBruno Larsen (billionai) for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
72753e770bf7SBruno Larsen (billionai) ppc_spr_t *spr = &env->spr_cb[i];
72763e770bf7SBruno Larsen (billionai)
72773e770bf7SBruno Larsen (billionai) if (!spr->name) {
72783e770bf7SBruno Larsen (billionai) continue;
72793e770bf7SBruno Larsen (billionai) }
72803e770bf7SBruno Larsen (billionai) env->spr[i] = spr->default_value;
72813e770bf7SBruno Larsen (billionai) }
72824de4a470SGlenn Miles
72834de4a470SGlenn Miles #if defined(TARGET_PPC64)
72844de4a470SGlenn Miles bhrb_reset_state(env);
72854de4a470SGlenn Miles #endif
72863e770bf7SBruno Larsen (billionai) }
72873e770bf7SBruno Larsen (billionai)
72883e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
72893e770bf7SBruno Larsen (billionai)
ppc_cpu_is_big_endian(CPUState * cs)72903e770bf7SBruno Larsen (billionai) static bool ppc_cpu_is_big_endian(CPUState *cs)
72913e770bf7SBruno Larsen (billionai) {
72923e770bf7SBruno Larsen (billionai) cpu_synchronize_state(cs);
72933e770bf7SBruno Larsen (billionai)
7294794511bcSPhilippe Mathieu-Daudé return !FIELD_EX64(cpu_env(cs)->msr, MSR, LE);
72953e770bf7SBruno Larsen (billionai) }
72963e770bf7SBruno Larsen (billionai)
ppc_get_irq_stats(InterruptStatsProvider * obj,uint64_t ** irq_counts,unsigned int * nb_irqs)72978a15cceeSBALATON Zoltan static bool ppc_get_irq_stats(InterruptStatsProvider *obj,
72988a15cceeSBALATON Zoltan uint64_t **irq_counts, unsigned int *nb_irqs)
72998a15cceeSBALATON Zoltan {
73008a15cceeSBALATON Zoltan CPUPPCState *env = &POWERPC_CPU(obj)->env;
73018a15cceeSBALATON Zoltan
73028a15cceeSBALATON Zoltan *irq_counts = env->excp_stats;
73038a15cceeSBALATON Zoltan *nb_irqs = ARRAY_SIZE(env->excp_stats);
73048a15cceeSBALATON Zoltan return true;
73058a15cceeSBALATON Zoltan }
73068a15cceeSBALATON Zoltan
73073e770bf7SBruno Larsen (billionai) #ifdef CONFIG_TCG
ppc_cpu_exec_enter(CPUState * cs)73083e770bf7SBruno Larsen (billionai) static void ppc_cpu_exec_enter(CPUState *cs)
73093e770bf7SBruno Larsen (billionai) {
73103e770bf7SBruno Larsen (billionai) PowerPCCPU *cpu = POWERPC_CPU(cs);
73113e770bf7SBruno Larsen (billionai)
73123e770bf7SBruno Larsen (billionai) if (cpu->vhyp) {
7313c700b5e1SNicholas Piggin cpu->vhyp_class->cpu_exec_enter(cpu->vhyp, cpu);
73143e770bf7SBruno Larsen (billionai) }
73153e770bf7SBruno Larsen (billionai) }
73163e770bf7SBruno Larsen (billionai)
ppc_cpu_exec_exit(CPUState * cs)73173e770bf7SBruno Larsen (billionai) static void ppc_cpu_exec_exit(CPUState *cs)
73183e770bf7SBruno Larsen (billionai) {
73193e770bf7SBruno Larsen (billionai) PowerPCCPU *cpu = POWERPC_CPU(cs);
73203e770bf7SBruno Larsen (billionai)
73213e770bf7SBruno Larsen (billionai) if (cpu->vhyp) {
7322c700b5e1SNicholas Piggin cpu->vhyp_class->cpu_exec_exit(cpu->vhyp, cpu);
73233e770bf7SBruno Larsen (billionai) }
73243e770bf7SBruno Larsen (billionai) }
73253e770bf7SBruno Larsen (billionai) #endif /* CONFIG_TCG */
73263e770bf7SBruno Larsen (billionai)
73273e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
73283e770bf7SBruno Larsen (billionai)
ppc_cpu_instance_init(Object * obj)73293e770bf7SBruno Larsen (billionai) static void ppc_cpu_instance_init(Object *obj)
73303e770bf7SBruno Larsen (billionai) {
73313e770bf7SBruno Larsen (billionai) PowerPCCPU *cpu = POWERPC_CPU(obj);
73323e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
73333e770bf7SBruno Larsen (billionai) CPUPPCState *env = &cpu->env;
73343e770bf7SBruno Larsen (billionai)
73353e770bf7SBruno Larsen (billionai) cpu->vcpu_id = UNASSIGNED_CPU_INDEX;
73363e770bf7SBruno Larsen (billionai)
73373e770bf7SBruno Larsen (billionai) env->msr_mask = pcc->msr_mask;
73383e770bf7SBruno Larsen (billionai) env->mmu_model = pcc->mmu_model;
73393e770bf7SBruno Larsen (billionai) env->excp_model = pcc->excp_model;
73403e770bf7SBruno Larsen (billionai) env->bus_model = pcc->bus_model;
73413e770bf7SBruno Larsen (billionai) env->insns_flags = pcc->insns_flags;
73423e770bf7SBruno Larsen (billionai) env->insns_flags2 = pcc->insns_flags2;
73433e770bf7SBruno Larsen (billionai) env->flags = pcc->flags;
73443e770bf7SBruno Larsen (billionai) env->bfd_mach = pcc->bfd_mach;
73453e770bf7SBruno Larsen (billionai) env->check_pow = pcc->check_pow;
734645693f94SNicholas Piggin env->check_attn = pcc->check_attn;
73473e770bf7SBruno Larsen (billionai)
73483e770bf7SBruno Larsen (billionai) /*
73493e770bf7SBruno Larsen (billionai) * Mark HV mode as supported if the CPU has an MSR_HV bit in the
73503e770bf7SBruno Larsen (billionai) * msr_mask. The mask can later be cleared by PAPR mode but the hv
73513e770bf7SBruno Larsen (billionai) * mode support will remain, thus enforcing that we cannot use
73523e770bf7SBruno Larsen (billionai) * priv. instructions in guest in PAPR mode. For 970 we currently
73533e770bf7SBruno Larsen (billionai) * simply don't set HV in msr_mask thus simulating an "Apple mode"
73543e770bf7SBruno Larsen (billionai) * 970. If we ever want to support 970 HV mode, we'll have to add
73553e770bf7SBruno Larsen (billionai) * a processor attribute of some sort.
73563e770bf7SBruno Larsen (billionai) */
73573e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
73583e770bf7SBruno Larsen (billionai) env->has_hv_mode = !!(env->msr_mask & MSR_HVB);
73593e770bf7SBruno Larsen (billionai) #endif
73603e770bf7SBruno Larsen (billionai)
73613e770bf7SBruno Larsen (billionai) ppc_hash64_init(cpu);
73623e770bf7SBruno Larsen (billionai) }
73633e770bf7SBruno Larsen (billionai)
ppc_cpu_instance_finalize(Object * obj)73643e770bf7SBruno Larsen (billionai) static void ppc_cpu_instance_finalize(Object *obj)
73653e770bf7SBruno Larsen (billionai) {
73663e770bf7SBruno Larsen (billionai) PowerPCCPU *cpu = POWERPC_CPU(obj);
73673e770bf7SBruno Larsen (billionai)
73683e770bf7SBruno Larsen (billionai) ppc_hash64_finalize(cpu);
73693e770bf7SBruno Larsen (billionai) }
73703e770bf7SBruno Larsen (billionai)
ppc_pvr_match_default(PowerPCCPUClass * pcc,uint32_t pvr,bool best)737121d3a78eSNicholas Piggin static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
73723e770bf7SBruno Larsen (billionai) {
73733e770bf7SBruno Larsen (billionai) return pcc->pvr == pvr;
73743e770bf7SBruno Larsen (billionai) }
73753e770bf7SBruno Larsen (billionai)
ppc_disas_set_info(CPUState * cs,disassemble_info * info)73763e770bf7SBruno Larsen (billionai) static void ppc_disas_set_info(CPUState *cs, disassemble_info *info)
73773e770bf7SBruno Larsen (billionai) {
7378794511bcSPhilippe Mathieu-Daudé CPUPPCState *env = cpu_env(cs);
73793e770bf7SBruno Larsen (billionai)
73803e770bf7SBruno Larsen (billionai) if ((env->hflags >> MSR_LE) & 1) {
73813e770bf7SBruno Larsen (billionai) info->endian = BFD_ENDIAN_LITTLE;
73823e770bf7SBruno Larsen (billionai) }
73833e770bf7SBruno Larsen (billionai) info->mach = env->bfd_mach;
73843e770bf7SBruno Larsen (billionai) if (!env->bfd_mach) {
73853e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
73863e770bf7SBruno Larsen (billionai) info->mach = bfd_mach_ppc64;
73873e770bf7SBruno Larsen (billionai) #else
73883e770bf7SBruno Larsen (billionai) info->mach = bfd_mach_ppc;
73893e770bf7SBruno Larsen (billionai) #endif
73903e770bf7SBruno Larsen (billionai) }
73913e770bf7SBruno Larsen (billionai)
73923e770bf7SBruno Larsen (billionai) info->cap_arch = CS_ARCH_PPC;
73933e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
73943e770bf7SBruno Larsen (billionai) info->cap_mode = CS_MODE_64;
73953e770bf7SBruno Larsen (billionai) #endif
73963e770bf7SBruno Larsen (billionai) }
73973e770bf7SBruno Larsen (billionai)
73983e770bf7SBruno Larsen (billionai) static Property ppc_cpu_properties[] = {
7399c1a13064SHarsh Prateek Bora /* add default property here */
74003e770bf7SBruno Larsen (billionai) DEFINE_PROP_END_OF_LIST(),
74013e770bf7SBruno Larsen (billionai) };
74023e770bf7SBruno Larsen (billionai)
74038b80bd28SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
74048b80bd28SPhilippe Mathieu-Daudé #include "hw/core/sysemu-cpu-ops.h"
74058b80bd28SPhilippe Mathieu-Daudé
74068b80bd28SPhilippe Mathieu-Daudé static const struct SysemuCPUOps ppc_sysemu_ops = {
740708928c6dSPhilippe Mathieu-Daudé .get_phys_page_debug = ppc_cpu_get_phys_page_debug,
7408715e3c1aSPhilippe Mathieu-Daudé .write_elf32_note = ppc32_cpu_write_elf32_note,
7409715e3c1aSPhilippe Mathieu-Daudé .write_elf64_note = ppc64_cpu_write_elf64_note,
7410da383e02SPhilippe Mathieu-Daudé .virtio_is_big_endian = ppc_cpu_is_big_endian,
7411feece4d0SPhilippe Mathieu-Daudé .legacy_vmsd = &vmstate_ppc_cpu,
74128b80bd28SPhilippe Mathieu-Daudé };
74138b80bd28SPhilippe Mathieu-Daudé #endif
74148b80bd28SPhilippe Mathieu-Daudé
74153e770bf7SBruno Larsen (billionai) #ifdef CONFIG_TCG
74163e770bf7SBruno Larsen (billionai) #include "hw/core/tcg-cpu-ops.h"
74173e770bf7SBruno Larsen (billionai)
74181764ad70SRichard Henderson static const TCGCPUOps ppc_tcg_ops = {
74193e770bf7SBruno Larsen (billionai) .initialize = ppc_translate_init,
742061bd1d29SRichard Henderson .restore_state_to_opc = ppc_restore_state_to_opc,
74213e770bf7SBruno Larsen (billionai)
74221db8af5cSRichard Henderson #ifdef CONFIG_USER_ONLY
74231db8af5cSRichard Henderson .record_sigsegv = ppc_cpu_record_sigsegv,
74241db8af5cSRichard Henderson #else
74251db8af5cSRichard Henderson .tlb_fill = ppc_cpu_tlb_fill,
7426f725245cSPhilippe Mathieu-Daudé .cpu_exec_interrupt = ppc_cpu_exec_interrupt,
74274f7b1ecbSPeter Maydell .cpu_exec_halt = ppc_cpu_has_work,
74283e770bf7SBruno Larsen (billionai) .do_interrupt = ppc_cpu_do_interrupt,
74293e770bf7SBruno Larsen (billionai) .cpu_exec_enter = ppc_cpu_exec_enter,
74303e770bf7SBruno Larsen (billionai) .cpu_exec_exit = ppc_cpu_exec_exit,
74313e770bf7SBruno Larsen (billionai) .do_unaligned_access = ppc_cpu_do_unaligned_access,
743255a7fa34SNicholas Piggin .do_transaction_failed = ppc_cpu_do_transaction_failed,
743314192307SNicholas Piggin .debug_excp_handler = ppc_cpu_debug_excp_handler,
743414192307SNicholas Piggin .debug_check_breakpoint = ppc_cpu_debug_check_breakpoint,
7435d5ee641cSNicholas Piggin .debug_check_watchpoint = ppc_cpu_debug_check_watchpoint,
74363e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
74373e770bf7SBruno Larsen (billionai) };
74383e770bf7SBruno Larsen (billionai) #endif /* CONFIG_TCG */
74393e770bf7SBruno Larsen (billionai)
ppc_cpu_class_init(ObjectClass * oc,void * data)74403e770bf7SBruno Larsen (billionai) static void ppc_cpu_class_init(ObjectClass *oc, void *data)
74413e770bf7SBruno Larsen (billionai) {
74423e770bf7SBruno Larsen (billionai) PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
74433e770bf7SBruno Larsen (billionai) CPUClass *cc = CPU_CLASS(oc);
74443e770bf7SBruno Larsen (billionai) DeviceClass *dc = DEVICE_CLASS(oc);
7445a1c5d644SPeter Maydell ResettableClass *rc = RESETTABLE_CLASS(oc);
74463e770bf7SBruno Larsen (billionai)
74473e770bf7SBruno Larsen (billionai) device_class_set_parent_realize(dc, ppc_cpu_realize,
74483e770bf7SBruno Larsen (billionai) &pcc->parent_realize);
74493e770bf7SBruno Larsen (billionai) device_class_set_parent_unrealize(dc, ppc_cpu_unrealize,
74503e770bf7SBruno Larsen (billionai) &pcc->parent_unrealize);
74513e770bf7SBruno Larsen (billionai) pcc->pvr_match = ppc_pvr_match_default;
74523e770bf7SBruno Larsen (billionai) device_class_set_props(dc, ppc_cpu_properties);
74533e770bf7SBruno Larsen (billionai)
7454a1c5d644SPeter Maydell resettable_class_set_parent_phases(rc, NULL, ppc_cpu_reset_hold, NULL,
7455a1c5d644SPeter Maydell &pcc->parent_phases);
74563e770bf7SBruno Larsen (billionai)
74573e770bf7SBruno Larsen (billionai) cc->class_by_name = ppc_cpu_class_by_name;
74583e770bf7SBruno Larsen (billionai) cc->has_work = ppc_cpu_has_work;
7459f331e82cSRichard Henderson cc->mmu_index = ppc_cpu_mmu_index;
74603e770bf7SBruno Larsen (billionai) cc->dump_state = ppc_cpu_dump_state;
74613e770bf7SBruno Larsen (billionai) cc->set_pc = ppc_cpu_set_pc;
7462e4fdf9dfSRichard Henderson cc->get_pc = ppc_cpu_get_pc;
74633e770bf7SBruno Larsen (billionai) cc->gdb_read_register = ppc_cpu_gdb_read_register;
74643e770bf7SBruno Larsen (billionai) cc->gdb_write_register = ppc_cpu_gdb_write_register;
74653e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
74668b80bd28SPhilippe Mathieu-Daudé cc->sysemu_ops = &ppc_sysemu_ops;
74678a15cceeSBALATON Zoltan INTERRUPT_STATS_PROVIDER_CLASS(oc)->get_statistics = ppc_get_irq_stats;
7468cd1038ecSBALATON Zoltan
7469cd1038ecSBALATON Zoltan /* check_prot_access_type relies on MMU access and PAGE bits relations */
7470cd1038ecSBALATON Zoltan qemu_build_assert(MMU_DATA_LOAD == 0 && MMU_DATA_STORE == 1 &&
7471cd1038ecSBALATON Zoltan MMU_INST_FETCH == 2 && PAGE_READ == 1 &&
7472cd1038ecSBALATON Zoltan PAGE_WRITE == 2 && PAGE_EXEC == 4);
74733e770bf7SBruno Larsen (billionai) #endif
74743e770bf7SBruno Larsen (billionai)
74753e770bf7SBruno Larsen (billionai) cc->gdb_num_core_regs = 71;
74763e770bf7SBruno Larsen (billionai) #ifdef USE_APPLE_GDB
74773e770bf7SBruno Larsen (billionai) cc->gdb_read_register = ppc_cpu_gdb_read_register_apple;
74783e770bf7SBruno Larsen (billionai) cc->gdb_write_register = ppc_cpu_gdb_write_register_apple;
74793e770bf7SBruno Larsen (billionai) cc->gdb_num_core_regs = 71 + 32;
74803e770bf7SBruno Larsen (billionai) #endif
74813e770bf7SBruno Larsen (billionai)
74823e770bf7SBruno Larsen (billionai) cc->gdb_arch_name = ppc_gdb_arch_name;
74833e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
74843e770bf7SBruno Larsen (billionai) cc->gdb_core_xml_file = "power64-core.xml";
74853e770bf7SBruno Larsen (billionai) #else
74863e770bf7SBruno Larsen (billionai) cc->gdb_core_xml_file = "power-core.xml";
74873e770bf7SBruno Larsen (billionai) #endif
74883e770bf7SBruno Larsen (billionai) cc->disas_set_info = ppc_disas_set_info;
74893e770bf7SBruno Larsen (billionai)
74903e770bf7SBruno Larsen (billionai) dc->fw_name = "PowerPC,UNKNOWN";
74913e770bf7SBruno Larsen (billionai)
74923e770bf7SBruno Larsen (billionai) #ifdef CONFIG_TCG
74933e770bf7SBruno Larsen (billionai) cc->tcg_ops = &ppc_tcg_ops;
74943e770bf7SBruno Larsen (billionai) #endif /* CONFIG_TCG */
74953e770bf7SBruno Larsen (billionai) }
74963e770bf7SBruno Larsen (billionai)
74973e770bf7SBruno Larsen (billionai) static const TypeInfo ppc_cpu_type_info = {
74983e770bf7SBruno Larsen (billionai) .name = TYPE_POWERPC_CPU,
74993e770bf7SBruno Larsen (billionai) .parent = TYPE_CPU,
75003e770bf7SBruno Larsen (billionai) .instance_size = sizeof(PowerPCCPU),
75013e770bf7SBruno Larsen (billionai) .instance_align = __alignof__(PowerPCCPU),
75023e770bf7SBruno Larsen (billionai) .instance_init = ppc_cpu_instance_init,
75033e770bf7SBruno Larsen (billionai) .instance_finalize = ppc_cpu_instance_finalize,
75043e770bf7SBruno Larsen (billionai) .abstract = true,
75053e770bf7SBruno Larsen (billionai) .class_size = sizeof(PowerPCCPUClass),
75063e770bf7SBruno Larsen (billionai) .class_init = ppc_cpu_class_init,
75078a15cceeSBALATON Zoltan #ifndef CONFIG_USER_ONLY
75088a15cceeSBALATON Zoltan .interfaces = (InterfaceInfo[]) {
75098a15cceeSBALATON Zoltan { TYPE_INTERRUPT_STATS_PROVIDER },
75108a15cceeSBALATON Zoltan { }
75118a15cceeSBALATON Zoltan },
75128a15cceeSBALATON Zoltan #endif
75133e770bf7SBruno Larsen (billionai) };
75143e770bf7SBruno Larsen (billionai)
75153e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
75163e770bf7SBruno Larsen (billionai) static const TypeInfo ppc_vhyp_type_info = {
75173e770bf7SBruno Larsen (billionai) .name = TYPE_PPC_VIRTUAL_HYPERVISOR,
75183e770bf7SBruno Larsen (billionai) .parent = TYPE_INTERFACE,
75193e770bf7SBruno Larsen (billionai) .class_size = sizeof(PPCVirtualHypervisorClass),
75203e770bf7SBruno Larsen (billionai) };
75213e770bf7SBruno Larsen (billionai) #endif
75223e770bf7SBruno Larsen (billionai)
ppc_cpu_register_types(void)75233e770bf7SBruno Larsen (billionai) static void ppc_cpu_register_types(void)
75243e770bf7SBruno Larsen (billionai) {
75253e770bf7SBruno Larsen (billionai) type_register_static(&ppc_cpu_type_info);
75263e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
75273e770bf7SBruno Larsen (billionai) type_register_static(&ppc_vhyp_type_info);
75283e770bf7SBruno Larsen (billionai) #endif
75293e770bf7SBruno Larsen (billionai) }
75303e770bf7SBruno Larsen (billionai)
ppc_cpu_dump_state(CPUState * cs,FILE * f,int flags)753147334e17SBruno Larsen (billionai) void ppc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
753247334e17SBruno Larsen (billionai) {
753347334e17SBruno Larsen (billionai) #define RGPL 4
753447334e17SBruno Larsen (billionai) #define RFPL 4
753547334e17SBruno Larsen (billionai)
7536794511bcSPhilippe Mathieu-Daudé CPUPPCState *env = cpu_env(cs);
753747334e17SBruno Larsen (billionai) int i;
753847334e17SBruno Larsen (billionai)
753947334e17SBruno Larsen (billionai) qemu_fprintf(f, "NIP " TARGET_FMT_lx " LR " TARGET_FMT_lx " CTR "
754047334e17SBruno Larsen (billionai) TARGET_FMT_lx " XER " TARGET_FMT_lx " CPU#%d\n",
754147334e17SBruno Larsen (billionai) env->nip, env->lr, env->ctr, cpu_read_xer(env),
754247334e17SBruno Larsen (billionai) cs->cpu_index);
754347334e17SBruno Larsen (billionai) qemu_fprintf(f, "MSR " TARGET_FMT_lx " HID0 " TARGET_FMT_lx " HF "
754447334e17SBruno Larsen (billionai) "%08x iidx %d didx %d\n",
754547334e17SBruno Larsen (billionai) env->msr, env->spr[SPR_HID0], env->hflags,
7546fb00f730SRichard Henderson ppc_env_mmu_index(env, true), ppc_env_mmu_index(env, false));
75473778aa97SMatheus Ferst #if !defined(CONFIG_USER_ONLY)
75483778aa97SMatheus Ferst if (env->tb_env) {
754947334e17SBruno Larsen (billionai) qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64
75503778aa97SMatheus Ferst " DECR " TARGET_FMT_lu "\n", cpu_ppc_load_tbu(env),
75513778aa97SMatheus Ferst cpu_ppc_load_tbl(env), cpu_ppc_load_decr(env));
75523778aa97SMatheus Ferst }
75533778aa97SMatheus Ferst #else
75543778aa97SMatheus Ferst qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64 "\n", cpu_ppc_load_tbu(env),
75553778aa97SMatheus Ferst cpu_ppc_load_tbl(env));
755647334e17SBruno Larsen (billionai) #endif
755747334e17SBruno Larsen (billionai) for (i = 0; i < 32; i++) {
755847334e17SBruno Larsen (billionai) if ((i & (RGPL - 1)) == 0) {
755947334e17SBruno Larsen (billionai) qemu_fprintf(f, "GPR%02d", i);
756047334e17SBruno Larsen (billionai) }
756147334e17SBruno Larsen (billionai) qemu_fprintf(f, " %016" PRIx64, ppc_dump_gpr(env, i));
756247334e17SBruno Larsen (billionai) if ((i & (RGPL - 1)) == (RGPL - 1)) {
756347334e17SBruno Larsen (billionai) qemu_fprintf(f, "\n");
756447334e17SBruno Larsen (billionai) }
756547334e17SBruno Larsen (billionai) }
756647334e17SBruno Larsen (billionai) qemu_fprintf(f, "CR ");
756747334e17SBruno Larsen (billionai) for (i = 0; i < 8; i++)
756847334e17SBruno Larsen (billionai) qemu_fprintf(f, "%01x", env->crf[i]);
756947334e17SBruno Larsen (billionai) qemu_fprintf(f, " [");
757047334e17SBruno Larsen (billionai) for (i = 0; i < 8; i++) {
757147334e17SBruno Larsen (billionai) char a = '-';
757247334e17SBruno Larsen (billionai) if (env->crf[i] & 0x08) {
757347334e17SBruno Larsen (billionai) a = 'L';
757447334e17SBruno Larsen (billionai) } else if (env->crf[i] & 0x04) {
757547334e17SBruno Larsen (billionai) a = 'G';
757647334e17SBruno Larsen (billionai) } else if (env->crf[i] & 0x02) {
757747334e17SBruno Larsen (billionai) a = 'E';
757847334e17SBruno Larsen (billionai) }
757947334e17SBruno Larsen (billionai) qemu_fprintf(f, " %c%c", a, env->crf[i] & 0x01 ? 'O' : ' ');
758047334e17SBruno Larsen (billionai) }
7581392d328aSNicholas Piggin qemu_fprintf(f, " ] RES %03x@" TARGET_FMT_lx "\n",
7582392d328aSNicholas Piggin (int)env->reserve_length, env->reserve_addr);
758347334e17SBruno Larsen (billionai)
758447334e17SBruno Larsen (billionai) if (flags & CPU_DUMP_FPU) {
758547334e17SBruno Larsen (billionai) for (i = 0; i < 32; i++) {
758647334e17SBruno Larsen (billionai) if ((i & (RFPL - 1)) == 0) {
758747334e17SBruno Larsen (billionai) qemu_fprintf(f, "FPR%02d", i);
758847334e17SBruno Larsen (billionai) }
758947334e17SBruno Larsen (billionai) qemu_fprintf(f, " %016" PRIx64, *cpu_fpr_ptr(env, i));
759047334e17SBruno Larsen (billionai) if ((i & (RFPL - 1)) == (RFPL - 1)) {
759147334e17SBruno Larsen (billionai) qemu_fprintf(f, "\n");
759247334e17SBruno Larsen (billionai) }
759347334e17SBruno Larsen (billionai) }
759447334e17SBruno Larsen (billionai) qemu_fprintf(f, "FPSCR " TARGET_FMT_lx "\n", env->fpscr);
759547334e17SBruno Larsen (billionai) }
759647334e17SBruno Larsen (billionai)
759747334e17SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
759847334e17SBruno Larsen (billionai) qemu_fprintf(f, " SRR0 " TARGET_FMT_lx " SRR1 " TARGET_FMT_lx
759947334e17SBruno Larsen (billionai) " PVR " TARGET_FMT_lx " VRSAVE " TARGET_FMT_lx "\n",
760047334e17SBruno Larsen (billionai) env->spr[SPR_SRR0], env->spr[SPR_SRR1],
760147334e17SBruno Larsen (billionai) env->spr[SPR_PVR], env->spr[SPR_VRSAVE]);
760247334e17SBruno Larsen (billionai)
760347334e17SBruno Larsen (billionai) qemu_fprintf(f, "SPRG0 " TARGET_FMT_lx " SPRG1 " TARGET_FMT_lx
760447334e17SBruno Larsen (billionai) " SPRG2 " TARGET_FMT_lx " SPRG3 " TARGET_FMT_lx "\n",
760547334e17SBruno Larsen (billionai) env->spr[SPR_SPRG0], env->spr[SPR_SPRG1],
760647334e17SBruno Larsen (billionai) env->spr[SPR_SPRG2], env->spr[SPR_SPRG3]);
760747334e17SBruno Larsen (billionai)
760847334e17SBruno Larsen (billionai) qemu_fprintf(f, "SPRG4 " TARGET_FMT_lx " SPRG5 " TARGET_FMT_lx
760947334e17SBruno Larsen (billionai) " SPRG6 " TARGET_FMT_lx " SPRG7 " TARGET_FMT_lx "\n",
761047334e17SBruno Larsen (billionai) env->spr[SPR_SPRG4], env->spr[SPR_SPRG5],
761147334e17SBruno Larsen (billionai) env->spr[SPR_SPRG6], env->spr[SPR_SPRG7]);
761247334e17SBruno Larsen (billionai)
7613fbe08667SCédric Le Goater switch (env->excp_model) {
761447334e17SBruno Larsen (billionai) #if defined(TARGET_PPC64)
7615fbe08667SCédric Le Goater case POWERPC_EXCP_POWER7:
7616fbe08667SCédric Le Goater case POWERPC_EXCP_POWER8:
7617fbe08667SCédric Le Goater case POWERPC_EXCP_POWER9:
7618fbe08667SCédric Le Goater case POWERPC_EXCP_POWER10:
761947334e17SBruno Larsen (billionai) qemu_fprintf(f, "HSRR0 " TARGET_FMT_lx " HSRR1 " TARGET_FMT_lx "\n",
762047334e17SBruno Larsen (billionai) env->spr[SPR_HSRR0], env->spr[SPR_HSRR1]);
7621fbe08667SCédric Le Goater break;
762247334e17SBruno Larsen (billionai) #endif
7623fbe08667SCédric Le Goater case POWERPC_EXCP_BOOKE:
762447334e17SBruno Larsen (billionai) qemu_fprintf(f, "CSRR0 " TARGET_FMT_lx " CSRR1 " TARGET_FMT_lx
762547334e17SBruno Larsen (billionai) " MCSRR0 " TARGET_FMT_lx " MCSRR1 " TARGET_FMT_lx "\n",
762647334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_CSRR0], env->spr[SPR_BOOKE_CSRR1],
762747334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_MCSRR0], env->spr[SPR_BOOKE_MCSRR1]);
762847334e17SBruno Larsen (billionai)
762947334e17SBruno Larsen (billionai) qemu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx
763047334e17SBruno Larsen (billionai) " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx "\n",
763147334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_TCR], env->spr[SPR_BOOKE_TSR],
763247334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_ESR], env->spr[SPR_BOOKE_DEAR]);
763347334e17SBruno Larsen (billionai)
763447334e17SBruno Larsen (billionai) qemu_fprintf(f, " PIR " TARGET_FMT_lx " DECAR " TARGET_FMT_lx
763547334e17SBruno Larsen (billionai) " IVPR " TARGET_FMT_lx " EPCR " TARGET_FMT_lx "\n",
763647334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_PIR], env->spr[SPR_BOOKE_DECAR],
763747334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_IVPR], env->spr[SPR_BOOKE_EPCR]);
763847334e17SBruno Larsen (billionai)
763947334e17SBruno Larsen (billionai) qemu_fprintf(f, " MCSR " TARGET_FMT_lx " SPRG8 " TARGET_FMT_lx
764047334e17SBruno Larsen (billionai) " EPR " TARGET_FMT_lx "\n",
764147334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_MCSR], env->spr[SPR_BOOKE_SPRG8],
764247334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_EPR]);
764347334e17SBruno Larsen (billionai)
764447334e17SBruno Larsen (billionai) /* FSL-specific */
764547334e17SBruno Larsen (billionai) qemu_fprintf(f, " MCAR " TARGET_FMT_lx " PID1 " TARGET_FMT_lx
764647334e17SBruno Larsen (billionai) " PID2 " TARGET_FMT_lx " SVR " TARGET_FMT_lx "\n",
764747334e17SBruno Larsen (billionai) env->spr[SPR_Exxx_MCAR], env->spr[SPR_BOOKE_PID1],
764847334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_PID2], env->spr[SPR_E500_SVR]);
764947334e17SBruno Larsen (billionai)
765047334e17SBruno Larsen (billionai) /*
765147334e17SBruno Larsen (billionai) * IVORs are left out as they are large and do not change often --
765247334e17SBruno Larsen (billionai) * they can be read with "p $ivor0", "p $ivor1", etc.
765347334e17SBruno Larsen (billionai) */
7654fbe08667SCédric Le Goater break;
7655fbe08667SCédric Le Goater case POWERPC_EXCP_40x:
7656fbe08667SCédric Le Goater qemu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx
7657fbe08667SCédric Le Goater " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx "\n",
7658fbe08667SCédric Le Goater env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR],
7659fbe08667SCédric Le Goater env->spr[SPR_40x_ESR], env->spr[SPR_40x_DEAR]);
7660fbe08667SCédric Le Goater
7661fbe08667SCédric Le Goater qemu_fprintf(f, " EVPR " TARGET_FMT_lx " SRR2 " TARGET_FMT_lx
7662fbe08667SCédric Le Goater " SRR3 " TARGET_FMT_lx " PID " TARGET_FMT_lx "\n",
7663fbe08667SCédric Le Goater env->spr[SPR_40x_EVPR], env->spr[SPR_40x_SRR2],
7664fbe08667SCédric Le Goater env->spr[SPR_40x_SRR3], env->spr[SPR_40x_PID]);
7665fbe08667SCédric Le Goater break;
7666fbe08667SCédric Le Goater default:
7667fbe08667SCédric Le Goater break;
766847334e17SBruno Larsen (billionai) }
766947334e17SBruno Larsen (billionai)
767047334e17SBruno Larsen (billionai) #if defined(TARGET_PPC64)
767147334e17SBruno Larsen (billionai) if (env->flags & POWERPC_FLAG_CFAR) {
767247334e17SBruno Larsen (billionai) qemu_fprintf(f, " CFAR " TARGET_FMT_lx"\n", env->cfar);
767347334e17SBruno Larsen (billionai) }
767447334e17SBruno Larsen (billionai) #endif
767547334e17SBruno Larsen (billionai)
767647334e17SBruno Larsen (billionai) if (env->spr_cb[SPR_LPCR].name) {
767747334e17SBruno Larsen (billionai) qemu_fprintf(f, " LPCR " TARGET_FMT_lx "\n", env->spr[SPR_LPCR]);
767847334e17SBruno Larsen (billionai) }
767947334e17SBruno Larsen (billionai)
768047334e17SBruno Larsen (billionai) switch (env->mmu_model) {
768147334e17SBruno Larsen (billionai) case POWERPC_MMU_32B:
768247334e17SBruno Larsen (billionai) case POWERPC_MMU_SOFT_6xx:
768347334e17SBruno Larsen (billionai) #if defined(TARGET_PPC64)
768447334e17SBruno Larsen (billionai) case POWERPC_MMU_64B:
768547334e17SBruno Larsen (billionai) case POWERPC_MMU_2_03:
768647334e17SBruno Larsen (billionai) case POWERPC_MMU_2_06:
768747334e17SBruno Larsen (billionai) case POWERPC_MMU_2_07:
768847334e17SBruno Larsen (billionai) case POWERPC_MMU_3_00:
768947334e17SBruno Larsen (billionai) #endif
769047334e17SBruno Larsen (billionai) if (env->spr_cb[SPR_SDR1].name) { /* SDR1 Exists */
769147334e17SBruno Larsen (billionai) qemu_fprintf(f, " SDR1 " TARGET_FMT_lx " ", env->spr[SPR_SDR1]);
769247334e17SBruno Larsen (billionai) }
769347334e17SBruno Larsen (billionai) if (env->spr_cb[SPR_PTCR].name) { /* PTCR Exists */
769447334e17SBruno Larsen (billionai) qemu_fprintf(f, " PTCR " TARGET_FMT_lx " ", env->spr[SPR_PTCR]);
769547334e17SBruno Larsen (billionai) }
769647334e17SBruno Larsen (billionai) qemu_fprintf(f, " DAR " TARGET_FMT_lx " DSISR " TARGET_FMT_lx "\n",
769747334e17SBruno Larsen (billionai) env->spr[SPR_DAR], env->spr[SPR_DSISR]);
769847334e17SBruno Larsen (billionai) break;
769947334e17SBruno Larsen (billionai) case POWERPC_MMU_BOOKE206:
770047334e17SBruno Larsen (billionai) qemu_fprintf(f, " MAS0 " TARGET_FMT_lx " MAS1 " TARGET_FMT_lx
770147334e17SBruno Larsen (billionai) " MAS2 " TARGET_FMT_lx " MAS3 " TARGET_FMT_lx "\n",
770247334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_MAS0], env->spr[SPR_BOOKE_MAS1],
770347334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_MAS2], env->spr[SPR_BOOKE_MAS3]);
770447334e17SBruno Larsen (billionai)
770547334e17SBruno Larsen (billionai) qemu_fprintf(f, " MAS4 " TARGET_FMT_lx " MAS6 " TARGET_FMT_lx
770647334e17SBruno Larsen (billionai) " MAS7 " TARGET_FMT_lx " PID " TARGET_FMT_lx "\n",
770747334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_MAS4], env->spr[SPR_BOOKE_MAS6],
770847334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_MAS7], env->spr[SPR_BOOKE_PID]);
770947334e17SBruno Larsen (billionai)
771047334e17SBruno Larsen (billionai) qemu_fprintf(f, "MMUCFG " TARGET_FMT_lx " TLB0CFG " TARGET_FMT_lx
771147334e17SBruno Larsen (billionai) " TLB1CFG " TARGET_FMT_lx "\n",
771247334e17SBruno Larsen (billionai) env->spr[SPR_MMUCFG], env->spr[SPR_BOOKE_TLB0CFG],
771347334e17SBruno Larsen (billionai) env->spr[SPR_BOOKE_TLB1CFG]);
771447334e17SBruno Larsen (billionai) break;
771547334e17SBruno Larsen (billionai) default:
771647334e17SBruno Larsen (billionai) break;
771747334e17SBruno Larsen (billionai) }
771847334e17SBruno Larsen (billionai) #endif
771947334e17SBruno Larsen (billionai)
772047334e17SBruno Larsen (billionai) #undef RGPL
772147334e17SBruno Larsen (billionai) #undef RFPL
772247334e17SBruno Larsen (billionai) }
77233e770bf7SBruno Larsen (billionai) type_init(ppc_cpu_register_types)
7724