target/ppc: cpu_init: Move e300 SPR registration into a function
[qemu.git] / target / ppc / cpu_init.c
blob62eec9e6f0652c933e88da15a162f23fff3919a9
1 /*
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"
24 #include "kvm_ppc.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"
46 #include "internal.h"
47 #include "spr_tcg.h"
48 #include "power8-pmu.h"
50 /* #define PPC_DEBUG_SPR */
51 /* #define USE_APPLE_GDB */
53 static inline void vscr_init(CPUPPCState *env, uint32_t val)
55 /* Altivec always uses round-to-nearest */
56 set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
57 ppc_store_vscr(env, val);
60 /**
61 * _spr_register
63 * Register an SPR with all the callbacks required for tcg,
64 * and the ID number for KVM.
66 * The reason for the conditional compilation is that the tcg functions
67 * may be compiled out, and the system kvm header may not be available
68 * for supplying the ID numbers. This is ugly, but the best we can do.
71 #ifdef CONFIG_TCG
72 # define USR_ARG(X) X,
73 # ifdef CONFIG_USER_ONLY
74 # define SYS_ARG(X)
75 # else
76 # define SYS_ARG(X) X,
77 # endif
78 #else
79 # define USR_ARG(X)
80 # define SYS_ARG(X)
81 #endif
82 #ifdef CONFIG_KVM
83 # define KVM_ARG(X) X,
84 #else
85 # define KVM_ARG(X)
86 #endif
88 typedef void spr_callback(DisasContext *, int, int);
90 static void _spr_register(CPUPPCState *env, int num, const char *name,
91 USR_ARG(spr_callback *uea_read)
92 USR_ARG(spr_callback *uea_write)
93 SYS_ARG(spr_callback *oea_read)
94 SYS_ARG(spr_callback *oea_write)
95 SYS_ARG(spr_callback *hea_read)
96 SYS_ARG(spr_callback *hea_write)
97 KVM_ARG(uint64_t one_reg_id)
98 target_ulong initial_value)
100 ppc_spr_t *spr = &env->spr_cb[num];
102 /* No SPR should be registered twice. */
103 assert(spr->name == NULL);
104 assert(name != NULL);
106 spr->name = name;
107 spr->default_value = initial_value;
108 env->spr[num] = initial_value;
110 #ifdef CONFIG_TCG
111 spr->uea_read = uea_read;
112 spr->uea_write = uea_write;
113 # ifndef CONFIG_USER_ONLY
114 spr->oea_read = oea_read;
115 spr->oea_write = oea_write;
116 spr->hea_read = hea_read;
117 spr->hea_write = hea_write;
118 # endif
119 #endif
120 #ifdef CONFIG_KVM
121 spr->one_reg_id = one_reg_id;
122 #endif
125 /* spr_register_kvm_hv passes all required arguments. */
126 #define spr_register_kvm_hv(env, num, name, uea_read, uea_write, \
127 oea_read, oea_write, hea_read, hea_write, \
128 one_reg_id, initial_value) \
129 _spr_register(env, num, name, \
130 USR_ARG(uea_read) USR_ARG(uea_write) \
131 SYS_ARG(oea_read) SYS_ARG(oea_write) \
132 SYS_ARG(hea_read) SYS_ARG(hea_write) \
133 KVM_ARG(one_reg_id) initial_value)
135 /* spr_register_kvm duplicates the oea callbacks to the hea callbacks. */
136 #define spr_register_kvm(env, num, name, uea_read, uea_write, \
137 oea_read, oea_write, one_reg_id, ival) \
138 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
139 oea_write, oea_read, oea_write, one_reg_id, ival)
141 /* spr_register_hv and spr_register are similar, except there is no kvm id. */
142 #define spr_register_hv(env, num, name, uea_read, uea_write, \
143 oea_read, oea_write, hea_read, hea_write, ival) \
144 spr_register_kvm_hv(env, num, name, uea_read, uea_write, oea_read, \
145 oea_write, hea_read, hea_write, 0, ival)
147 #define spr_register(env, num, name, uea_read, uea_write, \
148 oea_read, oea_write, ival) \
149 spr_register_kvm(env, num, name, uea_read, uea_write, \
150 oea_read, oea_write, 0, ival)
152 /* Generic PowerPC SPRs */
153 static void register_generic_sprs(PowerPCCPU *cpu)
155 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
156 CPUPPCState *env = &cpu->env;
158 /* Integer processing */
159 spr_register(env, SPR_XER, "XER",
160 &spr_read_xer, &spr_write_xer,
161 &spr_read_xer, &spr_write_xer,
162 0x00000000);
163 /* Branch control */
164 spr_register(env, SPR_LR, "LR",
165 &spr_read_lr, &spr_write_lr,
166 &spr_read_lr, &spr_write_lr,
167 0x00000000);
168 spr_register(env, SPR_CTR, "CTR",
169 &spr_read_ctr, &spr_write_ctr,
170 &spr_read_ctr, &spr_write_ctr,
171 0x00000000);
172 /* Interrupt processing */
173 spr_register(env, SPR_SRR0, "SRR0",
174 SPR_NOACCESS, SPR_NOACCESS,
175 &spr_read_generic, &spr_write_generic,
176 0x00000000);
177 spr_register(env, SPR_SRR1, "SRR1",
178 SPR_NOACCESS, SPR_NOACCESS,
179 &spr_read_generic, &spr_write_generic,
180 0x00000000);
181 /* Processor control */
182 spr_register(env, SPR_SPRG0, "SPRG0",
183 SPR_NOACCESS, SPR_NOACCESS,
184 &spr_read_generic, &spr_write_generic,
185 0x00000000);
186 spr_register(env, SPR_SPRG1, "SPRG1",
187 SPR_NOACCESS, SPR_NOACCESS,
188 &spr_read_generic, &spr_write_generic,
189 0x00000000);
190 spr_register(env, SPR_SPRG2, "SPRG2",
191 SPR_NOACCESS, SPR_NOACCESS,
192 &spr_read_generic, &spr_write_generic,
193 0x00000000);
194 spr_register(env, SPR_SPRG3, "SPRG3",
195 SPR_NOACCESS, SPR_NOACCESS,
196 &spr_read_generic, &spr_write_generic,
197 0x00000000);
199 spr_register(env, SPR_PVR, "PVR",
200 /* Linux permits userspace to read PVR */
201 #if defined(CONFIG_LINUX_USER)
202 &spr_read_generic,
203 #else
204 SPR_NOACCESS,
205 #endif
206 SPR_NOACCESS,
207 &spr_read_generic, SPR_NOACCESS,
208 pcc->pvr);
210 /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
211 if (pcc->svr != POWERPC_SVR_NONE) {
212 if (pcc->svr & POWERPC_SVR_E500) {
213 spr_register(env, SPR_E500_SVR, "SVR",
214 SPR_NOACCESS, SPR_NOACCESS,
215 &spr_read_generic, SPR_NOACCESS,
216 pcc->svr & ~POWERPC_SVR_E500);
217 } else {
218 spr_register(env, SPR_SVR, "SVR",
219 SPR_NOACCESS, SPR_NOACCESS,
220 &spr_read_generic, SPR_NOACCESS,
221 pcc->svr);
225 /* Time base */
226 spr_register(env, SPR_VTBL, "TBL",
227 &spr_read_tbl, SPR_NOACCESS,
228 &spr_read_tbl, SPR_NOACCESS,
229 0x00000000);
230 spr_register(env, SPR_TBL, "TBL",
231 &spr_read_tbl, SPR_NOACCESS,
232 &spr_read_tbl, &spr_write_tbl,
233 0x00000000);
234 spr_register(env, SPR_VTBU, "TBU",
235 &spr_read_tbu, SPR_NOACCESS,
236 &spr_read_tbu, SPR_NOACCESS,
237 0x00000000);
238 spr_register(env, SPR_TBU, "TBU",
239 &spr_read_tbu, SPR_NOACCESS,
240 &spr_read_tbu, &spr_write_tbu,
241 0x00000000);
244 /* SPR common to all non-embedded PowerPC, including 601 */
245 static void register_ne_601_sprs(CPUPPCState *env)
247 /* Exception processing */
248 spr_register_kvm(env, SPR_DSISR, "DSISR",
249 SPR_NOACCESS, SPR_NOACCESS,
250 &spr_read_generic, &spr_write_generic,
251 KVM_REG_PPC_DSISR, 0x00000000);
252 spr_register_kvm(env, SPR_DAR, "DAR",
253 SPR_NOACCESS, SPR_NOACCESS,
254 &spr_read_generic, &spr_write_generic,
255 KVM_REG_PPC_DAR, 0x00000000);
256 /* Timer */
257 spr_register(env, SPR_DECR, "DECR",
258 SPR_NOACCESS, SPR_NOACCESS,
259 &spr_read_decr, &spr_write_decr,
260 0x00000000);
263 /* Storage Description Register 1 */
264 static void register_sdr1_sprs(CPUPPCState *env)
266 #ifndef CONFIG_USER_ONLY
267 if (env->has_hv_mode) {
269 * SDR1 is a hypervisor resource on CPUs which have a
270 * hypervisor mode
272 spr_register_hv(env, SPR_SDR1, "SDR1",
273 SPR_NOACCESS, SPR_NOACCESS,
274 SPR_NOACCESS, SPR_NOACCESS,
275 &spr_read_generic, &spr_write_sdr1,
276 0x00000000);
277 } else {
278 spr_register(env, SPR_SDR1, "SDR1",
279 SPR_NOACCESS, SPR_NOACCESS,
280 &spr_read_generic, &spr_write_sdr1,
281 0x00000000);
283 #endif
286 /* BATs 0-3 */
287 static void register_low_BATs(CPUPPCState *env)
289 #if !defined(CONFIG_USER_ONLY)
290 spr_register(env, SPR_IBAT0U, "IBAT0U",
291 SPR_NOACCESS, SPR_NOACCESS,
292 &spr_read_ibat, &spr_write_ibatu,
293 0x00000000);
294 spr_register(env, SPR_IBAT0L, "IBAT0L",
295 SPR_NOACCESS, SPR_NOACCESS,
296 &spr_read_ibat, &spr_write_ibatl,
297 0x00000000);
298 spr_register(env, SPR_IBAT1U, "IBAT1U",
299 SPR_NOACCESS, SPR_NOACCESS,
300 &spr_read_ibat, &spr_write_ibatu,
301 0x00000000);
302 spr_register(env, SPR_IBAT1L, "IBAT1L",
303 SPR_NOACCESS, SPR_NOACCESS,
304 &spr_read_ibat, &spr_write_ibatl,
305 0x00000000);
306 spr_register(env, SPR_IBAT2U, "IBAT2U",
307 SPR_NOACCESS, SPR_NOACCESS,
308 &spr_read_ibat, &spr_write_ibatu,
309 0x00000000);
310 spr_register(env, SPR_IBAT2L, "IBAT2L",
311 SPR_NOACCESS, SPR_NOACCESS,
312 &spr_read_ibat, &spr_write_ibatl,
313 0x00000000);
314 spr_register(env, SPR_IBAT3U, "IBAT3U",
315 SPR_NOACCESS, SPR_NOACCESS,
316 &spr_read_ibat, &spr_write_ibatu,
317 0x00000000);
318 spr_register(env, SPR_IBAT3L, "IBAT3L",
319 SPR_NOACCESS, SPR_NOACCESS,
320 &spr_read_ibat, &spr_write_ibatl,
321 0x00000000);
322 spr_register(env, SPR_DBAT0U, "DBAT0U",
323 SPR_NOACCESS, SPR_NOACCESS,
324 &spr_read_dbat, &spr_write_dbatu,
325 0x00000000);
326 spr_register(env, SPR_DBAT0L, "DBAT0L",
327 SPR_NOACCESS, SPR_NOACCESS,
328 &spr_read_dbat, &spr_write_dbatl,
329 0x00000000);
330 spr_register(env, SPR_DBAT1U, "DBAT1U",
331 SPR_NOACCESS, SPR_NOACCESS,
332 &spr_read_dbat, &spr_write_dbatu,
333 0x00000000);
334 spr_register(env, SPR_DBAT1L, "DBAT1L",
335 SPR_NOACCESS, SPR_NOACCESS,
336 &spr_read_dbat, &spr_write_dbatl,
337 0x00000000);
338 spr_register(env, SPR_DBAT2U, "DBAT2U",
339 SPR_NOACCESS, SPR_NOACCESS,
340 &spr_read_dbat, &spr_write_dbatu,
341 0x00000000);
342 spr_register(env, SPR_DBAT2L, "DBAT2L",
343 SPR_NOACCESS, SPR_NOACCESS,
344 &spr_read_dbat, &spr_write_dbatl,
345 0x00000000);
346 spr_register(env, SPR_DBAT3U, "DBAT3U",
347 SPR_NOACCESS, SPR_NOACCESS,
348 &spr_read_dbat, &spr_write_dbatu,
349 0x00000000);
350 spr_register(env, SPR_DBAT3L, "DBAT3L",
351 SPR_NOACCESS, SPR_NOACCESS,
352 &spr_read_dbat, &spr_write_dbatl,
353 0x00000000);
354 env->nb_BATs += 4;
355 #endif
358 /* BATs 4-7 */
359 static void register_high_BATs(CPUPPCState *env)
361 #if !defined(CONFIG_USER_ONLY)
362 spr_register(env, SPR_IBAT4U, "IBAT4U",
363 SPR_NOACCESS, SPR_NOACCESS,
364 &spr_read_ibat_h, &spr_write_ibatu_h,
365 0x00000000);
366 spr_register(env, SPR_IBAT4L, "IBAT4L",
367 SPR_NOACCESS, SPR_NOACCESS,
368 &spr_read_ibat_h, &spr_write_ibatl_h,
369 0x00000000);
370 spr_register(env, SPR_IBAT5U, "IBAT5U",
371 SPR_NOACCESS, SPR_NOACCESS,
372 &spr_read_ibat_h, &spr_write_ibatu_h,
373 0x00000000);
374 spr_register(env, SPR_IBAT5L, "IBAT5L",
375 SPR_NOACCESS, SPR_NOACCESS,
376 &spr_read_ibat_h, &spr_write_ibatl_h,
377 0x00000000);
378 spr_register(env, SPR_IBAT6U, "IBAT6U",
379 SPR_NOACCESS, SPR_NOACCESS,
380 &spr_read_ibat_h, &spr_write_ibatu_h,
381 0x00000000);
382 spr_register(env, SPR_IBAT6L, "IBAT6L",
383 SPR_NOACCESS, SPR_NOACCESS,
384 &spr_read_ibat_h, &spr_write_ibatl_h,
385 0x00000000);
386 spr_register(env, SPR_IBAT7U, "IBAT7U",
387 SPR_NOACCESS, SPR_NOACCESS,
388 &spr_read_ibat_h, &spr_write_ibatu_h,
389 0x00000000);
390 spr_register(env, SPR_IBAT7L, "IBAT7L",
391 SPR_NOACCESS, SPR_NOACCESS,
392 &spr_read_ibat_h, &spr_write_ibatl_h,
393 0x00000000);
394 spr_register(env, SPR_DBAT4U, "DBAT4U",
395 SPR_NOACCESS, SPR_NOACCESS,
396 &spr_read_dbat_h, &spr_write_dbatu_h,
397 0x00000000);
398 spr_register(env, SPR_DBAT4L, "DBAT4L",
399 SPR_NOACCESS, SPR_NOACCESS,
400 &spr_read_dbat_h, &spr_write_dbatl_h,
401 0x00000000);
402 spr_register(env, SPR_DBAT5U, "DBAT5U",
403 SPR_NOACCESS, SPR_NOACCESS,
404 &spr_read_dbat_h, &spr_write_dbatu_h,
405 0x00000000);
406 spr_register(env, SPR_DBAT5L, "DBAT5L",
407 SPR_NOACCESS, SPR_NOACCESS,
408 &spr_read_dbat_h, &spr_write_dbatl_h,
409 0x00000000);
410 spr_register(env, SPR_DBAT6U, "DBAT6U",
411 SPR_NOACCESS, SPR_NOACCESS,
412 &spr_read_dbat_h, &spr_write_dbatu_h,
413 0x00000000);
414 spr_register(env, SPR_DBAT6L, "DBAT6L",
415 SPR_NOACCESS, SPR_NOACCESS,
416 &spr_read_dbat_h, &spr_write_dbatl_h,
417 0x00000000);
418 spr_register(env, SPR_DBAT7U, "DBAT7U",
419 SPR_NOACCESS, SPR_NOACCESS,
420 &spr_read_dbat_h, &spr_write_dbatu_h,
421 0x00000000);
422 spr_register(env, SPR_DBAT7L, "DBAT7L",
423 SPR_NOACCESS, SPR_NOACCESS,
424 &spr_read_dbat_h, &spr_write_dbatl_h,
425 0x00000000);
426 env->nb_BATs += 4;
427 #endif
430 /* Softare table search registers */
431 static void register_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways)
433 #if !defined(CONFIG_USER_ONLY)
434 env->nb_tlb = nb_tlbs;
435 env->nb_ways = nb_ways;
436 env->id_tlbs = 1;
437 env->tlb_type = TLB_6XX;
438 spr_register(env, SPR_DMISS, "DMISS",
439 SPR_NOACCESS, SPR_NOACCESS,
440 &spr_read_generic, SPR_NOACCESS,
441 0x00000000);
442 spr_register(env, SPR_DCMP, "DCMP",
443 SPR_NOACCESS, SPR_NOACCESS,
444 &spr_read_generic, SPR_NOACCESS,
445 0x00000000);
446 spr_register(env, SPR_HASH1, "HASH1",
447 SPR_NOACCESS, SPR_NOACCESS,
448 &spr_read_generic, SPR_NOACCESS,
449 0x00000000);
450 spr_register(env, SPR_HASH2, "HASH2",
451 SPR_NOACCESS, SPR_NOACCESS,
452 &spr_read_generic, SPR_NOACCESS,
453 0x00000000);
454 spr_register(env, SPR_IMISS, "IMISS",
455 SPR_NOACCESS, SPR_NOACCESS,
456 &spr_read_generic, SPR_NOACCESS,
457 0x00000000);
458 spr_register(env, SPR_ICMP, "ICMP",
459 SPR_NOACCESS, SPR_NOACCESS,
460 &spr_read_generic, SPR_NOACCESS,
461 0x00000000);
462 spr_register(env, SPR_RPA, "RPA",
463 SPR_NOACCESS, SPR_NOACCESS,
464 &spr_read_generic, &spr_write_generic,
465 0x00000000);
466 #endif
469 static void register_745_sprs(CPUPPCState *env)
471 /* SGPRs */
472 spr_register(env, SPR_SPRG4, "SPRG4",
473 SPR_NOACCESS, SPR_NOACCESS,
474 &spr_read_generic, &spr_write_generic,
475 0x00000000);
476 spr_register(env, SPR_SPRG5, "SPRG5",
477 SPR_NOACCESS, SPR_NOACCESS,
478 &spr_read_generic, &spr_write_generic,
479 0x00000000);
480 spr_register(env, SPR_SPRG6, "SPRG6",
481 SPR_NOACCESS, SPR_NOACCESS,
482 &spr_read_generic, &spr_write_generic,
483 0x00000000);
484 spr_register(env, SPR_SPRG7, "SPRG7",
485 SPR_NOACCESS, SPR_NOACCESS,
486 &spr_read_generic, &spr_write_generic,
487 0x00000000);
489 /* Hardware implementation registers */
490 spr_register(env, SPR_HID0, "HID0",
491 SPR_NOACCESS, SPR_NOACCESS,
492 &spr_read_generic, &spr_write_generic,
493 0x00000000);
495 spr_register(env, SPR_HID1, "HID1",
496 SPR_NOACCESS, SPR_NOACCESS,
497 &spr_read_generic, &spr_write_generic,
498 0x00000000);
500 spr_register(env, SPR_HID2, "HID2",
501 SPR_NOACCESS, SPR_NOACCESS,
502 &spr_read_generic, &spr_write_generic,
503 0x00000000);
506 static void register_755_sprs(CPUPPCState *env)
508 /* L2 cache control */
509 spr_register(env, SPR_L2CR, "L2CR",
510 SPR_NOACCESS, SPR_NOACCESS,
511 &spr_read_generic, spr_access_nop,
512 0x00000000);
514 spr_register(env, SPR_L2PMCR, "L2PMCR",
515 SPR_NOACCESS, SPR_NOACCESS,
516 &spr_read_generic, &spr_write_generic,
517 0x00000000);
520 /* SPR common to all 7xx PowerPC implementations */
521 static void register_7xx_sprs(CPUPPCState *env)
523 /* Breakpoints */
524 spr_register_kvm(env, SPR_DABR, "DABR",
525 SPR_NOACCESS, SPR_NOACCESS,
526 &spr_read_generic, &spr_write_generic,
527 KVM_REG_PPC_DABR, 0x00000000);
529 spr_register(env, SPR_IABR, "IABR",
530 SPR_NOACCESS, SPR_NOACCESS,
531 &spr_read_generic, &spr_write_generic,
532 0x00000000);
533 /* Cache management */
534 spr_register(env, SPR_ICTC, "ICTC",
535 SPR_NOACCESS, SPR_NOACCESS,
536 &spr_read_generic, &spr_write_generic,
537 0x00000000);
538 /* Performance monitors */
539 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
540 SPR_NOACCESS, SPR_NOACCESS,
541 &spr_read_generic, &spr_write_generic,
542 0x00000000);
544 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
545 SPR_NOACCESS, SPR_NOACCESS,
546 &spr_read_generic, &spr_write_generic,
547 0x00000000);
549 spr_register(env, SPR_7XX_PMC1, "PMC1",
550 SPR_NOACCESS, SPR_NOACCESS,
551 &spr_read_generic, &spr_write_generic,
552 0x00000000);
554 spr_register(env, SPR_7XX_PMC2, "PMC2",
555 SPR_NOACCESS, SPR_NOACCESS,
556 &spr_read_generic, &spr_write_generic,
557 0x00000000);
559 spr_register(env, SPR_7XX_PMC3, "PMC3",
560 SPR_NOACCESS, SPR_NOACCESS,
561 &spr_read_generic, &spr_write_generic,
562 0x00000000);
564 spr_register(env, SPR_7XX_PMC4, "PMC4",
565 SPR_NOACCESS, SPR_NOACCESS,
566 &spr_read_generic, &spr_write_generic,
567 0x00000000);
569 spr_register(env, SPR_7XX_SIAR, "SIAR",
570 SPR_NOACCESS, SPR_NOACCESS,
571 &spr_read_generic, SPR_NOACCESS,
572 0x00000000);
574 spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
575 &spr_read_ureg, SPR_NOACCESS,
576 &spr_read_ureg, SPR_NOACCESS,
577 0x00000000);
579 spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
580 &spr_read_ureg, SPR_NOACCESS,
581 &spr_read_ureg, SPR_NOACCESS,
582 0x00000000);
584 spr_register(env, SPR_7XX_UPMC1, "UPMC1",
585 &spr_read_ureg, SPR_NOACCESS,
586 &spr_read_ureg, SPR_NOACCESS,
587 0x00000000);
589 spr_register(env, SPR_7XX_UPMC2, "UPMC2",
590 &spr_read_ureg, SPR_NOACCESS,
591 &spr_read_ureg, SPR_NOACCESS,
592 0x00000000);
594 spr_register(env, SPR_7XX_UPMC3, "UPMC3",
595 &spr_read_ureg, SPR_NOACCESS,
596 &spr_read_ureg, SPR_NOACCESS,
597 0x00000000);
599 spr_register(env, SPR_7XX_UPMC4, "UPMC4",
600 &spr_read_ureg, SPR_NOACCESS,
601 &spr_read_ureg, SPR_NOACCESS,
602 0x00000000);
604 spr_register(env, SPR_7XX_USIAR, "USIAR",
605 &spr_read_ureg, SPR_NOACCESS,
606 &spr_read_ureg, SPR_NOACCESS,
607 0x00000000);
608 /* External access control */
609 spr_register(env, SPR_EAR, "EAR",
610 SPR_NOACCESS, SPR_NOACCESS,
611 &spr_read_generic, &spr_write_generic,
612 0x00000000);
614 /* Hardware implementation registers */
615 spr_register(env, SPR_HID0, "HID0",
616 SPR_NOACCESS, SPR_NOACCESS,
617 &spr_read_generic, &spr_write_generic,
618 0x00000000);
620 spr_register(env, SPR_HID1, "HID1",
621 SPR_NOACCESS, SPR_NOACCESS,
622 &spr_read_generic, &spr_write_generic,
623 0x00000000);
626 #ifdef TARGET_PPC64
627 static void register_amr_sprs(CPUPPCState *env)
629 #ifndef CONFIG_USER_ONLY
631 * Virtual Page Class Key protection
633 * The AMR is accessible either via SPR 13 or SPR 29. 13 is
634 * userspace accessible, 29 is privileged. So we only need to set
635 * the kvm ONE_REG id on one of them, we use 29
637 spr_register(env, SPR_UAMR, "UAMR",
638 &spr_read_generic, &spr_write_amr,
639 &spr_read_generic, &spr_write_amr,
641 spr_register_kvm_hv(env, SPR_AMR, "AMR",
642 SPR_NOACCESS, SPR_NOACCESS,
643 &spr_read_generic, &spr_write_amr,
644 &spr_read_generic, &spr_write_generic,
645 KVM_REG_PPC_AMR, 0);
646 spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR",
647 SPR_NOACCESS, SPR_NOACCESS,
648 &spr_read_generic, &spr_write_uamor,
649 &spr_read_generic, &spr_write_generic,
650 KVM_REG_PPC_UAMOR, 0);
651 spr_register_hv(env, SPR_AMOR, "AMOR",
652 SPR_NOACCESS, SPR_NOACCESS,
653 SPR_NOACCESS, SPR_NOACCESS,
654 &spr_read_generic, &spr_write_generic,
656 #endif /* !CONFIG_USER_ONLY */
659 static void register_iamr_sprs(CPUPPCState *env)
661 #ifndef CONFIG_USER_ONLY
662 spr_register_kvm_hv(env, SPR_IAMR, "IAMR",
663 SPR_NOACCESS, SPR_NOACCESS,
664 &spr_read_generic, &spr_write_iamr,
665 &spr_read_generic, &spr_write_generic,
666 KVM_REG_PPC_IAMR, 0);
667 #endif /* !CONFIG_USER_ONLY */
669 #endif /* TARGET_PPC64 */
671 static void register_thrm_sprs(CPUPPCState *env)
673 /* Thermal management */
674 spr_register(env, SPR_THRM1, "THRM1",
675 SPR_NOACCESS, SPR_NOACCESS,
676 &spr_read_thrm, &spr_write_generic,
677 0x00000000);
679 spr_register(env, SPR_THRM2, "THRM2",
680 SPR_NOACCESS, SPR_NOACCESS,
681 &spr_read_thrm, &spr_write_generic,
682 0x00000000);
684 spr_register(env, SPR_THRM3, "THRM3",
685 SPR_NOACCESS, SPR_NOACCESS,
686 &spr_read_thrm, &spr_write_generic,
687 0x00000000);
690 /* SPR specific to PowerPC 604 implementation */
691 static void register_604_sprs(CPUPPCState *env)
693 /* Processor identification */
694 spr_register(env, SPR_PIR, "PIR",
695 SPR_NOACCESS, SPR_NOACCESS,
696 &spr_read_generic, &spr_write_pir,
697 0x00000000);
698 /* Breakpoints */
699 spr_register(env, SPR_IABR, "IABR",
700 SPR_NOACCESS, SPR_NOACCESS,
701 &spr_read_generic, &spr_write_generic,
702 0x00000000);
704 spr_register_kvm(env, SPR_DABR, "DABR",
705 SPR_NOACCESS, SPR_NOACCESS,
706 &spr_read_generic, &spr_write_generic,
707 KVM_REG_PPC_DABR, 0x00000000);
708 /* Performance counters */
709 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
710 SPR_NOACCESS, SPR_NOACCESS,
711 &spr_read_generic, &spr_write_generic,
712 0x00000000);
714 spr_register(env, SPR_7XX_PMC1, "PMC1",
715 SPR_NOACCESS, SPR_NOACCESS,
716 &spr_read_generic, &spr_write_generic,
717 0x00000000);
719 spr_register(env, SPR_7XX_PMC2, "PMC2",
720 SPR_NOACCESS, SPR_NOACCESS,
721 &spr_read_generic, &spr_write_generic,
722 0x00000000);
724 spr_register(env, SPR_7XX_SIAR, "SIAR",
725 SPR_NOACCESS, SPR_NOACCESS,
726 &spr_read_generic, SPR_NOACCESS,
727 0x00000000);
729 spr_register(env, SPR_SDA, "SDA",
730 SPR_NOACCESS, SPR_NOACCESS,
731 &spr_read_generic, SPR_NOACCESS,
732 0x00000000);
733 /* External access control */
734 spr_register(env, SPR_EAR, "EAR",
735 SPR_NOACCESS, SPR_NOACCESS,
736 &spr_read_generic, &spr_write_generic,
737 0x00000000);
739 /* Hardware implementation registers */
740 spr_register(env, SPR_HID0, "HID0",
741 SPR_NOACCESS, SPR_NOACCESS,
742 &spr_read_generic, &spr_write_generic,
743 0x00000000);
746 /* SPR specific to PowerPC 603 implementation */
747 static void register_603_sprs(CPUPPCState *env)
749 /* External access control */
750 spr_register(env, SPR_EAR, "EAR",
751 SPR_NOACCESS, SPR_NOACCESS,
752 &spr_read_generic, &spr_write_generic,
753 0x00000000);
754 /* Breakpoints */
755 spr_register(env, SPR_IABR, "IABR",
756 SPR_NOACCESS, SPR_NOACCESS,
757 &spr_read_generic, &spr_write_generic,
758 0x00000000);
760 spr_register(env, SPR_HID0, "HID0",
761 SPR_NOACCESS, SPR_NOACCESS,
762 &spr_read_generic, &spr_write_generic,
763 0x00000000);
765 spr_register(env, SPR_HID1, "HID1",
766 SPR_NOACCESS, SPR_NOACCESS,
767 &spr_read_generic, &spr_write_generic,
768 0x00000000);
771 static void register_e300_sprs(CPUPPCState *env)
773 /* hardware implementation registers */
774 spr_register(env, SPR_HID2, "HID2",
775 SPR_NOACCESS, SPR_NOACCESS,
776 &spr_read_generic, &spr_write_generic,
777 0x00000000);
778 /* Breakpoints */
779 spr_register(env, SPR_DABR, "DABR",
780 SPR_NOACCESS, SPR_NOACCESS,
781 &spr_read_generic, &spr_write_generic,
782 0x00000000);
784 spr_register(env, SPR_DABR2, "DABR2",
785 SPR_NOACCESS, SPR_NOACCESS,
786 &spr_read_generic, &spr_write_generic,
787 0x00000000);
789 spr_register(env, SPR_IABR2, "IABR2",
790 SPR_NOACCESS, SPR_NOACCESS,
791 &spr_read_generic, &spr_write_generic,
792 0x00000000);
794 spr_register(env, SPR_IBCR, "IBCR",
795 SPR_NOACCESS, SPR_NOACCESS,
796 &spr_read_generic, &spr_write_generic,
797 0x00000000);
799 spr_register(env, SPR_DBCR, "DBCR",
800 SPR_NOACCESS, SPR_NOACCESS,
801 &spr_read_generic, &spr_write_generic,
802 0x00000000);
805 /* SPR specific to PowerPC G2 implementation */
806 static void register_G2_sprs(CPUPPCState *env)
808 /* Memory base address */
809 /* MBAR */
810 spr_register(env, SPR_MBAR, "MBAR",
811 SPR_NOACCESS, SPR_NOACCESS,
812 &spr_read_generic, &spr_write_generic,
813 0x00000000);
814 /* Exception processing */
815 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
816 SPR_NOACCESS, SPR_NOACCESS,
817 &spr_read_generic, &spr_write_generic,
818 0x00000000);
819 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
820 SPR_NOACCESS, SPR_NOACCESS,
821 &spr_read_generic, &spr_write_generic,
822 0x00000000);
823 /* Breakpoints */
824 spr_register(env, SPR_DABR, "DABR",
825 SPR_NOACCESS, SPR_NOACCESS,
826 &spr_read_generic, &spr_write_generic,
827 0x00000000);
829 spr_register(env, SPR_DABR2, "DABR2",
830 SPR_NOACCESS, SPR_NOACCESS,
831 &spr_read_generic, &spr_write_generic,
832 0x00000000);
834 spr_register(env, SPR_IABR, "IABR",
835 SPR_NOACCESS, SPR_NOACCESS,
836 &spr_read_generic, &spr_write_generic,
837 0x00000000);
839 spr_register(env, SPR_IABR2, "IABR2",
840 SPR_NOACCESS, SPR_NOACCESS,
841 &spr_read_generic, &spr_write_generic,
842 0x00000000);
844 spr_register(env, SPR_IBCR, "IBCR",
845 SPR_NOACCESS, SPR_NOACCESS,
846 &spr_read_generic, &spr_write_generic,
847 0x00000000);
849 spr_register(env, SPR_DBCR, "DBCR",
850 SPR_NOACCESS, SPR_NOACCESS,
851 &spr_read_generic, &spr_write_generic,
852 0x00000000);
854 /* External access control */
855 spr_register(env, SPR_EAR, "EAR",
856 SPR_NOACCESS, SPR_NOACCESS,
857 &spr_read_generic, &spr_write_generic,
858 0x00000000);
859 /* Hardware implementation register */
860 spr_register(env, SPR_HID0, "HID0",
861 SPR_NOACCESS, SPR_NOACCESS,
862 &spr_read_generic, &spr_write_generic,
863 0x00000000);
865 spr_register(env, SPR_HID1, "HID1",
866 SPR_NOACCESS, SPR_NOACCESS,
867 &spr_read_generic, &spr_write_generic,
868 0x00000000);
870 spr_register(env, SPR_HID2, "HID2",
871 SPR_NOACCESS, SPR_NOACCESS,
872 &spr_read_generic, &spr_write_generic,
873 0x00000000);
875 /* SGPRs */
876 spr_register(env, SPR_SPRG4, "SPRG4",
877 SPR_NOACCESS, SPR_NOACCESS,
878 &spr_read_generic, &spr_write_generic,
879 0x00000000);
880 spr_register(env, SPR_SPRG5, "SPRG5",
881 SPR_NOACCESS, SPR_NOACCESS,
882 &spr_read_generic, &spr_write_generic,
883 0x00000000);
884 spr_register(env, SPR_SPRG6, "SPRG6",
885 SPR_NOACCESS, SPR_NOACCESS,
886 &spr_read_generic, &spr_write_generic,
887 0x00000000);
888 spr_register(env, SPR_SPRG7, "SPRG7",
889 SPR_NOACCESS, SPR_NOACCESS,
890 &spr_read_generic, &spr_write_generic,
891 0x00000000);
894 static void register_74xx_sprs(CPUPPCState *env)
896 /* Breakpoints */
897 spr_register_kvm(env, SPR_DABR, "DABR",
898 SPR_NOACCESS, SPR_NOACCESS,
899 &spr_read_generic, &spr_write_generic,
900 KVM_REG_PPC_DABR, 0x00000000);
902 spr_register(env, SPR_IABR, "IABR",
903 SPR_NOACCESS, SPR_NOACCESS,
904 &spr_read_generic, &spr_write_generic,
905 0x00000000);
906 /* Cache management */
907 spr_register(env, SPR_ICTC, "ICTC",
908 SPR_NOACCESS, SPR_NOACCESS,
909 &spr_read_generic, &spr_write_generic,
910 0x00000000);
911 /* Performance monitors */
912 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
913 SPR_NOACCESS, SPR_NOACCESS,
914 &spr_read_generic, &spr_write_generic,
915 0x00000000);
917 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
918 SPR_NOACCESS, SPR_NOACCESS,
919 &spr_read_generic, &spr_write_generic,
920 0x00000000);
922 spr_register(env, SPR_7XX_PMC1, "PMC1",
923 SPR_NOACCESS, SPR_NOACCESS,
924 &spr_read_generic, &spr_write_generic,
925 0x00000000);
927 spr_register(env, SPR_7XX_PMC2, "PMC2",
928 SPR_NOACCESS, SPR_NOACCESS,
929 &spr_read_generic, &spr_write_generic,
930 0x00000000);
932 spr_register(env, SPR_7XX_PMC3, "PMC3",
933 SPR_NOACCESS, SPR_NOACCESS,
934 &spr_read_generic, &spr_write_generic,
935 0x00000000);
937 spr_register(env, SPR_7XX_PMC4, "PMC4",
938 SPR_NOACCESS, SPR_NOACCESS,
939 &spr_read_generic, &spr_write_generic,
940 0x00000000);
942 spr_register(env, SPR_7XX_SIAR, "SIAR",
943 SPR_NOACCESS, SPR_NOACCESS,
944 &spr_read_generic, SPR_NOACCESS,
945 0x00000000);
947 spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
948 &spr_read_ureg, SPR_NOACCESS,
949 &spr_read_ureg, SPR_NOACCESS,
950 0x00000000);
952 spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
953 &spr_read_ureg, SPR_NOACCESS,
954 &spr_read_ureg, SPR_NOACCESS,
955 0x00000000);
957 spr_register(env, SPR_7XX_UPMC1, "UPMC1",
958 &spr_read_ureg, SPR_NOACCESS,
959 &spr_read_ureg, SPR_NOACCESS,
960 0x00000000);
962 spr_register(env, SPR_7XX_UPMC2, "UPMC2",
963 &spr_read_ureg, SPR_NOACCESS,
964 &spr_read_ureg, SPR_NOACCESS,
965 0x00000000);
967 spr_register(env, SPR_7XX_UPMC3, "UPMC3",
968 &spr_read_ureg, SPR_NOACCESS,
969 &spr_read_ureg, SPR_NOACCESS,
970 0x00000000);
972 spr_register(env, SPR_7XX_UPMC4, "UPMC4",
973 &spr_read_ureg, SPR_NOACCESS,
974 &spr_read_ureg, SPR_NOACCESS,
975 0x00000000);
977 spr_register(env, SPR_7XX_USIAR, "USIAR",
978 &spr_read_ureg, SPR_NOACCESS,
979 &spr_read_ureg, SPR_NOACCESS,
980 0x00000000);
981 /* External access control */
982 spr_register(env, SPR_EAR, "EAR",
983 SPR_NOACCESS, SPR_NOACCESS,
984 &spr_read_generic, &spr_write_generic,
985 0x00000000);
987 /* Processor identification */
988 spr_register(env, SPR_PIR, "PIR",
989 SPR_NOACCESS, SPR_NOACCESS,
990 &spr_read_generic, &spr_write_pir,
991 0x00000000);
993 spr_register(env, SPR_74XX_MMCR2, "MMCR2",
994 SPR_NOACCESS, SPR_NOACCESS,
995 &spr_read_generic, &spr_write_generic,
996 0x00000000);
998 spr_register(env, SPR_74XX_UMMCR2, "UMMCR2",
999 &spr_read_ureg, SPR_NOACCESS,
1000 &spr_read_ureg, SPR_NOACCESS,
1001 0x00000000);
1003 spr_register(env, SPR_BAMR, "BAMR",
1004 SPR_NOACCESS, SPR_NOACCESS,
1005 &spr_read_generic, &spr_write_generic,
1006 0x00000000);
1008 spr_register(env, SPR_MSSCR0, "MSSCR0",
1009 SPR_NOACCESS, SPR_NOACCESS,
1010 &spr_read_generic, &spr_write_generic,
1011 0x00000000);
1012 /* Hardware implementation registers */
1013 spr_register(env, SPR_HID0, "HID0",
1014 SPR_NOACCESS, SPR_NOACCESS,
1015 &spr_read_generic, &spr_write_generic,
1016 0x00000000);
1018 spr_register(env, SPR_HID1, "HID1",
1019 SPR_NOACCESS, SPR_NOACCESS,
1020 &spr_read_generic, &spr_write_generic,
1021 0x00000000);
1022 /* Altivec */
1023 spr_register(env, SPR_VRSAVE, "VRSAVE",
1024 &spr_read_generic, &spr_write_generic,
1025 &spr_read_generic, &spr_write_generic,
1026 0x00000000);
1028 spr_register(env, SPR_L2CR, "L2CR",
1029 SPR_NOACCESS, SPR_NOACCESS,
1030 &spr_read_generic, spr_access_nop,
1031 0x00000000);
1034 static void register_l3_ctrl(CPUPPCState *env)
1036 /* L3CR */
1037 spr_register(env, SPR_L3CR, "L3CR",
1038 SPR_NOACCESS, SPR_NOACCESS,
1039 &spr_read_generic, &spr_write_generic,
1040 0x00000000);
1041 /* L3ITCR0 */
1042 spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1043 SPR_NOACCESS, SPR_NOACCESS,
1044 &spr_read_generic, &spr_write_generic,
1045 0x00000000);
1046 /* L3PM */
1047 spr_register(env, SPR_L3PM, "L3PM",
1048 SPR_NOACCESS, SPR_NOACCESS,
1049 &spr_read_generic, &spr_write_generic,
1050 0x00000000);
1053 static void register_usprg3_sprs(CPUPPCState *env)
1055 spr_register(env, SPR_USPRG3, "USPRG3",
1056 &spr_read_ureg, SPR_NOACCESS,
1057 &spr_read_ureg, SPR_NOACCESS,
1058 0x00000000);
1061 static void register_usprgh_sprs(CPUPPCState *env)
1063 spr_register(env, SPR_USPRG4, "USPRG4",
1064 &spr_read_ureg, SPR_NOACCESS,
1065 &spr_read_ureg, SPR_NOACCESS,
1066 0x00000000);
1067 spr_register(env, SPR_USPRG5, "USPRG5",
1068 &spr_read_ureg, SPR_NOACCESS,
1069 &spr_read_ureg, SPR_NOACCESS,
1070 0x00000000);
1071 spr_register(env, SPR_USPRG6, "USPRG6",
1072 &spr_read_ureg, SPR_NOACCESS,
1073 &spr_read_ureg, SPR_NOACCESS,
1074 0x00000000);
1075 spr_register(env, SPR_USPRG7, "USPRG7",
1076 &spr_read_ureg, SPR_NOACCESS,
1077 &spr_read_ureg, SPR_NOACCESS,
1078 0x00000000);
1081 /* PowerPC BookE SPR */
1082 static void register_BookE_sprs(CPUPPCState *env, uint64_t ivor_mask)
1084 const char *ivor_names[64] = {
1085 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
1086 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
1087 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
1088 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1089 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1090 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1091 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1092 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1093 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1094 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1095 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1096 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1097 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1098 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1099 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1100 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1102 #define SPR_BOOKE_IVORxx (-1)
1103 int ivor_sprn[64] = {
1104 SPR_BOOKE_IVOR0, SPR_BOOKE_IVOR1, SPR_BOOKE_IVOR2, SPR_BOOKE_IVOR3,
1105 SPR_BOOKE_IVOR4, SPR_BOOKE_IVOR5, SPR_BOOKE_IVOR6, SPR_BOOKE_IVOR7,
1106 SPR_BOOKE_IVOR8, SPR_BOOKE_IVOR9, SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1107 SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1108 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1109 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1110 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1111 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1112 SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1113 SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
1114 SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
1115 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1116 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1117 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1118 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1119 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1121 int i;
1123 /* Interrupt processing */
1124 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1125 SPR_NOACCESS, SPR_NOACCESS,
1126 &spr_read_generic, &spr_write_generic,
1127 0x00000000);
1128 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1129 SPR_NOACCESS, SPR_NOACCESS,
1130 &spr_read_generic, &spr_write_generic,
1131 0x00000000);
1132 /* Debug */
1133 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1134 SPR_NOACCESS, SPR_NOACCESS,
1135 &spr_read_generic, &spr_write_generic,
1136 0x00000000);
1138 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1139 SPR_NOACCESS, SPR_NOACCESS,
1140 &spr_read_generic, &spr_write_generic,
1141 0x00000000);
1143 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1144 SPR_NOACCESS, SPR_NOACCESS,
1145 &spr_read_generic, &spr_write_generic,
1146 0x00000000);
1148 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1149 SPR_NOACCESS, SPR_NOACCESS,
1150 &spr_read_generic, &spr_write_generic,
1151 0x00000000);
1153 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1154 SPR_NOACCESS, SPR_NOACCESS,
1155 &spr_read_generic, &spr_write_40x_dbcr0,
1156 0x00000000);
1158 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1159 SPR_NOACCESS, SPR_NOACCESS,
1160 &spr_read_generic, &spr_write_generic,
1161 0x00000000);
1163 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1164 SPR_NOACCESS, SPR_NOACCESS,
1165 &spr_read_generic, &spr_write_generic,
1166 0x00000000);
1167 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1168 SPR_NOACCESS, SPR_NOACCESS,
1169 &spr_read_generic, &spr_write_generic,
1170 0x00000000);
1171 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1172 SPR_NOACCESS, SPR_NOACCESS,
1173 &spr_read_generic, &spr_write_generic,
1174 0x00000000);
1176 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1177 SPR_NOACCESS, SPR_NOACCESS,
1178 &spr_read_generic, &spr_write_clear,
1179 0x00000000);
1180 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1181 SPR_NOACCESS, SPR_NOACCESS,
1182 &spr_read_generic, &spr_write_generic,
1183 0x00000000);
1184 spr_register(env, SPR_BOOKE_ESR, "ESR",
1185 SPR_NOACCESS, SPR_NOACCESS,
1186 &spr_read_generic, &spr_write_generic,
1187 0x00000000);
1188 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1189 SPR_NOACCESS, SPR_NOACCESS,
1190 &spr_read_generic, &spr_write_excp_prefix,
1191 0x00000000);
1192 /* Exception vectors */
1193 for (i = 0; i < 64; i++) {
1194 if (ivor_mask & (1ULL << i)) {
1195 if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1196 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1197 exit(1);
1199 spr_register(env, ivor_sprn[i], ivor_names[i],
1200 SPR_NOACCESS, SPR_NOACCESS,
1201 &spr_read_generic, &spr_write_excp_vector,
1202 0x00000000);
1205 spr_register(env, SPR_BOOKE_PID, "PID",
1206 SPR_NOACCESS, SPR_NOACCESS,
1207 &spr_read_generic, &spr_write_booke_pid,
1208 0x00000000);
1209 spr_register(env, SPR_BOOKE_TCR, "TCR",
1210 SPR_NOACCESS, SPR_NOACCESS,
1211 &spr_read_generic, &spr_write_booke_tcr,
1212 0x00000000);
1213 spr_register(env, SPR_BOOKE_TSR, "TSR",
1214 SPR_NOACCESS, SPR_NOACCESS,
1215 &spr_read_generic, &spr_write_booke_tsr,
1216 0x00000000);
1217 /* Timer */
1218 spr_register(env, SPR_DECR, "DECR",
1219 SPR_NOACCESS, SPR_NOACCESS,
1220 &spr_read_decr, &spr_write_decr,
1221 0x00000000);
1222 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1223 SPR_NOACCESS, SPR_NOACCESS,
1224 SPR_NOACCESS, &spr_write_generic,
1225 0x00000000);
1226 /* SPRGs */
1227 spr_register(env, SPR_USPRG0, "USPRG0",
1228 &spr_read_generic, &spr_write_generic,
1229 &spr_read_generic, &spr_write_generic,
1230 0x00000000);
1231 spr_register(env, SPR_SPRG4, "SPRG4",
1232 SPR_NOACCESS, SPR_NOACCESS,
1233 &spr_read_generic, &spr_write_generic,
1234 0x00000000);
1235 spr_register(env, SPR_SPRG5, "SPRG5",
1236 SPR_NOACCESS, SPR_NOACCESS,
1237 &spr_read_generic, &spr_write_generic,
1238 0x00000000);
1239 spr_register(env, SPR_SPRG6, "SPRG6",
1240 SPR_NOACCESS, SPR_NOACCESS,
1241 &spr_read_generic, &spr_write_generic,
1242 0x00000000);
1243 spr_register(env, SPR_SPRG7, "SPRG7",
1244 SPR_NOACCESS, SPR_NOACCESS,
1245 &spr_read_generic, &spr_write_generic,
1246 0x00000000);
1247 spr_register(env, SPR_BOOKE_SPRG8, "SPRG8",
1248 SPR_NOACCESS, SPR_NOACCESS,
1249 &spr_read_generic, &spr_write_generic,
1250 0x00000000);
1251 spr_register(env, SPR_BOOKE_SPRG9, "SPRG9",
1252 SPR_NOACCESS, SPR_NOACCESS,
1253 &spr_read_generic, &spr_write_generic,
1254 0x00000000);
1257 #if !defined(CONFIG_USER_ONLY)
1258 static inline uint32_t register_tlbncfg(uint32_t assoc, uint32_t minsize,
1259 uint32_t maxsize, uint32_t flags,
1260 uint32_t nentries)
1262 return (assoc << TLBnCFG_ASSOC_SHIFT) |
1263 (minsize << TLBnCFG_MINSIZE_SHIFT) |
1264 (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
1265 flags | nentries;
1267 #endif /* !CONFIG_USER_ONLY */
1269 /* BookE 2.06 storage control registers */
1270 static void register_BookE206_sprs(CPUPPCState *env, uint32_t mas_mask,
1271 uint32_t *tlbncfg, uint32_t mmucfg)
1273 #if !defined(CONFIG_USER_ONLY)
1274 const char *mas_names[8] = {
1275 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1277 int mas_sprn[8] = {
1278 SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1279 SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1281 int i;
1283 /* TLB assist registers */
1284 for (i = 0; i < 8; i++) {
1285 if (mas_mask & (1 << i)) {
1286 spr_register(env, mas_sprn[i], mas_names[i],
1287 SPR_NOACCESS, SPR_NOACCESS,
1288 &spr_read_generic,
1289 (i == 2 && (env->insns_flags & PPC_64B))
1290 ? &spr_write_generic : &spr_write_generic32,
1291 0x00000000);
1294 if (env->nb_pids > 1) {
1295 spr_register(env, SPR_BOOKE_PID1, "PID1",
1296 SPR_NOACCESS, SPR_NOACCESS,
1297 &spr_read_generic, &spr_write_booke_pid,
1298 0x00000000);
1300 if (env->nb_pids > 2) {
1301 spr_register(env, SPR_BOOKE_PID2, "PID2",
1302 SPR_NOACCESS, SPR_NOACCESS,
1303 &spr_read_generic, &spr_write_booke_pid,
1304 0x00000000);
1307 spr_register(env, SPR_BOOKE_EPLC, "EPLC",
1308 SPR_NOACCESS, SPR_NOACCESS,
1309 &spr_read_generic, &spr_write_eplc,
1310 0x00000000);
1311 spr_register(env, SPR_BOOKE_EPSC, "EPSC",
1312 SPR_NOACCESS, SPR_NOACCESS,
1313 &spr_read_generic, &spr_write_epsc,
1314 0x00000000);
1316 spr_register(env, SPR_MMUCFG, "MMUCFG",
1317 SPR_NOACCESS, SPR_NOACCESS,
1318 &spr_read_generic, SPR_NOACCESS,
1319 mmucfg);
1320 switch (env->nb_ways) {
1321 case 4:
1322 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1323 SPR_NOACCESS, SPR_NOACCESS,
1324 &spr_read_generic, SPR_NOACCESS,
1325 tlbncfg[3]);
1326 /* Fallthru */
1327 case 3:
1328 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1329 SPR_NOACCESS, SPR_NOACCESS,
1330 &spr_read_generic, SPR_NOACCESS,
1331 tlbncfg[2]);
1332 /* Fallthru */
1333 case 2:
1334 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1335 SPR_NOACCESS, SPR_NOACCESS,
1336 &spr_read_generic, SPR_NOACCESS,
1337 tlbncfg[1]);
1338 /* Fallthru */
1339 case 1:
1340 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1341 SPR_NOACCESS, SPR_NOACCESS,
1342 &spr_read_generic, SPR_NOACCESS,
1343 tlbncfg[0]);
1344 /* Fallthru */
1345 case 0:
1346 default:
1347 break;
1349 #endif
1352 /* SPR specific to PowerPC 440 implementation */
1353 static void register_440_sprs(CPUPPCState *env)
1355 /* Cache control */
1356 spr_register(env, SPR_440_DNV0, "DNV0",
1357 SPR_NOACCESS, SPR_NOACCESS,
1358 &spr_read_generic, &spr_write_generic,
1359 0x00000000);
1361 spr_register(env, SPR_440_DNV1, "DNV1",
1362 SPR_NOACCESS, SPR_NOACCESS,
1363 &spr_read_generic, &spr_write_generic,
1364 0x00000000);
1366 spr_register(env, SPR_440_DNV2, "DNV2",
1367 SPR_NOACCESS, SPR_NOACCESS,
1368 &spr_read_generic, &spr_write_generic,
1369 0x00000000);
1371 spr_register(env, SPR_440_DNV3, "DNV3",
1372 SPR_NOACCESS, SPR_NOACCESS,
1373 &spr_read_generic, &spr_write_generic,
1374 0x00000000);
1376 spr_register(env, SPR_440_DTV0, "DTV0",
1377 SPR_NOACCESS, SPR_NOACCESS,
1378 &spr_read_generic, &spr_write_generic,
1379 0x00000000);
1381 spr_register(env, SPR_440_DTV1, "DTV1",
1382 SPR_NOACCESS, SPR_NOACCESS,
1383 &spr_read_generic, &spr_write_generic,
1384 0x00000000);
1386 spr_register(env, SPR_440_DTV2, "DTV2",
1387 SPR_NOACCESS, SPR_NOACCESS,
1388 &spr_read_generic, &spr_write_generic,
1389 0x00000000);
1391 spr_register(env, SPR_440_DTV3, "DTV3",
1392 SPR_NOACCESS, SPR_NOACCESS,
1393 &spr_read_generic, &spr_write_generic,
1394 0x00000000);
1396 spr_register(env, SPR_440_DVLIM, "DVLIM",
1397 SPR_NOACCESS, SPR_NOACCESS,
1398 &spr_read_generic, &spr_write_generic,
1399 0x00000000);
1401 spr_register(env, SPR_440_INV0, "INV0",
1402 SPR_NOACCESS, SPR_NOACCESS,
1403 &spr_read_generic, &spr_write_generic,
1404 0x00000000);
1406 spr_register(env, SPR_440_INV1, "INV1",
1407 SPR_NOACCESS, SPR_NOACCESS,
1408 &spr_read_generic, &spr_write_generic,
1409 0x00000000);
1411 spr_register(env, SPR_440_INV2, "INV2",
1412 SPR_NOACCESS, SPR_NOACCESS,
1413 &spr_read_generic, &spr_write_generic,
1414 0x00000000);
1416 spr_register(env, SPR_440_INV3, "INV3",
1417 SPR_NOACCESS, SPR_NOACCESS,
1418 &spr_read_generic, &spr_write_generic,
1419 0x00000000);
1421 spr_register(env, SPR_440_ITV0, "ITV0",
1422 SPR_NOACCESS, SPR_NOACCESS,
1423 &spr_read_generic, &spr_write_generic,
1424 0x00000000);
1426 spr_register(env, SPR_440_ITV1, "ITV1",
1427 SPR_NOACCESS, SPR_NOACCESS,
1428 &spr_read_generic, &spr_write_generic,
1429 0x00000000);
1431 spr_register(env, SPR_440_ITV2, "ITV2",
1432 SPR_NOACCESS, SPR_NOACCESS,
1433 &spr_read_generic, &spr_write_generic,
1434 0x00000000);
1436 spr_register(env, SPR_440_ITV3, "ITV3",
1437 SPR_NOACCESS, SPR_NOACCESS,
1438 &spr_read_generic, &spr_write_generic,
1439 0x00000000);
1441 spr_register(env, SPR_440_IVLIM, "IVLIM",
1442 SPR_NOACCESS, SPR_NOACCESS,
1443 &spr_read_generic, &spr_write_generic,
1444 0x00000000);
1445 /* Cache debug */
1446 spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
1447 SPR_NOACCESS, SPR_NOACCESS,
1448 &spr_read_generic, SPR_NOACCESS,
1449 0x00000000);
1451 spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
1452 SPR_NOACCESS, SPR_NOACCESS,
1453 &spr_read_generic, SPR_NOACCESS,
1454 0x00000000);
1456 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1457 SPR_NOACCESS, SPR_NOACCESS,
1458 &spr_read_generic, SPR_NOACCESS,
1459 0x00000000);
1461 spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
1462 SPR_NOACCESS, SPR_NOACCESS,
1463 &spr_read_generic, SPR_NOACCESS,
1464 0x00000000);
1466 spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
1467 SPR_NOACCESS, SPR_NOACCESS,
1468 &spr_read_generic, SPR_NOACCESS,
1469 0x00000000);
1471 spr_register(env, SPR_440_DBDR, "DBDR",
1472 SPR_NOACCESS, SPR_NOACCESS,
1473 &spr_read_generic, &spr_write_generic,
1474 0x00000000);
1475 /* Processor control */
1476 spr_register(env, SPR_4xx_CCR0, "CCR0",
1477 SPR_NOACCESS, SPR_NOACCESS,
1478 &spr_read_generic, &spr_write_generic,
1479 0x00000000);
1480 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1481 SPR_NOACCESS, SPR_NOACCESS,
1482 &spr_read_generic, SPR_NOACCESS,
1483 0x00000000);
1484 /* Storage control */
1485 spr_register(env, SPR_440_MMUCR, "MMUCR",
1486 SPR_NOACCESS, SPR_NOACCESS,
1487 &spr_read_generic, &spr_write_generic,
1488 0x00000000);
1490 /* Processor identification */
1491 spr_register(env, SPR_BOOKE_PIR, "PIR",
1492 SPR_NOACCESS, SPR_NOACCESS,
1493 &spr_read_generic, &spr_write_pir,
1494 0x00000000);
1496 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1497 SPR_NOACCESS, SPR_NOACCESS,
1498 &spr_read_generic, &spr_write_generic,
1499 0x00000000);
1501 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1502 SPR_NOACCESS, SPR_NOACCESS,
1503 &spr_read_generic, &spr_write_generic,
1504 0x00000000);
1506 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1507 SPR_NOACCESS, SPR_NOACCESS,
1508 &spr_read_generic, &spr_write_generic,
1509 0x00000000);
1511 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1512 SPR_NOACCESS, SPR_NOACCESS,
1513 &spr_read_generic, &spr_write_generic,
1514 0x00000000);
1517 /* SPR shared between PowerPC 40x implementations */
1518 static void register_40x_sprs(CPUPPCState *env)
1520 /* Cache */
1521 /* not emulated, as QEMU do not emulate caches */
1522 spr_register(env, SPR_40x_DCCR, "DCCR",
1523 SPR_NOACCESS, SPR_NOACCESS,
1524 &spr_read_generic, &spr_write_generic,
1525 0x00000000);
1526 /* not emulated, as QEMU do not emulate caches */
1527 spr_register(env, SPR_40x_ICCR, "ICCR",
1528 SPR_NOACCESS, SPR_NOACCESS,
1529 &spr_read_generic, &spr_write_generic,
1530 0x00000000);
1531 /* not emulated, as QEMU do not emulate caches */
1532 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1533 SPR_NOACCESS, SPR_NOACCESS,
1534 &spr_read_generic, SPR_NOACCESS,
1535 0x00000000);
1536 /* Exception */
1537 spr_register(env, SPR_40x_DEAR, "DEAR",
1538 SPR_NOACCESS, SPR_NOACCESS,
1539 &spr_read_generic, &spr_write_generic,
1540 0x00000000);
1541 spr_register(env, SPR_40x_ESR, "ESR",
1542 SPR_NOACCESS, SPR_NOACCESS,
1543 &spr_read_generic, &spr_write_generic,
1544 0x00000000);
1545 spr_register(env, SPR_40x_EVPR, "EVPR",
1546 SPR_NOACCESS, SPR_NOACCESS,
1547 &spr_read_generic, &spr_write_excp_prefix,
1548 0x00000000);
1549 spr_register(env, SPR_40x_SRR2, "SRR2",
1550 &spr_read_generic, &spr_write_generic,
1551 &spr_read_generic, &spr_write_generic,
1552 0x00000000);
1553 spr_register(env, SPR_40x_SRR3, "SRR3",
1554 &spr_read_generic, &spr_write_generic,
1555 &spr_read_generic, &spr_write_generic,
1556 0x00000000);
1557 /* Timers */
1558 spr_register(env, SPR_40x_PIT, "PIT",
1559 SPR_NOACCESS, SPR_NOACCESS,
1560 &spr_read_40x_pit, &spr_write_40x_pit,
1561 0x00000000);
1562 spr_register(env, SPR_40x_TCR, "TCR",
1563 SPR_NOACCESS, SPR_NOACCESS,
1564 &spr_read_generic, &spr_write_40x_tcr,
1565 0x00000000);
1566 spr_register(env, SPR_40x_TSR, "TSR",
1567 SPR_NOACCESS, SPR_NOACCESS,
1568 &spr_read_generic, &spr_write_40x_tsr,
1569 0x00000000);
1572 /* SPR specific to PowerPC 405 implementation */
1573 static void register_405_sprs(CPUPPCState *env)
1575 /* MMU */
1576 spr_register(env, SPR_40x_PID, "PID",
1577 SPR_NOACCESS, SPR_NOACCESS,
1578 &spr_read_generic, &spr_write_40x_pid,
1579 0x00000000);
1580 spr_register(env, SPR_4xx_CCR0, "CCR0",
1581 SPR_NOACCESS, SPR_NOACCESS,
1582 &spr_read_generic, &spr_write_generic,
1583 0x00700000);
1584 /* Debug interface */
1585 spr_register(env, SPR_40x_DBCR0, "DBCR0",
1586 SPR_NOACCESS, SPR_NOACCESS,
1587 &spr_read_generic, &spr_write_40x_dbcr0,
1588 0x00000000);
1590 spr_register(env, SPR_405_DBCR1, "DBCR1",
1591 SPR_NOACCESS, SPR_NOACCESS,
1592 &spr_read_generic, &spr_write_generic,
1593 0x00000000);
1595 spr_register(env, SPR_40x_DBSR, "DBSR",
1596 SPR_NOACCESS, SPR_NOACCESS,
1597 &spr_read_generic, &spr_write_clear,
1598 /* Last reset was system reset */
1599 0x00000300);
1601 spr_register(env, SPR_40x_DAC1, "DAC1",
1602 SPR_NOACCESS, SPR_NOACCESS,
1603 &spr_read_generic, &spr_write_generic,
1604 0x00000000);
1605 spr_register(env, SPR_40x_DAC2, "DAC2",
1606 SPR_NOACCESS, SPR_NOACCESS,
1607 &spr_read_generic, &spr_write_generic,
1608 0x00000000);
1610 spr_register(env, SPR_405_DVC1, "DVC1",
1611 SPR_NOACCESS, SPR_NOACCESS,
1612 &spr_read_generic, &spr_write_generic,
1613 0x00000000);
1615 spr_register(env, SPR_405_DVC2, "DVC2",
1616 SPR_NOACCESS, SPR_NOACCESS,
1617 &spr_read_generic, &spr_write_generic,
1618 0x00000000);
1620 spr_register(env, SPR_40x_IAC1, "IAC1",
1621 SPR_NOACCESS, SPR_NOACCESS,
1622 &spr_read_generic, &spr_write_generic,
1623 0x00000000);
1624 spr_register(env, SPR_40x_IAC2, "IAC2",
1625 SPR_NOACCESS, SPR_NOACCESS,
1626 &spr_read_generic, &spr_write_generic,
1627 0x00000000);
1629 spr_register(env, SPR_405_IAC3, "IAC3",
1630 SPR_NOACCESS, SPR_NOACCESS,
1631 &spr_read_generic, &spr_write_generic,
1632 0x00000000);
1634 spr_register(env, SPR_405_IAC4, "IAC4",
1635 SPR_NOACCESS, SPR_NOACCESS,
1636 &spr_read_generic, &spr_write_generic,
1637 0x00000000);
1638 /* Storage control */
1639 spr_register(env, SPR_405_SLER, "SLER",
1640 SPR_NOACCESS, SPR_NOACCESS,
1641 &spr_read_generic, &spr_write_40x_sler,
1642 0x00000000);
1643 spr_register(env, SPR_40x_ZPR, "ZPR",
1644 SPR_NOACCESS, SPR_NOACCESS,
1645 &spr_read_generic, &spr_write_generic,
1646 0x00000000);
1648 spr_register(env, SPR_405_SU0R, "SU0R",
1649 SPR_NOACCESS, SPR_NOACCESS,
1650 &spr_read_generic, &spr_write_generic,
1651 0x00000000);
1652 /* SPRG */
1653 spr_register(env, SPR_USPRG0, "USPRG0",
1654 &spr_read_ureg, SPR_NOACCESS,
1655 &spr_read_ureg, SPR_NOACCESS,
1656 0x00000000);
1657 spr_register(env, SPR_SPRG4, "SPRG4",
1658 SPR_NOACCESS, SPR_NOACCESS,
1659 &spr_read_generic, &spr_write_generic,
1660 0x00000000);
1661 spr_register(env, SPR_SPRG5, "SPRG5",
1662 SPR_NOACCESS, SPR_NOACCESS,
1663 spr_read_generic, &spr_write_generic,
1664 0x00000000);
1665 spr_register(env, SPR_SPRG6, "SPRG6",
1666 SPR_NOACCESS, SPR_NOACCESS,
1667 spr_read_generic, &spr_write_generic,
1668 0x00000000);
1669 spr_register(env, SPR_SPRG7, "SPRG7",
1670 SPR_NOACCESS, SPR_NOACCESS,
1671 spr_read_generic, &spr_write_generic,
1672 0x00000000);
1674 /* Bus access control */
1675 /* not emulated, as QEMU never does speculative access */
1676 spr_register(env, SPR_40x_SGR, "SGR",
1677 SPR_NOACCESS, SPR_NOACCESS,
1678 &spr_read_generic, &spr_write_generic,
1679 0xFFFFFFFF);
1680 /* not emulated, as QEMU do not emulate caches */
1681 spr_register(env, SPR_40x_DCWR, "DCWR",
1682 SPR_NOACCESS, SPR_NOACCESS,
1683 &spr_read_generic, &spr_write_generic,
1684 0x00000000);
1688 static void register_5xx_8xx_sprs(CPUPPCState *env)
1690 /* Exception processing */
1691 spr_register_kvm(env, SPR_DSISR, "DSISR",
1692 SPR_NOACCESS, SPR_NOACCESS,
1693 &spr_read_generic, &spr_write_generic,
1694 KVM_REG_PPC_DSISR, 0x00000000);
1695 spr_register_kvm(env, SPR_DAR, "DAR",
1696 SPR_NOACCESS, SPR_NOACCESS,
1697 &spr_read_generic, &spr_write_generic,
1698 KVM_REG_PPC_DAR, 0x00000000);
1699 /* Timer */
1700 spr_register(env, SPR_DECR, "DECR",
1701 SPR_NOACCESS, SPR_NOACCESS,
1702 &spr_read_decr, &spr_write_decr,
1703 0x00000000);
1705 spr_register(env, SPR_MPC_EIE, "EIE",
1706 SPR_NOACCESS, SPR_NOACCESS,
1707 &spr_read_generic, &spr_write_generic,
1708 0x00000000);
1710 spr_register(env, SPR_MPC_EID, "EID",
1711 SPR_NOACCESS, SPR_NOACCESS,
1712 &spr_read_generic, &spr_write_generic,
1713 0x00000000);
1715 spr_register(env, SPR_MPC_NRI, "NRI",
1716 SPR_NOACCESS, SPR_NOACCESS,
1717 &spr_read_generic, &spr_write_generic,
1718 0x00000000);
1720 spr_register(env, SPR_MPC_CMPA, "CMPA",
1721 SPR_NOACCESS, SPR_NOACCESS,
1722 &spr_read_generic, &spr_write_generic,
1723 0x00000000);
1725 spr_register(env, SPR_MPC_CMPB, "CMPB",
1726 SPR_NOACCESS, SPR_NOACCESS,
1727 &spr_read_generic, &spr_write_generic,
1728 0x00000000);
1730 spr_register(env, SPR_MPC_CMPC, "CMPC",
1731 SPR_NOACCESS, SPR_NOACCESS,
1732 &spr_read_generic, &spr_write_generic,
1733 0x00000000);
1735 spr_register(env, SPR_MPC_CMPD, "CMPD",
1736 SPR_NOACCESS, SPR_NOACCESS,
1737 &spr_read_generic, &spr_write_generic,
1738 0x00000000);
1740 spr_register(env, SPR_MPC_ECR, "ECR",
1741 SPR_NOACCESS, SPR_NOACCESS,
1742 &spr_read_generic, &spr_write_generic,
1743 0x00000000);
1745 spr_register(env, SPR_MPC_DER, "DER",
1746 SPR_NOACCESS, SPR_NOACCESS,
1747 &spr_read_generic, &spr_write_generic,
1748 0x00000000);
1750 spr_register(env, SPR_MPC_COUNTA, "COUNTA",
1751 SPR_NOACCESS, SPR_NOACCESS,
1752 &spr_read_generic, &spr_write_generic,
1753 0x00000000);
1755 spr_register(env, SPR_MPC_COUNTB, "COUNTB",
1756 SPR_NOACCESS, SPR_NOACCESS,
1757 &spr_read_generic, &spr_write_generic,
1758 0x00000000);
1760 spr_register(env, SPR_MPC_CMPE, "CMPE",
1761 SPR_NOACCESS, SPR_NOACCESS,
1762 &spr_read_generic, &spr_write_generic,
1763 0x00000000);
1765 spr_register(env, SPR_MPC_CMPF, "CMPF",
1766 SPR_NOACCESS, SPR_NOACCESS,
1767 &spr_read_generic, &spr_write_generic,
1768 0x00000000);
1770 spr_register(env, SPR_MPC_CMPG, "CMPG",
1771 SPR_NOACCESS, SPR_NOACCESS,
1772 &spr_read_generic, &spr_write_generic,
1773 0x00000000);
1775 spr_register(env, SPR_MPC_CMPH, "CMPH",
1776 SPR_NOACCESS, SPR_NOACCESS,
1777 &spr_read_generic, &spr_write_generic,
1778 0x00000000);
1780 spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
1781 SPR_NOACCESS, SPR_NOACCESS,
1782 &spr_read_generic, &spr_write_generic,
1783 0x00000000);
1785 spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
1786 SPR_NOACCESS, SPR_NOACCESS,
1787 &spr_read_generic, &spr_write_generic,
1788 0x00000000);
1790 spr_register(env, SPR_MPC_BAR, "BAR",
1791 SPR_NOACCESS, SPR_NOACCESS,
1792 &spr_read_generic, &spr_write_generic,
1793 0x00000000);
1795 spr_register(env, SPR_MPC_DPDR, "DPDR",
1796 SPR_NOACCESS, SPR_NOACCESS,
1797 &spr_read_generic, &spr_write_generic,
1798 0x00000000);
1800 spr_register(env, SPR_MPC_IMMR, "IMMR",
1801 SPR_NOACCESS, SPR_NOACCESS,
1802 &spr_read_generic, &spr_write_generic,
1803 0x00000000);
1806 static void register_5xx_sprs(CPUPPCState *env)
1808 spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
1809 SPR_NOACCESS, SPR_NOACCESS,
1810 &spr_read_generic, &spr_write_generic,
1811 0x00000000);
1813 spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
1814 SPR_NOACCESS, SPR_NOACCESS,
1815 &spr_read_generic, &spr_write_generic,
1816 0x00000000);
1818 spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
1819 SPR_NOACCESS, SPR_NOACCESS,
1820 &spr_read_generic, &spr_write_generic,
1821 0x00000000);
1823 spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
1824 SPR_NOACCESS, SPR_NOACCESS,
1825 &spr_read_generic, &spr_write_generic,
1826 0x00000000);
1828 spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
1829 SPR_NOACCESS, SPR_NOACCESS,
1830 &spr_read_generic, &spr_write_generic,
1831 0x00000000);
1833 spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
1834 SPR_NOACCESS, SPR_NOACCESS,
1835 &spr_read_generic, &spr_write_generic,
1836 0x00000000);
1838 spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
1839 SPR_NOACCESS, SPR_NOACCESS,
1840 &spr_read_generic, &spr_write_generic,
1841 0x00000000);
1843 spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
1844 SPR_NOACCESS, SPR_NOACCESS,
1845 &spr_read_generic, &spr_write_generic,
1846 0x00000000);
1848 spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
1849 SPR_NOACCESS, SPR_NOACCESS,
1850 &spr_read_generic, &spr_write_generic,
1851 0x00000000);
1853 spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
1854 SPR_NOACCESS, SPR_NOACCESS,
1855 &spr_read_generic, &spr_write_generic,
1856 0x00000000);
1858 spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
1859 SPR_NOACCESS, SPR_NOACCESS,
1860 &spr_read_generic, &spr_write_generic,
1861 0x00000000);
1863 spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
1864 SPR_NOACCESS, SPR_NOACCESS,
1865 &spr_read_generic, &spr_write_generic,
1866 0x00000000);
1868 spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
1869 SPR_NOACCESS, SPR_NOACCESS,
1870 &spr_read_generic, &spr_write_generic,
1871 0x00000000);
1873 spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
1874 SPR_NOACCESS, SPR_NOACCESS,
1875 &spr_read_generic, &spr_write_generic,
1876 0x00000000);
1878 spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
1879 SPR_NOACCESS, SPR_NOACCESS,
1880 &spr_read_generic, &spr_write_generic,
1881 0x00000000);
1883 spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
1884 SPR_NOACCESS, SPR_NOACCESS,
1885 &spr_read_generic, &spr_write_generic,
1886 0x00000000);
1888 spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
1889 SPR_NOACCESS, SPR_NOACCESS,
1890 &spr_read_generic, &spr_write_generic,
1891 0x00000000);
1893 spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
1894 SPR_NOACCESS, SPR_NOACCESS,
1895 &spr_read_generic, &spr_write_generic,
1896 0x00000000);
1898 spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
1899 SPR_NOACCESS, SPR_NOACCESS,
1900 &spr_read_generic, &spr_write_generic,
1901 0x00000000);
1903 spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
1904 SPR_NOACCESS, SPR_NOACCESS,
1905 &spr_read_generic, &spr_write_generic,
1906 0x00000000);
1908 spr_register(env, SPR_RCPU_FPECR, "FPECR",
1909 SPR_NOACCESS, SPR_NOACCESS,
1910 &spr_read_generic, &spr_write_generic,
1911 0x00000000);
1914 static void register_8xx_sprs(CPUPPCState *env)
1917 spr_register(env, SPR_MPC_IC_CST, "IC_CST",
1918 SPR_NOACCESS, SPR_NOACCESS,
1919 &spr_read_generic, &spr_write_generic,
1920 0x00000000);
1922 spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
1923 SPR_NOACCESS, SPR_NOACCESS,
1924 &spr_read_generic, &spr_write_generic,
1925 0x00000000);
1927 spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
1928 SPR_NOACCESS, SPR_NOACCESS,
1929 &spr_read_generic, &spr_write_generic,
1930 0x00000000);
1932 spr_register(env, SPR_MPC_DC_CST, "DC_CST",
1933 SPR_NOACCESS, SPR_NOACCESS,
1934 &spr_read_generic, &spr_write_generic,
1935 0x00000000);
1937 spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
1938 SPR_NOACCESS, SPR_NOACCESS,
1939 &spr_read_generic, &spr_write_generic,
1940 0x00000000);
1942 spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
1943 SPR_NOACCESS, SPR_NOACCESS,
1944 &spr_read_generic, &spr_write_generic,
1945 0x00000000);
1947 spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
1948 SPR_NOACCESS, SPR_NOACCESS,
1949 &spr_read_generic, &spr_write_generic,
1950 0x00000000);
1952 spr_register(env, SPR_MPC_MI_AP, "MI_AP",
1953 SPR_NOACCESS, SPR_NOACCESS,
1954 &spr_read_generic, &spr_write_generic,
1955 0x00000000);
1957 spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
1958 SPR_NOACCESS, SPR_NOACCESS,
1959 &spr_read_generic, &spr_write_generic,
1960 0x00000000);
1962 spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
1963 SPR_NOACCESS, SPR_NOACCESS,
1964 &spr_read_generic, &spr_write_generic,
1965 0x00000000);
1967 spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
1968 SPR_NOACCESS, SPR_NOACCESS,
1969 &spr_read_generic, &spr_write_generic,
1970 0x00000000);
1972 spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
1973 SPR_NOACCESS, SPR_NOACCESS,
1974 &spr_read_generic, &spr_write_generic,
1975 0x00000000);
1977 spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
1978 SPR_NOACCESS, SPR_NOACCESS,
1979 &spr_read_generic, &spr_write_generic,
1980 0x00000000);
1982 spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
1983 SPR_NOACCESS, SPR_NOACCESS,
1984 &spr_read_generic, &spr_write_generic,
1985 0x00000000);
1987 spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
1988 SPR_NOACCESS, SPR_NOACCESS,
1989 &spr_read_generic, &spr_write_generic,
1990 0x00000000);
1992 spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
1993 SPR_NOACCESS, SPR_NOACCESS,
1994 &spr_read_generic, &spr_write_generic,
1995 0x00000000);
1997 spr_register(env, SPR_MPC_MD_AP, "MD_AP",
1998 SPR_NOACCESS, SPR_NOACCESS,
1999 &spr_read_generic, &spr_write_generic,
2000 0x00000000);
2002 spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2003 SPR_NOACCESS, SPR_NOACCESS,
2004 &spr_read_generic, &spr_write_generic,
2005 0x00000000);
2007 spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2008 SPR_NOACCESS, SPR_NOACCESS,
2009 &spr_read_generic, &spr_write_generic,
2010 0x00000000);
2012 spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2013 SPR_NOACCESS, SPR_NOACCESS,
2014 &spr_read_generic, &spr_write_generic,
2015 0x00000000);
2017 spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2018 SPR_NOACCESS, SPR_NOACCESS,
2019 &spr_read_generic, &spr_write_generic,
2020 0x00000000);
2022 spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2023 SPR_NOACCESS, SPR_NOACCESS,
2024 &spr_read_generic, &spr_write_generic,
2025 0x00000000);
2027 spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2028 SPR_NOACCESS, SPR_NOACCESS,
2029 &spr_read_generic, &spr_write_generic,
2030 0x00000000);
2032 spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2033 SPR_NOACCESS, SPR_NOACCESS,
2034 &spr_read_generic, &spr_write_generic,
2035 0x00000000);
2037 spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2038 SPR_NOACCESS, SPR_NOACCESS,
2039 &spr_read_generic, &spr_write_generic,
2040 0x00000000);
2044 * AMR => SPR 29 (Power 2.04)
2045 * CTRL => SPR 136 (Power 2.04)
2046 * CTRL => SPR 152 (Power 2.04)
2047 * SCOMC => SPR 276 (64 bits ?)
2048 * SCOMD => SPR 277 (64 bits ?)
2049 * TBU40 => SPR 286 (Power 2.04 hypv)
2050 * HSPRG0 => SPR 304 (Power 2.04 hypv)
2051 * HSPRG1 => SPR 305 (Power 2.04 hypv)
2052 * HDSISR => SPR 306 (Power 2.04 hypv)
2053 * HDAR => SPR 307 (Power 2.04 hypv)
2054 * PURR => SPR 309 (Power 2.04 hypv)
2055 * HDEC => SPR 310 (Power 2.04 hypv)
2056 * HIOR => SPR 311 (hypv)
2057 * RMOR => SPR 312 (970)
2058 * HRMOR => SPR 313 (Power 2.04 hypv)
2059 * HSRR0 => SPR 314 (Power 2.04 hypv)
2060 * HSRR1 => SPR 315 (Power 2.04 hypv)
2061 * LPIDR => SPR 317 (970)
2062 * EPR => SPR 702 (Power 2.04 emb)
2063 * perf => 768-783 (Power 2.04)
2064 * perf => 784-799 (Power 2.04)
2065 * PPR => SPR 896 (Power 2.04)
2066 * DABRX => 1015 (Power 2.04 hypv)
2067 * FPECR => SPR 1022 (?)
2068 * ... and more (thermal management, performance counters, ...)
2071 /*****************************************************************************/
2072 /* Exception vectors models */
2073 static void init_excp_4xx_softmmu(CPUPPCState *env)
2075 #if !defined(CONFIG_USER_ONLY)
2076 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2077 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2078 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2079 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2080 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2081 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2082 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2083 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2084 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2085 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2086 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2087 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100;
2088 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200;
2089 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2090 env->ivor_mask = 0x0000FFF0UL;
2091 env->ivpr_mask = 0xFFFF0000UL;
2092 /* Hardware reset vector */
2093 env->hreset_vector = 0xFFFFFFFCUL;
2094 #endif
2097 static void init_excp_MPC5xx(CPUPPCState *env)
2099 #if !defined(CONFIG_USER_ONLY)
2100 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2101 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2102 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2103 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2104 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2105 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2106 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2107 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2108 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2109 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2110 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2111 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2112 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2113 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2114 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2115 env->ivor_mask = 0x0000FFF0UL;
2116 env->ivpr_mask = 0xFFFF0000UL;
2117 /* Hardware reset vector */
2118 env->hreset_vector = 0x00000100UL;
2119 #endif
2122 static void init_excp_MPC8xx(CPUPPCState *env)
2124 #if !defined(CONFIG_USER_ONLY)
2125 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2126 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2127 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2128 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2129 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2130 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2131 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2132 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2133 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2134 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2135 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2136 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2137 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2138 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001100;
2139 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001200;
2140 env->excp_vectors[POWERPC_EXCP_ITLBE] = 0x00001300;
2141 env->excp_vectors[POWERPC_EXCP_DTLBE] = 0x00001400;
2142 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2143 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2144 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2145 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2146 env->ivor_mask = 0x0000FFF0UL;
2147 env->ivpr_mask = 0xFFFF0000UL;
2148 /* Hardware reset vector */
2149 env->hreset_vector = 0x00000100UL;
2150 #endif
2153 static void init_excp_G2(CPUPPCState *env)
2155 #if !defined(CONFIG_USER_ONLY)
2156 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2157 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2158 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2159 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2160 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2161 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2162 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2163 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2164 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2165 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2166 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2167 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2168 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2169 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2170 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2171 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2172 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2173 /* Hardware reset vector */
2174 env->hreset_vector = 0x00000100UL;
2175 #endif
2178 static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
2180 #if !defined(CONFIG_USER_ONLY)
2181 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000FFC;
2182 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2183 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2184 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2185 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2186 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2187 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2188 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2189 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2190 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2191 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2192 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2193 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2194 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2195 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2196 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2197 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2199 * These two are the same IVOR as POWERPC_EXCP_VPU and
2200 * POWERPC_EXCP_VPUA. We deal with that when dispatching at
2201 * powerpc_excp().
2203 env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000;
2204 env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000;
2206 env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000;
2207 env->ivor_mask = 0x0000FFF7UL;
2208 env->ivpr_mask = ivpr_mask;
2209 /* Hardware reset vector */
2210 env->hreset_vector = 0xFFFFFFFCUL;
2211 #endif
2214 static void init_excp_BookE(CPUPPCState *env)
2216 #if !defined(CONFIG_USER_ONLY)
2217 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2218 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2219 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2220 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2221 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2222 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2223 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2224 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2225 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2226 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2227 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2228 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2229 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2230 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2231 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2232 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2233 env->ivor_mask = 0x0000FFF0UL;
2234 env->ivpr_mask = 0xFFFF0000UL;
2235 /* Hardware reset vector */
2236 env->hreset_vector = 0xFFFFFFFCUL;
2237 #endif
2240 static void init_excp_603(CPUPPCState *env)
2242 #if !defined(CONFIG_USER_ONLY)
2243 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2244 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2245 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2246 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2247 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2248 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2249 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2250 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2251 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2252 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2253 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2254 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2255 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2256 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2257 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2258 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2259 /* Hardware reset vector */
2260 env->hreset_vector = 0x00000100UL;
2261 #endif
2264 static void init_excp_604(CPUPPCState *env)
2266 #if !defined(CONFIG_USER_ONLY)
2267 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2268 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2269 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2270 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2271 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2272 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2273 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2274 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2275 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2276 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2277 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2278 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2279 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2280 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2281 /* Hardware reset vector */
2282 env->hreset_vector = 0x00000100UL;
2283 #endif
2286 static void init_excp_7x0(CPUPPCState *env)
2288 #if !defined(CONFIG_USER_ONLY)
2289 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2290 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2291 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2292 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2293 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2294 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2295 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2296 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2297 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2298 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2299 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2300 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2301 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2302 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2303 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2304 /* Hardware reset vector */
2305 env->hreset_vector = 0x00000100UL;
2306 #endif
2309 static void init_excp_750cl(CPUPPCState *env)
2311 #if !defined(CONFIG_USER_ONLY)
2312 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2313 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2314 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2315 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2316 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2317 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2318 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2319 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2320 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2321 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2322 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2323 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2324 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2325 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2326 /* Hardware reset vector */
2327 env->hreset_vector = 0x00000100UL;
2328 #endif
2331 static void init_excp_750cx(CPUPPCState *env)
2333 #if !defined(CONFIG_USER_ONLY)
2334 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2335 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2336 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2337 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2338 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2339 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2340 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2341 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2342 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2343 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2344 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2345 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2346 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2347 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2348 /* Hardware reset vector */
2349 env->hreset_vector = 0x00000100UL;
2350 #endif
2353 /* XXX: Check if this is correct */
2354 static void init_excp_7x5(CPUPPCState *env)
2356 #if !defined(CONFIG_USER_ONLY)
2357 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2358 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2359 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2360 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2361 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2362 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2363 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2364 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2365 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2366 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2367 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2368 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2369 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2370 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2371 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2372 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2373 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2374 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2375 /* Hardware reset vector */
2376 env->hreset_vector = 0x00000100UL;
2377 #endif
2380 static void init_excp_7400(CPUPPCState *env)
2382 #if !defined(CONFIG_USER_ONLY)
2383 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2384 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2385 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2386 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2387 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2388 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2389 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2390 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2391 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2392 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2393 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2394 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2395 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2396 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2397 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2398 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
2399 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2400 /* Hardware reset vector */
2401 env->hreset_vector = 0x00000100UL;
2402 #endif
2405 static void init_excp_7450(CPUPPCState *env)
2407 #if !defined(CONFIG_USER_ONLY)
2408 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2409 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2410 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2411 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2412 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2413 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2414 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2415 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2416 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2417 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2418 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2419 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2420 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2421 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2422 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2423 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
2424 /* Hardware reset vector */
2425 env->hreset_vector = 0x00000100UL;
2426 #endif
2429 #if defined(TARGET_PPC64)
2430 static void init_excp_970(CPUPPCState *env)
2432 #if !defined(CONFIG_USER_ONLY)
2433 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2434 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2435 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2436 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
2437 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2438 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
2439 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2440 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2441 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2442 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2443 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2444 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
2445 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2446 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2447 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2448 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2449 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2450 env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
2451 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
2452 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800;
2453 /* Hardware reset vector */
2454 env->hreset_vector = 0x0000000000000100ULL;
2455 #endif
2458 static void init_excp_POWER7(CPUPPCState *env)
2460 #if !defined(CONFIG_USER_ONLY)
2461 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2462 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2463 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2464 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
2465 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2466 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
2467 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2468 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2469 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2470 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2471 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2472 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
2473 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2474 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2475 env->excp_vectors[POWERPC_EXCP_HDSI] = 0x00000E00;
2476 env->excp_vectors[POWERPC_EXCP_HISI] = 0x00000E20;
2477 env->excp_vectors[POWERPC_EXCP_HV_EMU] = 0x00000E40;
2478 env->excp_vectors[POWERPC_EXCP_HV_MAINT] = 0x00000E60;
2479 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2480 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2481 env->excp_vectors[POWERPC_EXCP_VSXU] = 0x00000F40;
2482 /* Hardware reset vector */
2483 env->hreset_vector = 0x0000000000000100ULL;
2484 #endif
2487 static void init_excp_POWER8(CPUPPCState *env)
2489 init_excp_POWER7(env);
2491 #if !defined(CONFIG_USER_ONLY)
2492 env->excp_vectors[POWERPC_EXCP_SDOOR] = 0x00000A00;
2493 env->excp_vectors[POWERPC_EXCP_FU] = 0x00000F60;
2494 env->excp_vectors[POWERPC_EXCP_HV_FU] = 0x00000F80;
2495 env->excp_vectors[POWERPC_EXCP_SDOOR_HV] = 0x00000E80;
2496 #endif
2499 static void init_excp_POWER9(CPUPPCState *env)
2501 init_excp_POWER8(env);
2503 #if !defined(CONFIG_USER_ONLY)
2504 env->excp_vectors[POWERPC_EXCP_HVIRT] = 0x00000EA0;
2505 env->excp_vectors[POWERPC_EXCP_SYSCALL_VECTORED] = 0x00017000;
2506 #endif
2509 static void init_excp_POWER10(CPUPPCState *env)
2511 init_excp_POWER9(env);
2514 #endif
2516 /*****************************************************************************/
2517 /* Power management enable checks */
2518 static int check_pow_none(CPUPPCState *env)
2520 return 0;
2523 static int check_pow_nocheck(CPUPPCState *env)
2525 return 1;
2528 static int check_pow_hid0(CPUPPCState *env)
2530 if (env->spr[SPR_HID0] & 0x00E00000) {
2531 return 1;
2534 return 0;
2537 static int check_pow_hid0_74xx(CPUPPCState *env)
2539 if (env->spr[SPR_HID0] & 0x00600000) {
2540 return 1;
2543 return 0;
2546 /*****************************************************************************/
2547 /* PowerPC implementations definitions */
2549 #define POWERPC_FAMILY(_name) \
2550 static void \
2551 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
2553 static const TypeInfo \
2554 glue(glue(ppc_, _name), _cpu_family_type_info) = { \
2555 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \
2556 .parent = TYPE_POWERPC_CPU, \
2557 .abstract = true, \
2558 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \
2559 }; \
2561 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \
2563 type_register_static( \
2564 &glue(glue(ppc_, _name), _cpu_family_type_info)); \
2567 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \
2569 static void glue(glue(ppc_, _name), _cpu_family_class_init)
2571 static void init_proc_405(CPUPPCState *env)
2573 register_40x_sprs(env);
2574 register_405_sprs(env);
2575 register_usprgh_sprs(env);
2577 /* Memory management */
2578 #if !defined(CONFIG_USER_ONLY)
2579 env->nb_tlb = 64;
2580 env->nb_ways = 1;
2581 env->id_tlbs = 0;
2582 env->tlb_type = TLB_EMB;
2583 #endif
2584 init_excp_4xx_softmmu(env);
2585 env->dcache_line_size = 32;
2586 env->icache_line_size = 32;
2587 /* Allocate hardware IRQ controller */
2588 ppc40x_irq_init(env_archcpu(env));
2590 SET_FIT_PERIOD(8, 12, 16, 20);
2591 SET_WDT_PERIOD(16, 20, 24, 28);
2594 POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
2596 DeviceClass *dc = DEVICE_CLASS(oc);
2597 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2599 dc->desc = "PowerPC 405";
2600 pcc->init_proc = init_proc_405;
2601 pcc->check_pow = check_pow_nocheck;
2602 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
2603 PPC_DCR | PPC_WRTEE |
2604 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
2605 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2606 PPC_MEM_SYNC | PPC_MEM_EIEIO |
2607 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
2608 PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
2609 pcc->msr_mask = (1ull << MSR_WE) |
2610 (1ull << MSR_CE) |
2611 (1ull << MSR_EE) |
2612 (1ull << MSR_PR) |
2613 (1ull << MSR_FP) |
2614 (1ull << MSR_ME) |
2615 (1ull << MSR_DWE) |
2616 (1ull << MSR_DE) |
2617 (1ull << MSR_IR) |
2618 (1ull << MSR_DR);
2619 pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
2620 pcc->excp_model = POWERPC_EXCP_40x;
2621 pcc->bus_model = PPC_FLAGS_INPUT_405;
2622 pcc->bfd_mach = bfd_mach_ppc_403;
2623 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
2624 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
2627 static void init_proc_440EP(CPUPPCState *env)
2629 register_BookE_sprs(env, 0x000000000000FFFFULL);
2630 register_440_sprs(env);
2631 register_usprgh_sprs(env);
2633 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2634 SPR_NOACCESS, SPR_NOACCESS,
2635 &spr_read_generic, &spr_write_generic,
2636 0x00000000);
2637 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2638 SPR_NOACCESS, SPR_NOACCESS,
2639 &spr_read_generic, &spr_write_generic,
2640 0x00000000);
2641 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2642 SPR_NOACCESS, SPR_NOACCESS,
2643 &spr_read_generic, &spr_write_generic,
2644 0x00000000);
2646 spr_register(env, SPR_440_CCR1, "CCR1",
2647 SPR_NOACCESS, SPR_NOACCESS,
2648 &spr_read_generic, &spr_write_generic,
2649 0x00000000);
2650 /* Memory management */
2651 #if !defined(CONFIG_USER_ONLY)
2652 env->nb_tlb = 64;
2653 env->nb_ways = 1;
2654 env->id_tlbs = 0;
2655 env->tlb_type = TLB_EMB;
2656 #endif
2657 init_excp_BookE(env);
2658 env->dcache_line_size = 32;
2659 env->icache_line_size = 32;
2660 ppc40x_irq_init(env_archcpu(env));
2662 SET_FIT_PERIOD(12, 16, 20, 24);
2663 SET_WDT_PERIOD(20, 24, 28, 32);
2666 POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
2668 DeviceClass *dc = DEVICE_CLASS(oc);
2669 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2671 dc->desc = "PowerPC 440 EP";
2672 pcc->init_proc = init_proc_440EP;
2673 pcc->check_pow = check_pow_nocheck;
2674 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2675 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
2676 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
2677 PPC_FLOAT_STFIWX |
2678 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
2679 PPC_CACHE | PPC_CACHE_ICBI |
2680 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2681 PPC_MEM_TLBSYNC | PPC_MFTB |
2682 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
2683 PPC_440_SPEC;
2684 pcc->msr_mask = (1ull << MSR_POW) |
2685 (1ull << MSR_CE) |
2686 (1ull << MSR_EE) |
2687 (1ull << MSR_PR) |
2688 (1ull << MSR_FP) |
2689 (1ull << MSR_ME) |
2690 (1ull << MSR_FE0) |
2691 (1ull << MSR_DWE) |
2692 (1ull << MSR_DE) |
2693 (1ull << MSR_FE1) |
2694 (1ull << MSR_IR) |
2695 (1ull << MSR_DR);
2696 pcc->mmu_model = POWERPC_MMU_BOOKE;
2697 pcc->excp_model = POWERPC_EXCP_BOOKE;
2698 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
2699 pcc->bfd_mach = bfd_mach_ppc_403;
2700 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
2701 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
2704 POWERPC_FAMILY(460EX)(ObjectClass *oc, void *data)
2706 DeviceClass *dc = DEVICE_CLASS(oc);
2707 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2709 dc->desc = "PowerPC 460 EX";
2710 pcc->init_proc = init_proc_440EP;
2711 pcc->check_pow = check_pow_nocheck;
2712 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2713 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
2714 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
2715 PPC_FLOAT_STFIWX |
2716 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_RFMCI |
2717 PPC_CACHE | PPC_CACHE_ICBI |
2718 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2719 PPC_MEM_TLBSYNC | PPC_MFTB |
2720 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
2721 PPC_440_SPEC;
2722 pcc->msr_mask = (1ull << MSR_POW) |
2723 (1ull << MSR_CE) |
2724 (1ull << MSR_EE) |
2725 (1ull << MSR_PR) |
2726 (1ull << MSR_FP) |
2727 (1ull << MSR_ME) |
2728 (1ull << MSR_FE0) |
2729 (1ull << MSR_DWE) |
2730 (1ull << MSR_DE) |
2731 (1ull << MSR_FE1) |
2732 (1ull << MSR_IR) |
2733 (1ull << MSR_DR);
2734 pcc->mmu_model = POWERPC_MMU_BOOKE;
2735 pcc->excp_model = POWERPC_EXCP_BOOKE;
2736 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
2737 pcc->bfd_mach = bfd_mach_ppc_403;
2738 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
2739 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
2742 static void init_proc_440GP(CPUPPCState *env)
2744 register_BookE_sprs(env, 0x000000000000FFFFULL);
2745 register_440_sprs(env);
2746 register_usprgh_sprs(env);
2748 /* Memory management */
2749 #if !defined(CONFIG_USER_ONLY)
2750 env->nb_tlb = 64;
2751 env->nb_ways = 1;
2752 env->id_tlbs = 0;
2753 env->tlb_type = TLB_EMB;
2754 #endif
2755 init_excp_BookE(env);
2756 env->dcache_line_size = 32;
2757 env->icache_line_size = 32;
2758 /* XXX: TODO: allocate internal IRQ controller */
2760 SET_FIT_PERIOD(12, 16, 20, 24);
2761 SET_WDT_PERIOD(20, 24, 28, 32);
2764 POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
2766 DeviceClass *dc = DEVICE_CLASS(oc);
2767 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2769 dc->desc = "PowerPC 440 GP";
2770 pcc->init_proc = init_proc_440GP;
2771 pcc->check_pow = check_pow_nocheck;
2772 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2773 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
2774 PPC_CACHE | PPC_CACHE_ICBI |
2775 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2776 PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
2777 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
2778 PPC_440_SPEC;
2779 pcc->msr_mask = (1ull << MSR_POW) |
2780 (1ull << MSR_CE) |
2781 (1ull << MSR_EE) |
2782 (1ull << MSR_PR) |
2783 (1ull << MSR_FP) |
2784 (1ull << MSR_ME) |
2785 (1ull << MSR_FE0) |
2786 (1ull << MSR_DWE) |
2787 (1ull << MSR_DE) |
2788 (1ull << MSR_FE1) |
2789 (1ull << MSR_IR) |
2790 (1ull << MSR_DR);
2791 pcc->mmu_model = POWERPC_MMU_BOOKE;
2792 pcc->excp_model = POWERPC_EXCP_BOOKE;
2793 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
2794 pcc->bfd_mach = bfd_mach_ppc_403;
2795 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
2796 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
2799 static void init_proc_440x5(CPUPPCState *env)
2801 register_BookE_sprs(env, 0x000000000000FFFFULL);
2802 register_440_sprs(env);
2803 register_usprgh_sprs(env);
2805 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
2806 SPR_NOACCESS, SPR_NOACCESS,
2807 &spr_read_generic, &spr_write_generic,
2808 0x00000000);
2809 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
2810 SPR_NOACCESS, SPR_NOACCESS,
2811 &spr_read_generic, &spr_write_generic,
2812 0x00000000);
2813 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
2814 SPR_NOACCESS, SPR_NOACCESS,
2815 &spr_read_generic, &spr_write_generic,
2816 0x00000000);
2818 spr_register(env, SPR_440_CCR1, "CCR1",
2819 SPR_NOACCESS, SPR_NOACCESS,
2820 &spr_read_generic, &spr_write_generic,
2821 0x00000000);
2822 /* Memory management */
2823 #if !defined(CONFIG_USER_ONLY)
2824 env->nb_tlb = 64;
2825 env->nb_ways = 1;
2826 env->id_tlbs = 0;
2827 env->tlb_type = TLB_EMB;
2828 #endif
2829 init_excp_BookE(env);
2830 env->dcache_line_size = 32;
2831 env->icache_line_size = 32;
2832 ppc40x_irq_init(env_archcpu(env));
2834 SET_FIT_PERIOD(12, 16, 20, 24);
2835 SET_WDT_PERIOD(20, 24, 28, 32);
2838 POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
2840 DeviceClass *dc = DEVICE_CLASS(oc);
2841 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2843 dc->desc = "PowerPC 440x5";
2844 pcc->init_proc = init_proc_440x5;
2845 pcc->check_pow = check_pow_nocheck;
2846 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2847 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
2848 PPC_CACHE | PPC_CACHE_ICBI |
2849 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2850 PPC_MEM_TLBSYNC | PPC_MFTB |
2851 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
2852 PPC_440_SPEC;
2853 pcc->msr_mask = (1ull << MSR_POW) |
2854 (1ull << MSR_CE) |
2855 (1ull << MSR_EE) |
2856 (1ull << MSR_PR) |
2857 (1ull << MSR_FP) |
2858 (1ull << MSR_ME) |
2859 (1ull << MSR_FE0) |
2860 (1ull << MSR_DWE) |
2861 (1ull << MSR_DE) |
2862 (1ull << MSR_FE1) |
2863 (1ull << MSR_IR) |
2864 (1ull << MSR_DR);
2865 pcc->mmu_model = POWERPC_MMU_BOOKE;
2866 pcc->excp_model = POWERPC_EXCP_BOOKE;
2867 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
2868 pcc->bfd_mach = bfd_mach_ppc_403;
2869 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
2870 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
2873 POWERPC_FAMILY(440x5wDFPU)(ObjectClass *oc, void *data)
2875 DeviceClass *dc = DEVICE_CLASS(oc);
2876 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2878 dc->desc = "PowerPC 440x5 with double precision FPU";
2879 pcc->init_proc = init_proc_440x5;
2880 pcc->check_pow = check_pow_nocheck;
2881 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2882 PPC_FLOAT | PPC_FLOAT_FSQRT |
2883 PPC_FLOAT_STFIWX |
2884 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
2885 PPC_CACHE | PPC_CACHE_ICBI |
2886 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2887 PPC_MEM_TLBSYNC | PPC_MFTB |
2888 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
2889 PPC_440_SPEC;
2890 pcc->insns_flags2 = PPC2_FP_CVT_S64;
2891 pcc->msr_mask = (1ull << MSR_POW) |
2892 (1ull << MSR_CE) |
2893 (1ull << MSR_EE) |
2894 (1ull << MSR_PR) |
2895 (1ull << MSR_FP) |
2896 (1ull << MSR_ME) |
2897 (1ull << MSR_FE0) |
2898 (1ull << MSR_DWE) |
2899 (1ull << MSR_DE) |
2900 (1ull << MSR_FE1) |
2901 (1ull << MSR_IR) |
2902 (1ull << MSR_DR);
2903 pcc->mmu_model = POWERPC_MMU_BOOKE;
2904 pcc->excp_model = POWERPC_EXCP_BOOKE;
2905 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
2906 pcc->bfd_mach = bfd_mach_ppc_403;
2907 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
2908 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
2911 static void init_proc_MPC5xx(CPUPPCState *env)
2913 register_5xx_8xx_sprs(env);
2914 register_5xx_sprs(env);
2915 init_excp_MPC5xx(env);
2916 env->dcache_line_size = 32;
2917 env->icache_line_size = 32;
2918 /* XXX: TODO: allocate internal IRQ controller */
2921 POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
2923 DeviceClass *dc = DEVICE_CLASS(oc);
2924 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2926 dc->desc = "Freescale 5xx cores (aka RCPU)";
2927 pcc->init_proc = init_proc_MPC5xx;
2928 pcc->check_pow = check_pow_none;
2929 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2930 PPC_MEM_EIEIO | PPC_MEM_SYNC |
2931 PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
2932 PPC_MFTB;
2933 pcc->msr_mask = (1ull << MSR_ILE) |
2934 (1ull << MSR_EE) |
2935 (1ull << MSR_PR) |
2936 (1ull << MSR_FP) |
2937 (1ull << MSR_ME) |
2938 (1ull << MSR_FE0) |
2939 (1ull << MSR_SE) |
2940 (1ull << MSR_DE) |
2941 (1ull << MSR_FE1) |
2942 (1ull << MSR_EP) |
2943 (1ull << MSR_RI) |
2944 (1ull << MSR_LE);
2945 pcc->mmu_model = POWERPC_MMU_REAL;
2946 pcc->excp_model = POWERPC_EXCP_6xx;
2947 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
2948 pcc->bfd_mach = bfd_mach_ppc_505;
2949 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
2950 POWERPC_FLAG_BUS_CLK;
2953 static void init_proc_MPC8xx(CPUPPCState *env)
2955 register_5xx_8xx_sprs(env);
2956 register_8xx_sprs(env);
2957 init_excp_MPC8xx(env);
2958 env->dcache_line_size = 32;
2959 env->icache_line_size = 32;
2960 /* XXX: TODO: allocate internal IRQ controller */
2963 POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
2965 DeviceClass *dc = DEVICE_CLASS(oc);
2966 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2968 dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
2969 pcc->init_proc = init_proc_MPC8xx;
2970 pcc->check_pow = check_pow_none;
2971 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2972 PPC_MEM_EIEIO | PPC_MEM_SYNC |
2973 PPC_CACHE_ICBI | PPC_MFTB;
2974 pcc->msr_mask = (1ull << MSR_ILE) |
2975 (1ull << MSR_EE) |
2976 (1ull << MSR_PR) |
2977 (1ull << MSR_FP) |
2978 (1ull << MSR_ME) |
2979 (1ull << MSR_SE) |
2980 (1ull << MSR_DE) |
2981 (1ull << MSR_EP) |
2982 (1ull << MSR_IR) |
2983 (1ull << MSR_DR) |
2984 (1ull << MSR_RI) |
2985 (1ull << MSR_LE);
2986 pcc->mmu_model = POWERPC_MMU_MPC8xx;
2987 pcc->excp_model = POWERPC_EXCP_6xx;
2988 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
2989 pcc->bfd_mach = bfd_mach_ppc_860;
2990 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
2991 POWERPC_FLAG_BUS_CLK;
2994 /* Freescale 82xx cores (aka PowerQUICC-II) */
2996 static void init_proc_G2(CPUPPCState *env)
2998 register_ne_601_sprs(env);
2999 register_sdr1_sprs(env);
3000 register_G2_sprs(env);
3002 /* Memory management */
3003 register_low_BATs(env);
3004 register_high_BATs(env);
3005 register_6xx_7xx_soft_tlb(env, 64, 2);
3006 init_excp_G2(env);
3007 env->dcache_line_size = 32;
3008 env->icache_line_size = 32;
3009 /* Allocate hardware IRQ controller */
3010 ppc6xx_irq_init(env_archcpu(env));
3013 POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
3015 DeviceClass *dc = DEVICE_CLASS(oc);
3016 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3018 dc->desc = "PowerPC G2";
3019 pcc->init_proc = init_proc_G2;
3020 pcc->check_pow = check_pow_hid0;
3021 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3022 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3023 PPC_FLOAT_STFIWX |
3024 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3025 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3026 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
3027 PPC_SEGMENT | PPC_EXTERN;
3028 pcc->msr_mask = (1ull << MSR_POW) |
3029 (1ull << MSR_TGPR) |
3030 (1ull << MSR_EE) |
3031 (1ull << MSR_PR) |
3032 (1ull << MSR_FP) |
3033 (1ull << MSR_ME) |
3034 (1ull << MSR_FE0) |
3035 (1ull << MSR_SE) |
3036 (1ull << MSR_DE) |
3037 (1ull << MSR_FE1) |
3038 (1ull << MSR_AL) |
3039 (1ull << MSR_EP) |
3040 (1ull << MSR_IR) |
3041 (1ull << MSR_DR) |
3042 (1ull << MSR_RI);
3043 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
3044 pcc->excp_model = POWERPC_EXCP_6xx;
3045 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3046 pcc->bfd_mach = bfd_mach_ppc_ec603e;
3047 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
3048 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
3051 POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
3053 DeviceClass *dc = DEVICE_CLASS(oc);
3054 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3056 dc->desc = "PowerPC G2LE";
3057 pcc->init_proc = init_proc_G2;
3058 pcc->check_pow = check_pow_hid0;
3059 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3060 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3061 PPC_FLOAT_STFIWX |
3062 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3063 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3064 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
3065 PPC_SEGMENT | PPC_EXTERN;
3066 pcc->msr_mask = (1ull << MSR_POW) |
3067 (1ull << MSR_TGPR) |
3068 (1ull << MSR_ILE) |
3069 (1ull << MSR_EE) |
3070 (1ull << MSR_PR) |
3071 (1ull << MSR_FP) |
3072 (1ull << MSR_ME) |
3073 (1ull << MSR_FE0) |
3074 (1ull << MSR_SE) |
3075 (1ull << MSR_DE) |
3076 (1ull << MSR_FE1) |
3077 (1ull << MSR_AL) |
3078 (1ull << MSR_EP) |
3079 (1ull << MSR_IR) |
3080 (1ull << MSR_DR) |
3081 (1ull << MSR_RI) |
3082 (1ull << MSR_LE);
3083 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
3084 pcc->excp_model = POWERPC_EXCP_6xx;
3085 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3086 pcc->bfd_mach = bfd_mach_ppc_ec603e;
3087 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
3088 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
3091 static void init_proc_e200(CPUPPCState *env)
3093 register_BookE_sprs(env, 0x000000070000FFFFULL);
3095 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
3096 &spr_read_spefscr, &spr_write_spefscr,
3097 &spr_read_spefscr, &spr_write_spefscr,
3098 0x00000000);
3099 /* Memory management */
3100 register_BookE206_sprs(env, 0x0000005D, NULL, 0);
3101 register_usprgh_sprs(env);
3103 spr_register(env, SPR_HID0, "HID0",
3104 SPR_NOACCESS, SPR_NOACCESS,
3105 &spr_read_generic, &spr_write_generic,
3106 0x00000000);
3108 spr_register(env, SPR_HID1, "HID1",
3109 SPR_NOACCESS, SPR_NOACCESS,
3110 &spr_read_generic, &spr_write_generic,
3111 0x00000000);
3113 spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
3114 SPR_NOACCESS, SPR_NOACCESS,
3115 &spr_read_generic, &spr_write_generic,
3116 0x00000000);
3118 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
3119 SPR_NOACCESS, SPR_NOACCESS,
3120 &spr_read_generic, &spr_write_generic,
3121 0x00000000);
3123 spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
3124 SPR_NOACCESS, SPR_NOACCESS,
3125 &spr_read_generic, &spr_write_generic,
3126 0x00000000);
3128 spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
3129 SPR_NOACCESS, SPR_NOACCESS,
3130 &spr_read_generic, &spr_write_generic,
3131 0x00000000);
3133 spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
3134 SPR_NOACCESS, SPR_NOACCESS,
3135 &spr_read_generic, &spr_write_generic,
3136 0x00000000);
3138 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
3139 &spr_read_generic, SPR_NOACCESS,
3140 &spr_read_generic, SPR_NOACCESS,
3141 0x00000000);
3143 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
3144 SPR_NOACCESS, SPR_NOACCESS,
3145 &spr_read_generic, &spr_write_generic,
3146 0x00000000);
3148 spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
3149 SPR_NOACCESS, SPR_NOACCESS,
3150 &spr_read_generic, &spr_write_generic,
3151 0x00000000);
3153 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
3154 SPR_NOACCESS, SPR_NOACCESS,
3155 &spr_read_generic, &spr_write_generic,
3156 0x00000000);
3158 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
3159 SPR_NOACCESS, SPR_NOACCESS,
3160 &spr_read_generic, &spr_write_generic,
3161 0x00000000);
3163 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3164 SPR_NOACCESS, SPR_NOACCESS,
3165 &spr_read_generic, &spr_write_generic,
3166 0x00000000);
3168 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3169 SPR_NOACCESS, SPR_NOACCESS,
3170 &spr_read_generic, &spr_write_generic,
3171 0x00000000);
3173 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
3174 SPR_NOACCESS, SPR_NOACCESS,
3175 &spr_read_generic, &spr_write_generic,
3176 0x00000000); /* TOFIX */
3177 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
3178 SPR_NOACCESS, SPR_NOACCESS,
3179 &spr_read_generic, &spr_write_generic,
3180 0x00000000);
3181 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
3182 SPR_NOACCESS, SPR_NOACCESS,
3183 &spr_read_generic, &spr_write_generic,
3184 0x00000000);
3185 #if !defined(CONFIG_USER_ONLY)
3186 env->nb_tlb = 64;
3187 env->nb_ways = 1;
3188 env->id_tlbs = 0;
3189 env->tlb_type = TLB_EMB;
3190 #endif
3191 init_excp_e200(env, 0xFFFF0000UL);
3192 env->dcache_line_size = 32;
3193 env->icache_line_size = 32;
3194 /* XXX: TODO: allocate internal IRQ controller */
3197 POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
3199 DeviceClass *dc = DEVICE_CLASS(oc);
3200 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3202 dc->desc = "e200 core";
3203 pcc->init_proc = init_proc_e200;
3204 pcc->check_pow = check_pow_hid0;
3206 * XXX: unimplemented instructions:
3207 * dcblc
3208 * dcbtlst
3209 * dcbtstls
3210 * icblc
3211 * icbtls
3212 * tlbivax
3213 * all SPE multiply-accumulate instructions
3215 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
3216 PPC_SPE | PPC_SPE_SINGLE |
3217 PPC_WRTEE | PPC_RFDI |
3218 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
3219 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3220 PPC_MEM_TLBSYNC | PPC_TLBIVAX |
3221 PPC_BOOKE;
3222 pcc->msr_mask = (1ull << MSR_UCLE) |
3223 (1ull << MSR_SPE) |
3224 (1ull << MSR_POW) |
3225 (1ull << MSR_CE) |
3226 (1ull << MSR_EE) |
3227 (1ull << MSR_PR) |
3228 (1ull << MSR_FP) |
3229 (1ull << MSR_ME) |
3230 (1ull << MSR_FE0) |
3231 (1ull << MSR_DWE) |
3232 (1ull << MSR_DE) |
3233 (1ull << MSR_FE1) |
3234 (1ull << MSR_IR) |
3235 (1ull << MSR_DR);
3236 pcc->mmu_model = POWERPC_MMU_BOOKE206;
3237 pcc->excp_model = POWERPC_EXCP_BOOKE;
3238 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3239 pcc->bfd_mach = bfd_mach_ppc_860;
3240 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
3241 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
3242 POWERPC_FLAG_BUS_CLK;
3245 static void init_proc_e300(CPUPPCState *env)
3247 register_ne_601_sprs(env);
3248 register_sdr1_sprs(env);
3249 register_603_sprs(env);
3250 register_e300_sprs(env);
3252 /* Memory management */
3253 register_low_BATs(env);
3254 register_high_BATs(env);
3255 register_6xx_7xx_soft_tlb(env, 64, 2);
3256 init_excp_603(env);
3257 env->dcache_line_size = 32;
3258 env->icache_line_size = 32;
3259 /* Allocate hardware IRQ controller */
3260 ppc6xx_irq_init(env_archcpu(env));
3263 POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
3265 DeviceClass *dc = DEVICE_CLASS(oc);
3266 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3268 dc->desc = "e300 core";
3269 pcc->init_proc = init_proc_e300;
3270 pcc->check_pow = check_pow_hid0;
3271 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3272 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3273 PPC_FLOAT_STFIWX |
3274 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3275 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3276 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
3277 PPC_SEGMENT | PPC_EXTERN;
3278 pcc->msr_mask = (1ull << MSR_POW) |
3279 (1ull << MSR_TGPR) |
3280 (1ull << MSR_ILE) |
3281 (1ull << MSR_EE) |
3282 (1ull << MSR_PR) |
3283 (1ull << MSR_FP) |
3284 (1ull << MSR_ME) |
3285 (1ull << MSR_FE0) |
3286 (1ull << MSR_SE) |
3287 (1ull << MSR_DE) |
3288 (1ull << MSR_FE1) |
3289 (1ull << MSR_AL) |
3290 (1ull << MSR_EP) |
3291 (1ull << MSR_IR) |
3292 (1ull << MSR_DR) |
3293 (1ull << MSR_RI) |
3294 (1ull << MSR_LE);
3295 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
3296 pcc->excp_model = POWERPC_EXCP_6xx;
3297 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3298 pcc->bfd_mach = bfd_mach_ppc_603;
3299 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
3300 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
3303 enum fsl_e500_version {
3304 fsl_e500v1,
3305 fsl_e500v2,
3306 fsl_e500mc,
3307 fsl_e5500,
3308 fsl_e6500,
3311 static void init_proc_e500(CPUPPCState *env, int version)
3313 uint32_t tlbncfg[2];
3314 uint64_t ivor_mask;
3315 uint64_t ivpr_mask = 0xFFFF0000ULL;
3316 uint32_t l1cfg0 = 0x3800 /* 8 ways */
3317 | 0x0020; /* 32 kb */
3318 uint32_t l1cfg1 = 0x3800 /* 8 ways */
3319 | 0x0020; /* 32 kb */
3320 uint32_t mmucfg = 0;
3321 #if !defined(CONFIG_USER_ONLY)
3322 int i;
3323 #endif
3326 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
3327 * complain when accessing them.
3328 * register_BookE_sprs(env, 0x0000000F0000FD7FULL);
3330 switch (version) {
3331 case fsl_e500v1:
3332 case fsl_e500v2:
3333 default:
3334 ivor_mask = 0x0000000F0000FFFFULL;
3335 break;
3336 case fsl_e500mc:
3337 case fsl_e5500:
3338 ivor_mask = 0x000003FE0000FFFFULL;
3339 break;
3340 case fsl_e6500:
3341 ivor_mask = 0x000003FF0000FFFFULL;
3342 break;
3344 register_BookE_sprs(env, ivor_mask);
3345 register_usprg3_sprs(env);
3346 /* Processor identification */
3347 spr_register(env, SPR_BOOKE_PIR, "PIR",
3348 SPR_NOACCESS, SPR_NOACCESS,
3349 &spr_read_generic, &spr_write_pir,
3350 0x00000000);
3352 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
3353 &spr_read_spefscr, &spr_write_spefscr,
3354 &spr_read_spefscr, &spr_write_spefscr,
3355 0x00000000);
3356 #if !defined(CONFIG_USER_ONLY)
3357 /* Memory management */
3358 env->nb_pids = 3;
3359 env->nb_ways = 2;
3360 env->id_tlbs = 0;
3361 switch (version) {
3362 case fsl_e500v1:
3363 tlbncfg[0] = register_tlbncfg(2, 1, 1, 0, 256);
3364 tlbncfg[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
3365 break;
3366 case fsl_e500v2:
3367 tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
3368 tlbncfg[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
3369 break;
3370 case fsl_e500mc:
3371 case fsl_e5500:
3372 tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
3373 tlbncfg[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
3374 break;
3375 case fsl_e6500:
3376 mmucfg = 0x6510B45;
3377 env->nb_pids = 1;
3378 tlbncfg[0] = 0x08052400;
3379 tlbncfg[1] = 0x40028040;
3380 break;
3381 default:
3382 cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
3383 env->spr[SPR_PVR]);
3385 #endif
3386 /* Cache sizes */
3387 switch (version) {
3388 case fsl_e500v1:
3389 case fsl_e500v2:
3390 env->dcache_line_size = 32;
3391 env->icache_line_size = 32;
3392 break;
3393 case fsl_e500mc:
3394 case fsl_e5500:
3395 env->dcache_line_size = 64;
3396 env->icache_line_size = 64;
3397 l1cfg0 |= 0x1000000; /* 64 byte cache block size */
3398 l1cfg1 |= 0x1000000; /* 64 byte cache block size */
3399 break;
3400 case fsl_e6500:
3401 env->dcache_line_size = 32;
3402 env->icache_line_size = 32;
3403 l1cfg0 |= 0x0F83820;
3404 l1cfg1 |= 0x0B83820;
3405 break;
3406 default:
3407 cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
3408 env->spr[SPR_PVR]);
3410 register_BookE206_sprs(env, 0x000000DF, tlbncfg, mmucfg);
3411 register_usprgh_sprs(env);
3413 spr_register(env, SPR_HID0, "HID0",
3414 SPR_NOACCESS, SPR_NOACCESS,
3415 &spr_read_generic, &spr_write_generic,
3416 0x00000000);
3418 spr_register(env, SPR_HID1, "HID1",
3419 SPR_NOACCESS, SPR_NOACCESS,
3420 &spr_read_generic, &spr_write_generic,
3421 0x00000000);
3423 spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
3424 SPR_NOACCESS, SPR_NOACCESS,
3425 &spr_read_generic, &spr_write_generic,
3426 0x00000000);
3428 spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
3429 SPR_NOACCESS, SPR_NOACCESS,
3430 &spr_read_generic, &spr_write_generic,
3431 0x00000000);
3433 spr_register(env, SPR_Exxx_MCAR, "MCAR",
3434 SPR_NOACCESS, SPR_NOACCESS,
3435 &spr_read_generic, &spr_write_generic,
3436 0x00000000);
3438 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3439 SPR_NOACCESS, SPR_NOACCESS,
3440 &spr_read_generic, &spr_write_generic,
3441 0x00000000);
3443 spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
3444 SPR_NOACCESS, SPR_NOACCESS,
3445 &spr_read_generic, &spr_write_generic,
3446 0x00000000);
3448 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
3449 SPR_NOACCESS, SPR_NOACCESS,
3450 &spr_read_generic, &spr_write_generic,
3451 0x00000000);
3453 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
3454 &spr_read_generic, SPR_NOACCESS,
3455 &spr_read_generic, SPR_NOACCESS,
3456 l1cfg0);
3457 spr_register(env, SPR_Exxx_L1CFG1, "L1CFG1",
3458 &spr_read_generic, SPR_NOACCESS,
3459 &spr_read_generic, SPR_NOACCESS,
3460 l1cfg1);
3461 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
3462 SPR_NOACCESS, SPR_NOACCESS,
3463 &spr_read_generic, &spr_write_e500_l1csr0,
3464 0x00000000);
3465 spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
3466 SPR_NOACCESS, SPR_NOACCESS,
3467 &spr_read_generic, &spr_write_e500_l1csr1,
3468 0x00000000);
3469 if (version != fsl_e500v1 && version != fsl_e500v2) {
3470 spr_register(env, SPR_Exxx_L2CSR0, "L2CSR0",
3471 SPR_NOACCESS, SPR_NOACCESS,
3472 &spr_read_generic, &spr_write_e500_l2csr0,
3473 0x00000000);
3475 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3476 SPR_NOACCESS, SPR_NOACCESS,
3477 &spr_read_generic, &spr_write_generic,
3478 0x00000000);
3479 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3480 SPR_NOACCESS, SPR_NOACCESS,
3481 &spr_read_generic, &spr_write_generic,
3482 0x00000000);
3483 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
3484 SPR_NOACCESS, SPR_NOACCESS,
3485 &spr_read_generic, &spr_write_booke206_mmucsr0,
3486 0x00000000);
3487 spr_register(env, SPR_BOOKE_EPR, "EPR",
3488 SPR_NOACCESS, SPR_NOACCESS,
3489 &spr_read_generic, SPR_NOACCESS,
3490 0x00000000);
3491 /* XXX better abstract into Emb.xxx features */
3492 if ((version == fsl_e5500) || (version == fsl_e6500)) {
3493 spr_register(env, SPR_BOOKE_EPCR, "EPCR",
3494 SPR_NOACCESS, SPR_NOACCESS,
3495 &spr_read_generic, &spr_write_generic,
3496 0x00000000);
3497 spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
3498 SPR_NOACCESS, SPR_NOACCESS,
3499 &spr_read_mas73, &spr_write_mas73,
3500 0x00000000);
3501 ivpr_mask = (target_ulong)~0xFFFFULL;
3504 if (version == fsl_e6500) {
3505 /* Thread identification */
3506 spr_register(env, SPR_TIR, "TIR",
3507 SPR_NOACCESS, SPR_NOACCESS,
3508 &spr_read_generic, SPR_NOACCESS,
3509 0x00000000);
3510 spr_register(env, SPR_BOOKE_TLB0PS, "TLB0PS",
3511 SPR_NOACCESS, SPR_NOACCESS,
3512 &spr_read_generic, SPR_NOACCESS,
3513 0x00000004);
3514 spr_register(env, SPR_BOOKE_TLB1PS, "TLB1PS",
3515 SPR_NOACCESS, SPR_NOACCESS,
3516 &spr_read_generic, SPR_NOACCESS,
3517 0x7FFFFFFC);
3520 #if !defined(CONFIG_USER_ONLY)
3521 env->nb_tlb = 0;
3522 env->tlb_type = TLB_MAS;
3523 for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
3524 env->nb_tlb += booke206_tlb_size(env, i);
3526 #endif
3528 init_excp_e200(env, ivpr_mask);
3529 /* Allocate hardware IRQ controller */
3530 ppce500_irq_init(env_archcpu(env));
3533 static void init_proc_e500v1(CPUPPCState *env)
3535 init_proc_e500(env, fsl_e500v1);
3538 POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
3540 DeviceClass *dc = DEVICE_CLASS(oc);
3541 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3543 dc->desc = "e500v1 core";
3544 pcc->init_proc = init_proc_e500v1;
3545 pcc->check_pow = check_pow_hid0;
3546 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
3547 PPC_SPE | PPC_SPE_SINGLE |
3548 PPC_WRTEE | PPC_RFDI |
3549 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
3550 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3551 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
3552 pcc->insns_flags2 = PPC2_BOOKE206;
3553 pcc->msr_mask = (1ull << MSR_UCLE) |
3554 (1ull << MSR_SPE) |
3555 (1ull << MSR_POW) |
3556 (1ull << MSR_CE) |
3557 (1ull << MSR_EE) |
3558 (1ull << MSR_PR) |
3559 (1ull << MSR_FP) |
3560 (1ull << MSR_ME) |
3561 (1ull << MSR_FE0) |
3562 (1ull << MSR_DWE) |
3563 (1ull << MSR_DE) |
3564 (1ull << MSR_FE1) |
3565 (1ull << MSR_IR) |
3566 (1ull << MSR_DR);
3567 pcc->mmu_model = POWERPC_MMU_BOOKE206;
3568 pcc->excp_model = POWERPC_EXCP_BOOKE;
3569 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3570 pcc->bfd_mach = bfd_mach_ppc_860;
3571 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
3572 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
3573 POWERPC_FLAG_BUS_CLK;
3576 static void init_proc_e500v2(CPUPPCState *env)
3578 init_proc_e500(env, fsl_e500v2);
3581 POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
3583 DeviceClass *dc = DEVICE_CLASS(oc);
3584 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3586 dc->desc = "e500v2 core";
3587 pcc->init_proc = init_proc_e500v2;
3588 pcc->check_pow = check_pow_hid0;
3589 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
3590 PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
3591 PPC_WRTEE | PPC_RFDI |
3592 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
3593 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3594 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
3595 pcc->insns_flags2 = PPC2_BOOKE206;
3596 pcc->msr_mask = (1ull << MSR_UCLE) |
3597 (1ull << MSR_SPE) |
3598 (1ull << MSR_POW) |
3599 (1ull << MSR_CE) |
3600 (1ull << MSR_EE) |
3601 (1ull << MSR_PR) |
3602 (1ull << MSR_FP) |
3603 (1ull << MSR_ME) |
3604 (1ull << MSR_FE0) |
3605 (1ull << MSR_DWE) |
3606 (1ull << MSR_DE) |
3607 (1ull << MSR_FE1) |
3608 (1ull << MSR_IR) |
3609 (1ull << MSR_DR);
3610 pcc->mmu_model = POWERPC_MMU_BOOKE206;
3611 pcc->excp_model = POWERPC_EXCP_BOOKE;
3612 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3613 pcc->bfd_mach = bfd_mach_ppc_860;
3614 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
3615 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
3616 POWERPC_FLAG_BUS_CLK;
3619 static void init_proc_e500mc(CPUPPCState *env)
3621 init_proc_e500(env, fsl_e500mc);
3624 POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
3626 DeviceClass *dc = DEVICE_CLASS(oc);
3627 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3629 dc->desc = "e500mc core";
3630 pcc->init_proc = init_proc_e500mc;
3631 pcc->check_pow = check_pow_none;
3632 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
3633 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
3634 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
3635 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3636 PPC_FLOAT | PPC_FLOAT_FRES |
3637 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
3638 PPC_FLOAT_STFIWX | PPC_WAIT |
3639 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
3640 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
3641 pcc->msr_mask = (1ull << MSR_GS) |
3642 (1ull << MSR_UCLE) |
3643 (1ull << MSR_CE) |
3644 (1ull << MSR_EE) |
3645 (1ull << MSR_PR) |
3646 (1ull << MSR_FP) |
3647 (1ull << MSR_ME) |
3648 (1ull << MSR_FE0) |
3649 (1ull << MSR_DE) |
3650 (1ull << MSR_FE1) |
3651 (1ull << MSR_IR) |
3652 (1ull << MSR_DR) |
3653 (1ull << MSR_PX) |
3654 (1ull << MSR_RI);
3655 pcc->mmu_model = POWERPC_MMU_BOOKE206;
3656 pcc->excp_model = POWERPC_EXCP_BOOKE;
3657 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3658 /* FIXME: figure out the correct flag for e500mc */
3659 pcc->bfd_mach = bfd_mach_ppc_e500;
3660 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3661 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
3664 #ifdef TARGET_PPC64
3665 static void init_proc_e5500(CPUPPCState *env)
3667 init_proc_e500(env, fsl_e5500);
3670 POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
3672 DeviceClass *dc = DEVICE_CLASS(oc);
3673 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3675 dc->desc = "e5500 core";
3676 pcc->init_proc = init_proc_e5500;
3677 pcc->check_pow = check_pow_none;
3678 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
3679 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
3680 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
3681 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3682 PPC_FLOAT | PPC_FLOAT_FRES |
3683 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
3684 PPC_FLOAT_STFIWX | PPC_WAIT |
3685 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
3686 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
3687 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
3688 PPC2_FP_CVT_S64;
3689 pcc->msr_mask = (1ull << MSR_CM) |
3690 (1ull << MSR_GS) |
3691 (1ull << MSR_UCLE) |
3692 (1ull << MSR_CE) |
3693 (1ull << MSR_EE) |
3694 (1ull << MSR_PR) |
3695 (1ull << MSR_FP) |
3696 (1ull << MSR_ME) |
3697 (1ull << MSR_FE0) |
3698 (1ull << MSR_DE) |
3699 (1ull << MSR_FE1) |
3700 (1ull << MSR_IR) |
3701 (1ull << MSR_DR) |
3702 (1ull << MSR_PX) |
3703 (1ull << MSR_RI);
3704 pcc->mmu_model = POWERPC_MMU_BOOKE206;
3705 pcc->excp_model = POWERPC_EXCP_BOOKE;
3706 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3707 /* FIXME: figure out the correct flag for e5500 */
3708 pcc->bfd_mach = bfd_mach_ppc_e500;
3709 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3710 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
3713 static void init_proc_e6500(CPUPPCState *env)
3715 init_proc_e500(env, fsl_e6500);
3718 POWERPC_FAMILY(e6500)(ObjectClass *oc, void *data)
3720 DeviceClass *dc = DEVICE_CLASS(oc);
3721 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3723 dc->desc = "e6500 core";
3724 pcc->init_proc = init_proc_e6500;
3725 pcc->check_pow = check_pow_none;
3726 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
3727 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
3728 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
3729 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3730 PPC_FLOAT | PPC_FLOAT_FRES |
3731 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
3732 PPC_FLOAT_STFIWX | PPC_WAIT |
3733 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
3734 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD | PPC_ALTIVEC;
3735 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
3736 PPC2_FP_CVT_S64 | PPC2_ATOMIC_ISA206;
3737 pcc->msr_mask = (1ull << MSR_CM) |
3738 (1ull << MSR_GS) |
3739 (1ull << MSR_UCLE) |
3740 (1ull << MSR_CE) |
3741 (1ull << MSR_EE) |
3742 (1ull << MSR_PR) |
3743 (1ull << MSR_FP) |
3744 (1ull << MSR_ME) |
3745 (1ull << MSR_FE0) |
3746 (1ull << MSR_DE) |
3747 (1ull << MSR_FE1) |
3748 (1ull << MSR_IS) |
3749 (1ull << MSR_DS) |
3750 (1ull << MSR_PX) |
3751 (1ull << MSR_RI) |
3752 (1ull << MSR_VR);
3753 pcc->mmu_model = POWERPC_MMU_BOOKE206;
3754 pcc->excp_model = POWERPC_EXCP_BOOKE;
3755 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3756 pcc->bfd_mach = bfd_mach_ppc_e500;
3757 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3758 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_VRE;
3761 #endif
3763 /* Non-embedded PowerPC */
3764 static void init_proc_603(CPUPPCState *env)
3766 register_ne_601_sprs(env);
3767 register_sdr1_sprs(env);
3768 register_603_sprs(env);
3770 /* Memory management */
3771 register_low_BATs(env);
3772 register_6xx_7xx_soft_tlb(env, 64, 2);
3773 init_excp_603(env);
3774 env->dcache_line_size = 32;
3775 env->icache_line_size = 32;
3776 /* Allocate hardware IRQ controller */
3777 ppc6xx_irq_init(env_archcpu(env));
3780 POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
3782 DeviceClass *dc = DEVICE_CLASS(oc);
3783 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3785 dc->desc = "PowerPC 603";
3786 pcc->init_proc = init_proc_603;
3787 pcc->check_pow = check_pow_hid0;
3788 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3789 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3790 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
3791 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3792 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3793 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
3794 PPC_SEGMENT | PPC_EXTERN;
3795 pcc->msr_mask = (1ull << MSR_POW) |
3796 (1ull << MSR_TGPR) |
3797 (1ull << MSR_ILE) |
3798 (1ull << MSR_EE) |
3799 (1ull << MSR_PR) |
3800 (1ull << MSR_FP) |
3801 (1ull << MSR_ME) |
3802 (1ull << MSR_FE0) |
3803 (1ull << MSR_SE) |
3804 (1ull << MSR_DE) |
3805 (1ull << MSR_FE1) |
3806 (1ull << MSR_EP) |
3807 (1ull << MSR_IR) |
3808 (1ull << MSR_DR) |
3809 (1ull << MSR_RI) |
3810 (1ull << MSR_LE);
3811 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
3812 pcc->excp_model = POWERPC_EXCP_6xx;
3813 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3814 pcc->bfd_mach = bfd_mach_ppc_603;
3815 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
3816 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
3819 POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
3821 DeviceClass *dc = DEVICE_CLASS(oc);
3822 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3824 dc->desc = "PowerPC 603e";
3825 pcc->init_proc = init_proc_603;
3826 pcc->check_pow = check_pow_hid0;
3827 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3828 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3829 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
3830 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3831 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3832 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
3833 PPC_SEGMENT | PPC_EXTERN;
3834 pcc->msr_mask = (1ull << MSR_POW) |
3835 (1ull << MSR_TGPR) |
3836 (1ull << MSR_ILE) |
3837 (1ull << MSR_EE) |
3838 (1ull << MSR_PR) |
3839 (1ull << MSR_FP) |
3840 (1ull << MSR_ME) |
3841 (1ull << MSR_FE0) |
3842 (1ull << MSR_SE) |
3843 (1ull << MSR_DE) |
3844 (1ull << MSR_FE1) |
3845 (1ull << MSR_EP) |
3846 (1ull << MSR_IR) |
3847 (1ull << MSR_DR) |
3848 (1ull << MSR_RI) |
3849 (1ull << MSR_LE);
3850 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
3851 pcc->excp_model = POWERPC_EXCP_6xx;
3852 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3853 pcc->bfd_mach = bfd_mach_ppc_ec603e;
3854 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
3855 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
3858 static void init_proc_604(CPUPPCState *env)
3860 register_ne_601_sprs(env);
3861 register_sdr1_sprs(env);
3862 register_604_sprs(env);
3864 /* Memory management */
3865 register_low_BATs(env);
3866 init_excp_604(env);
3867 env->dcache_line_size = 32;
3868 env->icache_line_size = 32;
3869 /* Allocate hardware IRQ controller */
3870 ppc6xx_irq_init(env_archcpu(env));
3873 POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
3875 DeviceClass *dc = DEVICE_CLASS(oc);
3876 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3878 dc->desc = "PowerPC 604";
3879 pcc->init_proc = init_proc_604;
3880 pcc->check_pow = check_pow_nocheck;
3881 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3882 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3883 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
3884 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3885 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3886 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
3887 PPC_SEGMENT | PPC_EXTERN;
3888 pcc->msr_mask = (1ull << MSR_POW) |
3889 (1ull << MSR_ILE) |
3890 (1ull << MSR_EE) |
3891 (1ull << MSR_PR) |
3892 (1ull << MSR_FP) |
3893 (1ull << MSR_ME) |
3894 (1ull << MSR_FE0) |
3895 (1ull << MSR_SE) |
3896 (1ull << MSR_DE) |
3897 (1ull << MSR_FE1) |
3898 (1ull << MSR_EP) |
3899 (1ull << MSR_IR) |
3900 (1ull << MSR_DR) |
3901 (1ull << MSR_PMM) |
3902 (1ull << MSR_RI) |
3903 (1ull << MSR_LE);
3904 pcc->mmu_model = POWERPC_MMU_32B;
3905 pcc->excp_model = POWERPC_EXCP_6xx;
3906 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3907 pcc->bfd_mach = bfd_mach_ppc_604;
3908 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
3909 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
3912 static void init_proc_604E(CPUPPCState *env)
3914 register_ne_601_sprs(env);
3915 register_sdr1_sprs(env);
3916 register_604_sprs(env);
3918 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
3919 SPR_NOACCESS, SPR_NOACCESS,
3920 &spr_read_generic, &spr_write_generic,
3921 0x00000000);
3923 spr_register(env, SPR_7XX_PMC3, "PMC3",
3924 SPR_NOACCESS, SPR_NOACCESS,
3925 &spr_read_generic, &spr_write_generic,
3926 0x00000000);
3928 spr_register(env, SPR_7XX_PMC4, "PMC4",
3929 SPR_NOACCESS, SPR_NOACCESS,
3930 &spr_read_generic, &spr_write_generic,
3931 0x00000000);
3932 /* Hardware implementation registers */
3933 spr_register(env, SPR_HID1, "HID1",
3934 SPR_NOACCESS, SPR_NOACCESS,
3935 &spr_read_generic, &spr_write_generic,
3936 0x00000000);
3937 /* Memory management */
3938 register_low_BATs(env);
3939 init_excp_604(env);
3940 env->dcache_line_size = 32;
3941 env->icache_line_size = 32;
3942 /* Allocate hardware IRQ controller */
3943 ppc6xx_irq_init(env_archcpu(env));
3946 POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
3948 DeviceClass *dc = DEVICE_CLASS(oc);
3949 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3951 dc->desc = "PowerPC 604E";
3952 pcc->init_proc = init_proc_604E;
3953 pcc->check_pow = check_pow_nocheck;
3954 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3955 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3956 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
3957 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3958 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3959 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
3960 PPC_SEGMENT | PPC_EXTERN;
3961 pcc->msr_mask = (1ull << MSR_POW) |
3962 (1ull << MSR_ILE) |
3963 (1ull << MSR_EE) |
3964 (1ull << MSR_PR) |
3965 (1ull << MSR_FP) |
3966 (1ull << MSR_ME) |
3967 (1ull << MSR_FE0) |
3968 (1ull << MSR_SE) |
3969 (1ull << MSR_DE) |
3970 (1ull << MSR_FE1) |
3971 (1ull << MSR_EP) |
3972 (1ull << MSR_IR) |
3973 (1ull << MSR_DR) |
3974 (1ull << MSR_PMM) |
3975 (1ull << MSR_RI) |
3976 (1ull << MSR_LE);
3977 pcc->mmu_model = POWERPC_MMU_32B;
3978 pcc->excp_model = POWERPC_EXCP_6xx;
3979 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3980 pcc->bfd_mach = bfd_mach_ppc_604;
3981 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
3982 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
3985 static void init_proc_740(CPUPPCState *env)
3987 register_ne_601_sprs(env);
3988 register_sdr1_sprs(env);
3989 register_7xx_sprs(env);
3990 /* Thermal management */
3991 register_thrm_sprs(env);
3993 /* Memory management */
3994 register_low_BATs(env);
3995 init_excp_7x0(env);
3996 env->dcache_line_size = 32;
3997 env->icache_line_size = 32;
3998 /* Allocate hardware IRQ controller */
3999 ppc6xx_irq_init(env_archcpu(env));
4002 POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
4004 DeviceClass *dc = DEVICE_CLASS(oc);
4005 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4007 dc->desc = "PowerPC 740";
4008 pcc->init_proc = init_proc_740;
4009 pcc->check_pow = check_pow_hid0;
4010 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4011 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4012 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4013 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4014 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4015 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4016 PPC_SEGMENT | PPC_EXTERN;
4017 pcc->msr_mask = (1ull << MSR_POW) |
4018 (1ull << MSR_ILE) |
4019 (1ull << MSR_EE) |
4020 (1ull << MSR_PR) |
4021 (1ull << MSR_FP) |
4022 (1ull << MSR_ME) |
4023 (1ull << MSR_FE0) |
4024 (1ull << MSR_SE) |
4025 (1ull << MSR_DE) |
4026 (1ull << MSR_FE1) |
4027 (1ull << MSR_EP) |
4028 (1ull << MSR_IR) |
4029 (1ull << MSR_DR) |
4030 (1ull << MSR_PMM) |
4031 (1ull << MSR_RI) |
4032 (1ull << MSR_LE);
4033 pcc->mmu_model = POWERPC_MMU_32B;
4034 pcc->excp_model = POWERPC_EXCP_7xx;
4035 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4036 pcc->bfd_mach = bfd_mach_ppc_750;
4037 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4038 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4041 static void init_proc_750(CPUPPCState *env)
4043 register_ne_601_sprs(env);
4044 register_sdr1_sprs(env);
4045 register_7xx_sprs(env);
4047 spr_register(env, SPR_L2CR, "L2CR",
4048 SPR_NOACCESS, SPR_NOACCESS,
4049 &spr_read_generic, spr_access_nop,
4050 0x00000000);
4051 /* Thermal management */
4052 register_thrm_sprs(env);
4054 /* Memory management */
4055 register_low_BATs(env);
4057 * XXX: high BATs are also present but are known to be bugged on
4058 * die version 1.x
4060 init_excp_7x0(env);
4061 env->dcache_line_size = 32;
4062 env->icache_line_size = 32;
4063 /* Allocate hardware IRQ controller */
4064 ppc6xx_irq_init(env_archcpu(env));
4067 POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
4069 DeviceClass *dc = DEVICE_CLASS(oc);
4070 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4072 dc->desc = "PowerPC 750";
4073 pcc->init_proc = init_proc_750;
4074 pcc->check_pow = check_pow_hid0;
4075 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4076 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4077 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4078 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4079 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4080 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4081 PPC_SEGMENT | PPC_EXTERN;
4082 pcc->msr_mask = (1ull << MSR_POW) |
4083 (1ull << MSR_ILE) |
4084 (1ull << MSR_EE) |
4085 (1ull << MSR_PR) |
4086 (1ull << MSR_FP) |
4087 (1ull << MSR_ME) |
4088 (1ull << MSR_FE0) |
4089 (1ull << MSR_SE) |
4090 (1ull << MSR_DE) |
4091 (1ull << MSR_FE1) |
4092 (1ull << MSR_EP) |
4093 (1ull << MSR_IR) |
4094 (1ull << MSR_DR) |
4095 (1ull << MSR_PMM) |
4096 (1ull << MSR_RI) |
4097 (1ull << MSR_LE);
4098 pcc->mmu_model = POWERPC_MMU_32B;
4099 pcc->excp_model = POWERPC_EXCP_7xx;
4100 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4101 pcc->bfd_mach = bfd_mach_ppc_750;
4102 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4103 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4106 static void init_proc_750cl(CPUPPCState *env)
4108 register_ne_601_sprs(env);
4109 register_sdr1_sprs(env);
4110 register_7xx_sprs(env);
4112 spr_register(env, SPR_L2CR, "L2CR",
4113 SPR_NOACCESS, SPR_NOACCESS,
4114 &spr_read_generic, spr_access_nop,
4115 0x00000000);
4116 /* Thermal management */
4117 /* Those registers are fake on 750CL */
4118 spr_register(env, SPR_THRM1, "THRM1",
4119 SPR_NOACCESS, SPR_NOACCESS,
4120 &spr_read_generic, &spr_write_generic,
4121 0x00000000);
4122 spr_register(env, SPR_THRM2, "THRM2",
4123 SPR_NOACCESS, SPR_NOACCESS,
4124 &spr_read_generic, &spr_write_generic,
4125 0x00000000);
4126 spr_register(env, SPR_THRM3, "THRM3",
4127 SPR_NOACCESS, SPR_NOACCESS,
4128 &spr_read_generic, &spr_write_generic,
4129 0x00000000);
4131 spr_register(env, SPR_750_TDCL, "TDCL",
4132 SPR_NOACCESS, SPR_NOACCESS,
4133 &spr_read_generic, &spr_write_generic,
4134 0x00000000);
4135 spr_register(env, SPR_750_TDCH, "TDCH",
4136 SPR_NOACCESS, SPR_NOACCESS,
4137 &spr_read_generic, &spr_write_generic,
4138 0x00000000);
4139 /* DMA */
4140 spr_register(env, SPR_750_WPAR, "WPAR",
4141 SPR_NOACCESS, SPR_NOACCESS,
4142 &spr_read_generic, &spr_write_generic,
4143 0x00000000);
4144 spr_register(env, SPR_750_DMAL, "DMAL",
4145 SPR_NOACCESS, SPR_NOACCESS,
4146 &spr_read_generic, &spr_write_generic,
4147 0x00000000);
4148 spr_register(env, SPR_750_DMAU, "DMAU",
4149 SPR_NOACCESS, SPR_NOACCESS,
4150 &spr_read_generic, &spr_write_generic,
4151 0x00000000);
4152 /* Hardware implementation registers */
4153 spr_register(env, SPR_750CL_HID2, "HID2",
4154 SPR_NOACCESS, SPR_NOACCESS,
4155 &spr_read_generic, &spr_write_generic,
4156 0x00000000);
4158 spr_register(env, SPR_750CL_HID4, "HID4",
4159 SPR_NOACCESS, SPR_NOACCESS,
4160 &spr_read_generic, &spr_write_generic,
4161 0x00000000);
4162 /* Quantization registers */
4163 spr_register(env, SPR_750_GQR0, "GQR0",
4164 SPR_NOACCESS, SPR_NOACCESS,
4165 &spr_read_generic, &spr_write_generic,
4166 0x00000000);
4168 spr_register(env, SPR_750_GQR1, "GQR1",
4169 SPR_NOACCESS, SPR_NOACCESS,
4170 &spr_read_generic, &spr_write_generic,
4171 0x00000000);
4173 spr_register(env, SPR_750_GQR2, "GQR2",
4174 SPR_NOACCESS, SPR_NOACCESS,
4175 &spr_read_generic, &spr_write_generic,
4176 0x00000000);
4178 spr_register(env, SPR_750_GQR3, "GQR3",
4179 SPR_NOACCESS, SPR_NOACCESS,
4180 &spr_read_generic, &spr_write_generic,
4181 0x00000000);
4183 spr_register(env, SPR_750_GQR4, "GQR4",
4184 SPR_NOACCESS, SPR_NOACCESS,
4185 &spr_read_generic, &spr_write_generic,
4186 0x00000000);
4188 spr_register(env, SPR_750_GQR5, "GQR5",
4189 SPR_NOACCESS, SPR_NOACCESS,
4190 &spr_read_generic, &spr_write_generic,
4191 0x00000000);
4193 spr_register(env, SPR_750_GQR6, "GQR6",
4194 SPR_NOACCESS, SPR_NOACCESS,
4195 &spr_read_generic, &spr_write_generic,
4196 0x00000000);
4198 spr_register(env, SPR_750_GQR7, "GQR7",
4199 SPR_NOACCESS, SPR_NOACCESS,
4200 &spr_read_generic, &spr_write_generic,
4201 0x00000000);
4202 /* Memory management */
4203 register_low_BATs(env);
4204 /* PowerPC 750cl has 8 DBATs and 8 IBATs */
4205 register_high_BATs(env);
4206 init_excp_750cl(env);
4207 env->dcache_line_size = 32;
4208 env->icache_line_size = 32;
4209 /* Allocate hardware IRQ controller */
4210 ppc6xx_irq_init(env_archcpu(env));
4213 POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
4215 DeviceClass *dc = DEVICE_CLASS(oc);
4216 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4218 dc->desc = "PowerPC 750 CL";
4219 pcc->init_proc = init_proc_750cl;
4220 pcc->check_pow = check_pow_hid0;
4222 * XXX: not implemented:
4223 * cache lock instructions:
4224 * dcbz_l
4225 * floating point paired instructions
4226 * psq_lux
4227 * psq_lx
4228 * psq_stux
4229 * psq_stx
4230 * ps_abs
4231 * ps_add
4232 * ps_cmpo0
4233 * ps_cmpo1
4234 * ps_cmpu0
4235 * ps_cmpu1
4236 * ps_div
4237 * ps_madd
4238 * ps_madds0
4239 * ps_madds1
4240 * ps_merge00
4241 * ps_merge01
4242 * ps_merge10
4243 * ps_merge11
4244 * ps_mr
4245 * ps_msub
4246 * ps_mul
4247 * ps_muls0
4248 * ps_muls1
4249 * ps_nabs
4250 * ps_neg
4251 * ps_nmadd
4252 * ps_nmsub
4253 * ps_res
4254 * ps_rsqrte
4255 * ps_sel
4256 * ps_sub
4257 * ps_sum0
4258 * ps_sum1
4260 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4261 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4262 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4263 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4264 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4265 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4266 PPC_SEGMENT | PPC_EXTERN;
4267 pcc->msr_mask = (1ull << MSR_POW) |
4268 (1ull << MSR_ILE) |
4269 (1ull << MSR_EE) |
4270 (1ull << MSR_PR) |
4271 (1ull << MSR_FP) |
4272 (1ull << MSR_ME) |
4273 (1ull << MSR_FE0) |
4274 (1ull << MSR_SE) |
4275 (1ull << MSR_DE) |
4276 (1ull << MSR_FE1) |
4277 (1ull << MSR_EP) |
4278 (1ull << MSR_IR) |
4279 (1ull << MSR_DR) |
4280 (1ull << MSR_PMM) |
4281 (1ull << MSR_RI) |
4282 (1ull << MSR_LE);
4283 pcc->mmu_model = POWERPC_MMU_32B;
4284 pcc->excp_model = POWERPC_EXCP_7xx;
4285 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4286 pcc->bfd_mach = bfd_mach_ppc_750;
4287 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4288 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4291 static void init_proc_750cx(CPUPPCState *env)
4293 register_ne_601_sprs(env);
4294 register_sdr1_sprs(env);
4295 register_7xx_sprs(env);
4297 spr_register(env, SPR_L2CR, "L2CR",
4298 SPR_NOACCESS, SPR_NOACCESS,
4299 &spr_read_generic, spr_access_nop,
4300 0x00000000);
4301 /* Thermal management */
4302 register_thrm_sprs(env);
4304 spr_register(env, SPR_SDA, "SDA",
4305 SPR_NOACCESS, SPR_NOACCESS,
4306 &spr_read_generic, &spr_write_generic,
4307 0x00000000);
4309 /* Memory management */
4310 register_low_BATs(env);
4311 /* PowerPC 750cx has 8 DBATs and 8 IBATs */
4312 register_high_BATs(env);
4313 init_excp_750cx(env);
4314 env->dcache_line_size = 32;
4315 env->icache_line_size = 32;
4316 /* Allocate hardware IRQ controller */
4317 ppc6xx_irq_init(env_archcpu(env));
4320 POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
4322 DeviceClass *dc = DEVICE_CLASS(oc);
4323 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4325 dc->desc = "PowerPC 750CX";
4326 pcc->init_proc = init_proc_750cx;
4327 pcc->check_pow = check_pow_hid0;
4328 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4329 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4330 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4331 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4332 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4333 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4334 PPC_SEGMENT | PPC_EXTERN;
4335 pcc->msr_mask = (1ull << MSR_POW) |
4336 (1ull << MSR_ILE) |
4337 (1ull << MSR_EE) |
4338 (1ull << MSR_PR) |
4339 (1ull << MSR_FP) |
4340 (1ull << MSR_ME) |
4341 (1ull << MSR_FE0) |
4342 (1ull << MSR_SE) |
4343 (1ull << MSR_DE) |
4344 (1ull << MSR_FE1) |
4345 (1ull << MSR_EP) |
4346 (1ull << MSR_IR) |
4347 (1ull << MSR_DR) |
4348 (1ull << MSR_PMM) |
4349 (1ull << MSR_RI) |
4350 (1ull << MSR_LE);
4351 pcc->mmu_model = POWERPC_MMU_32B;
4352 pcc->excp_model = POWERPC_EXCP_7xx;
4353 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4354 pcc->bfd_mach = bfd_mach_ppc_750;
4355 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4356 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4359 static void init_proc_750fx(CPUPPCState *env)
4361 register_ne_601_sprs(env);
4362 register_sdr1_sprs(env);
4363 register_7xx_sprs(env);
4365 spr_register(env, SPR_L2CR, "L2CR",
4366 SPR_NOACCESS, SPR_NOACCESS,
4367 &spr_read_generic, spr_access_nop,
4368 0x00000000);
4369 /* Thermal management */
4370 register_thrm_sprs(env);
4372 spr_register(env, SPR_750_THRM4, "THRM4",
4373 SPR_NOACCESS, SPR_NOACCESS,
4374 &spr_read_generic, &spr_write_generic,
4375 0x00000000);
4376 /* Hardware implementation registers */
4377 spr_register(env, SPR_750FX_HID2, "HID2",
4378 SPR_NOACCESS, SPR_NOACCESS,
4379 &spr_read_generic, &spr_write_generic,
4380 0x00000000);
4381 /* Memory management */
4382 register_low_BATs(env);
4383 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
4384 register_high_BATs(env);
4385 init_excp_7x0(env);
4386 env->dcache_line_size = 32;
4387 env->icache_line_size = 32;
4388 /* Allocate hardware IRQ controller */
4389 ppc6xx_irq_init(env_archcpu(env));
4392 POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
4394 DeviceClass *dc = DEVICE_CLASS(oc);
4395 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4397 dc->desc = "PowerPC 750FX";
4398 pcc->init_proc = init_proc_750fx;
4399 pcc->check_pow = check_pow_hid0;
4400 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4401 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4402 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4403 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4404 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4405 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4406 PPC_SEGMENT | PPC_EXTERN;
4407 pcc->msr_mask = (1ull << MSR_POW) |
4408 (1ull << MSR_ILE) |
4409 (1ull << MSR_EE) |
4410 (1ull << MSR_PR) |
4411 (1ull << MSR_FP) |
4412 (1ull << MSR_ME) |
4413 (1ull << MSR_FE0) |
4414 (1ull << MSR_SE) |
4415 (1ull << MSR_DE) |
4416 (1ull << MSR_FE1) |
4417 (1ull << MSR_EP) |
4418 (1ull << MSR_IR) |
4419 (1ull << MSR_DR) |
4420 (1ull << MSR_PMM) |
4421 (1ull << MSR_RI) |
4422 (1ull << MSR_LE);
4423 pcc->mmu_model = POWERPC_MMU_32B;
4424 pcc->excp_model = POWERPC_EXCP_7xx;
4425 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4426 pcc->bfd_mach = bfd_mach_ppc_750;
4427 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4428 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4431 static void init_proc_750gx(CPUPPCState *env)
4433 register_ne_601_sprs(env);
4434 register_sdr1_sprs(env);
4435 register_7xx_sprs(env);
4437 spr_register(env, SPR_L2CR, "L2CR",
4438 SPR_NOACCESS, SPR_NOACCESS,
4439 &spr_read_generic, spr_access_nop,
4440 0x00000000);
4441 /* Thermal management */
4442 register_thrm_sprs(env);
4444 spr_register(env, SPR_750_THRM4, "THRM4",
4445 SPR_NOACCESS, SPR_NOACCESS,
4446 &spr_read_generic, &spr_write_generic,
4447 0x00000000);
4448 /* Hardware implementation registers */
4449 spr_register(env, SPR_750FX_HID2, "HID2",
4450 SPR_NOACCESS, SPR_NOACCESS,
4451 &spr_read_generic, &spr_write_generic,
4452 0x00000000);
4453 /* Memory management */
4454 register_low_BATs(env);
4455 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
4456 register_high_BATs(env);
4457 init_excp_7x0(env);
4458 env->dcache_line_size = 32;
4459 env->icache_line_size = 32;
4460 /* Allocate hardware IRQ controller */
4461 ppc6xx_irq_init(env_archcpu(env));
4464 POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
4466 DeviceClass *dc = DEVICE_CLASS(oc);
4467 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4469 dc->desc = "PowerPC 750GX";
4470 pcc->init_proc = init_proc_750gx;
4471 pcc->check_pow = check_pow_hid0;
4472 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4473 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4474 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4475 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4476 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4477 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4478 PPC_SEGMENT | PPC_EXTERN;
4479 pcc->msr_mask = (1ull << MSR_POW) |
4480 (1ull << MSR_ILE) |
4481 (1ull << MSR_EE) |
4482 (1ull << MSR_PR) |
4483 (1ull << MSR_FP) |
4484 (1ull << MSR_ME) |
4485 (1ull << MSR_FE0) |
4486 (1ull << MSR_SE) |
4487 (1ull << MSR_DE) |
4488 (1ull << MSR_FE1) |
4489 (1ull << MSR_EP) |
4490 (1ull << MSR_IR) |
4491 (1ull << MSR_DR) |
4492 (1ull << MSR_PMM) |
4493 (1ull << MSR_RI) |
4494 (1ull << MSR_LE);
4495 pcc->mmu_model = POWERPC_MMU_32B;
4496 pcc->excp_model = POWERPC_EXCP_7xx;
4497 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4498 pcc->bfd_mach = bfd_mach_ppc_750;
4499 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4500 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4503 static void init_proc_745(CPUPPCState *env)
4505 register_ne_601_sprs(env);
4506 register_sdr1_sprs(env);
4507 register_7xx_sprs(env);
4508 register_745_sprs(env);
4509 /* Thermal management */
4510 register_thrm_sprs(env);
4512 /* Memory management */
4513 register_low_BATs(env);
4514 register_high_BATs(env);
4515 register_6xx_7xx_soft_tlb(env, 64, 2);
4516 init_excp_7x5(env);
4517 env->dcache_line_size = 32;
4518 env->icache_line_size = 32;
4519 /* Allocate hardware IRQ controller */
4520 ppc6xx_irq_init(env_archcpu(env));
4523 POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
4525 DeviceClass *dc = DEVICE_CLASS(oc);
4526 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4528 dc->desc = "PowerPC 745";
4529 pcc->init_proc = init_proc_745;
4530 pcc->check_pow = check_pow_hid0;
4531 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4532 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4533 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4534 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4535 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4536 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4537 PPC_SEGMENT | PPC_EXTERN;
4538 pcc->msr_mask = (1ull << MSR_POW) |
4539 (1ull << MSR_ILE) |
4540 (1ull << MSR_EE) |
4541 (1ull << MSR_PR) |
4542 (1ull << MSR_FP) |
4543 (1ull << MSR_ME) |
4544 (1ull << MSR_FE0) |
4545 (1ull << MSR_SE) |
4546 (1ull << MSR_DE) |
4547 (1ull << MSR_FE1) |
4548 (1ull << MSR_EP) |
4549 (1ull << MSR_IR) |
4550 (1ull << MSR_DR) |
4551 (1ull << MSR_PMM) |
4552 (1ull << MSR_RI) |
4553 (1ull << MSR_LE);
4554 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4555 pcc->excp_model = POWERPC_EXCP_7xx;
4556 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4557 pcc->bfd_mach = bfd_mach_ppc_750;
4558 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4559 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4562 static void init_proc_755(CPUPPCState *env)
4564 register_ne_601_sprs(env);
4565 register_sdr1_sprs(env);
4566 register_7xx_sprs(env);
4567 register_745_sprs(env);
4568 register_755_sprs(env);
4570 /* Thermal management */
4571 register_thrm_sprs(env);
4573 /* Memory management */
4574 register_low_BATs(env);
4575 register_high_BATs(env);
4576 register_6xx_7xx_soft_tlb(env, 64, 2);
4577 init_excp_7x5(env);
4578 env->dcache_line_size = 32;
4579 env->icache_line_size = 32;
4580 /* Allocate hardware IRQ controller */
4581 ppc6xx_irq_init(env_archcpu(env));
4584 POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
4586 DeviceClass *dc = DEVICE_CLASS(oc);
4587 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4589 dc->desc = "PowerPC 755";
4590 pcc->init_proc = init_proc_755;
4591 pcc->check_pow = check_pow_hid0;
4592 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4593 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4594 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4595 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4596 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4597 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4598 PPC_SEGMENT | PPC_EXTERN;
4599 pcc->msr_mask = (1ull << MSR_POW) |
4600 (1ull << MSR_ILE) |
4601 (1ull << MSR_EE) |
4602 (1ull << MSR_PR) |
4603 (1ull << MSR_FP) |
4604 (1ull << MSR_ME) |
4605 (1ull << MSR_FE0) |
4606 (1ull << MSR_SE) |
4607 (1ull << MSR_DE) |
4608 (1ull << MSR_FE1) |
4609 (1ull << MSR_EP) |
4610 (1ull << MSR_IR) |
4611 (1ull << MSR_DR) |
4612 (1ull << MSR_PMM) |
4613 (1ull << MSR_RI) |
4614 (1ull << MSR_LE);
4615 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4616 pcc->excp_model = POWERPC_EXCP_7xx;
4617 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4618 pcc->bfd_mach = bfd_mach_ppc_750;
4619 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4620 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4623 static void init_proc_7400(CPUPPCState *env)
4625 register_ne_601_sprs(env);
4626 register_sdr1_sprs(env);
4627 register_74xx_sprs(env);
4628 vscr_init(env, 0x00010000);
4630 spr_register(env, SPR_UBAMR, "UBAMR",
4631 &spr_read_ureg, SPR_NOACCESS,
4632 &spr_read_ureg, SPR_NOACCESS,
4633 0x00000000);
4635 spr_register(env, SPR_MSSCR1, "MSSCR1",
4636 SPR_NOACCESS, SPR_NOACCESS,
4637 &spr_read_generic, &spr_write_generic,
4638 0x00000000);
4639 /* Thermal management */
4640 register_thrm_sprs(env);
4641 /* Memory management */
4642 register_low_BATs(env);
4643 init_excp_7400(env);
4644 env->dcache_line_size = 32;
4645 env->icache_line_size = 32;
4646 /* Allocate hardware IRQ controller */
4647 ppc6xx_irq_init(env_archcpu(env));
4650 POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
4652 DeviceClass *dc = DEVICE_CLASS(oc);
4653 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4655 dc->desc = "PowerPC 7400 (aka G4)";
4656 pcc->init_proc = init_proc_7400;
4657 pcc->check_pow = check_pow_hid0;
4658 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4659 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4660 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
4661 PPC_FLOAT_STFIWX |
4662 PPC_CACHE | PPC_CACHE_ICBI |
4663 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
4664 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4665 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4666 PPC_MEM_TLBIA |
4667 PPC_SEGMENT | PPC_EXTERN |
4668 PPC_ALTIVEC;
4669 pcc->msr_mask = (1ull << MSR_VR) |
4670 (1ull << MSR_POW) |
4671 (1ull << MSR_ILE) |
4672 (1ull << MSR_EE) |
4673 (1ull << MSR_PR) |
4674 (1ull << MSR_FP) |
4675 (1ull << MSR_ME) |
4676 (1ull << MSR_FE0) |
4677 (1ull << MSR_SE) |
4678 (1ull << MSR_DE) |
4679 (1ull << MSR_FE1) |
4680 (1ull << MSR_EP) |
4681 (1ull << MSR_IR) |
4682 (1ull << MSR_DR) |
4683 (1ull << MSR_PMM) |
4684 (1ull << MSR_RI) |
4685 (1ull << MSR_LE);
4686 pcc->mmu_model = POWERPC_MMU_32B;
4687 pcc->excp_model = POWERPC_EXCP_74xx;
4688 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4689 pcc->bfd_mach = bfd_mach_ppc_7400;
4690 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
4691 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
4692 POWERPC_FLAG_BUS_CLK;
4695 static void init_proc_7410(CPUPPCState *env)
4697 register_ne_601_sprs(env);
4698 register_sdr1_sprs(env);
4699 register_74xx_sprs(env);
4700 vscr_init(env, 0x00010000);
4702 spr_register(env, SPR_UBAMR, "UBAMR",
4703 &spr_read_ureg, SPR_NOACCESS,
4704 &spr_read_ureg, SPR_NOACCESS,
4705 0x00000000);
4706 /* Thermal management */
4707 register_thrm_sprs(env);
4708 /* L2PMCR */
4710 spr_register(env, SPR_L2PMCR, "L2PMCR",
4711 SPR_NOACCESS, SPR_NOACCESS,
4712 &spr_read_generic, &spr_write_generic,
4713 0x00000000);
4714 /* LDSTDB */
4716 spr_register(env, SPR_LDSTDB, "LDSTDB",
4717 SPR_NOACCESS, SPR_NOACCESS,
4718 &spr_read_generic, &spr_write_generic,
4719 0x00000000);
4720 /* Memory management */
4721 register_low_BATs(env);
4722 init_excp_7400(env);
4723 env->dcache_line_size = 32;
4724 env->icache_line_size = 32;
4725 /* Allocate hardware IRQ controller */
4726 ppc6xx_irq_init(env_archcpu(env));
4729 POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
4731 DeviceClass *dc = DEVICE_CLASS(oc);
4732 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4734 dc->desc = "PowerPC 7410 (aka G4)";
4735 pcc->init_proc = init_proc_7410;
4736 pcc->check_pow = check_pow_hid0;
4737 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4738 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4739 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
4740 PPC_FLOAT_STFIWX |
4741 PPC_CACHE | PPC_CACHE_ICBI |
4742 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
4743 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4744 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4745 PPC_MEM_TLBIA |
4746 PPC_SEGMENT | PPC_EXTERN |
4747 PPC_ALTIVEC;
4748 pcc->msr_mask = (1ull << MSR_VR) |
4749 (1ull << MSR_POW) |
4750 (1ull << MSR_ILE) |
4751 (1ull << MSR_EE) |
4752 (1ull << MSR_PR) |
4753 (1ull << MSR_FP) |
4754 (1ull << MSR_ME) |
4755 (1ull << MSR_FE0) |
4756 (1ull << MSR_SE) |
4757 (1ull << MSR_DE) |
4758 (1ull << MSR_FE1) |
4759 (1ull << MSR_EP) |
4760 (1ull << MSR_IR) |
4761 (1ull << MSR_DR) |
4762 (1ull << MSR_PMM) |
4763 (1ull << MSR_RI) |
4764 (1ull << MSR_LE);
4765 pcc->mmu_model = POWERPC_MMU_32B;
4766 pcc->excp_model = POWERPC_EXCP_74xx;
4767 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4768 pcc->bfd_mach = bfd_mach_ppc_7400;
4769 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
4770 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
4771 POWERPC_FLAG_BUS_CLK;
4774 static void init_proc_7440(CPUPPCState *env)
4776 register_ne_601_sprs(env);
4777 register_sdr1_sprs(env);
4778 register_74xx_sprs(env);
4779 vscr_init(env, 0x00010000);
4781 spr_register(env, SPR_UBAMR, "UBAMR",
4782 &spr_read_ureg, SPR_NOACCESS,
4783 &spr_read_ureg, SPR_NOACCESS,
4784 0x00000000);
4785 /* LDSTCR */
4786 spr_register(env, SPR_LDSTCR, "LDSTCR",
4787 SPR_NOACCESS, SPR_NOACCESS,
4788 &spr_read_generic, &spr_write_generic,
4789 0x00000000);
4790 /* ICTRL */
4791 spr_register(env, SPR_ICTRL, "ICTRL",
4792 SPR_NOACCESS, SPR_NOACCESS,
4793 &spr_read_generic, &spr_write_generic,
4794 0x00000000);
4795 /* MSSSR0 */
4796 spr_register(env, SPR_MSSSR0, "MSSSR0",
4797 SPR_NOACCESS, SPR_NOACCESS,
4798 &spr_read_generic, &spr_write_generic,
4799 0x00000000);
4800 /* PMC */
4801 spr_register(env, SPR_7XX_PMC5, "PMC5",
4802 SPR_NOACCESS, SPR_NOACCESS,
4803 &spr_read_generic, &spr_write_generic,
4804 0x00000000);
4806 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
4807 &spr_read_ureg, SPR_NOACCESS,
4808 &spr_read_ureg, SPR_NOACCESS,
4809 0x00000000);
4811 spr_register(env, SPR_7XX_PMC6, "PMC6",
4812 SPR_NOACCESS, SPR_NOACCESS,
4813 &spr_read_generic, &spr_write_generic,
4814 0x00000000);
4816 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
4817 &spr_read_ureg, SPR_NOACCESS,
4818 &spr_read_ureg, SPR_NOACCESS,
4819 0x00000000);
4820 /* Memory management */
4821 register_low_BATs(env);
4822 init_excp_7450(env);
4823 env->dcache_line_size = 32;
4824 env->icache_line_size = 32;
4825 /* Allocate hardware IRQ controller */
4826 ppc6xx_irq_init(env_archcpu(env));
4829 POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
4831 DeviceClass *dc = DEVICE_CLASS(oc);
4832 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4834 dc->desc = "PowerPC 7440 (aka G4)";
4835 pcc->init_proc = init_proc_7440;
4836 pcc->check_pow = check_pow_hid0_74xx;
4837 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4838 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4839 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
4840 PPC_FLOAT_STFIWX |
4841 PPC_CACHE | PPC_CACHE_ICBI |
4842 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
4843 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4844 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4845 PPC_MEM_TLBIA |
4846 PPC_SEGMENT | PPC_EXTERN |
4847 PPC_ALTIVEC;
4848 pcc->msr_mask = (1ull << MSR_VR) |
4849 (1ull << MSR_POW) |
4850 (1ull << MSR_ILE) |
4851 (1ull << MSR_EE) |
4852 (1ull << MSR_PR) |
4853 (1ull << MSR_FP) |
4854 (1ull << MSR_ME) |
4855 (1ull << MSR_FE0) |
4856 (1ull << MSR_SE) |
4857 (1ull << MSR_DE) |
4858 (1ull << MSR_FE1) |
4859 (1ull << MSR_EP) |
4860 (1ull << MSR_IR) |
4861 (1ull << MSR_DR) |
4862 (1ull << MSR_PMM) |
4863 (1ull << MSR_RI) |
4864 (1ull << MSR_LE);
4865 pcc->mmu_model = POWERPC_MMU_32B;
4866 pcc->excp_model = POWERPC_EXCP_74xx;
4867 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4868 pcc->bfd_mach = bfd_mach_ppc_7400;
4869 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
4870 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
4871 POWERPC_FLAG_BUS_CLK;
4874 static void init_proc_7450(CPUPPCState *env)
4876 register_ne_601_sprs(env);
4877 register_sdr1_sprs(env);
4878 register_74xx_sprs(env);
4879 vscr_init(env, 0x00010000);
4880 /* Level 3 cache control */
4881 register_l3_ctrl(env);
4882 /* L3ITCR1 */
4883 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
4884 SPR_NOACCESS, SPR_NOACCESS,
4885 &spr_read_generic, &spr_write_generic,
4886 0x00000000);
4887 /* L3ITCR2 */
4888 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
4889 SPR_NOACCESS, SPR_NOACCESS,
4890 &spr_read_generic, &spr_write_generic,
4891 0x00000000);
4892 /* L3ITCR3 */
4893 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
4894 SPR_NOACCESS, SPR_NOACCESS,
4895 &spr_read_generic, &spr_write_generic,
4896 0x00000000);
4897 /* L3OHCR */
4898 spr_register(env, SPR_L3OHCR, "L3OHCR",
4899 SPR_NOACCESS, SPR_NOACCESS,
4900 &spr_read_generic, &spr_write_generic,
4901 0x00000000);
4903 spr_register(env, SPR_UBAMR, "UBAMR",
4904 &spr_read_ureg, SPR_NOACCESS,
4905 &spr_read_ureg, SPR_NOACCESS,
4906 0x00000000);
4907 /* LDSTCR */
4908 spr_register(env, SPR_LDSTCR, "LDSTCR",
4909 SPR_NOACCESS, SPR_NOACCESS,
4910 &spr_read_generic, &spr_write_generic,
4911 0x00000000);
4912 /* ICTRL */
4913 spr_register(env, SPR_ICTRL, "ICTRL",
4914 SPR_NOACCESS, SPR_NOACCESS,
4915 &spr_read_generic, &spr_write_generic,
4916 0x00000000);
4917 /* MSSSR0 */
4918 spr_register(env, SPR_MSSSR0, "MSSSR0",
4919 SPR_NOACCESS, SPR_NOACCESS,
4920 &spr_read_generic, &spr_write_generic,
4921 0x00000000);
4922 /* PMC */
4923 spr_register(env, SPR_7XX_PMC5, "PMC5",
4924 SPR_NOACCESS, SPR_NOACCESS,
4925 &spr_read_generic, &spr_write_generic,
4926 0x00000000);
4928 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
4929 &spr_read_ureg, SPR_NOACCESS,
4930 &spr_read_ureg, SPR_NOACCESS,
4931 0x00000000);
4933 spr_register(env, SPR_7XX_PMC6, "PMC6",
4934 SPR_NOACCESS, SPR_NOACCESS,
4935 &spr_read_generic, &spr_write_generic,
4936 0x00000000);
4938 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
4939 &spr_read_ureg, SPR_NOACCESS,
4940 &spr_read_ureg, SPR_NOACCESS,
4941 0x00000000);
4942 /* Memory management */
4943 register_low_BATs(env);
4944 init_excp_7450(env);
4945 env->dcache_line_size = 32;
4946 env->icache_line_size = 32;
4947 /* Allocate hardware IRQ controller */
4948 ppc6xx_irq_init(env_archcpu(env));
4951 POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
4953 DeviceClass *dc = DEVICE_CLASS(oc);
4954 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4956 dc->desc = "PowerPC 7450 (aka G4)";
4957 pcc->init_proc = init_proc_7450;
4958 pcc->check_pow = check_pow_hid0_74xx;
4959 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4960 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4961 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
4962 PPC_FLOAT_STFIWX |
4963 PPC_CACHE | PPC_CACHE_ICBI |
4964 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
4965 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4966 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4967 PPC_MEM_TLBIA |
4968 PPC_SEGMENT | PPC_EXTERN |
4969 PPC_ALTIVEC;
4970 pcc->msr_mask = (1ull << MSR_VR) |
4971 (1ull << MSR_POW) |
4972 (1ull << MSR_ILE) |
4973 (1ull << MSR_EE) |
4974 (1ull << MSR_PR) |
4975 (1ull << MSR_FP) |
4976 (1ull << MSR_ME) |
4977 (1ull << MSR_FE0) |
4978 (1ull << MSR_SE) |
4979 (1ull << MSR_DE) |
4980 (1ull << MSR_FE1) |
4981 (1ull << MSR_EP) |
4982 (1ull << MSR_IR) |
4983 (1ull << MSR_DR) |
4984 (1ull << MSR_PMM) |
4985 (1ull << MSR_RI) |
4986 (1ull << MSR_LE);
4987 pcc->mmu_model = POWERPC_MMU_32B;
4988 pcc->excp_model = POWERPC_EXCP_74xx;
4989 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4990 pcc->bfd_mach = bfd_mach_ppc_7400;
4991 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
4992 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
4993 POWERPC_FLAG_BUS_CLK;
4996 static void init_proc_7445(CPUPPCState *env)
4998 register_ne_601_sprs(env);
4999 register_sdr1_sprs(env);
5000 register_74xx_sprs(env);
5001 vscr_init(env, 0x00010000);
5002 /* LDSTCR */
5003 spr_register(env, SPR_LDSTCR, "LDSTCR",
5004 SPR_NOACCESS, SPR_NOACCESS,
5005 &spr_read_generic, &spr_write_generic,
5006 0x00000000);
5007 /* ICTRL */
5008 spr_register(env, SPR_ICTRL, "ICTRL",
5009 SPR_NOACCESS, SPR_NOACCESS,
5010 &spr_read_generic, &spr_write_generic,
5011 0x00000000);
5012 /* MSSSR0 */
5013 spr_register(env, SPR_MSSSR0, "MSSSR0",
5014 SPR_NOACCESS, SPR_NOACCESS,
5015 &spr_read_generic, &spr_write_generic,
5016 0x00000000);
5017 /* PMC */
5018 spr_register(env, SPR_7XX_PMC5, "PMC5",
5019 SPR_NOACCESS, SPR_NOACCESS,
5020 &spr_read_generic, &spr_write_generic,
5021 0x00000000);
5023 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
5024 &spr_read_ureg, SPR_NOACCESS,
5025 &spr_read_ureg, SPR_NOACCESS,
5026 0x00000000);
5028 spr_register(env, SPR_7XX_PMC6, "PMC6",
5029 SPR_NOACCESS, SPR_NOACCESS,
5030 &spr_read_generic, &spr_write_generic,
5031 0x00000000);
5033 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
5034 &spr_read_ureg, SPR_NOACCESS,
5035 &spr_read_ureg, SPR_NOACCESS,
5036 0x00000000);
5037 /* SPRGs */
5038 spr_register(env, SPR_SPRG4, "SPRG4",
5039 SPR_NOACCESS, SPR_NOACCESS,
5040 &spr_read_generic, &spr_write_generic,
5041 0x00000000);
5042 spr_register(env, SPR_USPRG4, "USPRG4",
5043 &spr_read_ureg, SPR_NOACCESS,
5044 &spr_read_ureg, SPR_NOACCESS,
5045 0x00000000);
5046 spr_register(env, SPR_SPRG5, "SPRG5",
5047 SPR_NOACCESS, SPR_NOACCESS,
5048 &spr_read_generic, &spr_write_generic,
5049 0x00000000);
5050 spr_register(env, SPR_USPRG5, "USPRG5",
5051 &spr_read_ureg, SPR_NOACCESS,
5052 &spr_read_ureg, SPR_NOACCESS,
5053 0x00000000);
5054 spr_register(env, SPR_SPRG6, "SPRG6",
5055 SPR_NOACCESS, SPR_NOACCESS,
5056 &spr_read_generic, &spr_write_generic,
5057 0x00000000);
5058 spr_register(env, SPR_USPRG6, "USPRG6",
5059 &spr_read_ureg, SPR_NOACCESS,
5060 &spr_read_ureg, SPR_NOACCESS,
5061 0x00000000);
5062 spr_register(env, SPR_SPRG7, "SPRG7",
5063 SPR_NOACCESS, SPR_NOACCESS,
5064 &spr_read_generic, &spr_write_generic,
5065 0x00000000);
5066 spr_register(env, SPR_USPRG7, "USPRG7",
5067 &spr_read_ureg, SPR_NOACCESS,
5068 &spr_read_ureg, SPR_NOACCESS,
5069 0x00000000);
5070 /* Memory management */
5071 register_low_BATs(env);
5072 register_high_BATs(env);
5073 init_excp_7450(env);
5074 env->dcache_line_size = 32;
5075 env->icache_line_size = 32;
5076 /* Allocate hardware IRQ controller */
5077 ppc6xx_irq_init(env_archcpu(env));
5080 POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
5082 DeviceClass *dc = DEVICE_CLASS(oc);
5083 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5085 dc->desc = "PowerPC 7445 (aka G4)";
5086 pcc->init_proc = init_proc_7445;
5087 pcc->check_pow = check_pow_hid0_74xx;
5088 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5089 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5090 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5091 PPC_FLOAT_STFIWX |
5092 PPC_CACHE | PPC_CACHE_ICBI |
5093 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5094 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5095 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5096 PPC_MEM_TLBIA |
5097 PPC_SEGMENT | PPC_EXTERN |
5098 PPC_ALTIVEC;
5099 pcc->msr_mask = (1ull << MSR_VR) |
5100 (1ull << MSR_POW) |
5101 (1ull << MSR_ILE) |
5102 (1ull << MSR_EE) |
5103 (1ull << MSR_PR) |
5104 (1ull << MSR_FP) |
5105 (1ull << MSR_ME) |
5106 (1ull << MSR_FE0) |
5107 (1ull << MSR_SE) |
5108 (1ull << MSR_DE) |
5109 (1ull << MSR_FE1) |
5110 (1ull << MSR_EP) |
5111 (1ull << MSR_IR) |
5112 (1ull << MSR_DR) |
5113 (1ull << MSR_PMM) |
5114 (1ull << MSR_RI) |
5115 (1ull << MSR_LE);
5116 pcc->mmu_model = POWERPC_MMU_32B;
5117 pcc->excp_model = POWERPC_EXCP_74xx;
5118 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5119 pcc->bfd_mach = bfd_mach_ppc_7400;
5120 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5121 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5122 POWERPC_FLAG_BUS_CLK;
5125 static void init_proc_7455(CPUPPCState *env)
5127 register_ne_601_sprs(env);
5128 register_sdr1_sprs(env);
5129 register_74xx_sprs(env);
5130 vscr_init(env, 0x00010000);
5131 /* Level 3 cache control */
5132 register_l3_ctrl(env);
5133 /* LDSTCR */
5134 spr_register(env, SPR_LDSTCR, "LDSTCR",
5135 SPR_NOACCESS, SPR_NOACCESS,
5136 &spr_read_generic, &spr_write_generic,
5137 0x00000000);
5138 /* ICTRL */
5139 spr_register(env, SPR_ICTRL, "ICTRL",
5140 SPR_NOACCESS, SPR_NOACCESS,
5141 &spr_read_generic, &spr_write_generic,
5142 0x00000000);
5143 /* MSSSR0 */
5144 spr_register(env, SPR_MSSSR0, "MSSSR0",
5145 SPR_NOACCESS, SPR_NOACCESS,
5146 &spr_read_generic, &spr_write_generic,
5147 0x00000000);
5148 /* PMC */
5149 spr_register(env, SPR_7XX_PMC5, "PMC5",
5150 SPR_NOACCESS, SPR_NOACCESS,
5151 &spr_read_generic, &spr_write_generic,
5152 0x00000000);
5154 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
5155 &spr_read_ureg, SPR_NOACCESS,
5156 &spr_read_ureg, SPR_NOACCESS,
5157 0x00000000);
5159 spr_register(env, SPR_7XX_PMC6, "PMC6",
5160 SPR_NOACCESS, SPR_NOACCESS,
5161 &spr_read_generic, &spr_write_generic,
5162 0x00000000);
5164 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
5165 &spr_read_ureg, SPR_NOACCESS,
5166 &spr_read_ureg, SPR_NOACCESS,
5167 0x00000000);
5168 /* SPRGs */
5169 spr_register(env, SPR_SPRG4, "SPRG4",
5170 SPR_NOACCESS, SPR_NOACCESS,
5171 &spr_read_generic, &spr_write_generic,
5172 0x00000000);
5173 spr_register(env, SPR_USPRG4, "USPRG4",
5174 &spr_read_ureg, SPR_NOACCESS,
5175 &spr_read_ureg, SPR_NOACCESS,
5176 0x00000000);
5177 spr_register(env, SPR_SPRG5, "SPRG5",
5178 SPR_NOACCESS, SPR_NOACCESS,
5179 &spr_read_generic, &spr_write_generic,
5180 0x00000000);
5181 spr_register(env, SPR_USPRG5, "USPRG5",
5182 &spr_read_ureg, SPR_NOACCESS,
5183 &spr_read_ureg, SPR_NOACCESS,
5184 0x00000000);
5185 spr_register(env, SPR_SPRG6, "SPRG6",
5186 SPR_NOACCESS, SPR_NOACCESS,
5187 &spr_read_generic, &spr_write_generic,
5188 0x00000000);
5189 spr_register(env, SPR_USPRG6, "USPRG6",
5190 &spr_read_ureg, SPR_NOACCESS,
5191 &spr_read_ureg, SPR_NOACCESS,
5192 0x00000000);
5193 spr_register(env, SPR_SPRG7, "SPRG7",
5194 SPR_NOACCESS, SPR_NOACCESS,
5195 &spr_read_generic, &spr_write_generic,
5196 0x00000000);
5197 spr_register(env, SPR_USPRG7, "USPRG7",
5198 &spr_read_ureg, SPR_NOACCESS,
5199 &spr_read_ureg, SPR_NOACCESS,
5200 0x00000000);
5201 /* Memory management */
5202 register_low_BATs(env);
5203 register_high_BATs(env);
5204 init_excp_7450(env);
5205 env->dcache_line_size = 32;
5206 env->icache_line_size = 32;
5207 /* Allocate hardware IRQ controller */
5208 ppc6xx_irq_init(env_archcpu(env));
5211 POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
5213 DeviceClass *dc = DEVICE_CLASS(oc);
5214 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5216 dc->desc = "PowerPC 7455 (aka G4)";
5217 pcc->init_proc = init_proc_7455;
5218 pcc->check_pow = check_pow_hid0_74xx;
5219 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5220 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5221 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5222 PPC_FLOAT_STFIWX |
5223 PPC_CACHE | PPC_CACHE_ICBI |
5224 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5225 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5226 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5227 PPC_MEM_TLBIA |
5228 PPC_SEGMENT | PPC_EXTERN |
5229 PPC_ALTIVEC;
5230 pcc->msr_mask = (1ull << MSR_VR) |
5231 (1ull << MSR_POW) |
5232 (1ull << MSR_ILE) |
5233 (1ull << MSR_EE) |
5234 (1ull << MSR_PR) |
5235 (1ull << MSR_FP) |
5236 (1ull << MSR_ME) |
5237 (1ull << MSR_FE0) |
5238 (1ull << MSR_SE) |
5239 (1ull << MSR_DE) |
5240 (1ull << MSR_FE1) |
5241 (1ull << MSR_EP) |
5242 (1ull << MSR_IR) |
5243 (1ull << MSR_DR) |
5244 (1ull << MSR_PMM) |
5245 (1ull << MSR_RI) |
5246 (1ull << MSR_LE);
5247 pcc->mmu_model = POWERPC_MMU_32B;
5248 pcc->excp_model = POWERPC_EXCP_74xx;
5249 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5250 pcc->bfd_mach = bfd_mach_ppc_7400;
5251 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5252 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5253 POWERPC_FLAG_BUS_CLK;
5256 static void init_proc_7457(CPUPPCState *env)
5258 register_ne_601_sprs(env);
5259 register_sdr1_sprs(env);
5260 register_74xx_sprs(env);
5261 vscr_init(env, 0x00010000);
5262 /* Level 3 cache control */
5263 register_l3_ctrl(env);
5264 /* L3ITCR1 */
5265 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
5266 SPR_NOACCESS, SPR_NOACCESS,
5267 &spr_read_generic, &spr_write_generic,
5268 0x00000000);
5269 /* L3ITCR2 */
5270 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
5271 SPR_NOACCESS, SPR_NOACCESS,
5272 &spr_read_generic, &spr_write_generic,
5273 0x00000000);
5274 /* L3ITCR3 */
5275 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
5276 SPR_NOACCESS, SPR_NOACCESS,
5277 &spr_read_generic, &spr_write_generic,
5278 0x00000000);
5279 /* L3OHCR */
5280 spr_register(env, SPR_L3OHCR, "L3OHCR",
5281 SPR_NOACCESS, SPR_NOACCESS,
5282 &spr_read_generic, &spr_write_generic,
5283 0x00000000);
5284 /* LDSTCR */
5285 spr_register(env, SPR_LDSTCR, "LDSTCR",
5286 SPR_NOACCESS, SPR_NOACCESS,
5287 &spr_read_generic, &spr_write_generic,
5288 0x00000000);
5289 /* ICTRL */
5290 spr_register(env, SPR_ICTRL, "ICTRL",
5291 SPR_NOACCESS, SPR_NOACCESS,
5292 &spr_read_generic, &spr_write_generic,
5293 0x00000000);
5294 /* MSSSR0 */
5295 spr_register(env, SPR_MSSSR0, "MSSSR0",
5296 SPR_NOACCESS, SPR_NOACCESS,
5297 &spr_read_generic, &spr_write_generic,
5298 0x00000000);
5299 /* PMC */
5300 spr_register(env, SPR_7XX_PMC5, "PMC5",
5301 SPR_NOACCESS, SPR_NOACCESS,
5302 &spr_read_generic, &spr_write_generic,
5303 0x00000000);
5305 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
5306 &spr_read_ureg, SPR_NOACCESS,
5307 &spr_read_ureg, SPR_NOACCESS,
5308 0x00000000);
5310 spr_register(env, SPR_7XX_PMC6, "PMC6",
5311 SPR_NOACCESS, SPR_NOACCESS,
5312 &spr_read_generic, &spr_write_generic,
5313 0x00000000);
5315 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
5316 &spr_read_ureg, SPR_NOACCESS,
5317 &spr_read_ureg, SPR_NOACCESS,
5318 0x00000000);
5319 /* SPRGs */
5320 spr_register(env, SPR_SPRG4, "SPRG4",
5321 SPR_NOACCESS, SPR_NOACCESS,
5322 &spr_read_generic, &spr_write_generic,
5323 0x00000000);
5324 spr_register(env, SPR_USPRG4, "USPRG4",
5325 &spr_read_ureg, SPR_NOACCESS,
5326 &spr_read_ureg, SPR_NOACCESS,
5327 0x00000000);
5328 spr_register(env, SPR_SPRG5, "SPRG5",
5329 SPR_NOACCESS, SPR_NOACCESS,
5330 &spr_read_generic, &spr_write_generic,
5331 0x00000000);
5332 spr_register(env, SPR_USPRG5, "USPRG5",
5333 &spr_read_ureg, SPR_NOACCESS,
5334 &spr_read_ureg, SPR_NOACCESS,
5335 0x00000000);
5336 spr_register(env, SPR_SPRG6, "SPRG6",
5337 SPR_NOACCESS, SPR_NOACCESS,
5338 &spr_read_generic, &spr_write_generic,
5339 0x00000000);
5340 spr_register(env, SPR_USPRG6, "USPRG6",
5341 &spr_read_ureg, SPR_NOACCESS,
5342 &spr_read_ureg, SPR_NOACCESS,
5343 0x00000000);
5344 spr_register(env, SPR_SPRG7, "SPRG7",
5345 SPR_NOACCESS, SPR_NOACCESS,
5346 &spr_read_generic, &spr_write_generic,
5347 0x00000000);
5348 spr_register(env, SPR_USPRG7, "USPRG7",
5349 &spr_read_ureg, SPR_NOACCESS,
5350 &spr_read_ureg, SPR_NOACCESS,
5351 0x00000000);
5352 /* Memory management */
5353 register_low_BATs(env);
5354 register_high_BATs(env);
5355 init_excp_7450(env);
5356 env->dcache_line_size = 32;
5357 env->icache_line_size = 32;
5358 /* Allocate hardware IRQ controller */
5359 ppc6xx_irq_init(env_archcpu(env));
5362 POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
5364 DeviceClass *dc = DEVICE_CLASS(oc);
5365 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5367 dc->desc = "PowerPC 7457 (aka G4)";
5368 pcc->init_proc = init_proc_7457;
5369 pcc->check_pow = check_pow_hid0_74xx;
5370 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5371 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5372 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5373 PPC_FLOAT_STFIWX |
5374 PPC_CACHE | PPC_CACHE_ICBI |
5375 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5376 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5377 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5378 PPC_MEM_TLBIA |
5379 PPC_SEGMENT | PPC_EXTERN |
5380 PPC_ALTIVEC;
5381 pcc->msr_mask = (1ull << MSR_VR) |
5382 (1ull << MSR_POW) |
5383 (1ull << MSR_ILE) |
5384 (1ull << MSR_EE) |
5385 (1ull << MSR_PR) |
5386 (1ull << MSR_FP) |
5387 (1ull << MSR_ME) |
5388 (1ull << MSR_FE0) |
5389 (1ull << MSR_SE) |
5390 (1ull << MSR_DE) |
5391 (1ull << MSR_FE1) |
5392 (1ull << MSR_EP) |
5393 (1ull << MSR_IR) |
5394 (1ull << MSR_DR) |
5395 (1ull << MSR_PMM) |
5396 (1ull << MSR_RI) |
5397 (1ull << MSR_LE);
5398 pcc->mmu_model = POWERPC_MMU_32B;
5399 pcc->excp_model = POWERPC_EXCP_74xx;
5400 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5401 pcc->bfd_mach = bfd_mach_ppc_7400;
5402 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5403 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5404 POWERPC_FLAG_BUS_CLK;
5407 static void init_proc_e600(CPUPPCState *env)
5409 register_ne_601_sprs(env);
5410 register_sdr1_sprs(env);
5411 register_74xx_sprs(env);
5412 vscr_init(env, 0x00010000);
5414 spr_register(env, SPR_UBAMR, "UBAMR",
5415 &spr_read_ureg, SPR_NOACCESS,
5416 &spr_read_ureg, SPR_NOACCESS,
5417 0x00000000);
5419 spr_register(env, SPR_LDSTCR, "LDSTCR",
5420 SPR_NOACCESS, SPR_NOACCESS,
5421 &spr_read_generic, &spr_write_generic,
5422 0x00000000);
5424 spr_register(env, SPR_ICTRL, "ICTRL",
5425 SPR_NOACCESS, SPR_NOACCESS,
5426 &spr_read_generic, &spr_write_generic,
5427 0x00000000);
5429 spr_register(env, SPR_MSSSR0, "MSSSR0",
5430 SPR_NOACCESS, SPR_NOACCESS,
5431 &spr_read_generic, &spr_write_generic,
5432 0x00000000);
5434 spr_register(env, SPR_7XX_PMC5, "PMC5",
5435 SPR_NOACCESS, SPR_NOACCESS,
5436 &spr_read_generic, &spr_write_generic,
5437 0x00000000);
5439 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
5440 &spr_read_ureg, SPR_NOACCESS,
5441 &spr_read_ureg, SPR_NOACCESS,
5442 0x00000000);
5444 spr_register(env, SPR_7XX_PMC6, "PMC6",
5445 SPR_NOACCESS, SPR_NOACCESS,
5446 &spr_read_generic, &spr_write_generic,
5447 0x00000000);
5449 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
5450 &spr_read_ureg, SPR_NOACCESS,
5451 &spr_read_ureg, SPR_NOACCESS,
5452 0x00000000);
5453 /* SPRGs */
5454 spr_register(env, SPR_SPRG4, "SPRG4",
5455 SPR_NOACCESS, SPR_NOACCESS,
5456 &spr_read_generic, &spr_write_generic,
5457 0x00000000);
5458 spr_register(env, SPR_USPRG4, "USPRG4",
5459 &spr_read_ureg, SPR_NOACCESS,
5460 &spr_read_ureg, SPR_NOACCESS,
5461 0x00000000);
5462 spr_register(env, SPR_SPRG5, "SPRG5",
5463 SPR_NOACCESS, SPR_NOACCESS,
5464 &spr_read_generic, &spr_write_generic,
5465 0x00000000);
5466 spr_register(env, SPR_USPRG5, "USPRG5",
5467 &spr_read_ureg, SPR_NOACCESS,
5468 &spr_read_ureg, SPR_NOACCESS,
5469 0x00000000);
5470 spr_register(env, SPR_SPRG6, "SPRG6",
5471 SPR_NOACCESS, SPR_NOACCESS,
5472 &spr_read_generic, &spr_write_generic,
5473 0x00000000);
5474 spr_register(env, SPR_USPRG6, "USPRG6",
5475 &spr_read_ureg, SPR_NOACCESS,
5476 &spr_read_ureg, SPR_NOACCESS,
5477 0x00000000);
5478 spr_register(env, SPR_SPRG7, "SPRG7",
5479 SPR_NOACCESS, SPR_NOACCESS,
5480 &spr_read_generic, &spr_write_generic,
5481 0x00000000);
5482 spr_register(env, SPR_USPRG7, "USPRG7",
5483 &spr_read_ureg, SPR_NOACCESS,
5484 &spr_read_ureg, SPR_NOACCESS,
5485 0x00000000);
5486 /* Memory management */
5487 register_low_BATs(env);
5488 register_high_BATs(env);
5489 init_excp_7450(env);
5490 env->dcache_line_size = 32;
5491 env->icache_line_size = 32;
5492 /* Allocate hardware IRQ controller */
5493 ppc6xx_irq_init(env_archcpu(env));
5496 POWERPC_FAMILY(e600)(ObjectClass *oc, void *data)
5498 DeviceClass *dc = DEVICE_CLASS(oc);
5499 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5501 dc->desc = "PowerPC e600";
5502 pcc->init_proc = init_proc_e600;
5503 pcc->check_pow = check_pow_hid0_74xx;
5504 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5505 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5506 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5507 PPC_FLOAT_STFIWX |
5508 PPC_CACHE | PPC_CACHE_ICBI |
5509 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5510 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5511 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5512 PPC_MEM_TLBIA |
5513 PPC_SEGMENT | PPC_EXTERN |
5514 PPC_ALTIVEC;
5515 pcc->insns_flags2 = PPC_NONE;
5516 pcc->msr_mask = (1ull << MSR_VR) |
5517 (1ull << MSR_POW) |
5518 (1ull << MSR_ILE) |
5519 (1ull << MSR_EE) |
5520 (1ull << MSR_PR) |
5521 (1ull << MSR_FP) |
5522 (1ull << MSR_ME) |
5523 (1ull << MSR_FE0) |
5524 (1ull << MSR_SE) |
5525 (1ull << MSR_DE) |
5526 (1ull << MSR_FE1) |
5527 (1ull << MSR_EP) |
5528 (1ull << MSR_IR) |
5529 (1ull << MSR_DR) |
5530 (1ull << MSR_PMM) |
5531 (1ull << MSR_RI) |
5532 (1ull << MSR_LE);
5533 pcc->mmu_model = POWERPC_MMU_32B;
5534 pcc->excp_model = POWERPC_EXCP_74xx;
5535 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5536 pcc->bfd_mach = bfd_mach_ppc_7400;
5537 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5538 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5539 POWERPC_FLAG_BUS_CLK;
5542 #if defined(TARGET_PPC64)
5543 #if defined(CONFIG_USER_ONLY)
5544 #define POWERPC970_HID5_INIT 0x00000080
5545 #else
5546 #define POWERPC970_HID5_INIT 0x00000000
5547 #endif
5549 static int check_pow_970(CPUPPCState *env)
5551 if (env->spr[SPR_HID0] & (HID0_DEEPNAP | HID0_DOZE | HID0_NAP)) {
5552 return 1;
5555 return 0;
5558 static void register_970_hid_sprs(CPUPPCState *env)
5560 /* Hardware implementation registers */
5561 spr_register(env, SPR_HID0, "HID0",
5562 SPR_NOACCESS, SPR_NOACCESS,
5563 &spr_read_generic, &spr_write_clear,
5564 0x60000000);
5565 spr_register(env, SPR_HID1, "HID1",
5566 SPR_NOACCESS, SPR_NOACCESS,
5567 &spr_read_generic, &spr_write_generic,
5568 0x00000000);
5569 spr_register(env, SPR_970_HID5, "HID5",
5570 SPR_NOACCESS, SPR_NOACCESS,
5571 &spr_read_generic, &spr_write_generic,
5572 POWERPC970_HID5_INIT);
5575 static void register_970_hior_sprs(CPUPPCState *env)
5577 spr_register(env, SPR_HIOR, "SPR_HIOR",
5578 SPR_NOACCESS, SPR_NOACCESS,
5579 &spr_read_hior, &spr_write_hior,
5580 0x00000000);
5583 static void register_book3s_ctrl_sprs(CPUPPCState *env)
5585 spr_register(env, SPR_CTRL, "SPR_CTRL",
5586 SPR_NOACCESS, SPR_NOACCESS,
5587 SPR_NOACCESS, &spr_write_CTRL,
5588 0x00000000);
5589 spr_register(env, SPR_UCTRL, "SPR_UCTRL",
5590 &spr_read_ureg, SPR_NOACCESS,
5591 &spr_read_ureg, SPR_NOACCESS,
5592 0x00000000);
5595 static void register_book3s_altivec_sprs(CPUPPCState *env)
5597 if (!(env->insns_flags & PPC_ALTIVEC)) {
5598 return;
5601 spr_register_kvm(env, SPR_VRSAVE, "VRSAVE",
5602 &spr_read_generic, &spr_write_generic,
5603 &spr_read_generic, &spr_write_generic,
5604 KVM_REG_PPC_VRSAVE, 0x00000000);
5608 static void register_book3s_dbg_sprs(CPUPPCState *env)
5611 * TODO: different specs define different scopes for these,
5612 * will have to address this:
5613 * 970: super/write and super/read
5614 * powerisa 2.03..2.04: hypv/write and super/read.
5615 * powerisa 2.05 and newer: hypv/write and hypv/read.
5617 spr_register_kvm(env, SPR_DABR, "DABR",
5618 SPR_NOACCESS, SPR_NOACCESS,
5619 &spr_read_generic, &spr_write_generic,
5620 KVM_REG_PPC_DABR, 0x00000000);
5621 spr_register_kvm(env, SPR_DABRX, "DABRX",
5622 SPR_NOACCESS, SPR_NOACCESS,
5623 &spr_read_generic, &spr_write_generic,
5624 KVM_REG_PPC_DABRX, 0x00000000);
5627 static void register_book3s_207_dbg_sprs(CPUPPCState *env)
5629 spr_register_kvm_hv(env, SPR_DAWR0, "DAWR0",
5630 SPR_NOACCESS, SPR_NOACCESS,
5631 SPR_NOACCESS, SPR_NOACCESS,
5632 &spr_read_generic, &spr_write_generic,
5633 KVM_REG_PPC_DAWR, 0x00000000);
5634 spr_register_kvm_hv(env, SPR_DAWRX0, "DAWRX0",
5635 SPR_NOACCESS, SPR_NOACCESS,
5636 SPR_NOACCESS, SPR_NOACCESS,
5637 &spr_read_generic, &spr_write_generic,
5638 KVM_REG_PPC_DAWRX, 0x00000000);
5639 spr_register_kvm_hv(env, SPR_CIABR, "CIABR",
5640 SPR_NOACCESS, SPR_NOACCESS,
5641 SPR_NOACCESS, SPR_NOACCESS,
5642 &spr_read_generic, &spr_write_generic,
5643 KVM_REG_PPC_CIABR, 0x00000000);
5646 static void register_970_dbg_sprs(CPUPPCState *env)
5648 /* Breakpoints */
5649 spr_register(env, SPR_IABR, "IABR",
5650 SPR_NOACCESS, SPR_NOACCESS,
5651 &spr_read_generic, &spr_write_generic,
5652 0x00000000);
5655 static void register_book3s_pmu_sup_sprs(CPUPPCState *env)
5657 spr_register_kvm(env, SPR_POWER_MMCR0, "MMCR0",
5658 SPR_NOACCESS, SPR_NOACCESS,
5659 &spr_read_generic, &spr_write_MMCR0,
5660 KVM_REG_PPC_MMCR0, 0x80000000);
5661 spr_register_kvm(env, SPR_POWER_MMCR1, "MMCR1",
5662 SPR_NOACCESS, SPR_NOACCESS,
5663 &spr_read_generic, &spr_write_MMCR1,
5664 KVM_REG_PPC_MMCR1, 0x00000000);
5665 spr_register_kvm(env, SPR_POWER_MMCRA, "MMCRA",
5666 SPR_NOACCESS, SPR_NOACCESS,
5667 &spr_read_generic, &spr_write_generic,
5668 KVM_REG_PPC_MMCRA, 0x00000000);
5669 spr_register_kvm(env, SPR_POWER_PMC1, "PMC1",
5670 SPR_NOACCESS, SPR_NOACCESS,
5671 &spr_read_PMC, &spr_write_PMC,
5672 KVM_REG_PPC_PMC1, 0x00000000);
5673 spr_register_kvm(env, SPR_POWER_PMC2, "PMC2",
5674 SPR_NOACCESS, SPR_NOACCESS,
5675 &spr_read_PMC, &spr_write_PMC,
5676 KVM_REG_PPC_PMC2, 0x00000000);
5677 spr_register_kvm(env, SPR_POWER_PMC3, "PMC3",
5678 SPR_NOACCESS, SPR_NOACCESS,
5679 &spr_read_PMC, &spr_write_PMC,
5680 KVM_REG_PPC_PMC3, 0x00000000);
5681 spr_register_kvm(env, SPR_POWER_PMC4, "PMC4",
5682 SPR_NOACCESS, SPR_NOACCESS,
5683 &spr_read_PMC, &spr_write_PMC,
5684 KVM_REG_PPC_PMC4, 0x00000000);
5685 spr_register_kvm(env, SPR_POWER_PMC5, "PMC5",
5686 SPR_NOACCESS, SPR_NOACCESS,
5687 &spr_read_PMC, &spr_write_PMC,
5688 KVM_REG_PPC_PMC5, 0x00000000);
5689 spr_register_kvm(env, SPR_POWER_PMC6, "PMC6",
5690 SPR_NOACCESS, SPR_NOACCESS,
5691 &spr_read_PMC, &spr_write_PMC,
5692 KVM_REG_PPC_PMC6, 0x00000000);
5693 spr_register_kvm(env, SPR_POWER_SIAR, "SIAR",
5694 SPR_NOACCESS, SPR_NOACCESS,
5695 &spr_read_generic, &spr_write_generic,
5696 KVM_REG_PPC_SIAR, 0x00000000);
5697 spr_register_kvm(env, SPR_POWER_SDAR, "SDAR",
5698 SPR_NOACCESS, SPR_NOACCESS,
5699 &spr_read_generic, &spr_write_generic,
5700 KVM_REG_PPC_SDAR, 0x00000000);
5703 static void register_book3s_pmu_user_sprs(CPUPPCState *env)
5705 spr_register(env, SPR_POWER_UMMCR0, "UMMCR0",
5706 &spr_read_MMCR0_ureg, &spr_write_MMCR0_ureg,
5707 &spr_read_ureg, &spr_write_ureg,
5708 0x80000000);
5709 spr_register(env, SPR_POWER_UMMCR1, "UMMCR1",
5710 &spr_read_ureg, SPR_NOACCESS,
5711 &spr_read_ureg, &spr_write_ureg,
5712 0x00000000);
5713 spr_register(env, SPR_POWER_UMMCRA, "UMMCRA",
5714 &spr_read_ureg, SPR_NOACCESS,
5715 &spr_read_ureg, &spr_write_ureg,
5716 0x00000000);
5717 spr_register(env, SPR_POWER_UPMC1, "UPMC1",
5718 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
5719 &spr_read_ureg, &spr_write_ureg,
5720 0x00000000);
5721 spr_register(env, SPR_POWER_UPMC2, "UPMC2",
5722 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
5723 &spr_read_ureg, &spr_write_ureg,
5724 0x00000000);
5725 spr_register(env, SPR_POWER_UPMC3, "UPMC3",
5726 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
5727 &spr_read_ureg, &spr_write_ureg,
5728 0x00000000);
5729 spr_register(env, SPR_POWER_UPMC4, "UPMC4",
5730 &spr_read_PMC14_ureg, &spr_write_PMC14_ureg,
5731 &spr_read_ureg, &spr_write_ureg,
5732 0x00000000);
5733 spr_register(env, SPR_POWER_UPMC5, "UPMC5",
5734 &spr_read_PMC56_ureg, &spr_write_PMC56_ureg,
5735 &spr_read_ureg, &spr_write_ureg,
5736 0x00000000);
5737 spr_register(env, SPR_POWER_UPMC6, "UPMC6",
5738 &spr_read_PMC56_ureg, &spr_write_PMC56_ureg,
5739 &spr_read_ureg, &spr_write_ureg,
5740 0x00000000);
5741 spr_register(env, SPR_POWER_USIAR, "USIAR",
5742 &spr_read_ureg, SPR_NOACCESS,
5743 &spr_read_ureg, &spr_write_ureg,
5744 0x00000000);
5745 spr_register(env, SPR_POWER_USDAR, "USDAR",
5746 &spr_read_ureg, SPR_NOACCESS,
5747 &spr_read_ureg, &spr_write_ureg,
5748 0x00000000);
5751 static void register_970_pmu_sup_sprs(CPUPPCState *env)
5753 spr_register_kvm(env, SPR_970_PMC7, "PMC7",
5754 SPR_NOACCESS, SPR_NOACCESS,
5755 &spr_read_generic, &spr_write_generic,
5756 KVM_REG_PPC_PMC7, 0x00000000);
5757 spr_register_kvm(env, SPR_970_PMC8, "PMC8",
5758 SPR_NOACCESS, SPR_NOACCESS,
5759 &spr_read_generic, &spr_write_generic,
5760 KVM_REG_PPC_PMC8, 0x00000000);
5763 static void register_970_pmu_user_sprs(CPUPPCState *env)
5765 spr_register(env, SPR_970_UPMC7, "UPMC7",
5766 &spr_read_ureg, SPR_NOACCESS,
5767 &spr_read_ureg, &spr_write_ureg,
5768 0x00000000);
5769 spr_register(env, SPR_970_UPMC8, "UPMC8",
5770 &spr_read_ureg, SPR_NOACCESS,
5771 &spr_read_ureg, &spr_write_ureg,
5772 0x00000000);
5775 static void register_power8_pmu_sup_sprs(CPUPPCState *env)
5777 spr_register_kvm(env, SPR_POWER_MMCR2, "MMCR2",
5778 SPR_NOACCESS, SPR_NOACCESS,
5779 &spr_read_generic, &spr_write_generic,
5780 KVM_REG_PPC_MMCR2, 0x00000000);
5781 spr_register_kvm(env, SPR_POWER_MMCRS, "MMCRS",
5782 SPR_NOACCESS, SPR_NOACCESS,
5783 &spr_read_generic, &spr_write_generic,
5784 KVM_REG_PPC_MMCRS, 0x00000000);
5785 spr_register_kvm(env, SPR_POWER_SIER, "SIER",
5786 SPR_NOACCESS, SPR_NOACCESS,
5787 &spr_read_generic, &spr_write_generic,
5788 KVM_REG_PPC_SIER, 0x00000000);
5789 spr_register_kvm(env, SPR_POWER_SPMC1, "SPMC1",
5790 SPR_NOACCESS, SPR_NOACCESS,
5791 &spr_read_generic, &spr_write_generic,
5792 KVM_REG_PPC_SPMC1, 0x00000000);
5793 spr_register_kvm(env, SPR_POWER_SPMC2, "SPMC2",
5794 SPR_NOACCESS, SPR_NOACCESS,
5795 &spr_read_generic, &spr_write_generic,
5796 KVM_REG_PPC_SPMC2, 0x00000000);
5797 spr_register_kvm(env, SPR_TACR, "TACR",
5798 SPR_NOACCESS, SPR_NOACCESS,
5799 &spr_read_generic, &spr_write_generic,
5800 KVM_REG_PPC_TACR, 0x00000000);
5801 spr_register_kvm(env, SPR_TCSCR, "TCSCR",
5802 SPR_NOACCESS, SPR_NOACCESS,
5803 &spr_read_generic, &spr_write_generic,
5804 KVM_REG_PPC_TCSCR, 0x00000000);
5805 spr_register_kvm(env, SPR_CSIGR, "CSIGR",
5806 SPR_NOACCESS, SPR_NOACCESS,
5807 &spr_read_generic, &spr_write_generic,
5808 KVM_REG_PPC_CSIGR, 0x00000000);
5811 static void register_power8_pmu_user_sprs(CPUPPCState *env)
5813 spr_register(env, SPR_POWER_UMMCR2, "UMMCR2",
5814 &spr_read_MMCR2_ureg, &spr_write_MMCR2_ureg,
5815 &spr_read_ureg, &spr_write_ureg,
5816 0x00000000);
5817 spr_register(env, SPR_POWER_USIER, "USIER",
5818 &spr_read_generic, SPR_NOACCESS,
5819 &spr_read_generic, &spr_write_generic,
5820 0x00000000);
5823 static void register_power5p_ear_sprs(CPUPPCState *env)
5825 /* External access control */
5826 spr_register(env, SPR_EAR, "EAR",
5827 SPR_NOACCESS, SPR_NOACCESS,
5828 &spr_read_generic, &spr_write_generic,
5829 0x00000000);
5832 static void register_power5p_tb_sprs(CPUPPCState *env)
5834 /* TBU40 (High 40 bits of the Timebase register */
5835 spr_register_hv(env, SPR_TBU40, "TBU40",
5836 SPR_NOACCESS, SPR_NOACCESS,
5837 SPR_NOACCESS, SPR_NOACCESS,
5838 SPR_NOACCESS, &spr_write_tbu40,
5839 0x00000000);
5842 static void register_970_lpar_sprs(CPUPPCState *env)
5844 #if !defined(CONFIG_USER_ONLY)
5846 * PPC970: HID4 covers things later controlled by the LPCR and
5847 * RMOR in later CPUs, but with a different encoding. We only
5848 * support the 970 in "Apple mode" which has all hypervisor
5849 * facilities disabled by strapping, so we can basically just
5850 * ignore it
5852 spr_register(env, SPR_970_HID4, "HID4",
5853 SPR_NOACCESS, SPR_NOACCESS,
5854 &spr_read_generic, &spr_write_generic,
5855 0x00000000);
5856 #endif
5859 static void register_power5p_lpar_sprs(CPUPPCState *env)
5861 #if !defined(CONFIG_USER_ONLY)
5862 /* Logical partitionning */
5863 spr_register_kvm_hv(env, SPR_LPCR, "LPCR",
5864 SPR_NOACCESS, SPR_NOACCESS,
5865 SPR_NOACCESS, SPR_NOACCESS,
5866 &spr_read_generic, &spr_write_lpcr,
5867 KVM_REG_PPC_LPCR, LPCR_LPES0 | LPCR_LPES1);
5868 spr_register_hv(env, SPR_HDEC, "HDEC",
5869 SPR_NOACCESS, SPR_NOACCESS,
5870 SPR_NOACCESS, SPR_NOACCESS,
5871 &spr_read_hdecr, &spr_write_hdecr, 0);
5872 #endif
5875 static void register_book3s_ids_sprs(CPUPPCState *env)
5877 /* FIXME: Will need to deal with thread vs core only SPRs */
5879 /* Processor identification */
5880 spr_register_hv(env, SPR_PIR, "PIR",
5881 SPR_NOACCESS, SPR_NOACCESS,
5882 &spr_read_generic, SPR_NOACCESS,
5883 &spr_read_generic, NULL,
5884 0x00000000);
5885 spr_register_hv(env, SPR_HID0, "HID0",
5886 SPR_NOACCESS, SPR_NOACCESS,
5887 SPR_NOACCESS, SPR_NOACCESS,
5888 &spr_read_generic, &spr_write_generic,
5889 0x00000000);
5890 spr_register_hv(env, SPR_TSCR, "TSCR",
5891 SPR_NOACCESS, SPR_NOACCESS,
5892 SPR_NOACCESS, SPR_NOACCESS,
5893 &spr_read_generic, &spr_write_generic,
5894 0x00000000);
5895 spr_register_hv(env, SPR_HMER, "HMER",
5896 SPR_NOACCESS, SPR_NOACCESS,
5897 SPR_NOACCESS, SPR_NOACCESS,
5898 &spr_read_generic, &spr_write_hmer,
5899 0x00000000);
5900 spr_register_hv(env, SPR_HMEER, "HMEER",
5901 SPR_NOACCESS, SPR_NOACCESS,
5902 SPR_NOACCESS, SPR_NOACCESS,
5903 &spr_read_generic, &spr_write_generic,
5904 0x00000000);
5905 spr_register_hv(env, SPR_TFMR, "TFMR",
5906 SPR_NOACCESS, SPR_NOACCESS,
5907 SPR_NOACCESS, SPR_NOACCESS,
5908 &spr_read_generic, &spr_write_generic,
5909 0x00000000);
5910 spr_register_hv(env, SPR_LPIDR, "LPIDR",
5911 SPR_NOACCESS, SPR_NOACCESS,
5912 SPR_NOACCESS, SPR_NOACCESS,
5913 &spr_read_generic, &spr_write_lpidr,
5914 0x00000000);
5915 spr_register_hv(env, SPR_HFSCR, "HFSCR",
5916 SPR_NOACCESS, SPR_NOACCESS,
5917 SPR_NOACCESS, SPR_NOACCESS,
5918 &spr_read_generic, &spr_write_generic,
5919 0x00000000);
5920 spr_register_hv(env, SPR_MMCRC, "MMCRC",
5921 SPR_NOACCESS, SPR_NOACCESS,
5922 SPR_NOACCESS, SPR_NOACCESS,
5923 &spr_read_generic, &spr_write_generic,
5924 0x00000000);
5925 spr_register_hv(env, SPR_MMCRH, "MMCRH",
5926 SPR_NOACCESS, SPR_NOACCESS,
5927 SPR_NOACCESS, SPR_NOACCESS,
5928 &spr_read_generic, &spr_write_generic,
5929 0x00000000);
5930 spr_register_hv(env, SPR_HSPRG0, "HSPRG0",
5931 SPR_NOACCESS, SPR_NOACCESS,
5932 SPR_NOACCESS, SPR_NOACCESS,
5933 &spr_read_generic, &spr_write_generic,
5934 0x00000000);
5935 spr_register_hv(env, SPR_HSPRG1, "HSPRG1",
5936 SPR_NOACCESS, SPR_NOACCESS,
5937 SPR_NOACCESS, SPR_NOACCESS,
5938 &spr_read_generic, &spr_write_generic,
5939 0x00000000);
5940 spr_register_hv(env, SPR_HSRR0, "HSRR0",
5941 SPR_NOACCESS, SPR_NOACCESS,
5942 SPR_NOACCESS, SPR_NOACCESS,
5943 &spr_read_generic, &spr_write_generic,
5944 0x00000000);
5945 spr_register_hv(env, SPR_HSRR1, "HSRR1",
5946 SPR_NOACCESS, SPR_NOACCESS,
5947 SPR_NOACCESS, SPR_NOACCESS,
5948 &spr_read_generic, &spr_write_generic,
5949 0x00000000);
5950 spr_register_hv(env, SPR_HDAR, "HDAR",
5951 SPR_NOACCESS, SPR_NOACCESS,
5952 SPR_NOACCESS, SPR_NOACCESS,
5953 &spr_read_generic, &spr_write_generic,
5954 0x00000000);
5955 spr_register_hv(env, SPR_HDSISR, "HDSISR",
5956 SPR_NOACCESS, SPR_NOACCESS,
5957 SPR_NOACCESS, SPR_NOACCESS,
5958 &spr_read_generic, &spr_write_generic,
5959 0x00000000);
5960 spr_register_hv(env, SPR_HRMOR, "HRMOR",
5961 SPR_NOACCESS, SPR_NOACCESS,
5962 SPR_NOACCESS, SPR_NOACCESS,
5963 &spr_read_generic, &spr_write_generic,
5964 0x00000000);
5967 static void register_rmor_sprs(CPUPPCState *env)
5969 spr_register_hv(env, SPR_RMOR, "RMOR",
5970 SPR_NOACCESS, SPR_NOACCESS,
5971 SPR_NOACCESS, SPR_NOACCESS,
5972 &spr_read_generic, &spr_write_generic,
5973 0x00000000);
5976 static void register_power8_ids_sprs(CPUPPCState *env)
5978 /* Thread identification */
5979 spr_register(env, SPR_TIR, "TIR",
5980 SPR_NOACCESS, SPR_NOACCESS,
5981 &spr_read_generic, SPR_NOACCESS,
5982 0x00000000);
5985 static void register_book3s_purr_sprs(CPUPPCState *env)
5987 #if !defined(CONFIG_USER_ONLY)
5988 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
5989 spr_register_kvm_hv(env, SPR_PURR, "PURR",
5990 &spr_read_purr, SPR_NOACCESS,
5991 &spr_read_purr, SPR_NOACCESS,
5992 &spr_read_purr, &spr_write_purr,
5993 KVM_REG_PPC_PURR, 0x00000000);
5994 spr_register_kvm_hv(env, SPR_SPURR, "SPURR",
5995 &spr_read_purr, SPR_NOACCESS,
5996 &spr_read_purr, SPR_NOACCESS,
5997 &spr_read_purr, &spr_write_purr,
5998 KVM_REG_PPC_SPURR, 0x00000000);
5999 #endif
6002 static void register_power6_dbg_sprs(CPUPPCState *env)
6004 #if !defined(CONFIG_USER_ONLY)
6005 spr_register(env, SPR_CFAR, "SPR_CFAR",
6006 SPR_NOACCESS, SPR_NOACCESS,
6007 &spr_read_cfar, &spr_write_cfar,
6008 0x00000000);
6009 #endif
6012 static void register_power5p_common_sprs(CPUPPCState *env)
6014 spr_register_kvm(env, SPR_PPR, "PPR",
6015 &spr_read_generic, &spr_write_generic,
6016 &spr_read_generic, &spr_write_generic,
6017 KVM_REG_PPC_PPR, 0x00000000);
6020 static void register_power6_common_sprs(CPUPPCState *env)
6022 #if !defined(CONFIG_USER_ONLY)
6023 spr_register_kvm(env, SPR_DSCR, "SPR_DSCR",
6024 SPR_NOACCESS, SPR_NOACCESS,
6025 &spr_read_generic, &spr_write_generic,
6026 KVM_REG_PPC_DSCR, 0x00000000);
6027 #endif
6029 * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
6030 * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
6032 spr_register_hv(env, SPR_PCR, "PCR",
6033 SPR_NOACCESS, SPR_NOACCESS,
6034 SPR_NOACCESS, SPR_NOACCESS,
6035 &spr_read_generic, &spr_write_pcr,
6036 0x00000000);
6039 static void register_power8_tce_address_control_sprs(CPUPPCState *env)
6041 spr_register_kvm(env, SPR_TAR, "TAR",
6042 &spr_read_tar, &spr_write_tar,
6043 &spr_read_generic, &spr_write_generic,
6044 KVM_REG_PPC_TAR, 0x00000000);
6047 static void register_power8_tm_sprs(CPUPPCState *env)
6049 spr_register_kvm(env, SPR_TFHAR, "TFHAR",
6050 &spr_read_tm, &spr_write_tm,
6051 &spr_read_tm, &spr_write_tm,
6052 KVM_REG_PPC_TFHAR, 0x00000000);
6053 spr_register_kvm(env, SPR_TFIAR, "TFIAR",
6054 &spr_read_tm, &spr_write_tm,
6055 &spr_read_tm, &spr_write_tm,
6056 KVM_REG_PPC_TFIAR, 0x00000000);
6057 spr_register_kvm(env, SPR_TEXASR, "TEXASR",
6058 &spr_read_tm, &spr_write_tm,
6059 &spr_read_tm, &spr_write_tm,
6060 KVM_REG_PPC_TEXASR, 0x00000000);
6061 spr_register(env, SPR_TEXASRU, "TEXASRU",
6062 &spr_read_tm_upper32, &spr_write_tm_upper32,
6063 &spr_read_tm_upper32, &spr_write_tm_upper32,
6064 0x00000000);
6067 static void register_power8_ebb_sprs(CPUPPCState *env)
6069 spr_register(env, SPR_BESCRS, "BESCRS",
6070 &spr_read_ebb, &spr_write_ebb,
6071 &spr_read_generic, &spr_write_generic,
6072 0x00000000);
6073 spr_register(env, SPR_BESCRSU, "BESCRSU",
6074 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
6075 &spr_read_prev_upper32, &spr_write_prev_upper32,
6076 0x00000000);
6077 spr_register(env, SPR_BESCRR, "BESCRR",
6078 &spr_read_ebb, &spr_write_ebb,
6079 &spr_read_generic, &spr_write_generic,
6080 0x00000000);
6081 spr_register(env, SPR_BESCRRU, "BESCRRU",
6082 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
6083 &spr_read_prev_upper32, &spr_write_prev_upper32,
6084 0x00000000);
6085 spr_register_kvm(env, SPR_EBBHR, "EBBHR",
6086 &spr_read_ebb, &spr_write_ebb,
6087 &spr_read_generic, &spr_write_generic,
6088 KVM_REG_PPC_EBBHR, 0x00000000);
6089 spr_register_kvm(env, SPR_EBBRR, "EBBRR",
6090 &spr_read_ebb, &spr_write_ebb,
6091 &spr_read_generic, &spr_write_generic,
6092 KVM_REG_PPC_EBBRR, 0x00000000);
6093 spr_register_kvm(env, SPR_BESCR, "BESCR",
6094 &spr_read_ebb, &spr_write_ebb,
6095 &spr_read_generic, &spr_write_generic,
6096 KVM_REG_PPC_BESCR, 0x00000000);
6099 /* Virtual Time Base */
6100 static void register_vtb_sprs(CPUPPCState *env)
6102 spr_register_kvm_hv(env, SPR_VTB, "VTB",
6103 SPR_NOACCESS, SPR_NOACCESS,
6104 &spr_read_vtb, SPR_NOACCESS,
6105 &spr_read_vtb, &spr_write_vtb,
6106 KVM_REG_PPC_VTB, 0x00000000);
6109 static void register_power8_fscr_sprs(CPUPPCState *env)
6111 #if defined(CONFIG_USER_ONLY)
6112 target_ulong initval = 1ULL << FSCR_TAR;
6113 #else
6114 target_ulong initval = 0;
6115 #endif
6116 spr_register_kvm(env, SPR_FSCR, "FSCR",
6117 SPR_NOACCESS, SPR_NOACCESS,
6118 &spr_read_generic, &spr_write_generic,
6119 KVM_REG_PPC_FSCR, initval);
6122 static void register_power8_pspb_sprs(CPUPPCState *env)
6124 spr_register_kvm(env, SPR_PSPB, "PSPB",
6125 SPR_NOACCESS, SPR_NOACCESS,
6126 &spr_read_generic, &spr_write_generic32,
6127 KVM_REG_PPC_PSPB, 0);
6130 static void register_power8_dpdes_sprs(CPUPPCState *env)
6132 #if !defined(CONFIG_USER_ONLY)
6133 /* Directed Privileged Door-bell Exception State, used for IPI */
6134 spr_register_kvm_hv(env, SPR_DPDES, "DPDES",
6135 SPR_NOACCESS, SPR_NOACCESS,
6136 &spr_read_dpdes, SPR_NOACCESS,
6137 &spr_read_dpdes, &spr_write_dpdes,
6138 KVM_REG_PPC_DPDES, 0x00000000);
6139 #endif
6142 static void register_power8_ic_sprs(CPUPPCState *env)
6144 #if !defined(CONFIG_USER_ONLY)
6145 spr_register_hv(env, SPR_IC, "IC",
6146 SPR_NOACCESS, SPR_NOACCESS,
6147 &spr_read_generic, SPR_NOACCESS,
6148 &spr_read_generic, &spr_write_generic,
6150 #endif
6153 static void register_power8_book4_sprs(CPUPPCState *env)
6155 /* Add a number of P8 book4 registers */
6156 #if !defined(CONFIG_USER_ONLY)
6157 spr_register_kvm(env, SPR_ACOP, "ACOP",
6158 SPR_NOACCESS, SPR_NOACCESS,
6159 &spr_read_generic, &spr_write_generic,
6160 KVM_REG_PPC_ACOP, 0);
6161 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
6162 SPR_NOACCESS, SPR_NOACCESS,
6163 &spr_read_generic, &spr_write_pidr,
6164 KVM_REG_PPC_PID, 0);
6165 spr_register_kvm(env, SPR_WORT, "WORT",
6166 SPR_NOACCESS, SPR_NOACCESS,
6167 &spr_read_generic, &spr_write_generic,
6168 KVM_REG_PPC_WORT, 0);
6169 #endif
6172 static void register_power7_book4_sprs(CPUPPCState *env)
6174 /* Add a number of P7 book4 registers */
6175 #if !defined(CONFIG_USER_ONLY)
6176 spr_register_kvm(env, SPR_ACOP, "ACOP",
6177 SPR_NOACCESS, SPR_NOACCESS,
6178 &spr_read_generic, &spr_write_generic,
6179 KVM_REG_PPC_ACOP, 0);
6180 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
6181 SPR_NOACCESS, SPR_NOACCESS,
6182 &spr_read_generic, &spr_write_generic,
6183 KVM_REG_PPC_PID, 0);
6184 #endif
6187 static void register_power8_rpr_sprs(CPUPPCState *env)
6189 #if !defined(CONFIG_USER_ONLY)
6190 spr_register_hv(env, SPR_RPR, "RPR",
6191 SPR_NOACCESS, SPR_NOACCESS,
6192 SPR_NOACCESS, SPR_NOACCESS,
6193 &spr_read_generic, &spr_write_generic,
6194 0x00000103070F1F3F);
6195 #endif
6198 static void register_power9_mmu_sprs(CPUPPCState *env)
6200 #if !defined(CONFIG_USER_ONLY)
6201 /* Partition Table Control */
6202 spr_register_kvm_hv(env, SPR_PTCR, "PTCR",
6203 SPR_NOACCESS, SPR_NOACCESS,
6204 SPR_NOACCESS, SPR_NOACCESS,
6205 &spr_read_generic, &spr_write_ptcr,
6206 KVM_REG_PPC_PTCR, 0x00000000);
6207 /* Address Segment Descriptor Register */
6208 spr_register_hv(env, SPR_ASDR, "ASDR",
6209 SPR_NOACCESS, SPR_NOACCESS,
6210 SPR_NOACCESS, SPR_NOACCESS,
6211 &spr_read_generic, &spr_write_generic,
6212 0x0000000000000000);
6213 #endif
6217 * Initialize PMU counter overflow timers for Power8 and
6218 * newer Power chips when using TCG.
6220 static void init_tcg_pmu_power8(CPUPPCState *env)
6222 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
6223 /* Init PMU overflow timers */
6224 if (!kvm_enabled()) {
6225 cpu_ppc_pmu_init(env);
6227 #endif
6230 static void init_proc_book3s_common(CPUPPCState *env)
6232 register_ne_601_sprs(env);
6233 register_usprg3_sprs(env);
6234 register_book3s_altivec_sprs(env);
6235 register_book3s_pmu_sup_sprs(env);
6236 register_book3s_pmu_user_sprs(env);
6237 register_book3s_ctrl_sprs(env);
6239 * Can't find information on what this should be on reset. This
6240 * value is the one used by 74xx processors.
6242 vscr_init(env, 0x00010000);
6245 static void init_proc_970(CPUPPCState *env)
6247 /* Common Registers */
6248 init_proc_book3s_common(env);
6249 register_sdr1_sprs(env);
6250 register_book3s_dbg_sprs(env);
6252 /* 970 Specific Registers */
6253 register_970_hid_sprs(env);
6254 register_970_hior_sprs(env);
6255 register_low_BATs(env);
6256 register_970_pmu_sup_sprs(env);
6257 register_970_pmu_user_sprs(env);
6258 register_970_lpar_sprs(env);
6259 register_970_dbg_sprs(env);
6261 /* env variables */
6262 env->dcache_line_size = 128;
6263 env->icache_line_size = 128;
6265 /* Allocate hardware IRQ controller */
6266 init_excp_970(env);
6267 ppc970_irq_init(env_archcpu(env));
6270 POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
6272 DeviceClass *dc = DEVICE_CLASS(oc);
6273 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6275 dc->desc = "PowerPC 970";
6276 pcc->init_proc = init_proc_970;
6277 pcc->check_pow = check_pow_970;
6278 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6279 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6280 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6281 PPC_FLOAT_STFIWX |
6282 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6283 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6284 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6285 PPC_64B | PPC_ALTIVEC |
6286 PPC_SEGMENT_64B | PPC_SLBI;
6287 pcc->insns_flags2 = PPC2_FP_CVT_S64;
6288 pcc->msr_mask = (1ull << MSR_SF) |
6289 (1ull << MSR_VR) |
6290 (1ull << MSR_POW) |
6291 (1ull << MSR_EE) |
6292 (1ull << MSR_PR) |
6293 (1ull << MSR_FP) |
6294 (1ull << MSR_ME) |
6295 (1ull << MSR_FE0) |
6296 (1ull << MSR_SE) |
6297 (1ull << MSR_DE) |
6298 (1ull << MSR_FE1) |
6299 (1ull << MSR_IR) |
6300 (1ull << MSR_DR) |
6301 (1ull << MSR_PMM) |
6302 (1ull << MSR_RI);
6303 pcc->mmu_model = POWERPC_MMU_64B;
6304 #if defined(CONFIG_SOFTMMU)
6305 pcc->hash64_opts = &ppc_hash64_opts_basic;
6306 #endif
6307 pcc->excp_model = POWERPC_EXCP_970;
6308 pcc->bus_model = PPC_FLAGS_INPUT_970;
6309 pcc->bfd_mach = bfd_mach_ppc64;
6310 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6311 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6312 POWERPC_FLAG_BUS_CLK;
6313 pcc->l1_dcache_size = 0x8000;
6314 pcc->l1_icache_size = 0x10000;
6317 static void init_proc_power5plus(CPUPPCState *env)
6319 /* Common Registers */
6320 init_proc_book3s_common(env);
6321 register_sdr1_sprs(env);
6322 register_book3s_dbg_sprs(env);
6324 /* POWER5+ Specific Registers */
6325 register_970_hid_sprs(env);
6326 register_970_hior_sprs(env);
6327 register_low_BATs(env);
6328 register_970_pmu_sup_sprs(env);
6329 register_970_pmu_user_sprs(env);
6330 register_power5p_common_sprs(env);
6331 register_power5p_lpar_sprs(env);
6332 register_power5p_ear_sprs(env);
6333 register_power5p_tb_sprs(env);
6335 /* env variables */
6336 env->dcache_line_size = 128;
6337 env->icache_line_size = 128;
6339 /* Allocate hardware IRQ controller */
6340 init_excp_970(env);
6341 ppc970_irq_init(env_archcpu(env));
6344 POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
6346 DeviceClass *dc = DEVICE_CLASS(oc);
6347 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6349 dc->fw_name = "PowerPC,POWER5";
6350 dc->desc = "POWER5+";
6351 pcc->init_proc = init_proc_power5plus;
6352 pcc->check_pow = check_pow_970;
6353 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6354 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6355 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6356 PPC_FLOAT_STFIWX |
6357 PPC_FLOAT_EXT |
6358 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6359 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6360 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6361 PPC_64B |
6362 PPC_POPCNTB |
6363 PPC_SEGMENT_64B | PPC_SLBI;
6364 pcc->insns_flags2 = PPC2_FP_CVT_S64;
6365 pcc->msr_mask = (1ull << MSR_SF) |
6366 (1ull << MSR_VR) |
6367 (1ull << MSR_POW) |
6368 (1ull << MSR_EE) |
6369 (1ull << MSR_PR) |
6370 (1ull << MSR_FP) |
6371 (1ull << MSR_ME) |
6372 (1ull << MSR_FE0) |
6373 (1ull << MSR_SE) |
6374 (1ull << MSR_DE) |
6375 (1ull << MSR_FE1) |
6376 (1ull << MSR_IR) |
6377 (1ull << MSR_DR) |
6378 (1ull << MSR_PMM) |
6379 (1ull << MSR_RI);
6380 pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 |
6381 LPCR_RMI | LPCR_HDICE;
6382 pcc->mmu_model = POWERPC_MMU_2_03;
6383 #if defined(CONFIG_SOFTMMU)
6384 pcc->hash64_opts = &ppc_hash64_opts_basic;
6385 pcc->lrg_decr_bits = 32;
6386 #endif
6387 pcc->excp_model = POWERPC_EXCP_970;
6388 pcc->bus_model = PPC_FLAGS_INPUT_970;
6389 pcc->bfd_mach = bfd_mach_ppc64;
6390 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6391 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6392 POWERPC_FLAG_BUS_CLK;
6393 pcc->l1_dcache_size = 0x8000;
6394 pcc->l1_icache_size = 0x10000;
6397 static void init_proc_POWER7(CPUPPCState *env)
6399 /* Common Registers */
6400 init_proc_book3s_common(env);
6401 register_sdr1_sprs(env);
6402 register_book3s_dbg_sprs(env);
6404 /* POWER7 Specific Registers */
6405 register_book3s_ids_sprs(env);
6406 register_rmor_sprs(env);
6407 register_amr_sprs(env);
6408 register_book3s_purr_sprs(env);
6409 register_power5p_common_sprs(env);
6410 register_power5p_lpar_sprs(env);
6411 register_power5p_ear_sprs(env);
6412 register_power5p_tb_sprs(env);
6413 register_power6_common_sprs(env);
6414 register_power6_dbg_sprs(env);
6415 register_power7_book4_sprs(env);
6417 /* env variables */
6418 env->dcache_line_size = 128;
6419 env->icache_line_size = 128;
6421 /* Allocate hardware IRQ controller */
6422 init_excp_POWER7(env);
6423 ppcPOWER7_irq_init(env_archcpu(env));
6426 static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr)
6428 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7P_BASE) {
6429 return true;
6431 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7_BASE) {
6432 return true;
6434 return false;
6437 static bool cpu_has_work_POWER7(CPUState *cs)
6439 PowerPCCPU *cpu = POWERPC_CPU(cs);
6440 CPUPPCState *env = &cpu->env;
6442 if (cs->halted) {
6443 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
6444 return false;
6446 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
6447 (env->spr[SPR_LPCR] & LPCR_P7_PECE0)) {
6448 return true;
6450 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
6451 (env->spr[SPR_LPCR] & LPCR_P7_PECE1)) {
6452 return true;
6454 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
6455 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
6456 return true;
6458 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
6459 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
6460 return true;
6462 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
6463 return true;
6465 return false;
6466 } else {
6467 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
6471 POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
6473 DeviceClass *dc = DEVICE_CLASS(oc);
6474 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6475 CPUClass *cc = CPU_CLASS(oc);
6477 dc->fw_name = "PowerPC,POWER7";
6478 dc->desc = "POWER7";
6479 pcc->pvr_match = ppc_pvr_match_power7;
6480 pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05;
6481 pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
6482 pcc->init_proc = init_proc_POWER7;
6483 pcc->check_pow = check_pow_nocheck;
6484 cc->has_work = cpu_has_work_POWER7;
6485 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
6486 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6487 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6488 PPC_FLOAT_FRSQRTES |
6489 PPC_FLOAT_STFIWX |
6490 PPC_FLOAT_EXT |
6491 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6492 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6493 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6494 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
6495 PPC_SEGMENT_64B | PPC_SLBI |
6496 PPC_POPCNTB | PPC_POPCNTWD |
6497 PPC_CILDST;
6498 pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205 |
6499 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
6500 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
6501 PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 |
6502 PPC2_PM_ISA206;
6503 pcc->msr_mask = (1ull << MSR_SF) |
6504 (1ull << MSR_VR) |
6505 (1ull << MSR_VSX) |
6506 (1ull << MSR_EE) |
6507 (1ull << MSR_PR) |
6508 (1ull << MSR_FP) |
6509 (1ull << MSR_ME) |
6510 (1ull << MSR_FE0) |
6511 (1ull << MSR_SE) |
6512 (1ull << MSR_DE) |
6513 (1ull << MSR_FE1) |
6514 (1ull << MSR_IR) |
6515 (1ull << MSR_DR) |
6516 (1ull << MSR_PMM) |
6517 (1ull << MSR_RI) |
6518 (1ull << MSR_LE);
6519 pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
6520 LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
6521 LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
6522 LPCR_MER | LPCR_TC |
6523 LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE;
6524 pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
6525 pcc->mmu_model = POWERPC_MMU_2_06;
6526 #if defined(CONFIG_SOFTMMU)
6527 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
6528 pcc->lrg_decr_bits = 32;
6529 #endif
6530 pcc->excp_model = POWERPC_EXCP_POWER7;
6531 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
6532 pcc->bfd_mach = bfd_mach_ppc64;
6533 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6534 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6535 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
6536 POWERPC_FLAG_VSX;
6537 pcc->l1_dcache_size = 0x8000;
6538 pcc->l1_icache_size = 0x8000;
6541 static void init_proc_POWER8(CPUPPCState *env)
6543 /* Common Registers */
6544 init_proc_book3s_common(env);
6545 register_sdr1_sprs(env);
6546 register_book3s_207_dbg_sprs(env);
6548 /* Common TCG PMU */
6549 init_tcg_pmu_power8(env);
6551 /* POWER8 Specific Registers */
6552 register_book3s_ids_sprs(env);
6553 register_rmor_sprs(env);
6554 register_amr_sprs(env);
6555 register_iamr_sprs(env);
6556 register_book3s_purr_sprs(env);
6557 register_power5p_common_sprs(env);
6558 register_power5p_lpar_sprs(env);
6559 register_power5p_ear_sprs(env);
6560 register_power5p_tb_sprs(env);
6561 register_power6_common_sprs(env);
6562 register_power6_dbg_sprs(env);
6563 register_power8_tce_address_control_sprs(env);
6564 register_power8_ids_sprs(env);
6565 register_power8_ebb_sprs(env);
6566 register_power8_fscr_sprs(env);
6567 register_power8_pmu_sup_sprs(env);
6568 register_power8_pmu_user_sprs(env);
6569 register_power8_tm_sprs(env);
6570 register_power8_pspb_sprs(env);
6571 register_power8_dpdes_sprs(env);
6572 register_vtb_sprs(env);
6573 register_power8_ic_sprs(env);
6574 register_power8_book4_sprs(env);
6575 register_power8_rpr_sprs(env);
6577 /* env variables */
6578 env->dcache_line_size = 128;
6579 env->icache_line_size = 128;
6581 /* Allocate hardware IRQ controller */
6582 init_excp_POWER8(env);
6583 ppcPOWER7_irq_init(env_archcpu(env));
6586 static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr)
6588 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8NVL_BASE) {
6589 return true;
6591 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8E_BASE) {
6592 return true;
6594 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8_BASE) {
6595 return true;
6597 return false;
6600 static bool cpu_has_work_POWER8(CPUState *cs)
6602 PowerPCCPU *cpu = POWERPC_CPU(cs);
6603 CPUPPCState *env = &cpu->env;
6605 if (cs->halted) {
6606 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
6607 return false;
6609 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
6610 (env->spr[SPR_LPCR] & LPCR_P8_PECE2)) {
6611 return true;
6613 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
6614 (env->spr[SPR_LPCR] & LPCR_P8_PECE3)) {
6615 return true;
6617 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
6618 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
6619 return true;
6621 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
6622 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
6623 return true;
6625 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
6626 (env->spr[SPR_LPCR] & LPCR_P8_PECE0)) {
6627 return true;
6629 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
6630 (env->spr[SPR_LPCR] & LPCR_P8_PECE1)) {
6631 return true;
6633 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
6634 return true;
6636 return false;
6637 } else {
6638 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
6642 POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
6644 DeviceClass *dc = DEVICE_CLASS(oc);
6645 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6646 CPUClass *cc = CPU_CLASS(oc);
6648 dc->fw_name = "PowerPC,POWER8";
6649 dc->desc = "POWER8";
6650 pcc->pvr_match = ppc_pvr_match_power8;
6651 pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
6652 pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
6653 pcc->init_proc = init_proc_POWER8;
6654 pcc->check_pow = check_pow_nocheck;
6655 cc->has_work = cpu_has_work_POWER8;
6656 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
6657 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6658 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6659 PPC_FLOAT_FRSQRTES |
6660 PPC_FLOAT_STFIWX |
6661 PPC_FLOAT_EXT |
6662 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6663 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6664 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6665 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
6666 PPC_SEGMENT_64B | PPC_SLBI |
6667 PPC_POPCNTB | PPC_POPCNTWD |
6668 PPC_CILDST;
6669 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
6670 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
6671 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
6672 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
6673 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
6674 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
6675 PPC2_TM | PPC2_PM_ISA206;
6676 pcc->msr_mask = (1ull << MSR_SF) |
6677 (1ull << MSR_HV) |
6678 (1ull << MSR_TM) |
6679 (1ull << MSR_VR) |
6680 (1ull << MSR_VSX) |
6681 (1ull << MSR_EE) |
6682 (1ull << MSR_PR) |
6683 (1ull << MSR_FP) |
6684 (1ull << MSR_ME) |
6685 (1ull << MSR_FE0) |
6686 (1ull << MSR_SE) |
6687 (1ull << MSR_DE) |
6688 (1ull << MSR_FE1) |
6689 (1ull << MSR_IR) |
6690 (1ull << MSR_DR) |
6691 (1ull << MSR_PMM) |
6692 (1ull << MSR_RI) |
6693 (1ull << MSR_TS0) |
6694 (1ull << MSR_TS1) |
6695 (1ull << MSR_LE);
6696 pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
6697 LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
6698 LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
6699 LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
6700 LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE;
6701 pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
6702 LPCR_P8_PECE3 | LPCR_P8_PECE4;
6703 pcc->mmu_model = POWERPC_MMU_2_07;
6704 #if defined(CONFIG_SOFTMMU)
6705 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
6706 pcc->lrg_decr_bits = 32;
6707 pcc->n_host_threads = 8;
6708 #endif
6709 pcc->excp_model = POWERPC_EXCP_POWER8;
6710 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
6711 pcc->bfd_mach = bfd_mach_ppc64;
6712 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6713 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6714 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
6715 POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
6716 pcc->l1_dcache_size = 0x8000;
6717 pcc->l1_icache_size = 0x8000;
6720 #ifdef CONFIG_SOFTMMU
6722 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
6723 * Encoded as array of int_32s in the form:
6724 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
6725 * x -> AP encoding
6726 * y -> radix mode supported page size (encoded as a shift)
6728 static struct ppc_radix_page_info POWER9_radix_page_info = {
6729 .count = 4,
6730 .entries = {
6731 0x0000000c, /* 4K - enc: 0x0 */
6732 0xa0000010, /* 64K - enc: 0x5 */
6733 0x20000015, /* 2M - enc: 0x1 */
6734 0x4000001e /* 1G - enc: 0x2 */
6737 #endif /* CONFIG_SOFTMMU */
6739 static void init_proc_POWER9(CPUPPCState *env)
6741 /* Common Registers */
6742 init_proc_book3s_common(env);
6743 register_book3s_207_dbg_sprs(env);
6745 /* Common TCG PMU */
6746 init_tcg_pmu_power8(env);
6748 /* POWER8 Specific Registers */
6749 register_book3s_ids_sprs(env);
6750 register_amr_sprs(env);
6751 register_iamr_sprs(env);
6752 register_book3s_purr_sprs(env);
6753 register_power5p_common_sprs(env);
6754 register_power5p_lpar_sprs(env);
6755 register_power5p_ear_sprs(env);
6756 register_power5p_tb_sprs(env);
6757 register_power6_common_sprs(env);
6758 register_power6_dbg_sprs(env);
6759 register_power8_tce_address_control_sprs(env);
6760 register_power8_ids_sprs(env);
6761 register_power8_ebb_sprs(env);
6762 register_power8_fscr_sprs(env);
6763 register_power8_pmu_sup_sprs(env);
6764 register_power8_pmu_user_sprs(env);
6765 register_power8_tm_sprs(env);
6766 register_power8_pspb_sprs(env);
6767 register_power8_dpdes_sprs(env);
6768 register_vtb_sprs(env);
6769 register_power8_ic_sprs(env);
6770 register_power8_book4_sprs(env);
6771 register_power8_rpr_sprs(env);
6772 register_power9_mmu_sprs(env);
6774 /* POWER9 Specific registers */
6775 spr_register_kvm(env, SPR_TIDR, "TIDR", NULL, NULL,
6776 spr_read_generic, spr_write_generic,
6777 KVM_REG_PPC_TIDR, 0);
6779 /* FIXME: Filter fields properly based on privilege level */
6780 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
6781 spr_read_generic, spr_write_generic,
6782 KVM_REG_PPC_PSSCR, 0);
6784 /* env variables */
6785 env->dcache_line_size = 128;
6786 env->icache_line_size = 128;
6788 /* Allocate hardware IRQ controller */
6789 init_excp_POWER9(env);
6790 ppcPOWER9_irq_init(env_archcpu(env));
6793 static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr)
6795 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER9_BASE) {
6796 return true;
6798 return false;
6801 static bool cpu_has_work_POWER9(CPUState *cs)
6803 PowerPCCPU *cpu = POWERPC_CPU(cs);
6804 CPUPPCState *env = &cpu->env;
6806 if (cs->halted) {
6807 uint64_t psscr = env->spr[SPR_PSSCR];
6809 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
6810 return false;
6813 /* If EC is clear, just return true on any pending interrupt */
6814 if (!(psscr & PSSCR_EC)) {
6815 return true;
6817 /* External Exception */
6818 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
6819 (env->spr[SPR_LPCR] & LPCR_EEE)) {
6820 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
6821 if (heic == 0 || !msr_hv || msr_pr) {
6822 return true;
6825 /* Decrementer Exception */
6826 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
6827 (env->spr[SPR_LPCR] & LPCR_DEE)) {
6828 return true;
6830 /* Machine Check or Hypervisor Maintenance Exception */
6831 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK |
6832 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) {
6833 return true;
6835 /* Privileged Doorbell Exception */
6836 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
6837 (env->spr[SPR_LPCR] & LPCR_PDEE)) {
6838 return true;
6840 /* Hypervisor Doorbell Exception */
6841 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
6842 (env->spr[SPR_LPCR] & LPCR_HDEE)) {
6843 return true;
6845 /* Hypervisor virtualization exception */
6846 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) &&
6847 (env->spr[SPR_LPCR] & LPCR_HVEE)) {
6848 return true;
6850 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
6851 return true;
6853 return false;
6854 } else {
6855 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
6859 POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
6861 DeviceClass *dc = DEVICE_CLASS(oc);
6862 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6863 CPUClass *cc = CPU_CLASS(oc);
6865 dc->fw_name = "PowerPC,POWER9";
6866 dc->desc = "POWER9";
6867 pcc->pvr_match = ppc_pvr_match_power9;
6868 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07;
6869 pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 |
6870 PCR_COMPAT_2_05;
6871 pcc->init_proc = init_proc_POWER9;
6872 pcc->check_pow = check_pow_nocheck;
6873 cc->has_work = cpu_has_work_POWER9;
6874 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
6875 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6876 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6877 PPC_FLOAT_FRSQRTES |
6878 PPC_FLOAT_STFIWX |
6879 PPC_FLOAT_EXT |
6880 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6881 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6882 PPC_MEM_TLBSYNC |
6883 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
6884 PPC_SEGMENT_64B | PPC_SLBI |
6885 PPC_POPCNTB | PPC_POPCNTWD |
6886 PPC_CILDST;
6887 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
6888 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
6889 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
6890 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
6891 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
6892 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
6893 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
6894 pcc->msr_mask = (1ull << MSR_SF) |
6895 (1ull << MSR_HV) |
6896 (1ull << MSR_TM) |
6897 (1ull << MSR_VR) |
6898 (1ull << MSR_VSX) |
6899 (1ull << MSR_EE) |
6900 (1ull << MSR_PR) |
6901 (1ull << MSR_FP) |
6902 (1ull << MSR_ME) |
6903 (1ull << MSR_FE0) |
6904 (1ull << MSR_SE) |
6905 (1ull << MSR_DE) |
6906 (1ull << MSR_FE1) |
6907 (1ull << MSR_IR) |
6908 (1ull << MSR_DR) |
6909 (1ull << MSR_PMM) |
6910 (1ull << MSR_RI) |
6911 (1ull << MSR_LE);
6912 pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
6913 (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
6914 LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
6915 (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
6916 LPCR_DEE | LPCR_OEE))
6917 | LPCR_MER | LPCR_GTSE | LPCR_TC |
6918 LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
6919 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
6920 pcc->mmu_model = POWERPC_MMU_3_00;
6921 #if defined(CONFIG_SOFTMMU)
6922 /* segment page size remain the same */
6923 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
6924 pcc->radix_page_info = &POWER9_radix_page_info;
6925 pcc->lrg_decr_bits = 56;
6926 pcc->n_host_threads = 4;
6927 #endif
6928 pcc->excp_model = POWERPC_EXCP_POWER9;
6929 pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
6930 pcc->bfd_mach = bfd_mach_ppc64;
6931 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6932 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6933 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
6934 POWERPC_FLAG_VSX | POWERPC_FLAG_TM | POWERPC_FLAG_SCV;
6935 pcc->l1_dcache_size = 0x8000;
6936 pcc->l1_icache_size = 0x8000;
6939 #ifdef CONFIG_SOFTMMU
6941 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
6942 * Encoded as array of int_32s in the form:
6943 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
6944 * x -> AP encoding
6945 * y -> radix mode supported page size (encoded as a shift)
6947 static struct ppc_radix_page_info POWER10_radix_page_info = {
6948 .count = 4,
6949 .entries = {
6950 0x0000000c, /* 4K - enc: 0x0 */
6951 0xa0000010, /* 64K - enc: 0x5 */
6952 0x20000015, /* 2M - enc: 0x1 */
6953 0x4000001e /* 1G - enc: 0x2 */
6956 #endif /* CONFIG_SOFTMMU */
6958 static void init_proc_POWER10(CPUPPCState *env)
6960 /* Common Registers */
6961 init_proc_book3s_common(env);
6962 register_book3s_207_dbg_sprs(env);
6964 /* Common TCG PMU */
6965 init_tcg_pmu_power8(env);
6967 /* POWER8 Specific Registers */
6968 register_book3s_ids_sprs(env);
6969 register_amr_sprs(env);
6970 register_iamr_sprs(env);
6971 register_book3s_purr_sprs(env);
6972 register_power5p_common_sprs(env);
6973 register_power5p_lpar_sprs(env);
6974 register_power5p_ear_sprs(env);
6975 register_power6_common_sprs(env);
6976 register_power6_dbg_sprs(env);
6977 register_power8_tce_address_control_sprs(env);
6978 register_power8_ids_sprs(env);
6979 register_power8_ebb_sprs(env);
6980 register_power8_fscr_sprs(env);
6981 register_power8_pmu_sup_sprs(env);
6982 register_power8_pmu_user_sprs(env);
6983 register_power8_tm_sprs(env);
6984 register_power8_pspb_sprs(env);
6985 register_vtb_sprs(env);
6986 register_power8_ic_sprs(env);
6987 register_power8_book4_sprs(env);
6988 register_power8_rpr_sprs(env);
6989 register_power9_mmu_sprs(env);
6991 /* FIXME: Filter fields properly based on privilege level */
6992 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
6993 spr_read_generic, spr_write_generic,
6994 KVM_REG_PPC_PSSCR, 0);
6996 /* env variables */
6997 env->dcache_line_size = 128;
6998 env->icache_line_size = 128;
7000 /* Allocate hardware IRQ controller */
7001 init_excp_POWER10(env);
7002 ppcPOWER9_irq_init(env_archcpu(env));
7005 static bool ppc_pvr_match_power10(PowerPCCPUClass *pcc, uint32_t pvr)
7007 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER10_BASE) {
7008 return true;
7010 return false;
7013 static bool cpu_has_work_POWER10(CPUState *cs)
7015 PowerPCCPU *cpu = POWERPC_CPU(cs);
7016 CPUPPCState *env = &cpu->env;
7018 if (cs->halted) {
7019 uint64_t psscr = env->spr[SPR_PSSCR];
7021 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
7022 return false;
7025 /* If EC is clear, just return true on any pending interrupt */
7026 if (!(psscr & PSSCR_EC)) {
7027 return true;
7029 /* External Exception */
7030 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
7031 (env->spr[SPR_LPCR] & LPCR_EEE)) {
7032 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
7033 if (heic == 0 || !msr_hv || msr_pr) {
7034 return true;
7037 /* Decrementer Exception */
7038 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
7039 (env->spr[SPR_LPCR] & LPCR_DEE)) {
7040 return true;
7042 /* Machine Check or Hypervisor Maintenance Exception */
7043 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK |
7044 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) {
7045 return true;
7047 /* Privileged Doorbell Exception */
7048 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
7049 (env->spr[SPR_LPCR] & LPCR_PDEE)) {
7050 return true;
7052 /* Hypervisor Doorbell Exception */
7053 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
7054 (env->spr[SPR_LPCR] & LPCR_HDEE)) {
7055 return true;
7057 /* Hypervisor virtualization exception */
7058 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) &&
7059 (env->spr[SPR_LPCR] & LPCR_HVEE)) {
7060 return true;
7062 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
7063 return true;
7065 return false;
7066 } else {
7067 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
7071 POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
7073 DeviceClass *dc = DEVICE_CLASS(oc);
7074 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7075 CPUClass *cc = CPU_CLASS(oc);
7077 dc->fw_name = "PowerPC,POWER10";
7078 dc->desc = "POWER10";
7079 pcc->pvr_match = ppc_pvr_match_power10;
7080 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07 |
7081 PCR_COMPAT_3_00;
7082 pcc->pcr_supported = PCR_COMPAT_3_10 | PCR_COMPAT_3_00 | PCR_COMPAT_2_07 |
7083 PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
7084 pcc->init_proc = init_proc_POWER10;
7085 pcc->check_pow = check_pow_nocheck;
7086 cc->has_work = cpu_has_work_POWER10;
7087 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
7088 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7089 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7090 PPC_FLOAT_FRSQRTES |
7091 PPC_FLOAT_STFIWX |
7092 PPC_FLOAT_EXT |
7093 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7094 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7095 PPC_MEM_TLBSYNC |
7096 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
7097 PPC_SEGMENT_64B | PPC_SLBI |
7098 PPC_POPCNTB | PPC_POPCNTWD |
7099 PPC_CILDST;
7100 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
7101 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
7102 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
7103 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
7104 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
7105 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
7106 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL | PPC2_ISA310;
7107 pcc->msr_mask = (1ull << MSR_SF) |
7108 (1ull << MSR_HV) |
7109 (1ull << MSR_TM) |
7110 (1ull << MSR_VR) |
7111 (1ull << MSR_VSX) |
7112 (1ull << MSR_EE) |
7113 (1ull << MSR_PR) |
7114 (1ull << MSR_FP) |
7115 (1ull << MSR_ME) |
7116 (1ull << MSR_FE0) |
7117 (1ull << MSR_SE) |
7118 (1ull << MSR_DE) |
7119 (1ull << MSR_FE1) |
7120 (1ull << MSR_IR) |
7121 (1ull << MSR_DR) |
7122 (1ull << MSR_PMM) |
7123 (1ull << MSR_RI) |
7124 (1ull << MSR_LE);
7125 pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
7126 (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
7127 LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
7128 (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
7129 LPCR_DEE | LPCR_OEE))
7130 | LPCR_MER | LPCR_GTSE | LPCR_TC |
7131 LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
7132 /* DD2 adds an extra HAIL bit */
7133 pcc->lpcr_mask |= LPCR_HAIL;
7135 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
7136 pcc->mmu_model = POWERPC_MMU_3_00;
7137 #if defined(CONFIG_SOFTMMU)
7138 /* segment page size remain the same */
7139 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
7140 pcc->radix_page_info = &POWER10_radix_page_info;
7141 pcc->lrg_decr_bits = 56;
7142 #endif
7143 pcc->excp_model = POWERPC_EXCP_POWER10;
7144 pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
7145 pcc->bfd_mach = bfd_mach_ppc64;
7146 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7147 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7148 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
7149 POWERPC_FLAG_VSX | POWERPC_FLAG_TM | POWERPC_FLAG_SCV;
7150 pcc->l1_dcache_size = 0x8000;
7151 pcc->l1_icache_size = 0x8000;
7154 #if !defined(CONFIG_USER_ONLY)
7155 void cpu_ppc_set_vhyp(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp)
7157 CPUPPCState *env = &cpu->env;
7159 cpu->vhyp = vhyp;
7162 * With a virtual hypervisor mode we never allow the CPU to go
7163 * hypervisor mode itself
7165 env->msr_mask &= ~MSR_HVB;
7168 #endif /* !defined(CONFIG_USER_ONLY) */
7170 #endif /* defined(TARGET_PPC64) */
7172 /*****************************************************************************/
7173 /* Generic CPU instantiation routine */
7174 static void init_ppc_proc(PowerPCCPU *cpu)
7176 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7177 CPUPPCState *env = &cpu->env;
7178 #if !defined(CONFIG_USER_ONLY)
7179 int i;
7181 env->irq_inputs = NULL;
7182 /* Set all exception vectors to an invalid address */
7183 for (i = 0; i < POWERPC_EXCP_NB; i++) {
7184 env->excp_vectors[i] = (target_ulong)(-1ULL);
7186 env->ivor_mask = 0x00000000;
7187 env->ivpr_mask = 0x00000000;
7188 /* Default MMU definitions */
7189 env->nb_BATs = 0;
7190 env->nb_tlb = 0;
7191 env->nb_ways = 0;
7192 env->tlb_type = TLB_NONE;
7193 #endif
7194 /* Register SPR common to all PowerPC implementations */
7195 register_generic_sprs(cpu);
7197 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
7198 (*pcc->init_proc)(env);
7200 #if !defined(CONFIG_USER_ONLY)
7201 ppc_gdb_gen_spr_xml(cpu);
7202 #endif
7204 /* MSR bits & flags consistency checks */
7205 if (env->msr_mask & (1 << 25)) {
7206 switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
7207 case POWERPC_FLAG_SPE:
7208 case POWERPC_FLAG_VRE:
7209 break;
7210 default:
7211 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7212 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
7213 exit(1);
7215 } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
7216 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7217 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
7218 exit(1);
7220 if (env->msr_mask & (1 << 17)) {
7221 switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
7222 case POWERPC_FLAG_TGPR:
7223 case POWERPC_FLAG_CE:
7224 break;
7225 default:
7226 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7227 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
7228 exit(1);
7230 } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
7231 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7232 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
7233 exit(1);
7235 if (env->msr_mask & (1 << 10)) {
7236 switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
7237 POWERPC_FLAG_UBLE)) {
7238 case POWERPC_FLAG_SE:
7239 case POWERPC_FLAG_DWE:
7240 case POWERPC_FLAG_UBLE:
7241 break;
7242 default:
7243 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7244 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
7245 "POWERPC_FLAG_UBLE\n");
7246 exit(1);
7248 } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
7249 POWERPC_FLAG_UBLE)) {
7250 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7251 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
7252 "POWERPC_FLAG_UBLE\n");
7253 exit(1);
7255 if (env->msr_mask & (1 << 9)) {
7256 switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
7257 case POWERPC_FLAG_BE:
7258 case POWERPC_FLAG_DE:
7259 break;
7260 default:
7261 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7262 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
7263 exit(1);
7265 } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
7266 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7267 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
7268 exit(1);
7270 if (env->msr_mask & (1 << 2)) {
7271 switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
7272 case POWERPC_FLAG_PX:
7273 case POWERPC_FLAG_PMM:
7274 break;
7275 default:
7276 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7277 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
7278 exit(1);
7280 } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
7281 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7282 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
7283 exit(1);
7285 if ((env->flags & POWERPC_FLAG_BUS_CLK) == 0) {
7286 fprintf(stderr, "PowerPC flags inconsistency\n"
7287 "Should define the time-base and decrementer clock source\n");
7288 exit(1);
7290 /* Allocate TLBs buffer when needed */
7291 #if !defined(CONFIG_USER_ONLY)
7292 if (env->nb_tlb != 0) {
7293 int nb_tlb = env->nb_tlb;
7294 if (env->id_tlbs != 0) {
7295 nb_tlb *= 2;
7297 switch (env->tlb_type) {
7298 case TLB_6XX:
7299 env->tlb.tlb6 = g_new0(ppc6xx_tlb_t, nb_tlb);
7300 break;
7301 case TLB_EMB:
7302 env->tlb.tlbe = g_new0(ppcemb_tlb_t, nb_tlb);
7303 break;
7304 case TLB_MAS:
7305 env->tlb.tlbm = g_new0(ppcmas_tlb_t, nb_tlb);
7306 break;
7308 /* Pre-compute some useful values */
7309 env->tlb_per_way = env->nb_tlb / env->nb_ways;
7311 if (env->irq_inputs == NULL) {
7312 warn_report("no internal IRQ controller registered."
7313 " Attempt QEMU to crash very soon !");
7315 #endif
7316 if (env->check_pow == NULL) {
7317 warn_report("no power management check handler registered."
7318 " Attempt QEMU to crash very soon !");
7323 static void ppc_cpu_realize(DeviceState *dev, Error **errp)
7325 CPUState *cs = CPU(dev);
7326 PowerPCCPU *cpu = POWERPC_CPU(dev);
7327 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7328 Error *local_err = NULL;
7330 cpu_exec_realizefn(cs, &local_err);
7331 if (local_err != NULL) {
7332 error_propagate(errp, local_err);
7333 return;
7335 if (cpu->vcpu_id == UNASSIGNED_CPU_INDEX) {
7336 cpu->vcpu_id = cs->cpu_index;
7339 if (tcg_enabled()) {
7340 if (ppc_fixup_cpu(cpu) != 0) {
7341 error_setg(errp, "Unable to emulate selected CPU with TCG");
7342 goto unrealize;
7346 create_ppc_opcodes(cpu, &local_err);
7347 if (local_err != NULL) {
7348 error_propagate(errp, local_err);
7349 goto unrealize;
7351 init_ppc_proc(cpu);
7353 ppc_gdb_init(cs, pcc);
7354 qemu_init_vcpu(cs);
7356 pcc->parent_realize(dev, errp);
7358 return;
7360 unrealize:
7361 cpu_exec_unrealizefn(cs);
7364 static void ppc_cpu_unrealize(DeviceState *dev)
7366 PowerPCCPU *cpu = POWERPC_CPU(dev);
7367 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7369 pcc->parent_unrealize(dev);
7371 cpu_remove_sync(CPU(cpu));
7373 destroy_ppc_opcodes(cpu);
7376 static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
7378 ObjectClass *oc = (ObjectClass *)a;
7379 uint32_t pvr = *(uint32_t *)b;
7380 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
7382 /* -cpu host does a PVR lookup during construction */
7383 if (unlikely(strcmp(object_class_get_name(oc),
7384 TYPE_HOST_POWERPC_CPU) == 0)) {
7385 return -1;
7388 return pcc->pvr == pvr ? 0 : -1;
7391 PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
7393 GSList *list, *item;
7394 PowerPCCPUClass *pcc = NULL;
7396 list = object_class_get_list(TYPE_POWERPC_CPU, false);
7397 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
7398 if (item != NULL) {
7399 pcc = POWERPC_CPU_CLASS(item->data);
7401 g_slist_free(list);
7403 return pcc;
7406 static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b)
7408 ObjectClass *oc = (ObjectClass *)a;
7409 uint32_t pvr = *(uint32_t *)b;
7410 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
7412 /* -cpu host does a PVR lookup during construction */
7413 if (unlikely(strcmp(object_class_get_name(oc),
7414 TYPE_HOST_POWERPC_CPU) == 0)) {
7415 return -1;
7418 if (pcc->pvr_match(pcc, pvr)) {
7419 return 0;
7422 return -1;
7425 PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr)
7427 GSList *list, *item;
7428 PowerPCCPUClass *pcc = NULL;
7430 list = object_class_get_list(TYPE_POWERPC_CPU, true);
7431 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr_mask);
7432 if (item != NULL) {
7433 pcc = POWERPC_CPU_CLASS(item->data);
7435 g_slist_free(list);
7437 return pcc;
7440 static const char *ppc_cpu_lookup_alias(const char *alias)
7442 int ai;
7444 for (ai = 0; ppc_cpu_aliases[ai].alias != NULL; ai++) {
7445 if (strcmp(ppc_cpu_aliases[ai].alias, alias) == 0) {
7446 return ppc_cpu_aliases[ai].model;
7450 return NULL;
7453 static ObjectClass *ppc_cpu_class_by_name(const char *name)
7455 char *cpu_model, *typename;
7456 ObjectClass *oc;
7457 const char *p;
7458 unsigned long pvr;
7461 * Lookup by PVR if cpu_model is valid 8 digit hex number (excl:
7462 * 0x prefix if present)
7464 if (!qemu_strtoul(name, &p, 16, &pvr)) {
7465 int len = p - name;
7466 len = (len == 10) && (name[1] == 'x') ? len - 2 : len;
7467 if ((len == 8) && (*p == '\0')) {
7468 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr));
7472 cpu_model = g_ascii_strdown(name, -1);
7473 p = ppc_cpu_lookup_alias(cpu_model);
7474 if (p) {
7475 g_free(cpu_model);
7476 cpu_model = g_strdup(p);
7479 typename = g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX, cpu_model);
7480 oc = object_class_by_name(typename);
7481 g_free(typename);
7482 g_free(cpu_model);
7484 return oc;
7487 PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
7489 ObjectClass *oc = OBJECT_CLASS(pcc);
7491 while (oc && !object_class_is_abstract(oc)) {
7492 oc = object_class_get_parent(oc);
7494 assert(oc);
7496 return POWERPC_CPU_CLASS(oc);
7499 /* Sort by PVR, ordering special case "host" last. */
7500 static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
7502 ObjectClass *oc_a = (ObjectClass *)a;
7503 ObjectClass *oc_b = (ObjectClass *)b;
7504 PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
7505 PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
7506 const char *name_a = object_class_get_name(oc_a);
7507 const char *name_b = object_class_get_name(oc_b);
7509 if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
7510 return 1;
7511 } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
7512 return -1;
7513 } else {
7514 /* Avoid an integer overflow during subtraction */
7515 if (pcc_a->pvr < pcc_b->pvr) {
7516 return -1;
7517 } else if (pcc_a->pvr > pcc_b->pvr) {
7518 return 1;
7519 } else {
7520 return 0;
7525 static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
7527 ObjectClass *oc = data;
7528 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7529 DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
7530 const char *typename = object_class_get_name(oc);
7531 char *name;
7532 int i;
7534 if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) {
7535 return;
7538 name = g_strndup(typename,
7539 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
7540 qemu_printf("PowerPC %-16s PVR %08x\n", name, pcc->pvr);
7541 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
7542 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
7543 ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
7545 if (alias_oc != oc) {
7546 continue;
7549 * If running with KVM, we might update the family alias later, so
7550 * avoid printing the wrong alias here and use "preferred" instead
7552 if (strcmp(alias->alias, family->desc) == 0) {
7553 qemu_printf("PowerPC %-16s (alias for preferred %s CPU)\n",
7554 alias->alias, family->desc);
7555 } else {
7556 qemu_printf("PowerPC %-16s (alias for %s)\n",
7557 alias->alias, name);
7560 g_free(name);
7563 void ppc_cpu_list(void)
7565 GSList *list;
7567 list = object_class_get_list(TYPE_POWERPC_CPU, false);
7568 list = g_slist_sort(list, ppc_cpu_list_compare);
7569 g_slist_foreach(list, ppc_cpu_list_entry, NULL);
7570 g_slist_free(list);
7572 #ifdef CONFIG_KVM
7573 qemu_printf("\n");
7574 qemu_printf("PowerPC %s\n", "host");
7575 #endif
7578 static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
7580 ObjectClass *oc = data;
7581 CpuDefinitionInfoList **first = user_data;
7582 const char *typename;
7583 CpuDefinitionInfo *info;
7585 typename = object_class_get_name(oc);
7586 info = g_malloc0(sizeof(*info));
7587 info->name = g_strndup(typename,
7588 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
7590 QAPI_LIST_PREPEND(*first, info);
7593 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
7595 CpuDefinitionInfoList *cpu_list = NULL;
7596 GSList *list;
7597 int i;
7599 list = object_class_get_list(TYPE_POWERPC_CPU, false);
7600 g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
7601 g_slist_free(list);
7603 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
7604 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
7605 ObjectClass *oc;
7606 CpuDefinitionInfo *info;
7608 oc = ppc_cpu_class_by_name(alias->model);
7609 if (oc == NULL) {
7610 continue;
7613 info = g_malloc0(sizeof(*info));
7614 info->name = g_strdup(alias->alias);
7615 info->q_typename = g_strdup(object_class_get_name(oc));
7617 QAPI_LIST_PREPEND(cpu_list, info);
7620 return cpu_list;
7623 static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
7625 PowerPCCPU *cpu = POWERPC_CPU(cs);
7627 cpu->env.nip = value;
7630 static bool ppc_cpu_has_work(CPUState *cs)
7632 PowerPCCPU *cpu = POWERPC_CPU(cs);
7633 CPUPPCState *env = &cpu->env;
7635 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
7638 static void ppc_cpu_reset(DeviceState *dev)
7640 CPUState *s = CPU(dev);
7641 PowerPCCPU *cpu = POWERPC_CPU(s);
7642 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7643 CPUPPCState *env = &cpu->env;
7644 target_ulong msr;
7645 int i;
7647 pcc->parent_reset(dev);
7649 msr = (target_ulong)0;
7650 msr |= (target_ulong)MSR_HVB;
7651 msr |= (target_ulong)1 << MSR_EP;
7652 #if defined(DO_SINGLE_STEP) && 0
7653 /* Single step trace mode */
7654 msr |= (target_ulong)1 << MSR_SE;
7655 msr |= (target_ulong)1 << MSR_BE;
7656 #endif
7657 #if defined(CONFIG_USER_ONLY)
7658 msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */
7659 msr |= (target_ulong)1 << MSR_FE0; /* Allow floating point exceptions */
7660 msr |= (target_ulong)1 << MSR_FE1;
7661 msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */
7662 msr |= (target_ulong)1 << MSR_VSX; /* Allow VSX usage */
7663 msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */
7664 msr |= (target_ulong)1 << MSR_PR;
7665 #if defined(TARGET_PPC64)
7666 msr |= (target_ulong)1 << MSR_TM; /* Transactional memory */
7667 #endif
7668 #if !defined(TARGET_WORDS_BIGENDIAN)
7669 msr |= (target_ulong)1 << MSR_LE; /* Little-endian user mode */
7670 if (!((env->msr_mask >> MSR_LE) & 1)) {
7671 fprintf(stderr, "Selected CPU does not support little-endian.\n");
7672 exit(1);
7674 #endif
7675 #endif
7677 #if defined(TARGET_PPC64)
7678 if (mmu_is_64bit(env->mmu_model)) {
7679 msr |= (1ULL << MSR_SF);
7681 #endif
7683 hreg_store_msr(env, msr, 1);
7685 #if !defined(CONFIG_USER_ONLY)
7686 env->nip = env->hreset_vector | env->excp_prefix;
7687 #if defined(CONFIG_TCG)
7688 if (env->mmu_model != POWERPC_MMU_REAL) {
7689 ppc_tlb_invalidate_all(env);
7691 #endif /* CONFIG_TCG */
7692 #endif
7694 pmu_update_summaries(env);
7695 hreg_compute_hflags(env);
7696 env->reserve_addr = (target_ulong)-1ULL;
7697 /* Be sure no exception or interrupt is pending */
7698 env->pending_interrupts = 0;
7699 s->exception_index = POWERPC_EXCP_NONE;
7700 env->error_code = 0;
7701 ppc_irq_reset(cpu);
7703 /* tininess for underflow is detected before rounding */
7704 set_float_detect_tininess(float_tininess_before_rounding,
7705 &env->fp_status);
7707 for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
7708 ppc_spr_t *spr = &env->spr_cb[i];
7710 if (!spr->name) {
7711 continue;
7713 env->spr[i] = spr->default_value;
7717 #ifndef CONFIG_USER_ONLY
7719 static bool ppc_cpu_is_big_endian(CPUState *cs)
7721 PowerPCCPU *cpu = POWERPC_CPU(cs);
7722 CPUPPCState *env = &cpu->env;
7724 cpu_synchronize_state(cs);
7726 return !msr_le;
7729 #ifdef CONFIG_TCG
7730 static void ppc_cpu_exec_enter(CPUState *cs)
7732 PowerPCCPU *cpu = POWERPC_CPU(cs);
7734 if (cpu->vhyp) {
7735 PPCVirtualHypervisorClass *vhc =
7736 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
7737 vhc->cpu_exec_enter(cpu->vhyp, cpu);
7741 static void ppc_cpu_exec_exit(CPUState *cs)
7743 PowerPCCPU *cpu = POWERPC_CPU(cs);
7745 if (cpu->vhyp) {
7746 PPCVirtualHypervisorClass *vhc =
7747 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
7748 vhc->cpu_exec_exit(cpu->vhyp, cpu);
7751 #endif /* CONFIG_TCG */
7753 #endif /* !CONFIG_USER_ONLY */
7755 static void ppc_cpu_instance_init(Object *obj)
7757 PowerPCCPU *cpu = POWERPC_CPU(obj);
7758 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7759 CPUPPCState *env = &cpu->env;
7761 cpu_set_cpustate_pointers(cpu);
7762 cpu->vcpu_id = UNASSIGNED_CPU_INDEX;
7764 env->msr_mask = pcc->msr_mask;
7765 env->mmu_model = pcc->mmu_model;
7766 env->excp_model = pcc->excp_model;
7767 env->bus_model = pcc->bus_model;
7768 env->insns_flags = pcc->insns_flags;
7769 env->insns_flags2 = pcc->insns_flags2;
7770 env->flags = pcc->flags;
7771 env->bfd_mach = pcc->bfd_mach;
7772 env->check_pow = pcc->check_pow;
7775 * Mark HV mode as supported if the CPU has an MSR_HV bit in the
7776 * msr_mask. The mask can later be cleared by PAPR mode but the hv
7777 * mode support will remain, thus enforcing that we cannot use
7778 * priv. instructions in guest in PAPR mode. For 970 we currently
7779 * simply don't set HV in msr_mask thus simulating an "Apple mode"
7780 * 970. If we ever want to support 970 HV mode, we'll have to add
7781 * a processor attribute of some sort.
7783 #if !defined(CONFIG_USER_ONLY)
7784 env->has_hv_mode = !!(env->msr_mask & MSR_HVB);
7785 #endif
7787 ppc_hash64_init(cpu);
7790 static void ppc_cpu_instance_finalize(Object *obj)
7792 PowerPCCPU *cpu = POWERPC_CPU(obj);
7794 ppc_hash64_finalize(cpu);
7797 static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr)
7799 return pcc->pvr == pvr;
7802 static void ppc_disas_set_info(CPUState *cs, disassemble_info *info)
7804 PowerPCCPU *cpu = POWERPC_CPU(cs);
7805 CPUPPCState *env = &cpu->env;
7807 if ((env->hflags >> MSR_LE) & 1) {
7808 info->endian = BFD_ENDIAN_LITTLE;
7810 info->mach = env->bfd_mach;
7811 if (!env->bfd_mach) {
7812 #ifdef TARGET_PPC64
7813 info->mach = bfd_mach_ppc64;
7814 #else
7815 info->mach = bfd_mach_ppc;
7816 #endif
7818 info->disassembler_options = (char *)"any";
7819 info->print_insn = print_insn_ppc;
7821 info->cap_arch = CS_ARCH_PPC;
7822 #ifdef TARGET_PPC64
7823 info->cap_mode = CS_MODE_64;
7824 #endif
7827 static Property ppc_cpu_properties[] = {
7828 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU, pre_2_8_migration, false),
7829 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU, pre_2_10_migration,
7830 false),
7831 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU, pre_3_0_migration,
7832 false),
7833 DEFINE_PROP_END_OF_LIST(),
7836 #ifndef CONFIG_USER_ONLY
7837 #include "hw/core/sysemu-cpu-ops.h"
7839 static const struct SysemuCPUOps ppc_sysemu_ops = {
7840 .get_phys_page_debug = ppc_cpu_get_phys_page_debug,
7841 .write_elf32_note = ppc32_cpu_write_elf32_note,
7842 .write_elf64_note = ppc64_cpu_write_elf64_note,
7843 .virtio_is_big_endian = ppc_cpu_is_big_endian,
7844 .legacy_vmsd = &vmstate_ppc_cpu,
7846 #endif
7848 #ifdef CONFIG_TCG
7849 #include "hw/core/tcg-cpu-ops.h"
7851 static const struct TCGCPUOps ppc_tcg_ops = {
7852 .initialize = ppc_translate_init,
7854 #ifdef CONFIG_USER_ONLY
7855 .record_sigsegv = ppc_cpu_record_sigsegv,
7856 #else
7857 .tlb_fill = ppc_cpu_tlb_fill,
7858 .cpu_exec_interrupt = ppc_cpu_exec_interrupt,
7859 .do_interrupt = ppc_cpu_do_interrupt,
7860 .cpu_exec_enter = ppc_cpu_exec_enter,
7861 .cpu_exec_exit = ppc_cpu_exec_exit,
7862 .do_unaligned_access = ppc_cpu_do_unaligned_access,
7863 #endif /* !CONFIG_USER_ONLY */
7865 #endif /* CONFIG_TCG */
7867 static void ppc_cpu_class_init(ObjectClass *oc, void *data)
7869 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7870 CPUClass *cc = CPU_CLASS(oc);
7871 DeviceClass *dc = DEVICE_CLASS(oc);
7873 device_class_set_parent_realize(dc, ppc_cpu_realize,
7874 &pcc->parent_realize);
7875 device_class_set_parent_unrealize(dc, ppc_cpu_unrealize,
7876 &pcc->parent_unrealize);
7877 pcc->pvr_match = ppc_pvr_match_default;
7878 device_class_set_props(dc, ppc_cpu_properties);
7880 device_class_set_parent_reset(dc, ppc_cpu_reset, &pcc->parent_reset);
7882 cc->class_by_name = ppc_cpu_class_by_name;
7883 cc->has_work = ppc_cpu_has_work;
7884 cc->dump_state = ppc_cpu_dump_state;
7885 cc->set_pc = ppc_cpu_set_pc;
7886 cc->gdb_read_register = ppc_cpu_gdb_read_register;
7887 cc->gdb_write_register = ppc_cpu_gdb_write_register;
7888 #ifndef CONFIG_USER_ONLY
7889 cc->sysemu_ops = &ppc_sysemu_ops;
7890 #endif
7892 cc->gdb_num_core_regs = 71;
7893 #ifndef CONFIG_USER_ONLY
7894 cc->gdb_get_dynamic_xml = ppc_gdb_get_dynamic_xml;
7895 #endif
7896 #ifdef USE_APPLE_GDB
7897 cc->gdb_read_register = ppc_cpu_gdb_read_register_apple;
7898 cc->gdb_write_register = ppc_cpu_gdb_write_register_apple;
7899 cc->gdb_num_core_regs = 71 + 32;
7900 #endif
7902 cc->gdb_arch_name = ppc_gdb_arch_name;
7903 #if defined(TARGET_PPC64)
7904 cc->gdb_core_xml_file = "power64-core.xml";
7905 #else
7906 cc->gdb_core_xml_file = "power-core.xml";
7907 #endif
7908 cc->disas_set_info = ppc_disas_set_info;
7910 dc->fw_name = "PowerPC,UNKNOWN";
7912 #ifdef CONFIG_TCG
7913 cc->tcg_ops = &ppc_tcg_ops;
7914 #endif /* CONFIG_TCG */
7917 static const TypeInfo ppc_cpu_type_info = {
7918 .name = TYPE_POWERPC_CPU,
7919 .parent = TYPE_CPU,
7920 .instance_size = sizeof(PowerPCCPU),
7921 .instance_align = __alignof__(PowerPCCPU),
7922 .instance_init = ppc_cpu_instance_init,
7923 .instance_finalize = ppc_cpu_instance_finalize,
7924 .abstract = true,
7925 .class_size = sizeof(PowerPCCPUClass),
7926 .class_init = ppc_cpu_class_init,
7929 #ifndef CONFIG_USER_ONLY
7930 static const TypeInfo ppc_vhyp_type_info = {
7931 .name = TYPE_PPC_VIRTUAL_HYPERVISOR,
7932 .parent = TYPE_INTERFACE,
7933 .class_size = sizeof(PPCVirtualHypervisorClass),
7935 #endif
7937 static void ppc_cpu_register_types(void)
7939 type_register_static(&ppc_cpu_type_info);
7940 #ifndef CONFIG_USER_ONLY
7941 type_register_static(&ppc_vhyp_type_info);
7942 #endif
7945 void ppc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
7947 #define RGPL 4
7948 #define RFPL 4
7950 PowerPCCPU *cpu = POWERPC_CPU(cs);
7951 CPUPPCState *env = &cpu->env;
7952 int i;
7954 qemu_fprintf(f, "NIP " TARGET_FMT_lx " LR " TARGET_FMT_lx " CTR "
7955 TARGET_FMT_lx " XER " TARGET_FMT_lx " CPU#%d\n",
7956 env->nip, env->lr, env->ctr, cpu_read_xer(env),
7957 cs->cpu_index);
7958 qemu_fprintf(f, "MSR " TARGET_FMT_lx " HID0 " TARGET_FMT_lx " HF "
7959 "%08x iidx %d didx %d\n",
7960 env->msr, env->spr[SPR_HID0], env->hflags,
7961 cpu_mmu_index(env, true), cpu_mmu_index(env, false));
7962 #if !defined(NO_TIMER_DUMP)
7963 qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64
7964 #if !defined(CONFIG_USER_ONLY)
7965 " DECR " TARGET_FMT_lu
7966 #endif
7967 "\n",
7968 cpu_ppc_load_tbu(env), cpu_ppc_load_tbl(env)
7969 #if !defined(CONFIG_USER_ONLY)
7970 , cpu_ppc_load_decr(env)
7971 #endif
7973 #endif
7974 for (i = 0; i < 32; i++) {
7975 if ((i & (RGPL - 1)) == 0) {
7976 qemu_fprintf(f, "GPR%02d", i);
7978 qemu_fprintf(f, " %016" PRIx64, ppc_dump_gpr(env, i));
7979 if ((i & (RGPL - 1)) == (RGPL - 1)) {
7980 qemu_fprintf(f, "\n");
7983 qemu_fprintf(f, "CR ");
7984 for (i = 0; i < 8; i++)
7985 qemu_fprintf(f, "%01x", env->crf[i]);
7986 qemu_fprintf(f, " [");
7987 for (i = 0; i < 8; i++) {
7988 char a = '-';
7989 if (env->crf[i] & 0x08) {
7990 a = 'L';
7991 } else if (env->crf[i] & 0x04) {
7992 a = 'G';
7993 } else if (env->crf[i] & 0x02) {
7994 a = 'E';
7996 qemu_fprintf(f, " %c%c", a, env->crf[i] & 0x01 ? 'O' : ' ');
7998 qemu_fprintf(f, " ] RES " TARGET_FMT_lx "\n",
7999 env->reserve_addr);
8001 if (flags & CPU_DUMP_FPU) {
8002 for (i = 0; i < 32; i++) {
8003 if ((i & (RFPL - 1)) == 0) {
8004 qemu_fprintf(f, "FPR%02d", i);
8006 qemu_fprintf(f, " %016" PRIx64, *cpu_fpr_ptr(env, i));
8007 if ((i & (RFPL - 1)) == (RFPL - 1)) {
8008 qemu_fprintf(f, "\n");
8011 qemu_fprintf(f, "FPSCR " TARGET_FMT_lx "\n", env->fpscr);
8014 #if !defined(CONFIG_USER_ONLY)
8015 qemu_fprintf(f, " SRR0 " TARGET_FMT_lx " SRR1 " TARGET_FMT_lx
8016 " PVR " TARGET_FMT_lx " VRSAVE " TARGET_FMT_lx "\n",
8017 env->spr[SPR_SRR0], env->spr[SPR_SRR1],
8018 env->spr[SPR_PVR], env->spr[SPR_VRSAVE]);
8020 qemu_fprintf(f, "SPRG0 " TARGET_FMT_lx " SPRG1 " TARGET_FMT_lx
8021 " SPRG2 " TARGET_FMT_lx " SPRG3 " TARGET_FMT_lx "\n",
8022 env->spr[SPR_SPRG0], env->spr[SPR_SPRG1],
8023 env->spr[SPR_SPRG2], env->spr[SPR_SPRG3]);
8025 qemu_fprintf(f, "SPRG4 " TARGET_FMT_lx " SPRG5 " TARGET_FMT_lx
8026 " SPRG6 " TARGET_FMT_lx " SPRG7 " TARGET_FMT_lx "\n",
8027 env->spr[SPR_SPRG4], env->spr[SPR_SPRG5],
8028 env->spr[SPR_SPRG6], env->spr[SPR_SPRG7]);
8030 switch (env->excp_model) {
8031 #if defined(TARGET_PPC64)
8032 case POWERPC_EXCP_POWER7:
8033 case POWERPC_EXCP_POWER8:
8034 case POWERPC_EXCP_POWER9:
8035 case POWERPC_EXCP_POWER10:
8036 qemu_fprintf(f, "HSRR0 " TARGET_FMT_lx " HSRR1 " TARGET_FMT_lx "\n",
8037 env->spr[SPR_HSRR0], env->spr[SPR_HSRR1]);
8038 break;
8039 #endif
8040 case POWERPC_EXCP_BOOKE:
8041 qemu_fprintf(f, "CSRR0 " TARGET_FMT_lx " CSRR1 " TARGET_FMT_lx
8042 " MCSRR0 " TARGET_FMT_lx " MCSRR1 " TARGET_FMT_lx "\n",
8043 env->spr[SPR_BOOKE_CSRR0], env->spr[SPR_BOOKE_CSRR1],
8044 env->spr[SPR_BOOKE_MCSRR0], env->spr[SPR_BOOKE_MCSRR1]);
8046 qemu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx
8047 " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx "\n",
8048 env->spr[SPR_BOOKE_TCR], env->spr[SPR_BOOKE_TSR],
8049 env->spr[SPR_BOOKE_ESR], env->spr[SPR_BOOKE_DEAR]);
8051 qemu_fprintf(f, " PIR " TARGET_FMT_lx " DECAR " TARGET_FMT_lx
8052 " IVPR " TARGET_FMT_lx " EPCR " TARGET_FMT_lx "\n",
8053 env->spr[SPR_BOOKE_PIR], env->spr[SPR_BOOKE_DECAR],
8054 env->spr[SPR_BOOKE_IVPR], env->spr[SPR_BOOKE_EPCR]);
8056 qemu_fprintf(f, " MCSR " TARGET_FMT_lx " SPRG8 " TARGET_FMT_lx
8057 " EPR " TARGET_FMT_lx "\n",
8058 env->spr[SPR_BOOKE_MCSR], env->spr[SPR_BOOKE_SPRG8],
8059 env->spr[SPR_BOOKE_EPR]);
8061 /* FSL-specific */
8062 qemu_fprintf(f, " MCAR " TARGET_FMT_lx " PID1 " TARGET_FMT_lx
8063 " PID2 " TARGET_FMT_lx " SVR " TARGET_FMT_lx "\n",
8064 env->spr[SPR_Exxx_MCAR], env->spr[SPR_BOOKE_PID1],
8065 env->spr[SPR_BOOKE_PID2], env->spr[SPR_E500_SVR]);
8068 * IVORs are left out as they are large and do not change often --
8069 * they can be read with "p $ivor0", "p $ivor1", etc.
8071 break;
8072 case POWERPC_EXCP_40x:
8073 qemu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx
8074 " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx "\n",
8075 env->spr[SPR_40x_TCR], env->spr[SPR_40x_TSR],
8076 env->spr[SPR_40x_ESR], env->spr[SPR_40x_DEAR]);
8078 qemu_fprintf(f, " EVPR " TARGET_FMT_lx " SRR2 " TARGET_FMT_lx
8079 " SRR3 " TARGET_FMT_lx " PID " TARGET_FMT_lx "\n",
8080 env->spr[SPR_40x_EVPR], env->spr[SPR_40x_SRR2],
8081 env->spr[SPR_40x_SRR3], env->spr[SPR_40x_PID]);
8082 break;
8083 default:
8084 break;
8087 #if defined(TARGET_PPC64)
8088 if (env->flags & POWERPC_FLAG_CFAR) {
8089 qemu_fprintf(f, " CFAR " TARGET_FMT_lx"\n", env->cfar);
8091 #endif
8093 if (env->spr_cb[SPR_LPCR].name) {
8094 qemu_fprintf(f, " LPCR " TARGET_FMT_lx "\n", env->spr[SPR_LPCR]);
8097 switch (env->mmu_model) {
8098 case POWERPC_MMU_32B:
8099 case POWERPC_MMU_SOFT_6xx:
8100 #if defined(TARGET_PPC64)
8101 case POWERPC_MMU_64B:
8102 case POWERPC_MMU_2_03:
8103 case POWERPC_MMU_2_06:
8104 case POWERPC_MMU_2_07:
8105 case POWERPC_MMU_3_00:
8106 #endif
8107 if (env->spr_cb[SPR_SDR1].name) { /* SDR1 Exists */
8108 qemu_fprintf(f, " SDR1 " TARGET_FMT_lx " ", env->spr[SPR_SDR1]);
8110 if (env->spr_cb[SPR_PTCR].name) { /* PTCR Exists */
8111 qemu_fprintf(f, " PTCR " TARGET_FMT_lx " ", env->spr[SPR_PTCR]);
8113 qemu_fprintf(f, " DAR " TARGET_FMT_lx " DSISR " TARGET_FMT_lx "\n",
8114 env->spr[SPR_DAR], env->spr[SPR_DSISR]);
8115 break;
8116 case POWERPC_MMU_BOOKE206:
8117 qemu_fprintf(f, " MAS0 " TARGET_FMT_lx " MAS1 " TARGET_FMT_lx
8118 " MAS2 " TARGET_FMT_lx " MAS3 " TARGET_FMT_lx "\n",
8119 env->spr[SPR_BOOKE_MAS0], env->spr[SPR_BOOKE_MAS1],
8120 env->spr[SPR_BOOKE_MAS2], env->spr[SPR_BOOKE_MAS3]);
8122 qemu_fprintf(f, " MAS4 " TARGET_FMT_lx " MAS6 " TARGET_FMT_lx
8123 " MAS7 " TARGET_FMT_lx " PID " TARGET_FMT_lx "\n",
8124 env->spr[SPR_BOOKE_MAS4], env->spr[SPR_BOOKE_MAS6],
8125 env->spr[SPR_BOOKE_MAS7], env->spr[SPR_BOOKE_PID]);
8127 qemu_fprintf(f, "MMUCFG " TARGET_FMT_lx " TLB0CFG " TARGET_FMT_lx
8128 " TLB1CFG " TARGET_FMT_lx "\n",
8129 env->spr[SPR_MMUCFG], env->spr[SPR_BOOKE_TLB0CFG],
8130 env->spr[SPR_BOOKE_TLB1CFG]);
8131 break;
8132 default:
8133 break;
8135 #endif
8137 #undef RGPL
8138 #undef RFPL
8140 type_init(ppc_cpu_register_types)