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"
49 /* #define PPC_DEBUG_SPR */
50 /* #define USE_APPLE_GDB */
52 static inline void vscr_init(CPUPPCState
*env
, uint32_t val
)
54 /* Altivec always uses round-to-nearest */
55 set_float_rounding_mode(float_round_nearest_even
, &env
->vec_status
);
56 ppc_store_vscr(env
, val
);
62 * Register an SPR with all the callbacks required for tcg,
63 * and the ID number for KVM.
65 * The reason for the conditional compilation is that the tcg functions
66 * may be compiled out, and the system kvm header may not be available
67 * for supplying the ID numbers. This is ugly, but the best we can do.
71 # define USR_ARG(X) X,
72 # ifdef CONFIG_USER_ONLY
75 # define SYS_ARG(X) X,
82 # define KVM_ARG(X) X,
87 typedef void spr_callback(DisasContext
*, int, int);
89 static void _spr_register(CPUPPCState
*env
, int num
, const char *name
,
90 USR_ARG(spr_callback
*uea_read
)
91 USR_ARG(spr_callback
*uea_write
)
92 SYS_ARG(spr_callback
*oea_read
)
93 SYS_ARG(spr_callback
*oea_write
)
94 SYS_ARG(spr_callback
*hea_read
)
95 SYS_ARG(spr_callback
*hea_write
)
96 KVM_ARG(uint64_t one_reg_id
)
97 target_ulong initial_value
)
99 ppc_spr_t
*spr
= &env
->spr_cb
[num
];
101 /* No SPR should be registered twice. */
102 assert(spr
->name
== NULL
);
103 assert(name
!= NULL
);
106 spr
->default_value
= initial_value
;
107 env
->spr
[num
] = initial_value
;
110 spr
->uea_read
= uea_read
;
111 spr
->uea_write
= uea_write
;
112 # ifndef CONFIG_USER_ONLY
113 spr
->oea_read
= oea_read
;
114 spr
->oea_write
= oea_write
;
115 spr
->hea_read
= hea_read
;
116 spr
->hea_write
= hea_write
;
120 spr
->one_reg_id
= one_reg_id
;
124 /* spr_register_kvm_hv passes all required arguments. */
125 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
126 oea_read, oea_write, hea_read, hea_write, \
127 one_reg_id, initial_value) \
128 _spr_register(env, num, name, \
129 USR_ARG(uea_read) USR_ARG(uea_write) \
130 SYS_ARG(oea_read) SYS_ARG(oea_write) \
131 SYS_ARG(hea_read) SYS_ARG(hea_write) \
132 KVM_ARG(one_reg_id) initial_value)
134 /* spr_register_kvm duplicates the oea callbacks to the hea callbacks. */
135 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
136 oea_read, oea_write, one_reg_id, ival) \
137 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
138 oea_write, oea_read, oea_write, one_reg_id, ival)
140 /* spr_register_hv and spr_register are similar, except there is no kvm id. */
141 #define spr_register_hv(env, num, name, uea_read, uea_write, \
142 oea_read, oea_write, hea_read, hea_write, ival) \
143 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
144 oea_write, hea_read, hea_write, 0, ival)
146 #define spr_register(env, num, name, uea_read, uea_write, \
147 oea_read, oea_write, ival) \
148 spr_register_kvm(env, num, name, uea_read, uea_write, \
149 oea_read, oea_write, 0, ival)
151 /* Generic PowerPC SPRs */
152 static void register_generic_sprs(CPUPPCState
*env
)
154 /* Integer processing */
155 spr_register(env
, SPR_XER
, "XER",
156 &spr_read_xer
, &spr_write_xer
,
157 &spr_read_xer
, &spr_write_xer
,
160 spr_register(env
, SPR_LR
, "LR",
161 &spr_read_lr
, &spr_write_lr
,
162 &spr_read_lr
, &spr_write_lr
,
164 spr_register(env
, SPR_CTR
, "CTR",
165 &spr_read_ctr
, &spr_write_ctr
,
166 &spr_read_ctr
, &spr_write_ctr
,
168 /* Interrupt processing */
169 spr_register(env
, SPR_SRR0
, "SRR0",
170 SPR_NOACCESS
, SPR_NOACCESS
,
171 &spr_read_generic
, &spr_write_generic
,
173 spr_register(env
, SPR_SRR1
, "SRR1",
174 SPR_NOACCESS
, SPR_NOACCESS
,
175 &spr_read_generic
, &spr_write_generic
,
177 /* Processor control */
178 spr_register(env
, SPR_SPRG0
, "SPRG0",
179 SPR_NOACCESS
, SPR_NOACCESS
,
180 &spr_read_generic
, &spr_write_generic
,
182 spr_register(env
, SPR_SPRG1
, "SPRG1",
183 SPR_NOACCESS
, SPR_NOACCESS
,
184 &spr_read_generic
, &spr_write_generic
,
186 spr_register(env
, SPR_SPRG2
, "SPRG2",
187 SPR_NOACCESS
, SPR_NOACCESS
,
188 &spr_read_generic
, &spr_write_generic
,
190 spr_register(env
, SPR_SPRG3
, "SPRG3",
191 SPR_NOACCESS
, SPR_NOACCESS
,
192 &spr_read_generic
, &spr_write_generic
,
196 /* SPR common to all non-embedded PowerPC, including 601 */
197 static void register_ne_601_sprs(CPUPPCState
*env
)
199 /* Exception processing */
200 spr_register_kvm(env
, SPR_DSISR
, "DSISR",
201 SPR_NOACCESS
, SPR_NOACCESS
,
202 &spr_read_generic
, &spr_write_generic
,
203 KVM_REG_PPC_DSISR
, 0x00000000);
204 spr_register_kvm(env
, SPR_DAR
, "DAR",
205 SPR_NOACCESS
, SPR_NOACCESS
,
206 &spr_read_generic
, &spr_write_generic
,
207 KVM_REG_PPC_DAR
, 0x00000000);
209 spr_register(env
, SPR_DECR
, "DECR",
210 SPR_NOACCESS
, SPR_NOACCESS
,
211 &spr_read_decr
, &spr_write_decr
,
215 /* Storage Description Register 1 */
216 static void register_sdr1_sprs(CPUPPCState
*env
)
218 #ifndef CONFIG_USER_ONLY
219 if (env
->has_hv_mode
) {
221 * SDR1 is a hypervisor resource on CPUs which have a
224 spr_register_hv(env
, SPR_SDR1
, "SDR1",
225 SPR_NOACCESS
, SPR_NOACCESS
,
226 SPR_NOACCESS
, SPR_NOACCESS
,
227 &spr_read_generic
, &spr_write_sdr1
,
230 spr_register(env
, SPR_SDR1
, "SDR1",
231 SPR_NOACCESS
, SPR_NOACCESS
,
232 &spr_read_generic
, &spr_write_sdr1
,
239 static void register_low_BATs(CPUPPCState
*env
)
241 #if !defined(CONFIG_USER_ONLY)
242 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
243 SPR_NOACCESS
, SPR_NOACCESS
,
244 &spr_read_ibat
, &spr_write_ibatu
,
246 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
247 SPR_NOACCESS
, SPR_NOACCESS
,
248 &spr_read_ibat
, &spr_write_ibatl
,
250 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
251 SPR_NOACCESS
, SPR_NOACCESS
,
252 &spr_read_ibat
, &spr_write_ibatu
,
254 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
255 SPR_NOACCESS
, SPR_NOACCESS
,
256 &spr_read_ibat
, &spr_write_ibatl
,
258 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
259 SPR_NOACCESS
, SPR_NOACCESS
,
260 &spr_read_ibat
, &spr_write_ibatu
,
262 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
263 SPR_NOACCESS
, SPR_NOACCESS
,
264 &spr_read_ibat
, &spr_write_ibatl
,
266 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
267 SPR_NOACCESS
, SPR_NOACCESS
,
268 &spr_read_ibat
, &spr_write_ibatu
,
270 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
271 SPR_NOACCESS
, SPR_NOACCESS
,
272 &spr_read_ibat
, &spr_write_ibatl
,
274 spr_register(env
, SPR_DBAT0U
, "DBAT0U",
275 SPR_NOACCESS
, SPR_NOACCESS
,
276 &spr_read_dbat
, &spr_write_dbatu
,
278 spr_register(env
, SPR_DBAT0L
, "DBAT0L",
279 SPR_NOACCESS
, SPR_NOACCESS
,
280 &spr_read_dbat
, &spr_write_dbatl
,
282 spr_register(env
, SPR_DBAT1U
, "DBAT1U",
283 SPR_NOACCESS
, SPR_NOACCESS
,
284 &spr_read_dbat
, &spr_write_dbatu
,
286 spr_register(env
, SPR_DBAT1L
, "DBAT1L",
287 SPR_NOACCESS
, SPR_NOACCESS
,
288 &spr_read_dbat
, &spr_write_dbatl
,
290 spr_register(env
, SPR_DBAT2U
, "DBAT2U",
291 SPR_NOACCESS
, SPR_NOACCESS
,
292 &spr_read_dbat
, &spr_write_dbatu
,
294 spr_register(env
, SPR_DBAT2L
, "DBAT2L",
295 SPR_NOACCESS
, SPR_NOACCESS
,
296 &spr_read_dbat
, &spr_write_dbatl
,
298 spr_register(env
, SPR_DBAT3U
, "DBAT3U",
299 SPR_NOACCESS
, SPR_NOACCESS
,
300 &spr_read_dbat
, &spr_write_dbatu
,
302 spr_register(env
, SPR_DBAT3L
, "DBAT3L",
303 SPR_NOACCESS
, SPR_NOACCESS
,
304 &spr_read_dbat
, &spr_write_dbatl
,
311 static void register_high_BATs(CPUPPCState
*env
)
313 #if !defined(CONFIG_USER_ONLY)
314 spr_register(env
, SPR_IBAT4U
, "IBAT4U",
315 SPR_NOACCESS
, SPR_NOACCESS
,
316 &spr_read_ibat_h
, &spr_write_ibatu_h
,
318 spr_register(env
, SPR_IBAT4L
, "IBAT4L",
319 SPR_NOACCESS
, SPR_NOACCESS
,
320 &spr_read_ibat_h
, &spr_write_ibatl_h
,
322 spr_register(env
, SPR_IBAT5U
, "IBAT5U",
323 SPR_NOACCESS
, SPR_NOACCESS
,
324 &spr_read_ibat_h
, &spr_write_ibatu_h
,
326 spr_register(env
, SPR_IBAT5L
, "IBAT5L",
327 SPR_NOACCESS
, SPR_NOACCESS
,
328 &spr_read_ibat_h
, &spr_write_ibatl_h
,
330 spr_register(env
, SPR_IBAT6U
, "IBAT6U",
331 SPR_NOACCESS
, SPR_NOACCESS
,
332 &spr_read_ibat_h
, &spr_write_ibatu_h
,
334 spr_register(env
, SPR_IBAT6L
, "IBAT6L",
335 SPR_NOACCESS
, SPR_NOACCESS
,
336 &spr_read_ibat_h
, &spr_write_ibatl_h
,
338 spr_register(env
, SPR_IBAT7U
, "IBAT7U",
339 SPR_NOACCESS
, SPR_NOACCESS
,
340 &spr_read_ibat_h
, &spr_write_ibatu_h
,
342 spr_register(env
, SPR_IBAT7L
, "IBAT7L",
343 SPR_NOACCESS
, SPR_NOACCESS
,
344 &spr_read_ibat_h
, &spr_write_ibatl_h
,
346 spr_register(env
, SPR_DBAT4U
, "DBAT4U",
347 SPR_NOACCESS
, SPR_NOACCESS
,
348 &spr_read_dbat_h
, &spr_write_dbatu_h
,
350 spr_register(env
, SPR_DBAT4L
, "DBAT4L",
351 SPR_NOACCESS
, SPR_NOACCESS
,
352 &spr_read_dbat_h
, &spr_write_dbatl_h
,
354 spr_register(env
, SPR_DBAT5U
, "DBAT5U",
355 SPR_NOACCESS
, SPR_NOACCESS
,
356 &spr_read_dbat_h
, &spr_write_dbatu_h
,
358 spr_register(env
, SPR_DBAT5L
, "DBAT5L",
359 SPR_NOACCESS
, SPR_NOACCESS
,
360 &spr_read_dbat_h
, &spr_write_dbatl_h
,
362 spr_register(env
, SPR_DBAT6U
, "DBAT6U",
363 SPR_NOACCESS
, SPR_NOACCESS
,
364 &spr_read_dbat_h
, &spr_write_dbatu_h
,
366 spr_register(env
, SPR_DBAT6L
, "DBAT6L",
367 SPR_NOACCESS
, SPR_NOACCESS
,
368 &spr_read_dbat_h
, &spr_write_dbatl_h
,
370 spr_register(env
, SPR_DBAT7U
, "DBAT7U",
371 SPR_NOACCESS
, SPR_NOACCESS
,
372 &spr_read_dbat_h
, &spr_write_dbatu_h
,
374 spr_register(env
, SPR_DBAT7L
, "DBAT7L",
375 SPR_NOACCESS
, SPR_NOACCESS
,
376 &spr_read_dbat_h
, &spr_write_dbatl_h
,
382 /* Generic PowerPC time base */
383 static void register_tbl(CPUPPCState
*env
)
385 spr_register(env
, SPR_VTBL
, "TBL",
386 &spr_read_tbl
, SPR_NOACCESS
,
387 &spr_read_tbl
, SPR_NOACCESS
,
389 spr_register(env
, SPR_TBL
, "TBL",
390 &spr_read_tbl
, SPR_NOACCESS
,
391 &spr_read_tbl
, &spr_write_tbl
,
393 spr_register(env
, SPR_VTBU
, "TBU",
394 &spr_read_tbu
, SPR_NOACCESS
,
395 &spr_read_tbu
, SPR_NOACCESS
,
397 spr_register(env
, SPR_TBU
, "TBU",
398 &spr_read_tbu
, SPR_NOACCESS
,
399 &spr_read_tbu
, &spr_write_tbu
,
403 /* Softare table search registers */
404 static void register_6xx_7xx_soft_tlb(CPUPPCState
*env
, int nb_tlbs
, int nb_ways
)
406 #if !defined(CONFIG_USER_ONLY)
407 env
->nb_tlb
= nb_tlbs
;
408 env
->nb_ways
= nb_ways
;
410 env
->tlb_type
= TLB_6XX
;
411 spr_register(env
, SPR_DMISS
, "DMISS",
412 SPR_NOACCESS
, SPR_NOACCESS
,
413 &spr_read_generic
, SPR_NOACCESS
,
415 spr_register(env
, SPR_DCMP
, "DCMP",
416 SPR_NOACCESS
, SPR_NOACCESS
,
417 &spr_read_generic
, SPR_NOACCESS
,
419 spr_register(env
, SPR_HASH1
, "HASH1",
420 SPR_NOACCESS
, SPR_NOACCESS
,
421 &spr_read_generic
, SPR_NOACCESS
,
423 spr_register(env
, SPR_HASH2
, "HASH2",
424 SPR_NOACCESS
, SPR_NOACCESS
,
425 &spr_read_generic
, SPR_NOACCESS
,
427 spr_register(env
, SPR_IMISS
, "IMISS",
428 SPR_NOACCESS
, SPR_NOACCESS
,
429 &spr_read_generic
, SPR_NOACCESS
,
431 spr_register(env
, SPR_ICMP
, "ICMP",
432 SPR_NOACCESS
, SPR_NOACCESS
,
433 &spr_read_generic
, SPR_NOACCESS
,
435 spr_register(env
, SPR_RPA
, "RPA",
436 SPR_NOACCESS
, SPR_NOACCESS
,
437 &spr_read_generic
, &spr_write_generic
,
442 /* SPR common to MPC755 and G2 */
443 static void register_G2_755_sprs(CPUPPCState
*env
)
446 spr_register(env
, SPR_SPRG4
, "SPRG4",
447 SPR_NOACCESS
, SPR_NOACCESS
,
448 &spr_read_generic
, &spr_write_generic
,
450 spr_register(env
, SPR_SPRG5
, "SPRG5",
451 SPR_NOACCESS
, SPR_NOACCESS
,
452 &spr_read_generic
, &spr_write_generic
,
454 spr_register(env
, SPR_SPRG6
, "SPRG6",
455 SPR_NOACCESS
, SPR_NOACCESS
,
456 &spr_read_generic
, &spr_write_generic
,
458 spr_register(env
, SPR_SPRG7
, "SPRG7",
459 SPR_NOACCESS
, SPR_NOACCESS
,
460 &spr_read_generic
, &spr_write_generic
,
464 /* SPR common to all 7xx PowerPC implementations */
465 static void register_7xx_sprs(CPUPPCState
*env
)
468 /* XXX : not implemented */
469 spr_register_kvm(env
, SPR_DABR
, "DABR",
470 SPR_NOACCESS
, SPR_NOACCESS
,
471 &spr_read_generic
, &spr_write_generic
,
472 KVM_REG_PPC_DABR
, 0x00000000);
473 /* XXX : not implemented */
474 spr_register(env
, SPR_IABR
, "IABR",
475 SPR_NOACCESS
, SPR_NOACCESS
,
476 &spr_read_generic
, &spr_write_generic
,
478 /* Cache management */
479 /* XXX : not implemented */
480 spr_register(env
, SPR_ICTC
, "ICTC",
481 SPR_NOACCESS
, SPR_NOACCESS
,
482 &spr_read_generic
, &spr_write_generic
,
484 /* Performance monitors */
485 /* XXX : not implemented */
486 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
487 SPR_NOACCESS
, SPR_NOACCESS
,
488 &spr_read_generic
, &spr_write_generic
,
490 /* XXX : not implemented */
491 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
492 SPR_NOACCESS
, SPR_NOACCESS
,
493 &spr_read_generic
, &spr_write_generic
,
495 /* XXX : not implemented */
496 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
497 SPR_NOACCESS
, SPR_NOACCESS
,
498 &spr_read_generic
, &spr_write_generic
,
500 /* XXX : not implemented */
501 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
502 SPR_NOACCESS
, SPR_NOACCESS
,
503 &spr_read_generic
, &spr_write_generic
,
505 /* XXX : not implemented */
506 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
507 SPR_NOACCESS
, SPR_NOACCESS
,
508 &spr_read_generic
, &spr_write_generic
,
510 /* XXX : not implemented */
511 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
512 SPR_NOACCESS
, SPR_NOACCESS
,
513 &spr_read_generic
, &spr_write_generic
,
515 /* XXX : not implemented */
516 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
517 SPR_NOACCESS
, SPR_NOACCESS
,
518 &spr_read_generic
, SPR_NOACCESS
,
520 /* XXX : not implemented */
521 spr_register(env
, SPR_7XX_UMMCR0
, "UMMCR0",
522 &spr_read_ureg
, SPR_NOACCESS
,
523 &spr_read_ureg
, SPR_NOACCESS
,
525 /* XXX : not implemented */
526 spr_register(env
, SPR_7XX_UMMCR1
, "UMMCR1",
527 &spr_read_ureg
, SPR_NOACCESS
,
528 &spr_read_ureg
, SPR_NOACCESS
,
530 /* XXX : not implemented */
531 spr_register(env
, SPR_7XX_UPMC1
, "UPMC1",
532 &spr_read_ureg
, SPR_NOACCESS
,
533 &spr_read_ureg
, SPR_NOACCESS
,
535 /* XXX : not implemented */
536 spr_register(env
, SPR_7XX_UPMC2
, "UPMC2",
537 &spr_read_ureg
, SPR_NOACCESS
,
538 &spr_read_ureg
, SPR_NOACCESS
,
540 /* XXX : not implemented */
541 spr_register(env
, SPR_7XX_UPMC3
, "UPMC3",
542 &spr_read_ureg
, SPR_NOACCESS
,
543 &spr_read_ureg
, SPR_NOACCESS
,
545 /* XXX : not implemented */
546 spr_register(env
, SPR_7XX_UPMC4
, "UPMC4",
547 &spr_read_ureg
, SPR_NOACCESS
,
548 &spr_read_ureg
, SPR_NOACCESS
,
550 /* XXX : not implemented */
551 spr_register(env
, SPR_7XX_USIAR
, "USIAR",
552 &spr_read_ureg
, SPR_NOACCESS
,
553 &spr_read_ureg
, SPR_NOACCESS
,
555 /* External access control */
556 /* XXX : not implemented */
557 spr_register(env
, SPR_EAR
, "EAR",
558 SPR_NOACCESS
, SPR_NOACCESS
,
559 &spr_read_generic
, &spr_write_generic
,
564 static void register_amr_sprs(CPUPPCState
*env
)
566 #ifndef CONFIG_USER_ONLY
568 * Virtual Page Class Key protection
570 * The AMR is accessible either via SPR 13 or SPR 29. 13 is
571 * userspace accessible, 29 is privileged. So we only need to set
572 * the kvm ONE_REG id on one of them, we use 29
574 spr_register(env
, SPR_UAMR
, "UAMR",
575 &spr_read_generic
, &spr_write_amr
,
576 &spr_read_generic
, &spr_write_amr
,
578 spr_register_kvm_hv(env
, SPR_AMR
, "AMR",
579 SPR_NOACCESS
, SPR_NOACCESS
,
580 &spr_read_generic
, &spr_write_amr
,
581 &spr_read_generic
, &spr_write_generic
,
583 spr_register_kvm_hv(env
, SPR_UAMOR
, "UAMOR",
584 SPR_NOACCESS
, SPR_NOACCESS
,
585 &spr_read_generic
, &spr_write_uamor
,
586 &spr_read_generic
, &spr_write_generic
,
587 KVM_REG_PPC_UAMOR
, 0);
588 spr_register_hv(env
, SPR_AMOR
, "AMOR",
589 SPR_NOACCESS
, SPR_NOACCESS
,
590 SPR_NOACCESS
, SPR_NOACCESS
,
591 &spr_read_generic
, &spr_write_generic
,
593 #endif /* !CONFIG_USER_ONLY */
596 static void register_iamr_sprs(CPUPPCState
*env
)
598 #ifndef CONFIG_USER_ONLY
599 spr_register_kvm_hv(env
, SPR_IAMR
, "IAMR",
600 SPR_NOACCESS
, SPR_NOACCESS
,
601 &spr_read_generic
, &spr_write_iamr
,
602 &spr_read_generic
, &spr_write_generic
,
603 KVM_REG_PPC_IAMR
, 0);
604 #endif /* !CONFIG_USER_ONLY */
606 #endif /* TARGET_PPC64 */
608 static void register_thrm_sprs(CPUPPCState
*env
)
610 /* Thermal management */
611 /* XXX : not implemented */
612 spr_register(env
, SPR_THRM1
, "THRM1",
613 SPR_NOACCESS
, SPR_NOACCESS
,
614 &spr_read_thrm
, &spr_write_generic
,
616 /* XXX : not implemented */
617 spr_register(env
, SPR_THRM2
, "THRM2",
618 SPR_NOACCESS
, SPR_NOACCESS
,
619 &spr_read_thrm
, &spr_write_generic
,
621 /* XXX : not implemented */
622 spr_register(env
, SPR_THRM3
, "THRM3",
623 SPR_NOACCESS
, SPR_NOACCESS
,
624 &spr_read_thrm
, &spr_write_generic
,
628 /* SPR specific to PowerPC 604 implementation */
629 static void register_604_sprs(CPUPPCState
*env
)
631 /* Processor identification */
632 spr_register(env
, SPR_PIR
, "PIR",
633 SPR_NOACCESS
, SPR_NOACCESS
,
634 &spr_read_generic
, &spr_write_pir
,
637 /* XXX : not implemented */
638 spr_register(env
, SPR_IABR
, "IABR",
639 SPR_NOACCESS
, SPR_NOACCESS
,
640 &spr_read_generic
, &spr_write_generic
,
642 /* XXX : not implemented */
643 spr_register_kvm(env
, SPR_DABR
, "DABR",
644 SPR_NOACCESS
, SPR_NOACCESS
,
645 &spr_read_generic
, &spr_write_generic
,
646 KVM_REG_PPC_DABR
, 0x00000000);
647 /* Performance counters */
648 /* XXX : not implemented */
649 spr_register(env
, SPR_7XX_MMCR0
, "MMCR0",
650 SPR_NOACCESS
, SPR_NOACCESS
,
651 &spr_read_generic
, &spr_write_generic
,
653 /* XXX : not implemented */
654 spr_register(env
, SPR_7XX_PMC1
, "PMC1",
655 SPR_NOACCESS
, SPR_NOACCESS
,
656 &spr_read_generic
, &spr_write_generic
,
658 /* XXX : not implemented */
659 spr_register(env
, SPR_7XX_PMC2
, "PMC2",
660 SPR_NOACCESS
, SPR_NOACCESS
,
661 &spr_read_generic
, &spr_write_generic
,
663 /* XXX : not implemented */
664 spr_register(env
, SPR_7XX_SIAR
, "SIAR",
665 SPR_NOACCESS
, SPR_NOACCESS
,
666 &spr_read_generic
, SPR_NOACCESS
,
668 /* XXX : not implemented */
669 spr_register(env
, SPR_SDA
, "SDA",
670 SPR_NOACCESS
, SPR_NOACCESS
,
671 &spr_read_generic
, SPR_NOACCESS
,
673 /* External access control */
674 /* XXX : not implemented */
675 spr_register(env
, SPR_EAR
, "EAR",
676 SPR_NOACCESS
, SPR_NOACCESS
,
677 &spr_read_generic
, &spr_write_generic
,
681 /* SPR specific to PowerPC 603 implementation */
682 static void register_603_sprs(CPUPPCState
*env
)
684 /* External access control */
685 /* XXX : not implemented */
686 spr_register(env
, SPR_EAR
, "EAR",
687 SPR_NOACCESS
, SPR_NOACCESS
,
688 &spr_read_generic
, &spr_write_generic
,
691 /* XXX : not implemented */
692 spr_register(env
, SPR_IABR
, "IABR",
693 SPR_NOACCESS
, SPR_NOACCESS
,
694 &spr_read_generic
, &spr_write_generic
,
699 /* SPR specific to PowerPC G2 implementation */
700 static void register_G2_sprs(CPUPPCState
*env
)
702 /* Memory base address */
704 /* XXX : not implemented */
705 spr_register(env
, SPR_MBAR
, "MBAR",
706 SPR_NOACCESS
, SPR_NOACCESS
,
707 &spr_read_generic
, &spr_write_generic
,
709 /* Exception processing */
710 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
711 SPR_NOACCESS
, SPR_NOACCESS
,
712 &spr_read_generic
, &spr_write_generic
,
714 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
715 SPR_NOACCESS
, SPR_NOACCESS
,
716 &spr_read_generic
, &spr_write_generic
,
719 /* XXX : not implemented */
720 spr_register(env
, SPR_DABR
, "DABR",
721 SPR_NOACCESS
, SPR_NOACCESS
,
722 &spr_read_generic
, &spr_write_generic
,
724 /* XXX : not implemented */
725 spr_register(env
, SPR_DABR2
, "DABR2",
726 SPR_NOACCESS
, SPR_NOACCESS
,
727 &spr_read_generic
, &spr_write_generic
,
729 /* XXX : not implemented */
730 spr_register(env
, SPR_IABR
, "IABR",
731 SPR_NOACCESS
, SPR_NOACCESS
,
732 &spr_read_generic
, &spr_write_generic
,
734 /* XXX : not implemented */
735 spr_register(env
, SPR_IABR2
, "IABR2",
736 SPR_NOACCESS
, SPR_NOACCESS
,
737 &spr_read_generic
, &spr_write_generic
,
739 /* XXX : not implemented */
740 spr_register(env
, SPR_IBCR
, "IBCR",
741 SPR_NOACCESS
, SPR_NOACCESS
,
742 &spr_read_generic
, &spr_write_generic
,
744 /* XXX : not implemented */
745 spr_register(env
, SPR_DBCR
, "DBCR",
746 SPR_NOACCESS
, SPR_NOACCESS
,
747 &spr_read_generic
, &spr_write_generic
,
751 /* SPR specific to PowerPC 602 implementation */
752 static void register_602_sprs(CPUPPCState
*env
)
755 /* XXX : not implemented */
756 spr_register(env
, SPR_SER
, "SER",
757 SPR_NOACCESS
, SPR_NOACCESS
,
758 &spr_read_generic
, &spr_write_generic
,
760 /* XXX : not implemented */
761 spr_register(env
, SPR_SEBR
, "SEBR",
762 SPR_NOACCESS
, SPR_NOACCESS
,
763 &spr_read_generic
, &spr_write_generic
,
765 /* XXX : not implemented */
766 spr_register(env
, SPR_ESASRR
, "ESASRR",
767 SPR_NOACCESS
, SPR_NOACCESS
,
768 &spr_read_generic
, &spr_write_generic
,
770 /* Floating point status */
771 /* XXX : not implemented */
772 spr_register(env
, SPR_SP
, "SP",
773 SPR_NOACCESS
, SPR_NOACCESS
,
774 &spr_read_generic
, &spr_write_generic
,
776 /* XXX : not implemented */
777 spr_register(env
, SPR_LT
, "LT",
778 SPR_NOACCESS
, SPR_NOACCESS
,
779 &spr_read_generic
, &spr_write_generic
,
782 /* XXX : not implemented */
783 spr_register(env
, SPR_TCR
, "TCR",
784 SPR_NOACCESS
, SPR_NOACCESS
,
785 &spr_read_generic
, &spr_write_generic
,
788 spr_register(env
, SPR_IBR
, "IBR",
789 SPR_NOACCESS
, SPR_NOACCESS
,
790 &spr_read_generic
, &spr_write_generic
,
792 /* XXX : not implemented */
793 spr_register(env
, SPR_IABR
, "IABR",
794 SPR_NOACCESS
, SPR_NOACCESS
,
795 &spr_read_generic
, &spr_write_generic
,
799 /* SPR specific to PowerPC 601 implementation */
800 static void register_601_sprs(CPUPPCState
*env
)
802 /* Multiplication/division register */
804 spr_register(env
, SPR_MQ
, "MQ",
805 &spr_read_generic
, &spr_write_generic
,
806 &spr_read_generic
, &spr_write_generic
,
809 spr_register(env
, SPR_601_RTCU
, "RTCU",
810 SPR_NOACCESS
, SPR_NOACCESS
,
811 SPR_NOACCESS
, &spr_write_601_rtcu
,
813 spr_register(env
, SPR_601_VRTCU
, "RTCU",
814 &spr_read_601_rtcu
, SPR_NOACCESS
,
815 &spr_read_601_rtcu
, SPR_NOACCESS
,
817 spr_register(env
, SPR_601_RTCL
, "RTCL",
818 SPR_NOACCESS
, SPR_NOACCESS
,
819 SPR_NOACCESS
, &spr_write_601_rtcl
,
821 spr_register(env
, SPR_601_VRTCL
, "RTCL",
822 &spr_read_601_rtcl
, SPR_NOACCESS
,
823 &spr_read_601_rtcl
, SPR_NOACCESS
,
827 spr_register(env
, SPR_601_UDECR
, "UDECR",
828 &spr_read_decr
, SPR_NOACCESS
,
829 &spr_read_decr
, SPR_NOACCESS
,
832 /* External access control */
833 /* XXX : not implemented */
834 spr_register(env
, SPR_EAR
, "EAR",
835 SPR_NOACCESS
, SPR_NOACCESS
,
836 &spr_read_generic
, &spr_write_generic
,
838 /* Memory management */
839 #if !defined(CONFIG_USER_ONLY)
840 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
841 SPR_NOACCESS
, SPR_NOACCESS
,
842 &spr_read_601_ubat
, &spr_write_601_ubatu
,
844 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
845 SPR_NOACCESS
, SPR_NOACCESS
,
846 &spr_read_601_ubat
, &spr_write_601_ubatl
,
848 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
849 SPR_NOACCESS
, SPR_NOACCESS
,
850 &spr_read_601_ubat
, &spr_write_601_ubatu
,
852 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
853 SPR_NOACCESS
, SPR_NOACCESS
,
854 &spr_read_601_ubat
, &spr_write_601_ubatl
,
856 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
857 SPR_NOACCESS
, SPR_NOACCESS
,
858 &spr_read_601_ubat
, &spr_write_601_ubatu
,
860 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
861 SPR_NOACCESS
, SPR_NOACCESS
,
862 &spr_read_601_ubat
, &spr_write_601_ubatl
,
864 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
865 SPR_NOACCESS
, SPR_NOACCESS
,
866 &spr_read_601_ubat
, &spr_write_601_ubatu
,
868 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
869 SPR_NOACCESS
, SPR_NOACCESS
,
870 &spr_read_601_ubat
, &spr_write_601_ubatl
,
876 static void register_74xx_sprs(CPUPPCState
*env
)
878 /* Processor identification */
879 spr_register(env
, SPR_PIR
, "PIR",
880 SPR_NOACCESS
, SPR_NOACCESS
,
881 &spr_read_generic
, &spr_write_pir
,
883 /* XXX : not implemented */
884 spr_register(env
, SPR_74XX_MMCR2
, "MMCR2",
885 SPR_NOACCESS
, SPR_NOACCESS
,
886 &spr_read_generic
, &spr_write_generic
,
888 /* XXX : not implemented */
889 spr_register(env
, SPR_74XX_UMMCR2
, "UMMCR2",
890 &spr_read_ureg
, SPR_NOACCESS
,
891 &spr_read_ureg
, SPR_NOACCESS
,
893 /* XXX: not implemented */
894 spr_register(env
, SPR_BAMR
, "BAMR",
895 SPR_NOACCESS
, SPR_NOACCESS
,
896 &spr_read_generic
, &spr_write_generic
,
898 /* XXX : not implemented */
899 spr_register(env
, SPR_MSSCR0
, "MSSCR0",
900 SPR_NOACCESS
, SPR_NOACCESS
,
901 &spr_read_generic
, &spr_write_generic
,
903 /* Hardware implementation registers */
904 /* XXX : not implemented */
905 spr_register(env
, SPR_HID0
, "HID0",
906 SPR_NOACCESS
, SPR_NOACCESS
,
907 &spr_read_generic
, &spr_write_generic
,
909 /* XXX : not implemented */
910 spr_register(env
, SPR_HID1
, "HID1",
911 SPR_NOACCESS
, SPR_NOACCESS
,
912 &spr_read_generic
, &spr_write_generic
,
915 spr_register(env
, SPR_VRSAVE
, "VRSAVE",
916 &spr_read_generic
, &spr_write_generic
,
917 &spr_read_generic
, &spr_write_generic
,
919 /* XXX : not implemented */
920 spr_register(env
, SPR_L2CR
, "L2CR",
921 SPR_NOACCESS
, SPR_NOACCESS
,
922 &spr_read_generic
, spr_access_nop
,
926 static void register_l3_ctrl(CPUPPCState
*env
)
929 /* XXX : not implemented */
930 spr_register(env
, SPR_L3CR
, "L3CR",
931 SPR_NOACCESS
, SPR_NOACCESS
,
932 &spr_read_generic
, &spr_write_generic
,
935 /* XXX : not implemented */
936 spr_register(env
, SPR_L3ITCR0
, "L3ITCR0",
937 SPR_NOACCESS
, SPR_NOACCESS
,
938 &spr_read_generic
, &spr_write_generic
,
941 /* XXX : not implemented */
942 spr_register(env
, SPR_L3PM
, "L3PM",
943 SPR_NOACCESS
, SPR_NOACCESS
,
944 &spr_read_generic
, &spr_write_generic
,
948 static void register_usprg3_sprs(CPUPPCState
*env
)
950 spr_register(env
, SPR_USPRG3
, "USPRG3",
951 &spr_read_ureg
, SPR_NOACCESS
,
952 &spr_read_ureg
, SPR_NOACCESS
,
956 static void register_usprgh_sprs(CPUPPCState
*env
)
958 spr_register(env
, SPR_USPRG4
, "USPRG4",
959 &spr_read_ureg
, SPR_NOACCESS
,
960 &spr_read_ureg
, SPR_NOACCESS
,
962 spr_register(env
, SPR_USPRG5
, "USPRG5",
963 &spr_read_ureg
, SPR_NOACCESS
,
964 &spr_read_ureg
, SPR_NOACCESS
,
966 spr_register(env
, SPR_USPRG6
, "USPRG6",
967 &spr_read_ureg
, SPR_NOACCESS
,
968 &spr_read_ureg
, SPR_NOACCESS
,
970 spr_register(env
, SPR_USPRG7
, "USPRG7",
971 &spr_read_ureg
, SPR_NOACCESS
,
972 &spr_read_ureg
, SPR_NOACCESS
,
976 /* PowerPC BookE SPR */
977 static void register_BookE_sprs(CPUPPCState
*env
, uint64_t ivor_mask
)
979 const char *ivor_names
[64] = {
980 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
981 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
982 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
983 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
984 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
985 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
986 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
987 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
988 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
989 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
990 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
991 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
992 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
993 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
994 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
995 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
997 #define SPR_BOOKE_IVORxx (-1)
998 int ivor_sprn
[64] = {
999 SPR_BOOKE_IVOR0
, SPR_BOOKE_IVOR1
, SPR_BOOKE_IVOR2
, SPR_BOOKE_IVOR3
,
1000 SPR_BOOKE_IVOR4
, SPR_BOOKE_IVOR5
, SPR_BOOKE_IVOR6
, SPR_BOOKE_IVOR7
,
1001 SPR_BOOKE_IVOR8
, SPR_BOOKE_IVOR9
, SPR_BOOKE_IVOR10
, SPR_BOOKE_IVOR11
,
1002 SPR_BOOKE_IVOR12
, SPR_BOOKE_IVOR13
, SPR_BOOKE_IVOR14
, SPR_BOOKE_IVOR15
,
1003 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1004 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1005 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1006 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1007 SPR_BOOKE_IVOR32
, SPR_BOOKE_IVOR33
, SPR_BOOKE_IVOR34
, SPR_BOOKE_IVOR35
,
1008 SPR_BOOKE_IVOR36
, SPR_BOOKE_IVOR37
, SPR_BOOKE_IVOR38
, SPR_BOOKE_IVOR39
,
1009 SPR_BOOKE_IVOR40
, SPR_BOOKE_IVOR41
, SPR_BOOKE_IVOR42
, SPR_BOOKE_IVORxx
,
1010 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1011 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1012 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1013 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1014 SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
, SPR_BOOKE_IVORxx
,
1018 /* Interrupt processing */
1019 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
1020 SPR_NOACCESS
, SPR_NOACCESS
,
1021 &spr_read_generic
, &spr_write_generic
,
1023 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
1024 SPR_NOACCESS
, SPR_NOACCESS
,
1025 &spr_read_generic
, &spr_write_generic
,
1028 /* XXX : not implemented */
1029 spr_register(env
, SPR_BOOKE_IAC1
, "IAC1",
1030 SPR_NOACCESS
, SPR_NOACCESS
,
1031 &spr_read_generic
, &spr_write_generic
,
1033 /* XXX : not implemented */
1034 spr_register(env
, SPR_BOOKE_IAC2
, "IAC2",
1035 SPR_NOACCESS
, SPR_NOACCESS
,
1036 &spr_read_generic
, &spr_write_generic
,
1038 /* XXX : not implemented */
1039 spr_register(env
, SPR_BOOKE_DAC1
, "DAC1",
1040 SPR_NOACCESS
, SPR_NOACCESS
,
1041 &spr_read_generic
, &spr_write_generic
,
1043 /* XXX : not implemented */
1044 spr_register(env
, SPR_BOOKE_DAC2
, "DAC2",
1045 SPR_NOACCESS
, SPR_NOACCESS
,
1046 &spr_read_generic
, &spr_write_generic
,
1048 /* XXX : not implemented */
1049 spr_register(env
, SPR_BOOKE_DBCR0
, "DBCR0",
1050 SPR_NOACCESS
, SPR_NOACCESS
,
1051 &spr_read_generic
, &spr_write_40x_dbcr0
,
1053 /* XXX : not implemented */
1054 spr_register(env
, SPR_BOOKE_DBCR1
, "DBCR1",
1055 SPR_NOACCESS
, SPR_NOACCESS
,
1056 &spr_read_generic
, &spr_write_generic
,
1058 /* XXX : not implemented */
1059 spr_register(env
, SPR_BOOKE_DBCR2
, "DBCR2",
1060 SPR_NOACCESS
, SPR_NOACCESS
,
1061 &spr_read_generic
, &spr_write_generic
,
1063 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
1064 SPR_NOACCESS
, SPR_NOACCESS
,
1065 &spr_read_generic
, &spr_write_generic
,
1067 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
1068 SPR_NOACCESS
, SPR_NOACCESS
,
1069 &spr_read_generic
, &spr_write_generic
,
1071 /* XXX : not implemented */
1072 spr_register(env
, SPR_BOOKE_DBSR
, "DBSR",
1073 SPR_NOACCESS
, SPR_NOACCESS
,
1074 &spr_read_generic
, &spr_write_clear
,
1076 spr_register(env
, SPR_BOOKE_DEAR
, "DEAR",
1077 SPR_NOACCESS
, SPR_NOACCESS
,
1078 &spr_read_generic
, &spr_write_generic
,
1080 spr_register(env
, SPR_BOOKE_ESR
, "ESR",
1081 SPR_NOACCESS
, SPR_NOACCESS
,
1082 &spr_read_generic
, &spr_write_generic
,
1084 spr_register(env
, SPR_BOOKE_IVPR
, "IVPR",
1085 SPR_NOACCESS
, SPR_NOACCESS
,
1086 &spr_read_generic
, &spr_write_excp_prefix
,
1088 /* Exception vectors */
1089 for (i
= 0; i
< 64; i
++) {
1090 if (ivor_mask
& (1ULL << i
)) {
1091 if (ivor_sprn
[i
] == SPR_BOOKE_IVORxx
) {
1092 fprintf(stderr
, "ERROR: IVOR %d SPR is not defined\n", i
);
1095 spr_register(env
, ivor_sprn
[i
], ivor_names
[i
],
1096 SPR_NOACCESS
, SPR_NOACCESS
,
1097 &spr_read_generic
, &spr_write_excp_vector
,
1101 spr_register(env
, SPR_BOOKE_PID
, "PID",
1102 SPR_NOACCESS
, SPR_NOACCESS
,
1103 &spr_read_generic
, &spr_write_booke_pid
,
1105 spr_register(env
, SPR_BOOKE_TCR
, "TCR",
1106 SPR_NOACCESS
, SPR_NOACCESS
,
1107 &spr_read_generic
, &spr_write_booke_tcr
,
1109 spr_register(env
, SPR_BOOKE_TSR
, "TSR",
1110 SPR_NOACCESS
, SPR_NOACCESS
,
1111 &spr_read_generic
, &spr_write_booke_tsr
,
1114 spr_register(env
, SPR_DECR
, "DECR",
1115 SPR_NOACCESS
, SPR_NOACCESS
,
1116 &spr_read_decr
, &spr_write_decr
,
1118 spr_register(env
, SPR_BOOKE_DECAR
, "DECAR",
1119 SPR_NOACCESS
, SPR_NOACCESS
,
1120 SPR_NOACCESS
, &spr_write_generic
,
1123 spr_register(env
, SPR_USPRG0
, "USPRG0",
1124 &spr_read_generic
, &spr_write_generic
,
1125 &spr_read_generic
, &spr_write_generic
,
1127 spr_register(env
, SPR_SPRG4
, "SPRG4",
1128 SPR_NOACCESS
, SPR_NOACCESS
,
1129 &spr_read_generic
, &spr_write_generic
,
1131 spr_register(env
, SPR_SPRG5
, "SPRG5",
1132 SPR_NOACCESS
, SPR_NOACCESS
,
1133 &spr_read_generic
, &spr_write_generic
,
1135 spr_register(env
, SPR_SPRG6
, "SPRG6",
1136 SPR_NOACCESS
, SPR_NOACCESS
,
1137 &spr_read_generic
, &spr_write_generic
,
1139 spr_register(env
, SPR_SPRG7
, "SPRG7",
1140 SPR_NOACCESS
, SPR_NOACCESS
,
1141 &spr_read_generic
, &spr_write_generic
,
1143 spr_register(env
, SPR_BOOKE_SPRG8
, "SPRG8",
1144 SPR_NOACCESS
, SPR_NOACCESS
,
1145 &spr_read_generic
, &spr_write_generic
,
1147 spr_register(env
, SPR_BOOKE_SPRG9
, "SPRG9",
1148 SPR_NOACCESS
, SPR_NOACCESS
,
1149 &spr_read_generic
, &spr_write_generic
,
1153 #if !defined(CONFIG_USER_ONLY)
1154 static inline uint32_t register_tlbncfg(uint32_t assoc
, uint32_t minsize
,
1155 uint32_t maxsize
, uint32_t flags
,
1158 return (assoc
<< TLBnCFG_ASSOC_SHIFT
) |
1159 (minsize
<< TLBnCFG_MINSIZE_SHIFT
) |
1160 (maxsize
<< TLBnCFG_MAXSIZE_SHIFT
) |
1163 #endif /* !CONFIG_USER_ONLY */
1165 /* BookE 2.06 storage control registers */
1166 static void register_BookE206_sprs(CPUPPCState
*env
, uint32_t mas_mask
,
1167 uint32_t *tlbncfg
, uint32_t mmucfg
)
1169 #if !defined(CONFIG_USER_ONLY)
1170 const char *mas_names
[8] = {
1171 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1174 SPR_BOOKE_MAS0
, SPR_BOOKE_MAS1
, SPR_BOOKE_MAS2
, SPR_BOOKE_MAS3
,
1175 SPR_BOOKE_MAS4
, SPR_BOOKE_MAS5
, SPR_BOOKE_MAS6
, SPR_BOOKE_MAS7
,
1179 /* TLB assist registers */
1180 /* XXX : not implemented */
1181 for (i
= 0; i
< 8; i
++) {
1182 if (mas_mask
& (1 << i
)) {
1183 spr_register(env
, mas_sprn
[i
], mas_names
[i
],
1184 SPR_NOACCESS
, SPR_NOACCESS
,
1186 (i
== 2 && (env
->insns_flags
& PPC_64B
))
1187 ? &spr_write_generic
: &spr_write_generic32
,
1191 if (env
->nb_pids
> 1) {
1192 /* XXX : not implemented */
1193 spr_register(env
, SPR_BOOKE_PID1
, "PID1",
1194 SPR_NOACCESS
, SPR_NOACCESS
,
1195 &spr_read_generic
, &spr_write_booke_pid
,
1198 if (env
->nb_pids
> 2) {
1199 /* XXX : not implemented */
1200 spr_register(env
, SPR_BOOKE_PID2
, "PID2",
1201 SPR_NOACCESS
, SPR_NOACCESS
,
1202 &spr_read_generic
, &spr_write_booke_pid
,
1206 spr_register(env
, SPR_BOOKE_EPLC
, "EPLC",
1207 SPR_NOACCESS
, SPR_NOACCESS
,
1208 &spr_read_generic
, &spr_write_eplc
,
1210 spr_register(env
, SPR_BOOKE_EPSC
, "EPSC",
1211 SPR_NOACCESS
, SPR_NOACCESS
,
1212 &spr_read_generic
, &spr_write_epsc
,
1215 /* XXX : not implemented */
1216 spr_register(env
, SPR_MMUCFG
, "MMUCFG",
1217 SPR_NOACCESS
, SPR_NOACCESS
,
1218 &spr_read_generic
, SPR_NOACCESS
,
1220 switch (env
->nb_ways
) {
1222 spr_register(env
, SPR_BOOKE_TLB3CFG
, "TLB3CFG",
1223 SPR_NOACCESS
, SPR_NOACCESS
,
1224 &spr_read_generic
, SPR_NOACCESS
,
1228 spr_register(env
, SPR_BOOKE_TLB2CFG
, "TLB2CFG",
1229 SPR_NOACCESS
, SPR_NOACCESS
,
1230 &spr_read_generic
, SPR_NOACCESS
,
1234 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
1235 SPR_NOACCESS
, SPR_NOACCESS
,
1236 &spr_read_generic
, SPR_NOACCESS
,
1240 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
1241 SPR_NOACCESS
, SPR_NOACCESS
,
1242 &spr_read_generic
, SPR_NOACCESS
,
1251 register_usprgh_sprs(env
);
1254 /* SPR specific to PowerPC 440 implementation */
1255 static void register_440_sprs(CPUPPCState
*env
)
1258 /* XXX : not implemented */
1259 spr_register(env
, SPR_440_DNV0
, "DNV0",
1260 SPR_NOACCESS
, SPR_NOACCESS
,
1261 &spr_read_generic
, &spr_write_generic
,
1263 /* XXX : not implemented */
1264 spr_register(env
, SPR_440_DNV1
, "DNV1",
1265 SPR_NOACCESS
, SPR_NOACCESS
,
1266 &spr_read_generic
, &spr_write_generic
,
1268 /* XXX : not implemented */
1269 spr_register(env
, SPR_440_DNV2
, "DNV2",
1270 SPR_NOACCESS
, SPR_NOACCESS
,
1271 &spr_read_generic
, &spr_write_generic
,
1273 /* XXX : not implemented */
1274 spr_register(env
, SPR_440_DNV3
, "DNV3",
1275 SPR_NOACCESS
, SPR_NOACCESS
,
1276 &spr_read_generic
, &spr_write_generic
,
1278 /* XXX : not implemented */
1279 spr_register(env
, SPR_440_DTV0
, "DTV0",
1280 SPR_NOACCESS
, SPR_NOACCESS
,
1281 &spr_read_generic
, &spr_write_generic
,
1283 /* XXX : not implemented */
1284 spr_register(env
, SPR_440_DTV1
, "DTV1",
1285 SPR_NOACCESS
, SPR_NOACCESS
,
1286 &spr_read_generic
, &spr_write_generic
,
1288 /* XXX : not implemented */
1289 spr_register(env
, SPR_440_DTV2
, "DTV2",
1290 SPR_NOACCESS
, SPR_NOACCESS
,
1291 &spr_read_generic
, &spr_write_generic
,
1293 /* XXX : not implemented */
1294 spr_register(env
, SPR_440_DTV3
, "DTV3",
1295 SPR_NOACCESS
, SPR_NOACCESS
,
1296 &spr_read_generic
, &spr_write_generic
,
1298 /* XXX : not implemented */
1299 spr_register(env
, SPR_440_DVLIM
, "DVLIM",
1300 SPR_NOACCESS
, SPR_NOACCESS
,
1301 &spr_read_generic
, &spr_write_generic
,
1303 /* XXX : not implemented */
1304 spr_register(env
, SPR_440_INV0
, "INV0",
1305 SPR_NOACCESS
, SPR_NOACCESS
,
1306 &spr_read_generic
, &spr_write_generic
,
1308 /* XXX : not implemented */
1309 spr_register(env
, SPR_440_INV1
, "INV1",
1310 SPR_NOACCESS
, SPR_NOACCESS
,
1311 &spr_read_generic
, &spr_write_generic
,
1313 /* XXX : not implemented */
1314 spr_register(env
, SPR_440_INV2
, "INV2",
1315 SPR_NOACCESS
, SPR_NOACCESS
,
1316 &spr_read_generic
, &spr_write_generic
,
1318 /* XXX : not implemented */
1319 spr_register(env
, SPR_440_INV3
, "INV3",
1320 SPR_NOACCESS
, SPR_NOACCESS
,
1321 &spr_read_generic
, &spr_write_generic
,
1323 /* XXX : not implemented */
1324 spr_register(env
, SPR_440_ITV0
, "ITV0",
1325 SPR_NOACCESS
, SPR_NOACCESS
,
1326 &spr_read_generic
, &spr_write_generic
,
1328 /* XXX : not implemented */
1329 spr_register(env
, SPR_440_ITV1
, "ITV1",
1330 SPR_NOACCESS
, SPR_NOACCESS
,
1331 &spr_read_generic
, &spr_write_generic
,
1333 /* XXX : not implemented */
1334 spr_register(env
, SPR_440_ITV2
, "ITV2",
1335 SPR_NOACCESS
, SPR_NOACCESS
,
1336 &spr_read_generic
, &spr_write_generic
,
1338 /* XXX : not implemented */
1339 spr_register(env
, SPR_440_ITV3
, "ITV3",
1340 SPR_NOACCESS
, SPR_NOACCESS
,
1341 &spr_read_generic
, &spr_write_generic
,
1343 /* XXX : not implemented */
1344 spr_register(env
, SPR_440_IVLIM
, "IVLIM",
1345 SPR_NOACCESS
, SPR_NOACCESS
,
1346 &spr_read_generic
, &spr_write_generic
,
1349 /* XXX : not implemented */
1350 spr_register(env
, SPR_BOOKE_DCDBTRH
, "DCDBTRH",
1351 SPR_NOACCESS
, SPR_NOACCESS
,
1352 &spr_read_generic
, SPR_NOACCESS
,
1354 /* XXX : not implemented */
1355 spr_register(env
, SPR_BOOKE_DCDBTRL
, "DCDBTRL",
1356 SPR_NOACCESS
, SPR_NOACCESS
,
1357 &spr_read_generic
, SPR_NOACCESS
,
1359 /* XXX : not implemented */
1360 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1361 SPR_NOACCESS
, SPR_NOACCESS
,
1362 &spr_read_generic
, SPR_NOACCESS
,
1364 /* XXX : not implemented */
1365 spr_register(env
, SPR_BOOKE_ICDBTRH
, "ICDBTRH",
1366 SPR_NOACCESS
, SPR_NOACCESS
,
1367 &spr_read_generic
, SPR_NOACCESS
,
1369 /* XXX : not implemented */
1370 spr_register(env
, SPR_BOOKE_ICDBTRL
, "ICDBTRL",
1371 SPR_NOACCESS
, SPR_NOACCESS
,
1372 &spr_read_generic
, SPR_NOACCESS
,
1374 /* XXX : not implemented */
1375 spr_register(env
, SPR_440_DBDR
, "DBDR",
1376 SPR_NOACCESS
, SPR_NOACCESS
,
1377 &spr_read_generic
, &spr_write_generic
,
1379 /* Processor control */
1380 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1381 SPR_NOACCESS
, SPR_NOACCESS
,
1382 &spr_read_generic
, &spr_write_generic
,
1384 spr_register(env
, SPR_440_RSTCFG
, "RSTCFG",
1385 SPR_NOACCESS
, SPR_NOACCESS
,
1386 &spr_read_generic
, SPR_NOACCESS
,
1388 /* Storage control */
1389 spr_register(env
, SPR_440_MMUCR
, "MMUCR",
1390 SPR_NOACCESS
, SPR_NOACCESS
,
1391 &spr_read_generic
, &spr_write_generic
,
1395 /* SPR shared between PowerPC 40x implementations */
1396 static void register_40x_sprs(CPUPPCState
*env
)
1399 /* not emulated, as QEMU do not emulate caches */
1400 spr_register(env
, SPR_40x_DCCR
, "DCCR",
1401 SPR_NOACCESS
, SPR_NOACCESS
,
1402 &spr_read_generic
, &spr_write_generic
,
1404 /* not emulated, as QEMU do not emulate caches */
1405 spr_register(env
, SPR_40x_ICCR
, "ICCR",
1406 SPR_NOACCESS
, SPR_NOACCESS
,
1407 &spr_read_generic
, &spr_write_generic
,
1409 /* not emulated, as QEMU do not emulate caches */
1410 spr_register(env
, SPR_BOOKE_ICDBDR
, "ICDBDR",
1411 SPR_NOACCESS
, SPR_NOACCESS
,
1412 &spr_read_generic
, SPR_NOACCESS
,
1415 spr_register(env
, SPR_40x_DEAR
, "DEAR",
1416 SPR_NOACCESS
, SPR_NOACCESS
,
1417 &spr_read_generic
, &spr_write_generic
,
1419 spr_register(env
, SPR_40x_ESR
, "ESR",
1420 SPR_NOACCESS
, SPR_NOACCESS
,
1421 &spr_read_generic
, &spr_write_generic
,
1423 spr_register(env
, SPR_40x_EVPR
, "EVPR",
1424 SPR_NOACCESS
, SPR_NOACCESS
,
1425 &spr_read_generic
, &spr_write_excp_prefix
,
1427 spr_register(env
, SPR_40x_SRR2
, "SRR2",
1428 &spr_read_generic
, &spr_write_generic
,
1429 &spr_read_generic
, &spr_write_generic
,
1431 spr_register(env
, SPR_40x_SRR3
, "SRR3",
1432 &spr_read_generic
, &spr_write_generic
,
1433 &spr_read_generic
, &spr_write_generic
,
1436 spr_register(env
, SPR_40x_PIT
, "PIT",
1437 SPR_NOACCESS
, SPR_NOACCESS
,
1438 &spr_read_40x_pit
, &spr_write_40x_pit
,
1440 spr_register(env
, SPR_40x_TCR
, "TCR",
1441 SPR_NOACCESS
, SPR_NOACCESS
,
1442 &spr_read_generic
, &spr_write_booke_tcr
,
1444 spr_register(env
, SPR_40x_TSR
, "TSR",
1445 SPR_NOACCESS
, SPR_NOACCESS
,
1446 &spr_read_generic
, &spr_write_booke_tsr
,
1450 /* SPR specific to PowerPC 405 implementation */
1451 static void register_405_sprs(CPUPPCState
*env
)
1454 spr_register(env
, SPR_40x_PID
, "PID",
1455 SPR_NOACCESS
, SPR_NOACCESS
,
1456 &spr_read_generic
, &spr_write_generic
,
1458 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1459 SPR_NOACCESS
, SPR_NOACCESS
,
1460 &spr_read_generic
, &spr_write_generic
,
1462 /* Debug interface */
1463 /* XXX : not implemented */
1464 spr_register(env
, SPR_40x_DBCR0
, "DBCR0",
1465 SPR_NOACCESS
, SPR_NOACCESS
,
1466 &spr_read_generic
, &spr_write_40x_dbcr0
,
1468 /* XXX : not implemented */
1469 spr_register(env
, SPR_405_DBCR1
, "DBCR1",
1470 SPR_NOACCESS
, SPR_NOACCESS
,
1471 &spr_read_generic
, &spr_write_generic
,
1473 /* XXX : not implemented */
1474 spr_register(env
, SPR_40x_DBSR
, "DBSR",
1475 SPR_NOACCESS
, SPR_NOACCESS
,
1476 &spr_read_generic
, &spr_write_clear
,
1477 /* Last reset was system reset */
1479 /* XXX : not implemented */
1480 spr_register(env
, SPR_40x_DAC1
, "DAC1",
1481 SPR_NOACCESS
, SPR_NOACCESS
,
1482 &spr_read_generic
, &spr_write_generic
,
1484 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1485 SPR_NOACCESS
, SPR_NOACCESS
,
1486 &spr_read_generic
, &spr_write_generic
,
1488 /* XXX : not implemented */
1489 spr_register(env
, SPR_405_DVC1
, "DVC1",
1490 SPR_NOACCESS
, SPR_NOACCESS
,
1491 &spr_read_generic
, &spr_write_generic
,
1493 /* XXX : not implemented */
1494 spr_register(env
, SPR_405_DVC2
, "DVC2",
1495 SPR_NOACCESS
, SPR_NOACCESS
,
1496 &spr_read_generic
, &spr_write_generic
,
1498 /* XXX : not implemented */
1499 spr_register(env
, SPR_40x_IAC1
, "IAC1",
1500 SPR_NOACCESS
, SPR_NOACCESS
,
1501 &spr_read_generic
, &spr_write_generic
,
1503 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1504 SPR_NOACCESS
, SPR_NOACCESS
,
1505 &spr_read_generic
, &spr_write_generic
,
1507 /* XXX : not implemented */
1508 spr_register(env
, SPR_405_IAC3
, "IAC3",
1509 SPR_NOACCESS
, SPR_NOACCESS
,
1510 &spr_read_generic
, &spr_write_generic
,
1512 /* XXX : not implemented */
1513 spr_register(env
, SPR_405_IAC4
, "IAC4",
1514 SPR_NOACCESS
, SPR_NOACCESS
,
1515 &spr_read_generic
, &spr_write_generic
,
1517 /* Storage control */
1518 /* XXX: TODO: not implemented */
1519 spr_register(env
, SPR_405_SLER
, "SLER",
1520 SPR_NOACCESS
, SPR_NOACCESS
,
1521 &spr_read_generic
, &spr_write_40x_sler
,
1523 spr_register(env
, SPR_40x_ZPR
, "ZPR",
1524 SPR_NOACCESS
, SPR_NOACCESS
,
1525 &spr_read_generic
, &spr_write_generic
,
1527 /* XXX : not implemented */
1528 spr_register(env
, SPR_405_SU0R
, "SU0R",
1529 SPR_NOACCESS
, SPR_NOACCESS
,
1530 &spr_read_generic
, &spr_write_generic
,
1533 spr_register(env
, SPR_USPRG0
, "USPRG0",
1534 &spr_read_ureg
, SPR_NOACCESS
,
1535 &spr_read_ureg
, SPR_NOACCESS
,
1537 spr_register(env
, SPR_SPRG4
, "SPRG4",
1538 SPR_NOACCESS
, SPR_NOACCESS
,
1539 &spr_read_generic
, &spr_write_generic
,
1541 spr_register(env
, SPR_SPRG5
, "SPRG5",
1542 SPR_NOACCESS
, SPR_NOACCESS
,
1543 spr_read_generic
, &spr_write_generic
,
1545 spr_register(env
, SPR_SPRG6
, "SPRG6",
1546 SPR_NOACCESS
, SPR_NOACCESS
,
1547 spr_read_generic
, &spr_write_generic
,
1549 spr_register(env
, SPR_SPRG7
, "SPRG7",
1550 SPR_NOACCESS
, SPR_NOACCESS
,
1551 spr_read_generic
, &spr_write_generic
,
1553 register_usprgh_sprs(env
);
1557 static void register_5xx_8xx_sprs(CPUPPCState
*env
)
1559 /* Exception processing */
1560 spr_register_kvm(env
, SPR_DSISR
, "DSISR",
1561 SPR_NOACCESS
, SPR_NOACCESS
,
1562 &spr_read_generic
, &spr_write_generic
,
1563 KVM_REG_PPC_DSISR
, 0x00000000);
1564 spr_register_kvm(env
, SPR_DAR
, "DAR",
1565 SPR_NOACCESS
, SPR_NOACCESS
,
1566 &spr_read_generic
, &spr_write_generic
,
1567 KVM_REG_PPC_DAR
, 0x00000000);
1569 spr_register(env
, SPR_DECR
, "DECR",
1570 SPR_NOACCESS
, SPR_NOACCESS
,
1571 &spr_read_decr
, &spr_write_decr
,
1573 /* XXX : not implemented */
1574 spr_register(env
, SPR_MPC_EIE
, "EIE",
1575 SPR_NOACCESS
, SPR_NOACCESS
,
1576 &spr_read_generic
, &spr_write_generic
,
1578 /* XXX : not implemented */
1579 spr_register(env
, SPR_MPC_EID
, "EID",
1580 SPR_NOACCESS
, SPR_NOACCESS
,
1581 &spr_read_generic
, &spr_write_generic
,
1583 /* XXX : not implemented */
1584 spr_register(env
, SPR_MPC_NRI
, "NRI",
1585 SPR_NOACCESS
, SPR_NOACCESS
,
1586 &spr_read_generic
, &spr_write_generic
,
1588 /* XXX : not implemented */
1589 spr_register(env
, SPR_MPC_CMPA
, "CMPA",
1590 SPR_NOACCESS
, SPR_NOACCESS
,
1591 &spr_read_generic
, &spr_write_generic
,
1593 /* XXX : not implemented */
1594 spr_register(env
, SPR_MPC_CMPB
, "CMPB",
1595 SPR_NOACCESS
, SPR_NOACCESS
,
1596 &spr_read_generic
, &spr_write_generic
,
1598 /* XXX : not implemented */
1599 spr_register(env
, SPR_MPC_CMPC
, "CMPC",
1600 SPR_NOACCESS
, SPR_NOACCESS
,
1601 &spr_read_generic
, &spr_write_generic
,
1603 /* XXX : not implemented */
1604 spr_register(env
, SPR_MPC_CMPD
, "CMPD",
1605 SPR_NOACCESS
, SPR_NOACCESS
,
1606 &spr_read_generic
, &spr_write_generic
,
1608 /* XXX : not implemented */
1609 spr_register(env
, SPR_MPC_ECR
, "ECR",
1610 SPR_NOACCESS
, SPR_NOACCESS
,
1611 &spr_read_generic
, &spr_write_generic
,
1613 /* XXX : not implemented */
1614 spr_register(env
, SPR_MPC_DER
, "DER",
1615 SPR_NOACCESS
, SPR_NOACCESS
,
1616 &spr_read_generic
, &spr_write_generic
,
1618 /* XXX : not implemented */
1619 spr_register(env
, SPR_MPC_COUNTA
, "COUNTA",
1620 SPR_NOACCESS
, SPR_NOACCESS
,
1621 &spr_read_generic
, &spr_write_generic
,
1623 /* XXX : not implemented */
1624 spr_register(env
, SPR_MPC_COUNTB
, "COUNTB",
1625 SPR_NOACCESS
, SPR_NOACCESS
,
1626 &spr_read_generic
, &spr_write_generic
,
1628 /* XXX : not implemented */
1629 spr_register(env
, SPR_MPC_CMPE
, "CMPE",
1630 SPR_NOACCESS
, SPR_NOACCESS
,
1631 &spr_read_generic
, &spr_write_generic
,
1633 /* XXX : not implemented */
1634 spr_register(env
, SPR_MPC_CMPF
, "CMPF",
1635 SPR_NOACCESS
, SPR_NOACCESS
,
1636 &spr_read_generic
, &spr_write_generic
,
1638 /* XXX : not implemented */
1639 spr_register(env
, SPR_MPC_CMPG
, "CMPG",
1640 SPR_NOACCESS
, SPR_NOACCESS
,
1641 &spr_read_generic
, &spr_write_generic
,
1643 /* XXX : not implemented */
1644 spr_register(env
, SPR_MPC_CMPH
, "CMPH",
1645 SPR_NOACCESS
, SPR_NOACCESS
,
1646 &spr_read_generic
, &spr_write_generic
,
1648 /* XXX : not implemented */
1649 spr_register(env
, SPR_MPC_LCTRL1
, "LCTRL1",
1650 SPR_NOACCESS
, SPR_NOACCESS
,
1651 &spr_read_generic
, &spr_write_generic
,
1653 /* XXX : not implemented */
1654 spr_register(env
, SPR_MPC_LCTRL2
, "LCTRL2",
1655 SPR_NOACCESS
, SPR_NOACCESS
,
1656 &spr_read_generic
, &spr_write_generic
,
1658 /* XXX : not implemented */
1659 spr_register(env
, SPR_MPC_BAR
, "BAR",
1660 SPR_NOACCESS
, SPR_NOACCESS
,
1661 &spr_read_generic
, &spr_write_generic
,
1663 /* XXX : not implemented */
1664 spr_register(env
, SPR_MPC_DPDR
, "DPDR",
1665 SPR_NOACCESS
, SPR_NOACCESS
,
1666 &spr_read_generic
, &spr_write_generic
,
1668 /* XXX : not implemented */
1669 spr_register(env
, SPR_MPC_IMMR
, "IMMR",
1670 SPR_NOACCESS
, SPR_NOACCESS
,
1671 &spr_read_generic
, &spr_write_generic
,
1675 static void register_5xx_sprs(CPUPPCState
*env
)
1677 /* XXX : not implemented */
1678 spr_register(env
, SPR_RCPU_MI_GRA
, "MI_GRA",
1679 SPR_NOACCESS
, SPR_NOACCESS
,
1680 &spr_read_generic
, &spr_write_generic
,
1682 /* XXX : not implemented */
1683 spr_register(env
, SPR_RCPU_L2U_GRA
, "L2U_GRA",
1684 SPR_NOACCESS
, SPR_NOACCESS
,
1685 &spr_read_generic
, &spr_write_generic
,
1687 /* XXX : not implemented */
1688 spr_register(env
, SPR_RPCU_BBCMCR
, "L2U_BBCMCR",
1689 SPR_NOACCESS
, SPR_NOACCESS
,
1690 &spr_read_generic
, &spr_write_generic
,
1692 /* XXX : not implemented */
1693 spr_register(env
, SPR_RCPU_L2U_MCR
, "L2U_MCR",
1694 SPR_NOACCESS
, SPR_NOACCESS
,
1695 &spr_read_generic
, &spr_write_generic
,
1697 /* XXX : not implemented */
1698 spr_register(env
, SPR_RCPU_MI_RBA0
, "MI_RBA0",
1699 SPR_NOACCESS
, SPR_NOACCESS
,
1700 &spr_read_generic
, &spr_write_generic
,
1702 /* XXX : not implemented */
1703 spr_register(env
, SPR_RCPU_MI_RBA1
, "MI_RBA1",
1704 SPR_NOACCESS
, SPR_NOACCESS
,
1705 &spr_read_generic
, &spr_write_generic
,
1707 /* XXX : not implemented */
1708 spr_register(env
, SPR_RCPU_MI_RBA2
, "MI_RBA2",
1709 SPR_NOACCESS
, SPR_NOACCESS
,
1710 &spr_read_generic
, &spr_write_generic
,
1712 /* XXX : not implemented */
1713 spr_register(env
, SPR_RCPU_MI_RBA3
, "MI_RBA3",
1714 SPR_NOACCESS
, SPR_NOACCESS
,
1715 &spr_read_generic
, &spr_write_generic
,
1717 /* XXX : not implemented */
1718 spr_register(env
, SPR_RCPU_L2U_RBA0
, "L2U_RBA0",
1719 SPR_NOACCESS
, SPR_NOACCESS
,
1720 &spr_read_generic
, &spr_write_generic
,
1722 /* XXX : not implemented */
1723 spr_register(env
, SPR_RCPU_L2U_RBA1
, "L2U_RBA1",
1724 SPR_NOACCESS
, SPR_NOACCESS
,
1725 &spr_read_generic
, &spr_write_generic
,
1727 /* XXX : not implemented */
1728 spr_register(env
, SPR_RCPU_L2U_RBA2
, "L2U_RBA2",
1729 SPR_NOACCESS
, SPR_NOACCESS
,
1730 &spr_read_generic
, &spr_write_generic
,
1732 /* XXX : not implemented */
1733 spr_register(env
, SPR_RCPU_L2U_RBA3
, "L2U_RBA3",
1734 SPR_NOACCESS
, SPR_NOACCESS
,
1735 &spr_read_generic
, &spr_write_generic
,
1737 /* XXX : not implemented */
1738 spr_register(env
, SPR_RCPU_MI_RA0
, "MI_RA0",
1739 SPR_NOACCESS
, SPR_NOACCESS
,
1740 &spr_read_generic
, &spr_write_generic
,
1742 /* XXX : not implemented */
1743 spr_register(env
, SPR_RCPU_MI_RA1
, "MI_RA1",
1744 SPR_NOACCESS
, SPR_NOACCESS
,
1745 &spr_read_generic
, &spr_write_generic
,
1747 /* XXX : not implemented */
1748 spr_register(env
, SPR_RCPU_MI_RA2
, "MI_RA2",
1749 SPR_NOACCESS
, SPR_NOACCESS
,
1750 &spr_read_generic
, &spr_write_generic
,
1752 /* XXX : not implemented */
1753 spr_register(env
, SPR_RCPU_MI_RA3
, "MI_RA3",
1754 SPR_NOACCESS
, SPR_NOACCESS
,
1755 &spr_read_generic
, &spr_write_generic
,
1757 /* XXX : not implemented */
1758 spr_register(env
, SPR_RCPU_L2U_RA0
, "L2U_RA0",
1759 SPR_NOACCESS
, SPR_NOACCESS
,
1760 &spr_read_generic
, &spr_write_generic
,
1762 /* XXX : not implemented */
1763 spr_register(env
, SPR_RCPU_L2U_RA1
, "L2U_RA1",
1764 SPR_NOACCESS
, SPR_NOACCESS
,
1765 &spr_read_generic
, &spr_write_generic
,
1767 /* XXX : not implemented */
1768 spr_register(env
, SPR_RCPU_L2U_RA2
, "L2U_RA2",
1769 SPR_NOACCESS
, SPR_NOACCESS
,
1770 &spr_read_generic
, &spr_write_generic
,
1772 /* XXX : not implemented */
1773 spr_register(env
, SPR_RCPU_L2U_RA3
, "L2U_RA3",
1774 SPR_NOACCESS
, SPR_NOACCESS
,
1775 &spr_read_generic
, &spr_write_generic
,
1777 /* XXX : not implemented */
1778 spr_register(env
, SPR_RCPU_FPECR
, "FPECR",
1779 SPR_NOACCESS
, SPR_NOACCESS
,
1780 &spr_read_generic
, &spr_write_generic
,
1784 static void register_8xx_sprs(CPUPPCState
*env
)
1786 /* XXX : not implemented */
1787 spr_register(env
, SPR_MPC_IC_CST
, "IC_CST",
1788 SPR_NOACCESS
, SPR_NOACCESS
,
1789 &spr_read_generic
, &spr_write_generic
,
1791 /* XXX : not implemented */
1792 spr_register(env
, SPR_MPC_IC_ADR
, "IC_ADR",
1793 SPR_NOACCESS
, SPR_NOACCESS
,
1794 &spr_read_generic
, &spr_write_generic
,
1796 /* XXX : not implemented */
1797 spr_register(env
, SPR_MPC_IC_DAT
, "IC_DAT",
1798 SPR_NOACCESS
, SPR_NOACCESS
,
1799 &spr_read_generic
, &spr_write_generic
,
1801 /* XXX : not implemented */
1802 spr_register(env
, SPR_MPC_DC_CST
, "DC_CST",
1803 SPR_NOACCESS
, SPR_NOACCESS
,
1804 &spr_read_generic
, &spr_write_generic
,
1806 /* XXX : not implemented */
1807 spr_register(env
, SPR_MPC_DC_ADR
, "DC_ADR",
1808 SPR_NOACCESS
, SPR_NOACCESS
,
1809 &spr_read_generic
, &spr_write_generic
,
1811 /* XXX : not implemented */
1812 spr_register(env
, SPR_MPC_DC_DAT
, "DC_DAT",
1813 SPR_NOACCESS
, SPR_NOACCESS
,
1814 &spr_read_generic
, &spr_write_generic
,
1816 /* XXX : not implemented */
1817 spr_register(env
, SPR_MPC_MI_CTR
, "MI_CTR",
1818 SPR_NOACCESS
, SPR_NOACCESS
,
1819 &spr_read_generic
, &spr_write_generic
,
1821 /* XXX : not implemented */
1822 spr_register(env
, SPR_MPC_MI_AP
, "MI_AP",
1823 SPR_NOACCESS
, SPR_NOACCESS
,
1824 &spr_read_generic
, &spr_write_generic
,
1826 /* XXX : not implemented */
1827 spr_register(env
, SPR_MPC_MI_EPN
, "MI_EPN",
1828 SPR_NOACCESS
, SPR_NOACCESS
,
1829 &spr_read_generic
, &spr_write_generic
,
1831 /* XXX : not implemented */
1832 spr_register(env
, SPR_MPC_MI_TWC
, "MI_TWC",
1833 SPR_NOACCESS
, SPR_NOACCESS
,
1834 &spr_read_generic
, &spr_write_generic
,
1836 /* XXX : not implemented */
1837 spr_register(env
, SPR_MPC_MI_RPN
, "MI_RPN",
1838 SPR_NOACCESS
, SPR_NOACCESS
,
1839 &spr_read_generic
, &spr_write_generic
,
1841 /* XXX : not implemented */
1842 spr_register(env
, SPR_MPC_MI_DBCAM
, "MI_DBCAM",
1843 SPR_NOACCESS
, SPR_NOACCESS
,
1844 &spr_read_generic
, &spr_write_generic
,
1846 /* XXX : not implemented */
1847 spr_register(env
, SPR_MPC_MI_DBRAM0
, "MI_DBRAM0",
1848 SPR_NOACCESS
, SPR_NOACCESS
,
1849 &spr_read_generic
, &spr_write_generic
,
1851 /* XXX : not implemented */
1852 spr_register(env
, SPR_MPC_MI_DBRAM1
, "MI_DBRAM1",
1853 SPR_NOACCESS
, SPR_NOACCESS
,
1854 &spr_read_generic
, &spr_write_generic
,
1856 /* XXX : not implemented */
1857 spr_register(env
, SPR_MPC_MD_CTR
, "MD_CTR",
1858 SPR_NOACCESS
, SPR_NOACCESS
,
1859 &spr_read_generic
, &spr_write_generic
,
1861 /* XXX : not implemented */
1862 spr_register(env
, SPR_MPC_MD_CASID
, "MD_CASID",
1863 SPR_NOACCESS
, SPR_NOACCESS
,
1864 &spr_read_generic
, &spr_write_generic
,
1866 /* XXX : not implemented */
1867 spr_register(env
, SPR_MPC_MD_AP
, "MD_AP",
1868 SPR_NOACCESS
, SPR_NOACCESS
,
1869 &spr_read_generic
, &spr_write_generic
,
1871 /* XXX : not implemented */
1872 spr_register(env
, SPR_MPC_MD_EPN
, "MD_EPN",
1873 SPR_NOACCESS
, SPR_NOACCESS
,
1874 &spr_read_generic
, &spr_write_generic
,
1876 /* XXX : not implemented */
1877 spr_register(env
, SPR_MPC_MD_TWB
, "MD_TWB",
1878 SPR_NOACCESS
, SPR_NOACCESS
,
1879 &spr_read_generic
, &spr_write_generic
,
1881 /* XXX : not implemented */
1882 spr_register(env
, SPR_MPC_MD_TWC
, "MD_TWC",
1883 SPR_NOACCESS
, SPR_NOACCESS
,
1884 &spr_read_generic
, &spr_write_generic
,
1886 /* XXX : not implemented */
1887 spr_register(env
, SPR_MPC_MD_RPN
, "MD_RPN",
1888 SPR_NOACCESS
, SPR_NOACCESS
,
1889 &spr_read_generic
, &spr_write_generic
,
1891 /* XXX : not implemented */
1892 spr_register(env
, SPR_MPC_MD_TW
, "MD_TW",
1893 SPR_NOACCESS
, SPR_NOACCESS
,
1894 &spr_read_generic
, &spr_write_generic
,
1896 /* XXX : not implemented */
1897 spr_register(env
, SPR_MPC_MD_DBCAM
, "MD_DBCAM",
1898 SPR_NOACCESS
, SPR_NOACCESS
,
1899 &spr_read_generic
, &spr_write_generic
,
1901 /* XXX : not implemented */
1902 spr_register(env
, SPR_MPC_MD_DBRAM0
, "MD_DBRAM0",
1903 SPR_NOACCESS
, SPR_NOACCESS
,
1904 &spr_read_generic
, &spr_write_generic
,
1906 /* XXX : not implemented */
1907 spr_register(env
, SPR_MPC_MD_DBRAM1
, "MD_DBRAM1",
1908 SPR_NOACCESS
, SPR_NOACCESS
,
1909 &spr_read_generic
, &spr_write_generic
,
1914 * AMR => SPR 29 (Power 2.04)
1915 * CTRL => SPR 136 (Power 2.04)
1916 * CTRL => SPR 152 (Power 2.04)
1917 * SCOMC => SPR 276 (64 bits ?)
1918 * SCOMD => SPR 277 (64 bits ?)
1919 * TBU40 => SPR 286 (Power 2.04 hypv)
1920 * HSPRG0 => SPR 304 (Power 2.04 hypv)
1921 * HSPRG1 => SPR 305 (Power 2.04 hypv)
1922 * HDSISR => SPR 306 (Power 2.04 hypv)
1923 * HDAR => SPR 307 (Power 2.04 hypv)
1924 * PURR => SPR 309 (Power 2.04 hypv)
1925 * HDEC => SPR 310 (Power 2.04 hypv)
1926 * HIOR => SPR 311 (hypv)
1927 * RMOR => SPR 312 (970)
1928 * HRMOR => SPR 313 (Power 2.04 hypv)
1929 * HSRR0 => SPR 314 (Power 2.04 hypv)
1930 * HSRR1 => SPR 315 (Power 2.04 hypv)
1931 * LPIDR => SPR 317 (970)
1932 * EPR => SPR 702 (Power 2.04 emb)
1933 * perf => 768-783 (Power 2.04)
1934 * perf => 784-799 (Power 2.04)
1935 * PPR => SPR 896 (Power 2.04)
1936 * DABRX => 1015 (Power 2.04 hypv)
1937 * FPECR => SPR 1022 (?)
1938 * ... and more (thermal management, performance counters, ...)
1941 /*****************************************************************************/
1942 /* Exception vectors models */
1943 static void init_excp_4xx_softmmu(CPUPPCState
*env
)
1945 #if !defined(CONFIG_USER_ONLY)
1946 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000100;
1947 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1948 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1949 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1950 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1951 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1952 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1953 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1954 env
->excp_vectors
[POWERPC_EXCP_PIT
] = 0x00001000;
1955 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00001010;
1956 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00001020;
1957 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001100;
1958 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001200;
1959 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00002000;
1960 env
->ivor_mask
= 0x0000FFF0UL
;
1961 env
->ivpr_mask
= 0xFFFF0000UL
;
1962 /* Hardware reset vector */
1963 env
->hreset_vector
= 0xFFFFFFFCUL
;
1967 static void init_excp_MPC5xx(CPUPPCState
*env
)
1969 #if !defined(CONFIG_USER_ONLY)
1970 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1971 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1972 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
1973 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
1974 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
1975 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
1976 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
1977 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
1978 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
1979 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
1980 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
1981 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
1982 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
1983 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
1984 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
1985 env
->ivor_mask
= 0x0000FFF0UL
;
1986 env
->ivpr_mask
= 0xFFFF0000UL
;
1987 /* Hardware reset vector */
1988 env
->hreset_vector
= 0x00000100UL
;
1992 static void init_excp_MPC8xx(CPUPPCState
*env
)
1994 #if !defined(CONFIG_USER_ONLY)
1995 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
1996 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
1997 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
1998 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
1999 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2000 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2001 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2002 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2003 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2004 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2005 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2006 env
->excp_vectors
[POWERPC_EXCP_FPA
] = 0x00000E00;
2007 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001000;
2008 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00001100;
2009 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00001200;
2010 env
->excp_vectors
[POWERPC_EXCP_ITLBE
] = 0x00001300;
2011 env
->excp_vectors
[POWERPC_EXCP_DTLBE
] = 0x00001400;
2012 env
->excp_vectors
[POWERPC_EXCP_DABR
] = 0x00001C00;
2013 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001C00;
2014 env
->excp_vectors
[POWERPC_EXCP_MEXTBR
] = 0x00001E00;
2015 env
->excp_vectors
[POWERPC_EXCP_NMEXTBR
] = 0x00001F00;
2016 env
->ivor_mask
= 0x0000FFF0UL
;
2017 env
->ivpr_mask
= 0xFFFF0000UL
;
2018 /* Hardware reset vector */
2019 env
->hreset_vector
= 0x00000100UL
;
2023 static void init_excp_G2(CPUPPCState
*env
)
2025 #if !defined(CONFIG_USER_ONLY)
2026 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2027 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2028 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2029 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2030 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2031 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2032 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2033 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2034 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2035 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000A00;
2036 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2037 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2038 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2039 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2040 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2041 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2042 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2043 /* Hardware reset vector */
2044 env
->hreset_vector
= 0x00000100UL
;
2048 static void init_excp_e200(CPUPPCState
*env
, target_ulong ivpr_mask
)
2050 #if !defined(CONFIG_USER_ONLY)
2051 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000FFC;
2052 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
2053 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
2054 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
2055 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
2056 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
2057 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
2058 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
2059 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
2060 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
2061 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
2062 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
2063 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
2064 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
2065 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
2066 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
2067 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
2068 env
->excp_vectors
[POWERPC_EXCP_SPEU
] = 0x00000000;
2069 env
->excp_vectors
[POWERPC_EXCP_EFPDI
] = 0x00000000;
2070 env
->excp_vectors
[POWERPC_EXCP_EFPRI
] = 0x00000000;
2071 env
->ivor_mask
= 0x0000FFF7UL
;
2072 env
->ivpr_mask
= ivpr_mask
;
2073 /* Hardware reset vector */
2074 env
->hreset_vector
= 0xFFFFFFFCUL
;
2078 static void init_excp_BookE(CPUPPCState
*env
)
2080 #if !defined(CONFIG_USER_ONLY)
2081 env
->excp_vectors
[POWERPC_EXCP_CRITICAL
] = 0x00000000;
2082 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000000;
2083 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000000;
2084 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000000;
2085 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000000;
2086 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000000;
2087 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000000;
2088 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000000;
2089 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000000;
2090 env
->excp_vectors
[POWERPC_EXCP_APU
] = 0x00000000;
2091 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000000;
2092 env
->excp_vectors
[POWERPC_EXCP_FIT
] = 0x00000000;
2093 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00000000;
2094 env
->excp_vectors
[POWERPC_EXCP_DTLB
] = 0x00000000;
2095 env
->excp_vectors
[POWERPC_EXCP_ITLB
] = 0x00000000;
2096 env
->excp_vectors
[POWERPC_EXCP_DEBUG
] = 0x00000000;
2097 env
->ivor_mask
= 0x0000FFF0UL
;
2098 env
->ivpr_mask
= 0xFFFF0000UL
;
2099 /* Hardware reset vector */
2100 env
->hreset_vector
= 0xFFFFFFFCUL
;
2104 static void init_excp_601(CPUPPCState
*env
)
2106 #if !defined(CONFIG_USER_ONLY)
2107 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2108 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2109 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2110 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2111 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2112 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2113 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2114 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2115 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2116 env
->excp_vectors
[POWERPC_EXCP_IO
] = 0x00000A00;
2117 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2118 env
->excp_vectors
[POWERPC_EXCP_RUNM
] = 0x00002000;
2119 /* Hardware reset vector */
2120 env
->hreset_vector
= 0x00000100UL
;
2124 static void init_excp_602(CPUPPCState
*env
)
2126 #if !defined(CONFIG_USER_ONLY)
2127 /* XXX: exception prefix has a special behavior on 602 */
2128 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2129 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2130 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2131 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2132 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2133 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2134 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2135 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2136 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2137 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2138 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2139 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2140 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2141 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2142 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2143 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2144 env
->excp_vectors
[POWERPC_EXCP_WDT
] = 0x00001500;
2145 env
->excp_vectors
[POWERPC_EXCP_EMUL
] = 0x00001600;
2146 /* Hardware reset vector */
2147 env
->hreset_vector
= 0x00000100UL
;
2151 static void init_excp_603(CPUPPCState
*env
)
2153 #if !defined(CONFIG_USER_ONLY)
2154 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2155 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2156 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2157 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2158 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2159 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2160 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2161 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2162 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2163 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2164 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2165 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2166 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2167 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2168 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2169 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2170 /* Hardware reset vector */
2171 env
->hreset_vector
= 0x00000100UL
;
2175 static void init_excp_604(CPUPPCState
*env
)
2177 #if !defined(CONFIG_USER_ONLY)
2178 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2179 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2180 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2181 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2182 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2183 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2184 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2185 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2186 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2187 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2188 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2189 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2190 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2191 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2192 /* Hardware reset vector */
2193 env
->hreset_vector
= 0x00000100UL
;
2197 static void init_excp_7x0(CPUPPCState
*env
)
2199 #if !defined(CONFIG_USER_ONLY)
2200 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2201 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2202 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2203 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2204 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2205 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2206 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2207 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2208 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2209 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2210 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2211 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2212 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2213 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2214 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2215 /* Hardware reset vector */
2216 env
->hreset_vector
= 0x00000100UL
;
2220 static void init_excp_750cl(CPUPPCState
*env
)
2222 #if !defined(CONFIG_USER_ONLY)
2223 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2224 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2225 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2226 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2227 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2228 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2229 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2230 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2231 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2232 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2233 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2234 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2235 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2236 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2237 /* Hardware reset vector */
2238 env
->hreset_vector
= 0x00000100UL
;
2242 static void init_excp_750cx(CPUPPCState
*env
)
2244 #if !defined(CONFIG_USER_ONLY)
2245 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2246 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2247 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2248 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2249 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2250 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2251 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2252 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2253 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2254 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2255 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2256 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2257 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2258 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2259 /* Hardware reset vector */
2260 env
->hreset_vector
= 0x00000100UL
;
2264 /* XXX: Check if this is correct */
2265 static void init_excp_7x5(CPUPPCState
*env
)
2267 #if !defined(CONFIG_USER_ONLY)
2268 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2269 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2270 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2271 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2272 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2273 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2274 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2275 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2276 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2277 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2278 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2279 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2280 env
->excp_vectors
[POWERPC_EXCP_IFTLB
] = 0x00001000;
2281 env
->excp_vectors
[POWERPC_EXCP_DLTLB
] = 0x00001100;
2282 env
->excp_vectors
[POWERPC_EXCP_DSTLB
] = 0x00001200;
2283 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2284 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2285 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2286 /* Hardware reset vector */
2287 env
->hreset_vector
= 0x00000100UL
;
2291 static void init_excp_7400(CPUPPCState
*env
)
2293 #if !defined(CONFIG_USER_ONLY)
2294 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2295 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2296 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2297 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2298 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2299 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2300 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2301 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2302 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2303 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2304 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2305 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2306 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2307 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2308 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2309 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
2310 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001700;
2311 /* Hardware reset vector */
2312 env
->hreset_vector
= 0x00000100UL
;
2316 static void init_excp_7450(CPUPPCState
*env
)
2318 #if !defined(CONFIG_USER_ONLY)
2319 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2320 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2321 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2322 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2323 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2324 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2325 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2326 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2327 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2328 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2329 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2330 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2331 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2332 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2333 env
->excp_vectors
[POWERPC_EXCP_SMI
] = 0x00001400;
2334 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001600;
2335 /* Hardware reset vector */
2336 env
->hreset_vector
= 0x00000100UL
;
2340 #if defined(TARGET_PPC64)
2341 static void init_excp_970(CPUPPCState
*env
)
2343 #if !defined(CONFIG_USER_ONLY)
2344 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2345 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2346 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2347 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
2348 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2349 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
2350 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2351 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2352 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2353 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2354 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2355 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
2356 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2357 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2358 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2359 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2360 env
->excp_vectors
[POWERPC_EXCP_IABR
] = 0x00001300;
2361 env
->excp_vectors
[POWERPC_EXCP_MAINT
] = 0x00001600;
2362 env
->excp_vectors
[POWERPC_EXCP_VPUA
] = 0x00001700;
2363 env
->excp_vectors
[POWERPC_EXCP_THERM
] = 0x00001800;
2364 /* Hardware reset vector */
2365 env
->hreset_vector
= 0x0000000000000100ULL
;
2369 static void init_excp_POWER7(CPUPPCState
*env
)
2371 #if !defined(CONFIG_USER_ONLY)
2372 env
->excp_vectors
[POWERPC_EXCP_RESET
] = 0x00000100;
2373 env
->excp_vectors
[POWERPC_EXCP_MCHECK
] = 0x00000200;
2374 env
->excp_vectors
[POWERPC_EXCP_DSI
] = 0x00000300;
2375 env
->excp_vectors
[POWERPC_EXCP_DSEG
] = 0x00000380;
2376 env
->excp_vectors
[POWERPC_EXCP_ISI
] = 0x00000400;
2377 env
->excp_vectors
[POWERPC_EXCP_ISEG
] = 0x00000480;
2378 env
->excp_vectors
[POWERPC_EXCP_EXTERNAL
] = 0x00000500;
2379 env
->excp_vectors
[POWERPC_EXCP_ALIGN
] = 0x00000600;
2380 env
->excp_vectors
[POWERPC_EXCP_PROGRAM
] = 0x00000700;
2381 env
->excp_vectors
[POWERPC_EXCP_FPU
] = 0x00000800;
2382 env
->excp_vectors
[POWERPC_EXCP_DECR
] = 0x00000900;
2383 env
->excp_vectors
[POWERPC_EXCP_HDECR
] = 0x00000980;
2384 env
->excp_vectors
[POWERPC_EXCP_SYSCALL
] = 0x00000C00;
2385 env
->excp_vectors
[POWERPC_EXCP_TRACE
] = 0x00000D00;
2386 env
->excp_vectors
[POWERPC_EXCP_HDSI
] = 0x00000E00;
2387 env
->excp_vectors
[POWERPC_EXCP_HISI
] = 0x00000E20;
2388 env
->excp_vectors
[POWERPC_EXCP_HV_EMU
] = 0x00000E40;
2389 env
->excp_vectors
[POWERPC_EXCP_HV_MAINT
] = 0x00000E60;
2390 env
->excp_vectors
[POWERPC_EXCP_PERFM
] = 0x00000F00;
2391 env
->excp_vectors
[POWERPC_EXCP_VPU
] = 0x00000F20;
2392 env
->excp_vectors
[POWERPC_EXCP_VSXU
] = 0x00000F40;
2393 /* Hardware reset vector */
2394 env
->hreset_vector
= 0x0000000000000100ULL
;
2398 static void init_excp_POWER8(CPUPPCState
*env
)
2400 init_excp_POWER7(env
);
2402 #if !defined(CONFIG_USER_ONLY)
2403 env
->excp_vectors
[POWERPC_EXCP_SDOOR
] = 0x00000A00;
2404 env
->excp_vectors
[POWERPC_EXCP_FU
] = 0x00000F60;
2405 env
->excp_vectors
[POWERPC_EXCP_HV_FU
] = 0x00000F80;
2406 env
->excp_vectors
[POWERPC_EXCP_SDOOR_HV
] = 0x00000E80;
2410 static void init_excp_POWER9(CPUPPCState
*env
)
2412 init_excp_POWER8(env
);
2414 #if !defined(CONFIG_USER_ONLY)
2415 env
->excp_vectors
[POWERPC_EXCP_HVIRT
] = 0x00000EA0;
2416 env
->excp_vectors
[POWERPC_EXCP_SYSCALL_VECTORED
] = 0x00017000;
2420 static void init_excp_POWER10(CPUPPCState
*env
)
2422 init_excp_POWER9(env
);
2427 /*****************************************************************************/
2428 /* Power management enable checks */
2429 static int check_pow_none(CPUPPCState
*env
)
2434 static int check_pow_nocheck(CPUPPCState
*env
)
2439 static int check_pow_hid0(CPUPPCState
*env
)
2441 if (env
->spr
[SPR_HID0
] & 0x00E00000) {
2448 static int check_pow_hid0_74xx(CPUPPCState
*env
)
2450 if (env
->spr
[SPR_HID0
] & 0x00600000) {
2457 /*****************************************************************************/
2458 /* PowerPC implementations definitions */
2460 #define POWERPC_FAMILY(_name) \
2462 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
2464 static const TypeInfo \
2465 glue(glue(ppc_, _name), _cpu_family_type_info) = { \
2466 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \
2467 .parent = TYPE_POWERPC_CPU, \
2469 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \
2472 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \
2474 type_register_static( \
2475 &glue(glue(ppc_, _name), _cpu_family_type_info)); \
2478 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \
2480 static void glue(glue(ppc_, _name), _cpu_family_class_init)
2482 static void init_proc_405(CPUPPCState
*env
)
2486 register_40x_sprs(env
);
2487 register_405_sprs(env
);
2488 /* Bus access control */
2489 /* not emulated, as QEMU never does speculative access */
2490 spr_register(env
, SPR_40x_SGR
, "SGR",
2491 SPR_NOACCESS
, SPR_NOACCESS
,
2492 &spr_read_generic
, &spr_write_generic
,
2494 /* not emulated, as QEMU do not emulate caches */
2495 spr_register(env
, SPR_40x_DCWR
, "DCWR",
2496 SPR_NOACCESS
, SPR_NOACCESS
,
2497 &spr_read_generic
, &spr_write_generic
,
2499 /* Memory management */
2500 #if !defined(CONFIG_USER_ONLY)
2504 env
->tlb_type
= TLB_EMB
;
2506 init_excp_4xx_softmmu(env
);
2507 env
->dcache_line_size
= 32;
2508 env
->icache_line_size
= 32;
2509 /* Allocate hardware IRQ controller */
2510 ppc40x_irq_init(env_archcpu(env
));
2512 SET_FIT_PERIOD(8, 12, 16, 20);
2513 SET_WDT_PERIOD(16, 20, 24, 28);
2516 POWERPC_FAMILY(405)(ObjectClass
*oc
, void *data
)
2518 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2519 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2521 dc
->desc
= "PowerPC 405";
2522 pcc
->init_proc
= init_proc_405
;
2523 pcc
->check_pow
= check_pow_nocheck
;
2524 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
2525 PPC_DCR
| PPC_WRTEE
|
2526 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_40x_ICBT
|
2527 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2528 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
2529 PPC_40x_TLB
| PPC_MEM_TLBIA
| PPC_MEM_TLBSYNC
|
2530 PPC_4xx_COMMON
| PPC_405_MAC
| PPC_40x_EXCP
;
2531 pcc
->msr_mask
= (1ull << MSR_POW
) |
2540 pcc
->mmu_model
= POWERPC_MMU_SOFT_4xx
;
2541 pcc
->excp_model
= POWERPC_EXCP_40x
;
2542 pcc
->bus_model
= PPC_FLAGS_INPUT_405
;
2543 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2544 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2545 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2548 static void init_proc_440EP(CPUPPCState
*env
)
2552 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2553 register_440_sprs(env
);
2554 register_usprgh_sprs(env
);
2555 /* Processor identification */
2556 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
2557 SPR_NOACCESS
, SPR_NOACCESS
,
2558 &spr_read_generic
, &spr_write_pir
,
2560 /* XXX : not implemented */
2561 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
2562 SPR_NOACCESS
, SPR_NOACCESS
,
2563 &spr_read_generic
, &spr_write_generic
,
2565 /* XXX : not implemented */
2566 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
2567 SPR_NOACCESS
, SPR_NOACCESS
,
2568 &spr_read_generic
, &spr_write_generic
,
2570 /* XXX : not implemented */
2571 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
2572 SPR_NOACCESS
, SPR_NOACCESS
,
2573 &spr_read_generic
, &spr_write_generic
,
2575 /* XXX : not implemented */
2576 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
2577 SPR_NOACCESS
, SPR_NOACCESS
,
2578 &spr_read_generic
, &spr_write_generic
,
2580 /* XXX : not implemented */
2581 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
2582 SPR_NOACCESS
, SPR_NOACCESS
,
2583 &spr_read_generic
, &spr_write_generic
,
2585 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
2586 SPR_NOACCESS
, SPR_NOACCESS
,
2587 &spr_read_generic
, &spr_write_generic
,
2589 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
2590 SPR_NOACCESS
, SPR_NOACCESS
,
2591 &spr_read_generic
, &spr_write_generic
,
2593 /* XXX : not implemented */
2594 spr_register(env
, SPR_440_CCR1
, "CCR1",
2595 SPR_NOACCESS
, SPR_NOACCESS
,
2596 &spr_read_generic
, &spr_write_generic
,
2598 /* Memory management */
2599 #if !defined(CONFIG_USER_ONLY)
2603 env
->tlb_type
= TLB_EMB
;
2605 init_excp_BookE(env
);
2606 env
->dcache_line_size
= 32;
2607 env
->icache_line_size
= 32;
2608 ppc40x_irq_init(env_archcpu(env
));
2610 SET_FIT_PERIOD(12, 16, 20, 24);
2611 SET_WDT_PERIOD(20, 24, 28, 32);
2614 POWERPC_FAMILY(440EP
)(ObjectClass
*oc
, void *data
)
2616 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2617 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2619 dc
->desc
= "PowerPC 440 EP";
2620 pcc
->init_proc
= init_proc_440EP
;
2621 pcc
->check_pow
= check_pow_nocheck
;
2622 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2623 PPC_FLOAT
| PPC_FLOAT_FRES
| PPC_FLOAT_FSEL
|
2624 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
2626 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2627 PPC_CACHE
| PPC_CACHE_ICBI
|
2628 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2629 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2630 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2632 pcc
->msr_mask
= (1ull << MSR_POW
) |
2644 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2645 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2646 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2647 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2648 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2649 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2652 POWERPC_FAMILY(460EX
)(ObjectClass
*oc
, void *data
)
2654 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2655 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2657 dc
->desc
= "PowerPC 460 EX";
2658 pcc
->init_proc
= init_proc_440EP
;
2659 pcc
->check_pow
= check_pow_nocheck
;
2660 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2661 PPC_FLOAT
| PPC_FLOAT_FRES
| PPC_FLOAT_FSEL
|
2662 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
2664 PPC_DCR
| PPC_DCRX
| PPC_WRTEE
| PPC_RFMCI
|
2665 PPC_CACHE
| PPC_CACHE_ICBI
|
2666 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2667 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2668 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2670 pcc
->msr_mask
= (1ull << MSR_POW
) |
2682 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2683 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2684 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2685 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2686 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2687 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2690 static void init_proc_440GP(CPUPPCState
*env
)
2694 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2695 register_440_sprs(env
);
2696 register_usprgh_sprs(env
);
2697 /* Processor identification */
2698 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
2699 SPR_NOACCESS
, SPR_NOACCESS
,
2700 &spr_read_generic
, &spr_write_pir
,
2702 /* XXX : not implemented */
2703 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
2704 SPR_NOACCESS
, SPR_NOACCESS
,
2705 &spr_read_generic
, &spr_write_generic
,
2707 /* XXX : not implemented */
2708 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
2709 SPR_NOACCESS
, SPR_NOACCESS
,
2710 &spr_read_generic
, &spr_write_generic
,
2712 /* XXX : not implemented */
2713 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
2714 SPR_NOACCESS
, SPR_NOACCESS
,
2715 &spr_read_generic
, &spr_write_generic
,
2717 /* XXX : not implemented */
2718 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
2719 SPR_NOACCESS
, SPR_NOACCESS
,
2720 &spr_read_generic
, &spr_write_generic
,
2722 /* Memory management */
2723 #if !defined(CONFIG_USER_ONLY)
2727 env
->tlb_type
= TLB_EMB
;
2729 init_excp_BookE(env
);
2730 env
->dcache_line_size
= 32;
2731 env
->icache_line_size
= 32;
2732 /* XXX: TODO: allocate internal IRQ controller */
2734 SET_FIT_PERIOD(12, 16, 20, 24);
2735 SET_WDT_PERIOD(20, 24, 28, 32);
2738 POWERPC_FAMILY(440GP
)(ObjectClass
*oc
, void *data
)
2740 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2741 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2743 dc
->desc
= "PowerPC 440 GP";
2744 pcc
->init_proc
= init_proc_440GP
;
2745 pcc
->check_pow
= check_pow_nocheck
;
2746 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2747 PPC_DCR
| PPC_DCRX
| PPC_WRTEE
| PPC_MFAPIDI
|
2748 PPC_CACHE
| PPC_CACHE_ICBI
|
2749 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2750 PPC_MEM_TLBSYNC
| PPC_TLBIVA
| PPC_MFTB
|
2751 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2753 pcc
->msr_mask
= (1ull << MSR_POW
) |
2765 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2766 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2767 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2768 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2769 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2770 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2773 static void init_proc_440x4(CPUPPCState
*env
)
2777 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2778 register_440_sprs(env
);
2779 register_usprgh_sprs(env
);
2780 /* Processor identification */
2781 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
2782 SPR_NOACCESS
, SPR_NOACCESS
,
2783 &spr_read_generic
, &spr_write_pir
,
2785 /* XXX : not implemented */
2786 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
2787 SPR_NOACCESS
, SPR_NOACCESS
,
2788 &spr_read_generic
, &spr_write_generic
,
2790 /* XXX : not implemented */
2791 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
2792 SPR_NOACCESS
, SPR_NOACCESS
,
2793 &spr_read_generic
, &spr_write_generic
,
2795 /* XXX : not implemented */
2796 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
2797 SPR_NOACCESS
, SPR_NOACCESS
,
2798 &spr_read_generic
, &spr_write_generic
,
2800 /* XXX : not implemented */
2801 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
2802 SPR_NOACCESS
, SPR_NOACCESS
,
2803 &spr_read_generic
, &spr_write_generic
,
2805 /* Memory management */
2806 #if !defined(CONFIG_USER_ONLY)
2810 env
->tlb_type
= TLB_EMB
;
2812 init_excp_BookE(env
);
2813 env
->dcache_line_size
= 32;
2814 env
->icache_line_size
= 32;
2815 /* XXX: TODO: allocate internal IRQ controller */
2817 SET_FIT_PERIOD(12, 16, 20, 24);
2818 SET_WDT_PERIOD(20, 24, 28, 32);
2821 POWERPC_FAMILY(440x4
)(ObjectClass
*oc
, void *data
)
2823 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2824 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2826 dc
->desc
= "PowerPC 440x4";
2827 pcc
->init_proc
= init_proc_440x4
;
2828 pcc
->check_pow
= check_pow_nocheck
;
2829 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2830 PPC_DCR
| PPC_WRTEE
|
2831 PPC_CACHE
| PPC_CACHE_ICBI
|
2832 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2833 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2834 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2836 pcc
->msr_mask
= (1ull << MSR_POW
) |
2848 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2849 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2850 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2851 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2852 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2853 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2856 static void init_proc_440x5(CPUPPCState
*env
)
2860 register_BookE_sprs(env
, 0x000000000000FFFFULL
);
2861 register_440_sprs(env
);
2862 register_usprgh_sprs(env
);
2863 /* Processor identification */
2864 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
2865 SPR_NOACCESS
, SPR_NOACCESS
,
2866 &spr_read_generic
, &spr_write_pir
,
2868 /* XXX : not implemented */
2869 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
2870 SPR_NOACCESS
, SPR_NOACCESS
,
2871 &spr_read_generic
, &spr_write_generic
,
2873 /* XXX : not implemented */
2874 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
2875 SPR_NOACCESS
, SPR_NOACCESS
,
2876 &spr_read_generic
, &spr_write_generic
,
2878 /* XXX : not implemented */
2879 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
2880 SPR_NOACCESS
, SPR_NOACCESS
,
2881 &spr_read_generic
, &spr_write_generic
,
2883 /* XXX : not implemented */
2884 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
2885 SPR_NOACCESS
, SPR_NOACCESS
,
2886 &spr_read_generic
, &spr_write_generic
,
2888 /* XXX : not implemented */
2889 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
2890 SPR_NOACCESS
, SPR_NOACCESS
,
2891 &spr_read_generic
, &spr_write_generic
,
2893 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
2894 SPR_NOACCESS
, SPR_NOACCESS
,
2895 &spr_read_generic
, &spr_write_generic
,
2897 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
2898 SPR_NOACCESS
, SPR_NOACCESS
,
2899 &spr_read_generic
, &spr_write_generic
,
2901 /* XXX : not implemented */
2902 spr_register(env
, SPR_440_CCR1
, "CCR1",
2903 SPR_NOACCESS
, SPR_NOACCESS
,
2904 &spr_read_generic
, &spr_write_generic
,
2906 /* Memory management */
2907 #if !defined(CONFIG_USER_ONLY)
2911 env
->tlb_type
= TLB_EMB
;
2913 init_excp_BookE(env
);
2914 env
->dcache_line_size
= 32;
2915 env
->icache_line_size
= 32;
2916 ppc40x_irq_init(env_archcpu(env
));
2918 SET_FIT_PERIOD(12, 16, 20, 24);
2919 SET_WDT_PERIOD(20, 24, 28, 32);
2922 POWERPC_FAMILY(440x5
)(ObjectClass
*oc
, void *data
)
2924 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2925 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2927 dc
->desc
= "PowerPC 440x5";
2928 pcc
->init_proc
= init_proc_440x5
;
2929 pcc
->check_pow
= check_pow_nocheck
;
2930 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2931 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2932 PPC_CACHE
| PPC_CACHE_ICBI
|
2933 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2934 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2935 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2937 pcc
->msr_mask
= (1ull << MSR_POW
) |
2949 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2950 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2951 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2952 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2953 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2954 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2957 POWERPC_FAMILY(440x5wDFPU
)(ObjectClass
*oc
, void *data
)
2959 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2960 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
2962 dc
->desc
= "PowerPC 440x5 with double precision FPU";
2963 pcc
->init_proc
= init_proc_440x5
;
2964 pcc
->check_pow
= check_pow_nocheck
;
2965 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
2966 PPC_FLOAT
| PPC_FLOAT_FSQRT
|
2968 PPC_DCR
| PPC_WRTEE
| PPC_RFMCI
|
2969 PPC_CACHE
| PPC_CACHE_ICBI
|
2970 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
2971 PPC_MEM_TLBSYNC
| PPC_MFTB
|
2972 PPC_BOOKE
| PPC_4xx_COMMON
| PPC_405_MAC
|
2974 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
2975 pcc
->msr_mask
= (1ull << MSR_POW
) |
2987 pcc
->mmu_model
= POWERPC_MMU_BOOKE
;
2988 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
2989 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
2990 pcc
->bfd_mach
= bfd_mach_ppc_403
;
2991 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DWE
|
2992 POWERPC_FLAG_DE
| POWERPC_FLAG_BUS_CLK
;
2995 static void init_proc_MPC5xx(CPUPPCState
*env
)
2999 register_5xx_8xx_sprs(env
);
3000 register_5xx_sprs(env
);
3001 init_excp_MPC5xx(env
);
3002 env
->dcache_line_size
= 32;
3003 env
->icache_line_size
= 32;
3004 /* XXX: TODO: allocate internal IRQ controller */
3007 POWERPC_FAMILY(MPC5xx
)(ObjectClass
*oc
, void *data
)
3009 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3010 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3012 dc
->desc
= "Freescale 5xx cores (aka RCPU)";
3013 pcc
->init_proc
= init_proc_MPC5xx
;
3014 pcc
->check_pow
= check_pow_none
;
3015 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
3016 PPC_MEM_EIEIO
| PPC_MEM_SYNC
|
3017 PPC_CACHE_ICBI
| PPC_FLOAT
| PPC_FLOAT_STFIWX
|
3019 pcc
->msr_mask
= (1ull << MSR_ILE
) |
3031 pcc
->mmu_model
= POWERPC_MMU_REAL
;
3032 pcc
->excp_model
= POWERPC_EXCP_603
;
3033 pcc
->bus_model
= PPC_FLAGS_INPUT_RCPU
;
3034 pcc
->bfd_mach
= bfd_mach_ppc_505
;
3035 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3036 POWERPC_FLAG_BUS_CLK
;
3039 static void init_proc_MPC8xx(CPUPPCState
*env
)
3043 register_5xx_8xx_sprs(env
);
3044 register_8xx_sprs(env
);
3045 init_excp_MPC8xx(env
);
3046 env
->dcache_line_size
= 32;
3047 env
->icache_line_size
= 32;
3048 /* XXX: TODO: allocate internal IRQ controller */
3051 POWERPC_FAMILY(MPC8xx
)(ObjectClass
*oc
, void *data
)
3053 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3054 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3056 dc
->desc
= "Freescale 8xx cores (aka PowerQUICC)";
3057 pcc
->init_proc
= init_proc_MPC8xx
;
3058 pcc
->check_pow
= check_pow_none
;
3059 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
|
3060 PPC_MEM_EIEIO
| PPC_MEM_SYNC
|
3061 PPC_CACHE_ICBI
| PPC_MFTB
;
3062 pcc
->msr_mask
= (1ull << MSR_ILE
) |
3074 pcc
->mmu_model
= POWERPC_MMU_MPC8xx
;
3075 pcc
->excp_model
= POWERPC_EXCP_603
;
3076 pcc
->bus_model
= PPC_FLAGS_INPUT_RCPU
;
3077 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3078 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
3079 POWERPC_FLAG_BUS_CLK
;
3082 /* Freescale 82xx cores (aka PowerQUICC-II) */
3084 static void init_proc_G2(CPUPPCState
*env
)
3086 register_ne_601_sprs(env
);
3087 register_sdr1_sprs(env
);
3088 register_G2_755_sprs(env
);
3089 register_G2_sprs(env
);
3092 /* External access control */
3093 /* XXX : not implemented */
3094 spr_register(env
, SPR_EAR
, "EAR",
3095 SPR_NOACCESS
, SPR_NOACCESS
,
3096 &spr_read_generic
, &spr_write_generic
,
3098 /* Hardware implementation register */
3099 /* XXX : not implemented */
3100 spr_register(env
, SPR_HID0
, "HID0",
3101 SPR_NOACCESS
, SPR_NOACCESS
,
3102 &spr_read_generic
, &spr_write_generic
,
3104 /* XXX : not implemented */
3105 spr_register(env
, SPR_HID1
, "HID1",
3106 SPR_NOACCESS
, SPR_NOACCESS
,
3107 &spr_read_generic
, &spr_write_generic
,
3109 /* XXX : not implemented */
3110 spr_register(env
, SPR_HID2
, "HID2",
3111 SPR_NOACCESS
, SPR_NOACCESS
,
3112 &spr_read_generic
, &spr_write_generic
,
3114 /* Memory management */
3115 register_low_BATs(env
);
3116 register_high_BATs(env
);
3117 register_6xx_7xx_soft_tlb(env
, 64, 2);
3119 env
->dcache_line_size
= 32;
3120 env
->icache_line_size
= 32;
3121 /* Allocate hardware IRQ controller */
3122 ppc6xx_irq_init(env_archcpu(env
));
3125 POWERPC_FAMILY(G2
)(ObjectClass
*oc
, void *data
)
3127 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3128 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3130 dc
->desc
= "PowerPC G2";
3131 pcc
->init_proc
= init_proc_G2
;
3132 pcc
->check_pow
= check_pow_hid0
;
3133 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3134 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3136 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3137 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3138 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3139 PPC_SEGMENT
| PPC_EXTERN
;
3140 pcc
->msr_mask
= (1ull << MSR_POW
) |
3141 (1ull << MSR_TGPR
) |
3155 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3156 pcc
->excp_model
= POWERPC_EXCP_G2
;
3157 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3158 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
3159 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3160 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3163 static void init_proc_G2LE(CPUPPCState
*env
)
3165 register_ne_601_sprs(env
);
3166 register_sdr1_sprs(env
);
3167 register_G2_755_sprs(env
);
3168 register_G2_sprs(env
);
3171 /* External access control */
3172 /* XXX : not implemented */
3173 spr_register(env
, SPR_EAR
, "EAR",
3174 SPR_NOACCESS
, SPR_NOACCESS
,
3175 &spr_read_generic
, &spr_write_generic
,
3177 /* Hardware implementation register */
3178 /* XXX : not implemented */
3179 spr_register(env
, SPR_HID0
, "HID0",
3180 SPR_NOACCESS
, SPR_NOACCESS
,
3181 &spr_read_generic
, &spr_write_generic
,
3183 /* XXX : not implemented */
3184 spr_register(env
, SPR_HID1
, "HID1",
3185 SPR_NOACCESS
, SPR_NOACCESS
,
3186 &spr_read_generic
, &spr_write_generic
,
3188 /* XXX : not implemented */
3189 spr_register(env
, SPR_HID2
, "HID2",
3190 SPR_NOACCESS
, SPR_NOACCESS
,
3191 &spr_read_generic
, &spr_write_generic
,
3194 /* Memory management */
3195 register_low_BATs(env
);
3196 register_high_BATs(env
);
3197 register_6xx_7xx_soft_tlb(env
, 64, 2);
3199 env
->dcache_line_size
= 32;
3200 env
->icache_line_size
= 32;
3201 /* Allocate hardware IRQ controller */
3202 ppc6xx_irq_init(env_archcpu(env
));
3205 POWERPC_FAMILY(G2LE
)(ObjectClass
*oc
, void *data
)
3207 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3208 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3210 dc
->desc
= "PowerPC G2LE";
3211 pcc
->init_proc
= init_proc_G2LE
;
3212 pcc
->check_pow
= check_pow_hid0
;
3213 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3214 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3216 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3217 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3218 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3219 PPC_SEGMENT
| PPC_EXTERN
;
3220 pcc
->msr_mask
= (1ull << MSR_POW
) |
3221 (1ull << MSR_TGPR
) |
3237 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3238 pcc
->excp_model
= POWERPC_EXCP_G2
;
3239 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3240 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
3241 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3242 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3245 static void init_proc_e200(CPUPPCState
*env
)
3249 register_BookE_sprs(env
, 0x000000070000FFFFULL
);
3250 /* XXX : not implemented */
3251 spr_register(env
, SPR_BOOKE_SPEFSCR
, "SPEFSCR",
3252 &spr_read_spefscr
, &spr_write_spefscr
,
3253 &spr_read_spefscr
, &spr_write_spefscr
,
3255 /* Memory management */
3256 register_BookE206_sprs(env
, 0x0000005D, NULL
, 0);
3257 /* XXX : not implemented */
3258 spr_register(env
, SPR_HID0
, "HID0",
3259 SPR_NOACCESS
, SPR_NOACCESS
,
3260 &spr_read_generic
, &spr_write_generic
,
3262 /* XXX : not implemented */
3263 spr_register(env
, SPR_HID1
, "HID1",
3264 SPR_NOACCESS
, SPR_NOACCESS
,
3265 &spr_read_generic
, &spr_write_generic
,
3267 /* XXX : not implemented */
3268 spr_register(env
, SPR_Exxx_ALTCTXCR
, "ALTCTXCR",
3269 SPR_NOACCESS
, SPR_NOACCESS
,
3270 &spr_read_generic
, &spr_write_generic
,
3272 /* XXX : not implemented */
3273 spr_register(env
, SPR_Exxx_BUCSR
, "BUCSR",
3274 SPR_NOACCESS
, SPR_NOACCESS
,
3275 &spr_read_generic
, &spr_write_generic
,
3277 /* XXX : not implemented */
3278 spr_register(env
, SPR_Exxx_CTXCR
, "CTXCR",
3279 SPR_NOACCESS
, SPR_NOACCESS
,
3280 &spr_read_generic
, &spr_write_generic
,
3282 /* XXX : not implemented */
3283 spr_register(env
, SPR_Exxx_DBCNT
, "DBCNT",
3284 SPR_NOACCESS
, SPR_NOACCESS
,
3285 &spr_read_generic
, &spr_write_generic
,
3287 /* XXX : not implemented */
3288 spr_register(env
, SPR_Exxx_DBCR3
, "DBCR3",
3289 SPR_NOACCESS
, SPR_NOACCESS
,
3290 &spr_read_generic
, &spr_write_generic
,
3292 /* XXX : not implemented */
3293 spr_register(env
, SPR_Exxx_L1CFG0
, "L1CFG0",
3294 &spr_read_generic
, SPR_NOACCESS
,
3295 &spr_read_generic
, SPR_NOACCESS
,
3297 /* XXX : not implemented */
3298 spr_register(env
, SPR_Exxx_L1CSR0
, "L1CSR0",
3299 SPR_NOACCESS
, SPR_NOACCESS
,
3300 &spr_read_generic
, &spr_write_generic
,
3302 /* XXX : not implemented */
3303 spr_register(env
, SPR_Exxx_L1FINV0
, "L1FINV0",
3304 SPR_NOACCESS
, SPR_NOACCESS
,
3305 &spr_read_generic
, &spr_write_generic
,
3307 /* XXX : not implemented */
3308 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
3309 SPR_NOACCESS
, SPR_NOACCESS
,
3310 &spr_read_generic
, &spr_write_generic
,
3312 /* XXX : not implemented */
3313 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
3314 SPR_NOACCESS
, SPR_NOACCESS
,
3315 &spr_read_generic
, &spr_write_generic
,
3317 /* XXX : not implemented */
3318 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
3319 SPR_NOACCESS
, SPR_NOACCESS
,
3320 &spr_read_generic
, &spr_write_generic
,
3322 /* XXX : not implemented */
3323 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
3324 SPR_NOACCESS
, SPR_NOACCESS
,
3325 &spr_read_generic
, &spr_write_generic
,
3327 /* XXX : not implemented */
3328 spr_register(env
, SPR_MMUCSR0
, "MMUCSR0",
3329 SPR_NOACCESS
, SPR_NOACCESS
,
3330 &spr_read_generic
, &spr_write_generic
,
3331 0x00000000); /* TOFIX */
3332 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
3333 SPR_NOACCESS
, SPR_NOACCESS
,
3334 &spr_read_generic
, &spr_write_generic
,
3336 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
3337 SPR_NOACCESS
, SPR_NOACCESS
,
3338 &spr_read_generic
, &spr_write_generic
,
3340 #if !defined(CONFIG_USER_ONLY)
3344 env
->tlb_type
= TLB_EMB
;
3346 init_excp_e200(env
, 0xFFFF0000UL
);
3347 env
->dcache_line_size
= 32;
3348 env
->icache_line_size
= 32;
3349 /* XXX: TODO: allocate internal IRQ controller */
3352 POWERPC_FAMILY(e200
)(ObjectClass
*oc
, void *data
)
3354 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3355 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3357 dc
->desc
= "e200 core";
3358 pcc
->init_proc
= init_proc_e200
;
3359 pcc
->check_pow
= check_pow_hid0
;
3361 * XXX: unimplemented instructions:
3368 * all SPE multiply-accumulate instructions
3370 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3371 PPC_SPE
| PPC_SPE_SINGLE
|
3372 PPC_WRTEE
| PPC_RFDI
|
3373 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3374 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3375 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
|
3377 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3391 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3392 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3393 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3394 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3395 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3396 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3397 POWERPC_FLAG_BUS_CLK
;
3400 static void init_proc_e300(CPUPPCState
*env
)
3402 register_ne_601_sprs(env
);
3403 register_sdr1_sprs(env
);
3404 register_603_sprs(env
);
3407 /* hardware implementation registers */
3408 /* XXX : not implemented */
3409 spr_register(env
, SPR_HID0
, "HID0",
3410 SPR_NOACCESS
, SPR_NOACCESS
,
3411 &spr_read_generic
, &spr_write_generic
,
3413 /* XXX : not implemented */
3414 spr_register(env
, SPR_HID1
, "HID1",
3415 SPR_NOACCESS
, SPR_NOACCESS
,
3416 &spr_read_generic
, &spr_write_generic
,
3418 /* XXX : not implemented */
3419 spr_register(env
, SPR_HID2
, "HID2",
3420 SPR_NOACCESS
, SPR_NOACCESS
,
3421 &spr_read_generic
, &spr_write_generic
,
3424 /* XXX : not implemented */
3425 spr_register(env
, SPR_DABR
, "DABR",
3426 SPR_NOACCESS
, SPR_NOACCESS
,
3427 &spr_read_generic
, &spr_write_generic
,
3429 /* XXX : not implemented */
3430 spr_register(env
, SPR_DABR2
, "DABR2",
3431 SPR_NOACCESS
, SPR_NOACCESS
,
3432 &spr_read_generic
, &spr_write_generic
,
3434 /* XXX : not implemented */
3435 spr_register(env
, SPR_IABR2
, "IABR2",
3436 SPR_NOACCESS
, SPR_NOACCESS
,
3437 &spr_read_generic
, &spr_write_generic
,
3439 /* XXX : not implemented */
3440 spr_register(env
, SPR_IBCR
, "IBCR",
3441 SPR_NOACCESS
, SPR_NOACCESS
,
3442 &spr_read_generic
, &spr_write_generic
,
3444 /* XXX : not implemented */
3445 spr_register(env
, SPR_DBCR
, "DBCR",
3446 SPR_NOACCESS
, SPR_NOACCESS
,
3447 &spr_read_generic
, &spr_write_generic
,
3449 /* Memory management */
3450 register_low_BATs(env
);
3451 register_high_BATs(env
);
3452 register_6xx_7xx_soft_tlb(env
, 64, 2);
3454 env
->dcache_line_size
= 32;
3455 env
->icache_line_size
= 32;
3456 /* Allocate hardware IRQ controller */
3457 ppc6xx_irq_init(env_archcpu(env
));
3460 POWERPC_FAMILY(e300
)(ObjectClass
*oc
, void *data
)
3462 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3463 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3465 dc
->desc
= "e300 core";
3466 pcc
->init_proc
= init_proc_e300
;
3467 pcc
->check_pow
= check_pow_hid0
;
3468 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
3469 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
3471 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
3472 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
3473 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
3474 PPC_SEGMENT
| PPC_EXTERN
;
3475 pcc
->msr_mask
= (1ull << MSR_POW
) |
3476 (1ull << MSR_TGPR
) |
3492 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
3493 pcc
->excp_model
= POWERPC_EXCP_603
;
3494 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
3495 pcc
->bfd_mach
= bfd_mach_ppc_603
;
3496 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
3497 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
3500 enum fsl_e500_version
{
3508 static void init_proc_e500(CPUPPCState
*env
, int version
)
3510 uint32_t tlbncfg
[2];
3512 uint64_t ivpr_mask
= 0xFFFF0000ULL
;
3513 uint32_t l1cfg0
= 0x3800 /* 8 ways */
3514 | 0x0020; /* 32 kb */
3515 uint32_t l1cfg1
= 0x3800 /* 8 ways */
3516 | 0x0020; /* 32 kb */
3517 uint32_t mmucfg
= 0;
3518 #if !defined(CONFIG_USER_ONLY)
3525 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
3526 * complain when accessing them.
3527 * register_BookE_sprs(env, 0x0000000F0000FD7FULL);
3533 ivor_mask
= 0x0000000F0000FFFFULL
;
3537 ivor_mask
= 0x000003FE0000FFFFULL
;
3540 ivor_mask
= 0x000003FF0000FFFFULL
;
3543 register_BookE_sprs(env
, ivor_mask
);
3544 register_usprg3_sprs(env
);
3545 /* Processor identification */
3546 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
3547 SPR_NOACCESS
, SPR_NOACCESS
,
3548 &spr_read_generic
, &spr_write_pir
,
3550 /* XXX : not implemented */
3551 spr_register(env
, SPR_BOOKE_SPEFSCR
, "SPEFSCR",
3552 &spr_read_spefscr
, &spr_write_spefscr
,
3553 &spr_read_spefscr
, &spr_write_spefscr
,
3555 #if !defined(CONFIG_USER_ONLY)
3556 /* Memory management */
3562 tlbncfg
[0] = register_tlbncfg(2, 1, 1, 0, 256);
3563 tlbncfg
[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 16);
3566 tlbncfg
[0] = register_tlbncfg(4, 1, 1, 0, 512);
3567 tlbncfg
[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 16);
3571 tlbncfg
[0] = register_tlbncfg(4, 1, 1, 0, 512);
3572 tlbncfg
[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL
| TLBnCFG_IPROT
, 64);
3577 tlbncfg
[0] = 0x08052400;
3578 tlbncfg
[1] = 0x40028040;
3581 cpu_abort(env_cpu(env
), "Unknown CPU: " TARGET_FMT_lx
"\n",
3589 env
->dcache_line_size
= 32;
3590 env
->icache_line_size
= 32;
3594 env
->dcache_line_size
= 64;
3595 env
->icache_line_size
= 64;
3596 l1cfg0
|= 0x1000000; /* 64 byte cache block size */
3597 l1cfg1
|= 0x1000000; /* 64 byte cache block size */
3600 env
->dcache_line_size
= 32;
3601 env
->icache_line_size
= 32;
3602 l1cfg0
|= 0x0F83820;
3603 l1cfg1
|= 0x0B83820;
3606 cpu_abort(env_cpu(env
), "Unknown CPU: " TARGET_FMT_lx
"\n",
3609 register_BookE206_sprs(env
, 0x000000DF, tlbncfg
, mmucfg
);
3610 /* XXX : not implemented */
3611 spr_register(env
, SPR_HID0
, "HID0",
3612 SPR_NOACCESS
, SPR_NOACCESS
,
3613 &spr_read_generic
, &spr_write_generic
,
3615 /* XXX : not implemented */
3616 spr_register(env
, SPR_HID1
, "HID1",
3617 SPR_NOACCESS
, SPR_NOACCESS
,
3618 &spr_read_generic
, &spr_write_generic
,
3620 /* XXX : not implemented */
3621 spr_register(env
, SPR_Exxx_BBEAR
, "BBEAR",
3622 SPR_NOACCESS
, SPR_NOACCESS
,
3623 &spr_read_generic
, &spr_write_generic
,
3625 /* XXX : not implemented */
3626 spr_register(env
, SPR_Exxx_BBTAR
, "BBTAR",
3627 SPR_NOACCESS
, SPR_NOACCESS
,
3628 &spr_read_generic
, &spr_write_generic
,
3630 /* XXX : not implemented */
3631 spr_register(env
, SPR_Exxx_MCAR
, "MCAR",
3632 SPR_NOACCESS
, SPR_NOACCESS
,
3633 &spr_read_generic
, &spr_write_generic
,
3635 /* XXX : not implemented */
3636 spr_register(env
, SPR_BOOKE_MCSR
, "MCSR",
3637 SPR_NOACCESS
, SPR_NOACCESS
,
3638 &spr_read_generic
, &spr_write_generic
,
3640 /* XXX : not implemented */
3641 spr_register(env
, SPR_Exxx_NPIDR
, "NPIDR",
3642 SPR_NOACCESS
, SPR_NOACCESS
,
3643 &spr_read_generic
, &spr_write_generic
,
3645 /* XXX : not implemented */
3646 spr_register(env
, SPR_Exxx_BUCSR
, "BUCSR",
3647 SPR_NOACCESS
, SPR_NOACCESS
,
3648 &spr_read_generic
, &spr_write_generic
,
3650 /* XXX : not implemented */
3651 spr_register(env
, SPR_Exxx_L1CFG0
, "L1CFG0",
3652 &spr_read_generic
, SPR_NOACCESS
,
3653 &spr_read_generic
, SPR_NOACCESS
,
3655 spr_register(env
, SPR_Exxx_L1CFG1
, "L1CFG1",
3656 &spr_read_generic
, SPR_NOACCESS
,
3657 &spr_read_generic
, SPR_NOACCESS
,
3659 spr_register(env
, SPR_Exxx_L1CSR0
, "L1CSR0",
3660 SPR_NOACCESS
, SPR_NOACCESS
,
3661 &spr_read_generic
, &spr_write_e500_l1csr0
,
3663 spr_register(env
, SPR_Exxx_L1CSR1
, "L1CSR1",
3664 SPR_NOACCESS
, SPR_NOACCESS
,
3665 &spr_read_generic
, &spr_write_e500_l1csr1
,
3667 if (version
!= fsl_e500v1
&& version
!= fsl_e500v2
) {
3668 spr_register(env
, SPR_Exxx_L2CSR0
, "L2CSR0",
3669 SPR_NOACCESS
, SPR_NOACCESS
,
3670 &spr_read_generic
, &spr_write_e500_l2csr0
,
3673 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
3674 SPR_NOACCESS
, SPR_NOACCESS
,
3675 &spr_read_generic
, &spr_write_generic
,
3677 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
3678 SPR_NOACCESS
, SPR_NOACCESS
,
3679 &spr_read_generic
, &spr_write_generic
,
3681 spr_register(env
, SPR_MMUCSR0
, "MMUCSR0",
3682 SPR_NOACCESS
, SPR_NOACCESS
,
3683 &spr_read_generic
, &spr_write_booke206_mmucsr0
,
3685 spr_register(env
, SPR_BOOKE_EPR
, "EPR",
3686 SPR_NOACCESS
, SPR_NOACCESS
,
3687 &spr_read_generic
, SPR_NOACCESS
,
3689 /* XXX better abstract into Emb.xxx features */
3690 if ((version
== fsl_e5500
) || (version
== fsl_e6500
)) {
3691 spr_register(env
, SPR_BOOKE_EPCR
, "EPCR",
3692 SPR_NOACCESS
, SPR_NOACCESS
,
3693 &spr_read_generic
, &spr_write_generic
,
3695 spr_register(env
, SPR_BOOKE_MAS7_MAS3
, "MAS7_MAS3",
3696 SPR_NOACCESS
, SPR_NOACCESS
,
3697 &spr_read_mas73
, &spr_write_mas73
,
3699 ivpr_mask
= (target_ulong
)~0xFFFFULL
;
3702 if (version
== fsl_e6500
) {
3703 /* Thread identification */
3704 spr_register(env
, SPR_TIR
, "TIR",
3705 SPR_NOACCESS
, SPR_NOACCESS
,
3706 &spr_read_generic
, SPR_NOACCESS
,
3708 spr_register(env
, SPR_BOOKE_TLB0PS
, "TLB0PS",
3709 SPR_NOACCESS
, SPR_NOACCESS
,
3710 &spr_read_generic
, SPR_NOACCESS
,
3712 spr_register(env
, SPR_BOOKE_TLB1PS
, "TLB1PS",
3713 SPR_NOACCESS
, SPR_NOACCESS
,
3714 &spr_read_generic
, SPR_NOACCESS
,
3718 #if !defined(CONFIG_USER_ONLY)
3720 env
->tlb_type
= TLB_MAS
;
3721 for (i
= 0; i
< BOOKE206_MAX_TLBN
; i
++) {
3722 env
->nb_tlb
+= booke206_tlb_size(env
, i
);
3726 init_excp_e200(env
, ivpr_mask
);
3727 /* Allocate hardware IRQ controller */
3728 ppce500_irq_init(env_archcpu(env
));
3731 static void init_proc_e500v1(CPUPPCState
*env
)
3733 init_proc_e500(env
, fsl_e500v1
);
3736 POWERPC_FAMILY(e500v1
)(ObjectClass
*oc
, void *data
)
3738 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3739 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3741 dc
->desc
= "e500v1 core";
3742 pcc
->init_proc
= init_proc_e500v1
;
3743 pcc
->check_pow
= check_pow_hid0
;
3744 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3745 PPC_SPE
| PPC_SPE_SINGLE
|
3746 PPC_WRTEE
| PPC_RFDI
|
3747 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3748 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3749 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3750 pcc
->insns_flags2
= PPC2_BOOKE206
;
3751 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3765 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3766 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3767 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3768 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3769 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3770 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3771 POWERPC_FLAG_BUS_CLK
;
3774 static void init_proc_e500v2(CPUPPCState
*env
)
3776 init_proc_e500(env
, fsl_e500v2
);
3779 POWERPC_FAMILY(e500v2
)(ObjectClass
*oc
, void *data
)
3781 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3782 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3784 dc
->desc
= "e500v2 core";
3785 pcc
->init_proc
= init_proc_e500v2
;
3786 pcc
->check_pow
= check_pow_hid0
;
3787 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
|
3788 PPC_SPE
| PPC_SPE_SINGLE
| PPC_SPE_DOUBLE
|
3789 PPC_WRTEE
| PPC_RFDI
|
3790 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3791 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3792 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3793 pcc
->insns_flags2
= PPC2_BOOKE206
;
3794 pcc
->msr_mask
= (1ull << MSR_UCLE
) |
3808 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3809 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3810 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3811 pcc
->bfd_mach
= bfd_mach_ppc_860
;
3812 pcc
->flags
= POWERPC_FLAG_SPE
| POWERPC_FLAG_CE
|
3813 POWERPC_FLAG_UBLE
| POWERPC_FLAG_DE
|
3814 POWERPC_FLAG_BUS_CLK
;
3817 static void init_proc_e500mc(CPUPPCState
*env
)
3819 init_proc_e500(env
, fsl_e500mc
);
3822 POWERPC_FAMILY(e500mc
)(ObjectClass
*oc
, void *data
)
3824 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3825 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3827 dc
->desc
= "e500mc core";
3828 pcc
->init_proc
= init_proc_e500mc
;
3829 pcc
->check_pow
= check_pow_none
;
3830 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3831 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3832 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3833 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3834 PPC_FLOAT
| PPC_FLOAT_FRES
|
3835 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3836 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3837 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
;
3838 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
;
3839 pcc
->msr_mask
= (1ull << MSR_GS
) |
3840 (1ull << MSR_UCLE
) |
3853 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3854 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3855 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3856 /* FIXME: figure out the correct flag for e500mc */
3857 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3858 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3859 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3863 static void init_proc_e5500(CPUPPCState
*env
)
3865 init_proc_e500(env
, fsl_e5500
);
3868 POWERPC_FAMILY(e5500
)(ObjectClass
*oc
, void *data
)
3870 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3871 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3873 dc
->desc
= "e5500 core";
3874 pcc
->init_proc
= init_proc_e5500
;
3875 pcc
->check_pow
= check_pow_none
;
3876 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3877 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3878 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3879 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3880 PPC_FLOAT
| PPC_FLOAT_FRES
|
3881 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3882 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3883 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
|
3884 PPC_64B
| PPC_POPCNTB
| PPC_POPCNTWD
;
3885 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
| PPC2_PERM_ISA206
|
3887 pcc
->msr_mask
= (1ull << MSR_CM
) |
3889 (1ull << MSR_UCLE
) |
3902 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3903 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3904 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3905 /* FIXME: figure out the correct flag for e5500 */
3906 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3907 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3908 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
3911 static void init_proc_e6500(CPUPPCState
*env
)
3913 init_proc_e500(env
, fsl_e6500
);
3916 POWERPC_FAMILY(e6500
)(ObjectClass
*oc
, void *data
)
3918 DeviceClass
*dc
= DEVICE_CLASS(oc
);
3919 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
3921 dc
->desc
= "e6500 core";
3922 pcc
->init_proc
= init_proc_e6500
;
3923 pcc
->check_pow
= check_pow_none
;
3924 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_MFTB
|
3925 PPC_WRTEE
| PPC_RFDI
| PPC_RFMCI
|
3926 PPC_CACHE
| PPC_CACHE_LOCK
| PPC_CACHE_ICBI
|
3927 PPC_CACHE_DCBZ
| PPC_CACHE_DCBA
|
3928 PPC_FLOAT
| PPC_FLOAT_FRES
|
3929 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_FSEL
|
3930 PPC_FLOAT_STFIWX
| PPC_WAIT
|
3931 PPC_MEM_TLBSYNC
| PPC_TLBIVAX
| PPC_MEM_SYNC
|
3932 PPC_64B
| PPC_POPCNTB
| PPC_POPCNTWD
| PPC_ALTIVEC
;
3933 pcc
->insns_flags2
= PPC2_BOOKE206
| PPC2_PRCNTL
| PPC2_PERM_ISA206
|
3934 PPC2_FP_CVT_S64
| PPC2_ATOMIC_ISA206
;
3935 pcc
->msr_mask
= (1ull << MSR_CM
) |
3937 (1ull << MSR_UCLE
) |
3951 pcc
->mmu_model
= POWERPC_MMU_BOOKE206
;
3952 pcc
->excp_model
= POWERPC_EXCP_BOOKE
;
3953 pcc
->bus_model
= PPC_FLAGS_INPUT_BookE
;
3954 pcc
->bfd_mach
= bfd_mach_ppc_e500
;
3955 pcc
->flags
= POWERPC_FLAG_CE
| POWERPC_FLAG_DE
|
3956 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_VRE
;
3961 /* Non-embedded PowerPC */
3963 #define POWERPC_MSRR_601 (0x0000000000001040ULL)
3965 static void init_proc_601(CPUPPCState
*env
)
3967 register_ne_601_sprs(env
);
3968 register_sdr1_sprs(env
);
3969 register_601_sprs(env
);
3970 /* Hardware implementation registers */
3971 /* XXX : not implemented */
3972 spr_register(env
, SPR_HID0
, "HID0",
3973 SPR_NOACCESS
, SPR_NOACCESS
,
3974 &spr_read_generic
, &spr_write_hid0_601
,
3976 /* XXX : not implemented */
3977 spr_register(env
, SPR_HID1
, "HID1",
3978 SPR_NOACCESS
, SPR_NOACCESS
,
3979 &spr_read_generic
, &spr_write_generic
,
3981 /* XXX : not implemented */
3982 spr_register(env
, SPR_601_HID2
, "HID2",
3983 SPR_NOACCESS
, SPR_NOACCESS
,
3984 &spr_read_generic
, &spr_write_generic
,
3986 /* XXX : not implemented */
3987 spr_register(env
, SPR_601_HID5
, "HID5",
3988 SPR_NOACCESS
, SPR_NOACCESS
,
3989 &spr_read_generic
, &spr_write_generic
,
3991 /* Memory management */
3994 * XXX: beware that dcache line size is 64
3995 * but dcbz uses 32 bytes "sectors"
3996 * XXX: this breaks clcs instruction !
3998 env
->dcache_line_size
= 32;
3999 env
->icache_line_size
= 64;
4000 /* Allocate hardware IRQ controller */
4001 ppc6xx_irq_init(env_archcpu(env
));
4004 POWERPC_FAMILY(601)(ObjectClass
*oc
, void *data
)
4006 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4007 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4009 dc
->desc
= "PowerPC 601";
4010 pcc
->init_proc
= init_proc_601
;
4011 pcc
->check_pow
= check_pow_none
;
4012 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_POWER_BR
|
4014 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4015 PPC_MEM_SYNC
| PPC_MEM_EIEIO
| PPC_MEM_TLBIE
|
4016 PPC_SEGMENT
| PPC_EXTERN
;
4017 pcc
->msr_mask
= (1ull << MSR_EE
) |
4027 pcc
->mmu_model
= POWERPC_MMU_601
;
4028 pcc
->excp_model
= POWERPC_EXCP_601
;
4029 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4030 pcc
->bfd_mach
= bfd_mach_ppc_601
;
4031 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_RTC_CLK
| POWERPC_FLAG_HID0_LE
;
4034 #define POWERPC_MSRR_601v (0x0000000000001040ULL)
4036 static void init_proc_601v(CPUPPCState
*env
)
4039 /* XXX : not implemented */
4040 spr_register(env
, SPR_601_HID15
, "HID15",
4041 SPR_NOACCESS
, SPR_NOACCESS
,
4042 &spr_read_generic
, &spr_write_generic
,
4046 POWERPC_FAMILY(601v
)(ObjectClass
*oc
, void *data
)
4048 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4049 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4051 dc
->desc
= "PowerPC 601v";
4052 pcc
->init_proc
= init_proc_601v
;
4053 pcc
->check_pow
= check_pow_none
;
4054 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_POWER_BR
|
4056 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4057 PPC_MEM_SYNC
| PPC_MEM_EIEIO
| PPC_MEM_TLBIE
|
4058 PPC_SEGMENT
| PPC_EXTERN
;
4059 pcc
->msr_mask
= (1ull << MSR_EE
) |
4069 pcc
->mmu_model
= POWERPC_MMU_601
;
4070 pcc
->excp_model
= POWERPC_EXCP_601
;
4071 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4072 pcc
->bfd_mach
= bfd_mach_ppc_601
;
4073 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_RTC_CLK
| POWERPC_FLAG_HID0_LE
;
4076 static void init_proc_602(CPUPPCState
*env
)
4078 register_ne_601_sprs(env
);
4079 register_sdr1_sprs(env
);
4080 register_602_sprs(env
);
4083 /* hardware implementation registers */
4084 /* XXX : not implemented */
4085 spr_register(env
, SPR_HID0
, "HID0",
4086 SPR_NOACCESS
, SPR_NOACCESS
,
4087 &spr_read_generic
, &spr_write_generic
,
4089 /* XXX : not implemented */
4090 spr_register(env
, SPR_HID1
, "HID1",
4091 SPR_NOACCESS
, SPR_NOACCESS
,
4092 &spr_read_generic
, &spr_write_generic
,
4094 /* Memory management */
4095 register_low_BATs(env
);
4096 register_6xx_7xx_soft_tlb(env
, 64, 2);
4098 env
->dcache_line_size
= 32;
4099 env
->icache_line_size
= 32;
4100 /* Allocate hardware IRQ controller */
4101 ppc6xx_irq_init(env_archcpu(env
));
4104 POWERPC_FAMILY(602)(ObjectClass
*oc
, void *data
)
4106 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4107 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4109 dc
->desc
= "PowerPC 602";
4110 pcc
->init_proc
= init_proc_602
;
4111 pcc
->check_pow
= check_pow_hid0
;
4112 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4113 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4114 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4115 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4116 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4117 PPC_MEM_TLBIE
| PPC_6xx_TLB
| PPC_MEM_TLBSYNC
|
4118 PPC_SEGMENT
| PPC_602_SPEC
;
4119 pcc
->msr_mask
= (1ull << MSR_VSX
) |
4122 (1ull << MSR_TGPR
) |
4137 /* XXX: 602 MMU is quite specific. Should add a special case */
4138 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
4139 pcc
->excp_model
= POWERPC_EXCP_602
;
4140 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4141 pcc
->bfd_mach
= bfd_mach_ppc_602
;
4142 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
4143 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
4146 static void init_proc_603(CPUPPCState
*env
)
4148 register_ne_601_sprs(env
);
4149 register_sdr1_sprs(env
);
4150 register_603_sprs(env
);
4153 /* hardware implementation registers */
4154 /* XXX : not implemented */
4155 spr_register(env
, SPR_HID0
, "HID0",
4156 SPR_NOACCESS
, SPR_NOACCESS
,
4157 &spr_read_generic
, &spr_write_generic
,
4159 /* XXX : not implemented */
4160 spr_register(env
, SPR_HID1
, "HID1",
4161 SPR_NOACCESS
, SPR_NOACCESS
,
4162 &spr_read_generic
, &spr_write_generic
,
4164 /* Memory management */
4165 register_low_BATs(env
);
4166 register_6xx_7xx_soft_tlb(env
, 64, 2);
4168 env
->dcache_line_size
= 32;
4169 env
->icache_line_size
= 32;
4170 /* Allocate hardware IRQ controller */
4171 ppc6xx_irq_init(env_archcpu(env
));
4174 POWERPC_FAMILY(603)(ObjectClass
*oc
, void *data
)
4176 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4177 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4179 dc
->desc
= "PowerPC 603";
4180 pcc
->init_proc
= init_proc_603
;
4181 pcc
->check_pow
= check_pow_hid0
;
4182 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4183 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4184 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4185 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4186 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4187 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
4188 PPC_SEGMENT
| PPC_EXTERN
;
4189 pcc
->msr_mask
= (1ull << MSR_POW
) |
4190 (1ull << MSR_TGPR
) |
4205 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
4206 pcc
->excp_model
= POWERPC_EXCP_603
;
4207 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4208 pcc
->bfd_mach
= bfd_mach_ppc_603
;
4209 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
4210 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
4213 POWERPC_FAMILY(603E
)(ObjectClass
*oc
, void *data
)
4215 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4216 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4218 dc
->desc
= "PowerPC 603e";
4219 pcc
->init_proc
= init_proc_603
;
4220 pcc
->check_pow
= check_pow_hid0
;
4221 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4222 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4223 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4224 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4225 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4226 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
4227 PPC_SEGMENT
| PPC_EXTERN
;
4228 pcc
->msr_mask
= (1ull << MSR_POW
) |
4229 (1ull << MSR_TGPR
) |
4244 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
4245 pcc
->excp_model
= POWERPC_EXCP_603
;
4246 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4247 pcc
->bfd_mach
= bfd_mach_ppc_ec603e
;
4248 pcc
->flags
= POWERPC_FLAG_TGPR
| POWERPC_FLAG_SE
|
4249 POWERPC_FLAG_BE
| POWERPC_FLAG_BUS_CLK
;
4252 static void init_proc_604(CPUPPCState
*env
)
4254 register_ne_601_sprs(env
);
4255 register_sdr1_sprs(env
);
4256 register_604_sprs(env
);
4259 /* Hardware implementation registers */
4260 /* XXX : not implemented */
4261 spr_register(env
, SPR_HID0
, "HID0",
4262 SPR_NOACCESS
, SPR_NOACCESS
,
4263 &spr_read_generic
, &spr_write_generic
,
4265 /* Memory management */
4266 register_low_BATs(env
);
4268 env
->dcache_line_size
= 32;
4269 env
->icache_line_size
= 32;
4270 /* Allocate hardware IRQ controller */
4271 ppc6xx_irq_init(env_archcpu(env
));
4274 POWERPC_FAMILY(604)(ObjectClass
*oc
, void *data
)
4276 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4277 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4279 dc
->desc
= "PowerPC 604";
4280 pcc
->init_proc
= init_proc_604
;
4281 pcc
->check_pow
= check_pow_nocheck
;
4282 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4283 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4284 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4285 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4286 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4287 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4288 PPC_SEGMENT
| PPC_EXTERN
;
4289 pcc
->msr_mask
= (1ull << MSR_POW
) |
4305 pcc
->mmu_model
= POWERPC_MMU_32B
;
4306 pcc
->excp_model
= POWERPC_EXCP_604
;
4307 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4308 pcc
->bfd_mach
= bfd_mach_ppc_604
;
4309 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4310 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4313 static void init_proc_604E(CPUPPCState
*env
)
4315 register_ne_601_sprs(env
);
4316 register_sdr1_sprs(env
);
4317 register_604_sprs(env
);
4318 /* XXX : not implemented */
4319 spr_register(env
, SPR_7XX_MMCR1
, "MMCR1",
4320 SPR_NOACCESS
, SPR_NOACCESS
,
4321 &spr_read_generic
, &spr_write_generic
,
4323 /* XXX : not implemented */
4324 spr_register(env
, SPR_7XX_PMC3
, "PMC3",
4325 SPR_NOACCESS
, SPR_NOACCESS
,
4326 &spr_read_generic
, &spr_write_generic
,
4328 /* XXX : not implemented */
4329 spr_register(env
, SPR_7XX_PMC4
, "PMC4",
4330 SPR_NOACCESS
, SPR_NOACCESS
,
4331 &spr_read_generic
, &spr_write_generic
,
4335 /* Hardware implementation registers */
4336 /* XXX : not implemented */
4337 spr_register(env
, SPR_HID0
, "HID0",
4338 SPR_NOACCESS
, SPR_NOACCESS
,
4339 &spr_read_generic
, &spr_write_generic
,
4341 /* XXX : not implemented */
4342 spr_register(env
, SPR_HID1
, "HID1",
4343 SPR_NOACCESS
, SPR_NOACCESS
,
4344 &spr_read_generic
, &spr_write_generic
,
4346 /* Memory management */
4347 register_low_BATs(env
);
4349 env
->dcache_line_size
= 32;
4350 env
->icache_line_size
= 32;
4351 /* Allocate hardware IRQ controller */
4352 ppc6xx_irq_init(env_archcpu(env
));
4355 POWERPC_FAMILY(604E
)(ObjectClass
*oc
, void *data
)
4357 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4358 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4360 dc
->desc
= "PowerPC 604E";
4361 pcc
->init_proc
= init_proc_604E
;
4362 pcc
->check_pow
= check_pow_nocheck
;
4363 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4364 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4365 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4366 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4367 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4368 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4369 PPC_SEGMENT
| PPC_EXTERN
;
4370 pcc
->msr_mask
= (1ull << MSR_POW
) |
4386 pcc
->mmu_model
= POWERPC_MMU_32B
;
4387 pcc
->excp_model
= POWERPC_EXCP_604
;
4388 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4389 pcc
->bfd_mach
= bfd_mach_ppc_604
;
4390 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4391 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4394 static void init_proc_740(CPUPPCState
*env
)
4396 register_ne_601_sprs(env
);
4397 register_sdr1_sprs(env
);
4398 register_7xx_sprs(env
);
4401 /* Thermal management */
4402 register_thrm_sprs(env
);
4403 /* Hardware implementation registers */
4404 /* XXX : not implemented */
4405 spr_register(env
, SPR_HID0
, "HID0",
4406 SPR_NOACCESS
, SPR_NOACCESS
,
4407 &spr_read_generic
, &spr_write_generic
,
4409 /* XXX : not implemented */
4410 spr_register(env
, SPR_HID1
, "HID1",
4411 SPR_NOACCESS
, SPR_NOACCESS
,
4412 &spr_read_generic
, &spr_write_generic
,
4414 /* Memory management */
4415 register_low_BATs(env
);
4417 env
->dcache_line_size
= 32;
4418 env
->icache_line_size
= 32;
4419 /* Allocate hardware IRQ controller */
4420 ppc6xx_irq_init(env_archcpu(env
));
4423 POWERPC_FAMILY(740)(ObjectClass
*oc
, void *data
)
4425 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4426 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4428 dc
->desc
= "PowerPC 740";
4429 pcc
->init_proc
= init_proc_740
;
4430 pcc
->check_pow
= check_pow_hid0
;
4431 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4432 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4433 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4434 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4435 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4436 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4437 PPC_SEGMENT
| PPC_EXTERN
;
4438 pcc
->msr_mask
= (1ull << MSR_POW
) |
4454 pcc
->mmu_model
= POWERPC_MMU_32B
;
4455 pcc
->excp_model
= POWERPC_EXCP_7x0
;
4456 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4457 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4458 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4459 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4462 static void init_proc_750(CPUPPCState
*env
)
4464 register_ne_601_sprs(env
);
4465 register_sdr1_sprs(env
);
4466 register_7xx_sprs(env
);
4467 /* XXX : not implemented */
4468 spr_register(env
, SPR_L2CR
, "L2CR",
4469 SPR_NOACCESS
, SPR_NOACCESS
,
4470 &spr_read_generic
, spr_access_nop
,
4474 /* Thermal management */
4475 register_thrm_sprs(env
);
4476 /* Hardware implementation registers */
4477 /* XXX : not implemented */
4478 spr_register(env
, SPR_HID0
, "HID0",
4479 SPR_NOACCESS
, SPR_NOACCESS
,
4480 &spr_read_generic
, &spr_write_generic
,
4482 /* XXX : not implemented */
4483 spr_register(env
, SPR_HID1
, "HID1",
4484 SPR_NOACCESS
, SPR_NOACCESS
,
4485 &spr_read_generic
, &spr_write_generic
,
4487 /* Memory management */
4488 register_low_BATs(env
);
4490 * XXX: high BATs are also present but are known to be bugged on
4494 env
->dcache_line_size
= 32;
4495 env
->icache_line_size
= 32;
4496 /* Allocate hardware IRQ controller */
4497 ppc6xx_irq_init(env_archcpu(env
));
4500 POWERPC_FAMILY(750)(ObjectClass
*oc
, void *data
)
4502 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4503 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4505 dc
->desc
= "PowerPC 750";
4506 pcc
->init_proc
= init_proc_750
;
4507 pcc
->check_pow
= check_pow_hid0
;
4508 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4509 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4510 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4511 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4512 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4513 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4514 PPC_SEGMENT
| PPC_EXTERN
;
4515 pcc
->msr_mask
= (1ull << MSR_POW
) |
4531 pcc
->mmu_model
= POWERPC_MMU_32B
;
4532 pcc
->excp_model
= POWERPC_EXCP_7x0
;
4533 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4534 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4535 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4536 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4539 static void init_proc_750cl(CPUPPCState
*env
)
4541 register_ne_601_sprs(env
);
4542 register_sdr1_sprs(env
);
4543 register_7xx_sprs(env
);
4544 /* XXX : not implemented */
4545 spr_register(env
, SPR_L2CR
, "L2CR",
4546 SPR_NOACCESS
, SPR_NOACCESS
,
4547 &spr_read_generic
, spr_access_nop
,
4551 /* Thermal management */
4552 /* Those registers are fake on 750CL */
4553 spr_register(env
, SPR_THRM1
, "THRM1",
4554 SPR_NOACCESS
, SPR_NOACCESS
,
4555 &spr_read_generic
, &spr_write_generic
,
4557 spr_register(env
, SPR_THRM2
, "THRM2",
4558 SPR_NOACCESS
, SPR_NOACCESS
,
4559 &spr_read_generic
, &spr_write_generic
,
4561 spr_register(env
, SPR_THRM3
, "THRM3",
4562 SPR_NOACCESS
, SPR_NOACCESS
,
4563 &spr_read_generic
, &spr_write_generic
,
4565 /* XXX: not implemented */
4566 spr_register(env
, SPR_750_TDCL
, "TDCL",
4567 SPR_NOACCESS
, SPR_NOACCESS
,
4568 &spr_read_generic
, &spr_write_generic
,
4570 spr_register(env
, SPR_750_TDCH
, "TDCH",
4571 SPR_NOACCESS
, SPR_NOACCESS
,
4572 &spr_read_generic
, &spr_write_generic
,
4575 /* XXX : not implemented */
4576 spr_register(env
, SPR_750_WPAR
, "WPAR",
4577 SPR_NOACCESS
, SPR_NOACCESS
,
4578 &spr_read_generic
, &spr_write_generic
,
4580 spr_register(env
, SPR_750_DMAL
, "DMAL",
4581 SPR_NOACCESS
, SPR_NOACCESS
,
4582 &spr_read_generic
, &spr_write_generic
,
4584 spr_register(env
, SPR_750_DMAU
, "DMAU",
4585 SPR_NOACCESS
, SPR_NOACCESS
,
4586 &spr_read_generic
, &spr_write_generic
,
4588 /* Hardware implementation registers */
4589 /* XXX : not implemented */
4590 spr_register(env
, SPR_HID0
, "HID0",
4591 SPR_NOACCESS
, SPR_NOACCESS
,
4592 &spr_read_generic
, &spr_write_generic
,
4594 /* XXX : not implemented */
4595 spr_register(env
, SPR_HID1
, "HID1",
4596 SPR_NOACCESS
, SPR_NOACCESS
,
4597 &spr_read_generic
, &spr_write_generic
,
4599 /* XXX : not implemented */
4600 spr_register(env
, SPR_750CL_HID2
, "HID2",
4601 SPR_NOACCESS
, SPR_NOACCESS
,
4602 &spr_read_generic
, &spr_write_generic
,
4604 /* XXX : not implemented */
4605 spr_register(env
, SPR_750CL_HID4
, "HID4",
4606 SPR_NOACCESS
, SPR_NOACCESS
,
4607 &spr_read_generic
, &spr_write_generic
,
4609 /* Quantization registers */
4610 /* XXX : not implemented */
4611 spr_register(env
, SPR_750_GQR0
, "GQR0",
4612 SPR_NOACCESS
, SPR_NOACCESS
,
4613 &spr_read_generic
, &spr_write_generic
,
4615 /* XXX : not implemented */
4616 spr_register(env
, SPR_750_GQR1
, "GQR1",
4617 SPR_NOACCESS
, SPR_NOACCESS
,
4618 &spr_read_generic
, &spr_write_generic
,
4620 /* XXX : not implemented */
4621 spr_register(env
, SPR_750_GQR2
, "GQR2",
4622 SPR_NOACCESS
, SPR_NOACCESS
,
4623 &spr_read_generic
, &spr_write_generic
,
4625 /* XXX : not implemented */
4626 spr_register(env
, SPR_750_GQR3
, "GQR3",
4627 SPR_NOACCESS
, SPR_NOACCESS
,
4628 &spr_read_generic
, &spr_write_generic
,
4630 /* XXX : not implemented */
4631 spr_register(env
, SPR_750_GQR4
, "GQR4",
4632 SPR_NOACCESS
, SPR_NOACCESS
,
4633 &spr_read_generic
, &spr_write_generic
,
4635 /* XXX : not implemented */
4636 spr_register(env
, SPR_750_GQR5
, "GQR5",
4637 SPR_NOACCESS
, SPR_NOACCESS
,
4638 &spr_read_generic
, &spr_write_generic
,
4640 /* XXX : not implemented */
4641 spr_register(env
, SPR_750_GQR6
, "GQR6",
4642 SPR_NOACCESS
, SPR_NOACCESS
,
4643 &spr_read_generic
, &spr_write_generic
,
4645 /* XXX : not implemented */
4646 spr_register(env
, SPR_750_GQR7
, "GQR7",
4647 SPR_NOACCESS
, SPR_NOACCESS
,
4648 &spr_read_generic
, &spr_write_generic
,
4650 /* Memory management */
4651 register_low_BATs(env
);
4652 /* PowerPC 750cl has 8 DBATs and 8 IBATs */
4653 register_high_BATs(env
);
4654 init_excp_750cl(env
);
4655 env
->dcache_line_size
= 32;
4656 env
->icache_line_size
= 32;
4657 /* Allocate hardware IRQ controller */
4658 ppc6xx_irq_init(env_archcpu(env
));
4661 POWERPC_FAMILY(750cl
)(ObjectClass
*oc
, void *data
)
4663 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4664 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4666 dc
->desc
= "PowerPC 750 CL";
4667 pcc
->init_proc
= init_proc_750cl
;
4668 pcc
->check_pow
= check_pow_hid0
;
4670 * XXX: not implemented:
4671 * cache lock instructions:
4673 * floating point paired instructions
4708 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4709 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4710 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4711 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4712 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4713 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4714 PPC_SEGMENT
| PPC_EXTERN
;
4715 pcc
->msr_mask
= (1ull << MSR_POW
) |
4731 pcc
->mmu_model
= POWERPC_MMU_32B
;
4732 pcc
->excp_model
= POWERPC_EXCP_7x0
;
4733 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4734 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4735 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4736 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4739 static void init_proc_750cx(CPUPPCState
*env
)
4741 register_ne_601_sprs(env
);
4742 register_sdr1_sprs(env
);
4743 register_7xx_sprs(env
);
4744 /* XXX : not implemented */
4745 spr_register(env
, SPR_L2CR
, "L2CR",
4746 SPR_NOACCESS
, SPR_NOACCESS
,
4747 &spr_read_generic
, spr_access_nop
,
4751 /* Thermal management */
4752 register_thrm_sprs(env
);
4753 /* This register is not implemented but is present for compatibility */
4754 spr_register(env
, SPR_SDA
, "SDA",
4755 SPR_NOACCESS
, SPR_NOACCESS
,
4756 &spr_read_generic
, &spr_write_generic
,
4758 /* Hardware implementation registers */
4759 /* XXX : not implemented */
4760 spr_register(env
, SPR_HID0
, "HID0",
4761 SPR_NOACCESS
, SPR_NOACCESS
,
4762 &spr_read_generic
, &spr_write_generic
,
4764 /* XXX : not implemented */
4765 spr_register(env
, SPR_HID1
, "HID1",
4766 SPR_NOACCESS
, SPR_NOACCESS
,
4767 &spr_read_generic
, &spr_write_generic
,
4769 /* Memory management */
4770 register_low_BATs(env
);
4771 /* PowerPC 750cx has 8 DBATs and 8 IBATs */
4772 register_high_BATs(env
);
4773 init_excp_750cx(env
);
4774 env
->dcache_line_size
= 32;
4775 env
->icache_line_size
= 32;
4776 /* Allocate hardware IRQ controller */
4777 ppc6xx_irq_init(env_archcpu(env
));
4780 POWERPC_FAMILY(750cx
)(ObjectClass
*oc
, void *data
)
4782 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4783 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4785 dc
->desc
= "PowerPC 750CX";
4786 pcc
->init_proc
= init_proc_750cx
;
4787 pcc
->check_pow
= check_pow_hid0
;
4788 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4789 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4790 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4791 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4792 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4793 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4794 PPC_SEGMENT
| PPC_EXTERN
;
4795 pcc
->msr_mask
= (1ull << MSR_POW
) |
4811 pcc
->mmu_model
= POWERPC_MMU_32B
;
4812 pcc
->excp_model
= POWERPC_EXCP_7x0
;
4813 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4814 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4815 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4816 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4819 static void init_proc_750fx(CPUPPCState
*env
)
4821 register_ne_601_sprs(env
);
4822 register_sdr1_sprs(env
);
4823 register_7xx_sprs(env
);
4824 /* XXX : not implemented */
4825 spr_register(env
, SPR_L2CR
, "L2CR",
4826 SPR_NOACCESS
, SPR_NOACCESS
,
4827 &spr_read_generic
, spr_access_nop
,
4831 /* Thermal management */
4832 register_thrm_sprs(env
);
4833 /* XXX : not implemented */
4834 spr_register(env
, SPR_750_THRM4
, "THRM4",
4835 SPR_NOACCESS
, SPR_NOACCESS
,
4836 &spr_read_generic
, &spr_write_generic
,
4838 /* Hardware implementation registers */
4839 /* XXX : not implemented */
4840 spr_register(env
, SPR_HID0
, "HID0",
4841 SPR_NOACCESS
, SPR_NOACCESS
,
4842 &spr_read_generic
, &spr_write_generic
,
4844 /* XXX : not implemented */
4845 spr_register(env
, SPR_HID1
, "HID1",
4846 SPR_NOACCESS
, SPR_NOACCESS
,
4847 &spr_read_generic
, &spr_write_generic
,
4849 /* XXX : not implemented */
4850 spr_register(env
, SPR_750FX_HID2
, "HID2",
4851 SPR_NOACCESS
, SPR_NOACCESS
,
4852 &spr_read_generic
, &spr_write_generic
,
4854 /* Memory management */
4855 register_low_BATs(env
);
4856 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
4857 register_high_BATs(env
);
4859 env
->dcache_line_size
= 32;
4860 env
->icache_line_size
= 32;
4861 /* Allocate hardware IRQ controller */
4862 ppc6xx_irq_init(env_archcpu(env
));
4865 POWERPC_FAMILY(750fx
)(ObjectClass
*oc
, void *data
)
4867 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4868 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4870 dc
->desc
= "PowerPC 750FX";
4871 pcc
->init_proc
= init_proc_750fx
;
4872 pcc
->check_pow
= check_pow_hid0
;
4873 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4874 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4875 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4876 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4877 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4878 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4879 PPC_SEGMENT
| PPC_EXTERN
;
4880 pcc
->msr_mask
= (1ull << MSR_POW
) |
4896 pcc
->mmu_model
= POWERPC_MMU_32B
;
4897 pcc
->excp_model
= POWERPC_EXCP_7x0
;
4898 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4899 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4900 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4901 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4904 static void init_proc_750gx(CPUPPCState
*env
)
4906 register_ne_601_sprs(env
);
4907 register_sdr1_sprs(env
);
4908 register_7xx_sprs(env
);
4909 /* XXX : not implemented (XXX: different from 750fx) */
4910 spr_register(env
, SPR_L2CR
, "L2CR",
4911 SPR_NOACCESS
, SPR_NOACCESS
,
4912 &spr_read_generic
, spr_access_nop
,
4916 /* Thermal management */
4917 register_thrm_sprs(env
);
4918 /* XXX : not implemented */
4919 spr_register(env
, SPR_750_THRM4
, "THRM4",
4920 SPR_NOACCESS
, SPR_NOACCESS
,
4921 &spr_read_generic
, &spr_write_generic
,
4923 /* Hardware implementation registers */
4924 /* XXX : not implemented (XXX: different from 750fx) */
4925 spr_register(env
, SPR_HID0
, "HID0",
4926 SPR_NOACCESS
, SPR_NOACCESS
,
4927 &spr_read_generic
, &spr_write_generic
,
4929 /* XXX : not implemented */
4930 spr_register(env
, SPR_HID1
, "HID1",
4931 SPR_NOACCESS
, SPR_NOACCESS
,
4932 &spr_read_generic
, &spr_write_generic
,
4934 /* XXX : not implemented (XXX: different from 750fx) */
4935 spr_register(env
, SPR_750FX_HID2
, "HID2",
4936 SPR_NOACCESS
, SPR_NOACCESS
,
4937 &spr_read_generic
, &spr_write_generic
,
4939 /* Memory management */
4940 register_low_BATs(env
);
4941 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
4942 register_high_BATs(env
);
4944 env
->dcache_line_size
= 32;
4945 env
->icache_line_size
= 32;
4946 /* Allocate hardware IRQ controller */
4947 ppc6xx_irq_init(env_archcpu(env
));
4950 POWERPC_FAMILY(750gx
)(ObjectClass
*oc
, void *data
)
4952 DeviceClass
*dc
= DEVICE_CLASS(oc
);
4953 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
4955 dc
->desc
= "PowerPC 750GX";
4956 pcc
->init_proc
= init_proc_750gx
;
4957 pcc
->check_pow
= check_pow_hid0
;
4958 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
4959 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
4960 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
4961 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
4962 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
4963 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
4964 PPC_SEGMENT
| PPC_EXTERN
;
4965 pcc
->msr_mask
= (1ull << MSR_POW
) |
4981 pcc
->mmu_model
= POWERPC_MMU_32B
;
4982 pcc
->excp_model
= POWERPC_EXCP_7x0
;
4983 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
4984 pcc
->bfd_mach
= bfd_mach_ppc_750
;
4985 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
4986 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
4989 static void init_proc_745(CPUPPCState
*env
)
4991 register_ne_601_sprs(env
);
4992 register_sdr1_sprs(env
);
4993 register_7xx_sprs(env
);
4994 register_G2_755_sprs(env
);
4997 /* Thermal management */
4998 register_thrm_sprs(env
);
4999 /* Hardware implementation registers */
5000 /* XXX : not implemented */
5001 spr_register(env
, SPR_HID0
, "HID0",
5002 SPR_NOACCESS
, SPR_NOACCESS
,
5003 &spr_read_generic
, &spr_write_generic
,
5005 /* XXX : not implemented */
5006 spr_register(env
, SPR_HID1
, "HID1",
5007 SPR_NOACCESS
, SPR_NOACCESS
,
5008 &spr_read_generic
, &spr_write_generic
,
5010 /* XXX : not implemented */
5011 spr_register(env
, SPR_HID2
, "HID2",
5012 SPR_NOACCESS
, SPR_NOACCESS
,
5013 &spr_read_generic
, &spr_write_generic
,
5015 /* Memory management */
5016 register_low_BATs(env
);
5017 register_high_BATs(env
);
5018 register_6xx_7xx_soft_tlb(env
, 64, 2);
5020 env
->dcache_line_size
= 32;
5021 env
->icache_line_size
= 32;
5022 /* Allocate hardware IRQ controller */
5023 ppc6xx_irq_init(env_archcpu(env
));
5026 POWERPC_FAMILY(745)(ObjectClass
*oc
, void *data
)
5028 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5029 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5031 dc
->desc
= "PowerPC 745";
5032 pcc
->init_proc
= init_proc_745
;
5033 pcc
->check_pow
= check_pow_hid0
;
5034 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5035 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5036 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
5037 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
5038 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5039 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
5040 PPC_SEGMENT
| PPC_EXTERN
;
5041 pcc
->msr_mask
= (1ull << MSR_POW
) |
5057 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
5058 pcc
->excp_model
= POWERPC_EXCP_7x5
;
5059 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5060 pcc
->bfd_mach
= bfd_mach_ppc_750
;
5061 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
5062 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
5065 static void init_proc_755(CPUPPCState
*env
)
5067 register_ne_601_sprs(env
);
5068 register_sdr1_sprs(env
);
5069 register_7xx_sprs(env
);
5070 register_G2_755_sprs(env
);
5073 /* L2 cache control */
5074 /* XXX : not implemented */
5075 spr_register(env
, SPR_L2CR
, "L2CR",
5076 SPR_NOACCESS
, SPR_NOACCESS
,
5077 &spr_read_generic
, spr_access_nop
,
5079 /* XXX : not implemented */
5080 spr_register(env
, SPR_L2PMCR
, "L2PMCR",
5081 SPR_NOACCESS
, SPR_NOACCESS
,
5082 &spr_read_generic
, &spr_write_generic
,
5084 /* Thermal management */
5085 register_thrm_sprs(env
);
5086 /* Hardware implementation registers */
5087 /* XXX : not implemented */
5088 spr_register(env
, SPR_HID0
, "HID0",
5089 SPR_NOACCESS
, SPR_NOACCESS
,
5090 &spr_read_generic
, &spr_write_generic
,
5092 /* XXX : not implemented */
5093 spr_register(env
, SPR_HID1
, "HID1",
5094 SPR_NOACCESS
, SPR_NOACCESS
,
5095 &spr_read_generic
, &spr_write_generic
,
5097 /* XXX : not implemented */
5098 spr_register(env
, SPR_HID2
, "HID2",
5099 SPR_NOACCESS
, SPR_NOACCESS
,
5100 &spr_read_generic
, &spr_write_generic
,
5102 /* Memory management */
5103 register_low_BATs(env
);
5104 register_high_BATs(env
);
5105 register_6xx_7xx_soft_tlb(env
, 64, 2);
5107 env
->dcache_line_size
= 32;
5108 env
->icache_line_size
= 32;
5109 /* Allocate hardware IRQ controller */
5110 ppc6xx_irq_init(env_archcpu(env
));
5113 POWERPC_FAMILY(755)(ObjectClass
*oc
, void *data
)
5115 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5116 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5118 dc
->desc
= "PowerPC 755";
5119 pcc
->init_proc
= init_proc_755
;
5120 pcc
->check_pow
= check_pow_hid0
;
5121 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5122 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5123 PPC_FLOAT_FRSQRTE
| PPC_FLOAT_STFIWX
|
5124 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
5125 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5126 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
| PPC_6xx_TLB
|
5127 PPC_SEGMENT
| PPC_EXTERN
;
5128 pcc
->msr_mask
= (1ull << MSR_POW
) |
5144 pcc
->mmu_model
= POWERPC_MMU_SOFT_6xx
;
5145 pcc
->excp_model
= POWERPC_EXCP_7x5
;
5146 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5147 pcc
->bfd_mach
= bfd_mach_ppc_750
;
5148 pcc
->flags
= POWERPC_FLAG_SE
| POWERPC_FLAG_BE
|
5149 POWERPC_FLAG_PMM
| POWERPC_FLAG_BUS_CLK
;
5152 static void init_proc_7400(CPUPPCState
*env
)
5154 register_ne_601_sprs(env
);
5155 register_sdr1_sprs(env
);
5156 register_7xx_sprs(env
);
5159 /* 74xx specific SPR */
5160 register_74xx_sprs(env
);
5161 vscr_init(env
, 0x00010000);
5162 /* XXX : not implemented */
5163 spr_register(env
, SPR_UBAMR
, "UBAMR",
5164 &spr_read_ureg
, SPR_NOACCESS
,
5165 &spr_read_ureg
, SPR_NOACCESS
,
5167 /* XXX: this seems not implemented on all revisions. */
5168 /* XXX : not implemented */
5169 spr_register(env
, SPR_MSSCR1
, "MSSCR1",
5170 SPR_NOACCESS
, SPR_NOACCESS
,
5171 &spr_read_generic
, &spr_write_generic
,
5173 /* Thermal management */
5174 register_thrm_sprs(env
);
5175 /* Memory management */
5176 register_low_BATs(env
);
5177 init_excp_7400(env
);
5178 env
->dcache_line_size
= 32;
5179 env
->icache_line_size
= 32;
5180 /* Allocate hardware IRQ controller */
5181 ppc6xx_irq_init(env_archcpu(env
));
5184 POWERPC_FAMILY(7400)(ObjectClass
*oc
, void *data
)
5186 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5187 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5189 dc
->desc
= "PowerPC 7400 (aka G4)";
5190 pcc
->init_proc
= init_proc_7400
;
5191 pcc
->check_pow
= check_pow_hid0
;
5192 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5193 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5194 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5196 PPC_CACHE
| PPC_CACHE_ICBI
|
5197 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5198 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5199 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5201 PPC_SEGMENT
| PPC_EXTERN
|
5203 pcc
->msr_mask
= (1ull << MSR_VR
) |
5220 pcc
->mmu_model
= POWERPC_MMU_32B
;
5221 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5222 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5223 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5224 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5225 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5226 POWERPC_FLAG_BUS_CLK
;
5229 static void init_proc_7410(CPUPPCState
*env
)
5231 register_ne_601_sprs(env
);
5232 register_sdr1_sprs(env
);
5233 register_7xx_sprs(env
);
5236 /* 74xx specific SPR */
5237 register_74xx_sprs(env
);
5238 vscr_init(env
, 0x00010000);
5239 /* XXX : not implemented */
5240 spr_register(env
, SPR_UBAMR
, "UBAMR",
5241 &spr_read_ureg
, SPR_NOACCESS
,
5242 &spr_read_ureg
, SPR_NOACCESS
,
5244 /* Thermal management */
5245 register_thrm_sprs(env
);
5247 /* XXX : not implemented */
5248 spr_register(env
, SPR_L2PMCR
, "L2PMCR",
5249 SPR_NOACCESS
, SPR_NOACCESS
,
5250 &spr_read_generic
, &spr_write_generic
,
5253 /* XXX : not implemented */
5254 spr_register(env
, SPR_LDSTDB
, "LDSTDB",
5255 SPR_NOACCESS
, SPR_NOACCESS
,
5256 &spr_read_generic
, &spr_write_generic
,
5258 /* Memory management */
5259 register_low_BATs(env
);
5260 init_excp_7400(env
);
5261 env
->dcache_line_size
= 32;
5262 env
->icache_line_size
= 32;
5263 /* Allocate hardware IRQ controller */
5264 ppc6xx_irq_init(env_archcpu(env
));
5267 POWERPC_FAMILY(7410)(ObjectClass
*oc
, void *data
)
5269 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5270 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5272 dc
->desc
= "PowerPC 7410 (aka G4)";
5273 pcc
->init_proc
= init_proc_7410
;
5274 pcc
->check_pow
= check_pow_hid0
;
5275 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5276 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5277 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5279 PPC_CACHE
| PPC_CACHE_ICBI
|
5280 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5281 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5282 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5284 PPC_SEGMENT
| PPC_EXTERN
|
5286 pcc
->msr_mask
= (1ull << MSR_VR
) |
5303 pcc
->mmu_model
= POWERPC_MMU_32B
;
5304 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5305 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5306 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5307 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5308 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5309 POWERPC_FLAG_BUS_CLK
;
5312 static void init_proc_7440(CPUPPCState
*env
)
5314 register_ne_601_sprs(env
);
5315 register_sdr1_sprs(env
);
5316 register_7xx_sprs(env
);
5319 /* 74xx specific SPR */
5320 register_74xx_sprs(env
);
5321 vscr_init(env
, 0x00010000);
5322 /* XXX : not implemented */
5323 spr_register(env
, SPR_UBAMR
, "UBAMR",
5324 &spr_read_ureg
, SPR_NOACCESS
,
5325 &spr_read_ureg
, SPR_NOACCESS
,
5328 /* XXX : not implemented */
5329 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5330 SPR_NOACCESS
, SPR_NOACCESS
,
5331 &spr_read_generic
, &spr_write_generic
,
5334 /* XXX : not implemented */
5335 spr_register(env
, SPR_ICTRL
, "ICTRL",
5336 SPR_NOACCESS
, SPR_NOACCESS
,
5337 &spr_read_generic
, &spr_write_generic
,
5340 /* XXX : not implemented */
5341 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5342 SPR_NOACCESS
, SPR_NOACCESS
,
5343 &spr_read_generic
, &spr_write_generic
,
5346 /* XXX : not implemented */
5347 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5348 SPR_NOACCESS
, SPR_NOACCESS
,
5349 &spr_read_generic
, &spr_write_generic
,
5351 /* XXX : not implemented */
5352 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5353 &spr_read_ureg
, SPR_NOACCESS
,
5354 &spr_read_ureg
, SPR_NOACCESS
,
5356 /* XXX : not implemented */
5357 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5358 SPR_NOACCESS
, SPR_NOACCESS
,
5359 &spr_read_generic
, &spr_write_generic
,
5361 /* XXX : not implemented */
5362 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5363 &spr_read_ureg
, SPR_NOACCESS
,
5364 &spr_read_ureg
, SPR_NOACCESS
,
5366 /* Memory management */
5367 register_low_BATs(env
);
5368 init_excp_7450(env
);
5369 env
->dcache_line_size
= 32;
5370 env
->icache_line_size
= 32;
5371 /* Allocate hardware IRQ controller */
5372 ppc6xx_irq_init(env_archcpu(env
));
5375 POWERPC_FAMILY(7440)(ObjectClass
*oc
, void *data
)
5377 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5378 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5380 dc
->desc
= "PowerPC 7440 (aka G4)";
5381 pcc
->init_proc
= init_proc_7440
;
5382 pcc
->check_pow
= check_pow_hid0_74xx
;
5383 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5384 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5385 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5387 PPC_CACHE
| PPC_CACHE_ICBI
|
5388 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5389 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5390 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5392 PPC_SEGMENT
| PPC_EXTERN
|
5394 pcc
->msr_mask
= (1ull << MSR_VR
) |
5411 pcc
->mmu_model
= POWERPC_MMU_32B
;
5412 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5413 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5414 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5415 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5416 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5417 POWERPC_FLAG_BUS_CLK
;
5420 static void init_proc_7450(CPUPPCState
*env
)
5422 register_ne_601_sprs(env
);
5423 register_sdr1_sprs(env
);
5424 register_7xx_sprs(env
);
5427 /* 74xx specific SPR */
5428 register_74xx_sprs(env
);
5429 vscr_init(env
, 0x00010000);
5430 /* Level 3 cache control */
5431 register_l3_ctrl(env
);
5433 /* XXX : not implemented */
5434 spr_register(env
, SPR_L3ITCR1
, "L3ITCR1",
5435 SPR_NOACCESS
, SPR_NOACCESS
,
5436 &spr_read_generic
, &spr_write_generic
,
5439 /* XXX : not implemented */
5440 spr_register(env
, SPR_L3ITCR2
, "L3ITCR2",
5441 SPR_NOACCESS
, SPR_NOACCESS
,
5442 &spr_read_generic
, &spr_write_generic
,
5445 /* XXX : not implemented */
5446 spr_register(env
, SPR_L3ITCR3
, "L3ITCR3",
5447 SPR_NOACCESS
, SPR_NOACCESS
,
5448 &spr_read_generic
, &spr_write_generic
,
5451 /* XXX : not implemented */
5452 spr_register(env
, SPR_L3OHCR
, "L3OHCR",
5453 SPR_NOACCESS
, SPR_NOACCESS
,
5454 &spr_read_generic
, &spr_write_generic
,
5456 /* XXX : not implemented */
5457 spr_register(env
, SPR_UBAMR
, "UBAMR",
5458 &spr_read_ureg
, SPR_NOACCESS
,
5459 &spr_read_ureg
, SPR_NOACCESS
,
5462 /* XXX : not implemented */
5463 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5464 SPR_NOACCESS
, SPR_NOACCESS
,
5465 &spr_read_generic
, &spr_write_generic
,
5468 /* XXX : not implemented */
5469 spr_register(env
, SPR_ICTRL
, "ICTRL",
5470 SPR_NOACCESS
, SPR_NOACCESS
,
5471 &spr_read_generic
, &spr_write_generic
,
5474 /* XXX : not implemented */
5475 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5476 SPR_NOACCESS
, SPR_NOACCESS
,
5477 &spr_read_generic
, &spr_write_generic
,
5480 /* XXX : not implemented */
5481 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5482 SPR_NOACCESS
, SPR_NOACCESS
,
5483 &spr_read_generic
, &spr_write_generic
,
5485 /* XXX : not implemented */
5486 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5487 &spr_read_ureg
, SPR_NOACCESS
,
5488 &spr_read_ureg
, SPR_NOACCESS
,
5490 /* XXX : not implemented */
5491 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5492 SPR_NOACCESS
, SPR_NOACCESS
,
5493 &spr_read_generic
, &spr_write_generic
,
5495 /* XXX : not implemented */
5496 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5497 &spr_read_ureg
, SPR_NOACCESS
,
5498 &spr_read_ureg
, SPR_NOACCESS
,
5500 /* Memory management */
5501 register_low_BATs(env
);
5502 init_excp_7450(env
);
5503 env
->dcache_line_size
= 32;
5504 env
->icache_line_size
= 32;
5505 /* Allocate hardware IRQ controller */
5506 ppc6xx_irq_init(env_archcpu(env
));
5509 POWERPC_FAMILY(7450)(ObjectClass
*oc
, void *data
)
5511 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5512 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5514 dc
->desc
= "PowerPC 7450 (aka G4)";
5515 pcc
->init_proc
= init_proc_7450
;
5516 pcc
->check_pow
= check_pow_hid0_74xx
;
5517 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5518 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5519 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5521 PPC_CACHE
| PPC_CACHE_ICBI
|
5522 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5523 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5524 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5526 PPC_SEGMENT
| PPC_EXTERN
|
5528 pcc
->msr_mask
= (1ull << MSR_VR
) |
5545 pcc
->mmu_model
= POWERPC_MMU_32B
;
5546 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5547 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5548 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5549 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5550 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5551 POWERPC_FLAG_BUS_CLK
;
5554 static void init_proc_7445(CPUPPCState
*env
)
5556 register_ne_601_sprs(env
);
5557 register_sdr1_sprs(env
);
5558 register_7xx_sprs(env
);
5561 /* 74xx specific SPR */
5562 register_74xx_sprs(env
);
5563 vscr_init(env
, 0x00010000);
5565 /* XXX : not implemented */
5566 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5567 SPR_NOACCESS
, SPR_NOACCESS
,
5568 &spr_read_generic
, &spr_write_generic
,
5571 /* XXX : not implemented */
5572 spr_register(env
, SPR_ICTRL
, "ICTRL",
5573 SPR_NOACCESS
, SPR_NOACCESS
,
5574 &spr_read_generic
, &spr_write_generic
,
5577 /* XXX : not implemented */
5578 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5579 SPR_NOACCESS
, SPR_NOACCESS
,
5580 &spr_read_generic
, &spr_write_generic
,
5583 /* XXX : not implemented */
5584 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5585 SPR_NOACCESS
, SPR_NOACCESS
,
5586 &spr_read_generic
, &spr_write_generic
,
5588 /* XXX : not implemented */
5589 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5590 &spr_read_ureg
, SPR_NOACCESS
,
5591 &spr_read_ureg
, SPR_NOACCESS
,
5593 /* XXX : not implemented */
5594 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5595 SPR_NOACCESS
, SPR_NOACCESS
,
5596 &spr_read_generic
, &spr_write_generic
,
5598 /* XXX : not implemented */
5599 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5600 &spr_read_ureg
, SPR_NOACCESS
,
5601 &spr_read_ureg
, SPR_NOACCESS
,
5604 spr_register(env
, SPR_SPRG4
, "SPRG4",
5605 SPR_NOACCESS
, SPR_NOACCESS
,
5606 &spr_read_generic
, &spr_write_generic
,
5608 spr_register(env
, SPR_USPRG4
, "USPRG4",
5609 &spr_read_ureg
, SPR_NOACCESS
,
5610 &spr_read_ureg
, SPR_NOACCESS
,
5612 spr_register(env
, SPR_SPRG5
, "SPRG5",
5613 SPR_NOACCESS
, SPR_NOACCESS
,
5614 &spr_read_generic
, &spr_write_generic
,
5616 spr_register(env
, SPR_USPRG5
, "USPRG5",
5617 &spr_read_ureg
, SPR_NOACCESS
,
5618 &spr_read_ureg
, SPR_NOACCESS
,
5620 spr_register(env
, SPR_SPRG6
, "SPRG6",
5621 SPR_NOACCESS
, SPR_NOACCESS
,
5622 &spr_read_generic
, &spr_write_generic
,
5624 spr_register(env
, SPR_USPRG6
, "USPRG6",
5625 &spr_read_ureg
, SPR_NOACCESS
,
5626 &spr_read_ureg
, SPR_NOACCESS
,
5628 spr_register(env
, SPR_SPRG7
, "SPRG7",
5629 SPR_NOACCESS
, SPR_NOACCESS
,
5630 &spr_read_generic
, &spr_write_generic
,
5632 spr_register(env
, SPR_USPRG7
, "USPRG7",
5633 &spr_read_ureg
, SPR_NOACCESS
,
5634 &spr_read_ureg
, SPR_NOACCESS
,
5636 /* Memory management */
5637 register_low_BATs(env
);
5638 register_high_BATs(env
);
5639 init_excp_7450(env
);
5640 env
->dcache_line_size
= 32;
5641 env
->icache_line_size
= 32;
5642 /* Allocate hardware IRQ controller */
5643 ppc6xx_irq_init(env_archcpu(env
));
5646 POWERPC_FAMILY(7445)(ObjectClass
*oc
, void *data
)
5648 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5649 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5651 dc
->desc
= "PowerPC 7445 (aka G4)";
5652 pcc
->init_proc
= init_proc_7445
;
5653 pcc
->check_pow
= check_pow_hid0_74xx
;
5654 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5655 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5656 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5658 PPC_CACHE
| PPC_CACHE_ICBI
|
5659 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5660 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5661 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5663 PPC_SEGMENT
| PPC_EXTERN
|
5665 pcc
->msr_mask
= (1ull << MSR_VR
) |
5682 pcc
->mmu_model
= POWERPC_MMU_32B
;
5683 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5684 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5685 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5686 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5687 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5688 POWERPC_FLAG_BUS_CLK
;
5691 static void init_proc_7455(CPUPPCState
*env
)
5693 register_ne_601_sprs(env
);
5694 register_sdr1_sprs(env
);
5695 register_7xx_sprs(env
);
5698 /* 74xx specific SPR */
5699 register_74xx_sprs(env
);
5700 vscr_init(env
, 0x00010000);
5701 /* Level 3 cache control */
5702 register_l3_ctrl(env
);
5704 /* XXX : not implemented */
5705 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5706 SPR_NOACCESS
, SPR_NOACCESS
,
5707 &spr_read_generic
, &spr_write_generic
,
5710 /* XXX : not implemented */
5711 spr_register(env
, SPR_ICTRL
, "ICTRL",
5712 SPR_NOACCESS
, SPR_NOACCESS
,
5713 &spr_read_generic
, &spr_write_generic
,
5716 /* XXX : not implemented */
5717 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5718 SPR_NOACCESS
, SPR_NOACCESS
,
5719 &spr_read_generic
, &spr_write_generic
,
5722 /* XXX : not implemented */
5723 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5724 SPR_NOACCESS
, SPR_NOACCESS
,
5725 &spr_read_generic
, &spr_write_generic
,
5727 /* XXX : not implemented */
5728 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5729 &spr_read_ureg
, SPR_NOACCESS
,
5730 &spr_read_ureg
, SPR_NOACCESS
,
5732 /* XXX : not implemented */
5733 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5734 SPR_NOACCESS
, SPR_NOACCESS
,
5735 &spr_read_generic
, &spr_write_generic
,
5737 /* XXX : not implemented */
5738 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5739 &spr_read_ureg
, SPR_NOACCESS
,
5740 &spr_read_ureg
, SPR_NOACCESS
,
5743 spr_register(env
, SPR_SPRG4
, "SPRG4",
5744 SPR_NOACCESS
, SPR_NOACCESS
,
5745 &spr_read_generic
, &spr_write_generic
,
5747 spr_register(env
, SPR_USPRG4
, "USPRG4",
5748 &spr_read_ureg
, SPR_NOACCESS
,
5749 &spr_read_ureg
, SPR_NOACCESS
,
5751 spr_register(env
, SPR_SPRG5
, "SPRG5",
5752 SPR_NOACCESS
, SPR_NOACCESS
,
5753 &spr_read_generic
, &spr_write_generic
,
5755 spr_register(env
, SPR_USPRG5
, "USPRG5",
5756 &spr_read_ureg
, SPR_NOACCESS
,
5757 &spr_read_ureg
, SPR_NOACCESS
,
5759 spr_register(env
, SPR_SPRG6
, "SPRG6",
5760 SPR_NOACCESS
, SPR_NOACCESS
,
5761 &spr_read_generic
, &spr_write_generic
,
5763 spr_register(env
, SPR_USPRG6
, "USPRG6",
5764 &spr_read_ureg
, SPR_NOACCESS
,
5765 &spr_read_ureg
, SPR_NOACCESS
,
5767 spr_register(env
, SPR_SPRG7
, "SPRG7",
5768 SPR_NOACCESS
, SPR_NOACCESS
,
5769 &spr_read_generic
, &spr_write_generic
,
5771 spr_register(env
, SPR_USPRG7
, "USPRG7",
5772 &spr_read_ureg
, SPR_NOACCESS
,
5773 &spr_read_ureg
, SPR_NOACCESS
,
5775 /* Memory management */
5776 register_low_BATs(env
);
5777 register_high_BATs(env
);
5778 init_excp_7450(env
);
5779 env
->dcache_line_size
= 32;
5780 env
->icache_line_size
= 32;
5781 /* Allocate hardware IRQ controller */
5782 ppc6xx_irq_init(env_archcpu(env
));
5785 POWERPC_FAMILY(7455)(ObjectClass
*oc
, void *data
)
5787 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5788 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5790 dc
->desc
= "PowerPC 7455 (aka G4)";
5791 pcc
->init_proc
= init_proc_7455
;
5792 pcc
->check_pow
= check_pow_hid0_74xx
;
5793 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5794 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5795 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5797 PPC_CACHE
| PPC_CACHE_ICBI
|
5798 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5799 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5800 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5802 PPC_SEGMENT
| PPC_EXTERN
|
5804 pcc
->msr_mask
= (1ull << MSR_VR
) |
5821 pcc
->mmu_model
= POWERPC_MMU_32B
;
5822 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5823 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5824 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5825 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5826 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5827 POWERPC_FLAG_BUS_CLK
;
5830 static void init_proc_7457(CPUPPCState
*env
)
5832 register_ne_601_sprs(env
);
5833 register_sdr1_sprs(env
);
5834 register_7xx_sprs(env
);
5837 /* 74xx specific SPR */
5838 register_74xx_sprs(env
);
5839 vscr_init(env
, 0x00010000);
5840 /* Level 3 cache control */
5841 register_l3_ctrl(env
);
5843 /* XXX : not implemented */
5844 spr_register(env
, SPR_L3ITCR1
, "L3ITCR1",
5845 SPR_NOACCESS
, SPR_NOACCESS
,
5846 &spr_read_generic
, &spr_write_generic
,
5849 /* XXX : not implemented */
5850 spr_register(env
, SPR_L3ITCR2
, "L3ITCR2",
5851 SPR_NOACCESS
, SPR_NOACCESS
,
5852 &spr_read_generic
, &spr_write_generic
,
5855 /* XXX : not implemented */
5856 spr_register(env
, SPR_L3ITCR3
, "L3ITCR3",
5857 SPR_NOACCESS
, SPR_NOACCESS
,
5858 &spr_read_generic
, &spr_write_generic
,
5861 /* XXX : not implemented */
5862 spr_register(env
, SPR_L3OHCR
, "L3OHCR",
5863 SPR_NOACCESS
, SPR_NOACCESS
,
5864 &spr_read_generic
, &spr_write_generic
,
5867 /* XXX : not implemented */
5868 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
5869 SPR_NOACCESS
, SPR_NOACCESS
,
5870 &spr_read_generic
, &spr_write_generic
,
5873 /* XXX : not implemented */
5874 spr_register(env
, SPR_ICTRL
, "ICTRL",
5875 SPR_NOACCESS
, SPR_NOACCESS
,
5876 &spr_read_generic
, &spr_write_generic
,
5879 /* XXX : not implemented */
5880 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
5881 SPR_NOACCESS
, SPR_NOACCESS
,
5882 &spr_read_generic
, &spr_write_generic
,
5885 /* XXX : not implemented */
5886 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
5887 SPR_NOACCESS
, SPR_NOACCESS
,
5888 &spr_read_generic
, &spr_write_generic
,
5890 /* XXX : not implemented */
5891 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
5892 &spr_read_ureg
, SPR_NOACCESS
,
5893 &spr_read_ureg
, SPR_NOACCESS
,
5895 /* XXX : not implemented */
5896 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
5897 SPR_NOACCESS
, SPR_NOACCESS
,
5898 &spr_read_generic
, &spr_write_generic
,
5900 /* XXX : not implemented */
5901 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
5902 &spr_read_ureg
, SPR_NOACCESS
,
5903 &spr_read_ureg
, SPR_NOACCESS
,
5906 spr_register(env
, SPR_SPRG4
, "SPRG4",
5907 SPR_NOACCESS
, SPR_NOACCESS
,
5908 &spr_read_generic
, &spr_write_generic
,
5910 spr_register(env
, SPR_USPRG4
, "USPRG4",
5911 &spr_read_ureg
, SPR_NOACCESS
,
5912 &spr_read_ureg
, SPR_NOACCESS
,
5914 spr_register(env
, SPR_SPRG5
, "SPRG5",
5915 SPR_NOACCESS
, SPR_NOACCESS
,
5916 &spr_read_generic
, &spr_write_generic
,
5918 spr_register(env
, SPR_USPRG5
, "USPRG5",
5919 &spr_read_ureg
, SPR_NOACCESS
,
5920 &spr_read_ureg
, SPR_NOACCESS
,
5922 spr_register(env
, SPR_SPRG6
, "SPRG6",
5923 SPR_NOACCESS
, SPR_NOACCESS
,
5924 &spr_read_generic
, &spr_write_generic
,
5926 spr_register(env
, SPR_USPRG6
, "USPRG6",
5927 &spr_read_ureg
, SPR_NOACCESS
,
5928 &spr_read_ureg
, SPR_NOACCESS
,
5930 spr_register(env
, SPR_SPRG7
, "SPRG7",
5931 SPR_NOACCESS
, SPR_NOACCESS
,
5932 &spr_read_generic
, &spr_write_generic
,
5934 spr_register(env
, SPR_USPRG7
, "USPRG7",
5935 &spr_read_ureg
, SPR_NOACCESS
,
5936 &spr_read_ureg
, SPR_NOACCESS
,
5938 /* Memory management */
5939 register_low_BATs(env
);
5940 register_high_BATs(env
);
5941 init_excp_7450(env
);
5942 env
->dcache_line_size
= 32;
5943 env
->icache_line_size
= 32;
5944 /* Allocate hardware IRQ controller */
5945 ppc6xx_irq_init(env_archcpu(env
));
5948 POWERPC_FAMILY(7457)(ObjectClass
*oc
, void *data
)
5950 DeviceClass
*dc
= DEVICE_CLASS(oc
);
5951 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
5953 dc
->desc
= "PowerPC 7457 (aka G4)";
5954 pcc
->init_proc
= init_proc_7457
;
5955 pcc
->check_pow
= check_pow_hid0_74xx
;
5956 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
5957 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
5958 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
5960 PPC_CACHE
| PPC_CACHE_ICBI
|
5961 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
5962 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
5963 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
5965 PPC_SEGMENT
| PPC_EXTERN
|
5967 pcc
->msr_mask
= (1ull << MSR_VR
) |
5984 pcc
->mmu_model
= POWERPC_MMU_32B
;
5985 pcc
->excp_model
= POWERPC_EXCP_74xx
;
5986 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
5987 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
5988 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
5989 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
5990 POWERPC_FLAG_BUS_CLK
;
5993 static void init_proc_e600(CPUPPCState
*env
)
5995 register_ne_601_sprs(env
);
5996 register_sdr1_sprs(env
);
5997 register_7xx_sprs(env
);
6000 /* 74xx specific SPR */
6001 register_74xx_sprs(env
);
6002 vscr_init(env
, 0x00010000);
6003 /* XXX : not implemented */
6004 spr_register(env
, SPR_UBAMR
, "UBAMR",
6005 &spr_read_ureg
, SPR_NOACCESS
,
6006 &spr_read_ureg
, SPR_NOACCESS
,
6008 /* XXX : not implemented */
6009 spr_register(env
, SPR_LDSTCR
, "LDSTCR",
6010 SPR_NOACCESS
, SPR_NOACCESS
,
6011 &spr_read_generic
, &spr_write_generic
,
6013 /* XXX : not implemented */
6014 spr_register(env
, SPR_ICTRL
, "ICTRL",
6015 SPR_NOACCESS
, SPR_NOACCESS
,
6016 &spr_read_generic
, &spr_write_generic
,
6018 /* XXX : not implemented */
6019 spr_register(env
, SPR_MSSSR0
, "MSSSR0",
6020 SPR_NOACCESS
, SPR_NOACCESS
,
6021 &spr_read_generic
, &spr_write_generic
,
6023 /* XXX : not implemented */
6024 spr_register(env
, SPR_7XX_PMC5
, "PMC5",
6025 SPR_NOACCESS
, SPR_NOACCESS
,
6026 &spr_read_generic
, &spr_write_generic
,
6028 /* XXX : not implemented */
6029 spr_register(env
, SPR_7XX_UPMC5
, "UPMC5",
6030 &spr_read_ureg
, SPR_NOACCESS
,
6031 &spr_read_ureg
, SPR_NOACCESS
,
6033 /* XXX : not implemented */
6034 spr_register(env
, SPR_7XX_PMC6
, "PMC6",
6035 SPR_NOACCESS
, SPR_NOACCESS
,
6036 &spr_read_generic
, &spr_write_generic
,
6038 /* XXX : not implemented */
6039 spr_register(env
, SPR_7XX_UPMC6
, "UPMC6",
6040 &spr_read_ureg
, SPR_NOACCESS
,
6041 &spr_read_ureg
, SPR_NOACCESS
,
6044 spr_register(env
, SPR_SPRG4
, "SPRG4",
6045 SPR_NOACCESS
, SPR_NOACCESS
,
6046 &spr_read_generic
, &spr_write_generic
,
6048 spr_register(env
, SPR_USPRG4
, "USPRG4",
6049 &spr_read_ureg
, SPR_NOACCESS
,
6050 &spr_read_ureg
, SPR_NOACCESS
,
6052 spr_register(env
, SPR_SPRG5
, "SPRG5",
6053 SPR_NOACCESS
, SPR_NOACCESS
,
6054 &spr_read_generic
, &spr_write_generic
,
6056 spr_register(env
, SPR_USPRG5
, "USPRG5",
6057 &spr_read_ureg
, SPR_NOACCESS
,
6058 &spr_read_ureg
, SPR_NOACCESS
,
6060 spr_register(env
, SPR_SPRG6
, "SPRG6",
6061 SPR_NOACCESS
, SPR_NOACCESS
,
6062 &spr_read_generic
, &spr_write_generic
,
6064 spr_register(env
, SPR_USPRG6
, "USPRG6",
6065 &spr_read_ureg
, SPR_NOACCESS
,
6066 &spr_read_ureg
, SPR_NOACCESS
,
6068 spr_register(env
, SPR_SPRG7
, "SPRG7",
6069 SPR_NOACCESS
, SPR_NOACCESS
,
6070 &spr_read_generic
, &spr_write_generic
,
6072 spr_register(env
, SPR_USPRG7
, "USPRG7",
6073 &spr_read_ureg
, SPR_NOACCESS
,
6074 &spr_read_ureg
, SPR_NOACCESS
,
6076 /* Memory management */
6077 register_low_BATs(env
);
6078 register_high_BATs(env
);
6079 init_excp_7450(env
);
6080 env
->dcache_line_size
= 32;
6081 env
->icache_line_size
= 32;
6082 /* Allocate hardware IRQ controller */
6083 ppc6xx_irq_init(env_archcpu(env
));
6086 POWERPC_FAMILY(e600
)(ObjectClass
*oc
, void *data
)
6088 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6089 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6091 dc
->desc
= "PowerPC e600";
6092 pcc
->init_proc
= init_proc_e600
;
6093 pcc
->check_pow
= check_pow_hid0_74xx
;
6094 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
6095 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6096 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6098 PPC_CACHE
| PPC_CACHE_ICBI
|
6099 PPC_CACHE_DCBA
| PPC_CACHE_DCBZ
|
6100 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6101 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6103 PPC_SEGMENT
| PPC_EXTERN
|
6105 pcc
->insns_flags2
= PPC_NONE
;
6106 pcc
->msr_mask
= (1ull << MSR_VR
) |
6123 pcc
->mmu_model
= POWERPC_MMU_32B
;
6124 pcc
->excp_model
= POWERPC_EXCP_74xx
;
6125 pcc
->bus_model
= PPC_FLAGS_INPUT_6xx
;
6126 pcc
->bfd_mach
= bfd_mach_ppc_7400
;
6127 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6128 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6129 POWERPC_FLAG_BUS_CLK
;
6132 #if defined(TARGET_PPC64)
6133 #if defined(CONFIG_USER_ONLY)
6134 #define POWERPC970_HID5_INIT 0x00000080
6136 #define POWERPC970_HID5_INIT 0x00000000
6139 static int check_pow_970(CPUPPCState
*env
)
6141 if (env
->spr
[SPR_HID0
] & (HID0_DEEPNAP
| HID0_DOZE
| HID0_NAP
)) {
6148 static void register_970_hid_sprs(CPUPPCState
*env
)
6150 /* Hardware implementation registers */
6151 /* XXX : not implemented */
6152 spr_register(env
, SPR_HID0
, "HID0",
6153 SPR_NOACCESS
, SPR_NOACCESS
,
6154 &spr_read_generic
, &spr_write_clear
,
6156 spr_register(env
, SPR_HID1
, "HID1",
6157 SPR_NOACCESS
, SPR_NOACCESS
,
6158 &spr_read_generic
, &spr_write_generic
,
6160 spr_register(env
, SPR_970_HID5
, "HID5",
6161 SPR_NOACCESS
, SPR_NOACCESS
,
6162 &spr_read_generic
, &spr_write_generic
,
6163 POWERPC970_HID5_INIT
);
6166 static void register_970_hior_sprs(CPUPPCState
*env
)
6168 spr_register(env
, SPR_HIOR
, "SPR_HIOR",
6169 SPR_NOACCESS
, SPR_NOACCESS
,
6170 &spr_read_hior
, &spr_write_hior
,
6174 static void register_book3s_ctrl_sprs(CPUPPCState
*env
)
6176 spr_register(env
, SPR_CTRL
, "SPR_CTRL",
6177 SPR_NOACCESS
, SPR_NOACCESS
,
6178 SPR_NOACCESS
, &spr_write_generic
,
6180 spr_register(env
, SPR_UCTRL
, "SPR_UCTRL",
6181 &spr_read_ureg
, SPR_NOACCESS
,
6182 &spr_read_ureg
, SPR_NOACCESS
,
6186 static void register_book3s_altivec_sprs(CPUPPCState
*env
)
6188 if (!(env
->insns_flags
& PPC_ALTIVEC
)) {
6192 spr_register_kvm(env
, SPR_VRSAVE
, "VRSAVE",
6193 &spr_read_generic
, &spr_write_generic
,
6194 &spr_read_generic
, &spr_write_generic
,
6195 KVM_REG_PPC_VRSAVE
, 0x00000000);
6199 static void register_book3s_dbg_sprs(CPUPPCState
*env
)
6202 * TODO: different specs define different scopes for these,
6203 * will have to address this:
6204 * 970: super/write and super/read
6205 * powerisa 2.03..2.04: hypv/write and super/read.
6206 * powerisa 2.05 and newer: hypv/write and hypv/read.
6208 spr_register_kvm(env
, SPR_DABR
, "DABR",
6209 SPR_NOACCESS
, SPR_NOACCESS
,
6210 &spr_read_generic
, &spr_write_generic
,
6211 KVM_REG_PPC_DABR
, 0x00000000);
6212 spr_register_kvm(env
, SPR_DABRX
, "DABRX",
6213 SPR_NOACCESS
, SPR_NOACCESS
,
6214 &spr_read_generic
, &spr_write_generic
,
6215 KVM_REG_PPC_DABRX
, 0x00000000);
6218 static void register_book3s_207_dbg_sprs(CPUPPCState
*env
)
6220 spr_register_kvm_hv(env
, SPR_DAWR0
, "DAWR0",
6221 SPR_NOACCESS
, SPR_NOACCESS
,
6222 SPR_NOACCESS
, SPR_NOACCESS
,
6223 &spr_read_generic
, &spr_write_generic
,
6224 KVM_REG_PPC_DAWR
, 0x00000000);
6225 spr_register_kvm_hv(env
, SPR_DAWRX0
, "DAWRX0",
6226 SPR_NOACCESS
, SPR_NOACCESS
,
6227 SPR_NOACCESS
, SPR_NOACCESS
,
6228 &spr_read_generic
, &spr_write_generic
,
6229 KVM_REG_PPC_DAWRX
, 0x00000000);
6230 spr_register_kvm_hv(env
, SPR_CIABR
, "CIABR",
6231 SPR_NOACCESS
, SPR_NOACCESS
,
6232 SPR_NOACCESS
, SPR_NOACCESS
,
6233 &spr_read_generic
, &spr_write_generic
,
6234 KVM_REG_PPC_CIABR
, 0x00000000);
6237 static void register_970_dbg_sprs(CPUPPCState
*env
)
6240 spr_register(env
, SPR_IABR
, "IABR",
6241 SPR_NOACCESS
, SPR_NOACCESS
,
6242 &spr_read_generic
, &spr_write_generic
,
6246 static void register_book3s_pmu_sup_sprs(CPUPPCState
*env
)
6248 spr_register_kvm(env
, SPR_POWER_MMCR0
, "MMCR0",
6249 SPR_NOACCESS
, SPR_NOACCESS
,
6250 &spr_read_generic
, &spr_write_generic
,
6251 KVM_REG_PPC_MMCR0
, 0x00000000);
6252 spr_register_kvm(env
, SPR_POWER_MMCR1
, "MMCR1",
6253 SPR_NOACCESS
, SPR_NOACCESS
,
6254 &spr_read_generic
, &spr_write_generic
,
6255 KVM_REG_PPC_MMCR1
, 0x00000000);
6256 spr_register_kvm(env
, SPR_POWER_MMCRA
, "MMCRA",
6257 SPR_NOACCESS
, SPR_NOACCESS
,
6258 &spr_read_generic
, &spr_write_generic
,
6259 KVM_REG_PPC_MMCRA
, 0x00000000);
6260 spr_register_kvm(env
, SPR_POWER_PMC1
, "PMC1",
6261 SPR_NOACCESS
, SPR_NOACCESS
,
6262 &spr_read_generic
, &spr_write_generic
,
6263 KVM_REG_PPC_PMC1
, 0x00000000);
6264 spr_register_kvm(env
, SPR_POWER_PMC2
, "PMC2",
6265 SPR_NOACCESS
, SPR_NOACCESS
,
6266 &spr_read_generic
, &spr_write_generic
,
6267 KVM_REG_PPC_PMC2
, 0x00000000);
6268 spr_register_kvm(env
, SPR_POWER_PMC3
, "PMC3",
6269 SPR_NOACCESS
, SPR_NOACCESS
,
6270 &spr_read_generic
, &spr_write_generic
,
6271 KVM_REG_PPC_PMC3
, 0x00000000);
6272 spr_register_kvm(env
, SPR_POWER_PMC4
, "PMC4",
6273 SPR_NOACCESS
, SPR_NOACCESS
,
6274 &spr_read_generic
, &spr_write_generic
,
6275 KVM_REG_PPC_PMC4
, 0x00000000);
6276 spr_register_kvm(env
, SPR_POWER_PMC5
, "PMC5",
6277 SPR_NOACCESS
, SPR_NOACCESS
,
6278 &spr_read_generic
, &spr_write_generic
,
6279 KVM_REG_PPC_PMC5
, 0x00000000);
6280 spr_register_kvm(env
, SPR_POWER_PMC6
, "PMC6",
6281 SPR_NOACCESS
, SPR_NOACCESS
,
6282 &spr_read_generic
, &spr_write_generic
,
6283 KVM_REG_PPC_PMC6
, 0x00000000);
6284 spr_register_kvm(env
, SPR_POWER_SIAR
, "SIAR",
6285 SPR_NOACCESS
, SPR_NOACCESS
,
6286 &spr_read_generic
, &spr_write_generic
,
6287 KVM_REG_PPC_SIAR
, 0x00000000);
6288 spr_register_kvm(env
, SPR_POWER_SDAR
, "SDAR",
6289 SPR_NOACCESS
, SPR_NOACCESS
,
6290 &spr_read_generic
, &spr_write_generic
,
6291 KVM_REG_PPC_SDAR
, 0x00000000);
6294 static void register_book3s_pmu_user_sprs(CPUPPCState
*env
)
6296 spr_register(env
, SPR_POWER_UMMCR0
, "UMMCR0",
6297 &spr_read_MMCR0_ureg
, &spr_write_MMCR0_ureg
,
6298 &spr_read_ureg
, &spr_write_ureg
,
6300 spr_register(env
, SPR_POWER_UMMCR1
, "UMMCR1",
6301 &spr_read_ureg
, SPR_NOACCESS
,
6302 &spr_read_ureg
, &spr_write_ureg
,
6304 spr_register(env
, SPR_POWER_UMMCRA
, "UMMCRA",
6305 &spr_read_ureg
, SPR_NOACCESS
,
6306 &spr_read_ureg
, &spr_write_ureg
,
6308 spr_register(env
, SPR_POWER_UPMC1
, "UPMC1",
6309 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
6310 &spr_read_ureg
, &spr_write_ureg
,
6312 spr_register(env
, SPR_POWER_UPMC2
, "UPMC2",
6313 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
6314 &spr_read_ureg
, &spr_write_ureg
,
6316 spr_register(env
, SPR_POWER_UPMC3
, "UPMC3",
6317 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
6318 &spr_read_ureg
, &spr_write_ureg
,
6320 spr_register(env
, SPR_POWER_UPMC4
, "UPMC4",
6321 &spr_read_PMC14_ureg
, &spr_write_PMC14_ureg
,
6322 &spr_read_ureg
, &spr_write_ureg
,
6324 spr_register(env
, SPR_POWER_UPMC5
, "UPMC5",
6325 &spr_read_PMC56_ureg
, &spr_write_PMC56_ureg
,
6326 &spr_read_ureg
, &spr_write_ureg
,
6328 spr_register(env
, SPR_POWER_UPMC6
, "UPMC6",
6329 &spr_read_PMC56_ureg
, &spr_write_PMC56_ureg
,
6330 &spr_read_ureg
, &spr_write_ureg
,
6332 spr_register(env
, SPR_POWER_USIAR
, "USIAR",
6333 &spr_read_ureg
, SPR_NOACCESS
,
6334 &spr_read_ureg
, &spr_write_ureg
,
6336 spr_register(env
, SPR_POWER_USDAR
, "USDAR",
6337 &spr_read_ureg
, SPR_NOACCESS
,
6338 &spr_read_ureg
, &spr_write_ureg
,
6342 static void register_970_pmu_sup_sprs(CPUPPCState
*env
)
6344 spr_register_kvm(env
, SPR_970_PMC7
, "PMC7",
6345 SPR_NOACCESS
, SPR_NOACCESS
,
6346 &spr_read_generic
, &spr_write_generic
,
6347 KVM_REG_PPC_PMC7
, 0x00000000);
6348 spr_register_kvm(env
, SPR_970_PMC8
, "PMC8",
6349 SPR_NOACCESS
, SPR_NOACCESS
,
6350 &spr_read_generic
, &spr_write_generic
,
6351 KVM_REG_PPC_PMC8
, 0x00000000);
6354 static void register_970_pmu_user_sprs(CPUPPCState
*env
)
6356 spr_register(env
, SPR_970_UPMC7
, "UPMC7",
6357 &spr_read_ureg
, SPR_NOACCESS
,
6358 &spr_read_ureg
, &spr_write_ureg
,
6360 spr_register(env
, SPR_970_UPMC8
, "UPMC8",
6361 &spr_read_ureg
, SPR_NOACCESS
,
6362 &spr_read_ureg
, &spr_write_ureg
,
6366 static void register_power8_pmu_sup_sprs(CPUPPCState
*env
)
6368 spr_register_kvm(env
, SPR_POWER_MMCR2
, "MMCR2",
6369 SPR_NOACCESS
, SPR_NOACCESS
,
6370 &spr_read_generic
, &spr_write_generic
,
6371 KVM_REG_PPC_MMCR2
, 0x00000000);
6372 spr_register_kvm(env
, SPR_POWER_MMCRS
, "MMCRS",
6373 SPR_NOACCESS
, SPR_NOACCESS
,
6374 &spr_read_generic
, &spr_write_generic
,
6375 KVM_REG_PPC_MMCRS
, 0x00000000);
6376 spr_register_kvm(env
, SPR_POWER_SIER
, "SIER",
6377 SPR_NOACCESS
, SPR_NOACCESS
,
6378 &spr_read_generic
, &spr_write_generic
,
6379 KVM_REG_PPC_SIER
, 0x00000000);
6380 spr_register_kvm(env
, SPR_POWER_SPMC1
, "SPMC1",
6381 SPR_NOACCESS
, SPR_NOACCESS
,
6382 &spr_read_generic
, &spr_write_generic
,
6383 KVM_REG_PPC_SPMC1
, 0x00000000);
6384 spr_register_kvm(env
, SPR_POWER_SPMC2
, "SPMC2",
6385 SPR_NOACCESS
, SPR_NOACCESS
,
6386 &spr_read_generic
, &spr_write_generic
,
6387 KVM_REG_PPC_SPMC2
, 0x00000000);
6388 spr_register_kvm(env
, SPR_TACR
, "TACR",
6389 SPR_NOACCESS
, SPR_NOACCESS
,
6390 &spr_read_generic
, &spr_write_generic
,
6391 KVM_REG_PPC_TACR
, 0x00000000);
6392 spr_register_kvm(env
, SPR_TCSCR
, "TCSCR",
6393 SPR_NOACCESS
, SPR_NOACCESS
,
6394 &spr_read_generic
, &spr_write_generic
,
6395 KVM_REG_PPC_TCSCR
, 0x00000000);
6396 spr_register_kvm(env
, SPR_CSIGR
, "CSIGR",
6397 SPR_NOACCESS
, SPR_NOACCESS
,
6398 &spr_read_generic
, &spr_write_generic
,
6399 KVM_REG_PPC_CSIGR
, 0x00000000);
6402 static void register_power8_pmu_user_sprs(CPUPPCState
*env
)
6404 spr_register(env
, SPR_POWER_UMMCR2
, "UMMCR2",
6405 &spr_read_MMCR2_ureg
, &spr_write_MMCR2_ureg
,
6406 &spr_read_ureg
, &spr_write_ureg
,
6408 spr_register(env
, SPR_POWER_USIER
, "USIER",
6409 &spr_read_generic
, SPR_NOACCESS
,
6410 &spr_read_generic
, &spr_write_generic
,
6414 static void register_power5p_ear_sprs(CPUPPCState
*env
)
6416 /* External access control */
6417 spr_register(env
, SPR_EAR
, "EAR",
6418 SPR_NOACCESS
, SPR_NOACCESS
,
6419 &spr_read_generic
, &spr_write_generic
,
6423 static void register_power5p_tb_sprs(CPUPPCState
*env
)
6425 /* TBU40 (High 40 bits of the Timebase register */
6426 spr_register_hv(env
, SPR_TBU40
, "TBU40",
6427 SPR_NOACCESS
, SPR_NOACCESS
,
6428 SPR_NOACCESS
, SPR_NOACCESS
,
6429 SPR_NOACCESS
, &spr_write_tbu40
,
6433 static void register_970_lpar_sprs(CPUPPCState
*env
)
6435 #if !defined(CONFIG_USER_ONLY)
6437 * PPC970: HID4 covers things later controlled by the LPCR and
6438 * RMOR in later CPUs, but with a different encoding. We only
6439 * support the 970 in "Apple mode" which has all hypervisor
6440 * facilities disabled by strapping, so we can basically just
6443 spr_register(env
, SPR_970_HID4
, "HID4",
6444 SPR_NOACCESS
, SPR_NOACCESS
,
6445 &spr_read_generic
, &spr_write_generic
,
6450 static void register_power5p_lpar_sprs(CPUPPCState
*env
)
6452 #if !defined(CONFIG_USER_ONLY)
6453 /* Logical partitionning */
6454 spr_register_kvm_hv(env
, SPR_LPCR
, "LPCR",
6455 SPR_NOACCESS
, SPR_NOACCESS
,
6456 SPR_NOACCESS
, SPR_NOACCESS
,
6457 &spr_read_generic
, &spr_write_lpcr
,
6458 KVM_REG_PPC_LPCR
, LPCR_LPES0
| LPCR_LPES1
);
6459 spr_register_hv(env
, SPR_HDEC
, "HDEC",
6460 SPR_NOACCESS
, SPR_NOACCESS
,
6461 SPR_NOACCESS
, SPR_NOACCESS
,
6462 &spr_read_hdecr
, &spr_write_hdecr
, 0);
6466 static void register_book3s_ids_sprs(CPUPPCState
*env
)
6468 /* FIXME: Will need to deal with thread vs core only SPRs */
6470 /* Processor identification */
6471 spr_register_hv(env
, SPR_PIR
, "PIR",
6472 SPR_NOACCESS
, SPR_NOACCESS
,
6473 &spr_read_generic
, SPR_NOACCESS
,
6474 &spr_read_generic
, NULL
,
6476 spr_register_hv(env
, SPR_HID0
, "HID0",
6477 SPR_NOACCESS
, SPR_NOACCESS
,
6478 SPR_NOACCESS
, SPR_NOACCESS
,
6479 &spr_read_generic
, &spr_write_generic
,
6481 spr_register_hv(env
, SPR_TSCR
, "TSCR",
6482 SPR_NOACCESS
, SPR_NOACCESS
,
6483 SPR_NOACCESS
, SPR_NOACCESS
,
6484 &spr_read_generic
, &spr_write_generic
,
6486 spr_register_hv(env
, SPR_HMER
, "HMER",
6487 SPR_NOACCESS
, SPR_NOACCESS
,
6488 SPR_NOACCESS
, SPR_NOACCESS
,
6489 &spr_read_generic
, &spr_write_hmer
,
6491 spr_register_hv(env
, SPR_HMEER
, "HMEER",
6492 SPR_NOACCESS
, SPR_NOACCESS
,
6493 SPR_NOACCESS
, SPR_NOACCESS
,
6494 &spr_read_generic
, &spr_write_generic
,
6496 spr_register_hv(env
, SPR_TFMR
, "TFMR",
6497 SPR_NOACCESS
, SPR_NOACCESS
,
6498 SPR_NOACCESS
, SPR_NOACCESS
,
6499 &spr_read_generic
, &spr_write_generic
,
6501 spr_register_hv(env
, SPR_LPIDR
, "LPIDR",
6502 SPR_NOACCESS
, SPR_NOACCESS
,
6503 SPR_NOACCESS
, SPR_NOACCESS
,
6504 &spr_read_generic
, &spr_write_lpidr
,
6506 spr_register_hv(env
, SPR_HFSCR
, "HFSCR",
6507 SPR_NOACCESS
, SPR_NOACCESS
,
6508 SPR_NOACCESS
, SPR_NOACCESS
,
6509 &spr_read_generic
, &spr_write_generic
,
6511 spr_register_hv(env
, SPR_MMCRC
, "MMCRC",
6512 SPR_NOACCESS
, SPR_NOACCESS
,
6513 SPR_NOACCESS
, SPR_NOACCESS
,
6514 &spr_read_generic
, &spr_write_generic
,
6516 spr_register_hv(env
, SPR_MMCRH
, "MMCRH",
6517 SPR_NOACCESS
, SPR_NOACCESS
,
6518 SPR_NOACCESS
, SPR_NOACCESS
,
6519 &spr_read_generic
, &spr_write_generic
,
6521 spr_register_hv(env
, SPR_HSPRG0
, "HSPRG0",
6522 SPR_NOACCESS
, SPR_NOACCESS
,
6523 SPR_NOACCESS
, SPR_NOACCESS
,
6524 &spr_read_generic
, &spr_write_generic
,
6526 spr_register_hv(env
, SPR_HSPRG1
, "HSPRG1",
6527 SPR_NOACCESS
, SPR_NOACCESS
,
6528 SPR_NOACCESS
, SPR_NOACCESS
,
6529 &spr_read_generic
, &spr_write_generic
,
6531 spr_register_hv(env
, SPR_HSRR0
, "HSRR0",
6532 SPR_NOACCESS
, SPR_NOACCESS
,
6533 SPR_NOACCESS
, SPR_NOACCESS
,
6534 &spr_read_generic
, &spr_write_generic
,
6536 spr_register_hv(env
, SPR_HSRR1
, "HSRR1",
6537 SPR_NOACCESS
, SPR_NOACCESS
,
6538 SPR_NOACCESS
, SPR_NOACCESS
,
6539 &spr_read_generic
, &spr_write_generic
,
6541 spr_register_hv(env
, SPR_HDAR
, "HDAR",
6542 SPR_NOACCESS
, SPR_NOACCESS
,
6543 SPR_NOACCESS
, SPR_NOACCESS
,
6544 &spr_read_generic
, &spr_write_generic
,
6546 spr_register_hv(env
, SPR_HDSISR
, "HDSISR",
6547 SPR_NOACCESS
, SPR_NOACCESS
,
6548 SPR_NOACCESS
, SPR_NOACCESS
,
6549 &spr_read_generic
, &spr_write_generic
,
6551 spr_register_hv(env
, SPR_HRMOR
, "HRMOR",
6552 SPR_NOACCESS
, SPR_NOACCESS
,
6553 SPR_NOACCESS
, SPR_NOACCESS
,
6554 &spr_read_generic
, &spr_write_generic
,
6558 static void register_rmor_sprs(CPUPPCState
*env
)
6560 spr_register_hv(env
, SPR_RMOR
, "RMOR",
6561 SPR_NOACCESS
, SPR_NOACCESS
,
6562 SPR_NOACCESS
, SPR_NOACCESS
,
6563 &spr_read_generic
, &spr_write_generic
,
6567 static void register_power8_ids_sprs(CPUPPCState
*env
)
6569 /* Thread identification */
6570 spr_register(env
, SPR_TIR
, "TIR",
6571 SPR_NOACCESS
, SPR_NOACCESS
,
6572 &spr_read_generic
, SPR_NOACCESS
,
6576 static void register_book3s_purr_sprs(CPUPPCState
*env
)
6578 #if !defined(CONFIG_USER_ONLY)
6579 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
6580 spr_register_kvm_hv(env
, SPR_PURR
, "PURR",
6581 &spr_read_purr
, SPR_NOACCESS
,
6582 &spr_read_purr
, SPR_NOACCESS
,
6583 &spr_read_purr
, &spr_write_purr
,
6584 KVM_REG_PPC_PURR
, 0x00000000);
6585 spr_register_kvm_hv(env
, SPR_SPURR
, "SPURR",
6586 &spr_read_purr
, SPR_NOACCESS
,
6587 &spr_read_purr
, SPR_NOACCESS
,
6588 &spr_read_purr
, &spr_write_purr
,
6589 KVM_REG_PPC_SPURR
, 0x00000000);
6593 static void register_power6_dbg_sprs(CPUPPCState
*env
)
6595 #if !defined(CONFIG_USER_ONLY)
6596 spr_register(env
, SPR_CFAR
, "SPR_CFAR",
6597 SPR_NOACCESS
, SPR_NOACCESS
,
6598 &spr_read_cfar
, &spr_write_cfar
,
6603 static void register_power5p_common_sprs(CPUPPCState
*env
)
6605 spr_register_kvm(env
, SPR_PPR
, "PPR",
6606 &spr_read_generic
, &spr_write_generic
,
6607 &spr_read_generic
, &spr_write_generic
,
6608 KVM_REG_PPC_PPR
, 0x00000000);
6611 static void register_power6_common_sprs(CPUPPCState
*env
)
6613 #if !defined(CONFIG_USER_ONLY)
6614 spr_register_kvm(env
, SPR_DSCR
, "SPR_DSCR",
6615 SPR_NOACCESS
, SPR_NOACCESS
,
6616 &spr_read_generic
, &spr_write_generic
,
6617 KVM_REG_PPC_DSCR
, 0x00000000);
6620 * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
6621 * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
6623 spr_register_hv(env
, SPR_PCR
, "PCR",
6624 SPR_NOACCESS
, SPR_NOACCESS
,
6625 SPR_NOACCESS
, SPR_NOACCESS
,
6626 &spr_read_generic
, &spr_write_pcr
,
6630 static void register_power8_tce_address_control_sprs(CPUPPCState
*env
)
6632 spr_register_kvm(env
, SPR_TAR
, "TAR",
6633 &spr_read_tar
, &spr_write_tar
,
6634 &spr_read_generic
, &spr_write_generic
,
6635 KVM_REG_PPC_TAR
, 0x00000000);
6638 static void register_power8_tm_sprs(CPUPPCState
*env
)
6640 spr_register_kvm(env
, SPR_TFHAR
, "TFHAR",
6641 &spr_read_tm
, &spr_write_tm
,
6642 &spr_read_tm
, &spr_write_tm
,
6643 KVM_REG_PPC_TFHAR
, 0x00000000);
6644 spr_register_kvm(env
, SPR_TFIAR
, "TFIAR",
6645 &spr_read_tm
, &spr_write_tm
,
6646 &spr_read_tm
, &spr_write_tm
,
6647 KVM_REG_PPC_TFIAR
, 0x00000000);
6648 spr_register_kvm(env
, SPR_TEXASR
, "TEXASR",
6649 &spr_read_tm
, &spr_write_tm
,
6650 &spr_read_tm
, &spr_write_tm
,
6651 KVM_REG_PPC_TEXASR
, 0x00000000);
6652 spr_register(env
, SPR_TEXASRU
, "TEXASRU",
6653 &spr_read_tm_upper32
, &spr_write_tm_upper32
,
6654 &spr_read_tm_upper32
, &spr_write_tm_upper32
,
6658 static void register_power8_ebb_sprs(CPUPPCState
*env
)
6660 spr_register(env
, SPR_BESCRS
, "BESCRS",
6661 &spr_read_ebb
, &spr_write_ebb
,
6662 &spr_read_generic
, &spr_write_generic
,
6664 spr_register(env
, SPR_BESCRSU
, "BESCRSU",
6665 &spr_read_ebb_upper32
, &spr_write_ebb_upper32
,
6666 &spr_read_prev_upper32
, &spr_write_prev_upper32
,
6668 spr_register(env
, SPR_BESCRR
, "BESCRR",
6669 &spr_read_ebb
, &spr_write_ebb
,
6670 &spr_read_generic
, &spr_write_generic
,
6672 spr_register(env
, SPR_BESCRRU
, "BESCRRU",
6673 &spr_read_ebb_upper32
, &spr_write_ebb_upper32
,
6674 &spr_read_prev_upper32
, &spr_write_prev_upper32
,
6676 spr_register_kvm(env
, SPR_EBBHR
, "EBBHR",
6677 &spr_read_ebb
, &spr_write_ebb
,
6678 &spr_read_generic
, &spr_write_generic
,
6679 KVM_REG_PPC_EBBHR
, 0x00000000);
6680 spr_register_kvm(env
, SPR_EBBRR
, "EBBRR",
6681 &spr_read_ebb
, &spr_write_ebb
,
6682 &spr_read_generic
, &spr_write_generic
,
6683 KVM_REG_PPC_EBBRR
, 0x00000000);
6684 spr_register_kvm(env
, SPR_BESCR
, "BESCR",
6685 &spr_read_ebb
, &spr_write_ebb
,
6686 &spr_read_generic
, &spr_write_generic
,
6687 KVM_REG_PPC_BESCR
, 0x00000000);
6690 /* Virtual Time Base */
6691 static void register_vtb_sprs(CPUPPCState
*env
)
6693 spr_register_kvm_hv(env
, SPR_VTB
, "VTB",
6694 SPR_NOACCESS
, SPR_NOACCESS
,
6695 &spr_read_vtb
, SPR_NOACCESS
,
6696 &spr_read_vtb
, &spr_write_vtb
,
6697 KVM_REG_PPC_VTB
, 0x00000000);
6700 static void register_power8_fscr_sprs(CPUPPCState
*env
)
6702 #if defined(CONFIG_USER_ONLY)
6703 target_ulong initval
= 1ULL << FSCR_TAR
;
6705 target_ulong initval
= 0;
6707 spr_register_kvm(env
, SPR_FSCR
, "FSCR",
6708 SPR_NOACCESS
, SPR_NOACCESS
,
6709 &spr_read_generic
, &spr_write_generic
,
6710 KVM_REG_PPC_FSCR
, initval
);
6713 static void register_power8_pspb_sprs(CPUPPCState
*env
)
6715 spr_register_kvm(env
, SPR_PSPB
, "PSPB",
6716 SPR_NOACCESS
, SPR_NOACCESS
,
6717 &spr_read_generic
, &spr_write_generic32
,
6718 KVM_REG_PPC_PSPB
, 0);
6721 static void register_power8_dpdes_sprs(CPUPPCState
*env
)
6723 #if !defined(CONFIG_USER_ONLY)
6724 /* Directed Privileged Door-bell Exception State, used for IPI */
6725 spr_register_kvm_hv(env
, SPR_DPDES
, "DPDES",
6726 SPR_NOACCESS
, SPR_NOACCESS
,
6727 &spr_read_dpdes
, SPR_NOACCESS
,
6728 &spr_read_dpdes
, &spr_write_dpdes
,
6729 KVM_REG_PPC_DPDES
, 0x00000000);
6733 static void register_power8_ic_sprs(CPUPPCState
*env
)
6735 #if !defined(CONFIG_USER_ONLY)
6736 spr_register_hv(env
, SPR_IC
, "IC",
6737 SPR_NOACCESS
, SPR_NOACCESS
,
6738 &spr_read_generic
, SPR_NOACCESS
,
6739 &spr_read_generic
, &spr_write_generic
,
6744 static void register_power8_book4_sprs(CPUPPCState
*env
)
6746 /* Add a number of P8 book4 registers */
6747 #if !defined(CONFIG_USER_ONLY)
6748 spr_register_kvm(env
, SPR_ACOP
, "ACOP",
6749 SPR_NOACCESS
, SPR_NOACCESS
,
6750 &spr_read_generic
, &spr_write_generic
,
6751 KVM_REG_PPC_ACOP
, 0);
6752 spr_register_kvm(env
, SPR_BOOKS_PID
, "PID",
6753 SPR_NOACCESS
, SPR_NOACCESS
,
6754 &spr_read_generic
, &spr_write_pidr
,
6755 KVM_REG_PPC_PID
, 0);
6756 spr_register_kvm(env
, SPR_WORT
, "WORT",
6757 SPR_NOACCESS
, SPR_NOACCESS
,
6758 &spr_read_generic
, &spr_write_generic
,
6759 KVM_REG_PPC_WORT
, 0);
6763 static void register_power7_book4_sprs(CPUPPCState
*env
)
6765 /* Add a number of P7 book4 registers */
6766 #if !defined(CONFIG_USER_ONLY)
6767 spr_register_kvm(env
, SPR_ACOP
, "ACOP",
6768 SPR_NOACCESS
, SPR_NOACCESS
,
6769 &spr_read_generic
, &spr_write_generic
,
6770 KVM_REG_PPC_ACOP
, 0);
6771 spr_register_kvm(env
, SPR_BOOKS_PID
, "PID",
6772 SPR_NOACCESS
, SPR_NOACCESS
,
6773 &spr_read_generic
, &spr_write_generic
,
6774 KVM_REG_PPC_PID
, 0);
6778 static void register_power8_rpr_sprs(CPUPPCState
*env
)
6780 #if !defined(CONFIG_USER_ONLY)
6781 spr_register_hv(env
, SPR_RPR
, "RPR",
6782 SPR_NOACCESS
, SPR_NOACCESS
,
6783 SPR_NOACCESS
, SPR_NOACCESS
,
6784 &spr_read_generic
, &spr_write_generic
,
6785 0x00000103070F1F3F);
6789 static void register_power9_mmu_sprs(CPUPPCState
*env
)
6791 #if !defined(CONFIG_USER_ONLY)
6792 /* Partition Table Control */
6793 spr_register_kvm_hv(env
, SPR_PTCR
, "PTCR",
6794 SPR_NOACCESS
, SPR_NOACCESS
,
6795 SPR_NOACCESS
, SPR_NOACCESS
,
6796 &spr_read_generic
, &spr_write_ptcr
,
6797 KVM_REG_PPC_PTCR
, 0x00000000);
6798 /* Address Segment Descriptor Register */
6799 spr_register_hv(env
, SPR_ASDR
, "ASDR",
6800 SPR_NOACCESS
, SPR_NOACCESS
,
6801 SPR_NOACCESS
, SPR_NOACCESS
,
6802 &spr_read_generic
, &spr_write_generic
,
6803 0x0000000000000000);
6807 static void init_proc_book3s_common(CPUPPCState
*env
)
6809 register_ne_601_sprs(env
);
6811 register_usprg3_sprs(env
);
6812 register_book3s_altivec_sprs(env
);
6813 register_book3s_pmu_sup_sprs(env
);
6814 register_book3s_pmu_user_sprs(env
);
6815 register_book3s_ctrl_sprs(env
);
6817 * Can't find information on what this should be on reset. This
6818 * value is the one used by 74xx processors.
6820 vscr_init(env
, 0x00010000);
6823 static void init_proc_970(CPUPPCState
*env
)
6825 /* Common Registers */
6826 init_proc_book3s_common(env
);
6827 register_sdr1_sprs(env
);
6828 register_book3s_dbg_sprs(env
);
6830 /* 970 Specific Registers */
6831 register_970_hid_sprs(env
);
6832 register_970_hior_sprs(env
);
6833 register_low_BATs(env
);
6834 register_970_pmu_sup_sprs(env
);
6835 register_970_pmu_user_sprs(env
);
6836 register_970_lpar_sprs(env
);
6837 register_970_dbg_sprs(env
);
6840 env
->dcache_line_size
= 128;
6841 env
->icache_line_size
= 128;
6843 /* Allocate hardware IRQ controller */
6845 ppc970_irq_init(env_archcpu(env
));
6848 POWERPC_FAMILY(970)(ObjectClass
*oc
, void *data
)
6850 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6851 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6853 dc
->desc
= "PowerPC 970";
6854 pcc
->init_proc
= init_proc_970
;
6855 pcc
->check_pow
= check_pow_970
;
6856 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
6857 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6858 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6860 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6861 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6862 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6863 PPC_64B
| PPC_ALTIVEC
|
6864 PPC_SEGMENT_64B
| PPC_SLBI
;
6865 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
6866 pcc
->msr_mask
= (1ull << MSR_SF
) |
6881 pcc
->mmu_model
= POWERPC_MMU_64B
;
6882 #if defined(CONFIG_SOFTMMU)
6883 pcc
->hash64_opts
= &ppc_hash64_opts_basic
;
6885 pcc
->excp_model
= POWERPC_EXCP_970
;
6886 pcc
->bus_model
= PPC_FLAGS_INPUT_970
;
6887 pcc
->bfd_mach
= bfd_mach_ppc64
;
6888 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6889 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6890 POWERPC_FLAG_BUS_CLK
;
6891 pcc
->l1_dcache_size
= 0x8000;
6892 pcc
->l1_icache_size
= 0x10000;
6895 static void init_proc_power5plus(CPUPPCState
*env
)
6897 /* Common Registers */
6898 init_proc_book3s_common(env
);
6899 register_sdr1_sprs(env
);
6900 register_book3s_dbg_sprs(env
);
6902 /* POWER5+ Specific Registers */
6903 register_970_hid_sprs(env
);
6904 register_970_hior_sprs(env
);
6905 register_low_BATs(env
);
6906 register_970_pmu_sup_sprs(env
);
6907 register_970_pmu_user_sprs(env
);
6908 register_power5p_common_sprs(env
);
6909 register_power5p_lpar_sprs(env
);
6910 register_power5p_ear_sprs(env
);
6911 register_power5p_tb_sprs(env
);
6914 env
->dcache_line_size
= 128;
6915 env
->icache_line_size
= 128;
6917 /* Allocate hardware IRQ controller */
6919 ppc970_irq_init(env_archcpu(env
));
6922 POWERPC_FAMILY(POWER5P
)(ObjectClass
*oc
, void *data
)
6924 DeviceClass
*dc
= DEVICE_CLASS(oc
);
6925 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
6927 dc
->fw_name
= "PowerPC,POWER5";
6928 dc
->desc
= "POWER5+";
6929 pcc
->init_proc
= init_proc_power5plus
;
6930 pcc
->check_pow
= check_pow_970
;
6931 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_STRING
| PPC_MFTB
|
6932 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
6933 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
6935 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
6936 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
6937 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
6939 PPC_SEGMENT_64B
| PPC_SLBI
;
6940 pcc
->insns_flags2
= PPC2_FP_CVT_S64
;
6941 pcc
->msr_mask
= (1ull << MSR_SF
) |
6956 pcc
->lpcr_mask
= LPCR_RMLS
| LPCR_ILE
| LPCR_LPES0
| LPCR_LPES1
|
6957 LPCR_RMI
| LPCR_HDICE
;
6958 pcc
->mmu_model
= POWERPC_MMU_2_03
;
6959 #if defined(CONFIG_SOFTMMU)
6960 pcc
->hash64_opts
= &ppc_hash64_opts_basic
;
6961 pcc
->lrg_decr_bits
= 32;
6963 pcc
->excp_model
= POWERPC_EXCP_970
;
6964 pcc
->bus_model
= PPC_FLAGS_INPUT_970
;
6965 pcc
->bfd_mach
= bfd_mach_ppc64
;
6966 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
6967 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
6968 POWERPC_FLAG_BUS_CLK
;
6969 pcc
->l1_dcache_size
= 0x8000;
6970 pcc
->l1_icache_size
= 0x10000;
6973 static void init_proc_POWER7(CPUPPCState
*env
)
6975 /* Common Registers */
6976 init_proc_book3s_common(env
);
6977 register_sdr1_sprs(env
);
6978 register_book3s_dbg_sprs(env
);
6980 /* POWER7 Specific Registers */
6981 register_book3s_ids_sprs(env
);
6982 register_rmor_sprs(env
);
6983 register_amr_sprs(env
);
6984 register_book3s_purr_sprs(env
);
6985 register_power5p_common_sprs(env
);
6986 register_power5p_lpar_sprs(env
);
6987 register_power5p_ear_sprs(env
);
6988 register_power5p_tb_sprs(env
);
6989 register_power6_common_sprs(env
);
6990 register_power6_dbg_sprs(env
);
6991 register_power7_book4_sprs(env
);
6994 env
->dcache_line_size
= 128;
6995 env
->icache_line_size
= 128;
6997 /* Allocate hardware IRQ controller */
6998 init_excp_POWER7(env
);
6999 ppcPOWER7_irq_init(env_archcpu(env
));
7002 static bool ppc_pvr_match_power7(PowerPCCPUClass
*pcc
, uint32_t pvr
)
7004 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER7P_BASE
) {
7007 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER7_BASE
) {
7013 static bool cpu_has_work_POWER7(CPUState
*cs
)
7015 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7016 CPUPPCState
*env
= &cpu
->env
;
7019 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
7022 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
7023 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE0
)) {
7026 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
7027 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE1
)) {
7030 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
)) &&
7031 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE2
)) {
7034 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HMI
)) &&
7035 (env
->spr
[SPR_LPCR
] & LPCR_P7_PECE2
)) {
7038 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
7043 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
7047 POWERPC_FAMILY(POWER7
)(ObjectClass
*oc
, void *data
)
7049 DeviceClass
*dc
= DEVICE_CLASS(oc
);
7050 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7051 CPUClass
*cc
= CPU_CLASS(oc
);
7053 dc
->fw_name
= "PowerPC,POWER7";
7054 dc
->desc
= "POWER7";
7055 pcc
->pvr_match
= ppc_pvr_match_power7
;
7056 pcc
->pcr_mask
= PCR_VEC_DIS
| PCR_VSX_DIS
| PCR_COMPAT_2_05
;
7057 pcc
->pcr_supported
= PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
7058 pcc
->init_proc
= init_proc_POWER7
;
7059 pcc
->check_pow
= check_pow_nocheck
;
7060 cc
->has_work
= cpu_has_work_POWER7
;
7061 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
7062 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
7063 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
7064 PPC_FLOAT_FRSQRTES
|
7067 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
7068 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
7069 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
7070 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
7071 PPC_SEGMENT_64B
| PPC_SLBI
|
7072 PPC_POPCNTB
| PPC_POPCNTWD
|
7074 pcc
->insns_flags2
= PPC2_VSX
| PPC2_DFP
| PPC2_DBRX
| PPC2_ISA205
|
7075 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
7076 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
7077 PPC2_FP_TST_ISA206
| PPC2_FP_CVT_S64
|
7079 pcc
->msr_mask
= (1ull << MSR_SF
) |
7095 pcc
->lpcr_mask
= LPCR_VPM0
| LPCR_VPM1
| LPCR_ISL
| LPCR_DPFD
|
7096 LPCR_VRMASD
| LPCR_RMLS
| LPCR_ILE
|
7097 LPCR_P7_PECE0
| LPCR_P7_PECE1
| LPCR_P7_PECE2
|
7098 LPCR_MER
| LPCR_TC
|
7099 LPCR_LPES0
| LPCR_LPES1
| LPCR_HDICE
;
7100 pcc
->lpcr_pm
= LPCR_P7_PECE0
| LPCR_P7_PECE1
| LPCR_P7_PECE2
;
7101 pcc
->mmu_model
= POWERPC_MMU_2_06
;
7102 #if defined(CONFIG_SOFTMMU)
7103 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
7104 pcc
->lrg_decr_bits
= 32;
7106 pcc
->excp_model
= POWERPC_EXCP_POWER7
;
7107 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER7
;
7108 pcc
->bfd_mach
= bfd_mach_ppc64
;
7109 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
7110 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
7111 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
7113 pcc
->l1_dcache_size
= 0x8000;
7114 pcc
->l1_icache_size
= 0x8000;
7117 static void init_proc_POWER8(CPUPPCState
*env
)
7119 /* Common Registers */
7120 init_proc_book3s_common(env
);
7121 register_sdr1_sprs(env
);
7122 register_book3s_207_dbg_sprs(env
);
7124 /* POWER8 Specific Registers */
7125 register_book3s_ids_sprs(env
);
7126 register_rmor_sprs(env
);
7127 register_amr_sprs(env
);
7128 register_iamr_sprs(env
);
7129 register_book3s_purr_sprs(env
);
7130 register_power5p_common_sprs(env
);
7131 register_power5p_lpar_sprs(env
);
7132 register_power5p_ear_sprs(env
);
7133 register_power5p_tb_sprs(env
);
7134 register_power6_common_sprs(env
);
7135 register_power6_dbg_sprs(env
);
7136 register_power8_tce_address_control_sprs(env
);
7137 register_power8_ids_sprs(env
);
7138 register_power8_ebb_sprs(env
);
7139 register_power8_fscr_sprs(env
);
7140 register_power8_pmu_sup_sprs(env
);
7141 register_power8_pmu_user_sprs(env
);
7142 register_power8_tm_sprs(env
);
7143 register_power8_pspb_sprs(env
);
7144 register_power8_dpdes_sprs(env
);
7145 register_vtb_sprs(env
);
7146 register_power8_ic_sprs(env
);
7147 register_power8_book4_sprs(env
);
7148 register_power8_rpr_sprs(env
);
7151 env
->dcache_line_size
= 128;
7152 env
->icache_line_size
= 128;
7154 /* Allocate hardware IRQ controller */
7155 init_excp_POWER8(env
);
7156 ppcPOWER7_irq_init(env_archcpu(env
));
7159 static bool ppc_pvr_match_power8(PowerPCCPUClass
*pcc
, uint32_t pvr
)
7161 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8NVL_BASE
) {
7164 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8E_BASE
) {
7167 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER8_BASE
) {
7173 static bool cpu_has_work_POWER8(CPUState
*cs
)
7175 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7176 CPUPPCState
*env
= &cpu
->env
;
7179 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
7182 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
7183 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE2
)) {
7186 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
7187 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE3
)) {
7190 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
)) &&
7191 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE4
)) {
7194 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HMI
)) &&
7195 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE4
)) {
7198 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
7199 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE0
)) {
7202 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
7203 (env
->spr
[SPR_LPCR
] & LPCR_P8_PECE1
)) {
7206 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
7211 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
7215 POWERPC_FAMILY(POWER8
)(ObjectClass
*oc
, void *data
)
7217 DeviceClass
*dc
= DEVICE_CLASS(oc
);
7218 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7219 CPUClass
*cc
= CPU_CLASS(oc
);
7221 dc
->fw_name
= "PowerPC,POWER8";
7222 dc
->desc
= "POWER8";
7223 pcc
->pvr_match
= ppc_pvr_match_power8
;
7224 pcc
->pcr_mask
= PCR_TM_DIS
| PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
7225 pcc
->pcr_supported
= PCR_COMPAT_2_07
| PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
7226 pcc
->init_proc
= init_proc_POWER8
;
7227 pcc
->check_pow
= check_pow_nocheck
;
7228 cc
->has_work
= cpu_has_work_POWER8
;
7229 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
7230 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
7231 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
7232 PPC_FLOAT_FRSQRTES
|
7235 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
7236 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
7237 PPC_MEM_TLBIE
| PPC_MEM_TLBSYNC
|
7238 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
7239 PPC_SEGMENT_64B
| PPC_SLBI
|
7240 PPC_POPCNTB
| PPC_POPCNTWD
|
7242 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
7243 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
7244 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
7245 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
7246 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
7247 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
7248 PPC2_TM
| PPC2_PM_ISA206
;
7249 pcc
->msr_mask
= (1ull << MSR_SF
) |
7269 pcc
->lpcr_mask
= LPCR_VPM0
| LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
|
7270 LPCR_DPFD
| LPCR_VRMASD
| LPCR_RMLS
| LPCR_ILE
|
7271 LPCR_AIL
| LPCR_ONL
| LPCR_P8_PECE0
| LPCR_P8_PECE1
|
7272 LPCR_P8_PECE2
| LPCR_P8_PECE3
| LPCR_P8_PECE4
|
7273 LPCR_MER
| LPCR_TC
| LPCR_LPES0
| LPCR_HDICE
;
7274 pcc
->lpcr_pm
= LPCR_P8_PECE0
| LPCR_P8_PECE1
| LPCR_P8_PECE2
|
7275 LPCR_P8_PECE3
| LPCR_P8_PECE4
;
7276 pcc
->mmu_model
= POWERPC_MMU_2_07
;
7277 #if defined(CONFIG_SOFTMMU)
7278 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
7279 pcc
->lrg_decr_bits
= 32;
7280 pcc
->n_host_threads
= 8;
7282 pcc
->excp_model
= POWERPC_EXCP_POWER8
;
7283 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER7
;
7284 pcc
->bfd_mach
= bfd_mach_ppc64
;
7285 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
7286 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
7287 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
7288 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
;
7289 pcc
->l1_dcache_size
= 0x8000;
7290 pcc
->l1_icache_size
= 0x8000;
7293 #ifdef CONFIG_SOFTMMU
7295 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
7296 * Encoded as array of int_32s in the form:
7297 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
7299 * y -> radix mode supported page size (encoded as a shift)
7301 static struct ppc_radix_page_info POWER9_radix_page_info
= {
7304 0x0000000c, /* 4K - enc: 0x0 */
7305 0xa0000010, /* 64K - enc: 0x5 */
7306 0x20000015, /* 2M - enc: 0x1 */
7307 0x4000001e /* 1G - enc: 0x2 */
7310 #endif /* CONFIG_SOFTMMU */
7312 static void init_proc_POWER9(CPUPPCState
*env
)
7314 /* Common Registers */
7315 init_proc_book3s_common(env
);
7316 register_book3s_207_dbg_sprs(env
);
7318 /* POWER8 Specific Registers */
7319 register_book3s_ids_sprs(env
);
7320 register_amr_sprs(env
);
7321 register_iamr_sprs(env
);
7322 register_book3s_purr_sprs(env
);
7323 register_power5p_common_sprs(env
);
7324 register_power5p_lpar_sprs(env
);
7325 register_power5p_ear_sprs(env
);
7326 register_power5p_tb_sprs(env
);
7327 register_power6_common_sprs(env
);
7328 register_power6_dbg_sprs(env
);
7329 register_power8_tce_address_control_sprs(env
);
7330 register_power8_ids_sprs(env
);
7331 register_power8_ebb_sprs(env
);
7332 register_power8_fscr_sprs(env
);
7333 register_power8_pmu_sup_sprs(env
);
7334 register_power8_pmu_user_sprs(env
);
7335 register_power8_tm_sprs(env
);
7336 register_power8_pspb_sprs(env
);
7337 register_power8_dpdes_sprs(env
);
7338 register_vtb_sprs(env
);
7339 register_power8_ic_sprs(env
);
7340 register_power8_book4_sprs(env
);
7341 register_power8_rpr_sprs(env
);
7342 register_power9_mmu_sprs(env
);
7344 /* POWER9 Specific registers */
7345 spr_register_kvm(env
, SPR_TIDR
, "TIDR", NULL
, NULL
,
7346 spr_read_generic
, spr_write_generic
,
7347 KVM_REG_PPC_TIDR
, 0);
7349 /* FIXME: Filter fields properly based on privilege level */
7350 spr_register_kvm_hv(env
, SPR_PSSCR
, "PSSCR", NULL
, NULL
, NULL
, NULL
,
7351 spr_read_generic
, spr_write_generic
,
7352 KVM_REG_PPC_PSSCR
, 0);
7355 env
->dcache_line_size
= 128;
7356 env
->icache_line_size
= 128;
7358 /* Allocate hardware IRQ controller */
7359 init_excp_POWER9(env
);
7360 ppcPOWER9_irq_init(env_archcpu(env
));
7363 static bool ppc_pvr_match_power9(PowerPCCPUClass
*pcc
, uint32_t pvr
)
7365 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER9_BASE
) {
7371 static bool cpu_has_work_POWER9(CPUState
*cs
)
7373 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7374 CPUPPCState
*env
= &cpu
->env
;
7377 uint64_t psscr
= env
->spr
[SPR_PSSCR
];
7379 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
7383 /* If EC is clear, just return true on any pending interrupt */
7384 if (!(psscr
& PSSCR_EC
)) {
7387 /* External Exception */
7388 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
7389 (env
->spr
[SPR_LPCR
] & LPCR_EEE
)) {
7390 bool heic
= !!(env
->spr
[SPR_LPCR
] & LPCR_HEIC
);
7391 if (heic
== 0 || !msr_hv
|| msr_pr
) {
7395 /* Decrementer Exception */
7396 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
7397 (env
->spr
[SPR_LPCR
] & LPCR_DEE
)) {
7400 /* Machine Check or Hypervisor Maintenance Exception */
7401 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
|
7402 1u << PPC_INTERRUPT_HMI
)) && (env
->spr
[SPR_LPCR
] & LPCR_OEE
)) {
7405 /* Privileged Doorbell Exception */
7406 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
7407 (env
->spr
[SPR_LPCR
] & LPCR_PDEE
)) {
7410 /* Hypervisor Doorbell Exception */
7411 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
7412 (env
->spr
[SPR_LPCR
] & LPCR_HDEE
)) {
7415 /* Hypervisor virtualization exception */
7416 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HVIRT
)) &&
7417 (env
->spr
[SPR_LPCR
] & LPCR_HVEE
)) {
7420 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
7425 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
7429 POWERPC_FAMILY(POWER9
)(ObjectClass
*oc
, void *data
)
7431 DeviceClass
*dc
= DEVICE_CLASS(oc
);
7432 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7433 CPUClass
*cc
= CPU_CLASS(oc
);
7435 dc
->fw_name
= "PowerPC,POWER9";
7436 dc
->desc
= "POWER9";
7437 pcc
->pvr_match
= ppc_pvr_match_power9
;
7438 pcc
->pcr_mask
= PCR_COMPAT_2_05
| PCR_COMPAT_2_06
| PCR_COMPAT_2_07
;
7439 pcc
->pcr_supported
= PCR_COMPAT_3_00
| PCR_COMPAT_2_07
| PCR_COMPAT_2_06
|
7441 pcc
->init_proc
= init_proc_POWER9
;
7442 pcc
->check_pow
= check_pow_nocheck
;
7443 cc
->has_work
= cpu_has_work_POWER9
;
7444 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
7445 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
7446 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
7447 PPC_FLOAT_FRSQRTES
|
7450 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
7451 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
7453 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
7454 PPC_SEGMENT_64B
| PPC_SLBI
|
7455 PPC_POPCNTB
| PPC_POPCNTWD
|
7457 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
7458 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
7459 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
7460 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
7461 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
7462 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
7463 PPC2_TM
| PPC2_ISA300
| PPC2_PRCNTL
;
7464 pcc
->msr_mask
= (1ull << MSR_SF
) |
7482 pcc
->lpcr_mask
= LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
| LPCR_DPFD
|
7483 (LPCR_PECE_U_MASK
& LPCR_HVEE
) | LPCR_ILE
| LPCR_AIL
|
7484 LPCR_UPRT
| LPCR_EVIRT
| LPCR_ONL
| LPCR_HR
| LPCR_LD
|
7485 (LPCR_PECE_L_MASK
& (LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
|
7486 LPCR_DEE
| LPCR_OEE
))
7487 | LPCR_MER
| LPCR_GTSE
| LPCR_TC
|
7488 LPCR_HEIC
| LPCR_LPES0
| LPCR_HVICE
| LPCR_HDICE
;
7489 pcc
->lpcr_pm
= LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
| LPCR_DEE
| LPCR_OEE
;
7490 pcc
->mmu_model
= POWERPC_MMU_3_00
;
7491 #if defined(CONFIG_SOFTMMU)
7492 /* segment page size remain the same */
7493 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
7494 pcc
->radix_page_info
= &POWER9_radix_page_info
;
7495 pcc
->lrg_decr_bits
= 56;
7496 pcc
->n_host_threads
= 4;
7498 pcc
->excp_model
= POWERPC_EXCP_POWER9
;
7499 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER9
;
7500 pcc
->bfd_mach
= bfd_mach_ppc64
;
7501 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
7502 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
7503 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
7504 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
| POWERPC_FLAG_SCV
;
7505 pcc
->l1_dcache_size
= 0x8000;
7506 pcc
->l1_icache_size
= 0x8000;
7509 #ifdef CONFIG_SOFTMMU
7511 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
7512 * Encoded as array of int_32s in the form:
7513 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
7515 * y -> radix mode supported page size (encoded as a shift)
7517 static struct ppc_radix_page_info POWER10_radix_page_info
= {
7520 0x0000000c, /* 4K - enc: 0x0 */
7521 0xa0000010, /* 64K - enc: 0x5 */
7522 0x20000015, /* 2M - enc: 0x1 */
7523 0x4000001e /* 1G - enc: 0x2 */
7526 #endif /* CONFIG_SOFTMMU */
7528 static void init_proc_POWER10(CPUPPCState
*env
)
7530 /* Common Registers */
7531 init_proc_book3s_common(env
);
7532 register_book3s_207_dbg_sprs(env
);
7534 /* POWER8 Specific Registers */
7535 register_book3s_ids_sprs(env
);
7536 register_amr_sprs(env
);
7537 register_iamr_sprs(env
);
7538 register_book3s_purr_sprs(env
);
7539 register_power5p_common_sprs(env
);
7540 register_power5p_lpar_sprs(env
);
7541 register_power5p_ear_sprs(env
);
7542 register_power6_common_sprs(env
);
7543 register_power6_dbg_sprs(env
);
7544 register_power8_tce_address_control_sprs(env
);
7545 register_power8_ids_sprs(env
);
7546 register_power8_ebb_sprs(env
);
7547 register_power8_fscr_sprs(env
);
7548 register_power8_pmu_sup_sprs(env
);
7549 register_power8_pmu_user_sprs(env
);
7550 register_power8_tm_sprs(env
);
7551 register_power8_pspb_sprs(env
);
7552 register_vtb_sprs(env
);
7553 register_power8_ic_sprs(env
);
7554 register_power8_book4_sprs(env
);
7555 register_power8_rpr_sprs(env
);
7556 register_power9_mmu_sprs(env
);
7558 /* FIXME: Filter fields properly based on privilege level */
7559 spr_register_kvm_hv(env
, SPR_PSSCR
, "PSSCR", NULL
, NULL
, NULL
, NULL
,
7560 spr_read_generic
, spr_write_generic
,
7561 KVM_REG_PPC_PSSCR
, 0);
7564 env
->dcache_line_size
= 128;
7565 env
->icache_line_size
= 128;
7567 /* Allocate hardware IRQ controller */
7568 init_excp_POWER10(env
);
7569 ppcPOWER9_irq_init(env_archcpu(env
));
7572 static bool ppc_pvr_match_power10(PowerPCCPUClass
*pcc
, uint32_t pvr
)
7574 if ((pvr
& CPU_POWERPC_POWER_SERVER_MASK
) == CPU_POWERPC_POWER10_BASE
) {
7580 static bool cpu_has_work_POWER10(CPUState
*cs
)
7582 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
7583 CPUPPCState
*env
= &cpu
->env
;
7586 uint64_t psscr
= env
->spr
[SPR_PSSCR
];
7588 if (!(cs
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
7592 /* If EC is clear, just return true on any pending interrupt */
7593 if (!(psscr
& PSSCR_EC
)) {
7596 /* External Exception */
7597 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_EXT
)) &&
7598 (env
->spr
[SPR_LPCR
] & LPCR_EEE
)) {
7599 bool heic
= !!(env
->spr
[SPR_LPCR
] & LPCR_HEIC
);
7600 if (heic
== 0 || !msr_hv
|| msr_pr
) {
7604 /* Decrementer Exception */
7605 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DECR
)) &&
7606 (env
->spr
[SPR_LPCR
] & LPCR_DEE
)) {
7609 /* Machine Check or Hypervisor Maintenance Exception */
7610 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_MCK
|
7611 1u << PPC_INTERRUPT_HMI
)) && (env
->spr
[SPR_LPCR
] & LPCR_OEE
)) {
7614 /* Privileged Doorbell Exception */
7615 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_DOORBELL
)) &&
7616 (env
->spr
[SPR_LPCR
] & LPCR_PDEE
)) {
7619 /* Hypervisor Doorbell Exception */
7620 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HDOORBELL
)) &&
7621 (env
->spr
[SPR_LPCR
] & LPCR_HDEE
)) {
7624 /* Hypervisor virtualization exception */
7625 if ((env
->pending_interrupts
& (1u << PPC_INTERRUPT_HVIRT
)) &&
7626 (env
->spr
[SPR_LPCR
] & LPCR_HVEE
)) {
7629 if (env
->pending_interrupts
& (1u << PPC_INTERRUPT_RESET
)) {
7634 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
7638 POWERPC_FAMILY(POWER10
)(ObjectClass
*oc
, void *data
)
7640 DeviceClass
*dc
= DEVICE_CLASS(oc
);
7641 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
7642 CPUClass
*cc
= CPU_CLASS(oc
);
7644 dc
->fw_name
= "PowerPC,POWER10";
7645 dc
->desc
= "POWER10";
7646 pcc
->pvr_match
= ppc_pvr_match_power10
;
7647 pcc
->pcr_mask
= PCR_COMPAT_2_05
| PCR_COMPAT_2_06
| PCR_COMPAT_2_07
|
7649 pcc
->pcr_supported
= PCR_COMPAT_3_10
| PCR_COMPAT_3_00
| PCR_COMPAT_2_07
|
7650 PCR_COMPAT_2_06
| PCR_COMPAT_2_05
;
7651 pcc
->init_proc
= init_proc_POWER10
;
7652 pcc
->check_pow
= check_pow_nocheck
;
7653 cc
->has_work
= cpu_has_work_POWER10
;
7654 pcc
->insns_flags
= PPC_INSNS_BASE
| PPC_ISEL
| PPC_STRING
| PPC_MFTB
|
7655 PPC_FLOAT
| PPC_FLOAT_FSEL
| PPC_FLOAT_FRES
|
7656 PPC_FLOAT_FSQRT
| PPC_FLOAT_FRSQRTE
|
7657 PPC_FLOAT_FRSQRTES
|
7660 PPC_CACHE
| PPC_CACHE_ICBI
| PPC_CACHE_DCBZ
|
7661 PPC_MEM_SYNC
| PPC_MEM_EIEIO
|
7663 PPC_64B
| PPC_64H
| PPC_64BX
| PPC_ALTIVEC
|
7664 PPC_SEGMENT_64B
| PPC_SLBI
|
7665 PPC_POPCNTB
| PPC_POPCNTWD
|
7667 pcc
->insns_flags2
= PPC2_VSX
| PPC2_VSX207
| PPC2_DFP
| PPC2_DBRX
|
7668 PPC2_PERM_ISA206
| PPC2_DIVE_ISA206
|
7669 PPC2_ATOMIC_ISA206
| PPC2_FP_CVT_ISA206
|
7670 PPC2_FP_TST_ISA206
| PPC2_BCTAR_ISA207
|
7671 PPC2_LSQ_ISA207
| PPC2_ALTIVEC_207
|
7672 PPC2_ISA205
| PPC2_ISA207S
| PPC2_FP_CVT_S64
|
7673 PPC2_TM
| PPC2_ISA300
| PPC2_PRCNTL
| PPC2_ISA310
;
7674 pcc
->msr_mask
= (1ull << MSR_SF
) |
7692 pcc
->lpcr_mask
= LPCR_VPM1
| LPCR_ISL
| LPCR_KBV
| LPCR_DPFD
|
7693 (LPCR_PECE_U_MASK
& LPCR_HVEE
) | LPCR_ILE
| LPCR_AIL
|
7694 LPCR_UPRT
| LPCR_EVIRT
| LPCR_ONL
| LPCR_HR
| LPCR_LD
|
7695 (LPCR_PECE_L_MASK
& (LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
|
7696 LPCR_DEE
| LPCR_OEE
))
7697 | LPCR_MER
| LPCR_GTSE
| LPCR_TC
|
7698 LPCR_HEIC
| LPCR_LPES0
| LPCR_HVICE
| LPCR_HDICE
;
7699 /* DD2 adds an extra HAIL bit */
7700 pcc
->lpcr_mask
|= LPCR_HAIL
;
7702 pcc
->lpcr_pm
= LPCR_PDEE
| LPCR_HDEE
| LPCR_EEE
| LPCR_DEE
| LPCR_OEE
;
7703 pcc
->mmu_model
= POWERPC_MMU_3_00
;
7704 #if defined(CONFIG_SOFTMMU)
7705 /* segment page size remain the same */
7706 pcc
->hash64_opts
= &ppc_hash64_opts_POWER7
;
7707 pcc
->radix_page_info
= &POWER10_radix_page_info
;
7708 pcc
->lrg_decr_bits
= 56;
7710 pcc
->excp_model
= POWERPC_EXCP_POWER10
;
7711 pcc
->bus_model
= PPC_FLAGS_INPUT_POWER9
;
7712 pcc
->bfd_mach
= bfd_mach_ppc64
;
7713 pcc
->flags
= POWERPC_FLAG_VRE
| POWERPC_FLAG_SE
|
7714 POWERPC_FLAG_BE
| POWERPC_FLAG_PMM
|
7715 POWERPC_FLAG_BUS_CLK
| POWERPC_FLAG_CFAR
|
7716 POWERPC_FLAG_VSX
| POWERPC_FLAG_TM
| POWERPC_FLAG_SCV
;
7717 pcc
->l1_dcache_size
= 0x8000;
7718 pcc
->l1_icache_size
= 0x8000;
7721 #if !defined(CONFIG_USER_ONLY)
7722 void cpu_ppc_set_vhyp(PowerPCCPU
*cpu
, PPCVirtualHypervisor
*vhyp
)
7724 CPUPPCState
*env
= &cpu
->env
;
7729 * With a virtual hypervisor mode we never allow the CPU to go
7730 * hypervisor mode itself
7732 env
->msr_mask
&= ~MSR_HVB
;
7735 #endif /* !defined(CONFIG_USER_ONLY) */
7737 #endif /* defined(TARGET_PPC64) */
7739 /*****************************************************************************/
7740 /* Generic CPU instantiation routine */
7741 static void init_ppc_proc(PowerPCCPU
*cpu
)
7743 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7744 CPUPPCState
*env
= &cpu
->env
;
7745 #if !defined(CONFIG_USER_ONLY)
7748 env
->irq_inputs
= NULL
;
7749 /* Set all exception vectors to an invalid address */
7750 for (i
= 0; i
< POWERPC_EXCP_NB
; i
++) {
7751 env
->excp_vectors
[i
] = (target_ulong
)(-1ULL);
7753 env
->ivor_mask
= 0x00000000;
7754 env
->ivpr_mask
= 0x00000000;
7755 /* Default MMU definitions */
7759 env
->tlb_type
= TLB_NONE
;
7761 /* Register SPR common to all PowerPC implementations */
7762 register_generic_sprs(env
);
7763 spr_register(env
, SPR_PVR
, "PVR",
7764 /* Linux permits userspace to read PVR */
7765 #if defined(CONFIG_LINUX_USER)
7771 &spr_read_generic
, SPR_NOACCESS
,
7773 /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
7774 if (pcc
->svr
!= POWERPC_SVR_NONE
) {
7775 if (pcc
->svr
& POWERPC_SVR_E500
) {
7776 spr_register(env
, SPR_E500_SVR
, "SVR",
7777 SPR_NOACCESS
, SPR_NOACCESS
,
7778 &spr_read_generic
, SPR_NOACCESS
,
7779 pcc
->svr
& ~POWERPC_SVR_E500
);
7781 spr_register(env
, SPR_SVR
, "SVR",
7782 SPR_NOACCESS
, SPR_NOACCESS
,
7783 &spr_read_generic
, SPR_NOACCESS
,
7787 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
7788 (*pcc
->init_proc
)(env
);
7790 #if !defined(CONFIG_USER_ONLY)
7791 ppc_gdb_gen_spr_xml(cpu
);
7794 /* MSR bits & flags consistency checks */
7795 if (env
->msr_mask
& (1 << 25)) {
7796 switch (env
->flags
& (POWERPC_FLAG_SPE
| POWERPC_FLAG_VRE
)) {
7797 case POWERPC_FLAG_SPE
:
7798 case POWERPC_FLAG_VRE
:
7801 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7802 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
7805 } else if (env
->flags
& (POWERPC_FLAG_SPE
| POWERPC_FLAG_VRE
)) {
7806 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7807 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
7810 if (env
->msr_mask
& (1 << 17)) {
7811 switch (env
->flags
& (POWERPC_FLAG_TGPR
| POWERPC_FLAG_CE
)) {
7812 case POWERPC_FLAG_TGPR
:
7813 case POWERPC_FLAG_CE
:
7816 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7817 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
7820 } else if (env
->flags
& (POWERPC_FLAG_TGPR
| POWERPC_FLAG_CE
)) {
7821 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7822 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
7825 if (env
->msr_mask
& (1 << 10)) {
7826 switch (env
->flags
& (POWERPC_FLAG_SE
| POWERPC_FLAG_DWE
|
7827 POWERPC_FLAG_UBLE
)) {
7828 case POWERPC_FLAG_SE
:
7829 case POWERPC_FLAG_DWE
:
7830 case POWERPC_FLAG_UBLE
:
7833 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7834 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
7835 "POWERPC_FLAG_UBLE\n");
7838 } else if (env
->flags
& (POWERPC_FLAG_SE
| POWERPC_FLAG_DWE
|
7839 POWERPC_FLAG_UBLE
)) {
7840 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7841 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
7842 "POWERPC_FLAG_UBLE\n");
7845 if (env
->msr_mask
& (1 << 9)) {
7846 switch (env
->flags
& (POWERPC_FLAG_BE
| POWERPC_FLAG_DE
)) {
7847 case POWERPC_FLAG_BE
:
7848 case POWERPC_FLAG_DE
:
7851 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7852 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
7855 } else if (env
->flags
& (POWERPC_FLAG_BE
| POWERPC_FLAG_DE
)) {
7856 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7857 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
7860 if (env
->msr_mask
& (1 << 2)) {
7861 switch (env
->flags
& (POWERPC_FLAG_PX
| POWERPC_FLAG_PMM
)) {
7862 case POWERPC_FLAG_PX
:
7863 case POWERPC_FLAG_PMM
:
7866 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7867 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
7870 } else if (env
->flags
& (POWERPC_FLAG_PX
| POWERPC_FLAG_PMM
)) {
7871 fprintf(stderr
, "PowerPC MSR definition inconsistency\n"
7872 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
7875 if ((env
->flags
& (POWERPC_FLAG_RTC_CLK
| POWERPC_FLAG_BUS_CLK
)) == 0) {
7876 fprintf(stderr
, "PowerPC flags inconsistency\n"
7877 "Should define the time-base and decrementer clock source\n");
7880 /* Allocate TLBs buffer when needed */
7881 #if !defined(CONFIG_USER_ONLY)
7882 if (env
->nb_tlb
!= 0) {
7883 int nb_tlb
= env
->nb_tlb
;
7884 if (env
->id_tlbs
!= 0) {
7887 switch (env
->tlb_type
) {
7889 env
->tlb
.tlb6
= g_new0(ppc6xx_tlb_t
, nb_tlb
);
7892 env
->tlb
.tlbe
= g_new0(ppcemb_tlb_t
, nb_tlb
);
7895 env
->tlb
.tlbm
= g_new0(ppcmas_tlb_t
, nb_tlb
);
7898 /* Pre-compute some useful values */
7899 env
->tlb_per_way
= env
->nb_tlb
/ env
->nb_ways
;
7901 if (env
->irq_inputs
== NULL
) {
7902 warn_report("no internal IRQ controller registered."
7903 " Attempt QEMU to crash very soon !");
7906 if (env
->check_pow
== NULL
) {
7907 warn_report("no power management check handler registered."
7908 " Attempt QEMU to crash very soon !");
7913 static void ppc_cpu_realize(DeviceState
*dev
, Error
**errp
)
7915 CPUState
*cs
= CPU(dev
);
7916 PowerPCCPU
*cpu
= POWERPC_CPU(dev
);
7917 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7918 Error
*local_err
= NULL
;
7920 cpu_exec_realizefn(cs
, &local_err
);
7921 if (local_err
!= NULL
) {
7922 error_propagate(errp
, local_err
);
7925 if (cpu
->vcpu_id
== UNASSIGNED_CPU_INDEX
) {
7926 cpu
->vcpu_id
= cs
->cpu_index
;
7929 if (tcg_enabled()) {
7930 if (ppc_fixup_cpu(cpu
) != 0) {
7931 error_setg(errp
, "Unable to emulate selected CPU with TCG");
7936 create_ppc_opcodes(cpu
, &local_err
);
7937 if (local_err
!= NULL
) {
7938 error_propagate(errp
, local_err
);
7943 ppc_gdb_init(cs
, pcc
);
7946 pcc
->parent_realize(dev
, errp
);
7951 cpu_exec_unrealizefn(cs
);
7954 static void ppc_cpu_unrealize(DeviceState
*dev
)
7956 PowerPCCPU
*cpu
= POWERPC_CPU(dev
);
7957 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
7959 pcc
->parent_unrealize(dev
);
7961 cpu_remove_sync(CPU(cpu
));
7963 destroy_ppc_opcodes(cpu
);
7966 static gint
ppc_cpu_compare_class_pvr(gconstpointer a
, gconstpointer b
)
7968 ObjectClass
*oc
= (ObjectClass
*)a
;
7969 uint32_t pvr
= *(uint32_t *)b
;
7970 PowerPCCPUClass
*pcc
= (PowerPCCPUClass
*)a
;
7972 /* -cpu host does a PVR lookup during construction */
7973 if (unlikely(strcmp(object_class_get_name(oc
),
7974 TYPE_HOST_POWERPC_CPU
) == 0)) {
7978 return pcc
->pvr
== pvr
? 0 : -1;
7981 PowerPCCPUClass
*ppc_cpu_class_by_pvr(uint32_t pvr
)
7983 GSList
*list
, *item
;
7984 PowerPCCPUClass
*pcc
= NULL
;
7986 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
7987 item
= g_slist_find_custom(list
, &pvr
, ppc_cpu_compare_class_pvr
);
7989 pcc
= POWERPC_CPU_CLASS(item
->data
);
7996 static gint
ppc_cpu_compare_class_pvr_mask(gconstpointer a
, gconstpointer b
)
7998 ObjectClass
*oc
= (ObjectClass
*)a
;
7999 uint32_t pvr
= *(uint32_t *)b
;
8000 PowerPCCPUClass
*pcc
= (PowerPCCPUClass
*)a
;
8002 /* -cpu host does a PVR lookup during construction */
8003 if (unlikely(strcmp(object_class_get_name(oc
),
8004 TYPE_HOST_POWERPC_CPU
) == 0)) {
8008 if (pcc
->pvr_match(pcc
, pvr
)) {
8015 PowerPCCPUClass
*ppc_cpu_class_by_pvr_mask(uint32_t pvr
)
8017 GSList
*list
, *item
;
8018 PowerPCCPUClass
*pcc
= NULL
;
8020 list
= object_class_get_list(TYPE_POWERPC_CPU
, true);
8021 item
= g_slist_find_custom(list
, &pvr
, ppc_cpu_compare_class_pvr_mask
);
8023 pcc
= POWERPC_CPU_CLASS(item
->data
);
8030 static const char *ppc_cpu_lookup_alias(const char *alias
)
8034 for (ai
= 0; ppc_cpu_aliases
[ai
].alias
!= NULL
; ai
++) {
8035 if (strcmp(ppc_cpu_aliases
[ai
].alias
, alias
) == 0) {
8036 return ppc_cpu_aliases
[ai
].model
;
8043 static ObjectClass
*ppc_cpu_class_by_name(const char *name
)
8045 char *cpu_model
, *typename
;
8051 * Lookup by PVR if cpu_model is valid 8 digit hex number (excl:
8052 * 0x prefix if present)
8054 if (!qemu_strtoul(name
, &p
, 16, &pvr
)) {
8056 len
= (len
== 10) && (name
[1] == 'x') ? len
- 2 : len
;
8057 if ((len
== 8) && (*p
== '\0')) {
8058 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr
));
8062 cpu_model
= g_ascii_strdown(name
, -1);
8063 p
= ppc_cpu_lookup_alias(cpu_model
);
8066 cpu_model
= g_strdup(p
);
8069 typename
= g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX
, cpu_model
);
8070 oc
= object_class_by_name(typename
);
8077 PowerPCCPUClass
*ppc_cpu_get_family_class(PowerPCCPUClass
*pcc
)
8079 ObjectClass
*oc
= OBJECT_CLASS(pcc
);
8081 while (oc
&& !object_class_is_abstract(oc
)) {
8082 oc
= object_class_get_parent(oc
);
8086 return POWERPC_CPU_CLASS(oc
);
8089 /* Sort by PVR, ordering special case "host" last. */
8090 static gint
ppc_cpu_list_compare(gconstpointer a
, gconstpointer b
)
8092 ObjectClass
*oc_a
= (ObjectClass
*)a
;
8093 ObjectClass
*oc_b
= (ObjectClass
*)b
;
8094 PowerPCCPUClass
*pcc_a
= POWERPC_CPU_CLASS(oc_a
);
8095 PowerPCCPUClass
*pcc_b
= POWERPC_CPU_CLASS(oc_b
);
8096 const char *name_a
= object_class_get_name(oc_a
);
8097 const char *name_b
= object_class_get_name(oc_b
);
8099 if (strcmp(name_a
, TYPE_HOST_POWERPC_CPU
) == 0) {
8101 } else if (strcmp(name_b
, TYPE_HOST_POWERPC_CPU
) == 0) {
8104 /* Avoid an integer overflow during subtraction */
8105 if (pcc_a
->pvr
< pcc_b
->pvr
) {
8107 } else if (pcc_a
->pvr
> pcc_b
->pvr
) {
8115 static void ppc_cpu_list_entry(gpointer data
, gpointer user_data
)
8117 ObjectClass
*oc
= data
;
8118 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
8119 DeviceClass
*family
= DEVICE_CLASS(ppc_cpu_get_family_class(pcc
));
8120 const char *typename
= object_class_get_name(oc
);
8124 if (unlikely(strcmp(typename
, TYPE_HOST_POWERPC_CPU
) == 0)) {
8128 name
= g_strndup(typename
,
8129 strlen(typename
) - strlen(POWERPC_CPU_TYPE_SUFFIX
));
8130 qemu_printf("PowerPC %-16s PVR %08x\n", name
, pcc
->pvr
);
8131 for (i
= 0; ppc_cpu_aliases
[i
].alias
!= NULL
; i
++) {
8132 PowerPCCPUAlias
*alias
= &ppc_cpu_aliases
[i
];
8133 ObjectClass
*alias_oc
= ppc_cpu_class_by_name(alias
->model
);
8135 if (alias_oc
!= oc
) {
8139 * If running with KVM, we might update the family alias later, so
8140 * avoid printing the wrong alias here and use "preferred" instead
8142 if (strcmp(alias
->alias
, family
->desc
) == 0) {
8143 qemu_printf("PowerPC %-16s (alias for preferred %s CPU)\n",
8144 alias
->alias
, family
->desc
);
8146 qemu_printf("PowerPC %-16s (alias for %s)\n",
8147 alias
->alias
, name
);
8153 void ppc_cpu_list(void)
8157 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
8158 list
= g_slist_sort(list
, ppc_cpu_list_compare
);
8159 g_slist_foreach(list
, ppc_cpu_list_entry
, NULL
);
8164 qemu_printf("PowerPC %s\n", "host");
8168 static void ppc_cpu_defs_entry(gpointer data
, gpointer user_data
)
8170 ObjectClass
*oc
= data
;
8171 CpuDefinitionInfoList
**first
= user_data
;
8172 const char *typename
;
8173 CpuDefinitionInfo
*info
;
8175 typename
= object_class_get_name(oc
);
8176 info
= g_malloc0(sizeof(*info
));
8177 info
->name
= g_strndup(typename
,
8178 strlen(typename
) - strlen(POWERPC_CPU_TYPE_SUFFIX
));
8180 QAPI_LIST_PREPEND(*first
, info
);
8183 CpuDefinitionInfoList
*qmp_query_cpu_definitions(Error
**errp
)
8185 CpuDefinitionInfoList
*cpu_list
= NULL
;
8189 list
= object_class_get_list(TYPE_POWERPC_CPU
, false);
8190 g_slist_foreach(list
, ppc_cpu_defs_entry
, &cpu_list
);
8193 for (i
= 0; ppc_cpu_aliases
[i
].alias
!= NULL
; i
++) {
8194 PowerPCCPUAlias
*alias
= &ppc_cpu_aliases
[i
];
8196 CpuDefinitionInfo
*info
;
8198 oc
= ppc_cpu_class_by_name(alias
->model
);
8203 info
= g_malloc0(sizeof(*info
));
8204 info
->name
= g_strdup(alias
->alias
);
8205 info
->q_typename
= g_strdup(object_class_get_name(oc
));
8207 QAPI_LIST_PREPEND(cpu_list
, info
);
8213 static void ppc_cpu_set_pc(CPUState
*cs
, vaddr value
)
8215 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
8217 cpu
->env
.nip
= value
;
8220 static bool ppc_cpu_has_work(CPUState
*cs
)
8222 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
8223 CPUPPCState
*env
= &cpu
->env
;
8225 return msr_ee
&& (cs
->interrupt_request
& CPU_INTERRUPT_HARD
);
8228 static void ppc_cpu_reset(DeviceState
*dev
)
8230 CPUState
*s
= CPU(dev
);
8231 PowerPCCPU
*cpu
= POWERPC_CPU(s
);
8232 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
8233 CPUPPCState
*env
= &cpu
->env
;
8237 pcc
->parent_reset(dev
);
8239 msr
= (target_ulong
)0;
8240 msr
|= (target_ulong
)MSR_HVB
;
8241 msr
|= (target_ulong
)0 << MSR_AP
; /* TO BE CHECKED */
8242 msr
|= (target_ulong
)0 << MSR_SA
; /* TO BE CHECKED */
8243 msr
|= (target_ulong
)1 << MSR_EP
;
8244 #if defined(DO_SINGLE_STEP) && 0
8245 /* Single step trace mode */
8246 msr
|= (target_ulong
)1 << MSR_SE
;
8247 msr
|= (target_ulong
)1 << MSR_BE
;
8249 #if defined(CONFIG_USER_ONLY)
8250 msr
|= (target_ulong
)1 << MSR_FP
; /* Allow floating point usage */
8251 msr
|= (target_ulong
)1 << MSR_FE0
; /* Allow floating point exceptions */
8252 msr
|= (target_ulong
)1 << MSR_FE1
;
8253 msr
|= (target_ulong
)1 << MSR_VR
; /* Allow altivec usage */
8254 msr
|= (target_ulong
)1 << MSR_VSX
; /* Allow VSX usage */
8255 msr
|= (target_ulong
)1 << MSR_SPE
; /* Allow SPE usage */
8256 msr
|= (target_ulong
)1 << MSR_PR
;
8257 #if defined(TARGET_PPC64)
8258 msr
|= (target_ulong
)1 << MSR_TM
; /* Transactional memory */
8260 #if !defined(TARGET_WORDS_BIGENDIAN)
8261 msr
|= (target_ulong
)1 << MSR_LE
; /* Little-endian user mode */
8262 if (!((env
->msr_mask
>> MSR_LE
) & 1)) {
8263 fprintf(stderr
, "Selected CPU does not support little-endian.\n");
8269 #if defined(TARGET_PPC64)
8270 if (mmu_is_64bit(env
->mmu_model
)) {
8271 msr
|= (1ULL << MSR_SF
);
8275 hreg_store_msr(env
, msr
, 1);
8277 #if !defined(CONFIG_USER_ONLY)
8278 env
->nip
= env
->hreset_vector
| env
->excp_prefix
;
8279 #if defined(CONFIG_TCG)
8280 if (env
->mmu_model
!= POWERPC_MMU_REAL
) {
8281 ppc_tlb_invalidate_all(env
);
8283 #endif /* CONFIG_TCG */
8286 hreg_compute_hflags(env
);
8287 env
->reserve_addr
= (target_ulong
)-1ULL;
8288 /* Be sure no exception or interrupt is pending */
8289 env
->pending_interrupts
= 0;
8290 s
->exception_index
= POWERPC_EXCP_NONE
;
8291 env
->error_code
= 0;
8294 /* tininess for underflow is detected before rounding */
8295 set_float_detect_tininess(float_tininess_before_rounding
,
8298 for (i
= 0; i
< ARRAY_SIZE(env
->spr_cb
); i
++) {
8299 ppc_spr_t
*spr
= &env
->spr_cb
[i
];
8304 env
->spr
[i
] = spr
->default_value
;
8308 #ifndef CONFIG_USER_ONLY
8310 static bool ppc_cpu_is_big_endian(CPUState
*cs
)
8312 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
8313 CPUPPCState
*env
= &cpu
->env
;
8315 cpu_synchronize_state(cs
);
8321 static void ppc_cpu_exec_enter(CPUState
*cs
)
8323 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
8326 PPCVirtualHypervisorClass
*vhc
=
8327 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu
->vhyp
);
8328 vhc
->cpu_exec_enter(cpu
->vhyp
, cpu
);
8332 static void ppc_cpu_exec_exit(CPUState
*cs
)
8334 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
8337 PPCVirtualHypervisorClass
*vhc
=
8338 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu
->vhyp
);
8339 vhc
->cpu_exec_exit(cpu
->vhyp
, cpu
);
8342 #endif /* CONFIG_TCG */
8344 #endif /* !CONFIG_USER_ONLY */
8346 static void ppc_cpu_instance_init(Object
*obj
)
8348 PowerPCCPU
*cpu
= POWERPC_CPU(obj
);
8349 PowerPCCPUClass
*pcc
= POWERPC_CPU_GET_CLASS(cpu
);
8350 CPUPPCState
*env
= &cpu
->env
;
8352 cpu_set_cpustate_pointers(cpu
);
8353 cpu
->vcpu_id
= UNASSIGNED_CPU_INDEX
;
8355 env
->msr_mask
= pcc
->msr_mask
;
8356 env
->mmu_model
= pcc
->mmu_model
;
8357 env
->excp_model
= pcc
->excp_model
;
8358 env
->bus_model
= pcc
->bus_model
;
8359 env
->insns_flags
= pcc
->insns_flags
;
8360 env
->insns_flags2
= pcc
->insns_flags2
;
8361 env
->flags
= pcc
->flags
;
8362 env
->bfd_mach
= pcc
->bfd_mach
;
8363 env
->check_pow
= pcc
->check_pow
;
8366 * Mark HV mode as supported if the CPU has an MSR_HV bit in the
8367 * msr_mask. The mask can later be cleared by PAPR mode but the hv
8368 * mode support will remain, thus enforcing that we cannot use
8369 * priv. instructions in guest in PAPR mode. For 970 we currently
8370 * simply don't set HV in msr_mask thus simulating an "Apple mode"
8371 * 970. If we ever want to support 970 HV mode, we'll have to add
8372 * a processor attribute of some sort.
8374 #if !defined(CONFIG_USER_ONLY)
8375 env
->has_hv_mode
= !!(env
->msr_mask
& MSR_HVB
);
8378 ppc_hash64_init(cpu
);
8381 static void ppc_cpu_instance_finalize(Object
*obj
)
8383 PowerPCCPU
*cpu
= POWERPC_CPU(obj
);
8385 ppc_hash64_finalize(cpu
);
8388 static bool ppc_pvr_match_default(PowerPCCPUClass
*pcc
, uint32_t pvr
)
8390 return pcc
->pvr
== pvr
;
8393 static void ppc_disas_set_info(CPUState
*cs
, disassemble_info
*info
)
8395 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
8396 CPUPPCState
*env
= &cpu
->env
;
8398 if ((env
->hflags
>> MSR_LE
) & 1) {
8399 info
->endian
= BFD_ENDIAN_LITTLE
;
8401 info
->mach
= env
->bfd_mach
;
8402 if (!env
->bfd_mach
) {
8404 info
->mach
= bfd_mach_ppc64
;
8406 info
->mach
= bfd_mach_ppc
;
8409 info
->disassembler_options
= (char *)"any";
8410 info
->print_insn
= print_insn_ppc
;
8412 info
->cap_arch
= CS_ARCH_PPC
;
8414 info
->cap_mode
= CS_MODE_64
;
8418 static Property ppc_cpu_properties
[] = {
8419 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU
, pre_2_8_migration
, false),
8420 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU
, pre_2_10_migration
,
8422 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU
, pre_3_0_migration
,
8424 DEFINE_PROP_END_OF_LIST(),
8427 #ifndef CONFIG_USER_ONLY
8428 #include "hw/core/sysemu-cpu-ops.h"
8430 static const struct SysemuCPUOps ppc_sysemu_ops
= {
8431 .get_phys_page_debug
= ppc_cpu_get_phys_page_debug
,
8432 .write_elf32_note
= ppc32_cpu_write_elf32_note
,
8433 .write_elf64_note
= ppc64_cpu_write_elf64_note
,
8434 .virtio_is_big_endian
= ppc_cpu_is_big_endian
,
8435 .legacy_vmsd
= &vmstate_ppc_cpu
,
8440 #include "hw/core/tcg-cpu-ops.h"
8442 static const struct TCGCPUOps ppc_tcg_ops
= {
8443 .initialize
= ppc_translate_init
,
8445 #ifdef CONFIG_USER_ONLY
8446 .record_sigsegv
= ppc_cpu_record_sigsegv
,
8448 .tlb_fill
= ppc_cpu_tlb_fill
,
8449 .cpu_exec_interrupt
= ppc_cpu_exec_interrupt
,
8450 .do_interrupt
= ppc_cpu_do_interrupt
,
8451 .cpu_exec_enter
= ppc_cpu_exec_enter
,
8452 .cpu_exec_exit
= ppc_cpu_exec_exit
,
8453 .do_unaligned_access
= ppc_cpu_do_unaligned_access
,
8454 #endif /* !CONFIG_USER_ONLY */
8456 #endif /* CONFIG_TCG */
8458 static void ppc_cpu_class_init(ObjectClass
*oc
, void *data
)
8460 PowerPCCPUClass
*pcc
= POWERPC_CPU_CLASS(oc
);
8461 CPUClass
*cc
= CPU_CLASS(oc
);
8462 DeviceClass
*dc
= DEVICE_CLASS(oc
);
8464 device_class_set_parent_realize(dc
, ppc_cpu_realize
,
8465 &pcc
->parent_realize
);
8466 device_class_set_parent_unrealize(dc
, ppc_cpu_unrealize
,
8467 &pcc
->parent_unrealize
);
8468 pcc
->pvr_match
= ppc_pvr_match_default
;
8469 device_class_set_props(dc
, ppc_cpu_properties
);
8471 device_class_set_parent_reset(dc
, ppc_cpu_reset
, &pcc
->parent_reset
);
8473 cc
->class_by_name
= ppc_cpu_class_by_name
;
8474 cc
->has_work
= ppc_cpu_has_work
;
8475 cc
->dump_state
= ppc_cpu_dump_state
;
8476 cc
->set_pc
= ppc_cpu_set_pc
;
8477 cc
->gdb_read_register
= ppc_cpu_gdb_read_register
;
8478 cc
->gdb_write_register
= ppc_cpu_gdb_write_register
;
8479 #ifndef CONFIG_USER_ONLY
8480 cc
->sysemu_ops
= &ppc_sysemu_ops
;
8483 cc
->gdb_num_core_regs
= 71;
8484 #ifndef CONFIG_USER_ONLY
8485 cc
->gdb_get_dynamic_xml
= ppc_gdb_get_dynamic_xml
;
8487 #ifdef USE_APPLE_GDB
8488 cc
->gdb_read_register
= ppc_cpu_gdb_read_register_apple
;
8489 cc
->gdb_write_register
= ppc_cpu_gdb_write_register_apple
;
8490 cc
->gdb_num_core_regs
= 71 + 32;
8493 cc
->gdb_arch_name
= ppc_gdb_arch_name
;
8494 #if defined(TARGET_PPC64)
8495 cc
->gdb_core_xml_file
= "power64-core.xml";
8497 cc
->gdb_core_xml_file
= "power-core.xml";
8499 cc
->disas_set_info
= ppc_disas_set_info
;
8501 dc
->fw_name
= "PowerPC,UNKNOWN";
8504 cc
->tcg_ops
= &ppc_tcg_ops
;
8505 #endif /* CONFIG_TCG */
8508 static const TypeInfo ppc_cpu_type_info
= {
8509 .name
= TYPE_POWERPC_CPU
,
8511 .instance_size
= sizeof(PowerPCCPU
),
8512 .instance_align
= __alignof__(PowerPCCPU
),
8513 .instance_init
= ppc_cpu_instance_init
,
8514 .instance_finalize
= ppc_cpu_instance_finalize
,
8516 .class_size
= sizeof(PowerPCCPUClass
),
8517 .class_init
= ppc_cpu_class_init
,
8520 #ifndef CONFIG_USER_ONLY
8521 static const TypeInfo ppc_vhyp_type_info
= {
8522 .name
= TYPE_PPC_VIRTUAL_HYPERVISOR
,
8523 .parent
= TYPE_INTERFACE
,
8524 .class_size
= sizeof(PPCVirtualHypervisorClass
),
8528 static void ppc_cpu_register_types(void)
8530 type_register_static(&ppc_cpu_type_info
);
8531 #ifndef CONFIG_USER_ONLY
8532 type_register_static(&ppc_vhyp_type_info
);
8536 void ppc_cpu_dump_state(CPUState
*cs
, FILE *f
, int flags
)
8541 PowerPCCPU
*cpu
= POWERPC_CPU(cs
);
8542 CPUPPCState
*env
= &cpu
->env
;
8545 qemu_fprintf(f
, "NIP " TARGET_FMT_lx
" LR " TARGET_FMT_lx
" CTR "
8546 TARGET_FMT_lx
" XER " TARGET_FMT_lx
" CPU#%d\n",
8547 env
->nip
, env
->lr
, env
->ctr
, cpu_read_xer(env
),
8549 qemu_fprintf(f
, "MSR " TARGET_FMT_lx
" HID0 " TARGET_FMT_lx
" HF "
8550 "%08x iidx %d didx %d\n",
8551 env
->msr
, env
->spr
[SPR_HID0
], env
->hflags
,
8552 cpu_mmu_index(env
, true), cpu_mmu_index(env
, false));
8553 #if !defined(NO_TIMER_DUMP)
8554 qemu_fprintf(f
, "TB %08" PRIu32
" %08" PRIu64
8555 #if !defined(CONFIG_USER_ONLY)
8556 " DECR " TARGET_FMT_lu
8559 cpu_ppc_load_tbu(env
), cpu_ppc_load_tbl(env
)
8560 #if !defined(CONFIG_USER_ONLY)
8561 , cpu_ppc_load_decr(env
)
8565 for (i
= 0; i
< 32; i
++) {
8566 if ((i
& (RGPL
- 1)) == 0) {
8567 qemu_fprintf(f
, "GPR%02d", i
);
8569 qemu_fprintf(f
, " %016" PRIx64
, ppc_dump_gpr(env
, i
));
8570 if ((i
& (RGPL
- 1)) == (RGPL
- 1)) {
8571 qemu_fprintf(f
, "\n");
8574 qemu_fprintf(f
, "CR ");
8575 for (i
= 0; i
< 8; i
++)
8576 qemu_fprintf(f
, "%01x", env
->crf
[i
]);
8577 qemu_fprintf(f
, " [");
8578 for (i
= 0; i
< 8; i
++) {
8580 if (env
->crf
[i
] & 0x08) {
8582 } else if (env
->crf
[i
] & 0x04) {
8584 } else if (env
->crf
[i
] & 0x02) {
8587 qemu_fprintf(f
, " %c%c", a
, env
->crf
[i
] & 0x01 ? 'O' : ' ');
8589 qemu_fprintf(f
, " ] RES " TARGET_FMT_lx
"\n",
8592 if (flags
& CPU_DUMP_FPU
) {
8593 for (i
= 0; i
< 32; i
++) {
8594 if ((i
& (RFPL
- 1)) == 0) {
8595 qemu_fprintf(f
, "FPR%02d", i
);
8597 qemu_fprintf(f
, " %016" PRIx64
, *cpu_fpr_ptr(env
, i
));
8598 if ((i
& (RFPL
- 1)) == (RFPL
- 1)) {
8599 qemu_fprintf(f
, "\n");
8602 qemu_fprintf(f
, "FPSCR " TARGET_FMT_lx
"\n", env
->fpscr
);
8605 #if !defined(CONFIG_USER_ONLY)
8606 qemu_fprintf(f
, " SRR0 " TARGET_FMT_lx
" SRR1 " TARGET_FMT_lx
8607 " PVR " TARGET_FMT_lx
" VRSAVE " TARGET_FMT_lx
"\n",
8608 env
->spr
[SPR_SRR0
], env
->spr
[SPR_SRR1
],
8609 env
->spr
[SPR_PVR
], env
->spr
[SPR_VRSAVE
]);
8611 qemu_fprintf(f
, "SPRG0 " TARGET_FMT_lx
" SPRG1 " TARGET_FMT_lx
8612 " SPRG2 " TARGET_FMT_lx
" SPRG3 " TARGET_FMT_lx
"\n",
8613 env
->spr
[SPR_SPRG0
], env
->spr
[SPR_SPRG1
],
8614 env
->spr
[SPR_SPRG2
], env
->spr
[SPR_SPRG3
]);
8616 qemu_fprintf(f
, "SPRG4 " TARGET_FMT_lx
" SPRG5 " TARGET_FMT_lx
8617 " SPRG6 " TARGET_FMT_lx
" SPRG7 " TARGET_FMT_lx
"\n",
8618 env
->spr
[SPR_SPRG4
], env
->spr
[SPR_SPRG5
],
8619 env
->spr
[SPR_SPRG6
], env
->spr
[SPR_SPRG7
]);
8621 #if defined(TARGET_PPC64)
8622 if (env
->excp_model
== POWERPC_EXCP_POWER7
||
8623 env
->excp_model
== POWERPC_EXCP_POWER8
||
8624 env
->excp_model
== POWERPC_EXCP_POWER9
||
8625 env
->excp_model
== POWERPC_EXCP_POWER10
) {
8626 qemu_fprintf(f
, "HSRR0 " TARGET_FMT_lx
" HSRR1 " TARGET_FMT_lx
"\n",
8627 env
->spr
[SPR_HSRR0
], env
->spr
[SPR_HSRR1
]);
8630 if (env
->excp_model
== POWERPC_EXCP_BOOKE
) {
8631 qemu_fprintf(f
, "CSRR0 " TARGET_FMT_lx
" CSRR1 " TARGET_FMT_lx
8632 " MCSRR0 " TARGET_FMT_lx
" MCSRR1 " TARGET_FMT_lx
"\n",
8633 env
->spr
[SPR_BOOKE_CSRR0
], env
->spr
[SPR_BOOKE_CSRR1
],
8634 env
->spr
[SPR_BOOKE_MCSRR0
], env
->spr
[SPR_BOOKE_MCSRR1
]);
8636 qemu_fprintf(f
, " TCR " TARGET_FMT_lx
" TSR " TARGET_FMT_lx
8637 " ESR " TARGET_FMT_lx
" DEAR " TARGET_FMT_lx
"\n",
8638 env
->spr
[SPR_BOOKE_TCR
], env
->spr
[SPR_BOOKE_TSR
],
8639 env
->spr
[SPR_BOOKE_ESR
], env
->spr
[SPR_BOOKE_DEAR
]);
8641 qemu_fprintf(f
, " PIR " TARGET_FMT_lx
" DECAR " TARGET_FMT_lx
8642 " IVPR " TARGET_FMT_lx
" EPCR " TARGET_FMT_lx
"\n",
8643 env
->spr
[SPR_BOOKE_PIR
], env
->spr
[SPR_BOOKE_DECAR
],
8644 env
->spr
[SPR_BOOKE_IVPR
], env
->spr
[SPR_BOOKE_EPCR
]);
8646 qemu_fprintf(f
, " MCSR " TARGET_FMT_lx
" SPRG8 " TARGET_FMT_lx
8647 " EPR " TARGET_FMT_lx
"\n",
8648 env
->spr
[SPR_BOOKE_MCSR
], env
->spr
[SPR_BOOKE_SPRG8
],
8649 env
->spr
[SPR_BOOKE_EPR
]);
8652 qemu_fprintf(f
, " MCAR " TARGET_FMT_lx
" PID1 " TARGET_FMT_lx
8653 " PID2 " TARGET_FMT_lx
" SVR " TARGET_FMT_lx
"\n",
8654 env
->spr
[SPR_Exxx_MCAR
], env
->spr
[SPR_BOOKE_PID1
],
8655 env
->spr
[SPR_BOOKE_PID2
], env
->spr
[SPR_E500_SVR
]);
8658 * IVORs are left out as they are large and do not change often --
8659 * they can be read with "p $ivor0", "p $ivor1", etc.
8663 #if defined(TARGET_PPC64)
8664 if (env
->flags
& POWERPC_FLAG_CFAR
) {
8665 qemu_fprintf(f
, " CFAR " TARGET_FMT_lx
"\n", env
->cfar
);
8669 if (env
->spr_cb
[SPR_LPCR
].name
) {
8670 qemu_fprintf(f
, " LPCR " TARGET_FMT_lx
"\n", env
->spr
[SPR_LPCR
]);
8673 switch (env
->mmu_model
) {
8674 case POWERPC_MMU_32B
:
8675 case POWERPC_MMU_601
:
8676 case POWERPC_MMU_SOFT_6xx
:
8677 #if defined(TARGET_PPC64)
8678 case POWERPC_MMU_64B
:
8679 case POWERPC_MMU_2_03
:
8680 case POWERPC_MMU_2_06
:
8681 case POWERPC_MMU_2_07
:
8682 case POWERPC_MMU_3_00
:
8684 if (env
->spr_cb
[SPR_SDR1
].name
) { /* SDR1 Exists */
8685 qemu_fprintf(f
, " SDR1 " TARGET_FMT_lx
" ", env
->spr
[SPR_SDR1
]);
8687 if (env
->spr_cb
[SPR_PTCR
].name
) { /* PTCR Exists */
8688 qemu_fprintf(f
, " PTCR " TARGET_FMT_lx
" ", env
->spr
[SPR_PTCR
]);
8690 qemu_fprintf(f
, " DAR " TARGET_FMT_lx
" DSISR " TARGET_FMT_lx
"\n",
8691 env
->spr
[SPR_DAR
], env
->spr
[SPR_DSISR
]);
8693 case POWERPC_MMU_BOOKE206
:
8694 qemu_fprintf(f
, " MAS0 " TARGET_FMT_lx
" MAS1 " TARGET_FMT_lx
8695 " MAS2 " TARGET_FMT_lx
" MAS3 " TARGET_FMT_lx
"\n",
8696 env
->spr
[SPR_BOOKE_MAS0
], env
->spr
[SPR_BOOKE_MAS1
],
8697 env
->spr
[SPR_BOOKE_MAS2
], env
->spr
[SPR_BOOKE_MAS3
]);
8699 qemu_fprintf(f
, " MAS4 " TARGET_FMT_lx
" MAS6 " TARGET_FMT_lx
8700 " MAS7 " TARGET_FMT_lx
" PID " TARGET_FMT_lx
"\n",
8701 env
->spr
[SPR_BOOKE_MAS4
], env
->spr
[SPR_BOOKE_MAS6
],
8702 env
->spr
[SPR_BOOKE_MAS7
], env
->spr
[SPR_BOOKE_PID
]);
8704 qemu_fprintf(f
, "MMUCFG " TARGET_FMT_lx
" TLB0CFG " TARGET_FMT_lx
8705 " TLB1CFG " TARGET_FMT_lx
"\n",
8706 env
->spr
[SPR_MMUCFG
], env
->spr
[SPR_BOOKE_TLB0CFG
],
8707 env
->spr
[SPR_BOOKE_TLB1CFG
]);
8717 type_init(ppc_cpu_register_types
)