xref: /openbmc/qemu/target/ppc/cpu_init.c (revision 3b5ea01e)
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 
553e770bf7SBruno Larsen (billionai) /* #define PPC_DEBUG_SPR */
563e770bf7SBruno Larsen (billionai) /* #define USE_APPLE_GDB */
573e770bf7SBruno Larsen (billionai) 
vscr_init(CPUPPCState * env,uint32_t val)583e770bf7SBruno Larsen (billionai) static inline void vscr_init(CPUPPCState *env, uint32_t val)
593e770bf7SBruno Larsen (billionai) {
603e770bf7SBruno Larsen (billionai)     /* Altivec always uses round-to-nearest */
613e770bf7SBruno Larsen (billionai)     set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
62c19940dbSBruno Larsen (billionai)     ppc_store_vscr(env, val);
633e770bf7SBruno Larsen (billionai) }
643e770bf7SBruno Larsen (billionai) 
register_745_sprs(CPUPPCState * env)65a5d1120bSFabiano Rosas static void register_745_sprs(CPUPPCState *env)
663e770bf7SBruno Larsen (billionai) {
673e770bf7SBruno Larsen (billionai)     /* SGPRs */
683e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG4, "SPRG4",
693e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
703e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
713e770bf7SBruno Larsen (billionai)                  0x00000000);
723e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG5, "SPRG5",
733e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
743e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
753e770bf7SBruno Larsen (billionai)                  0x00000000);
763e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG6, "SPRG6",
773e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
783e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
793e770bf7SBruno Larsen (billionai)                  0x00000000);
803e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG7, "SPRG7",
813e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
823e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
833e770bf7SBruno Larsen (billionai)                  0x00000000);
84a5d1120bSFabiano Rosas 
85a5d1120bSFabiano Rosas     /* Hardware implementation registers */
86a5d1120bSFabiano Rosas     spr_register(env, SPR_HID0, "HID0",
87a5d1120bSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
88a5d1120bSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
89a5d1120bSFabiano Rosas                  0x00000000);
90a5d1120bSFabiano Rosas 
91a5d1120bSFabiano Rosas     spr_register(env, SPR_HID1, "HID1",
92a5d1120bSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
93a5d1120bSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
94a5d1120bSFabiano Rosas                  0x00000000);
95a5d1120bSFabiano Rosas 
96a5d1120bSFabiano Rosas     spr_register(env, SPR_HID2, "HID2",
97a5d1120bSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
98a5d1120bSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
99a5d1120bSFabiano Rosas                  0x00000000);
1003e770bf7SBruno Larsen (billionai) }
1013e770bf7SBruno Larsen (billionai) 
register_755_sprs(CPUPPCState * env)10228930245SFabiano Rosas static void register_755_sprs(CPUPPCState *env)
10328930245SFabiano Rosas {
10428930245SFabiano Rosas     /* L2 cache control */
10528930245SFabiano Rosas     spr_register(env, SPR_L2CR, "L2CR",
10628930245SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
10728930245SFabiano Rosas                  &spr_read_generic, spr_access_nop,
10828930245SFabiano Rosas                  0x00000000);
10928930245SFabiano Rosas 
11028930245SFabiano Rosas     spr_register(env, SPR_L2PMCR, "L2PMCR",
11128930245SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
11228930245SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
11328930245SFabiano Rosas                  0x00000000);
11428930245SFabiano Rosas }
11528930245SFabiano Rosas 
1163e770bf7SBruno Larsen (billionai) /* SPR common to all 7xx PowerPC implementations */
register_7xx_sprs(CPUPPCState * env)1173e770bf7SBruno Larsen (billionai) static void register_7xx_sprs(CPUPPCState *env)
1183e770bf7SBruno Larsen (billionai) {
1193e770bf7SBruno Larsen (billionai)     /* Breakpoints */
1203e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_DABR, "DABR",
1213e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
1223e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
1233e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_DABR, 0x00000000);
124acf629ebSFabiano Rosas 
1253e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_IABR, "IABR",
1263e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1273e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1283e770bf7SBruno Larsen (billionai)                  0x00000000);
1293e770bf7SBruno Larsen (billionai)     /* Cache management */
1303e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_ICTC, "ICTC",
1313e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1323e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1333e770bf7SBruno Larsen (billionai)                  0x00000000);
1343e770bf7SBruno Larsen (billionai)     /* Performance monitors */
1353e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_MMCR0, "MMCR0",
1363e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1373e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1383e770bf7SBruno Larsen (billionai)                  0x00000000);
139acf629ebSFabiano Rosas 
1403e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_MMCR1, "MMCR1",
1413e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1423e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1433e770bf7SBruno Larsen (billionai)                  0x00000000);
144acf629ebSFabiano Rosas 
1453e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC1, "PMC1",
1463e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1473e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1483e770bf7SBruno Larsen (billionai)                  0x00000000);
149acf629ebSFabiano Rosas 
1503e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC2, "PMC2",
1513e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1523e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1533e770bf7SBruno Larsen (billionai)                  0x00000000);
154acf629ebSFabiano Rosas 
1553e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC3, "PMC3",
1563e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1573e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1583e770bf7SBruno Larsen (billionai)                  0x00000000);
159acf629ebSFabiano Rosas 
1603e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC4, "PMC4",
1613e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1623e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
1633e770bf7SBruno Larsen (billionai)                  0x00000000);
164acf629ebSFabiano Rosas 
1653e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_SIAR, "SIAR",
1663e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1673e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
1683e770bf7SBruno Larsen (billionai)                  0x00000000);
169acf629ebSFabiano Rosas 
1703e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
1713e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1723e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1733e770bf7SBruno Larsen (billionai)                  0x00000000);
174acf629ebSFabiano Rosas 
1753e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
1763e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1773e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1783e770bf7SBruno Larsen (billionai)                  0x00000000);
179acf629ebSFabiano Rosas 
1803e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC1, "UPMC1",
1813e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1823e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1833e770bf7SBruno Larsen (billionai)                  0x00000000);
184acf629ebSFabiano Rosas 
1853e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC2, "UPMC2",
1863e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1873e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1883e770bf7SBruno Larsen (billionai)                  0x00000000);
189acf629ebSFabiano Rosas 
1903e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC3, "UPMC3",
1913e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1923e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1933e770bf7SBruno Larsen (billionai)                  0x00000000);
194acf629ebSFabiano Rosas 
1953e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC4, "UPMC4",
1963e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1973e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
1983e770bf7SBruno Larsen (billionai)                  0x00000000);
199acf629ebSFabiano Rosas 
2003e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_USIAR, "USIAR",
2013e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
2023e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
2033e770bf7SBruno Larsen (billionai)                  0x00000000);
2043e770bf7SBruno Larsen (billionai)     /* External access control */
2053e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_EAR, "EAR",
2063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
2073e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
2083e770bf7SBruno Larsen (billionai)                  0x00000000);
2090301b39cSFabiano Rosas 
2100301b39cSFabiano Rosas     /* Hardware implementation registers */
2110301b39cSFabiano Rosas     spr_register(env, SPR_HID0, "HID0",
2120301b39cSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
2130301b39cSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
2140301b39cSFabiano Rosas                  0x00000000);
2150301b39cSFabiano Rosas 
2160301b39cSFabiano Rosas     spr_register(env, SPR_HID1, "HID1",
2170301b39cSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
2180301b39cSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
2190301b39cSFabiano Rosas                  0x00000000);
2203e770bf7SBruno Larsen (billionai) }
2213e770bf7SBruno Larsen (billionai) 
2223e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
register_amr_sprs(CPUPPCState * env)2233e770bf7SBruno Larsen (billionai) static void register_amr_sprs(CPUPPCState *env)
2243e770bf7SBruno Larsen (billionai) {
2253e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
2263e770bf7SBruno Larsen (billionai)     /*
2273e770bf7SBruno Larsen (billionai)      * Virtual Page Class Key protection
2283e770bf7SBruno Larsen (billionai)      *
2293e770bf7SBruno Larsen (billionai)      * The AMR is accessible either via SPR 13 or SPR 29.  13 is
2303e770bf7SBruno Larsen (billionai)      * userspace accessible, 29 is privileged.  So we only need to set
2313e770bf7SBruno Larsen (billionai)      * the kvm ONE_REG id on one of them, we use 29
2323e770bf7SBruno Larsen (billionai)      */
2333e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_UAMR, "UAMR",
2343e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_amr,
2353e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_amr,
2363e770bf7SBruno Larsen (billionai)                  0);
2373e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_AMR, "AMR",
2383e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
2393e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_amr,
2403e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
2413e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_AMR, 0);
2423e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR",
2433e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
2443e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_uamor,
2453e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
2463e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_UAMOR, 0);
2473e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_AMOR, "AMOR",
2483e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
2493e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
250e5c2ac9dSNicholas Piggin                     &spr_read_generic, &spr_core_lpar_write_generic,
2513e770bf7SBruno Larsen (billionai)                     0);
2523e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
2533e770bf7SBruno Larsen (billionai) }
2543e770bf7SBruno Larsen (billionai) 
register_iamr_sprs(CPUPPCState * env)2553e770bf7SBruno Larsen (billionai) static void register_iamr_sprs(CPUPPCState *env)
2563e770bf7SBruno Larsen (billionai) {
2573e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
2583e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_IAMR, "IAMR",
2593e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
2603e770bf7SBruno Larsen (billionai)                         &spr_read_generic, &spr_write_iamr,
2613e770bf7SBruno Larsen (billionai)                         &spr_read_generic, &spr_write_generic,
2623e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_IAMR, 0);
2633e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
2643e770bf7SBruno Larsen (billionai) }
2653e770bf7SBruno Larsen (billionai) #endif /* TARGET_PPC64 */
2663e770bf7SBruno Larsen (billionai) 
2673e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 604 implementation */
register_604_sprs(CPUPPCState * env)2683e770bf7SBruno Larsen (billionai) static void register_604_sprs(CPUPPCState *env)
2693e770bf7SBruno Larsen (billionai) {
2703e770bf7SBruno Larsen (billionai)     /* Processor identification */
2713e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_PIR, "PIR",
2723e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
2733e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_pir,
2743e770bf7SBruno Larsen (billionai)                  0x00000000);
2753e770bf7SBruno Larsen (billionai)     /* Breakpoints */
2763e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_IABR, "IABR",
2773e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
2783e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
2793e770bf7SBruno Larsen (billionai)                  0x00000000);
280acf629ebSFabiano Rosas 
2813e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_DABR, "DABR",
2823e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
2833e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
2843e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_DABR, 0x00000000);
2853e770bf7SBruno Larsen (billionai)     /* Performance counters */
2863e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_MMCR0, "MMCR0",
2873e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
2883e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
2893e770bf7SBruno Larsen (billionai)                  0x00000000);
290acf629ebSFabiano Rosas 
2913e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC1, "PMC1",
2923e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
2933e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
2943e770bf7SBruno Larsen (billionai)                  0x00000000);
295acf629ebSFabiano Rosas 
2963e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC2, "PMC2",
2973e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
2983e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
2993e770bf7SBruno Larsen (billionai)                  0x00000000);
300acf629ebSFabiano Rosas 
3013e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_SIAR, "SIAR",
3023e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
3033e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
3043e770bf7SBruno Larsen (billionai)                  0x00000000);
305acf629ebSFabiano Rosas 
3063e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SDA, "SDA",
3073e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
3083e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
3093e770bf7SBruno Larsen (billionai)                  0x00000000);
3103e770bf7SBruno Larsen (billionai)     /* External access control */
3113e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_EAR, "EAR",
3123e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
3133e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
3143e770bf7SBruno Larsen (billionai)                  0x00000000);
31520f6fb99SFabiano Rosas 
31620f6fb99SFabiano Rosas     /* Hardware implementation registers */
31720f6fb99SFabiano Rosas     spr_register(env, SPR_HID0, "HID0",
31820f6fb99SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
31920f6fb99SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
32020f6fb99SFabiano Rosas                  0x00000000);
3213e770bf7SBruno Larsen (billionai) }
3223e770bf7SBruno Larsen (billionai) 
register_604e_sprs(CPUPPCState * env)3233b18ec76SFabiano Rosas static void register_604e_sprs(CPUPPCState *env)
3243b18ec76SFabiano Rosas {
3253b18ec76SFabiano Rosas     spr_register(env, SPR_7XX_MMCR1, "MMCR1",
3263b18ec76SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
3273b18ec76SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
3283b18ec76SFabiano Rosas                  0x00000000);
3293b18ec76SFabiano Rosas 
3303b18ec76SFabiano Rosas     spr_register(env, SPR_7XX_PMC3, "PMC3",
3313b18ec76SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
3323b18ec76SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
3333b18ec76SFabiano Rosas                  0x00000000);
3343b18ec76SFabiano Rosas 
3353b18ec76SFabiano Rosas     spr_register(env, SPR_7XX_PMC4, "PMC4",
3363b18ec76SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
3373b18ec76SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
3383b18ec76SFabiano Rosas                  0x00000000);
3393b18ec76SFabiano Rosas     /* Hardware implementation registers */
3403b18ec76SFabiano Rosas     spr_register(env, SPR_HID1, "HID1",
3413b18ec76SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
3423b18ec76SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
3433b18ec76SFabiano Rosas                  0x00000000);
3443b18ec76SFabiano Rosas }
3453b18ec76SFabiano Rosas 
3463e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 603 implementation */
register_603_sprs(CPUPPCState * env)3473e770bf7SBruno Larsen (billionai) static void register_603_sprs(CPUPPCState *env)
3483e770bf7SBruno Larsen (billionai) {
3493e770bf7SBruno Larsen (billionai)     /* External access control */
3503e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_EAR, "EAR",
3513e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
3523e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
3533e770bf7SBruno Larsen (billionai)                  0x00000000);
3543e770bf7SBruno Larsen (billionai)     /* Breakpoints */
3553e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_IABR, "IABR",
3563e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
3573e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
3583e770bf7SBruno Larsen (billionai)                  0x00000000);
3593e770bf7SBruno Larsen (billionai) 
360d2b29d0aSFabiano Rosas     spr_register(env, SPR_HID0, "HID0",
361d2b29d0aSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
362d2b29d0aSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
363d2b29d0aSFabiano Rosas                  0x00000000);
364d2b29d0aSFabiano Rosas 
365d2b29d0aSFabiano Rosas     spr_register(env, SPR_HID1, "HID1",
366d2b29d0aSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
367d2b29d0aSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
368d2b29d0aSFabiano Rosas                  0x00000000);
3693e770bf7SBruno Larsen (billionai) }
3703e770bf7SBruno Larsen (billionai) 
register_e300_sprs(CPUPPCState * env)371a3a27674SFabiano Rosas static void register_e300_sprs(CPUPPCState *env)
372a3a27674SFabiano Rosas {
373a3a27674SFabiano Rosas     /* hardware implementation registers */
374a3a27674SFabiano Rosas     spr_register(env, SPR_HID2, "HID2",
375a3a27674SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
376a3a27674SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
377a3a27674SFabiano Rosas                  0x00000000);
378a3a27674SFabiano Rosas     /* Breakpoints */
379a3a27674SFabiano Rosas     spr_register(env, SPR_DABR, "DABR",
380a3a27674SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
381a3a27674SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
382a3a27674SFabiano Rosas                  0x00000000);
383a3a27674SFabiano Rosas 
384a3a27674SFabiano Rosas     spr_register(env, SPR_DABR2, "DABR2",
385a3a27674SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
386a3a27674SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
387a3a27674SFabiano Rosas                  0x00000000);
388a3a27674SFabiano Rosas 
389a3a27674SFabiano Rosas     spr_register(env, SPR_IABR2, "IABR2",
390a3a27674SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
391a3a27674SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
392a3a27674SFabiano Rosas                  0x00000000);
393a3a27674SFabiano Rosas 
394a3a27674SFabiano Rosas     spr_register(env, SPR_IBCR, "IBCR",
395a3a27674SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
396a3a27674SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
397a3a27674SFabiano Rosas                  0x00000000);
398a3a27674SFabiano Rosas 
399a3a27674SFabiano Rosas     spr_register(env, SPR_DBCR, "DBCR",
400a3a27674SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
401a3a27674SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
402a3a27674SFabiano Rosas                  0x00000000);
403a3a27674SFabiano Rosas }
404a3a27674SFabiano Rosas 
4053e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC G2 implementation */
register_G2_sprs(CPUPPCState * env)4063e770bf7SBruno Larsen (billionai) static void register_G2_sprs(CPUPPCState *env)
4073e770bf7SBruno Larsen (billionai) {
4083e770bf7SBruno Larsen (billionai)     /* Memory base address */
4093e770bf7SBruno Larsen (billionai)     /* MBAR */
4103e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MBAR, "MBAR",
4113e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4123e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4133e770bf7SBruno Larsen (billionai)                  0x00000000);
4143e770bf7SBruno Larsen (billionai)     /* Exception processing */
4153e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
4163e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4173e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4183e770bf7SBruno Larsen (billionai)                  0x00000000);
4193e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
4203e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4213e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4223e770bf7SBruno Larsen (billionai)                  0x00000000);
4233e770bf7SBruno Larsen (billionai)     /* Breakpoints */
4243e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_DABR, "DABR",
4253e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4263e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4273e770bf7SBruno Larsen (billionai)                  0x00000000);
428acf629ebSFabiano Rosas 
4293e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_DABR2, "DABR2",
4303e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4313e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4323e770bf7SBruno Larsen (billionai)                  0x00000000);
433acf629ebSFabiano Rosas 
4343e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_IABR, "IABR",
4353e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4363e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4373e770bf7SBruno Larsen (billionai)                  0x00000000);
438acf629ebSFabiano Rosas 
4393e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_IABR2, "IABR2",
4403e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4413e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4423e770bf7SBruno Larsen (billionai)                  0x00000000);
443acf629ebSFabiano Rosas 
4443e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_IBCR, "IBCR",
4453e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4463e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4473e770bf7SBruno Larsen (billionai)                  0x00000000);
448acf629ebSFabiano Rosas 
4493e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_DBCR, "DBCR",
4503e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
4513e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
4523e770bf7SBruno Larsen (billionai)                  0x00000000);
453e599bcedSFabiano Rosas 
454e599bcedSFabiano Rosas     /* External access control */
455e599bcedSFabiano Rosas     spr_register(env, SPR_EAR, "EAR",
456e599bcedSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
457e599bcedSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
458e599bcedSFabiano Rosas                  0x00000000);
459e599bcedSFabiano Rosas     /* Hardware implementation register */
460e599bcedSFabiano Rosas     spr_register(env, SPR_HID0, "HID0",
461e599bcedSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
462e599bcedSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
463e599bcedSFabiano Rosas                  0x00000000);
464e599bcedSFabiano Rosas 
465e599bcedSFabiano Rosas     spr_register(env, SPR_HID1, "HID1",
466e599bcedSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
467e599bcedSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
468e599bcedSFabiano Rosas                  0x00000000);
469e599bcedSFabiano Rosas 
470e599bcedSFabiano Rosas     spr_register(env, SPR_HID2, "HID2",
471e599bcedSFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
472e599bcedSFabiano Rosas                  &spr_read_generic, &spr_write_generic,
473e599bcedSFabiano Rosas                  0x00000000);
474e599bcedSFabiano Rosas 
4751a71c5d1SFabiano Rosas     /* SGPRs */
4761a71c5d1SFabiano Rosas     spr_register(env, SPR_SPRG4, "SPRG4",
4771a71c5d1SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
4781a71c5d1SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
4791a71c5d1SFabiano Rosas                  0x00000000);
4801a71c5d1SFabiano Rosas     spr_register(env, SPR_SPRG5, "SPRG5",
4811a71c5d1SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
4821a71c5d1SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
4831a71c5d1SFabiano Rosas                  0x00000000);
4841a71c5d1SFabiano Rosas     spr_register(env, SPR_SPRG6, "SPRG6",
4851a71c5d1SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
4861a71c5d1SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
4871a71c5d1SFabiano Rosas                  0x00000000);
4881a71c5d1SFabiano Rosas     spr_register(env, SPR_SPRG7, "SPRG7",
4891a71c5d1SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
4901a71c5d1SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
4911a71c5d1SFabiano Rosas                  0x00000000);
4923e770bf7SBruno Larsen (billionai) }
4933e770bf7SBruno Larsen (billionai) 
register_74xx_sprs(CPUPPCState * env)4943e770bf7SBruno Larsen (billionai) static void register_74xx_sprs(CPUPPCState *env)
4953e770bf7SBruno Larsen (billionai) {
496674f4509SFabiano Rosas     /* Breakpoints */
497674f4509SFabiano Rosas     spr_register_kvm(env, SPR_DABR, "DABR",
498674f4509SFabiano Rosas                      SPR_NOACCESS, SPR_NOACCESS,
499674f4509SFabiano Rosas                      &spr_read_generic, &spr_write_generic,
500674f4509SFabiano Rosas                      KVM_REG_PPC_DABR, 0x00000000);
501674f4509SFabiano Rosas 
502674f4509SFabiano Rosas     spr_register(env, SPR_IABR, "IABR",
503674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
504674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
505674f4509SFabiano Rosas                  0x00000000);
506674f4509SFabiano Rosas     /* Cache management */
507674f4509SFabiano Rosas     spr_register(env, SPR_ICTC, "ICTC",
508674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
509674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
510674f4509SFabiano Rosas                  0x00000000);
511674f4509SFabiano Rosas     /* Performance monitors */
512674f4509SFabiano Rosas     spr_register(env, SPR_7XX_MMCR0, "MMCR0",
513674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
514674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
515674f4509SFabiano Rosas                  0x00000000);
516674f4509SFabiano Rosas 
517674f4509SFabiano Rosas     spr_register(env, SPR_7XX_MMCR1, "MMCR1",
518674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
519674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
520674f4509SFabiano Rosas                  0x00000000);
521674f4509SFabiano Rosas 
522674f4509SFabiano Rosas     spr_register(env, SPR_7XX_PMC1, "PMC1",
523674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
524674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
525674f4509SFabiano Rosas                  0x00000000);
526674f4509SFabiano Rosas 
527674f4509SFabiano Rosas     spr_register(env, SPR_7XX_PMC2, "PMC2",
528674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
529674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
530674f4509SFabiano Rosas                  0x00000000);
531674f4509SFabiano Rosas 
532674f4509SFabiano Rosas     spr_register(env, SPR_7XX_PMC3, "PMC3",
533674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
534674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
535674f4509SFabiano Rosas                  0x00000000);
536674f4509SFabiano Rosas 
537674f4509SFabiano Rosas     spr_register(env, SPR_7XX_PMC4, "PMC4",
538674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
539674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
540674f4509SFabiano Rosas                  0x00000000);
541674f4509SFabiano Rosas 
542674f4509SFabiano Rosas     spr_register(env, SPR_7XX_SIAR, "SIAR",
543674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
544674f4509SFabiano Rosas                  &spr_read_generic, SPR_NOACCESS,
545674f4509SFabiano Rosas                  0x00000000);
546674f4509SFabiano Rosas 
547674f4509SFabiano Rosas     spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
548674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
549674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
550674f4509SFabiano Rosas                  0x00000000);
551674f4509SFabiano Rosas 
552674f4509SFabiano Rosas     spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
553674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
554674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
555674f4509SFabiano Rosas                  0x00000000);
556674f4509SFabiano Rosas 
557674f4509SFabiano Rosas     spr_register(env, SPR_7XX_UPMC1, "UPMC1",
558674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
559674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
560674f4509SFabiano Rosas                  0x00000000);
561674f4509SFabiano Rosas 
562674f4509SFabiano Rosas     spr_register(env, SPR_7XX_UPMC2, "UPMC2",
563674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
564674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
565674f4509SFabiano Rosas                  0x00000000);
566674f4509SFabiano Rosas 
567674f4509SFabiano Rosas     spr_register(env, SPR_7XX_UPMC3, "UPMC3",
568674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
569674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
570674f4509SFabiano Rosas                  0x00000000);
571674f4509SFabiano Rosas 
572674f4509SFabiano Rosas     spr_register(env, SPR_7XX_UPMC4, "UPMC4",
573674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
574674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
575674f4509SFabiano Rosas                  0x00000000);
576674f4509SFabiano Rosas 
577674f4509SFabiano Rosas     spr_register(env, SPR_7XX_USIAR, "USIAR",
578674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
579674f4509SFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
580674f4509SFabiano Rosas                  0x00000000);
581674f4509SFabiano Rosas     /* External access control */
582674f4509SFabiano Rosas     spr_register(env, SPR_EAR, "EAR",
583674f4509SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
584674f4509SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
585674f4509SFabiano Rosas                  0x00000000);
586674f4509SFabiano Rosas 
5873e770bf7SBruno Larsen (billionai)     /* Processor identification */
5883e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_PIR, "PIR",
5893e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
5903e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_pir,
5913e770bf7SBruno Larsen (billionai)                  0x00000000);
592acf629ebSFabiano Rosas 
5933e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_74XX_MMCR2, "MMCR2",
5943e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
5953e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
5963e770bf7SBruno Larsen (billionai)                  0x00000000);
597acf629ebSFabiano Rosas 
5983e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_74XX_UMMCR2, "UMMCR2",
5993e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
6003e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
6013e770bf7SBruno Larsen (billionai)                  0x00000000);
602acf629ebSFabiano Rosas 
6033e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BAMR, "BAMR",
6043e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6053e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6063e770bf7SBruno Larsen (billionai)                  0x00000000);
607acf629ebSFabiano Rosas 
6083e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSCR0, "MSSCR0",
6093e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6103e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6113e770bf7SBruno Larsen (billionai)                  0x00000000);
6123e770bf7SBruno Larsen (billionai)     /* Hardware implementation registers */
6133e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID0, "HID0",
6143e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6153e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6163e770bf7SBruno Larsen (billionai)                  0x00000000);
617acf629ebSFabiano Rosas 
6183e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID1, "HID1",
6193e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6203e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6213e770bf7SBruno Larsen (billionai)                  0x00000000);
6223e770bf7SBruno Larsen (billionai)     /* Altivec */
6233e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_VRSAVE, "VRSAVE",
6243e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6253e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6263e770bf7SBruno Larsen (billionai)                  0x00000000);
627acf629ebSFabiano Rosas 
6283e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L2CR, "L2CR",
6293e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6303e770bf7SBruno Larsen (billionai)                  &spr_read_generic, spr_access_nop,
6313e770bf7SBruno Larsen (billionai)                  0x00000000);
6323e770bf7SBruno Larsen (billionai) }
6333e770bf7SBruno Larsen (billionai) 
register_l3_ctrl(CPUPPCState * env)6343e770bf7SBruno Larsen (billionai) static void register_l3_ctrl(CPUPPCState *env)
6353e770bf7SBruno Larsen (billionai) {
6363e770bf7SBruno Larsen (billionai)     /* L3CR */
6373e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3CR, "L3CR",
6383e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6393e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6403e770bf7SBruno Larsen (billionai)                  0x00000000);
6413e770bf7SBruno Larsen (billionai)     /* L3ITCR0 */
6423e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3ITCR0, "L3ITCR0",
6433e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6443e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6453e770bf7SBruno Larsen (billionai)                  0x00000000);
6463e770bf7SBruno Larsen (billionai)     /* L3PM */
6473e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3PM, "L3PM",
6483e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6493e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6503e770bf7SBruno Larsen (billionai)                  0x00000000);
6513e770bf7SBruno Larsen (billionai) }
6523e770bf7SBruno Larsen (billionai) 
6533e770bf7SBruno Larsen (billionai) /* PowerPC BookE SPR */
register_BookE_sprs(CPUPPCState * env,uint64_t ivor_mask)6543e770bf7SBruno Larsen (billionai) static void register_BookE_sprs(CPUPPCState *env, uint64_t ivor_mask)
6553e770bf7SBruno Larsen (billionai) {
6563e770bf7SBruno Larsen (billionai)     const char *ivor_names[64] = {
6573e770bf7SBruno Larsen (billionai)         "IVOR0",  "IVOR1",  "IVOR2",  "IVOR3",
6583e770bf7SBruno Larsen (billionai)         "IVOR4",  "IVOR5",  "IVOR6",  "IVOR7",
6593e770bf7SBruno Larsen (billionai)         "IVOR8",  "IVOR9",  "IVOR10", "IVOR11",
6603e770bf7SBruno Larsen (billionai)         "IVOR12", "IVOR13", "IVOR14", "IVOR15",
6613e770bf7SBruno Larsen (billionai)         "IVOR16", "IVOR17", "IVOR18", "IVOR19",
6623e770bf7SBruno Larsen (billionai)         "IVOR20", "IVOR21", "IVOR22", "IVOR23",
6633e770bf7SBruno Larsen (billionai)         "IVOR24", "IVOR25", "IVOR26", "IVOR27",
6643e770bf7SBruno Larsen (billionai)         "IVOR28", "IVOR29", "IVOR30", "IVOR31",
6653e770bf7SBruno Larsen (billionai)         "IVOR32", "IVOR33", "IVOR34", "IVOR35",
6663e770bf7SBruno Larsen (billionai)         "IVOR36", "IVOR37", "IVOR38", "IVOR39",
6673e770bf7SBruno Larsen (billionai)         "IVOR40", "IVOR41", "IVOR42", "IVOR43",
6683e770bf7SBruno Larsen (billionai)         "IVOR44", "IVOR45", "IVOR46", "IVOR47",
6693e770bf7SBruno Larsen (billionai)         "IVOR48", "IVOR49", "IVOR50", "IVOR51",
6703e770bf7SBruno Larsen (billionai)         "IVOR52", "IVOR53", "IVOR54", "IVOR55",
6713e770bf7SBruno Larsen (billionai)         "IVOR56", "IVOR57", "IVOR58", "IVOR59",
6723e770bf7SBruno Larsen (billionai)         "IVOR60", "IVOR61", "IVOR62", "IVOR63",
6733e770bf7SBruno Larsen (billionai)     };
6743e770bf7SBruno Larsen (billionai) #define SPR_BOOKE_IVORxx (-1)
6753e770bf7SBruno Larsen (billionai)     int ivor_sprn[64] = {
6763e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVOR0,  SPR_BOOKE_IVOR1,  SPR_BOOKE_IVOR2,  SPR_BOOKE_IVOR3,
6773e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVOR4,  SPR_BOOKE_IVOR5,  SPR_BOOKE_IVOR6,  SPR_BOOKE_IVOR7,
6783e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVOR8,  SPR_BOOKE_IVOR9,  SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
6793e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
6803e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
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_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
6853e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
6863e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
6873e770bf7SBruno Larsen (billionai)         SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, 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)     };
6933e770bf7SBruno Larsen (billionai)     int i;
6943e770bf7SBruno Larsen (billionai) 
6953e770bf7SBruno Larsen (billionai)     /* Interrupt processing */
6963e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
6973e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
6983e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
6993e770bf7SBruno Larsen (billionai)                  0x00000000);
7003e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
7013e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7023e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7033e770bf7SBruno Larsen (billionai)                  0x00000000);
7043e770bf7SBruno Larsen (billionai)     /* Debug */
7053e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_IAC1, "IAC1",
7063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7073e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7083e770bf7SBruno Larsen (billionai)                  0x00000000);
709acf629ebSFabiano Rosas 
7103e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_IAC2, "IAC2",
7113e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7123e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7133e770bf7SBruno Larsen (billionai)                  0x00000000);
714acf629ebSFabiano Rosas 
7153e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DAC1, "DAC1",
7163e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7173e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7183e770bf7SBruno Larsen (billionai)                  0x00000000);
719acf629ebSFabiano Rosas 
7203e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DAC2, "DAC2",
7213e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7223e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7233e770bf7SBruno Larsen (billionai)                  0x00000000);
724acf629ebSFabiano Rosas 
7253e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
7263e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7273e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_40x_dbcr0,
7283e770bf7SBruno Larsen (billionai)                  0x00000000);
729acf629ebSFabiano Rosas 
7303e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
7313e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7323e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7333e770bf7SBruno Larsen (billionai)                  0x00000000);
734acf629ebSFabiano Rosas 
7353e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
7363e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7373e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7383e770bf7SBruno Larsen (billionai)                  0x00000000);
7393e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
7403e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7413e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7423e770bf7SBruno Larsen (billionai)                  0x00000000);
7433e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
7443e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7453e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7463e770bf7SBruno Larsen (billionai)                  0x00000000);
747acf629ebSFabiano Rosas 
7483e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DBSR, "DBSR",
7493e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7503e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_clear,
7513e770bf7SBruno Larsen (billionai)                  0x00000000);
7523e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DEAR, "DEAR",
7533e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7543e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7553e770bf7SBruno Larsen (billionai)                  0x00000000);
7563e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_ESR, "ESR",
7573e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7583e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
7593e770bf7SBruno Larsen (billionai)                  0x00000000);
7603e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_IVPR, "IVPR",
7613e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7623e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_excp_prefix,
7633e770bf7SBruno Larsen (billionai)                  0x00000000);
7643e770bf7SBruno Larsen (billionai)     /* Exception vectors */
7653e770bf7SBruno Larsen (billionai)     for (i = 0; i < 64; i++) {
7663e770bf7SBruno Larsen (billionai)         if (ivor_mask & (1ULL << i)) {
7673e770bf7SBruno Larsen (billionai)             if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
7683e770bf7SBruno Larsen (billionai)                 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
7693e770bf7SBruno Larsen (billionai)                 exit(1);
7703e770bf7SBruno Larsen (billionai)             }
7713e770bf7SBruno Larsen (billionai)             spr_register(env, ivor_sprn[i], ivor_names[i],
7723e770bf7SBruno Larsen (billionai)                          SPR_NOACCESS, SPR_NOACCESS,
7733e770bf7SBruno Larsen (billionai)                          &spr_read_generic, &spr_write_excp_vector,
7743e770bf7SBruno Larsen (billionai)                          0x00000000);
7753e770bf7SBruno Larsen (billionai)         }
7763e770bf7SBruno Larsen (billionai)     }
7773e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_PID, "PID",
7783e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7793e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_booke_pid,
7803e770bf7SBruno Larsen (billionai)                  0x00000000);
7813e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_TCR, "TCR",
7823e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7833e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_booke_tcr,
7843e770bf7SBruno Larsen (billionai)                  0x00000000);
7853e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_TSR, "TSR",
7863e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7873e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_booke_tsr,
7883e770bf7SBruno Larsen (billionai)                  0x00000000);
7893e770bf7SBruno Larsen (billionai)     /* Timer */
7903e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_DECR, "DECR",
7913e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
7923e770bf7SBruno Larsen (billionai)                  &spr_read_decr, &spr_write_decr,
7933e770bf7SBruno Larsen (billionai)                  0x00000000);
7943e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DECAR, "DECAR",
7953e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
796e89294b2SNicholas Piggin                  SPR_NOACCESS, &spr_write_generic32,
7973e770bf7SBruno Larsen (billionai)                  0x00000000);
7983e770bf7SBruno Larsen (billionai)     /* SPRGs */
7993e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG0, "USPRG0",
8003e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8013e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8023e770bf7SBruno Larsen (billionai)                  0x00000000);
8033e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG4, "SPRG4",
8043e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8053e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8063e770bf7SBruno Larsen (billionai)                  0x00000000);
8073e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG5, "SPRG5",
8083e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8093e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8103e770bf7SBruno Larsen (billionai)                  0x00000000);
8113e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG6, "SPRG6",
8123e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8133e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8143e770bf7SBruno Larsen (billionai)                  0x00000000);
8153e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG7, "SPRG7",
8163e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8173e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8183e770bf7SBruno Larsen (billionai)                  0x00000000);
8193e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_SPRG8, "SPRG8",
8203e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8213e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8223e770bf7SBruno Larsen (billionai)                  0x00000000);
8233e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_SPRG9, "SPRG9",
8243e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8253e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
8263e770bf7SBruno Larsen (billionai)                  0x00000000);
8273e770bf7SBruno Larsen (billionai) }
8283e770bf7SBruno Larsen (billionai) 
8293e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
register_tlbncfg(uint32_t assoc,uint32_t minsize,uint32_t maxsize,uint32_t flags,uint32_t nentries)8303e770bf7SBruno Larsen (billionai) static inline uint32_t register_tlbncfg(uint32_t assoc, uint32_t minsize,
8313e770bf7SBruno Larsen (billionai)                                    uint32_t maxsize, uint32_t flags,
8323e770bf7SBruno Larsen (billionai)                                    uint32_t nentries)
8333e770bf7SBruno Larsen (billionai) {
8343e770bf7SBruno Larsen (billionai)     return (assoc << TLBnCFG_ASSOC_SHIFT) |
8353e770bf7SBruno Larsen (billionai)            (minsize << TLBnCFG_MINSIZE_SHIFT) |
8363e770bf7SBruno Larsen (billionai)            (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
8373e770bf7SBruno Larsen (billionai)            flags | nentries;
8383e770bf7SBruno Larsen (billionai) }
8393e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
8403e770bf7SBruno Larsen (billionai) 
8413e770bf7SBruno Larsen (billionai) /* BookE 2.06 storage control registers */
register_BookE206_sprs(CPUPPCState * env,uint32_t mas_mask,uint32_t * tlbncfg,uint32_t mmucfg)8423e770bf7SBruno Larsen (billionai) static void register_BookE206_sprs(CPUPPCState *env, uint32_t mas_mask,
8433e770bf7SBruno Larsen (billionai)                              uint32_t *tlbncfg, uint32_t mmucfg)
8443e770bf7SBruno Larsen (billionai) {
8453e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
8463e770bf7SBruno Larsen (billionai)     const char *mas_names[8] = {
8473e770bf7SBruno Larsen (billionai)         "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
8483e770bf7SBruno Larsen (billionai)     };
8493e770bf7SBruno Larsen (billionai)     int mas_sprn[8] = {
8503e770bf7SBruno Larsen (billionai)         SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
8513e770bf7SBruno Larsen (billionai)         SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
8523e770bf7SBruno Larsen (billionai)     };
8533e770bf7SBruno Larsen (billionai)     int i;
8543e770bf7SBruno Larsen (billionai) 
8553e770bf7SBruno Larsen (billionai)     /* TLB assist registers */
8563e770bf7SBruno Larsen (billionai)     for (i = 0; i < 8; i++) {
8573e770bf7SBruno Larsen (billionai)         if (mas_mask & (1 << i)) {
8583e770bf7SBruno Larsen (billionai)             spr_register(env, mas_sprn[i], mas_names[i],
8593e770bf7SBruno Larsen (billionai)                          SPR_NOACCESS, SPR_NOACCESS,
86052e9612eSBruno Larsen (billionai)                          &spr_read_generic,
86152e9612eSBruno Larsen (billionai)                          (i == 2 && (env->insns_flags & PPC_64B))
86252e9612eSBruno Larsen (billionai)                          ? &spr_write_generic : &spr_write_generic32,
8633e770bf7SBruno Larsen (billionai)                          0x00000000);
8643e770bf7SBruno Larsen (billionai)         }
8653e770bf7SBruno Larsen (billionai)     }
8663e770bf7SBruno Larsen (billionai)     if (env->nb_pids > 1) {
8673e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_PID1, "PID1",
8683e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
8693e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_booke_pid,
8703e770bf7SBruno Larsen (billionai)                      0x00000000);
8713e770bf7SBruno Larsen (billionai)     }
8723e770bf7SBruno Larsen (billionai)     if (env->nb_pids > 2) {
8733e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_PID2, "PID2",
8743e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
8753e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_booke_pid,
8763e770bf7SBruno Larsen (billionai)                      0x00000000);
8773e770bf7SBruno Larsen (billionai)     }
8783e770bf7SBruno Larsen (billionai) 
8793e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_EPLC, "EPLC",
8803e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8813e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_eplc,
8823e770bf7SBruno Larsen (billionai)                  0x00000000);
8833e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_EPSC, "EPSC",
8843e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8853e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_epsc,
8863e770bf7SBruno Larsen (billionai)                  0x00000000);
8873e770bf7SBruno Larsen (billionai) 
8883e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MMUCFG, "MMUCFG",
8893e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
8903e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
8913e770bf7SBruno Larsen (billionai)                  mmucfg);
8923e770bf7SBruno Larsen (billionai)     switch (env->nb_ways) {
8933e770bf7SBruno Larsen (billionai)     case 4:
8943e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
8953e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
8963e770bf7SBruno Larsen (billionai)                      &spr_read_generic, SPR_NOACCESS,
8973e770bf7SBruno Larsen (billionai)                      tlbncfg[3]);
8983e770bf7SBruno Larsen (billionai)         /* Fallthru */
8993e770bf7SBruno Larsen (billionai)     case 3:
9003e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
9013e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
9023e770bf7SBruno Larsen (billionai)                      &spr_read_generic, SPR_NOACCESS,
9033e770bf7SBruno Larsen (billionai)                      tlbncfg[2]);
9043e770bf7SBruno Larsen (billionai)         /* Fallthru */
9053e770bf7SBruno Larsen (billionai)     case 2:
9063e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
9073e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
9083e770bf7SBruno Larsen (billionai)                      &spr_read_generic, SPR_NOACCESS,
9093e770bf7SBruno Larsen (billionai)                      tlbncfg[1]);
9103e770bf7SBruno Larsen (billionai)         /* Fallthru */
9113e770bf7SBruno Larsen (billionai)     case 1:
9123e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
9133e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
9143e770bf7SBruno Larsen (billionai)                      &spr_read_generic, SPR_NOACCESS,
9153e770bf7SBruno Larsen (billionai)                      tlbncfg[0]);
9163e770bf7SBruno Larsen (billionai)         /* Fallthru */
9173e770bf7SBruno Larsen (billionai)     case 0:
9183e770bf7SBruno Larsen (billionai)     default:
9193e770bf7SBruno Larsen (billionai)         break;
9203e770bf7SBruno Larsen (billionai)     }
9213e770bf7SBruno Larsen (billionai) #endif
9223e770bf7SBruno Larsen (billionai) }
9233e770bf7SBruno Larsen (billionai) 
9243e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 440 implementation */
register_440_sprs(CPUPPCState * env)9253e770bf7SBruno Larsen (billionai) static void register_440_sprs(CPUPPCState *env)
9263e770bf7SBruno Larsen (billionai) {
9273e770bf7SBruno Larsen (billionai)     /* Cache control */
9283e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DNV0, "DNV0",
9293e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9303e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9313e770bf7SBruno Larsen (billionai)                  0x00000000);
932acf629ebSFabiano Rosas 
9333e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DNV1, "DNV1",
9343e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9353e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9363e770bf7SBruno Larsen (billionai)                  0x00000000);
937acf629ebSFabiano Rosas 
9383e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DNV2, "DNV2",
9393e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9403e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9413e770bf7SBruno Larsen (billionai)                  0x00000000);
942acf629ebSFabiano Rosas 
9433e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DNV3, "DNV3",
9443e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9453e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9463e770bf7SBruno Larsen (billionai)                  0x00000000);
947acf629ebSFabiano Rosas 
9483e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DTV0, "DTV0",
9493e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9503e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9513e770bf7SBruno Larsen (billionai)                  0x00000000);
952acf629ebSFabiano Rosas 
9533e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DTV1, "DTV1",
9543e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9553e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9563e770bf7SBruno Larsen (billionai)                  0x00000000);
957acf629ebSFabiano Rosas 
9583e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DTV2, "DTV2",
9593e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9603e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9613e770bf7SBruno Larsen (billionai)                  0x00000000);
962acf629ebSFabiano Rosas 
9633e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DTV3, "DTV3",
9643e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9653e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9663e770bf7SBruno Larsen (billionai)                  0x00000000);
967acf629ebSFabiano Rosas 
9683e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DVLIM, "DVLIM",
9693e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9703e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9713e770bf7SBruno Larsen (billionai)                  0x00000000);
972acf629ebSFabiano Rosas 
9733e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_INV0, "INV0",
9743e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9753e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9763e770bf7SBruno Larsen (billionai)                  0x00000000);
977acf629ebSFabiano Rosas 
9783e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_INV1, "INV1",
9793e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9803e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9813e770bf7SBruno Larsen (billionai)                  0x00000000);
982acf629ebSFabiano Rosas 
9833e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_INV2, "INV2",
9843e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9853e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9863e770bf7SBruno Larsen (billionai)                  0x00000000);
987acf629ebSFabiano Rosas 
9883e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_INV3, "INV3",
9893e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9903e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9913e770bf7SBruno Larsen (billionai)                  0x00000000);
992acf629ebSFabiano Rosas 
9933e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_ITV0, "ITV0",
9943e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
9953e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
9963e770bf7SBruno Larsen (billionai)                  0x00000000);
997acf629ebSFabiano Rosas 
9983e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_ITV1, "ITV1",
9993e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10003e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10013e770bf7SBruno Larsen (billionai)                  0x00000000);
1002acf629ebSFabiano Rosas 
10033e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_ITV2, "ITV2",
10043e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10053e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10063e770bf7SBruno Larsen (billionai)                  0x00000000);
1007acf629ebSFabiano Rosas 
10083e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_ITV3, "ITV3",
10093e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10103e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10113e770bf7SBruno Larsen (billionai)                  0x00000000);
1012acf629ebSFabiano Rosas 
10133e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_IVLIM, "IVLIM",
10143e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10153e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10163e770bf7SBruno Larsen (billionai)                  0x00000000);
10173e770bf7SBruno Larsen (billionai)     /* Cache debug */
10183e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
10193e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10203e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
10213e770bf7SBruno Larsen (billionai)                  0x00000000);
1022acf629ebSFabiano Rosas 
10233e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
10243e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10253e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
10263e770bf7SBruno Larsen (billionai)                  0x00000000);
1027acf629ebSFabiano Rosas 
10283e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
10293e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10303e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
10313e770bf7SBruno Larsen (billionai)                  0x00000000);
1032acf629ebSFabiano Rosas 
10333e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
10343e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10353e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
10363e770bf7SBruno Larsen (billionai)                  0x00000000);
1037acf629ebSFabiano Rosas 
10383e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
10393e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10403e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
10413e770bf7SBruno Larsen (billionai)                  0x00000000);
1042acf629ebSFabiano Rosas 
10433e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_DBDR, "DBDR",
10443e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10453e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10463e770bf7SBruno Larsen (billionai)                  0x00000000);
10473e770bf7SBruno Larsen (billionai)     /* Processor control */
10483e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_4xx_CCR0, "CCR0",
10493e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10503e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10513e770bf7SBruno Larsen (billionai)                  0x00000000);
10523e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_RSTCFG, "RSTCFG",
10533e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10543e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
10553e770bf7SBruno Larsen (billionai)                  0x00000000);
10563e770bf7SBruno Larsen (billionai)     /* Storage control */
10573e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_MMUCR, "MMUCR",
10583e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10593e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10603e770bf7SBruno Larsen (billionai)                  0x00000000);
106149ed82b2SFabiano Rosas 
106249ed82b2SFabiano Rosas     /* Processor identification */
106349ed82b2SFabiano Rosas     spr_register(env, SPR_BOOKE_PIR, "PIR",
106449ed82b2SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
106549ed82b2SFabiano Rosas                  &spr_read_generic, &spr_write_pir,
106649ed82b2SFabiano Rosas                  0x00000000);
106749ed82b2SFabiano Rosas 
106849ed82b2SFabiano Rosas     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
106949ed82b2SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
107049ed82b2SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
107149ed82b2SFabiano Rosas                  0x00000000);
107249ed82b2SFabiano Rosas 
107349ed82b2SFabiano Rosas     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
107449ed82b2SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
107549ed82b2SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
107649ed82b2SFabiano Rosas                  0x00000000);
107749ed82b2SFabiano Rosas 
107849ed82b2SFabiano Rosas     spr_register(env, SPR_BOOKE_DVC1, "DVC1",
107949ed82b2SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
108049ed82b2SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
108149ed82b2SFabiano Rosas                  0x00000000);
108249ed82b2SFabiano Rosas 
108349ed82b2SFabiano Rosas     spr_register(env, SPR_BOOKE_DVC2, "DVC2",
108449ed82b2SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
108549ed82b2SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
108649ed82b2SFabiano Rosas                  0x00000000);
10873e770bf7SBruno Larsen (billionai) }
10883e770bf7SBruno Larsen (billionai) 
10893e770bf7SBruno Larsen (billionai) /* SPR shared between PowerPC 40x implementations */
register_40x_sprs(CPUPPCState * env)10903e770bf7SBruno Larsen (billionai) static void register_40x_sprs(CPUPPCState *env)
10913e770bf7SBruno Larsen (billionai) {
10923e770bf7SBruno Larsen (billionai)     /* Cache */
10933e770bf7SBruno Larsen (billionai)     /* not emulated, as QEMU do not emulate caches */
10943e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_DCCR, "DCCR",
10953e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
10963e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
10973e770bf7SBruno Larsen (billionai)                  0x00000000);
10983e770bf7SBruno Larsen (billionai)     /* not emulated, as QEMU do not emulate caches */
10993e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_ICCR, "ICCR",
11003e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11013e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11023e770bf7SBruno Larsen (billionai)                  0x00000000);
11033e770bf7SBruno Larsen (billionai)     /* not emulated, as QEMU do not emulate caches */
11043e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
11053e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11063e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
11073e770bf7SBruno Larsen (billionai)                  0x00000000);
11083e770bf7SBruno Larsen (billionai)     /* Exception */
11093e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_DEAR, "DEAR",
11103e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11113e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11123e770bf7SBruno Larsen (billionai)                  0x00000000);
11133e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_ESR, "ESR",
11143e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11153e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11163e770bf7SBruno Larsen (billionai)                  0x00000000);
11173e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_EVPR, "EVPR",
11183e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11193e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_excp_prefix,
11203e770bf7SBruno Larsen (billionai)                  0x00000000);
11213e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_SRR2, "SRR2",
11223e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11233e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11243e770bf7SBruno Larsen (billionai)                  0x00000000);
11253e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_SRR3, "SRR3",
11263e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11273e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11283e770bf7SBruno Larsen (billionai)                  0x00000000);
11293e770bf7SBruno Larsen (billionai)     /* Timers */
11303e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_PIT, "PIT",
11313e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11323e770bf7SBruno Larsen (billionai)                  &spr_read_40x_pit, &spr_write_40x_pit,
11333e770bf7SBruno Larsen (billionai)                  0x00000000);
11343e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_TCR, "TCR",
11353e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1136cbd8f17dSCédric Le Goater                  &spr_read_generic, &spr_write_40x_tcr,
11373e770bf7SBruno Larsen (billionai)                  0x00000000);
11383e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_TSR, "TSR",
11393e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1140cbd8f17dSCédric Le Goater                  &spr_read_generic, &spr_write_40x_tsr,
11413e770bf7SBruno Larsen (billionai)                  0x00000000);
11423e770bf7SBruno Larsen (billionai) }
11433e770bf7SBruno Larsen (billionai) 
11443e770bf7SBruno Larsen (billionai) /* SPR specific to PowerPC 405 implementation */
register_405_sprs(CPUPPCState * env)11453e770bf7SBruno Larsen (billionai) static void register_405_sprs(CPUPPCState *env)
11463e770bf7SBruno Larsen (billionai) {
11473e770bf7SBruno Larsen (billionai)     /* MMU */
11483e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_PID, "PID",
11493e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
1150dd69d140SCédric Le Goater                  &spr_read_generic, &spr_write_40x_pid,
11513e770bf7SBruno Larsen (billionai)                  0x00000000);
11523e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_4xx_CCR0, "CCR0",
11533e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11543e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11553e770bf7SBruno Larsen (billionai)                  0x00700000);
11563e770bf7SBruno Larsen (billionai)     /* Debug interface */
11573e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_DBCR0, "DBCR0",
11583e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11593e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_40x_dbcr0,
11603e770bf7SBruno Larsen (billionai)                  0x00000000);
1161acf629ebSFabiano Rosas 
11623e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_405_DBCR1, "DBCR1",
11633e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11643e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11653e770bf7SBruno Larsen (billionai)                  0x00000000);
1166acf629ebSFabiano Rosas 
11673e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_DBSR, "DBSR",
11683e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11693e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_clear,
11703e770bf7SBruno Larsen (billionai)                  /* Last reset was system reset */
11713e770bf7SBruno Larsen (billionai)                  0x00000300);
1172acf629ebSFabiano Rosas 
11733e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_DAC1, "DAC1",
11743e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11753e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11763e770bf7SBruno Larsen (billionai)                  0x00000000);
11773e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_DAC2, "DAC2",
11783e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11793e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11803e770bf7SBruno Larsen (billionai)                  0x00000000);
1181acf629ebSFabiano Rosas 
11823e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_405_DVC1, "DVC1",
11833e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11843e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11853e770bf7SBruno Larsen (billionai)                  0x00000000);
1186acf629ebSFabiano Rosas 
11873e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_405_DVC2, "DVC2",
11883e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11893e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11903e770bf7SBruno Larsen (billionai)                  0x00000000);
1191acf629ebSFabiano Rosas 
11923e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_IAC1, "IAC1",
11933e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11943e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11953e770bf7SBruno Larsen (billionai)                  0x00000000);
11963e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_IAC2, "IAC2",
11973e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
11983e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
11993e770bf7SBruno Larsen (billionai)                  0x00000000);
1200acf629ebSFabiano Rosas 
12013e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_405_IAC3, "IAC3",
12023e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12033e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12043e770bf7SBruno Larsen (billionai)                  0x00000000);
1205acf629ebSFabiano Rosas 
12063e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_405_IAC4, "IAC4",
12073e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12083e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12093e770bf7SBruno Larsen (billionai)                  0x00000000);
12103e770bf7SBruno Larsen (billionai)     /* Storage control */
12113e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_405_SLER, "SLER",
12123e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12133e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_40x_sler,
12143e770bf7SBruno Larsen (billionai)                  0x00000000);
12153e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_40x_ZPR, "ZPR",
12163e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12173e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12183e770bf7SBruno Larsen (billionai)                  0x00000000);
1219acf629ebSFabiano Rosas 
12203e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_405_SU0R, "SU0R",
12213e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12223e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12233e770bf7SBruno Larsen (billionai)                  0x00000000);
12243e770bf7SBruno Larsen (billionai)     /* SPRG */
12253e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG0, "USPRG0",
12263e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
12273e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
12283e770bf7SBruno Larsen (billionai)                  0x00000000);
12293e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG4, "SPRG4",
12303e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12313e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12323e770bf7SBruno Larsen (billionai)                  0x00000000);
12333e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG5, "SPRG5",
12343e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12353e770bf7SBruno Larsen (billionai)                  spr_read_generic, &spr_write_generic,
12363e770bf7SBruno Larsen (billionai)                  0x00000000);
12373e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG6, "SPRG6",
12383e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12393e770bf7SBruno Larsen (billionai)                  spr_read_generic, &spr_write_generic,
12403e770bf7SBruno Larsen (billionai)                  0x00000000);
12413e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG7, "SPRG7",
12423e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12433e770bf7SBruno Larsen (billionai)                  spr_read_generic, &spr_write_generic,
12443e770bf7SBruno Larsen (billionai)                  0x00000000);
1245acd1f788SFabiano Rosas 
1246acd1f788SFabiano Rosas     /* Bus access control */
1247acd1f788SFabiano Rosas     /* not emulated, as QEMU never does speculative access */
1248acd1f788SFabiano Rosas     spr_register(env, SPR_40x_SGR, "SGR",
1249acd1f788SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
1250acd1f788SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
1251acd1f788SFabiano Rosas                  0xFFFFFFFF);
1252acd1f788SFabiano Rosas     /* not emulated, as QEMU do not emulate caches */
1253acd1f788SFabiano Rosas     spr_register(env, SPR_40x_DCWR, "DCWR",
1254acd1f788SFabiano Rosas                  SPR_NOACCESS, SPR_NOACCESS,
1255acd1f788SFabiano Rosas                  &spr_read_generic, &spr_write_generic,
1256acd1f788SFabiano Rosas                  0x00000000);
12573e770bf7SBruno Larsen (billionai) }
12583e770bf7SBruno Larsen (billionai) 
12593e770bf7SBruno Larsen (billionai) 
register_5xx_8xx_sprs(CPUPPCState * env)12603e770bf7SBruno Larsen (billionai) static void register_5xx_8xx_sprs(CPUPPCState *env)
12613e770bf7SBruno Larsen (billionai) {
12623e770bf7SBruno Larsen (billionai)     /* Exception processing */
12633e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_DSISR, "DSISR",
12643e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
12653e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
12663e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_DSISR, 0x00000000);
12673e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_DAR, "DAR",
12683e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
12693e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
12703e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_DAR, 0x00000000);
12713e770bf7SBruno Larsen (billionai)     /* Timer */
12723e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_DECR, "DECR",
12733e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12743e770bf7SBruno Larsen (billionai)                  &spr_read_decr, &spr_write_decr,
12753e770bf7SBruno Larsen (billionai)                  0x00000000);
1276acf629ebSFabiano Rosas 
12773e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_EIE, "EIE",
12783e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12793e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12803e770bf7SBruno Larsen (billionai)                  0x00000000);
1281acf629ebSFabiano Rosas 
12823e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_EID, "EID",
12833e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12843e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12853e770bf7SBruno Larsen (billionai)                  0x00000000);
1286acf629ebSFabiano Rosas 
12873e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_NRI, "NRI",
12883e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12893e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12903e770bf7SBruno Larsen (billionai)                  0x00000000);
1291acf629ebSFabiano Rosas 
12923e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPA, "CMPA",
12933e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12943e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
12953e770bf7SBruno Larsen (billionai)                  0x00000000);
1296acf629ebSFabiano Rosas 
12973e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPB, "CMPB",
12983e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
12993e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13003e770bf7SBruno Larsen (billionai)                  0x00000000);
1301acf629ebSFabiano Rosas 
13023e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPC, "CMPC",
13033e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13043e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13053e770bf7SBruno Larsen (billionai)                  0x00000000);
1306acf629ebSFabiano Rosas 
13073e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPD, "CMPD",
13083e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13093e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13103e770bf7SBruno Larsen (billionai)                  0x00000000);
1311acf629ebSFabiano Rosas 
13123e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_ECR, "ECR",
13133e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13143e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13153e770bf7SBruno Larsen (billionai)                  0x00000000);
1316acf629ebSFabiano Rosas 
13173e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_DER, "DER",
13183e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13193e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13203e770bf7SBruno Larsen (billionai)                  0x00000000);
1321acf629ebSFabiano Rosas 
13223e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_COUNTA, "COUNTA",
13233e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13243e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13253e770bf7SBruno Larsen (billionai)                  0x00000000);
1326acf629ebSFabiano Rosas 
13273e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_COUNTB, "COUNTB",
13283e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13293e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13303e770bf7SBruno Larsen (billionai)                  0x00000000);
1331acf629ebSFabiano Rosas 
13323e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPE, "CMPE",
13333e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13343e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13353e770bf7SBruno Larsen (billionai)                  0x00000000);
1336acf629ebSFabiano Rosas 
13373e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPF, "CMPF",
13383e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13393e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13403e770bf7SBruno Larsen (billionai)                  0x00000000);
1341acf629ebSFabiano Rosas 
13423e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPG, "CMPG",
13433e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13443e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13453e770bf7SBruno Larsen (billionai)                  0x00000000);
1346acf629ebSFabiano Rosas 
13473e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_CMPH, "CMPH",
13483e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13493e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13503e770bf7SBruno Larsen (billionai)                  0x00000000);
1351acf629ebSFabiano Rosas 
13523e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
13533e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13543e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13553e770bf7SBruno Larsen (billionai)                  0x00000000);
1356acf629ebSFabiano Rosas 
13573e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
13583e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13593e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13603e770bf7SBruno Larsen (billionai)                  0x00000000);
1361acf629ebSFabiano Rosas 
13623e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_BAR, "BAR",
13633e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13643e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13653e770bf7SBruno Larsen (billionai)                  0x00000000);
1366acf629ebSFabiano Rosas 
13673e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_DPDR, "DPDR",
13683e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13693e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13703e770bf7SBruno Larsen (billionai)                  0x00000000);
1371acf629ebSFabiano Rosas 
13723e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_IMMR, "IMMR",
13733e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13743e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13753e770bf7SBruno Larsen (billionai)                  0x00000000);
13763e770bf7SBruno Larsen (billionai) }
13773e770bf7SBruno Larsen (billionai) 
register_5xx_sprs(CPUPPCState * env)13783e770bf7SBruno Larsen (billionai) static void register_5xx_sprs(CPUPPCState *env)
13793e770bf7SBruno Larsen (billionai) {
13803e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
13813e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13823e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13833e770bf7SBruno Larsen (billionai)                  0x00000000);
1384acf629ebSFabiano Rosas 
13853e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
13863e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13873e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13883e770bf7SBruno Larsen (billionai)                  0x00000000);
1389acf629ebSFabiano Rosas 
13903e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
13913e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13923e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13933e770bf7SBruno Larsen (billionai)                  0x00000000);
1394acf629ebSFabiano Rosas 
13953e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
13963e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
13973e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
13983e770bf7SBruno Larsen (billionai)                  0x00000000);
1399acf629ebSFabiano Rosas 
14003e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
14013e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14023e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14033e770bf7SBruno Larsen (billionai)                  0x00000000);
1404acf629ebSFabiano Rosas 
14053e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
14063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14073e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14083e770bf7SBruno Larsen (billionai)                  0x00000000);
1409acf629ebSFabiano Rosas 
14103e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
14113e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14123e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14133e770bf7SBruno Larsen (billionai)                  0x00000000);
1414acf629ebSFabiano Rosas 
14153e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
14163e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14173e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14183e770bf7SBruno Larsen (billionai)                  0x00000000);
1419acf629ebSFabiano Rosas 
14203e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
14213e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14223e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14233e770bf7SBruno Larsen (billionai)                  0x00000000);
1424acf629ebSFabiano Rosas 
14253e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
14263e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14273e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14283e770bf7SBruno Larsen (billionai)                  0x00000000);
1429acf629ebSFabiano Rosas 
14303e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
14313e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14323e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14333e770bf7SBruno Larsen (billionai)                  0x00000000);
1434acf629ebSFabiano Rosas 
14353e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
14363e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14373e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14383e770bf7SBruno Larsen (billionai)                  0x00000000);
1439acf629ebSFabiano Rosas 
14403e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
14413e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14423e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14433e770bf7SBruno Larsen (billionai)                  0x00000000);
1444acf629ebSFabiano Rosas 
14453e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
14463e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14473e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14483e770bf7SBruno Larsen (billionai)                  0x00000000);
1449acf629ebSFabiano Rosas 
14503e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
14513e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14523e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14533e770bf7SBruno Larsen (billionai)                  0x00000000);
1454acf629ebSFabiano Rosas 
14553e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
14563e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14573e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14583e770bf7SBruno Larsen (billionai)                  0x00000000);
1459acf629ebSFabiano Rosas 
14603e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
14613e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14623e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14633e770bf7SBruno Larsen (billionai)                  0x00000000);
1464acf629ebSFabiano Rosas 
14653e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
14663e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14673e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14683e770bf7SBruno Larsen (billionai)                  0x00000000);
1469acf629ebSFabiano Rosas 
14703e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
14713e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14723e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14733e770bf7SBruno Larsen (billionai)                  0x00000000);
1474acf629ebSFabiano Rosas 
14753e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
14763e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14773e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14783e770bf7SBruno Larsen (billionai)                  0x00000000);
1479acf629ebSFabiano Rosas 
14803e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_RCPU_FPECR, "FPECR",
14813e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14823e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14833e770bf7SBruno Larsen (billionai)                  0x00000000);
14843e770bf7SBruno Larsen (billionai) }
14853e770bf7SBruno Larsen (billionai) 
register_8xx_sprs(CPUPPCState * env)14863e770bf7SBruno Larsen (billionai) static void register_8xx_sprs(CPUPPCState *env)
14873e770bf7SBruno Larsen (billionai) {
1488acf629ebSFabiano Rosas 
14893e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_IC_CST, "IC_CST",
14903e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14913e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14923e770bf7SBruno Larsen (billionai)                  0x00000000);
1493acf629ebSFabiano Rosas 
14943e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
14953e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
14963e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
14973e770bf7SBruno Larsen (billionai)                  0x00000000);
1498acf629ebSFabiano Rosas 
14993e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
15003e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15013e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15023e770bf7SBruno Larsen (billionai)                  0x00000000);
1503acf629ebSFabiano Rosas 
15043e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_DC_CST, "DC_CST",
15053e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15063e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15073e770bf7SBruno Larsen (billionai)                  0x00000000);
1508acf629ebSFabiano Rosas 
15093e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
15103e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15113e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15123e770bf7SBruno Larsen (billionai)                  0x00000000);
1513acf629ebSFabiano Rosas 
15143e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
15153e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15163e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15173e770bf7SBruno Larsen (billionai)                  0x00000000);
1518acf629ebSFabiano Rosas 
15193e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
15203e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15213e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15223e770bf7SBruno Larsen (billionai)                  0x00000000);
1523acf629ebSFabiano Rosas 
15243e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_AP, "MI_AP",
15253e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15263e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15273e770bf7SBruno Larsen (billionai)                  0x00000000);
1528acf629ebSFabiano Rosas 
15293e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
15303e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15313e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15323e770bf7SBruno Larsen (billionai)                  0x00000000);
1533acf629ebSFabiano Rosas 
15343e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
15353e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15363e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15373e770bf7SBruno Larsen (billionai)                  0x00000000);
1538acf629ebSFabiano Rosas 
15393e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
15403e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15413e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15423e770bf7SBruno Larsen (billionai)                  0x00000000);
1543acf629ebSFabiano Rosas 
15443e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
15453e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15463e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15473e770bf7SBruno Larsen (billionai)                  0x00000000);
1548acf629ebSFabiano Rosas 
15493e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
15503e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15513e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15523e770bf7SBruno Larsen (billionai)                  0x00000000);
1553acf629ebSFabiano Rosas 
15543e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
15553e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15563e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15573e770bf7SBruno Larsen (billionai)                  0x00000000);
1558acf629ebSFabiano Rosas 
15593e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
15603e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15613e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15623e770bf7SBruno Larsen (billionai)                  0x00000000);
1563acf629ebSFabiano Rosas 
15643e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
15653e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15663e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15673e770bf7SBruno Larsen (billionai)                  0x00000000);
1568acf629ebSFabiano Rosas 
15693e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_AP, "MD_AP",
15703e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15713e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15723e770bf7SBruno Larsen (billionai)                  0x00000000);
1573acf629ebSFabiano Rosas 
15743e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
15753e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15763e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15773e770bf7SBruno Larsen (billionai)                  0x00000000);
1578acf629ebSFabiano Rosas 
15793e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
15803e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15813e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15823e770bf7SBruno Larsen (billionai)                  0x00000000);
1583acf629ebSFabiano Rosas 
15843e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
15853e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15863e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15873e770bf7SBruno Larsen (billionai)                  0x00000000);
1588acf629ebSFabiano Rosas 
15893e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
15903e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15913e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15923e770bf7SBruno Larsen (billionai)                  0x00000000);
1593acf629ebSFabiano Rosas 
15943e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_TW, "MD_TW",
15953e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
15963e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
15973e770bf7SBruno Larsen (billionai)                  0x00000000);
1598acf629ebSFabiano Rosas 
15993e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
16003e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
16013e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
16023e770bf7SBruno Larsen (billionai)                  0x00000000);
1603acf629ebSFabiano Rosas 
16043e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
16053e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
16063e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
16073e770bf7SBruno Larsen (billionai)                  0x00000000);
1608acf629ebSFabiano Rosas 
16093e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
16103e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
16113e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
16123e770bf7SBruno Larsen (billionai)                  0x00000000);
16133e770bf7SBruno Larsen (billionai) }
16143e770bf7SBruno Larsen (billionai) 
16153e770bf7SBruno Larsen (billionai) /*
16163e770bf7SBruno Larsen (billionai)  * AMR     => SPR 29 (Power 2.04)
16173e770bf7SBruno Larsen (billionai)  * CTRL    => SPR 136 (Power 2.04)
16183e770bf7SBruno Larsen (billionai)  * CTRL    => SPR 152 (Power 2.04)
16193e770bf7SBruno Larsen (billionai)  * SCOMC   => SPR 276 (64 bits ?)
16203e770bf7SBruno Larsen (billionai)  * SCOMD   => SPR 277 (64 bits ?)
16213e770bf7SBruno Larsen (billionai)  * TBU40   => SPR 286 (Power 2.04 hypv)
16223e770bf7SBruno Larsen (billionai)  * HSPRG0  => SPR 304 (Power 2.04 hypv)
16233e770bf7SBruno Larsen (billionai)  * HSPRG1  => SPR 305 (Power 2.04 hypv)
16243e770bf7SBruno Larsen (billionai)  * HDSISR  => SPR 306 (Power 2.04 hypv)
16253e770bf7SBruno Larsen (billionai)  * HDAR    => SPR 307 (Power 2.04 hypv)
16263e770bf7SBruno Larsen (billionai)  * PURR    => SPR 309 (Power 2.04 hypv)
16273e770bf7SBruno Larsen (billionai)  * HDEC    => SPR 310 (Power 2.04 hypv)
16283e770bf7SBruno Larsen (billionai)  * HIOR    => SPR 311 (hypv)
16293e770bf7SBruno Larsen (billionai)  * RMOR    => SPR 312 (970)
16303e770bf7SBruno Larsen (billionai)  * HRMOR   => SPR 313 (Power 2.04 hypv)
16313e770bf7SBruno Larsen (billionai)  * HSRR0   => SPR 314 (Power 2.04 hypv)
16323e770bf7SBruno Larsen (billionai)  * HSRR1   => SPR 315 (Power 2.04 hypv)
16333e770bf7SBruno Larsen (billionai)  * LPIDR   => SPR 317 (970)
1634a3c020d8SNicholas Piggin  * HEIR    => SPR 339 (Power 2.05 hypv) (64-bit reg from 3.1)
16353e770bf7SBruno Larsen (billionai)  * EPR     => SPR 702 (Power 2.04 emb)
16363e770bf7SBruno Larsen (billionai)  * perf    => 768-783 (Power 2.04)
16373e770bf7SBruno Larsen (billionai)  * perf    => 784-799 (Power 2.04)
16383e770bf7SBruno Larsen (billionai)  * PPR     => SPR 896 (Power 2.04)
16393e770bf7SBruno Larsen (billionai)  * DABRX   => 1015    (Power 2.04 hypv)
16403e770bf7SBruno Larsen (billionai)  * FPECR   => SPR 1022 (?)
16413e770bf7SBruno Larsen (billionai)  * ... and more (thermal management, performance counters, ...)
16423e770bf7SBruno Larsen (billionai)  */
16433e770bf7SBruno Larsen (billionai) 
16443e770bf7SBruno Larsen (billionai) /*****************************************************************************/
16453e770bf7SBruno Larsen (billionai) /* Exception vectors models                                                  */
init_excp_4xx(CPUPPCState * env)1646870120b4SPhilippe Mathieu-Daudé static void init_excp_4xx(CPUPPCState *env)
16473e770bf7SBruno Larsen (billionai) {
16483e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
16493e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
16503e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
16513e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
16523e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
16533e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
16543e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
16553e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
16563e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
16573e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PIT]      = 0x00001000;
16583e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00001010;
16593e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00001020;
16603e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001100;
16613e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001200;
16623e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00002000;
16633e770bf7SBruno Larsen (billionai)     env->ivor_mask = 0x0000FFF0UL;
16643e770bf7SBruno Larsen (billionai)     env->ivpr_mask = 0xFFFF0000UL;
16653e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
16663e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0xFFFFFFFCUL;
16673e770bf7SBruno Larsen (billionai) #endif
16683e770bf7SBruno Larsen (billionai) }
16693e770bf7SBruno Larsen (billionai) 
init_excp_MPC5xx(CPUPPCState * env)16703e770bf7SBruno Larsen (billionai) static void init_excp_MPC5xx(CPUPPCState *env)
16713e770bf7SBruno Larsen (billionai) {
16723e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
16733e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
16743e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
16753e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
16763e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
16773e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
16786328a3bbSFabiano Rosas     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
16793e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
16803e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
16813e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
16823e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
16833e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
16843e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
16853e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
16863e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
16873e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
16883e770bf7SBruno Larsen (billionai)     env->ivor_mask = 0x0000FFF0UL;
16893e770bf7SBruno Larsen (billionai)     env->ivpr_mask = 0xFFFF0000UL;
16903e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
16913e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
16923e770bf7SBruno Larsen (billionai) #endif
16933e770bf7SBruno Larsen (billionai) }
16943e770bf7SBruno Larsen (billionai) 
init_excp_MPC8xx(CPUPPCState * env)16953e770bf7SBruno Larsen (billionai) static void init_excp_MPC8xx(CPUPPCState *env)
16963e770bf7SBruno Larsen (billionai) {
16973e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
16983e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
16993e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
17003e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
17013e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
17023e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
17033e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
17043e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
17056328a3bbSFabiano Rosas     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
17063e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
17073e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
17083e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
17093e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPA]      = 0x00000E00;
17103e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EMUL]     = 0x00001000;
17113e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00001100;
17123e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00001200;
17133e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ITLBE]    = 0x00001300;
17143e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DTLBE]    = 0x00001400;
17153e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DABR]     = 0x00001C00;
17163e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001C00;
17173e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MEXTBR]   = 0x00001E00;
17183e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_NMEXTBR]  = 0x00001F00;
17193e770bf7SBruno Larsen (billionai)     env->ivor_mask = 0x0000FFF0UL;
17203e770bf7SBruno Larsen (billionai)     env->ivpr_mask = 0xFFFF0000UL;
17213e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
17223e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
17233e770bf7SBruno Larsen (billionai) #endif
17243e770bf7SBruno Larsen (billionai) }
17253e770bf7SBruno Larsen (billionai) 
init_excp_G2(CPUPPCState * env)17263e770bf7SBruno Larsen (billionai) static void init_excp_G2(CPUPPCState *env)
17273e770bf7SBruno Larsen (billionai) {
17283e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
17293e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
17303e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
17313e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
17323e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
17333e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
17343e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
17353e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
17363e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
17373e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
17383e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
17393e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
17403e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
17413e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
17423e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
17433e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
17443e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
17453e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
17463e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
17473e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
17483e770bf7SBruno Larsen (billionai) #endif
17493e770bf7SBruno Larsen (billionai) }
17503e770bf7SBruno Larsen (billionai) 
init_excp_e200(CPUPPCState * env,target_ulong ivpr_mask)17513e770bf7SBruno Larsen (billionai) static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
17523e770bf7SBruno Larsen (billionai) {
17533e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
17543e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000FFC;
17553e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
17563e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
17573e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
17583e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
17593e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
17603e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
17613e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
17623e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
17633e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
17643e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
17653e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
17663e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
17673e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
17683e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
17693e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
17703e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
17717fc1dc83SFabiano Rosas     /*
17727fc1dc83SFabiano Rosas      * These two are the same IVOR as POWERPC_EXCP_VPU and
17737fc1dc83SFabiano Rosas      * POWERPC_EXCP_VPUA. We deal with that when dispatching at
17747fc1dc83SFabiano Rosas      * powerpc_excp().
17757fc1dc83SFabiano Rosas      */
17763e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SPEU]     = 0x00000000;
17773e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EFPDI]    = 0x00000000;
17787fc1dc83SFabiano Rosas 
17793e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EFPRI]    = 0x00000000;
17803e770bf7SBruno Larsen (billionai)     env->ivor_mask = 0x0000FFF7UL;
17813e770bf7SBruno Larsen (billionai)     env->ivpr_mask = ivpr_mask;
17823e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
17833e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0xFFFFFFFCUL;
17843e770bf7SBruno Larsen (billionai) #endif
17853e770bf7SBruno Larsen (billionai) }
17863e770bf7SBruno Larsen (billionai) 
init_excp_BookE(CPUPPCState * env)17873e770bf7SBruno Larsen (billionai) static void init_excp_BookE(CPUPPCState *env)
17883e770bf7SBruno Larsen (billionai) {
17893e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
17903e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
17913e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000000;
17923e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000000;
17933e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000000;
17943e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
17953e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000000;
17963e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000000;
17973e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000000;
17983e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000000;
17993e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_APU]      = 0x00000000;
18003e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000000;
18013e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FIT]      = 0x00000000;
18023e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_WDT]      = 0x00000000;
18033e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DTLB]     = 0x00000000;
18043e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ITLB]     = 0x00000000;
18053e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DEBUG]    = 0x00000000;
18063e770bf7SBruno Larsen (billionai)     env->ivor_mask = 0x0000FFF0UL;
18073e770bf7SBruno Larsen (billionai)     env->ivpr_mask = 0xFFFF0000UL;
18083e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
18093e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0xFFFFFFFCUL;
18103e770bf7SBruno Larsen (billionai) #endif
18113e770bf7SBruno Larsen (billionai) }
18123e770bf7SBruno Larsen (billionai) 
init_excp_603(CPUPPCState * env)18133e770bf7SBruno Larsen (billionai) static void init_excp_603(CPUPPCState *env)
18143e770bf7SBruno Larsen (billionai) {
18153e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18163e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
18173e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
18183e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
18193e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
18203e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18213e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
18223e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
18233e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
18243e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
18253e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
18263e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
18273e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
18283e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
18293e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
18303e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
18313e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
18323e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
18333e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
18343e770bf7SBruno Larsen (billionai) #endif
18353e770bf7SBruno Larsen (billionai) }
18363e770bf7SBruno Larsen (billionai) 
init_excp_604(CPUPPCState * env)18373e770bf7SBruno Larsen (billionai) static void init_excp_604(CPUPPCState *env)
18383e770bf7SBruno Larsen (billionai) {
18393e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18403e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
18413e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
18423e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
18433e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
18443e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18453e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
18463e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
18473e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
18483e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
18493e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
18503e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
18513e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
18523e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
18533e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
18543e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
18553e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
18563e770bf7SBruno Larsen (billionai) #endif
18573e770bf7SBruno Larsen (billionai) }
18583e770bf7SBruno Larsen (billionai) 
init_excp_7x0(CPUPPCState * env)18593e770bf7SBruno Larsen (billionai) static void init_excp_7x0(CPUPPCState *env)
18603e770bf7SBruno Larsen (billionai) {
18613e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18623e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
18633e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
18643e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
18653e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
18663e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18673e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
18683e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
18693e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
18703e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
18713e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
18723e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
18733e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
18743e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
18753e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
18763e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
18773e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
18783e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
18793e770bf7SBruno Larsen (billionai) #endif
18803e770bf7SBruno Larsen (billionai) }
18813e770bf7SBruno Larsen (billionai) 
init_excp_750cl(CPUPPCState * env)18823e770bf7SBruno Larsen (billionai) static void init_excp_750cl(CPUPPCState *env)
18833e770bf7SBruno Larsen (billionai) {
18843e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
18853e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
18863e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
18873e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
18883e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
18893e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
18903e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
18913e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
18923e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
18933e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
18943e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
18953e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
18963e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
18973e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
18983e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
18993e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
19003e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
19013e770bf7SBruno Larsen (billionai) #endif
19023e770bf7SBruno Larsen (billionai) }
19033e770bf7SBruno Larsen (billionai) 
init_excp_750cx(CPUPPCState * env)19043e770bf7SBruno Larsen (billionai) static void init_excp_750cx(CPUPPCState *env)
19053e770bf7SBruno Larsen (billionai) {
19063e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19073e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
19083e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
19093e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
19103e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
19113e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19123e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
19133e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
19143e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
19153e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
19163e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
19173e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
19183e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
19193e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
19203e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
19213e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
19223e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
19233e770bf7SBruno Larsen (billionai) #endif
19243e770bf7SBruno Larsen (billionai) }
19253e770bf7SBruno Larsen (billionai) 
19263e770bf7SBruno Larsen (billionai) /* XXX: Check if this is correct */
init_excp_7x5(CPUPPCState * env)19273e770bf7SBruno Larsen (billionai) static void init_excp_7x5(CPUPPCState *env)
19283e770bf7SBruno Larsen (billionai) {
19293e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19303e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
19313e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
19323e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
19333e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
19343e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19353e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
19363e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
19373e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
19383e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
19393e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
19403e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
19413e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
19423e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IFTLB]    = 0x00001000;
19433e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DLTLB]    = 0x00001100;
19443e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSTLB]    = 0x00001200;
19453e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
19463e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
19473e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
19483e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
19493e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
19503e770bf7SBruno Larsen (billionai) #endif
19513e770bf7SBruno Larsen (billionai) }
19523e770bf7SBruno Larsen (billionai) 
init_excp_7400(CPUPPCState * env)19533e770bf7SBruno Larsen (billionai) static void init_excp_7400(CPUPPCState *env)
19543e770bf7SBruno Larsen (billionai) {
19553e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19563e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
19573e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
19583e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
19593e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
19603e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19613e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
19623e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
19633e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
19643e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
19653e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
19663e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
19673e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
19683e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
19693e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
19703e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
19713e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
19723e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001700;
19733e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
19743e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
19753e770bf7SBruno Larsen (billionai) #endif
19763e770bf7SBruno Larsen (billionai) }
19773e770bf7SBruno Larsen (billionai) 
init_excp_7450(CPUPPCState * env)19783e770bf7SBruno Larsen (billionai) static void init_excp_7450(CPUPPCState *env)
19793e770bf7SBruno Larsen (billionai) {
19803e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
19813e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
19823e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
19833e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
19843e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
19853e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
19863e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
19873e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
19883e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
19893e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
19903e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
19913e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
19923e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
19933e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
19943e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
19953e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SMI]      = 0x00001400;
19963e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001600;
19973e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
19983e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x00000100UL;
19993e770bf7SBruno Larsen (billionai) #endif
20003e770bf7SBruno Larsen (billionai) }
20013e770bf7SBruno Larsen (billionai) 
20023e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
init_excp_970(CPUPPCState * env)20033e770bf7SBruno Larsen (billionai) static void init_excp_970(CPUPPCState *env)
20043e770bf7SBruno Larsen (billionai) {
20053e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20063e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
20073e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
20083e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
20093e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
20103e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
20113e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
20123e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
20133e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
20143e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
20153e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
20163e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
20173e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
20183e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
20193e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
20203e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
20213e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
20223e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_IABR]     = 0x00001300;
20233e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MAINT]    = 0x00001600;
20243e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VPUA]     = 0x00001700;
20253e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_THERM]    = 0x00001800;
20263e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
20273e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x0000000000000100ULL;
20283e770bf7SBruno Larsen (billionai) #endif
20293e770bf7SBruno Larsen (billionai) }
20303e770bf7SBruno Larsen (billionai) 
init_excp_POWER7(CPUPPCState * env)20313e770bf7SBruno Larsen (billionai) static void init_excp_POWER7(CPUPPCState *env)
20323e770bf7SBruno Larsen (billionai) {
20333e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20343e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_RESET]    = 0x00000100;
20353e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_MCHECK]   = 0x00000200;
20363e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSI]      = 0x00000300;
20373e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DSEG]     = 0x00000380;
20383e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISI]      = 0x00000400;
20393e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ISEG]     = 0x00000480;
20403e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
20413e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_ALIGN]    = 0x00000600;
20423e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PROGRAM]  = 0x00000700;
20433e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FPU]      = 0x00000800;
20443e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_DECR]     = 0x00000900;
20453e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HDECR]    = 0x00000980;
20463e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL]  = 0x00000C00;
20473e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_TRACE]    = 0x00000D00;
20483e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HDSI]     = 0x00000E00;
20493e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HISI]     = 0x00000E20;
20503e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HV_EMU]   = 0x00000E40;
20513e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HV_MAINT] = 0x00000E60;
20523e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_PERFM]    = 0x00000F00;
20533e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VPU]      = 0x00000F20;
20543e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_VSXU]     = 0x00000F40;
20553e770bf7SBruno Larsen (billionai)     /* Hardware reset vector */
20563e770bf7SBruno Larsen (billionai)     env->hreset_vector = 0x0000000000000100ULL;
20573e770bf7SBruno Larsen (billionai) #endif
20583e770bf7SBruno Larsen (billionai) }
20593e770bf7SBruno Larsen (billionai) 
init_excp_POWER8(CPUPPCState * env)20603e770bf7SBruno Larsen (billionai) static void init_excp_POWER8(CPUPPCState *env)
20613e770bf7SBruno Larsen (billionai) {
20623e770bf7SBruno Larsen (billionai)     init_excp_POWER7(env);
20633e770bf7SBruno Larsen (billionai) 
20643e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20653e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SDOOR]    = 0x00000A00;
20663e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_FU]       = 0x00000F60;
20673e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HV_FU]    = 0x00000F80;
20683e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SDOOR_HV] = 0x00000E80;
2069cb76bbc4SDaniel Henrique Barboza 
2070cb76bbc4SDaniel Henrique Barboza     /* Userland exceptions without vector value in PowerISA v3.1 */
2071cb76bbc4SDaniel Henrique Barboza     env->excp_vectors[POWERPC_EXCP_PERFM_EBB] = 0x0;
2072cb76bbc4SDaniel Henrique Barboza     env->excp_vectors[POWERPC_EXCP_EXTERNAL_EBB] = 0x0;
20733e770bf7SBruno Larsen (billionai) #endif
20743e770bf7SBruno Larsen (billionai) }
20753e770bf7SBruno Larsen (billionai) 
init_excp_POWER9(CPUPPCState * env)20763e770bf7SBruno Larsen (billionai) static void init_excp_POWER9(CPUPPCState *env)
20773e770bf7SBruno Larsen (billionai) {
20783e770bf7SBruno Larsen (billionai)     init_excp_POWER8(env);
20793e770bf7SBruno Larsen (billionai) 
20803e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
20813e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_HVIRT]    = 0x00000EA0;
20823e770bf7SBruno Larsen (billionai)     env->excp_vectors[POWERPC_EXCP_SYSCALL_VECTORED] = 0x00017000;
20833e770bf7SBruno Larsen (billionai) #endif
20843e770bf7SBruno Larsen (billionai) }
20853e770bf7SBruno Larsen (billionai) 
init_excp_POWER10(CPUPPCState * env)20863e770bf7SBruno Larsen (billionai) static void init_excp_POWER10(CPUPPCState *env)
20873e770bf7SBruno Larsen (billionai) {
20883e770bf7SBruno Larsen (billionai)     init_excp_POWER9(env);
20893e770bf7SBruno Larsen (billionai) }
20903e770bf7SBruno Larsen (billionai) 
20913e770bf7SBruno Larsen (billionai) #endif
20923e770bf7SBruno Larsen (billionai) 
check_pow_hid0(CPUPPCState * env)20933e770bf7SBruno Larsen (billionai) static int check_pow_hid0(CPUPPCState *env)
20943e770bf7SBruno Larsen (billionai) {
20953e770bf7SBruno Larsen (billionai)     if (env->spr[SPR_HID0] & 0x00E00000) {
20963e770bf7SBruno Larsen (billionai)         return 1;
20973e770bf7SBruno Larsen (billionai)     }
20983e770bf7SBruno Larsen (billionai) 
20993e770bf7SBruno Larsen (billionai)     return 0;
21003e770bf7SBruno Larsen (billionai) }
21013e770bf7SBruno Larsen (billionai) 
check_pow_hid0_74xx(CPUPPCState * env)21023e770bf7SBruno Larsen (billionai) static int check_pow_hid0_74xx(CPUPPCState *env)
21033e770bf7SBruno Larsen (billionai) {
21043e770bf7SBruno Larsen (billionai)     if (env->spr[SPR_HID0] & 0x00600000) {
21053e770bf7SBruno Larsen (billionai)         return 1;
21063e770bf7SBruno Larsen (billionai)     }
21073e770bf7SBruno Larsen (billionai) 
21083e770bf7SBruno Larsen (billionai)     return 0;
21093e770bf7SBruno Larsen (billionai) }
21103e770bf7SBruno Larsen (billionai) 
211145693f94SNicholas Piggin #if defined(TARGET_PPC64)
check_attn_hid0(CPUPPCState * env)211245693f94SNicholas Piggin static int check_attn_hid0(CPUPPCState *env)
211345693f94SNicholas Piggin {
211445693f94SNicholas Piggin     if (env->spr[SPR_HID0] & HID0_ENABLE_ATTN) {
211545693f94SNicholas Piggin         return 1;
211645693f94SNicholas Piggin     }
211745693f94SNicholas Piggin 
211845693f94SNicholas Piggin     return 0;
211945693f94SNicholas Piggin }
212045693f94SNicholas Piggin 
check_attn_hid0_power9(CPUPPCState * env)212145693f94SNicholas Piggin static int check_attn_hid0_power9(CPUPPCState *env)
212245693f94SNicholas Piggin {
212345693f94SNicholas Piggin     if (env->spr[SPR_HID0] & HID0_POWER9_ENABLE_ATTN) {
212445693f94SNicholas Piggin         return 1;
212545693f94SNicholas Piggin     }
212645693f94SNicholas Piggin 
212745693f94SNicholas Piggin     return 0;
212845693f94SNicholas Piggin }
212945693f94SNicholas Piggin #endif
213045693f94SNicholas Piggin 
init_tlbs_emb(CPUPPCState * env)2131581eea5dSBALATON Zoltan static void init_tlbs_emb(CPUPPCState *env)
2132581eea5dSBALATON Zoltan {
2133581eea5dSBALATON Zoltan #ifndef CONFIG_USER_ONLY
2134581eea5dSBALATON Zoltan     env->nb_tlb = 64;
2135581eea5dSBALATON Zoltan     env->nb_ways = 1;
2136581eea5dSBALATON Zoltan     env->tlb_type = TLB_EMB;
2137581eea5dSBALATON Zoltan #endif
2138581eea5dSBALATON Zoltan }
2139581eea5dSBALATON Zoltan 
init_proc_405(CPUPPCState * env)21403e770bf7SBruno Larsen (billionai) static void init_proc_405(CPUPPCState *env)
21413e770bf7SBruno Larsen (billionai) {
21423e770bf7SBruno Larsen (billionai)     register_40x_sprs(env);
21433e770bf7SBruno Larsen (billionai)     register_405_sprs(env);
21444ffb8c5eSFabiano Rosas     register_usprgh_sprs(env);
2145acd1f788SFabiano Rosas 
2146581eea5dSBALATON Zoltan     init_tlbs_emb(env);
2147870120b4SPhilippe Mathieu-Daudé     init_excp_4xx(env);
21483e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
21493e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
21503e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
21513e770bf7SBruno Larsen (billionai)     ppc40x_irq_init(env_archcpu(env));
21523e770bf7SBruno Larsen (billionai) 
21533e770bf7SBruno Larsen (billionai)     SET_FIT_PERIOD(8, 12, 16, 20);
21543e770bf7SBruno Larsen (billionai)     SET_WDT_PERIOD(16, 20, 24, 28);
21553e770bf7SBruno Larsen (billionai) }
21563e770bf7SBruno Larsen (billionai) 
21573e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
21583e770bf7SBruno Larsen (billionai) {
21593e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
21603e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
21613e770bf7SBruno Larsen (billionai) 
21623e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 405";
21633e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_405;
21643e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
216545693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
21663e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
21673e770bf7SBruno Larsen (billionai)                        PPC_DCR | PPC_WRTEE |
21683e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
21693e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
21703e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
21713e770bf7SBruno Larsen (billionai)                        PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
21723e770bf7SBruno Larsen (billionai)                        PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
2173645d843cSFabiano Rosas     pcc->msr_mask = (1ull << MSR_WE) |
21743e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
21753e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
21763e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
21773e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
2178301e5d48SFabiano Rosas                     (1ull << MSR_ME) |
21793e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
21803e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
21813e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
21823e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
21833e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
21843e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_40x;
21853e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_405;
21863e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_403;
21873e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
21883e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
21893e770bf7SBruno Larsen (billionai) }
21903e770bf7SBruno Larsen (billionai) 
init_proc_440EP(CPUPPCState * env)21913e770bf7SBruno Larsen (billionai) static void init_proc_440EP(CPUPPCState *env)
21923e770bf7SBruno Larsen (billionai) {
21933e770bf7SBruno Larsen (billionai)     register_BookE_sprs(env, 0x000000000000FFFFULL);
21943e770bf7SBruno Larsen (billionai)     register_440_sprs(env);
21953e770bf7SBruno Larsen (billionai)     register_usprgh_sprs(env);
2196acf629ebSFabiano Rosas 
21973e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
21983e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
21993e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
22003e770bf7SBruno Larsen (billionai)                  0x00000000);
22013e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
22023e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
22033e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
22043e770bf7SBruno Larsen (billionai)                  0x00000000);
22053e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
22063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
22073e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
22083e770bf7SBruno Larsen (billionai)                  0x00000000);
2209acf629ebSFabiano Rosas 
22103e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_CCR1, "CCR1",
22113e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
22123e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
22133e770bf7SBruno Larsen (billionai)                  0x00000000);
2214581eea5dSBALATON Zoltan 
2215581eea5dSBALATON Zoltan     init_tlbs_emb(env);
22163e770bf7SBruno Larsen (billionai)     init_excp_BookE(env);
22173e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
22183e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
22193e770bf7SBruno Larsen (billionai)     ppc40x_irq_init(env_archcpu(env));
22203e770bf7SBruno Larsen (billionai) 
22213e770bf7SBruno Larsen (billionai)     SET_FIT_PERIOD(12, 16, 20, 24);
22223e770bf7SBruno Larsen (billionai)     SET_WDT_PERIOD(20, 24, 28, 32);
22233e770bf7SBruno Larsen (billionai) }
22243e770bf7SBruno Larsen (billionai) 
22253e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
22263e770bf7SBruno Larsen (billionai) {
22273e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
22283e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
22293e770bf7SBruno Larsen (billionai) 
22303e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 440 EP";
22313e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_440EP;
22323e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
223345693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
22343e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
22353e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
22363e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
22373e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
22383e770bf7SBruno Larsen (billionai)                        PPC_DCR | PPC_WRTEE | PPC_RFMCI |
22393e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
22403e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
22413e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_MFTB |
22423e770bf7SBruno Larsen (billionai)                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
22433e770bf7SBruno Larsen (billionai)                        PPC_440_SPEC;
22443e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
22453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
22463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
22473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
22483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
22493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
22503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
22513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
22523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
22533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
22543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
22553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
22563e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE;
22573e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
22583e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
22593e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_403;
22603e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
22613e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
22623e770bf7SBruno Larsen (billionai) }
22633e770bf7SBruno Larsen (billionai) 
22643e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(460EX)(ObjectClass *oc, void *data)
22653e770bf7SBruno Larsen (billionai) {
22663e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
22673e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
22683e770bf7SBruno Larsen (billionai) 
22693e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 460 EX";
22703e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_440EP;
22713e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
227245693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
22733e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
22743e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
22753e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
22763e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
22773e770bf7SBruno Larsen (billionai)                        PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_RFMCI |
22783e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
22793e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
22803e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_MFTB |
22813e770bf7SBruno Larsen (billionai)                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
22823e770bf7SBruno Larsen (billionai)                        PPC_440_SPEC;
22833e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
22843e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
22853e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
22863e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
22873e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
22883e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
22893e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
22903e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
22913e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
22923e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
22933e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
22943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
22953e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE;
22963e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
22973e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
22983e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_403;
22993e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
23003e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
23013e770bf7SBruno Larsen (billionai) }
23023e770bf7SBruno Larsen (billionai) 
init_proc_440GP(CPUPPCState * env)23033e770bf7SBruno Larsen (billionai) static void init_proc_440GP(CPUPPCState *env)
23043e770bf7SBruno Larsen (billionai) {
23053e770bf7SBruno Larsen (billionai)     register_BookE_sprs(env, 0x000000000000FFFFULL);
23063e770bf7SBruno Larsen (billionai)     register_440_sprs(env);
23073e770bf7SBruno Larsen (billionai)     register_usprgh_sprs(env);
2308acf629ebSFabiano Rosas 
2309581eea5dSBALATON Zoltan     init_tlbs_emb(env);
23103e770bf7SBruno Larsen (billionai)     init_excp_BookE(env);
23113e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
23123e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
23133e770bf7SBruno Larsen (billionai)     /* XXX: TODO: allocate internal IRQ controller */
23143e770bf7SBruno Larsen (billionai) 
23153e770bf7SBruno Larsen (billionai)     SET_FIT_PERIOD(12, 16, 20, 24);
23163e770bf7SBruno Larsen (billionai)     SET_WDT_PERIOD(20, 24, 28, 32);
23173e770bf7SBruno Larsen (billionai) }
23183e770bf7SBruno Larsen (billionai) 
23193e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
23203e770bf7SBruno Larsen (billionai) {
23213e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
23223e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
23233e770bf7SBruno Larsen (billionai) 
23243e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 440 GP";
23253e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_440GP;
23263e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
232745693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
23283e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
23293e770bf7SBruno Larsen (billionai)                        PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
23303e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
23313e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
23323e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
23333e770bf7SBruno Larsen (billionai)                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
23343e770bf7SBruno Larsen (billionai)                        PPC_440_SPEC;
23353e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
23363e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
23373e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
23383e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
23393e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
23403e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
23413e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
23423e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
23433e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
23443e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
23453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
23463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
23473e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE;
23483e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
23493e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
23503e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_403;
23513e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
23523e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
23533e770bf7SBruno Larsen (billionai) }
23543e770bf7SBruno Larsen (billionai) 
init_proc_440x5(CPUPPCState * env)23553e770bf7SBruno Larsen (billionai) static void init_proc_440x5(CPUPPCState *env)
23563e770bf7SBruno Larsen (billionai) {
23573e770bf7SBruno Larsen (billionai)     register_BookE_sprs(env, 0x000000000000FFFFULL);
23583e770bf7SBruno Larsen (billionai)     register_440_sprs(env);
23593e770bf7SBruno Larsen (billionai)     register_usprgh_sprs(env);
2360acf629ebSFabiano Rosas 
23613e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
23623e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
23633e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
23643e770bf7SBruno Larsen (billionai)                  0x00000000);
23653e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
23663e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
23673e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
23683e770bf7SBruno Larsen (billionai)                  0x00000000);
23693e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
23703e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
23713e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
23723e770bf7SBruno Larsen (billionai)                  0x00000000);
2373acf629ebSFabiano Rosas 
23743e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_440_CCR1, "CCR1",
23753e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
23763e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
23773e770bf7SBruno Larsen (billionai)                  0x00000000);
2378581eea5dSBALATON Zoltan 
2379581eea5dSBALATON Zoltan     init_tlbs_emb(env);
23803e770bf7SBruno Larsen (billionai)     init_excp_BookE(env);
23813e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
23823e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
23833e770bf7SBruno Larsen (billionai)     ppc40x_irq_init(env_archcpu(env));
23843e770bf7SBruno Larsen (billionai) 
23853e770bf7SBruno Larsen (billionai)     SET_FIT_PERIOD(12, 16, 20, 24);
23863e770bf7SBruno Larsen (billionai)     SET_WDT_PERIOD(20, 24, 28, 32);
23873e770bf7SBruno Larsen (billionai) }
23883e770bf7SBruno Larsen (billionai) 
23893e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
23903e770bf7SBruno Larsen (billionai) {
23913e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
23923e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
23933e770bf7SBruno Larsen (billionai) 
23943e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 440x5";
23953e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_440x5;
23963e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
239745693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
23983e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
23993e770bf7SBruno Larsen (billionai)                        PPC_DCR | PPC_WRTEE | PPC_RFMCI |
24003e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
24013e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
24023e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_MFTB |
24033e770bf7SBruno Larsen (billionai)                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
24043e770bf7SBruno Larsen (billionai)                        PPC_440_SPEC;
24053e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
24063e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
24073e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
24083e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
24093e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
24103e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
24113e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
24123e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
24133e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
24143e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
24153e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
24163e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
24173e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE;
24183e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
24193e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
24203e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_403;
24213e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
24223e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
24233e770bf7SBruno Larsen (billionai) }
24243e770bf7SBruno Larsen (billionai) 
24253e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(440x5wDFPU)(ObjectClass *oc, void *data)
24263e770bf7SBruno Larsen (billionai) {
24273e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
24283e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
24293e770bf7SBruno Larsen (billionai) 
24303e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 440x5 with double precision FPU";
24313e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_440x5;
24323e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
243345693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
24343e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
24353e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSQRT |
24363e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
24373e770bf7SBruno Larsen (billionai)                        PPC_DCR | PPC_WRTEE | PPC_RFMCI |
24383e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
24393e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
24403e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_MFTB |
24413e770bf7SBruno Larsen (billionai)                        PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
24423e770bf7SBruno Larsen (billionai)                        PPC_440_SPEC;
24433e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_FP_CVT_S64;
24443e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
24453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
24463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
24473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
24483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
24493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
24503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
24513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
24523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
24533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
24543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
24553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
24563e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE;
24573e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
24583e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
24593e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_403;
24603e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
24613e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
24623e770bf7SBruno Larsen (billionai) }
24633e770bf7SBruno Larsen (billionai) 
init_proc_MPC5xx(CPUPPCState * env)24643e770bf7SBruno Larsen (billionai) static void init_proc_MPC5xx(CPUPPCState *env)
24653e770bf7SBruno Larsen (billionai) {
24663e770bf7SBruno Larsen (billionai)     register_5xx_8xx_sprs(env);
24673e770bf7SBruno Larsen (billionai)     register_5xx_sprs(env);
24683e770bf7SBruno Larsen (billionai)     init_excp_MPC5xx(env);
24693e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
24703e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
24713e770bf7SBruno Larsen (billionai)     /* XXX: TODO: allocate internal IRQ controller */
24723e770bf7SBruno Larsen (billionai) }
24733e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(MPC5xx)24743e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
24753e770bf7SBruno Larsen (billionai) {
24763e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
24773e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
24783e770bf7SBruno Larsen (billionai) 
24793e770bf7SBruno Larsen (billionai)     dc->desc = "Freescale 5xx cores (aka RCPU)";
24803e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_MPC5xx;
24813e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_none;
248245693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
24833e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
24843e770bf7SBruno Larsen (billionai)                        PPC_MEM_EIEIO | PPC_MEM_SYNC |
24853e770bf7SBruno Larsen (billionai)                        PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
24863e770bf7SBruno Larsen (billionai)                        PPC_MFTB;
24873e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_ILE) |
24883e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
24893e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
24903e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
24913e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
24923e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
24933e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
24943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
24953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
24963e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
24973e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
24983e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
24993e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_REAL;
25009323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
25013e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
25023e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_505;
25033e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
25043e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
25053e770bf7SBruno Larsen (billionai) }
25063e770bf7SBruno Larsen (billionai) 
init_proc_MPC8xx(CPUPPCState * env)25073e770bf7SBruno Larsen (billionai) static void init_proc_MPC8xx(CPUPPCState *env)
25083e770bf7SBruno Larsen (billionai) {
25093e770bf7SBruno Larsen (billionai)     register_5xx_8xx_sprs(env);
25103e770bf7SBruno Larsen (billionai)     register_8xx_sprs(env);
25113e770bf7SBruno Larsen (billionai)     init_excp_MPC8xx(env);
25123e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
25133e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
25143e770bf7SBruno Larsen (billionai)     /* XXX: TODO: allocate internal IRQ controller */
25153e770bf7SBruno Larsen (billionai) }
25163e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(MPC8xx)25173e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
25183e770bf7SBruno Larsen (billionai) {
25193e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
25203e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
25213e770bf7SBruno Larsen (billionai) 
25223e770bf7SBruno Larsen (billionai)     dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
25233e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_MPC8xx;
25243e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_none;
252545693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
25263e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING  |
25273e770bf7SBruno Larsen (billionai)                        PPC_MEM_EIEIO | PPC_MEM_SYNC |
25283e770bf7SBruno Larsen (billionai)                        PPC_CACHE_ICBI | PPC_MFTB;
25293e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_ILE) |
25303e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
25313e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
25323e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
25333e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
25343e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
25353e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
25363e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
25373e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
25383e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
25393e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
25403e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
25413e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_MPC8xx;
25429323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
25433e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
25443e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_860;
25453e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
25463e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
25473e770bf7SBruno Larsen (billionai) }
25483e770bf7SBruno Larsen (billionai) 
25493e770bf7SBruno Larsen (billionai) /* Freescale 82xx cores (aka PowerQUICC-II)                                  */
25503e770bf7SBruno Larsen (billionai) 
init_proc_G2(CPUPPCState * env)25513e770bf7SBruno Larsen (billionai) static void init_proc_G2(CPUPPCState *env)
25523e770bf7SBruno Larsen (billionai) {
2553217781afSFabiano Rosas     register_non_embedded_sprs(env);
25543e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
25553e770bf7SBruno Larsen (billionai)     register_G2_sprs(env);
2556acf629ebSFabiano Rosas 
25573e770bf7SBruno Larsen (billionai)     /* Memory management */
25583e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
25593e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
25603e770bf7SBruno Larsen (billionai)     register_6xx_7xx_soft_tlb(env, 64, 2);
25613e770bf7SBruno Larsen (billionai)     init_excp_G2(env);
25623e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
25633e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
25643e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
25653e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
25663e770bf7SBruno Larsen (billionai) }
25673e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(G2)25683e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
25693e770bf7SBruno Larsen (billionai) {
25703e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
25713e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
25723e770bf7SBruno Larsen (billionai) 
25733e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC G2";
25743e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_G2;
25753e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
257645693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
25773e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
25783e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
25793e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
25803e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
25813e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
25823e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
25833e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
25843e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
25853e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TGPR) |
25863e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
25873e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
25883e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
25893e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
25903e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
25913e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
25923e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
25933e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
25943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_AL) |
25953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
25963e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
25973e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
25983e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI);
25993e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
26009323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
26013e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
26023e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_ec603e;
26033e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
26043e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
26053e770bf7SBruno Larsen (billionai) }
26063e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(G2LE)26073e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
26083e770bf7SBruno Larsen (billionai) {
26093e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
26103e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
26113e770bf7SBruno Larsen (billionai) 
26123e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC G2LE";
2613363bd7d0SFabiano Rosas     pcc->init_proc = init_proc_G2;
26143e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
261545693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
26163e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
26173e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
26183e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
26193e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
26203e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
26213e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
26223e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
26233e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
26243e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TGPR) |
26253e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
26263e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
26273e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
26283e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
26293e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
26303e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
26313e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
26323e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
26333e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
26343e770bf7SBruno Larsen (billionai)                     (1ull << MSR_AL) |
26353e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
26363e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
26373e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
26383e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
26393e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
26403e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
26419323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
26423e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
26433e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_ec603e;
26443e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
26453e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
26463e770bf7SBruno Larsen (billionai) }
26473e770bf7SBruno Larsen (billionai) 
init_proc_e200(CPUPPCState * env)26483e770bf7SBruno Larsen (billionai) static void init_proc_e200(CPUPPCState *env)
26493e770bf7SBruno Larsen (billionai) {
26503e770bf7SBruno Larsen (billionai)     register_BookE_sprs(env, 0x000000070000FFFFULL);
2651acf629ebSFabiano Rosas 
26523e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
26533e770bf7SBruno Larsen (billionai)                  &spr_read_spefscr, &spr_write_spefscr,
26543e770bf7SBruno Larsen (billionai)                  &spr_read_spefscr, &spr_write_spefscr,
26553e770bf7SBruno Larsen (billionai)                  0x00000000);
26563e770bf7SBruno Larsen (billionai)     /* Memory management */
26573e770bf7SBruno Larsen (billionai)     register_BookE206_sprs(env, 0x0000005D, NULL, 0);
26584ffb8c5eSFabiano Rosas     register_usprgh_sprs(env);
2659acf629ebSFabiano Rosas 
26603e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID0, "HID0",
26613e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
26623e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
26633e770bf7SBruno Larsen (billionai)                  0x00000000);
2664acf629ebSFabiano Rosas 
26653e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID1, "HID1",
26663e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
26673e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
26683e770bf7SBruno Larsen (billionai)                  0x00000000);
2669acf629ebSFabiano Rosas 
26703e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
26713e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
26723e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
26733e770bf7SBruno Larsen (billionai)                  0x00000000);
2674acf629ebSFabiano Rosas 
26753e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
26763e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
26773e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
26783e770bf7SBruno Larsen (billionai)                  0x00000000);
2679acf629ebSFabiano Rosas 
26803e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
26813e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
26823e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
26833e770bf7SBruno Larsen (billionai)                  0x00000000);
2684acf629ebSFabiano Rosas 
26853e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
26863e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
26873e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
26883e770bf7SBruno Larsen (billionai)                  0x00000000);
2689acf629ebSFabiano Rosas 
26903e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
26913e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
26923e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
26933e770bf7SBruno Larsen (billionai)                  0x00000000);
2694acf629ebSFabiano Rosas 
26953e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
26963e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
26973e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
26983e770bf7SBruno Larsen (billionai)                  0x00000000);
2699acf629ebSFabiano Rosas 
27003e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
27013e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27023e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27033e770bf7SBruno Larsen (billionai)                  0x00000000);
2704acf629ebSFabiano Rosas 
27053e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
27063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27073e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27083e770bf7SBruno Larsen (billionai)                  0x00000000);
2709acf629ebSFabiano Rosas 
27103e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
27113e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27123e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27133e770bf7SBruno Larsen (billionai)                  0x00000000);
2714acf629ebSFabiano Rosas 
27153e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
27163e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27173e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27183e770bf7SBruno Larsen (billionai)                  0x00000000);
2719acf629ebSFabiano Rosas 
27203e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_IAC3, "IAC3",
27213e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27223e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27233e770bf7SBruno Larsen (billionai)                  0x00000000);
2724acf629ebSFabiano Rosas 
27253e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_IAC4, "IAC4",
27263e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27273e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27283e770bf7SBruno Larsen (billionai)                  0x00000000);
2729acf629ebSFabiano Rosas 
27303e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
27313e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27323e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27333e770bf7SBruno Larsen (billionai)                  0x00000000); /* TOFIX */
27343e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
27353e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27363e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27373e770bf7SBruno Larsen (billionai)                  0x00000000);
27383e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
27393e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
27403e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
27413e770bf7SBruno Larsen (billionai)                  0x00000000);
2742581eea5dSBALATON Zoltan 
2743581eea5dSBALATON Zoltan     init_tlbs_emb(env);
27443e770bf7SBruno Larsen (billionai)     init_excp_e200(env, 0xFFFF0000UL);
27453e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
27463e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
27473e770bf7SBruno Larsen (billionai)     /* XXX: TODO: allocate internal IRQ controller */
27483e770bf7SBruno Larsen (billionai) }
27493e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(e200)27503e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
27513e770bf7SBruno Larsen (billionai) {
27523e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
27533e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
27543e770bf7SBruno Larsen (billionai) 
27553e770bf7SBruno Larsen (billionai)     dc->desc = "e200 core";
27563e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_e200;
27573e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
275845693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
27593e770bf7SBruno Larsen (billionai)     /*
27603e770bf7SBruno Larsen (billionai)      * XXX: unimplemented instructions:
27613e770bf7SBruno Larsen (billionai)      * dcblc
27623e770bf7SBruno Larsen (billionai)      * dcbtlst
27633e770bf7SBruno Larsen (billionai)      * dcbtstls
27643e770bf7SBruno Larsen (billionai)      * icblc
27653e770bf7SBruno Larsen (billionai)      * icbtls
27663e770bf7SBruno Larsen (billionai)      * tlbivax
27673e770bf7SBruno Larsen (billionai)      * all SPE multiply-accumulate instructions
27683e770bf7SBruno Larsen (billionai)      */
27693e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
27703e770bf7SBruno Larsen (billionai)                        PPC_SPE | PPC_SPE_SINGLE |
27713e770bf7SBruno Larsen (billionai)                        PPC_WRTEE | PPC_RFDI |
27723e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
27733e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
27743e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_TLBIVAX |
27753e770bf7SBruno Larsen (billionai)                        PPC_BOOKE;
27763e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_UCLE) |
27773e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SPE) |
27783e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
27793e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
27803e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
27813e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
27823e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
27833e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
27843e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
27853e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
27863e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
27873e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
27883e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
27893e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
27903e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE206;
27913e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
27923e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
27933e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_860;
27943e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
27953e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
27963e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
27973e770bf7SBruno Larsen (billionai) }
27983e770bf7SBruno Larsen (billionai) 
27993e770bf7SBruno Larsen (billionai) enum fsl_e500_version {
28003e770bf7SBruno Larsen (billionai)     fsl_e500v1,
28013e770bf7SBruno Larsen (billionai)     fsl_e500v2,
28023e770bf7SBruno Larsen (billionai)     fsl_e500mc,
28033e770bf7SBruno Larsen (billionai)     fsl_e5500,
28043e770bf7SBruno Larsen (billionai)     fsl_e6500,
28053e770bf7SBruno Larsen (billionai) };
28063e770bf7SBruno Larsen (billionai) 
init_proc_e500(CPUPPCState * env,int version)28073e770bf7SBruno Larsen (billionai) static void init_proc_e500(CPUPPCState *env, int version)
28083e770bf7SBruno Larsen (billionai) {
28093e770bf7SBruno Larsen (billionai)     uint32_t tlbncfg[2];
28103e770bf7SBruno Larsen (billionai)     uint64_t ivor_mask;
28113e770bf7SBruno Larsen (billionai)     uint64_t ivpr_mask = 0xFFFF0000ULL;
28123e770bf7SBruno Larsen (billionai)     uint32_t l1cfg0 = 0x3800  /* 8 ways */
28133e770bf7SBruno Larsen (billionai)                     | 0x0020; /* 32 kb */
28143e770bf7SBruno Larsen (billionai)     uint32_t l1cfg1 = 0x3800  /* 8 ways */
28153e770bf7SBruno Larsen (billionai)                     | 0x0020; /* 32 kb */
28163e770bf7SBruno Larsen (billionai)     uint32_t mmucfg = 0;
28173e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
28183e770bf7SBruno Larsen (billionai)     int i;
28193e770bf7SBruno Larsen (billionai) #endif
28203e770bf7SBruno Larsen (billionai) 
28213e770bf7SBruno Larsen (billionai)     /*
28223e770bf7SBruno Larsen (billionai)      * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
28233e770bf7SBruno Larsen (billionai)      *     complain when accessing them.
28243e770bf7SBruno Larsen (billionai)      * register_BookE_sprs(env, 0x0000000F0000FD7FULL);
28253e770bf7SBruno Larsen (billionai)      */
28263e770bf7SBruno Larsen (billionai)     switch (version) {
28273e770bf7SBruno Larsen (billionai)     case fsl_e500v1:
28283e770bf7SBruno Larsen (billionai)     case fsl_e500v2:
28293e770bf7SBruno Larsen (billionai)     default:
28303e770bf7SBruno Larsen (billionai)         ivor_mask = 0x0000000F0000FFFFULL;
28313e770bf7SBruno Larsen (billionai)         break;
28323e770bf7SBruno Larsen (billionai)     case fsl_e500mc:
28333e770bf7SBruno Larsen (billionai)     case fsl_e5500:
28343e770bf7SBruno Larsen (billionai)         ivor_mask = 0x000003FE0000FFFFULL;
28353e770bf7SBruno Larsen (billionai)         break;
28363e770bf7SBruno Larsen (billionai)     case fsl_e6500:
28373e770bf7SBruno Larsen (billionai)         ivor_mask = 0x000003FF0000FFFFULL;
28383e770bf7SBruno Larsen (billionai)         break;
28393e770bf7SBruno Larsen (billionai)     }
28403e770bf7SBruno Larsen (billionai)     register_BookE_sprs(env, ivor_mask);
28412a48d83dSFabiano Rosas 
28422a48d83dSFabiano Rosas     spr_register(env, SPR_USPRG3, "USPRG3",
28432a48d83dSFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
28442a48d83dSFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
28452a48d83dSFabiano Rosas                  0x00000000);
28462a48d83dSFabiano Rosas 
28473e770bf7SBruno Larsen (billionai)     /* Processor identification */
28483e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_PIR, "PIR",
28493e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
28503e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_pir,
28513e770bf7SBruno Larsen (billionai)                  0x00000000);
2852acf629ebSFabiano Rosas 
28533e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
28543e770bf7SBruno Larsen (billionai)                  &spr_read_spefscr, &spr_write_spefscr,
28553e770bf7SBruno Larsen (billionai)                  &spr_read_spefscr, &spr_write_spefscr,
28563e770bf7SBruno Larsen (billionai)                  0x00000000);
28573e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
28583e770bf7SBruno Larsen (billionai)     /* Memory management */
28593e770bf7SBruno Larsen (billionai)     env->nb_pids = 3;
28603e770bf7SBruno Larsen (billionai)     env->nb_ways = 2;
28613e770bf7SBruno Larsen (billionai)     switch (version) {
28623e770bf7SBruno Larsen (billionai)     case fsl_e500v1:
28633e770bf7SBruno Larsen (billionai)         tlbncfg[0] = register_tlbncfg(2, 1, 1, 0, 256);
28643e770bf7SBruno Larsen (billionai)         tlbncfg[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
28653e770bf7SBruno Larsen (billionai)         break;
28663e770bf7SBruno Larsen (billionai)     case fsl_e500v2:
28673e770bf7SBruno Larsen (billionai)         tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
28683e770bf7SBruno Larsen (billionai)         tlbncfg[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
28693e770bf7SBruno Larsen (billionai)         break;
28703e770bf7SBruno Larsen (billionai)     case fsl_e500mc:
28713e770bf7SBruno Larsen (billionai)     case fsl_e5500:
28723e770bf7SBruno Larsen (billionai)         tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
28733e770bf7SBruno Larsen (billionai)         tlbncfg[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
28743e770bf7SBruno Larsen (billionai)         break;
28753e770bf7SBruno Larsen (billionai)     case fsl_e6500:
28763e770bf7SBruno Larsen (billionai)         mmucfg = 0x6510B45;
28773e770bf7SBruno Larsen (billionai)         env->nb_pids = 1;
28783e770bf7SBruno Larsen (billionai)         tlbncfg[0] = 0x08052400;
28793e770bf7SBruno Larsen (billionai)         tlbncfg[1] = 0x40028040;
28803e770bf7SBruno Larsen (billionai)         break;
28813e770bf7SBruno Larsen (billionai)     default:
28823e770bf7SBruno Larsen (billionai)         cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
28833e770bf7SBruno Larsen (billionai)                   env->spr[SPR_PVR]);
28843e770bf7SBruno Larsen (billionai)     }
28853e770bf7SBruno Larsen (billionai) #endif
28863e770bf7SBruno Larsen (billionai)     /* Cache sizes */
28873e770bf7SBruno Larsen (billionai)     switch (version) {
28883e770bf7SBruno Larsen (billionai)     case fsl_e500v1:
28893e770bf7SBruno Larsen (billionai)     case fsl_e500v2:
28903e770bf7SBruno Larsen (billionai)         env->dcache_line_size = 32;
28913e770bf7SBruno Larsen (billionai)         env->icache_line_size = 32;
28923e770bf7SBruno Larsen (billionai)         break;
28933e770bf7SBruno Larsen (billionai)     case fsl_e500mc:
28943e770bf7SBruno Larsen (billionai)     case fsl_e5500:
28953e770bf7SBruno Larsen (billionai)         env->dcache_line_size = 64;
28963e770bf7SBruno Larsen (billionai)         env->icache_line_size = 64;
28973e770bf7SBruno Larsen (billionai)         l1cfg0 |= 0x1000000; /* 64 byte cache block size */
28983e770bf7SBruno Larsen (billionai)         l1cfg1 |= 0x1000000; /* 64 byte cache block size */
28993e770bf7SBruno Larsen (billionai)         break;
29003e770bf7SBruno Larsen (billionai)     case fsl_e6500:
29013e770bf7SBruno Larsen (billionai)         env->dcache_line_size = 32;
29023e770bf7SBruno Larsen (billionai)         env->icache_line_size = 32;
29033e770bf7SBruno Larsen (billionai)         l1cfg0 |= 0x0F83820;
29043e770bf7SBruno Larsen (billionai)         l1cfg1 |= 0x0B83820;
29053e770bf7SBruno Larsen (billionai)         break;
29063e770bf7SBruno Larsen (billionai)     default:
29073e770bf7SBruno Larsen (billionai)         cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
29083e770bf7SBruno Larsen (billionai)                   env->spr[SPR_PVR]);
29093e770bf7SBruno Larsen (billionai)     }
29103e770bf7SBruno Larsen (billionai)     register_BookE206_sprs(env, 0x000000DF, tlbncfg, mmucfg);
29114ffb8c5eSFabiano Rosas     register_usprgh_sprs(env);
2912acf629ebSFabiano Rosas 
29133e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID0, "HID0",
29143e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29153e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29163e770bf7SBruno Larsen (billionai)                  0x00000000);
2917acf629ebSFabiano Rosas 
29183e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID1, "HID1",
29193e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29203e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29213e770bf7SBruno Larsen (billionai)                  0x00000000);
2922acf629ebSFabiano Rosas 
29233e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
29243e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29253e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29263e770bf7SBruno Larsen (billionai)                  0x00000000);
2927acf629ebSFabiano Rosas 
29283e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
29293e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29303e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29313e770bf7SBruno Larsen (billionai)                  0x00000000);
2932acf629ebSFabiano Rosas 
29333e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_MCAR, "MCAR",
29343e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29353e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29363e770bf7SBruno Larsen (billionai)                  0x00000000);
2937acf629ebSFabiano Rosas 
29383e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSR, "MCSR",
29393e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29403e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29413e770bf7SBruno Larsen (billionai)                  0x00000000);
2942acf629ebSFabiano Rosas 
29433e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
29443e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29453e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29463e770bf7SBruno Larsen (billionai)                  0x00000000);
2947acf629ebSFabiano Rosas 
29483e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
29493e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29503e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29513e770bf7SBruno Larsen (billionai)                  0x00000000);
2952acf629ebSFabiano Rosas 
29533e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
29543e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
29553e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
29563e770bf7SBruno Larsen (billionai)                  l1cfg0);
29573e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_L1CFG1, "L1CFG1",
29583e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
29593e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
29603e770bf7SBruno Larsen (billionai)                  l1cfg1);
29613e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
29623e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29633e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_e500_l1csr0,
29643e770bf7SBruno Larsen (billionai)                  0x00000000);
29653e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
29663e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29673e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_e500_l1csr1,
29683e770bf7SBruno Larsen (billionai)                  0x00000000);
29693e770bf7SBruno Larsen (billionai)     if (version != fsl_e500v1 && version != fsl_e500v2) {
29703e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_Exxx_L2CSR0, "L2CSR0",
29713e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
29723e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_e500_l2csr0,
29733e770bf7SBruno Larsen (billionai)                      0x00000000);
29743e770bf7SBruno Larsen (billionai)     }
29753e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
29763e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29773e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29783e770bf7SBruno Larsen (billionai)                  0x00000000);
29793e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
29803e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29813e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
29823e770bf7SBruno Larsen (billionai)                  0x00000000);
29833e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MMUCSR0, "MMUCSR0",
29843e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29853e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_booke206_mmucsr0,
29863e770bf7SBruno Larsen (billionai)                  0x00000000);
29873e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BOOKE_EPR, "EPR",
29883e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
29893e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
29903e770bf7SBruno Larsen (billionai)                  0x00000000);
29913e770bf7SBruno Larsen (billionai)     /* XXX better abstract into Emb.xxx features */
29923e770bf7SBruno Larsen (billionai)     if ((version == fsl_e5500) || (version == fsl_e6500)) {
29933e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_EPCR, "EPCR",
29943e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
29953e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
29963e770bf7SBruno Larsen (billionai)                      0x00000000);
29973e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
29983e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
29993e770bf7SBruno Larsen (billionai)                      &spr_read_mas73, &spr_write_mas73,
30003e770bf7SBruno Larsen (billionai)                      0x00000000);
30013e770bf7SBruno Larsen (billionai)         ivpr_mask = (target_ulong)~0xFFFFULL;
30023e770bf7SBruno Larsen (billionai)     }
30033e770bf7SBruno Larsen (billionai) 
30043e770bf7SBruno Larsen (billionai)     if (version == fsl_e6500) {
30053e770bf7SBruno Larsen (billionai)         /* Thread identification */
30063e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_TIR, "TIR",
30073e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
30083e770bf7SBruno Larsen (billionai)                      &spr_read_generic, SPR_NOACCESS,
30093e770bf7SBruno Larsen (billionai)                      0x00000000);
30103e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_TLB0PS, "TLB0PS",
30113e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
30123e770bf7SBruno Larsen (billionai)                      &spr_read_generic, SPR_NOACCESS,
30133e770bf7SBruno Larsen (billionai)                      0x00000004);
30143e770bf7SBruno Larsen (billionai)         spr_register(env, SPR_BOOKE_TLB1PS, "TLB1PS",
30153e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
30163e770bf7SBruno Larsen (billionai)                      &spr_read_generic, SPR_NOACCESS,
30173e770bf7SBruno Larsen (billionai)                      0x7FFFFFFC);
30183e770bf7SBruno Larsen (billionai)     }
30193e770bf7SBruno Larsen (billionai) 
30203e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
30213e770bf7SBruno Larsen (billionai)     env->nb_tlb = 0;
30223e770bf7SBruno Larsen (billionai)     env->tlb_type = TLB_MAS;
30233e770bf7SBruno Larsen (billionai)     for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
30243e770bf7SBruno Larsen (billionai)         env->nb_tlb += booke206_tlb_size(env, i);
30253e770bf7SBruno Larsen (billionai)     }
30263e770bf7SBruno Larsen (billionai) #endif
30273e770bf7SBruno Larsen (billionai) 
30283e770bf7SBruno Larsen (billionai)     init_excp_e200(env, ivpr_mask);
30293e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
30303e770bf7SBruno Larsen (billionai)     ppce500_irq_init(env_archcpu(env));
30313e770bf7SBruno Larsen (billionai) }
30323e770bf7SBruno Larsen (billionai) 
init_proc_e500v1(CPUPPCState * env)30333e770bf7SBruno Larsen (billionai) static void init_proc_e500v1(CPUPPCState *env)
30343e770bf7SBruno Larsen (billionai) {
30353e770bf7SBruno Larsen (billionai)     init_proc_e500(env, fsl_e500v1);
30363e770bf7SBruno Larsen (billionai) }
30373e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(e500v1)30383e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
30393e770bf7SBruno Larsen (billionai) {
30403e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
30413e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
30423e770bf7SBruno Larsen (billionai) 
30433e770bf7SBruno Larsen (billionai)     dc->desc = "e500v1 core";
30443e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_e500v1;
30453e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
304645693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
30473e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
30483e770bf7SBruno Larsen (billionai)                        PPC_SPE | PPC_SPE_SINGLE |
30493e770bf7SBruno Larsen (billionai)                        PPC_WRTEE | PPC_RFDI |
30503e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
30513e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
30523e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
30533e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_BOOKE206;
30543e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_UCLE) |
30553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SPE) |
30563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
30573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
30583e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
30593e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
30603e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
30613e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
30623e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
30633e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
30643e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
30653e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
30663e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
30673e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
30683e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE206;
30693e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
30703e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
30713e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_860;
30723e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
30733e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
30743e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
30753e770bf7SBruno Larsen (billionai) }
30763e770bf7SBruno Larsen (billionai) 
init_proc_e500v2(CPUPPCState * env)30773e770bf7SBruno Larsen (billionai) static void init_proc_e500v2(CPUPPCState *env)
30783e770bf7SBruno Larsen (billionai) {
30793e770bf7SBruno Larsen (billionai)     init_proc_e500(env, fsl_e500v2);
30803e770bf7SBruno Larsen (billionai) }
30813e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(e500v2)30823e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
30833e770bf7SBruno Larsen (billionai) {
30843e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
30853e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
30863e770bf7SBruno Larsen (billionai) 
30873e770bf7SBruno Larsen (billionai)     dc->desc = "e500v2 core";
30883e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_e500v2;
30893e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
309045693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
30913e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
30923e770bf7SBruno Larsen (billionai)                        PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
30933e770bf7SBruno Larsen (billionai)                        PPC_WRTEE | PPC_RFDI |
30943e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
30953e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
30963e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
30973e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_BOOKE206;
30983e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_UCLE) |
30993e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SPE) |
31003e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
31013e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
31023e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
31033e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
31043e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
31053e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
31063e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
31073e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DWE) |
31083e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
31093e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
31103e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
31113e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR);
31123e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE206;
31133e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
31143e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
31153e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_860;
31163e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
31173e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
31183e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
31193e770bf7SBruno Larsen (billionai) }
31203e770bf7SBruno Larsen (billionai) 
init_proc_e500mc(CPUPPCState * env)31213e770bf7SBruno Larsen (billionai) static void init_proc_e500mc(CPUPPCState *env)
31223e770bf7SBruno Larsen (billionai) {
31233e770bf7SBruno Larsen (billionai)     init_proc_e500(env, fsl_e500mc);
31243e770bf7SBruno Larsen (billionai) }
31253e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(e500mc)31263e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
31273e770bf7SBruno Larsen (billionai) {
31283e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
31293e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
31303e770bf7SBruno Larsen (billionai) 
31313e770bf7SBruno Larsen (billionai)     dc->desc = "e500mc core";
31323e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_e500mc;
31333e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_none;
313445693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
31353e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
31363e770bf7SBruno Larsen (billionai)                        PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
31373e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
31383e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
31393e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FRES |
31403e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
31413e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX | PPC_WAIT |
31423e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
31433e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
31443e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_GS) |
31453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_UCLE) |
31463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
31473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
31483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
31493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
31503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
31513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
31523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
31533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
31543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
31553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
31563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PX) |
31573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI);
31583e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE206;
31593e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
31603e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
31613e770bf7SBruno Larsen (billionai)     /* FIXME: figure out the correct flag for e500mc */
31623e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_e500;
31633e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
31643e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
31653e770bf7SBruno Larsen (billionai) }
31663e770bf7SBruno Larsen (billionai) 
31673e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
init_proc_e5500(CPUPPCState * env)31683e770bf7SBruno Larsen (billionai) static void init_proc_e5500(CPUPPCState *env)
31693e770bf7SBruno Larsen (billionai) {
31703e770bf7SBruno Larsen (billionai)     init_proc_e500(env, fsl_e5500);
31713e770bf7SBruno Larsen (billionai) }
31723e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(e5500)31733e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
31743e770bf7SBruno Larsen (billionai) {
31753e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
31763e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
31773e770bf7SBruno Larsen (billionai) 
31783e770bf7SBruno Larsen (billionai)     dc->desc = "e5500 core";
31793e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_e5500;
31803e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_none;
318145693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
31823e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
31833e770bf7SBruno Larsen (billionai)                        PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
31843e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
31853e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
31863e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FRES |
31873e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
31883e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX | PPC_WAIT |
31893e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
31903e770bf7SBruno Larsen (billionai)                        PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
31913e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
31923e770bf7SBruno Larsen (billionai)                         PPC2_FP_CVT_S64;
31933e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_CM) |
31943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_GS) |
31953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_UCLE) |
31963e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
31973e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
31983e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
31993e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
32003e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
32013e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
32023e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
32033e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
32043e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
32053e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
32063e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PX) |
32073e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI);
32083e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE206;
32093e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
32103e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
32113e770bf7SBruno Larsen (billionai)     /* FIXME: figure out the correct flag for e5500 */
32123e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_e500;
32133e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
32143e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
32153e770bf7SBruno Larsen (billionai) }
32163e770bf7SBruno Larsen (billionai) 
init_proc_e6500(CPUPPCState * env)32173e770bf7SBruno Larsen (billionai) static void init_proc_e6500(CPUPPCState *env)
32183e770bf7SBruno Larsen (billionai) {
32193e770bf7SBruno Larsen (billionai)     init_proc_e500(env, fsl_e6500);
32203e770bf7SBruno Larsen (billionai) }
32213e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(e6500)32223e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e6500)(ObjectClass *oc, void *data)
32233e770bf7SBruno Larsen (billionai) {
32243e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
32253e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
32263e770bf7SBruno Larsen (billionai) 
32273e770bf7SBruno Larsen (billionai)     dc->desc = "e6500 core";
32283e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_e6500;
32293e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_none;
323045693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
32313e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
32323e770bf7SBruno Larsen (billionai)                        PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
32333e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
32343e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
32353e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FRES |
32363e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
32373e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX | PPC_WAIT |
32383e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
32393e770bf7SBruno Larsen (billionai)                        PPC_64B | PPC_POPCNTB | PPC_POPCNTWD | PPC_ALTIVEC;
32403e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
32413e770bf7SBruno Larsen (billionai)                         PPC2_FP_CVT_S64 | PPC2_ATOMIC_ISA206;
32423e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_CM) |
32433e770bf7SBruno Larsen (billionai)                     (1ull << MSR_GS) |
32443e770bf7SBruno Larsen (billionai)                     (1ull << MSR_UCLE) |
32453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_CE) |
32463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
32473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
32483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
32493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
32503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
32513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
32523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
32533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IS) |
32543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DS) |
32553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PX) |
32563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
32573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VR);
32583e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_BOOKE206;
32593e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_BOOKE;
32603e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_BookE;
32613e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_e500;
32623e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
32633e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_VRE;
32643e770bf7SBruno Larsen (billionai) }
32653e770bf7SBruno Larsen (billionai) 
32663e770bf7SBruno Larsen (billionai) #endif
32673e770bf7SBruno Larsen (billionai) 
32683e770bf7SBruno Larsen (billionai) /* Non-embedded PowerPC                                                      */
init_proc_603(CPUPPCState * env)32693e770bf7SBruno Larsen (billionai) static void init_proc_603(CPUPPCState *env)
32703e770bf7SBruno Larsen (billionai) {
3271217781afSFabiano Rosas     register_non_embedded_sprs(env);
32723e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
32733e770bf7SBruno Larsen (billionai)     register_603_sprs(env);
3274acf629ebSFabiano Rosas 
32753e770bf7SBruno Larsen (billionai)     /* Memory management */
32763e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
32773e770bf7SBruno Larsen (billionai)     register_6xx_7xx_soft_tlb(env, 64, 2);
32783e770bf7SBruno Larsen (billionai)     init_excp_603(env);
32793e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
32803e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
32813e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
32823e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
32833e770bf7SBruno Larsen (billionai) }
32843e770bf7SBruno Larsen (billionai) 
32853e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
32863e770bf7SBruno Larsen (billionai) {
32873e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
32883e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
32893e770bf7SBruno Larsen (billionai) 
32903e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 603";
32913e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_603;
32923e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
329345693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
32943e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
32953e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
32963e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
32973e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
32983e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
32993e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
33003e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
33013e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
33023e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TGPR) |
33033e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
33043e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
33053e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
33063e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
33073e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
33083e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
33093e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
33103e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
33113e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
33123e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
33133e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
33143e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
33153e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
33163e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
33173e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
33189323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
33193e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
33203e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_603;
33213e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
33223e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
33233e770bf7SBruno Larsen (billionai) }
33243e770bf7SBruno Larsen (billionai) 
33253e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
33263e770bf7SBruno Larsen (billionai) {
33273e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
33283e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
33293e770bf7SBruno Larsen (billionai) 
33303e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 603e";
3331fd77f757SFabiano Rosas     pcc->init_proc = init_proc_603;
33323e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
333345693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
33343e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
33353e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
33363e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
33373e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
33383e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
33393e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
33403e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
33413e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
33423e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TGPR) |
33433e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
33443e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
33453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
33463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
33473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
33483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
33493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
33503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
33513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
33523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
33533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
33543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
33553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
33563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
33573e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
33589323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
33593e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
33603e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_ec603e;
33613e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
33623e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
33633e770bf7SBruno Larsen (billionai) }
33643e770bf7SBruno Larsen (billionai) 
init_proc_e300(CPUPPCState * env)33659f33f3d8SFabiano Rosas static void init_proc_e300(CPUPPCState *env)
33669f33f3d8SFabiano Rosas {
33679f33f3d8SFabiano Rosas     init_proc_603(env);
33689f33f3d8SFabiano Rosas     register_e300_sprs(env);
33699f33f3d8SFabiano Rosas }
33709f33f3d8SFabiano Rosas 
POWERPC_FAMILY(e300)33719f33f3d8SFabiano Rosas POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
33729f33f3d8SFabiano Rosas {
33739f33f3d8SFabiano Rosas     DeviceClass *dc = DEVICE_CLASS(oc);
33749f33f3d8SFabiano Rosas     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
33759f33f3d8SFabiano Rosas 
33769f33f3d8SFabiano Rosas     dc->desc = "e300 core";
33779f33f3d8SFabiano Rosas     pcc->init_proc = init_proc_e300;
33789f33f3d8SFabiano Rosas     pcc->check_pow = check_pow_hid0;
337945693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
33809f33f3d8SFabiano Rosas     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
33819f33f3d8SFabiano Rosas                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
33829f33f3d8SFabiano Rosas                        PPC_FLOAT_STFIWX |
33839f33f3d8SFabiano Rosas                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
33849f33f3d8SFabiano Rosas                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
33859f33f3d8SFabiano Rosas                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
33869f33f3d8SFabiano Rosas                        PPC_SEGMENT | PPC_EXTERN;
33879f33f3d8SFabiano Rosas     pcc->msr_mask = (1ull << MSR_POW) |
33889f33f3d8SFabiano Rosas                     (1ull << MSR_TGPR) |
33899f33f3d8SFabiano Rosas                     (1ull << MSR_ILE) |
33909f33f3d8SFabiano Rosas                     (1ull << MSR_EE) |
33919f33f3d8SFabiano Rosas                     (1ull << MSR_PR) |
33929f33f3d8SFabiano Rosas                     (1ull << MSR_FP) |
33939f33f3d8SFabiano Rosas                     (1ull << MSR_ME) |
33949f33f3d8SFabiano Rosas                     (1ull << MSR_FE0) |
33959f33f3d8SFabiano Rosas                     (1ull << MSR_SE) |
33969f33f3d8SFabiano Rosas                     (1ull << MSR_DE) |
33979f33f3d8SFabiano Rosas                     (1ull << MSR_FE1) |
33989f33f3d8SFabiano Rosas                     (1ull << MSR_AL) |
33999f33f3d8SFabiano Rosas                     (1ull << MSR_EP) |
34009f33f3d8SFabiano Rosas                     (1ull << MSR_IR) |
34019f33f3d8SFabiano Rosas                     (1ull << MSR_DR) |
34029f33f3d8SFabiano Rosas                     (1ull << MSR_RI) |
34039f33f3d8SFabiano Rosas                     (1ull << MSR_LE);
34049f33f3d8SFabiano Rosas     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
34059f33f3d8SFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
34069f33f3d8SFabiano Rosas     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
34079f33f3d8SFabiano Rosas     pcc->bfd_mach = bfd_mach_ppc_603;
34089f33f3d8SFabiano Rosas     pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
34099f33f3d8SFabiano Rosas                  POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
34109f33f3d8SFabiano Rosas }
34119f33f3d8SFabiano Rosas 
init_proc_604(CPUPPCState * env)34123e770bf7SBruno Larsen (billionai) static void init_proc_604(CPUPPCState *env)
34133e770bf7SBruno Larsen (billionai) {
3414217781afSFabiano Rosas     register_non_embedded_sprs(env);
34153e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
34163e770bf7SBruno Larsen (billionai)     register_604_sprs(env);
341720f6fb99SFabiano Rosas 
34183e770bf7SBruno Larsen (billionai)     /* Memory management */
34193e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
34203e770bf7SBruno Larsen (billionai)     init_excp_604(env);
34213e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
34223e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
34233e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
34243e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
34253e770bf7SBruno Larsen (billionai) }
34263e770bf7SBruno Larsen (billionai) 
34273e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
34283e770bf7SBruno Larsen (billionai) {
34293e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
34303e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
34313e770bf7SBruno Larsen (billionai) 
34323e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 604";
34333e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_604;
34343e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
343545693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
34363e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
34373e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
34383e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
34393e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
34403e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
34413e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
34423e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
34433e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
34443e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
34453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
34463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
34473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
34483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
34493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
34503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
34513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
34523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
34533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
34543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
34553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
34563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
34573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
34583e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
34593e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
34609323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
34613e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
34623e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_604;
34633e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
34643e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
34653e770bf7SBruno Larsen (billionai) }
34663e770bf7SBruno Larsen (billionai) 
init_proc_604E(CPUPPCState * env)34673e770bf7SBruno Larsen (billionai) static void init_proc_604E(CPUPPCState *env)
34683e770bf7SBruno Larsen (billionai) {
34690df0ca16SFabiano Rosas     init_proc_604(env);
34703b18ec76SFabiano Rosas     register_604e_sprs(env);
34713e770bf7SBruno Larsen (billionai) }
34723e770bf7SBruno Larsen (billionai) 
34733e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
34743e770bf7SBruno Larsen (billionai) {
34753e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
34763e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
34773e770bf7SBruno Larsen (billionai) 
34783e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 604E";
34793e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_604E;
34803e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
348145693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
34823e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
34833e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
34843e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
34853e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
34863e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
34873e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
34883e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
34893e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
34903e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
34913e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
34923e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
34933e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
34943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
34953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
34963e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
34973e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
34983e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
34993e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
35003e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
35013e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
35023e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
35033e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
35043e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
35053e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
35069323650fSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_6xx;
35073e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
35083e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_604;
35093e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
35103e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
35113e770bf7SBruno Larsen (billionai) }
35123e770bf7SBruno Larsen (billionai) 
init_proc_740(CPUPPCState * env)35133e770bf7SBruno Larsen (billionai) static void init_proc_740(CPUPPCState *env)
35143e770bf7SBruno Larsen (billionai) {
3515217781afSFabiano Rosas     register_non_embedded_sprs(env);
35163e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
35173e770bf7SBruno Larsen (billionai)     register_7xx_sprs(env);
35183e770bf7SBruno Larsen (billionai)     /* Thermal management */
35193e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
3520acf629ebSFabiano Rosas 
35213e770bf7SBruno Larsen (billionai)     /* Memory management */
35223e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
35233e770bf7SBruno Larsen (billionai)     init_excp_7x0(env);
35243e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
35253e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
35263e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
35273e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
35283e770bf7SBruno Larsen (billionai) }
35293e770bf7SBruno Larsen (billionai) 
35303e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
35313e770bf7SBruno Larsen (billionai) {
35323e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
35333e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
35343e770bf7SBruno Larsen (billionai) 
35353e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 740";
35363e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_740;
35373e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
353845693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
35393e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
35403e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
35413e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
35423e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
35433e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
35443e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
35453e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
35463e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
35473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
35483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
35493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
35503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
35513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
35523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
35533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
35543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
35553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
35563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
35573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
35583e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
35593e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
35603e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
35613e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
35623e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
3563fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
35643e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
35653e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
35663e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
35673e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
35683e770bf7SBruno Larsen (billionai) }
35693e770bf7SBruno Larsen (billionai) 
init_proc_750(CPUPPCState * env)35703e770bf7SBruno Larsen (billionai) static void init_proc_750(CPUPPCState *env)
35713e770bf7SBruno Larsen (billionai) {
3572217781afSFabiano Rosas     register_non_embedded_sprs(env);
35733e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
35743e770bf7SBruno Larsen (billionai)     register_7xx_sprs(env);
3575acf629ebSFabiano Rosas 
35763e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L2CR, "L2CR",
35773e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
35783e770bf7SBruno Larsen (billionai)                  &spr_read_generic, spr_access_nop,
35793e770bf7SBruno Larsen (billionai)                  0x00000000);
35803e770bf7SBruno Larsen (billionai)     /* Thermal management */
35813e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
3582acf629ebSFabiano Rosas 
35833e770bf7SBruno Larsen (billionai)     /* Memory management */
35843e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
35853e770bf7SBruno Larsen (billionai)     /*
35863e770bf7SBruno Larsen (billionai)      * XXX: high BATs are also present but are known to be bugged on
35873e770bf7SBruno Larsen (billionai)      *      die version 1.x
35883e770bf7SBruno Larsen (billionai)      */
35893e770bf7SBruno Larsen (billionai)     init_excp_7x0(env);
35903e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
35913e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
35923e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
35933e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
35943e770bf7SBruno Larsen (billionai) }
35953e770bf7SBruno Larsen (billionai) 
35963e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
35973e770bf7SBruno Larsen (billionai) {
35983e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
35993e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
36003e770bf7SBruno Larsen (billionai) 
36013e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 750";
36023e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_750;
36033e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
360445693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
36053e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
36063e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
36073e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
36083e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
36093e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
36103e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
36113e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
36123e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
36133e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
36143e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
36153e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
36163e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
36173e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
36183e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
36193e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
36203e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
36213e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
36223e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
36233e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
36243e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
36253e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
36263e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
36273e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
36283e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
3629fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
36303e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
36313e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
36323e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
36333e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
36343e770bf7SBruno Larsen (billionai) }
36353e770bf7SBruno Larsen (billionai) 
init_proc_750cl(CPUPPCState * env)36363e770bf7SBruno Larsen (billionai) static void init_proc_750cl(CPUPPCState *env)
36373e770bf7SBruno Larsen (billionai) {
3638217781afSFabiano Rosas     register_non_embedded_sprs(env);
36393e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
36403e770bf7SBruno Larsen (billionai)     register_7xx_sprs(env);
3641acf629ebSFabiano Rosas 
36423e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L2CR, "L2CR",
36433e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36443e770bf7SBruno Larsen (billionai)                  &spr_read_generic, spr_access_nop,
36453e770bf7SBruno Larsen (billionai)                  0x00000000);
36463e770bf7SBruno Larsen (billionai)     /* Thermal management */
36473e770bf7SBruno Larsen (billionai)     /* Those registers are fake on 750CL */
36483e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_THRM1, "THRM1",
36493e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36503e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36513e770bf7SBruno Larsen (billionai)                  0x00000000);
36523e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_THRM2, "THRM2",
36533e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36543e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36553e770bf7SBruno Larsen (billionai)                  0x00000000);
36563e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_THRM3, "THRM3",
36573e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36583e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36593e770bf7SBruno Larsen (billionai)                  0x00000000);
3660acf629ebSFabiano Rosas 
36613e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_TDCL, "TDCL",
36623e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36633e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36643e770bf7SBruno Larsen (billionai)                  0x00000000);
36653e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_TDCH, "TDCH",
36663e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36673e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36683e770bf7SBruno Larsen (billionai)                  0x00000000);
36693e770bf7SBruno Larsen (billionai)     /* DMA */
36703e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_WPAR, "WPAR",
36713e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36723e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36733e770bf7SBruno Larsen (billionai)                  0x00000000);
36743e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_DMAL, "DMAL",
36753e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36763e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36773e770bf7SBruno Larsen (billionai)                  0x00000000);
36783e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_DMAU, "DMAU",
36793e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36803e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36813e770bf7SBruno Larsen (billionai)                  0x00000000);
36823e770bf7SBruno Larsen (billionai)     /* Hardware implementation registers */
36833e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750CL_HID2, "HID2",
36843e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36853e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36863e770bf7SBruno Larsen (billionai)                  0x00000000);
3687acf629ebSFabiano Rosas 
36883e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750CL_HID4, "HID4",
36893e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36903e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36913e770bf7SBruno Larsen (billionai)                  0x00000000);
36923e770bf7SBruno Larsen (billionai)     /* Quantization registers */
36933e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR0, "GQR0",
36943e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
36953e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
36963e770bf7SBruno Larsen (billionai)                  0x00000000);
3697acf629ebSFabiano Rosas 
36983e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR1, "GQR1",
36993e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
37003e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
37013e770bf7SBruno Larsen (billionai)                  0x00000000);
3702acf629ebSFabiano Rosas 
37033e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR2, "GQR2",
37043e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
37053e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
37063e770bf7SBruno Larsen (billionai)                  0x00000000);
3707acf629ebSFabiano Rosas 
37083e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR3, "GQR3",
37093e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
37103e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
37113e770bf7SBruno Larsen (billionai)                  0x00000000);
3712acf629ebSFabiano Rosas 
37133e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR4, "GQR4",
37143e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
37153e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
37163e770bf7SBruno Larsen (billionai)                  0x00000000);
3717acf629ebSFabiano Rosas 
37183e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR5, "GQR5",
37193e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
37203e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
37213e770bf7SBruno Larsen (billionai)                  0x00000000);
3722acf629ebSFabiano Rosas 
37233e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR6, "GQR6",
37243e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
37253e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
37263e770bf7SBruno Larsen (billionai)                  0x00000000);
3727acf629ebSFabiano Rosas 
37283e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_GQR7, "GQR7",
37293e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
37303e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
37313e770bf7SBruno Larsen (billionai)                  0x00000000);
37323e770bf7SBruno Larsen (billionai)     /* Memory management */
37333e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
37343e770bf7SBruno Larsen (billionai)     /* PowerPC 750cl has 8 DBATs and 8 IBATs */
37353e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
37363e770bf7SBruno Larsen (billionai)     init_excp_750cl(env);
37373e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
37383e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
37393e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
37403e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
37413e770bf7SBruno Larsen (billionai) }
37423e770bf7SBruno Larsen (billionai) 
37433e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
37443e770bf7SBruno Larsen (billionai) {
37453e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
37463e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
37473e770bf7SBruno Larsen (billionai) 
37483e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 750 CL";
37493e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_750cl;
37503e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
375145693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
37523e770bf7SBruno Larsen (billionai)     /*
37533e770bf7SBruno Larsen (billionai)      * XXX: not implemented:
37543e770bf7SBruno Larsen (billionai)      * cache lock instructions:
37553e770bf7SBruno Larsen (billionai)      * dcbz_l
37563e770bf7SBruno Larsen (billionai)      * floating point paired instructions
37573e770bf7SBruno Larsen (billionai)      * psq_lux
37583e770bf7SBruno Larsen (billionai)      * psq_lx
37593e770bf7SBruno Larsen (billionai)      * psq_stux
37603e770bf7SBruno Larsen (billionai)      * psq_stx
37613e770bf7SBruno Larsen (billionai)      * ps_abs
37623e770bf7SBruno Larsen (billionai)      * ps_add
37633e770bf7SBruno Larsen (billionai)      * ps_cmpo0
37643e770bf7SBruno Larsen (billionai)      * ps_cmpo1
37653e770bf7SBruno Larsen (billionai)      * ps_cmpu0
37663e770bf7SBruno Larsen (billionai)      * ps_cmpu1
37673e770bf7SBruno Larsen (billionai)      * ps_div
37683e770bf7SBruno Larsen (billionai)      * ps_madd
37693e770bf7SBruno Larsen (billionai)      * ps_madds0
37703e770bf7SBruno Larsen (billionai)      * ps_madds1
37713e770bf7SBruno Larsen (billionai)      * ps_merge00
37723e770bf7SBruno Larsen (billionai)      * ps_merge01
37733e770bf7SBruno Larsen (billionai)      * ps_merge10
37743e770bf7SBruno Larsen (billionai)      * ps_merge11
37753e770bf7SBruno Larsen (billionai)      * ps_mr
37763e770bf7SBruno Larsen (billionai)      * ps_msub
37773e770bf7SBruno Larsen (billionai)      * ps_mul
37783e770bf7SBruno Larsen (billionai)      * ps_muls0
37793e770bf7SBruno Larsen (billionai)      * ps_muls1
37803e770bf7SBruno Larsen (billionai)      * ps_nabs
37813e770bf7SBruno Larsen (billionai)      * ps_neg
37823e770bf7SBruno Larsen (billionai)      * ps_nmadd
37833e770bf7SBruno Larsen (billionai)      * ps_nmsub
37843e770bf7SBruno Larsen (billionai)      * ps_res
37853e770bf7SBruno Larsen (billionai)      * ps_rsqrte
37863e770bf7SBruno Larsen (billionai)      * ps_sel
37873e770bf7SBruno Larsen (billionai)      * ps_sub
37883e770bf7SBruno Larsen (billionai)      * ps_sum0
37893e770bf7SBruno Larsen (billionai)      * ps_sum1
37903e770bf7SBruno Larsen (billionai)      */
37913e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
37923e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
37933e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
37943e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
37953e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
37963e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
37973e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
37983e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
37993e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
38003e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
38013e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
38023e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
38033e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
38043e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
38053e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
38063e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
38073e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
38083e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
38093e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
38103e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
38113e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
38123e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
38133e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
38143e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
3815fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
38163e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
38173e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
38183e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
38193e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
38203e770bf7SBruno Larsen (billionai) }
38213e770bf7SBruno Larsen (billionai) 
init_proc_750cx(CPUPPCState * env)38223e770bf7SBruno Larsen (billionai) static void init_proc_750cx(CPUPPCState *env)
38233e770bf7SBruno Larsen (billionai) {
3824217781afSFabiano Rosas     register_non_embedded_sprs(env);
38253e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
38263e770bf7SBruno Larsen (billionai)     register_7xx_sprs(env);
3827acf629ebSFabiano Rosas 
38283e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L2CR, "L2CR",
38293e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
38303e770bf7SBruno Larsen (billionai)                  &spr_read_generic, spr_access_nop,
38313e770bf7SBruno Larsen (billionai)                  0x00000000);
38323e770bf7SBruno Larsen (billionai)     /* Thermal management */
38333e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
3834acf629ebSFabiano Rosas 
38353e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SDA, "SDA",
38363e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
38373e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
38383e770bf7SBruno Larsen (billionai)                  0x00000000);
3839acf629ebSFabiano Rosas 
38403e770bf7SBruno Larsen (billionai)     /* Memory management */
38413e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
38423e770bf7SBruno Larsen (billionai)     /* PowerPC 750cx has 8 DBATs and 8 IBATs */
38433e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
38443e770bf7SBruno Larsen (billionai)     init_excp_750cx(env);
38453e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
38463e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
38473e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
38483e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
38493e770bf7SBruno Larsen (billionai) }
38503e770bf7SBruno Larsen (billionai) 
38513e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
38523e770bf7SBruno Larsen (billionai) {
38533e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
38543e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
38553e770bf7SBruno Larsen (billionai) 
38563e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 750CX";
38573e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_750cx;
38583e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
385945693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
38603e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
38613e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
38623e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
38633e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
38643e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
38653e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
38663e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
38673e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
38683e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
38693e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
38703e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
38713e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
38723e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
38733e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
38743e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
38753e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
38763e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
38773e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
38783e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
38793e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
38803e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
38813e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
38823e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
38833e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
3884fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
38853e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
38863e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
38873e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
38883e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
38893e770bf7SBruno Larsen (billionai) }
38903e770bf7SBruno Larsen (billionai) 
init_proc_750fx(CPUPPCState * env)38913e770bf7SBruno Larsen (billionai) static void init_proc_750fx(CPUPPCState *env)
38923e770bf7SBruno Larsen (billionai) {
3893217781afSFabiano Rosas     register_non_embedded_sprs(env);
38943e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
38953e770bf7SBruno Larsen (billionai)     register_7xx_sprs(env);
3896acf629ebSFabiano Rosas 
38973e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L2CR, "L2CR",
38983e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
38993e770bf7SBruno Larsen (billionai)                  &spr_read_generic, spr_access_nop,
39003e770bf7SBruno Larsen (billionai)                  0x00000000);
39013e770bf7SBruno Larsen (billionai)     /* Thermal management */
39023e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
3903acf629ebSFabiano Rosas 
39043e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_THRM4, "THRM4",
39053e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
39063e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
39073e770bf7SBruno Larsen (billionai)                  0x00000000);
39083e770bf7SBruno Larsen (billionai)     /* Hardware implementation registers */
39093e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750FX_HID2, "HID2",
39103e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
39113e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
39123e770bf7SBruno Larsen (billionai)                  0x00000000);
39133e770bf7SBruno Larsen (billionai)     /* Memory management */
39143e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
39153e770bf7SBruno Larsen (billionai)     /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
39163e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
39173e770bf7SBruno Larsen (billionai)     init_excp_7x0(env);
39183e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
39193e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
39203e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
39213e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
39223e770bf7SBruno Larsen (billionai) }
39233e770bf7SBruno Larsen (billionai) 
39243e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
39253e770bf7SBruno Larsen (billionai) {
39263e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
39273e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
39283e770bf7SBruno Larsen (billionai) 
39293e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 750FX";
39303e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_750fx;
39313e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
393245693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
39333e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
39343e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
39353e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
39363e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
39373e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
39383e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
39393e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
39403e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
39413e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
39423e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
39433e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
39443e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
39453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
39463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
39473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
39483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
39493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
39503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
39513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
39523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
39533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
39543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
39553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
39563e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
3957fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
39583e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
39593e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
39603e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
39613e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
39623e770bf7SBruno Larsen (billionai) }
39633e770bf7SBruno Larsen (billionai) 
init_proc_750gx(CPUPPCState * env)39643e770bf7SBruno Larsen (billionai) static void init_proc_750gx(CPUPPCState *env)
39653e770bf7SBruno Larsen (billionai) {
3966217781afSFabiano Rosas     register_non_embedded_sprs(env);
39673e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
39683e770bf7SBruno Larsen (billionai)     register_7xx_sprs(env);
3969acf629ebSFabiano Rosas 
39703e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L2CR, "L2CR",
39713e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
39723e770bf7SBruno Larsen (billionai)                  &spr_read_generic, spr_access_nop,
39733e770bf7SBruno Larsen (billionai)                  0x00000000);
39743e770bf7SBruno Larsen (billionai)     /* Thermal management */
39753e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
3976acf629ebSFabiano Rosas 
39773e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750_THRM4, "THRM4",
39783e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
39793e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
39803e770bf7SBruno Larsen (billionai)                  0x00000000);
39813e770bf7SBruno Larsen (billionai)     /* Hardware implementation registers */
39823e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_750FX_HID2, "HID2",
39833e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
39843e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
39853e770bf7SBruno Larsen (billionai)                  0x00000000);
39863e770bf7SBruno Larsen (billionai)     /* Memory management */
39873e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
39883e770bf7SBruno Larsen (billionai)     /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
39893e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
39903e770bf7SBruno Larsen (billionai)     init_excp_7x0(env);
39913e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
39923e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
39933e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
39943e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
39953e770bf7SBruno Larsen (billionai) }
39963e770bf7SBruno Larsen (billionai) 
39973e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
39983e770bf7SBruno Larsen (billionai) {
39993e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
40003e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
40013e770bf7SBruno Larsen (billionai) 
40023e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 750GX";
40033e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_750gx;
40043e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
400545693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
40063e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
40073e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
40083e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
40093e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
40103e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
40113e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
40123e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
40133e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
40143e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
40153e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
40163e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
40173e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
40183e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
40193e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
40203e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
40213e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
40223e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
40233e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
40243e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
40253e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
40263e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
40273e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
40283e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
40293e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
4030fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
40313e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
40323e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
40333e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
40343e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
40353e770bf7SBruno Larsen (billionai) }
40363e770bf7SBruno Larsen (billionai) 
init_proc_745(CPUPPCState * env)40373e770bf7SBruno Larsen (billionai) static void init_proc_745(CPUPPCState *env)
40383e770bf7SBruno Larsen (billionai) {
4039217781afSFabiano Rosas     register_non_embedded_sprs(env);
40403e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
40413e770bf7SBruno Larsen (billionai)     register_7xx_sprs(env);
4042a5d1120bSFabiano Rosas     register_745_sprs(env);
40433e770bf7SBruno Larsen (billionai)     /* Thermal management */
40443e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
4045acf629ebSFabiano Rosas 
40463e770bf7SBruno Larsen (billionai)     /* Memory management */
40473e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
40483e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
40493e770bf7SBruno Larsen (billionai)     register_6xx_7xx_soft_tlb(env, 64, 2);
40503e770bf7SBruno Larsen (billionai)     init_excp_7x5(env);
40513e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
40523e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
40533e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
40543e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
40553e770bf7SBruno Larsen (billionai) }
40563e770bf7SBruno Larsen (billionai) 
40573e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
40583e770bf7SBruno Larsen (billionai) {
40593e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
40603e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
40613e770bf7SBruno Larsen (billionai) 
40623e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 745";
40633e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_745;
40643e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
406545693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
40663e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
40673e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
40683e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
40693e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
40703e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
40713e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
40723e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
40733e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
40743e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
40753e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
40763e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
40773e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
40783e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
40793e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
40803e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
40813e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
40823e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
40833e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
40843e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
40853e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
40863e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
40873e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
40883e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
40893e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4090fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
40913e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
40923e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
40933e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
40943e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
40953e770bf7SBruno Larsen (billionai) }
40963e770bf7SBruno Larsen (billionai) 
init_proc_755(CPUPPCState * env)40973e770bf7SBruno Larsen (billionai) static void init_proc_755(CPUPPCState *env)
40983e770bf7SBruno Larsen (billionai) {
4099c1f21577SFabiano Rosas     init_proc_745(env);
410028930245SFabiano Rosas     register_755_sprs(env);
41013e770bf7SBruno Larsen (billionai) }
41023e770bf7SBruno Larsen (billionai) 
41033e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
41043e770bf7SBruno Larsen (billionai) {
41053e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
41063e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
41073e770bf7SBruno Larsen (billionai) 
41083e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 755";
41093e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_755;
41103e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
411145693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
41123e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
41133e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
41143e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
41153e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
41163e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
41173e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
41183e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN;
41193e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_POW) |
41203e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
41213e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
41223e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
41233e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
41243e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
41253e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
41263e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
41273e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
41283e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
41293e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
41303e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
41313e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
41323e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
41333e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
41343e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
41353e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4136fd7dc4bbSFabiano Rosas     pcc->excp_model = POWERPC_EXCP_7xx;
41373e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
41383e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_750;
41393e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
41403e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
41413e770bf7SBruno Larsen (billionai) }
41423e770bf7SBruno Larsen (billionai) 
init_proc_7400(CPUPPCState * env)41433e770bf7SBruno Larsen (billionai) static void init_proc_7400(CPUPPCState *env)
41443e770bf7SBruno Larsen (billionai) {
4145217781afSFabiano Rosas     register_non_embedded_sprs(env);
41463e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
41473e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
41483e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
4149acf629ebSFabiano Rosas 
41503e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_UBAMR, "UBAMR",
41513e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
41523e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
41533e770bf7SBruno Larsen (billionai)                  0x00000000);
4154acf629ebSFabiano Rosas 
41553e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSCR1, "MSSCR1",
41563e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
41573e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
41583e770bf7SBruno Larsen (billionai)                  0x00000000);
41593e770bf7SBruno Larsen (billionai)     /* Thermal management */
41603e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
41613e770bf7SBruno Larsen (billionai)     /* Memory management */
41623e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
41633e770bf7SBruno Larsen (billionai)     init_excp_7400(env);
41643e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
41653e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
41663e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
41673e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
41683e770bf7SBruno Larsen (billionai) }
41693e770bf7SBruno Larsen (billionai) 
41703e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
41713e770bf7SBruno Larsen (billionai) {
41723e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
41733e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
41743e770bf7SBruno Larsen (billionai) 
41753e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 7400 (aka G4)";
41763e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_7400;
41773e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
417845693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
41793e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
41803e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
41813e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
41823e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
41833e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
41843e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
41853e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
41863e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
41873e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIA |
41883e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
41893e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
41903e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
41913e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
41923e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
41933e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
41943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
41953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
41963e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
41973e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
41983e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
41993e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
42003e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
42013e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
42023e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
42033e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
42043e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
42053e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
42063e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
42073e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
42083e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
42093e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
42103e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
42113e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
42123e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
42133e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
42143e770bf7SBruno Larsen (billionai) }
42153e770bf7SBruno Larsen (billionai) 
init_proc_7410(CPUPPCState * env)42163e770bf7SBruno Larsen (billionai) static void init_proc_7410(CPUPPCState *env)
42173e770bf7SBruno Larsen (billionai) {
4218217781afSFabiano Rosas     register_non_embedded_sprs(env);
42193e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
42203e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
42213e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
4222acf629ebSFabiano Rosas 
42233e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_UBAMR, "UBAMR",
42243e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
42253e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
42263e770bf7SBruno Larsen (billionai)                  0x00000000);
42273e770bf7SBruno Larsen (billionai)     /* Thermal management */
42283e770bf7SBruno Larsen (billionai)     register_thrm_sprs(env);
42293e770bf7SBruno Larsen (billionai)     /* L2PMCR */
4230acf629ebSFabiano Rosas 
42313e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L2PMCR, "L2PMCR",
42323e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
42333e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
42343e770bf7SBruno Larsen (billionai)                  0x00000000);
42353e770bf7SBruno Larsen (billionai)     /* LDSTDB */
4236acf629ebSFabiano Rosas 
42373e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_LDSTDB, "LDSTDB",
42383e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
42393e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
42403e770bf7SBruno Larsen (billionai)                  0x00000000);
42413e770bf7SBruno Larsen (billionai)     /* Memory management */
42423e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
42433e770bf7SBruno Larsen (billionai)     init_excp_7400(env);
42443e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
42453e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
42463e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
42473e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
42483e770bf7SBruno Larsen (billionai) }
42493e770bf7SBruno Larsen (billionai) 
42503e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
42513e770bf7SBruno Larsen (billionai) {
42523e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
42533e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
42543e770bf7SBruno Larsen (billionai) 
42553e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 7410 (aka G4)";
42563e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_7410;
42573e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0;
425845693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
42593e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
42603e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
42613e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
42623e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
42633e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
42643e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
42653e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
42663e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
42673e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIA |
42683e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
42693e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
42703e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
42713e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
42723e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
42733e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
42743e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
42753e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
42763e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
42773e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
42783e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
42793e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
42803e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
42813e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
42823e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
42833e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
42843e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
42853e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
42863e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
42873e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
42883e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
42893e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
42903e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
42913e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
42923e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
42933e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
42943e770bf7SBruno Larsen (billionai) }
42953e770bf7SBruno Larsen (billionai) 
init_proc_7440(CPUPPCState * env)42963e770bf7SBruno Larsen (billionai) static void init_proc_7440(CPUPPCState *env)
42973e770bf7SBruno Larsen (billionai) {
4298217781afSFabiano Rosas     register_non_embedded_sprs(env);
42993e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
43003e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
43013e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
4302acf629ebSFabiano Rosas 
43033e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_UBAMR, "UBAMR",
43043e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
43053e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
43063e770bf7SBruno Larsen (billionai)                  0x00000000);
43073e770bf7SBruno Larsen (billionai)     /* LDSTCR */
43083e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_LDSTCR, "LDSTCR",
43093e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
43103e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
43113e770bf7SBruno Larsen (billionai)                  0x00000000);
43123e770bf7SBruno Larsen (billionai)     /* ICTRL */
43133e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_ICTRL, "ICTRL",
43143e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
43153e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
43163e770bf7SBruno Larsen (billionai)                  0x00000000);
43173e770bf7SBruno Larsen (billionai)     /* MSSSR0 */
43183e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSSR0, "MSSSR0",
43193e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
43203e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
43213e770bf7SBruno Larsen (billionai)                  0x00000000);
43223e770bf7SBruno Larsen (billionai)     /* PMC */
43233e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC5, "PMC5",
43243e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
43253e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
43263e770bf7SBruno Larsen (billionai)                  0x00000000);
4327acf629ebSFabiano Rosas 
43283e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC5, "UPMC5",
43293e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
43303e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
43313e770bf7SBruno Larsen (billionai)                  0x00000000);
4332acf629ebSFabiano Rosas 
43333e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC6, "PMC6",
43343e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
43353e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
43363e770bf7SBruno Larsen (billionai)                  0x00000000);
4337acf629ebSFabiano Rosas 
43383e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC6, "UPMC6",
43393e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
43403e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
43413e770bf7SBruno Larsen (billionai)                  0x00000000);
43423e770bf7SBruno Larsen (billionai)     /* Memory management */
43433e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
43443e770bf7SBruno Larsen (billionai)     init_excp_7450(env);
43453e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
43463e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
43473e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
43483e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
43493e770bf7SBruno Larsen (billionai) }
43503e770bf7SBruno Larsen (billionai) 
43513e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
43523e770bf7SBruno Larsen (billionai) {
43533e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
43543e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
43553e770bf7SBruno Larsen (billionai) 
43563e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 7440 (aka G4)";
43573e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_7440;
43583e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0_74xx;
435945693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
43603e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
43613e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
43623e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
43633e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
43643e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
43653e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
43663e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
43673e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
43681da666cdSFabiano Rosas                        PPC_MEM_TLBIA |
43693e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
43703e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
43713e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
43723e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
43733e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
43743e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
43753e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
43763e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
43773e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
43783e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
43793e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
43803e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
43813e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
43823e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
43833e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
43843e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
43853e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
43863e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
43873e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
43881da666cdSFabiano Rosas     pcc->mmu_model = POWERPC_MMU_32B;
43893e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
43903e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
43913e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
43923e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
43933e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
43943e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
43953e770bf7SBruno Larsen (billionai) }
43963e770bf7SBruno Larsen (billionai) 
init_proc_7450(CPUPPCState * env)43973e770bf7SBruno Larsen (billionai) static void init_proc_7450(CPUPPCState *env)
43983e770bf7SBruno Larsen (billionai) {
4399217781afSFabiano Rosas     register_non_embedded_sprs(env);
44003e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
44013e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
44023e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
44033e770bf7SBruno Larsen (billionai)     /* Level 3 cache control */
44043e770bf7SBruno Larsen (billionai)     register_l3_ctrl(env);
44053e770bf7SBruno Larsen (billionai)     /* L3ITCR1 */
44063e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3ITCR1, "L3ITCR1",
44073e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44083e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44093e770bf7SBruno Larsen (billionai)                  0x00000000);
44103e770bf7SBruno Larsen (billionai)     /* L3ITCR2 */
44113e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3ITCR2, "L3ITCR2",
44123e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44133e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44143e770bf7SBruno Larsen (billionai)                  0x00000000);
44153e770bf7SBruno Larsen (billionai)     /* L3ITCR3 */
44163e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3ITCR3, "L3ITCR3",
44173e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44183e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44193e770bf7SBruno Larsen (billionai)                  0x00000000);
44203e770bf7SBruno Larsen (billionai)     /* L3OHCR */
44213e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3OHCR, "L3OHCR",
44223e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44233e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44243e770bf7SBruno Larsen (billionai)                  0x00000000);
4425acf629ebSFabiano Rosas 
44263e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_UBAMR, "UBAMR",
44273e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
44283e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
44293e770bf7SBruno Larsen (billionai)                  0x00000000);
44303e770bf7SBruno Larsen (billionai)     /* LDSTCR */
44313e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_LDSTCR, "LDSTCR",
44323e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44333e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44343e770bf7SBruno Larsen (billionai)                  0x00000000);
44353e770bf7SBruno Larsen (billionai)     /* ICTRL */
44363e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_ICTRL, "ICTRL",
44373e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44383e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44393e770bf7SBruno Larsen (billionai)                  0x00000000);
44403e770bf7SBruno Larsen (billionai)     /* MSSSR0 */
44413e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSSR0, "MSSSR0",
44423e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44433e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44443e770bf7SBruno Larsen (billionai)                  0x00000000);
44453e770bf7SBruno Larsen (billionai)     /* PMC */
44463e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC5, "PMC5",
44473e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44483e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44493e770bf7SBruno Larsen (billionai)                  0x00000000);
4450acf629ebSFabiano Rosas 
44513e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC5, "UPMC5",
44523e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
44533e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
44543e770bf7SBruno Larsen (billionai)                  0x00000000);
4455acf629ebSFabiano Rosas 
44563e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC6, "PMC6",
44573e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
44583e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
44593e770bf7SBruno Larsen (billionai)                  0x00000000);
4460acf629ebSFabiano Rosas 
44613e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC6, "UPMC6",
44623e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
44633e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
44643e770bf7SBruno Larsen (billionai)                  0x00000000);
44653e770bf7SBruno Larsen (billionai)     /* Memory management */
44663e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
44673e770bf7SBruno Larsen (billionai)     init_excp_7450(env);
44683e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
44693e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
44703e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
44713e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
44723e770bf7SBruno Larsen (billionai) }
44733e770bf7SBruno Larsen (billionai) 
44743e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
44753e770bf7SBruno Larsen (billionai) {
44763e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
44773e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
44783e770bf7SBruno Larsen (billionai) 
44793e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 7450 (aka G4)";
44803e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_7450;
44813e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0_74xx;
448245693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
44833e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
44843e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
44853e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
44863e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
44873e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
44883e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
44893e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
44903e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
44911da666cdSFabiano Rosas                        PPC_MEM_TLBIA |
44923e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
44933e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
44943e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
44953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
44963e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
44973e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
44983e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
44993e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
45003e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
45013e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
45023e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
45033e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
45043e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
45053e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
45063e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
45073e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
45083e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
45093e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
45103e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
45111da666cdSFabiano Rosas     pcc->mmu_model = POWERPC_MMU_32B;
45123e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
45133e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
45143e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
45153e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
45163e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
45173e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
45183e770bf7SBruno Larsen (billionai) }
45193e770bf7SBruno Larsen (billionai) 
init_proc_7445(CPUPPCState * env)45203e770bf7SBruno Larsen (billionai) static void init_proc_7445(CPUPPCState *env)
45213e770bf7SBruno Larsen (billionai) {
4522217781afSFabiano Rosas     register_non_embedded_sprs(env);
45233e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
45243e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
45253e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
45263e770bf7SBruno Larsen (billionai)     /* LDSTCR */
45273e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_LDSTCR, "LDSTCR",
45283e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45293e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45303e770bf7SBruno Larsen (billionai)                  0x00000000);
45313e770bf7SBruno Larsen (billionai)     /* ICTRL */
45323e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_ICTRL, "ICTRL",
45333e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45343e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45353e770bf7SBruno Larsen (billionai)                  0x00000000);
45363e770bf7SBruno Larsen (billionai)     /* MSSSR0 */
45373e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSSR0, "MSSSR0",
45383e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45393e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45403e770bf7SBruno Larsen (billionai)                  0x00000000);
45413e770bf7SBruno Larsen (billionai)     /* PMC */
45423e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC5, "PMC5",
45433e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45443e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45453e770bf7SBruno Larsen (billionai)                  0x00000000);
4546acf629ebSFabiano Rosas 
45473e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC5, "UPMC5",
45483e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45493e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45503e770bf7SBruno Larsen (billionai)                  0x00000000);
4551acf629ebSFabiano Rosas 
45523e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC6, "PMC6",
45533e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45543e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45553e770bf7SBruno Larsen (billionai)                  0x00000000);
4556acf629ebSFabiano Rosas 
45573e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC6, "UPMC6",
45583e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45593e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45603e770bf7SBruno Larsen (billionai)                  0x00000000);
45613e770bf7SBruno Larsen (billionai)     /* SPRGs */
45623e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG4, "SPRG4",
45633e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45643e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45653e770bf7SBruno Larsen (billionai)                  0x00000000);
45663e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG4, "USPRG4",
45673e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45683e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45693e770bf7SBruno Larsen (billionai)                  0x00000000);
45703e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG5, "SPRG5",
45713e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45723e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45733e770bf7SBruno Larsen (billionai)                  0x00000000);
45743e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG5, "USPRG5",
45753e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45763e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45773e770bf7SBruno Larsen (billionai)                  0x00000000);
45783e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG6, "SPRG6",
45793e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45803e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45813e770bf7SBruno Larsen (billionai)                  0x00000000);
45823e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG6, "USPRG6",
45833e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45843e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45853e770bf7SBruno Larsen (billionai)                  0x00000000);
45863e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG7, "SPRG7",
45873e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
45883e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
45893e770bf7SBruno Larsen (billionai)                  0x00000000);
45903e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG7, "USPRG7",
45913e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45923e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
45933e770bf7SBruno Larsen (billionai)                  0x00000000);
45943e770bf7SBruno Larsen (billionai)     /* Memory management */
45953e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
45963e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
45973e770bf7SBruno Larsen (billionai)     init_excp_7450(env);
45983e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
45993e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
46003e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
46013e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
46023e770bf7SBruno Larsen (billionai) }
46033e770bf7SBruno Larsen (billionai) 
46043e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
46053e770bf7SBruno Larsen (billionai) {
46063e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
46073e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
46083e770bf7SBruno Larsen (billionai) 
46093e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 7445 (aka G4)";
46103e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_7445;
46113e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0_74xx;
461245693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
46133e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
46143e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
46153e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
46163e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
46173e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
46183e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
46193e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
46203e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
46211da666cdSFabiano Rosas                        PPC_MEM_TLBIA |
46223e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
46233e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
46243e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
46253e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
46263e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
46273e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
46283e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
46293e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
46303e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
46313e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
46323e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
46333e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
46343e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
46353e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
46363e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
46373e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
46383e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
46393e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
46403e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
46411da666cdSFabiano Rosas     pcc->mmu_model = POWERPC_MMU_32B;
46423e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
46433e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
46443e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
46453e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
46463e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
46473e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
46483e770bf7SBruno Larsen (billionai) }
46493e770bf7SBruno Larsen (billionai) 
init_proc_7455(CPUPPCState * env)46503e770bf7SBruno Larsen (billionai) static void init_proc_7455(CPUPPCState *env)
46513e770bf7SBruno Larsen (billionai) {
4652217781afSFabiano Rosas     register_non_embedded_sprs(env);
46533e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
46543e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
46553e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
46563e770bf7SBruno Larsen (billionai)     /* Level 3 cache control */
46573e770bf7SBruno Larsen (billionai)     register_l3_ctrl(env);
46583e770bf7SBruno Larsen (billionai)     /* LDSTCR */
46593e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_LDSTCR, "LDSTCR",
46603e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
46613e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
46623e770bf7SBruno Larsen (billionai)                  0x00000000);
46633e770bf7SBruno Larsen (billionai)     /* ICTRL */
46643e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_ICTRL, "ICTRL",
46653e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
46663e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
46673e770bf7SBruno Larsen (billionai)                  0x00000000);
46683e770bf7SBruno Larsen (billionai)     /* MSSSR0 */
46693e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSSR0, "MSSSR0",
46703e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
46713e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
46723e770bf7SBruno Larsen (billionai)                  0x00000000);
46733e770bf7SBruno Larsen (billionai)     /* PMC */
46743e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC5, "PMC5",
46753e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
46763e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
46773e770bf7SBruno Larsen (billionai)                  0x00000000);
4678acf629ebSFabiano Rosas 
46793e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC5, "UPMC5",
46803e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
46813e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
46823e770bf7SBruno Larsen (billionai)                  0x00000000);
4683acf629ebSFabiano Rosas 
46843e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC6, "PMC6",
46853e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
46863e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
46873e770bf7SBruno Larsen (billionai)                  0x00000000);
4688acf629ebSFabiano Rosas 
46893e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC6, "UPMC6",
46903e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
46913e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
46923e770bf7SBruno Larsen (billionai)                  0x00000000);
46933e770bf7SBruno Larsen (billionai)     /* SPRGs */
46943e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG4, "SPRG4",
46953e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
46963e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
46973e770bf7SBruno Larsen (billionai)                  0x00000000);
46983e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG4, "USPRG4",
46993e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47003e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47013e770bf7SBruno Larsen (billionai)                  0x00000000);
47023e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG5, "SPRG5",
47033e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
47043e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
47053e770bf7SBruno Larsen (billionai)                  0x00000000);
47063e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG5, "USPRG5",
47073e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47083e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47093e770bf7SBruno Larsen (billionai)                  0x00000000);
47103e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG6, "SPRG6",
47113e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
47123e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
47133e770bf7SBruno Larsen (billionai)                  0x00000000);
47143e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG6, "USPRG6",
47153e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47163e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47173e770bf7SBruno Larsen (billionai)                  0x00000000);
47183e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG7, "SPRG7",
47193e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
47203e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
47213e770bf7SBruno Larsen (billionai)                  0x00000000);
47223e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG7, "USPRG7",
47233e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47243e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
47253e770bf7SBruno Larsen (billionai)                  0x00000000);
47263e770bf7SBruno Larsen (billionai)     /* Memory management */
47273e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
47283e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
47293e770bf7SBruno Larsen (billionai)     init_excp_7450(env);
47303e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
47313e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
47323e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
47333e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
47343e770bf7SBruno Larsen (billionai) }
47353e770bf7SBruno Larsen (billionai) 
47363e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
47373e770bf7SBruno Larsen (billionai) {
47383e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
47393e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
47403e770bf7SBruno Larsen (billionai) 
47413e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 7455 (aka G4)";
47423e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_7455;
47433e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0_74xx;
474445693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
47453e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
47463e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
47473e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
47483e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
47493e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
47503e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
47513e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
47523e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
47531da666cdSFabiano Rosas                        PPC_MEM_TLBIA |
47543e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
47553e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
47563e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
47573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
47583e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
47593e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
47603e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
47613e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
47623e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
47633e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
47643e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
47653e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
47663e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
47673e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
47683e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
47693e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
47703e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
47713e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
47723e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
47731da666cdSFabiano Rosas     pcc->mmu_model = POWERPC_MMU_32B;
47743e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
47753e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
47763e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
47773e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
47783e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
47793e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
47803e770bf7SBruno Larsen (billionai) }
47813e770bf7SBruno Larsen (billionai) 
init_proc_7457(CPUPPCState * env)47823e770bf7SBruno Larsen (billionai) static void init_proc_7457(CPUPPCState *env)
47833e770bf7SBruno Larsen (billionai) {
4784217781afSFabiano Rosas     register_non_embedded_sprs(env);
47853e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
47863e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
47873e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
47883e770bf7SBruno Larsen (billionai)     /* Level 3 cache control */
47893e770bf7SBruno Larsen (billionai)     register_l3_ctrl(env);
47903e770bf7SBruno Larsen (billionai)     /* L3ITCR1 */
47913e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3ITCR1, "L3ITCR1",
47923e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
47933e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
47943e770bf7SBruno Larsen (billionai)                  0x00000000);
47953e770bf7SBruno Larsen (billionai)     /* L3ITCR2 */
47963e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3ITCR2, "L3ITCR2",
47973e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
47983e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
47993e770bf7SBruno Larsen (billionai)                  0x00000000);
48003e770bf7SBruno Larsen (billionai)     /* L3ITCR3 */
48013e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3ITCR3, "L3ITCR3",
48023e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48033e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48043e770bf7SBruno Larsen (billionai)                  0x00000000);
48053e770bf7SBruno Larsen (billionai)     /* L3OHCR */
48063e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_L3OHCR, "L3OHCR",
48073e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48083e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48093e770bf7SBruno Larsen (billionai)                  0x00000000);
48103e770bf7SBruno Larsen (billionai)     /* LDSTCR */
48113e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_LDSTCR, "LDSTCR",
48123e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48133e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48143e770bf7SBruno Larsen (billionai)                  0x00000000);
48153e770bf7SBruno Larsen (billionai)     /* ICTRL */
48163e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_ICTRL, "ICTRL",
48173e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48183e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48193e770bf7SBruno Larsen (billionai)                  0x00000000);
48203e770bf7SBruno Larsen (billionai)     /* MSSSR0 */
48213e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSSR0, "MSSSR0",
48223e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48233e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48243e770bf7SBruno Larsen (billionai)                  0x00000000);
48253e770bf7SBruno Larsen (billionai)     /* PMC */
48263e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC5, "PMC5",
48273e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48283e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48293e770bf7SBruno Larsen (billionai)                  0x00000000);
4830acf629ebSFabiano Rosas 
48313e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC5, "UPMC5",
48323e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48333e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48343e770bf7SBruno Larsen (billionai)                  0x00000000);
4835acf629ebSFabiano Rosas 
48363e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC6, "PMC6",
48373e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48383e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48393e770bf7SBruno Larsen (billionai)                  0x00000000);
4840acf629ebSFabiano Rosas 
48413e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC6, "UPMC6",
48423e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48433e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48443e770bf7SBruno Larsen (billionai)                  0x00000000);
48453e770bf7SBruno Larsen (billionai)     /* SPRGs */
48463e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG4, "SPRG4",
48473e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48483e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48493e770bf7SBruno Larsen (billionai)                  0x00000000);
48503e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG4, "USPRG4",
48513e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48523e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48533e770bf7SBruno Larsen (billionai)                  0x00000000);
48543e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG5, "SPRG5",
48553e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48563e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48573e770bf7SBruno Larsen (billionai)                  0x00000000);
48583e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG5, "USPRG5",
48593e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48603e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48613e770bf7SBruno Larsen (billionai)                  0x00000000);
48623e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG6, "SPRG6",
48633e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48643e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48653e770bf7SBruno Larsen (billionai)                  0x00000000);
48663e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG6, "USPRG6",
48673e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48683e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48693e770bf7SBruno Larsen (billionai)                  0x00000000);
48703e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG7, "SPRG7",
48713e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
48723e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
48733e770bf7SBruno Larsen (billionai)                  0x00000000);
48743e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG7, "USPRG7",
48753e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48763e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
48773e770bf7SBruno Larsen (billionai)                  0x00000000);
48783e770bf7SBruno Larsen (billionai)     /* Memory management */
48793e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
48803e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
48813e770bf7SBruno Larsen (billionai)     init_excp_7450(env);
48823e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
48833e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
48843e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
48853e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
48863e770bf7SBruno Larsen (billionai) }
48873e770bf7SBruno Larsen (billionai) 
48883e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
48893e770bf7SBruno Larsen (billionai) {
48903e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
48913e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
48923e770bf7SBruno Larsen (billionai) 
48933e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 7457 (aka G4)";
48943e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_7457;
48953e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0_74xx;
489645693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
48973e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
48983e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
48993e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
49003e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
49013e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
49023e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
49033e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
49043e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
49051da666cdSFabiano Rosas                        PPC_MEM_TLBIA |
49063e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
49073e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
49083e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
49093e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
49103e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
49113e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
49123e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
49133e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
49143e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
49153e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
49163e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
49173e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
49183e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
49193e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
49203e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
49213e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
49223e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
49233e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
49243e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
49251da666cdSFabiano Rosas     pcc->mmu_model = POWERPC_MMU_32B;
49263e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
49273e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
49283e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
49293e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
49303e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
49313e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
49323e770bf7SBruno Larsen (billionai) }
49333e770bf7SBruno Larsen (billionai) 
init_proc_e600(CPUPPCState * env)49343e770bf7SBruno Larsen (billionai) static void init_proc_e600(CPUPPCState *env)
49353e770bf7SBruno Larsen (billionai) {
4936217781afSFabiano Rosas     register_non_embedded_sprs(env);
49373e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
49383e770bf7SBruno Larsen (billionai)     register_74xx_sprs(env);
49393e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
4940acf629ebSFabiano Rosas 
49413e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_UBAMR, "UBAMR",
49423e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49433e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49443e770bf7SBruno Larsen (billionai)                  0x00000000);
4945acf629ebSFabiano Rosas 
49463e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_LDSTCR, "LDSTCR",
49473e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49483e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
49493e770bf7SBruno Larsen (billionai)                  0x00000000);
4950acf629ebSFabiano Rosas 
49513e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_ICTRL, "ICTRL",
49523e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49533e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
49543e770bf7SBruno Larsen (billionai)                  0x00000000);
4955acf629ebSFabiano Rosas 
49563e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_MSSSR0, "MSSSR0",
49573e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49583e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
49593e770bf7SBruno Larsen (billionai)                  0x00000000);
4960acf629ebSFabiano Rosas 
49613e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC5, "PMC5",
49623e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49633e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
49643e770bf7SBruno Larsen (billionai)                  0x00000000);
4965acf629ebSFabiano Rosas 
49663e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC5, "UPMC5",
49673e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49683e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49693e770bf7SBruno Larsen (billionai)                  0x00000000);
4970acf629ebSFabiano Rosas 
49713e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_PMC6, "PMC6",
49723e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49733e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
49743e770bf7SBruno Larsen (billionai)                  0x00000000);
4975acf629ebSFabiano Rosas 
49763e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_7XX_UPMC6, "UPMC6",
49773e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49783e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49793e770bf7SBruno Larsen (billionai)                  0x00000000);
49803e770bf7SBruno Larsen (billionai)     /* SPRGs */
49813e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG4, "SPRG4",
49823e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49833e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
49843e770bf7SBruno Larsen (billionai)                  0x00000000);
49853e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG4, "USPRG4",
49863e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49873e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49883e770bf7SBruno Larsen (billionai)                  0x00000000);
49893e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG5, "SPRG5",
49903e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49913e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
49923e770bf7SBruno Larsen (billionai)                  0x00000000);
49933e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG5, "USPRG5",
49943e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49953e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
49963e770bf7SBruno Larsen (billionai)                  0x00000000);
49973e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG6, "SPRG6",
49983e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
49993e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
50003e770bf7SBruno Larsen (billionai)                  0x00000000);
50013e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG6, "USPRG6",
50023e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
50033e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
50043e770bf7SBruno Larsen (billionai)                  0x00000000);
50053e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_SPRG7, "SPRG7",
50063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
50073e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
50083e770bf7SBruno Larsen (billionai)                  0x00000000);
50093e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_USPRG7, "USPRG7",
50103e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
50113e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
50123e770bf7SBruno Larsen (billionai)                  0x00000000);
50133e770bf7SBruno Larsen (billionai)     /* Memory management */
50143e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
50153e770bf7SBruno Larsen (billionai)     register_high_BATs(env);
50163e770bf7SBruno Larsen (billionai)     init_excp_7450(env);
50173e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 32;
50183e770bf7SBruno Larsen (billionai)     env->icache_line_size = 32;
50193e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
50203e770bf7SBruno Larsen (billionai)     ppc6xx_irq_init(env_archcpu(env));
50213e770bf7SBruno Larsen (billionai) }
50223e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(e600)50233e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(e600)(ObjectClass *oc, void *data)
50243e770bf7SBruno Larsen (billionai) {
50253e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
50263e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
50273e770bf7SBruno Larsen (billionai) 
50283e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC e600";
50293e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_e600;
50303e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_hid0_74xx;
503145693f94SNicholas Piggin     pcc->check_attn = check_attn_none;
50323e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
50333e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
50343e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
50353e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
50363e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI |
50373e770bf7SBruno Larsen (billionai)                        PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
50383e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
50393e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5040b137fb72SFabiano Rosas                        PPC_MEM_TLBIA |
50413e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT | PPC_EXTERN |
50423e770bf7SBruno Larsen (billionai)                        PPC_ALTIVEC;
50433e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC_NONE;
50443e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_VR) |
50453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
50463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ILE) |
50473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
50483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
50493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
50503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
50513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
50523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
50533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
50543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
50553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EP) |
50563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
50573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
50583e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
50593e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
50603e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
50613e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_32B;
50623e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_74xx;
50633e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_6xx;
50643e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc_7400;
50653e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
50663e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
50673e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
50683e770bf7SBruno Larsen (billionai) }
50693e770bf7SBruno Larsen (billionai) 
50703e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
50713e770bf7SBruno Larsen (billionai) #if defined(CONFIG_USER_ONLY)
50723e770bf7SBruno Larsen (billionai) #define POWERPC970_HID5_INIT 0x00000080
50733e770bf7SBruno Larsen (billionai) #else
50743e770bf7SBruno Larsen (billionai) #define POWERPC970_HID5_INIT 0x00000000
50753e770bf7SBruno Larsen (billionai) #endif
50763e770bf7SBruno Larsen (billionai) 
check_pow_970(CPUPPCState * env)50773e770bf7SBruno Larsen (billionai) static int check_pow_970(CPUPPCState *env)
50783e770bf7SBruno Larsen (billionai) {
50793e770bf7SBruno Larsen (billionai)     if (env->spr[SPR_HID0] & (HID0_DEEPNAP | HID0_DOZE | HID0_NAP)) {
50803e770bf7SBruno Larsen (billionai)         return 1;
50813e770bf7SBruno Larsen (billionai)     }
50823e770bf7SBruno Larsen (billionai) 
50833e770bf7SBruno Larsen (billionai)     return 0;
50843e770bf7SBruno Larsen (billionai) }
50853e770bf7SBruno Larsen (billionai) 
register_970_hid_sprs(CPUPPCState * env)50863e770bf7SBruno Larsen (billionai) static void register_970_hid_sprs(CPUPPCState *env)
50873e770bf7SBruno Larsen (billionai) {
50883e770bf7SBruno Larsen (billionai)     /* Hardware implementation registers */
50893e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID0, "HID0",
50903e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
50913e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_clear,
50923e770bf7SBruno Larsen (billionai)                  0x60000000);
50933e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_HID1, "HID1",
50943e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
50953e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
50963e770bf7SBruno Larsen (billionai)                  0x00000000);
50973e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_970_HID5, "HID5",
50983e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
50993e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
51003e770bf7SBruno Larsen (billionai)                  POWERPC970_HID5_INIT);
51013e770bf7SBruno Larsen (billionai) }
51023e770bf7SBruno Larsen (billionai) 
register_970_hior_sprs(CPUPPCState * env)51033e770bf7SBruno Larsen (billionai) static void register_970_hior_sprs(CPUPPCState *env)
51043e770bf7SBruno Larsen (billionai) {
5105a5116b95SNicholas Piggin     spr_register(env, SPR_HIOR, "HIOR",
51063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
51073e770bf7SBruno Larsen (billionai)                  &spr_read_hior, &spr_write_hior,
51083e770bf7SBruno Larsen (billionai)                  0x00000000);
51093e770bf7SBruno Larsen (billionai) }
51103e770bf7SBruno Larsen (billionai) 
register_book3s_ctrl_sprs(CPUPPCState * env)51113e770bf7SBruno Larsen (billionai) static void register_book3s_ctrl_sprs(CPUPPCState *env)
51123e770bf7SBruno Larsen (billionai) {
5113a5116b95SNicholas Piggin     spr_register(env, SPR_CTRL, "CTRL",
51143e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
51157aeac354SDaniel Henrique Barboza                  SPR_NOACCESS, &spr_write_CTRL,
51163e770bf7SBruno Larsen (billionai)                  0x00000000);
5117a5116b95SNicholas Piggin     spr_register(env, SPR_UCTRL, "UCTRL",
51183e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
51193e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
51203e770bf7SBruno Larsen (billionai)                  0x00000000);
51213e770bf7SBruno Larsen (billionai) }
51223e770bf7SBruno Larsen (billionai) 
register_book3s_altivec_sprs(CPUPPCState * env)51233e770bf7SBruno Larsen (billionai) static void register_book3s_altivec_sprs(CPUPPCState *env)
51243e770bf7SBruno Larsen (billionai) {
51253e770bf7SBruno Larsen (billionai)     if (!(env->insns_flags & PPC_ALTIVEC)) {
51263e770bf7SBruno Larsen (billionai)         return;
51273e770bf7SBruno Larsen (billionai)     }
51283e770bf7SBruno Larsen (billionai) 
51293e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_VRSAVE, "VRSAVE",
5130fbda88f7SNicholas Piggin                      &spr_read_generic, &spr_write_generic32,
5131fbda88f7SNicholas Piggin                      &spr_read_generic, &spr_write_generic32,
51323e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_VRSAVE, 0x00000000);
51333e770bf7SBruno Larsen (billionai) 
51343e770bf7SBruno Larsen (billionai) }
51353e770bf7SBruno Larsen (billionai) 
register_book3s_dbg_sprs(CPUPPCState * env)51363e770bf7SBruno Larsen (billionai) static void register_book3s_dbg_sprs(CPUPPCState *env)
51373e770bf7SBruno Larsen (billionai) {
51383e770bf7SBruno Larsen (billionai)     /*
51393e770bf7SBruno Larsen (billionai)      * TODO: different specs define different scopes for these,
51403e770bf7SBruno Larsen (billionai)      * will have to address this:
51413e770bf7SBruno Larsen (billionai)      * 970: super/write and super/read
51423e770bf7SBruno Larsen (billionai)      * powerisa 2.03..2.04: hypv/write and super/read.
51433e770bf7SBruno Larsen (billionai)      * powerisa 2.05 and newer: hypv/write and hypv/read.
51443e770bf7SBruno Larsen (billionai)      */
51453e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_DABR, "DABR",
51463e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
51473e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
51483e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_DABR, 0x00000000);
51493e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_DABRX, "DABRX",
51503e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
51513e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
51523e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_DABRX, 0x00000000);
51533e770bf7SBruno Larsen (billionai) }
51543e770bf7SBruno Larsen (billionai) 
register_book3s_207_dbg_sprs(CPUPPCState * env)51553e770bf7SBruno Larsen (billionai) static void register_book3s_207_dbg_sprs(CPUPPCState *env)
51563e770bf7SBruno Larsen (billionai) {
51573e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_DAWR0, "DAWR0",
51583e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
51593e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
5160d5ee641cSNicholas Piggin                         &spr_read_generic, &spr_write_dawr0,
51613e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_DAWR, 0x00000000);
51623e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_DAWRX0, "DAWRX0",
51633e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
51643e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
5165d5ee641cSNicholas Piggin                         &spr_read_generic, &spr_write_dawrx0,
51663e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_DAWRX, 0x00000000);
51673e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_CIABR, "CIABR",
51683e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
51693e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
517014192307SNicholas Piggin                         &spr_read_generic, &spr_write_ciabr,
51713e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_CIABR, 0x00000000);
51723e770bf7SBruno Larsen (billionai) }
51733e770bf7SBruno Larsen (billionai) 
register_970_dbg_sprs(CPUPPCState * env)51743e770bf7SBruno Larsen (billionai) static void register_970_dbg_sprs(CPUPPCState *env)
51753e770bf7SBruno Larsen (billionai) {
51763e770bf7SBruno Larsen (billionai)     /* Breakpoints */
51773e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_IABR, "IABR",
51783e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
51793e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
51803e770bf7SBruno Larsen (billionai)                  0x00000000);
51813e770bf7SBruno Larsen (billionai) }
51823e770bf7SBruno Larsen (billionai) 
register_book3s_pmu_sup_sprs(CPUPPCState * env)51833e770bf7SBruno Larsen (billionai) static void register_book3s_pmu_sup_sprs(CPUPPCState *env)
51843e770bf7SBruno Larsen (billionai) {
51853e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_MMCR0, "MMCR0",
51863e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5187c2eff582SDaniel Henrique Barboza                      &spr_read_generic, &spr_write_MMCR0,
5188c2eff582SDaniel Henrique Barboza                      KVM_REG_PPC_MMCR0, 0x80000000);
51893e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_MMCR1, "MMCR1",
51903e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5191a6f91249SDaniel Henrique Barboza                      &spr_read_generic, &spr_write_MMCR1,
51923e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_MMCR1, 0x00000000);
51933e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_MMCRA, "MMCRA",
51943e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5195a7138e28SGlenn Miles                      &spr_read_generic, &spr_write_MMCRA,
51963e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_MMCRA, 0x00000000);
51973e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_PMC1, "PMC1",
51983e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5199308b9fadSDaniel Henrique Barboza                      &spr_read_PMC, &spr_write_PMC,
52003e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC1, 0x00000000);
52013e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_PMC2, "PMC2",
52023e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5203308b9fadSDaniel Henrique Barboza                      &spr_read_PMC, &spr_write_PMC,
52043e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC2, 0x00000000);
52053e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_PMC3, "PMC3",
52063e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5207308b9fadSDaniel Henrique Barboza                      &spr_read_PMC, &spr_write_PMC,
52083e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC3, 0x00000000);
52093e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_PMC4, "PMC4",
52103e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5211308b9fadSDaniel Henrique Barboza                      &spr_read_PMC, &spr_write_PMC,
52123e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC4, 0x00000000);
52133e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_PMC5, "PMC5",
52143e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5215308b9fadSDaniel Henrique Barboza                      &spr_read_PMC, &spr_write_PMC,
52163e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC5, 0x00000000);
52173e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_PMC6, "PMC6",
52183e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5219308b9fadSDaniel Henrique Barboza                      &spr_read_PMC, &spr_write_PMC,
52203e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC6, 0x00000000);
52213e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_SIAR, "SIAR",
52223e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
52233e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
52243e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_SIAR, 0x00000000);
52253e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_SDAR, "SDAR",
52263e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
52273e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
52283e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_SDAR, 0x00000000);
52293e770bf7SBruno Larsen (billionai) }
52303e770bf7SBruno Larsen (billionai) 
register_book3s_pmu_user_sprs(CPUPPCState * env)52313e770bf7SBruno Larsen (billionai) static void register_book3s_pmu_user_sprs(CPUPPCState *env)
52323e770bf7SBruno Larsen (billionai) {
52333e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UMMCR0, "UMMCR0",
5234565cb109SGustavo Romero                  &spr_read_MMCR0_ureg, &spr_write_MMCR0_ureg,
52353e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
5236c2eff582SDaniel Henrique Barboza                  0x80000000);
52373e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UMMCR1, "UMMCR1",
52383e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
52393e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52403e770bf7SBruno Larsen (billionai)                  0x00000000);
52413e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UMMCRA, "UMMCRA",
52423e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
52433e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52443e770bf7SBruno Larsen (billionai)                  0x00000000);
52453e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UPMC1, "UPMC1",
5246cedf7069SDaniel Henrique Barboza                  &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52473e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52483e770bf7SBruno Larsen (billionai)                  0x00000000);
52493e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UPMC2, "UPMC2",
5250cedf7069SDaniel Henrique Barboza                  &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52513e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52523e770bf7SBruno Larsen (billionai)                  0x00000000);
52533e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UPMC3, "UPMC3",
5254cedf7069SDaniel Henrique Barboza                  &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52553e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52563e770bf7SBruno Larsen (billionai)                  0x00000000);
52573e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UPMC4, "UPMC4",
5258cedf7069SDaniel Henrique Barboza                  &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
52593e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52603e770bf7SBruno Larsen (billionai)                  0x00000000);
52613e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UPMC5, "UPMC5",
5262cedf7069SDaniel Henrique Barboza                  &spr_read_PMC56_ureg, &spr_write_PMC56_ureg,
52633e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52643e770bf7SBruno Larsen (billionai)                  0x00000000);
52653e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UPMC6, "UPMC6",
5266cedf7069SDaniel Henrique Barboza                  &spr_read_PMC56_ureg, &spr_write_PMC56_ureg,
52673e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52683e770bf7SBruno Larsen (billionai)                  0x00000000);
52693e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_USIAR, "USIAR",
52703e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
52713e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52723e770bf7SBruno Larsen (billionai)                  0x00000000);
52733e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_USDAR, "USDAR",
52743e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
52753e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52763e770bf7SBruno Larsen (billionai)                  0x00000000);
52773e770bf7SBruno Larsen (billionai) }
52783e770bf7SBruno Larsen (billionai) 
register_970_pmu_sup_sprs(CPUPPCState * env)52793e770bf7SBruno Larsen (billionai) static void register_970_pmu_sup_sprs(CPUPPCState *env)
52803e770bf7SBruno Larsen (billionai) {
52813e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_970_PMC7, "PMC7",
52823e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
52833e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
52843e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC7, 0x00000000);
52853e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_970_PMC8, "PMC8",
52863e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
52873e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
52883e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PMC8, 0x00000000);
52893e770bf7SBruno Larsen (billionai) }
52903e770bf7SBruno Larsen (billionai) 
register_970_pmu_user_sprs(CPUPPCState * env)52913e770bf7SBruno Larsen (billionai) static void register_970_pmu_user_sprs(CPUPPCState *env)
52923e770bf7SBruno Larsen (billionai) {
52933e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_970_UPMC7, "UPMC7",
52943e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
52953e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
52963e770bf7SBruno Larsen (billionai)                  0x00000000);
52973e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_970_UPMC8, "UPMC8",
52983e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, SPR_NOACCESS,
52993e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
53003e770bf7SBruno Larsen (billionai)                  0x00000000);
53013e770bf7SBruno Larsen (billionai) }
53023e770bf7SBruno Larsen (billionai) 
register_power8_pmu_sup_sprs(CPUPPCState * env)53033e770bf7SBruno Larsen (billionai) static void register_power8_pmu_sup_sprs(CPUPPCState *env)
53043e770bf7SBruno Larsen (billionai) {
53053e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_MMCR2, "MMCR2",
53063e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53073e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53083e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_MMCR2, 0x00000000);
53093e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_MMCRS, "MMCRS",
53103e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53113e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53123e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_MMCRS, 0x00000000);
53133e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_SIER, "SIER",
53143e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53153e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53163e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_SIER, 0x00000000);
53173e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_SPMC1, "SPMC1",
53183e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53193e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53203e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_SPMC1, 0x00000000);
53213e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_POWER_SPMC2, "SPMC2",
53223e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53233e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53243e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_SPMC2, 0x00000000);
53253e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_TACR, "TACR",
53263e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53273e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53283e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_TACR, 0x00000000);
53293e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_TCSCR, "TCSCR",
53303e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53313e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53323e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_TCSCR, 0x00000000);
53333e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_CSIGR, "CSIGR",
53343e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
53353e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
53363e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_CSIGR, 0x00000000);
53373e770bf7SBruno Larsen (billionai) }
53383e770bf7SBruno Larsen (billionai) 
register_power8_pmu_user_sprs(CPUPPCState * env)53393e770bf7SBruno Larsen (billionai) static void register_power8_pmu_user_sprs(CPUPPCState *env)
53403e770bf7SBruno Larsen (billionai) {
53413e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_UMMCR2, "UMMCR2",
53427b3ecf16SDaniel Henrique Barboza                  &spr_read_MMCR2_ureg, &spr_write_MMCR2_ureg,
53433e770bf7SBruno Larsen (billionai)                  &spr_read_ureg, &spr_write_ureg,
53443e770bf7SBruno Larsen (billionai)                  0x00000000);
53453e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_POWER_USIER, "USIER",
53463e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
53473e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
53483e770bf7SBruno Larsen (billionai)                  0x00000000);
53493e770bf7SBruno Larsen (billionai) }
53503e770bf7SBruno Larsen (billionai) 
register_power10_pmu_sup_sprs(CPUPPCState * env)53510b889323SMadhavan Srinivasan static void register_power10_pmu_sup_sprs(CPUPPCState *env)
53520b889323SMadhavan Srinivasan {
53530b889323SMadhavan Srinivasan     spr_register_kvm(env, SPR_POWER_MMCR3, "MMCR3",
53540b889323SMadhavan Srinivasan                      SPR_NOACCESS, SPR_NOACCESS,
53550b889323SMadhavan Srinivasan                      &spr_read_generic, &spr_write_generic,
53560b889323SMadhavan Srinivasan                      KVM_REG_PPC_MMCR3, 0x00000000);
53570b889323SMadhavan Srinivasan     spr_register_kvm(env, SPR_POWER_SIER2, "SIER2",
53580b889323SMadhavan Srinivasan                      SPR_NOACCESS, SPR_NOACCESS,
53590b889323SMadhavan Srinivasan                      &spr_read_generic, &spr_write_generic,
53600b889323SMadhavan Srinivasan                      KVM_REG_PPC_SIER2, 0x00000000);
53610b889323SMadhavan Srinivasan     spr_register_kvm(env, SPR_POWER_SIER3, "SIER3",
53620b889323SMadhavan Srinivasan                      SPR_NOACCESS, SPR_NOACCESS,
53630b889323SMadhavan Srinivasan                      &spr_read_generic, &spr_write_generic,
53640b889323SMadhavan Srinivasan                      KVM_REG_PPC_SIER3, 0x00000000);
53650b889323SMadhavan Srinivasan }
53660b889323SMadhavan Srinivasan 
register_power10_pmu_user_sprs(CPUPPCState * env)53670b889323SMadhavan Srinivasan static void register_power10_pmu_user_sprs(CPUPPCState *env)
53680b889323SMadhavan Srinivasan {
53690b889323SMadhavan Srinivasan     spr_register(env, SPR_POWER_UMMCR3, "UMMCR3",
53700b889323SMadhavan Srinivasan                  &spr_read_generic, &spr_write_generic,
53710b889323SMadhavan Srinivasan                  &spr_read_generic, &spr_write_generic,
53720b889323SMadhavan Srinivasan                  0x00000000);
53730b889323SMadhavan Srinivasan     spr_register(env, SPR_POWER_USIER2, "USIER2",
53740b889323SMadhavan Srinivasan                  &spr_read_generic, SPR_NOACCESS,
53750b889323SMadhavan Srinivasan                  &spr_read_generic, &spr_write_generic,
53760b889323SMadhavan Srinivasan                  0x00000000);
53770b889323SMadhavan Srinivasan     spr_register(env, SPR_POWER_USIER3, "USIER3",
53780b889323SMadhavan Srinivasan                  &spr_read_generic, SPR_NOACCESS,
53790b889323SMadhavan Srinivasan                  &spr_read_generic, &spr_write_generic,
53800b889323SMadhavan Srinivasan                  0x00000000);
53810b889323SMadhavan Srinivasan }
53820b889323SMadhavan Srinivasan 
register_power5p_ear_sprs(CPUPPCState * env)53833e770bf7SBruno Larsen (billionai) static void register_power5p_ear_sprs(CPUPPCState *env)
53843e770bf7SBruno Larsen (billionai) {
53853e770bf7SBruno Larsen (billionai)     /* External access control */
53863e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_EAR, "EAR",
53873e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
53883e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
53893e770bf7SBruno Larsen (billionai)                  0x00000000);
53903e770bf7SBruno Larsen (billionai) }
53913e770bf7SBruno Larsen (billionai) 
register_power5p_tb_sprs(CPUPPCState * env)53923e770bf7SBruno Larsen (billionai) static void register_power5p_tb_sprs(CPUPPCState *env)
53933e770bf7SBruno Larsen (billionai) {
53943e770bf7SBruno Larsen (billionai)     /* TBU40 (High 40 bits of the Timebase register */
53953e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_TBU40, "TBU40",
53963e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
53973e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
53983e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, &spr_write_tbu40,
53993e770bf7SBruno Larsen (billionai)                     0x00000000);
54003e770bf7SBruno Larsen (billionai) }
54013e770bf7SBruno Larsen (billionai) 
register_970_lpar_sprs(CPUPPCState * env)54023e770bf7SBruno Larsen (billionai) static void register_970_lpar_sprs(CPUPPCState *env)
54033e770bf7SBruno Larsen (billionai) {
54043e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
54053e770bf7SBruno Larsen (billionai)     /*
54063e770bf7SBruno Larsen (billionai)      * PPC970: HID4 covers things later controlled by the LPCR and
54073e770bf7SBruno Larsen (billionai)      * RMOR in later CPUs, but with a different encoding.  We only
54083e770bf7SBruno Larsen (billionai)      * support the 970 in "Apple mode" which has all hypervisor
54093e770bf7SBruno Larsen (billionai)      * facilities disabled by strapping, so we can basically just
54103e770bf7SBruno Larsen (billionai)      * ignore it
54113e770bf7SBruno Larsen (billionai)      */
54123e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_970_HID4, "HID4",
54133e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54143e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54153e770bf7SBruno Larsen (billionai)                  0x00000000);
54163e770bf7SBruno Larsen (billionai) #endif
54173e770bf7SBruno Larsen (billionai) }
54183e770bf7SBruno Larsen (billionai) 
register_power5p_lpar_sprs(CPUPPCState * env)54193e770bf7SBruno Larsen (billionai) static void register_power5p_lpar_sprs(CPUPPCState *env)
54203e770bf7SBruno Larsen (billionai) {
54213e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
5422e6a19a64SMichael Tokarev     /* Logical partitioning */
54233e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_LPCR, "LPCR",
54243e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
54253e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
54263e770bf7SBruno Larsen (billionai)                         &spr_read_generic, &spr_write_lpcr,
54273e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_LPCR, LPCR_LPES0 | LPCR_LPES1);
54283e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HDEC, "HDEC",
54293e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
54303e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
54313e770bf7SBruno Larsen (billionai)                     &spr_read_hdecr, &spr_write_hdecr, 0);
54323e770bf7SBruno Larsen (billionai) #endif
54333e770bf7SBruno Larsen (billionai) }
54343e770bf7SBruno Larsen (billionai) 
register_book3s_ids_sprs(CPUPPCState * env)54353e770bf7SBruno Larsen (billionai) static void register_book3s_ids_sprs(CPUPPCState *env)
54363e770bf7SBruno Larsen (billionai) {
54373e770bf7SBruno Larsen (billionai)     /* FIXME: Will need to deal with thread vs core only SPRs */
54383e770bf7SBruno Larsen (billionai) 
54393e770bf7SBruno Larsen (billionai)     /* Processor identification */
54403e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_PIR, "PIR",
54413e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54423e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
54433e770bf7SBruno Larsen (billionai)                  &spr_read_generic, NULL,
54443e770bf7SBruno Larsen (billionai)                  0x00000000);
54453e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_LPIDR, "LPIDR",
54463e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54473e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54483e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_lpidr,
54493e770bf7SBruno Larsen (billionai)                  0x00000000);
54503e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HFSCR, "HFSCR",
54513e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54523e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54533e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54543e770bf7SBruno Larsen (billionai)                  0x00000000);
54553e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_MMCRC, "MMCRC",
54563e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54573e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
5458e5c2ac9dSNicholas Piggin                  &spr_read_generic, &spr_core_write_generic32,
54593e770bf7SBruno Larsen (billionai)                  0x00000000);
54603e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_MMCRH, "MMCRH",
54613e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54623e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54633e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54643e770bf7SBruno Larsen (billionai)                  0x00000000);
54653e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HSPRG0, "HSPRG0",
54663e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54673e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54683e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54693e770bf7SBruno Larsen (billionai)                  0x00000000);
54703e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HSPRG1, "HSPRG1",
54713e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54723e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54733e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54743e770bf7SBruno Larsen (billionai)                  0x00000000);
54753e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HSRR0, "HSRR0",
54763e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54773e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54783e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54793e770bf7SBruno Larsen (billionai)                  0x00000000);
54803e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HSRR1, "HSRR1",
54813e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54823e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54833e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54843e770bf7SBruno Larsen (billionai)                  0x00000000);
54853e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HDAR, "HDAR",
54863e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54873e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54883e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
54893e770bf7SBruno Larsen (billionai)                  0x00000000);
54903e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HDSISR, "HDSISR",
54913e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54923e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
5493fbda88f7SNicholas Piggin                  &spr_read_generic, &spr_write_generic32,
54943e770bf7SBruno Larsen (billionai)                  0x00000000);
54953e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_HRMOR, "HRMOR",
54963e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
54973e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
5498e5c2ac9dSNicholas Piggin                  &spr_read_generic, &spr_core_write_generic,
54993e770bf7SBruno Larsen (billionai)                  0x00000000);
55003e770bf7SBruno Larsen (billionai) }
55013e770bf7SBruno Larsen (billionai) 
register_rmor_sprs(CPUPPCState * env)55023e770bf7SBruno Larsen (billionai) static void register_rmor_sprs(CPUPPCState *env)
55033e770bf7SBruno Larsen (billionai) {
55043e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_RMOR, "RMOR",
55053e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
55063e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
55073e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
55083e770bf7SBruno Larsen (billionai)                  0x00000000);
55093e770bf7SBruno Larsen (billionai) }
55103e770bf7SBruno Larsen (billionai) 
register_power8_ids_sprs(CPUPPCState * env)55113e770bf7SBruno Larsen (billionai) static void register_power8_ids_sprs(CPUPPCState *env)
55123e770bf7SBruno Larsen (billionai) {
55133e770bf7SBruno Larsen (billionai)     /* Thread identification */
55143e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_TIR, "TIR",
55153e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
55163e770bf7SBruno Larsen (billionai)                  &spr_read_generic, SPR_NOACCESS,
55173e770bf7SBruno Larsen (billionai)                  0x00000000);
55183e770bf7SBruno Larsen (billionai) }
55193e770bf7SBruno Larsen (billionai) 
register_book3s_purr_sprs(CPUPPCState * env)55203e770bf7SBruno Larsen (billionai) static void register_book3s_purr_sprs(CPUPPCState *env)
55213e770bf7SBruno Larsen (billionai) {
55223e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
55233e770bf7SBruno Larsen (billionai)     /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
55243e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_PURR,   "PURR",
55253e770bf7SBruno Larsen (billionai)                         &spr_read_purr, SPR_NOACCESS,
55263e770bf7SBruno Larsen (billionai)                         &spr_read_purr, SPR_NOACCESS,
55273e770bf7SBruno Larsen (billionai)                         &spr_read_purr, &spr_write_purr,
55283e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_PURR, 0x00000000);
55293e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_SPURR,   "SPURR",
55303e770bf7SBruno Larsen (billionai)                         &spr_read_purr, SPR_NOACCESS,
55313e770bf7SBruno Larsen (billionai)                         &spr_read_purr, SPR_NOACCESS,
55323e770bf7SBruno Larsen (billionai)                         &spr_read_purr, &spr_write_purr,
55333e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_SPURR, 0x00000000);
55343e770bf7SBruno Larsen (billionai) #endif
55353e770bf7SBruno Larsen (billionai) }
55363e770bf7SBruno Larsen (billionai) 
register_power6_dbg_sprs(CPUPPCState * env)55373e770bf7SBruno Larsen (billionai) static void register_power6_dbg_sprs(CPUPPCState *env)
55383e770bf7SBruno Larsen (billionai) {
55393e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
5540a5116b95SNicholas Piggin     spr_register(env, SPR_CFAR, "CFAR",
55413e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
55423e770bf7SBruno Larsen (billionai)                  &spr_read_cfar, &spr_write_cfar,
55433e770bf7SBruno Larsen (billionai)                  0x00000000);
55443e770bf7SBruno Larsen (billionai) #endif
55453e770bf7SBruno Larsen (billionai) }
55463e770bf7SBruno Larsen (billionai) 
register_power5p_common_sprs(CPUPPCState * env)55473e770bf7SBruno Larsen (billionai) static void register_power5p_common_sprs(CPUPPCState *env)
55483e770bf7SBruno Larsen (billionai) {
55493e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_PPR, "PPR",
55503e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
55513e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
55523e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PPR, 0x00000000);
55533e770bf7SBruno Larsen (billionai) }
55543e770bf7SBruno Larsen (billionai) 
register_power6_common_sprs(CPUPPCState * env)55553e770bf7SBruno Larsen (billionai) static void register_power6_common_sprs(CPUPPCState *env)
55563e770bf7SBruno Larsen (billionai) {
55573e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
5558a5116b95SNicholas Piggin     spr_register_kvm(env, SPR_DSCR, "DSCR",
55593e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
55603e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
55613e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_DSCR, 0x00000000);
55623e770bf7SBruno Larsen (billionai) #endif
55633e770bf7SBruno Larsen (billionai)     /*
55643e770bf7SBruno Larsen (billionai)      * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
55653e770bf7SBruno Larsen (billionai)      * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
55663e770bf7SBruno Larsen (billionai)      */
55673e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_PCR, "PCR",
55683e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
55693e770bf7SBruno Larsen (billionai)                  SPR_NOACCESS, SPR_NOACCESS,
55703e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_pcr,
55713e770bf7SBruno Larsen (billionai)                  0x00000000);
55723e770bf7SBruno Larsen (billionai) }
55733e770bf7SBruno Larsen (billionai) 
register_HEIR32_spr(CPUPPCState * env)5574a3c020d8SNicholas Piggin static void register_HEIR32_spr(CPUPPCState *env)
5575a3c020d8SNicholas Piggin {
5576a3c020d8SNicholas Piggin     spr_register_hv(env, SPR_HEIR, "HEIR",
5577a3c020d8SNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5578a3c020d8SNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5579a3c020d8SNicholas Piggin                  &spr_read_generic, &spr_write_generic32,
5580a3c020d8SNicholas Piggin                  0x00000000);
5581a3c020d8SNicholas Piggin }
5582a3c020d8SNicholas Piggin 
register_HEIR64_spr(CPUPPCState * env)5583a3c020d8SNicholas Piggin static void register_HEIR64_spr(CPUPPCState *env)
5584a3c020d8SNicholas Piggin {
5585a3c020d8SNicholas Piggin     spr_register_hv(env, SPR_HEIR, "HEIR",
5586a3c020d8SNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5587a3c020d8SNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5588a3c020d8SNicholas Piggin                  &spr_read_generic, &spr_write_generic,
5589a3c020d8SNicholas Piggin                  0x00000000);
5590a3c020d8SNicholas Piggin }
5591a3c020d8SNicholas Piggin 
register_power7_common_sprs(CPUPPCState * env)55921cbcbcb8SNicholas Piggin static void register_power7_common_sprs(CPUPPCState *env)
55931cbcbcb8SNicholas Piggin {
55941cbcbcb8SNicholas Piggin     spr_register(env, SPR_PPR32, "PPR32",
55951cbcbcb8SNicholas Piggin                  &spr_read_ppr32, &spr_write_ppr32,
55961cbcbcb8SNicholas Piggin                  &spr_read_ppr32, &spr_write_ppr32,
55971cbcbcb8SNicholas Piggin                  0x00000000);
55981cbcbcb8SNicholas Piggin }
55991cbcbcb8SNicholas Piggin 
register_power8_tce_address_control_sprs(CPUPPCState * env)56003e770bf7SBruno Larsen (billionai) static void register_power8_tce_address_control_sprs(CPUPPCState *env)
56013e770bf7SBruno Larsen (billionai) {
56023e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_TAR, "TAR",
56033e770bf7SBruno Larsen (billionai)                      &spr_read_tar, &spr_write_tar,
56043e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
56053e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_TAR, 0x00000000);
56063e770bf7SBruno Larsen (billionai) }
56073e770bf7SBruno Larsen (billionai) 
register_power8_tm_sprs(CPUPPCState * env)56083e770bf7SBruno Larsen (billionai) static void register_power8_tm_sprs(CPUPPCState *env)
56093e770bf7SBruno Larsen (billionai) {
56103e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_TFHAR, "TFHAR",
56113e770bf7SBruno Larsen (billionai)                      &spr_read_tm, &spr_write_tm,
56123e770bf7SBruno Larsen (billionai)                      &spr_read_tm, &spr_write_tm,
56133e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_TFHAR, 0x00000000);
56143e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_TFIAR, "TFIAR",
56153e770bf7SBruno Larsen (billionai)                      &spr_read_tm, &spr_write_tm,
56163e770bf7SBruno Larsen (billionai)                      &spr_read_tm, &spr_write_tm,
56173e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_TFIAR, 0x00000000);
56183e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_TEXASR, "TEXASR",
56193e770bf7SBruno Larsen (billionai)                      &spr_read_tm, &spr_write_tm,
56203e770bf7SBruno Larsen (billionai)                      &spr_read_tm, &spr_write_tm,
56213e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_TEXASR, 0x00000000);
56223e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_TEXASRU, "TEXASRU",
56233e770bf7SBruno Larsen (billionai)                  &spr_read_tm_upper32, &spr_write_tm_upper32,
56243e770bf7SBruno Larsen (billionai)                  &spr_read_tm_upper32, &spr_write_tm_upper32,
56253e770bf7SBruno Larsen (billionai)                  0x00000000);
56263e770bf7SBruno Larsen (billionai) }
56273e770bf7SBruno Larsen (billionai) 
register_power8_ebb_sprs(CPUPPCState * env)56283e770bf7SBruno Larsen (billionai) static void register_power8_ebb_sprs(CPUPPCState *env)
56293e770bf7SBruno Larsen (billionai) {
56303e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BESCRS, "BESCRS",
56313e770bf7SBruno Larsen (billionai)                  &spr_read_ebb, &spr_write_ebb,
56323e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
56333e770bf7SBruno Larsen (billionai)                  0x00000000);
56343e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BESCRSU, "BESCRSU",
56353e770bf7SBruno Larsen (billionai)                  &spr_read_ebb_upper32, &spr_write_ebb_upper32,
56363e770bf7SBruno Larsen (billionai)                  &spr_read_prev_upper32, &spr_write_prev_upper32,
56373e770bf7SBruno Larsen (billionai)                  0x00000000);
56383e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BESCRR, "BESCRR",
56393e770bf7SBruno Larsen (billionai)                  &spr_read_ebb, &spr_write_ebb,
56403e770bf7SBruno Larsen (billionai)                  &spr_read_generic, &spr_write_generic,
56413e770bf7SBruno Larsen (billionai)                  0x00000000);
56423e770bf7SBruno Larsen (billionai)     spr_register(env, SPR_BESCRRU, "BESCRRU",
56433e770bf7SBruno Larsen (billionai)                  &spr_read_ebb_upper32, &spr_write_ebb_upper32,
56443e770bf7SBruno Larsen (billionai)                  &spr_read_prev_upper32, &spr_write_prev_upper32,
56453e770bf7SBruno Larsen (billionai)                  0x00000000);
56463e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_EBBHR, "EBBHR",
56473e770bf7SBruno Larsen (billionai)                      &spr_read_ebb, &spr_write_ebb,
56483e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
56493e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_EBBHR, 0x00000000);
56503e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_EBBRR, "EBBRR",
56513e770bf7SBruno Larsen (billionai)                      &spr_read_ebb, &spr_write_ebb,
56523e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
56533e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_EBBRR, 0x00000000);
56543e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_BESCR, "BESCR",
56553e770bf7SBruno Larsen (billionai)                      &spr_read_ebb, &spr_write_ebb,
56563e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
56573e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_BESCR, 0x00000000);
56583e770bf7SBruno Larsen (billionai) }
56593e770bf7SBruno Larsen (billionai) 
56603e770bf7SBruno Larsen (billionai) /* Virtual Time Base */
register_vtb_sprs(CPUPPCState * env)56613e770bf7SBruno Larsen (billionai) static void register_vtb_sprs(CPUPPCState *env)
56623e770bf7SBruno Larsen (billionai) {
56633e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_VTB, "VTB",
56643e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
56653e770bf7SBruno Larsen (billionai)                         &spr_read_vtb, SPR_NOACCESS,
56663e770bf7SBruno Larsen (billionai)                         &spr_read_vtb, &spr_write_vtb,
56673e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_VTB, 0x00000000);
56683e770bf7SBruno Larsen (billionai) }
56693e770bf7SBruno Larsen (billionai) 
register_power8_fscr_sprs(CPUPPCState * env)56703e770bf7SBruno Larsen (billionai) static void register_power8_fscr_sprs(CPUPPCState *env)
56713e770bf7SBruno Larsen (billionai) {
56723e770bf7SBruno Larsen (billionai) #if defined(CONFIG_USER_ONLY)
56733e770bf7SBruno Larsen (billionai)     target_ulong initval = 1ULL << FSCR_TAR;
56743e770bf7SBruno Larsen (billionai) #else
56753e770bf7SBruno Larsen (billionai)     target_ulong initval = 0;
56763e770bf7SBruno Larsen (billionai) #endif
56773e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_FSCR, "FSCR",
56783e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
56793e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
56803e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_FSCR, initval);
56813e770bf7SBruno Larsen (billionai) }
56823e770bf7SBruno Larsen (billionai) 
register_power8_pspb_sprs(CPUPPCState * env)56833e770bf7SBruno Larsen (billionai) static void register_power8_pspb_sprs(CPUPPCState *env)
56843e770bf7SBruno Larsen (billionai) {
56853e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_PSPB, "PSPB",
56863e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
56873e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic32,
56883e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PSPB, 0);
56893e770bf7SBruno Larsen (billionai) }
56903e770bf7SBruno Larsen (billionai) 
register_power8_dpdes_sprs(CPUPPCState * env)56913e770bf7SBruno Larsen (billionai) static void register_power8_dpdes_sprs(CPUPPCState *env)
56923e770bf7SBruno Larsen (billionai) {
56933e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
56943e770bf7SBruno Larsen (billionai)     /* Directed Privileged Door-bell Exception State, used for IPI */
56953e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_DPDES, "DPDES",
56963e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
56973e770bf7SBruno Larsen (billionai)                         &spr_read_dpdes, SPR_NOACCESS,
56983e770bf7SBruno Larsen (billionai)                         &spr_read_dpdes, &spr_write_dpdes,
56993e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_DPDES, 0x00000000);
57003e770bf7SBruno Larsen (billionai) #endif
57013e770bf7SBruno Larsen (billionai) }
57023e770bf7SBruno Larsen (billionai) 
register_power8_ic_sprs(CPUPPCState * env)57033e770bf7SBruno Larsen (billionai) static void register_power8_ic_sprs(CPUPPCState *env)
57043e770bf7SBruno Larsen (billionai) {
57053e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
57063e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_IC, "IC",
57073e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
57083e770bf7SBruno Larsen (billionai)                     &spr_read_generic, SPR_NOACCESS,
57093e770bf7SBruno Larsen (billionai)                     &spr_read_generic, &spr_write_generic,
57103e770bf7SBruno Larsen (billionai)                     0);
57113e770bf7SBruno Larsen (billionai) #endif
57123e770bf7SBruno Larsen (billionai) }
57133e770bf7SBruno Larsen (billionai) 
57146f967f4fSNicholas Piggin /* SPRs specific to IBM POWER CPUs */
register_power_common_book4_sprs(CPUPPCState * env)57156f967f4fSNicholas Piggin static void register_power_common_book4_sprs(CPUPPCState *env)
57166f967f4fSNicholas Piggin {
57176f967f4fSNicholas Piggin #if !defined(CONFIG_USER_ONLY)
57186f967f4fSNicholas Piggin     spr_register_hv(env, SPR_HID0, "HID0",
57196f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
57206f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
57219cdfd1b9SNicholas Piggin                  &spr_read_generic, &spr_core_write_generic,
57226f967f4fSNicholas Piggin                  0x00000000);
57236f967f4fSNicholas Piggin     spr_register_hv(env, SPR_TSCR, "TSCR",
57246f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
57256f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5726e5c2ac9dSNicholas Piggin                  &spr_read_generic, &spr_core_write_generic32,
57276f967f4fSNicholas Piggin                  0x00000000);
57286f967f4fSNicholas Piggin     spr_register_hv(env, SPR_HMER, "HMER",
57296f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
57306f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
57316f967f4fSNicholas Piggin                  &spr_read_generic, &spr_write_hmer,
57326f967f4fSNicholas Piggin                  0x00000000);
57336f967f4fSNicholas Piggin     spr_register_hv(env, SPR_HMEER, "HMEER",
57346f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
57356f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5736e5c2ac9dSNicholas Piggin                  &spr_read_generic, &spr_core_write_generic,
57376f967f4fSNicholas Piggin                  0x00000000);
57386f967f4fSNicholas Piggin     spr_register_hv(env, SPR_TFMR, "TFMR",
57396f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
57406f967f4fSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5741b25f2ffaSNicholas Piggin                  &spr_read_tfmr, &spr_write_tfmr,
57426f967f4fSNicholas Piggin                  0x00000000);
574399837aa8SJoel Stanley     spr_register_hv(env, SPR_TRIG1, "TRIG1",
574499837aa8SJoel Stanley                  SPR_NOACCESS, SPR_NOACCESS,
574599837aa8SJoel Stanley                  &spr_access_nop, &spr_write_generic,
574699837aa8SJoel Stanley                  &spr_access_nop, &spr_write_generic,
574799837aa8SJoel Stanley                  0x00000000);
574899837aa8SJoel Stanley     spr_register_hv(env, SPR_TRIG2, "TRIG2",
574999837aa8SJoel Stanley                  SPR_NOACCESS, SPR_NOACCESS,
575099837aa8SJoel Stanley                  &spr_access_nop, &spr_write_generic,
575199837aa8SJoel Stanley                  &spr_access_nop, &spr_write_generic,
575299837aa8SJoel Stanley                  0x00000000);
5753c9d5aedfSNicholas Piggin     spr_register_hv(env, SPR_LDBAR, "LDBAR",
5754c9d5aedfSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5755c9d5aedfSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5756c9d5aedfSNicholas Piggin                  &spr_read_generic, &spr_core_lpar_write_generic,
5757c9d5aedfSNicholas Piggin                  0x00000000);
5758c9d5aedfSNicholas Piggin     spr_register_hv(env, SPR_POWER_TTR, "TTR",
5759c9d5aedfSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5760c9d5aedfSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
5761c9d5aedfSNicholas Piggin                  &spr_read_generic, &spr_core_write_generic,
5762c9d5aedfSNicholas Piggin                  0x00000000);
57636f967f4fSNicholas Piggin #endif
57646f967f4fSNicholas Piggin }
57656f967f4fSNicholas Piggin 
register_power9_book4_sprs(CPUPPCState * env)57666f967f4fSNicholas Piggin static void register_power9_book4_sprs(CPUPPCState *env)
57676f967f4fSNicholas Piggin {
57686f967f4fSNicholas Piggin     /* Add a number of P9 book4 registers */
57696f967f4fSNicholas Piggin     register_power_common_book4_sprs(env);
57706f967f4fSNicholas Piggin #if !defined(CONFIG_USER_ONLY)
57716f967f4fSNicholas Piggin     spr_register_kvm(env, SPR_WORT, "WORT",
57726f967f4fSNicholas Piggin                      SPR_NOACCESS, SPR_NOACCESS,
57736f967f4fSNicholas Piggin                      &spr_read_generic, &spr_write_generic,
57746f967f4fSNicholas Piggin                      KVM_REG_PPC_WORT, 0);
57756f967f4fSNicholas Piggin #endif
57766f967f4fSNicholas Piggin }
57776f967f4fSNicholas Piggin 
register_power8_book4_sprs(CPUPPCState * env)57783e770bf7SBruno Larsen (billionai) static void register_power8_book4_sprs(CPUPPCState *env)
57793e770bf7SBruno Larsen (billionai) {
57803e770bf7SBruno Larsen (billionai)     /* Add a number of P8 book4 registers */
57816f967f4fSNicholas Piggin     register_power_common_book4_sprs(env);
57823e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
57833e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_ACOP, "ACOP",
57843e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
57853e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
57863e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_ACOP, 0);
57876f967f4fSNicholas Piggin     /* PID is only in BookE in ISA v2.07 */
5788a5116b95SNicholas Piggin     spr_register_kvm(env, SPR_BOOKS_PID, "PIDR",
57893e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
57903e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_pidr,
57913e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PID, 0);
57923e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_WORT, "WORT",
57933e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
57943e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
57953e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_WORT, 0);
579660d30cffSNicholas Piggin     /* SPRC/SPRD exist in earlier CPUs but only tested on POWER9/10 */
579760d30cffSNicholas Piggin     spr_register_hv(env, SPR_POWER_SPRC, "SPRC",
579860d30cffSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
579960d30cffSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
580060d30cffSNicholas Piggin                  &spr_read_generic, &spr_write_sprc,
580160d30cffSNicholas Piggin                  0x00000000);
580260d30cffSNicholas Piggin     spr_register_hv(env, SPR_POWER_SPRD, "SPRD",
580360d30cffSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
580460d30cffSNicholas Piggin                  SPR_NOACCESS, SPR_NOACCESS,
580560d30cffSNicholas Piggin                  &spr_read_sprd, &spr_write_sprd,
580660d30cffSNicholas Piggin                  0x00000000);
58073e770bf7SBruno Larsen (billionai) #endif
58083e770bf7SBruno Larsen (billionai) }
58093e770bf7SBruno Larsen (billionai) 
register_power7_book4_sprs(CPUPPCState * env)58103e770bf7SBruno Larsen (billionai) static void register_power7_book4_sprs(CPUPPCState *env)
58113e770bf7SBruno Larsen (billionai) {
58123e770bf7SBruno Larsen (billionai)     /* Add a number of P7 book4 registers */
58133e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
58146f967f4fSNicholas Piggin     register_power_common_book4_sprs(env);
58153e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_ACOP, "ACOP",
58163e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
58173e770bf7SBruno Larsen (billionai)                      &spr_read_generic, &spr_write_generic,
58183e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_ACOP, 0);
58196f967f4fSNicholas Piggin     /* PID is only in BookE in ISA v2.06 */
5820a5116b95SNicholas Piggin     spr_register_kvm(env, SPR_BOOKS_PID, "PIDR",
58213e770bf7SBruno Larsen (billionai)                      SPR_NOACCESS, SPR_NOACCESS,
5822fbda88f7SNicholas Piggin                      &spr_read_generic, &spr_write_generic32,
58233e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_PID, 0);
58243e770bf7SBruno Larsen (billionai) #endif
58253e770bf7SBruno Larsen (billionai) }
58263e770bf7SBruno Larsen (billionai) 
register_power8_rpr_sprs(CPUPPCState * env)58273e770bf7SBruno Larsen (billionai) static void register_power8_rpr_sprs(CPUPPCState *env)
58283e770bf7SBruno Larsen (billionai) {
58293e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
58303e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_RPR, "RPR",
58313e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
58323e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
5833e5c2ac9dSNicholas Piggin                     &spr_read_generic, &spr_core_write_generic,
58343e770bf7SBruno Larsen (billionai)                     0x00000103070F1F3F);
58353e770bf7SBruno Larsen (billionai) #endif
58363e770bf7SBruno Larsen (billionai) }
58373e770bf7SBruno Larsen (billionai) 
register_power9_mmu_sprs(CPUPPCState * env)58383e770bf7SBruno Larsen (billionai) static void register_power9_mmu_sprs(CPUPPCState *env)
58393e770bf7SBruno Larsen (billionai) {
58403e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
58413e770bf7SBruno Larsen (billionai)     /* Partition Table Control */
58423e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_PTCR, "PTCR",
58433e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
58443e770bf7SBruno Larsen (billionai)                         SPR_NOACCESS, SPR_NOACCESS,
58453e770bf7SBruno Larsen (billionai)                         &spr_read_generic, &spr_write_ptcr,
58463e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_PTCR, 0x00000000);
58473e770bf7SBruno Larsen (billionai)     /* Address Segment Descriptor Register */
58483e770bf7SBruno Larsen (billionai)     spr_register_hv(env, SPR_ASDR, "ASDR",
58493e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
58503e770bf7SBruno Larsen (billionai)                     SPR_NOACCESS, SPR_NOACCESS,
58513e770bf7SBruno Larsen (billionai)                     &spr_read_generic, &spr_write_generic,
58523e770bf7SBruno Larsen (billionai)                     0x0000000000000000);
58536f967f4fSNicholas Piggin     /* PID is part of the BookS ISA from v3.0 */
5854a5116b95SNicholas Piggin     spr_register_kvm(env, SPR_BOOKS_PID, "PIDR",
58556f967f4fSNicholas Piggin                      SPR_NOACCESS, SPR_NOACCESS,
58566f967f4fSNicholas Piggin                      &spr_read_generic, &spr_write_pidr,
58576f967f4fSNicholas Piggin                      KVM_REG_PPC_PID, 0);
58583e770bf7SBruno Larsen (billionai) #endif
58593e770bf7SBruno Larsen (billionai) }
58603e770bf7SBruno Larsen (billionai) 
register_power10_hash_sprs(CPUPPCState * env)5861903f84ebSVíctor Colombo static void register_power10_hash_sprs(CPUPPCState *env)
5862903f84ebSVíctor Colombo {
5863903f84ebSVíctor Colombo     /*
5864e6a19a64SMichael Tokarev      * it's the OS responsibility to generate a random value for the registers
5865903f84ebSVíctor Colombo      * in each process' context. So, initialize it with 0 here.
5866903f84ebSVíctor Colombo      */
5867903f84ebSVíctor Colombo     uint64_t hashkeyr_initial_value = 0, hashpkeyr_initial_value = 0;
5868903f84ebSVíctor Colombo #if defined(CONFIG_USER_ONLY)
5869903f84ebSVíctor Colombo     /* in linux-user, setup the hash register with a random value */
5870903f84ebSVíctor Colombo     GRand *rand = g_rand_new();
5871903f84ebSVíctor Colombo     hashkeyr_initial_value =
5872903f84ebSVíctor Colombo         ((uint64_t)g_rand_int(rand) << 32) | (uint64_t)g_rand_int(rand);
5873903f84ebSVíctor Colombo     hashpkeyr_initial_value =
5874903f84ebSVíctor Colombo         ((uint64_t)g_rand_int(rand) << 32) | (uint64_t)g_rand_int(rand);
5875903f84ebSVíctor Colombo     g_rand_free(rand);
5876903f84ebSVíctor Colombo #endif
5877843b243fSShivaprasad G Bhat     spr_register_kvm(env, SPR_HASHKEYR, "HASHKEYR",
5878903f84ebSVíctor Colombo             SPR_NOACCESS, SPR_NOACCESS,
5879903f84ebSVíctor Colombo             &spr_read_generic, &spr_write_generic,
5880843b243fSShivaprasad G Bhat             KVM_REG_PPC_HASHKEYR, hashkeyr_initial_value);
5881c0840b46SShivaprasad G Bhat     spr_register_kvm_hv(env, SPR_HASHPKEYR, "HASHPKEYR",
5882903f84ebSVíctor Colombo             SPR_NOACCESS, SPR_NOACCESS,
5883903f84ebSVíctor Colombo             SPR_NOACCESS, SPR_NOACCESS,
5884903f84ebSVíctor Colombo             &spr_read_generic, &spr_write_generic,
5885c0840b46SShivaprasad G Bhat             KVM_REG_PPC_HASHPKEYR, hashpkeyr_initial_value);
5886903f84ebSVíctor Colombo }
5887903f84ebSVíctor Colombo 
register_power10_dexcr_sprs(CPUPPCState * env)5888395b5d5bSNicholas Miehlbradt static void register_power10_dexcr_sprs(CPUPPCState *env)
5889395b5d5bSNicholas Miehlbradt {
5890ca85beb4SShivaprasad G Bhat     spr_register_kvm(env, SPR_DEXCR, "DEXCR",
5891395b5d5bSNicholas Miehlbradt             SPR_NOACCESS, SPR_NOACCESS,
5892ca85beb4SShivaprasad G Bhat             &spr_read_generic, &spr_write_generic, KVM_REG_PPC_DEXCR,
5893395b5d5bSNicholas Miehlbradt             0);
5894395b5d5bSNicholas Miehlbradt 
5895a5116b95SNicholas Piggin     spr_register(env, SPR_UDEXCR, "UDEXCR",
5896395b5d5bSNicholas Miehlbradt             &spr_read_dexcr_ureg, SPR_NOACCESS,
5897395b5d5bSNicholas Miehlbradt             &spr_read_dexcr_ureg, SPR_NOACCESS,
5898395b5d5bSNicholas Miehlbradt             0);
5899395b5d5bSNicholas Miehlbradt 
5900395b5d5bSNicholas Miehlbradt     spr_register_hv(env, SPR_HDEXCR, "HDEXCR",
5901395b5d5bSNicholas Miehlbradt             SPR_NOACCESS, SPR_NOACCESS,
5902395b5d5bSNicholas Miehlbradt             SPR_NOACCESS, SPR_NOACCESS,
5903978897a5SBenjamin Gray             &spr_read_generic, &spr_write_generic,
5904395b5d5bSNicholas Miehlbradt             0);
5905395b5d5bSNicholas Miehlbradt 
5906a5116b95SNicholas Piggin     spr_register(env, SPR_UHDEXCR, "UHDEXCR",
5907395b5d5bSNicholas Miehlbradt             &spr_read_dexcr_ureg, SPR_NOACCESS,
5908395b5d5bSNicholas Miehlbradt             &spr_read_dexcr_ureg, SPR_NOACCESS,
5909395b5d5bSNicholas Miehlbradt             0);
5910395b5d5bSNicholas Miehlbradt }
5911395b5d5bSNicholas Miehlbradt 
59128f2e9d40SDaniel Henrique Barboza /*
59138f2e9d40SDaniel Henrique Barboza  * Initialize PMU counter overflow timers for Power8 and
59148f2e9d40SDaniel Henrique Barboza  * newer Power chips when using TCG.
59158f2e9d40SDaniel Henrique Barboza  */
init_tcg_pmu_power8(CPUPPCState * env)59168f2e9d40SDaniel Henrique Barboza static void init_tcg_pmu_power8(CPUPPCState *env)
59178f2e9d40SDaniel Henrique Barboza {
59188f2e9d40SDaniel Henrique Barboza     /* Init PMU overflow timers */
591933edcde7SDaniel Henrique Barboza     if (tcg_enabled()) {
59208f2e9d40SDaniel Henrique Barboza         cpu_ppc_pmu_init(env);
59218f2e9d40SDaniel Henrique Barboza     }
59228f2e9d40SDaniel Henrique Barboza }
59238f2e9d40SDaniel Henrique Barboza 
init_proc_book3s_common(CPUPPCState * env)59243e770bf7SBruno Larsen (billionai) static void init_proc_book3s_common(CPUPPCState *env)
59253e770bf7SBruno Larsen (billionai) {
5926217781afSFabiano Rosas     register_non_embedded_sprs(env);
59273e770bf7SBruno Larsen (billionai)     register_book3s_altivec_sprs(env);
59283e770bf7SBruno Larsen (billionai)     register_book3s_pmu_sup_sprs(env);
59293e770bf7SBruno Larsen (billionai)     register_book3s_pmu_user_sprs(env);
59303e770bf7SBruno Larsen (billionai)     register_book3s_ctrl_sprs(env);
59313e770bf7SBruno Larsen (billionai)     /*
59323e770bf7SBruno Larsen (billionai)      * Can't find information on what this should be on reset.  This
59333e770bf7SBruno Larsen (billionai)      * value is the one used by 74xx processors.
59343e770bf7SBruno Larsen (billionai)      */
59353e770bf7SBruno Larsen (billionai)     vscr_init(env, 0x00010000);
59362a48d83dSFabiano Rosas 
59372a48d83dSFabiano Rosas     spr_register(env, SPR_USPRG3, "USPRG3",
59382a48d83dSFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
59392a48d83dSFabiano Rosas                  &spr_read_ureg, SPR_NOACCESS,
59402a48d83dSFabiano Rosas                  0x00000000);
59413e770bf7SBruno Larsen (billionai) }
59423e770bf7SBruno Larsen (billionai) 
init_proc_970(CPUPPCState * env)59433e770bf7SBruno Larsen (billionai) static void init_proc_970(CPUPPCState *env)
59443e770bf7SBruno Larsen (billionai) {
59453e770bf7SBruno Larsen (billionai)     /* Common Registers */
59463e770bf7SBruno Larsen (billionai)     init_proc_book3s_common(env);
59473e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
59483e770bf7SBruno Larsen (billionai)     register_book3s_dbg_sprs(env);
59493e770bf7SBruno Larsen (billionai) 
59503e770bf7SBruno Larsen (billionai)     /* 970 Specific Registers */
59513e770bf7SBruno Larsen (billionai)     register_970_hid_sprs(env);
59523e770bf7SBruno Larsen (billionai)     register_970_hior_sprs(env);
59533e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
59543e770bf7SBruno Larsen (billionai)     register_970_pmu_sup_sprs(env);
59553e770bf7SBruno Larsen (billionai)     register_970_pmu_user_sprs(env);
59563e770bf7SBruno Larsen (billionai)     register_970_lpar_sprs(env);
59573e770bf7SBruno Larsen (billionai)     register_970_dbg_sprs(env);
59583e770bf7SBruno Larsen (billionai) 
59593e770bf7SBruno Larsen (billionai)     /* env variables */
59603e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 128;
59613e770bf7SBruno Larsen (billionai)     env->icache_line_size = 128;
59623e770bf7SBruno Larsen (billionai) 
59633e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
59643e770bf7SBruno Larsen (billionai)     init_excp_970(env);
59653e770bf7SBruno Larsen (billionai)     ppc970_irq_init(env_archcpu(env));
59663e770bf7SBruno Larsen (billionai) }
59673e770bf7SBruno Larsen (billionai) 
59683e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
59693e770bf7SBruno Larsen (billionai) {
59703e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
59713e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
59723e770bf7SBruno Larsen (billionai) 
59733e770bf7SBruno Larsen (billionai)     dc->desc = "PowerPC 970";
59743e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_970;
59753e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_970;
597645693f94SNicholas Piggin     pcc->check_attn = check_attn_hid0;
59773e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
59783e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
59793e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
59803e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
59813e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
59823e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
59833e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
59843e770bf7SBruno Larsen (billionai)                        PPC_64B | PPC_ALTIVEC |
59853e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT_64B | PPC_SLBI;
598603abfd90SNicholas Piggin     pcc->insns_flags2 = PPC2_FP_CVT_S64 | PPC2_MEM_LWSYNC;
59873e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_SF) |
59883e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VR) |
59893e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
59903e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
59913e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
59923e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
59933e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
59943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
59953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
59963e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
59973e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
59983e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
59993e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
60003e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
60013e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI);
60023e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_64B;
6003227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
60043e770bf7SBruno Larsen (billionai)     pcc->hash64_opts = &ppc_hash64_opts_basic;
60053e770bf7SBruno Larsen (billionai) #endif
60063e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_970;
60073e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_970;
60083e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc64;
60093e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
60103e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
60113e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
60123e770bf7SBruno Larsen (billionai)     pcc->l1_dcache_size = 0x8000;
60133e770bf7SBruno Larsen (billionai)     pcc->l1_icache_size = 0x10000;
60143e770bf7SBruno Larsen (billionai) }
60153e770bf7SBruno Larsen (billionai) 
init_proc_power5plus(CPUPPCState * env)60163e770bf7SBruno Larsen (billionai) static void init_proc_power5plus(CPUPPCState *env)
60173e770bf7SBruno Larsen (billionai) {
60183e770bf7SBruno Larsen (billionai)     /* Common Registers */
60193e770bf7SBruno Larsen (billionai)     init_proc_book3s_common(env);
60203e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
60213e770bf7SBruno Larsen (billionai)     register_book3s_dbg_sprs(env);
60223e770bf7SBruno Larsen (billionai) 
60233e770bf7SBruno Larsen (billionai)     /* POWER5+ Specific Registers */
60243e770bf7SBruno Larsen (billionai)     register_970_hid_sprs(env);
60253e770bf7SBruno Larsen (billionai)     register_970_hior_sprs(env);
60263e770bf7SBruno Larsen (billionai)     register_low_BATs(env);
60273e770bf7SBruno Larsen (billionai)     register_970_pmu_sup_sprs(env);
60283e770bf7SBruno Larsen (billionai)     register_970_pmu_user_sprs(env);
60293e770bf7SBruno Larsen (billionai)     register_power5p_common_sprs(env);
60303e770bf7SBruno Larsen (billionai)     register_power5p_lpar_sprs(env);
60313e770bf7SBruno Larsen (billionai)     register_power5p_ear_sprs(env);
60323e770bf7SBruno Larsen (billionai)     register_power5p_tb_sprs(env);
60333e770bf7SBruno Larsen (billionai) 
60343e770bf7SBruno Larsen (billionai)     /* env variables */
60353e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 128;
60363e770bf7SBruno Larsen (billionai)     env->icache_line_size = 128;
60373e770bf7SBruno Larsen (billionai) 
60383e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
60393e770bf7SBruno Larsen (billionai)     init_excp_970(env);
60403e770bf7SBruno Larsen (billionai)     ppc970_irq_init(env_archcpu(env));
60413e770bf7SBruno Larsen (billionai) }
60423e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(POWER5P)60433e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
60443e770bf7SBruno Larsen (billionai) {
60453e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
60463e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
60473e770bf7SBruno Larsen (billionai) 
60483e770bf7SBruno Larsen (billionai)     dc->fw_name = "PowerPC,POWER5";
60493e770bf7SBruno Larsen (billionai)     dc->desc = "POWER5+";
60503e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_power5plus;
60513e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_970;
605245693f94SNicholas Piggin     pcc->check_attn = check_attn_hid0;
60533e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
60543e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
60553e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
60563e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
605791137619SCédric Le Goater                        PPC_FLOAT_EXT |
60583e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
60593e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
60603e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
60613e770bf7SBruno Larsen (billionai)                        PPC_64B |
606223ab6d88SCédric Le Goater                        PPC_POPCNTB |
60633e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT_64B | PPC_SLBI;
606403abfd90SNicholas Piggin     pcc->insns_flags2 = PPC2_FP_CVT_S64 | PPC2_MEM_LWSYNC;
60653e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_SF) |
60663e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VR) |
60673e770bf7SBruno Larsen (billionai)                     (1ull << MSR_POW) |
60683e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
60693e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
60703e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
60713e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
60723e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
60733e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
60743e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
60753e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
60763e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
60773e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
60783e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
60793e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI);
60803e770bf7SBruno Larsen (billionai)     pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 |
60813e770bf7SBruno Larsen (billionai)         LPCR_RMI | LPCR_HDICE;
60823e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_2_03;
6083227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
60843e770bf7SBruno Larsen (billionai)     pcc->hash64_opts = &ppc_hash64_opts_basic;
60853e770bf7SBruno Larsen (billionai)     pcc->lrg_decr_bits = 32;
60863e770bf7SBruno Larsen (billionai) #endif
60873e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_970;
60883e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_970;
60893e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc64;
60903e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
60913e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
60923e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK;
60933e770bf7SBruno Larsen (billionai)     pcc->l1_dcache_size = 0x8000;
60943e770bf7SBruno Larsen (billionai)     pcc->l1_icache_size = 0x10000;
60953e770bf7SBruno Larsen (billionai) }
60963e770bf7SBruno Larsen (billionai) 
init_proc_POWER7(CPUPPCState * env)60973e770bf7SBruno Larsen (billionai) static void init_proc_POWER7(CPUPPCState *env)
60983e770bf7SBruno Larsen (billionai) {
60993e770bf7SBruno Larsen (billionai)     /* Common Registers */
61003e770bf7SBruno Larsen (billionai)     init_proc_book3s_common(env);
61013e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
61023e770bf7SBruno Larsen (billionai)     register_book3s_dbg_sprs(env);
61033e770bf7SBruno Larsen (billionai) 
61043e770bf7SBruno Larsen (billionai)     /* POWER7 Specific Registers */
61053e770bf7SBruno Larsen (billionai)     register_book3s_ids_sprs(env);
61063e770bf7SBruno Larsen (billionai)     register_rmor_sprs(env);
61073e770bf7SBruno Larsen (billionai)     register_amr_sprs(env);
61083e770bf7SBruno Larsen (billionai)     register_book3s_purr_sprs(env);
61093e770bf7SBruno Larsen (billionai)     register_power5p_common_sprs(env);
61103e770bf7SBruno Larsen (billionai)     register_power5p_lpar_sprs(env);
61113e770bf7SBruno Larsen (billionai)     register_power5p_ear_sprs(env);
61123e770bf7SBruno Larsen (billionai)     register_power5p_tb_sprs(env);
61133e770bf7SBruno Larsen (billionai)     register_power6_common_sprs(env);
6114a3c020d8SNicholas Piggin     register_HEIR32_spr(env);
61153e770bf7SBruno Larsen (billionai)     register_power6_dbg_sprs(env);
61161cbcbcb8SNicholas Piggin     register_power7_common_sprs(env);
61173e770bf7SBruno Larsen (billionai)     register_power7_book4_sprs(env);
61183e770bf7SBruno Larsen (billionai) 
61193e770bf7SBruno Larsen (billionai)     /* env variables */
61203e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 128;
61213e770bf7SBruno Larsen (billionai)     env->icache_line_size = 128;
61223e770bf7SBruno Larsen (billionai) 
61233e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
61243e770bf7SBruno Larsen (billionai)     init_excp_POWER7(env);
61253e770bf7SBruno Larsen (billionai)     ppcPOWER7_irq_init(env_archcpu(env));
61263e770bf7SBruno Larsen (billionai) }
61273e770bf7SBruno Larsen (billionai) 
ppc_pvr_match_power7(PowerPCCPUClass * pcc,uint32_t pvr,bool best)612821d3a78eSNicholas Piggin static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
61293e770bf7SBruno Larsen (billionai) {
613021d3a78eSNicholas Piggin     uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
613121d3a78eSNicholas Piggin     uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
613221d3a78eSNicholas Piggin 
613321d3a78eSNicholas Piggin     if (!best) {
613421d3a78eSNicholas Piggin         if (base == CPU_POWERPC_POWER7_BASE) {
61353e770bf7SBruno Larsen (billionai)             return true;
61363e770bf7SBruno Larsen (billionai)         }
613721d3a78eSNicholas Piggin         if (base == CPU_POWERPC_POWER7P_BASE) {
61383e770bf7SBruno Larsen (billionai)             return true;
61393e770bf7SBruno Larsen (billionai)         }
614021d3a78eSNicholas Piggin     }
614121d3a78eSNicholas Piggin 
614221d3a78eSNicholas Piggin     if (base != pcc_base) {
61433e770bf7SBruno Larsen (billionai)         return false;
61443e770bf7SBruno Larsen (billionai)     }
61453e770bf7SBruno Larsen (billionai) 
614621d3a78eSNicholas Piggin     return true;
614721d3a78eSNicholas Piggin }
614821d3a78eSNicholas Piggin 
POWERPC_FAMILY(POWER7)61493e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
61503e770bf7SBruno Larsen (billionai) {
61513e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
61523e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
61533e770bf7SBruno Larsen (billionai) 
61543e770bf7SBruno Larsen (billionai)     dc->fw_name = "PowerPC,POWER7";
61553e770bf7SBruno Larsen (billionai)     dc->desc = "POWER7";
61563e770bf7SBruno Larsen (billionai)     pcc->pvr_match = ppc_pvr_match_power7;
61573e770bf7SBruno Larsen (billionai)     pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05;
61583e770bf7SBruno Larsen (billionai)     pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
61593e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_POWER7;
61603e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
616145693f94SNicholas Piggin     pcc->check_attn = check_attn_hid0;
61623e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
61633e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
61643e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
61653e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTES |
61663e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
61673e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_EXT |
61683e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
61693e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
61703e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
61713e770bf7SBruno Larsen (billionai)                        PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
61723e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT_64B | PPC_SLBI |
61733e770bf7SBruno Larsen (billionai)                        PPC_POPCNTB | PPC_POPCNTWD |
61743e770bf7SBruno Larsen (billionai)                        PPC_CILDST;
61753e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205 |
61763e770bf7SBruno Larsen (billionai)                         PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
61773e770bf7SBruno Larsen (billionai)                         PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
61783e770bf7SBruno Larsen (billionai)                         PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 |
61794dc5f8abSMatheus Ferst                         PPC2_PM_ISA206 | PPC2_MEM_LWSYNC | PPC2_BCDA_ISA206;
61803e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_SF) |
61813e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VR) |
61823e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VSX) |
61833e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
61843e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
61853e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
61863e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
61873e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
61883e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
61893e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
61903e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
61913e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
61923e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
61933e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
61943e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
61953e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
61963e770bf7SBruno Larsen (billionai)     pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
61973e770bf7SBruno Larsen (billionai)         LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
61983e770bf7SBruno Larsen (billionai)         LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
61993e770bf7SBruno Larsen (billionai)         LPCR_MER | LPCR_TC |
62003e770bf7SBruno Larsen (billionai)         LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE;
62013e770bf7SBruno Larsen (billionai)     pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
62023e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_2_06;
6203227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
62043e770bf7SBruno Larsen (billionai)     pcc->hash64_opts = &ppc_hash64_opts_POWER7;
62053e770bf7SBruno Larsen (billionai)     pcc->lrg_decr_bits = 32;
62063e770bf7SBruno Larsen (billionai) #endif
62073e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_POWER7;
62083e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
62093e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc64;
62103e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
62113e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
62123e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
62133e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_VSX;
62143e770bf7SBruno Larsen (billionai)     pcc->l1_dcache_size = 0x8000;
62153e770bf7SBruno Larsen (billionai)     pcc->l1_icache_size = 0x8000;
62163e770bf7SBruno Larsen (billionai) }
62173e770bf7SBruno Larsen (billionai) 
bhrb_init_state(CPUPPCState * env,target_long num_entries_log2)62184de4a470SGlenn Miles static void bhrb_init_state(CPUPPCState *env, target_long num_entries_log2)
62194de4a470SGlenn Miles {
62204de4a470SGlenn Miles     if (env->flags & POWERPC_FLAG_BHRB) {
62214de4a470SGlenn Miles         if (num_entries_log2 > BHRB_MAX_NUM_ENTRIES_LOG2) {
62224de4a470SGlenn Miles             num_entries_log2 = BHRB_MAX_NUM_ENTRIES_LOG2;
62234de4a470SGlenn Miles         }
62244de4a470SGlenn Miles         env->bhrb_num_entries = 1 << num_entries_log2;
62254de4a470SGlenn Miles         env->bhrb_base = (intptr_t)&env->bhrb[0];
62264de4a470SGlenn Miles         env->bhrb_offset_mask = (env->bhrb_num_entries * sizeof(uint64_t)) - 1;
62274de4a470SGlenn Miles     }
62284de4a470SGlenn Miles }
62294de4a470SGlenn Miles 
bhrb_reset_state(CPUPPCState * env)62304de4a470SGlenn Miles static void bhrb_reset_state(CPUPPCState *env)
62314de4a470SGlenn Miles {
62324de4a470SGlenn Miles     if (env->flags & POWERPC_FLAG_BHRB) {
62334de4a470SGlenn Miles         env->bhrb_offset = 0;
62344de4a470SGlenn Miles         env->bhrb_filter = 0;
62354de4a470SGlenn Miles         memset(env->bhrb, 0, sizeof(env->bhrb));
62364de4a470SGlenn Miles     }
62374de4a470SGlenn Miles }
62384de4a470SGlenn Miles 
62394de4a470SGlenn Miles #define POWER8_BHRB_ENTRIES_LOG2 5
init_proc_POWER8(CPUPPCState * env)62403e770bf7SBruno Larsen (billionai) static void init_proc_POWER8(CPUPPCState *env)
62413e770bf7SBruno Larsen (billionai) {
62423e770bf7SBruno Larsen (billionai)     /* Common Registers */
62433e770bf7SBruno Larsen (billionai)     init_proc_book3s_common(env);
62443e770bf7SBruno Larsen (billionai)     register_sdr1_sprs(env);
62453e770bf7SBruno Larsen (billionai)     register_book3s_207_dbg_sprs(env);
62463e770bf7SBruno Larsen (billionai) 
62478f2e9d40SDaniel Henrique Barboza     /* Common TCG PMU */
62488f2e9d40SDaniel Henrique Barboza     init_tcg_pmu_power8(env);
62498f2e9d40SDaniel Henrique Barboza 
62503e770bf7SBruno Larsen (billionai)     /* POWER8 Specific Registers */
62513e770bf7SBruno Larsen (billionai)     register_book3s_ids_sprs(env);
62523e770bf7SBruno Larsen (billionai)     register_rmor_sprs(env);
62533e770bf7SBruno Larsen (billionai)     register_amr_sprs(env);
62543e770bf7SBruno Larsen (billionai)     register_iamr_sprs(env);
62553e770bf7SBruno Larsen (billionai)     register_book3s_purr_sprs(env);
62563e770bf7SBruno Larsen (billionai)     register_power5p_common_sprs(env);
62573e770bf7SBruno Larsen (billionai)     register_power5p_lpar_sprs(env);
62583e770bf7SBruno Larsen (billionai)     register_power5p_ear_sprs(env);
62593e770bf7SBruno Larsen (billionai)     register_power5p_tb_sprs(env);
62603e770bf7SBruno Larsen (billionai)     register_power6_common_sprs(env);
6261a3c020d8SNicholas Piggin     register_HEIR32_spr(env);
62623e770bf7SBruno Larsen (billionai)     register_power6_dbg_sprs(env);
62631cbcbcb8SNicholas Piggin     register_power7_common_sprs(env);
62643e770bf7SBruno Larsen (billionai)     register_power8_tce_address_control_sprs(env);
62653e770bf7SBruno Larsen (billionai)     register_power8_ids_sprs(env);
62663e770bf7SBruno Larsen (billionai)     register_power8_ebb_sprs(env);
62673e770bf7SBruno Larsen (billionai)     register_power8_fscr_sprs(env);
62683e770bf7SBruno Larsen (billionai)     register_power8_pmu_sup_sprs(env);
62693e770bf7SBruno Larsen (billionai)     register_power8_pmu_user_sprs(env);
62703e770bf7SBruno Larsen (billionai)     register_power8_tm_sprs(env);
62713e770bf7SBruno Larsen (billionai)     register_power8_pspb_sprs(env);
62723e770bf7SBruno Larsen (billionai)     register_power8_dpdes_sprs(env);
62733e770bf7SBruno Larsen (billionai)     register_vtb_sprs(env);
62743e770bf7SBruno Larsen (billionai)     register_power8_ic_sprs(env);
62753e770bf7SBruno Larsen (billionai)     register_power8_book4_sprs(env);
62763e770bf7SBruno Larsen (billionai)     register_power8_rpr_sprs(env);
62773e770bf7SBruno Larsen (billionai) 
62783e770bf7SBruno Larsen (billionai)     /* env variables */
62793e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 128;
62803e770bf7SBruno Larsen (billionai)     env->icache_line_size = 128;
62813e770bf7SBruno Larsen (billionai) 
62824de4a470SGlenn Miles     bhrb_init_state(env, POWER8_BHRB_ENTRIES_LOG2);
62834de4a470SGlenn Miles 
62843e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
62853e770bf7SBruno Larsen (billionai)     init_excp_POWER8(env);
62863e770bf7SBruno Larsen (billionai)     ppcPOWER7_irq_init(env_archcpu(env));
62873e770bf7SBruno Larsen (billionai) }
62883e770bf7SBruno Larsen (billionai) 
ppc_pvr_match_power8(PowerPCCPUClass * pcc,uint32_t pvr,bool best)628921d3a78eSNicholas Piggin static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
62903e770bf7SBruno Larsen (billionai) {
629121d3a78eSNicholas Piggin     uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
629221d3a78eSNicholas Piggin     uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
629321d3a78eSNicholas Piggin 
629421d3a78eSNicholas Piggin     if (!best) {
629521d3a78eSNicholas Piggin         if (base == CPU_POWERPC_POWER8_BASE) {
62963e770bf7SBruno Larsen (billionai)             return true;
62973e770bf7SBruno Larsen (billionai)         }
629821d3a78eSNicholas Piggin         if (base == CPU_POWERPC_POWER8E_BASE) {
62993e770bf7SBruno Larsen (billionai)             return true;
63003e770bf7SBruno Larsen (billionai)         }
630121d3a78eSNicholas Piggin         if (base == CPU_POWERPC_POWER8NVL_BASE) {
63023e770bf7SBruno Larsen (billionai)             return true;
63033e770bf7SBruno Larsen (billionai)         }
630421d3a78eSNicholas Piggin     }
630521d3a78eSNicholas Piggin     if (base != pcc_base) {
63063e770bf7SBruno Larsen (billionai)         return false;
63073e770bf7SBruno Larsen (billionai)     }
63083e770bf7SBruno Larsen (billionai) 
630921d3a78eSNicholas Piggin     return true;
631021d3a78eSNicholas Piggin }
631121d3a78eSNicholas Piggin 
POWERPC_FAMILY(POWER8)63123e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
63133e770bf7SBruno Larsen (billionai) {
63143e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
63153e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
63163e770bf7SBruno Larsen (billionai) 
63173e770bf7SBruno Larsen (billionai)     dc->fw_name = "PowerPC,POWER8";
63183e770bf7SBruno Larsen (billionai)     dc->desc = "POWER8";
63193e770bf7SBruno Larsen (billionai)     pcc->pvr_match = ppc_pvr_match_power8;
63203e770bf7SBruno Larsen (billionai)     pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
63213e770bf7SBruno Larsen (billionai)     pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
63223e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_POWER8;
63233e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
632445693f94SNicholas Piggin     pcc->check_attn = check_attn_hid0;
63253e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
63263e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
63273e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
63283e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTES |
63293e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
63303e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_EXT |
63313e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
63323e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
63333e770bf7SBruno Larsen (billionai)                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
63343e770bf7SBruno Larsen (billionai)                        PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
63353e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT_64B | PPC_SLBI |
63363e770bf7SBruno Larsen (billionai)                        PPC_POPCNTB | PPC_POPCNTWD |
63373e770bf7SBruno Larsen (billionai)                        PPC_CILDST;
63383e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
63393e770bf7SBruno Larsen (billionai)                         PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
63403e770bf7SBruno Larsen (billionai)                         PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
63413e770bf7SBruno Larsen (billionai)                         PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
63423e770bf7SBruno Larsen (billionai)                         PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
63433e770bf7SBruno Larsen (billionai)                         PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
63444dc5f8abSMatheus Ferst                         PPC2_TM | PPC2_PM_ISA206 | PPC2_MEM_LWSYNC |
63454dc5f8abSMatheus Ferst                         PPC2_BCDA_ISA206;
63463e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_SF) |
63473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_HV) |
63483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TM) |
63493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VR) |
63503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VSX) |
63513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
63523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
63533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
63543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
63553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
63563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
63573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
63583e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
63593e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
63603e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
63613e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
63623e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
63633e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TS0) |
63643e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TS1) |
63653e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
63663e770bf7SBruno Larsen (billionai)     pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
63673e770bf7SBruno Larsen (billionai)         LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
63683e770bf7SBruno Larsen (billionai)         LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
63693e770bf7SBruno Larsen (billionai)         LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
63703e770bf7SBruno Larsen (billionai)         LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE;
63713e770bf7SBruno Larsen (billionai)     pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
63723e770bf7SBruno Larsen (billionai)                    LPCR_P8_PECE3 | LPCR_P8_PECE4;
63733e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_2_07;
6374227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
63753e770bf7SBruno Larsen (billionai)     pcc->hash64_opts = &ppc_hash64_opts_POWER7;
63763e770bf7SBruno Larsen (billionai)     pcc->lrg_decr_bits = 32;
63773e770bf7SBruno Larsen (billionai)     pcc->n_host_threads = 8;
63783e770bf7SBruno Larsen (billionai) #endif
63793e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_POWER8;
63803e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
63813e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc64;
63823e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
63833e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
63843e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
63853e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
63863e770bf7SBruno Larsen (billionai)     pcc->l1_dcache_size = 0x8000;
63873e770bf7SBruno Larsen (billionai)     pcc->l1_icache_size = 0x8000;
63883e770bf7SBruno Larsen (billionai) }
63893e770bf7SBruno Larsen (billionai) 
6390227776b7SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
63913e770bf7SBruno Larsen (billionai) /*
63923e770bf7SBruno Larsen (billionai)  * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
63933e770bf7SBruno Larsen (billionai)  * Encoded as array of int_32s in the form:
63943e770bf7SBruno Larsen (billionai)  *  0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
63953e770bf7SBruno Larsen (billionai)  *  x -> AP encoding
63963e770bf7SBruno Larsen (billionai)  *  y -> radix mode supported page size (encoded as a shift)
63973e770bf7SBruno Larsen (billionai)  */
63983e770bf7SBruno Larsen (billionai) static struct ppc_radix_page_info POWER9_radix_page_info = {
63993e770bf7SBruno Larsen (billionai)     .count = 4,
64003e770bf7SBruno Larsen (billionai)     .entries = {
64013e770bf7SBruno Larsen (billionai)         0x0000000c, /*  4K - enc: 0x0 */
64023e770bf7SBruno Larsen (billionai)         0xa0000010, /* 64K - enc: 0x5 */
64033e770bf7SBruno Larsen (billionai)         0x20000015, /*  2M - enc: 0x1 */
64043e770bf7SBruno Larsen (billionai)         0x4000001e  /*  1G - enc: 0x2 */
64053e770bf7SBruno Larsen (billionai)     }
64063e770bf7SBruno Larsen (billionai) };
6407227776b7SPhilippe Mathieu-Daudé #endif /* CONFIG_USER_ONLY */
64083e770bf7SBruno Larsen (billionai) 
64094de4a470SGlenn Miles #define POWER9_BHRB_ENTRIES_LOG2 5
init_proc_POWER9(CPUPPCState * env)64103e770bf7SBruno Larsen (billionai) static void init_proc_POWER9(CPUPPCState *env)
64113e770bf7SBruno Larsen (billionai) {
64123e770bf7SBruno Larsen (billionai)     /* Common Registers */
64133e770bf7SBruno Larsen (billionai)     init_proc_book3s_common(env);
64143e770bf7SBruno Larsen (billionai)     register_book3s_207_dbg_sprs(env);
64153e770bf7SBruno Larsen (billionai) 
64168f2e9d40SDaniel Henrique Barboza     /* Common TCG PMU */
64178f2e9d40SDaniel Henrique Barboza     init_tcg_pmu_power8(env);
64188f2e9d40SDaniel Henrique Barboza 
64193e770bf7SBruno Larsen (billionai)     /* POWER8 Specific Registers */
64203e770bf7SBruno Larsen (billionai)     register_book3s_ids_sprs(env);
64213e770bf7SBruno Larsen (billionai)     register_amr_sprs(env);
64223e770bf7SBruno Larsen (billionai)     register_iamr_sprs(env);
64233e770bf7SBruno Larsen (billionai)     register_book3s_purr_sprs(env);
64243e770bf7SBruno Larsen (billionai)     register_power5p_common_sprs(env);
64253e770bf7SBruno Larsen (billionai)     register_power5p_lpar_sprs(env);
64263e770bf7SBruno Larsen (billionai)     register_power5p_ear_sprs(env);
64273e770bf7SBruno Larsen (billionai)     register_power5p_tb_sprs(env);
64283e770bf7SBruno Larsen (billionai)     register_power6_common_sprs(env);
6429a3c020d8SNicholas Piggin     register_HEIR32_spr(env);
64303e770bf7SBruno Larsen (billionai)     register_power6_dbg_sprs(env);
64311cbcbcb8SNicholas Piggin     register_power7_common_sprs(env);
64323e770bf7SBruno Larsen (billionai)     register_power8_tce_address_control_sprs(env);
64333e770bf7SBruno Larsen (billionai)     register_power8_ids_sprs(env);
64343e770bf7SBruno Larsen (billionai)     register_power8_ebb_sprs(env);
64353e770bf7SBruno Larsen (billionai)     register_power8_fscr_sprs(env);
64363e770bf7SBruno Larsen (billionai)     register_power8_pmu_sup_sprs(env);
64373e770bf7SBruno Larsen (billionai)     register_power8_pmu_user_sprs(env);
64383e770bf7SBruno Larsen (billionai)     register_power8_tm_sprs(env);
64393e770bf7SBruno Larsen (billionai)     register_power8_pspb_sprs(env);
64403e770bf7SBruno Larsen (billionai)     register_power8_dpdes_sprs(env);
64413e770bf7SBruno Larsen (billionai)     register_vtb_sprs(env);
64423e770bf7SBruno Larsen (billionai)     register_power8_ic_sprs(env);
64436f967f4fSNicholas Piggin     register_power9_book4_sprs(env);
64443e770bf7SBruno Larsen (billionai)     register_power8_rpr_sprs(env);
64453e770bf7SBruno Larsen (billionai)     register_power9_mmu_sprs(env);
64463e770bf7SBruno Larsen (billionai) 
64473e770bf7SBruno Larsen (billionai)     /* POWER9 Specific registers */
64483e770bf7SBruno Larsen (billionai)     spr_register_kvm(env, SPR_TIDR, "TIDR", NULL, NULL,
64493e770bf7SBruno Larsen (billionai)                      spr_read_generic, spr_write_generic,
64503e770bf7SBruno Larsen (billionai)                      KVM_REG_PPC_TIDR, 0);
64513e770bf7SBruno Larsen (billionai) 
64523e770bf7SBruno Larsen (billionai)     /* FIXME: Filter fields properly based on privilege level */
64533e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
64543e770bf7SBruno Larsen (billionai)                         spr_read_generic, spr_write_generic,
64553e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_PSSCR, 0);
64563e770bf7SBruno Larsen (billionai) 
64573e770bf7SBruno Larsen (billionai)     /* env variables */
64583e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 128;
64593e770bf7SBruno Larsen (billionai)     env->icache_line_size = 128;
64603e770bf7SBruno Larsen (billionai) 
64614de4a470SGlenn Miles     bhrb_init_state(env, POWER9_BHRB_ENTRIES_LOG2);
64624de4a470SGlenn Miles 
64633e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
64643e770bf7SBruno Larsen (billionai)     init_excp_POWER9(env);
64653e770bf7SBruno Larsen (billionai)     ppcPOWER9_irq_init(env_archcpu(env));
64663e770bf7SBruno Larsen (billionai) }
64673e770bf7SBruno Larsen (billionai) 
ppc_pvr_match_power9(PowerPCCPUClass * pcc,uint32_t pvr,bool best)646821d3a78eSNicholas Piggin static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
64693e770bf7SBruno Larsen (billionai) {
647021d3a78eSNicholas Piggin     uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
647121d3a78eSNicholas Piggin     uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
647221d3a78eSNicholas Piggin 
647321d3a78eSNicholas Piggin     if (!best) {
647421d3a78eSNicholas Piggin         if (base == CPU_POWERPC_POWER9_BASE) {
64753e770bf7SBruno Larsen (billionai)             return true;
64763e770bf7SBruno Larsen (billionai)         }
647721d3a78eSNicholas Piggin     }
647821d3a78eSNicholas Piggin 
647921d3a78eSNicholas Piggin     if (base != pcc_base) {
648021d3a78eSNicholas Piggin         return false;
648121d3a78eSNicholas Piggin     }
648221d3a78eSNicholas Piggin 
6483277ee172SNicholas Piggin     if ((pvr & 0x0f00) != (pcc->pvr & 0x0f00)) {
6484277ee172SNicholas Piggin         /* Major DD version does not match */
6485277ee172SNicholas Piggin         return false;
6486277ee172SNicholas Piggin     }
6487277ee172SNicholas Piggin 
64888f054d9eSNicholas Piggin     if ((pvr & 0x0f00) == 0x200) {
6489277ee172SNicholas Piggin         if ((pvr & 0xf) < 2) {
6490277ee172SNicholas Piggin             /* DD2.0, DD2.1 match power9_v2.0 */
6491277ee172SNicholas Piggin             if ((pcc->pvr & 0xf) == 0) {
6492277ee172SNicholas Piggin                 return true;
6493277ee172SNicholas Piggin             }
6494277ee172SNicholas Piggin         } else {
6495277ee172SNicholas Piggin             /* DD2.2, DD2.3 match power9_v2.2 */
6496277ee172SNicholas Piggin             if ((pcc->pvr & 0xf) == 2) {
6497277ee172SNicholas Piggin                 return true;
6498277ee172SNicholas Piggin             }
6499277ee172SNicholas Piggin         }
650021d3a78eSNicholas Piggin     }
650121d3a78eSNicholas Piggin 
65023e770bf7SBruno Larsen (billionai)     return false;
65033e770bf7SBruno Larsen (billionai) }
65043e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(POWER9)65053e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
65063e770bf7SBruno Larsen (billionai) {
65073e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
65083e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
65093e770bf7SBruno Larsen (billionai) 
65103e770bf7SBruno Larsen (billionai)     dc->fw_name = "PowerPC,POWER9";
65113e770bf7SBruno Larsen (billionai)     dc->desc = "POWER9";
65123e770bf7SBruno Larsen (billionai)     pcc->pvr_match = ppc_pvr_match_power9;
65133e770bf7SBruno Larsen (billionai)     pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07;
65143e770bf7SBruno Larsen (billionai)     pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 |
65153e770bf7SBruno Larsen (billionai)                          PCR_COMPAT_2_05;
65163e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_POWER9;
65173e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
651845693f94SNicholas Piggin     pcc->check_attn = check_attn_hid0_power9;
65193e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
65203e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
65213e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
65223e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTES |
65233e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
65243e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_EXT |
65253e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
65263e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6527016b6e1dSLeandro Lupori                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
65283e770bf7SBruno Larsen (billionai)                        PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
65293e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT_64B | PPC_SLBI |
65303e770bf7SBruno Larsen (billionai)                        PPC_POPCNTB | PPC_POPCNTWD |
65313e770bf7SBruno Larsen (billionai)                        PPC_CILDST;
65323e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
65333e770bf7SBruno Larsen (billionai)                         PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
65343e770bf7SBruno Larsen (billionai)                         PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
65353e770bf7SBruno Larsen (billionai)                         PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
65363e770bf7SBruno Larsen (billionai)                         PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
65373e770bf7SBruno Larsen (billionai)                         PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
65384dc5f8abSMatheus Ferst                         PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL | PPC2_MEM_LWSYNC |
65394dc5f8abSMatheus Ferst                         PPC2_BCDA_ISA206;
65403e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_SF) |
65413e770bf7SBruno Larsen (billionai)                     (1ull << MSR_HV) |
65423e770bf7SBruno Larsen (billionai)                     (1ull << MSR_TM) |
65433e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VR) |
65443e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VSX) |
65453e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
65463e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
65473e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
65483e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
65493e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
65503e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
65513e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
65523e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
65533e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
65543e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
65553e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
65563e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
65573e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
65583e770bf7SBruno Larsen (billionai)     pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
65593e770bf7SBruno Larsen (billionai)         (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
65603e770bf7SBruno Larsen (billionai)         LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
65613e770bf7SBruno Larsen (billionai)         (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
65623e770bf7SBruno Larsen (billionai)                              LPCR_DEE | LPCR_OEE))
65633e770bf7SBruno Larsen (billionai)         | LPCR_MER | LPCR_GTSE | LPCR_TC |
65643e770bf7SBruno Larsen (billionai)         LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
65653e770bf7SBruno Larsen (billionai)     pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
65663e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_3_00;
6567227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
65683e770bf7SBruno Larsen (billionai)     /* segment page size remain the same */
65693e770bf7SBruno Larsen (billionai)     pcc->hash64_opts = &ppc_hash64_opts_POWER7;
65703e770bf7SBruno Larsen (billionai)     pcc->radix_page_info = &POWER9_radix_page_info;
65713e770bf7SBruno Larsen (billionai)     pcc->lrg_decr_bits = 56;
65723e770bf7SBruno Larsen (billionai)     pcc->n_host_threads = 4;
65733e770bf7SBruno Larsen (billionai) #endif
65743e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_POWER9;
65753e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
65763e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc64;
65773e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
65783e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
65793e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
65803e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_VSX | POWERPC_FLAG_TM | POWERPC_FLAG_SCV;
65813e770bf7SBruno Larsen (billionai)     pcc->l1_dcache_size = 0x8000;
65823e770bf7SBruno Larsen (billionai)     pcc->l1_icache_size = 0x8000;
65833e770bf7SBruno Larsen (billionai) }
65843e770bf7SBruno Larsen (billionai) 
6585227776b7SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
65863e770bf7SBruno Larsen (billionai) /*
65873e770bf7SBruno Larsen (billionai)  * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
65883e770bf7SBruno Larsen (billionai)  * Encoded as array of int_32s in the form:
65893e770bf7SBruno Larsen (billionai)  *  0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
65903e770bf7SBruno Larsen (billionai)  *  x -> AP encoding
65913e770bf7SBruno Larsen (billionai)  *  y -> radix mode supported page size (encoded as a shift)
65923e770bf7SBruno Larsen (billionai)  */
65933e770bf7SBruno Larsen (billionai) static struct ppc_radix_page_info POWER10_radix_page_info = {
65943e770bf7SBruno Larsen (billionai)     .count = 4,
65953e770bf7SBruno Larsen (billionai)     .entries = {
65963e770bf7SBruno Larsen (billionai)         0x0000000c, /*  4K - enc: 0x0 */
65973e770bf7SBruno Larsen (billionai)         0xa0000010, /* 64K - enc: 0x5 */
65983e770bf7SBruno Larsen (billionai)         0x20000015, /*  2M - enc: 0x1 */
65993e770bf7SBruno Larsen (billionai)         0x4000001e  /*  1G - enc: 0x2 */
66003e770bf7SBruno Larsen (billionai)     }
66013e770bf7SBruno Larsen (billionai) };
6602227776b7SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */
66033e770bf7SBruno Larsen (billionai) 
66044de4a470SGlenn Miles #define POWER10_BHRB_ENTRIES_LOG2 5
init_proc_POWER10(CPUPPCState * env)66053e770bf7SBruno Larsen (billionai) static void init_proc_POWER10(CPUPPCState *env)
66063e770bf7SBruno Larsen (billionai) {
66073e770bf7SBruno Larsen (billionai)     /* Common Registers */
66083e770bf7SBruno Larsen (billionai)     init_proc_book3s_common(env);
66093e770bf7SBruno Larsen (billionai)     register_book3s_207_dbg_sprs(env);
66103e770bf7SBruno Larsen (billionai) 
66118f2e9d40SDaniel Henrique Barboza     /* Common TCG PMU */
66128f2e9d40SDaniel Henrique Barboza     init_tcg_pmu_power8(env);
66138f2e9d40SDaniel Henrique Barboza 
66143e770bf7SBruno Larsen (billionai)     /* POWER8 Specific Registers */
66153e770bf7SBruno Larsen (billionai)     register_book3s_ids_sprs(env);
66163e770bf7SBruno Larsen (billionai)     register_amr_sprs(env);
66173e770bf7SBruno Larsen (billionai)     register_iamr_sprs(env);
66183e770bf7SBruno Larsen (billionai)     register_book3s_purr_sprs(env);
66193e770bf7SBruno Larsen (billionai)     register_power5p_common_sprs(env);
66203e770bf7SBruno Larsen (billionai)     register_power5p_lpar_sprs(env);
66213e770bf7SBruno Larsen (billionai)     register_power5p_ear_sprs(env);
66224e610064SFrederic Barrat     register_power5p_tb_sprs(env);
66233e770bf7SBruno Larsen (billionai)     register_power6_common_sprs(env);
6624a3c020d8SNicholas Piggin     register_HEIR64_spr(env);
66253e770bf7SBruno Larsen (billionai)     register_power6_dbg_sprs(env);
66261cbcbcb8SNicholas Piggin     register_power7_common_sprs(env);
66273e770bf7SBruno Larsen (billionai)     register_power8_tce_address_control_sprs(env);
66283e770bf7SBruno Larsen (billionai)     register_power8_ids_sprs(env);
66293e770bf7SBruno Larsen (billionai)     register_power8_ebb_sprs(env);
66303e770bf7SBruno Larsen (billionai)     register_power8_fscr_sprs(env);
66313e770bf7SBruno Larsen (billionai)     register_power8_pmu_sup_sprs(env);
66323e770bf7SBruno Larsen (billionai)     register_power8_pmu_user_sprs(env);
66333e770bf7SBruno Larsen (billionai)     register_power8_tm_sprs(env);
66343e770bf7SBruno Larsen (billionai)     register_power8_pspb_sprs(env);
66354e610064SFrederic Barrat     register_power8_dpdes_sprs(env);
66363e770bf7SBruno Larsen (billionai)     register_vtb_sprs(env);
66373e770bf7SBruno Larsen (billionai)     register_power8_ic_sprs(env);
66386f967f4fSNicholas Piggin     register_power9_book4_sprs(env);
66393e770bf7SBruno Larsen (billionai)     register_power8_rpr_sprs(env);
66403e770bf7SBruno Larsen (billionai)     register_power9_mmu_sprs(env);
6641903f84ebSVíctor Colombo     register_power10_hash_sprs(env);
6642395b5d5bSNicholas Miehlbradt     register_power10_dexcr_sprs(env);
66430b889323SMadhavan Srinivasan     register_power10_pmu_sup_sprs(env);
66440b889323SMadhavan Srinivasan     register_power10_pmu_user_sprs(env);
66453e770bf7SBruno Larsen (billionai) 
66463e770bf7SBruno Larsen (billionai)     /* FIXME: Filter fields properly based on privilege level */
66473e770bf7SBruno Larsen (billionai)     spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
66483e770bf7SBruno Larsen (billionai)                         spr_read_generic, spr_write_generic,
66493e770bf7SBruno Larsen (billionai)                         KVM_REG_PPC_PSSCR, 0);
66503e770bf7SBruno Larsen (billionai) 
66513e770bf7SBruno Larsen (billionai)     /* env variables */
66523e770bf7SBruno Larsen (billionai)     env->dcache_line_size = 128;
66533e770bf7SBruno Larsen (billionai)     env->icache_line_size = 128;
66543e770bf7SBruno Larsen (billionai) 
66554de4a470SGlenn Miles     bhrb_init_state(env, POWER10_BHRB_ENTRIES_LOG2);
66564de4a470SGlenn Miles 
66573e770bf7SBruno Larsen (billionai)     /* Allocate hardware IRQ controller */
66583e770bf7SBruno Larsen (billionai)     init_excp_POWER10(env);
66593e770bf7SBruno Larsen (billionai)     ppcPOWER9_irq_init(env_archcpu(env));
66603e770bf7SBruno Larsen (billionai) }
66613e770bf7SBruno Larsen (billionai) 
ppc_pvr_match_power10(PowerPCCPUClass * pcc,uint32_t pvr,bool best)666221d3a78eSNicholas Piggin static bool ppc_pvr_match_power10(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
66633e770bf7SBruno Larsen (billionai) {
666421d3a78eSNicholas Piggin     uint32_t base = pvr & CPU_POWERPC_POWER_SERVER_MASK;
666521d3a78eSNicholas Piggin     uint32_t pcc_base = pcc->pvr & CPU_POWERPC_POWER_SERVER_MASK;
666621d3a78eSNicholas Piggin 
666721d3a78eSNicholas Piggin     if (!best) {
666821d3a78eSNicholas Piggin         if (base == CPU_POWERPC_POWER10_BASE) {
66693e770bf7SBruno Larsen (billionai)             return true;
66703e770bf7SBruno Larsen (billionai)         }
667121d3a78eSNicholas Piggin     }
667221d3a78eSNicholas Piggin 
667321d3a78eSNicholas Piggin     if (base != pcc_base) {
667421d3a78eSNicholas Piggin         return false;
667521d3a78eSNicholas Piggin     }
667621d3a78eSNicholas Piggin 
667721d3a78eSNicholas Piggin     if ((pvr & 0x0f00) == (pcc->pvr & 0x0f00)) {
66788f054d9eSNicholas Piggin         /* Major DD version matches power10_v2.0 */
667921d3a78eSNicholas Piggin         return true;
668021d3a78eSNicholas Piggin     }
668121d3a78eSNicholas Piggin 
66823e770bf7SBruno Larsen (billionai)     return false;
66833e770bf7SBruno Larsen (billionai) }
66843e770bf7SBruno Larsen (billionai) 
POWERPC_FAMILY(POWER10)66853e770bf7SBruno Larsen (billionai) POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
66863e770bf7SBruno Larsen (billionai) {
66873e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
66883e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
66893e770bf7SBruno Larsen (billionai) 
66903e770bf7SBruno Larsen (billionai)     dc->fw_name = "PowerPC,POWER10";
66913e770bf7SBruno Larsen (billionai)     dc->desc = "POWER10";
66923e770bf7SBruno Larsen (billionai)     pcc->pvr_match = ppc_pvr_match_power10;
66933e770bf7SBruno Larsen (billionai)     pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07 |
66943e770bf7SBruno Larsen (billionai)                     PCR_COMPAT_3_00;
66953e770bf7SBruno Larsen (billionai)     pcc->pcr_supported = PCR_COMPAT_3_10 | PCR_COMPAT_3_00 | PCR_COMPAT_2_07 |
66963e770bf7SBruno Larsen (billionai)                          PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
66973e770bf7SBruno Larsen (billionai)     pcc->init_proc = init_proc_POWER10;
66983e770bf7SBruno Larsen (billionai)     pcc->check_pow = check_pow_nocheck;
669945693f94SNicholas Piggin     pcc->check_attn = check_attn_hid0_power9;
67003e770bf7SBruno Larsen (billionai)     pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
67013e770bf7SBruno Larsen (billionai)                        PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
67023e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
67033e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_FRSQRTES |
67043e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_STFIWX |
67053e770bf7SBruno Larsen (billionai)                        PPC_FLOAT_EXT |
67063e770bf7SBruno Larsen (billionai)                        PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
67073e770bf7SBruno Larsen (billionai)                        PPC_MEM_SYNC | PPC_MEM_EIEIO |
6708016b6e1dSLeandro Lupori                        PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
67093e770bf7SBruno Larsen (billionai)                        PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
67103e770bf7SBruno Larsen (billionai)                        PPC_SEGMENT_64B | PPC_SLBI |
67113e770bf7SBruno Larsen (billionai)                        PPC_POPCNTB | PPC_POPCNTWD |
67123e770bf7SBruno Larsen (billionai)                        PPC_CILDST;
67133e770bf7SBruno Larsen (billionai)     pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
67143e770bf7SBruno Larsen (billionai)                         PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
67153e770bf7SBruno Larsen (billionai)                         PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
67163e770bf7SBruno Larsen (billionai)                         PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
67173e770bf7SBruno Larsen (billionai)                         PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
67183e770bf7SBruno Larsen (billionai)                         PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
67194b8732fcSNicholas Piggin                         PPC2_ISA300 | PPC2_PRCNTL | PPC2_ISA310 |
67204dc5f8abSMatheus Ferst                         PPC2_MEM_LWSYNC | PPC2_BCDA_ISA206;
67213e770bf7SBruno Larsen (billionai)     pcc->msr_mask = (1ull << MSR_SF) |
67223e770bf7SBruno Larsen (billionai)                     (1ull << MSR_HV) |
67233e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VR) |
67243e770bf7SBruno Larsen (billionai)                     (1ull << MSR_VSX) |
67253e770bf7SBruno Larsen (billionai)                     (1ull << MSR_EE) |
67263e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PR) |
67273e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FP) |
67283e770bf7SBruno Larsen (billionai)                     (1ull << MSR_ME) |
67293e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE0) |
67303e770bf7SBruno Larsen (billionai)                     (1ull << MSR_SE) |
67313e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DE) |
67323e770bf7SBruno Larsen (billionai)                     (1ull << MSR_FE1) |
67333e770bf7SBruno Larsen (billionai)                     (1ull << MSR_IR) |
67343e770bf7SBruno Larsen (billionai)                     (1ull << MSR_DR) |
67353e770bf7SBruno Larsen (billionai)                     (1ull << MSR_PMM) |
67363e770bf7SBruno Larsen (billionai)                     (1ull << MSR_RI) |
67373e770bf7SBruno Larsen (billionai)                     (1ull << MSR_LE);
67383e770bf7SBruno Larsen (billionai)     pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
67393e770bf7SBruno Larsen (billionai)         (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
67403e770bf7SBruno Larsen (billionai)         LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
67413e770bf7SBruno Larsen (billionai)         (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
67423e770bf7SBruno Larsen (billionai)                              LPCR_DEE | LPCR_OEE))
67433e770bf7SBruno Larsen (billionai)         | LPCR_MER | LPCR_GTSE | LPCR_TC |
67443e770bf7SBruno Larsen (billionai)         LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
6745363fd548SCédric Le Goater     /* DD2 adds an extra HAIL bit */
6746363fd548SCédric Le Goater     pcc->lpcr_mask |= LPCR_HAIL;
6747363fd548SCédric Le Goater 
67483e770bf7SBruno Larsen (billionai)     pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
67493e770bf7SBruno Larsen (billionai)     pcc->mmu_model = POWERPC_MMU_3_00;
6750227776b7SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY)
67513e770bf7SBruno Larsen (billionai)     /* segment page size remain the same */
67523e770bf7SBruno Larsen (billionai)     pcc->hash64_opts = &ppc_hash64_opts_POWER7;
67533e770bf7SBruno Larsen (billionai)     pcc->radix_page_info = &POWER10_radix_page_info;
67543e770bf7SBruno Larsen (billionai)     pcc->lrg_decr_bits = 56;
67553e770bf7SBruno Larsen (billionai) #endif
67563e770bf7SBruno Larsen (billionai)     pcc->excp_model = POWERPC_EXCP_POWER10;
67573e770bf7SBruno Larsen (billionai)     pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
67583e770bf7SBruno Larsen (billionai)     pcc->bfd_mach = bfd_mach_ppc64;
67593e770bf7SBruno Larsen (billionai)     pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
67603e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
67613e770bf7SBruno Larsen (billionai)                  POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
67624de4a470SGlenn Miles                  POWERPC_FLAG_VSX | POWERPC_FLAG_SCV |
67634de4a470SGlenn Miles                  POWERPC_FLAG_BHRB;
67643e770bf7SBruno Larsen (billionai)     pcc->l1_dcache_size = 0x8000;
67653e770bf7SBruno Larsen (billionai)     pcc->l1_icache_size = 0x8000;
67663e770bf7SBruno Larsen (billionai) }
67673e770bf7SBruno Larsen (billionai) 
67683e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
cpu_ppc_set_vhyp(PowerPCCPU * cpu,PPCVirtualHypervisor * vhyp)67693e770bf7SBruno Larsen (billionai) void cpu_ppc_set_vhyp(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp)
67703e770bf7SBruno Larsen (billionai) {
67713e770bf7SBruno Larsen (billionai)     CPUPPCState *env = &cpu->env;
67723e770bf7SBruno Larsen (billionai) 
67733e770bf7SBruno Larsen (billionai)     cpu->vhyp = vhyp;
6774c700b5e1SNicholas Piggin     cpu->vhyp_class = PPC_VIRTUAL_HYPERVISOR_GET_CLASS(vhyp);
67753e770bf7SBruno Larsen (billionai) 
67763e770bf7SBruno Larsen (billionai)     /*
67773e770bf7SBruno Larsen (billionai)      * With a virtual hypervisor mode we never allow the CPU to go
67783e770bf7SBruno Larsen (billionai)      * hypervisor mode itself
67793e770bf7SBruno Larsen (billionai)      */
67803e770bf7SBruno Larsen (billionai)     env->msr_mask &= ~MSR_HVB;
67813e770bf7SBruno Larsen (billionai) }
67823e770bf7SBruno Larsen (billionai) 
cpu_ppc_set_1lpar(PowerPCCPU * cpu)67833401ea3cSNicholas Piggin void cpu_ppc_set_1lpar(PowerPCCPU *cpu)
67843401ea3cSNicholas Piggin {
67853401ea3cSNicholas Piggin     CPUPPCState *env = &cpu->env;
67863401ea3cSNicholas Piggin 
67873401ea3cSNicholas Piggin     /*
67883401ea3cSNicholas Piggin      * pseries SMT means "LPAR per core" mode, e.g., msgsndp is usable
6789*3b5ea01eSNicholas Piggin      * between threads. powernv be in either mode, and it mostly affects
6790*3b5ea01eSNicholas Piggin      * supervisor visible registers and instructions.
67913401ea3cSNicholas Piggin      */
67923401ea3cSNicholas Piggin     if (env->flags & POWERPC_FLAG_SMT) {
67933401ea3cSNicholas Piggin         env->flags |= POWERPC_FLAG_SMT_1LPAR;
67943401ea3cSNicholas Piggin     }
67953401ea3cSNicholas Piggin }
67963e770bf7SBruno Larsen (billionai) #endif /* !defined(CONFIG_USER_ONLY) */
67973e770bf7SBruno Larsen (billionai) 
67983e770bf7SBruno Larsen (billionai) #endif /* defined(TARGET_PPC64) */
67993e770bf7SBruno Larsen (billionai) 
68003e770bf7SBruno Larsen (billionai) /*****************************************************************************/
68013e770bf7SBruno Larsen (billionai) /* Generic CPU instantiation routine                                         */
init_ppc_proc(PowerPCCPU * cpu)68023e770bf7SBruno Larsen (billionai) static void init_ppc_proc(PowerPCCPU *cpu)
68033e770bf7SBruno Larsen (billionai) {
68043e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
68053e770bf7SBruno Larsen (billionai)     CPUPPCState *env = &cpu->env;
68063e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
68073e770bf7SBruno Larsen (billionai)     int i;
68083e770bf7SBruno Larsen (billionai) 
68093e770bf7SBruno Larsen (billionai)     /* Set all exception vectors to an invalid address */
68103e770bf7SBruno Larsen (billionai)     for (i = 0; i < POWERPC_EXCP_NB; i++) {
68113e770bf7SBruno Larsen (billionai)         env->excp_vectors[i] = (target_ulong)(-1ULL);
68123e770bf7SBruno Larsen (billionai)     }
68133e770bf7SBruno Larsen (billionai)     env->ivor_mask = 0x00000000;
68143e770bf7SBruno Larsen (billionai)     env->ivpr_mask = 0x00000000;
68153e770bf7SBruno Larsen (billionai)     /* Default MMU definitions */
68163e770bf7SBruno Larsen (billionai)     env->nb_BATs = 0;
68173e770bf7SBruno Larsen (billionai)     env->nb_tlb = 0;
68183e770bf7SBruno Larsen (billionai)     env->nb_ways = 0;
68193e770bf7SBruno Larsen (billionai)     env->tlb_type = TLB_NONE;
68203e770bf7SBruno Larsen (billionai) #endif
68213e770bf7SBruno Larsen (billionai)     /* Register SPR common to all PowerPC implementations */
6822e78280a2SFabiano Rosas     register_generic_sprs(cpu);
6823e78280a2SFabiano Rosas 
68243e770bf7SBruno Larsen (billionai)     /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
68253e770bf7SBruno Larsen (billionai)     (*pcc->init_proc)(env);
68263e770bf7SBruno Larsen (billionai) 
68273e770bf7SBruno Larsen (billionai)     /* MSR bits & flags consistency checks */
68283e770bf7SBruno Larsen (billionai)     if (env->msr_mask & (1 << 25)) {
68293e770bf7SBruno Larsen (billionai)         switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
68303e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_SPE:
68313e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_VRE:
68323e770bf7SBruno Larsen (billionai)             break;
68333e770bf7SBruno Larsen (billionai)         default:
68343e770bf7SBruno Larsen (billionai)             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68353e770bf7SBruno Larsen (billionai)                     "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
68363e770bf7SBruno Larsen (billionai)             exit(1);
68373e770bf7SBruno Larsen (billionai)         }
68383e770bf7SBruno Larsen (billionai)     } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
68393e770bf7SBruno Larsen (billionai)         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68403e770bf7SBruno Larsen (billionai)                 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
68413e770bf7SBruno Larsen (billionai)         exit(1);
68423e770bf7SBruno Larsen (billionai)     }
68433e770bf7SBruno Larsen (billionai)     if (env->msr_mask & (1 << 17)) {
68443e770bf7SBruno Larsen (billionai)         switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
68453e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_TGPR:
68463e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_CE:
68473e770bf7SBruno Larsen (billionai)             break;
68483e770bf7SBruno Larsen (billionai)         default:
68493e770bf7SBruno Larsen (billionai)             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68503e770bf7SBruno Larsen (billionai)                     "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
68513e770bf7SBruno Larsen (billionai)             exit(1);
68523e770bf7SBruno Larsen (billionai)         }
68533e770bf7SBruno Larsen (billionai)     } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
68543e770bf7SBruno Larsen (billionai)         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68553e770bf7SBruno Larsen (billionai)                 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
68563e770bf7SBruno Larsen (billionai)         exit(1);
68573e770bf7SBruno Larsen (billionai)     }
68583e770bf7SBruno Larsen (billionai)     if (env->msr_mask & (1 << 10)) {
68593e770bf7SBruno Larsen (billionai)         switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
68603e770bf7SBruno Larsen (billionai)                               POWERPC_FLAG_UBLE)) {
68613e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_SE:
68623e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_DWE:
68633e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_UBLE:
68643e770bf7SBruno Larsen (billionai)             break;
68653e770bf7SBruno Larsen (billionai)         default:
68663e770bf7SBruno Larsen (billionai)             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68673e770bf7SBruno Larsen (billionai)                     "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
68683e770bf7SBruno Larsen (billionai)                     "POWERPC_FLAG_UBLE\n");
68693e770bf7SBruno Larsen (billionai)             exit(1);
68703e770bf7SBruno Larsen (billionai)         }
68713e770bf7SBruno Larsen (billionai)     } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
68723e770bf7SBruno Larsen (billionai)                              POWERPC_FLAG_UBLE)) {
68733e770bf7SBruno Larsen (billionai)         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68743e770bf7SBruno Larsen (billionai)                 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
68753e770bf7SBruno Larsen (billionai)                 "POWERPC_FLAG_UBLE\n");
68763e770bf7SBruno Larsen (billionai)             exit(1);
68773e770bf7SBruno Larsen (billionai)     }
68783e770bf7SBruno Larsen (billionai)     if (env->msr_mask & (1 << 9)) {
68793e770bf7SBruno Larsen (billionai)         switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
68803e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_BE:
68813e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_DE:
68823e770bf7SBruno Larsen (billionai)             break;
68833e770bf7SBruno Larsen (billionai)         default:
68843e770bf7SBruno Larsen (billionai)             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68853e770bf7SBruno Larsen (billionai)                     "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
68863e770bf7SBruno Larsen (billionai)             exit(1);
68873e770bf7SBruno Larsen (billionai)         }
68883e770bf7SBruno Larsen (billionai)     } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
68893e770bf7SBruno Larsen (billionai)         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
68903e770bf7SBruno Larsen (billionai)                 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
68913e770bf7SBruno Larsen (billionai)         exit(1);
68923e770bf7SBruno Larsen (billionai)     }
68933e770bf7SBruno Larsen (billionai)     if (env->msr_mask & (1 << 2)) {
68943e770bf7SBruno Larsen (billionai)         switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
68953e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_PX:
68963e770bf7SBruno Larsen (billionai)         case POWERPC_FLAG_PMM:
68973e770bf7SBruno Larsen (billionai)             break;
68983e770bf7SBruno Larsen (billionai)         default:
68993e770bf7SBruno Larsen (billionai)             fprintf(stderr, "PowerPC MSR definition inconsistency\n"
69003e770bf7SBruno Larsen (billionai)                     "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
69013e770bf7SBruno Larsen (billionai)             exit(1);
69023e770bf7SBruno Larsen (billionai)         }
69033e770bf7SBruno Larsen (billionai)     } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
69043e770bf7SBruno Larsen (billionai)         fprintf(stderr, "PowerPC MSR definition inconsistency\n"
69053e770bf7SBruno Larsen (billionai)                 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
69063e770bf7SBruno Larsen (billionai)         exit(1);
69073e770bf7SBruno Larsen (billionai)     }
6908005b69fdSCédric Le Goater     if ((env->flags & POWERPC_FLAG_BUS_CLK) == 0) {
69093e770bf7SBruno Larsen (billionai)         fprintf(stderr, "PowerPC flags inconsistency\n"
69103e770bf7SBruno Larsen (billionai)                 "Should define the time-base and decrementer clock source\n");
69113e770bf7SBruno Larsen (billionai)         exit(1);
69123e770bf7SBruno Larsen (billionai)     }
69133e770bf7SBruno Larsen (billionai)     /* Allocate TLBs buffer when needed */
69143e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
69155fd257f5SBALATON Zoltan     if (env->nb_tlb) {
69163e770bf7SBruno Larsen (billionai)         switch (env->tlb_type) {
69173e770bf7SBruno Larsen (billionai)         case TLB_6XX:
69185fd257f5SBALATON Zoltan             /* 6xx has separate TLBs for instructions and data hence times 2 */
69195fd257f5SBALATON Zoltan             env->tlb.tlb6 = g_new0(ppc6xx_tlb_t, 2 * env->nb_tlb);
69203e770bf7SBruno Larsen (billionai)             break;
69213e770bf7SBruno Larsen (billionai)         case TLB_EMB:
69225fd257f5SBALATON Zoltan             env->tlb.tlbe = g_new0(ppcemb_tlb_t, env->nb_tlb);
69233e770bf7SBruno Larsen (billionai)             break;
69243e770bf7SBruno Larsen (billionai)         case TLB_MAS:
69255fd257f5SBALATON Zoltan             env->tlb.tlbm = g_new0(ppcmas_tlb_t, env->nb_tlb);
69263e770bf7SBruno Larsen (billionai)             break;
69273e770bf7SBruno Larsen (billionai)         }
69283e770bf7SBruno Larsen (billionai)         /* Pre-compute some useful values */
69293e770bf7SBruno Larsen (billionai)         env->tlb_per_way = env->nb_tlb / env->nb_ways;
69303e770bf7SBruno Larsen (billionai)     }
69313e770bf7SBruno Larsen (billionai) #endif
69323e770bf7SBruno Larsen (billionai)     if (env->check_pow == NULL) {
69333e770bf7SBruno Larsen (billionai)         warn_report("no power management check handler registered."
69343e770bf7SBruno Larsen (billionai)                     " Attempt QEMU to crash very soon !");
69353e770bf7SBruno Larsen (billionai)     }
693645693f94SNicholas Piggin 
693745693f94SNicholas Piggin     if (env->check_attn == NULL) {
693845693f94SNicholas Piggin         warn_report("no attn check handler registered."
693945693f94SNicholas Piggin                     " Attempt QEMU to crash very soon !");
694045693f94SNicholas Piggin     }
69413e770bf7SBruno Larsen (billionai) }
69423e770bf7SBruno Larsen (billionai) 
69433e770bf7SBruno Larsen (billionai) 
ppc_cpu_realize(DeviceState * dev,Error ** errp)69443e770bf7SBruno Larsen (billionai) static void ppc_cpu_realize(DeviceState *dev, Error **errp)
69453e770bf7SBruno Larsen (billionai) {
69463e770bf7SBruno Larsen (billionai)     CPUState *cs = CPU(dev);
69473e770bf7SBruno Larsen (billionai)     PowerPCCPU *cpu = POWERPC_CPU(dev);
6948b769d4c8SNicholas Piggin     CPUPPCState *env = &cpu->env;
69493e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
69503e770bf7SBruno Larsen (billionai)     Error *local_err = NULL;
69513e770bf7SBruno Larsen (billionai) 
69523e770bf7SBruno Larsen (billionai)     cpu_exec_realizefn(cs, &local_err);
69533e770bf7SBruno Larsen (billionai)     if (local_err != NULL) {
69543e770bf7SBruno Larsen (billionai)         error_propagate(errp, local_err);
69553e770bf7SBruno Larsen (billionai)         return;
69563e770bf7SBruno Larsen (billionai)     }
69573e770bf7SBruno Larsen (billionai)     if (cpu->vcpu_id == UNASSIGNED_CPU_INDEX) {
69583e770bf7SBruno Larsen (billionai)         cpu->vcpu_id = cs->cpu_index;
69593e770bf7SBruno Larsen (billionai)     }
69603e770bf7SBruno Larsen (billionai) 
69613e770bf7SBruno Larsen (billionai)     if (tcg_enabled()) {
69623e770bf7SBruno Larsen (billionai)         if (ppc_fixup_cpu(cpu) != 0) {
69633e770bf7SBruno Larsen (billionai)             error_setg(errp, "Unable to emulate selected CPU with TCG");
69643e770bf7SBruno Larsen (billionai)             goto unrealize;
69653e770bf7SBruno Larsen (billionai)         }
69663e770bf7SBruno Larsen (billionai)     }
69673e770bf7SBruno Larsen (billionai) 
69683e770bf7SBruno Larsen (billionai)     create_ppc_opcodes(cpu, &local_err);
69693e770bf7SBruno Larsen (billionai)     if (local_err != NULL) {
69703e770bf7SBruno Larsen (billionai)         error_propagate(errp, local_err);
69713e770bf7SBruno Larsen (billionai)         goto unrealize;
69723e770bf7SBruno Larsen (billionai)     }
69733e770bf7SBruno Larsen (billionai)     init_ppc_proc(cpu);
69743e770bf7SBruno Larsen (billionai) 
69753e770bf7SBruno Larsen (billionai)     ppc_gdb_init(cs, pcc);
69763e770bf7SBruno Larsen (billionai)     qemu_init_vcpu(cs);
69773e770bf7SBruno Larsen (billionai) 
69783e770bf7SBruno Larsen (billionai)     pcc->parent_realize(dev, errp);
69793e770bf7SBruno Larsen (billionai) 
698050d8cfb9SNicholas Piggin     if (!ppc_cpu_core_single_threaded(cs)) {
6981b769d4c8SNicholas Piggin         env->flags |= POWERPC_FLAG_SMT;
6982b769d4c8SNicholas Piggin     }
6983b769d4c8SNicholas Piggin 
69843e770bf7SBruno Larsen (billionai)     return;
69853e770bf7SBruno Larsen (billionai) 
69863e770bf7SBruno Larsen (billionai) unrealize:
69873e770bf7SBruno Larsen (billionai)     cpu_exec_unrealizefn(cs);
69883e770bf7SBruno Larsen (billionai) }
69893e770bf7SBruno Larsen (billionai) 
ppc_cpu_unrealize(DeviceState * dev)69903e770bf7SBruno Larsen (billionai) static void ppc_cpu_unrealize(DeviceState *dev)
69913e770bf7SBruno Larsen (billionai) {
69923e770bf7SBruno Larsen (billionai)     PowerPCCPU *cpu = POWERPC_CPU(dev);
69933e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
69943e770bf7SBruno Larsen (billionai) 
69953e770bf7SBruno Larsen (billionai)     pcc->parent_unrealize(dev);
69963e770bf7SBruno Larsen (billionai) 
69973e770bf7SBruno Larsen (billionai)     cpu_remove_sync(CPU(cpu));
69983e770bf7SBruno Larsen (billionai) 
69993e770bf7SBruno Larsen (billionai)     destroy_ppc_opcodes(cpu);
70003e770bf7SBruno Larsen (billionai) }
70013e770bf7SBruno Larsen (billionai) 
ppc_cpu_compare_class_pvr(gconstpointer a,gconstpointer b)70023e770bf7SBruno Larsen (billionai) static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
70033e770bf7SBruno Larsen (billionai) {
70043e770bf7SBruno Larsen (billionai)     ObjectClass *oc = (ObjectClass *)a;
70053e770bf7SBruno Larsen (billionai)     uint32_t pvr = *(uint32_t *)b;
70063e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
70073e770bf7SBruno Larsen (billionai) 
70083e770bf7SBruno Larsen (billionai)     /* -cpu host does a PVR lookup during construction */
70093e770bf7SBruno Larsen (billionai)     if (unlikely(strcmp(object_class_get_name(oc),
70103e770bf7SBruno Larsen (billionai)                         TYPE_HOST_POWERPC_CPU) == 0)) {
70113e770bf7SBruno Larsen (billionai)         return -1;
70123e770bf7SBruno Larsen (billionai)     }
70133e770bf7SBruno Larsen (billionai) 
70143e770bf7SBruno Larsen (billionai)     return pcc->pvr == pvr ? 0 : -1;
70153e770bf7SBruno Larsen (billionai) }
70163e770bf7SBruno Larsen (billionai) 
ppc_cpu_class_by_pvr(uint32_t pvr)70173e770bf7SBruno Larsen (billionai) PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
70183e770bf7SBruno Larsen (billionai) {
70193e770bf7SBruno Larsen (billionai)     GSList *list, *item;
70203e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = NULL;
70213e770bf7SBruno Larsen (billionai) 
70223e770bf7SBruno Larsen (billionai)     list = object_class_get_list(TYPE_POWERPC_CPU, false);
70233e770bf7SBruno Larsen (billionai)     item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
70243e770bf7SBruno Larsen (billionai)     if (item != NULL) {
70253e770bf7SBruno Larsen (billionai)         pcc = POWERPC_CPU_CLASS(item->data);
70263e770bf7SBruno Larsen (billionai)     }
70273e770bf7SBruno Larsen (billionai)     g_slist_free(list);
70283e770bf7SBruno Larsen (billionai) 
70293e770bf7SBruno Larsen (billionai)     return pcc;
70303e770bf7SBruno Larsen (billionai) }
70313e770bf7SBruno Larsen (billionai) 
ppc_cpu_compare_class_pvr_mask(gconstpointer a,gconstpointer b)70323e770bf7SBruno Larsen (billionai) static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b)
70333e770bf7SBruno Larsen (billionai) {
70343e770bf7SBruno Larsen (billionai)     ObjectClass *oc = (ObjectClass *)a;
70353e770bf7SBruno Larsen (billionai)     uint32_t pvr = *(uint32_t *)b;
70363e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
70373e770bf7SBruno Larsen (billionai) 
70383e770bf7SBruno Larsen (billionai)     /* -cpu host does a PVR lookup during construction */
70393e770bf7SBruno Larsen (billionai)     if (unlikely(strcmp(object_class_get_name(oc),
70403e770bf7SBruno Larsen (billionai)                         TYPE_HOST_POWERPC_CPU) == 0)) {
70413e770bf7SBruno Larsen (billionai)         return -1;
70423e770bf7SBruno Larsen (billionai)     }
70433e770bf7SBruno Larsen (billionai) 
704421d3a78eSNicholas Piggin     if (pcc->pvr_match(pcc, pvr, true)) {
70453e770bf7SBruno Larsen (billionai)         return 0;
70463e770bf7SBruno Larsen (billionai)     }
70473e770bf7SBruno Larsen (billionai) 
70483e770bf7SBruno Larsen (billionai)     return -1;
70493e770bf7SBruno Larsen (billionai) }
70503e770bf7SBruno Larsen (billionai) 
ppc_cpu_class_by_pvr_mask(uint32_t pvr)70513e770bf7SBruno Larsen (billionai) PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr)
70523e770bf7SBruno Larsen (billionai) {
70533e770bf7SBruno Larsen (billionai)     GSList *list, *item;
70543e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = NULL;
70553e770bf7SBruno Larsen (billionai) 
70563e770bf7SBruno Larsen (billionai)     list = object_class_get_list(TYPE_POWERPC_CPU, true);
70573e770bf7SBruno Larsen (billionai)     item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr_mask);
70583e770bf7SBruno Larsen (billionai)     if (item != NULL) {
70593e770bf7SBruno Larsen (billionai)         pcc = POWERPC_CPU_CLASS(item->data);
70603e770bf7SBruno Larsen (billionai)     }
70613e770bf7SBruno Larsen (billionai)     g_slist_free(list);
70623e770bf7SBruno Larsen (billionai) 
70633e770bf7SBruno Larsen (billionai)     return pcc;
70643e770bf7SBruno Larsen (billionai) }
70653e770bf7SBruno Larsen (billionai) 
ppc_cpu_lookup_alias(const char * alias)70663e770bf7SBruno Larsen (billionai) static const char *ppc_cpu_lookup_alias(const char *alias)
70673e770bf7SBruno Larsen (billionai) {
70683e770bf7SBruno Larsen (billionai)     int ai;
70693e770bf7SBruno Larsen (billionai) 
70703e770bf7SBruno Larsen (billionai)     for (ai = 0; ppc_cpu_aliases[ai].alias != NULL; ai++) {
70713e770bf7SBruno Larsen (billionai)         if (strcmp(ppc_cpu_aliases[ai].alias, alias) == 0) {
70723e770bf7SBruno Larsen (billionai)             return ppc_cpu_aliases[ai].model;
70733e770bf7SBruno Larsen (billionai)         }
70743e770bf7SBruno Larsen (billionai)     }
70753e770bf7SBruno Larsen (billionai) 
70763e770bf7SBruno Larsen (billionai)     return NULL;
70773e770bf7SBruno Larsen (billionai) }
70783e770bf7SBruno Larsen (billionai) 
ppc_cpu_class_by_name(const char * name)70790f3fea21SPhilippe Mathieu-Daudé ObjectClass *ppc_cpu_class_by_name(const char *name)
70803e770bf7SBruno Larsen (billionai) {
70813e770bf7SBruno Larsen (billionai)     char *cpu_model, *typename;
70823e770bf7SBruno Larsen (billionai)     ObjectClass *oc;
70833e770bf7SBruno Larsen (billionai)     const char *p;
70843e770bf7SBruno Larsen (billionai)     unsigned long pvr;
70853e770bf7SBruno Larsen (billionai) 
70863e770bf7SBruno Larsen (billionai)     /*
70873e770bf7SBruno Larsen (billionai)      * Lookup by PVR if cpu_model is valid 8 digit hex number (excl:
70883e770bf7SBruno Larsen (billionai)      * 0x prefix if present)
70893e770bf7SBruno Larsen (billionai)      */
70903e770bf7SBruno Larsen (billionai)     if (!qemu_strtoul(name, &p, 16, &pvr)) {
70913e770bf7SBruno Larsen (billionai)         int len = p - name;
70923e770bf7SBruno Larsen (billionai)         len = (len == 10) && (name[1] == 'x') ? len - 2 : len;
70933e770bf7SBruno Larsen (billionai)         if ((len == 8) && (*p == '\0')) {
70943e770bf7SBruno Larsen (billionai)             return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr));
70953e770bf7SBruno Larsen (billionai)         }
70963e770bf7SBruno Larsen (billionai)     }
70973e770bf7SBruno Larsen (billionai) 
7098c7e89de1SMurilo Opsfelder Araujo     /*
7099c7e89de1SMurilo Opsfelder Araujo      * All ppc CPUs represent hardware that exists in the real world, i.e.: we
7100c7e89de1SMurilo Opsfelder Araujo      * do not have a "max" CPU with all possible emulated features enabled.
7101c7e89de1SMurilo Opsfelder Araujo      * Return the default CPU type for the machine because that has greater
7102c7e89de1SMurilo Opsfelder Araujo      * chance of being useful as the "max" CPU.
7103c7e89de1SMurilo Opsfelder Araujo      */
7104c7e89de1SMurilo Opsfelder Araujo #if !defined(CONFIG_USER_ONLY)
7105c7e89de1SMurilo Opsfelder Araujo     if (strcmp(name, "max") == 0) {
7106c7e89de1SMurilo Opsfelder Araujo         MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
7107c7e89de1SMurilo Opsfelder Araujo         if (mc) {
7108c7e89de1SMurilo Opsfelder Araujo             return object_class_by_name(mc->default_cpu_type);
7109c7e89de1SMurilo Opsfelder Araujo         }
7110c7e89de1SMurilo Opsfelder Araujo     }
7111c7e89de1SMurilo Opsfelder Araujo #endif
7112c7e89de1SMurilo Opsfelder Araujo 
71133e770bf7SBruno Larsen (billionai)     cpu_model = g_ascii_strdown(name, -1);
71143e770bf7SBruno Larsen (billionai)     p = ppc_cpu_lookup_alias(cpu_model);
71153e770bf7SBruno Larsen (billionai)     if (p) {
71163e770bf7SBruno Larsen (billionai)         g_free(cpu_model);
71173e770bf7SBruno Larsen (billionai)         cpu_model = g_strdup(p);
71183e770bf7SBruno Larsen (billionai)     }
71193e770bf7SBruno Larsen (billionai) 
71203e770bf7SBruno Larsen (billionai)     typename = g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX, cpu_model);
71213e770bf7SBruno Larsen (billionai)     oc = object_class_by_name(typename);
71223e770bf7SBruno Larsen (billionai)     g_free(typename);
71233e770bf7SBruno Larsen (billionai)     g_free(cpu_model);
71243e770bf7SBruno Larsen (billionai) 
71253e770bf7SBruno Larsen (billionai)     return oc;
71263e770bf7SBruno Larsen (billionai) }
71273e770bf7SBruno Larsen (billionai) 
ppc_cpu_get_family_class(PowerPCCPUClass * pcc)71283e770bf7SBruno Larsen (billionai) PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
71293e770bf7SBruno Larsen (billionai) {
71303e770bf7SBruno Larsen (billionai)     ObjectClass *oc = OBJECT_CLASS(pcc);
71313e770bf7SBruno Larsen (billionai) 
71323e770bf7SBruno Larsen (billionai)     while (oc && !object_class_is_abstract(oc)) {
71333e770bf7SBruno Larsen (billionai)         oc = object_class_get_parent(oc);
71343e770bf7SBruno Larsen (billionai)     }
71353e770bf7SBruno Larsen (billionai)     assert(oc);
71363e770bf7SBruno Larsen (billionai) 
71373e770bf7SBruno Larsen (billionai)     return POWERPC_CPU_CLASS(oc);
71383e770bf7SBruno Larsen (billionai) }
71393e770bf7SBruno Larsen (billionai) 
71403e770bf7SBruno Larsen (billionai) /* Sort by PVR, ordering special case "host" last. */
ppc_cpu_list_compare(gconstpointer a,gconstpointer b)71413e770bf7SBruno Larsen (billionai) static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
71423e770bf7SBruno Larsen (billionai) {
71433e770bf7SBruno Larsen (billionai)     ObjectClass *oc_a = (ObjectClass *)a;
71443e770bf7SBruno Larsen (billionai)     ObjectClass *oc_b = (ObjectClass *)b;
71453e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
71463e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
71473e770bf7SBruno Larsen (billionai)     const char *name_a = object_class_get_name(oc_a);
71483e770bf7SBruno Larsen (billionai)     const char *name_b = object_class_get_name(oc_b);
71493e770bf7SBruno Larsen (billionai) 
71503e770bf7SBruno Larsen (billionai)     if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
71513e770bf7SBruno Larsen (billionai)         return 1;
71523e770bf7SBruno Larsen (billionai)     } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
71533e770bf7SBruno Larsen (billionai)         return -1;
71543e770bf7SBruno Larsen (billionai)     } else {
71553e770bf7SBruno Larsen (billionai)         /* Avoid an integer overflow during subtraction */
71563e770bf7SBruno Larsen (billionai)         if (pcc_a->pvr < pcc_b->pvr) {
71573e770bf7SBruno Larsen (billionai)             return -1;
71583e770bf7SBruno Larsen (billionai)         } else if (pcc_a->pvr > pcc_b->pvr) {
71593e770bf7SBruno Larsen (billionai)             return 1;
71603e770bf7SBruno Larsen (billionai)         } else {
71613e770bf7SBruno Larsen (billionai)             return 0;
71623e770bf7SBruno Larsen (billionai)         }
71633e770bf7SBruno Larsen (billionai)     }
71643e770bf7SBruno Larsen (billionai) }
71653e770bf7SBruno Larsen (billionai) 
ppc_cpu_list_entry(gpointer data,gpointer user_data)71663e770bf7SBruno Larsen (billionai) static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
71673e770bf7SBruno Larsen (billionai) {
71683e770bf7SBruno Larsen (billionai)     ObjectClass *oc = data;
71693e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
71703e770bf7SBruno Larsen (billionai)     DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
71713e770bf7SBruno Larsen (billionai)     const char *typename = object_class_get_name(oc);
71723e770bf7SBruno Larsen (billionai)     char *name;
71733e770bf7SBruno Larsen (billionai)     int i;
71743e770bf7SBruno Larsen (billionai) 
71753e770bf7SBruno Larsen (billionai)     if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) {
71763e770bf7SBruno Larsen (billionai)         return;
71773e770bf7SBruno Larsen (billionai)     }
71783e770bf7SBruno Larsen (billionai) 
71794b26aa9fSGavin Shan     name = cpu_model_from_type(typename);
71805b638f6eSThomas Huth     qemu_printf("  %-16s PVR %08x\n", name, pcc->pvr);
71813e770bf7SBruno Larsen (billionai)     for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
71823e770bf7SBruno Larsen (billionai)         PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
71833e770bf7SBruno Larsen (billionai)         ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
71843e770bf7SBruno Larsen (billionai) 
71853e770bf7SBruno Larsen (billionai)         if (alias_oc != oc) {
71863e770bf7SBruno Larsen (billionai)             continue;
71873e770bf7SBruno Larsen (billionai)         }
71883e770bf7SBruno Larsen (billionai)         /*
71893e770bf7SBruno Larsen (billionai)          * If running with KVM, we might update the family alias later, so
71903e770bf7SBruno Larsen (billionai)          * avoid printing the wrong alias here and use "preferred" instead
71913e770bf7SBruno Larsen (billionai)          */
71923e770bf7SBruno Larsen (billionai)         if (strcmp(alias->alias, family->desc) == 0) {
71935b638f6eSThomas Huth             qemu_printf("  %-16s (alias for preferred %s CPU)\n",
71943e770bf7SBruno Larsen (billionai)                         alias->alias, family->desc);
71953e770bf7SBruno Larsen (billionai)         } else {
71965b638f6eSThomas Huth             qemu_printf("  %-16s (alias for %s)\n",
71973e770bf7SBruno Larsen (billionai)                         alias->alias, name);
71983e770bf7SBruno Larsen (billionai)         }
71993e770bf7SBruno Larsen (billionai)     }
72003e770bf7SBruno Larsen (billionai)     g_free(name);
72013e770bf7SBruno Larsen (billionai) }
72023e770bf7SBruno Larsen (billionai) 
ppc_cpu_list(void)72033e770bf7SBruno Larsen (billionai) void ppc_cpu_list(void)
72043e770bf7SBruno Larsen (billionai) {
72053e770bf7SBruno Larsen (billionai)     GSList *list;
72063e770bf7SBruno Larsen (billionai) 
72075b638f6eSThomas Huth     qemu_printf("Available CPUs:\n");
72083e770bf7SBruno Larsen (billionai)     list = object_class_get_list(TYPE_POWERPC_CPU, false);
72093e770bf7SBruno Larsen (billionai)     list = g_slist_sort(list, ppc_cpu_list_compare);
72103e770bf7SBruno Larsen (billionai)     g_slist_foreach(list, ppc_cpu_list_entry, NULL);
72113e770bf7SBruno Larsen (billionai)     g_slist_free(list);
72123e770bf7SBruno Larsen (billionai) 
72133e770bf7SBruno Larsen (billionai) #ifdef CONFIG_KVM
72143e770bf7SBruno Larsen (billionai)     qemu_printf("\n");
72155b638f6eSThomas Huth     qemu_printf("  %s\n", "host");
72163e770bf7SBruno Larsen (billionai) #endif
72173e770bf7SBruno Larsen (billionai) }
72183e770bf7SBruno Larsen (billionai) 
ppc_cpu_set_pc(CPUState * cs,vaddr value)72193e770bf7SBruno Larsen (billionai) static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
72203e770bf7SBruno Larsen (billionai) {
72213e770bf7SBruno Larsen (billionai)     PowerPCCPU *cpu = POWERPC_CPU(cs);
72223e770bf7SBruno Larsen (billionai) 
72233e770bf7SBruno Larsen (billionai)     cpu->env.nip = value;
72243e770bf7SBruno Larsen (billionai) }
72253e770bf7SBruno Larsen (billionai) 
ppc_cpu_get_pc(CPUState * cs)7226e4fdf9dfSRichard Henderson static vaddr ppc_cpu_get_pc(CPUState *cs)
7227e4fdf9dfSRichard Henderson {
7228e4fdf9dfSRichard Henderson     PowerPCCPU *cpu = POWERPC_CPU(cs);
7229e4fdf9dfSRichard Henderson 
7230e4fdf9dfSRichard Henderson     return cpu->env.nip;
7231e4fdf9dfSRichard Henderson }
7232e4fdf9dfSRichard Henderson 
7233049b4ad6SVaibhav Jain #ifdef CONFIG_TCG
ppc_restore_state_to_opc(CPUState * cs,const TranslationBlock * tb,const uint64_t * data)723461bd1d29SRichard Henderson static void ppc_restore_state_to_opc(CPUState *cs,
723561bd1d29SRichard Henderson                                      const TranslationBlock *tb,
723661bd1d29SRichard Henderson                                      const uint64_t *data)
723761bd1d29SRichard Henderson {
723861bd1d29SRichard Henderson     PowerPCCPU *cpu = POWERPC_CPU(cs);
723961bd1d29SRichard Henderson 
724061bd1d29SRichard Henderson     cpu->env.nip = data[0];
724161bd1d29SRichard Henderson }
7242049b4ad6SVaibhav Jain #endif /* CONFIG_TCG */
724361bd1d29SRichard Henderson 
ppc_cpu_has_work(CPUState * cs)72443e770bf7SBruno Larsen (billionai) static bool ppc_cpu_has_work(CPUState *cs)
72453e770bf7SBruno Larsen (billionai) {
7246ab9cfa04SMatheus Ferst     return cs->interrupt_request & CPU_INTERRUPT_HARD;
72473e770bf7SBruno Larsen (billionai) }
72483e770bf7SBruno Larsen (billionai) 
ppc_cpu_mmu_index(CPUState * cs,bool ifetch)7249f331e82cSRichard Henderson static int ppc_cpu_mmu_index(CPUState *cs, bool ifetch)
7250f331e82cSRichard Henderson {
7251f331e82cSRichard Henderson     return ppc_env_mmu_index(cpu_env(cs), ifetch);
7252f331e82cSRichard Henderson }
7253f331e82cSRichard Henderson 
ppc_cpu_reset_hold(Object * obj,ResetType type)7254ad80e367SPeter Maydell static void ppc_cpu_reset_hold(Object *obj, ResetType type)
72553e770bf7SBruno Larsen (billionai) {
7256348802b5SPhilippe Mathieu-Daudé     CPUState *cs = CPU(obj);
7257348802b5SPhilippe Mathieu-Daudé     PowerPCCPU *cpu = POWERPC_CPU(cs);
7258348802b5SPhilippe Mathieu-Daudé     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(obj);
72593e770bf7SBruno Larsen (billionai)     CPUPPCState *env = &cpu->env;
72603e770bf7SBruno Larsen (billionai)     target_ulong msr;
72613e770bf7SBruno Larsen (billionai)     int i;
72623e770bf7SBruno Larsen (billionai) 
7263a1c5d644SPeter Maydell     if (pcc->parent_phases.hold) {
7264ad80e367SPeter Maydell         pcc->parent_phases.hold(obj, type);
7265a1c5d644SPeter Maydell     }
72663e770bf7SBruno Larsen (billionai) 
72673e770bf7SBruno Larsen (billionai)     msr = (target_ulong)0;
72683e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)MSR_HVB;
72693e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_EP;
72703e770bf7SBruno Larsen (billionai) #if defined(DO_SINGLE_STEP) && 0
72713e770bf7SBruno Larsen (billionai)     /* Single step trace mode */
72723e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_SE;
72733e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_BE;
72743e770bf7SBruno Larsen (billionai) #endif
72753e770bf7SBruno Larsen (billionai) #if defined(CONFIG_USER_ONLY)
72763e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */
72773e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_FE0; /* Allow floating point exceptions */
72783e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_FE1;
72793e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */
72803e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_VSX; /* Allow VSX usage */
72813e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */
72823e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_PR;
72833e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
72843e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_TM; /* Transactional memory */
72853e770bf7SBruno Larsen (billionai) #endif
7286ee3eb3a7SMarc-André Lureau #if !TARGET_BIG_ENDIAN
72873e770bf7SBruno Larsen (billionai)     msr |= (target_ulong)1 << MSR_LE; /* Little-endian user mode */
72883e770bf7SBruno Larsen (billionai)     if (!((env->msr_mask >> MSR_LE) & 1)) {
72893e770bf7SBruno Larsen (billionai)         fprintf(stderr, "Selected CPU does not support little-endian.\n");
72903e770bf7SBruno Larsen (billionai)         exit(1);
72913e770bf7SBruno Larsen (billionai)     }
72923e770bf7SBruno Larsen (billionai) #endif
72933e770bf7SBruno Larsen (billionai) #endif
72943e770bf7SBruno Larsen (billionai) 
72953e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
72963e770bf7SBruno Larsen (billionai)     if (mmu_is_64bit(env->mmu_model)) {
72973e770bf7SBruno Larsen (billionai)         msr |= (1ULL << MSR_SF);
72983e770bf7SBruno Larsen (billionai)     }
72993e770bf7SBruno Larsen (billionai) #endif
73003e770bf7SBruno Larsen (billionai) 
73013e770bf7SBruno Larsen (billionai)     hreg_store_msr(env, msr, 1);
73023e770bf7SBruno Larsen (billionai) 
73033e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
73043e770bf7SBruno Larsen (billionai)     env->nip = env->hreset_vector | env->excp_prefix;
730533edcde7SDaniel Henrique Barboza 
730633edcde7SDaniel Henrique Barboza     if (tcg_enabled()) {
7307348802b5SPhilippe Mathieu-Daudé         cpu_breakpoint_remove_all(cs, BP_CPU);
7308348802b5SPhilippe Mathieu-Daudé         cpu_watchpoint_remove_all(cs, BP_CPU);
73093e770bf7SBruno Larsen (billionai)         if (env->mmu_model != POWERPC_MMU_REAL) {
73103e770bf7SBruno Larsen (billionai)             ppc_tlb_invalidate_all(env);
73113e770bf7SBruno Larsen (billionai)         }
7312a7138e28SGlenn Miles         pmu_mmcr01a_updated(env);
731333edcde7SDaniel Henrique Barboza     }
7314609b1c86SFrederic Barrat 
7315609b1c86SFrederic Barrat     /* clean any pending stop state */
7316609b1c86SFrederic Barrat     env->resume_as_sreset = 0;
731733edcde7SDaniel Henrique Barboza #endif
73183e770bf7SBruno Larsen (billionai)     hreg_compute_hflags(env);
73193e770bf7SBruno Larsen (billionai)     env->reserve_addr = (target_ulong)-1ULL;
73203e770bf7SBruno Larsen (billionai)     /* Be sure no exception or interrupt is pending */
73213e770bf7SBruno Larsen (billionai)     env->pending_interrupts = 0;
7322348802b5SPhilippe Mathieu-Daudé     cs->exception_index = POWERPC_EXCP_NONE;
73233e770bf7SBruno Larsen (billionai)     env->error_code = 0;
73243e770bf7SBruno Larsen (billionai)     ppc_irq_reset(cpu);
73253e770bf7SBruno Larsen (billionai) 
73263e770bf7SBruno Larsen (billionai)     /* tininess for underflow is detected before rounding */
73273e770bf7SBruno Larsen (billionai)     set_float_detect_tininess(float_tininess_before_rounding,
73283e770bf7SBruno Larsen (billionai)                               &env->fp_status);
73293e770bf7SBruno Larsen (billionai) 
73303e770bf7SBruno Larsen (billionai)     for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
73313e770bf7SBruno Larsen (billionai)         ppc_spr_t *spr = &env->spr_cb[i];
73323e770bf7SBruno Larsen (billionai) 
73333e770bf7SBruno Larsen (billionai)         if (!spr->name) {
73343e770bf7SBruno Larsen (billionai)             continue;
73353e770bf7SBruno Larsen (billionai)         }
73363e770bf7SBruno Larsen (billionai)         env->spr[i] = spr->default_value;
73373e770bf7SBruno Larsen (billionai)     }
73384de4a470SGlenn Miles 
73394de4a470SGlenn Miles #if defined(TARGET_PPC64)
73404de4a470SGlenn Miles     bhrb_reset_state(env);
73414de4a470SGlenn Miles #endif
73423e770bf7SBruno Larsen (billionai) }
73433e770bf7SBruno Larsen (billionai) 
73443e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
73453e770bf7SBruno Larsen (billionai) 
ppc_cpu_is_big_endian(CPUState * cs)73463e770bf7SBruno Larsen (billionai) static bool ppc_cpu_is_big_endian(CPUState *cs)
73473e770bf7SBruno Larsen (billionai) {
73483e770bf7SBruno Larsen (billionai)     cpu_synchronize_state(cs);
73493e770bf7SBruno Larsen (billionai) 
7350794511bcSPhilippe Mathieu-Daudé     return !FIELD_EX64(cpu_env(cs)->msr, MSR, LE);
73513e770bf7SBruno Larsen (billionai) }
73523e770bf7SBruno Larsen (billionai) 
ppc_get_irq_stats(InterruptStatsProvider * obj,uint64_t ** irq_counts,unsigned int * nb_irqs)73538a15cceeSBALATON Zoltan static bool ppc_get_irq_stats(InterruptStatsProvider *obj,
73548a15cceeSBALATON Zoltan                               uint64_t **irq_counts, unsigned int *nb_irqs)
73558a15cceeSBALATON Zoltan {
73568a15cceeSBALATON Zoltan     CPUPPCState *env = &POWERPC_CPU(obj)->env;
73578a15cceeSBALATON Zoltan 
73588a15cceeSBALATON Zoltan     *irq_counts = env->excp_stats;
73598a15cceeSBALATON Zoltan     *nb_irqs = ARRAY_SIZE(env->excp_stats);
73608a15cceeSBALATON Zoltan     return true;
73618a15cceeSBALATON Zoltan }
73628a15cceeSBALATON Zoltan 
73633e770bf7SBruno Larsen (billionai) #ifdef CONFIG_TCG
ppc_cpu_exec_enter(CPUState * cs)73643e770bf7SBruno Larsen (billionai) static void ppc_cpu_exec_enter(CPUState *cs)
73653e770bf7SBruno Larsen (billionai) {
73663e770bf7SBruno Larsen (billionai)     PowerPCCPU *cpu = POWERPC_CPU(cs);
73673e770bf7SBruno Larsen (billionai) 
73683e770bf7SBruno Larsen (billionai)     if (cpu->vhyp) {
7369c700b5e1SNicholas Piggin         cpu->vhyp_class->cpu_exec_enter(cpu->vhyp, cpu);
73703e770bf7SBruno Larsen (billionai)     }
73713e770bf7SBruno Larsen (billionai) }
73723e770bf7SBruno Larsen (billionai) 
ppc_cpu_exec_exit(CPUState * cs)73733e770bf7SBruno Larsen (billionai) static void ppc_cpu_exec_exit(CPUState *cs)
73743e770bf7SBruno Larsen (billionai) {
73753e770bf7SBruno Larsen (billionai)     PowerPCCPU *cpu = POWERPC_CPU(cs);
73763e770bf7SBruno Larsen (billionai) 
73773e770bf7SBruno Larsen (billionai)     if (cpu->vhyp) {
7378c700b5e1SNicholas Piggin         cpu->vhyp_class->cpu_exec_exit(cpu->vhyp, cpu);
73793e770bf7SBruno Larsen (billionai)     }
73803e770bf7SBruno Larsen (billionai) }
73813e770bf7SBruno Larsen (billionai) #endif /* CONFIG_TCG */
73823e770bf7SBruno Larsen (billionai) 
73833e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
73843e770bf7SBruno Larsen (billionai) 
ppc_cpu_instance_init(Object * obj)73853e770bf7SBruno Larsen (billionai) static void ppc_cpu_instance_init(Object *obj)
73863e770bf7SBruno Larsen (billionai) {
73873e770bf7SBruno Larsen (billionai)     PowerPCCPU *cpu = POWERPC_CPU(obj);
73883e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
73893e770bf7SBruno Larsen (billionai)     CPUPPCState *env = &cpu->env;
73903e770bf7SBruno Larsen (billionai) 
73913e770bf7SBruno Larsen (billionai)     cpu->vcpu_id = UNASSIGNED_CPU_INDEX;
73923e770bf7SBruno Larsen (billionai) 
73933e770bf7SBruno Larsen (billionai)     env->msr_mask = pcc->msr_mask;
73943e770bf7SBruno Larsen (billionai)     env->mmu_model = pcc->mmu_model;
73953e770bf7SBruno Larsen (billionai)     env->excp_model = pcc->excp_model;
73963e770bf7SBruno Larsen (billionai)     env->bus_model = pcc->bus_model;
73973e770bf7SBruno Larsen (billionai)     env->insns_flags = pcc->insns_flags;
73983e770bf7SBruno Larsen (billionai)     env->insns_flags2 = pcc->insns_flags2;
73993e770bf7SBruno Larsen (billionai)     env->flags = pcc->flags;
74003e770bf7SBruno Larsen (billionai)     env->bfd_mach = pcc->bfd_mach;
74013e770bf7SBruno Larsen (billionai)     env->check_pow = pcc->check_pow;
740245693f94SNicholas Piggin     env->check_attn = pcc->check_attn;
74033e770bf7SBruno Larsen (billionai) 
74043e770bf7SBruno Larsen (billionai)     /*
74053e770bf7SBruno Larsen (billionai)      * Mark HV mode as supported if the CPU has an MSR_HV bit in the
74063e770bf7SBruno Larsen (billionai)      * msr_mask. The mask can later be cleared by PAPR mode but the hv
74073e770bf7SBruno Larsen (billionai)      * mode support will remain, thus enforcing that we cannot use
74083e770bf7SBruno Larsen (billionai)      * priv. instructions in guest in PAPR mode. For 970 we currently
74093e770bf7SBruno Larsen (billionai)      * simply don't set HV in msr_mask thus simulating an "Apple mode"
74103e770bf7SBruno Larsen (billionai)      * 970. If we ever want to support 970 HV mode, we'll have to add
74113e770bf7SBruno Larsen (billionai)      * a processor attribute of some sort.
74123e770bf7SBruno Larsen (billionai)      */
74133e770bf7SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
74143e770bf7SBruno Larsen (billionai)     env->has_hv_mode = !!(env->msr_mask & MSR_HVB);
74153e770bf7SBruno Larsen (billionai) #endif
74163e770bf7SBruno Larsen (billionai) 
74173e770bf7SBruno Larsen (billionai)     ppc_hash64_init(cpu);
74183e770bf7SBruno Larsen (billionai) }
74193e770bf7SBruno Larsen (billionai) 
ppc_cpu_instance_finalize(Object * obj)74203e770bf7SBruno Larsen (billionai) static void ppc_cpu_instance_finalize(Object *obj)
74213e770bf7SBruno Larsen (billionai) {
74223e770bf7SBruno Larsen (billionai)     PowerPCCPU *cpu = POWERPC_CPU(obj);
74233e770bf7SBruno Larsen (billionai) 
74243e770bf7SBruno Larsen (billionai)     ppc_hash64_finalize(cpu);
74253e770bf7SBruno Larsen (billionai) }
74263e770bf7SBruno Larsen (billionai) 
ppc_pvr_match_default(PowerPCCPUClass * pcc,uint32_t pvr,bool best)742721d3a78eSNicholas Piggin static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr, bool best)
74283e770bf7SBruno Larsen (billionai) {
74293e770bf7SBruno Larsen (billionai)     return pcc->pvr == pvr;
74303e770bf7SBruno Larsen (billionai) }
74313e770bf7SBruno Larsen (billionai) 
ppc_disas_set_info(CPUState * cs,disassemble_info * info)74323e770bf7SBruno Larsen (billionai) static void ppc_disas_set_info(CPUState *cs, disassemble_info *info)
74333e770bf7SBruno Larsen (billionai) {
7434794511bcSPhilippe Mathieu-Daudé     CPUPPCState *env = cpu_env(cs);
74353e770bf7SBruno Larsen (billionai) 
74363e770bf7SBruno Larsen (billionai)     if ((env->hflags >> MSR_LE) & 1) {
74373e770bf7SBruno Larsen (billionai)         info->endian = BFD_ENDIAN_LITTLE;
74383e770bf7SBruno Larsen (billionai)     }
74393e770bf7SBruno Larsen (billionai)     info->mach = env->bfd_mach;
74403e770bf7SBruno Larsen (billionai)     if (!env->bfd_mach) {
74413e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
74423e770bf7SBruno Larsen (billionai)         info->mach = bfd_mach_ppc64;
74433e770bf7SBruno Larsen (billionai) #else
74443e770bf7SBruno Larsen (billionai)         info->mach = bfd_mach_ppc;
74453e770bf7SBruno Larsen (billionai) #endif
74463e770bf7SBruno Larsen (billionai)     }
74473e770bf7SBruno Larsen (billionai) 
74483e770bf7SBruno Larsen (billionai)     info->cap_arch = CS_ARCH_PPC;
74493e770bf7SBruno Larsen (billionai) #ifdef TARGET_PPC64
74503e770bf7SBruno Larsen (billionai)     info->cap_mode = CS_MODE_64;
74513e770bf7SBruno Larsen (billionai) #endif
74523e770bf7SBruno Larsen (billionai) }
74533e770bf7SBruno Larsen (billionai) 
74543e770bf7SBruno Larsen (billionai) static Property ppc_cpu_properties[] = {
74553e770bf7SBruno Larsen (billionai)     DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU, pre_2_8_migration, false),
74563e770bf7SBruno Larsen (billionai)     DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU, pre_2_10_migration,
74573e770bf7SBruno Larsen (billionai)                      false),
74583e770bf7SBruno Larsen (billionai)     DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU, pre_3_0_migration,
74593e770bf7SBruno Larsen (billionai)                      false),
74603e770bf7SBruno Larsen (billionai)     DEFINE_PROP_END_OF_LIST(),
74613e770bf7SBruno Larsen (billionai) };
74623e770bf7SBruno Larsen (billionai) 
74638b80bd28SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY
74648b80bd28SPhilippe Mathieu-Daudé #include "hw/core/sysemu-cpu-ops.h"
74658b80bd28SPhilippe Mathieu-Daudé 
74668b80bd28SPhilippe Mathieu-Daudé static const struct SysemuCPUOps ppc_sysemu_ops = {
746708928c6dSPhilippe Mathieu-Daudé     .get_phys_page_debug = ppc_cpu_get_phys_page_debug,
7468715e3c1aSPhilippe Mathieu-Daudé     .write_elf32_note = ppc32_cpu_write_elf32_note,
7469715e3c1aSPhilippe Mathieu-Daudé     .write_elf64_note = ppc64_cpu_write_elf64_note,
7470da383e02SPhilippe Mathieu-Daudé     .virtio_is_big_endian = ppc_cpu_is_big_endian,
7471feece4d0SPhilippe Mathieu-Daudé     .legacy_vmsd = &vmstate_ppc_cpu,
74728b80bd28SPhilippe Mathieu-Daudé };
74738b80bd28SPhilippe Mathieu-Daudé #endif
74748b80bd28SPhilippe Mathieu-Daudé 
74753e770bf7SBruno Larsen (billionai) #ifdef CONFIG_TCG
74763e770bf7SBruno Larsen (billionai) #include "hw/core/tcg-cpu-ops.h"
74773e770bf7SBruno Larsen (billionai) 
74781764ad70SRichard Henderson static const TCGCPUOps ppc_tcg_ops = {
74793e770bf7SBruno Larsen (billionai)   .initialize = ppc_translate_init,
748061bd1d29SRichard Henderson   .restore_state_to_opc = ppc_restore_state_to_opc,
74813e770bf7SBruno Larsen (billionai) 
74821db8af5cSRichard Henderson #ifdef CONFIG_USER_ONLY
74831db8af5cSRichard Henderson   .record_sigsegv = ppc_cpu_record_sigsegv,
74841db8af5cSRichard Henderson #else
74851db8af5cSRichard Henderson   .tlb_fill = ppc_cpu_tlb_fill,
7486f725245cSPhilippe Mathieu-Daudé   .cpu_exec_interrupt = ppc_cpu_exec_interrupt,
74874f7b1ecbSPeter Maydell   .cpu_exec_halt = ppc_cpu_has_work,
74883e770bf7SBruno Larsen (billionai)   .do_interrupt = ppc_cpu_do_interrupt,
74893e770bf7SBruno Larsen (billionai)   .cpu_exec_enter = ppc_cpu_exec_enter,
74903e770bf7SBruno Larsen (billionai)   .cpu_exec_exit = ppc_cpu_exec_exit,
74913e770bf7SBruno Larsen (billionai)   .do_unaligned_access = ppc_cpu_do_unaligned_access,
749255a7fa34SNicholas Piggin   .do_transaction_failed = ppc_cpu_do_transaction_failed,
749314192307SNicholas Piggin   .debug_excp_handler = ppc_cpu_debug_excp_handler,
749414192307SNicholas Piggin   .debug_check_breakpoint = ppc_cpu_debug_check_breakpoint,
7495d5ee641cSNicholas Piggin   .debug_check_watchpoint = ppc_cpu_debug_check_watchpoint,
74963e770bf7SBruno Larsen (billionai) #endif /* !CONFIG_USER_ONLY */
74973e770bf7SBruno Larsen (billionai) };
74983e770bf7SBruno Larsen (billionai) #endif /* CONFIG_TCG */
74993e770bf7SBruno Larsen (billionai) 
ppc_cpu_class_init(ObjectClass * oc,void * data)75003e770bf7SBruno Larsen (billionai) static void ppc_cpu_class_init(ObjectClass *oc, void *data)
75013e770bf7SBruno Larsen (billionai) {
75023e770bf7SBruno Larsen (billionai)     PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
75033e770bf7SBruno Larsen (billionai)     CPUClass *cc = CPU_CLASS(oc);
75043e770bf7SBruno Larsen (billionai)     DeviceClass *dc = DEVICE_CLASS(oc);
7505a1c5d644SPeter Maydell     ResettableClass *rc = RESETTABLE_CLASS(oc);
75063e770bf7SBruno Larsen (billionai) 
75073e770bf7SBruno Larsen (billionai)     device_class_set_parent_realize(dc, ppc_cpu_realize,
75083e770bf7SBruno Larsen (billionai)                                     &pcc->parent_realize);
75093e770bf7SBruno Larsen (billionai)     device_class_set_parent_unrealize(dc, ppc_cpu_unrealize,
75103e770bf7SBruno Larsen (billionai)                                       &pcc->parent_unrealize);
75113e770bf7SBruno Larsen (billionai)     pcc->pvr_match = ppc_pvr_match_default;
75123e770bf7SBruno Larsen (billionai)     device_class_set_props(dc, ppc_cpu_properties);
75133e770bf7SBruno Larsen (billionai) 
7514a1c5d644SPeter Maydell     resettable_class_set_parent_phases(rc, NULL, ppc_cpu_reset_hold, NULL,
7515a1c5d644SPeter Maydell                                        &pcc->parent_phases);
75163e770bf7SBruno Larsen (billionai) 
75173e770bf7SBruno Larsen (billionai)     cc->class_by_name = ppc_cpu_class_by_name;
75183e770bf7SBruno Larsen (billionai)     cc->has_work = ppc_cpu_has_work;
7519f331e82cSRichard Henderson     cc->mmu_index = ppc_cpu_mmu_index;
75203e770bf7SBruno Larsen (billionai)     cc->dump_state = ppc_cpu_dump_state;
75213e770bf7SBruno Larsen (billionai)     cc->set_pc = ppc_cpu_set_pc;
7522e4fdf9dfSRichard Henderson     cc->get_pc = ppc_cpu_get_pc;
75233e770bf7SBruno Larsen (billionai)     cc->gdb_read_register = ppc_cpu_gdb_read_register;
75243e770bf7SBruno Larsen (billionai)     cc->gdb_write_register = ppc_cpu_gdb_write_register;
75253e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
75268b80bd28SPhilippe Mathieu-Daudé     cc->sysemu_ops = &ppc_sysemu_ops;
75278a15cceeSBALATON Zoltan     INTERRUPT_STATS_PROVIDER_CLASS(oc)->get_statistics = ppc_get_irq_stats;
7528cd1038ecSBALATON Zoltan 
7529cd1038ecSBALATON Zoltan     /* check_prot_access_type relies on MMU access and PAGE bits relations */
7530cd1038ecSBALATON Zoltan     qemu_build_assert(MMU_DATA_LOAD == 0 && MMU_DATA_STORE == 1 &&
7531cd1038ecSBALATON Zoltan                       MMU_INST_FETCH == 2 && PAGE_READ == 1 &&
7532cd1038ecSBALATON Zoltan                       PAGE_WRITE == 2 && PAGE_EXEC == 4);
75333e770bf7SBruno Larsen (billionai) #endif
75343e770bf7SBruno Larsen (billionai) 
75353e770bf7SBruno Larsen (billionai)     cc->gdb_num_core_regs = 71;
75363e770bf7SBruno Larsen (billionai) #ifdef USE_APPLE_GDB
75373e770bf7SBruno Larsen (billionai)     cc->gdb_read_register = ppc_cpu_gdb_read_register_apple;
75383e770bf7SBruno Larsen (billionai)     cc->gdb_write_register = ppc_cpu_gdb_write_register_apple;
75393e770bf7SBruno Larsen (billionai)     cc->gdb_num_core_regs = 71 + 32;
75403e770bf7SBruno Larsen (billionai) #endif
75413e770bf7SBruno Larsen (billionai) 
75423e770bf7SBruno Larsen (billionai)     cc->gdb_arch_name = ppc_gdb_arch_name;
75433e770bf7SBruno Larsen (billionai) #if defined(TARGET_PPC64)
75443e770bf7SBruno Larsen (billionai)     cc->gdb_core_xml_file = "power64-core.xml";
75453e770bf7SBruno Larsen (billionai) #else
75463e770bf7SBruno Larsen (billionai)     cc->gdb_core_xml_file = "power-core.xml";
75473e770bf7SBruno Larsen (billionai) #endif
75483e770bf7SBruno Larsen (billionai)     cc->disas_set_info = ppc_disas_set_info;
75493e770bf7SBruno Larsen (billionai) 
75503e770bf7SBruno Larsen (billionai)     dc->fw_name = "PowerPC,UNKNOWN";
75513e770bf7SBruno Larsen (billionai) 
75523e770bf7SBruno Larsen (billionai) #ifdef CONFIG_TCG
75533e770bf7SBruno Larsen (billionai)     cc->tcg_ops = &ppc_tcg_ops;
75543e770bf7SBruno Larsen (billionai) #endif /* CONFIG_TCG */
75553e770bf7SBruno Larsen (billionai) }
75563e770bf7SBruno Larsen (billionai) 
75573e770bf7SBruno Larsen (billionai) static const TypeInfo ppc_cpu_type_info = {
75583e770bf7SBruno Larsen (billionai)     .name = TYPE_POWERPC_CPU,
75593e770bf7SBruno Larsen (billionai)     .parent = TYPE_CPU,
75603e770bf7SBruno Larsen (billionai)     .instance_size = sizeof(PowerPCCPU),
75613e770bf7SBruno Larsen (billionai)     .instance_align = __alignof__(PowerPCCPU),
75623e770bf7SBruno Larsen (billionai)     .instance_init = ppc_cpu_instance_init,
75633e770bf7SBruno Larsen (billionai)     .instance_finalize = ppc_cpu_instance_finalize,
75643e770bf7SBruno Larsen (billionai)     .abstract = true,
75653e770bf7SBruno Larsen (billionai)     .class_size = sizeof(PowerPCCPUClass),
75663e770bf7SBruno Larsen (billionai)     .class_init = ppc_cpu_class_init,
75678a15cceeSBALATON Zoltan #ifndef CONFIG_USER_ONLY
75688a15cceeSBALATON Zoltan     .interfaces = (InterfaceInfo[]) {
75698a15cceeSBALATON Zoltan           { TYPE_INTERRUPT_STATS_PROVIDER },
75708a15cceeSBALATON Zoltan           { }
75718a15cceeSBALATON Zoltan     },
75728a15cceeSBALATON Zoltan #endif
75733e770bf7SBruno Larsen (billionai) };
75743e770bf7SBruno Larsen (billionai) 
75753e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
75763e770bf7SBruno Larsen (billionai) static const TypeInfo ppc_vhyp_type_info = {
75773e770bf7SBruno Larsen (billionai)     .name = TYPE_PPC_VIRTUAL_HYPERVISOR,
75783e770bf7SBruno Larsen (billionai)     .parent = TYPE_INTERFACE,
75793e770bf7SBruno Larsen (billionai)     .class_size = sizeof(PPCVirtualHypervisorClass),
75803e770bf7SBruno Larsen (billionai) };
75813e770bf7SBruno Larsen (billionai) #endif
75823e770bf7SBruno Larsen (billionai) 
ppc_cpu_register_types(void)75833e770bf7SBruno Larsen (billionai) static void ppc_cpu_register_types(void)
75843e770bf7SBruno Larsen (billionai) {
75853e770bf7SBruno Larsen (billionai)     type_register_static(&ppc_cpu_type_info);
75863e770bf7SBruno Larsen (billionai) #ifndef CONFIG_USER_ONLY
75873e770bf7SBruno Larsen (billionai)     type_register_static(&ppc_vhyp_type_info);
75883e770bf7SBruno Larsen (billionai) #endif
75893e770bf7SBruno Larsen (billionai) }
75903e770bf7SBruno Larsen (billionai) 
ppc_cpu_dump_state(CPUState * cs,FILE * f,int flags)759147334e17SBruno Larsen (billionai) void ppc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
759247334e17SBruno Larsen (billionai) {
759347334e17SBruno Larsen (billionai) #define RGPL  4
759447334e17SBruno Larsen (billionai) #define RFPL  4
759547334e17SBruno Larsen (billionai) 
7596794511bcSPhilippe Mathieu-Daudé     CPUPPCState *env = cpu_env(cs);
759747334e17SBruno Larsen (billionai)     int i;
759847334e17SBruno Larsen (billionai) 
759947334e17SBruno Larsen (billionai)     qemu_fprintf(f, "NIP " TARGET_FMT_lx "   LR " TARGET_FMT_lx " CTR "
760047334e17SBruno Larsen (billionai)                  TARGET_FMT_lx " XER " TARGET_FMT_lx " CPU#%d\n",
760147334e17SBruno Larsen (billionai)                  env->nip, env->lr, env->ctr, cpu_read_xer(env),
760247334e17SBruno Larsen (billionai)                  cs->cpu_index);
760347334e17SBruno Larsen (billionai)     qemu_fprintf(f, "MSR " TARGET_FMT_lx " HID0 " TARGET_FMT_lx "  HF "
760447334e17SBruno Larsen (billionai)                  "%08x iidx %d didx %d\n",
760547334e17SBruno Larsen (billionai)                  env->msr, env->spr[SPR_HID0], env->hflags,
7606fb00f730SRichard Henderson                  ppc_env_mmu_index(env, true), ppc_env_mmu_index(env, false));
76073778aa97SMatheus Ferst #if !defined(CONFIG_USER_ONLY)
76083778aa97SMatheus Ferst     if (env->tb_env) {
760947334e17SBruno Larsen (billionai)         qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64
76103778aa97SMatheus Ferst                      " DECR " TARGET_FMT_lu "\n", cpu_ppc_load_tbu(env),
76113778aa97SMatheus Ferst                      cpu_ppc_load_tbl(env), cpu_ppc_load_decr(env));
76123778aa97SMatheus Ferst     }
76133778aa97SMatheus Ferst #else
76143778aa97SMatheus Ferst     qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64 "\n", cpu_ppc_load_tbu(env),
76153778aa97SMatheus Ferst                  cpu_ppc_load_tbl(env));
761647334e17SBruno Larsen (billionai) #endif
761747334e17SBruno Larsen (billionai)     for (i = 0; i < 32; i++) {
761847334e17SBruno Larsen (billionai)         if ((i & (RGPL - 1)) == 0) {
761947334e17SBruno Larsen (billionai)             qemu_fprintf(f, "GPR%02d", i);
762047334e17SBruno Larsen (billionai)         }
762147334e17SBruno Larsen (billionai)         qemu_fprintf(f, " %016" PRIx64, ppc_dump_gpr(env, i));
762247334e17SBruno Larsen (billionai)         if ((i & (RGPL - 1)) == (RGPL - 1)) {
762347334e17SBruno Larsen (billionai)             qemu_fprintf(f, "\n");
762447334e17SBruno Larsen (billionai)         }
762547334e17SBruno Larsen (billionai)     }
762647334e17SBruno Larsen (billionai)     qemu_fprintf(f, "CR ");
762747334e17SBruno Larsen (billionai)     for (i = 0; i < 8; i++)
762847334e17SBruno Larsen (billionai)         qemu_fprintf(f, "%01x", env->crf[i]);
762947334e17SBruno Larsen (billionai)     qemu_fprintf(f, "  [");
763047334e17SBruno Larsen (billionai)     for (i = 0; i < 8; i++) {
763147334e17SBruno Larsen (billionai)         char a = '-';
763247334e17SBruno Larsen (billionai)         if (env->crf[i] & 0x08) {
763347334e17SBruno Larsen (billionai)             a = 'L';
763447334e17SBruno Larsen (billionai)         } else if (env->crf[i] & 0x04) {
763547334e17SBruno Larsen (billionai)             a = 'G';
763647334e17SBruno Larsen (billionai)         } else if (env->crf[i] & 0x02) {
763747334e17SBruno Larsen (billionai)             a = 'E';
763847334e17SBruno Larsen (billionai)         }
763947334e17SBruno Larsen (billionai)         qemu_fprintf(f, " %c%c", a, env->crf[i] & 0x01 ? 'O' : ' ');
764047334e17SBruno Larsen (billionai)     }
7641392d328aSNicholas Piggin     qemu_fprintf(f, " ]     RES %03x@" TARGET_FMT_lx "\n",
7642392d328aSNicholas Piggin                  (int)env->reserve_length, env->reserve_addr);
764347334e17SBruno Larsen (billionai) 
764447334e17SBruno Larsen (billionai)     if (flags & CPU_DUMP_FPU) {
764547334e17SBruno Larsen (billionai)         for (i = 0; i < 32; i++) {
764647334e17SBruno Larsen (billionai)             if ((i & (RFPL - 1)) == 0) {
764747334e17SBruno Larsen (billionai)                 qemu_fprintf(f, "FPR%02d", i);
764847334e17SBruno Larsen (billionai)             }
764947334e17SBruno Larsen (billionai)             qemu_fprintf(f, " %016" PRIx64, *cpu_fpr_ptr(env, i));
765047334e17SBruno Larsen (billionai)             if ((i & (RFPL - 1)) == (RFPL - 1)) {
765147334e17SBruno Larsen (billionai)                 qemu_fprintf(f, "\n");
765247334e17SBruno Larsen (billionai)             }
765347334e17SBruno Larsen (billionai)         }
765447334e17SBruno Larsen (billionai)         qemu_fprintf(f, "FPSCR " TARGET_FMT_lx "\n", env->fpscr);
765547334e17SBruno Larsen (billionai)     }
765647334e17SBruno Larsen (billionai) 
765747334e17SBruno Larsen (billionai) #if !defined(CONFIG_USER_ONLY)
765847334e17SBruno Larsen (billionai)     qemu_fprintf(f, " SRR0 " TARGET_FMT_lx "  SRR1 " TARGET_FMT_lx
765947334e17SBruno Larsen (billionai)                  "    PVR " TARGET_FMT_lx " VRSAVE " TARGET_FMT_lx "\n",
766047334e17SBruno Larsen (billionai)                  env->spr[SPR_SRR0], env->spr[SPR_SRR1],
766147334e17SBruno Larsen (billionai)                  env->spr[SPR_PVR], env->spr[SPR_VRSAVE]);
766247334e17SBruno Larsen (billionai) 
766347334e17SBruno Larsen (billionai)     qemu_fprintf(f, "SPRG0 " TARGET_FMT_lx " SPRG1 " TARGET_FMT_lx
766447334e17SBruno Larsen (billionai)                  "  SPRG2 " TARGET_FMT_lx "  SPRG3 " TARGET_FMT_lx "\n",
766547334e17SBruno Larsen (billionai)                  env->spr[SPR_SPRG0], env->spr[SPR_SPRG1],
766647334e17SBruno Larsen (billionai)                  env->spr[SPR_SPRG2], env->spr[SPR_SPRG3]);
766747334e17SBruno Larsen (billionai) 
766847334e17SBruno Larsen (billionai)     qemu_fprintf(f, "SPRG4 " TARGET_FMT_lx " SPRG5 " TARGET_FMT_lx
766947334e17SBruno Larsen (billionai)                  "  SPRG6 " TARGET_FMT_lx "  SPRG7 " TARGET_FMT_lx "\n",
767047334e17SBruno Larsen (billionai)                  env->spr[SPR_SPRG4], env->spr[SPR_SPRG5],
767147334e17SBruno Larsen (billionai)                  env->spr[SPR_SPRG6], env->spr[SPR_SPRG7]);
767247334e17SBruno Larsen (billionai) 
7673fbe08667SCédric Le Goater     switch (env->excp_model) {
767447334e17SBruno Larsen (billionai) #if defined(TARGET_PPC64)
7675fbe08667SCédric Le Goater     case POWERPC_EXCP_POWER7:
7676fbe08667SCédric Le Goater     case POWERPC_EXCP_POWER8:
7677fbe08667SCédric Le Goater     case POWERPC_EXCP_POWER9:
7678fbe08667SCédric Le Goater     case POWERPC_EXCP_POWER10:
767947334e17SBruno Larsen (billionai)         qemu_fprintf(f, "HSRR0 " TARGET_FMT_lx " HSRR1 " TARGET_FMT_lx "\n",
768047334e17SBruno Larsen (billionai)                      env->spr[SPR_HSRR0], env->spr[SPR_HSRR1]);
7681fbe08667SCédric Le Goater         break;
768247334e17SBruno Larsen (billionai) #endif
7683fbe08667SCédric Le Goater     case POWERPC_EXCP_BOOKE:
768447334e17SBruno Larsen (billionai)         qemu_fprintf(f, "CSRR0 " TARGET_FMT_lx " CSRR1 " TARGET_FMT_lx
768547334e17SBruno Larsen (billionai)                      " MCSRR0 " TARGET_FMT_lx " MCSRR1 " TARGET_FMT_lx "\n",
768647334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_CSRR0], env->spr[SPR_BOOKE_CSRR1],
768747334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_MCSRR0], env->spr[SPR_BOOKE_MCSRR1]);
768847334e17SBruno Larsen (billionai) 
768947334e17SBruno Larsen (billionai)         qemu_fprintf(f, "  TCR " TARGET_FMT_lx "   TSR " TARGET_FMT_lx
769047334e17SBruno Larsen (billionai)                      "    ESR " TARGET_FMT_lx "   DEAR " TARGET_FMT_lx "\n",
769147334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_TCR], env->spr[SPR_BOOKE_TSR],
769247334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_ESR], env->spr[SPR_BOOKE_DEAR]);
769347334e17SBruno Larsen (billionai) 
769447334e17SBruno Larsen (billionai)         qemu_fprintf(f, "  PIR " TARGET_FMT_lx " DECAR " TARGET_FMT_lx
769547334e17SBruno Larsen (billionai)                      "   IVPR " TARGET_FMT_lx "   EPCR " TARGET_FMT_lx "\n",
769647334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_PIR], env->spr[SPR_BOOKE_DECAR],
769747334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_IVPR], env->spr[SPR_BOOKE_EPCR]);
769847334e17SBruno Larsen (billionai) 
769947334e17SBruno Larsen (billionai)         qemu_fprintf(f, " MCSR " TARGET_FMT_lx " SPRG8 " TARGET_FMT_lx
770047334e17SBruno Larsen (billionai)                      "    EPR " TARGET_FMT_lx "\n",
770147334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_MCSR], env->spr[SPR_BOOKE_SPRG8],
770247334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_EPR]);
770347334e17SBruno Larsen (billionai) 
770447334e17SBruno Larsen (billionai)         /* FSL-specific */
770547334e17SBruno Larsen (billionai)         qemu_fprintf(f, " MCAR " TARGET_FMT_lx "  PID1 " TARGET_FMT_lx
770647334e17SBruno Larsen (billionai)                      "   PID2 " TARGET_FMT_lx "    SVR " TARGET_FMT_lx "\n",
770747334e17SBruno Larsen (billionai)                      env->spr[SPR_Exxx_MCAR], env->spr[SPR_BOOKE_PID1],
770847334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_PID2], env->spr[SPR_E500_SVR]);
770947334e17SBruno Larsen (billionai) 
771047334e17SBruno Larsen (billionai)         /*
771147334e17SBruno Larsen (billionai)          * IVORs are left out as they are large and do not change often --
771247334e17SBruno Larsen (billionai)          * they can be read with "p $ivor0", "p $ivor1", etc.
771347334e17SBruno Larsen (billionai)          */
7714fbe08667SCédric Le Goater         break;
7715fbe08667SCédric Le Goater     case POWERPC_EXCP_40x:
7716fbe08667SCédric Le Goater         qemu_fprintf(f, "  TCR " TARGET_FMT_lx "   TSR " TARGET_FMT_lx
7717fbe08667SCédric Le Goater                      "    ESR " TARGET_FMT_lx "   DEAR " TARGET_FMT_lx "\n",
7718fbe08667SCédric Le Goater                      env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR],
7719fbe08667SCédric Le Goater                      env->spr[SPR_40x_ESR], env->spr[SPR_40x_DEAR]);
7720fbe08667SCédric Le Goater 
7721fbe08667SCédric Le Goater         qemu_fprintf(f, " EVPR " TARGET_FMT_lx "  SRR2 " TARGET_FMT_lx
7722fbe08667SCédric Le Goater                      "   SRR3 " TARGET_FMT_lx  "   PID " TARGET_FMT_lx "\n",
7723fbe08667SCédric Le Goater                      env->spr[SPR_40x_EVPR], env->spr[SPR_40x_SRR2],
7724fbe08667SCédric Le Goater                      env->spr[SPR_40x_SRR3], env->spr[SPR_40x_PID]);
7725fbe08667SCédric Le Goater         break;
7726fbe08667SCédric Le Goater     default:
7727fbe08667SCédric Le Goater         break;
772847334e17SBruno Larsen (billionai)     }
772947334e17SBruno Larsen (billionai) 
773047334e17SBruno Larsen (billionai) #if defined(TARGET_PPC64)
773147334e17SBruno Larsen (billionai)     if (env->flags & POWERPC_FLAG_CFAR) {
773247334e17SBruno Larsen (billionai)         qemu_fprintf(f, " CFAR " TARGET_FMT_lx"\n", env->cfar);
773347334e17SBruno Larsen (billionai)     }
773447334e17SBruno Larsen (billionai) #endif
773547334e17SBruno Larsen (billionai) 
773647334e17SBruno Larsen (billionai)     if (env->spr_cb[SPR_LPCR].name) {
773747334e17SBruno Larsen (billionai)         qemu_fprintf(f, " LPCR " TARGET_FMT_lx "\n", env->spr[SPR_LPCR]);
773847334e17SBruno Larsen (billionai)     }
773947334e17SBruno Larsen (billionai) 
774047334e17SBruno Larsen (billionai)     switch (env->mmu_model) {
774147334e17SBruno Larsen (billionai)     case POWERPC_MMU_32B:
774247334e17SBruno Larsen (billionai)     case POWERPC_MMU_SOFT_6xx:
774347334e17SBruno Larsen (billionai) #if defined(TARGET_PPC64)
774447334e17SBruno Larsen (billionai)     case POWERPC_MMU_64B:
774547334e17SBruno Larsen (billionai)     case POWERPC_MMU_2_03:
774647334e17SBruno Larsen (billionai)     case POWERPC_MMU_2_06:
774747334e17SBruno Larsen (billionai)     case POWERPC_MMU_2_07:
774847334e17SBruno Larsen (billionai)     case POWERPC_MMU_3_00:
774947334e17SBruno Larsen (billionai) #endif
775047334e17SBruno Larsen (billionai)         if (env->spr_cb[SPR_SDR1].name) { /* SDR1 Exists */
775147334e17SBruno Larsen (billionai)             qemu_fprintf(f, " SDR1 " TARGET_FMT_lx " ", env->spr[SPR_SDR1]);
775247334e17SBruno Larsen (billionai)         }
775347334e17SBruno Larsen (billionai)         if (env->spr_cb[SPR_PTCR].name) { /* PTCR Exists */
775447334e17SBruno Larsen (billionai)             qemu_fprintf(f, " PTCR " TARGET_FMT_lx " ", env->spr[SPR_PTCR]);
775547334e17SBruno Larsen (billionai)         }
775647334e17SBruno Larsen (billionai)         qemu_fprintf(f, "  DAR " TARGET_FMT_lx "  DSISR " TARGET_FMT_lx "\n",
775747334e17SBruno Larsen (billionai)                      env->spr[SPR_DAR], env->spr[SPR_DSISR]);
775847334e17SBruno Larsen (billionai)         break;
775947334e17SBruno Larsen (billionai)     case POWERPC_MMU_BOOKE206:
776047334e17SBruno Larsen (billionai)         qemu_fprintf(f, " MAS0 " TARGET_FMT_lx "  MAS1 " TARGET_FMT_lx
776147334e17SBruno Larsen (billionai)                      "   MAS2 " TARGET_FMT_lx "   MAS3 " TARGET_FMT_lx "\n",
776247334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_MAS0], env->spr[SPR_BOOKE_MAS1],
776347334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_MAS2], env->spr[SPR_BOOKE_MAS3]);
776447334e17SBruno Larsen (billionai) 
776547334e17SBruno Larsen (billionai)         qemu_fprintf(f, " MAS4 " TARGET_FMT_lx "  MAS6 " TARGET_FMT_lx
776647334e17SBruno Larsen (billionai)                      "   MAS7 " TARGET_FMT_lx "    PID " TARGET_FMT_lx "\n",
776747334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_MAS4], env->spr[SPR_BOOKE_MAS6],
776847334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_MAS7], env->spr[SPR_BOOKE_PID]);
776947334e17SBruno Larsen (billionai) 
777047334e17SBruno Larsen (billionai)         qemu_fprintf(f, "MMUCFG " TARGET_FMT_lx " TLB0CFG " TARGET_FMT_lx
777147334e17SBruno Larsen (billionai)                      " TLB1CFG " TARGET_FMT_lx "\n",
777247334e17SBruno Larsen (billionai)                      env->spr[SPR_MMUCFG], env->spr[SPR_BOOKE_TLB0CFG],
777347334e17SBruno Larsen (billionai)                      env->spr[SPR_BOOKE_TLB1CFG]);
777447334e17SBruno Larsen (billionai)         break;
777547334e17SBruno Larsen (billionai)     default:
777647334e17SBruno Larsen (billionai)         break;
777747334e17SBruno Larsen (billionai)     }
777847334e17SBruno Larsen (billionai) #endif
777947334e17SBruno Larsen (billionai) 
778047334e17SBruno Larsen (billionai) #undef RGPL
778147334e17SBruno Larsen (billionai) #undef RFPL
778247334e17SBruno Larsen (billionai) }
77833e770bf7SBruno Larsen (billionai) type_init(ppc_cpu_register_types)
7784