2 * PowerPC CPU initialization for qemu.
4 * Copyright (c) 2003-2007 Jocelyn Mayer
5 * Copyright 2011 Freescale Semiconductor, Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21 #include "qemu/osdep.h"
22 #include "disas/dis-asm.h"
23 #include "exec/gdbstub.h"
25 #include "sysemu/cpus.h"
26 #include "sysemu/hw_accel.h"
27 #include "sysemu/tcg.h"
28 #include "cpu-models.h"
29 #include "mmu-hash32.h"
30 #include "mmu-hash64.h"
31 #include "qemu/error-report.h"
32 #include "qemu/module.h"
33 #include "qemu/qemu-print.h"
34 #include "qapi/error.h"
35 #include "qapi/qmp/qnull.h"
36 #include "qapi/visitor.h"
37 #include "hw/qdev-properties.h"
38 #include "hw/ppc/ppc.h"
39 #include "mmu-book3s-v3.h"
40 #include "qemu/cutils.h"
41 #include "disas/capstone.h"
42 #include "fpu/softfloat.h"
43 #include "qapi/qapi-commands-machine-target.h"
45 #include "helper_regs.h"
48 #include "power8-pmu.h"
50 /* #define PPC_DEBUG_SPR */
51 /* #define USE_APPLE_GDB */
53 static inline void vscr_init(CPUPPCState
*env
, uint32_t val
)
55 /* Altivec always uses round-to-nearest */
56 set_float_rounding_mode(float_round_nearest_even
, &env
->vec_status
);
57 ppc_store_vscr(env
, val
);
63 * Register an SPR with all the callbacks required for tcg,
64 * and the ID number for KVM.
66 * The reason for the conditional compilation is that the tcg functions
67 * may be compiled out, and the system kvm header may not be available
68 * for supplying the ID numbers. This is ugly, but the best we can do.
72 # define USR_ARG(X) X,
73 # ifdef CONFIG_USER_ONLY
76 # define SYS_ARG(X) X,
83 # define KVM_ARG(X) X,
88 typedef void spr_callback(DisasContext
*, int, int);
90 static void _spr_register(CPUPPCState
*env
, int num
, const char *name
,
91 USR_ARG(spr_callback
*uea_read
)
92 USR_ARG(spr_callback
*uea_write
)
93 SYS_ARG(spr_callback
*oea_read
)
94 SYS_ARG(spr_callback
*oea_write
)
95 SYS_ARG(spr_callback
*hea_read
)
96 SYS_ARG(spr_callback
*hea_write
)
97 KVM_ARG(uint64_t one_reg_id
)
98 target_ulong initial_value
)
100 ppc_spr_t
*spr
= &env
->spr_cb
[num
];
102 /* No SPR should be registered twice. */
103 assert(spr
->name
== NULL
);
104 assert(name
!= NULL
);
107 spr
->default_value
= initial_value
;
108 env
->spr
[num
] = initial_value
;
111 spr
->uea_read
= uea_read
;
112 spr
->uea_write
= uea_write
;
113 # ifndef CONFIG_USER_ONLY
114 spr
->oea_read
= oea_read
;
115 spr
->oea_write
= oea_write
;
116 spr
->hea_read
= hea_read
;
117 spr
->hea_write
= hea_write
;
121 spr
->one_reg_id
= one_reg_id
;
125 /* spr_register_kvm_hv passes all required arguments. */
126 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
127 oea_read, oea_write, hea_read, hea_write, \
128 one_reg_id, initial_value) \
129 _spr_register(env, num, name, \
130 USR_ARG(uea_read) USR_ARG(uea_write) \
131 SYS_ARG(oea_read) SYS_ARG(oea_write) \
132 SYS_ARG(hea_read) SYS_ARG(hea_write) \
133 KVM_ARG(one_reg_id) initial_value)
135 /* spr_register_kvm duplicates the oea callbacks to the hea callbacks. */
136 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
137 oea_read, oea_write, one_reg_id, ival) \
138 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
139 oea_write, oea_read, oea_write, one_reg_id, ival)
141 /* spr_register_hv and spr_register are similar, except there is no kvm id. */
142 #define spr_register_hv(env, num, name, uea_read, uea_write, \
143 oea_read, oea_write, hea_read, hea_write, ival) \
144 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
145 oea_write, hea_read, hea_write, 0, ival)
147 #define spr_register(env, num, name, uea_read, uea_write, \
148 oea_read, oea_write, ival) \
149 spr_register_kvm(env, num, name, uea_read, uea_write, \
150 oea_read, oea_write, 0, ival)
152 /* Generic PowerPC SPRs */
153 static void register_generic_sprs(PowerPCCPU
*cpu
)
155 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
156 CPUPPCState
*env
= &cpu
->env
;
158 /* Integer processing */
159 spr_register(env
, SPR_XER
, "XER",
160 &spr_read_xer
, &spr_write_xer
,
161 &spr_read_xer
, &spr_write_xer
,
164 spr_register(env
, SPR_LR
, "LR",
165 &spr_read_lr
, &spr_write_lr
,
166 &spr_read_lr
, &spr_write_lr
,
168 spr_register(env
, SPR_CTR
, "CTR",
169 &spr_read_ctr
, &spr_write_ctr
,
170 &spr_read_ctr
, &spr_write_ctr
,
172 /* Interrupt processing */
173 spr_register(env
, SPR_SRR0
, "SRR0",
174 SPR_NOACCESS
, SPR_NOACCESS
,
175 &spr_read_generic
, &spr_write_generic
,
177 spr_register(env
, SPR_SRR1
, "SRR1",
178 SPR_NOACCESS
, SPR_NOACCESS
,
179 &spr_read_generic
, &spr_write_generic
,
181 /* Processor control */
182 spr_register(env
, SPR_SPRG0
, "SPRG0",
183 SPR_NOACCESS
, SPR_NOACCESS
,
184 &spr_read_generic
, &spr_write_generic
,
186 spr_register(env
, SPR_SPRG1
, "SPRG1",
187 SPR_NOACCESS
, SPR_NOACCESS
,
188 &spr_read_generic
, &spr_write_generic
,
190 spr_register(env
, SPR_SPRG2
, "SPRG2",
191 SPR_NOACCESS
, SPR_NOACCESS
,
192 &spr_read_generic
, &spr_write_generic
,
194 spr_register(env
, SPR_SPRG3
, "SPRG3",
195 SPR_NOACCESS
, SPR_NOACCESS
,
196 &spr_read_generic
, &spr_write_generic
,
199 spr_register(env
, SPR_PVR
, "PVR",
200 /* Linux permits userspace to read PVR */
201 #if defined(CONFIG_LINUX_USER)
207 &spr_read_generic
, SPR_NOACCESS
,
210 /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
211 if (pcc
->svr
!= POWERPC_SVR_NONE
) {
212 if (pcc
->svr
& POWERPC_SVR_E500
) {
213 spr_register(env
, SPR_E500_SVR
, "SVR",
214 SPR_NOACCESS
, SPR_NOACCESS
,
215 &spr_read_generic
, SPR_NOACCESS
,
216 pcc
->svr
& ~POWERPC_SVR_E500
);
218 spr_register(env
, SPR_SVR
, "SVR",
219 SPR_NOACCESS
, SPR_NOACCESS
,
220 &spr_read_generic
, SPR_NOACCESS
,
226 spr_register(env
, SPR_VTBL
, "TBL",
227 &spr_read_tbl
, SPR_NOACCESS
,
228 &spr_read_tbl
, SPR_NOACCESS
,
230 spr_register(env
, SPR_TBL
, "TBL",
231 &spr_read_tbl
, SPR_NOACCESS
,
232 &spr_read_tbl
, &spr_write_tbl
,
234 spr_register(env
, SPR_VTBU
, "TBU",
235 &spr_read_tbu
, SPR_NOACCESS
,
236 &spr_read_tbu
, SPR_NOACCESS
,
238 spr_register(env
, SPR_TBU
, "TBU",
239 &spr_read_tbu
, SPR_NOACCESS
,
240 &spr_read_tbu
, &spr_write_tbu
,
244 /* SPR common to all non-embedded PowerPC, including 601 */
245 static void register_ne_601_sprs(CPUPPCState
*env
)
247 /* Exception processing */
248 spr_register_kvm(env
, SPR_DSISR
, "DSISR",
249 SPR_NOACCESS
, SPR_NOACCESS
,
250 &spr_read_generic
, &spr_write_generic
,
251 KVM_REG_PPC_DSISR
, 0x00000000);
252 spr_register_kvm(env
, SPR_DAR
, "DAR",
253 SPR_NOACCESS
, SPR_NOACCESS
,
254 &spr_read_generic
, &spr_write_generic
,
255 KVM_REG_PPC_DAR
, 0x00000000);
257 spr_register(env
, SPR_DECR
, "DECR",
258 SPR_NOACCESS
, SPR_NOACCESS
,
259 &spr_read_decr
, &spr_write_decr
,
263 /* Storage Description Register 1 */
264 static void register_sdr1_sprs(CPUPPCState
*env
)
266 #ifndef CONFIG_USER_ONLY
267 if (env
->has_hv_mode
) {
269 * SDR1 is a hypervisor resource on CPUs which have a
272 spr_register_hv(env
, SPR_SDR1
, "SDR1",
273 SPR_NOACCESS
, SPR_NOACCESS
,
274 SPR_NOACCESS
, SPR_NOACCESS
,
275 &spr_read_generic
, &spr_write_sdr1
,
278 spr_register(env
, SPR_SDR1
, "SDR1",
279 SPR_NOACCESS
, SPR_NOACCESS
,
280 &spr_read_generic
, &spr_write_sdr1
,
287 static void register_low_BATs(CPUPPCState
*env
)
289 #if !defined(CONFIG_USER_ONLY)
290 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
291 SPR_NOACCESS
, SPR_NOACCESS
,
292 &spr_read_ibat
, &spr_write_ibatu
,
294 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
295 SPR_NOACCESS
, SPR_NOACCESS
,
296 &spr_read_ibat
, &spr_write_ibatl
,
298 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
299 SPR_NOACCESS
, SPR_NOACCESS
,
300 &spr_read_ibat
, &spr_write_ibatu
,
302 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
303 SPR_NOACCESS
, SPR_NOACCESS
,
304 &spr_read_ibat
, &spr_write_ibatl
,
306 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
307 SPR_NOACCESS
, SPR_NOACCESS
,
308 &spr_read_ibat
, &spr_write_ibatu
,
310 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
311 SPR_NOACCESS
, SPR_NOACCESS
,
312 &spr_read_ibat
, &spr_write_ibatl
,
314 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
315 SPR_NOACCESS
, SPR_NOACCESS
,
316 &spr_read_ibat
, &spr_write_ibatu
,
318 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
319 SPR_NOACCESS
, SPR_NOACCESS
,
320 &spr_read_ibat
, &spr_write_ibatl
,
322 spr_register(env
, SPR_DBAT0U
, "DBAT0U",
323 SPR_NOACCESS
, SPR_NOACCESS
,
324 &spr_read_dbat
, &spr_write_dbatu
,
326 spr_register(env
, SPR_DBAT0L
, "DBAT0L",
327 SPR_NOACCESS
, SPR_NOACCESS
,
328 &spr_read_dbat
, &spr_write_dbatl
,
330 spr_register(env
, SPR_DBAT1U
, "DBAT1U",
331 SPR_NOACCESS
, SPR_NOACCESS
,
332 &spr_read_dbat
, &spr_write_dbatu
,
334 spr_register(env
, SPR_DBAT1L
, "DBAT1L",
335 SPR_NOACCESS
, SPR_NOACCESS
,
336 &spr_read_dbat
, &spr_write_dbatl
,
338 spr_register(env
, SPR_DBAT2U
, "DBAT2U",
339 SPR_NOACCESS
, SPR_NOACCESS
,
340 &spr_read_dbat
, &spr_write_dbatu
,
342 spr_register(env
, SPR_DBAT2L
, "DBAT2L",
343 SPR_NOACCESS
, SPR_NOACCESS
,
344 &spr_read_dbat
, &spr_write_dbatl
,
346 spr_register(env
, SPR_DBAT3U
, "DBAT3U",
347 SPR_NOACCESS
, SPR_NOACCESS
,
348 &spr_read_dbat
, &spr_write_dbatu
,
350 spr_register(env
, SPR_DBAT3L
, "DBAT3L",
351 SPR_NOACCESS
, SPR_NOACCESS
,
352 &spr_read_dbat
, &spr_write_dbatl
,
359 static void register_high_BATs(CPUPPCState
*env
)
361 #if !defined(CONFIG_USER_ONLY)
362 spr_register(env
, SPR_IBAT4U
, "IBAT4U",
363 SPR_NOACCESS
, SPR_NOACCESS
,
364 &spr_read_ibat_h
, &spr_write_ibatu_h
,
366 spr_register(env
, SPR_IBAT4L
, "IBAT4L",
367 SPR_NOACCESS
, SPR_NOACCESS
,
368 &spr_read_ibat_h
, &spr_write_ibatl_h
,
370 spr_register(env
, SPR_IBAT5U
, "IBAT5U",
371 SPR_NOACCESS
, SPR_NOACCESS
,
372 &spr_read_ibat_h
, &spr_write_ibatu_h
,
374 spr_register(env
, SPR_IBAT5L
, "IBAT5L",
375 SPR_NOACCESS
, SPR_NOACCESS
,
376 &spr_read_ibat_h
, &spr_write_ibatl_h
,
378 spr_register(env
, SPR_IBAT6U
, "IBAT6U",
379 SPR_NOACCESS
, SPR_NOACCESS
,
380 &spr_read_ibat_h
, &spr_write_ibatu_h
,
382 spr_register(env
, SPR_IBAT6L
, "IBAT6L",
383 SPR_NOACCESS
, SPR_NOACCESS
,
384 &spr_read_ibat_h
, &spr_write_ibatl_h
,
386 spr_register(env
, SPR_IBAT7U
, "IBAT7U",
387 SPR_NOACCESS
, SPR_NOACCESS
,
388 &spr_read_ibat_h
, &spr_write_ibatu_h
,
390 spr_register(env
, SPR_IBAT7L
, "IBAT7L",
391 SPR_NOACCESS
, SPR_NOACCESS
,
392 &spr_read_ibat_h
, &spr_write_ibatl_h
,
394 spr_register(env
, SPR_DBAT4U
, "DBAT4U",
395 SPR_NOACCESS
, SPR_NOACCESS
,
396 &spr_read_dbat_h
, &spr_write_dbatu_h
,
398 spr_register(env
, SPR_DBAT4L
, "DBAT4L",
399 SPR_NOACCESS
, SPR_NOACCESS
,
400 &spr_read_dbat_h
, &spr_write_dbatl_h
,
402 spr_register(env
, SPR_DBAT5U
, "DBAT5U",
403 SPR_NOACCESS
, SPR_NOACCESS
,
404 &spr_read_dbat_h
, &spr_write_dbatu_h
,
406 spr_register(env
, SPR_DBAT5L
, "DBAT5L",
407 SPR_NOACCESS
, SPR_NOACCESS
,
408 &spr_read_dbat_h
, &spr_write_dbatl_h
,
410 spr_register(env
, SPR_DBAT6U
, "DBAT6U",
411 SPR_NOACCESS
, SPR_NOACCESS
,
412 &spr_read_dbat_h
, &spr_write_dbatu_h
,
414 spr_register(env
, SPR_DBAT6L
, "DBAT6L",
415 SPR_NOACCESS
, SPR_NOACCESS
,
416 &spr_read_dbat_h
, &spr_write_dbatl_h
,
418 spr_register(env
, SPR_DBAT7U
, "DBAT7U",
419 SPR_NOACCESS
, SPR_NOACCESS
,
420 &spr_read_dbat_h
, &spr_write_dbatu_h
,
422 spr_register(env
, SPR_DBAT7L
, "DBAT7L",
423 SPR_NOACCESS
, SPR_NOACCESS
,
424 &spr_read_dbat_h
, &spr_write_dbatl_h
,
430 /* Softare table search registers */
431 static void register_6xx_7xx_soft_tlb(CPUPPCState
*env
, int nb_tlbs
, int nb_ways
)
433 #if !defined(CONFIG_USER_ONLY)
434 env
->nb_tlb
= nb_tlbs
;
435 env
->nb_ways
= nb_ways
;
437 env
->tlb_type
= TLB_6XX
;
438 spr_register(env
, SPR_DMISS
, "DMISS",
439 SPR_NOACCESS
, SPR_NOACCESS
,
440 &spr_read_generic
, SPR_NOACCESS
,
442 spr_register(env
, SPR_DCMP
, "DCMP",
443 SPR_NOACCESS
, SPR_NOACCESS
,
444 &spr_read_generic
, SPR_NOACCESS
,
446 spr_register(env
, SPR_HASH1
, "HASH1",
447 SPR_NOACCESS
, SPR_NOACCESS
,
448 &spr_read_generic
, SPR_NOACCESS
,
450 spr_register(env
, SPR_HASH2
, "HASH2",
451 SPR_NOACCESS
, SPR_NOACCESS
,
452 &spr_read_generic
, SPR_NOACCESS
,
454 spr_register(env
, SPR_IMISS
, "IMISS",
455 SPR_NOACCESS
, SPR_NOACCESS
,
456 &spr_read_generic
, SPR_NOACCESS
,
458 spr_register(env
, SPR_ICMP
, "ICMP",
459 SPR_NOACCESS
, SPR_NOACCESS
,
460 &spr_read_generic
, SPR_NOACCESS
,
462 spr_register(env
, SPR_RPA
, "RPA",
463 SPR_NOACCESS
, SPR_NOACCESS
,
464 &spr_read_generic
, &spr_write_generic
,
469 static void register_745_sprs(CPUPPCState
*env
)
472 spr_register(env
, SPR_SPRG4
, "SPRG4",
473 SPR_NOACCESS
, SPR_NOACCESS
,
474 &spr_read_generic
, &spr_write_generic
,
476 spr_register(env
, SPR_SPRG5
, "SPRG5",
477 SPR_NOACCESS
, SPR_NOACCESS
,
478 &spr_read_generic
, &spr_write_generic
,
480 spr_register(env
, SPR_SPRG6
, "SPRG6",
481 SPR_NOACCESS
, SPR_NOACCESS
,
482 &spr_read_generic
, &spr_write_generic
,
484 spr_register(env
, SPR_SPRG7
, "SPRG7",
485 SPR_NOACCESS
, SPR_NOACCESS
,
486 &spr_read_generic
, &spr_write_generic
,
489 /* Hardware implementation registers */
490 spr_register(env
, SPR_HID0
, "HID0",
491 SPR_NOACCESS
, SPR_NOACCESS
,
492 &spr_read_generic
, &spr_write_generic
,
495 spr_register(env
, SPR_HID1
, "HID1",
496 SPR_NOACCESS
, SPR_NOACCESS
,
497 &spr_read_generic
, &spr_write_generic
,
500 spr_register(env
, SPR_HID2
, "HID2",
501 SPR_NOACCESS
, SPR_NOACCESS
,
502 &spr_read_generic
, &spr_write_generic
,
506 static void register_755_sprs(CPUPPCState
*env
)
508 /* L2 cache control */
509 spr_register(env
, SPR_L2CR
, "L2CR",
510 SPR_NOACCESS
, SPR_NOACCESS
,
511 &spr_read_generic
, spr_access_nop
,
514 spr_register(env
, SPR_L2PMCR
, "L2PMCR",
515 SPR_NOACCESS
, SPR_NOACCESS
,
516 &spr_read_generic
, &spr_write_generic
,
520 /* SPR common to all 7xx PowerPC implementations */
521 static void register_7xx_sprs(CPUPPCState
*env
)
524 spr_register_kvm(env
, SPR_DABR
, "DABR",
525 SPR_NOACCESS
, SPR_NOACCESS
,
526 &spr_read_generic
, &spr_write_generic
,
527 KVM_REG_PPC_DABR
, 0x00000000);
529 spr_register(env
, SPR_IABR
, "IABR",
530 SPR_NOACCESS
, SPR_NOACCESS
,
531 &spr_read_generic
, &spr_write_generic
,
533 /* Cache management */
534 spr_register(env
, SPR_ICTC
, "ICTC",
535 SPR_NOACCESS
, SPR_NOACCESS
,
536 &spr_read_generic
, &spr_write_generic
,
538 /* Performance monitors */
539 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
540 SPR_NOACCESS
, SPR_NOACCESS
,
541 &spr_read_generic
, &spr_write_generic
,
544 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
545 SPR_NOACCESS
, SPR_NOACCESS
,
546 &spr_read_generic
, &spr_write_generic
,
549 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
550 SPR_NOACCESS
, SPR_NOACCESS
,
551 &spr_read_generic
, &spr_write_generic
,
554 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
555 SPR_NOACCESS
, SPR_NOACCESS
,
556 &spr_read_generic
, &spr_write_generic
,
559 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
560 SPR_NOACCESS
, SPR_NOACCESS
,
561 &spr_read_generic
, &spr_write_generic
,
564 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
565 SPR_NOACCESS
, SPR_NOACCESS
,
566 &spr_read_generic
, &spr_write_generic
,
569 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
570 SPR_NOACCESS
, SPR_NOACCESS
,
571 &spr_read_generic
, SPR_NOACCESS
,
574 spr_register(env
, SPR_7XX_UMMCR0
, "UMMCR0",
575 &spr_read_ureg
, SPR_NOACCESS
,
576 &spr_read_ureg
, SPR_NOACCESS
,
579 spr_register(env
, SPR_7XX_UMMCR1
, "UMMCR1",
580 &spr_read_ureg
, SPR_NOACCESS
,
581 &spr_read_ureg
, SPR_NOACCESS
,
584 spr_register(env
, SPR_7XX_UPMC1
, "UPMC1",
585 &spr_read_ureg
, SPR_NOACCESS
,
586 &spr_read_ureg
, SPR_NOACCESS
,
589 spr_register(env
, SPR_7XX_UPMC2
, "UPMC2",
590 &spr_read_ureg
, SPR_NOACCESS
,
591 &spr_read_ureg
, SPR_NOACCESS
,
594 spr_register(env
, SPR_7XX_UPMC3
, "UPMC3",
595 &spr_read_ureg
, SPR_NOACCESS
,
596 &spr_read_ureg
, SPR_NOACCESS
,
599 spr_register(env
, SPR_7XX_UPMC4
, "UPMC4",
600 &spr_read_ureg
, SPR_NOACCESS
,
601 &spr_read_ureg
, SPR_NOACCESS
,
604 spr_register(env
, SPR_7XX_USIAR
, "USIAR",
605 &spr_read_ureg
, SPR_NOACCESS
,
606 &spr_read_ureg
, SPR_NOACCESS
,
608 /* External access control */
609 spr_register(env
, SPR_EAR
, "EAR",
610 SPR_NOACCESS
, SPR_NOACCESS
,
611 &spr_read_generic
, &spr_write_generic
,
614 /* Hardware implementation registers */
615 spr_register(env
, SPR_HID0
, "HID0",
616 SPR_NOACCESS
, SPR_NOACCESS
,
617 &spr_read_generic
, &spr_write_generic
,
620 spr_register(env
, SPR_HID1
, "HID1",
621 SPR_NOACCESS
, SPR_NOACCESS
,
622 &spr_read_generic
, &spr_write_generic
,
627 static void register_amr_sprs(CPUPPCState
*env
)
629 #ifndef CONFIG_USER_ONLY
631 * Virtual Page Class Key protection
633 * The AMR is accessible either via SPR 13 or SPR 29. 13 is
634 * userspace accessible, 29 is privileged. So we only need to set
635 * the kvm ONE_REG id on one of them, we use 29
637 spr_register(env
, SPR_UAMR
, "UAMR",
638 &spr_read_generic
, &spr_write_amr
,
639 &spr_read_generic
, &spr_write_amr
,
641 spr_register_kvm_hv(env
, SPR_AMR
, "AMR",
642 SPR_NOACCESS
, SPR_NOACCESS
,
643 &spr_read_generic
, &spr_write_amr
,
644 &spr_read_generic
, &spr_write_generic
,
646 spr_register_kvm_hv(env
, SPR_UAMOR
, "UAMOR",
647 SPR_NOACCESS
, SPR_NOACCESS
,
648 &spr_read_generic
, &spr_write_uamor
,
649 &spr_read_generic
, &spr_write_generic
,
650 KVM_REG_PPC_UAMOR
, 0);
651 spr_register_hv(env
, SPR_AMOR
, "AMOR",
652 SPR_NOACCESS
, SPR_NOACCESS
,
653 SPR_NOACCESS
, SPR_NOACCESS
,
654 &spr_read_generic
, &spr_write_generic
,
656 #endif /* !CONFIG_USER_ONLY */
659 static void register_iamr_sprs(CPUPPCState
*env
)
661 #ifndef CONFIG_USER_ONLY
662 spr_register_kvm_hv(env
, SPR_IAMR
, "IAMR",
663 SPR_NOACCESS
, SPR_NOACCESS
,
664 &spr_read_generic
, &spr_write_iamr
,
665 &spr_read_generic
, &spr_write_generic
,
666 KVM_REG_PPC_IAMR
, 0);
667 #endif /* !CONFIG_USER_ONLY */
669 #endif /* TARGET_PPC64 */
671 static void register_thrm_sprs(CPUPPCState
*env
)
673 /* Thermal management */
674 spr_register(env
, SPR_THRM1
, "THRM1",
675 SPR_NOACCESS
, SPR_NOACCESS
,
676 &spr_read_thrm
, &spr_write_generic
,
679 spr_register(env
, SPR_THRM2
, "THRM2",
680 SPR_NOACCESS
, SPR_NOACCESS
,
681 &spr_read_thrm
, &spr_write_generic
,
684 spr_register(env
, SPR_THRM3
, "THRM3",
685 SPR_NOACCESS
, SPR_NOACCESS
,
686 &spr_read_thrm
, &spr_write_generic
,
690 /* SPR specific to PowerPC 604 implementation */
691 static void register_604_sprs(CPUPPCState
*env
)
693 /* Processor identification */
694 spr_register(env
, SPR_PIR
, "PIR",
695 SPR_NOACCESS
, SPR_NOACCESS
,
696 &spr_read_generic
, &spr_write_pir
,
699 spr_register(env
, SPR_IABR
, "IABR",
700 SPR_NOACCESS
, SPR_NOACCESS
,
701 &spr_read_generic
, &spr_write_generic
,
704 spr_register_kvm(env
, SPR_DABR
, "DABR",
705 SPR_NOACCESS
, SPR_NOACCESS
,
706 &spr_read_generic
, &spr_write_generic
,
707 KVM_REG_PPC_DABR
, 0x00000000);
708 /* Performance counters */
709 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
710 SPR_NOACCESS
, SPR_NOACCESS
,
711 &spr_read_generic
, &spr_write_generic
,
714 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
715 SPR_NOACCESS
, SPR_NOACCESS
,
716 &spr_read_generic
, &spr_write_generic
,
719 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
720 SPR_NOACCESS
, SPR_NOACCESS
,
721 &spr_read_generic
, &spr_write_generic
,
724 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
725 SPR_NOACCESS
, SPR_NOACCESS
,
726 &spr_read_generic
, SPR_NOACCESS
,
729 spr_register(env
, SPR_SDA
, "SDA",
730 SPR_NOACCESS
, SPR_NOACCESS
,
731 &spr_read_generic
, SPR_NOACCESS
,
733 /* External access control */
734 spr_register(env
, SPR_EAR
, "EAR",
735 SPR_NOACCESS
, SPR_NOACCESS
,
736 &spr_read_generic
, &spr_write_generic
,
739 /* Hardware implementation registers */
740 spr_register(env
, SPR_HID0
, "HID0",
741 SPR_NOACCESS
, SPR_NOACCESS
,
742 &spr_read_generic
, &spr_write_generic
,
746 /* SPR specific to PowerPC 603 implementation */
747 static void register_603_sprs(CPUPPCState
*env
)
749 /* External access control */
750 spr_register(env
, SPR_EAR
, "EAR",
751 SPR_NOACCESS
, SPR_NOACCESS
,
752 &spr_read_generic
, &spr_write_generic
,
755 spr_register(env
, SPR_IABR
, "IABR",
756 SPR_NOACCESS
, SPR_NOACCESS
,
757 &spr_read_generic
, &spr_write_generic
,
760 spr_register(env
, SPR_HID0
, "HID0",
761 SPR_NOACCESS
, SPR_NOACCESS
,
762 &spr_read_generic
, &spr_write_generic
,
765 spr_register(env
, SPR_HID1
, "HID1",
766 SPR_NOACCESS
, SPR_NOACCESS
,
767 &spr_read_generic
, &spr_write_generic
,
771 static void register_e300_sprs(CPUPPCState
*env
)
773 /* hardware implementation registers */
774 spr_register(env
, SPR_HID2
, "HID2",
775 SPR_NOACCESS
, SPR_NOACCESS
,
776 &spr_read_generic
, &spr_write_generic
,
779 spr_register(env
, SPR_DABR
, "DABR",
780 SPR_NOACCESS
, SPR_NOACCESS
,
781 &spr_read_generic
, &spr_write_generic
,
784 spr_register(env
, SPR_DABR2
, "DABR2",
785 SPR_NOACCESS
, SPR_NOACCESS
,
786 &spr_read_generic
, &spr_write_generic
,
789 spr_register(env
, SPR_IABR2
, "IABR2",
790 SPR_NOACCESS
, SPR_NOACCESS
,
791 &spr_read_generic
, &spr_write_generic
,
794 spr_register(env
, SPR_IBCR
, "IBCR",
795 SPR_NOACCESS
, SPR_NOACCESS
,
796 &spr_read_generic
, &spr_write_generic
,
799 spr_register(env
, SPR_DBCR
, "DBCR",
800 SPR_NOACCESS
, SPR_NOACCESS
,
801 &spr_read_generic
, &spr_write_generic
,
805 /* SPR specific to PowerPC G2 implementation */
806 static void register_G2_sprs(CPUPPCState
*env
)
808 /* Memory base address */
810 spr_register(env
, SPR_MBAR
, "MBAR",
811 SPR_NOACCESS
, SPR_NOACCESS
,
812 &spr_read_generic
, &spr_write_generic
,
814 /* Exception processing */
815 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
816 SPR_NOACCESS
, SPR_NOACCESS
,
817 &spr_read_generic
, &spr_write_generic
,
819 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
820 SPR_NOACCESS
, SPR_NOACCESS
,
821 &spr_read_generic
, &spr_write_generic
,
824 spr_register(env
, SPR_DABR
, "DABR",
825 SPR_NOACCESS
, SPR_NOACCESS
,
826 &spr_read_generic
, &spr_write_generic
,
829 spr_register(env
, SPR_DABR2
, "DABR2",
830 SPR_NOACCESS
, SPR_NOACCESS
,
831 &spr_read_generic
, &spr_write_generic
,
834 spr_register(env
, SPR_IABR
, "IABR",
835 SPR_NOACCESS
, SPR_NOACCESS
,
836 &spr_read_generic
, &spr_write_generic
,
839 spr_register(env
, SPR_IABR2
, "IABR2",
840 SPR_NOACCESS
, SPR_NOACCESS
,
841 &spr_read_generic
, &spr_write_generic
,
844 spr_register(env
, SPR_IBCR
, "IBCR",
845 SPR_NOACCESS
, SPR_NOACCESS
,
846 &spr_read_generic
, &spr_write_generic
,
849 spr_register(env
, SPR_DBCR
, "DBCR",
850 SPR_NOACCESS
, SPR_NOACCESS
,
851 &spr_read_generic
, &spr_write_generic
,
854 /* External access control */
855 spr_register(env
, SPR_EAR
, "EAR",
856 SPR_NOACCESS
, SPR_NOACCESS
,
857 &spr_read_generic
, &spr_write_generic
,
859 /* Hardware implementation register */
860 spr_register(env
, SPR_HID0
, "HID0",
861 SPR_NOACCESS
, SPR_NOACCESS
,
862 &spr_read_generic
, &spr_write_generic
,
865 spr_register(env
, SPR_HID1
, "HID1",
866 SPR_NOACCESS
, SPR_NOACCESS
,
867 &spr_read_generic
, &spr_write_generic
,
870 spr_register(env
, SPR_HID2
, "HID2",
871 SPR_NOACCESS
, SPR_NOACCESS
,
872 &spr_read_generic
, &spr_write_generic
,
876 spr_register(env
, SPR_SPRG4
, "SPRG4",
877 SPR_NOACCESS
, SPR_NOACCESS
,
878 &spr_read_generic
, &spr_write_generic
,
880 spr_register(env
, SPR_SPRG5
, "SPRG5",
881 SPR_NOACCESS
, SPR_NOACCESS
,
882 &spr_read_generic
, &spr_write_generic
,
884 spr_register(env
, SPR_SPRG6
, "SPRG6",
885 SPR_NOACCESS
, SPR_NOACCESS
,
886 &spr_read_generic
, &spr_write_generic
,
888 spr_register(env
, SPR_SPRG7
, "SPRG7",
889 SPR_NOACCESS
, SPR_NOACCESS
,
890 &spr_read_generic
, &spr_write_generic
,
894 static void register_74xx_sprs(CPUPPCState
*env
)
897 spr_register_kvm(env
, SPR_DABR
, "DABR",
898 SPR_NOACCESS
, SPR_NOACCESS
,
899 &spr_read_generic
, &spr_write_generic
,
900 KVM_REG_PPC_DABR
, 0x00000000);
902 spr_register(env
, SPR_IABR
, "IABR",
903 SPR_NOACCESS
, SPR_NOACCESS
,
904 &spr_read_generic
, &spr_write_generic
,
906 /* Cache management */
907 spr_register(env
, SPR_ICTC
, "ICTC",
908 SPR_NOACCESS
, SPR_NOACCESS
,
909 &spr_read_generic
, &spr_write_generic
,
911 /* Performance monitors */
912 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
913 SPR_NOACCESS
, SPR_NOACCESS
,
914 &spr_read_generic
, &spr_write_generic
,
917 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
918 SPR_NOACCESS
, SPR_NOACCESS
,
919 &spr_read_generic
, &spr_write_generic
,
922 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
923 SPR_NOACCESS
, SPR_NOACCESS
,
924 &spr_read_generic
, &spr_write_generic
,
927 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
928 SPR_NOACCESS
, SPR_NOACCESS
,
929 &spr_read_generic
, &spr_write_generic
,
932 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
933 SPR_NOACCESS
, SPR_NOACCESS
,
934 &spr_read_generic
, &spr_write_generic
,
937 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
938 SPR_NOACCESS
, SPR_NOACCESS
,
939 &spr_read_generic
, &spr_write_generic
,
942 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
943 SPR_NOACCESS
, SPR_NOACCESS
,
944 &spr_read_generic
, SPR_NOACCESS
,
947 spr_register(env
, SPR_7XX_UMMCR0
, "UMMCR0",
948 &spr_read_ureg
, SPR_NOACCESS
,
949 &spr_read_ureg
, SPR_NOACCESS
,
952 spr_register(env
, SPR_7XX_UMMCR1
, "UMMCR1",
953 &spr_read_ureg
, SPR_NOACCESS
,
954 &spr_read_ureg
, SPR_NOACCESS
,
957 spr_register(env
, SPR_7XX_UPMC1
, "UPMC1",
958 &spr_read_ureg
, SPR_NOACCESS
,
959 &spr_read_ureg
, SPR_NOACCESS
,
962 spr_register(env
, SPR_7XX_UPMC2
, "UPMC2",
963 &spr_read_ureg
, SPR_NOACCESS
,
964 &spr_read_ureg
, SPR_NOACCESS
,
967 spr_register(env
, SPR_7XX_UPMC3
, "UPMC3",
968 &spr_read_ureg
, SPR_NOACCESS
,
969 &spr_read_ureg
, SPR_NOACCESS
,
972 spr_register(env
, SPR_7XX_UPMC4
, "UPMC4",
973 &spr_read_ureg
, SPR_NOACCESS
,
974 &spr_read_ureg
, SPR_NOACCESS
,
977 spr_register(env
, SPR_7XX_USIAR
, "USIAR",
978 &spr_read_ureg
, SPR_NOACCESS
,
979 &spr_read_ureg
, SPR_NOACCESS
,
981 /* External access control */
982 spr_register(env
, SPR_EAR
, "EAR",
983 SPR_NOACCESS
, SPR_NOACCESS
,
984 &spr_read_generic
, &spr_write_generic
,
987 /* Processor identification */
988 spr_register(env
, SPR_PIR
, "PIR",
989 SPR_NOACCESS
, SPR_NOACCESS
,
990 &spr_read_generic
, &spr_write_pir
,
993 spr_register(env
, SPR_74XX_MMCR2
, "MMCR2",
994 SPR_NOACCESS
, SPR_NOACCESS
,
995 &spr_read_generic
, &spr_write_generic
,
998 spr_register(env
, SPR_74XX_UMMCR2
, "UMMCR2",
999 &spr_read_ureg
, SPR_NOACCESS
,
1000 &spr_read_ureg
, SPR_NOACCESS
,
1003 spr_register(env
, SPR_BAMR
, "BAMR",
1004 SPR_NOACCESS
, SPR_NOACCESS
,
1005 &spr_read_generic
, &spr_write_generic
,
1008 spr_register(env
, SPR_MSSCR0
, "MSSCR0",
1009 SPR_NOACCESS
, SPR_NOACCESS
,
1010 &spr_read_generic
, &spr_write_generic
,
1012 /* Hardware implementation registers */
1013 spr_register(env
, SPR_HID0
, "HID0",
1014 SPR_NOACCESS
, SPR_NOACCESS
,
1015 &spr_read_generic
, &spr_write_generic
,
1018 spr_register(env
, SPR_HID1
, "HID1",
1019 SPR_NOACCESS
, SPR_NOACCESS
,
1020 &spr_read_generic
, &spr_write_generic
,
1023 spr_register(env
, SPR_VRSAVE
, "VRSAVE",
1024 &spr_read_generic
, &spr_write_generic
,
1025 &spr_read_generic
, &spr_write_generic
,
1028 spr_register(env
, SPR_L2CR
, "L2CR",
1029 SPR_NOACCESS
, SPR_NOACCESS
,
1030 &spr_read_generic
, spr_access_nop
,
1034 static void register_l3_ctrl(CPUPPCState
*env
)
1037 spr_register(env
, SPR_L3CR
, "L3CR",
1038 SPR_NOACCESS
, SPR_NOACCESS
,
1039 &spr_read_generic
, &spr_write_generic
,
1042 spr_register(env
, SPR_L3ITCR0
, "L3ITCR0",
1043 SPR_NOACCESS
, SPR_NOACCESS
,
1044 &spr_read_generic
, &spr_write_generic
,
1047 spr_register(env
, SPR_L3PM
, "L3PM",
1048 SPR_NOACCESS
, SPR_NOACCESS
,
1049 &spr_read_generic
, &spr_write_generic
,
1053 static void register_usprg3_sprs(CPUPPCState
*env
)
1055 spr_register(env
, SPR_USPRG3
, "USPRG3",
1056 &spr_read_ureg
, SPR_NOACCESS
,
1057 &spr_read_ureg
, SPR_NOACCESS
,
1061 static void register_usprgh_sprs(CPUPPCState
*env
)
1063 spr_register(env
, SPR_USPRG4
, "USPRG4",
1064 &spr_read_ureg
, SPR_NOACCESS
,
1065 &spr_read_ureg
, SPR_NOACCESS
,
1067 spr_register(env
, SPR_USPRG5
, "USPRG5",
1068 &spr_read_ureg
, SPR_NOACCESS
,
1069 &spr_read_ureg
, SPR_NOACCESS
,
1071 spr_register(env
, SPR_USPRG6
, "USPRG6",
1072 &spr_read_ureg
, SPR_NOACCESS
,
1073 &spr_read_ureg
, SPR_NOACCESS
,
1075 spr_register(env
, SPR_USPRG7
, "USPRG7",
1076 &spr_read_ureg
, SPR_NOACCESS
,
1077 &spr_read_ureg
, SPR_NOACCESS
,
1081 /* PowerPC BookE SPR */
1082 static void register_BookE_sprs(CPUPPCState
*env
, uint64_t ivor_mask
)
1084 const char *ivor_names
[64] = {
1085 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
1086 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
1087 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
1088 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1089 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1090 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1091 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1092 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1093 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1094 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1095 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1096 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1097 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1098 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1099 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1100 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1102 #define SPR_BOOKE_IVORxx (-1)
1103 int ivor_sprn
[64] = {
1104 SPR_BOOKE_IVOR0
, SPR_BOOKE_IVOR1
, SPR_BOOKE_IVOR2
, SPR_BOOKE_IVOR3
,
1105 SPR_BOOKE_IVOR4
, SPR_BOOKE_IVOR5
, SPR_BOOKE_IVOR6
, SPR_BOOKE_IVOR7
,
1106 SPR_BOOKE_IVOR8
, SPR_BOOKE_IVOR9
, SPR_BOOKE_IVOR10
, SPR_BOOKE_IVOR11
,
1107 SPR_BOOKE_IVOR12
, SPR_BOOKE_IVOR13
, SPR_BOOKE_IVOR14
, SPR_BOOKE_IVOR15
,
1108 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1109 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1110 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1111 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1112 SPR_BOOKE_IVOR32
, SPR_BOOKE_IVOR33
, SPR_BOOKE_IVOR34
, SPR_BOOKE_IVOR35
,
1113 SPR_BOOKE_IVOR36
, SPR_BOOKE_IVOR37
, SPR_BOOKE_IVOR38
, SPR_BOOKE_IVOR39
,
1114 SPR_BOOKE_IVOR40
, SPR_BOOKE_IVOR41
, SPR_BOOKE_IVOR42
, SPR_BOOKE_IVORxx
,
1115 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1116 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1117 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1118 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1119 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1123 /* Interrupt processing */
1124 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
1125 SPR_NOACCESS
, SPR_NOACCESS
,
1126 &spr_read_generic
, &spr_write_generic
,
1128 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
1129 SPR_NOACCESS
, SPR_NOACCESS
,
1130 &spr_read_generic
, &spr_write_generic
,
1133 spr_register(env
, SPR_BOOKE_IAC1
, "IAC1",
1134 SPR_NOACCESS
, SPR_NOACCESS
,
1135 &spr_read_generic
, &spr_write_generic
,
1138 spr_register(env
, SPR_BOOKE_IAC2
, "IAC2",
1139 SPR_NOACCESS
, SPR_NOACCESS
,
1140 &spr_read_generic
, &spr_write_generic
,
1143 spr_register(env
, SPR_BOOKE_DAC1
, "DAC1",
1144 SPR_NOACCESS
, SPR_NOACCESS
,
1145 &spr_read_generic
, &spr_write_generic
,
1148 spr_register(env
, SPR_BOOKE_DAC2
, "DAC2",
1149 SPR_NOACCESS
, SPR_NOACCESS
,
1150 &spr_read_generic
, &spr_write_generic
,
1153 spr_register(env
, SPR_BOOKE_DBCR0
, "DBCR0",
1154 SPR_NOACCESS
, SPR_NOACCESS
,
1155 &spr_read_generic
, &spr_write_40x_dbcr0
,
1158 spr_register(env
, SPR_BOOKE_DBCR1
, "DBCR1",
1159 SPR_NOACCESS
, SPR_NOACCESS
,
1160 &spr_read_generic
, &spr_write_generic
,
1163 spr_register(env
, SPR_BOOKE_DBCR2
, "DBCR2",
1164 SPR_NOACCESS
, SPR_NOACCESS
,
1165 &spr_read_generic
, &spr_write_generic
,
1167 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
1168 SPR_NOACCESS
, SPR_NOACCESS
,
1169 &spr_read_generic
, &spr_write_generic
,
1171 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
1172 SPR_NOACCESS
, SPR_NOACCESS
,
1173 &spr_read_generic
, &spr_write_generic
,
1176 spr_register(env
, SPR_BOOKE_DBSR
, "DBSR",
1177 SPR_NOACCESS
, SPR_NOACCESS
,
1178 &spr_read_generic
, &spr_write_clear
,
1180 spr_register(env
, SPR_BOOKE_DEAR
, "DEAR",
1181 SPR_NOACCESS
, SPR_NOACCESS
,
1182 &spr_read_generic
, &spr_write_generic
,
1184 spr_register(env
, SPR_BOOKE_ESR
, "ESR",
1185 SPR_NOACCESS
, SPR_NOACCESS
,
1186 &spr_read_generic
, &spr_write_generic
,
1188 spr_register(env
, SPR_BOOKE_IVPR
, "IVPR",
1189 SPR_NOACCESS
, SPR_NOACCESS
,
1190 &spr_read_generic
, &spr_write_excp_prefix
,
1192 /* Exception vectors */
1193 for (i
= 0; i
< 64; i
++) {
1194 if (ivor_mask
& (1ULL << i
)) {
1195 if (ivor_sprn
[i
] == SPR_BOOKE_IVORxx
) {
1196 fprintf(stderr
, "ERROR: IVOR %d SPR is not defined\n", i
);
1199 spr_register(env
, ivor_sprn
[i
], ivor_names
[i
],
1200 SPR_NOACCESS
, SPR_NOACCESS
,
1201 &spr_read_generic
, &spr_write_excp_vector
,
1205 spr_register(env
, SPR_BOOKE_PID
, "PID",
1206 SPR_NOACCESS
, SPR_NOACCESS
,
1207 &spr_read_generic
, &spr_write_booke_pid
,
1209 spr_register(env
, SPR_BOOKE_TCR
, "TCR",
1210 SPR_NOACCESS
, SPR_NOACCESS
,
1211 &spr_read_generic
, &spr_write_booke_tcr
,
1213 spr_register(env
, SPR_BOOKE_TSR
, "TSR",
1214 SPR_NOACCESS
, SPR_NOACCESS
,
1215 &spr_read_generic
, &spr_write_booke_tsr
,
1218 spr_register(env
, SPR_DECR
, "DECR",
1219 SPR_NOACCESS
, SPR_NOACCESS
,
1220 &spr_read_decr
, &spr_write_decr
,
1222 spr_register(env
, SPR_BOOKE_DECAR
, "DECAR",
1223 SPR_NOACCESS
, SPR_NOACCESS
,
1224 SPR_NOACCESS
, &spr_write_generic
,
1227 spr_register(env
, SPR_USPRG0
, "USPRG0",
1228 &spr_read_generic
, &spr_write_generic
,
1229 &spr_read_generic
, &spr_write_generic
,
1231 spr_register(env
, SPR_SPRG4
, "SPRG4",
1232 SPR_NOACCESS
, SPR_NOACCESS
,
1233 &spr_read_generic
, &spr_write_generic
,
1235 spr_register(env
, SPR_SPRG5
, "SPRG5",
1236 SPR_NOACCESS
, SPR_NOACCESS
,
1237 &spr_read_generic
, &spr_write_generic
,
1239 spr_register(env
, SPR_SPRG6
, "SPRG6",
1240 SPR_NOACCESS
, SPR_NOACCESS
,
1241 &spr_read_generic
, &spr_write_generic
,
1243 spr_register(env
, SPR_SPRG7
, "SPRG7",
1244 SPR_NOACCESS
, SPR_NOACCESS
,
1245 &spr_read_generic
, &spr_write_generic
,
1247 spr_register(env
, SPR_BOOKE_SPRG8
, "SPRG8",
1248 SPR_NOACCESS
, SPR_NOACCESS
,
1249 &spr_read_generic
, &spr_write_generic
,
1251 spr_register(env
, SPR_BOOKE_SPRG9
, "SPRG9",
1252 SPR_NOACCESS
, SPR_NOACCESS
,
1253 &spr_read_generic
, &spr_write_generic
,
1257 #if !defined(CONFIG_USER_ONLY)
1258 static inline uint32_t register_tlbncfg(uint32_t assoc
, uint32_t minsize
,
1259 uint32_t maxsize
, uint32_t flags
,
1262 return (assoc
<< TLBnCFG_ASSOC_SHIFT
) |
1263 (minsize
<< TLBnCFG_MINSIZE_SHIFT
) |
1264 (maxsize
<< TLBnCFG_MAXSIZE_SHIFT
) |
1267 #endif /* !CONFIG_USER_ONLY */
1269 /* BookE 2.06 storage control registers */
1270 static void register_BookE206_sprs(CPUPPCState
*env
, uint32_t mas_mask
,
1271 uint32_t *tlbncfg
, uint32_t mmucfg
)
1273 #if !defined(CONFIG_USER_ONLY)
1274 const char *mas_names
[8] = {
1275 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1278 SPR_BOOKE_MAS0
, SPR_BOOKE_MAS1
, SPR_BOOKE_MAS2
, SPR_BOOKE_MAS3
,
1279 SPR_BOOKE_MAS4
, SPR_BOOKE_MAS5
, SPR_BOOKE_MAS6
, SPR_BOOKE_MAS7
,
1283 /* TLB assist registers */
1284 for (i
= 0; i
< 8; i
++) {
1285 if (mas_mask
& (1 << i
)) {
1286 spr_register(env
, mas_sprn
[i
], mas_names
[i
],
1287 SPR_NOACCESS
, SPR_NOACCESS
,
1289 (i
== 2 && (env
->insns_flags
& PPC_64B
))
1290 ? &spr_write_generic
: &spr_write_generic32
,
1294 if (env
->nb_pids
> 1) {
1295 spr_register(env
, SPR_BOOKE_PID1
, "PID1",
1296 SPR_NOACCESS
, SPR_NOACCESS
,
1297 &spr_read_generic
, &spr_write_booke_pid
,
1300 if (env
->nb_pids
> 2) {
1301 spr_register(env
, SPR_BOOKE_PID2
, "PID2",
1302 SPR_NOACCESS
, SPR_NOACCESS
,
1303 &spr_read_generic
, &spr_write_booke_pid
,
1307 spr_register(env
, SPR_BOOKE_EPLC
, "EPLC",
1308 SPR_NOACCESS
, SPR_NOACCESS
,
1309 &spr_read_generic
, &spr_write_eplc
,
1311 spr_register(env
, SPR_BOOKE_EPSC
, "EPSC",
1312 SPR_NOACCESS
, SPR_NOACCESS
,
1313 &spr_read_generic
, &spr_write_epsc
,
1316 spr_register(env
, SPR_MMUCFG
, "MMUCFG",
1317 SPR_NOACCESS
, SPR_NOACCESS
,
1318 &spr_read_generic
, SPR_NOACCESS
,
1320 switch (env
->nb_ways
) {
1322 spr_register(env
, SPR_BOOKE_TLB3CFG
, "TLB3CFG",
1323 SPR_NOACCESS
, SPR_NOACCESS
,
1324 &spr_read_generic
, SPR_NOACCESS
,
1328 spr_register(env
, SPR_BOOKE_TLB2CFG
, "TLB2CFG",
1329 SPR_NOACCESS
, SPR_NOACCESS
,
1330 &spr_read_generic
, SPR_NOACCESS
,
1334 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
1335 SPR_NOACCESS
, SPR_NOACCESS
,
1336 &spr_read_generic
, SPR_NOACCESS
,
1340 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
1341 SPR_NOACCESS
, SPR_NOACCESS
,
1342 &spr_read_generic
, SPR_NOACCESS
,
1352 /* SPR specific to PowerPC 440 implementation */
1353 static void register_440_sprs(CPUPPCState
*env
)
1356 spr_register(env
, SPR_440_DNV0
, "DNV0",
1357 SPR_NOACCESS
, SPR_NOACCESS
,
1358 &spr_read_generic
, &spr_write_generic
,
1361 spr_register(env
, SPR_440_DNV1
, "DNV1",
1362 SPR_NOACCESS
, SPR_NOACCESS
,
1363 &spr_read_generic
, &spr_write_generic
,
1366 spr_register(env
, SPR_440_DNV2
, "DNV2",
1367 SPR_NOACCESS
, SPR_NOACCESS
,
1368 &spr_read_generic
, &spr_write_generic
,
1371 spr_register(env
, SPR_440_DNV3
, "DNV3",
1372 SPR_NOACCESS
, SPR_NOACCESS
,
1373 &spr_read_generic
, &spr_write_generic
,
1376 spr_register(env
, SPR_440_DTV0
, "DTV0",
1377 SPR_NOACCESS
, SPR_NOACCESS
,
1378 &spr_read_generic
, &spr_write_generic
,
1381 spr_register(env
, SPR_440_DTV1
, "DTV1",
1382 SPR_NOACCESS
, SPR_NOACCESS
,
1383 &spr_read_generic
, &spr_write_generic
,
1386 spr_register(env
, SPR_440_DTV2
, "DTV2",
1387 SPR_NOACCESS
, SPR_NOACCESS
,
1388 &spr_read_generic
, &spr_write_generic
,
1391 spr_register(env
, SPR_440_DTV3
, "DTV3",
1392 SPR_NOACCESS
, SPR_NOACCESS
,
1393 &spr_read_generic
, &spr_write_generic
,
1396 spr_register(env
, SPR_440_DVLIM
, "DVLIM",
1397 SPR_NOACCESS
, SPR_NOACCESS
,
1398 &spr_read_generic
, &spr_write_generic
,
1401 spr_register(env
, SPR_440_INV0
, "INV0",
1402 SPR_NOACCESS
, SPR_NOACCESS
,
1403 &spr_read_generic
, &spr_write_generic
,
1406 spr_register(env
, SPR_440_INV1
, "INV1",
1407 SPR_NOACCESS
, SPR_NOACCESS
,
1408 &spr_read_generic
, &spr_write_generic
,
1411 spr_register(env
, SPR_440_INV2
, "INV2",
1412 SPR_NOACCESS
, SPR_NOACCESS
,
1413 &spr_read_generic
, &spr_write_generic
,
1416 spr_register(env
, SPR_440_INV3
, "INV3",
1417 SPR_NOACCESS
, SPR_NOACCESS
,
1418 &spr_read_generic
, &spr_write_generic
,
1421 spr_register(env
, SPR_440_ITV0
, "ITV0",
1422 SPR_NOACCESS
, SPR_NOACCESS
,
1423 &spr_read_generic
, &spr_write_generic
,
1426 spr_register(env
, SPR_440_ITV1
, "ITV1",
1427 SPR_NOACCESS
, SPR_NOACCESS
,
1428 &spr_read_generic
, &spr_write_generic
,
1431 spr_register(env
, SPR_440_ITV2
, "ITV2",
1432 SPR_NOACCESS
, SPR_NOACCESS
,
1433 &spr_read_generic
, &spr_write_generic
,
1436 spr_register(env
, SPR_440_ITV3
, "ITV3",
1437 SPR_NOACCESS
, SPR_NOACCESS
,
1438 &spr_read_generic
, &spr_write_generic
,
1441 spr_register(env
, SPR_440_IVLIM
, "IVLIM",
1442 SPR_NOACCESS
, SPR_NOACCESS
,
1443 &spr_read_generic
, &spr_write_generic
,
1446 spr_register(env
, SPR_BOOKE_DCDBTRH
, "DCDBTRH",
1447 SPR_NOACCESS
, SPR_NOACCESS
,
1448 &spr_read_generic
, SPR_NOACCESS
,
1451 spr_register(env
, SPR_BOOKE_DCDBTRL
, "DCDBTRL",
1452 SPR_NOACCESS
, SPR_NOACCESS
,
1453 &spr_read_generic
, SPR_NOACCESS
,
1456 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1457 SPR_NOACCESS
, SPR_NOACCESS
,
1458 &spr_read_generic
, SPR_NOACCESS
,
1461 spr_register(env
, SPR_BOOKE_ICDBTRH
, "ICDBTRH",
1462 SPR_NOACCESS
, SPR_NOACCESS
,
1463 &spr_read_generic
, SPR_NOACCESS
,
1466 spr_register(env
, SPR_BOOKE_ICDBTRL
, "ICDBTRL",
1467 SPR_NOACCESS
, SPR_NOACCESS
,
1468 &spr_read_generic
, SPR_NOACCESS
,
1471 spr_register(env
, SPR_440_DBDR
, "DBDR",
1472 SPR_NOACCESS
, SPR_NOACCESS
,
1473 &spr_read_generic
, &spr_write_generic
,
1475 /* Processor control */
1476 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1477 SPR_NOACCESS
, SPR_NOACCESS
,
1478 &spr_read_generic
, &spr_write_generic
,
1480 spr_register(env
, SPR_440_RSTCFG
, "RSTCFG",
1481 SPR_NOACCESS
, SPR_NOACCESS
,
1482 &spr_read_generic
, SPR_NOACCESS
,
1484 /* Storage control */
1485 spr_register(env
, SPR_440_MMUCR
, "MMUCR",
1486 SPR_NOACCESS
, SPR_NOACCESS
,
1487 &spr_read_generic
, &spr_write_generic
,
1490 /* Processor identification */
1491 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
1492 SPR_NOACCESS
, SPR_NOACCESS
,
1493 &spr_read_generic
, &spr_write_pir
,
1496 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
1497 SPR_NOACCESS
, SPR_NOACCESS
,
1498 &spr_read_generic
, &spr_write_generic
,
1501 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
1502 SPR_NOACCESS
, SPR_NOACCESS
,
1503 &spr_read_generic
, &spr_write_generic
,
1506 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
1507 SPR_NOACCESS
, SPR_NOACCESS
,
1508 &spr_read_generic
, &spr_write_generic
,
1511 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
1512 SPR_NOACCESS
, SPR_NOACCESS
,
1513 &spr_read_generic
, &spr_write_generic
,
1517 /* SPR shared between PowerPC 40x implementations */
1518 static void register_40x_sprs(CPUPPCState
*env
)
1521 /* not emulated, as QEMU do not emulate caches */
1522 spr_register(env
, SPR_40x_DCCR
, "DCCR",
1523 SPR_NOACCESS
, SPR_NOACCESS
,
1524 &spr_read_generic
, &spr_write_generic
,
1526 /* not emulated, as QEMU do not emulate caches */
1527 spr_register(env
, SPR_40x_ICCR
, "ICCR",
1528 SPR_NOACCESS
, SPR_NOACCESS
,
1529 &spr_read_generic
, &spr_write_generic
,
1531 /* not emulated, as QEMU do not emulate caches */
1532 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1533 SPR_NOACCESS
, SPR_NOACCESS
,
1534 &spr_read_generic
, SPR_NOACCESS
,
1537 spr_register(env
, SPR_40x_DEAR
, "DEAR",
1538 SPR_NOACCESS
, SPR_NOACCESS
,
1539 &spr_read_generic
, &spr_write_generic
,
1541 spr_register(env
, SPR_40x_ESR
, "ESR",
1542 SPR_NOACCESS
, SPR_NOACCESS
,
1543 &spr_read_generic
, &spr_write_generic
,
1545 spr_register(env
, SPR_40x_EVPR
, "EVPR",
1546 SPR_NOACCESS
, SPR_NOACCESS
,
1547 &spr_read_generic
, &spr_write_excp_prefix
,
1549 spr_register(env
, SPR_40x_SRR2
, "SRR2",
1550 &spr_read_generic
, &spr_write_generic
,
1551 &spr_read_generic
, &spr_write_generic
,
1553 spr_register(env
, SPR_40x_SRR3
, "SRR3",
1554 &spr_read_generic
, &spr_write_generic
,
1555 &spr_read_generic
, &spr_write_generic
,
1558 spr_register(env
, SPR_40x_PIT
, "PIT",
1559 SPR_NOACCESS
, SPR_NOACCESS
,
1560 &spr_read_40x_pit
, &spr_write_40x_pit
,
1562 spr_register(env
, SPR_40x_TCR
, "TCR",
1563 SPR_NOACCESS
, SPR_NOACCESS
,
1564 &spr_read_generic
, &spr_write_40x_tcr
,
1566 spr_register(env
, SPR_40x_TSR
, "TSR",
1567 SPR_NOACCESS
, SPR_NOACCESS
,
1568 &spr_read_generic
, &spr_write_40x_tsr
,
1572 /* SPR specific to PowerPC 405 implementation */
1573 static void register_405_sprs(CPUPPCState
*env
)
1576 spr_register(env
, SPR_40x_PID
, "PID",
1577 SPR_NOACCESS
, SPR_NOACCESS
,
1578 &spr_read_generic
, &spr_write_40x_pid
,
1580 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1581 SPR_NOACCESS
, SPR_NOACCESS
,
1582 &spr_read_generic
, &spr_write_generic
,
1584 /* Debug interface */
1585 spr_register(env
, SPR_40x_DBCR0
, "DBCR0",
1586 SPR_NOACCESS
, SPR_NOACCESS
,
1587 &spr_read_generic
, &spr_write_40x_dbcr0
,
1590 spr_register(env
, SPR_405_DBCR1
, "DBCR1",
1591 SPR_NOACCESS
, SPR_NOACCESS
,
1592 &spr_read_generic
, &spr_write_generic
,
1595 spr_register(env
, SPR_40x_DBSR
, "DBSR",
1596 SPR_NOACCESS
, SPR_NOACCESS
,
1597 &spr_read_generic
, &spr_write_clear
,
1598 /* Last reset was system reset */
1601 spr_register(env
, SPR_40x_DAC1
, "DAC1",
1602 SPR_NOACCESS
, SPR_NOACCESS
,
1603 &spr_read_generic
, &spr_write_generic
,
1605 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1606 SPR_NOACCESS
, SPR_NOACCESS
,
1607 &spr_read_generic
, &spr_write_generic
,
1610 spr_register(env
, SPR_405_DVC1
, "DVC1",
1611 SPR_NOACCESS
, SPR_NOACCESS
,
1612 &spr_read_generic
, &spr_write_generic
,
1615 spr_register(env
, SPR_405_DVC2
, "DVC2",
1616 SPR_NOACCESS
, SPR_NOACCESS
,
1617 &spr_read_generic
, &spr_write_generic
,
1620 spr_register(env
, SPR_40x_IAC1
, "IAC1",
1621 SPR_NOACCESS
, SPR_NOACCESS
,
1622 &spr_read_generic
, &spr_write_generic
,
1624 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1625 SPR_NOACCESS
, SPR_NOACCESS
,
1626 &spr_read_generic
, &spr_write_generic
,
1629 spr_register(env
, SPR_405_IAC3
, "IAC3",
1630 SPR_NOACCESS
, SPR_NOACCESS
,
1631 &spr_read_generic
, &spr_write_generic
,
1634 spr_register(env
, SPR_405_IAC4
, "IAC4",
1635 SPR_NOACCESS
, SPR_NOACCESS
,
1636 &spr_read_generic
, &spr_write_generic
,
1638 /* Storage control */
1639 spr_register(env
, SPR_405_SLER
, "SLER",
1640 SPR_NOACCESS
, SPR_NOACCESS
,
1641 &spr_read_generic
, &spr_write_40x_sler
,
1643 spr_register(env
, SPR_40x_ZPR
, "ZPR",
1644 SPR_NOACCESS
, SPR_NOACCESS
,
1645 &spr_read_generic
, &spr_write_generic
,
1648 spr_register(env
, SPR_405_SU0R
, "SU0R",
1649 SPR_NOACCESS
, SPR_NOACCESS
,
1650 &spr_read_generic
, &spr_write_generic
,
1653 spr_register(env
, SPR_USPRG0
, "USPRG0",
1654 &spr_read_ureg
, SPR_NOACCESS
,
1655 &spr_read_ureg
, SPR_NOACCESS
,
1657 spr_register(env
, SPR_SPRG4
, "SPRG4",
1658 SPR_NOACCESS
, SPR_NOACCESS
,
1659 &spr_read_generic
, &spr_write_generic
,
1661 spr_register(env
, SPR_SPRG5
, "SPRG5",
1662 SPR_NOACCESS
, SPR_NOACCESS
,
1663 spr_read_generic
, &spr_write_generic
,
1665 spr_register(env
, SPR_SPRG6
, "SPRG6",
1666 SPR_NOACCESS
, SPR_NOACCESS
,
1667 spr_read_generic
, &spr_write_generic
,
1669 spr_register(env
, SPR_SPRG7
, "SPRG7",
1670 SPR_NOACCESS
, SPR_NOACCESS
,
1671 spr_read_generic
, &spr_write_generic
,
1674 /* Bus access control */
1675 /* not emulated, as QEMU never does speculative access */
1676 spr_register(env
, SPR_40x_SGR
, "SGR",
1677 SPR_NOACCESS
, SPR_NOACCESS
,
1678 &spr_read_generic
, &spr_write_generic
,
1680 /* not emulated, as QEMU do not emulate caches */
1681 spr_register(env
, SPR_40x_DCWR
, "DCWR",
1682 SPR_NOACCESS
, SPR_NOACCESS
,
1683 &spr_read_generic
, &spr_write_generic
,
1688 static void register_5xx_8xx_sprs(CPUPPCState
*env
)
1690 /* Exception processing */
1691 spr_register_kvm(env
, SPR_DSISR
, "DSISR",
1692 SPR_NOACCESS
, SPR_NOACCESS
,
1693 &spr_read_generic
, &spr_write_generic
,
1694 KVM_REG_PPC_DSISR
, 0x00000000);
1695 spr_register_kvm(env
, SPR_DAR
, "DAR",
1696 SPR_NOACCESS
, SPR_NOACCESS
,
1697 &spr_read_generic
, &spr_write_generic
,
1698 KVM_REG_PPC_DAR
, 0x00000000);
1700 spr_register(env
, SPR_DECR
, "DECR",
1701 SPR_NOACCESS
, SPR_NOACCESS
,
1702 &spr_read_decr
, &spr_write_decr
,
1705 spr_register(env
, SPR_MPC_EIE
, "EIE",
1706 SPR_NOACCESS
, SPR_NOACCESS
,
1707 &spr_read_generic
, &spr_write_generic
,
1710 spr_register(env
, SPR_MPC_EID
, "EID",
1711 SPR_NOACCESS
, SPR_NOACCESS
,
1712 &spr_read_generic
, &spr_write_generic
,
1715 spr_register(env
, SPR_MPC_NRI
, "NRI",
1716 SPR_NOACCESS
, SPR_NOACCESS
,
1717 &spr_read_generic
, &spr_write_generic
,
1720 spr_register(env
, SPR_MPC_CMPA
, "CMPA",
1721 SPR_NOACCESS
, SPR_NOACCESS
,
1722 &spr_read_generic
, &spr_write_generic
,
1725 spr_register(env
, SPR_MPC_CMPB
, "CMPB",
1726 SPR_NOACCESS
, SPR_NOACCESS
,
1727 &spr_read_generic
, &spr_write_generic
,
1730 spr_register(env
, SPR_MPC_CMPC
, "CMPC",
1731 SPR_NOACCESS
, SPR_NOACCESS
,
1732 &spr_read_generic
, &spr_write_generic
,
1735 spr_register(env
, SPR_MPC_CMPD
, "CMPD",
1736 SPR_NOACCESS
, SPR_NOACCESS
,
1737 &spr_read_generic
, &spr_write_generic
,
1740 spr_register(env
, SPR_MPC_ECR
, "ECR",
1741 SPR_NOACCESS
, SPR_NOACCESS
,
1742 &spr_read_generic
, &spr_write_generic
,
1745 spr_register(env
, SPR_MPC_DER
, "DER",
1746 SPR_NOACCESS
, SPR_NOACCESS
,
1747 &spr_read_generic
, &spr_write_generic
,
1750 spr_register(env
, SPR_MPC_COUNTA
, "COUNTA",
1751 SPR_NOACCESS
, SPR_NOACCESS
,
1752 &spr_read_generic
, &spr_write_generic
,
1755 spr_register(env
, SPR_MPC_COUNTB
, "COUNTB",
1756 SPR_NOACCESS
, SPR_NOACCESS
,
1757 &spr_read_generic
, &spr_write_generic
,
1760 spr_register(env
, SPR_MPC_CMPE
, "CMPE",
1761 SPR_NOACCESS
, SPR_NOACCESS
,
1762 &spr_read_generic
, &spr_write_generic
,
1765 spr_register(env
, SPR_MPC_CMPF
, "CMPF",
1766 SPR_NOACCESS
, SPR_NOACCESS
,
1767 &spr_read_generic
, &spr_write_generic
,
1770 spr_register(env
, SPR_MPC_CMPG
, "CMPG",
1771 SPR_NOACCESS
, SPR_NOACCESS
,
1772 &spr_read_generic
, &spr_write_generic
,
1775 spr_register(env
, SPR_MPC_CMPH
, "CMPH",
1776 SPR_NOACCESS
, SPR_NOACCESS
,
1777 &spr_read_generic
, &spr_write_generic
,
1780 spr_register(env
, SPR_MPC_LCTRL1
, "LCTRL1",
1781 SPR_NOACCESS
, SPR_NOACCESS
,
1782 &spr_read_generic
, &spr_write_generic
,
1785 spr_register(env
, SPR_MPC_LCTRL2
, "LCTRL2",
1786 SPR_NOACCESS
, SPR_NOACCESS
,
1787 &spr_read_generic
, &spr_write_generic
,
1790 spr_register(env
, SPR_MPC_BAR
, "BAR",
1791 SPR_NOACCESS
, SPR_NOACCESS
,
1792 &spr_read_generic
, &spr_write_generic
,
1795 spr_register(env
, SPR_MPC_DPDR
, "DPDR",
1796 SPR_NOACCESS
, SPR_NOACCESS
,
1797 &spr_read_generic
, &spr_write_generic
,
1800 spr_register(env
, SPR_MPC_IMMR
, "IMMR",
1801 SPR_NOACCESS
, SPR_NOACCESS
,
1802 &spr_read_generic
, &spr_write_generic
,
1806 static void register_5xx_sprs(CPUPPCState
*env
)
1808 spr_register(env
, SPR_RCPU_MI_GRA
, "MI_GRA",
1809 SPR_NOACCESS
, SPR_NOACCESS
,
1810 &spr_read_generic
, &spr_write_generic
,
1813 spr_register(env
, SPR_RCPU_L2U_GRA
, "L2U_GRA",
1814 SPR_NOACCESS
, SPR_NOACCESS
,
1815 &spr_read_generic
, &spr_write_generic
,
1818 spr_register(env
, SPR_RPCU_BBCMCR
, "L2U_BBCMCR",
1819 SPR_NOACCESS
, SPR_NOACCESS
,
1820 &spr_read_generic
, &spr_write_generic
,
1823 spr_register(env
, SPR_RCPU_L2U_MCR
, "L2U_MCR",
1824 SPR_NOACCESS
, SPR_NOACCESS
,
1825 &spr_read_generic
, &spr_write_generic
,
1828 spr_register(env
, SPR_RCPU_MI_RBA0
, "MI_RBA0",
1829 SPR_NOACCESS
, SPR_NOACCESS
,
1830 &spr_read_generic
, &spr_write_generic
,
1833 spr_register(env
, SPR_RCPU_MI_RBA1
, "MI_RBA1",
1834 SPR_NOACCESS
, SPR_NOACCESS
,
1835 &spr_read_generic
, &spr_write_generic
,
1838 spr_register(env
, SPR_RCPU_MI_RBA2
, "MI_RBA2",
1839 SPR_NOACCESS
, SPR_NOACCESS
,
1840 &spr_read_generic
, &spr_write_generic
,
1843 spr_register(env
, SPR_RCPU_MI_RBA3
, "MI_RBA3",
1844 SPR_NOACCESS
, SPR_NOACCESS
,
1845 &spr_read_generic
, &spr_write_generic
,
1848 spr_register(env
, SPR_RCPU_L2U_RBA0
, "L2U_RBA0",
1849 SPR_NOACCESS
, SPR_NOACCESS
,
1850 &spr_read_generic
, &spr_write_generic
,
1853 spr_register(env
, SPR_RCPU_L2U_RBA1
, "L2U_RBA1",
1854 SPR_NOACCESS
, SPR_NOACCESS
,
1855 &spr_read_generic
, &spr_write_generic
,
1858 spr_register(env
, SPR_RCPU_L2U_RBA2
, "L2U_RBA2",
1859 SPR_NOACCESS
, SPR_NOACCESS
,
1860 &spr_read_generic
, &spr_write_generic
,
1863 spr_register(env
, SPR_RCPU_L2U_RBA3
, "L2U_RBA3",
1864 SPR_NOACCESS
, SPR_NOACCESS
,
1865 &spr_read_generic
, &spr_write_generic
,
1868 spr_register(env
, SPR_RCPU_MI_RA0
, "MI_RA0",
1869 SPR_NOACCESS
, SPR_NOACCESS
,
1870 &spr_read_generic
, &spr_write_generic
,
1873 spr_register(env
, SPR_RCPU_MI_RA1
, "MI_RA1",
1874 SPR_NOACCESS
, SPR_NOACCESS
,
1875 &spr_read_generic
, &spr_write_generic
,
1878 spr_register(env
, SPR_RCPU_MI_RA2
, "MI_RA2",
1879 SPR_NOACCESS
, SPR_NOACCESS
,
1880 &spr_read_generic
, &spr_write_generic
,
1883 spr_register(env
, SPR_RCPU_MI_RA3
, "MI_RA3",
1884 SPR_NOACCESS
, SPR_NOACCESS
,
1885 &spr_read_generic
, &spr_write_generic
,
1888 spr_register(env
, SPR_RCPU_L2U_RA0
, "L2U_RA0",
1889 SPR_NOACCESS
, SPR_NOACCESS
,
1890 &spr_read_generic
, &spr_write_generic
,
1893 spr_register(env
, SPR_RCPU_L2U_RA1
, "L2U_RA1",
1894 SPR_NOACCESS
, SPR_NOACCESS
,
1895 &spr_read_generic
, &spr_write_generic
,
1898 spr_register(env
, SPR_RCPU_L2U_RA2
, "L2U_RA2",
1899 SPR_NOACCESS
, SPR_NOACCESS
,
1900 &spr_read_generic
, &spr_write_generic
,
1903 spr_register(env
, SPR_RCPU_L2U_RA3
, "L2U_RA3",
1904 SPR_NOACCESS
, SPR_NOACCESS
,
1905 &spr_read_generic
, &spr_write_generic
,
1908 spr_register(env
, SPR_RCPU_FPECR
, "FPECR",
1909 SPR_NOACCESS
, SPR_NOACCESS
,
1910 &spr_read_generic
, &spr_write_generic
,
1914 static void register_8xx_sprs(CPUPPCState
*env
)
1917 spr_register(env
, SPR_MPC_IC_CST
, "IC_CST",
1918 SPR_NOACCESS
, SPR_NOACCESS
,
1919 &spr_read_generic
, &spr_write_generic
,
1922 spr_register(env
, SPR_MPC_IC_ADR
, "IC_ADR",
1923 SPR_NOACCESS
, SPR_NOACCESS
,
1924 &spr_read_generic
, &spr_write_generic
,
1927 spr_register(env
, SPR_MPC_IC_DAT
, "IC_DAT",
1928 SPR_NOACCESS
, SPR_NOACCESS
,
1929 &spr_read_generic
, &spr_write_generic
,
1932 spr_register(env
, SPR_MPC_DC_CST
, "DC_CST",
1933 SPR_NOACCESS
, SPR_NOACCESS
,
1934 &spr_read_generic
, &spr_write_generic
,
1937 spr_register(env
, SPR_MPC_DC_ADR
, "DC_ADR",
1938 SPR_NOACCESS
, SPR_NOACCESS
,
1939 &spr_read_generic
, &spr_write_generic
,
1942 spr_register(env
, SPR_MPC_DC_DAT
, "DC_DAT",
1943 SPR_NOACCESS
, SPR_NOACCESS
,
1944 &spr_read_generic
, &spr_write_generic
,
1947 spr_register(env
, SPR_MPC_MI_CTR
, "MI_CTR",
1948 SPR_NOACCESS
, SPR_NOACCESS
,
1949 &spr_read_generic
, &spr_write_generic
,
1952 spr_register(env
, SPR_MPC_MI_AP
, "MI_AP",
1953 SPR_NOACCESS
, SPR_NOACCESS
,
1954 &spr_read_generic
, &spr_write_generic
,
1957 spr_register(env
, SPR_MPC_MI_EPN
, "MI_EPN",
1958 SPR_NOACCESS
, SPR_NOACCESS
,
1959 &spr_read_generic
, &spr_write_generic
,
1962 spr_register(env
, SPR_MPC_MI_TWC
, "MI_TWC",
1963 SPR_NOACCESS
, SPR_NOACCESS
,
1964 &spr_read_generic
, &spr_write_generic
,
1967 spr_register(env
, SPR_MPC_MI_RPN
, "MI_RPN",
1968 SPR_NOACCESS
, SPR_NOACCESS
,
1969 &spr_read_generic
, &spr_write_generic
,
1972 spr_register(env
, SPR_MPC_MI_DBCAM
, "MI_DBCAM",
1973 SPR_NOACCESS
, SPR_NOACCESS
,
1974 &spr_read_generic
, &spr_write_generic
,
1977 spr_register(env
, SPR_MPC_MI_DBRAM0
, "MI_DBRAM0",
1978 SPR_NOACCESS
, SPR_NOACCESS
,
1979 &spr_read_generic
, &spr_write_generic
,
1982 spr_register(env
, SPR_MPC_MI_DBRAM1
, "MI_DBRAM1",
1983 SPR_NOACCESS
, SPR_NOACCESS
,
1984 &spr_read_generic
, &spr_write_generic
,
1987 spr_register(env
, SPR_MPC_MD_CTR
, "MD_CTR",
1988 SPR_NOACCESS
, SPR_NOACCESS
,
1989 &spr_read_generic
, &spr_write_generic
,
1992 spr_register(env
, SPR_MPC_MD_CASID
, "MD_CASID",
1993 SPR_NOACCESS
, SPR_NOACCESS
,
1994 &spr_read_generic
, &spr_write_generic
,
1997 spr_register(env
, SPR_MPC_MD_AP
, "MD_AP",
1998 SPR_NOACCESS
, SPR_NOACCESS
,
1999 &spr_read_generic
, &spr_write_generic
,
2002 spr_register(env
, SPR_MPC_MD_EPN
, "MD_EPN",
2003 SPR_NOACCESS
, SPR_NOACCESS
,
2004 &spr_read_generic
, &spr_write_generic
,
2007 spr_register(env
, SPR_MPC_MD_TWB
, "MD_TWB",
2008 SPR_NOACCESS
, SPR_NOACCESS
,
2009 &spr_read_generic
, &spr_write_generic
,
2012 spr_register(env
, SPR_MPC_MD_TWC
, "MD_TWC",
2013 SPR_NOACCESS
, SPR_NOACCESS
,
2014 &spr_read_generic
, &spr_write_generic
,
2017 spr_register(env
, SPR_MPC_MD_RPN
, "MD_RPN",
2018 SPR_NOACCESS
, SPR_NOACCESS
,
2019 &spr_read_generic
, &spr_write_generic
,
2022 spr_register(env
, SPR_MPC_MD_TW
, "MD_TW",
2023 SPR_NOACCESS
, SPR_NOACCESS
,
2024 &spr_read_generic
, &spr_write_generic
,
2027 spr_register(env
, SPR_MPC_MD_DBCAM
, "MD_DBCAM",
2028 SPR_NOACCESS
, SPR_NOACCESS
,
2029 &spr_read_generic
, &spr_write_generic
,
2032 spr_register(env
, SPR_MPC_MD_DBRAM0
, "MD_DBRAM0",
2033 SPR_NOACCESS
, SPR_NOACCESS
,
2034 &spr_read_generic
, &spr_write_generic
,
2037 spr_register(env
, SPR_MPC_MD_DBRAM1
, "MD_DBRAM1",
2038 SPR_NOACCESS
, SPR_NOACCESS
,
2039 &spr_read_generic
, &spr_write_generic
,
2044 * AMR => SPR 29 (Power 2.04)
2045 * CTRL => SPR 136 (Power 2.04)
2046 * CTRL => SPR 152 (Power 2.04)
2047 * SCOMC => SPR 276 (64 bits ?)
2048 * SCOMD => SPR 277 (64 bits ?)
2049 * TBU40 => SPR 286 (Power 2.04 hypv)
2050 * HSPRG0 => SPR 304 (Power 2.04 hypv)
2051 * HSPRG1 => SPR 305 (Power 2.04 hypv)
2052 * HDSISR => SPR 306 (Power 2.04 hypv)
2053 * HDAR => SPR 307 (Power 2.04 hypv)
2054 * PURR => SPR 309 (Power 2.04 hypv)
2055 * HDEC => SPR 310 (Power 2.04 hypv)
2056 * HIOR => SPR 311 (hypv)
2057 * RMOR => SPR 312 (970)
2058 * HRMOR => SPR 313 (Power 2.04 hypv)
2059 * HSRR0 => SPR 314 (Power 2.04 hypv)
2060 * HSRR1 => SPR 315 (Power 2.04 hypv)
2061 * LPIDR => SPR 317 (970)
2062 * EPR => SPR 702 (Power 2.04 emb)
2063 * perf => 768-783 (Power 2.04)
2064 * perf => 784-799 (Power 2.04)
2065 * PPR => SPR 896 (Power 2.04)
2066 * DABRX => 1015 (Power 2.04 hypv)
2067 * FPECR => SPR 1022 (?)
2068 * ... and more (thermal management, performance counters, ...)
2071 /*****************************************************************************/
2072 /* Exception vectors models */
2073 static void init_excp_4xx_softmmu(CPUPPCState
*env
)
2075 #if !defined(CONFIG_USER_ONLY)
2076 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000100;
2077 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2078 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2079 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2080 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2081 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2082 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2083 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2084 env
->excp_vectors
[POWERPC_EXCP_PIT
] = 0x00001000;
2085 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00001010;
2086 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00001020;
2087 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001100;
2088 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001200;
2089 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00002000;
2090 env
->ivor_mask
= 0x0000FFF0UL
;
2091 env
->ivpr_mask
= 0xFFFF0000UL
;
2092 /* Hardware reset vector */
2093 env
->hreset_vector
= 0xFFFFFFFCUL
;
2097 static void init_excp_MPC5xx(CPUPPCState
*env
)
2099 #if !defined(CONFIG_USER_ONLY)
2100 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2101 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2102 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2103 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2104 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2105 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2106 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2107 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2108 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2109 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
2110 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
2111 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
2112 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
2113 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
2114 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
2115 env
->ivor_mask
= 0x0000FFF0UL
;
2116 env
->ivpr_mask
= 0xFFFF0000UL
;
2117 /* Hardware reset vector */
2118 env
->hreset_vector
= 0x00000100UL
;
2122 static void init_excp_MPC8xx(CPUPPCState
*env
)
2124 #if !defined(CONFIG_USER_ONLY)
2125 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2126 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2127 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2128 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2129 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2130 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2131 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2132 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2133 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2134 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2135 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2136 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
2137 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
2138 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001100;
2139 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001200;
2140 env
->excp_vectors
[POWERPC_EXCP_ITLBE
] = 0x00001300;
2141 env
->excp_vectors
[POWERPC_EXCP_DTLBE
] = 0x00001400;
2142 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
2143 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
2144 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
2145 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
2146 env
->ivor_mask
= 0x0000FFF0UL
;
2147 env
->ivpr_mask
= 0xFFFF0000UL
;
2148 /* Hardware reset vector */
2149 env
->hreset_vector
= 0x00000100UL
;
2153 static void init_excp_G2(CPUPPCState
*env
)
2155 #if !defined(CONFIG_USER_ONLY)
2156 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2157 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2158 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2159 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2160 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2161 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2162 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2163 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2164 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2165 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000A00;
2166 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2167 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2168 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2169 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2170 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2171 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2172 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2173 /* Hardware reset vector */
2174 env
->hreset_vector
= 0x00000100UL
;
2178 static void init_excp_e200(CPUPPCState
*env
, target_ulong ivpr_mask
)
2180 #if !defined(CONFIG_USER_ONLY)
2181 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000FFC;
2182 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
2183 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
2184 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
2185 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
2186 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
2187 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
2188 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
2189 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
2190 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
2191 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
2192 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
2193 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
2194 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
2195 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
2196 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
2197 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
2199 * These two are the same IVOR as POWERPC_EXCP_VPU and
2200 * POWERPC_EXCP_VPUA. We deal with that when dispatching at
2203 env
->excp_vectors
[POWERPC_EXCP_SPEU
] = 0x00000000;
2204 env
->excp_vectors
[POWERPC_EXCP_EFPDI
] = 0x00000000;
2206 env
->excp_vectors
[POWERPC_EXCP_EFPRI
] = 0x00000000;
2207 env
->ivor_mask
= 0x0000FFF7UL
;
2208 env
->ivpr_mask
= ivpr_mask
;
2209 /* Hardware reset vector */
2210 env
->hreset_vector
= 0xFFFFFFFCUL
;
2214 static void init_excp_BookE(CPUPPCState
*env
)
2216 #if !defined(CONFIG_USER_ONLY)
2217 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
2218 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
2219 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
2220 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
2221 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
2222 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
2223 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
2224 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
2225 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
2226 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
2227 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
2228 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
2229 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
2230 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
2231 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
2232 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
2233 env
->ivor_mask
= 0x0000FFF0UL
;
2234 env
->ivpr_mask
= 0xFFFF0000UL
;
2235 /* Hardware reset vector */
2236 env
->hreset_vector
= 0xFFFFFFFCUL
;
2240 static void init_excp_603(CPUPPCState
*env
)
2242 #if !defined(CONFIG_USER_ONLY)
2243 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2244 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2245 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2246 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2247 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2248 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2249 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2250 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2251 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2252 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2253 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2254 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2255 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2256 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2257 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2258 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2259 /* Hardware reset vector */
2260 env
->hreset_vector
= 0x00000100UL
;
2264 static void init_excp_604(CPUPPCState
*env
)
2266 #if !defined(CONFIG_USER_ONLY)
2267 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2268 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2269 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2270 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2271 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2272 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2273 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2274 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2275 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2276 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2277 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2278 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2279 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2280 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2281 /* Hardware reset vector */
2282 env
->hreset_vector
= 0x00000100UL
;
2286 static void init_excp_7x0(CPUPPCState
*env
)
2288 #if !defined(CONFIG_USER_ONLY)
2289 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2290 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2291 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2292 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2293 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2294 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2295 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2296 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2297 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2298 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2299 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2300 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2301 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2302 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2303 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2304 /* Hardware reset vector */
2305 env
->hreset_vector
= 0x00000100UL
;
2309 static void init_excp_750cl(CPUPPCState
*env
)
2311 #if !defined(CONFIG_USER_ONLY)
2312 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2313 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2314 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2315 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2316 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2317 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2318 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2319 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2320 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2321 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2322 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2323 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2324 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2325 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2326 /* Hardware reset vector */
2327 env
->hreset_vector
= 0x00000100UL
;
2331 static void init_excp_750cx(CPUPPCState
*env
)
2333 #if !defined(CONFIG_USER_ONLY)
2334 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2335 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2336 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2337 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2338 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2339 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2340 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2341 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2342 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2343 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2344 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2345 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2346 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2347 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2348 /* Hardware reset vector */
2349 env
->hreset_vector
= 0x00000100UL
;
2353 /* XXX: Check if this is correct */
2354 static void init_excp_7x5(CPUPPCState
*env
)
2356 #if !defined(CONFIG_USER_ONLY)
2357 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2358 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2359 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2360 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2361 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2362 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2363 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2364 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2365 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2366 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2367 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2368 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2369 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2370 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2371 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2372 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2373 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2374 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2375 /* Hardware reset vector */
2376 env
->hreset_vector
= 0x00000100UL
;
2380 static void init_excp_7400(CPUPPCState
*env
)
2382 #if !defined(CONFIG_USER_ONLY)
2383 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2384 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2385 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2386 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2387 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2388 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2389 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2390 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2391 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2392 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2393 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2394 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2395 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2396 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2397 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2398 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
2399 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2400 /* Hardware reset vector */
2401 env
->hreset_vector
= 0x00000100UL
;
2405 static void init_excp_7450(CPUPPCState
*env
)
2407 #if !defined(CONFIG_USER_ONLY)
2408 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2409 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2410 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2411 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2412 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2413 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2414 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2415 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2416 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2417 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2418 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2419 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2420 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2421 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2422 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2423 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
2424 /* Hardware reset vector */
2425 env
->hreset_vector
= 0x00000100UL
;
2429 #if defined(TARGET_PPC64)
2430 static void init_excp_970(CPUPPCState
*env
)
2432 #if !defined(CONFIG_USER_ONLY)
2433 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2434 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2435 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2436 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
2437 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2438 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
2439 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2440 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2441 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2442 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2443 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2444 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
2445 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2446 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2447 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2448 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2449 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2450 env
->excp_vectors
[POWERPC_EXCP_MAINT
] = 0x00001600;
2451 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001700;
2452 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001800;
2453 /* Hardware reset vector */
2454 env
->hreset_vector
= 0x0000000000000100ULL
;
2458 static void init_excp_POWER7(CPUPPCState
*env
)
2460 #if !defined(CONFIG_USER_ONLY)
2461 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2462 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2463 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2464 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
2465 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2466 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
2467 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2468 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2469 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2470 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2471 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2472 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
2473 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2474 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2475 env
->excp_vectors
[POWERPC_EXCP_HDSI
] = 0x00000E00;
2476 env
->excp_vectors
[POWERPC_EXCP_HISI
] = 0x00000E20;
2477 env
->excp_vectors
[POWERPC_EXCP_HV_EMU
] = 0x00000E40;
2478 env
->excp_vectors
[POWERPC_EXCP_HV_MAINT
] = 0x00000E60;
2479 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2480 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2481 env
->excp_vectors
[POWERPC_EXCP_VSXU
] = 0x00000F40;
2482 /* Hardware reset vector */
2483 env
->hreset_vector
= 0x0000000000000100ULL
;
2487 static void init_excp_POWER8(CPUPPCState
*env
)
2489 init_excp_POWER7(env
);
2491 #if !defined(CONFIG_USER_ONLY)
2492 env
->excp_vectors
[POWERPC_EXCP_SDOOR
] = 0x00000A00;
2493 env
->excp_vectors
[POWERPC_EXCP_FU
] = 0x00000F60;
2494 env
->excp_vectors
[POWERPC_EXCP_HV_FU
] = 0x00000F80;
2495 env
->excp_vectors
[POWERPC_EXCP_SDOOR_HV
] = 0x00000E80;
2499 static void init_excp_POWER9(CPUPPCState
*env
)
2501 init_excp_POWER8(env
);
2503 #if !defined(CONFIG_USER_ONLY)
2504 env
->excp_vectors
[POWERPC_EXCP_HVIRT
] = 0x00000EA0;
2505 env
->excp_vectors
[POWERPC_EXCP_SYSCALL_VECTORED
] = 0x00017000;
2509 static void init_excp_POWER10(CPUPPCState
*env
)
2511 init_excp_POWER9(env
);
2516 /*****************************************************************************/
2517 /* Power management enable checks */
2518 static int check_pow_none(CPUPPCState
*env
)
2523 static int check_pow_nocheck(CPUPPCState
*env
)
2528 static int check_pow_hid0(CPUPPCState
*env
)
2530 if (env
->spr
[SPR_HID0
] & 0x00E00000) {
2537 static int check_pow_hid0_74xx(CPUPPCState
*env
)
2539 if (env
->spr
[SPR_HID0
] & 0x00600000) {
2546 /*****************************************************************************/
2547 /* PowerPC implementations definitions */
2549 #define POWERPC_FAMILY(_name) \
2551 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
2553 static const TypeInfo \
2554 glue(glue(ppc_, _name), _cpu_family_type_info) = { \
2555 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \
2556 .parent = TYPE_POWERPC_CPU, \
2558 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \
2561 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \
2563 type_register_static( \
2564 &glue(glue(ppc_, _name), _cpu_family_type_info)); \
2567 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \
2569 static void glue(glue(ppc_, _name), _cpu_family_class_init)
2571 static void init_proc_405(CPUPPCState
*env
)
2573 register_40x_sprs(env
);
2574 register_405_sprs(env
);
2575 register_usprgh_sprs(env
);
2577 /* Memory management */
2578 #if !defined(CONFIG_USER_ONLY)
2582 env
->tlb_type
= TLB_EMB
;
2584 init_excp_4xx_softmmu(env
);
2585 env
->dcache_line_size
= 32;
2586 env
->icache_line_size
= 32;
2587 /* Allocate hardware IRQ controller */
2588 ppc40x_irq_init(env_archcpu(env
));
2590 SET_FIT_PERIOD(8, 12, 16, 20);
2591 SET_WDT_PERIOD(16, 20, 24, 28);
2594 POWERPC_FAMILY(405)(ObjectClass
*oc
, void *data
)
2596 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2597 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2599 dc
->desc
= "PowerPC 405";
2600 pcc
->init_proc
= init_proc_405
;
2601 pcc
->check_pow
= check_pow_nocheck
;
2602 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
2603 PPC_DCR
| PPC_WRTEE
|
2604 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_40x_ICBT
|
2605 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2606 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
2607 PPC_40x_TLB
| PPC_MEM_TLBIA
| PPC_MEM_TLBSYNC
|
2608 PPC_4xx_COMMON
| PPC_405_MAC
| PPC_40x_EXCP
;
2609 pcc
->msr_mask
= (1ull << MSR_WE
) |
2619 pcc
->mmu_model
= POWERPC_MMU_SOFT_4xx
;
2620 pcc
->excp_model
= POWERPC_EXCP_40x
;
2621 pcc
->bus_model
= PPC_FLAGS_INPUT_405
;
2622 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2623 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2624 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2627 static void init_proc_440EP(CPUPPCState
*env
)
2629 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2630 register_440_sprs(env
);
2631 register_usprgh_sprs(env
);
2633 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
2634 SPR_NOACCESS
, SPR_NOACCESS
,
2635 &spr_read_generic
, &spr_write_generic
,
2637 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
2638 SPR_NOACCESS
, SPR_NOACCESS
,
2639 &spr_read_generic
, &spr_write_generic
,
2641 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
2642 SPR_NOACCESS
, SPR_NOACCESS
,
2643 &spr_read_generic
, &spr_write_generic
,
2646 spr_register(env
, SPR_440_CCR1
, "CCR1",
2647 SPR_NOACCESS
, SPR_NOACCESS
,
2648 &spr_read_generic
, &spr_write_generic
,
2650 /* Memory management */
2651 #if !defined(CONFIG_USER_ONLY)
2655 env
->tlb_type
= TLB_EMB
;
2657 init_excp_BookE(env
);
2658 env
->dcache_line_size
= 32;
2659 env
->icache_line_size
= 32;
2660 ppc40x_irq_init(env_archcpu(env
));
2662 SET_FIT_PERIOD(12, 16, 20, 24);
2663 SET_WDT_PERIOD(20, 24, 28, 32);
2666 POWERPC_FAMILY(440EP
)(ObjectClass
*oc
, void *data
)
2668 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2669 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2671 dc
->desc
= "PowerPC 440 EP";
2672 pcc
->init_proc
= init_proc_440EP
;
2673 pcc
->check_pow
= check_pow_nocheck
;
2674 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2675 PPC_FLOAT
| PPC_FLOAT_FRES
| PPC_FLOAT_FSEL
|
2676 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
2678 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2679 PPC_CACHE
| PPC_CACHE_ICBI
|
2680 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2681 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2682 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2684 pcc
->msr_mask
= (1ull << MSR_POW
) |
2696 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2697 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2698 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2699 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2700 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2701 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2704 POWERPC_FAMILY(460EX
)(ObjectClass
*oc
, void *data
)
2706 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2707 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2709 dc
->desc
= "PowerPC 460 EX";
2710 pcc
->init_proc
= init_proc_440EP
;
2711 pcc
->check_pow
= check_pow_nocheck
;
2712 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2713 PPC_FLOAT
| PPC_FLOAT_FRES
| PPC_FLOAT_FSEL
|
2714 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
2716 PPC_DCR
| PPC_DCRX
| PPC_WRTEE
| PPC_RFMCI
|
2717 PPC_CACHE
| PPC_CACHE_ICBI
|
2718 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2719 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2720 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2722 pcc
->msr_mask
= (1ull << MSR_POW
) |
2734 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2735 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2736 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2737 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2738 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2739 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2742 static void init_proc_440GP(CPUPPCState
*env
)
2744 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2745 register_440_sprs(env
);
2746 register_usprgh_sprs(env
);
2748 /* Memory management */
2749 #if !defined(CONFIG_USER_ONLY)
2753 env
->tlb_type
= TLB_EMB
;
2755 init_excp_BookE(env
);
2756 env
->dcache_line_size
= 32;
2757 env
->icache_line_size
= 32;
2758 /* XXX: TODO: allocate internal IRQ controller */
2760 SET_FIT_PERIOD(12, 16, 20, 24);
2761 SET_WDT_PERIOD(20, 24, 28, 32);
2764 POWERPC_FAMILY(440GP
)(ObjectClass
*oc
, void *data
)
2766 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2767 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2769 dc
->desc
= "PowerPC 440 GP";
2770 pcc
->init_proc
= init_proc_440GP
;
2771 pcc
->check_pow
= check_pow_nocheck
;
2772 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2773 PPC_DCR
| PPC_DCRX
| PPC_WRTEE
| PPC_MFAPIDI
|
2774 PPC_CACHE
| PPC_CACHE_ICBI
|
2775 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2776 PPC_MEM_TLBSYNC
| PPC_TLBIVA
| PPC_MFTB
|
2777 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2779 pcc
->msr_mask
= (1ull << MSR_POW
) |
2791 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2792 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2793 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2794 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2795 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2796 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2799 static void init_proc_440x5(CPUPPCState
*env
)
2801 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2802 register_440_sprs(env
);
2803 register_usprgh_sprs(env
);
2805 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
2806 SPR_NOACCESS
, SPR_NOACCESS
,
2807 &spr_read_generic
, &spr_write_generic
,
2809 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
2810 SPR_NOACCESS
, SPR_NOACCESS
,
2811 &spr_read_generic
, &spr_write_generic
,
2813 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
2814 SPR_NOACCESS
, SPR_NOACCESS
,
2815 &spr_read_generic
, &spr_write_generic
,
2818 spr_register(env
, SPR_440_CCR1
, "CCR1",
2819 SPR_NOACCESS
, SPR_NOACCESS
,
2820 &spr_read_generic
, &spr_write_generic
,
2822 /* Memory management */
2823 #if !defined(CONFIG_USER_ONLY)
2827 env
->tlb_type
= TLB_EMB
;
2829 init_excp_BookE(env
);
2830 env
->dcache_line_size
= 32;
2831 env
->icache_line_size
= 32;
2832 ppc40x_irq_init(env_archcpu(env
));
2834 SET_FIT_PERIOD(12, 16, 20, 24);
2835 SET_WDT_PERIOD(20, 24, 28, 32);
2838 POWERPC_FAMILY(440x5
)(ObjectClass
*oc
, void *data
)
2840 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2841 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2843 dc
->desc
= "PowerPC 440x5";
2844 pcc
->init_proc
= init_proc_440x5
;
2845 pcc
->check_pow
= check_pow_nocheck
;
2846 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2847 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2848 PPC_CACHE
| PPC_CACHE_ICBI
|
2849 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2850 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2851 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2853 pcc
->msr_mask
= (1ull << MSR_POW
) |
2865 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2866 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2867 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2868 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2869 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2870 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2873 POWERPC_FAMILY(440x5wDFPU
)(ObjectClass
*oc
, void *data
)
2875 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2876 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2878 dc
->desc
= "PowerPC 440x5 with double precision FPU";
2879 pcc
->init_proc
= init_proc_440x5
;
2880 pcc
->check_pow
= check_pow_nocheck
;
2881 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2882 PPC_FLOAT
| PPC_FLOAT_FSQRT
|
2884 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2885 PPC_CACHE
| PPC_CACHE_ICBI
|
2886 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2887 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2888 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2890 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
2891 pcc
->msr_mask
= (1ull << MSR_POW
) |
2903 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2904 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2905 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2906 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2907 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2908 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2911 static void init_proc_MPC5xx(CPUPPCState
*env
)
2913 register_5xx_8xx_sprs(env
);
2914 register_5xx_sprs(env
);
2915 init_excp_MPC5xx(env
);
2916 env
->dcache_line_size
= 32;
2917 env
->icache_line_size
= 32;
2918 /* XXX: TODO: allocate internal IRQ controller */
2921 POWERPC_FAMILY(MPC5xx
)(ObjectClass
*oc
, void *data
)
2923 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2924 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2926 dc
->desc
= "Freescale 5xx cores (aka RCPU)";
2927 pcc
->init_proc
= init_proc_MPC5xx
;
2928 pcc
->check_pow
= check_pow_none
;
2929 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2930 PPC_MEM_EIEIO
| PPC_MEM_SYNC
|
2931 PPC_CACHE_ICBI
| PPC_FLOAT
| PPC_FLOAT_STFIWX
|
2933 pcc
->msr_mask
= (1ull << MSR_ILE
) |
2945 pcc
->mmu_model
= POWERPC_MMU_REAL
;
2946 pcc
->excp_model
= POWERPC_EXCP_6xx
;
2947 pcc
->bus_model
= PPC_FLAGS_INPUT_RCPU
;
2948 pcc
->bfd_mach
= bfd_mach_ppc_505
;
2949 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
2950 POWERPC_FLAG_BUS_CLK
;
2953 static void init_proc_MPC8xx(CPUPPCState
*env
)
2955 register_5xx_8xx_sprs(env
);
2956 register_8xx_sprs(env
);
2957 init_excp_MPC8xx(env
);
2958 env
->dcache_line_size
= 32;
2959 env
->icache_line_size
= 32;
2960 /* XXX: TODO: allocate internal IRQ controller */
2963 POWERPC_FAMILY(MPC8xx
)(ObjectClass
*oc
, void *data
)
2965 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2966 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2968 dc
->desc
= "Freescale 8xx cores (aka PowerQUICC)";
2969 pcc
->init_proc
= init_proc_MPC8xx
;
2970 pcc
->check_pow
= check_pow_none
;
2971 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2972 PPC_MEM_EIEIO
| PPC_MEM_SYNC
|
2973 PPC_CACHE_ICBI
| PPC_MFTB
;
2974 pcc
->msr_mask
= (1ull << MSR_ILE
) |
2986 pcc
->mmu_model
= POWERPC_MMU_MPC8xx
;
2987 pcc
->excp_model
= POWERPC_EXCP_6xx
;
2988 pcc
->bus_model
= PPC_FLAGS_INPUT_RCPU
;
2989 pcc
->bfd_mach
= bfd_mach_ppc_860
;
2990 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
2991 POWERPC_FLAG_BUS_CLK
;
2994 /* Freescale 82xx cores (aka PowerQUICC-II) */
2996 static void init_proc_G2(CPUPPCState
*env
)
2998 register_ne_601_sprs(env
);
2999 register_sdr1_sprs(env
);
3000 register_G2_sprs(env
);
3002 /* Memory management */
3003 register_low_BATs(env
);
3004 register_high_BATs(env
);
3005 register_6xx_7xx_soft_tlb(env
, 64, 2);
3007 env
->dcache_line_size
= 32;
3008 env
->icache_line_size
= 32;
3009 /* Allocate hardware IRQ controller */
3010 ppc6xx_irq_init(env_archcpu(env
));
3013 POWERPC_FAMILY(G2
)(ObjectClass
*oc
, void *data
)
3015 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3016 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3018 dc
->desc
= "PowerPC G2";
3019 pcc
->init_proc
= init_proc_G2
;
3020 pcc
->check_pow
= check_pow_hid0
;
3021 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3022 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3024 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3025 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3026 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3027 PPC_SEGMENT
| PPC_EXTERN
;
3028 pcc
->msr_mask
= (1ull << MSR_POW
) |
3029 (1ull << MSR_TGPR
) |
3043 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3044 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3045 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3046 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
3047 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3048 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3051 POWERPC_FAMILY(G2LE
)(ObjectClass
*oc
, void *data
)
3053 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3054 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3056 dc
->desc
= "PowerPC G2LE";
3057 pcc
->init_proc
= init_proc_G2
;
3058 pcc
->check_pow
= check_pow_hid0
;
3059 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3060 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3062 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3063 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3064 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3065 PPC_SEGMENT
| PPC_EXTERN
;
3066 pcc
->msr_mask
= (1ull << MSR_POW
) |
3067 (1ull << MSR_TGPR
) |
3083 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3084 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3085 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3086 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
3087 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3088 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3091 static void init_proc_e200(CPUPPCState
*env
)
3093 register_BookE_sprs(env
, 0x000000070000FFFFULL
);
3095 spr_register(env
, SPR_BOOKE_SPEFSCR
, "SPEFSCR",
3096 &spr_read_spefscr
, &spr_write_spefscr
,
3097 &spr_read_spefscr
, &spr_write_spefscr
,
3099 /* Memory management */
3100 register_BookE206_sprs(env
, 0x0000005D, NULL
, 0);
3101 register_usprgh_sprs(env
);
3103 spr_register(env
, SPR_HID0
, "HID0",
3104 SPR_NOACCESS
, SPR_NOACCESS
,
3105 &spr_read_generic
, &spr_write_generic
,
3108 spr_register(env
, SPR_HID1
, "HID1",
3109 SPR_NOACCESS
, SPR_NOACCESS
,
3110 &spr_read_generic
, &spr_write_generic
,
3113 spr_register(env
, SPR_Exxx_ALTCTXCR
, "ALTCTXCR",
3114 SPR_NOACCESS
, SPR_NOACCESS
,
3115 &spr_read_generic
, &spr_write_generic
,
3118 spr_register(env
, SPR_Exxx_BUCSR
, "BUCSR",
3119 SPR_NOACCESS
, SPR_NOACCESS
,
3120 &spr_read_generic
, &spr_write_generic
,
3123 spr_register(env
, SPR_Exxx_CTXCR
, "CTXCR",
3124 SPR_NOACCESS
, SPR_NOACCESS
,
3125 &spr_read_generic
, &spr_write_generic
,
3128 spr_register(env
, SPR_Exxx_DBCNT
, "DBCNT",
3129 SPR_NOACCESS
, SPR_NOACCESS
,
3130 &spr_read_generic
, &spr_write_generic
,
3133 spr_register(env
, SPR_Exxx_DBCR3
, "DBCR3",
3134 SPR_NOACCESS
, SPR_NOACCESS
,
3135 &spr_read_generic
, &spr_write_generic
,
3138 spr_register(env
, SPR_Exxx_L1CFG0
, "L1CFG0",
3139 &spr_read_generic
, SPR_NOACCESS
,
3140 &spr_read_generic
, SPR_NOACCESS
,
3143 spr_register(env
, SPR_Exxx_L1CSR0
, "L1CSR0",
3144 SPR_NOACCESS
, SPR_NOACCESS
,
3145 &spr_read_generic
, &spr_write_generic
,
3148 spr_register(env
, SPR_Exxx_L1FINV0
, "L1FINV0",
3149 SPR_NOACCESS
, SPR_NOACCESS
,
3150 &spr_read_generic
, &spr_write_generic
,
3153 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
3154 SPR_NOACCESS
, SPR_NOACCESS
,
3155 &spr_read_generic
, &spr_write_generic
,
3158 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
3159 SPR_NOACCESS
, SPR_NOACCESS
,
3160 &spr_read_generic
, &spr_write_generic
,
3163 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
3164 SPR_NOACCESS
, SPR_NOACCESS
,
3165 &spr_read_generic
, &spr_write_generic
,
3168 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
3169 SPR_NOACCESS
, SPR_NOACCESS
,
3170 &spr_read_generic
, &spr_write_generic
,
3173 spr_register(env
, SPR_MMUCSR0
, "MMUCSR0",
3174 SPR_NOACCESS
, SPR_NOACCESS
,
3175 &spr_read_generic
, &spr_write_generic
,
3176 0x00000000); /* TOFIX */
3177 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
3178 SPR_NOACCESS
, SPR_NOACCESS
,
3179 &spr_read_generic
, &spr_write_generic
,
3181 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
3182 SPR_NOACCESS
, SPR_NOACCESS
,
3183 &spr_read_generic
, &spr_write_generic
,
3185 #if !defined(CONFIG_USER_ONLY)
3189 env
->tlb_type
= TLB_EMB
;
3191 init_excp_e200(env
, 0xFFFF0000UL
);
3192 env
->dcache_line_size
= 32;
3193 env
->icache_line_size
= 32;
3194 /* XXX: TODO: allocate internal IRQ controller */
3197 POWERPC_FAMILY(e200
)(ObjectClass
*oc
, void *data
)
3199 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3200 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3202 dc
->desc
= "e200 core";
3203 pcc
->init_proc
= init_proc_e200
;
3204 pcc
->check_pow
= check_pow_hid0
;
3206 * XXX: unimplemented instructions:
3213 * all SPE multiply-accumulate instructions
3215 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3216 PPC_SPE
| PPC_SPE_SINGLE
|
3217 PPC_WRTEE
| PPC_RFDI
|
3218 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3219 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3220 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
|
3222 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3236 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3237 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3238 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3239 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3240 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3241 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3242 POWERPC_FLAG_BUS_CLK
;
3245 static void init_proc_e300(CPUPPCState
*env
)
3247 register_ne_601_sprs(env
);
3248 register_sdr1_sprs(env
);
3249 register_603_sprs(env
);
3250 register_e300_sprs(env
);
3252 /* Memory management */
3253 register_low_BATs(env
);
3254 register_high_BATs(env
);
3255 register_6xx_7xx_soft_tlb(env
, 64, 2);
3257 env
->dcache_line_size
= 32;
3258 env
->icache_line_size
= 32;
3259 /* Allocate hardware IRQ controller */
3260 ppc6xx_irq_init(env_archcpu(env
));
3263 POWERPC_FAMILY(e300
)(ObjectClass
*oc
, void *data
)
3265 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3266 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3268 dc
->desc
= "e300 core";
3269 pcc
->init_proc
= init_proc_e300
;
3270 pcc
->check_pow
= check_pow_hid0
;
3271 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3272 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3274 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3275 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3276 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3277 PPC_SEGMENT
| PPC_EXTERN
;
3278 pcc
->msr_mask
= (1ull << MSR_POW
) |
3279 (1ull << MSR_TGPR
) |
3295 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3296 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3297 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3298 pcc
->bfd_mach
= bfd_mach_ppc_603
;
3299 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3300 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3303 enum fsl_e500_version
{
3311 static void init_proc_e500(CPUPPCState
*env
, int version
)
3313 uint32_t tlbncfg
[2];
3315 uint64_t ivpr_mask
= 0xFFFF0000ULL
;
3316 uint32_t l1cfg0
= 0x3800 /* 8 ways */
3317 | 0x0020; /* 32 kb */
3318 uint32_t l1cfg1
= 0x3800 /* 8 ways */
3319 | 0x0020; /* 32 kb */
3320 uint32_t mmucfg
= 0;
3321 #if !defined(CONFIG_USER_ONLY)
3326 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
3327 * complain when accessing them.
3328 * register_BookE_sprs(env, 0x0000000F0000FD7FULL);
3334 ivor_mask
= 0x0000000F0000FFFFULL
;
3338 ivor_mask
= 0x000003FE0000FFFFULL
;
3341 ivor_mask
= 0x000003FF0000FFFFULL
;
3344 register_BookE_sprs(env
, ivor_mask
);
3345 register_usprg3_sprs(env
);
3346 /* Processor identification */
3347 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
3348 SPR_NOACCESS
, SPR_NOACCESS
,
3349 &spr_read_generic
, &spr_write_pir
,
3352 spr_register(env
, SPR_BOOKE_SPEFSCR
, "SPEFSCR",
3353 &spr_read_spefscr
, &spr_write_spefscr
,
3354 &spr_read_spefscr
, &spr_write_spefscr
,
3356 #if !defined(CONFIG_USER_ONLY)
3357 /* Memory management */
3363 tlbncfg
[0] = register_tlbncfg(2, 1, 1, 0, 256);
3364 tlbncfg
[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 16);
3367 tlbncfg
[0] = register_tlbncfg(4, 1, 1, 0, 512);
3368 tlbncfg
[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 16);
3372 tlbncfg
[0] = register_tlbncfg(4, 1, 1, 0, 512);
3373 tlbncfg
[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 64);
3378 tlbncfg
[0] = 0x08052400;
3379 tlbncfg
[1] = 0x40028040;
3382 cpu_abort(env_cpu(env
), "Unknown CPU: " TARGET_FMT_lx
"\n",
3390 env
->dcache_line_size
= 32;
3391 env
->icache_line_size
= 32;
3395 env
->dcache_line_size
= 64;
3396 env
->icache_line_size
= 64;
3397 l1cfg0
|= 0x1000000; /* 64 byte cache block size */
3398 l1cfg1
|= 0x1000000; /* 64 byte cache block size */
3401 env
->dcache_line_size
= 32;
3402 env
->icache_line_size
= 32;
3403 l1cfg0
|= 0x0F83820;
3404 l1cfg1
|= 0x0B83820;
3407 cpu_abort(env_cpu(env
), "Unknown CPU: " TARGET_FMT_lx
"\n",
3410 register_BookE206_sprs(env
, 0x000000DF, tlbncfg
, mmucfg
);
3411 register_usprgh_sprs(env
);
3413 spr_register(env
, SPR_HID0
, "HID0",
3414 SPR_NOACCESS
, SPR_NOACCESS
,
3415 &spr_read_generic
, &spr_write_generic
,
3418 spr_register(env
, SPR_HID1
, "HID1",
3419 SPR_NOACCESS
, SPR_NOACCESS
,
3420 &spr_read_generic
, &spr_write_generic
,
3423 spr_register(env
, SPR_Exxx_BBEAR
, "BBEAR",
3424 SPR_NOACCESS
, SPR_NOACCESS
,
3425 &spr_read_generic
, &spr_write_generic
,
3428 spr_register(env
, SPR_Exxx_BBTAR
, "BBTAR",
3429 SPR_NOACCESS
, SPR_NOACCESS
,
3430 &spr_read_generic
, &spr_write_generic
,
3433 spr_register(env
, SPR_Exxx_MCAR
, "MCAR",
3434 SPR_NOACCESS
, SPR_NOACCESS
,
3435 &spr_read_generic
, &spr_write_generic
,
3438 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
3439 SPR_NOACCESS
, SPR_NOACCESS
,
3440 &spr_read_generic
, &spr_write_generic
,
3443 spr_register(env
, SPR_Exxx_NPIDR
, "NPIDR",
3444 SPR_NOACCESS
, SPR_NOACCESS
,
3445 &spr_read_generic
, &spr_write_generic
,
3448 spr_register(env
, SPR_Exxx_BUCSR
, "BUCSR",
3449 SPR_NOACCESS
, SPR_NOACCESS
,
3450 &spr_read_generic
, &spr_write_generic
,
3453 spr_register(env
, SPR_Exxx_L1CFG0
, "L1CFG0",
3454 &spr_read_generic
, SPR_NOACCESS
,
3455 &spr_read_generic
, SPR_NOACCESS
,
3457 spr_register(env
, SPR_Exxx_L1CFG1
, "L1CFG1",
3458 &spr_read_generic
, SPR_NOACCESS
,
3459 &spr_read_generic
, SPR_NOACCESS
,
3461 spr_register(env
, SPR_Exxx_L1CSR0
, "L1CSR0",
3462 SPR_NOACCESS
, SPR_NOACCESS
,
3463 &spr_read_generic
, &spr_write_e500_l1csr0
,
3465 spr_register(env
, SPR_Exxx_L1CSR1
, "L1CSR1",
3466 SPR_NOACCESS
, SPR_NOACCESS
,
3467 &spr_read_generic
, &spr_write_e500_l1csr1
,
3469 if (version
!= fsl_e500v1
&& version
!= fsl_e500v2
) {
3470 spr_register(env
, SPR_Exxx_L2CSR0
, "L2CSR0",
3471 SPR_NOACCESS
, SPR_NOACCESS
,
3472 &spr_read_generic
, &spr_write_e500_l2csr0
,
3475 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
3476 SPR_NOACCESS
, SPR_NOACCESS
,
3477 &spr_read_generic
, &spr_write_generic
,
3479 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
3480 SPR_NOACCESS
, SPR_NOACCESS
,
3481 &spr_read_generic
, &spr_write_generic
,
3483 spr_register(env
, SPR_MMUCSR0
, "MMUCSR0",
3484 SPR_NOACCESS
, SPR_NOACCESS
,
3485 &spr_read_generic
, &spr_write_booke206_mmucsr0
,
3487 spr_register(env
, SPR_BOOKE_EPR
, "EPR",
3488 SPR_NOACCESS
, SPR_NOACCESS
,
3489 &spr_read_generic
, SPR_NOACCESS
,
3491 /* XXX better abstract into Emb.xxx features */
3492 if ((version
== fsl_e5500
) || (version
== fsl_e6500
)) {
3493 spr_register(env
, SPR_BOOKE_EPCR
, "EPCR",
3494 SPR_NOACCESS
, SPR_NOACCESS
,
3495 &spr_read_generic
, &spr_write_generic
,
3497 spr_register(env
, SPR_BOOKE_MAS7_MAS3
, "MAS7_MAS3",
3498 SPR_NOACCESS
, SPR_NOACCESS
,
3499 &spr_read_mas73
, &spr_write_mas73
,
3501 ivpr_mask
= (target_ulong
)~0xFFFFULL
;
3504 if (version
== fsl_e6500
) {
3505 /* Thread identification */
3506 spr_register(env
, SPR_TIR
, "TIR",
3507 SPR_NOACCESS
, SPR_NOACCESS
,
3508 &spr_read_generic
, SPR_NOACCESS
,
3510 spr_register(env
, SPR_BOOKE_TLB0PS
, "TLB0PS",
3511 SPR_NOACCESS
, SPR_NOACCESS
,
3512 &spr_read_generic
, SPR_NOACCESS
,
3514 spr_register(env
, SPR_BOOKE_TLB1PS
, "TLB1PS",
3515 SPR_NOACCESS
, SPR_NOACCESS
,
3516 &spr_read_generic
, SPR_NOACCESS
,
3520 #if !defined(CONFIG_USER_ONLY)
3522 env
->tlb_type
= TLB_MAS
;
3523 for (i
= 0; i
< BOOKE206_MAX_TLBN
; i
++) {
3524 env
->nb_tlb
+= booke206_tlb_size(env
, i
);
3528 init_excp_e200(env
, ivpr_mask
);
3529 /* Allocate hardware IRQ controller */
3530 ppce500_irq_init(env_archcpu(env
));
3533 static void init_proc_e500v1(CPUPPCState
*env
)
3535 init_proc_e500(env
, fsl_e500v1
);
3538 POWERPC_FAMILY(e500v1
)(ObjectClass
*oc
, void *data
)
3540 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3541 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3543 dc
->desc
= "e500v1 core";
3544 pcc
->init_proc
= init_proc_e500v1
;
3545 pcc
->check_pow
= check_pow_hid0
;
3546 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3547 PPC_SPE
| PPC_SPE_SINGLE
|
3548 PPC_WRTEE
| PPC_RFDI
|
3549 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3550 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3551 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3552 pcc
->insns_flags2
= PPC2_BOOKE206
;
3553 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3567 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3568 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3569 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3570 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3571 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3572 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3573 POWERPC_FLAG_BUS_CLK
;
3576 static void init_proc_e500v2(CPUPPCState
*env
)
3578 init_proc_e500(env
, fsl_e500v2
);
3581 POWERPC_FAMILY(e500v2
)(ObjectClass
*oc
, void *data
)
3583 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3584 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3586 dc
->desc
= "e500v2 core";
3587 pcc
->init_proc
= init_proc_e500v2
;
3588 pcc
->check_pow
= check_pow_hid0
;
3589 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3590 PPC_SPE
| PPC_SPE_SINGLE
| PPC_SPE_DOUBLE
|
3591 PPC_WRTEE
| PPC_RFDI
|
3592 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3593 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3594 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3595 pcc
->insns_flags2
= PPC2_BOOKE206
;
3596 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3610 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3611 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3612 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3613 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3614 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3615 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3616 POWERPC_FLAG_BUS_CLK
;
3619 static void init_proc_e500mc(CPUPPCState
*env
)
3621 init_proc_e500(env
, fsl_e500mc
);
3624 POWERPC_FAMILY(e500mc
)(ObjectClass
*oc
, void *data
)
3626 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3627 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3629 dc
->desc
= "e500mc core";
3630 pcc
->init_proc
= init_proc_e500mc
;
3631 pcc
->check_pow
= check_pow_none
;
3632 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3633 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3634 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3635 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3636 PPC_FLOAT
| PPC_FLOAT_FRES
|
3637 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3638 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3639 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3640 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
;
3641 pcc
->msr_mask
= (1ull << MSR_GS
) |
3642 (1ull << MSR_UCLE
) |
3655 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3656 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3657 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3658 /* FIXME: figure out the correct flag for e500mc */
3659 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3660 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3661 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3665 static void init_proc_e5500(CPUPPCState
*env
)
3667 init_proc_e500(env
, fsl_e5500
);
3670 POWERPC_FAMILY(e5500
)(ObjectClass
*oc
, void *data
)
3672 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3673 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3675 dc
->desc
= "e5500 core";
3676 pcc
->init_proc
= init_proc_e5500
;
3677 pcc
->check_pow
= check_pow_none
;
3678 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3679 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3680 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3681 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3682 PPC_FLOAT
| PPC_FLOAT_FRES
|
3683 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3684 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3685 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
|
3686 PPC_64B
| PPC_POPCNTB
| PPC_POPCNTWD
;
3687 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
| PPC2_PERM_ISA206
|
3689 pcc
->msr_mask
= (1ull << MSR_CM
) |
3691 (1ull << MSR_UCLE
) |
3704 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3705 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3706 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3707 /* FIXME: figure out the correct flag for e5500 */
3708 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3709 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3710 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3713 static void init_proc_e6500(CPUPPCState
*env
)
3715 init_proc_e500(env
, fsl_e6500
);
3718 POWERPC_FAMILY(e6500
)(ObjectClass
*oc
, void *data
)
3720 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3721 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3723 dc
->desc
= "e6500 core";
3724 pcc
->init_proc
= init_proc_e6500
;
3725 pcc
->check_pow
= check_pow_none
;
3726 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3727 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3728 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3729 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3730 PPC_FLOAT
| PPC_FLOAT_FRES
|
3731 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3732 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3733 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
|
3734 PPC_64B
| PPC_POPCNTB
| PPC_POPCNTWD
| PPC_ALTIVEC
;
3735 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
| PPC2_PERM_ISA206
|
3736 PPC2_FP_CVT_S64
| PPC2_ATOMIC_ISA206
;
3737 pcc
->msr_mask
= (1ull << MSR_CM
) |
3739 (1ull << MSR_UCLE
) |
3753 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3754 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3755 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3756 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3757 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3758 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_VRE
;
3763 /* Non-embedded PowerPC */
3764 static void init_proc_603(CPUPPCState
*env
)
3766 register_ne_601_sprs(env
);
3767 register_sdr1_sprs(env
);
3768 register_603_sprs(env
);
3770 /* Memory management */
3771 register_low_BATs(env
);
3772 register_6xx_7xx_soft_tlb(env
, 64, 2);
3774 env
->dcache_line_size
= 32;
3775 env
->icache_line_size
= 32;
3776 /* Allocate hardware IRQ controller */
3777 ppc6xx_irq_init(env_archcpu(env
));
3780 POWERPC_FAMILY(603)(ObjectClass
*oc
, void *data
)
3782 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3783 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3785 dc
->desc
= "PowerPC 603";
3786 pcc
->init_proc
= init_proc_603
;
3787 pcc
->check_pow
= check_pow_hid0
;
3788 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3789 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3790 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3791 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3792 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3793 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3794 PPC_SEGMENT
| PPC_EXTERN
;
3795 pcc
->msr_mask
= (1ull << MSR_POW
) |
3796 (1ull << MSR_TGPR
) |
3811 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3812 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3813 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3814 pcc
->bfd_mach
= bfd_mach_ppc_603
;
3815 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3816 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3819 POWERPC_FAMILY(603E
)(ObjectClass
*oc
, void *data
)
3821 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3822 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3824 dc
->desc
= "PowerPC 603e";
3825 pcc
->init_proc
= init_proc_603
;
3826 pcc
->check_pow
= check_pow_hid0
;
3827 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3828 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3829 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3830 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3831 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3832 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3833 PPC_SEGMENT
| PPC_EXTERN
;
3834 pcc
->msr_mask
= (1ull << MSR_POW
) |
3835 (1ull << MSR_TGPR
) |
3850 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3851 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3852 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3853 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
3854 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3855 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3858 static void init_proc_604(CPUPPCState
*env
)
3860 register_ne_601_sprs(env
);
3861 register_sdr1_sprs(env
);
3862 register_604_sprs(env
);
3864 /* Memory management */
3865 register_low_BATs(env
);
3867 env
->dcache_line_size
= 32;
3868 env
->icache_line_size
= 32;
3869 /* Allocate hardware IRQ controller */
3870 ppc6xx_irq_init(env_archcpu(env
));
3873 POWERPC_FAMILY(604)(ObjectClass
*oc
, void *data
)
3875 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3876 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3878 dc
->desc
= "PowerPC 604";
3879 pcc
->init_proc
= init_proc_604
;
3880 pcc
->check_pow
= check_pow_nocheck
;
3881 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3882 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3883 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3884 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3885 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3886 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3887 PPC_SEGMENT
| PPC_EXTERN
;
3888 pcc
->msr_mask
= (1ull << MSR_POW
) |
3904 pcc
->mmu_model
= POWERPC_MMU_32B
;
3905 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3906 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3907 pcc
->bfd_mach
= bfd_mach_ppc_604
;
3908 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3909 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3912 static void init_proc_604E(CPUPPCState
*env
)
3914 register_ne_601_sprs(env
);
3915 register_sdr1_sprs(env
);
3916 register_604_sprs(env
);
3918 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
3919 SPR_NOACCESS
, SPR_NOACCESS
,
3920 &spr_read_generic
, &spr_write_generic
,
3923 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
3924 SPR_NOACCESS
, SPR_NOACCESS
,
3925 &spr_read_generic
, &spr_write_generic
,
3928 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
3929 SPR_NOACCESS
, SPR_NOACCESS
,
3930 &spr_read_generic
, &spr_write_generic
,
3932 /* Hardware implementation registers */
3933 spr_register(env
, SPR_HID1
, "HID1",
3934 SPR_NOACCESS
, SPR_NOACCESS
,
3935 &spr_read_generic
, &spr_write_generic
,
3937 /* Memory management */
3938 register_low_BATs(env
);
3940 env
->dcache_line_size
= 32;
3941 env
->icache_line_size
= 32;
3942 /* Allocate hardware IRQ controller */
3943 ppc6xx_irq_init(env_archcpu(env
));
3946 POWERPC_FAMILY(604E
)(ObjectClass
*oc
, void *data
)
3948 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3949 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3951 dc
->desc
= "PowerPC 604E";
3952 pcc
->init_proc
= init_proc_604E
;
3953 pcc
->check_pow
= check_pow_nocheck
;
3954 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3955 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3956 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
3957 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3958 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3959 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
3960 PPC_SEGMENT
| PPC_EXTERN
;
3961 pcc
->msr_mask
= (1ull << MSR_POW
) |
3977 pcc
->mmu_model
= POWERPC_MMU_32B
;
3978 pcc
->excp_model
= POWERPC_EXCP_6xx
;
3979 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3980 pcc
->bfd_mach
= bfd_mach_ppc_604
;
3981 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3982 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3985 static void init_proc_740(CPUPPCState
*env
)
3987 register_ne_601_sprs(env
);
3988 register_sdr1_sprs(env
);
3989 register_7xx_sprs(env
);
3990 /* Thermal management */
3991 register_thrm_sprs(env
);
3993 /* Memory management */
3994 register_low_BATs(env
);
3996 env
->dcache_line_size
= 32;
3997 env
->icache_line_size
= 32;
3998 /* Allocate hardware IRQ controller */
3999 ppc6xx_irq_init(env_archcpu(env
));
4002 POWERPC_FAMILY(740)(ObjectClass
*oc
, void *data
)
4004 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4005 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4007 dc
->desc
= "PowerPC 740";
4008 pcc
->init_proc
= init_proc_740
;
4009 pcc
->check_pow
= check_pow_hid0
;
4010 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4011 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4012 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4013 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4014 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4015 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4016 PPC_SEGMENT
| PPC_EXTERN
;
4017 pcc
->msr_mask
= (1ull << MSR_POW
) |
4033 pcc
->mmu_model
= POWERPC_MMU_32B
;
4034 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4035 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4036 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4037 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4038 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4041 static void init_proc_750(CPUPPCState
*env
)
4043 register_ne_601_sprs(env
);
4044 register_sdr1_sprs(env
);
4045 register_7xx_sprs(env
);
4047 spr_register(env
, SPR_L2CR
, "L2CR",
4048 SPR_NOACCESS
, SPR_NOACCESS
,
4049 &spr_read_generic
, spr_access_nop
,
4051 /* Thermal management */
4052 register_thrm_sprs(env
);
4054 /* Memory management */
4055 register_low_BATs(env
);
4057 * XXX: high BATs are also present but are known to be bugged on
4061 env
->dcache_line_size
= 32;
4062 env
->icache_line_size
= 32;
4063 /* Allocate hardware IRQ controller */
4064 ppc6xx_irq_init(env_archcpu(env
));
4067 POWERPC_FAMILY(750)(ObjectClass
*oc
, void *data
)
4069 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4070 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4072 dc
->desc
= "PowerPC 750";
4073 pcc
->init_proc
= init_proc_750
;
4074 pcc
->check_pow
= check_pow_hid0
;
4075 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4076 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4077 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4078 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4079 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4080 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4081 PPC_SEGMENT
| PPC_EXTERN
;
4082 pcc
->msr_mask
= (1ull << MSR_POW
) |
4098 pcc
->mmu_model
= POWERPC_MMU_32B
;
4099 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4100 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4101 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4102 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4103 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4106 static void init_proc_750cl(CPUPPCState
*env
)
4108 register_ne_601_sprs(env
);
4109 register_sdr1_sprs(env
);
4110 register_7xx_sprs(env
);
4112 spr_register(env
, SPR_L2CR
, "L2CR",
4113 SPR_NOACCESS
, SPR_NOACCESS
,
4114 &spr_read_generic
, spr_access_nop
,
4116 /* Thermal management */
4117 /* Those registers are fake on 750CL */
4118 spr_register(env
, SPR_THRM1
, "THRM1",
4119 SPR_NOACCESS
, SPR_NOACCESS
,
4120 &spr_read_generic
, &spr_write_generic
,
4122 spr_register(env
, SPR_THRM2
, "THRM2",
4123 SPR_NOACCESS
, SPR_NOACCESS
,
4124 &spr_read_generic
, &spr_write_generic
,
4126 spr_register(env
, SPR_THRM3
, "THRM3",
4127 SPR_NOACCESS
, SPR_NOACCESS
,
4128 &spr_read_generic
, &spr_write_generic
,
4131 spr_register(env
, SPR_750_TDCL
, "TDCL",
4132 SPR_NOACCESS
, SPR_NOACCESS
,
4133 &spr_read_generic
, &spr_write_generic
,
4135 spr_register(env
, SPR_750_TDCH
, "TDCH",
4136 SPR_NOACCESS
, SPR_NOACCESS
,
4137 &spr_read_generic
, &spr_write_generic
,
4140 spr_register(env
, SPR_750_WPAR
, "WPAR",
4141 SPR_NOACCESS
, SPR_NOACCESS
,
4142 &spr_read_generic
, &spr_write_generic
,
4144 spr_register(env
, SPR_750_DMAL
, "DMAL",
4145 SPR_NOACCESS
, SPR_NOACCESS
,
4146 &spr_read_generic
, &spr_write_generic
,
4148 spr_register(env
, SPR_750_DMAU
, "DMAU",
4149 SPR_NOACCESS
, SPR_NOACCESS
,
4150 &spr_read_generic
, &spr_write_generic
,
4152 /* Hardware implementation registers */
4153 spr_register(env
, SPR_750CL_HID2
, "HID2",
4154 SPR_NOACCESS
, SPR_NOACCESS
,
4155 &spr_read_generic
, &spr_write_generic
,
4158 spr_register(env
, SPR_750CL_HID4
, "HID4",
4159 SPR_NOACCESS
, SPR_NOACCESS
,
4160 &spr_read_generic
, &spr_write_generic
,
4162 /* Quantization registers */
4163 spr_register(env
, SPR_750_GQR0
, "GQR0",
4164 SPR_NOACCESS
, SPR_NOACCESS
,
4165 &spr_read_generic
, &spr_write_generic
,
4168 spr_register(env
, SPR_750_GQR1
, "GQR1",
4169 SPR_NOACCESS
, SPR_NOACCESS
,
4170 &spr_read_generic
, &spr_write_generic
,
4173 spr_register(env
, SPR_750_GQR2
, "GQR2",
4174 SPR_NOACCESS
, SPR_NOACCESS
,
4175 &spr_read_generic
, &spr_write_generic
,
4178 spr_register(env
, SPR_750_GQR3
, "GQR3",
4179 SPR_NOACCESS
, SPR_NOACCESS
,
4180 &spr_read_generic
, &spr_write_generic
,
4183 spr_register(env
, SPR_750_GQR4
, "GQR4",
4184 SPR_NOACCESS
, SPR_NOACCESS
,
4185 &spr_read_generic
, &spr_write_generic
,
4188 spr_register(env
, SPR_750_GQR5
, "GQR5",
4189 SPR_NOACCESS
, SPR_NOACCESS
,
4190 &spr_read_generic
, &spr_write_generic
,
4193 spr_register(env
, SPR_750_GQR6
, "GQR6",
4194 SPR_NOACCESS
, SPR_NOACCESS
,
4195 &spr_read_generic
, &spr_write_generic
,
4198 spr_register(env
, SPR_750_GQR7
, "GQR7",
4199 SPR_NOACCESS
, SPR_NOACCESS
,
4200 &spr_read_generic
, &spr_write_generic
,
4202 /* Memory management */
4203 register_low_BATs(env
);
4204 /* PowerPC 750cl has 8 DBATs and 8 IBATs */
4205 register_high_BATs(env
);
4206 init_excp_750cl(env
);
4207 env
->dcache_line_size
= 32;
4208 env
->icache_line_size
= 32;
4209 /* Allocate hardware IRQ controller */
4210 ppc6xx_irq_init(env_archcpu(env
));
4213 POWERPC_FAMILY(750cl
)(ObjectClass
*oc
, void *data
)
4215 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4216 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4218 dc
->desc
= "PowerPC 750 CL";
4219 pcc
->init_proc
= init_proc_750cl
;
4220 pcc
->check_pow
= check_pow_hid0
;
4222 * XXX: not implemented:
4223 * cache lock instructions:
4225 * floating point paired instructions
4260 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4261 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4262 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4263 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4264 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4265 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4266 PPC_SEGMENT
| PPC_EXTERN
;
4267 pcc
->msr_mask
= (1ull << MSR_POW
) |
4283 pcc
->mmu_model
= POWERPC_MMU_32B
;
4284 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4285 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4286 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4287 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4288 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4291 static void init_proc_750cx(CPUPPCState
*env
)
4293 register_ne_601_sprs(env
);
4294 register_sdr1_sprs(env
);
4295 register_7xx_sprs(env
);
4297 spr_register(env
, SPR_L2CR
, "L2CR",
4298 SPR_NOACCESS
, SPR_NOACCESS
,
4299 &spr_read_generic
, spr_access_nop
,
4301 /* Thermal management */
4302 register_thrm_sprs(env
);
4304 spr_register(env
, SPR_SDA
, "SDA",
4305 SPR_NOACCESS
, SPR_NOACCESS
,
4306 &spr_read_generic
, &spr_write_generic
,
4309 /* Memory management */
4310 register_low_BATs(env
);
4311 /* PowerPC 750cx has 8 DBATs and 8 IBATs */
4312 register_high_BATs(env
);
4313 init_excp_750cx(env
);
4314 env
->dcache_line_size
= 32;
4315 env
->icache_line_size
= 32;
4316 /* Allocate hardware IRQ controller */
4317 ppc6xx_irq_init(env_archcpu(env
));
4320 POWERPC_FAMILY(750cx
)(ObjectClass
*oc
, void *data
)
4322 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4323 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4325 dc
->desc
= "PowerPC 750CX";
4326 pcc
->init_proc
= init_proc_750cx
;
4327 pcc
->check_pow
= check_pow_hid0
;
4328 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4329 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4330 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4331 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4332 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4333 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4334 PPC_SEGMENT
| PPC_EXTERN
;
4335 pcc
->msr_mask
= (1ull << MSR_POW
) |
4351 pcc
->mmu_model
= POWERPC_MMU_32B
;
4352 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4353 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4354 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4355 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4356 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4359 static void init_proc_750fx(CPUPPCState
*env
)
4361 register_ne_601_sprs(env
);
4362 register_sdr1_sprs(env
);
4363 register_7xx_sprs(env
);
4365 spr_register(env
, SPR_L2CR
, "L2CR",
4366 SPR_NOACCESS
, SPR_NOACCESS
,
4367 &spr_read_generic
, spr_access_nop
,
4369 /* Thermal management */
4370 register_thrm_sprs(env
);
4372 spr_register(env
, SPR_750_THRM4
, "THRM4",
4373 SPR_NOACCESS
, SPR_NOACCESS
,
4374 &spr_read_generic
, &spr_write_generic
,
4376 /* Hardware implementation registers */
4377 spr_register(env
, SPR_750FX_HID2
, "HID2",
4378 SPR_NOACCESS
, SPR_NOACCESS
,
4379 &spr_read_generic
, &spr_write_generic
,
4381 /* Memory management */
4382 register_low_BATs(env
);
4383 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
4384 register_high_BATs(env
);
4386 env
->dcache_line_size
= 32;
4387 env
->icache_line_size
= 32;
4388 /* Allocate hardware IRQ controller */
4389 ppc6xx_irq_init(env_archcpu(env
));
4392 POWERPC_FAMILY(750fx
)(ObjectClass
*oc
, void *data
)
4394 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4395 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4397 dc
->desc
= "PowerPC 750FX";
4398 pcc
->init_proc
= init_proc_750fx
;
4399 pcc
->check_pow
= check_pow_hid0
;
4400 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4401 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4402 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4403 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4404 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4405 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4406 PPC_SEGMENT
| PPC_EXTERN
;
4407 pcc
->msr_mask
= (1ull << MSR_POW
) |
4423 pcc
->mmu_model
= POWERPC_MMU_32B
;
4424 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4425 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4426 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4427 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4428 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4431 static void init_proc_750gx(CPUPPCState
*env
)
4433 register_ne_601_sprs(env
);
4434 register_sdr1_sprs(env
);
4435 register_7xx_sprs(env
);
4437 spr_register(env
, SPR_L2CR
, "L2CR",
4438 SPR_NOACCESS
, SPR_NOACCESS
,
4439 &spr_read_generic
, spr_access_nop
,
4441 /* Thermal management */
4442 register_thrm_sprs(env
);
4444 spr_register(env
, SPR_750_THRM4
, "THRM4",
4445 SPR_NOACCESS
, SPR_NOACCESS
,
4446 &spr_read_generic
, &spr_write_generic
,
4448 /* Hardware implementation registers */
4449 spr_register(env
, SPR_750FX_HID2
, "HID2",
4450 SPR_NOACCESS
, SPR_NOACCESS
,
4451 &spr_read_generic
, &spr_write_generic
,
4453 /* Memory management */
4454 register_low_BATs(env
);
4455 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
4456 register_high_BATs(env
);
4458 env
->dcache_line_size
= 32;
4459 env
->icache_line_size
= 32;
4460 /* Allocate hardware IRQ controller */
4461 ppc6xx_irq_init(env_archcpu(env
));
4464 POWERPC_FAMILY(750gx
)(ObjectClass
*oc
, void *data
)
4466 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4467 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4469 dc
->desc
= "PowerPC 750GX";
4470 pcc
->init_proc
= init_proc_750gx
;
4471 pcc
->check_pow
= check_pow_hid0
;
4472 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4473 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4474 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4475 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4476 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4477 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4478 PPC_SEGMENT
| PPC_EXTERN
;
4479 pcc
->msr_mask
= (1ull << MSR_POW
) |
4495 pcc
->mmu_model
= POWERPC_MMU_32B
;
4496 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4497 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4498 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4499 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4500 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4503 static void init_proc_745(CPUPPCState
*env
)
4505 register_ne_601_sprs(env
);
4506 register_sdr1_sprs(env
);
4507 register_7xx_sprs(env
);
4508 register_745_sprs(env
);
4509 /* Thermal management */
4510 register_thrm_sprs(env
);
4512 /* Memory management */
4513 register_low_BATs(env
);
4514 register_high_BATs(env
);
4515 register_6xx_7xx_soft_tlb(env
, 64, 2);
4517 env
->dcache_line_size
= 32;
4518 env
->icache_line_size
= 32;
4519 /* Allocate hardware IRQ controller */
4520 ppc6xx_irq_init(env_archcpu(env
));
4523 POWERPC_FAMILY(745)(ObjectClass
*oc
, void *data
)
4525 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4526 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4528 dc
->desc
= "PowerPC 745";
4529 pcc
->init_proc
= init_proc_745
;
4530 pcc
->check_pow
= check_pow_hid0
;
4531 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4532 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4533 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4534 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4535 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4536 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
4537 PPC_SEGMENT
| PPC_EXTERN
;
4538 pcc
->msr_mask
= (1ull << MSR_POW
) |
4554 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
4555 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4556 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4557 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4558 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4559 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4562 static void init_proc_755(CPUPPCState
*env
)
4564 register_ne_601_sprs(env
);
4565 register_sdr1_sprs(env
);
4566 register_7xx_sprs(env
);
4567 register_745_sprs(env
);
4568 register_755_sprs(env
);
4570 /* Thermal management */
4571 register_thrm_sprs(env
);
4573 /* Memory management */
4574 register_low_BATs(env
);
4575 register_high_BATs(env
);
4576 register_6xx_7xx_soft_tlb(env
, 64, 2);
4578 env
->dcache_line_size
= 32;
4579 env
->icache_line_size
= 32;
4580 /* Allocate hardware IRQ controller */
4581 ppc6xx_irq_init(env_archcpu(env
));
4584 POWERPC_FAMILY(755)(ObjectClass
*oc
, void *data
)
4586 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4587 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4589 dc
->desc
= "PowerPC 755";
4590 pcc
->init_proc
= init_proc_755
;
4591 pcc
->check_pow
= check_pow_hid0
;
4592 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4593 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4594 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4595 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4596 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4597 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
4598 PPC_SEGMENT
| PPC_EXTERN
;
4599 pcc
->msr_mask
= (1ull << MSR_POW
) |
4615 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
4616 pcc
->excp_model
= POWERPC_EXCP_7xx
;
4617 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4618 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4619 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4620 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4623 static void init_proc_7400(CPUPPCState
*env
)
4625 register_ne_601_sprs(env
);
4626 register_sdr1_sprs(env
);
4627 register_74xx_sprs(env
);
4628 vscr_init(env
, 0x00010000);
4630 spr_register(env
, SPR_UBAMR
, "UBAMR",
4631 &spr_read_ureg
, SPR_NOACCESS
,
4632 &spr_read_ureg
, SPR_NOACCESS
,
4635 spr_register(env
, SPR_MSSCR1
, "MSSCR1",
4636 SPR_NOACCESS
, SPR_NOACCESS
,
4637 &spr_read_generic
, &spr_write_generic
,
4639 /* Thermal management */
4640 register_thrm_sprs(env
);
4641 /* Memory management */
4642 register_low_BATs(env
);
4643 init_excp_7400(env
);
4644 env
->dcache_line_size
= 32;
4645 env
->icache_line_size
= 32;
4646 /* Allocate hardware IRQ controller */
4647 ppc6xx_irq_init(env_archcpu(env
));
4650 POWERPC_FAMILY(7400)(ObjectClass
*oc
, void *data
)
4652 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4653 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4655 dc
->desc
= "PowerPC 7400 (aka G4)";
4656 pcc
->init_proc
= init_proc_7400
;
4657 pcc
->check_pow
= check_pow_hid0
;
4658 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4659 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4660 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4662 PPC_CACHE
| PPC_CACHE_ICBI
|
4663 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4664 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4665 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4667 PPC_SEGMENT
| PPC_EXTERN
|
4669 pcc
->msr_mask
= (1ull << MSR_VR
) |
4686 pcc
->mmu_model
= POWERPC_MMU_32B
;
4687 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4688 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4689 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4690 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4691 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4692 POWERPC_FLAG_BUS_CLK
;
4695 static void init_proc_7410(CPUPPCState
*env
)
4697 register_ne_601_sprs(env
);
4698 register_sdr1_sprs(env
);
4699 register_74xx_sprs(env
);
4700 vscr_init(env
, 0x00010000);
4702 spr_register(env
, SPR_UBAMR
, "UBAMR",
4703 &spr_read_ureg
, SPR_NOACCESS
,
4704 &spr_read_ureg
, SPR_NOACCESS
,
4706 /* Thermal management */
4707 register_thrm_sprs(env
);
4710 spr_register(env
, SPR_L2PMCR
, "L2PMCR",
4711 SPR_NOACCESS
, SPR_NOACCESS
,
4712 &spr_read_generic
, &spr_write_generic
,
4716 spr_register(env
, SPR_LDSTDB
, "LDSTDB",
4717 SPR_NOACCESS
, SPR_NOACCESS
,
4718 &spr_read_generic
, &spr_write_generic
,
4720 /* Memory management */
4721 register_low_BATs(env
);
4722 init_excp_7400(env
);
4723 env
->dcache_line_size
= 32;
4724 env
->icache_line_size
= 32;
4725 /* Allocate hardware IRQ controller */
4726 ppc6xx_irq_init(env_archcpu(env
));
4729 POWERPC_FAMILY(7410)(ObjectClass
*oc
, void *data
)
4731 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4732 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4734 dc
->desc
= "PowerPC 7410 (aka G4)";
4735 pcc
->init_proc
= init_proc_7410
;
4736 pcc
->check_pow
= check_pow_hid0
;
4737 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4738 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4739 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4741 PPC_CACHE
| PPC_CACHE_ICBI
|
4742 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4743 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4744 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4746 PPC_SEGMENT
| PPC_EXTERN
|
4748 pcc
->msr_mask
= (1ull << MSR_VR
) |
4765 pcc
->mmu_model
= POWERPC_MMU_32B
;
4766 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4767 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4768 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4769 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4770 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4771 POWERPC_FLAG_BUS_CLK
;
4774 static void init_proc_7440(CPUPPCState
*env
)
4776 register_ne_601_sprs(env
);
4777 register_sdr1_sprs(env
);
4778 register_74xx_sprs(env
);
4779 vscr_init(env
, 0x00010000);
4781 spr_register(env
, SPR_UBAMR
, "UBAMR",
4782 &spr_read_ureg
, SPR_NOACCESS
,
4783 &spr_read_ureg
, SPR_NOACCESS
,
4786 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4787 SPR_NOACCESS
, SPR_NOACCESS
,
4788 &spr_read_generic
, &spr_write_generic
,
4791 spr_register(env
, SPR_ICTRL
, "ICTRL",
4792 SPR_NOACCESS
, SPR_NOACCESS
,
4793 &spr_read_generic
, &spr_write_generic
,
4796 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4797 SPR_NOACCESS
, SPR_NOACCESS
,
4798 &spr_read_generic
, &spr_write_generic
,
4801 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4802 SPR_NOACCESS
, SPR_NOACCESS
,
4803 &spr_read_generic
, &spr_write_generic
,
4806 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4807 &spr_read_ureg
, SPR_NOACCESS
,
4808 &spr_read_ureg
, SPR_NOACCESS
,
4811 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4812 SPR_NOACCESS
, SPR_NOACCESS
,
4813 &spr_read_generic
, &spr_write_generic
,
4816 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4817 &spr_read_ureg
, SPR_NOACCESS
,
4818 &spr_read_ureg
, SPR_NOACCESS
,
4820 /* Memory management */
4821 register_low_BATs(env
);
4822 init_excp_7450(env
);
4823 env
->dcache_line_size
= 32;
4824 env
->icache_line_size
= 32;
4825 /* Allocate hardware IRQ controller */
4826 ppc6xx_irq_init(env_archcpu(env
));
4829 POWERPC_FAMILY(7440)(ObjectClass
*oc
, void *data
)
4831 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4832 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4834 dc
->desc
= "PowerPC 7440 (aka G4)";
4835 pcc
->init_proc
= init_proc_7440
;
4836 pcc
->check_pow
= check_pow_hid0_74xx
;
4837 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4838 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4839 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4841 PPC_CACHE
| PPC_CACHE_ICBI
|
4842 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4843 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4844 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4846 PPC_SEGMENT
| PPC_EXTERN
|
4848 pcc
->msr_mask
= (1ull << MSR_VR
) |
4865 pcc
->mmu_model
= POWERPC_MMU_32B
;
4866 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4867 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4868 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4869 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4870 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4871 POWERPC_FLAG_BUS_CLK
;
4874 static void init_proc_7450(CPUPPCState
*env
)
4876 register_ne_601_sprs(env
);
4877 register_sdr1_sprs(env
);
4878 register_74xx_sprs(env
);
4879 vscr_init(env
, 0x00010000);
4880 /* Level 3 cache control */
4881 register_l3_ctrl(env
);
4883 spr_register(env
, SPR_L3ITCR1
, "L3ITCR1",
4884 SPR_NOACCESS
, SPR_NOACCESS
,
4885 &spr_read_generic
, &spr_write_generic
,
4888 spr_register(env
, SPR_L3ITCR2
, "L3ITCR2",
4889 SPR_NOACCESS
, SPR_NOACCESS
,
4890 &spr_read_generic
, &spr_write_generic
,
4893 spr_register(env
, SPR_L3ITCR3
, "L3ITCR3",
4894 SPR_NOACCESS
, SPR_NOACCESS
,
4895 &spr_read_generic
, &spr_write_generic
,
4898 spr_register(env
, SPR_L3OHCR
, "L3OHCR",
4899 SPR_NOACCESS
, SPR_NOACCESS
,
4900 &spr_read_generic
, &spr_write_generic
,
4903 spr_register(env
, SPR_UBAMR
, "UBAMR",
4904 &spr_read_ureg
, SPR_NOACCESS
,
4905 &spr_read_ureg
, SPR_NOACCESS
,
4908 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
4909 SPR_NOACCESS
, SPR_NOACCESS
,
4910 &spr_read_generic
, &spr_write_generic
,
4913 spr_register(env
, SPR_ICTRL
, "ICTRL",
4914 SPR_NOACCESS
, SPR_NOACCESS
,
4915 &spr_read_generic
, &spr_write_generic
,
4918 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
4919 SPR_NOACCESS
, SPR_NOACCESS
,
4920 &spr_read_generic
, &spr_write_generic
,
4923 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
4924 SPR_NOACCESS
, SPR_NOACCESS
,
4925 &spr_read_generic
, &spr_write_generic
,
4928 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
4929 &spr_read_ureg
, SPR_NOACCESS
,
4930 &spr_read_ureg
, SPR_NOACCESS
,
4933 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
4934 SPR_NOACCESS
, SPR_NOACCESS
,
4935 &spr_read_generic
, &spr_write_generic
,
4938 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
4939 &spr_read_ureg
, SPR_NOACCESS
,
4940 &spr_read_ureg
, SPR_NOACCESS
,
4942 /* Memory management */
4943 register_low_BATs(env
);
4944 init_excp_7450(env
);
4945 env
->dcache_line_size
= 32;
4946 env
->icache_line_size
= 32;
4947 /* Allocate hardware IRQ controller */
4948 ppc6xx_irq_init(env_archcpu(env
));
4951 POWERPC_FAMILY(7450)(ObjectClass
*oc
, void *data
)
4953 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4954 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4956 dc
->desc
= "PowerPC 7450 (aka G4)";
4957 pcc
->init_proc
= init_proc_7450
;
4958 pcc
->check_pow
= check_pow_hid0_74xx
;
4959 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4960 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4961 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
4963 PPC_CACHE
| PPC_CACHE_ICBI
|
4964 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
4965 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4966 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4968 PPC_SEGMENT
| PPC_EXTERN
|
4970 pcc
->msr_mask
= (1ull << MSR_VR
) |
4987 pcc
->mmu_model
= POWERPC_MMU_32B
;
4988 pcc
->excp_model
= POWERPC_EXCP_74xx
;
4989 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4990 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
4991 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
4992 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
4993 POWERPC_FLAG_BUS_CLK
;
4996 static void init_proc_7445(CPUPPCState
*env
)
4998 register_ne_601_sprs(env
);
4999 register_sdr1_sprs(env
);
5000 register_74xx_sprs(env
);
5001 vscr_init(env
, 0x00010000);
5003 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5004 SPR_NOACCESS
, SPR_NOACCESS
,
5005 &spr_read_generic
, &spr_write_generic
,
5008 spr_register(env
, SPR_ICTRL
, "ICTRL",
5009 SPR_NOACCESS
, SPR_NOACCESS
,
5010 &spr_read_generic
, &spr_write_generic
,
5013 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5014 SPR_NOACCESS
, SPR_NOACCESS
,
5015 &spr_read_generic
, &spr_write_generic
,
5018 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5019 SPR_NOACCESS
, SPR_NOACCESS
,
5020 &spr_read_generic
, &spr_write_generic
,
5023 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5024 &spr_read_ureg
, SPR_NOACCESS
,
5025 &spr_read_ureg
, SPR_NOACCESS
,
5028 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5029 SPR_NOACCESS
, SPR_NOACCESS
,
5030 &spr_read_generic
, &spr_write_generic
,
5033 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5034 &spr_read_ureg
, SPR_NOACCESS
,
5035 &spr_read_ureg
, SPR_NOACCESS
,
5038 spr_register(env
, SPR_SPRG4
, "SPRG4",
5039 SPR_NOACCESS
, SPR_NOACCESS
,
5040 &spr_read_generic
, &spr_write_generic
,
5042 spr_register(env
, SPR_USPRG4
, "USPRG4",
5043 &spr_read_ureg
, SPR_NOACCESS
,
5044 &spr_read_ureg
, SPR_NOACCESS
,
5046 spr_register(env
, SPR_SPRG5
, "SPRG5",
5047 SPR_NOACCESS
, SPR_NOACCESS
,
5048 &spr_read_generic
, &spr_write_generic
,
5050 spr_register(env
, SPR_USPRG5
, "USPRG5",
5051 &spr_read_ureg
, SPR_NOACCESS
,
5052 &spr_read_ureg
, SPR_NOACCESS
,
5054 spr_register(env
, SPR_SPRG6
, "SPRG6",
5055 SPR_NOACCESS
, SPR_NOACCESS
,
5056 &spr_read_generic
, &spr_write_generic
,
5058 spr_register(env
, SPR_USPRG6
, "USPRG6",
5059 &spr_read_ureg
, SPR_NOACCESS
,
5060 &spr_read_ureg
, SPR_NOACCESS
,
5062 spr_register(env
, SPR_SPRG7
, "SPRG7",
5063 SPR_NOACCESS
, SPR_NOACCESS
,
5064 &spr_read_generic
, &spr_write_generic
,
5066 spr_register(env
, SPR_USPRG7
, "USPRG7",
5067 &spr_read_ureg
, SPR_NOACCESS
,
5068 &spr_read_ureg
, SPR_NOACCESS
,
5070 /* Memory management */
5071 register_low_BATs(env
);
5072 register_high_BATs(env
);
5073 init_excp_7450(env
);
5074 env
->dcache_line_size
= 32;
5075 env
->icache_line_size
= 32;
5076 /* Allocate hardware IRQ controller */
5077 ppc6xx_irq_init(env_archcpu(env
));
5080 POWERPC_FAMILY(7445)(ObjectClass
*oc
, void *data
)
5082 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5083 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5085 dc
->desc
= "PowerPC 7445 (aka G4)";
5086 pcc
->init_proc
= init_proc_7445
;
5087 pcc
->check_pow
= check_pow_hid0_74xx
;
5088 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5089 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5090 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5092 PPC_CACHE
| PPC_CACHE_ICBI
|
5093 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5094 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5095 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5097 PPC_SEGMENT
| PPC_EXTERN
|
5099 pcc
->msr_mask
= (1ull << MSR_VR
) |
5116 pcc
->mmu_model
= POWERPC_MMU_32B
;
5117 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5118 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5119 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5120 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5121 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5122 POWERPC_FLAG_BUS_CLK
;
5125 static void init_proc_7455(CPUPPCState
*env
)
5127 register_ne_601_sprs(env
);
5128 register_sdr1_sprs(env
);
5129 register_74xx_sprs(env
);
5130 vscr_init(env
, 0x00010000);
5131 /* Level 3 cache control */
5132 register_l3_ctrl(env
);
5134 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5135 SPR_NOACCESS
, SPR_NOACCESS
,
5136 &spr_read_generic
, &spr_write_generic
,
5139 spr_register(env
, SPR_ICTRL
, "ICTRL",
5140 SPR_NOACCESS
, SPR_NOACCESS
,
5141 &spr_read_generic
, &spr_write_generic
,
5144 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5145 SPR_NOACCESS
, SPR_NOACCESS
,
5146 &spr_read_generic
, &spr_write_generic
,
5149 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5150 SPR_NOACCESS
, SPR_NOACCESS
,
5151 &spr_read_generic
, &spr_write_generic
,
5154 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5155 &spr_read_ureg
, SPR_NOACCESS
,
5156 &spr_read_ureg
, SPR_NOACCESS
,
5159 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5160 SPR_NOACCESS
, SPR_NOACCESS
,
5161 &spr_read_generic
, &spr_write_generic
,
5164 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5165 &spr_read_ureg
, SPR_NOACCESS
,
5166 &spr_read_ureg
, SPR_NOACCESS
,
5169 spr_register(env
, SPR_SPRG4
, "SPRG4",
5170 SPR_NOACCESS
, SPR_NOACCESS
,
5171 &spr_read_generic
, &spr_write_generic
,
5173 spr_register(env
, SPR_USPRG4
, "USPRG4",
5174 &spr_read_ureg
, SPR_NOACCESS
,
5175 &spr_read_ureg
, SPR_NOACCESS
,
5177 spr_register(env
, SPR_SPRG5
, "SPRG5",
5178 SPR_NOACCESS
, SPR_NOACCESS
,
5179 &spr_read_generic
, &spr_write_generic
,
5181 spr_register(env
, SPR_USPRG5
, "USPRG5",
5182 &spr_read_ureg
, SPR_NOACCESS
,
5183 &spr_read_ureg
, SPR_NOACCESS
,
5185 spr_register(env
, SPR_SPRG6
, "SPRG6",
5186 SPR_NOACCESS
, SPR_NOACCESS
,
5187 &spr_read_generic
, &spr_write_generic
,
5189 spr_register(env
, SPR_USPRG6
, "USPRG6",
5190 &spr_read_ureg
, SPR_NOACCESS
,
5191 &spr_read_ureg
, SPR_NOACCESS
,
5193 spr_register(env
, SPR_SPRG7
, "SPRG7",
5194 SPR_NOACCESS
, SPR_NOACCESS
,
5195 &spr_read_generic
, &spr_write_generic
,
5197 spr_register(env
, SPR_USPRG7
, "USPRG7",
5198 &spr_read_ureg
, SPR_NOACCESS
,
5199 &spr_read_ureg
, SPR_NOACCESS
,
5201 /* Memory management */
5202 register_low_BATs(env
);
5203 register_high_BATs(env
);
5204 init_excp_7450(env
);
5205 env
->dcache_line_size
= 32;
5206 env
->icache_line_size
= 32;
5207 /* Allocate hardware IRQ controller */
5208 ppc6xx_irq_init(env_archcpu(env
));
5211 POWERPC_FAMILY(7455)(ObjectClass
*oc
, void *data
)
5213 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5214 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5216 dc
->desc
= "PowerPC 7455 (aka G4)";
5217 pcc
->init_proc
= init_proc_7455
;
5218 pcc
->check_pow
= check_pow_hid0_74xx
;
5219 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5220 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5221 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5223 PPC_CACHE
| PPC_CACHE_ICBI
|
5224 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5225 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5226 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5228 PPC_SEGMENT
| PPC_EXTERN
|
5230 pcc
->msr_mask
= (1ull << MSR_VR
) |
5247 pcc
->mmu_model
= POWERPC_MMU_32B
;
5248 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5249 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5250 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5251 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5252 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5253 POWERPC_FLAG_BUS_CLK
;
5256 static void init_proc_7457(CPUPPCState
*env
)
5258 register_ne_601_sprs(env
);
5259 register_sdr1_sprs(env
);
5260 register_74xx_sprs(env
);
5261 vscr_init(env
, 0x00010000);
5262 /* Level 3 cache control */
5263 register_l3_ctrl(env
);
5265 spr_register(env
, SPR_L3ITCR1
, "L3ITCR1",
5266 SPR_NOACCESS
, SPR_NOACCESS
,
5267 &spr_read_generic
, &spr_write_generic
,
5270 spr_register(env
, SPR_L3ITCR2
, "L3ITCR2",
5271 SPR_NOACCESS
, SPR_NOACCESS
,
5272 &spr_read_generic
, &spr_write_generic
,
5275 spr_register(env
, SPR_L3ITCR3
, "L3ITCR3",
5276 SPR_NOACCESS
, SPR_NOACCESS
,
5277 &spr_read_generic
, &spr_write_generic
,
5280 spr_register(env
, SPR_L3OHCR
, "L3OHCR",
5281 SPR_NOACCESS
, SPR_NOACCESS
,
5282 &spr_read_generic
, &spr_write_generic
,
5285 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5286 SPR_NOACCESS
, SPR_NOACCESS
,
5287 &spr_read_generic
, &spr_write_generic
,
5290 spr_register(env
, SPR_ICTRL
, "ICTRL",
5291 SPR_NOACCESS
, SPR_NOACCESS
,
5292 &spr_read_generic
, &spr_write_generic
,
5295 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5296 SPR_NOACCESS
, SPR_NOACCESS
,
5297 &spr_read_generic
, &spr_write_generic
,
5300 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5301 SPR_NOACCESS
, SPR_NOACCESS
,
5302 &spr_read_generic
, &spr_write_generic
,
5305 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5306 &spr_read_ureg
, SPR_NOACCESS
,
5307 &spr_read_ureg
, SPR_NOACCESS
,
5310 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5311 SPR_NOACCESS
, SPR_NOACCESS
,
5312 &spr_read_generic
, &spr_write_generic
,
5315 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5316 &spr_read_ureg
, SPR_NOACCESS
,
5317 &spr_read_ureg
, SPR_NOACCESS
,
5320 spr_register(env
, SPR_SPRG4
, "SPRG4",
5321 SPR_NOACCESS
, SPR_NOACCESS
,
5322 &spr_read_generic
, &spr_write_generic
,
5324 spr_register(env
, SPR_USPRG4
, "USPRG4",
5325 &spr_read_ureg
, SPR_NOACCESS
,
5326 &spr_read_ureg
, SPR_NOACCESS
,
5328 spr_register(env
, SPR_SPRG5
, "SPRG5",
5329 SPR_NOACCESS
, SPR_NOACCESS
,
5330 &spr_read_generic
, &spr_write_generic
,
5332 spr_register(env
, SPR_USPRG5
, "USPRG5",
5333 &spr_read_ureg
, SPR_NOACCESS
,
5334 &spr_read_ureg
, SPR_NOACCESS
,
5336 spr_register(env
, SPR_SPRG6
, "SPRG6",
5337 SPR_NOACCESS
, SPR_NOACCESS
,
5338 &spr_read_generic
, &spr_write_generic
,
5340 spr_register(env
, SPR_USPRG6
, "USPRG6",
5341 &spr_read_ureg
, SPR_NOACCESS
,
5342 &spr_read_ureg
, SPR_NOACCESS
,
5344 spr_register(env
, SPR_SPRG7
, "SPRG7",
5345 SPR_NOACCESS
, SPR_NOACCESS
,
5346 &spr_read_generic
, &spr_write_generic
,
5348 spr_register(env
, SPR_USPRG7
, "USPRG7",
5349 &spr_read_ureg
, SPR_NOACCESS
,
5350 &spr_read_ureg
, SPR_NOACCESS
,
5352 /* Memory management */
5353 register_low_BATs(env
);
5354 register_high_BATs(env
);
5355 init_excp_7450(env
);
5356 env
->dcache_line_size
= 32;
5357 env
->icache_line_size
= 32;
5358 /* Allocate hardware IRQ controller */
5359 ppc6xx_irq_init(env_archcpu(env
));
5362 POWERPC_FAMILY(7457)(ObjectClass
*oc
, void *data
)
5364 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5365 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5367 dc
->desc
= "PowerPC 7457 (aka G4)";
5368 pcc
->init_proc
= init_proc_7457
;
5369 pcc
->check_pow
= check_pow_hid0_74xx
;
5370 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5371 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5372 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5374 PPC_CACHE
| PPC_CACHE_ICBI
|
5375 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5376 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5377 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5379 PPC_SEGMENT
| PPC_EXTERN
|
5381 pcc
->msr_mask
= (1ull << MSR_VR
) |
5398 pcc
->mmu_model
= POWERPC_MMU_32B
;
5399 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5400 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5401 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5402 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5403 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5404 POWERPC_FLAG_BUS_CLK
;
5407 static void init_proc_e600(CPUPPCState
*env
)
5409 register_ne_601_sprs(env
);
5410 register_sdr1_sprs(env
);
5411 register_74xx_sprs(env
);
5412 vscr_init(env
, 0x00010000);
5414 spr_register(env
, SPR_UBAMR
, "UBAMR",
5415 &spr_read_ureg
, SPR_NOACCESS
,
5416 &spr_read_ureg
, SPR_NOACCESS
,
5419 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5420 SPR_NOACCESS
, SPR_NOACCESS
,
5421 &spr_read_generic
, &spr_write_generic
,
5424 spr_register(env
, SPR_ICTRL
, "ICTRL",
5425 SPR_NOACCESS
, SPR_NOACCESS
,
5426 &spr_read_generic
, &spr_write_generic
,
5429 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5430 SPR_NOACCESS
, SPR_NOACCESS
,
5431 &spr_read_generic
, &spr_write_generic
,
5434 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5435 SPR_NOACCESS
, SPR_NOACCESS
,
5436 &spr_read_generic
, &spr_write_generic
,
5439 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5440 &spr_read_ureg
, SPR_NOACCESS
,
5441 &spr_read_ureg
, SPR_NOACCESS
,
5444 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5445 SPR_NOACCESS
, SPR_NOACCESS
,
5446 &spr_read_generic
, &spr_write_generic
,
5449 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5450 &spr_read_ureg
, SPR_NOACCESS
,
5451 &spr_read_ureg
, SPR_NOACCESS
,
5454 spr_register(env
, SPR_SPRG4
, "SPRG4",
5455 SPR_NOACCESS
, SPR_NOACCESS
,
5456 &spr_read_generic
, &spr_write_generic
,
5458 spr_register(env
, SPR_USPRG4
, "USPRG4",
5459 &spr_read_ureg
, SPR_NOACCESS
,
5460 &spr_read_ureg
, SPR_NOACCESS
,
5462 spr_register(env
, SPR_SPRG5
, "SPRG5",
5463 SPR_NOACCESS
, SPR_NOACCESS
,
5464 &spr_read_generic
, &spr_write_generic
,
5466 spr_register(env
, SPR_USPRG5
, "USPRG5",
5467 &spr_read_ureg
, SPR_NOACCESS
,
5468 &spr_read_ureg
, SPR_NOACCESS
,
5470 spr_register(env
, SPR_SPRG6
, "SPRG6",
5471 SPR_NOACCESS
, SPR_NOACCESS
,
5472 &spr_read_generic
, &spr_write_generic
,
5474 spr_register(env
, SPR_USPRG6
, "USPRG6",
5475 &spr_read_ureg
, SPR_NOACCESS
,
5476 &spr_read_ureg
, SPR_NOACCESS
,
5478 spr_register(env
, SPR_SPRG7
, "SPRG7",
5479 SPR_NOACCESS
, SPR_NOACCESS
,
5480 &spr_read_generic
, &spr_write_generic
,
5482 spr_register(env
, SPR_USPRG7
, "USPRG7",
5483 &spr_read_ureg
, SPR_NOACCESS
,
5484 &spr_read_ureg
, SPR_NOACCESS
,
5486 /* Memory management */
5487 register_low_BATs(env
);
5488 register_high_BATs(env
);
5489 init_excp_7450(env
);
5490 env
->dcache_line_size
= 32;
5491 env
->icache_line_size
= 32;
5492 /* Allocate hardware IRQ controller */
5493 ppc6xx_irq_init(env_archcpu(env
));
5496 POWERPC_FAMILY(e600
)(ObjectClass
*oc
, void *data
)
5498 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5499 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5501 dc
->desc
= "PowerPC e600";
5502 pcc
->init_proc
= init_proc_e600
;
5503 pcc
->check_pow
= check_pow_hid0_74xx
;
5504 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5505 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5506 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5508 PPC_CACHE
| PPC_CACHE_ICBI
|
5509 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5510 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5511 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5513 PPC_SEGMENT
| PPC_EXTERN
|
5515 pcc
->insns_flags2
= PPC_NONE
;
5516 pcc
->msr_mask
= (1ull << MSR_VR
) |
5533 pcc
->mmu_model
= POWERPC_MMU_32B
;
5534 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5535 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5536 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5537 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5538 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5539 POWERPC_FLAG_BUS_CLK
;
5542 #if defined(TARGET_PPC64)
5543 #if defined(CONFIG_USER_ONLY)
5544 #define POWERPC970_HID5_INIT 0x00000080
5546 #define POWERPC970_HID5_INIT 0x00000000
5549 static int check_pow_970(CPUPPCState
*env
)
5551 if (env
->spr
[SPR_HID0
] & (HID0_DEEPNAP
| HID0_DOZE
| HID0_NAP
)) {
5558 static void register_970_hid_sprs(CPUPPCState
*env
)
5560 /* Hardware implementation registers */
5561 spr_register(env
, SPR_HID0
, "HID0",
5562 SPR_NOACCESS
, SPR_NOACCESS
,
5563 &spr_read_generic
, &spr_write_clear
,
5565 spr_register(env
, SPR_HID1
, "HID1",
5566 SPR_NOACCESS
, SPR_NOACCESS
,
5567 &spr_read_generic
, &spr_write_generic
,
5569 spr_register(env
, SPR_970_HID5
, "HID5",
5570 SPR_NOACCESS
, SPR_NOACCESS
,
5571 &spr_read_generic
, &spr_write_generic
,
5572 POWERPC970_HID5_INIT
);
5575 static void register_970_hior_sprs(CPUPPCState
*env
)
5577 spr_register(env
, SPR_HIOR
, "SPR_HIOR",
5578 SPR_NOACCESS
, SPR_NOACCESS
,
5579 &spr_read_hior
, &spr_write_hior
,
5583 static void register_book3s_ctrl_sprs(CPUPPCState
*env
)
5585 spr_register(env
, SPR_CTRL
, "SPR_CTRL",
5586 SPR_NOACCESS
, SPR_NOACCESS
,
5587 SPR_NOACCESS
, &spr_write_CTRL
,
5589 spr_register(env
, SPR_UCTRL
, "SPR_UCTRL",
5590 &spr_read_ureg
, SPR_NOACCESS
,
5591 &spr_read_ureg
, SPR_NOACCESS
,
5595 static void register_book3s_altivec_sprs(CPUPPCState
*env
)
5597 if (!(env
->insns_flags
& PPC_ALTIVEC
)) {
5601 spr_register_kvm(env
, SPR_VRSAVE
, "VRSAVE",
5602 &spr_read_generic
, &spr_write_generic
,
5603 &spr_read_generic
, &spr_write_generic
,
5604 KVM_REG_PPC_VRSAVE
, 0x00000000);
5608 static void register_book3s_dbg_sprs(CPUPPCState
*env
)
5611 * TODO: different specs define different scopes for these,
5612 * will have to address this:
5613 * 970: super/write and super/read
5614 * powerisa 2.03..2.04: hypv/write and super/read.
5615 * powerisa 2.05 and newer: hypv/write and hypv/read.
5617 spr_register_kvm(env
, SPR_DABR
, "DABR",
5618 SPR_NOACCESS
, SPR_NOACCESS
,
5619 &spr_read_generic
, &spr_write_generic
,
5620 KVM_REG_PPC_DABR
, 0x00000000);
5621 spr_register_kvm(env
, SPR_DABRX
, "DABRX",
5622 SPR_NOACCESS
, SPR_NOACCESS
,
5623 &spr_read_generic
, &spr_write_generic
,
5624 KVM_REG_PPC_DABRX
, 0x00000000);
5627 static void register_book3s_207_dbg_sprs(CPUPPCState
*env
)
5629 spr_register_kvm_hv(env
, SPR_DAWR0
, "DAWR0",
5630 SPR_NOACCESS
, SPR_NOACCESS
,
5631 SPR_NOACCESS
, SPR_NOACCESS
,
5632 &spr_read_generic
, &spr_write_generic
,
5633 KVM_REG_PPC_DAWR
, 0x00000000);
5634 spr_register_kvm_hv(env
, SPR_DAWRX0
, "DAWRX0",
5635 SPR_NOACCESS
, SPR_NOACCESS
,
5636 SPR_NOACCESS
, SPR_NOACCESS
,
5637 &spr_read_generic
, &spr_write_generic
,
5638 KVM_REG_PPC_DAWRX
, 0x00000000);
5639 spr_register_kvm_hv(env
, SPR_CIABR
, "CIABR",
5640 SPR_NOACCESS
, SPR_NOACCESS
,
5641 SPR_NOACCESS
, SPR_NOACCESS
,
5642 &spr_read_generic
, &spr_write_generic
,
5643 KVM_REG_PPC_CIABR
, 0x00000000);
5646 static void register_970_dbg_sprs(CPUPPCState
*env
)
5649 spr_register(env
, SPR_IABR
, "IABR",
5650 SPR_NOACCESS
, SPR_NOACCESS
,
5651 &spr_read_generic
, &spr_write_generic
,
5655 static void register_book3s_pmu_sup_sprs(CPUPPCState
*env
)
5657 spr_register_kvm(env
, SPR_POWER_MMCR0
, "MMCR0",
5658 SPR_NOACCESS
, SPR_NOACCESS
,
5659 &spr_read_generic
, &spr_write_MMCR0
,
5660 KVM_REG_PPC_MMCR0
, 0x80000000);
5661 spr_register_kvm(env
, SPR_POWER_MMCR1
, "MMCR1",
5662 SPR_NOACCESS
, SPR_NOACCESS
,
5663 &spr_read_generic
, &spr_write_MMCR1
,
5664 KVM_REG_PPC_MMCR1
, 0x00000000);
5665 spr_register_kvm(env
, SPR_POWER_MMCRA
, "MMCRA",
5666 SPR_NOACCESS
, SPR_NOACCESS
,
5667 &spr_read_generic
, &spr_write_generic
,
5668 KVM_REG_PPC_MMCRA
, 0x00000000);
5669 spr_register_kvm(env
, SPR_POWER_PMC1
, "PMC1",
5670 SPR_NOACCESS
, SPR_NOACCESS
,
5671 &spr_read_PMC
, &spr_write_PMC
,
5672 KVM_REG_PPC_PMC1
, 0x00000000);
5673 spr_register_kvm(env
, SPR_POWER_PMC2
, "PMC2",
5674 SPR_NOACCESS
, SPR_NOACCESS
,
5675 &spr_read_PMC
, &spr_write_PMC
,
5676 KVM_REG_PPC_PMC2
, 0x00000000);
5677 spr_register_kvm(env
, SPR_POWER_PMC3
, "PMC3",
5678 SPR_NOACCESS
, SPR_NOACCESS
,
5679 &spr_read_PMC
, &spr_write_PMC
,
5680 KVM_REG_PPC_PMC3
, 0x00000000);
5681 spr_register_kvm(env
, SPR_POWER_PMC4
, "PMC4",
5682 SPR_NOACCESS
, SPR_NOACCESS
,
5683 &spr_read_PMC
, &spr_write_PMC
,
5684 KVM_REG_PPC_PMC4
, 0x00000000);
5685 spr_register_kvm(env
, SPR_POWER_PMC5
, "PMC5",
5686 SPR_NOACCESS
, SPR_NOACCESS
,
5687 &spr_read_PMC
, &spr_write_PMC
,
5688 KVM_REG_PPC_PMC5
, 0x00000000);
5689 spr_register_kvm(env
, SPR_POWER_PMC6
, "PMC6",
5690 SPR_NOACCESS
, SPR_NOACCESS
,
5691 &spr_read_PMC
, &spr_write_PMC
,
5692 KVM_REG_PPC_PMC6
, 0x00000000);
5693 spr_register_kvm(env
, SPR_POWER_SIAR
, "SIAR",
5694 SPR_NOACCESS
, SPR_NOACCESS
,
5695 &spr_read_generic
, &spr_write_generic
,
5696 KVM_REG_PPC_SIAR
, 0x00000000);
5697 spr_register_kvm(env
, SPR_POWER_SDAR
, "SDAR",
5698 SPR_NOACCESS
, SPR_NOACCESS
,
5699 &spr_read_generic
, &spr_write_generic
,
5700 KVM_REG_PPC_SDAR
, 0x00000000);
5703 static void register_book3s_pmu_user_sprs(CPUPPCState
*env
)
5705 spr_register(env
, SPR_POWER_UMMCR0
, "UMMCR0",
5706 &spr_read_MMCR0_ureg
, &spr_write_MMCR0_ureg
,
5707 &spr_read_ureg
, &spr_write_ureg
,
5709 spr_register(env
, SPR_POWER_UMMCR1
, "UMMCR1",
5710 &spr_read_ureg
, SPR_NOACCESS
,
5711 &spr_read_ureg
, &spr_write_ureg
,
5713 spr_register(env
, SPR_POWER_UMMCRA
, "UMMCRA",
5714 &spr_read_ureg
, SPR_NOACCESS
,
5715 &spr_read_ureg
, &spr_write_ureg
,
5717 spr_register(env
, SPR_POWER_UPMC1
, "UPMC1",
5718 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5719 &spr_read_ureg
, &spr_write_ureg
,
5721 spr_register(env
, SPR_POWER_UPMC2
, "UPMC2",
5722 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5723 &spr_read_ureg
, &spr_write_ureg
,
5725 spr_register(env
, SPR_POWER_UPMC3
, "UPMC3",
5726 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5727 &spr_read_ureg
, &spr_write_ureg
,
5729 spr_register(env
, SPR_POWER_UPMC4
, "UPMC4",
5730 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
5731 &spr_read_ureg
, &spr_write_ureg
,
5733 spr_register(env
, SPR_POWER_UPMC5
, "UPMC5",
5734 &spr_read_PMC56_ureg
, &spr_write_PMC56_ureg
,
5735 &spr_read_ureg
, &spr_write_ureg
,
5737 spr_register(env
, SPR_POWER_UPMC6
, "UPMC6",
5738 &spr_read_PMC56_ureg
, &spr_write_PMC56_ureg
,
5739 &spr_read_ureg
, &spr_write_ureg
,
5741 spr_register(env
, SPR_POWER_USIAR
, "USIAR",
5742 &spr_read_ureg
, SPR_NOACCESS
,
5743 &spr_read_ureg
, &spr_write_ureg
,
5745 spr_register(env
, SPR_POWER_USDAR
, "USDAR",
5746 &spr_read_ureg
, SPR_NOACCESS
,
5747 &spr_read_ureg
, &spr_write_ureg
,
5751 static void register_970_pmu_sup_sprs(CPUPPCState
*env
)
5753 spr_register_kvm(env
, SPR_970_PMC7
, "PMC7",
5754 SPR_NOACCESS
, SPR_NOACCESS
,
5755 &spr_read_generic
, &spr_write_generic
,
5756 KVM_REG_PPC_PMC7
, 0x00000000);
5757 spr_register_kvm(env
, SPR_970_PMC8
, "PMC8",
5758 SPR_NOACCESS
, SPR_NOACCESS
,
5759 &spr_read_generic
, &spr_write_generic
,
5760 KVM_REG_PPC_PMC8
, 0x00000000);
5763 static void register_970_pmu_user_sprs(CPUPPCState
*env
)
5765 spr_register(env
, SPR_970_UPMC7
, "UPMC7",
5766 &spr_read_ureg
, SPR_NOACCESS
,
5767 &spr_read_ureg
, &spr_write_ureg
,
5769 spr_register(env
, SPR_970_UPMC8
, "UPMC8",
5770 &spr_read_ureg
, SPR_NOACCESS
,
5771 &spr_read_ureg
, &spr_write_ureg
,
5775 static void register_power8_pmu_sup_sprs(CPUPPCState
*env
)
5777 spr_register_kvm(env
, SPR_POWER_MMCR2
, "MMCR2",
5778 SPR_NOACCESS
, SPR_NOACCESS
,
5779 &spr_read_generic
, &spr_write_generic
,
5780 KVM_REG_PPC_MMCR2
, 0x00000000);
5781 spr_register_kvm(env
, SPR_POWER_MMCRS
, "MMCRS",
5782 SPR_NOACCESS
, SPR_NOACCESS
,
5783 &spr_read_generic
, &spr_write_generic
,
5784 KVM_REG_PPC_MMCRS
, 0x00000000);
5785 spr_register_kvm(env
, SPR_POWER_SIER
, "SIER",
5786 SPR_NOACCESS
, SPR_NOACCESS
,
5787 &spr_read_generic
, &spr_write_generic
,
5788 KVM_REG_PPC_SIER
, 0x00000000);
5789 spr_register_kvm(env
, SPR_POWER_SPMC1
, "SPMC1",
5790 SPR_NOACCESS
, SPR_NOACCESS
,
5791 &spr_read_generic
, &spr_write_generic
,
5792 KVM_REG_PPC_SPMC1
, 0x00000000);
5793 spr_register_kvm(env
, SPR_POWER_SPMC2
, "SPMC2",
5794 SPR_NOACCESS
, SPR_NOACCESS
,
5795 &spr_read_generic
, &spr_write_generic
,
5796 KVM_REG_PPC_SPMC2
, 0x00000000);
5797 spr_register_kvm(env
, SPR_TACR
, "TACR",
5798 SPR_NOACCESS
, SPR_NOACCESS
,
5799 &spr_read_generic
, &spr_write_generic
,
5800 KVM_REG_PPC_TACR
, 0x00000000);
5801 spr_register_kvm(env
, SPR_TCSCR
, "TCSCR",
5802 SPR_NOACCESS
, SPR_NOACCESS
,
5803 &spr_read_generic
, &spr_write_generic
,
5804 KVM_REG_PPC_TCSCR
, 0x00000000);
5805 spr_register_kvm(env
, SPR_CSIGR
, "CSIGR",
5806 SPR_NOACCESS
, SPR_NOACCESS
,
5807 &spr_read_generic
, &spr_write_generic
,
5808 KVM_REG_PPC_CSIGR
, 0x00000000);
5811 static void register_power8_pmu_user_sprs(CPUPPCState
*env
)
5813 spr_register(env
, SPR_POWER_UMMCR2
, "UMMCR2",
5814 &spr_read_MMCR2_ureg
, &spr_write_MMCR2_ureg
,
5815 &spr_read_ureg
, &spr_write_ureg
,
5817 spr_register(env
, SPR_POWER_USIER
, "USIER",
5818 &spr_read_generic
, SPR_NOACCESS
,
5819 &spr_read_generic
, &spr_write_generic
,
5823 static void register_power5p_ear_sprs(CPUPPCState
*env
)
5825 /* External access control */
5826 spr_register(env
, SPR_EAR
, "EAR",
5827 SPR_NOACCESS
, SPR_NOACCESS
,
5828 &spr_read_generic
, &spr_write_generic
,
5832 static void register_power5p_tb_sprs(CPUPPCState
*env
)
5834 /* TBU40 (High 40 bits of the Timebase register */
5835 spr_register_hv(env
, SPR_TBU40
, "TBU40",
5836 SPR_NOACCESS
, SPR_NOACCESS
,
5837 SPR_NOACCESS
, SPR_NOACCESS
,
5838 SPR_NOACCESS
, &spr_write_tbu40
,
5842 static void register_970_lpar_sprs(CPUPPCState
*env
)
5844 #if !defined(CONFIG_USER_ONLY)
5846 * PPC970: HID4 covers things later controlled by the LPCR and
5847 * RMOR in later CPUs, but with a different encoding. We only
5848 * support the 970 in "Apple mode" which has all hypervisor
5849 * facilities disabled by strapping, so we can basically just
5852 spr_register(env
, SPR_970_HID4
, "HID4",
5853 SPR_NOACCESS
, SPR_NOACCESS
,
5854 &spr_read_generic
, &spr_write_generic
,
5859 static void register_power5p_lpar_sprs(CPUPPCState
*env
)
5861 #if !defined(CONFIG_USER_ONLY)
5862 /* Logical partitionning */
5863 spr_register_kvm_hv(env
, SPR_LPCR
, "LPCR",
5864 SPR_NOACCESS
, SPR_NOACCESS
,
5865 SPR_NOACCESS
, SPR_NOACCESS
,
5866 &spr_read_generic
, &spr_write_lpcr
,
5867 KVM_REG_PPC_LPCR
, LPCR_LPES0
| LPCR_LPES1
);
5868 spr_register_hv(env
, SPR_HDEC
, "HDEC",
5869 SPR_NOACCESS
, SPR_NOACCESS
,
5870 SPR_NOACCESS
, SPR_NOACCESS
,
5871 &spr_read_hdecr
, &spr_write_hdecr
, 0);
5875 static void register_book3s_ids_sprs(CPUPPCState
*env
)
5877 /* FIXME: Will need to deal with thread vs core only SPRs */
5879 /* Processor identification */
5880 spr_register_hv(env
, SPR_PIR
, "PIR",
5881 SPR_NOACCESS
, SPR_NOACCESS
,
5882 &spr_read_generic
, SPR_NOACCESS
,
5883 &spr_read_generic
, NULL
,
5885 spr_register_hv(env
, SPR_HID0
, "HID0",
5886 SPR_NOACCESS
, SPR_NOACCESS
,
5887 SPR_NOACCESS
, SPR_NOACCESS
,
5888 &spr_read_generic
, &spr_write_generic
,
5890 spr_register_hv(env
, SPR_TSCR
, "TSCR",
5891 SPR_NOACCESS
, SPR_NOACCESS
,
5892 SPR_NOACCESS
, SPR_NOACCESS
,
5893 &spr_read_generic
, &spr_write_generic
,
5895 spr_register_hv(env
, SPR_HMER
, "HMER",
5896 SPR_NOACCESS
, SPR_NOACCESS
,
5897 SPR_NOACCESS
, SPR_NOACCESS
,
5898 &spr_read_generic
, &spr_write_hmer
,
5900 spr_register_hv(env
, SPR_HMEER
, "HMEER",
5901 SPR_NOACCESS
, SPR_NOACCESS
,
5902 SPR_NOACCESS
, SPR_NOACCESS
,
5903 &spr_read_generic
, &spr_write_generic
,
5905 spr_register_hv(env
, SPR_TFMR
, "TFMR",
5906 SPR_NOACCESS
, SPR_NOACCESS
,
5907 SPR_NOACCESS
, SPR_NOACCESS
,
5908 &spr_read_generic
, &spr_write_generic
,
5910 spr_register_hv(env
, SPR_LPIDR
, "LPIDR",
5911 SPR_NOACCESS
, SPR_NOACCESS
,
5912 SPR_NOACCESS
, SPR_NOACCESS
,
5913 &spr_read_generic
, &spr_write_lpidr
,
5915 spr_register_hv(env
, SPR_HFSCR
, "HFSCR",
5916 SPR_NOACCESS
, SPR_NOACCESS
,
5917 SPR_NOACCESS
, SPR_NOACCESS
,
5918 &spr_read_generic
, &spr_write_generic
,
5920 spr_register_hv(env
, SPR_MMCRC
, "MMCRC",
5921 SPR_NOACCESS
, SPR_NOACCESS
,
5922 SPR_NOACCESS
, SPR_NOACCESS
,
5923 &spr_read_generic
, &spr_write_generic
,
5925 spr_register_hv(env
, SPR_MMCRH
, "MMCRH",
5926 SPR_NOACCESS
, SPR_NOACCESS
,
5927 SPR_NOACCESS
, SPR_NOACCESS
,
5928 &spr_read_generic
, &spr_write_generic
,
5930 spr_register_hv(env
, SPR_HSPRG0
, "HSPRG0",
5931 SPR_NOACCESS
, SPR_NOACCESS
,
5932 SPR_NOACCESS
, SPR_NOACCESS
,
5933 &spr_read_generic
, &spr_write_generic
,
5935 spr_register_hv(env
, SPR_HSPRG1
, "HSPRG1",
5936 SPR_NOACCESS
, SPR_NOACCESS
,
5937 SPR_NOACCESS
, SPR_NOACCESS
,
5938 &spr_read_generic
, &spr_write_generic
,
5940 spr_register_hv(env
, SPR_HSRR0
, "HSRR0",
5941 SPR_NOACCESS
, SPR_NOACCESS
,
5942 SPR_NOACCESS
, SPR_NOACCESS
,
5943 &spr_read_generic
, &spr_write_generic
,
5945 spr_register_hv(env
, SPR_HSRR1
, "HSRR1",
5946 SPR_NOACCESS
, SPR_NOACCESS
,
5947 SPR_NOACCESS
, SPR_NOACCESS
,
5948 &spr_read_generic
, &spr_write_generic
,
5950 spr_register_hv(env
, SPR_HDAR
, "HDAR",
5951 SPR_NOACCESS
, SPR_NOACCESS
,
5952 SPR_NOACCESS
, SPR_NOACCESS
,
5953 &spr_read_generic
, &spr_write_generic
,
5955 spr_register_hv(env
, SPR_HDSISR
, "HDSISR",
5956 SPR_NOACCESS
, SPR_NOACCESS
,
5957 SPR_NOACCESS
, SPR_NOACCESS
,
5958 &spr_read_generic
, &spr_write_generic
,
5960 spr_register_hv(env
, SPR_HRMOR
, "HRMOR",
5961 SPR_NOACCESS
, SPR_NOACCESS
,
5962 SPR_NOACCESS
, SPR_NOACCESS
,
5963 &spr_read_generic
, &spr_write_generic
,
5967 static void register_rmor_sprs(CPUPPCState
*env
)
5969 spr_register_hv(env
, SPR_RMOR
, "RMOR",
5970 SPR_NOACCESS
, SPR_NOACCESS
,
5971 SPR_NOACCESS
, SPR_NOACCESS
,
5972 &spr_read_generic
, &spr_write_generic
,
5976 static void register_power8_ids_sprs(CPUPPCState
*env
)
5978 /* Thread identification */
5979 spr_register(env
, SPR_TIR
, "TIR",
5980 SPR_NOACCESS
, SPR_NOACCESS
,
5981 &spr_read_generic
, SPR_NOACCESS
,
5985 static void register_book3s_purr_sprs(CPUPPCState
*env
)
5987 #if !defined(CONFIG_USER_ONLY)
5988 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
5989 spr_register_kvm_hv(env
, SPR_PURR
, "PURR",
5990 &spr_read_purr
, SPR_NOACCESS
,
5991 &spr_read_purr
, SPR_NOACCESS
,
5992 &spr_read_purr
, &spr_write_purr
,
5993 KVM_REG_PPC_PURR
, 0x00000000);
5994 spr_register_kvm_hv(env
, SPR_SPURR
, "SPURR",
5995 &spr_read_purr
, SPR_NOACCESS
,
5996 &spr_read_purr
, SPR_NOACCESS
,
5997 &spr_read_purr
, &spr_write_purr
,
5998 KVM_REG_PPC_SPURR
, 0x00000000);
6002 static void register_power6_dbg_sprs(CPUPPCState
*env
)
6004 #if !defined(CONFIG_USER_ONLY)
6005 spr_register(env
, SPR_CFAR
, "SPR_CFAR",
6006 SPR_NOACCESS
, SPR_NOACCESS
,
6007 &spr_read_cfar
, &spr_write_cfar
,
6012 static void register_power5p_common_sprs(CPUPPCState
*env
)
6014 spr_register_kvm(env
, SPR_PPR
, "PPR",
6015 &spr_read_generic
, &spr_write_generic
,
6016 &spr_read_generic
, &spr_write_generic
,
6017 KVM_REG_PPC_PPR
, 0x00000000);
6020 static void register_power6_common_sprs(CPUPPCState
*env
)
6022 #if !defined(CONFIG_USER_ONLY)
6023 spr_register_kvm(env
, SPR_DSCR
, "SPR_DSCR",
6024 SPR_NOACCESS
, SPR_NOACCESS
,
6025 &spr_read_generic
, &spr_write_generic
,
6026 KVM_REG_PPC_DSCR
, 0x00000000);
6029 * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
6030 * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
6032 spr_register_hv(env
, SPR_PCR
, "PCR",
6033 SPR_NOACCESS
, SPR_NOACCESS
,
6034 SPR_NOACCESS
, SPR_NOACCESS
,
6035 &spr_read_generic
, &spr_write_pcr
,
6039 static void register_power8_tce_address_control_sprs(CPUPPCState
*env
)
6041 spr_register_kvm(env
, SPR_TAR
, "TAR",
6042 &spr_read_tar
, &spr_write_tar
,
6043 &spr_read_generic
, &spr_write_generic
,
6044 KVM_REG_PPC_TAR
, 0x00000000);
6047 static void register_power8_tm_sprs(CPUPPCState
*env
)
6049 spr_register_kvm(env
, SPR_TFHAR
, "TFHAR",
6050 &spr_read_tm
, &spr_write_tm
,
6051 &spr_read_tm
, &spr_write_tm
,
6052 KVM_REG_PPC_TFHAR
, 0x00000000);
6053 spr_register_kvm(env
, SPR_TFIAR
, "TFIAR",
6054 &spr_read_tm
, &spr_write_tm
,
6055 &spr_read_tm
, &spr_write_tm
,
6056 KVM_REG_PPC_TFIAR
, 0x00000000);
6057 spr_register_kvm(env
, SPR_TEXASR
, "TEXASR",
6058 &spr_read_tm
, &spr_write_tm
,
6059 &spr_read_tm
, &spr_write_tm
,
6060 KVM_REG_PPC_TEXASR
, 0x00000000);
6061 spr_register(env
, SPR_TEXASRU
, "TEXASRU",
6062 &spr_read_tm_upper32
, &spr_write_tm_upper32
,
6063 &spr_read_tm_upper32
, &spr_write_tm_upper32
,
6067 static void register_power8_ebb_sprs(CPUPPCState
*env
)
6069 spr_register(env
, SPR_BESCRS
, "BESCRS",
6070 &spr_read_ebb
, &spr_write_ebb
,
6071 &spr_read_generic
, &spr_write_generic
,
6073 spr_register(env
, SPR_BESCRSU
, "BESCRSU",
6074 &spr_read_ebb_upper32
, &spr_write_ebb_upper32
,
6075 &spr_read_prev_upper32
, &spr_write_prev_upper32
,
6077 spr_register(env
, SPR_BESCRR
, "BESCRR",
6078 &spr_read_ebb
, &spr_write_ebb
,
6079 &spr_read_generic
, &spr_write_generic
,
6081 spr_register(env
, SPR_BESCRRU
, "BESCRRU",
6082 &spr_read_ebb_upper32
, &spr_write_ebb_upper32
,
6083 &spr_read_prev_upper32
, &spr_write_prev_upper32
,
6085 spr_register_kvm(env
, SPR_EBBHR
, "EBBHR",
6086 &spr_read_ebb
, &spr_write_ebb
,
6087 &spr_read_generic
, &spr_write_generic
,
6088 KVM_REG_PPC_EBBHR
, 0x00000000);
6089 spr_register_kvm(env
, SPR_EBBRR
, "EBBRR",
6090 &spr_read_ebb
, &spr_write_ebb
,
6091 &spr_read_generic
, &spr_write_generic
,
6092 KVM_REG_PPC_EBBRR
, 0x00000000);
6093 spr_register_kvm(env
, SPR_BESCR
, "BESCR",
6094 &spr_read_ebb
, &spr_write_ebb
,
6095 &spr_read_generic
, &spr_write_generic
,
6096 KVM_REG_PPC_BESCR
, 0x00000000);
6099 /* Virtual Time Base */
6100 static void register_vtb_sprs(CPUPPCState
*env
)
6102 spr_register_kvm_hv(env
, SPR_VTB
, "VTB",
6103 SPR_NOACCESS
, SPR_NOACCESS
,
6104 &spr_read_vtb
, SPR_NOACCESS
,
6105 &spr_read_vtb
, &spr_write_vtb
,
6106 KVM_REG_PPC_VTB
, 0x00000000);
6109 static void register_power8_fscr_sprs(CPUPPCState
*env
)
6111 #if defined(CONFIG_USER_ONLY)
6112 target_ulong initval
= 1ULL << FSCR_TAR
;
6114 target_ulong initval
= 0;
6116 spr_register_kvm(env
, SPR_FSCR
, "FSCR",
6117 SPR_NOACCESS
, SPR_NOACCESS
,
6118 &spr_read_generic
, &spr_write_generic
,
6119 KVM_REG_PPC_FSCR
, initval
);
6122 static void register_power8_pspb_sprs(CPUPPCState
*env
)
6124 spr_register_kvm(env
, SPR_PSPB
, "PSPB",
6125 SPR_NOACCESS
, SPR_NOACCESS
,
6126 &spr_read_generic
, &spr_write_generic32
,
6127 KVM_REG_PPC_PSPB
, 0);
6130 static void register_power8_dpdes_sprs(CPUPPCState
*env
)
6132 #if !defined(CONFIG_USER_ONLY)
6133 /* Directed Privileged Door-bell Exception State, used for IPI */
6134 spr_register_kvm_hv(env
, SPR_DPDES
, "DPDES",
6135 SPR_NOACCESS
, SPR_NOACCESS
,
6136 &spr_read_dpdes
, SPR_NOACCESS
,
6137 &spr_read_dpdes
, &spr_write_dpdes
,
6138 KVM_REG_PPC_DPDES
, 0x00000000);
6142 static void register_power8_ic_sprs(CPUPPCState
*env
)
6144 #if !defined(CONFIG_USER_ONLY)
6145 spr_register_hv(env
, SPR_IC
, "IC",
6146 SPR_NOACCESS
, SPR_NOACCESS
,
6147 &spr_read_generic
, SPR_NOACCESS
,
6148 &spr_read_generic
, &spr_write_generic
,
6153 static void register_power8_book4_sprs(CPUPPCState
*env
)
6155 /* Add a number of P8 book4 registers */
6156 #if !defined(CONFIG_USER_ONLY)
6157 spr_register_kvm(env
, SPR_ACOP
, "ACOP",
6158 SPR_NOACCESS
, SPR_NOACCESS
,
6159 &spr_read_generic
, &spr_write_generic
,
6160 KVM_REG_PPC_ACOP
, 0);
6161 spr_register_kvm(env
, SPR_BOOKS_PID
, "PID",
6162 SPR_NOACCESS
, SPR_NOACCESS
,
6163 &spr_read_generic
, &spr_write_pidr
,
6164 KVM_REG_PPC_PID
, 0);
6165 spr_register_kvm(env
, SPR_WORT
, "WORT",
6166 SPR_NOACCESS
, SPR_NOACCESS
,
6167 &spr_read_generic
, &spr_write_generic
,
6168 KVM_REG_PPC_WORT
, 0);
6172 static void register_power7_book4_sprs(CPUPPCState
*env
)
6174 /* Add a number of P7 book4 registers */
6175 #if !defined(CONFIG_USER_ONLY)
6176 spr_register_kvm(env
, SPR_ACOP
, "ACOP",
6177 SPR_NOACCESS
, SPR_NOACCESS
,
6178 &spr_read_generic
, &spr_write_generic
,
6179 KVM_REG_PPC_ACOP
, 0);
6180 spr_register_kvm(env
, SPR_BOOKS_PID
, "PID",
6181 SPR_NOACCESS
, SPR_NOACCESS
,
6182 &spr_read_generic
, &spr_write_generic
,
6183 KVM_REG_PPC_PID
, 0);
6187 static void register_power8_rpr_sprs(CPUPPCState
*env
)
6189 #if !defined(CONFIG_USER_ONLY)
6190 spr_register_hv(env
, SPR_RPR
, "RPR",
6191 SPR_NOACCESS
, SPR_NOACCESS
,
6192 SPR_NOACCESS
, SPR_NOACCESS
,
6193 &spr_read_generic
, &spr_write_generic
,
6194 0x00000103070F1F3F);
6198 static void register_power9_mmu_sprs(CPUPPCState
*env
)
6200 #if !defined(CONFIG_USER_ONLY)
6201 /* Partition Table Control */
6202 spr_register_kvm_hv(env
, SPR_PTCR
, "PTCR",
6203 SPR_NOACCESS
, SPR_NOACCESS
,
6204 SPR_NOACCESS
, SPR_NOACCESS
,
6205 &spr_read_generic
, &spr_write_ptcr
,
6206 KVM_REG_PPC_PTCR
, 0x00000000);
6207 /* Address Segment Descriptor Register */
6208 spr_register_hv(env
, SPR_ASDR
, "ASDR",
6209 SPR_NOACCESS
, SPR_NOACCESS
,
6210 SPR_NOACCESS
, SPR_NOACCESS
,
6211 &spr_read_generic
, &spr_write_generic
,
6212 0x0000000000000000);
6217 * Initialize PMU counter overflow timers for Power8 and
6218 * newer Power chips when using TCG.
6220 static void init_tcg_pmu_power8(CPUPPCState
*env
)
6222 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
6223 /* Init PMU overflow timers */
6224 if (!kvm_enabled()) {
6225 cpu_ppc_pmu_init(env
);
6230 static void init_proc_book3s_common(CPUPPCState
*env
)
6232 register_ne_601_sprs(env
);
6233 register_usprg3_sprs(env
);
6234 register_book3s_altivec_sprs(env
);
6235 register_book3s_pmu_sup_sprs(env
);
6236 register_book3s_pmu_user_sprs(env
);
6237 register_book3s_ctrl_sprs(env
);
6239 * Can't find information on what this should be on reset. This
6240 * value is the one used by 74xx processors.
6242 vscr_init(env
, 0x00010000);
6245 static void init_proc_970(CPUPPCState
*env
)
6247 /* Common Registers */
6248 init_proc_book3s_common(env
);
6249 register_sdr1_sprs(env
);
6250 register_book3s_dbg_sprs(env
);
6252 /* 970 Specific Registers */
6253 register_970_hid_sprs(env
);
6254 register_970_hior_sprs(env
);
6255 register_low_BATs(env
);
6256 register_970_pmu_sup_sprs(env
);
6257 register_970_pmu_user_sprs(env
);
6258 register_970_lpar_sprs(env
);
6259 register_970_dbg_sprs(env
);
6262 env
->dcache_line_size
= 128;
6263 env
->icache_line_size
= 128;
6265 /* Allocate hardware IRQ controller */
6267 ppc970_irq_init(env_archcpu(env
));
6270 POWERPC_FAMILY(970)(ObjectClass
*oc
, void *data
)
6272 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6273 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6275 dc
->desc
= "PowerPC 970";
6276 pcc
->init_proc
= init_proc_970
;
6277 pcc
->check_pow
= check_pow_970
;
6278 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
6279 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6280 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6282 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6283 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6284 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6285 PPC_64B
| PPC_ALTIVEC
|
6286 PPC_SEGMENT_64B
| PPC_SLBI
;
6287 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
6288 pcc
->msr_mask
= (1ull << MSR_SF
) |
6303 pcc
->mmu_model
= POWERPC_MMU_64B
;
6304 #if defined(CONFIG_SOFTMMU)
6305 pcc
->hash64_opts
= &ppc_hash64_opts_basic
;
6307 pcc
->excp_model
= POWERPC_EXCP_970
;
6308 pcc
->bus_model
= PPC_FLAGS_INPUT_970
;
6309 pcc
->bfd_mach
= bfd_mach_ppc64
;
6310 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6311 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6312 POWERPC_FLAG_BUS_CLK
;
6313 pcc
->l1_dcache_size
= 0x8000;
6314 pcc
->l1_icache_size
= 0x10000;
6317 static void init_proc_power5plus(CPUPPCState
*env
)
6319 /* Common Registers */
6320 init_proc_book3s_common(env
);
6321 register_sdr1_sprs(env
);
6322 register_book3s_dbg_sprs(env
);
6324 /* POWER5+ Specific Registers */
6325 register_970_hid_sprs(env
);
6326 register_970_hior_sprs(env
);
6327 register_low_BATs(env
);
6328 register_970_pmu_sup_sprs(env
);
6329 register_970_pmu_user_sprs(env
);
6330 register_power5p_common_sprs(env
);
6331 register_power5p_lpar_sprs(env
);
6332 register_power5p_ear_sprs(env
);
6333 register_power5p_tb_sprs(env
);
6336 env
->dcache_line_size
= 128;
6337 env
->icache_line_size
= 128;
6339 /* Allocate hardware IRQ controller */
6341 ppc970_irq_init(env_archcpu(env
));
6344 POWERPC_FAMILY(POWER5P
)(ObjectClass
*oc
, void *data
)
6346 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6347 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6349 dc
->fw_name
= "PowerPC,POWER5";
6350 dc
->desc
= "POWER5+";
6351 pcc
->init_proc
= init_proc_power5plus
;
6352 pcc
->check_pow
= check_pow_970
;
6353 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
6354 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6355 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6358 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6359 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6360 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6363 PPC_SEGMENT_64B
| PPC_SLBI
;
6364 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
6365 pcc
->msr_mask
= (1ull << MSR_SF
) |
6380 pcc
->lpcr_mask
= LPCR_RMLS
| LPCR_ILE
| LPCR_LPES0
| LPCR_LPES1
|
6381 LPCR_RMI
| LPCR_HDICE
;
6382 pcc
->mmu_model
= POWERPC_MMU_2_03
;
6383 #if defined(CONFIG_SOFTMMU)
6384 pcc
->hash64_opts
= &ppc_hash64_opts_basic
;
6385 pcc
->lrg_decr_bits
= 32;
6387 pcc
->excp_model
= POWERPC_EXCP_970
;
6388 pcc
->bus_model
= PPC_FLAGS_INPUT_970
;
6389 pcc
->bfd_mach
= bfd_mach_ppc64
;
6390 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6391 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6392 POWERPC_FLAG_BUS_CLK
;
6393 pcc
->l1_dcache_size
= 0x8000;
6394 pcc
->l1_icache_size
= 0x10000;
6397 static void init_proc_POWER7(CPUPPCState
*env
)
6399 /* Common Registers */
6400 init_proc_book3s_common(env
);
6401 register_sdr1_sprs(env
);
6402 register_book3s_dbg_sprs(env
);
6404 /* POWER7 Specific Registers */
6405 register_book3s_ids_sprs(env
);
6406 register_rmor_sprs(env
);
6407 register_amr_sprs(env
);
6408 register_book3s_purr_sprs(env
);
6409 register_power5p_common_sprs(env
);
6410 register_power5p_lpar_sprs(env
);
6411 register_power5p_ear_sprs(env
);
6412 register_power5p_tb_sprs(env
);
6413 register_power6_common_sprs(env
);
6414 register_power6_dbg_sprs(env
);
6415 register_power7_book4_sprs(env
);
6418 env
->dcache_line_size
= 128;
6419 env
->icache_line_size
= 128;
6421 /* Allocate hardware IRQ controller */
6422 init_excp_POWER7(env
);
6423 ppcPOWER7_irq_init(env_archcpu(env
));
6426 static bool ppc_pvr_match_power7(PowerPCCPUClass
*pcc
, uint32_t pvr
)
6428 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER7P_BASE
) {
6431 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER7_BASE
) {
6437 static bool cpu_has_work_POWER7(CPUState
*cs
)
6439 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
6440 CPUPPCState
*env
= &cpu
->env
;
6443 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
6446 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
6447 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE0
)) {
6450 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
6451 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE1
)) {
6454 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
)) &&
6455 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE2
)) {
6458 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HMI
)) &&
6459 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE2
)) {
6462 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
6467 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
6471 POWERPC_FAMILY(POWER7
)(ObjectClass
*oc
, void *data
)
6473 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6474 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6475 CPUClass
*cc
= CPU_CLASS(oc
);
6477 dc
->fw_name
= "PowerPC,POWER7";
6478 dc
->desc
= "POWER7";
6479 pcc
->pvr_match
= ppc_pvr_match_power7
;
6480 pcc
->pcr_mask
= PCR_VEC_DIS
| PCR_VSX_DIS
| PCR_COMPAT_2_05
;
6481 pcc
->pcr_supported
= PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
6482 pcc
->init_proc
= init_proc_POWER7
;
6483 pcc
->check_pow
= check_pow_nocheck
;
6484 cc
->has_work
= cpu_has_work_POWER7
;
6485 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
6486 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6487 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6488 PPC_FLOAT_FRSQRTES
|
6491 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6492 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6493 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6494 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
6495 PPC_SEGMENT_64B
| PPC_SLBI
|
6496 PPC_POPCNTB
| PPC_POPCNTWD
|
6498 pcc
->insns_flags2
= PPC2_VSX
| PPC2_DFP
| PPC2_DBRX
| PPC2_ISA205
|
6499 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
6500 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
6501 PPC2_FP_TST_ISA206
| PPC2_FP_CVT_S64
|
6503 pcc
->msr_mask
= (1ull << MSR_SF
) |
6519 pcc
->lpcr_mask
= LPCR_VPM0
| LPCR_VPM1
| LPCR_ISL
| LPCR_DPFD
|
6520 LPCR_VRMASD
| LPCR_RMLS
| LPCR_ILE
|
6521 LPCR_P7_PECE0
| LPCR_P7_PECE1
| LPCR_P7_PECE2
|
6522 LPCR_MER
| LPCR_TC
|
6523 LPCR_LPES0
| LPCR_LPES1
| LPCR_HDICE
;
6524 pcc
->lpcr_pm
= LPCR_P7_PECE0
| LPCR_P7_PECE1
| LPCR_P7_PECE2
;
6525 pcc
->mmu_model
= POWERPC_MMU_2_06
;
6526 #if defined(CONFIG_SOFTMMU)
6527 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
6528 pcc
->lrg_decr_bits
= 32;
6530 pcc
->excp_model
= POWERPC_EXCP_POWER7
;
6531 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER7
;
6532 pcc
->bfd_mach
= bfd_mach_ppc64
;
6533 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6534 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6535 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
6537 pcc
->l1_dcache_size
= 0x8000;
6538 pcc
->l1_icache_size
= 0x8000;
6541 static void init_proc_POWER8(CPUPPCState
*env
)
6543 /* Common Registers */
6544 init_proc_book3s_common(env
);
6545 register_sdr1_sprs(env
);
6546 register_book3s_207_dbg_sprs(env
);
6548 /* Common TCG PMU */
6549 init_tcg_pmu_power8(env
);
6551 /* POWER8 Specific Registers */
6552 register_book3s_ids_sprs(env
);
6553 register_rmor_sprs(env
);
6554 register_amr_sprs(env
);
6555 register_iamr_sprs(env
);
6556 register_book3s_purr_sprs(env
);
6557 register_power5p_common_sprs(env
);
6558 register_power5p_lpar_sprs(env
);
6559 register_power5p_ear_sprs(env
);
6560 register_power5p_tb_sprs(env
);
6561 register_power6_common_sprs(env
);
6562 register_power6_dbg_sprs(env
);
6563 register_power8_tce_address_control_sprs(env
);
6564 register_power8_ids_sprs(env
);
6565 register_power8_ebb_sprs(env
);
6566 register_power8_fscr_sprs(env
);
6567 register_power8_pmu_sup_sprs(env
);
6568 register_power8_pmu_user_sprs(env
);
6569 register_power8_tm_sprs(env
);
6570 register_power8_pspb_sprs(env
);
6571 register_power8_dpdes_sprs(env
);
6572 register_vtb_sprs(env
);
6573 register_power8_ic_sprs(env
);
6574 register_power8_book4_sprs(env
);
6575 register_power8_rpr_sprs(env
);
6578 env
->dcache_line_size
= 128;
6579 env
->icache_line_size
= 128;
6581 /* Allocate hardware IRQ controller */
6582 init_excp_POWER8(env
);
6583 ppcPOWER7_irq_init(env_archcpu(env
));
6586 static bool ppc_pvr_match_power8(PowerPCCPUClass
*pcc
, uint32_t pvr
)
6588 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8NVL_BASE
) {
6591 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8E_BASE
) {
6594 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8_BASE
) {
6600 static bool cpu_has_work_POWER8(CPUState
*cs
)
6602 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
6603 CPUPPCState
*env
= &cpu
->env
;
6606 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
6609 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
6610 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE2
)) {
6613 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
6614 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE3
)) {
6617 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
)) &&
6618 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE4
)) {
6621 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HMI
)) &&
6622 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE4
)) {
6625 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
6626 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE0
)) {
6629 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
6630 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE1
)) {
6633 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
6638 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
6642 POWERPC_FAMILY(POWER8
)(ObjectClass
*oc
, void *data
)
6644 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6645 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6646 CPUClass
*cc
= CPU_CLASS(oc
);
6648 dc
->fw_name
= "PowerPC,POWER8";
6649 dc
->desc
= "POWER8";
6650 pcc
->pvr_match
= ppc_pvr_match_power8
;
6651 pcc
->pcr_mask
= PCR_TM_DIS
| PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
6652 pcc
->pcr_supported
= PCR_COMPAT_2_07
| PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
6653 pcc
->init_proc
= init_proc_POWER8
;
6654 pcc
->check_pow
= check_pow_nocheck
;
6655 cc
->has_work
= cpu_has_work_POWER8
;
6656 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
6657 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6658 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6659 PPC_FLOAT_FRSQRTES
|
6662 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6663 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6664 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6665 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
6666 PPC_SEGMENT_64B
| PPC_SLBI
|
6667 PPC_POPCNTB
| PPC_POPCNTWD
|
6669 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
6670 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
6671 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
6672 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
6673 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
6674 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
6675 PPC2_TM
| PPC2_PM_ISA206
;
6676 pcc
->msr_mask
= (1ull << MSR_SF
) |
6696 pcc
->lpcr_mask
= LPCR_VPM0
| LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
|
6697 LPCR_DPFD
| LPCR_VRMASD
| LPCR_RMLS
| LPCR_ILE
|
6698 LPCR_AIL
| LPCR_ONL
| LPCR_P8_PECE0
| LPCR_P8_PECE1
|
6699 LPCR_P8_PECE2
| LPCR_P8_PECE3
| LPCR_P8_PECE4
|
6700 LPCR_MER
| LPCR_TC
| LPCR_LPES0
| LPCR_HDICE
;
6701 pcc
->lpcr_pm
= LPCR_P8_PECE0
| LPCR_P8_PECE1
| LPCR_P8_PECE2
|
6702 LPCR_P8_PECE3
| LPCR_P8_PECE4
;
6703 pcc
->mmu_model
= POWERPC_MMU_2_07
;
6704 #if defined(CONFIG_SOFTMMU)
6705 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
6706 pcc
->lrg_decr_bits
= 32;
6707 pcc
->n_host_threads
= 8;
6709 pcc
->excp_model
= POWERPC_EXCP_POWER8
;
6710 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER7
;
6711 pcc
->bfd_mach
= bfd_mach_ppc64
;
6712 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6713 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6714 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
6715 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
;
6716 pcc
->l1_dcache_size
= 0x8000;
6717 pcc
->l1_icache_size
= 0x8000;
6720 #ifdef CONFIG_SOFTMMU
6722 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
6723 * Encoded as array of int_32s in the form:
6724 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
6726 * y -> radix mode supported page size (encoded as a shift)
6728 static struct ppc_radix_page_info POWER9_radix_page_info
= {
6731 0x0000000c, /* 4K - enc: 0x0 */
6732 0xa0000010, /* 64K - enc: 0x5 */
6733 0x20000015, /* 2M - enc: 0x1 */
6734 0x4000001e /* 1G - enc: 0x2 */
6737 #endif /* CONFIG_SOFTMMU */
6739 static void init_proc_POWER9(CPUPPCState
*env
)
6741 /* Common Registers */
6742 init_proc_book3s_common(env
);
6743 register_book3s_207_dbg_sprs(env
);
6745 /* Common TCG PMU */
6746 init_tcg_pmu_power8(env
);
6748 /* POWER8 Specific Registers */
6749 register_book3s_ids_sprs(env
);
6750 register_amr_sprs(env
);
6751 register_iamr_sprs(env
);
6752 register_book3s_purr_sprs(env
);
6753 register_power5p_common_sprs(env
);
6754 register_power5p_lpar_sprs(env
);
6755 register_power5p_ear_sprs(env
);
6756 register_power5p_tb_sprs(env
);
6757 register_power6_common_sprs(env
);
6758 register_power6_dbg_sprs(env
);
6759 register_power8_tce_address_control_sprs(env
);
6760 register_power8_ids_sprs(env
);
6761 register_power8_ebb_sprs(env
);
6762 register_power8_fscr_sprs(env
);
6763 register_power8_pmu_sup_sprs(env
);
6764 register_power8_pmu_user_sprs(env
);
6765 register_power8_tm_sprs(env
);
6766 register_power8_pspb_sprs(env
);
6767 register_power8_dpdes_sprs(env
);
6768 register_vtb_sprs(env
);
6769 register_power8_ic_sprs(env
);
6770 register_power8_book4_sprs(env
);
6771 register_power8_rpr_sprs(env
);
6772 register_power9_mmu_sprs(env
);
6774 /* POWER9 Specific registers */
6775 spr_register_kvm(env
, SPR_TIDR
, "TIDR", NULL
, NULL
,
6776 spr_read_generic
, spr_write_generic
,
6777 KVM_REG_PPC_TIDR
, 0);
6779 /* FIXME: Filter fields properly based on privilege level */
6780 spr_register_kvm_hv(env
, SPR_PSSCR
, "PSSCR", NULL
, NULL
, NULL
, NULL
,
6781 spr_read_generic
, spr_write_generic
,
6782 KVM_REG_PPC_PSSCR
, 0);
6785 env
->dcache_line_size
= 128;
6786 env
->icache_line_size
= 128;
6788 /* Allocate hardware IRQ controller */
6789 init_excp_POWER9(env
);
6790 ppcPOWER9_irq_init(env_archcpu(env
));
6793 static bool ppc_pvr_match_power9(PowerPCCPUClass
*pcc
, uint32_t pvr
)
6795 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER9_BASE
) {
6801 static bool cpu_has_work_POWER9(CPUState
*cs
)
6803 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
6804 CPUPPCState
*env
= &cpu
->env
;
6807 uint64_t psscr
= env
->spr
[SPR_PSSCR
];
6809 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
6813 /* If EC is clear, just return true on any pending interrupt */
6814 if (!(psscr
& PSSCR_EC
)) {
6817 /* External Exception */
6818 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
6819 (env
->spr
[SPR_LPCR
] & LPCR_EEE
)) {
6820 bool heic
= !!(env
->spr
[SPR_LPCR
] & LPCR_HEIC
);
6821 if (heic
== 0 || !msr_hv
|| msr_pr
) {
6825 /* Decrementer Exception */
6826 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
6827 (env
->spr
[SPR_LPCR
] & LPCR_DEE
)) {
6830 /* Machine Check or Hypervisor Maintenance Exception */
6831 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
|
6832 1u << PPC_INTERRUPT_HMI
)) && (env
->spr
[SPR_LPCR
] & LPCR_OEE
)) {
6835 /* Privileged Doorbell Exception */
6836 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
6837 (env
->spr
[SPR_LPCR
] & LPCR_PDEE
)) {
6840 /* Hypervisor Doorbell Exception */
6841 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
6842 (env
->spr
[SPR_LPCR
] & LPCR_HDEE
)) {
6845 /* Hypervisor virtualization exception */
6846 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HVIRT
)) &&
6847 (env
->spr
[SPR_LPCR
] & LPCR_HVEE
)) {
6850 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
6855 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
6859 POWERPC_FAMILY(POWER9
)(ObjectClass
*oc
, void *data
)
6861 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6862 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6863 CPUClass
*cc
= CPU_CLASS(oc
);
6865 dc
->fw_name
= "PowerPC,POWER9";
6866 dc
->desc
= "POWER9";
6867 pcc
->pvr_match
= ppc_pvr_match_power9
;
6868 pcc
->pcr_mask
= PCR_COMPAT_2_05
| PCR_COMPAT_2_06
| PCR_COMPAT_2_07
;
6869 pcc
->pcr_supported
= PCR_COMPAT_3_00
| PCR_COMPAT_2_07
| PCR_COMPAT_2_06
|
6871 pcc
->init_proc
= init_proc_POWER9
;
6872 pcc
->check_pow
= check_pow_nocheck
;
6873 cc
->has_work
= cpu_has_work_POWER9
;
6874 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
6875 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6876 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6877 PPC_FLOAT_FRSQRTES
|
6880 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6881 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6883 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
6884 PPC_SEGMENT_64B
| PPC_SLBI
|
6885 PPC_POPCNTB
| PPC_POPCNTWD
|
6887 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
6888 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
6889 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
6890 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
6891 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
6892 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
6893 PPC2_TM
| PPC2_ISA300
| PPC2_PRCNTL
;
6894 pcc
->msr_mask
= (1ull << MSR_SF
) |
6912 pcc
->lpcr_mask
= LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
| LPCR_DPFD
|
6913 (LPCR_PECE_U_MASK
& LPCR_HVEE
) | LPCR_ILE
| LPCR_AIL
|
6914 LPCR_UPRT
| LPCR_EVIRT
| LPCR_ONL
| LPCR_HR
| LPCR_LD
|
6915 (LPCR_PECE_L_MASK
& (LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
|
6916 LPCR_DEE
| LPCR_OEE
))
6917 | LPCR_MER
| LPCR_GTSE
| LPCR_TC
|
6918 LPCR_HEIC
| LPCR_LPES0
| LPCR_HVICE
| LPCR_HDICE
;
6919 pcc
->lpcr_pm
= LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
| LPCR_DEE
| LPCR_OEE
;
6920 pcc
->mmu_model
= POWERPC_MMU_3_00
;
6921 #if defined(CONFIG_SOFTMMU)
6922 /* segment page size remain the same */
6923 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
6924 pcc
->radix_page_info
= &POWER9_radix_page_info
;
6925 pcc
->lrg_decr_bits
= 56;
6926 pcc
->n_host_threads
= 4;
6928 pcc
->excp_model
= POWERPC_EXCP_POWER9
;
6929 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER9
;
6930 pcc
->bfd_mach
= bfd_mach_ppc64
;
6931 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6932 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6933 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
6934 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
| POWERPC_FLAG_SCV
;
6935 pcc
->l1_dcache_size
= 0x8000;
6936 pcc
->l1_icache_size
= 0x8000;
6939 #ifdef CONFIG_SOFTMMU
6941 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
6942 * Encoded as array of int_32s in the form:
6943 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
6945 * y -> radix mode supported page size (encoded as a shift)
6947 static struct ppc_radix_page_info POWER10_radix_page_info
= {
6950 0x0000000c, /* 4K - enc: 0x0 */
6951 0xa0000010, /* 64K - enc: 0x5 */
6952 0x20000015, /* 2M - enc: 0x1 */
6953 0x4000001e /* 1G - enc: 0x2 */
6956 #endif /* CONFIG_SOFTMMU */
6958 static void init_proc_POWER10(CPUPPCState
*env
)
6960 /* Common Registers */
6961 init_proc_book3s_common(env
);
6962 register_book3s_207_dbg_sprs(env
);
6964 /* Common TCG PMU */
6965 init_tcg_pmu_power8(env
);
6967 /* POWER8 Specific Registers */
6968 register_book3s_ids_sprs(env
);
6969 register_amr_sprs(env
);
6970 register_iamr_sprs(env
);
6971 register_book3s_purr_sprs(env
);
6972 register_power5p_common_sprs(env
);
6973 register_power5p_lpar_sprs(env
);
6974 register_power5p_ear_sprs(env
);
6975 register_power6_common_sprs(env
);
6976 register_power6_dbg_sprs(env
);
6977 register_power8_tce_address_control_sprs(env
);
6978 register_power8_ids_sprs(env
);
6979 register_power8_ebb_sprs(env
);
6980 register_power8_fscr_sprs(env
);
6981 register_power8_pmu_sup_sprs(env
);
6982 register_power8_pmu_user_sprs(env
);
6983 register_power8_tm_sprs(env
);
6984 register_power8_pspb_sprs(env
);
6985 register_vtb_sprs(env
);
6986 register_power8_ic_sprs(env
);
6987 register_power8_book4_sprs(env
);
6988 register_power8_rpr_sprs(env
);
6989 register_power9_mmu_sprs(env
);
6991 /* FIXME: Filter fields properly based on privilege level */
6992 spr_register_kvm_hv(env
, SPR_PSSCR
, "PSSCR", NULL
, NULL
, NULL
, NULL
,
6993 spr_read_generic
, spr_write_generic
,
6994 KVM_REG_PPC_PSSCR
, 0);
6997 env
->dcache_line_size
= 128;
6998 env
->icache_line_size
= 128;
7000 /* Allocate hardware IRQ controller */
7001 init_excp_POWER10(env
);
7002 ppcPOWER9_irq_init(env_archcpu(env
));
7005 static bool ppc_pvr_match_power10(PowerPCCPUClass
*pcc
, uint32_t pvr
)
7007 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER10_BASE
) {
7013 static bool cpu_has_work_POWER10(CPUState
*cs
)
7015 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7016 CPUPPCState
*env
= &cpu
->env
;
7019 uint64_t psscr
= env
->spr
[SPR_PSSCR
];
7021 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
7025 /* If EC is clear, just return true on any pending interrupt */
7026 if (!(psscr
& PSSCR_EC
)) {
7029 /* External Exception */
7030 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
7031 (env
->spr
[SPR_LPCR
] & LPCR_EEE
)) {
7032 bool heic
= !!(env
->spr
[SPR_LPCR
] & LPCR_HEIC
);
7033 if (heic
== 0 || !msr_hv
|| msr_pr
) {
7037 /* Decrementer Exception */
7038 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
7039 (env
->spr
[SPR_LPCR
] & LPCR_DEE
)) {
7042 /* Machine Check or Hypervisor Maintenance Exception */
7043 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
|
7044 1u << PPC_INTERRUPT_HMI
)) && (env
->spr
[SPR_LPCR
] & LPCR_OEE
)) {
7047 /* Privileged Doorbell Exception */
7048 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
7049 (env
->spr
[SPR_LPCR
] & LPCR_PDEE
)) {
7052 /* Hypervisor Doorbell Exception */
7053 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
7054 (env
->spr
[SPR_LPCR
] & LPCR_HDEE
)) {
7057 /* Hypervisor virtualization exception */
7058 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HVIRT
)) &&
7059 (env
->spr
[SPR_LPCR
] & LPCR_HVEE
)) {
7062 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
7067 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
7071 POWERPC_FAMILY(POWER10
)(ObjectClass
*oc
, void *data
)
7073 DeviceClass
*dc
= DEVICE_CLASS(oc
);
7074 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7075 CPUClass
*cc
= CPU_CLASS(oc
);
7077 dc
->fw_name
= "PowerPC,POWER10";
7078 dc
->desc
= "POWER10";
7079 pcc
->pvr_match
= ppc_pvr_match_power10
;
7080 pcc
->pcr_mask
= PCR_COMPAT_2_05
| PCR_COMPAT_2_06
| PCR_COMPAT_2_07
|
7082 pcc
->pcr_supported
= PCR_COMPAT_3_10
| PCR_COMPAT_3_00
| PCR_COMPAT_2_07
|
7083 PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
7084 pcc
->init_proc
= init_proc_POWER10
;
7085 pcc
->check_pow
= check_pow_nocheck
;
7086 cc
->has_work
= cpu_has_work_POWER10
;
7087 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
7088 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
7089 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
7090 PPC_FLOAT_FRSQRTES
|
7093 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
7094 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
7096 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
7097 PPC_SEGMENT_64B
| PPC_SLBI
|
7098 PPC_POPCNTB
| PPC_POPCNTWD
|
7100 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
7101 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
7102 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
7103 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
7104 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
7105 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
7106 PPC2_TM
| PPC2_ISA300
| PPC2_PRCNTL
| PPC2_ISA310
;
7107 pcc
->msr_mask
= (1ull << MSR_SF
) |
7125 pcc
->lpcr_mask
= LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
| LPCR_DPFD
|
7126 (LPCR_PECE_U_MASK
& LPCR_HVEE
) | LPCR_ILE
| LPCR_AIL
|
7127 LPCR_UPRT
| LPCR_EVIRT
| LPCR_ONL
| LPCR_HR
| LPCR_LD
|
7128 (LPCR_PECE_L_MASK
& (LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
|
7129 LPCR_DEE
| LPCR_OEE
))
7130 | LPCR_MER
| LPCR_GTSE
| LPCR_TC
|
7131 LPCR_HEIC
| LPCR_LPES0
| LPCR_HVICE
| LPCR_HDICE
;
7132 /* DD2 adds an extra HAIL bit */
7133 pcc
->lpcr_mask
|= LPCR_HAIL
;
7135 pcc
->lpcr_pm
= LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
| LPCR_DEE
| LPCR_OEE
;
7136 pcc
->mmu_model
= POWERPC_MMU_3_00
;
7137 #if defined(CONFIG_SOFTMMU)
7138 /* segment page size remain the same */
7139 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
7140 pcc
->radix_page_info
= &POWER10_radix_page_info
;
7141 pcc
->lrg_decr_bits
= 56;
7143 pcc
->excp_model
= POWERPC_EXCP_POWER10
;
7144 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER9
;
7145 pcc
->bfd_mach
= bfd_mach_ppc64
;
7146 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
7147 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
7148 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
7149 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
| POWERPC_FLAG_SCV
;
7150 pcc
->l1_dcache_size
= 0x8000;
7151 pcc
->l1_icache_size
= 0x8000;
7154 #if !defined(CONFIG_USER_ONLY)
7155 void cpu_ppc_set_vhyp(PowerPCCPU
*cpu
, PPCVirtualHypervisor
*vhyp
)
7157 CPUPPCState
*env
= &cpu
->env
;
7162 * With a virtual hypervisor mode we never allow the CPU to go
7163 * hypervisor mode itself
7165 env
->msr_mask
&= ~MSR_HVB
;
7168 #endif /* !defined(CONFIG_USER_ONLY) */
7170 #endif /* defined(TARGET_PPC64) */
7172 /*****************************************************************************/
7173 /* Generic CPU instantiation routine */
7174 static void init_ppc_proc(PowerPCCPU
*cpu
)
7176 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7177 CPUPPCState
*env
= &cpu
->env
;
7178 #if !defined(CONFIG_USER_ONLY)
7181 env
->irq_inputs
= NULL
;
7182 /* Set all exception vectors to an invalid address */
7183 for (i
= 0; i
< POWERPC_EXCP_NB
; i
++) {
7184 env
->excp_vectors
[i
] = (target_ulong
)(-1ULL);
7186 env
->ivor_mask
= 0x00000000;
7187 env
->ivpr_mask
= 0x00000000;
7188 /* Default MMU definitions */
7192 env
->tlb_type
= TLB_NONE
;
7194 /* Register SPR common to all PowerPC implementations */
7195 register_generic_sprs(cpu
);
7197 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
7198 (*pcc
->init_proc
)(env
);
7200 #if !defined(CONFIG_USER_ONLY)
7201 ppc_gdb_gen_spr_xml(cpu
);
7204 /* MSR bits & flags consistency checks */
7205 if (env
->msr_mask
& (1 << 25)) {
7206 switch (env
->flags
& (POWERPC_FLAG_SPE
| POWERPC_FLAG_VRE
)) {
7207 case POWERPC_FLAG_SPE
:
7208 case POWERPC_FLAG_VRE
:
7211 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7212 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
7215 } else if (env
->flags
& (POWERPC_FLAG_SPE
| POWERPC_FLAG_VRE
)) {
7216 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7217 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
7220 if (env
->msr_mask
& (1 << 17)) {
7221 switch (env
->flags
& (POWERPC_FLAG_TGPR
| POWERPC_FLAG_CE
)) {
7222 case POWERPC_FLAG_TGPR
:
7223 case POWERPC_FLAG_CE
:
7226 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7227 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
7230 } else if (env
->flags
& (POWERPC_FLAG_TGPR
| POWERPC_FLAG_CE
)) {
7231 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7232 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
7235 if (env
->msr_mask
& (1 << 10)) {
7236 switch (env
->flags
& (POWERPC_FLAG_SE
| POWERPC_FLAG_DWE
|
7237 POWERPC_FLAG_UBLE
)) {
7238 case POWERPC_FLAG_SE
:
7239 case POWERPC_FLAG_DWE
:
7240 case POWERPC_FLAG_UBLE
:
7243 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7244 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
7245 "POWERPC_FLAG_UBLE\n");
7248 } else if (env
->flags
& (POWERPC_FLAG_SE
| POWERPC_FLAG_DWE
|
7249 POWERPC_FLAG_UBLE
)) {
7250 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7251 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
7252 "POWERPC_FLAG_UBLE\n");
7255 if (env
->msr_mask
& (1 << 9)) {
7256 switch (env
->flags
& (POWERPC_FLAG_BE
| POWERPC_FLAG_DE
)) {
7257 case POWERPC_FLAG_BE
:
7258 case POWERPC_FLAG_DE
:
7261 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7262 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
7265 } else if (env
->flags
& (POWERPC_FLAG_BE
| POWERPC_FLAG_DE
)) {
7266 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7267 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
7270 if (env
->msr_mask
& (1 << 2)) {
7271 switch (env
->flags
& (POWERPC_FLAG_PX
| POWERPC_FLAG_PMM
)) {
7272 case POWERPC_FLAG_PX
:
7273 case POWERPC_FLAG_PMM
:
7276 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7277 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
7280 } else if (env
->flags
& (POWERPC_FLAG_PX
| POWERPC_FLAG_PMM
)) {
7281 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7282 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
7285 if ((env
->flags
& POWERPC_FLAG_BUS_CLK
) == 0) {
7286 fprintf(stderr
, "PowerPC flags inconsistency\n"
7287 "Should define the time-base and decrementer clock source\n");
7290 /* Allocate TLBs buffer when needed */
7291 #if !defined(CONFIG_USER_ONLY)
7292 if (env
->nb_tlb
!= 0) {
7293 int nb_tlb
= env
->nb_tlb
;
7294 if (env
->id_tlbs
!= 0) {
7297 switch (env
->tlb_type
) {
7299 env
->tlb
.tlb6
= g_new0(ppc6xx_tlb_t
, nb_tlb
);
7302 env
->tlb
.tlbe
= g_new0(ppcemb_tlb_t
, nb_tlb
);
7305 env
->tlb
.tlbm
= g_new0(ppcmas_tlb_t
, nb_tlb
);
7308 /* Pre-compute some useful values */
7309 env
->tlb_per_way
= env
->nb_tlb
/ env
->nb_ways
;
7311 if (env
->irq_inputs
== NULL
) {
7312 warn_report("no internal IRQ controller registered."
7313 " Attempt QEMU to crash very soon !");
7316 if (env
->check_pow
== NULL
) {
7317 warn_report("no power management check handler registered."
7318 " Attempt QEMU to crash very soon !");
7323 static void ppc_cpu_realize(DeviceState
*dev
, Error
**errp
)
7325 CPUState
*cs
= CPU(dev
);
7326 PowerPCCPU
*cpu
= POWERPC_CPU(dev
);
7327 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7328 Error
*local_err
= NULL
;
7330 cpu_exec_realizefn(cs
, &local_err
);
7331 if (local_err
!= NULL
) {
7332 error_propagate(errp
, local_err
);
7335 if (cpu
->vcpu_id
== UNASSIGNED_CPU_INDEX
) {
7336 cpu
->vcpu_id
= cs
->cpu_index
;
7339 if (tcg_enabled()) {
7340 if (ppc_fixup_cpu(cpu
) != 0) {
7341 error_setg(errp
, "Unable to emulate selected CPU with TCG");
7346 create_ppc_opcodes(cpu
, &local_err
);
7347 if (local_err
!= NULL
) {
7348 error_propagate(errp
, local_err
);
7353 ppc_gdb_init(cs
, pcc
);
7356 pcc
->parent_realize(dev
, errp
);
7361 cpu_exec_unrealizefn(cs
);
7364 static void ppc_cpu_unrealize(DeviceState
*dev
)
7366 PowerPCCPU
*cpu
= POWERPC_CPU(dev
);
7367 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7369 pcc
->parent_unrealize(dev
);
7371 cpu_remove_sync(CPU(cpu
));
7373 destroy_ppc_opcodes(cpu
);
7376 static gint
ppc_cpu_compare_class_pvr(gconstpointer a
, gconstpointer b
)
7378 ObjectClass
*oc
= (ObjectClass
*)a
;
7379 uint32_t pvr
= *(uint32_t *)b
;
7380 PowerPCCPUClass
*pcc
= (PowerPCCPUClass
*)a
;
7382 /* -cpu host does a PVR lookup during construction */
7383 if (unlikely(strcmp(object_class_get_name(oc
),
7384 TYPE_HOST_POWERPC_CPU
) == 0)) {
7388 return pcc
->pvr
== pvr
? 0 : -1;
7391 PowerPCCPUClass
*ppc_cpu_class_by_pvr(uint32_t pvr
)
7393 GSList
*list
, *item
;
7394 PowerPCCPUClass
*pcc
= NULL
;
7396 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
7397 item
= g_slist_find_custom(list
, &pvr
, ppc_cpu_compare_class_pvr
);
7399 pcc
= POWERPC_CPU_CLASS(item
->data
);
7406 static gint
ppc_cpu_compare_class_pvr_mask(gconstpointer a
, gconstpointer b
)
7408 ObjectClass
*oc
= (ObjectClass
*)a
;
7409 uint32_t pvr
= *(uint32_t *)b
;
7410 PowerPCCPUClass
*pcc
= (PowerPCCPUClass
*)a
;
7412 /* -cpu host does a PVR lookup during construction */
7413 if (unlikely(strcmp(object_class_get_name(oc
),
7414 TYPE_HOST_POWERPC_CPU
) == 0)) {
7418 if (pcc
->pvr_match(pcc
, pvr
)) {
7425 PowerPCCPUClass
*ppc_cpu_class_by_pvr_mask(uint32_t pvr
)
7427 GSList
*list
, *item
;
7428 PowerPCCPUClass
*pcc
= NULL
;
7430 list
= object_class_get_list(TYPE_POWERPC_CPU
, true);
7431 item
= g_slist_find_custom(list
, &pvr
, ppc_cpu_compare_class_pvr_mask
);
7433 pcc
= POWERPC_CPU_CLASS(item
->data
);
7440 static const char *ppc_cpu_lookup_alias(const char *alias
)
7444 for (ai
= 0; ppc_cpu_aliases
[ai
].alias
!= NULL
; ai
++) {
7445 if (strcmp(ppc_cpu_aliases
[ai
].alias
, alias
) == 0) {
7446 return ppc_cpu_aliases
[ai
].model
;
7453 static ObjectClass
*ppc_cpu_class_by_name(const char *name
)
7455 char *cpu_model
, *typename
;
7461 * Lookup by PVR if cpu_model is valid 8 digit hex number (excl:
7462 * 0x prefix if present)
7464 if (!qemu_strtoul(name
, &p
, 16, &pvr
)) {
7466 len
= (len
== 10) && (name
[1] == 'x') ? len
- 2 : len
;
7467 if ((len
== 8) && (*p
== '\0')) {
7468 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr
));
7472 cpu_model
= g_ascii_strdown(name
, -1);
7473 p
= ppc_cpu_lookup_alias(cpu_model
);
7476 cpu_model
= g_strdup(p
);
7479 typename
= g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX
, cpu_model
);
7480 oc
= object_class_by_name(typename
);
7487 PowerPCCPUClass
*ppc_cpu_get_family_class(PowerPCCPUClass
*pcc
)
7489 ObjectClass
*oc
= OBJECT_CLASS(pcc
);
7491 while (oc
&& !object_class_is_abstract(oc
)) {
7492 oc
= object_class_get_parent(oc
);
7496 return POWERPC_CPU_CLASS(oc
);
7499 /* Sort by PVR, ordering special case "host" last. */
7500 static gint
ppc_cpu_list_compare(gconstpointer a
, gconstpointer b
)
7502 ObjectClass
*oc_a
= (ObjectClass
*)a
;
7503 ObjectClass
*oc_b
= (ObjectClass
*)b
;
7504 PowerPCCPUClass
*pcc_a
= POWERPC_CPU_CLASS(oc_a
);
7505 PowerPCCPUClass
*pcc_b
= POWERPC_CPU_CLASS(oc_b
);
7506 const char *name_a
= object_class_get_name(oc_a
);
7507 const char *name_b
= object_class_get_name(oc_b
);
7509 if (strcmp(name_a
, TYPE_HOST_POWERPC_CPU
) == 0) {
7511 } else if (strcmp(name_b
, TYPE_HOST_POWERPC_CPU
) == 0) {
7514 /* Avoid an integer overflow during subtraction */
7515 if (pcc_a
->pvr
< pcc_b
->pvr
) {
7517 } else if (pcc_a
->pvr
> pcc_b
->pvr
) {
7525 static void ppc_cpu_list_entry(gpointer data
, gpointer user_data
)
7527 ObjectClass
*oc
= data
;
7528 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7529 DeviceClass
*family
= DEVICE_CLASS(ppc_cpu_get_family_class(pcc
));
7530 const char *typename
= object_class_get_name(oc
);
7534 if (unlikely(strcmp(typename
, TYPE_HOST_POWERPC_CPU
) == 0)) {
7538 name
= g_strndup(typename
,
7539 strlen(typename
) - strlen(POWERPC_CPU_TYPE_SUFFIX
));
7540 qemu_printf("PowerPC %-16s PVR %08x\n", name
, pcc
->pvr
);
7541 for (i
= 0; ppc_cpu_aliases
[i
].alias
!= NULL
; i
++) {
7542 PowerPCCPUAlias
*alias
= &ppc_cpu_aliases
[i
];
7543 ObjectClass
*alias_oc
= ppc_cpu_class_by_name(alias
->model
);
7545 if (alias_oc
!= oc
) {
7549 * If running with KVM, we might update the family alias later, so
7550 * avoid printing the wrong alias here and use "preferred" instead
7552 if (strcmp(alias
->alias
, family
->desc
) == 0) {
7553 qemu_printf("PowerPC %-16s (alias for preferred %s CPU)\n",
7554 alias
->alias
, family
->desc
);
7556 qemu_printf("PowerPC %-16s (alias for %s)\n",
7557 alias
->alias
, name
);
7563 void ppc_cpu_list(void)
7567 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
7568 list
= g_slist_sort(list
, ppc_cpu_list_compare
);
7569 g_slist_foreach(list
, ppc_cpu_list_entry
, NULL
);
7574 qemu_printf("PowerPC %s\n", "host");
7578 static void ppc_cpu_defs_entry(gpointer data
, gpointer user_data
)
7580 ObjectClass
*oc
= data
;
7581 CpuDefinitionInfoList
**first
= user_data
;
7582 const char *typename
;
7583 CpuDefinitionInfo
*info
;
7585 typename
= object_class_get_name(oc
);
7586 info
= g_malloc0(sizeof(*info
));
7587 info
->name
= g_strndup(typename
,
7588 strlen(typename
) - strlen(POWERPC_CPU_TYPE_SUFFIX
));
7590 QAPI_LIST_PREPEND(*first
, info
);
7593 CpuDefinitionInfoList
*qmp_query_cpu_definitions(Error
**errp
)
7595 CpuDefinitionInfoList
*cpu_list
= NULL
;
7599 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
7600 g_slist_foreach(list
, ppc_cpu_defs_entry
, &cpu_list
);
7603 for (i
= 0; ppc_cpu_aliases
[i
].alias
!= NULL
; i
++) {
7604 PowerPCCPUAlias
*alias
= &ppc_cpu_aliases
[i
];
7606 CpuDefinitionInfo
*info
;
7608 oc
= ppc_cpu_class_by_name(alias
->model
);
7613 info
= g_malloc0(sizeof(*info
));
7614 info
->name
= g_strdup(alias
->alias
);
7615 info
->q_typename
= g_strdup(object_class_get_name(oc
));
7617 QAPI_LIST_PREPEND(cpu_list
, info
);
7623 static void ppc_cpu_set_pc(CPUState
*cs
, vaddr value
)
7625 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7627 cpu
->env
.nip
= value
;
7630 static bool ppc_cpu_has_work(CPUState
*cs
)
7632 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7633 CPUPPCState
*env
= &cpu
->env
;
7635 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
7638 static void ppc_cpu_reset(DeviceState
*dev
)
7640 CPUState
*s
= CPU(dev
);
7641 PowerPCCPU
*cpu
= POWERPC_CPU(s
);
7642 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7643 CPUPPCState
*env
= &cpu
->env
;
7647 pcc
->parent_reset(dev
);
7649 msr
= (target_ulong
)0;
7650 msr
|= (target_ulong
)MSR_HVB
;
7651 msr
|= (target_ulong
)1 << MSR_EP
;
7652 #if defined(DO_SINGLE_STEP) && 0
7653 /* Single step trace mode */
7654 msr
|= (target_ulong
)1 << MSR_SE
;
7655 msr
|= (target_ulong
)1 << MSR_BE
;
7657 #if defined(CONFIG_USER_ONLY)
7658 msr
|= (target_ulong
)1 << MSR_FP
; /* Allow floating point usage */
7659 msr
|= (target_ulong
)1 << MSR_FE0
; /* Allow floating point exceptions */
7660 msr
|= (target_ulong
)1 << MSR_FE1
;
7661 msr
|= (target_ulong
)1 << MSR_VR
; /* Allow altivec usage */
7662 msr
|= (target_ulong
)1 << MSR_VSX
; /* Allow VSX usage */
7663 msr
|= (target_ulong
)1 << MSR_SPE
; /* Allow SPE usage */
7664 msr
|= (target_ulong
)1 << MSR_PR
;
7665 #if defined(TARGET_PPC64)
7666 msr
|= (target_ulong
)1 << MSR_TM
; /* Transactional memory */
7668 #if !defined(TARGET_WORDS_BIGENDIAN)
7669 msr
|= (target_ulong
)1 << MSR_LE
; /* Little-endian user mode */
7670 if (!((env
->msr_mask
>> MSR_LE
) & 1)) {
7671 fprintf(stderr
, "Selected CPU does not support little-endian.\n");
7677 #if defined(TARGET_PPC64)
7678 if (mmu_is_64bit(env
->mmu_model
)) {
7679 msr
|= (1ULL << MSR_SF
);
7683 hreg_store_msr(env
, msr
, 1);
7685 #if !defined(CONFIG_USER_ONLY)
7686 env
->nip
= env
->hreset_vector
| env
->excp_prefix
;
7687 #if defined(CONFIG_TCG)
7688 if (env
->mmu_model
!= POWERPC_MMU_REAL
) {
7689 ppc_tlb_invalidate_all(env
);
7691 #endif /* CONFIG_TCG */
7694 pmu_update_summaries(env
);
7695 hreg_compute_hflags(env
);
7696 env
->reserve_addr
= (target_ulong
)-1ULL;
7697 /* Be sure no exception or interrupt is pending */
7698 env
->pending_interrupts
= 0;
7699 s
->exception_index
= POWERPC_EXCP_NONE
;
7700 env
->error_code
= 0;
7703 /* tininess for underflow is detected before rounding */
7704 set_float_detect_tininess(float_tininess_before_rounding
,
7707 for (i
= 0; i
< ARRAY_SIZE(env
->spr_cb
); i
++) {
7708 ppc_spr_t
*spr
= &env
->spr_cb
[i
];
7713 env
->spr
[i
] = spr
->default_value
;
7717 #ifndef CONFIG_USER_ONLY
7719 static bool ppc_cpu_is_big_endian(CPUState
*cs
)
7721 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7722 CPUPPCState
*env
= &cpu
->env
;
7724 cpu_synchronize_state(cs
);
7730 static void ppc_cpu_exec_enter(CPUState
*cs
)
7732 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7735 PPCVirtualHypervisorClass
*vhc
=
7736 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu
->vhyp
);
7737 vhc
->cpu_exec_enter(cpu
->vhyp
, cpu
);
7741 static void ppc_cpu_exec_exit(CPUState
*cs
)
7743 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7746 PPCVirtualHypervisorClass
*vhc
=
7747 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu
->vhyp
);
7748 vhc
->cpu_exec_exit(cpu
->vhyp
, cpu
);
7751 #endif /* CONFIG_TCG */
7753 #endif /* !CONFIG_USER_ONLY */
7755 static void ppc_cpu_instance_init(Object
*obj
)
7757 PowerPCCPU
*cpu
= POWERPC_CPU(obj
);
7758 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7759 CPUPPCState
*env
= &cpu
->env
;
7761 cpu_set_cpustate_pointers(cpu
);
7762 cpu
->vcpu_id
= UNASSIGNED_CPU_INDEX
;
7764 env
->msr_mask
= pcc
->msr_mask
;
7765 env
->mmu_model
= pcc
->mmu_model
;
7766 env
->excp_model
= pcc
->excp_model
;
7767 env
->bus_model
= pcc
->bus_model
;
7768 env
->insns_flags
= pcc
->insns_flags
;
7769 env
->insns_flags2
= pcc
->insns_flags2
;
7770 env
->flags
= pcc
->flags
;
7771 env
->bfd_mach
= pcc
->bfd_mach
;
7772 env
->check_pow
= pcc
->check_pow
;
7775 * Mark HV mode as supported if the CPU has an MSR_HV bit in the
7776 * msr_mask. The mask can later be cleared by PAPR mode but the hv
7777 * mode support will remain, thus enforcing that we cannot use
7778 * priv. instructions in guest in PAPR mode. For 970 we currently
7779 * simply don't set HV in msr_mask thus simulating an "Apple mode"
7780 * 970. If we ever want to support 970 HV mode, we'll have to add
7781 * a processor attribute of some sort.
7783 #if !defined(CONFIG_USER_ONLY)
7784 env
->has_hv_mode
= !!(env
->msr_mask
& MSR_HVB
);
7787 ppc_hash64_init(cpu
);
7790 static void ppc_cpu_instance_finalize(Object
*obj
)
7792 PowerPCCPU
*cpu
= POWERPC_CPU(obj
);
7794 ppc_hash64_finalize(cpu
);
7797 static bool ppc_pvr_match_default(PowerPCCPUClass
*pcc
, uint32_t pvr
)
7799 return pcc
->pvr
== pvr
;
7802 static void ppc_disas_set_info(CPUState
*cs
, disassemble_info
*info
)
7804 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7805 CPUPPCState
*env
= &cpu
->env
;
7807 if ((env
->hflags
>> MSR_LE
) & 1) {
7808 info
->endian
= BFD_ENDIAN_LITTLE
;
7810 info
->mach
= env
->bfd_mach
;
7811 if (!env
->bfd_mach
) {
7813 info
->mach
= bfd_mach_ppc64
;
7815 info
->mach
= bfd_mach_ppc
;
7818 info
->disassembler_options
= (char *)"any";
7819 info
->print_insn
= print_insn_ppc
;
7821 info
->cap_arch
= CS_ARCH_PPC
;
7823 info
->cap_mode
= CS_MODE_64
;
7827 static Property ppc_cpu_properties
[] = {
7828 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU
, pre_2_8_migration
, false),
7829 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU
, pre_2_10_migration
,
7831 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU
, pre_3_0_migration
,
7833 DEFINE_PROP_END_OF_LIST(),
7836 #ifndef CONFIG_USER_ONLY
7837 #include "hw/core/sysemu-cpu-ops.h"
7839 static const struct SysemuCPUOps ppc_sysemu_ops
= {
7840 .get_phys_page_debug
= ppc_cpu_get_phys_page_debug
,
7841 .write_elf32_note
= ppc32_cpu_write_elf32_note
,
7842 .write_elf64_note
= ppc64_cpu_write_elf64_note
,
7843 .virtio_is_big_endian
= ppc_cpu_is_big_endian
,
7844 .legacy_vmsd
= &vmstate_ppc_cpu
,
7849 #include "hw/core/tcg-cpu-ops.h"
7851 static const struct TCGCPUOps ppc_tcg_ops
= {
7852 .initialize
= ppc_translate_init
,
7854 #ifdef CONFIG_USER_ONLY
7855 .record_sigsegv
= ppc_cpu_record_sigsegv
,
7857 .tlb_fill
= ppc_cpu_tlb_fill
,
7858 .cpu_exec_interrupt
= ppc_cpu_exec_interrupt
,
7859 .do_interrupt
= ppc_cpu_do_interrupt
,
7860 .cpu_exec_enter
= ppc_cpu_exec_enter
,
7861 .cpu_exec_exit
= ppc_cpu_exec_exit
,
7862 .do_unaligned_access
= ppc_cpu_do_unaligned_access
,
7863 #endif /* !CONFIG_USER_ONLY */
7865 #endif /* CONFIG_TCG */
7867 static void ppc_cpu_class_init(ObjectClass
*oc
, void *data
)
7869 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7870 CPUClass
*cc
= CPU_CLASS(oc
);
7871 DeviceClass
*dc
= DEVICE_CLASS(oc
);
7873 device_class_set_parent_realize(dc
, ppc_cpu_realize
,
7874 &pcc
->parent_realize
);
7875 device_class_set_parent_unrealize(dc
, ppc_cpu_unrealize
,
7876 &pcc
->parent_unrealize
);
7877 pcc
->pvr_match
= ppc_pvr_match_default
;
7878 device_class_set_props(dc
, ppc_cpu_properties
);
7880 device_class_set_parent_reset(dc
, ppc_cpu_reset
, &pcc
->parent_reset
);
7882 cc
->class_by_name
= ppc_cpu_class_by_name
;
7883 cc
->has_work
= ppc_cpu_has_work
;
7884 cc
->dump_state
= ppc_cpu_dump_state
;
7885 cc
->set_pc
= ppc_cpu_set_pc
;
7886 cc
->gdb_read_register
= ppc_cpu_gdb_read_register
;
7887 cc
->gdb_write_register
= ppc_cpu_gdb_write_register
;
7888 #ifndef CONFIG_USER_ONLY
7889 cc
->sysemu_ops
= &ppc_sysemu_ops
;
7892 cc
->gdb_num_core_regs
= 71;
7893 #ifndef CONFIG_USER_ONLY
7894 cc
->gdb_get_dynamic_xml
= ppc_gdb_get_dynamic_xml
;
7896 #ifdef USE_APPLE_GDB
7897 cc
->gdb_read_register
= ppc_cpu_gdb_read_register_apple
;
7898 cc
->gdb_write_register
= ppc_cpu_gdb_write_register_apple
;
7899 cc
->gdb_num_core_regs
= 71 + 32;
7902 cc
->gdb_arch_name
= ppc_gdb_arch_name
;
7903 #if defined(TARGET_PPC64)
7904 cc
->gdb_core_xml_file
= "power64-core.xml";
7906 cc
->gdb_core_xml_file
= "power-core.xml";
7908 cc
->disas_set_info
= ppc_disas_set_info
;
7910 dc
->fw_name
= "PowerPC,UNKNOWN";
7913 cc
->tcg_ops
= &ppc_tcg_ops
;
7914 #endif /* CONFIG_TCG */
7917 static const TypeInfo ppc_cpu_type_info
= {
7918 .name
= TYPE_POWERPC_CPU
,
7920 .instance_size
= sizeof(PowerPCCPU
),
7921 .instance_align
= __alignof__(PowerPCCPU
),
7922 .instance_init
= ppc_cpu_instance_init
,
7923 .instance_finalize
= ppc_cpu_instance_finalize
,
7925 .class_size
= sizeof(PowerPCCPUClass
),
7926 .class_init
= ppc_cpu_class_init
,
7929 #ifndef CONFIG_USER_ONLY
7930 static const TypeInfo ppc_vhyp_type_info
= {
7931 .name
= TYPE_PPC_VIRTUAL_HYPERVISOR
,
7932 .parent
= TYPE_INTERFACE
,
7933 .class_size
= sizeof(PPCVirtualHypervisorClass
),
7937 static void ppc_cpu_register_types(void)
7939 type_register_static(&ppc_cpu_type_info
);
7940 #ifndef CONFIG_USER_ONLY
7941 type_register_static(&ppc_vhyp_type_info
);
7945 void ppc_cpu_dump_state(CPUState
*cs
, FILE *f
, int flags
)
7950 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7951 CPUPPCState
*env
= &cpu
->env
;
7954 qemu_fprintf(f
, "NIP " TARGET_FMT_lx
" LR " TARGET_FMT_lx
" CTR "
7955 TARGET_FMT_lx
" XER " TARGET_FMT_lx
" CPU#%d\n",
7956 env
->nip
, env
->lr
, env
->ctr
, cpu_read_xer(env
),
7958 qemu_fprintf(f
, "MSR " TARGET_FMT_lx
" HID0 " TARGET_FMT_lx
" HF "
7959 "%08x iidx %d didx %d\n",
7960 env
->msr
, env
->spr
[SPR_HID0
], env
->hflags
,
7961 cpu_mmu_index(env
, true), cpu_mmu_index(env
, false));
7962 #if !defined(NO_TIMER_DUMP)
7963 qemu_fprintf(f
, "TB %08" PRIu32
" %08" PRIu64
7964 #if !defined(CONFIG_USER_ONLY)
7965 " DECR " TARGET_FMT_lu
7968 cpu_ppc_load_tbu(env
), cpu_ppc_load_tbl(env
)
7969 #if !defined(CONFIG_USER_ONLY)
7970 , cpu_ppc_load_decr(env
)
7974 for (i
= 0; i
< 32; i
++) {
7975 if ((i
& (RGPL
- 1)) == 0) {
7976 qemu_fprintf(f
, "GPR%02d", i
);
7978 qemu_fprintf(f
, " %016" PRIx64
, ppc_dump_gpr(env
, i
));
7979 if ((i
& (RGPL
- 1)) == (RGPL
- 1)) {
7980 qemu_fprintf(f
, "\n");
7983 qemu_fprintf(f
, "CR ");
7984 for (i
= 0; i
< 8; i
++)
7985 qemu_fprintf(f
, "%01x", env
->crf
[i
]);
7986 qemu_fprintf(f
, " [");
7987 for (i
= 0; i
< 8; i
++) {
7989 if (env
->crf
[i
] & 0x08) {
7991 } else if (env
->crf
[i
] & 0x04) {
7993 } else if (env
->crf
[i
] & 0x02) {
7996 qemu_fprintf(f
, " %c%c", a
, env
->crf
[i
] & 0x01 ? 'O' : ' ');
7998 qemu_fprintf(f
, " ] RES " TARGET_FMT_lx
"\n",
8001 if (flags
& CPU_DUMP_FPU
) {
8002 for (i
= 0; i
< 32; i
++) {
8003 if ((i
& (RFPL
- 1)) == 0) {
8004 qemu_fprintf(f
, "FPR%02d", i
);
8006 qemu_fprintf(f
, " %016" PRIx64
, *cpu_fpr_ptr(env
, i
));
8007 if ((i
& (RFPL
- 1)) == (RFPL
- 1)) {
8008 qemu_fprintf(f
, "\n");
8011 qemu_fprintf(f
, "FPSCR " TARGET_FMT_lx
"\n", env
->fpscr
);
8014 #if !defined(CONFIG_USER_ONLY)
8015 qemu_fprintf(f
, " SRR0 " TARGET_FMT_lx
" SRR1 " TARGET_FMT_lx
8016 " PVR " TARGET_FMT_lx
" VRSAVE " TARGET_FMT_lx
"\n",
8017 env
->spr
[SPR_SRR0
], env
->spr
[SPR_SRR1
],
8018 env
->spr
[SPR_PVR
], env
->spr
[SPR_VRSAVE
]);
8020 qemu_fprintf(f
, "SPRG0 " TARGET_FMT_lx
" SPRG1 " TARGET_FMT_lx
8021 " SPRG2 " TARGET_FMT_lx
" SPRG3 " TARGET_FMT_lx
"\n",
8022 env
->spr
[SPR_SPRG0
], env
->spr
[SPR_SPRG1
],
8023 env
->spr
[SPR_SPRG2
], env
->spr
[SPR_SPRG3
]);
8025 qemu_fprintf(f
, "SPRG4 " TARGET_FMT_lx
" SPRG5 " TARGET_FMT_lx
8026 " SPRG6 " TARGET_FMT_lx
" SPRG7 " TARGET_FMT_lx
"\n",
8027 env
->spr
[SPR_SPRG4
], env
->spr
[SPR_SPRG5
],
8028 env
->spr
[SPR_SPRG6
], env
->spr
[SPR_SPRG7
]);
8030 switch (env
->excp_model
) {
8031 #if defined(TARGET_PPC64)
8032 case POWERPC_EXCP_POWER7
:
8033 case POWERPC_EXCP_POWER8
:
8034 case POWERPC_EXCP_POWER9
:
8035 case POWERPC_EXCP_POWER10
:
8036 qemu_fprintf(f
, "HSRR0 " TARGET_FMT_lx
" HSRR1 " TARGET_FMT_lx
"\n",
8037 env
->spr
[SPR_HSRR0
], env
->spr
[SPR_HSRR1
]);
8040 case POWERPC_EXCP_BOOKE
:
8041 qemu_fprintf(f
, "CSRR0 " TARGET_FMT_lx
" CSRR1 " TARGET_FMT_lx
8042 " MCSRR0 " TARGET_FMT_lx
" MCSRR1 " TARGET_FMT_lx
"\n",
8043 env
->spr
[SPR_BOOKE_CSRR0
], env
->spr
[SPR_BOOKE_CSRR1
],
8044 env
->spr
[SPR_BOOKE_MCSRR0
], env
->spr
[SPR_BOOKE_MCSRR1
]);
8046 qemu_fprintf(f
, " TCR " TARGET_FMT_lx
" TSR " TARGET_FMT_lx
8047 " ESR " TARGET_FMT_lx
" DEAR " TARGET_FMT_lx
"\n",
8048 env
->spr
[SPR_BOOKE_TCR
], env
->spr
[SPR_BOOKE_TSR
],
8049 env
->spr
[SPR_BOOKE_ESR
], env
->spr
[SPR_BOOKE_DEAR
]);
8051 qemu_fprintf(f
, " PIR " TARGET_FMT_lx
" DECAR " TARGET_FMT_lx
8052 " IVPR " TARGET_FMT_lx
" EPCR " TARGET_FMT_lx
"\n",
8053 env
->spr
[SPR_BOOKE_PIR
], env
->spr
[SPR_BOOKE_DECAR
],
8054 env
->spr
[SPR_BOOKE_IVPR
], env
->spr
[SPR_BOOKE_EPCR
]);
8056 qemu_fprintf(f
, " MCSR " TARGET_FMT_lx
" SPRG8 " TARGET_FMT_lx
8057 " EPR " TARGET_FMT_lx
"\n",
8058 env
->spr
[SPR_BOOKE_MCSR
], env
->spr
[SPR_BOOKE_SPRG8
],
8059 env
->spr
[SPR_BOOKE_EPR
]);
8062 qemu_fprintf(f
, " MCAR " TARGET_FMT_lx
" PID1 " TARGET_FMT_lx
8063 " PID2 " TARGET_FMT_lx
" SVR " TARGET_FMT_lx
"\n",
8064 env
->spr
[SPR_Exxx_MCAR
], env
->spr
[SPR_BOOKE_PID1
],
8065 env
->spr
[SPR_BOOKE_PID2
], env
->spr
[SPR_E500_SVR
]);
8068 * IVORs are left out as they are large and do not change often --
8069 * they can be read with "p $ivor0", "p $ivor1", etc.
8072 case POWERPC_EXCP_40x
:
8073 qemu_fprintf(f
, " TCR " TARGET_FMT_lx
" TSR " TARGET_FMT_lx
8074 " ESR " TARGET_FMT_lx
" DEAR " TARGET_FMT_lx
"\n",
8075 env
->spr
[SPR_40x_TCR
], env
->spr
[SPR_40x_TSR
],
8076 env
->spr
[SPR_40x_ESR
], env
->spr
[SPR_40x_DEAR
]);
8078 qemu_fprintf(f
, " EVPR " TARGET_FMT_lx
" SRR2 " TARGET_FMT_lx
8079 " SRR3 " TARGET_FMT_lx
" PID " TARGET_FMT_lx
"\n",
8080 env
->spr
[SPR_40x_EVPR
], env
->spr
[SPR_40x_SRR2
],
8081 env
->spr
[SPR_40x_SRR3
], env
->spr
[SPR_40x_PID
]);
8087 #if defined(TARGET_PPC64)
8088 if (env
->flags
& POWERPC_FLAG_CFAR
) {
8089 qemu_fprintf(f
, " CFAR " TARGET_FMT_lx
"\n", env
->cfar
);
8093 if (env
->spr_cb
[SPR_LPCR
].name
) {
8094 qemu_fprintf(f
, " LPCR " TARGET_FMT_lx
"\n", env
->spr
[SPR_LPCR
]);
8097 switch (env
->mmu_model
) {
8098 case POWERPC_MMU_32B
:
8099 case POWERPC_MMU_SOFT_6xx
:
8100 #if defined(TARGET_PPC64)
8101 case POWERPC_MMU_64B
:
8102 case POWERPC_MMU_2_03
:
8103 case POWERPC_MMU_2_06
:
8104 case POWERPC_MMU_2_07
:
8105 case POWERPC_MMU_3_00
:
8107 if (env
->spr_cb
[SPR_SDR1
].name
) { /* SDR1 Exists */
8108 qemu_fprintf(f
, " SDR1 " TARGET_FMT_lx
" ", env
->spr
[SPR_SDR1
]);
8110 if (env
->spr_cb
[SPR_PTCR
].name
) { /* PTCR Exists */
8111 qemu_fprintf(f
, " PTCR " TARGET_FMT_lx
" ", env
->spr
[SPR_PTCR
]);
8113 qemu_fprintf(f
, " DAR " TARGET_FMT_lx
" DSISR " TARGET_FMT_lx
"\n",
8114 env
->spr
[SPR_DAR
], env
->spr
[SPR_DSISR
]);
8116 case POWERPC_MMU_BOOKE206
:
8117 qemu_fprintf(f
, " MAS0 " TARGET_FMT_lx
" MAS1 " TARGET_FMT_lx
8118 " MAS2 " TARGET_FMT_lx
" MAS3 " TARGET_FMT_lx
"\n",
8119 env
->spr
[SPR_BOOKE_MAS0
], env
->spr
[SPR_BOOKE_MAS1
],
8120 env
->spr
[SPR_BOOKE_MAS2
], env
->spr
[SPR_BOOKE_MAS3
]);
8122 qemu_fprintf(f
, " MAS4 " TARGET_FMT_lx
" MAS6 " TARGET_FMT_lx
8123 " MAS7 " TARGET_FMT_lx
" PID " TARGET_FMT_lx
"\n",
8124 env
->spr
[SPR_BOOKE_MAS4
], env
->spr
[SPR_BOOKE_MAS6
],
8125 env
->spr
[SPR_BOOKE_MAS7
], env
->spr
[SPR_BOOKE_PID
]);
8127 qemu_fprintf(f
, "MMUCFG " TARGET_FMT_lx
" TLB0CFG " TARGET_FMT_lx
8128 " TLB1CFG " TARGET_FMT_lx
"\n",
8129 env
->spr
[SPR_MMUCFG
], env
->spr
[SPR_BOOKE_TLB0CFG
],
8130 env
->spr
[SPR_BOOKE_TLB1CFG
]);
8140 type_init(ppc_cpu_register_types
)