machine: pass QAPI struct to mc->smp_parse
[qemu/kevin.git] / target / ppc / cpu_init.c
blobd0411e7302a25c1bbf320295567f5cee2c5398be
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/arch_init.h"
26 #include "sysemu/cpus.h"
27 #include "sysemu/hw_accel.h"
28 #include "sysemu/tcg.h"
29 #include "cpu-models.h"
30 #include "mmu-hash32.h"
31 #include "mmu-hash64.h"
32 #include "qemu/error-report.h"
33 #include "qemu/module.h"
34 #include "qemu/qemu-print.h"
35 #include "qapi/error.h"
36 #include "qapi/qmp/qnull.h"
37 #include "qapi/visitor.h"
38 #include "hw/qdev-properties.h"
39 #include "hw/ppc/ppc.h"
40 #include "mmu-book3s-v3.h"
41 #include "qemu/cutils.h"
42 #include "disas/capstone.h"
43 #include "fpu/softfloat.h"
44 #include "qapi/qapi-commands-machine-target.h"
46 #include "helper_regs.h"
47 #include "internal.h"
48 #include "spr_tcg.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(CPUPPCState *env)
155 /* Integer processing */
156 spr_register(env, SPR_XER, "XER",
157 &spr_read_xer, &spr_write_xer,
158 &spr_read_xer, &spr_write_xer,
159 0x00000000);
160 /* Branch control */
161 spr_register(env, SPR_LR, "LR",
162 &spr_read_lr, &spr_write_lr,
163 &spr_read_lr, &spr_write_lr,
164 0x00000000);
165 spr_register(env, SPR_CTR, "CTR",
166 &spr_read_ctr, &spr_write_ctr,
167 &spr_read_ctr, &spr_write_ctr,
168 0x00000000);
169 /* Interrupt processing */
170 spr_register(env, SPR_SRR0, "SRR0",
171 SPR_NOACCESS, SPR_NOACCESS,
172 &spr_read_generic, &spr_write_generic,
173 0x00000000);
174 spr_register(env, SPR_SRR1, "SRR1",
175 SPR_NOACCESS, SPR_NOACCESS,
176 &spr_read_generic, &spr_write_generic,
177 0x00000000);
178 /* Processor control */
179 spr_register(env, SPR_SPRG0, "SPRG0",
180 SPR_NOACCESS, SPR_NOACCESS,
181 &spr_read_generic, &spr_write_generic,
182 0x00000000);
183 spr_register(env, SPR_SPRG1, "SPRG1",
184 SPR_NOACCESS, SPR_NOACCESS,
185 &spr_read_generic, &spr_write_generic,
186 0x00000000);
187 spr_register(env, SPR_SPRG2, "SPRG2",
188 SPR_NOACCESS, SPR_NOACCESS,
189 &spr_read_generic, &spr_write_generic,
190 0x00000000);
191 spr_register(env, SPR_SPRG3, "SPRG3",
192 SPR_NOACCESS, SPR_NOACCESS,
193 &spr_read_generic, &spr_write_generic,
194 0x00000000);
197 /* SPR common to all non-embedded PowerPC, including 601 */
198 static void register_ne_601_sprs(CPUPPCState *env)
200 /* Exception processing */
201 spr_register_kvm(env, SPR_DSISR, "DSISR",
202 SPR_NOACCESS, SPR_NOACCESS,
203 &spr_read_generic, &spr_write_generic,
204 KVM_REG_PPC_DSISR, 0x00000000);
205 spr_register_kvm(env, SPR_DAR, "DAR",
206 SPR_NOACCESS, SPR_NOACCESS,
207 &spr_read_generic, &spr_write_generic,
208 KVM_REG_PPC_DAR, 0x00000000);
209 /* Timer */
210 spr_register(env, SPR_DECR, "DECR",
211 SPR_NOACCESS, SPR_NOACCESS,
212 &spr_read_decr, &spr_write_decr,
213 0x00000000);
216 /* Storage Description Register 1 */
217 static void register_sdr1_sprs(CPUPPCState *env)
219 #ifndef CONFIG_USER_ONLY
220 if (env->has_hv_mode) {
222 * SDR1 is a hypervisor resource on CPUs which have a
223 * hypervisor mode
225 spr_register_hv(env, SPR_SDR1, "SDR1",
226 SPR_NOACCESS, SPR_NOACCESS,
227 SPR_NOACCESS, SPR_NOACCESS,
228 &spr_read_generic, &spr_write_sdr1,
229 0x00000000);
230 } else {
231 spr_register(env, SPR_SDR1, "SDR1",
232 SPR_NOACCESS, SPR_NOACCESS,
233 &spr_read_generic, &spr_write_sdr1,
234 0x00000000);
236 #endif
239 /* BATs 0-3 */
240 static void register_low_BATs(CPUPPCState *env)
242 #if !defined(CONFIG_USER_ONLY)
243 spr_register(env, SPR_IBAT0U, "IBAT0U",
244 SPR_NOACCESS, SPR_NOACCESS,
245 &spr_read_ibat, &spr_write_ibatu,
246 0x00000000);
247 spr_register(env, SPR_IBAT0L, "IBAT0L",
248 SPR_NOACCESS, SPR_NOACCESS,
249 &spr_read_ibat, &spr_write_ibatl,
250 0x00000000);
251 spr_register(env, SPR_IBAT1U, "IBAT1U",
252 SPR_NOACCESS, SPR_NOACCESS,
253 &spr_read_ibat, &spr_write_ibatu,
254 0x00000000);
255 spr_register(env, SPR_IBAT1L, "IBAT1L",
256 SPR_NOACCESS, SPR_NOACCESS,
257 &spr_read_ibat, &spr_write_ibatl,
258 0x00000000);
259 spr_register(env, SPR_IBAT2U, "IBAT2U",
260 SPR_NOACCESS, SPR_NOACCESS,
261 &spr_read_ibat, &spr_write_ibatu,
262 0x00000000);
263 spr_register(env, SPR_IBAT2L, "IBAT2L",
264 SPR_NOACCESS, SPR_NOACCESS,
265 &spr_read_ibat, &spr_write_ibatl,
266 0x00000000);
267 spr_register(env, SPR_IBAT3U, "IBAT3U",
268 SPR_NOACCESS, SPR_NOACCESS,
269 &spr_read_ibat, &spr_write_ibatu,
270 0x00000000);
271 spr_register(env, SPR_IBAT3L, "IBAT3L",
272 SPR_NOACCESS, SPR_NOACCESS,
273 &spr_read_ibat, &spr_write_ibatl,
274 0x00000000);
275 spr_register(env, SPR_DBAT0U, "DBAT0U",
276 SPR_NOACCESS, SPR_NOACCESS,
277 &spr_read_dbat, &spr_write_dbatu,
278 0x00000000);
279 spr_register(env, SPR_DBAT0L, "DBAT0L",
280 SPR_NOACCESS, SPR_NOACCESS,
281 &spr_read_dbat, &spr_write_dbatl,
282 0x00000000);
283 spr_register(env, SPR_DBAT1U, "DBAT1U",
284 SPR_NOACCESS, SPR_NOACCESS,
285 &spr_read_dbat, &spr_write_dbatu,
286 0x00000000);
287 spr_register(env, SPR_DBAT1L, "DBAT1L",
288 SPR_NOACCESS, SPR_NOACCESS,
289 &spr_read_dbat, &spr_write_dbatl,
290 0x00000000);
291 spr_register(env, SPR_DBAT2U, "DBAT2U",
292 SPR_NOACCESS, SPR_NOACCESS,
293 &spr_read_dbat, &spr_write_dbatu,
294 0x00000000);
295 spr_register(env, SPR_DBAT2L, "DBAT2L",
296 SPR_NOACCESS, SPR_NOACCESS,
297 &spr_read_dbat, &spr_write_dbatl,
298 0x00000000);
299 spr_register(env, SPR_DBAT3U, "DBAT3U",
300 SPR_NOACCESS, SPR_NOACCESS,
301 &spr_read_dbat, &spr_write_dbatu,
302 0x00000000);
303 spr_register(env, SPR_DBAT3L, "DBAT3L",
304 SPR_NOACCESS, SPR_NOACCESS,
305 &spr_read_dbat, &spr_write_dbatl,
306 0x00000000);
307 env->nb_BATs += 4;
308 #endif
311 /* BATs 4-7 */
312 static void register_high_BATs(CPUPPCState *env)
314 #if !defined(CONFIG_USER_ONLY)
315 spr_register(env, SPR_IBAT4U, "IBAT4U",
316 SPR_NOACCESS, SPR_NOACCESS,
317 &spr_read_ibat_h, &spr_write_ibatu_h,
318 0x00000000);
319 spr_register(env, SPR_IBAT4L, "IBAT4L",
320 SPR_NOACCESS, SPR_NOACCESS,
321 &spr_read_ibat_h, &spr_write_ibatl_h,
322 0x00000000);
323 spr_register(env, SPR_IBAT5U, "IBAT5U",
324 SPR_NOACCESS, SPR_NOACCESS,
325 &spr_read_ibat_h, &spr_write_ibatu_h,
326 0x00000000);
327 spr_register(env, SPR_IBAT5L, "IBAT5L",
328 SPR_NOACCESS, SPR_NOACCESS,
329 &spr_read_ibat_h, &spr_write_ibatl_h,
330 0x00000000);
331 spr_register(env, SPR_IBAT6U, "IBAT6U",
332 SPR_NOACCESS, SPR_NOACCESS,
333 &spr_read_ibat_h, &spr_write_ibatu_h,
334 0x00000000);
335 spr_register(env, SPR_IBAT6L, "IBAT6L",
336 SPR_NOACCESS, SPR_NOACCESS,
337 &spr_read_ibat_h, &spr_write_ibatl_h,
338 0x00000000);
339 spr_register(env, SPR_IBAT7U, "IBAT7U",
340 SPR_NOACCESS, SPR_NOACCESS,
341 &spr_read_ibat_h, &spr_write_ibatu_h,
342 0x00000000);
343 spr_register(env, SPR_IBAT7L, "IBAT7L",
344 SPR_NOACCESS, SPR_NOACCESS,
345 &spr_read_ibat_h, &spr_write_ibatl_h,
346 0x00000000);
347 spr_register(env, SPR_DBAT4U, "DBAT4U",
348 SPR_NOACCESS, SPR_NOACCESS,
349 &spr_read_dbat_h, &spr_write_dbatu_h,
350 0x00000000);
351 spr_register(env, SPR_DBAT4L, "DBAT4L",
352 SPR_NOACCESS, SPR_NOACCESS,
353 &spr_read_dbat_h, &spr_write_dbatl_h,
354 0x00000000);
355 spr_register(env, SPR_DBAT5U, "DBAT5U",
356 SPR_NOACCESS, SPR_NOACCESS,
357 &spr_read_dbat_h, &spr_write_dbatu_h,
358 0x00000000);
359 spr_register(env, SPR_DBAT5L, "DBAT5L",
360 SPR_NOACCESS, SPR_NOACCESS,
361 &spr_read_dbat_h, &spr_write_dbatl_h,
362 0x00000000);
363 spr_register(env, SPR_DBAT6U, "DBAT6U",
364 SPR_NOACCESS, SPR_NOACCESS,
365 &spr_read_dbat_h, &spr_write_dbatu_h,
366 0x00000000);
367 spr_register(env, SPR_DBAT6L, "DBAT6L",
368 SPR_NOACCESS, SPR_NOACCESS,
369 &spr_read_dbat_h, &spr_write_dbatl_h,
370 0x00000000);
371 spr_register(env, SPR_DBAT7U, "DBAT7U",
372 SPR_NOACCESS, SPR_NOACCESS,
373 &spr_read_dbat_h, &spr_write_dbatu_h,
374 0x00000000);
375 spr_register(env, SPR_DBAT7L, "DBAT7L",
376 SPR_NOACCESS, SPR_NOACCESS,
377 &spr_read_dbat_h, &spr_write_dbatl_h,
378 0x00000000);
379 env->nb_BATs += 4;
380 #endif
383 /* Generic PowerPC time base */
384 static void register_tbl(CPUPPCState *env)
386 spr_register(env, SPR_VTBL, "TBL",
387 &spr_read_tbl, SPR_NOACCESS,
388 &spr_read_tbl, SPR_NOACCESS,
389 0x00000000);
390 spr_register(env, SPR_TBL, "TBL",
391 &spr_read_tbl, SPR_NOACCESS,
392 &spr_read_tbl, &spr_write_tbl,
393 0x00000000);
394 spr_register(env, SPR_VTBU, "TBU",
395 &spr_read_tbu, SPR_NOACCESS,
396 &spr_read_tbu, SPR_NOACCESS,
397 0x00000000);
398 spr_register(env, SPR_TBU, "TBU",
399 &spr_read_tbu, SPR_NOACCESS,
400 &spr_read_tbu, &spr_write_tbu,
401 0x00000000);
404 /* Softare table search registers */
405 static void register_6xx_7xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways)
407 #if !defined(CONFIG_USER_ONLY)
408 env->nb_tlb = nb_tlbs;
409 env->nb_ways = nb_ways;
410 env->id_tlbs = 1;
411 env->tlb_type = TLB_6XX;
412 spr_register(env, SPR_DMISS, "DMISS",
413 SPR_NOACCESS, SPR_NOACCESS,
414 &spr_read_generic, SPR_NOACCESS,
415 0x00000000);
416 spr_register(env, SPR_DCMP, "DCMP",
417 SPR_NOACCESS, SPR_NOACCESS,
418 &spr_read_generic, SPR_NOACCESS,
419 0x00000000);
420 spr_register(env, SPR_HASH1, "HASH1",
421 SPR_NOACCESS, SPR_NOACCESS,
422 &spr_read_generic, SPR_NOACCESS,
423 0x00000000);
424 spr_register(env, SPR_HASH2, "HASH2",
425 SPR_NOACCESS, SPR_NOACCESS,
426 &spr_read_generic, SPR_NOACCESS,
427 0x00000000);
428 spr_register(env, SPR_IMISS, "IMISS",
429 SPR_NOACCESS, SPR_NOACCESS,
430 &spr_read_generic, SPR_NOACCESS,
431 0x00000000);
432 spr_register(env, SPR_ICMP, "ICMP",
433 SPR_NOACCESS, SPR_NOACCESS,
434 &spr_read_generic, SPR_NOACCESS,
435 0x00000000);
436 spr_register(env, SPR_RPA, "RPA",
437 SPR_NOACCESS, SPR_NOACCESS,
438 &spr_read_generic, &spr_write_generic,
439 0x00000000);
440 #endif
443 /* SPR common to MPC755 and G2 */
444 static void register_G2_755_sprs(CPUPPCState *env)
446 /* SGPRs */
447 spr_register(env, SPR_SPRG4, "SPRG4",
448 SPR_NOACCESS, SPR_NOACCESS,
449 &spr_read_generic, &spr_write_generic,
450 0x00000000);
451 spr_register(env, SPR_SPRG5, "SPRG5",
452 SPR_NOACCESS, SPR_NOACCESS,
453 &spr_read_generic, &spr_write_generic,
454 0x00000000);
455 spr_register(env, SPR_SPRG6, "SPRG6",
456 SPR_NOACCESS, SPR_NOACCESS,
457 &spr_read_generic, &spr_write_generic,
458 0x00000000);
459 spr_register(env, SPR_SPRG7, "SPRG7",
460 SPR_NOACCESS, SPR_NOACCESS,
461 &spr_read_generic, &spr_write_generic,
462 0x00000000);
465 /* SPR common to all 7xx PowerPC implementations */
466 static void register_7xx_sprs(CPUPPCState *env)
468 /* Breakpoints */
469 /* XXX : not implemented */
470 spr_register_kvm(env, SPR_DABR, "DABR",
471 SPR_NOACCESS, SPR_NOACCESS,
472 &spr_read_generic, &spr_write_generic,
473 KVM_REG_PPC_DABR, 0x00000000);
474 /* XXX : not implemented */
475 spr_register(env, SPR_IABR, "IABR",
476 SPR_NOACCESS, SPR_NOACCESS,
477 &spr_read_generic, &spr_write_generic,
478 0x00000000);
479 /* Cache management */
480 /* XXX : not implemented */
481 spr_register(env, SPR_ICTC, "ICTC",
482 SPR_NOACCESS, SPR_NOACCESS,
483 &spr_read_generic, &spr_write_generic,
484 0x00000000);
485 /* Performance monitors */
486 /* XXX : not implemented */
487 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
488 SPR_NOACCESS, SPR_NOACCESS,
489 &spr_read_generic, &spr_write_generic,
490 0x00000000);
491 /* XXX : not implemented */
492 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
493 SPR_NOACCESS, SPR_NOACCESS,
494 &spr_read_generic, &spr_write_generic,
495 0x00000000);
496 /* XXX : not implemented */
497 spr_register(env, SPR_7XX_PMC1, "PMC1",
498 SPR_NOACCESS, SPR_NOACCESS,
499 &spr_read_generic, &spr_write_generic,
500 0x00000000);
501 /* XXX : not implemented */
502 spr_register(env, SPR_7XX_PMC2, "PMC2",
503 SPR_NOACCESS, SPR_NOACCESS,
504 &spr_read_generic, &spr_write_generic,
505 0x00000000);
506 /* XXX : not implemented */
507 spr_register(env, SPR_7XX_PMC3, "PMC3",
508 SPR_NOACCESS, SPR_NOACCESS,
509 &spr_read_generic, &spr_write_generic,
510 0x00000000);
511 /* XXX : not implemented */
512 spr_register(env, SPR_7XX_PMC4, "PMC4",
513 SPR_NOACCESS, SPR_NOACCESS,
514 &spr_read_generic, &spr_write_generic,
515 0x00000000);
516 /* XXX : not implemented */
517 spr_register(env, SPR_7XX_SIAR, "SIAR",
518 SPR_NOACCESS, SPR_NOACCESS,
519 &spr_read_generic, SPR_NOACCESS,
520 0x00000000);
521 /* XXX : not implemented */
522 spr_register(env, SPR_7XX_UMMCR0, "UMMCR0",
523 &spr_read_ureg, SPR_NOACCESS,
524 &spr_read_ureg, SPR_NOACCESS,
525 0x00000000);
526 /* XXX : not implemented */
527 spr_register(env, SPR_7XX_UMMCR1, "UMMCR1",
528 &spr_read_ureg, SPR_NOACCESS,
529 &spr_read_ureg, SPR_NOACCESS,
530 0x00000000);
531 /* XXX : not implemented */
532 spr_register(env, SPR_7XX_UPMC1, "UPMC1",
533 &spr_read_ureg, SPR_NOACCESS,
534 &spr_read_ureg, SPR_NOACCESS,
535 0x00000000);
536 /* XXX : not implemented */
537 spr_register(env, SPR_7XX_UPMC2, "UPMC2",
538 &spr_read_ureg, SPR_NOACCESS,
539 &spr_read_ureg, SPR_NOACCESS,
540 0x00000000);
541 /* XXX : not implemented */
542 spr_register(env, SPR_7XX_UPMC3, "UPMC3",
543 &spr_read_ureg, SPR_NOACCESS,
544 &spr_read_ureg, SPR_NOACCESS,
545 0x00000000);
546 /* XXX : not implemented */
547 spr_register(env, SPR_7XX_UPMC4, "UPMC4",
548 &spr_read_ureg, SPR_NOACCESS,
549 &spr_read_ureg, SPR_NOACCESS,
550 0x00000000);
551 /* XXX : not implemented */
552 spr_register(env, SPR_7XX_USIAR, "USIAR",
553 &spr_read_ureg, SPR_NOACCESS,
554 &spr_read_ureg, SPR_NOACCESS,
555 0x00000000);
556 /* External access control */
557 /* XXX : not implemented */
558 spr_register(env, SPR_EAR, "EAR",
559 SPR_NOACCESS, SPR_NOACCESS,
560 &spr_read_generic, &spr_write_generic,
561 0x00000000);
564 #ifdef TARGET_PPC64
565 static void register_amr_sprs(CPUPPCState *env)
567 #ifndef CONFIG_USER_ONLY
569 * Virtual Page Class Key protection
571 * The AMR is accessible either via SPR 13 or SPR 29. 13 is
572 * userspace accessible, 29 is privileged. So we only need to set
573 * the kvm ONE_REG id on one of them, we use 29
575 spr_register(env, SPR_UAMR, "UAMR",
576 &spr_read_generic, &spr_write_amr,
577 &spr_read_generic, &spr_write_amr,
579 spr_register_kvm_hv(env, SPR_AMR, "AMR",
580 SPR_NOACCESS, SPR_NOACCESS,
581 &spr_read_generic, &spr_write_amr,
582 &spr_read_generic, &spr_write_generic,
583 KVM_REG_PPC_AMR, 0);
584 spr_register_kvm_hv(env, SPR_UAMOR, "UAMOR",
585 SPR_NOACCESS, SPR_NOACCESS,
586 &spr_read_generic, &spr_write_uamor,
587 &spr_read_generic, &spr_write_generic,
588 KVM_REG_PPC_UAMOR, 0);
589 spr_register_hv(env, SPR_AMOR, "AMOR",
590 SPR_NOACCESS, SPR_NOACCESS,
591 SPR_NOACCESS, SPR_NOACCESS,
592 &spr_read_generic, &spr_write_generic,
594 #endif /* !CONFIG_USER_ONLY */
597 static void register_iamr_sprs(CPUPPCState *env)
599 #ifndef CONFIG_USER_ONLY
600 spr_register_kvm_hv(env, SPR_IAMR, "IAMR",
601 SPR_NOACCESS, SPR_NOACCESS,
602 &spr_read_generic, &spr_write_iamr,
603 &spr_read_generic, &spr_write_generic,
604 KVM_REG_PPC_IAMR, 0);
605 #endif /* !CONFIG_USER_ONLY */
607 #endif /* TARGET_PPC64 */
609 static void register_thrm_sprs(CPUPPCState *env)
611 /* Thermal management */
612 /* XXX : not implemented */
613 spr_register(env, SPR_THRM1, "THRM1",
614 SPR_NOACCESS, SPR_NOACCESS,
615 &spr_read_thrm, &spr_write_generic,
616 0x00000000);
617 /* XXX : not implemented */
618 spr_register(env, SPR_THRM2, "THRM2",
619 SPR_NOACCESS, SPR_NOACCESS,
620 &spr_read_thrm, &spr_write_generic,
621 0x00000000);
622 /* XXX : not implemented */
623 spr_register(env, SPR_THRM3, "THRM3",
624 SPR_NOACCESS, SPR_NOACCESS,
625 &spr_read_thrm, &spr_write_generic,
626 0x00000000);
629 /* SPR specific to PowerPC 604 implementation */
630 static void register_604_sprs(CPUPPCState *env)
632 /* Processor identification */
633 spr_register(env, SPR_PIR, "PIR",
634 SPR_NOACCESS, SPR_NOACCESS,
635 &spr_read_generic, &spr_write_pir,
636 0x00000000);
637 /* Breakpoints */
638 /* XXX : not implemented */
639 spr_register(env, SPR_IABR, "IABR",
640 SPR_NOACCESS, SPR_NOACCESS,
641 &spr_read_generic, &spr_write_generic,
642 0x00000000);
643 /* XXX : not implemented */
644 spr_register_kvm(env, SPR_DABR, "DABR",
645 SPR_NOACCESS, SPR_NOACCESS,
646 &spr_read_generic, &spr_write_generic,
647 KVM_REG_PPC_DABR, 0x00000000);
648 /* Performance counters */
649 /* XXX : not implemented */
650 spr_register(env, SPR_7XX_MMCR0, "MMCR0",
651 SPR_NOACCESS, SPR_NOACCESS,
652 &spr_read_generic, &spr_write_generic,
653 0x00000000);
654 /* XXX : not implemented */
655 spr_register(env, SPR_7XX_PMC1, "PMC1",
656 SPR_NOACCESS, SPR_NOACCESS,
657 &spr_read_generic, &spr_write_generic,
658 0x00000000);
659 /* XXX : not implemented */
660 spr_register(env, SPR_7XX_PMC2, "PMC2",
661 SPR_NOACCESS, SPR_NOACCESS,
662 &spr_read_generic, &spr_write_generic,
663 0x00000000);
664 /* XXX : not implemented */
665 spr_register(env, SPR_7XX_SIAR, "SIAR",
666 SPR_NOACCESS, SPR_NOACCESS,
667 &spr_read_generic, SPR_NOACCESS,
668 0x00000000);
669 /* XXX : not implemented */
670 spr_register(env, SPR_SDA, "SDA",
671 SPR_NOACCESS, SPR_NOACCESS,
672 &spr_read_generic, SPR_NOACCESS,
673 0x00000000);
674 /* External access control */
675 /* XXX : not implemented */
676 spr_register(env, SPR_EAR, "EAR",
677 SPR_NOACCESS, SPR_NOACCESS,
678 &spr_read_generic, &spr_write_generic,
679 0x00000000);
682 /* SPR specific to PowerPC 603 implementation */
683 static void register_603_sprs(CPUPPCState *env)
685 /* External access control */
686 /* XXX : not implemented */
687 spr_register(env, SPR_EAR, "EAR",
688 SPR_NOACCESS, SPR_NOACCESS,
689 &spr_read_generic, &spr_write_generic,
690 0x00000000);
691 /* Breakpoints */
692 /* XXX : not implemented */
693 spr_register(env, SPR_IABR, "IABR",
694 SPR_NOACCESS, SPR_NOACCESS,
695 &spr_read_generic, &spr_write_generic,
696 0x00000000);
700 /* SPR specific to PowerPC G2 implementation */
701 static void register_G2_sprs(CPUPPCState *env)
703 /* Memory base address */
704 /* MBAR */
705 /* XXX : not implemented */
706 spr_register(env, SPR_MBAR, "MBAR",
707 SPR_NOACCESS, SPR_NOACCESS,
708 &spr_read_generic, &spr_write_generic,
709 0x00000000);
710 /* Exception processing */
711 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
712 SPR_NOACCESS, SPR_NOACCESS,
713 &spr_read_generic, &spr_write_generic,
714 0x00000000);
715 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
716 SPR_NOACCESS, SPR_NOACCESS,
717 &spr_read_generic, &spr_write_generic,
718 0x00000000);
719 /* Breakpoints */
720 /* XXX : not implemented */
721 spr_register(env, SPR_DABR, "DABR",
722 SPR_NOACCESS, SPR_NOACCESS,
723 &spr_read_generic, &spr_write_generic,
724 0x00000000);
725 /* XXX : not implemented */
726 spr_register(env, SPR_DABR2, "DABR2",
727 SPR_NOACCESS, SPR_NOACCESS,
728 &spr_read_generic, &spr_write_generic,
729 0x00000000);
730 /* XXX : not implemented */
731 spr_register(env, SPR_IABR, "IABR",
732 SPR_NOACCESS, SPR_NOACCESS,
733 &spr_read_generic, &spr_write_generic,
734 0x00000000);
735 /* XXX : not implemented */
736 spr_register(env, SPR_IABR2, "IABR2",
737 SPR_NOACCESS, SPR_NOACCESS,
738 &spr_read_generic, &spr_write_generic,
739 0x00000000);
740 /* XXX : not implemented */
741 spr_register(env, SPR_IBCR, "IBCR",
742 SPR_NOACCESS, SPR_NOACCESS,
743 &spr_read_generic, &spr_write_generic,
744 0x00000000);
745 /* XXX : not implemented */
746 spr_register(env, SPR_DBCR, "DBCR",
747 SPR_NOACCESS, SPR_NOACCESS,
748 &spr_read_generic, &spr_write_generic,
749 0x00000000);
752 /* SPR specific to PowerPC 602 implementation */
753 static void register_602_sprs(CPUPPCState *env)
755 /* ESA registers */
756 /* XXX : not implemented */
757 spr_register(env, SPR_SER, "SER",
758 SPR_NOACCESS, SPR_NOACCESS,
759 &spr_read_generic, &spr_write_generic,
760 0x00000000);
761 /* XXX : not implemented */
762 spr_register(env, SPR_SEBR, "SEBR",
763 SPR_NOACCESS, SPR_NOACCESS,
764 &spr_read_generic, &spr_write_generic,
765 0x00000000);
766 /* XXX : not implemented */
767 spr_register(env, SPR_ESASRR, "ESASRR",
768 SPR_NOACCESS, SPR_NOACCESS,
769 &spr_read_generic, &spr_write_generic,
770 0x00000000);
771 /* Floating point status */
772 /* XXX : not implemented */
773 spr_register(env, SPR_SP, "SP",
774 SPR_NOACCESS, SPR_NOACCESS,
775 &spr_read_generic, &spr_write_generic,
776 0x00000000);
777 /* XXX : not implemented */
778 spr_register(env, SPR_LT, "LT",
779 SPR_NOACCESS, SPR_NOACCESS,
780 &spr_read_generic, &spr_write_generic,
781 0x00000000);
782 /* Watchdog timer */
783 /* XXX : not implemented */
784 spr_register(env, SPR_TCR, "TCR",
785 SPR_NOACCESS, SPR_NOACCESS,
786 &spr_read_generic, &spr_write_generic,
787 0x00000000);
788 /* Interrupt base */
789 spr_register(env, SPR_IBR, "IBR",
790 SPR_NOACCESS, SPR_NOACCESS,
791 &spr_read_generic, &spr_write_generic,
792 0x00000000);
793 /* XXX : not implemented */
794 spr_register(env, SPR_IABR, "IABR",
795 SPR_NOACCESS, SPR_NOACCESS,
796 &spr_read_generic, &spr_write_generic,
797 0x00000000);
800 /* SPR specific to PowerPC 601 implementation */
801 static void register_601_sprs(CPUPPCState *env)
803 /* Multiplication/division register */
804 /* MQ */
805 spr_register(env, SPR_MQ, "MQ",
806 &spr_read_generic, &spr_write_generic,
807 &spr_read_generic, &spr_write_generic,
808 0x00000000);
809 /* RTC registers */
810 spr_register(env, SPR_601_RTCU, "RTCU",
811 SPR_NOACCESS, SPR_NOACCESS,
812 SPR_NOACCESS, &spr_write_601_rtcu,
813 0x00000000);
814 spr_register(env, SPR_601_VRTCU, "RTCU",
815 &spr_read_601_rtcu, SPR_NOACCESS,
816 &spr_read_601_rtcu, SPR_NOACCESS,
817 0x00000000);
818 spr_register(env, SPR_601_RTCL, "RTCL",
819 SPR_NOACCESS, SPR_NOACCESS,
820 SPR_NOACCESS, &spr_write_601_rtcl,
821 0x00000000);
822 spr_register(env, SPR_601_VRTCL, "RTCL",
823 &spr_read_601_rtcl, SPR_NOACCESS,
824 &spr_read_601_rtcl, SPR_NOACCESS,
825 0x00000000);
826 /* Timer */
827 #if 0 /* ? */
828 spr_register(env, SPR_601_UDECR, "UDECR",
829 &spr_read_decr, SPR_NOACCESS,
830 &spr_read_decr, SPR_NOACCESS,
831 0x00000000);
832 #endif
833 /* External access control */
834 /* XXX : not implemented */
835 spr_register(env, SPR_EAR, "EAR",
836 SPR_NOACCESS, SPR_NOACCESS,
837 &spr_read_generic, &spr_write_generic,
838 0x00000000);
839 /* Memory management */
840 #if !defined(CONFIG_USER_ONLY)
841 spr_register(env, SPR_IBAT0U, "IBAT0U",
842 SPR_NOACCESS, SPR_NOACCESS,
843 &spr_read_601_ubat, &spr_write_601_ubatu,
844 0x00000000);
845 spr_register(env, SPR_IBAT0L, "IBAT0L",
846 SPR_NOACCESS, SPR_NOACCESS,
847 &spr_read_601_ubat, &spr_write_601_ubatl,
848 0x00000000);
849 spr_register(env, SPR_IBAT1U, "IBAT1U",
850 SPR_NOACCESS, SPR_NOACCESS,
851 &spr_read_601_ubat, &spr_write_601_ubatu,
852 0x00000000);
853 spr_register(env, SPR_IBAT1L, "IBAT1L",
854 SPR_NOACCESS, SPR_NOACCESS,
855 &spr_read_601_ubat, &spr_write_601_ubatl,
856 0x00000000);
857 spr_register(env, SPR_IBAT2U, "IBAT2U",
858 SPR_NOACCESS, SPR_NOACCESS,
859 &spr_read_601_ubat, &spr_write_601_ubatu,
860 0x00000000);
861 spr_register(env, SPR_IBAT2L, "IBAT2L",
862 SPR_NOACCESS, SPR_NOACCESS,
863 &spr_read_601_ubat, &spr_write_601_ubatl,
864 0x00000000);
865 spr_register(env, SPR_IBAT3U, "IBAT3U",
866 SPR_NOACCESS, SPR_NOACCESS,
867 &spr_read_601_ubat, &spr_write_601_ubatu,
868 0x00000000);
869 spr_register(env, SPR_IBAT3L, "IBAT3L",
870 SPR_NOACCESS, SPR_NOACCESS,
871 &spr_read_601_ubat, &spr_write_601_ubatl,
872 0x00000000);
873 env->nb_BATs = 4;
874 #endif
877 static void register_74xx_sprs(CPUPPCState *env)
879 /* Processor identification */
880 spr_register(env, SPR_PIR, "PIR",
881 SPR_NOACCESS, SPR_NOACCESS,
882 &spr_read_generic, &spr_write_pir,
883 0x00000000);
884 /* XXX : not implemented */
885 spr_register(env, SPR_74XX_MMCR2, "MMCR2",
886 SPR_NOACCESS, SPR_NOACCESS,
887 &spr_read_generic, &spr_write_generic,
888 0x00000000);
889 /* XXX : not implemented */
890 spr_register(env, SPR_74XX_UMMCR2, "UMMCR2",
891 &spr_read_ureg, SPR_NOACCESS,
892 &spr_read_ureg, SPR_NOACCESS,
893 0x00000000);
894 /* XXX: not implemented */
895 spr_register(env, SPR_BAMR, "BAMR",
896 SPR_NOACCESS, SPR_NOACCESS,
897 &spr_read_generic, &spr_write_generic,
898 0x00000000);
899 /* XXX : not implemented */
900 spr_register(env, SPR_MSSCR0, "MSSCR0",
901 SPR_NOACCESS, SPR_NOACCESS,
902 &spr_read_generic, &spr_write_generic,
903 0x00000000);
904 /* Hardware implementation registers */
905 /* XXX : not implemented */
906 spr_register(env, SPR_HID0, "HID0",
907 SPR_NOACCESS, SPR_NOACCESS,
908 &spr_read_generic, &spr_write_generic,
909 0x00000000);
910 /* XXX : not implemented */
911 spr_register(env, SPR_HID1, "HID1",
912 SPR_NOACCESS, SPR_NOACCESS,
913 &spr_read_generic, &spr_write_generic,
914 0x00000000);
915 /* Altivec */
916 spr_register(env, SPR_VRSAVE, "VRSAVE",
917 &spr_read_generic, &spr_write_generic,
918 &spr_read_generic, &spr_write_generic,
919 0x00000000);
920 /* XXX : not implemented */
921 spr_register(env, SPR_L2CR, "L2CR",
922 SPR_NOACCESS, SPR_NOACCESS,
923 &spr_read_generic, spr_access_nop,
924 0x00000000);
927 static void register_l3_ctrl(CPUPPCState *env)
929 /* L3CR */
930 /* XXX : not implemented */
931 spr_register(env, SPR_L3CR, "L3CR",
932 SPR_NOACCESS, SPR_NOACCESS,
933 &spr_read_generic, &spr_write_generic,
934 0x00000000);
935 /* L3ITCR0 */
936 /* XXX : not implemented */
937 spr_register(env, SPR_L3ITCR0, "L3ITCR0",
938 SPR_NOACCESS, SPR_NOACCESS,
939 &spr_read_generic, &spr_write_generic,
940 0x00000000);
941 /* L3PM */
942 /* XXX : not implemented */
943 spr_register(env, SPR_L3PM, "L3PM",
944 SPR_NOACCESS, SPR_NOACCESS,
945 &spr_read_generic, &spr_write_generic,
946 0x00000000);
949 static void register_74xx_soft_tlb(CPUPPCState *env, int nb_tlbs, int nb_ways)
951 #if !defined(CONFIG_USER_ONLY)
952 env->nb_tlb = nb_tlbs;
953 env->nb_ways = nb_ways;
954 env->id_tlbs = 1;
955 env->tlb_type = TLB_6XX;
956 /* XXX : not implemented */
957 spr_register(env, SPR_PTEHI, "PTEHI",
958 SPR_NOACCESS, SPR_NOACCESS,
959 &spr_read_generic, &spr_write_generic,
960 0x00000000);
961 /* XXX : not implemented */
962 spr_register(env, SPR_PTELO, "PTELO",
963 SPR_NOACCESS, SPR_NOACCESS,
964 &spr_read_generic, &spr_write_generic,
965 0x00000000);
966 /* XXX : not implemented */
967 spr_register(env, SPR_TLBMISS, "TLBMISS",
968 SPR_NOACCESS, SPR_NOACCESS,
969 &spr_read_generic, &spr_write_generic,
970 0x00000000);
971 #endif
974 static void register_usprg3_sprs(CPUPPCState *env)
976 spr_register(env, SPR_USPRG3, "USPRG3",
977 &spr_read_ureg, SPR_NOACCESS,
978 &spr_read_ureg, SPR_NOACCESS,
979 0x00000000);
982 static void register_usprgh_sprs(CPUPPCState *env)
984 spr_register(env, SPR_USPRG4, "USPRG4",
985 &spr_read_ureg, SPR_NOACCESS,
986 &spr_read_ureg, SPR_NOACCESS,
987 0x00000000);
988 spr_register(env, SPR_USPRG5, "USPRG5",
989 &spr_read_ureg, SPR_NOACCESS,
990 &spr_read_ureg, SPR_NOACCESS,
991 0x00000000);
992 spr_register(env, SPR_USPRG6, "USPRG6",
993 &spr_read_ureg, SPR_NOACCESS,
994 &spr_read_ureg, SPR_NOACCESS,
995 0x00000000);
996 spr_register(env, SPR_USPRG7, "USPRG7",
997 &spr_read_ureg, SPR_NOACCESS,
998 &spr_read_ureg, SPR_NOACCESS,
999 0x00000000);
1002 /* PowerPC BookE SPR */
1003 static void register_BookE_sprs(CPUPPCState *env, uint64_t ivor_mask)
1005 const char *ivor_names[64] = {
1006 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
1007 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
1008 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
1009 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1010 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1011 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1012 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1013 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1014 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1015 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1016 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1017 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1018 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1019 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1020 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1021 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1023 #define SPR_BOOKE_IVORxx (-1)
1024 int ivor_sprn[64] = {
1025 SPR_BOOKE_IVOR0, SPR_BOOKE_IVOR1, SPR_BOOKE_IVOR2, SPR_BOOKE_IVOR3,
1026 SPR_BOOKE_IVOR4, SPR_BOOKE_IVOR5, SPR_BOOKE_IVOR6, SPR_BOOKE_IVOR7,
1027 SPR_BOOKE_IVOR8, SPR_BOOKE_IVOR9, SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1028 SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1029 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1030 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1031 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1032 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1033 SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1034 SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
1035 SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
1036 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1037 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1038 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1039 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1040 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1042 int i;
1044 /* Interrupt processing */
1045 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1046 SPR_NOACCESS, SPR_NOACCESS,
1047 &spr_read_generic, &spr_write_generic,
1048 0x00000000);
1049 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1050 SPR_NOACCESS, SPR_NOACCESS,
1051 &spr_read_generic, &spr_write_generic,
1052 0x00000000);
1053 /* Debug */
1054 /* XXX : not implemented */
1055 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1056 SPR_NOACCESS, SPR_NOACCESS,
1057 &spr_read_generic, &spr_write_generic,
1058 0x00000000);
1059 /* XXX : not implemented */
1060 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1061 SPR_NOACCESS, SPR_NOACCESS,
1062 &spr_read_generic, &spr_write_generic,
1063 0x00000000);
1064 /* XXX : not implemented */
1065 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1066 SPR_NOACCESS, SPR_NOACCESS,
1067 &spr_read_generic, &spr_write_generic,
1068 0x00000000);
1069 /* XXX : not implemented */
1070 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1071 SPR_NOACCESS, SPR_NOACCESS,
1072 &spr_read_generic, &spr_write_generic,
1073 0x00000000);
1074 /* XXX : not implemented */
1075 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1076 SPR_NOACCESS, SPR_NOACCESS,
1077 &spr_read_generic, &spr_write_40x_dbcr0,
1078 0x00000000);
1079 /* XXX : not implemented */
1080 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1081 SPR_NOACCESS, SPR_NOACCESS,
1082 &spr_read_generic, &spr_write_generic,
1083 0x00000000);
1084 /* XXX : not implemented */
1085 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1086 SPR_NOACCESS, SPR_NOACCESS,
1087 &spr_read_generic, &spr_write_generic,
1088 0x00000000);
1089 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1090 SPR_NOACCESS, SPR_NOACCESS,
1091 &spr_read_generic, &spr_write_generic,
1092 0x00000000);
1093 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1094 SPR_NOACCESS, SPR_NOACCESS,
1095 &spr_read_generic, &spr_write_generic,
1096 0x00000000);
1097 /* XXX : not implemented */
1098 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1099 SPR_NOACCESS, SPR_NOACCESS,
1100 &spr_read_generic, &spr_write_clear,
1101 0x00000000);
1102 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1103 SPR_NOACCESS, SPR_NOACCESS,
1104 &spr_read_generic, &spr_write_generic,
1105 0x00000000);
1106 spr_register(env, SPR_BOOKE_ESR, "ESR",
1107 SPR_NOACCESS, SPR_NOACCESS,
1108 &spr_read_generic, &spr_write_generic,
1109 0x00000000);
1110 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1111 SPR_NOACCESS, SPR_NOACCESS,
1112 &spr_read_generic, &spr_write_excp_prefix,
1113 0x00000000);
1114 /* Exception vectors */
1115 for (i = 0; i < 64; i++) {
1116 if (ivor_mask & (1ULL << i)) {
1117 if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1118 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1119 exit(1);
1121 spr_register(env, ivor_sprn[i], ivor_names[i],
1122 SPR_NOACCESS, SPR_NOACCESS,
1123 &spr_read_generic, &spr_write_excp_vector,
1124 0x00000000);
1127 spr_register(env, SPR_BOOKE_PID, "PID",
1128 SPR_NOACCESS, SPR_NOACCESS,
1129 &spr_read_generic, &spr_write_booke_pid,
1130 0x00000000);
1131 spr_register(env, SPR_BOOKE_TCR, "TCR",
1132 SPR_NOACCESS, SPR_NOACCESS,
1133 &spr_read_generic, &spr_write_booke_tcr,
1134 0x00000000);
1135 spr_register(env, SPR_BOOKE_TSR, "TSR",
1136 SPR_NOACCESS, SPR_NOACCESS,
1137 &spr_read_generic, &spr_write_booke_tsr,
1138 0x00000000);
1139 /* Timer */
1140 spr_register(env, SPR_DECR, "DECR",
1141 SPR_NOACCESS, SPR_NOACCESS,
1142 &spr_read_decr, &spr_write_decr,
1143 0x00000000);
1144 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1145 SPR_NOACCESS, SPR_NOACCESS,
1146 SPR_NOACCESS, &spr_write_generic,
1147 0x00000000);
1148 /* SPRGs */
1149 spr_register(env, SPR_USPRG0, "USPRG0",
1150 &spr_read_generic, &spr_write_generic,
1151 &spr_read_generic, &spr_write_generic,
1152 0x00000000);
1153 spr_register(env, SPR_SPRG4, "SPRG4",
1154 SPR_NOACCESS, SPR_NOACCESS,
1155 &spr_read_generic, &spr_write_generic,
1156 0x00000000);
1157 spr_register(env, SPR_SPRG5, "SPRG5",
1158 SPR_NOACCESS, SPR_NOACCESS,
1159 &spr_read_generic, &spr_write_generic,
1160 0x00000000);
1161 spr_register(env, SPR_SPRG6, "SPRG6",
1162 SPR_NOACCESS, SPR_NOACCESS,
1163 &spr_read_generic, &spr_write_generic,
1164 0x00000000);
1165 spr_register(env, SPR_SPRG7, "SPRG7",
1166 SPR_NOACCESS, SPR_NOACCESS,
1167 &spr_read_generic, &spr_write_generic,
1168 0x00000000);
1169 spr_register(env, SPR_BOOKE_SPRG8, "SPRG8",
1170 SPR_NOACCESS, SPR_NOACCESS,
1171 &spr_read_generic, &spr_write_generic,
1172 0x00000000);
1173 spr_register(env, SPR_BOOKE_SPRG9, "SPRG9",
1174 SPR_NOACCESS, SPR_NOACCESS,
1175 &spr_read_generic, &spr_write_generic,
1176 0x00000000);
1179 #if !defined(CONFIG_USER_ONLY)
1180 static inline uint32_t register_tlbncfg(uint32_t assoc, uint32_t minsize,
1181 uint32_t maxsize, uint32_t flags,
1182 uint32_t nentries)
1184 return (assoc << TLBnCFG_ASSOC_SHIFT) |
1185 (minsize << TLBnCFG_MINSIZE_SHIFT) |
1186 (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
1187 flags | nentries;
1189 #endif /* !CONFIG_USER_ONLY */
1191 /* BookE 2.06 storage control registers */
1192 static void register_BookE206_sprs(CPUPPCState *env, uint32_t mas_mask,
1193 uint32_t *tlbncfg, uint32_t mmucfg)
1195 #if !defined(CONFIG_USER_ONLY)
1196 const char *mas_names[8] = {
1197 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1199 int mas_sprn[8] = {
1200 SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1201 SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1203 int i;
1205 /* TLB assist registers */
1206 /* XXX : not implemented */
1207 for (i = 0; i < 8; i++) {
1208 if (mas_mask & (1 << i)) {
1209 spr_register(env, mas_sprn[i], mas_names[i],
1210 SPR_NOACCESS, SPR_NOACCESS,
1211 &spr_read_generic,
1212 (i == 2 && (env->insns_flags & PPC_64B))
1213 ? &spr_write_generic : &spr_write_generic32,
1214 0x00000000);
1217 if (env->nb_pids > 1) {
1218 /* XXX : not implemented */
1219 spr_register(env, SPR_BOOKE_PID1, "PID1",
1220 SPR_NOACCESS, SPR_NOACCESS,
1221 &spr_read_generic, &spr_write_booke_pid,
1222 0x00000000);
1224 if (env->nb_pids > 2) {
1225 /* XXX : not implemented */
1226 spr_register(env, SPR_BOOKE_PID2, "PID2",
1227 SPR_NOACCESS, SPR_NOACCESS,
1228 &spr_read_generic, &spr_write_booke_pid,
1229 0x00000000);
1232 spr_register(env, SPR_BOOKE_EPLC, "EPLC",
1233 SPR_NOACCESS, SPR_NOACCESS,
1234 &spr_read_generic, &spr_write_eplc,
1235 0x00000000);
1236 spr_register(env, SPR_BOOKE_EPSC, "EPSC",
1237 SPR_NOACCESS, SPR_NOACCESS,
1238 &spr_read_generic, &spr_write_epsc,
1239 0x00000000);
1241 /* XXX : not implemented */
1242 spr_register(env, SPR_MMUCFG, "MMUCFG",
1243 SPR_NOACCESS, SPR_NOACCESS,
1244 &spr_read_generic, SPR_NOACCESS,
1245 mmucfg);
1246 switch (env->nb_ways) {
1247 case 4:
1248 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1249 SPR_NOACCESS, SPR_NOACCESS,
1250 &spr_read_generic, SPR_NOACCESS,
1251 tlbncfg[3]);
1252 /* Fallthru */
1253 case 3:
1254 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1255 SPR_NOACCESS, SPR_NOACCESS,
1256 &spr_read_generic, SPR_NOACCESS,
1257 tlbncfg[2]);
1258 /* Fallthru */
1259 case 2:
1260 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1261 SPR_NOACCESS, SPR_NOACCESS,
1262 &spr_read_generic, SPR_NOACCESS,
1263 tlbncfg[1]);
1264 /* Fallthru */
1265 case 1:
1266 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1267 SPR_NOACCESS, SPR_NOACCESS,
1268 &spr_read_generic, SPR_NOACCESS,
1269 tlbncfg[0]);
1270 /* Fallthru */
1271 case 0:
1272 default:
1273 break;
1275 #endif
1277 register_usprgh_sprs(env);
1280 /* SPR specific to PowerPC 440 implementation */
1281 static void register_440_sprs(CPUPPCState *env)
1283 /* Cache control */
1284 /* XXX : not implemented */
1285 spr_register(env, SPR_440_DNV0, "DNV0",
1286 SPR_NOACCESS, SPR_NOACCESS,
1287 &spr_read_generic, &spr_write_generic,
1288 0x00000000);
1289 /* XXX : not implemented */
1290 spr_register(env, SPR_440_DNV1, "DNV1",
1291 SPR_NOACCESS, SPR_NOACCESS,
1292 &spr_read_generic, &spr_write_generic,
1293 0x00000000);
1294 /* XXX : not implemented */
1295 spr_register(env, SPR_440_DNV2, "DNV2",
1296 SPR_NOACCESS, SPR_NOACCESS,
1297 &spr_read_generic, &spr_write_generic,
1298 0x00000000);
1299 /* XXX : not implemented */
1300 spr_register(env, SPR_440_DNV3, "DNV3",
1301 SPR_NOACCESS, SPR_NOACCESS,
1302 &spr_read_generic, &spr_write_generic,
1303 0x00000000);
1304 /* XXX : not implemented */
1305 spr_register(env, SPR_440_DTV0, "DTV0",
1306 SPR_NOACCESS, SPR_NOACCESS,
1307 &spr_read_generic, &spr_write_generic,
1308 0x00000000);
1309 /* XXX : not implemented */
1310 spr_register(env, SPR_440_DTV1, "DTV1",
1311 SPR_NOACCESS, SPR_NOACCESS,
1312 &spr_read_generic, &spr_write_generic,
1313 0x00000000);
1314 /* XXX : not implemented */
1315 spr_register(env, SPR_440_DTV2, "DTV2",
1316 SPR_NOACCESS, SPR_NOACCESS,
1317 &spr_read_generic, &spr_write_generic,
1318 0x00000000);
1319 /* XXX : not implemented */
1320 spr_register(env, SPR_440_DTV3, "DTV3",
1321 SPR_NOACCESS, SPR_NOACCESS,
1322 &spr_read_generic, &spr_write_generic,
1323 0x00000000);
1324 /* XXX : not implemented */
1325 spr_register(env, SPR_440_DVLIM, "DVLIM",
1326 SPR_NOACCESS, SPR_NOACCESS,
1327 &spr_read_generic, &spr_write_generic,
1328 0x00000000);
1329 /* XXX : not implemented */
1330 spr_register(env, SPR_440_INV0, "INV0",
1331 SPR_NOACCESS, SPR_NOACCESS,
1332 &spr_read_generic, &spr_write_generic,
1333 0x00000000);
1334 /* XXX : not implemented */
1335 spr_register(env, SPR_440_INV1, "INV1",
1336 SPR_NOACCESS, SPR_NOACCESS,
1337 &spr_read_generic, &spr_write_generic,
1338 0x00000000);
1339 /* XXX : not implemented */
1340 spr_register(env, SPR_440_INV2, "INV2",
1341 SPR_NOACCESS, SPR_NOACCESS,
1342 &spr_read_generic, &spr_write_generic,
1343 0x00000000);
1344 /* XXX : not implemented */
1345 spr_register(env, SPR_440_INV3, "INV3",
1346 SPR_NOACCESS, SPR_NOACCESS,
1347 &spr_read_generic, &spr_write_generic,
1348 0x00000000);
1349 /* XXX : not implemented */
1350 spr_register(env, SPR_440_ITV0, "ITV0",
1351 SPR_NOACCESS, SPR_NOACCESS,
1352 &spr_read_generic, &spr_write_generic,
1353 0x00000000);
1354 /* XXX : not implemented */
1355 spr_register(env, SPR_440_ITV1, "ITV1",
1356 SPR_NOACCESS, SPR_NOACCESS,
1357 &spr_read_generic, &spr_write_generic,
1358 0x00000000);
1359 /* XXX : not implemented */
1360 spr_register(env, SPR_440_ITV2, "ITV2",
1361 SPR_NOACCESS, SPR_NOACCESS,
1362 &spr_read_generic, &spr_write_generic,
1363 0x00000000);
1364 /* XXX : not implemented */
1365 spr_register(env, SPR_440_ITV3, "ITV3",
1366 SPR_NOACCESS, SPR_NOACCESS,
1367 &spr_read_generic, &spr_write_generic,
1368 0x00000000);
1369 /* XXX : not implemented */
1370 spr_register(env, SPR_440_IVLIM, "IVLIM",
1371 SPR_NOACCESS, SPR_NOACCESS,
1372 &spr_read_generic, &spr_write_generic,
1373 0x00000000);
1374 /* Cache debug */
1375 /* XXX : not implemented */
1376 spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
1377 SPR_NOACCESS, SPR_NOACCESS,
1378 &spr_read_generic, SPR_NOACCESS,
1379 0x00000000);
1380 /* XXX : not implemented */
1381 spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
1382 SPR_NOACCESS, SPR_NOACCESS,
1383 &spr_read_generic, SPR_NOACCESS,
1384 0x00000000);
1385 /* XXX : not implemented */
1386 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1387 SPR_NOACCESS, SPR_NOACCESS,
1388 &spr_read_generic, SPR_NOACCESS,
1389 0x00000000);
1390 /* XXX : not implemented */
1391 spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
1392 SPR_NOACCESS, SPR_NOACCESS,
1393 &spr_read_generic, SPR_NOACCESS,
1394 0x00000000);
1395 /* XXX : not implemented */
1396 spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
1397 SPR_NOACCESS, SPR_NOACCESS,
1398 &spr_read_generic, SPR_NOACCESS,
1399 0x00000000);
1400 /* XXX : not implemented */
1401 spr_register(env, SPR_440_DBDR, "DBDR",
1402 SPR_NOACCESS, SPR_NOACCESS,
1403 &spr_read_generic, &spr_write_generic,
1404 0x00000000);
1405 /* Processor control */
1406 spr_register(env, SPR_4xx_CCR0, "CCR0",
1407 SPR_NOACCESS, SPR_NOACCESS,
1408 &spr_read_generic, &spr_write_generic,
1409 0x00000000);
1410 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1411 SPR_NOACCESS, SPR_NOACCESS,
1412 &spr_read_generic, SPR_NOACCESS,
1413 0x00000000);
1414 /* Storage control */
1415 spr_register(env, SPR_440_MMUCR, "MMUCR",
1416 SPR_NOACCESS, SPR_NOACCESS,
1417 &spr_read_generic, &spr_write_generic,
1418 0x00000000);
1421 /* SPR shared between PowerPC 40x implementations */
1422 static void register_40x_sprs(CPUPPCState *env)
1424 /* Cache */
1425 /* not emulated, as QEMU do not emulate caches */
1426 spr_register(env, SPR_40x_DCCR, "DCCR",
1427 SPR_NOACCESS, SPR_NOACCESS,
1428 &spr_read_generic, &spr_write_generic,
1429 0x00000000);
1430 /* not emulated, as QEMU do not emulate caches */
1431 spr_register(env, SPR_40x_ICCR, "ICCR",
1432 SPR_NOACCESS, SPR_NOACCESS,
1433 &spr_read_generic, &spr_write_generic,
1434 0x00000000);
1435 /* not emulated, as QEMU do not emulate caches */
1436 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1437 SPR_NOACCESS, SPR_NOACCESS,
1438 &spr_read_generic, SPR_NOACCESS,
1439 0x00000000);
1440 /* Exception */
1441 spr_register(env, SPR_40x_DEAR, "DEAR",
1442 SPR_NOACCESS, SPR_NOACCESS,
1443 &spr_read_generic, &spr_write_generic,
1444 0x00000000);
1445 spr_register(env, SPR_40x_ESR, "ESR",
1446 SPR_NOACCESS, SPR_NOACCESS,
1447 &spr_read_generic, &spr_write_generic,
1448 0x00000000);
1449 spr_register(env, SPR_40x_EVPR, "EVPR",
1450 SPR_NOACCESS, SPR_NOACCESS,
1451 &spr_read_generic, &spr_write_excp_prefix,
1452 0x00000000);
1453 spr_register(env, SPR_40x_SRR2, "SRR2",
1454 &spr_read_generic, &spr_write_generic,
1455 &spr_read_generic, &spr_write_generic,
1456 0x00000000);
1457 spr_register(env, SPR_40x_SRR3, "SRR3",
1458 &spr_read_generic, &spr_write_generic,
1459 &spr_read_generic, &spr_write_generic,
1460 0x00000000);
1461 /* Timers */
1462 spr_register(env, SPR_40x_PIT, "PIT",
1463 SPR_NOACCESS, SPR_NOACCESS,
1464 &spr_read_40x_pit, &spr_write_40x_pit,
1465 0x00000000);
1466 spr_register(env, SPR_40x_TCR, "TCR",
1467 SPR_NOACCESS, SPR_NOACCESS,
1468 &spr_read_generic, &spr_write_booke_tcr,
1469 0x00000000);
1470 spr_register(env, SPR_40x_TSR, "TSR",
1471 SPR_NOACCESS, SPR_NOACCESS,
1472 &spr_read_generic, &spr_write_booke_tsr,
1473 0x00000000);
1476 /* SPR specific to PowerPC 405 implementation */
1477 static void register_405_sprs(CPUPPCState *env)
1479 /* MMU */
1480 spr_register(env, SPR_40x_PID, "PID",
1481 SPR_NOACCESS, SPR_NOACCESS,
1482 &spr_read_generic, &spr_write_generic,
1483 0x00000000);
1484 spr_register(env, SPR_4xx_CCR0, "CCR0",
1485 SPR_NOACCESS, SPR_NOACCESS,
1486 &spr_read_generic, &spr_write_generic,
1487 0x00700000);
1488 /* Debug interface */
1489 /* XXX : not implemented */
1490 spr_register(env, SPR_40x_DBCR0, "DBCR0",
1491 SPR_NOACCESS, SPR_NOACCESS,
1492 &spr_read_generic, &spr_write_40x_dbcr0,
1493 0x00000000);
1494 /* XXX : not implemented */
1495 spr_register(env, SPR_405_DBCR1, "DBCR1",
1496 SPR_NOACCESS, SPR_NOACCESS,
1497 &spr_read_generic, &spr_write_generic,
1498 0x00000000);
1499 /* XXX : not implemented */
1500 spr_register(env, SPR_40x_DBSR, "DBSR",
1501 SPR_NOACCESS, SPR_NOACCESS,
1502 &spr_read_generic, &spr_write_clear,
1503 /* Last reset was system reset */
1504 0x00000300);
1505 /* XXX : not implemented */
1506 spr_register(env, SPR_40x_DAC1, "DAC1",
1507 SPR_NOACCESS, SPR_NOACCESS,
1508 &spr_read_generic, &spr_write_generic,
1509 0x00000000);
1510 spr_register(env, SPR_40x_DAC2, "DAC2",
1511 SPR_NOACCESS, SPR_NOACCESS,
1512 &spr_read_generic, &spr_write_generic,
1513 0x00000000);
1514 /* XXX : not implemented */
1515 spr_register(env, SPR_405_DVC1, "DVC1",
1516 SPR_NOACCESS, SPR_NOACCESS,
1517 &spr_read_generic, &spr_write_generic,
1518 0x00000000);
1519 /* XXX : not implemented */
1520 spr_register(env, SPR_405_DVC2, "DVC2",
1521 SPR_NOACCESS, SPR_NOACCESS,
1522 &spr_read_generic, &spr_write_generic,
1523 0x00000000);
1524 /* XXX : not implemented */
1525 spr_register(env, SPR_40x_IAC1, "IAC1",
1526 SPR_NOACCESS, SPR_NOACCESS,
1527 &spr_read_generic, &spr_write_generic,
1528 0x00000000);
1529 spr_register(env, SPR_40x_IAC2, "IAC2",
1530 SPR_NOACCESS, SPR_NOACCESS,
1531 &spr_read_generic, &spr_write_generic,
1532 0x00000000);
1533 /* XXX : not implemented */
1534 spr_register(env, SPR_405_IAC3, "IAC3",
1535 SPR_NOACCESS, SPR_NOACCESS,
1536 &spr_read_generic, &spr_write_generic,
1537 0x00000000);
1538 /* XXX : not implemented */
1539 spr_register(env, SPR_405_IAC4, "IAC4",
1540 SPR_NOACCESS, SPR_NOACCESS,
1541 &spr_read_generic, &spr_write_generic,
1542 0x00000000);
1543 /* Storage control */
1544 /* XXX: TODO: not implemented */
1545 spr_register(env, SPR_405_SLER, "SLER",
1546 SPR_NOACCESS, SPR_NOACCESS,
1547 &spr_read_generic, &spr_write_40x_sler,
1548 0x00000000);
1549 spr_register(env, SPR_40x_ZPR, "ZPR",
1550 SPR_NOACCESS, SPR_NOACCESS,
1551 &spr_read_generic, &spr_write_generic,
1552 0x00000000);
1553 /* XXX : not implemented */
1554 spr_register(env, SPR_405_SU0R, "SU0R",
1555 SPR_NOACCESS, SPR_NOACCESS,
1556 &spr_read_generic, &spr_write_generic,
1557 0x00000000);
1558 /* SPRG */
1559 spr_register(env, SPR_USPRG0, "USPRG0",
1560 &spr_read_ureg, SPR_NOACCESS,
1561 &spr_read_ureg, SPR_NOACCESS,
1562 0x00000000);
1563 spr_register(env, SPR_SPRG4, "SPRG4",
1564 SPR_NOACCESS, SPR_NOACCESS,
1565 &spr_read_generic, &spr_write_generic,
1566 0x00000000);
1567 spr_register(env, SPR_SPRG5, "SPRG5",
1568 SPR_NOACCESS, SPR_NOACCESS,
1569 spr_read_generic, &spr_write_generic,
1570 0x00000000);
1571 spr_register(env, SPR_SPRG6, "SPRG6",
1572 SPR_NOACCESS, SPR_NOACCESS,
1573 spr_read_generic, &spr_write_generic,
1574 0x00000000);
1575 spr_register(env, SPR_SPRG7, "SPRG7",
1576 SPR_NOACCESS, SPR_NOACCESS,
1577 spr_read_generic, &spr_write_generic,
1578 0x00000000);
1579 register_usprgh_sprs(env);
1582 /* SPR shared between PowerPC 401 & 403 implementations */
1583 static void register_401_403_sprs(CPUPPCState *env)
1585 /* Time base */
1586 spr_register(env, SPR_403_VTBL, "TBL",
1587 &spr_read_tbl, SPR_NOACCESS,
1588 &spr_read_tbl, SPR_NOACCESS,
1589 0x00000000);
1590 spr_register(env, SPR_403_TBL, "TBL",
1591 SPR_NOACCESS, SPR_NOACCESS,
1592 SPR_NOACCESS, &spr_write_tbl,
1593 0x00000000);
1594 spr_register(env, SPR_403_VTBU, "TBU",
1595 &spr_read_tbu, SPR_NOACCESS,
1596 &spr_read_tbu, SPR_NOACCESS,
1597 0x00000000);
1598 spr_register(env, SPR_403_TBU, "TBU",
1599 SPR_NOACCESS, SPR_NOACCESS,
1600 SPR_NOACCESS, &spr_write_tbu,
1601 0x00000000);
1602 /* Debug */
1603 /* not emulated, as QEMU do not emulate caches */
1604 spr_register(env, SPR_403_CDBCR, "CDBCR",
1605 SPR_NOACCESS, SPR_NOACCESS,
1606 &spr_read_generic, &spr_write_generic,
1607 0x00000000);
1610 /* SPR specific to PowerPC 401 implementation */
1611 static void register_401_sprs(CPUPPCState *env)
1613 /* Debug interface */
1614 /* XXX : not implemented */
1615 spr_register(env, SPR_40x_DBCR0, "DBCR",
1616 SPR_NOACCESS, SPR_NOACCESS,
1617 &spr_read_generic, &spr_write_40x_dbcr0,
1618 0x00000000);
1619 /* XXX : not implemented */
1620 spr_register(env, SPR_40x_DBSR, "DBSR",
1621 SPR_NOACCESS, SPR_NOACCESS,
1622 &spr_read_generic, &spr_write_clear,
1623 /* Last reset was system reset */
1624 0x00000300);
1625 /* XXX : not implemented */
1626 spr_register(env, SPR_40x_DAC1, "DAC",
1627 SPR_NOACCESS, SPR_NOACCESS,
1628 &spr_read_generic, &spr_write_generic,
1629 0x00000000);
1630 /* XXX : not implemented */
1631 spr_register(env, SPR_40x_IAC1, "IAC",
1632 SPR_NOACCESS, SPR_NOACCESS,
1633 &spr_read_generic, &spr_write_generic,
1634 0x00000000);
1635 /* Storage control */
1636 /* XXX: TODO: not implemented */
1637 spr_register(env, SPR_405_SLER, "SLER",
1638 SPR_NOACCESS, SPR_NOACCESS,
1639 &spr_read_generic, &spr_write_40x_sler,
1640 0x00000000);
1641 /* not emulated, as QEMU never does speculative access */
1642 spr_register(env, SPR_40x_SGR, "SGR",
1643 SPR_NOACCESS, SPR_NOACCESS,
1644 &spr_read_generic, &spr_write_generic,
1645 0xFFFFFFFF);
1646 /* not emulated, as QEMU do not emulate caches */
1647 spr_register(env, SPR_40x_DCWR, "DCWR",
1648 SPR_NOACCESS, SPR_NOACCESS,
1649 &spr_read_generic, &spr_write_generic,
1650 0x00000000);
1653 static void register_401x2_sprs(CPUPPCState *env)
1655 register_401_sprs(env);
1656 spr_register(env, SPR_40x_PID, "PID",
1657 SPR_NOACCESS, SPR_NOACCESS,
1658 &spr_read_generic, &spr_write_generic,
1659 0x00000000);
1660 spr_register(env, SPR_40x_ZPR, "ZPR",
1661 SPR_NOACCESS, SPR_NOACCESS,
1662 &spr_read_generic, &spr_write_generic,
1663 0x00000000);
1666 /* SPR specific to PowerPC 403 implementation */
1667 static void register_403_sprs(CPUPPCState *env)
1669 /* Debug interface */
1670 /* XXX : not implemented */
1671 spr_register(env, SPR_40x_DBCR0, "DBCR0",
1672 SPR_NOACCESS, SPR_NOACCESS,
1673 &spr_read_generic, &spr_write_40x_dbcr0,
1674 0x00000000);
1675 /* XXX : not implemented */
1676 spr_register(env, SPR_40x_DBSR, "DBSR",
1677 SPR_NOACCESS, SPR_NOACCESS,
1678 &spr_read_generic, &spr_write_clear,
1679 /* Last reset was system reset */
1680 0x00000300);
1681 /* XXX : not implemented */
1682 spr_register(env, SPR_40x_DAC1, "DAC1",
1683 SPR_NOACCESS, SPR_NOACCESS,
1684 &spr_read_generic, &spr_write_generic,
1685 0x00000000);
1686 /* XXX : not implemented */
1687 spr_register(env, SPR_40x_DAC2, "DAC2",
1688 SPR_NOACCESS, SPR_NOACCESS,
1689 &spr_read_generic, &spr_write_generic,
1690 0x00000000);
1691 /* XXX : not implemented */
1692 spr_register(env, SPR_40x_IAC1, "IAC1",
1693 SPR_NOACCESS, SPR_NOACCESS,
1694 &spr_read_generic, &spr_write_generic,
1695 0x00000000);
1696 /* XXX : not implemented */
1697 spr_register(env, SPR_40x_IAC2, "IAC2",
1698 SPR_NOACCESS, SPR_NOACCESS,
1699 &spr_read_generic, &spr_write_generic,
1700 0x00000000);
1703 static void register_403_real_sprs(CPUPPCState *env)
1705 spr_register(env, SPR_403_PBL1, "PBL1",
1706 SPR_NOACCESS, SPR_NOACCESS,
1707 &spr_read_403_pbr, &spr_write_403_pbr,
1708 0x00000000);
1709 spr_register(env, SPR_403_PBU1, "PBU1",
1710 SPR_NOACCESS, SPR_NOACCESS,
1711 &spr_read_403_pbr, &spr_write_403_pbr,
1712 0x00000000);
1713 spr_register(env, SPR_403_PBL2, "PBL2",
1714 SPR_NOACCESS, SPR_NOACCESS,
1715 &spr_read_403_pbr, &spr_write_403_pbr,
1716 0x00000000);
1717 spr_register(env, SPR_403_PBU2, "PBU2",
1718 SPR_NOACCESS, SPR_NOACCESS,
1719 &spr_read_403_pbr, &spr_write_403_pbr,
1720 0x00000000);
1723 static void register_403_mmu_sprs(CPUPPCState *env)
1725 /* MMU */
1726 spr_register(env, SPR_40x_PID, "PID",
1727 SPR_NOACCESS, SPR_NOACCESS,
1728 &spr_read_generic, &spr_write_generic,
1729 0x00000000);
1730 spr_register(env, SPR_40x_ZPR, "ZPR",
1731 SPR_NOACCESS, SPR_NOACCESS,
1732 &spr_read_generic, &spr_write_generic,
1733 0x00000000);
1736 /* SPR specific to PowerPC compression coprocessor extension */
1737 static void register_compress_sprs(CPUPPCState *env)
1739 /* XXX : not implemented */
1740 spr_register(env, SPR_401_SKR, "SKR",
1741 SPR_NOACCESS, SPR_NOACCESS,
1742 &spr_read_generic, &spr_write_generic,
1743 0x00000000);
1746 static void register_5xx_8xx_sprs(CPUPPCState *env)
1748 /* Exception processing */
1749 spr_register_kvm(env, SPR_DSISR, "DSISR",
1750 SPR_NOACCESS, SPR_NOACCESS,
1751 &spr_read_generic, &spr_write_generic,
1752 KVM_REG_PPC_DSISR, 0x00000000);
1753 spr_register_kvm(env, SPR_DAR, "DAR",
1754 SPR_NOACCESS, SPR_NOACCESS,
1755 &spr_read_generic, &spr_write_generic,
1756 KVM_REG_PPC_DAR, 0x00000000);
1757 /* Timer */
1758 spr_register(env, SPR_DECR, "DECR",
1759 SPR_NOACCESS, SPR_NOACCESS,
1760 &spr_read_decr, &spr_write_decr,
1761 0x00000000);
1762 /* XXX : not implemented */
1763 spr_register(env, SPR_MPC_EIE, "EIE",
1764 SPR_NOACCESS, SPR_NOACCESS,
1765 &spr_read_generic, &spr_write_generic,
1766 0x00000000);
1767 /* XXX : not implemented */
1768 spr_register(env, SPR_MPC_EID, "EID",
1769 SPR_NOACCESS, SPR_NOACCESS,
1770 &spr_read_generic, &spr_write_generic,
1771 0x00000000);
1772 /* XXX : not implemented */
1773 spr_register(env, SPR_MPC_NRI, "NRI",
1774 SPR_NOACCESS, SPR_NOACCESS,
1775 &spr_read_generic, &spr_write_generic,
1776 0x00000000);
1777 /* XXX : not implemented */
1778 spr_register(env, SPR_MPC_CMPA, "CMPA",
1779 SPR_NOACCESS, SPR_NOACCESS,
1780 &spr_read_generic, &spr_write_generic,
1781 0x00000000);
1782 /* XXX : not implemented */
1783 spr_register(env, SPR_MPC_CMPB, "CMPB",
1784 SPR_NOACCESS, SPR_NOACCESS,
1785 &spr_read_generic, &spr_write_generic,
1786 0x00000000);
1787 /* XXX : not implemented */
1788 spr_register(env, SPR_MPC_CMPC, "CMPC",
1789 SPR_NOACCESS, SPR_NOACCESS,
1790 &spr_read_generic, &spr_write_generic,
1791 0x00000000);
1792 /* XXX : not implemented */
1793 spr_register(env, SPR_MPC_CMPD, "CMPD",
1794 SPR_NOACCESS, SPR_NOACCESS,
1795 &spr_read_generic, &spr_write_generic,
1796 0x00000000);
1797 /* XXX : not implemented */
1798 spr_register(env, SPR_MPC_ECR, "ECR",
1799 SPR_NOACCESS, SPR_NOACCESS,
1800 &spr_read_generic, &spr_write_generic,
1801 0x00000000);
1802 /* XXX : not implemented */
1803 spr_register(env, SPR_MPC_DER, "DER",
1804 SPR_NOACCESS, SPR_NOACCESS,
1805 &spr_read_generic, &spr_write_generic,
1806 0x00000000);
1807 /* XXX : not implemented */
1808 spr_register(env, SPR_MPC_COUNTA, "COUNTA",
1809 SPR_NOACCESS, SPR_NOACCESS,
1810 &spr_read_generic, &spr_write_generic,
1811 0x00000000);
1812 /* XXX : not implemented */
1813 spr_register(env, SPR_MPC_COUNTB, "COUNTB",
1814 SPR_NOACCESS, SPR_NOACCESS,
1815 &spr_read_generic, &spr_write_generic,
1816 0x00000000);
1817 /* XXX : not implemented */
1818 spr_register(env, SPR_MPC_CMPE, "CMPE",
1819 SPR_NOACCESS, SPR_NOACCESS,
1820 &spr_read_generic, &spr_write_generic,
1821 0x00000000);
1822 /* XXX : not implemented */
1823 spr_register(env, SPR_MPC_CMPF, "CMPF",
1824 SPR_NOACCESS, SPR_NOACCESS,
1825 &spr_read_generic, &spr_write_generic,
1826 0x00000000);
1827 /* XXX : not implemented */
1828 spr_register(env, SPR_MPC_CMPG, "CMPG",
1829 SPR_NOACCESS, SPR_NOACCESS,
1830 &spr_read_generic, &spr_write_generic,
1831 0x00000000);
1832 /* XXX : not implemented */
1833 spr_register(env, SPR_MPC_CMPH, "CMPH",
1834 SPR_NOACCESS, SPR_NOACCESS,
1835 &spr_read_generic, &spr_write_generic,
1836 0x00000000);
1837 /* XXX : not implemented */
1838 spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
1839 SPR_NOACCESS, SPR_NOACCESS,
1840 &spr_read_generic, &spr_write_generic,
1841 0x00000000);
1842 /* XXX : not implemented */
1843 spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
1844 SPR_NOACCESS, SPR_NOACCESS,
1845 &spr_read_generic, &spr_write_generic,
1846 0x00000000);
1847 /* XXX : not implemented */
1848 spr_register(env, SPR_MPC_BAR, "BAR",
1849 SPR_NOACCESS, SPR_NOACCESS,
1850 &spr_read_generic, &spr_write_generic,
1851 0x00000000);
1852 /* XXX : not implemented */
1853 spr_register(env, SPR_MPC_DPDR, "DPDR",
1854 SPR_NOACCESS, SPR_NOACCESS,
1855 &spr_read_generic, &spr_write_generic,
1856 0x00000000);
1857 /* XXX : not implemented */
1858 spr_register(env, SPR_MPC_IMMR, "IMMR",
1859 SPR_NOACCESS, SPR_NOACCESS,
1860 &spr_read_generic, &spr_write_generic,
1861 0x00000000);
1864 static void register_5xx_sprs(CPUPPCState *env)
1866 /* XXX : not implemented */
1867 spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
1868 SPR_NOACCESS, SPR_NOACCESS,
1869 &spr_read_generic, &spr_write_generic,
1870 0x00000000);
1871 /* XXX : not implemented */
1872 spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
1873 SPR_NOACCESS, SPR_NOACCESS,
1874 &spr_read_generic, &spr_write_generic,
1875 0x00000000);
1876 /* XXX : not implemented */
1877 spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
1878 SPR_NOACCESS, SPR_NOACCESS,
1879 &spr_read_generic, &spr_write_generic,
1880 0x00000000);
1881 /* XXX : not implemented */
1882 spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
1883 SPR_NOACCESS, SPR_NOACCESS,
1884 &spr_read_generic, &spr_write_generic,
1885 0x00000000);
1886 /* XXX : not implemented */
1887 spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
1888 SPR_NOACCESS, SPR_NOACCESS,
1889 &spr_read_generic, &spr_write_generic,
1890 0x00000000);
1891 /* XXX : not implemented */
1892 spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
1893 SPR_NOACCESS, SPR_NOACCESS,
1894 &spr_read_generic, &spr_write_generic,
1895 0x00000000);
1896 /* XXX : not implemented */
1897 spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
1898 SPR_NOACCESS, SPR_NOACCESS,
1899 &spr_read_generic, &spr_write_generic,
1900 0x00000000);
1901 /* XXX : not implemented */
1902 spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
1903 SPR_NOACCESS, SPR_NOACCESS,
1904 &spr_read_generic, &spr_write_generic,
1905 0x00000000);
1906 /* XXX : not implemented */
1907 spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
1908 SPR_NOACCESS, SPR_NOACCESS,
1909 &spr_read_generic, &spr_write_generic,
1910 0x00000000);
1911 /* XXX : not implemented */
1912 spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
1913 SPR_NOACCESS, SPR_NOACCESS,
1914 &spr_read_generic, &spr_write_generic,
1915 0x00000000);
1916 /* XXX : not implemented */
1917 spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
1918 SPR_NOACCESS, SPR_NOACCESS,
1919 &spr_read_generic, &spr_write_generic,
1920 0x00000000);
1921 /* XXX : not implemented */
1922 spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
1923 SPR_NOACCESS, SPR_NOACCESS,
1924 &spr_read_generic, &spr_write_generic,
1925 0x00000000);
1926 /* XXX : not implemented */
1927 spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
1928 SPR_NOACCESS, SPR_NOACCESS,
1929 &spr_read_generic, &spr_write_generic,
1930 0x00000000);
1931 /* XXX : not implemented */
1932 spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
1933 SPR_NOACCESS, SPR_NOACCESS,
1934 &spr_read_generic, &spr_write_generic,
1935 0x00000000);
1936 /* XXX : not implemented */
1937 spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
1938 SPR_NOACCESS, SPR_NOACCESS,
1939 &spr_read_generic, &spr_write_generic,
1940 0x00000000);
1941 /* XXX : not implemented */
1942 spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
1943 SPR_NOACCESS, SPR_NOACCESS,
1944 &spr_read_generic, &spr_write_generic,
1945 0x00000000);
1946 /* XXX : not implemented */
1947 spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
1948 SPR_NOACCESS, SPR_NOACCESS,
1949 &spr_read_generic, &spr_write_generic,
1950 0x00000000);
1951 /* XXX : not implemented */
1952 spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
1953 SPR_NOACCESS, SPR_NOACCESS,
1954 &spr_read_generic, &spr_write_generic,
1955 0x00000000);
1956 /* XXX : not implemented */
1957 spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
1958 SPR_NOACCESS, SPR_NOACCESS,
1959 &spr_read_generic, &spr_write_generic,
1960 0x00000000);
1961 /* XXX : not implemented */
1962 spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
1963 SPR_NOACCESS, SPR_NOACCESS,
1964 &spr_read_generic, &spr_write_generic,
1965 0x00000000);
1966 /* XXX : not implemented */
1967 spr_register(env, SPR_RCPU_FPECR, "FPECR",
1968 SPR_NOACCESS, SPR_NOACCESS,
1969 &spr_read_generic, &spr_write_generic,
1970 0x00000000);
1973 static void register_8xx_sprs(CPUPPCState *env)
1975 /* XXX : not implemented */
1976 spr_register(env, SPR_MPC_IC_CST, "IC_CST",
1977 SPR_NOACCESS, SPR_NOACCESS,
1978 &spr_read_generic, &spr_write_generic,
1979 0x00000000);
1980 /* XXX : not implemented */
1981 spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
1982 SPR_NOACCESS, SPR_NOACCESS,
1983 &spr_read_generic, &spr_write_generic,
1984 0x00000000);
1985 /* XXX : not implemented */
1986 spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
1987 SPR_NOACCESS, SPR_NOACCESS,
1988 &spr_read_generic, &spr_write_generic,
1989 0x00000000);
1990 /* XXX : not implemented */
1991 spr_register(env, SPR_MPC_DC_CST, "DC_CST",
1992 SPR_NOACCESS, SPR_NOACCESS,
1993 &spr_read_generic, &spr_write_generic,
1994 0x00000000);
1995 /* XXX : not implemented */
1996 spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
1997 SPR_NOACCESS, SPR_NOACCESS,
1998 &spr_read_generic, &spr_write_generic,
1999 0x00000000);
2000 /* XXX : not implemented */
2001 spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
2002 SPR_NOACCESS, SPR_NOACCESS,
2003 &spr_read_generic, &spr_write_generic,
2004 0x00000000);
2005 /* XXX : not implemented */
2006 spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
2007 SPR_NOACCESS, SPR_NOACCESS,
2008 &spr_read_generic, &spr_write_generic,
2009 0x00000000);
2010 /* XXX : not implemented */
2011 spr_register(env, SPR_MPC_MI_AP, "MI_AP",
2012 SPR_NOACCESS, SPR_NOACCESS,
2013 &spr_read_generic, &spr_write_generic,
2014 0x00000000);
2015 /* XXX : not implemented */
2016 spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
2017 SPR_NOACCESS, SPR_NOACCESS,
2018 &spr_read_generic, &spr_write_generic,
2019 0x00000000);
2020 /* XXX : not implemented */
2021 spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
2022 SPR_NOACCESS, SPR_NOACCESS,
2023 &spr_read_generic, &spr_write_generic,
2024 0x00000000);
2025 /* XXX : not implemented */
2026 spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
2027 SPR_NOACCESS, SPR_NOACCESS,
2028 &spr_read_generic, &spr_write_generic,
2029 0x00000000);
2030 /* XXX : not implemented */
2031 spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
2032 SPR_NOACCESS, SPR_NOACCESS,
2033 &spr_read_generic, &spr_write_generic,
2034 0x00000000);
2035 /* XXX : not implemented */
2036 spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
2037 SPR_NOACCESS, SPR_NOACCESS,
2038 &spr_read_generic, &spr_write_generic,
2039 0x00000000);
2040 /* XXX : not implemented */
2041 spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
2042 SPR_NOACCESS, SPR_NOACCESS,
2043 &spr_read_generic, &spr_write_generic,
2044 0x00000000);
2045 /* XXX : not implemented */
2046 spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
2047 SPR_NOACCESS, SPR_NOACCESS,
2048 &spr_read_generic, &spr_write_generic,
2049 0x00000000);
2050 /* XXX : not implemented */
2051 spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
2052 SPR_NOACCESS, SPR_NOACCESS,
2053 &spr_read_generic, &spr_write_generic,
2054 0x00000000);
2055 /* XXX : not implemented */
2056 spr_register(env, SPR_MPC_MD_AP, "MD_AP",
2057 SPR_NOACCESS, SPR_NOACCESS,
2058 &spr_read_generic, &spr_write_generic,
2059 0x00000000);
2060 /* XXX : not implemented */
2061 spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2062 SPR_NOACCESS, SPR_NOACCESS,
2063 &spr_read_generic, &spr_write_generic,
2064 0x00000000);
2065 /* XXX : not implemented */
2066 spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2067 SPR_NOACCESS, SPR_NOACCESS,
2068 &spr_read_generic, &spr_write_generic,
2069 0x00000000);
2070 /* XXX : not implemented */
2071 spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2072 SPR_NOACCESS, SPR_NOACCESS,
2073 &spr_read_generic, &spr_write_generic,
2074 0x00000000);
2075 /* XXX : not implemented */
2076 spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2077 SPR_NOACCESS, SPR_NOACCESS,
2078 &spr_read_generic, &spr_write_generic,
2079 0x00000000);
2080 /* XXX : not implemented */
2081 spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2082 SPR_NOACCESS, SPR_NOACCESS,
2083 &spr_read_generic, &spr_write_generic,
2084 0x00000000);
2085 /* XXX : not implemented */
2086 spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2087 SPR_NOACCESS, SPR_NOACCESS,
2088 &spr_read_generic, &spr_write_generic,
2089 0x00000000);
2090 /* XXX : not implemented */
2091 spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2092 SPR_NOACCESS, SPR_NOACCESS,
2093 &spr_read_generic, &spr_write_generic,
2094 0x00000000);
2095 /* XXX : not implemented */
2096 spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2097 SPR_NOACCESS, SPR_NOACCESS,
2098 &spr_read_generic, &spr_write_generic,
2099 0x00000000);
2103 * AMR => SPR 29 (Power 2.04)
2104 * CTRL => SPR 136 (Power 2.04)
2105 * CTRL => SPR 152 (Power 2.04)
2106 * SCOMC => SPR 276 (64 bits ?)
2107 * SCOMD => SPR 277 (64 bits ?)
2108 * TBU40 => SPR 286 (Power 2.04 hypv)
2109 * HSPRG0 => SPR 304 (Power 2.04 hypv)
2110 * HSPRG1 => SPR 305 (Power 2.04 hypv)
2111 * HDSISR => SPR 306 (Power 2.04 hypv)
2112 * HDAR => SPR 307 (Power 2.04 hypv)
2113 * PURR => SPR 309 (Power 2.04 hypv)
2114 * HDEC => SPR 310 (Power 2.04 hypv)
2115 * HIOR => SPR 311 (hypv)
2116 * RMOR => SPR 312 (970)
2117 * HRMOR => SPR 313 (Power 2.04 hypv)
2118 * HSRR0 => SPR 314 (Power 2.04 hypv)
2119 * HSRR1 => SPR 315 (Power 2.04 hypv)
2120 * LPIDR => SPR 317 (970)
2121 * EPR => SPR 702 (Power 2.04 emb)
2122 * perf => 768-783 (Power 2.04)
2123 * perf => 784-799 (Power 2.04)
2124 * PPR => SPR 896 (Power 2.04)
2125 * DABRX => 1015 (Power 2.04 hypv)
2126 * FPECR => SPR 1022 (?)
2127 * ... and more (thermal management, performance counters, ...)
2130 /*****************************************************************************/
2131 /* Exception vectors models */
2132 static void init_excp_4xx_real(CPUPPCState *env)
2134 #if !defined(CONFIG_USER_ONLY)
2135 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2136 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2137 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2138 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2139 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2140 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2141 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2142 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2143 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2144 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2145 env->ivor_mask = 0x0000FFF0UL;
2146 env->ivpr_mask = 0xFFFF0000UL;
2147 /* Hardware reset vector */
2148 env->hreset_vector = 0xFFFFFFFCUL;
2149 #endif
2152 static void init_excp_4xx_softmmu(CPUPPCState *env)
2154 #if !defined(CONFIG_USER_ONLY)
2155 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2156 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2157 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2158 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2159 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2160 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2161 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2162 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2163 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2164 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2165 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2166 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100;
2167 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200;
2168 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2169 env->ivor_mask = 0x0000FFF0UL;
2170 env->ivpr_mask = 0xFFFF0000UL;
2171 /* Hardware reset vector */
2172 env->hreset_vector = 0xFFFFFFFCUL;
2173 #endif
2176 static void init_excp_MPC5xx(CPUPPCState *env)
2178 #if !defined(CONFIG_USER_ONLY)
2179 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2180 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2181 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2182 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2183 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2184 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2185 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2186 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2187 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2188 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2189 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2190 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2191 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2192 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2193 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2194 env->ivor_mask = 0x0000FFF0UL;
2195 env->ivpr_mask = 0xFFFF0000UL;
2196 /* Hardware reset vector */
2197 env->hreset_vector = 0x00000100UL;
2198 #endif
2201 static void init_excp_MPC8xx(CPUPPCState *env)
2203 #if !defined(CONFIG_USER_ONLY)
2204 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2205 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2206 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2207 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2208 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2209 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2210 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2211 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2212 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2213 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2214 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2215 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2216 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2217 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001100;
2218 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001200;
2219 env->excp_vectors[POWERPC_EXCP_ITLBE] = 0x00001300;
2220 env->excp_vectors[POWERPC_EXCP_DTLBE] = 0x00001400;
2221 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2222 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2223 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2224 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2225 env->ivor_mask = 0x0000FFF0UL;
2226 env->ivpr_mask = 0xFFFF0000UL;
2227 /* Hardware reset vector */
2228 env->hreset_vector = 0x00000100UL;
2229 #endif
2232 static void init_excp_G2(CPUPPCState *env)
2234 #if !defined(CONFIG_USER_ONLY)
2235 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2236 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2237 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2238 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2239 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2240 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2241 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2242 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2243 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2244 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2245 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2246 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2247 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2248 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2249 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2250 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2251 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2252 /* Hardware reset vector */
2253 env->hreset_vector = 0x00000100UL;
2254 #endif
2257 static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
2259 #if !defined(CONFIG_USER_ONLY)
2260 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000FFC;
2261 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2262 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2263 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2264 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2265 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2266 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2267 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2268 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2269 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2270 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2271 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2272 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2273 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2274 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2275 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2276 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2277 env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000;
2278 env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000;
2279 env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000;
2280 env->ivor_mask = 0x0000FFF7UL;
2281 env->ivpr_mask = ivpr_mask;
2282 /* Hardware reset vector */
2283 env->hreset_vector = 0xFFFFFFFCUL;
2284 #endif
2287 static void init_excp_BookE(CPUPPCState *env)
2289 #if !defined(CONFIG_USER_ONLY)
2290 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2291 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2292 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2293 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2294 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2295 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2296 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2297 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2298 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2299 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2300 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2301 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2302 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2303 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2304 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2305 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2306 env->ivor_mask = 0x0000FFF0UL;
2307 env->ivpr_mask = 0xFFFF0000UL;
2308 /* Hardware reset vector */
2309 env->hreset_vector = 0xFFFFFFFCUL;
2310 #endif
2313 static void init_excp_601(CPUPPCState *env)
2315 #if !defined(CONFIG_USER_ONLY)
2316 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2317 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2318 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2319 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2320 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2321 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2322 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2323 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2324 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2325 env->excp_vectors[POWERPC_EXCP_IO] = 0x00000A00;
2326 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2327 env->excp_vectors[POWERPC_EXCP_RUNM] = 0x00002000;
2328 /* Hardware reset vector */
2329 env->hreset_vector = 0x00000100UL;
2330 #endif
2333 static void init_excp_602(CPUPPCState *env)
2335 #if !defined(CONFIG_USER_ONLY)
2336 /* XXX: exception prefix has a special behavior on 602 */
2337 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2338 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2339 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2340 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2341 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2342 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2343 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2344 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2345 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2346 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2347 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2348 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2349 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2350 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2351 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2352 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2353 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001500;
2354 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001600;
2355 /* Hardware reset vector */
2356 env->hreset_vector = 0x00000100UL;
2357 #endif
2360 static void init_excp_603(CPUPPCState *env)
2362 #if !defined(CONFIG_USER_ONLY)
2363 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2364 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2365 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2366 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2367 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2368 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2369 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2370 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2371 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2372 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2373 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2374 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2375 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2376 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2377 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2378 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2379 /* Hardware reset vector */
2380 env->hreset_vector = 0x00000100UL;
2381 #endif
2384 static void init_excp_604(CPUPPCState *env)
2386 #if !defined(CONFIG_USER_ONLY)
2387 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2388 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2389 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2390 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2391 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2392 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2393 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2394 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2395 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2396 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2397 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2398 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2399 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2400 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2401 /* Hardware reset vector */
2402 env->hreset_vector = 0x00000100UL;
2403 #endif
2406 static void init_excp_7x0(CPUPPCState *env)
2408 #if !defined(CONFIG_USER_ONLY)
2409 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2410 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2411 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2412 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2413 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2414 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2415 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2416 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2417 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2418 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2419 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2420 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2421 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2422 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2423 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2424 /* Hardware reset vector */
2425 env->hreset_vector = 0x00000100UL;
2426 #endif
2429 static void init_excp_750cl(CPUPPCState *env)
2431 #if !defined(CONFIG_USER_ONLY)
2432 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2433 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2434 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2435 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2436 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2437 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2438 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2439 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2440 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2441 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2442 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2443 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2444 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2445 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2446 /* Hardware reset vector */
2447 env->hreset_vector = 0x00000100UL;
2448 #endif
2451 static void init_excp_750cx(CPUPPCState *env)
2453 #if !defined(CONFIG_USER_ONLY)
2454 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2455 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2456 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2457 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2458 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2459 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2460 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2461 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2462 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2463 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2464 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2465 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2466 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2467 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2468 /* Hardware reset vector */
2469 env->hreset_vector = 0x00000100UL;
2470 #endif
2473 /* XXX: Check if this is correct */
2474 static void init_excp_7x5(CPUPPCState *env)
2476 #if !defined(CONFIG_USER_ONLY)
2477 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2478 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2479 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2480 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2481 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2482 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2483 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2484 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2485 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2486 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2487 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2488 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2489 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2490 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2491 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2492 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2493 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2494 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2495 /* Hardware reset vector */
2496 env->hreset_vector = 0x00000100UL;
2497 #endif
2500 static void init_excp_7400(CPUPPCState *env)
2502 #if !defined(CONFIG_USER_ONLY)
2503 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2504 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2505 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2506 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2507 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2508 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2509 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2510 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2511 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2512 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2513 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2514 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2515 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2516 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2517 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2518 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
2519 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
2520 /* Hardware reset vector */
2521 env->hreset_vector = 0x00000100UL;
2522 #endif
2525 static void init_excp_7450(CPUPPCState *env)
2527 #if !defined(CONFIG_USER_ONLY)
2528 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2529 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2530 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2531 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2532 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2533 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2534 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2535 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2536 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2537 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2538 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2539 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2540 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2541 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2542 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2543 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2544 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2545 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2546 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
2547 /* Hardware reset vector */
2548 env->hreset_vector = 0x00000100UL;
2549 #endif
2552 #if defined(TARGET_PPC64)
2553 static void init_excp_970(CPUPPCState *env)
2555 #if !defined(CONFIG_USER_ONLY)
2556 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2557 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2558 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2559 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
2560 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2561 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
2562 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2563 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2564 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2565 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2566 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2567 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
2568 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2569 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2570 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2571 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2572 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2573 env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
2574 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
2575 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800;
2576 /* Hardware reset vector */
2577 env->hreset_vector = 0x0000000000000100ULL;
2578 #endif
2581 static void init_excp_POWER7(CPUPPCState *env)
2583 #if !defined(CONFIG_USER_ONLY)
2584 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2585 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2586 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2587 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
2588 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2589 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
2590 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2591 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2592 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2593 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2594 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2595 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
2596 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2597 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2598 env->excp_vectors[POWERPC_EXCP_HDSI] = 0x00000E00;
2599 env->excp_vectors[POWERPC_EXCP_HISI] = 0x00000E20;
2600 env->excp_vectors[POWERPC_EXCP_HV_EMU] = 0x00000E40;
2601 env->excp_vectors[POWERPC_EXCP_HV_MAINT] = 0x00000E60;
2602 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2603 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
2604 env->excp_vectors[POWERPC_EXCP_VSXU] = 0x00000F40;
2605 /* Hardware reset vector */
2606 env->hreset_vector = 0x0000000000000100ULL;
2607 #endif
2610 static void init_excp_POWER8(CPUPPCState *env)
2612 init_excp_POWER7(env);
2614 #if !defined(CONFIG_USER_ONLY)
2615 env->excp_vectors[POWERPC_EXCP_SDOOR] = 0x00000A00;
2616 env->excp_vectors[POWERPC_EXCP_FU] = 0x00000F60;
2617 env->excp_vectors[POWERPC_EXCP_HV_FU] = 0x00000F80;
2618 env->excp_vectors[POWERPC_EXCP_SDOOR_HV] = 0x00000E80;
2619 #endif
2622 static void init_excp_POWER9(CPUPPCState *env)
2624 init_excp_POWER8(env);
2626 #if !defined(CONFIG_USER_ONLY)
2627 env->excp_vectors[POWERPC_EXCP_HVIRT] = 0x00000EA0;
2628 env->excp_vectors[POWERPC_EXCP_SYSCALL_VECTORED] = 0x00017000;
2629 #endif
2632 static void init_excp_POWER10(CPUPPCState *env)
2634 init_excp_POWER9(env);
2637 #endif
2639 /*****************************************************************************/
2640 /* Power management enable checks */
2641 static int check_pow_none(CPUPPCState *env)
2643 return 0;
2646 static int check_pow_nocheck(CPUPPCState *env)
2648 return 1;
2651 static int check_pow_hid0(CPUPPCState *env)
2653 if (env->spr[SPR_HID0] & 0x00E00000) {
2654 return 1;
2657 return 0;
2660 static int check_pow_hid0_74xx(CPUPPCState *env)
2662 if (env->spr[SPR_HID0] & 0x00600000) {
2663 return 1;
2666 return 0;
2669 static bool ppc_cpu_interrupts_big_endian_always(PowerPCCPU *cpu)
2671 return true;
2674 #ifdef TARGET_PPC64
2675 static bool ppc_cpu_interrupts_big_endian_lpcr(PowerPCCPU *cpu)
2677 return !(cpu->env.spr[SPR_LPCR] & LPCR_ILE);
2679 #endif
2681 /*****************************************************************************/
2682 /* PowerPC implementations definitions */
2684 #define POWERPC_FAMILY(_name) \
2685 static void \
2686 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
2688 static const TypeInfo \
2689 glue(glue(ppc_, _name), _cpu_family_type_info) = { \
2690 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \
2691 .parent = TYPE_POWERPC_CPU, \
2692 .abstract = true, \
2693 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \
2694 }; \
2696 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \
2698 type_register_static( \
2699 &glue(glue(ppc_, _name), _cpu_family_type_info)); \
2702 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \
2704 static void glue(glue(ppc_, _name), _cpu_family_class_init)
2706 static void init_proc_401(CPUPPCState *env)
2708 register_40x_sprs(env);
2709 register_401_403_sprs(env);
2710 register_401_sprs(env);
2711 init_excp_4xx_real(env);
2712 env->dcache_line_size = 32;
2713 env->icache_line_size = 32;
2714 /* Allocate hardware IRQ controller */
2715 ppc40x_irq_init(env_archcpu(env));
2717 SET_FIT_PERIOD(12, 16, 20, 24);
2718 SET_WDT_PERIOD(16, 20, 24, 28);
2721 POWERPC_FAMILY(401)(ObjectClass *oc, void *data)
2723 DeviceClass *dc = DEVICE_CLASS(oc);
2724 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2726 dc->desc = "PowerPC 401";
2727 pcc->init_proc = init_proc_401;
2728 pcc->check_pow = check_pow_nocheck;
2729 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2730 PPC_WRTEE | PPC_DCR |
2731 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
2732 PPC_CACHE_DCBZ |
2733 PPC_MEM_SYNC | PPC_MEM_EIEIO |
2734 PPC_4xx_COMMON | PPC_40x_EXCP;
2735 pcc->msr_mask = (1ull << MSR_KEY) |
2736 (1ull << MSR_POW) |
2737 (1ull << MSR_CE) |
2738 (1ull << MSR_ILE) |
2739 (1ull << MSR_EE) |
2740 (1ull << MSR_PR) |
2741 (1ull << MSR_ME) |
2742 (1ull << MSR_DE) |
2743 (1ull << MSR_LE);
2744 pcc->mmu_model = POWERPC_MMU_REAL;
2745 pcc->excp_model = POWERPC_EXCP_40x;
2746 pcc->bus_model = PPC_FLAGS_INPUT_401;
2747 pcc->bfd_mach = bfd_mach_ppc_403;
2748 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
2749 POWERPC_FLAG_BUS_CLK;
2752 static void init_proc_401x2(CPUPPCState *env)
2754 register_40x_sprs(env);
2755 register_401_403_sprs(env);
2756 register_401x2_sprs(env);
2757 register_compress_sprs(env);
2758 /* Memory management */
2759 #if !defined(CONFIG_USER_ONLY)
2760 env->nb_tlb = 64;
2761 env->nb_ways = 1;
2762 env->id_tlbs = 0;
2763 env->tlb_type = TLB_EMB;
2764 #endif
2765 init_excp_4xx_softmmu(env);
2766 env->dcache_line_size = 32;
2767 env->icache_line_size = 32;
2768 /* Allocate hardware IRQ controller */
2769 ppc40x_irq_init(env_archcpu(env));
2771 SET_FIT_PERIOD(12, 16, 20, 24);
2772 SET_WDT_PERIOD(16, 20, 24, 28);
2775 POWERPC_FAMILY(401x2)(ObjectClass *oc, void *data)
2777 DeviceClass *dc = DEVICE_CLASS(oc);
2778 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2780 dc->desc = "PowerPC 401x2";
2781 pcc->init_proc = init_proc_401x2;
2782 pcc->check_pow = check_pow_nocheck;
2783 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
2784 PPC_DCR | PPC_WRTEE |
2785 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
2786 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2787 PPC_MEM_SYNC | PPC_MEM_EIEIO |
2788 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
2789 PPC_4xx_COMMON | PPC_40x_EXCP;
2790 pcc->msr_mask = (1ull << 20) |
2791 (1ull << MSR_KEY) |
2792 (1ull << MSR_POW) |
2793 (1ull << MSR_CE) |
2794 (1ull << MSR_ILE) |
2795 (1ull << MSR_EE) |
2796 (1ull << MSR_PR) |
2797 (1ull << MSR_ME) |
2798 (1ull << MSR_DE) |
2799 (1ull << MSR_IR) |
2800 (1ull << MSR_DR) |
2801 (1ull << MSR_LE);
2802 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
2803 pcc->excp_model = POWERPC_EXCP_40x;
2804 pcc->bus_model = PPC_FLAGS_INPUT_401;
2805 pcc->bfd_mach = bfd_mach_ppc_403;
2806 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
2807 POWERPC_FLAG_BUS_CLK;
2810 static void init_proc_401x3(CPUPPCState *env)
2812 register_40x_sprs(env);
2813 register_401_403_sprs(env);
2814 register_401_sprs(env);
2815 register_401x2_sprs(env);
2816 register_compress_sprs(env);
2817 init_excp_4xx_softmmu(env);
2818 env->dcache_line_size = 32;
2819 env->icache_line_size = 32;
2820 /* Allocate hardware IRQ controller */
2821 ppc40x_irq_init(env_archcpu(env));
2823 SET_FIT_PERIOD(12, 16, 20, 24);
2824 SET_WDT_PERIOD(16, 20, 24, 28);
2827 POWERPC_FAMILY(401x3)(ObjectClass *oc, void *data)
2829 DeviceClass *dc = DEVICE_CLASS(oc);
2830 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2832 dc->desc = "PowerPC 401x3";
2833 pcc->init_proc = init_proc_401x3;
2834 pcc->check_pow = check_pow_nocheck;
2835 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
2836 PPC_DCR | PPC_WRTEE |
2837 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
2838 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2839 PPC_MEM_SYNC | PPC_MEM_EIEIO |
2840 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
2841 PPC_4xx_COMMON | PPC_40x_EXCP;
2842 pcc->msr_mask = (1ull << 20) |
2843 (1ull << MSR_KEY) |
2844 (1ull << MSR_POW) |
2845 (1ull << MSR_CE) |
2846 (1ull << MSR_ILE) |
2847 (1ull << MSR_EE) |
2848 (1ull << MSR_PR) |
2849 (1ull << MSR_ME) |
2850 (1ull << MSR_DWE) |
2851 (1ull << MSR_DE) |
2852 (1ull << MSR_IR) |
2853 (1ull << MSR_DR) |
2854 (1ull << MSR_LE);
2855 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
2856 pcc->excp_model = POWERPC_EXCP_40x;
2857 pcc->bus_model = PPC_FLAGS_INPUT_401;
2858 pcc->bfd_mach = bfd_mach_ppc_403;
2859 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
2860 POWERPC_FLAG_BUS_CLK;
2863 static void init_proc_IOP480(CPUPPCState *env)
2865 register_40x_sprs(env);
2866 register_401_403_sprs(env);
2867 register_401x2_sprs(env);
2868 register_compress_sprs(env);
2869 /* Memory management */
2870 #if !defined(CONFIG_USER_ONLY)
2871 env->nb_tlb = 64;
2872 env->nb_ways = 1;
2873 env->id_tlbs = 0;
2874 env->tlb_type = TLB_EMB;
2875 #endif
2876 init_excp_4xx_softmmu(env);
2877 env->dcache_line_size = 32;
2878 env->icache_line_size = 32;
2879 /* Allocate hardware IRQ controller */
2880 ppc40x_irq_init(env_archcpu(env));
2882 SET_FIT_PERIOD(8, 12, 16, 20);
2883 SET_WDT_PERIOD(16, 20, 24, 28);
2886 POWERPC_FAMILY(IOP480)(ObjectClass *oc, void *data)
2888 DeviceClass *dc = DEVICE_CLASS(oc);
2889 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2891 dc->desc = "IOP480";
2892 pcc->init_proc = init_proc_IOP480;
2893 pcc->check_pow = check_pow_nocheck;
2894 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2895 PPC_DCR | PPC_WRTEE |
2896 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
2897 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
2898 PPC_MEM_SYNC | PPC_MEM_EIEIO |
2899 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
2900 PPC_4xx_COMMON | PPC_40x_EXCP;
2901 pcc->msr_mask = (1ull << 20) |
2902 (1ull << MSR_KEY) |
2903 (1ull << MSR_POW) |
2904 (1ull << MSR_CE) |
2905 (1ull << MSR_ILE) |
2906 (1ull << MSR_EE) |
2907 (1ull << MSR_PR) |
2908 (1ull << MSR_ME) |
2909 (1ull << MSR_DE) |
2910 (1ull << MSR_IR) |
2911 (1ull << MSR_DR) |
2912 (1ull << MSR_LE);
2913 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
2914 pcc->excp_model = POWERPC_EXCP_40x;
2915 pcc->bus_model = PPC_FLAGS_INPUT_401;
2916 pcc->bfd_mach = bfd_mach_ppc_403;
2917 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
2918 POWERPC_FLAG_BUS_CLK;
2921 static void init_proc_403(CPUPPCState *env)
2923 register_40x_sprs(env);
2924 register_401_403_sprs(env);
2925 register_403_sprs(env);
2926 register_403_real_sprs(env);
2927 init_excp_4xx_real(env);
2928 env->dcache_line_size = 32;
2929 env->icache_line_size = 32;
2930 /* Allocate hardware IRQ controller */
2931 ppc40x_irq_init(env_archcpu(env));
2933 SET_FIT_PERIOD(8, 12, 16, 20);
2934 SET_WDT_PERIOD(16, 20, 24, 28);
2937 POWERPC_FAMILY(403)(ObjectClass *oc, void *data)
2939 DeviceClass *dc = DEVICE_CLASS(oc);
2940 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
2942 dc->desc = "PowerPC 403";
2943 pcc->init_proc = init_proc_403;
2944 pcc->check_pow = check_pow_nocheck;
2945 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
2946 PPC_DCR | PPC_WRTEE |
2947 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
2948 PPC_CACHE_DCBZ |
2949 PPC_MEM_SYNC | PPC_MEM_EIEIO |
2950 PPC_4xx_COMMON | PPC_40x_EXCP;
2951 pcc->msr_mask = (1ull << MSR_POW) |
2952 (1ull << MSR_CE) |
2953 (1ull << MSR_ILE) |
2954 (1ull << MSR_EE) |
2955 (1ull << MSR_PR) |
2956 (1ull << MSR_ME) |
2957 (1ull << MSR_PE) |
2958 (1ull << MSR_PX) |
2959 (1ull << MSR_LE);
2960 pcc->mmu_model = POWERPC_MMU_REAL;
2961 pcc->excp_model = POWERPC_EXCP_40x;
2962 pcc->bus_model = PPC_FLAGS_INPUT_401;
2963 pcc->bfd_mach = bfd_mach_ppc_403;
2964 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
2965 POWERPC_FLAG_BUS_CLK;
2968 static void init_proc_403GCX(CPUPPCState *env)
2970 register_40x_sprs(env);
2971 register_401_403_sprs(env);
2972 register_403_sprs(env);
2973 register_403_real_sprs(env);
2974 register_403_mmu_sprs(env);
2975 /* Bus access control */
2976 /* not emulated, as QEMU never does speculative access */
2977 spr_register(env, SPR_40x_SGR, "SGR",
2978 SPR_NOACCESS, SPR_NOACCESS,
2979 &spr_read_generic, &spr_write_generic,
2980 0xFFFFFFFF);
2981 /* not emulated, as QEMU do not emulate caches */
2982 spr_register(env, SPR_40x_DCWR, "DCWR",
2983 SPR_NOACCESS, SPR_NOACCESS,
2984 &spr_read_generic, &spr_write_generic,
2985 0x00000000);
2986 /* Memory management */
2987 #if !defined(CONFIG_USER_ONLY)
2988 env->nb_tlb = 64;
2989 env->nb_ways = 1;
2990 env->id_tlbs = 0;
2991 env->tlb_type = TLB_EMB;
2992 #endif
2993 init_excp_4xx_softmmu(env);
2994 env->dcache_line_size = 32;
2995 env->icache_line_size = 32;
2996 /* Allocate hardware IRQ controller */
2997 ppc40x_irq_init(env_archcpu(env));
2999 SET_FIT_PERIOD(8, 12, 16, 20);
3000 SET_WDT_PERIOD(16, 20, 24, 28);
3003 POWERPC_FAMILY(403GCX)(ObjectClass *oc, void *data)
3005 DeviceClass *dc = DEVICE_CLASS(oc);
3006 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3008 dc->desc = "PowerPC 403 GCX";
3009 pcc->init_proc = init_proc_403GCX;
3010 pcc->check_pow = check_pow_nocheck;
3011 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3012 PPC_DCR | PPC_WRTEE |
3013 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3014 PPC_CACHE_DCBZ |
3015 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3016 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3017 PPC_4xx_COMMON | PPC_40x_EXCP;
3018 pcc->msr_mask = (1ull << MSR_POW) |
3019 (1ull << MSR_CE) |
3020 (1ull << MSR_ILE) |
3021 (1ull << MSR_EE) |
3022 (1ull << MSR_PR) |
3023 (1ull << MSR_ME) |
3024 (1ull << MSR_PE) |
3025 (1ull << MSR_PX) |
3026 (1ull << MSR_LE);
3027 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3028 pcc->excp_model = POWERPC_EXCP_40x;
3029 pcc->bus_model = PPC_FLAGS_INPUT_401;
3030 pcc->bfd_mach = bfd_mach_ppc_403;
3031 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3032 POWERPC_FLAG_BUS_CLK;
3035 static void init_proc_405(CPUPPCState *env)
3037 /* Time base */
3038 register_tbl(env);
3039 register_40x_sprs(env);
3040 register_405_sprs(env);
3041 /* Bus access control */
3042 /* not emulated, as QEMU never does speculative access */
3043 spr_register(env, SPR_40x_SGR, "SGR",
3044 SPR_NOACCESS, SPR_NOACCESS,
3045 &spr_read_generic, &spr_write_generic,
3046 0xFFFFFFFF);
3047 /* not emulated, as QEMU do not emulate caches */
3048 spr_register(env, SPR_40x_DCWR, "DCWR",
3049 SPR_NOACCESS, SPR_NOACCESS,
3050 &spr_read_generic, &spr_write_generic,
3051 0x00000000);
3052 /* Memory management */
3053 #if !defined(CONFIG_USER_ONLY)
3054 env->nb_tlb = 64;
3055 env->nb_ways = 1;
3056 env->id_tlbs = 0;
3057 env->tlb_type = TLB_EMB;
3058 #endif
3059 init_excp_4xx_softmmu(env);
3060 env->dcache_line_size = 32;
3061 env->icache_line_size = 32;
3062 /* Allocate hardware IRQ controller */
3063 ppc40x_irq_init(env_archcpu(env));
3065 SET_FIT_PERIOD(8, 12, 16, 20);
3066 SET_WDT_PERIOD(16, 20, 24, 28);
3069 POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
3071 DeviceClass *dc = DEVICE_CLASS(oc);
3072 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3074 dc->desc = "PowerPC 405";
3075 pcc->init_proc = init_proc_405;
3076 pcc->check_pow = check_pow_nocheck;
3077 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3078 PPC_DCR | PPC_WRTEE |
3079 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3080 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3081 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3082 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3083 PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
3084 pcc->msr_mask = (1ull << MSR_POW) |
3085 (1ull << MSR_CE) |
3086 (1ull << MSR_EE) |
3087 (1ull << MSR_PR) |
3088 (1ull << MSR_FP) |
3089 (1ull << MSR_DWE) |
3090 (1ull << MSR_DE) |
3091 (1ull << MSR_IR) |
3092 (1ull << MSR_DR);
3093 pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
3094 pcc->excp_model = POWERPC_EXCP_40x;
3095 pcc->bus_model = PPC_FLAGS_INPUT_405;
3096 pcc->bfd_mach = bfd_mach_ppc_403;
3097 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3098 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3101 static void init_proc_440EP(CPUPPCState *env)
3103 /* Time base */
3104 register_tbl(env);
3105 register_BookE_sprs(env, 0x000000000000FFFFULL);
3106 register_440_sprs(env);
3107 register_usprgh_sprs(env);
3108 /* Processor identification */
3109 spr_register(env, SPR_BOOKE_PIR, "PIR",
3110 SPR_NOACCESS, SPR_NOACCESS,
3111 &spr_read_generic, &spr_write_pir,
3112 0x00000000);
3113 /* XXX : not implemented */
3114 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3115 SPR_NOACCESS, SPR_NOACCESS,
3116 &spr_read_generic, &spr_write_generic,
3117 0x00000000);
3118 /* XXX : not implemented */
3119 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3120 SPR_NOACCESS, SPR_NOACCESS,
3121 &spr_read_generic, &spr_write_generic,
3122 0x00000000);
3123 /* XXX : not implemented */
3124 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3125 SPR_NOACCESS, SPR_NOACCESS,
3126 &spr_read_generic, &spr_write_generic,
3127 0x00000000);
3128 /* XXX : not implemented */
3129 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3130 SPR_NOACCESS, SPR_NOACCESS,
3131 &spr_read_generic, &spr_write_generic,
3132 0x00000000);
3133 /* XXX : not implemented */
3134 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3135 SPR_NOACCESS, SPR_NOACCESS,
3136 &spr_read_generic, &spr_write_generic,
3137 0x00000000);
3138 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3139 SPR_NOACCESS, SPR_NOACCESS,
3140 &spr_read_generic, &spr_write_generic,
3141 0x00000000);
3142 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3143 SPR_NOACCESS, SPR_NOACCESS,
3144 &spr_read_generic, &spr_write_generic,
3145 0x00000000);
3146 /* XXX : not implemented */
3147 spr_register(env, SPR_440_CCR1, "CCR1",
3148 SPR_NOACCESS, SPR_NOACCESS,
3149 &spr_read_generic, &spr_write_generic,
3150 0x00000000);
3151 /* Memory management */
3152 #if !defined(CONFIG_USER_ONLY)
3153 env->nb_tlb = 64;
3154 env->nb_ways = 1;
3155 env->id_tlbs = 0;
3156 env->tlb_type = TLB_EMB;
3157 #endif
3158 init_excp_BookE(env);
3159 env->dcache_line_size = 32;
3160 env->icache_line_size = 32;
3161 ppc40x_irq_init(env_archcpu(env));
3163 SET_FIT_PERIOD(12, 16, 20, 24);
3164 SET_WDT_PERIOD(20, 24, 28, 32);
3167 POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
3169 DeviceClass *dc = DEVICE_CLASS(oc);
3170 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3172 dc->desc = "PowerPC 440 EP";
3173 pcc->init_proc = init_proc_440EP;
3174 pcc->check_pow = check_pow_nocheck;
3175 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3176 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3177 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3178 PPC_FLOAT_STFIWX |
3179 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3180 PPC_CACHE | PPC_CACHE_ICBI |
3181 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3182 PPC_MEM_TLBSYNC | PPC_MFTB |
3183 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3184 PPC_440_SPEC;
3185 pcc->msr_mask = (1ull << MSR_POW) |
3186 (1ull << MSR_CE) |
3187 (1ull << MSR_EE) |
3188 (1ull << MSR_PR) |
3189 (1ull << MSR_FP) |
3190 (1ull << MSR_ME) |
3191 (1ull << MSR_FE0) |
3192 (1ull << MSR_DWE) |
3193 (1ull << MSR_DE) |
3194 (1ull << MSR_FE1) |
3195 (1ull << MSR_IR) |
3196 (1ull << MSR_DR);
3197 pcc->mmu_model = POWERPC_MMU_BOOKE;
3198 pcc->excp_model = POWERPC_EXCP_BOOKE;
3199 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3200 pcc->bfd_mach = bfd_mach_ppc_403;
3201 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3202 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3205 POWERPC_FAMILY(460EX)(ObjectClass *oc, void *data)
3207 DeviceClass *dc = DEVICE_CLASS(oc);
3208 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3210 dc->desc = "PowerPC 460 EX";
3211 pcc->init_proc = init_proc_440EP;
3212 pcc->check_pow = check_pow_nocheck;
3213 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3214 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3215 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3216 PPC_FLOAT_STFIWX |
3217 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_RFMCI |
3218 PPC_CACHE | PPC_CACHE_ICBI |
3219 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3220 PPC_MEM_TLBSYNC | PPC_MFTB |
3221 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3222 PPC_440_SPEC;
3223 pcc->msr_mask = (1ull << MSR_POW) |
3224 (1ull << MSR_CE) |
3225 (1ull << MSR_EE) |
3226 (1ull << MSR_PR) |
3227 (1ull << MSR_FP) |
3228 (1ull << MSR_ME) |
3229 (1ull << MSR_FE0) |
3230 (1ull << MSR_DWE) |
3231 (1ull << MSR_DE) |
3232 (1ull << MSR_FE1) |
3233 (1ull << MSR_IR) |
3234 (1ull << MSR_DR);
3235 pcc->mmu_model = POWERPC_MMU_BOOKE;
3236 pcc->excp_model = POWERPC_EXCP_BOOKE;
3237 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3238 pcc->bfd_mach = bfd_mach_ppc_403;
3239 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3240 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3243 static void init_proc_440GP(CPUPPCState *env)
3245 /* Time base */
3246 register_tbl(env);
3247 register_BookE_sprs(env, 0x000000000000FFFFULL);
3248 register_440_sprs(env);
3249 register_usprgh_sprs(env);
3250 /* Processor identification */
3251 spr_register(env, SPR_BOOKE_PIR, "PIR",
3252 SPR_NOACCESS, SPR_NOACCESS,
3253 &spr_read_generic, &spr_write_pir,
3254 0x00000000);
3255 /* XXX : not implemented */
3256 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3257 SPR_NOACCESS, SPR_NOACCESS,
3258 &spr_read_generic, &spr_write_generic,
3259 0x00000000);
3260 /* XXX : not implemented */
3261 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3262 SPR_NOACCESS, SPR_NOACCESS,
3263 &spr_read_generic, &spr_write_generic,
3264 0x00000000);
3265 /* XXX : not implemented */
3266 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3267 SPR_NOACCESS, SPR_NOACCESS,
3268 &spr_read_generic, &spr_write_generic,
3269 0x00000000);
3270 /* XXX : not implemented */
3271 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3272 SPR_NOACCESS, SPR_NOACCESS,
3273 &spr_read_generic, &spr_write_generic,
3274 0x00000000);
3275 /* Memory management */
3276 #if !defined(CONFIG_USER_ONLY)
3277 env->nb_tlb = 64;
3278 env->nb_ways = 1;
3279 env->id_tlbs = 0;
3280 env->tlb_type = TLB_EMB;
3281 #endif
3282 init_excp_BookE(env);
3283 env->dcache_line_size = 32;
3284 env->icache_line_size = 32;
3285 /* XXX: TODO: allocate internal IRQ controller */
3287 SET_FIT_PERIOD(12, 16, 20, 24);
3288 SET_WDT_PERIOD(20, 24, 28, 32);
3291 POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
3293 DeviceClass *dc = DEVICE_CLASS(oc);
3294 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3296 dc->desc = "PowerPC 440 GP";
3297 pcc->init_proc = init_proc_440GP;
3298 pcc->check_pow = check_pow_nocheck;
3299 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3300 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
3301 PPC_CACHE | PPC_CACHE_ICBI |
3302 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3303 PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
3304 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3305 PPC_440_SPEC;
3306 pcc->msr_mask = (1ull << MSR_POW) |
3307 (1ull << MSR_CE) |
3308 (1ull << MSR_EE) |
3309 (1ull << MSR_PR) |
3310 (1ull << MSR_FP) |
3311 (1ull << MSR_ME) |
3312 (1ull << MSR_FE0) |
3313 (1ull << MSR_DWE) |
3314 (1ull << MSR_DE) |
3315 (1ull << MSR_FE1) |
3316 (1ull << MSR_IR) |
3317 (1ull << MSR_DR);
3318 pcc->mmu_model = POWERPC_MMU_BOOKE;
3319 pcc->excp_model = POWERPC_EXCP_BOOKE;
3320 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3321 pcc->bfd_mach = bfd_mach_ppc_403;
3322 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3323 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3326 static void init_proc_440x4(CPUPPCState *env)
3328 /* Time base */
3329 register_tbl(env);
3330 register_BookE_sprs(env, 0x000000000000FFFFULL);
3331 register_440_sprs(env);
3332 register_usprgh_sprs(env);
3333 /* Processor identification */
3334 spr_register(env, SPR_BOOKE_PIR, "PIR",
3335 SPR_NOACCESS, SPR_NOACCESS,
3336 &spr_read_generic, &spr_write_pir,
3337 0x00000000);
3338 /* XXX : not implemented */
3339 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3340 SPR_NOACCESS, SPR_NOACCESS,
3341 &spr_read_generic, &spr_write_generic,
3342 0x00000000);
3343 /* XXX : not implemented */
3344 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3345 SPR_NOACCESS, SPR_NOACCESS,
3346 &spr_read_generic, &spr_write_generic,
3347 0x00000000);
3348 /* XXX : not implemented */
3349 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3350 SPR_NOACCESS, SPR_NOACCESS,
3351 &spr_read_generic, &spr_write_generic,
3352 0x00000000);
3353 /* XXX : not implemented */
3354 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3355 SPR_NOACCESS, SPR_NOACCESS,
3356 &spr_read_generic, &spr_write_generic,
3357 0x00000000);
3358 /* Memory management */
3359 #if !defined(CONFIG_USER_ONLY)
3360 env->nb_tlb = 64;
3361 env->nb_ways = 1;
3362 env->id_tlbs = 0;
3363 env->tlb_type = TLB_EMB;
3364 #endif
3365 init_excp_BookE(env);
3366 env->dcache_line_size = 32;
3367 env->icache_line_size = 32;
3368 /* XXX: TODO: allocate internal IRQ controller */
3370 SET_FIT_PERIOD(12, 16, 20, 24);
3371 SET_WDT_PERIOD(20, 24, 28, 32);
3374 POWERPC_FAMILY(440x4)(ObjectClass *oc, void *data)
3376 DeviceClass *dc = DEVICE_CLASS(oc);
3377 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3379 dc->desc = "PowerPC 440x4";
3380 pcc->init_proc = init_proc_440x4;
3381 pcc->check_pow = check_pow_nocheck;
3382 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3383 PPC_DCR | PPC_WRTEE |
3384 PPC_CACHE | PPC_CACHE_ICBI |
3385 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3386 PPC_MEM_TLBSYNC | PPC_MFTB |
3387 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3388 PPC_440_SPEC;
3389 pcc->msr_mask = (1ull << MSR_POW) |
3390 (1ull << MSR_CE) |
3391 (1ull << MSR_EE) |
3392 (1ull << MSR_PR) |
3393 (1ull << MSR_FP) |
3394 (1ull << MSR_ME) |
3395 (1ull << MSR_FE0) |
3396 (1ull << MSR_DWE) |
3397 (1ull << MSR_DE) |
3398 (1ull << MSR_FE1) |
3399 (1ull << MSR_IR) |
3400 (1ull << MSR_DR);
3401 pcc->mmu_model = POWERPC_MMU_BOOKE;
3402 pcc->excp_model = POWERPC_EXCP_BOOKE;
3403 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3404 pcc->bfd_mach = bfd_mach_ppc_403;
3405 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3406 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3409 static void init_proc_440x5(CPUPPCState *env)
3411 /* Time base */
3412 register_tbl(env);
3413 register_BookE_sprs(env, 0x000000000000FFFFULL);
3414 register_440_sprs(env);
3415 register_usprgh_sprs(env);
3416 /* Processor identification */
3417 spr_register(env, SPR_BOOKE_PIR, "PIR",
3418 SPR_NOACCESS, SPR_NOACCESS,
3419 &spr_read_generic, &spr_write_pir,
3420 0x00000000);
3421 /* XXX : not implemented */
3422 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3423 SPR_NOACCESS, SPR_NOACCESS,
3424 &spr_read_generic, &spr_write_generic,
3425 0x00000000);
3426 /* XXX : not implemented */
3427 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3428 SPR_NOACCESS, SPR_NOACCESS,
3429 &spr_read_generic, &spr_write_generic,
3430 0x00000000);
3431 /* XXX : not implemented */
3432 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3433 SPR_NOACCESS, SPR_NOACCESS,
3434 &spr_read_generic, &spr_write_generic,
3435 0x00000000);
3436 /* XXX : not implemented */
3437 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3438 SPR_NOACCESS, SPR_NOACCESS,
3439 &spr_read_generic, &spr_write_generic,
3440 0x00000000);
3441 /* XXX : not implemented */
3442 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3443 SPR_NOACCESS, SPR_NOACCESS,
3444 &spr_read_generic, &spr_write_generic,
3445 0x00000000);
3446 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3447 SPR_NOACCESS, SPR_NOACCESS,
3448 &spr_read_generic, &spr_write_generic,
3449 0x00000000);
3450 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3451 SPR_NOACCESS, SPR_NOACCESS,
3452 &spr_read_generic, &spr_write_generic,
3453 0x00000000);
3454 /* XXX : not implemented */
3455 spr_register(env, SPR_440_CCR1, "CCR1",
3456 SPR_NOACCESS, SPR_NOACCESS,
3457 &spr_read_generic, &spr_write_generic,
3458 0x00000000);
3459 /* Memory management */
3460 #if !defined(CONFIG_USER_ONLY)
3461 env->nb_tlb = 64;
3462 env->nb_ways = 1;
3463 env->id_tlbs = 0;
3464 env->tlb_type = TLB_EMB;
3465 #endif
3466 init_excp_BookE(env);
3467 env->dcache_line_size = 32;
3468 env->icache_line_size = 32;
3469 ppc40x_irq_init(env_archcpu(env));
3471 SET_FIT_PERIOD(12, 16, 20, 24);
3472 SET_WDT_PERIOD(20, 24, 28, 32);
3475 POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
3477 DeviceClass *dc = DEVICE_CLASS(oc);
3478 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3480 dc->desc = "PowerPC 440x5";
3481 pcc->init_proc = init_proc_440x5;
3482 pcc->check_pow = check_pow_nocheck;
3483 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3484 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3485 PPC_CACHE | PPC_CACHE_ICBI |
3486 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3487 PPC_MEM_TLBSYNC | PPC_MFTB |
3488 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3489 PPC_440_SPEC;
3490 pcc->msr_mask = (1ull << MSR_POW) |
3491 (1ull << MSR_CE) |
3492 (1ull << MSR_EE) |
3493 (1ull << MSR_PR) |
3494 (1ull << MSR_FP) |
3495 (1ull << MSR_ME) |
3496 (1ull << MSR_FE0) |
3497 (1ull << MSR_DWE) |
3498 (1ull << MSR_DE) |
3499 (1ull << MSR_FE1) |
3500 (1ull << MSR_IR) |
3501 (1ull << MSR_DR);
3502 pcc->mmu_model = POWERPC_MMU_BOOKE;
3503 pcc->excp_model = POWERPC_EXCP_BOOKE;
3504 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3505 pcc->bfd_mach = bfd_mach_ppc_403;
3506 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3507 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3510 POWERPC_FAMILY(440x5wDFPU)(ObjectClass *oc, void *data)
3512 DeviceClass *dc = DEVICE_CLASS(oc);
3513 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3515 dc->desc = "PowerPC 440x5 with double precision FPU";
3516 pcc->init_proc = init_proc_440x5;
3517 pcc->check_pow = check_pow_nocheck;
3518 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3519 PPC_FLOAT | PPC_FLOAT_FSQRT |
3520 PPC_FLOAT_STFIWX |
3521 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3522 PPC_CACHE | PPC_CACHE_ICBI |
3523 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3524 PPC_MEM_TLBSYNC | PPC_MFTB |
3525 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3526 PPC_440_SPEC;
3527 pcc->insns_flags2 = PPC2_FP_CVT_S64;
3528 pcc->msr_mask = (1ull << MSR_POW) |
3529 (1ull << MSR_CE) |
3530 (1ull << MSR_EE) |
3531 (1ull << MSR_PR) |
3532 (1ull << MSR_FP) |
3533 (1ull << MSR_ME) |
3534 (1ull << MSR_FE0) |
3535 (1ull << MSR_DWE) |
3536 (1ull << MSR_DE) |
3537 (1ull << MSR_FE1) |
3538 (1ull << MSR_IR) |
3539 (1ull << MSR_DR);
3540 pcc->mmu_model = POWERPC_MMU_BOOKE;
3541 pcc->excp_model = POWERPC_EXCP_BOOKE;
3542 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3543 pcc->bfd_mach = bfd_mach_ppc_403;
3544 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3545 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3548 static void init_proc_MPC5xx(CPUPPCState *env)
3550 /* Time base */
3551 register_tbl(env);
3552 register_5xx_8xx_sprs(env);
3553 register_5xx_sprs(env);
3554 init_excp_MPC5xx(env);
3555 env->dcache_line_size = 32;
3556 env->icache_line_size = 32;
3557 /* XXX: TODO: allocate internal IRQ controller */
3560 POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
3562 DeviceClass *dc = DEVICE_CLASS(oc);
3563 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3565 dc->desc = "Freescale 5xx cores (aka RCPU)";
3566 pcc->init_proc = init_proc_MPC5xx;
3567 pcc->check_pow = check_pow_none;
3568 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3569 PPC_MEM_EIEIO | PPC_MEM_SYNC |
3570 PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
3571 PPC_MFTB;
3572 pcc->msr_mask = (1ull << MSR_ILE) |
3573 (1ull << MSR_EE) |
3574 (1ull << MSR_PR) |
3575 (1ull << MSR_FP) |
3576 (1ull << MSR_ME) |
3577 (1ull << MSR_FE0) |
3578 (1ull << MSR_SE) |
3579 (1ull << MSR_DE) |
3580 (1ull << MSR_FE1) |
3581 (1ull << MSR_EP) |
3582 (1ull << MSR_RI) |
3583 (1ull << MSR_LE);
3584 pcc->mmu_model = POWERPC_MMU_REAL;
3585 pcc->excp_model = POWERPC_EXCP_603;
3586 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
3587 pcc->bfd_mach = bfd_mach_ppc_505;
3588 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
3589 POWERPC_FLAG_BUS_CLK;
3592 static void init_proc_MPC8xx(CPUPPCState *env)
3594 /* Time base */
3595 register_tbl(env);
3596 register_5xx_8xx_sprs(env);
3597 register_8xx_sprs(env);
3598 init_excp_MPC8xx(env);
3599 env->dcache_line_size = 32;
3600 env->icache_line_size = 32;
3601 /* XXX: TODO: allocate internal IRQ controller */
3604 POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
3606 DeviceClass *dc = DEVICE_CLASS(oc);
3607 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3609 dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
3610 pcc->init_proc = init_proc_MPC8xx;
3611 pcc->check_pow = check_pow_none;
3612 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3613 PPC_MEM_EIEIO | PPC_MEM_SYNC |
3614 PPC_CACHE_ICBI | PPC_MFTB;
3615 pcc->msr_mask = (1ull << MSR_ILE) |
3616 (1ull << MSR_EE) |
3617 (1ull << MSR_PR) |
3618 (1ull << MSR_FP) |
3619 (1ull << MSR_ME) |
3620 (1ull << MSR_SE) |
3621 (1ull << MSR_DE) |
3622 (1ull << MSR_EP) |
3623 (1ull << MSR_IR) |
3624 (1ull << MSR_DR) |
3625 (1ull << MSR_RI) |
3626 (1ull << MSR_LE);
3627 pcc->mmu_model = POWERPC_MMU_MPC8xx;
3628 pcc->excp_model = POWERPC_EXCP_603;
3629 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
3630 pcc->bfd_mach = bfd_mach_ppc_860;
3631 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
3632 POWERPC_FLAG_BUS_CLK;
3635 /* Freescale 82xx cores (aka PowerQUICC-II) */
3637 static void init_proc_G2(CPUPPCState *env)
3639 register_ne_601_sprs(env);
3640 register_sdr1_sprs(env);
3641 register_G2_755_sprs(env);
3642 register_G2_sprs(env);
3643 /* Time base */
3644 register_tbl(env);
3645 /* External access control */
3646 /* XXX : not implemented */
3647 spr_register(env, SPR_EAR, "EAR",
3648 SPR_NOACCESS, SPR_NOACCESS,
3649 &spr_read_generic, &spr_write_generic,
3650 0x00000000);
3651 /* Hardware implementation register */
3652 /* XXX : not implemented */
3653 spr_register(env, SPR_HID0, "HID0",
3654 SPR_NOACCESS, SPR_NOACCESS,
3655 &spr_read_generic, &spr_write_generic,
3656 0x00000000);
3657 /* XXX : not implemented */
3658 spr_register(env, SPR_HID1, "HID1",
3659 SPR_NOACCESS, SPR_NOACCESS,
3660 &spr_read_generic, &spr_write_generic,
3661 0x00000000);
3662 /* XXX : not implemented */
3663 spr_register(env, SPR_HID2, "HID2",
3664 SPR_NOACCESS, SPR_NOACCESS,
3665 &spr_read_generic, &spr_write_generic,
3666 0x00000000);
3667 /* Memory management */
3668 register_low_BATs(env);
3669 register_high_BATs(env);
3670 register_6xx_7xx_soft_tlb(env, 64, 2);
3671 init_excp_G2(env);
3672 env->dcache_line_size = 32;
3673 env->icache_line_size = 32;
3674 /* Allocate hardware IRQ controller */
3675 ppc6xx_irq_init(env_archcpu(env));
3678 POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
3680 DeviceClass *dc = DEVICE_CLASS(oc);
3681 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3683 dc->desc = "PowerPC G2";
3684 pcc->init_proc = init_proc_G2;
3685 pcc->check_pow = check_pow_hid0;
3686 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3687 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3688 PPC_FLOAT_STFIWX |
3689 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3690 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3691 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
3692 PPC_SEGMENT | PPC_EXTERN;
3693 pcc->msr_mask = (1ull << MSR_POW) |
3694 (1ull << MSR_TGPR) |
3695 (1ull << MSR_EE) |
3696 (1ull << MSR_PR) |
3697 (1ull << MSR_FP) |
3698 (1ull << MSR_ME) |
3699 (1ull << MSR_FE0) |
3700 (1ull << MSR_SE) |
3701 (1ull << MSR_DE) |
3702 (1ull << MSR_FE1) |
3703 (1ull << MSR_AL) |
3704 (1ull << MSR_EP) |
3705 (1ull << MSR_IR) |
3706 (1ull << MSR_DR) |
3707 (1ull << MSR_RI);
3708 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
3709 pcc->excp_model = POWERPC_EXCP_G2;
3710 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3711 pcc->bfd_mach = bfd_mach_ppc_ec603e;
3712 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
3713 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
3716 static void init_proc_G2LE(CPUPPCState *env)
3718 register_ne_601_sprs(env);
3719 register_sdr1_sprs(env);
3720 register_G2_755_sprs(env);
3721 register_G2_sprs(env);
3722 /* Time base */
3723 register_tbl(env);
3724 /* External access control */
3725 /* XXX : not implemented */
3726 spr_register(env, SPR_EAR, "EAR",
3727 SPR_NOACCESS, SPR_NOACCESS,
3728 &spr_read_generic, &spr_write_generic,
3729 0x00000000);
3730 /* Hardware implementation register */
3731 /* XXX : not implemented */
3732 spr_register(env, SPR_HID0, "HID0",
3733 SPR_NOACCESS, SPR_NOACCESS,
3734 &spr_read_generic, &spr_write_generic,
3735 0x00000000);
3736 /* XXX : not implemented */
3737 spr_register(env, SPR_HID1, "HID1",
3738 SPR_NOACCESS, SPR_NOACCESS,
3739 &spr_read_generic, &spr_write_generic,
3740 0x00000000);
3741 /* XXX : not implemented */
3742 spr_register(env, SPR_HID2, "HID2",
3743 SPR_NOACCESS, SPR_NOACCESS,
3744 &spr_read_generic, &spr_write_generic,
3745 0x00000000);
3747 /* Memory management */
3748 register_low_BATs(env);
3749 register_high_BATs(env);
3750 register_6xx_7xx_soft_tlb(env, 64, 2);
3751 init_excp_G2(env);
3752 env->dcache_line_size = 32;
3753 env->icache_line_size = 32;
3754 /* Allocate hardware IRQ controller */
3755 ppc6xx_irq_init(env_archcpu(env));
3758 POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
3760 DeviceClass *dc = DEVICE_CLASS(oc);
3761 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3763 dc->desc = "PowerPC G2LE";
3764 pcc->init_proc = init_proc_G2LE;
3765 pcc->check_pow = check_pow_hid0;
3766 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3767 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
3768 PPC_FLOAT_STFIWX |
3769 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
3770 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3771 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
3772 PPC_SEGMENT | PPC_EXTERN;
3773 pcc->msr_mask = (1ull << MSR_POW) |
3774 (1ull << MSR_TGPR) |
3775 (1ull << MSR_ILE) |
3776 (1ull << MSR_EE) |
3777 (1ull << MSR_PR) |
3778 (1ull << MSR_FP) |
3779 (1ull << MSR_ME) |
3780 (1ull << MSR_FE0) |
3781 (1ull << MSR_SE) |
3782 (1ull << MSR_DE) |
3783 (1ull << MSR_FE1) |
3784 (1ull << MSR_AL) |
3785 (1ull << MSR_EP) |
3786 (1ull << MSR_IR) |
3787 (1ull << MSR_DR) |
3788 (1ull << MSR_RI) |
3789 (1ull << MSR_LE);
3790 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
3791 pcc->excp_model = POWERPC_EXCP_G2;
3792 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
3793 pcc->bfd_mach = bfd_mach_ppc_ec603e;
3794 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
3795 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
3798 static void init_proc_e200(CPUPPCState *env)
3800 /* Time base */
3801 register_tbl(env);
3802 register_BookE_sprs(env, 0x000000070000FFFFULL);
3803 /* XXX : not implemented */
3804 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
3805 &spr_read_spefscr, &spr_write_spefscr,
3806 &spr_read_spefscr, &spr_write_spefscr,
3807 0x00000000);
3808 /* Memory management */
3809 register_BookE206_sprs(env, 0x0000005D, NULL, 0);
3810 /* XXX : not implemented */
3811 spr_register(env, SPR_HID0, "HID0",
3812 SPR_NOACCESS, SPR_NOACCESS,
3813 &spr_read_generic, &spr_write_generic,
3814 0x00000000);
3815 /* XXX : not implemented */
3816 spr_register(env, SPR_HID1, "HID1",
3817 SPR_NOACCESS, SPR_NOACCESS,
3818 &spr_read_generic, &spr_write_generic,
3819 0x00000000);
3820 /* XXX : not implemented */
3821 spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
3822 SPR_NOACCESS, SPR_NOACCESS,
3823 &spr_read_generic, &spr_write_generic,
3824 0x00000000);
3825 /* XXX : not implemented */
3826 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
3827 SPR_NOACCESS, SPR_NOACCESS,
3828 &spr_read_generic, &spr_write_generic,
3829 0x00000000);
3830 /* XXX : not implemented */
3831 spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
3832 SPR_NOACCESS, SPR_NOACCESS,
3833 &spr_read_generic, &spr_write_generic,
3834 0x00000000);
3835 /* XXX : not implemented */
3836 spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
3837 SPR_NOACCESS, SPR_NOACCESS,
3838 &spr_read_generic, &spr_write_generic,
3839 0x00000000);
3840 /* XXX : not implemented */
3841 spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
3842 SPR_NOACCESS, SPR_NOACCESS,
3843 &spr_read_generic, &spr_write_generic,
3844 0x00000000);
3845 /* XXX : not implemented */
3846 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
3847 &spr_read_generic, SPR_NOACCESS,
3848 &spr_read_generic, SPR_NOACCESS,
3849 0x00000000);
3850 /* XXX : not implemented */
3851 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
3852 SPR_NOACCESS, SPR_NOACCESS,
3853 &spr_read_generic, &spr_write_generic,
3854 0x00000000);
3855 /* XXX : not implemented */
3856 spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
3857 SPR_NOACCESS, SPR_NOACCESS,
3858 &spr_read_generic, &spr_write_generic,
3859 0x00000000);
3860 /* XXX : not implemented */
3861 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
3862 SPR_NOACCESS, SPR_NOACCESS,
3863 &spr_read_generic, &spr_write_generic,
3864 0x00000000);
3865 /* XXX : not implemented */
3866 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
3867 SPR_NOACCESS, SPR_NOACCESS,
3868 &spr_read_generic, &spr_write_generic,
3869 0x00000000);
3870 /* XXX : not implemented */
3871 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3872 SPR_NOACCESS, SPR_NOACCESS,
3873 &spr_read_generic, &spr_write_generic,
3874 0x00000000);
3875 /* XXX : not implemented */
3876 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3877 SPR_NOACCESS, SPR_NOACCESS,
3878 &spr_read_generic, &spr_write_generic,
3879 0x00000000);
3880 /* XXX : not implemented */
3881 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
3882 SPR_NOACCESS, SPR_NOACCESS,
3883 &spr_read_generic, &spr_write_generic,
3884 0x00000000); /* TOFIX */
3885 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
3886 SPR_NOACCESS, SPR_NOACCESS,
3887 &spr_read_generic, &spr_write_generic,
3888 0x00000000);
3889 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
3890 SPR_NOACCESS, SPR_NOACCESS,
3891 &spr_read_generic, &spr_write_generic,
3892 0x00000000);
3893 #if !defined(CONFIG_USER_ONLY)
3894 env->nb_tlb = 64;
3895 env->nb_ways = 1;
3896 env->id_tlbs = 0;
3897 env->tlb_type = TLB_EMB;
3898 #endif
3899 init_excp_e200(env, 0xFFFF0000UL);
3900 env->dcache_line_size = 32;
3901 env->icache_line_size = 32;
3902 /* XXX: TODO: allocate internal IRQ controller */
3905 POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
3907 DeviceClass *dc = DEVICE_CLASS(oc);
3908 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3910 dc->desc = "e200 core";
3911 pcc->init_proc = init_proc_e200;
3912 pcc->check_pow = check_pow_hid0;
3914 * XXX: unimplemented instructions:
3915 * dcblc
3916 * dcbtlst
3917 * dcbtstls
3918 * icblc
3919 * icbtls
3920 * tlbivax
3921 * all SPE multiply-accumulate instructions
3923 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
3924 PPC_SPE | PPC_SPE_SINGLE |
3925 PPC_WRTEE | PPC_RFDI |
3926 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
3927 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3928 PPC_MEM_TLBSYNC | PPC_TLBIVAX |
3929 PPC_BOOKE;
3930 pcc->msr_mask = (1ull << MSR_UCLE) |
3931 (1ull << MSR_SPE) |
3932 (1ull << MSR_POW) |
3933 (1ull << MSR_CE) |
3934 (1ull << MSR_EE) |
3935 (1ull << MSR_PR) |
3936 (1ull << MSR_FP) |
3937 (1ull << MSR_ME) |
3938 (1ull << MSR_FE0) |
3939 (1ull << MSR_DWE) |
3940 (1ull << MSR_DE) |
3941 (1ull << MSR_FE1) |
3942 (1ull << MSR_IR) |
3943 (1ull << MSR_DR);
3944 pcc->mmu_model = POWERPC_MMU_BOOKE206;
3945 pcc->excp_model = POWERPC_EXCP_BOOKE;
3946 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3947 pcc->bfd_mach = bfd_mach_ppc_860;
3948 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
3949 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
3950 POWERPC_FLAG_BUS_CLK;
3953 static void init_proc_e300(CPUPPCState *env)
3955 register_ne_601_sprs(env);
3956 register_sdr1_sprs(env);
3957 register_603_sprs(env);
3958 /* Time base */
3959 register_tbl(env);
3960 /* hardware implementation registers */
3961 /* XXX : not implemented */
3962 spr_register(env, SPR_HID0, "HID0",
3963 SPR_NOACCESS, SPR_NOACCESS,
3964 &spr_read_generic, &spr_write_generic,
3965 0x00000000);
3966 /* XXX : not implemented */
3967 spr_register(env, SPR_HID1, "HID1",
3968 SPR_NOACCESS, SPR_NOACCESS,
3969 &spr_read_generic, &spr_write_generic,
3970 0x00000000);
3971 /* XXX : not implemented */
3972 spr_register(env, SPR_HID2, "HID2",
3973 SPR_NOACCESS, SPR_NOACCESS,
3974 &spr_read_generic, &spr_write_generic,
3975 0x00000000);
3976 /* Breakpoints */
3977 /* XXX : not implemented */
3978 spr_register(env, SPR_DABR, "DABR",
3979 SPR_NOACCESS, SPR_NOACCESS,
3980 &spr_read_generic, &spr_write_generic,
3981 0x00000000);
3982 /* XXX : not implemented */
3983 spr_register(env, SPR_DABR2, "DABR2",
3984 SPR_NOACCESS, SPR_NOACCESS,
3985 &spr_read_generic, &spr_write_generic,
3986 0x00000000);
3987 /* XXX : not implemented */
3988 spr_register(env, SPR_IABR2, "IABR2",
3989 SPR_NOACCESS, SPR_NOACCESS,
3990 &spr_read_generic, &spr_write_generic,
3991 0x00000000);
3992 /* XXX : not implemented */
3993 spr_register(env, SPR_IBCR, "IBCR",
3994 SPR_NOACCESS, SPR_NOACCESS,
3995 &spr_read_generic, &spr_write_generic,
3996 0x00000000);
3997 /* XXX : not implemented */
3998 spr_register(env, SPR_DBCR, "DBCR",
3999 SPR_NOACCESS, SPR_NOACCESS,
4000 &spr_read_generic, &spr_write_generic,
4001 0x00000000);
4002 /* Memory management */
4003 register_low_BATs(env);
4004 register_high_BATs(env);
4005 register_6xx_7xx_soft_tlb(env, 64, 2);
4006 init_excp_603(env);
4007 env->dcache_line_size = 32;
4008 env->icache_line_size = 32;
4009 /* Allocate hardware IRQ controller */
4010 ppc6xx_irq_init(env_archcpu(env));
4013 POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
4015 DeviceClass *dc = DEVICE_CLASS(oc);
4016 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4018 dc->desc = "e300 core";
4019 pcc->init_proc = init_proc_e300;
4020 pcc->check_pow = check_pow_hid0;
4021 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4022 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4023 PPC_FLOAT_STFIWX |
4024 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4025 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4026 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4027 PPC_SEGMENT | PPC_EXTERN;
4028 pcc->msr_mask = (1ull << MSR_POW) |
4029 (1ull << MSR_TGPR) |
4030 (1ull << MSR_ILE) |
4031 (1ull << MSR_EE) |
4032 (1ull << MSR_PR) |
4033 (1ull << MSR_FP) |
4034 (1ull << MSR_ME) |
4035 (1ull << MSR_FE0) |
4036 (1ull << MSR_SE) |
4037 (1ull << MSR_DE) |
4038 (1ull << MSR_FE1) |
4039 (1ull << MSR_AL) |
4040 (1ull << MSR_EP) |
4041 (1ull << MSR_IR) |
4042 (1ull << MSR_DR) |
4043 (1ull << MSR_RI) |
4044 (1ull << MSR_LE);
4045 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4046 pcc->excp_model = POWERPC_EXCP_603;
4047 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4048 pcc->bfd_mach = bfd_mach_ppc_603;
4049 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4050 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4053 enum fsl_e500_version {
4054 fsl_e500v1,
4055 fsl_e500v2,
4056 fsl_e500mc,
4057 fsl_e5500,
4058 fsl_e6500,
4061 static void init_proc_e500(CPUPPCState *env, int version)
4063 uint32_t tlbncfg[2];
4064 uint64_t ivor_mask;
4065 uint64_t ivpr_mask = 0xFFFF0000ULL;
4066 uint32_t l1cfg0 = 0x3800 /* 8 ways */
4067 | 0x0020; /* 32 kb */
4068 uint32_t l1cfg1 = 0x3800 /* 8 ways */
4069 | 0x0020; /* 32 kb */
4070 uint32_t mmucfg = 0;
4071 #if !defined(CONFIG_USER_ONLY)
4072 int i;
4073 #endif
4075 /* Time base */
4076 register_tbl(env);
4078 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
4079 * complain when accessing them.
4080 * register_BookE_sprs(env, 0x0000000F0000FD7FULL);
4082 switch (version) {
4083 case fsl_e500v1:
4084 case fsl_e500v2:
4085 default:
4086 ivor_mask = 0x0000000F0000FFFFULL;
4087 break;
4088 case fsl_e500mc:
4089 case fsl_e5500:
4090 ivor_mask = 0x000003FE0000FFFFULL;
4091 break;
4092 case fsl_e6500:
4093 ivor_mask = 0x000003FF0000FFFFULL;
4094 break;
4096 register_BookE_sprs(env, ivor_mask);
4097 register_usprg3_sprs(env);
4098 /* Processor identification */
4099 spr_register(env, SPR_BOOKE_PIR, "PIR",
4100 SPR_NOACCESS, SPR_NOACCESS,
4101 &spr_read_generic, &spr_write_pir,
4102 0x00000000);
4103 /* XXX : not implemented */
4104 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4105 &spr_read_spefscr, &spr_write_spefscr,
4106 &spr_read_spefscr, &spr_write_spefscr,
4107 0x00000000);
4108 #if !defined(CONFIG_USER_ONLY)
4109 /* Memory management */
4110 env->nb_pids = 3;
4111 env->nb_ways = 2;
4112 env->id_tlbs = 0;
4113 switch (version) {
4114 case fsl_e500v1:
4115 tlbncfg[0] = register_tlbncfg(2, 1, 1, 0, 256);
4116 tlbncfg[1] = register_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4117 break;
4118 case fsl_e500v2:
4119 tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
4120 tlbncfg[1] = register_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4121 break;
4122 case fsl_e500mc:
4123 case fsl_e5500:
4124 tlbncfg[0] = register_tlbncfg(4, 1, 1, 0, 512);
4125 tlbncfg[1] = register_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
4126 break;
4127 case fsl_e6500:
4128 mmucfg = 0x6510B45;
4129 env->nb_pids = 1;
4130 tlbncfg[0] = 0x08052400;
4131 tlbncfg[1] = 0x40028040;
4132 break;
4133 default:
4134 cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
4135 env->spr[SPR_PVR]);
4137 #endif
4138 /* Cache sizes */
4139 switch (version) {
4140 case fsl_e500v1:
4141 case fsl_e500v2:
4142 env->dcache_line_size = 32;
4143 env->icache_line_size = 32;
4144 break;
4145 case fsl_e500mc:
4146 case fsl_e5500:
4147 env->dcache_line_size = 64;
4148 env->icache_line_size = 64;
4149 l1cfg0 |= 0x1000000; /* 64 byte cache block size */
4150 l1cfg1 |= 0x1000000; /* 64 byte cache block size */
4151 break;
4152 case fsl_e6500:
4153 env->dcache_line_size = 32;
4154 env->icache_line_size = 32;
4155 l1cfg0 |= 0x0F83820;
4156 l1cfg1 |= 0x0B83820;
4157 break;
4158 default:
4159 cpu_abort(env_cpu(env), "Unknown CPU: " TARGET_FMT_lx "\n",
4160 env->spr[SPR_PVR]);
4162 register_BookE206_sprs(env, 0x000000DF, tlbncfg, mmucfg);
4163 /* XXX : not implemented */
4164 spr_register(env, SPR_HID0, "HID0",
4165 SPR_NOACCESS, SPR_NOACCESS,
4166 &spr_read_generic, &spr_write_generic,
4167 0x00000000);
4168 /* XXX : not implemented */
4169 spr_register(env, SPR_HID1, "HID1",
4170 SPR_NOACCESS, SPR_NOACCESS,
4171 &spr_read_generic, &spr_write_generic,
4172 0x00000000);
4173 /* XXX : not implemented */
4174 spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
4175 SPR_NOACCESS, SPR_NOACCESS,
4176 &spr_read_generic, &spr_write_generic,
4177 0x00000000);
4178 /* XXX : not implemented */
4179 spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
4180 SPR_NOACCESS, SPR_NOACCESS,
4181 &spr_read_generic, &spr_write_generic,
4182 0x00000000);
4183 /* XXX : not implemented */
4184 spr_register(env, SPR_Exxx_MCAR, "MCAR",
4185 SPR_NOACCESS, SPR_NOACCESS,
4186 &spr_read_generic, &spr_write_generic,
4187 0x00000000);
4188 /* XXX : not implemented */
4189 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4190 SPR_NOACCESS, SPR_NOACCESS,
4191 &spr_read_generic, &spr_write_generic,
4192 0x00000000);
4193 /* XXX : not implemented */
4194 spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
4195 SPR_NOACCESS, SPR_NOACCESS,
4196 &spr_read_generic, &spr_write_generic,
4197 0x00000000);
4198 /* XXX : not implemented */
4199 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4200 SPR_NOACCESS, SPR_NOACCESS,
4201 &spr_read_generic, &spr_write_generic,
4202 0x00000000);
4203 /* XXX : not implemented */
4204 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4205 &spr_read_generic, SPR_NOACCESS,
4206 &spr_read_generic, SPR_NOACCESS,
4207 l1cfg0);
4208 spr_register(env, SPR_Exxx_L1CFG1, "L1CFG1",
4209 &spr_read_generic, SPR_NOACCESS,
4210 &spr_read_generic, SPR_NOACCESS,
4211 l1cfg1);
4212 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4213 SPR_NOACCESS, SPR_NOACCESS,
4214 &spr_read_generic, &spr_write_e500_l1csr0,
4215 0x00000000);
4216 spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
4217 SPR_NOACCESS, SPR_NOACCESS,
4218 &spr_read_generic, &spr_write_e500_l1csr1,
4219 0x00000000);
4220 if (version != fsl_e500v1 && version != fsl_e500v2) {
4221 spr_register(env, SPR_Exxx_L2CSR0, "L2CSR0",
4222 SPR_NOACCESS, SPR_NOACCESS,
4223 &spr_read_generic, &spr_write_e500_l2csr0,
4224 0x00000000);
4226 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4227 SPR_NOACCESS, SPR_NOACCESS,
4228 &spr_read_generic, &spr_write_generic,
4229 0x00000000);
4230 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4231 SPR_NOACCESS, SPR_NOACCESS,
4232 &spr_read_generic, &spr_write_generic,
4233 0x00000000);
4234 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4235 SPR_NOACCESS, SPR_NOACCESS,
4236 &spr_read_generic, &spr_write_booke206_mmucsr0,
4237 0x00000000);
4238 spr_register(env, SPR_BOOKE_EPR, "EPR",
4239 SPR_NOACCESS, SPR_NOACCESS,
4240 &spr_read_generic, SPR_NOACCESS,
4241 0x00000000);
4242 /* XXX better abstract into Emb.xxx features */
4243 if ((version == fsl_e5500) || (version == fsl_e6500)) {
4244 spr_register(env, SPR_BOOKE_EPCR, "EPCR",
4245 SPR_NOACCESS, SPR_NOACCESS,
4246 &spr_read_generic, &spr_write_generic,
4247 0x00000000);
4248 spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
4249 SPR_NOACCESS, SPR_NOACCESS,
4250 &spr_read_mas73, &spr_write_mas73,
4251 0x00000000);
4252 ivpr_mask = (target_ulong)~0xFFFFULL;
4255 if (version == fsl_e6500) {
4256 /* Thread identification */
4257 spr_register(env, SPR_TIR, "TIR",
4258 SPR_NOACCESS, SPR_NOACCESS,
4259 &spr_read_generic, SPR_NOACCESS,
4260 0x00000000);
4261 spr_register(env, SPR_BOOKE_TLB0PS, "TLB0PS",
4262 SPR_NOACCESS, SPR_NOACCESS,
4263 &spr_read_generic, SPR_NOACCESS,
4264 0x00000004);
4265 spr_register(env, SPR_BOOKE_TLB1PS, "TLB1PS",
4266 SPR_NOACCESS, SPR_NOACCESS,
4267 &spr_read_generic, SPR_NOACCESS,
4268 0x7FFFFFFC);
4271 #if !defined(CONFIG_USER_ONLY)
4272 env->nb_tlb = 0;
4273 env->tlb_type = TLB_MAS;
4274 for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
4275 env->nb_tlb += booke206_tlb_size(env, i);
4277 #endif
4279 init_excp_e200(env, ivpr_mask);
4280 /* Allocate hardware IRQ controller */
4281 ppce500_irq_init(env_archcpu(env));
4284 static void init_proc_e500v1(CPUPPCState *env)
4286 init_proc_e500(env, fsl_e500v1);
4289 POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
4291 DeviceClass *dc = DEVICE_CLASS(oc);
4292 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4294 dc->desc = "e500v1 core";
4295 pcc->init_proc = init_proc_e500v1;
4296 pcc->check_pow = check_pow_hid0;
4297 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4298 PPC_SPE | PPC_SPE_SINGLE |
4299 PPC_WRTEE | PPC_RFDI |
4300 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4301 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4302 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4303 pcc->insns_flags2 = PPC2_BOOKE206;
4304 pcc->msr_mask = (1ull << MSR_UCLE) |
4305 (1ull << MSR_SPE) |
4306 (1ull << MSR_POW) |
4307 (1ull << MSR_CE) |
4308 (1ull << MSR_EE) |
4309 (1ull << MSR_PR) |
4310 (1ull << MSR_FP) |
4311 (1ull << MSR_ME) |
4312 (1ull << MSR_FE0) |
4313 (1ull << MSR_DWE) |
4314 (1ull << MSR_DE) |
4315 (1ull << MSR_FE1) |
4316 (1ull << MSR_IR) |
4317 (1ull << MSR_DR);
4318 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4319 pcc->excp_model = POWERPC_EXCP_BOOKE;
4320 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4321 pcc->bfd_mach = bfd_mach_ppc_860;
4322 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4323 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4324 POWERPC_FLAG_BUS_CLK;
4327 static void init_proc_e500v2(CPUPPCState *env)
4329 init_proc_e500(env, fsl_e500v2);
4332 POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
4334 DeviceClass *dc = DEVICE_CLASS(oc);
4335 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4337 dc->desc = "e500v2 core";
4338 pcc->init_proc = init_proc_e500v2;
4339 pcc->check_pow = check_pow_hid0;
4340 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4341 PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
4342 PPC_WRTEE | PPC_RFDI |
4343 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4344 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4345 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4346 pcc->insns_flags2 = PPC2_BOOKE206;
4347 pcc->msr_mask = (1ull << MSR_UCLE) |
4348 (1ull << MSR_SPE) |
4349 (1ull << MSR_POW) |
4350 (1ull << MSR_CE) |
4351 (1ull << MSR_EE) |
4352 (1ull << MSR_PR) |
4353 (1ull << MSR_FP) |
4354 (1ull << MSR_ME) |
4355 (1ull << MSR_FE0) |
4356 (1ull << MSR_DWE) |
4357 (1ull << MSR_DE) |
4358 (1ull << MSR_FE1) |
4359 (1ull << MSR_IR) |
4360 (1ull << MSR_DR);
4361 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4362 pcc->excp_model = POWERPC_EXCP_BOOKE;
4363 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4364 pcc->bfd_mach = bfd_mach_ppc_860;
4365 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4366 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4367 POWERPC_FLAG_BUS_CLK;
4370 static void init_proc_e500mc(CPUPPCState *env)
4372 init_proc_e500(env, fsl_e500mc);
4375 POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
4377 DeviceClass *dc = DEVICE_CLASS(oc);
4378 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4380 dc->desc = "e500mc core";
4381 pcc->init_proc = init_proc_e500mc;
4382 pcc->check_pow = check_pow_none;
4383 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
4384 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
4385 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4386 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4387 PPC_FLOAT | PPC_FLOAT_FRES |
4388 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
4389 PPC_FLOAT_STFIWX | PPC_WAIT |
4390 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4391 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
4392 pcc->msr_mask = (1ull << MSR_GS) |
4393 (1ull << MSR_UCLE) |
4394 (1ull << MSR_CE) |
4395 (1ull << MSR_EE) |
4396 (1ull << MSR_PR) |
4397 (1ull << MSR_FP) |
4398 (1ull << MSR_ME) |
4399 (1ull << MSR_FE0) |
4400 (1ull << MSR_DE) |
4401 (1ull << MSR_FE1) |
4402 (1ull << MSR_IR) |
4403 (1ull << MSR_DR) |
4404 (1ull << MSR_PX) |
4405 (1ull << MSR_RI);
4406 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4407 pcc->excp_model = POWERPC_EXCP_BOOKE;
4408 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4409 /* FIXME: figure out the correct flag for e500mc */
4410 pcc->bfd_mach = bfd_mach_ppc_e500;
4411 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
4412 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4415 #ifdef TARGET_PPC64
4416 static void init_proc_e5500(CPUPPCState *env)
4418 init_proc_e500(env, fsl_e5500);
4421 POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
4423 DeviceClass *dc = DEVICE_CLASS(oc);
4424 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4426 dc->desc = "e5500 core";
4427 pcc->init_proc = init_proc_e5500;
4428 pcc->check_pow = check_pow_none;
4429 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
4430 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
4431 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4432 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4433 PPC_FLOAT | PPC_FLOAT_FRES |
4434 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
4435 PPC_FLOAT_STFIWX | PPC_WAIT |
4436 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
4437 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
4438 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
4439 PPC2_FP_CVT_S64;
4440 pcc->msr_mask = (1ull << MSR_CM) |
4441 (1ull << MSR_GS) |
4442 (1ull << MSR_UCLE) |
4443 (1ull << MSR_CE) |
4444 (1ull << MSR_EE) |
4445 (1ull << MSR_PR) |
4446 (1ull << MSR_FP) |
4447 (1ull << MSR_ME) |
4448 (1ull << MSR_FE0) |
4449 (1ull << MSR_DE) |
4450 (1ull << MSR_FE1) |
4451 (1ull << MSR_IR) |
4452 (1ull << MSR_DR) |
4453 (1ull << MSR_PX) |
4454 (1ull << MSR_RI);
4455 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4456 pcc->excp_model = POWERPC_EXCP_BOOKE;
4457 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4458 /* FIXME: figure out the correct flag for e5500 */
4459 pcc->bfd_mach = bfd_mach_ppc_e500;
4460 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
4461 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4464 static void init_proc_e6500(CPUPPCState *env)
4466 init_proc_e500(env, fsl_e6500);
4469 POWERPC_FAMILY(e6500)(ObjectClass *oc, void *data)
4471 DeviceClass *dc = DEVICE_CLASS(oc);
4472 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4474 dc->desc = "e6500 core";
4475 pcc->init_proc = init_proc_e6500;
4476 pcc->check_pow = check_pow_none;
4477 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_MFTB |
4478 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
4479 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4480 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4481 PPC_FLOAT | PPC_FLOAT_FRES |
4482 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
4483 PPC_FLOAT_STFIWX | PPC_WAIT |
4484 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
4485 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD | PPC_ALTIVEC;
4486 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL | PPC2_PERM_ISA206 |
4487 PPC2_FP_CVT_S64 | PPC2_ATOMIC_ISA206;
4488 pcc->msr_mask = (1ull << MSR_CM) |
4489 (1ull << MSR_GS) |
4490 (1ull << MSR_UCLE) |
4491 (1ull << MSR_CE) |
4492 (1ull << MSR_EE) |
4493 (1ull << MSR_PR) |
4494 (1ull << MSR_FP) |
4495 (1ull << MSR_ME) |
4496 (1ull << MSR_FE0) |
4497 (1ull << MSR_DE) |
4498 (1ull << MSR_FE1) |
4499 (1ull << MSR_IS) |
4500 (1ull << MSR_DS) |
4501 (1ull << MSR_PX) |
4502 (1ull << MSR_RI) |
4503 (1ull << MSR_VR);
4504 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4505 pcc->excp_model = POWERPC_EXCP_BOOKE;
4506 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4507 pcc->bfd_mach = bfd_mach_ppc_e500;
4508 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
4509 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_VRE;
4512 #endif
4514 /* Non-embedded PowerPC */
4516 #define POWERPC_MSRR_601 (0x0000000000001040ULL)
4518 static void init_proc_601(CPUPPCState *env)
4520 register_ne_601_sprs(env);
4521 register_sdr1_sprs(env);
4522 register_601_sprs(env);
4523 /* Hardware implementation registers */
4524 /* XXX : not implemented */
4525 spr_register(env, SPR_HID0, "HID0",
4526 SPR_NOACCESS, SPR_NOACCESS,
4527 &spr_read_generic, &spr_write_hid0_601,
4528 0x80010080);
4529 /* XXX : not implemented */
4530 spr_register(env, SPR_HID1, "HID1",
4531 SPR_NOACCESS, SPR_NOACCESS,
4532 &spr_read_generic, &spr_write_generic,
4533 0x00000000);
4534 /* XXX : not implemented */
4535 spr_register(env, SPR_601_HID2, "HID2",
4536 SPR_NOACCESS, SPR_NOACCESS,
4537 &spr_read_generic, &spr_write_generic,
4538 0x00000000);
4539 /* XXX : not implemented */
4540 spr_register(env, SPR_601_HID5, "HID5",
4541 SPR_NOACCESS, SPR_NOACCESS,
4542 &spr_read_generic, &spr_write_generic,
4543 0x00000000);
4544 /* Memory management */
4545 init_excp_601(env);
4547 * XXX: beware that dcache line size is 64
4548 * but dcbz uses 32 bytes "sectors"
4549 * XXX: this breaks clcs instruction !
4551 env->dcache_line_size = 32;
4552 env->icache_line_size = 64;
4553 /* Allocate hardware IRQ controller */
4554 ppc6xx_irq_init(env_archcpu(env));
4557 POWERPC_FAMILY(601)(ObjectClass *oc, void *data)
4559 DeviceClass *dc = DEVICE_CLASS(oc);
4560 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4562 dc->desc = "PowerPC 601";
4563 pcc->init_proc = init_proc_601;
4564 pcc->check_pow = check_pow_none;
4565 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
4566 PPC_FLOAT |
4567 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4568 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
4569 PPC_SEGMENT | PPC_EXTERN;
4570 pcc->msr_mask = (1ull << MSR_EE) |
4571 (1ull << MSR_PR) |
4572 (1ull << MSR_FP) |
4573 (1ull << MSR_ME) |
4574 (1ull << MSR_FE0) |
4575 (1ull << MSR_SE) |
4576 (1ull << MSR_FE1) |
4577 (1ull << MSR_EP) |
4578 (1ull << MSR_IR) |
4579 (1ull << MSR_DR);
4580 pcc->mmu_model = POWERPC_MMU_601;
4581 #if defined(CONFIG_SOFTMMU)
4582 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
4583 #endif
4584 pcc->excp_model = POWERPC_EXCP_601;
4585 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4586 pcc->bfd_mach = bfd_mach_ppc_601;
4587 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_HID0_LE;
4590 #define POWERPC_MSRR_601v (0x0000000000001040ULL)
4592 static void init_proc_601v(CPUPPCState *env)
4594 init_proc_601(env);
4595 /* XXX : not implemented */
4596 spr_register(env, SPR_601_HID15, "HID15",
4597 SPR_NOACCESS, SPR_NOACCESS,
4598 &spr_read_generic, &spr_write_generic,
4599 0x00000000);
4602 POWERPC_FAMILY(601v)(ObjectClass *oc, void *data)
4604 DeviceClass *dc = DEVICE_CLASS(oc);
4605 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4607 dc->desc = "PowerPC 601v";
4608 pcc->init_proc = init_proc_601v;
4609 pcc->check_pow = check_pow_none;
4610 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
4611 PPC_FLOAT |
4612 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4613 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
4614 PPC_SEGMENT | PPC_EXTERN;
4615 pcc->msr_mask = (1ull << MSR_EE) |
4616 (1ull << MSR_PR) |
4617 (1ull << MSR_FP) |
4618 (1ull << MSR_ME) |
4619 (1ull << MSR_FE0) |
4620 (1ull << MSR_SE) |
4621 (1ull << MSR_FE1) |
4622 (1ull << MSR_EP) |
4623 (1ull << MSR_IR) |
4624 (1ull << MSR_DR);
4625 pcc->mmu_model = POWERPC_MMU_601;
4626 #if defined(CONFIG_SOFTMMU)
4627 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
4628 #endif
4629 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4630 pcc->bfd_mach = bfd_mach_ppc_601;
4631 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_HID0_LE;
4634 static void init_proc_602(CPUPPCState *env)
4636 register_ne_601_sprs(env);
4637 register_sdr1_sprs(env);
4638 register_602_sprs(env);
4639 /* Time base */
4640 register_tbl(env);
4641 /* hardware implementation registers */
4642 /* XXX : not implemented */
4643 spr_register(env, SPR_HID0, "HID0",
4644 SPR_NOACCESS, SPR_NOACCESS,
4645 &spr_read_generic, &spr_write_generic,
4646 0x00000000);
4647 /* XXX : not implemented */
4648 spr_register(env, SPR_HID1, "HID1",
4649 SPR_NOACCESS, SPR_NOACCESS,
4650 &spr_read_generic, &spr_write_generic,
4651 0x00000000);
4652 /* Memory management */
4653 register_low_BATs(env);
4654 register_6xx_7xx_soft_tlb(env, 64, 2);
4655 init_excp_602(env);
4656 env->dcache_line_size = 32;
4657 env->icache_line_size = 32;
4658 /* Allocate hardware IRQ controller */
4659 ppc6xx_irq_init(env_archcpu(env));
4662 POWERPC_FAMILY(602)(ObjectClass *oc, void *data)
4664 DeviceClass *dc = DEVICE_CLASS(oc);
4665 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4667 dc->desc = "PowerPC 602";
4668 pcc->init_proc = init_proc_602;
4669 pcc->check_pow = check_pow_hid0;
4670 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4671 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4672 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4673 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4674 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4675 PPC_MEM_TLBIE | PPC_6xx_TLB | PPC_MEM_TLBSYNC |
4676 PPC_SEGMENT | PPC_602_SPEC;
4677 pcc->msr_mask = (1ull << MSR_VSX) |
4678 (1ull << MSR_SA) |
4679 (1ull << MSR_POW) |
4680 (1ull << MSR_TGPR) |
4681 (1ull << MSR_ILE) |
4682 (1ull << MSR_EE) |
4683 (1ull << MSR_PR) |
4684 (1ull << MSR_FP) |
4685 (1ull << MSR_ME) |
4686 (1ull << MSR_FE0) |
4687 (1ull << MSR_SE) |
4688 (1ull << MSR_DE) |
4689 (1ull << MSR_FE1) |
4690 (1ull << MSR_EP) |
4691 (1ull << MSR_IR) |
4692 (1ull << MSR_DR) |
4693 (1ull << MSR_RI) |
4694 (1ull << MSR_LE);
4695 /* XXX: 602 MMU is quite specific. Should add a special case */
4696 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4697 pcc->excp_model = POWERPC_EXCP_602;
4698 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4699 pcc->bfd_mach = bfd_mach_ppc_602;
4700 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4701 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4704 static void init_proc_603(CPUPPCState *env)
4706 register_ne_601_sprs(env);
4707 register_sdr1_sprs(env);
4708 register_603_sprs(env);
4709 /* Time base */
4710 register_tbl(env);
4711 /* hardware implementation registers */
4712 /* XXX : not implemented */
4713 spr_register(env, SPR_HID0, "HID0",
4714 SPR_NOACCESS, SPR_NOACCESS,
4715 &spr_read_generic, &spr_write_generic,
4716 0x00000000);
4717 /* XXX : not implemented */
4718 spr_register(env, SPR_HID1, "HID1",
4719 SPR_NOACCESS, SPR_NOACCESS,
4720 &spr_read_generic, &spr_write_generic,
4721 0x00000000);
4722 /* Memory management */
4723 register_low_BATs(env);
4724 register_6xx_7xx_soft_tlb(env, 64, 2);
4725 init_excp_603(env);
4726 env->dcache_line_size = 32;
4727 env->icache_line_size = 32;
4728 /* Allocate hardware IRQ controller */
4729 ppc6xx_irq_init(env_archcpu(env));
4732 POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
4734 DeviceClass *dc = DEVICE_CLASS(oc);
4735 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4737 dc->desc = "PowerPC 603";
4738 pcc->init_proc = init_proc_603;
4739 pcc->check_pow = check_pow_hid0;
4740 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4741 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4742 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4743 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4744 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4745 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4746 PPC_SEGMENT | PPC_EXTERN;
4747 pcc->msr_mask = (1ull << MSR_POW) |
4748 (1ull << MSR_TGPR) |
4749 (1ull << MSR_ILE) |
4750 (1ull << MSR_EE) |
4751 (1ull << MSR_PR) |
4752 (1ull << MSR_FP) |
4753 (1ull << MSR_ME) |
4754 (1ull << MSR_FE0) |
4755 (1ull << MSR_SE) |
4756 (1ull << MSR_DE) |
4757 (1ull << MSR_FE1) |
4758 (1ull << MSR_EP) |
4759 (1ull << MSR_IR) |
4760 (1ull << MSR_DR) |
4761 (1ull << MSR_RI) |
4762 (1ull << MSR_LE);
4763 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4764 pcc->excp_model = POWERPC_EXCP_603;
4765 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4766 pcc->bfd_mach = bfd_mach_ppc_603;
4767 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4768 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4771 static void init_proc_603E(CPUPPCState *env)
4773 register_ne_601_sprs(env);
4774 register_sdr1_sprs(env);
4775 register_603_sprs(env);
4776 /* Time base */
4777 register_tbl(env);
4778 /* hardware implementation registers */
4779 /* XXX : not implemented */
4780 spr_register(env, SPR_HID0, "HID0",
4781 SPR_NOACCESS, SPR_NOACCESS,
4782 &spr_read_generic, &spr_write_generic,
4783 0x00000000);
4784 /* XXX : not implemented */
4785 spr_register(env, SPR_HID1, "HID1",
4786 SPR_NOACCESS, SPR_NOACCESS,
4787 &spr_read_generic, &spr_write_generic,
4788 0x00000000);
4789 /* Memory management */
4790 register_low_BATs(env);
4791 register_6xx_7xx_soft_tlb(env, 64, 2);
4792 init_excp_603(env);
4793 env->dcache_line_size = 32;
4794 env->icache_line_size = 32;
4795 /* Allocate hardware IRQ controller */
4796 ppc6xx_irq_init(env_archcpu(env));
4799 POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
4801 DeviceClass *dc = DEVICE_CLASS(oc);
4802 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4804 dc->desc = "PowerPC 603e";
4805 pcc->init_proc = init_proc_603E;
4806 pcc->check_pow = check_pow_hid0;
4807 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4808 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4809 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4810 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4811 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4812 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4813 PPC_SEGMENT | PPC_EXTERN;
4814 pcc->msr_mask = (1ull << MSR_POW) |
4815 (1ull << MSR_TGPR) |
4816 (1ull << MSR_ILE) |
4817 (1ull << MSR_EE) |
4818 (1ull << MSR_PR) |
4819 (1ull << MSR_FP) |
4820 (1ull << MSR_ME) |
4821 (1ull << MSR_FE0) |
4822 (1ull << MSR_SE) |
4823 (1ull << MSR_DE) |
4824 (1ull << MSR_FE1) |
4825 (1ull << MSR_EP) |
4826 (1ull << MSR_IR) |
4827 (1ull << MSR_DR) |
4828 (1ull << MSR_RI) |
4829 (1ull << MSR_LE);
4830 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4831 pcc->excp_model = POWERPC_EXCP_603E;
4832 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4833 pcc->bfd_mach = bfd_mach_ppc_ec603e;
4834 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4835 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4838 static void init_proc_604(CPUPPCState *env)
4840 register_ne_601_sprs(env);
4841 register_sdr1_sprs(env);
4842 register_604_sprs(env);
4843 /* Time base */
4844 register_tbl(env);
4845 /* Hardware implementation registers */
4846 /* XXX : not implemented */
4847 spr_register(env, SPR_HID0, "HID0",
4848 SPR_NOACCESS, SPR_NOACCESS,
4849 &spr_read_generic, &spr_write_generic,
4850 0x00000000);
4851 /* Memory management */
4852 register_low_BATs(env);
4853 init_excp_604(env);
4854 env->dcache_line_size = 32;
4855 env->icache_line_size = 32;
4856 /* Allocate hardware IRQ controller */
4857 ppc6xx_irq_init(env_archcpu(env));
4860 POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
4862 DeviceClass *dc = DEVICE_CLASS(oc);
4863 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4865 dc->desc = "PowerPC 604";
4866 pcc->init_proc = init_proc_604;
4867 pcc->check_pow = check_pow_nocheck;
4868 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4869 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4870 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4871 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4872 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4873 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4874 PPC_SEGMENT | PPC_EXTERN;
4875 pcc->msr_mask = (1ull << MSR_POW) |
4876 (1ull << MSR_ILE) |
4877 (1ull << MSR_EE) |
4878 (1ull << MSR_PR) |
4879 (1ull << MSR_FP) |
4880 (1ull << MSR_ME) |
4881 (1ull << MSR_FE0) |
4882 (1ull << MSR_SE) |
4883 (1ull << MSR_DE) |
4884 (1ull << MSR_FE1) |
4885 (1ull << MSR_EP) |
4886 (1ull << MSR_IR) |
4887 (1ull << MSR_DR) |
4888 (1ull << MSR_PMM) |
4889 (1ull << MSR_RI) |
4890 (1ull << MSR_LE);
4891 pcc->mmu_model = POWERPC_MMU_32B;
4892 #if defined(CONFIG_SOFTMMU)
4893 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
4894 #endif
4895 pcc->excp_model = POWERPC_EXCP_604;
4896 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4897 pcc->bfd_mach = bfd_mach_ppc_604;
4898 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4899 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4902 static void init_proc_604E(CPUPPCState *env)
4904 register_ne_601_sprs(env);
4905 register_sdr1_sprs(env);
4906 register_604_sprs(env);
4907 /* XXX : not implemented */
4908 spr_register(env, SPR_7XX_MMCR1, "MMCR1",
4909 SPR_NOACCESS, SPR_NOACCESS,
4910 &spr_read_generic, &spr_write_generic,
4911 0x00000000);
4912 /* XXX : not implemented */
4913 spr_register(env, SPR_7XX_PMC3, "PMC3",
4914 SPR_NOACCESS, SPR_NOACCESS,
4915 &spr_read_generic, &spr_write_generic,
4916 0x00000000);
4917 /* XXX : not implemented */
4918 spr_register(env, SPR_7XX_PMC4, "PMC4",
4919 SPR_NOACCESS, SPR_NOACCESS,
4920 &spr_read_generic, &spr_write_generic,
4921 0x00000000);
4922 /* Time base */
4923 register_tbl(env);
4924 /* Hardware implementation registers */
4925 /* XXX : not implemented */
4926 spr_register(env, SPR_HID0, "HID0",
4927 SPR_NOACCESS, SPR_NOACCESS,
4928 &spr_read_generic, &spr_write_generic,
4929 0x00000000);
4930 /* XXX : not implemented */
4931 spr_register(env, SPR_HID1, "HID1",
4932 SPR_NOACCESS, SPR_NOACCESS,
4933 &spr_read_generic, &spr_write_generic,
4934 0x00000000);
4935 /* Memory management */
4936 register_low_BATs(env);
4937 init_excp_604(env);
4938 env->dcache_line_size = 32;
4939 env->icache_line_size = 32;
4940 /* Allocate hardware IRQ controller */
4941 ppc6xx_irq_init(env_archcpu(env));
4944 POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
4946 DeviceClass *dc = DEVICE_CLASS(oc);
4947 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4949 dc->desc = "PowerPC 604E";
4950 pcc->init_proc = init_proc_604E;
4951 pcc->check_pow = check_pow_nocheck;
4952 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4953 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4954 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
4955 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4956 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4957 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
4958 PPC_SEGMENT | PPC_EXTERN;
4959 pcc->msr_mask = (1ull << MSR_POW) |
4960 (1ull << MSR_ILE) |
4961 (1ull << MSR_EE) |
4962 (1ull << MSR_PR) |
4963 (1ull << MSR_FP) |
4964 (1ull << MSR_ME) |
4965 (1ull << MSR_FE0) |
4966 (1ull << MSR_SE) |
4967 (1ull << MSR_DE) |
4968 (1ull << MSR_FE1) |
4969 (1ull << MSR_EP) |
4970 (1ull << MSR_IR) |
4971 (1ull << MSR_DR) |
4972 (1ull << MSR_PMM) |
4973 (1ull << MSR_RI) |
4974 (1ull << MSR_LE);
4975 pcc->mmu_model = POWERPC_MMU_32B;
4976 #if defined(CONFIG_SOFTMMU)
4977 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
4978 #endif
4979 pcc->excp_model = POWERPC_EXCP_604;
4980 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4981 pcc->bfd_mach = bfd_mach_ppc_604;
4982 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4983 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4986 static void init_proc_740(CPUPPCState *env)
4988 register_ne_601_sprs(env);
4989 register_sdr1_sprs(env);
4990 register_7xx_sprs(env);
4991 /* Time base */
4992 register_tbl(env);
4993 /* Thermal management */
4994 register_thrm_sprs(env);
4995 /* Hardware implementation registers */
4996 /* XXX : not implemented */
4997 spr_register(env, SPR_HID0, "HID0",
4998 SPR_NOACCESS, SPR_NOACCESS,
4999 &spr_read_generic, &spr_write_generic,
5000 0x00000000);
5001 /* XXX : not implemented */
5002 spr_register(env, SPR_HID1, "HID1",
5003 SPR_NOACCESS, SPR_NOACCESS,
5004 &spr_read_generic, &spr_write_generic,
5005 0x00000000);
5006 /* Memory management */
5007 register_low_BATs(env);
5008 init_excp_7x0(env);
5009 env->dcache_line_size = 32;
5010 env->icache_line_size = 32;
5011 /* Allocate hardware IRQ controller */
5012 ppc6xx_irq_init(env_archcpu(env));
5015 POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
5017 DeviceClass *dc = DEVICE_CLASS(oc);
5018 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5020 dc->desc = "PowerPC 740";
5021 pcc->init_proc = init_proc_740;
5022 pcc->check_pow = check_pow_hid0;
5023 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5024 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5025 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5026 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5027 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5028 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5029 PPC_SEGMENT | PPC_EXTERN;
5030 pcc->msr_mask = (1ull << MSR_POW) |
5031 (1ull << MSR_ILE) |
5032 (1ull << MSR_EE) |
5033 (1ull << MSR_PR) |
5034 (1ull << MSR_FP) |
5035 (1ull << MSR_ME) |
5036 (1ull << MSR_FE0) |
5037 (1ull << MSR_SE) |
5038 (1ull << MSR_DE) |
5039 (1ull << MSR_FE1) |
5040 (1ull << MSR_EP) |
5041 (1ull << MSR_IR) |
5042 (1ull << MSR_DR) |
5043 (1ull << MSR_PMM) |
5044 (1ull << MSR_RI) |
5045 (1ull << MSR_LE);
5046 pcc->mmu_model = POWERPC_MMU_32B;
5047 #if defined(CONFIG_SOFTMMU)
5048 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5049 #endif
5050 pcc->excp_model = POWERPC_EXCP_7x0;
5051 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5052 pcc->bfd_mach = bfd_mach_ppc_750;
5053 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5054 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5057 static void init_proc_750(CPUPPCState *env)
5059 register_ne_601_sprs(env);
5060 register_sdr1_sprs(env);
5061 register_7xx_sprs(env);
5062 /* XXX : not implemented */
5063 spr_register(env, SPR_L2CR, "L2CR",
5064 SPR_NOACCESS, SPR_NOACCESS,
5065 &spr_read_generic, spr_access_nop,
5066 0x00000000);
5067 /* Time base */
5068 register_tbl(env);
5069 /* Thermal management */
5070 register_thrm_sprs(env);
5071 /* Hardware implementation registers */
5072 /* XXX : not implemented */
5073 spr_register(env, SPR_HID0, "HID0",
5074 SPR_NOACCESS, SPR_NOACCESS,
5075 &spr_read_generic, &spr_write_generic,
5076 0x00000000);
5077 /* XXX : not implemented */
5078 spr_register(env, SPR_HID1, "HID1",
5079 SPR_NOACCESS, SPR_NOACCESS,
5080 &spr_read_generic, &spr_write_generic,
5081 0x00000000);
5082 /* Memory management */
5083 register_low_BATs(env);
5085 * XXX: high BATs are also present but are known to be bugged on
5086 * die version 1.x
5088 init_excp_7x0(env);
5089 env->dcache_line_size = 32;
5090 env->icache_line_size = 32;
5091 /* Allocate hardware IRQ controller */
5092 ppc6xx_irq_init(env_archcpu(env));
5095 POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
5097 DeviceClass *dc = DEVICE_CLASS(oc);
5098 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5100 dc->desc = "PowerPC 750";
5101 pcc->init_proc = init_proc_750;
5102 pcc->check_pow = check_pow_hid0;
5103 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5104 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5105 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5106 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5107 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5108 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5109 PPC_SEGMENT | PPC_EXTERN;
5110 pcc->msr_mask = (1ull << MSR_POW) |
5111 (1ull << MSR_ILE) |
5112 (1ull << MSR_EE) |
5113 (1ull << MSR_PR) |
5114 (1ull << MSR_FP) |
5115 (1ull << MSR_ME) |
5116 (1ull << MSR_FE0) |
5117 (1ull << MSR_SE) |
5118 (1ull << MSR_DE) |
5119 (1ull << MSR_FE1) |
5120 (1ull << MSR_EP) |
5121 (1ull << MSR_IR) |
5122 (1ull << MSR_DR) |
5123 (1ull << MSR_PMM) |
5124 (1ull << MSR_RI) |
5125 (1ull << MSR_LE);
5126 pcc->mmu_model = POWERPC_MMU_32B;
5127 #if defined(CONFIG_SOFTMMU)
5128 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5129 #endif
5130 pcc->excp_model = POWERPC_EXCP_7x0;
5131 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5132 pcc->bfd_mach = bfd_mach_ppc_750;
5133 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5134 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5137 static void init_proc_750cl(CPUPPCState *env)
5139 register_ne_601_sprs(env);
5140 register_sdr1_sprs(env);
5141 register_7xx_sprs(env);
5142 /* XXX : not implemented */
5143 spr_register(env, SPR_L2CR, "L2CR",
5144 SPR_NOACCESS, SPR_NOACCESS,
5145 &spr_read_generic, spr_access_nop,
5146 0x00000000);
5147 /* Time base */
5148 register_tbl(env);
5149 /* Thermal management */
5150 /* Those registers are fake on 750CL */
5151 spr_register(env, SPR_THRM1, "THRM1",
5152 SPR_NOACCESS, SPR_NOACCESS,
5153 &spr_read_generic, &spr_write_generic,
5154 0x00000000);
5155 spr_register(env, SPR_THRM2, "THRM2",
5156 SPR_NOACCESS, SPR_NOACCESS,
5157 &spr_read_generic, &spr_write_generic,
5158 0x00000000);
5159 spr_register(env, SPR_THRM3, "THRM3",
5160 SPR_NOACCESS, SPR_NOACCESS,
5161 &spr_read_generic, &spr_write_generic,
5162 0x00000000);
5163 /* XXX: not implemented */
5164 spr_register(env, SPR_750_TDCL, "TDCL",
5165 SPR_NOACCESS, SPR_NOACCESS,
5166 &spr_read_generic, &spr_write_generic,
5167 0x00000000);
5168 spr_register(env, SPR_750_TDCH, "TDCH",
5169 SPR_NOACCESS, SPR_NOACCESS,
5170 &spr_read_generic, &spr_write_generic,
5171 0x00000000);
5172 /* DMA */
5173 /* XXX : not implemented */
5174 spr_register(env, SPR_750_WPAR, "WPAR",
5175 SPR_NOACCESS, SPR_NOACCESS,
5176 &spr_read_generic, &spr_write_generic,
5177 0x00000000);
5178 spr_register(env, SPR_750_DMAL, "DMAL",
5179 SPR_NOACCESS, SPR_NOACCESS,
5180 &spr_read_generic, &spr_write_generic,
5181 0x00000000);
5182 spr_register(env, SPR_750_DMAU, "DMAU",
5183 SPR_NOACCESS, SPR_NOACCESS,
5184 &spr_read_generic, &spr_write_generic,
5185 0x00000000);
5186 /* Hardware implementation registers */
5187 /* XXX : not implemented */
5188 spr_register(env, SPR_HID0, "HID0",
5189 SPR_NOACCESS, SPR_NOACCESS,
5190 &spr_read_generic, &spr_write_generic,
5191 0x00000000);
5192 /* XXX : not implemented */
5193 spr_register(env, SPR_HID1, "HID1",
5194 SPR_NOACCESS, SPR_NOACCESS,
5195 &spr_read_generic, &spr_write_generic,
5196 0x00000000);
5197 /* XXX : not implemented */
5198 spr_register(env, SPR_750CL_HID2, "HID2",
5199 SPR_NOACCESS, SPR_NOACCESS,
5200 &spr_read_generic, &spr_write_generic,
5201 0x00000000);
5202 /* XXX : not implemented */
5203 spr_register(env, SPR_750CL_HID4, "HID4",
5204 SPR_NOACCESS, SPR_NOACCESS,
5205 &spr_read_generic, &spr_write_generic,
5206 0x00000000);
5207 /* Quantization registers */
5208 /* XXX : not implemented */
5209 spr_register(env, SPR_750_GQR0, "GQR0",
5210 SPR_NOACCESS, SPR_NOACCESS,
5211 &spr_read_generic, &spr_write_generic,
5212 0x00000000);
5213 /* XXX : not implemented */
5214 spr_register(env, SPR_750_GQR1, "GQR1",
5215 SPR_NOACCESS, SPR_NOACCESS,
5216 &spr_read_generic, &spr_write_generic,
5217 0x00000000);
5218 /* XXX : not implemented */
5219 spr_register(env, SPR_750_GQR2, "GQR2",
5220 SPR_NOACCESS, SPR_NOACCESS,
5221 &spr_read_generic, &spr_write_generic,
5222 0x00000000);
5223 /* XXX : not implemented */
5224 spr_register(env, SPR_750_GQR3, "GQR3",
5225 SPR_NOACCESS, SPR_NOACCESS,
5226 &spr_read_generic, &spr_write_generic,
5227 0x00000000);
5228 /* XXX : not implemented */
5229 spr_register(env, SPR_750_GQR4, "GQR4",
5230 SPR_NOACCESS, SPR_NOACCESS,
5231 &spr_read_generic, &spr_write_generic,
5232 0x00000000);
5233 /* XXX : not implemented */
5234 spr_register(env, SPR_750_GQR5, "GQR5",
5235 SPR_NOACCESS, SPR_NOACCESS,
5236 &spr_read_generic, &spr_write_generic,
5237 0x00000000);
5238 /* XXX : not implemented */
5239 spr_register(env, SPR_750_GQR6, "GQR6",
5240 SPR_NOACCESS, SPR_NOACCESS,
5241 &spr_read_generic, &spr_write_generic,
5242 0x00000000);
5243 /* XXX : not implemented */
5244 spr_register(env, SPR_750_GQR7, "GQR7",
5245 SPR_NOACCESS, SPR_NOACCESS,
5246 &spr_read_generic, &spr_write_generic,
5247 0x00000000);
5248 /* Memory management */
5249 register_low_BATs(env);
5250 /* PowerPC 750cl has 8 DBATs and 8 IBATs */
5251 register_high_BATs(env);
5252 init_excp_750cl(env);
5253 env->dcache_line_size = 32;
5254 env->icache_line_size = 32;
5255 /* Allocate hardware IRQ controller */
5256 ppc6xx_irq_init(env_archcpu(env));
5259 POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
5261 DeviceClass *dc = DEVICE_CLASS(oc);
5262 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5264 dc->desc = "PowerPC 750 CL";
5265 pcc->init_proc = init_proc_750cl;
5266 pcc->check_pow = check_pow_hid0;
5268 * XXX: not implemented:
5269 * cache lock instructions:
5270 * dcbz_l
5271 * floating point paired instructions
5272 * psq_lux
5273 * psq_lx
5274 * psq_stux
5275 * psq_stx
5276 * ps_abs
5277 * ps_add
5278 * ps_cmpo0
5279 * ps_cmpo1
5280 * ps_cmpu0
5281 * ps_cmpu1
5282 * ps_div
5283 * ps_madd
5284 * ps_madds0
5285 * ps_madds1
5286 * ps_merge00
5287 * ps_merge01
5288 * ps_merge10
5289 * ps_merge11
5290 * ps_mr
5291 * ps_msub
5292 * ps_mul
5293 * ps_muls0
5294 * ps_muls1
5295 * ps_nabs
5296 * ps_neg
5297 * ps_nmadd
5298 * ps_nmsub
5299 * ps_res
5300 * ps_rsqrte
5301 * ps_sel
5302 * ps_sub
5303 * ps_sum0
5304 * ps_sum1
5306 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5307 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5308 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5309 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5310 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5311 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5312 PPC_SEGMENT | PPC_EXTERN;
5313 pcc->msr_mask = (1ull << MSR_POW) |
5314 (1ull << MSR_ILE) |
5315 (1ull << MSR_EE) |
5316 (1ull << MSR_PR) |
5317 (1ull << MSR_FP) |
5318 (1ull << MSR_ME) |
5319 (1ull << MSR_FE0) |
5320 (1ull << MSR_SE) |
5321 (1ull << MSR_DE) |
5322 (1ull << MSR_FE1) |
5323 (1ull << MSR_EP) |
5324 (1ull << MSR_IR) |
5325 (1ull << MSR_DR) |
5326 (1ull << MSR_PMM) |
5327 (1ull << MSR_RI) |
5328 (1ull << MSR_LE);
5329 pcc->mmu_model = POWERPC_MMU_32B;
5330 #if defined(CONFIG_SOFTMMU)
5331 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5332 #endif
5333 pcc->excp_model = POWERPC_EXCP_7x0;
5334 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5335 pcc->bfd_mach = bfd_mach_ppc_750;
5336 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5337 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5340 static void init_proc_750cx(CPUPPCState *env)
5342 register_ne_601_sprs(env);
5343 register_sdr1_sprs(env);
5344 register_7xx_sprs(env);
5345 /* XXX : not implemented */
5346 spr_register(env, SPR_L2CR, "L2CR",
5347 SPR_NOACCESS, SPR_NOACCESS,
5348 &spr_read_generic, spr_access_nop,
5349 0x00000000);
5350 /* Time base */
5351 register_tbl(env);
5352 /* Thermal management */
5353 register_thrm_sprs(env);
5354 /* This register is not implemented but is present for compatibility */
5355 spr_register(env, SPR_SDA, "SDA",
5356 SPR_NOACCESS, SPR_NOACCESS,
5357 &spr_read_generic, &spr_write_generic,
5358 0x00000000);
5359 /* Hardware implementation registers */
5360 /* XXX : not implemented */
5361 spr_register(env, SPR_HID0, "HID0",
5362 SPR_NOACCESS, SPR_NOACCESS,
5363 &spr_read_generic, &spr_write_generic,
5364 0x00000000);
5365 /* XXX : not implemented */
5366 spr_register(env, SPR_HID1, "HID1",
5367 SPR_NOACCESS, SPR_NOACCESS,
5368 &spr_read_generic, &spr_write_generic,
5369 0x00000000);
5370 /* Memory management */
5371 register_low_BATs(env);
5372 /* PowerPC 750cx has 8 DBATs and 8 IBATs */
5373 register_high_BATs(env);
5374 init_excp_750cx(env);
5375 env->dcache_line_size = 32;
5376 env->icache_line_size = 32;
5377 /* Allocate hardware IRQ controller */
5378 ppc6xx_irq_init(env_archcpu(env));
5381 POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
5383 DeviceClass *dc = DEVICE_CLASS(oc);
5384 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5386 dc->desc = "PowerPC 750CX";
5387 pcc->init_proc = init_proc_750cx;
5388 pcc->check_pow = check_pow_hid0;
5389 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5390 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5391 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5392 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5393 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5394 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5395 PPC_SEGMENT | PPC_EXTERN;
5396 pcc->msr_mask = (1ull << MSR_POW) |
5397 (1ull << MSR_ILE) |
5398 (1ull << MSR_EE) |
5399 (1ull << MSR_PR) |
5400 (1ull << MSR_FP) |
5401 (1ull << MSR_ME) |
5402 (1ull << MSR_FE0) |
5403 (1ull << MSR_SE) |
5404 (1ull << MSR_DE) |
5405 (1ull << MSR_FE1) |
5406 (1ull << MSR_EP) |
5407 (1ull << MSR_IR) |
5408 (1ull << MSR_DR) |
5409 (1ull << MSR_PMM) |
5410 (1ull << MSR_RI) |
5411 (1ull << MSR_LE);
5412 pcc->mmu_model = POWERPC_MMU_32B;
5413 #if defined(CONFIG_SOFTMMU)
5414 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5415 #endif
5416 pcc->excp_model = POWERPC_EXCP_7x0;
5417 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5418 pcc->bfd_mach = bfd_mach_ppc_750;
5419 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5420 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5423 static void init_proc_750fx(CPUPPCState *env)
5425 register_ne_601_sprs(env);
5426 register_sdr1_sprs(env);
5427 register_7xx_sprs(env);
5428 /* XXX : not implemented */
5429 spr_register(env, SPR_L2CR, "L2CR",
5430 SPR_NOACCESS, SPR_NOACCESS,
5431 &spr_read_generic, spr_access_nop,
5432 0x00000000);
5433 /* Time base */
5434 register_tbl(env);
5435 /* Thermal management */
5436 register_thrm_sprs(env);
5437 /* XXX : not implemented */
5438 spr_register(env, SPR_750_THRM4, "THRM4",
5439 SPR_NOACCESS, SPR_NOACCESS,
5440 &spr_read_generic, &spr_write_generic,
5441 0x00000000);
5442 /* Hardware implementation registers */
5443 /* XXX : not implemented */
5444 spr_register(env, SPR_HID0, "HID0",
5445 SPR_NOACCESS, SPR_NOACCESS,
5446 &spr_read_generic, &spr_write_generic,
5447 0x00000000);
5448 /* XXX : not implemented */
5449 spr_register(env, SPR_HID1, "HID1",
5450 SPR_NOACCESS, SPR_NOACCESS,
5451 &spr_read_generic, &spr_write_generic,
5452 0x00000000);
5453 /* XXX : not implemented */
5454 spr_register(env, SPR_750FX_HID2, "HID2",
5455 SPR_NOACCESS, SPR_NOACCESS,
5456 &spr_read_generic, &spr_write_generic,
5457 0x00000000);
5458 /* Memory management */
5459 register_low_BATs(env);
5460 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5461 register_high_BATs(env);
5462 init_excp_7x0(env);
5463 env->dcache_line_size = 32;
5464 env->icache_line_size = 32;
5465 /* Allocate hardware IRQ controller */
5466 ppc6xx_irq_init(env_archcpu(env));
5469 POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
5471 DeviceClass *dc = DEVICE_CLASS(oc);
5472 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5474 dc->desc = "PowerPC 750FX";
5475 pcc->init_proc = init_proc_750fx;
5476 pcc->check_pow = check_pow_hid0;
5477 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5478 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5479 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5480 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5481 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5482 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5483 PPC_SEGMENT | PPC_EXTERN;
5484 pcc->msr_mask = (1ull << MSR_POW) |
5485 (1ull << MSR_ILE) |
5486 (1ull << MSR_EE) |
5487 (1ull << MSR_PR) |
5488 (1ull << MSR_FP) |
5489 (1ull << MSR_ME) |
5490 (1ull << MSR_FE0) |
5491 (1ull << MSR_SE) |
5492 (1ull << MSR_DE) |
5493 (1ull << MSR_FE1) |
5494 (1ull << MSR_EP) |
5495 (1ull << MSR_IR) |
5496 (1ull << MSR_DR) |
5497 (1ull << MSR_PMM) |
5498 (1ull << MSR_RI) |
5499 (1ull << MSR_LE);
5500 pcc->mmu_model = POWERPC_MMU_32B;
5501 #if defined(CONFIG_SOFTMMU)
5502 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5503 #endif
5504 pcc->excp_model = POWERPC_EXCP_7x0;
5505 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5506 pcc->bfd_mach = bfd_mach_ppc_750;
5507 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5508 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5511 static void init_proc_750gx(CPUPPCState *env)
5513 register_ne_601_sprs(env);
5514 register_sdr1_sprs(env);
5515 register_7xx_sprs(env);
5516 /* XXX : not implemented (XXX: different from 750fx) */
5517 spr_register(env, SPR_L2CR, "L2CR",
5518 SPR_NOACCESS, SPR_NOACCESS,
5519 &spr_read_generic, spr_access_nop,
5520 0x00000000);
5521 /* Time base */
5522 register_tbl(env);
5523 /* Thermal management */
5524 register_thrm_sprs(env);
5525 /* XXX : not implemented */
5526 spr_register(env, SPR_750_THRM4, "THRM4",
5527 SPR_NOACCESS, SPR_NOACCESS,
5528 &spr_read_generic, &spr_write_generic,
5529 0x00000000);
5530 /* Hardware implementation registers */
5531 /* XXX : not implemented (XXX: different from 750fx) */
5532 spr_register(env, SPR_HID0, "HID0",
5533 SPR_NOACCESS, SPR_NOACCESS,
5534 &spr_read_generic, &spr_write_generic,
5535 0x00000000);
5536 /* XXX : not implemented */
5537 spr_register(env, SPR_HID1, "HID1",
5538 SPR_NOACCESS, SPR_NOACCESS,
5539 &spr_read_generic, &spr_write_generic,
5540 0x00000000);
5541 /* XXX : not implemented (XXX: different from 750fx) */
5542 spr_register(env, SPR_750FX_HID2, "HID2",
5543 SPR_NOACCESS, SPR_NOACCESS,
5544 &spr_read_generic, &spr_write_generic,
5545 0x00000000);
5546 /* Memory management */
5547 register_low_BATs(env);
5548 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5549 register_high_BATs(env);
5550 init_excp_7x0(env);
5551 env->dcache_line_size = 32;
5552 env->icache_line_size = 32;
5553 /* Allocate hardware IRQ controller */
5554 ppc6xx_irq_init(env_archcpu(env));
5557 POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
5559 DeviceClass *dc = DEVICE_CLASS(oc);
5560 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5562 dc->desc = "PowerPC 750GX";
5563 pcc->init_proc = init_proc_750gx;
5564 pcc->check_pow = check_pow_hid0;
5565 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5566 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5567 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5568 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5569 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5570 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5571 PPC_SEGMENT | PPC_EXTERN;
5572 pcc->msr_mask = (1ull << MSR_POW) |
5573 (1ull << MSR_ILE) |
5574 (1ull << MSR_EE) |
5575 (1ull << MSR_PR) |
5576 (1ull << MSR_FP) |
5577 (1ull << MSR_ME) |
5578 (1ull << MSR_FE0) |
5579 (1ull << MSR_SE) |
5580 (1ull << MSR_DE) |
5581 (1ull << MSR_FE1) |
5582 (1ull << MSR_EP) |
5583 (1ull << MSR_IR) |
5584 (1ull << MSR_DR) |
5585 (1ull << MSR_PMM) |
5586 (1ull << MSR_RI) |
5587 (1ull << MSR_LE);
5588 pcc->mmu_model = POWERPC_MMU_32B;
5589 #if defined(CONFIG_SOFTMMU)
5590 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5591 #endif
5592 pcc->excp_model = POWERPC_EXCP_7x0;
5593 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5594 pcc->bfd_mach = bfd_mach_ppc_750;
5595 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5596 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5599 static void init_proc_745(CPUPPCState *env)
5601 register_ne_601_sprs(env);
5602 register_sdr1_sprs(env);
5603 register_7xx_sprs(env);
5604 register_G2_755_sprs(env);
5605 /* Time base */
5606 register_tbl(env);
5607 /* Thermal management */
5608 register_thrm_sprs(env);
5609 /* Hardware implementation registers */
5610 /* XXX : not implemented */
5611 spr_register(env, SPR_HID0, "HID0",
5612 SPR_NOACCESS, SPR_NOACCESS,
5613 &spr_read_generic, &spr_write_generic,
5614 0x00000000);
5615 /* XXX : not implemented */
5616 spr_register(env, SPR_HID1, "HID1",
5617 SPR_NOACCESS, SPR_NOACCESS,
5618 &spr_read_generic, &spr_write_generic,
5619 0x00000000);
5620 /* XXX : not implemented */
5621 spr_register(env, SPR_HID2, "HID2",
5622 SPR_NOACCESS, SPR_NOACCESS,
5623 &spr_read_generic, &spr_write_generic,
5624 0x00000000);
5625 /* Memory management */
5626 register_low_BATs(env);
5627 register_high_BATs(env);
5628 register_6xx_7xx_soft_tlb(env, 64, 2);
5629 init_excp_7x5(env);
5630 env->dcache_line_size = 32;
5631 env->icache_line_size = 32;
5632 /* Allocate hardware IRQ controller */
5633 ppc6xx_irq_init(env_archcpu(env));
5636 POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
5638 DeviceClass *dc = DEVICE_CLASS(oc);
5639 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5641 dc->desc = "PowerPC 745";
5642 pcc->init_proc = init_proc_745;
5643 pcc->check_pow = check_pow_hid0;
5644 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5645 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5646 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5647 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5648 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5649 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5650 PPC_SEGMENT | PPC_EXTERN;
5651 pcc->msr_mask = (1ull << MSR_POW) |
5652 (1ull << MSR_ILE) |
5653 (1ull << MSR_EE) |
5654 (1ull << MSR_PR) |
5655 (1ull << MSR_FP) |
5656 (1ull << MSR_ME) |
5657 (1ull << MSR_FE0) |
5658 (1ull << MSR_SE) |
5659 (1ull << MSR_DE) |
5660 (1ull << MSR_FE1) |
5661 (1ull << MSR_EP) |
5662 (1ull << MSR_IR) |
5663 (1ull << MSR_DR) |
5664 (1ull << MSR_PMM) |
5665 (1ull << MSR_RI) |
5666 (1ull << MSR_LE);
5667 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5668 pcc->excp_model = POWERPC_EXCP_7x5;
5669 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5670 pcc->bfd_mach = bfd_mach_ppc_750;
5671 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5672 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5675 static void init_proc_755(CPUPPCState *env)
5677 register_ne_601_sprs(env);
5678 register_sdr1_sprs(env);
5679 register_7xx_sprs(env);
5680 register_G2_755_sprs(env);
5681 /* Time base */
5682 register_tbl(env);
5683 /* L2 cache control */
5684 /* XXX : not implemented */
5685 spr_register(env, SPR_L2CR, "L2CR",
5686 SPR_NOACCESS, SPR_NOACCESS,
5687 &spr_read_generic, spr_access_nop,
5688 0x00000000);
5689 /* XXX : not implemented */
5690 spr_register(env, SPR_L2PMCR, "L2PMCR",
5691 SPR_NOACCESS, SPR_NOACCESS,
5692 &spr_read_generic, &spr_write_generic,
5693 0x00000000);
5694 /* Thermal management */
5695 register_thrm_sprs(env);
5696 /* Hardware implementation registers */
5697 /* XXX : not implemented */
5698 spr_register(env, SPR_HID0, "HID0",
5699 SPR_NOACCESS, SPR_NOACCESS,
5700 &spr_read_generic, &spr_write_generic,
5701 0x00000000);
5702 /* XXX : not implemented */
5703 spr_register(env, SPR_HID1, "HID1",
5704 SPR_NOACCESS, SPR_NOACCESS,
5705 &spr_read_generic, &spr_write_generic,
5706 0x00000000);
5707 /* XXX : not implemented */
5708 spr_register(env, SPR_HID2, "HID2",
5709 SPR_NOACCESS, SPR_NOACCESS,
5710 &spr_read_generic, &spr_write_generic,
5711 0x00000000);
5712 /* Memory management */
5713 register_low_BATs(env);
5714 register_high_BATs(env);
5715 register_6xx_7xx_soft_tlb(env, 64, 2);
5716 init_excp_7x5(env);
5717 env->dcache_line_size = 32;
5718 env->icache_line_size = 32;
5719 /* Allocate hardware IRQ controller */
5720 ppc6xx_irq_init(env_archcpu(env));
5723 POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
5725 DeviceClass *dc = DEVICE_CLASS(oc);
5726 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5728 dc->desc = "PowerPC 755";
5729 pcc->init_proc = init_proc_755;
5730 pcc->check_pow = check_pow_hid0;
5731 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5732 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5733 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5734 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5735 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5736 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5737 PPC_SEGMENT | PPC_EXTERN;
5738 pcc->msr_mask = (1ull << MSR_POW) |
5739 (1ull << MSR_ILE) |
5740 (1ull << MSR_EE) |
5741 (1ull << MSR_PR) |
5742 (1ull << MSR_FP) |
5743 (1ull << MSR_ME) |
5744 (1ull << MSR_FE0) |
5745 (1ull << MSR_SE) |
5746 (1ull << MSR_DE) |
5747 (1ull << MSR_FE1) |
5748 (1ull << MSR_EP) |
5749 (1ull << MSR_IR) |
5750 (1ull << MSR_DR) |
5751 (1ull << MSR_PMM) |
5752 (1ull << MSR_RI) |
5753 (1ull << MSR_LE);
5754 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5755 pcc->excp_model = POWERPC_EXCP_7x5;
5756 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5757 pcc->bfd_mach = bfd_mach_ppc_750;
5758 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5759 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5762 static void init_proc_7400(CPUPPCState *env)
5764 register_ne_601_sprs(env);
5765 register_sdr1_sprs(env);
5766 register_7xx_sprs(env);
5767 /* Time base */
5768 register_tbl(env);
5769 /* 74xx specific SPR */
5770 register_74xx_sprs(env);
5771 vscr_init(env, 0x00010000);
5772 /* XXX : not implemented */
5773 spr_register(env, SPR_UBAMR, "UBAMR",
5774 &spr_read_ureg, SPR_NOACCESS,
5775 &spr_read_ureg, SPR_NOACCESS,
5776 0x00000000);
5777 /* XXX: this seems not implemented on all revisions. */
5778 /* XXX : not implemented */
5779 spr_register(env, SPR_MSSCR1, "MSSCR1",
5780 SPR_NOACCESS, SPR_NOACCESS,
5781 &spr_read_generic, &spr_write_generic,
5782 0x00000000);
5783 /* Thermal management */
5784 register_thrm_sprs(env);
5785 /* Memory management */
5786 register_low_BATs(env);
5787 init_excp_7400(env);
5788 env->dcache_line_size = 32;
5789 env->icache_line_size = 32;
5790 /* Allocate hardware IRQ controller */
5791 ppc6xx_irq_init(env_archcpu(env));
5794 POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
5796 DeviceClass *dc = DEVICE_CLASS(oc);
5797 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5799 dc->desc = "PowerPC 7400 (aka G4)";
5800 pcc->init_proc = init_proc_7400;
5801 pcc->check_pow = check_pow_hid0;
5802 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5803 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5804 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5805 PPC_FLOAT_STFIWX |
5806 PPC_CACHE | PPC_CACHE_ICBI |
5807 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5808 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5809 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5810 PPC_MEM_TLBIA |
5811 PPC_SEGMENT | PPC_EXTERN |
5812 PPC_ALTIVEC;
5813 pcc->msr_mask = (1ull << MSR_VR) |
5814 (1ull << MSR_POW) |
5815 (1ull << MSR_ILE) |
5816 (1ull << MSR_EE) |
5817 (1ull << MSR_PR) |
5818 (1ull << MSR_FP) |
5819 (1ull << MSR_ME) |
5820 (1ull << MSR_FE0) |
5821 (1ull << MSR_SE) |
5822 (1ull << MSR_DE) |
5823 (1ull << MSR_FE1) |
5824 (1ull << MSR_EP) |
5825 (1ull << MSR_IR) |
5826 (1ull << MSR_DR) |
5827 (1ull << MSR_PMM) |
5828 (1ull << MSR_RI) |
5829 (1ull << MSR_LE);
5830 pcc->mmu_model = POWERPC_MMU_32B;
5831 #if defined(CONFIG_SOFTMMU)
5832 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5833 #endif
5834 pcc->excp_model = POWERPC_EXCP_74xx;
5835 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5836 pcc->bfd_mach = bfd_mach_ppc_7400;
5837 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5838 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5839 POWERPC_FLAG_BUS_CLK;
5842 static void init_proc_7410(CPUPPCState *env)
5844 register_ne_601_sprs(env);
5845 register_sdr1_sprs(env);
5846 register_7xx_sprs(env);
5847 /* Time base */
5848 register_tbl(env);
5849 /* 74xx specific SPR */
5850 register_74xx_sprs(env);
5851 vscr_init(env, 0x00010000);
5852 /* XXX : not implemented */
5853 spr_register(env, SPR_UBAMR, "UBAMR",
5854 &spr_read_ureg, SPR_NOACCESS,
5855 &spr_read_ureg, SPR_NOACCESS,
5856 0x00000000);
5857 /* Thermal management */
5858 register_thrm_sprs(env);
5859 /* L2PMCR */
5860 /* XXX : not implemented */
5861 spr_register(env, SPR_L2PMCR, "L2PMCR",
5862 SPR_NOACCESS, SPR_NOACCESS,
5863 &spr_read_generic, &spr_write_generic,
5864 0x00000000);
5865 /* LDSTDB */
5866 /* XXX : not implemented */
5867 spr_register(env, SPR_LDSTDB, "LDSTDB",
5868 SPR_NOACCESS, SPR_NOACCESS,
5869 &spr_read_generic, &spr_write_generic,
5870 0x00000000);
5871 /* Memory management */
5872 register_low_BATs(env);
5873 init_excp_7400(env);
5874 env->dcache_line_size = 32;
5875 env->icache_line_size = 32;
5876 /* Allocate hardware IRQ controller */
5877 ppc6xx_irq_init(env_archcpu(env));
5880 POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
5882 DeviceClass *dc = DEVICE_CLASS(oc);
5883 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5885 dc->desc = "PowerPC 7410 (aka G4)";
5886 pcc->init_proc = init_proc_7410;
5887 pcc->check_pow = check_pow_hid0;
5888 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5889 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5890 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5891 PPC_FLOAT_STFIWX |
5892 PPC_CACHE | PPC_CACHE_ICBI |
5893 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5894 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5895 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5896 PPC_MEM_TLBIA |
5897 PPC_SEGMENT | PPC_EXTERN |
5898 PPC_ALTIVEC;
5899 pcc->msr_mask = (1ull << MSR_VR) |
5900 (1ull << MSR_POW) |
5901 (1ull << MSR_ILE) |
5902 (1ull << MSR_EE) |
5903 (1ull << MSR_PR) |
5904 (1ull << MSR_FP) |
5905 (1ull << MSR_ME) |
5906 (1ull << MSR_FE0) |
5907 (1ull << MSR_SE) |
5908 (1ull << MSR_DE) |
5909 (1ull << MSR_FE1) |
5910 (1ull << MSR_EP) |
5911 (1ull << MSR_IR) |
5912 (1ull << MSR_DR) |
5913 (1ull << MSR_PMM) |
5914 (1ull << MSR_RI) |
5915 (1ull << MSR_LE);
5916 pcc->mmu_model = POWERPC_MMU_32B;
5917 #if defined(CONFIG_SOFTMMU)
5918 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
5919 #endif
5920 pcc->excp_model = POWERPC_EXCP_74xx;
5921 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5922 pcc->bfd_mach = bfd_mach_ppc_7400;
5923 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5924 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5925 POWERPC_FLAG_BUS_CLK;
5928 static void init_proc_7440(CPUPPCState *env)
5930 register_ne_601_sprs(env);
5931 register_sdr1_sprs(env);
5932 register_7xx_sprs(env);
5933 /* Time base */
5934 register_tbl(env);
5935 /* 74xx specific SPR */
5936 register_74xx_sprs(env);
5937 vscr_init(env, 0x00010000);
5938 /* XXX : not implemented */
5939 spr_register(env, SPR_UBAMR, "UBAMR",
5940 &spr_read_ureg, SPR_NOACCESS,
5941 &spr_read_ureg, SPR_NOACCESS,
5942 0x00000000);
5943 /* LDSTCR */
5944 /* XXX : not implemented */
5945 spr_register(env, SPR_LDSTCR, "LDSTCR",
5946 SPR_NOACCESS, SPR_NOACCESS,
5947 &spr_read_generic, &spr_write_generic,
5948 0x00000000);
5949 /* ICTRL */
5950 /* XXX : not implemented */
5951 spr_register(env, SPR_ICTRL, "ICTRL",
5952 SPR_NOACCESS, SPR_NOACCESS,
5953 &spr_read_generic, &spr_write_generic,
5954 0x00000000);
5955 /* MSSSR0 */
5956 /* XXX : not implemented */
5957 spr_register(env, SPR_MSSSR0, "MSSSR0",
5958 SPR_NOACCESS, SPR_NOACCESS,
5959 &spr_read_generic, &spr_write_generic,
5960 0x00000000);
5961 /* PMC */
5962 /* XXX : not implemented */
5963 spr_register(env, SPR_7XX_PMC5, "PMC5",
5964 SPR_NOACCESS, SPR_NOACCESS,
5965 &spr_read_generic, &spr_write_generic,
5966 0x00000000);
5967 /* XXX : not implemented */
5968 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
5969 &spr_read_ureg, SPR_NOACCESS,
5970 &spr_read_ureg, SPR_NOACCESS,
5971 0x00000000);
5972 /* XXX : not implemented */
5973 spr_register(env, SPR_7XX_PMC6, "PMC6",
5974 SPR_NOACCESS, SPR_NOACCESS,
5975 &spr_read_generic, &spr_write_generic,
5976 0x00000000);
5977 /* XXX : not implemented */
5978 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
5979 &spr_read_ureg, SPR_NOACCESS,
5980 &spr_read_ureg, SPR_NOACCESS,
5981 0x00000000);
5982 /* Memory management */
5983 register_low_BATs(env);
5984 register_74xx_soft_tlb(env, 128, 2);
5985 init_excp_7450(env);
5986 env->dcache_line_size = 32;
5987 env->icache_line_size = 32;
5988 /* Allocate hardware IRQ controller */
5989 ppc6xx_irq_init(env_archcpu(env));
5992 POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
5994 DeviceClass *dc = DEVICE_CLASS(oc);
5995 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5997 dc->desc = "PowerPC 7440 (aka G4)";
5998 pcc->init_proc = init_proc_7440;
5999 pcc->check_pow = check_pow_hid0_74xx;
6000 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6001 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6002 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6003 PPC_FLOAT_STFIWX |
6004 PPC_CACHE | PPC_CACHE_ICBI |
6005 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6006 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6007 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6008 PPC_MEM_TLBIA | PPC_74xx_TLB |
6009 PPC_SEGMENT | PPC_EXTERN |
6010 PPC_ALTIVEC;
6011 pcc->msr_mask = (1ull << MSR_VR) |
6012 (1ull << MSR_POW) |
6013 (1ull << MSR_ILE) |
6014 (1ull << MSR_EE) |
6015 (1ull << MSR_PR) |
6016 (1ull << MSR_FP) |
6017 (1ull << MSR_ME) |
6018 (1ull << MSR_FE0) |
6019 (1ull << MSR_SE) |
6020 (1ull << MSR_DE) |
6021 (1ull << MSR_FE1) |
6022 (1ull << MSR_EP) |
6023 (1ull << MSR_IR) |
6024 (1ull << MSR_DR) |
6025 (1ull << MSR_PMM) |
6026 (1ull << MSR_RI) |
6027 (1ull << MSR_LE);
6028 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6029 pcc->excp_model = POWERPC_EXCP_74xx;
6030 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6031 pcc->bfd_mach = bfd_mach_ppc_7400;
6032 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6033 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6034 POWERPC_FLAG_BUS_CLK;
6037 static void init_proc_7450(CPUPPCState *env)
6039 register_ne_601_sprs(env);
6040 register_sdr1_sprs(env);
6041 register_7xx_sprs(env);
6042 /* Time base */
6043 register_tbl(env);
6044 /* 74xx specific SPR */
6045 register_74xx_sprs(env);
6046 vscr_init(env, 0x00010000);
6047 /* Level 3 cache control */
6048 register_l3_ctrl(env);
6049 /* L3ITCR1 */
6050 /* XXX : not implemented */
6051 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6052 SPR_NOACCESS, SPR_NOACCESS,
6053 &spr_read_generic, &spr_write_generic,
6054 0x00000000);
6055 /* L3ITCR2 */
6056 /* XXX : not implemented */
6057 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6058 SPR_NOACCESS, SPR_NOACCESS,
6059 &spr_read_generic, &spr_write_generic,
6060 0x00000000);
6061 /* L3ITCR3 */
6062 /* XXX : not implemented */
6063 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6064 SPR_NOACCESS, SPR_NOACCESS,
6065 &spr_read_generic, &spr_write_generic,
6066 0x00000000);
6067 /* L3OHCR */
6068 /* XXX : not implemented */
6069 spr_register(env, SPR_L3OHCR, "L3OHCR",
6070 SPR_NOACCESS, SPR_NOACCESS,
6071 &spr_read_generic, &spr_write_generic,
6072 0x00000000);
6073 /* XXX : not implemented */
6074 spr_register(env, SPR_UBAMR, "UBAMR",
6075 &spr_read_ureg, SPR_NOACCESS,
6076 &spr_read_ureg, SPR_NOACCESS,
6077 0x00000000);
6078 /* LDSTCR */
6079 /* XXX : not implemented */
6080 spr_register(env, SPR_LDSTCR, "LDSTCR",
6081 SPR_NOACCESS, SPR_NOACCESS,
6082 &spr_read_generic, &spr_write_generic,
6083 0x00000000);
6084 /* ICTRL */
6085 /* XXX : not implemented */
6086 spr_register(env, SPR_ICTRL, "ICTRL",
6087 SPR_NOACCESS, SPR_NOACCESS,
6088 &spr_read_generic, &spr_write_generic,
6089 0x00000000);
6090 /* MSSSR0 */
6091 /* XXX : not implemented */
6092 spr_register(env, SPR_MSSSR0, "MSSSR0",
6093 SPR_NOACCESS, SPR_NOACCESS,
6094 &spr_read_generic, &spr_write_generic,
6095 0x00000000);
6096 /* PMC */
6097 /* XXX : not implemented */
6098 spr_register(env, SPR_7XX_PMC5, "PMC5",
6099 SPR_NOACCESS, SPR_NOACCESS,
6100 &spr_read_generic, &spr_write_generic,
6101 0x00000000);
6102 /* XXX : not implemented */
6103 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6104 &spr_read_ureg, SPR_NOACCESS,
6105 &spr_read_ureg, SPR_NOACCESS,
6106 0x00000000);
6107 /* XXX : not implemented */
6108 spr_register(env, SPR_7XX_PMC6, "PMC6",
6109 SPR_NOACCESS, SPR_NOACCESS,
6110 &spr_read_generic, &spr_write_generic,
6111 0x00000000);
6112 /* XXX : not implemented */
6113 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6114 &spr_read_ureg, SPR_NOACCESS,
6115 &spr_read_ureg, SPR_NOACCESS,
6116 0x00000000);
6117 /* Memory management */
6118 register_low_BATs(env);
6119 register_74xx_soft_tlb(env, 128, 2);
6120 init_excp_7450(env);
6121 env->dcache_line_size = 32;
6122 env->icache_line_size = 32;
6123 /* Allocate hardware IRQ controller */
6124 ppc6xx_irq_init(env_archcpu(env));
6127 POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
6129 DeviceClass *dc = DEVICE_CLASS(oc);
6130 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6132 dc->desc = "PowerPC 7450 (aka G4)";
6133 pcc->init_proc = init_proc_7450;
6134 pcc->check_pow = check_pow_hid0_74xx;
6135 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6136 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6137 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6138 PPC_FLOAT_STFIWX |
6139 PPC_CACHE | PPC_CACHE_ICBI |
6140 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6141 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6142 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6143 PPC_MEM_TLBIA | PPC_74xx_TLB |
6144 PPC_SEGMENT | PPC_EXTERN |
6145 PPC_ALTIVEC;
6146 pcc->msr_mask = (1ull << MSR_VR) |
6147 (1ull << MSR_POW) |
6148 (1ull << MSR_ILE) |
6149 (1ull << MSR_EE) |
6150 (1ull << MSR_PR) |
6151 (1ull << MSR_FP) |
6152 (1ull << MSR_ME) |
6153 (1ull << MSR_FE0) |
6154 (1ull << MSR_SE) |
6155 (1ull << MSR_DE) |
6156 (1ull << MSR_FE1) |
6157 (1ull << MSR_EP) |
6158 (1ull << MSR_IR) |
6159 (1ull << MSR_DR) |
6160 (1ull << MSR_PMM) |
6161 (1ull << MSR_RI) |
6162 (1ull << MSR_LE);
6163 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6164 pcc->excp_model = POWERPC_EXCP_74xx;
6165 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6166 pcc->bfd_mach = bfd_mach_ppc_7400;
6167 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6168 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6169 POWERPC_FLAG_BUS_CLK;
6172 static void init_proc_7445(CPUPPCState *env)
6174 register_ne_601_sprs(env);
6175 register_sdr1_sprs(env);
6176 register_7xx_sprs(env);
6177 /* Time base */
6178 register_tbl(env);
6179 /* 74xx specific SPR */
6180 register_74xx_sprs(env);
6181 vscr_init(env, 0x00010000);
6182 /* LDSTCR */
6183 /* XXX : not implemented */
6184 spr_register(env, SPR_LDSTCR, "LDSTCR",
6185 SPR_NOACCESS, SPR_NOACCESS,
6186 &spr_read_generic, &spr_write_generic,
6187 0x00000000);
6188 /* ICTRL */
6189 /* XXX : not implemented */
6190 spr_register(env, SPR_ICTRL, "ICTRL",
6191 SPR_NOACCESS, SPR_NOACCESS,
6192 &spr_read_generic, &spr_write_generic,
6193 0x00000000);
6194 /* MSSSR0 */
6195 /* XXX : not implemented */
6196 spr_register(env, SPR_MSSSR0, "MSSSR0",
6197 SPR_NOACCESS, SPR_NOACCESS,
6198 &spr_read_generic, &spr_write_generic,
6199 0x00000000);
6200 /* PMC */
6201 /* XXX : not implemented */
6202 spr_register(env, SPR_7XX_PMC5, "PMC5",
6203 SPR_NOACCESS, SPR_NOACCESS,
6204 &spr_read_generic, &spr_write_generic,
6205 0x00000000);
6206 /* XXX : not implemented */
6207 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6208 &spr_read_ureg, SPR_NOACCESS,
6209 &spr_read_ureg, SPR_NOACCESS,
6210 0x00000000);
6211 /* XXX : not implemented */
6212 spr_register(env, SPR_7XX_PMC6, "PMC6",
6213 SPR_NOACCESS, SPR_NOACCESS,
6214 &spr_read_generic, &spr_write_generic,
6215 0x00000000);
6216 /* XXX : not implemented */
6217 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6218 &spr_read_ureg, SPR_NOACCESS,
6219 &spr_read_ureg, SPR_NOACCESS,
6220 0x00000000);
6221 /* SPRGs */
6222 spr_register(env, SPR_SPRG4, "SPRG4",
6223 SPR_NOACCESS, SPR_NOACCESS,
6224 &spr_read_generic, &spr_write_generic,
6225 0x00000000);
6226 spr_register(env, SPR_USPRG4, "USPRG4",
6227 &spr_read_ureg, SPR_NOACCESS,
6228 &spr_read_ureg, SPR_NOACCESS,
6229 0x00000000);
6230 spr_register(env, SPR_SPRG5, "SPRG5",
6231 SPR_NOACCESS, SPR_NOACCESS,
6232 &spr_read_generic, &spr_write_generic,
6233 0x00000000);
6234 spr_register(env, SPR_USPRG5, "USPRG5",
6235 &spr_read_ureg, SPR_NOACCESS,
6236 &spr_read_ureg, SPR_NOACCESS,
6237 0x00000000);
6238 spr_register(env, SPR_SPRG6, "SPRG6",
6239 SPR_NOACCESS, SPR_NOACCESS,
6240 &spr_read_generic, &spr_write_generic,
6241 0x00000000);
6242 spr_register(env, SPR_USPRG6, "USPRG6",
6243 &spr_read_ureg, SPR_NOACCESS,
6244 &spr_read_ureg, SPR_NOACCESS,
6245 0x00000000);
6246 spr_register(env, SPR_SPRG7, "SPRG7",
6247 SPR_NOACCESS, SPR_NOACCESS,
6248 &spr_read_generic, &spr_write_generic,
6249 0x00000000);
6250 spr_register(env, SPR_USPRG7, "USPRG7",
6251 &spr_read_ureg, SPR_NOACCESS,
6252 &spr_read_ureg, SPR_NOACCESS,
6253 0x00000000);
6254 /* Memory management */
6255 register_low_BATs(env);
6256 register_high_BATs(env);
6257 register_74xx_soft_tlb(env, 128, 2);
6258 init_excp_7450(env);
6259 env->dcache_line_size = 32;
6260 env->icache_line_size = 32;
6261 /* Allocate hardware IRQ controller */
6262 ppc6xx_irq_init(env_archcpu(env));
6265 POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
6267 DeviceClass *dc = DEVICE_CLASS(oc);
6268 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6270 dc->desc = "PowerPC 7445 (aka G4)";
6271 pcc->init_proc = init_proc_7445;
6272 pcc->check_pow = check_pow_hid0_74xx;
6273 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6274 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6275 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6276 PPC_FLOAT_STFIWX |
6277 PPC_CACHE | PPC_CACHE_ICBI |
6278 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6279 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6280 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6281 PPC_MEM_TLBIA | PPC_74xx_TLB |
6282 PPC_SEGMENT | PPC_EXTERN |
6283 PPC_ALTIVEC;
6284 pcc->msr_mask = (1ull << MSR_VR) |
6285 (1ull << MSR_POW) |
6286 (1ull << MSR_ILE) |
6287 (1ull << MSR_EE) |
6288 (1ull << MSR_PR) |
6289 (1ull << MSR_FP) |
6290 (1ull << MSR_ME) |
6291 (1ull << MSR_FE0) |
6292 (1ull << MSR_SE) |
6293 (1ull << MSR_DE) |
6294 (1ull << MSR_FE1) |
6295 (1ull << MSR_EP) |
6296 (1ull << MSR_IR) |
6297 (1ull << MSR_DR) |
6298 (1ull << MSR_PMM) |
6299 (1ull << MSR_RI) |
6300 (1ull << MSR_LE);
6301 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6302 pcc->excp_model = POWERPC_EXCP_74xx;
6303 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6304 pcc->bfd_mach = bfd_mach_ppc_7400;
6305 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6306 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6307 POWERPC_FLAG_BUS_CLK;
6310 static void init_proc_7455(CPUPPCState *env)
6312 register_ne_601_sprs(env);
6313 register_sdr1_sprs(env);
6314 register_7xx_sprs(env);
6315 /* Time base */
6316 register_tbl(env);
6317 /* 74xx specific SPR */
6318 register_74xx_sprs(env);
6319 vscr_init(env, 0x00010000);
6320 /* Level 3 cache control */
6321 register_l3_ctrl(env);
6322 /* LDSTCR */
6323 /* XXX : not implemented */
6324 spr_register(env, SPR_LDSTCR, "LDSTCR",
6325 SPR_NOACCESS, SPR_NOACCESS,
6326 &spr_read_generic, &spr_write_generic,
6327 0x00000000);
6328 /* ICTRL */
6329 /* XXX : not implemented */
6330 spr_register(env, SPR_ICTRL, "ICTRL",
6331 SPR_NOACCESS, SPR_NOACCESS,
6332 &spr_read_generic, &spr_write_generic,
6333 0x00000000);
6334 /* MSSSR0 */
6335 /* XXX : not implemented */
6336 spr_register(env, SPR_MSSSR0, "MSSSR0",
6337 SPR_NOACCESS, SPR_NOACCESS,
6338 &spr_read_generic, &spr_write_generic,
6339 0x00000000);
6340 /* PMC */
6341 /* XXX : not implemented */
6342 spr_register(env, SPR_7XX_PMC5, "PMC5",
6343 SPR_NOACCESS, SPR_NOACCESS,
6344 &spr_read_generic, &spr_write_generic,
6345 0x00000000);
6346 /* XXX : not implemented */
6347 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6348 &spr_read_ureg, SPR_NOACCESS,
6349 &spr_read_ureg, SPR_NOACCESS,
6350 0x00000000);
6351 /* XXX : not implemented */
6352 spr_register(env, SPR_7XX_PMC6, "PMC6",
6353 SPR_NOACCESS, SPR_NOACCESS,
6354 &spr_read_generic, &spr_write_generic,
6355 0x00000000);
6356 /* XXX : not implemented */
6357 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6358 &spr_read_ureg, SPR_NOACCESS,
6359 &spr_read_ureg, SPR_NOACCESS,
6360 0x00000000);
6361 /* SPRGs */
6362 spr_register(env, SPR_SPRG4, "SPRG4",
6363 SPR_NOACCESS, SPR_NOACCESS,
6364 &spr_read_generic, &spr_write_generic,
6365 0x00000000);
6366 spr_register(env, SPR_USPRG4, "USPRG4",
6367 &spr_read_ureg, SPR_NOACCESS,
6368 &spr_read_ureg, SPR_NOACCESS,
6369 0x00000000);
6370 spr_register(env, SPR_SPRG5, "SPRG5",
6371 SPR_NOACCESS, SPR_NOACCESS,
6372 &spr_read_generic, &spr_write_generic,
6373 0x00000000);
6374 spr_register(env, SPR_USPRG5, "USPRG5",
6375 &spr_read_ureg, SPR_NOACCESS,
6376 &spr_read_ureg, SPR_NOACCESS,
6377 0x00000000);
6378 spr_register(env, SPR_SPRG6, "SPRG6",
6379 SPR_NOACCESS, SPR_NOACCESS,
6380 &spr_read_generic, &spr_write_generic,
6381 0x00000000);
6382 spr_register(env, SPR_USPRG6, "USPRG6",
6383 &spr_read_ureg, SPR_NOACCESS,
6384 &spr_read_ureg, SPR_NOACCESS,
6385 0x00000000);
6386 spr_register(env, SPR_SPRG7, "SPRG7",
6387 SPR_NOACCESS, SPR_NOACCESS,
6388 &spr_read_generic, &spr_write_generic,
6389 0x00000000);
6390 spr_register(env, SPR_USPRG7, "USPRG7",
6391 &spr_read_ureg, SPR_NOACCESS,
6392 &spr_read_ureg, SPR_NOACCESS,
6393 0x00000000);
6394 /* Memory management */
6395 register_low_BATs(env);
6396 register_high_BATs(env);
6397 register_74xx_soft_tlb(env, 128, 2);
6398 init_excp_7450(env);
6399 env->dcache_line_size = 32;
6400 env->icache_line_size = 32;
6401 /* Allocate hardware IRQ controller */
6402 ppc6xx_irq_init(env_archcpu(env));
6405 POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
6407 DeviceClass *dc = DEVICE_CLASS(oc);
6408 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6410 dc->desc = "PowerPC 7455 (aka G4)";
6411 pcc->init_proc = init_proc_7455;
6412 pcc->check_pow = check_pow_hid0_74xx;
6413 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6414 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6415 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6416 PPC_FLOAT_STFIWX |
6417 PPC_CACHE | PPC_CACHE_ICBI |
6418 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6419 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6420 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6421 PPC_MEM_TLBIA | PPC_74xx_TLB |
6422 PPC_SEGMENT | PPC_EXTERN |
6423 PPC_ALTIVEC;
6424 pcc->msr_mask = (1ull << MSR_VR) |
6425 (1ull << MSR_POW) |
6426 (1ull << MSR_ILE) |
6427 (1ull << MSR_EE) |
6428 (1ull << MSR_PR) |
6429 (1ull << MSR_FP) |
6430 (1ull << MSR_ME) |
6431 (1ull << MSR_FE0) |
6432 (1ull << MSR_SE) |
6433 (1ull << MSR_DE) |
6434 (1ull << MSR_FE1) |
6435 (1ull << MSR_EP) |
6436 (1ull << MSR_IR) |
6437 (1ull << MSR_DR) |
6438 (1ull << MSR_PMM) |
6439 (1ull << MSR_RI) |
6440 (1ull << MSR_LE);
6441 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6442 pcc->excp_model = POWERPC_EXCP_74xx;
6443 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6444 pcc->bfd_mach = bfd_mach_ppc_7400;
6445 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6446 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6447 POWERPC_FLAG_BUS_CLK;
6450 static void init_proc_7457(CPUPPCState *env)
6452 register_ne_601_sprs(env);
6453 register_sdr1_sprs(env);
6454 register_7xx_sprs(env);
6455 /* Time base */
6456 register_tbl(env);
6457 /* 74xx specific SPR */
6458 register_74xx_sprs(env);
6459 vscr_init(env, 0x00010000);
6460 /* Level 3 cache control */
6461 register_l3_ctrl(env);
6462 /* L3ITCR1 */
6463 /* XXX : not implemented */
6464 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6465 SPR_NOACCESS, SPR_NOACCESS,
6466 &spr_read_generic, &spr_write_generic,
6467 0x00000000);
6468 /* L3ITCR2 */
6469 /* XXX : not implemented */
6470 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6471 SPR_NOACCESS, SPR_NOACCESS,
6472 &spr_read_generic, &spr_write_generic,
6473 0x00000000);
6474 /* L3ITCR3 */
6475 /* XXX : not implemented */
6476 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6477 SPR_NOACCESS, SPR_NOACCESS,
6478 &spr_read_generic, &spr_write_generic,
6479 0x00000000);
6480 /* L3OHCR */
6481 /* XXX : not implemented */
6482 spr_register(env, SPR_L3OHCR, "L3OHCR",
6483 SPR_NOACCESS, SPR_NOACCESS,
6484 &spr_read_generic, &spr_write_generic,
6485 0x00000000);
6486 /* LDSTCR */
6487 /* XXX : not implemented */
6488 spr_register(env, SPR_LDSTCR, "LDSTCR",
6489 SPR_NOACCESS, SPR_NOACCESS,
6490 &spr_read_generic, &spr_write_generic,
6491 0x00000000);
6492 /* ICTRL */
6493 /* XXX : not implemented */
6494 spr_register(env, SPR_ICTRL, "ICTRL",
6495 SPR_NOACCESS, SPR_NOACCESS,
6496 &spr_read_generic, &spr_write_generic,
6497 0x00000000);
6498 /* MSSSR0 */
6499 /* XXX : not implemented */
6500 spr_register(env, SPR_MSSSR0, "MSSSR0",
6501 SPR_NOACCESS, SPR_NOACCESS,
6502 &spr_read_generic, &spr_write_generic,
6503 0x00000000);
6504 /* PMC */
6505 /* XXX : not implemented */
6506 spr_register(env, SPR_7XX_PMC5, "PMC5",
6507 SPR_NOACCESS, SPR_NOACCESS,
6508 &spr_read_generic, &spr_write_generic,
6509 0x00000000);
6510 /* XXX : not implemented */
6511 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6512 &spr_read_ureg, SPR_NOACCESS,
6513 &spr_read_ureg, SPR_NOACCESS,
6514 0x00000000);
6515 /* XXX : not implemented */
6516 spr_register(env, SPR_7XX_PMC6, "PMC6",
6517 SPR_NOACCESS, SPR_NOACCESS,
6518 &spr_read_generic, &spr_write_generic,
6519 0x00000000);
6520 /* XXX : not implemented */
6521 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6522 &spr_read_ureg, SPR_NOACCESS,
6523 &spr_read_ureg, SPR_NOACCESS,
6524 0x00000000);
6525 /* SPRGs */
6526 spr_register(env, SPR_SPRG4, "SPRG4",
6527 SPR_NOACCESS, SPR_NOACCESS,
6528 &spr_read_generic, &spr_write_generic,
6529 0x00000000);
6530 spr_register(env, SPR_USPRG4, "USPRG4",
6531 &spr_read_ureg, SPR_NOACCESS,
6532 &spr_read_ureg, SPR_NOACCESS,
6533 0x00000000);
6534 spr_register(env, SPR_SPRG5, "SPRG5",
6535 SPR_NOACCESS, SPR_NOACCESS,
6536 &spr_read_generic, &spr_write_generic,
6537 0x00000000);
6538 spr_register(env, SPR_USPRG5, "USPRG5",
6539 &spr_read_ureg, SPR_NOACCESS,
6540 &spr_read_ureg, SPR_NOACCESS,
6541 0x00000000);
6542 spr_register(env, SPR_SPRG6, "SPRG6",
6543 SPR_NOACCESS, SPR_NOACCESS,
6544 &spr_read_generic, &spr_write_generic,
6545 0x00000000);
6546 spr_register(env, SPR_USPRG6, "USPRG6",
6547 &spr_read_ureg, SPR_NOACCESS,
6548 &spr_read_ureg, SPR_NOACCESS,
6549 0x00000000);
6550 spr_register(env, SPR_SPRG7, "SPRG7",
6551 SPR_NOACCESS, SPR_NOACCESS,
6552 &spr_read_generic, &spr_write_generic,
6553 0x00000000);
6554 spr_register(env, SPR_USPRG7, "USPRG7",
6555 &spr_read_ureg, SPR_NOACCESS,
6556 &spr_read_ureg, SPR_NOACCESS,
6557 0x00000000);
6558 /* Memory management */
6559 register_low_BATs(env);
6560 register_high_BATs(env);
6561 register_74xx_soft_tlb(env, 128, 2);
6562 init_excp_7450(env);
6563 env->dcache_line_size = 32;
6564 env->icache_line_size = 32;
6565 /* Allocate hardware IRQ controller */
6566 ppc6xx_irq_init(env_archcpu(env));
6569 POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
6571 DeviceClass *dc = DEVICE_CLASS(oc);
6572 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6574 dc->desc = "PowerPC 7457 (aka G4)";
6575 pcc->init_proc = init_proc_7457;
6576 pcc->check_pow = check_pow_hid0_74xx;
6577 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6578 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6579 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6580 PPC_FLOAT_STFIWX |
6581 PPC_CACHE | PPC_CACHE_ICBI |
6582 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6583 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6584 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6585 PPC_MEM_TLBIA | PPC_74xx_TLB |
6586 PPC_SEGMENT | PPC_EXTERN |
6587 PPC_ALTIVEC;
6588 pcc->msr_mask = (1ull << MSR_VR) |
6589 (1ull << MSR_POW) |
6590 (1ull << MSR_ILE) |
6591 (1ull << MSR_EE) |
6592 (1ull << MSR_PR) |
6593 (1ull << MSR_FP) |
6594 (1ull << MSR_ME) |
6595 (1ull << MSR_FE0) |
6596 (1ull << MSR_SE) |
6597 (1ull << MSR_DE) |
6598 (1ull << MSR_FE1) |
6599 (1ull << MSR_EP) |
6600 (1ull << MSR_IR) |
6601 (1ull << MSR_DR) |
6602 (1ull << MSR_PMM) |
6603 (1ull << MSR_RI) |
6604 (1ull << MSR_LE);
6605 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6606 pcc->excp_model = POWERPC_EXCP_74xx;
6607 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6608 pcc->bfd_mach = bfd_mach_ppc_7400;
6609 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6610 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6611 POWERPC_FLAG_BUS_CLK;
6614 static void init_proc_e600(CPUPPCState *env)
6616 register_ne_601_sprs(env);
6617 register_sdr1_sprs(env);
6618 register_7xx_sprs(env);
6619 /* Time base */
6620 register_tbl(env);
6621 /* 74xx specific SPR */
6622 register_74xx_sprs(env);
6623 vscr_init(env, 0x00010000);
6624 /* XXX : not implemented */
6625 spr_register(env, SPR_UBAMR, "UBAMR",
6626 &spr_read_ureg, SPR_NOACCESS,
6627 &spr_read_ureg, SPR_NOACCESS,
6628 0x00000000);
6629 /* XXX : not implemented */
6630 spr_register(env, SPR_LDSTCR, "LDSTCR",
6631 SPR_NOACCESS, SPR_NOACCESS,
6632 &spr_read_generic, &spr_write_generic,
6633 0x00000000);
6634 /* XXX : not implemented */
6635 spr_register(env, SPR_ICTRL, "ICTRL",
6636 SPR_NOACCESS, SPR_NOACCESS,
6637 &spr_read_generic, &spr_write_generic,
6638 0x00000000);
6639 /* XXX : not implemented */
6640 spr_register(env, SPR_MSSSR0, "MSSSR0",
6641 SPR_NOACCESS, SPR_NOACCESS,
6642 &spr_read_generic, &spr_write_generic,
6643 0x00000000);
6644 /* XXX : not implemented */
6645 spr_register(env, SPR_7XX_PMC5, "PMC5",
6646 SPR_NOACCESS, SPR_NOACCESS,
6647 &spr_read_generic, &spr_write_generic,
6648 0x00000000);
6649 /* XXX : not implemented */
6650 spr_register(env, SPR_7XX_UPMC5, "UPMC5",
6651 &spr_read_ureg, SPR_NOACCESS,
6652 &spr_read_ureg, SPR_NOACCESS,
6653 0x00000000);
6654 /* XXX : not implemented */
6655 spr_register(env, SPR_7XX_PMC6, "PMC6",
6656 SPR_NOACCESS, SPR_NOACCESS,
6657 &spr_read_generic, &spr_write_generic,
6658 0x00000000);
6659 /* XXX : not implemented */
6660 spr_register(env, SPR_7XX_UPMC6, "UPMC6",
6661 &spr_read_ureg, SPR_NOACCESS,
6662 &spr_read_ureg, SPR_NOACCESS,
6663 0x00000000);
6664 /* SPRGs */
6665 spr_register(env, SPR_SPRG4, "SPRG4",
6666 SPR_NOACCESS, SPR_NOACCESS,
6667 &spr_read_generic, &spr_write_generic,
6668 0x00000000);
6669 spr_register(env, SPR_USPRG4, "USPRG4",
6670 &spr_read_ureg, SPR_NOACCESS,
6671 &spr_read_ureg, SPR_NOACCESS,
6672 0x00000000);
6673 spr_register(env, SPR_SPRG5, "SPRG5",
6674 SPR_NOACCESS, SPR_NOACCESS,
6675 &spr_read_generic, &spr_write_generic,
6676 0x00000000);
6677 spr_register(env, SPR_USPRG5, "USPRG5",
6678 &spr_read_ureg, SPR_NOACCESS,
6679 &spr_read_ureg, SPR_NOACCESS,
6680 0x00000000);
6681 spr_register(env, SPR_SPRG6, "SPRG6",
6682 SPR_NOACCESS, SPR_NOACCESS,
6683 &spr_read_generic, &spr_write_generic,
6684 0x00000000);
6685 spr_register(env, SPR_USPRG6, "USPRG6",
6686 &spr_read_ureg, SPR_NOACCESS,
6687 &spr_read_ureg, SPR_NOACCESS,
6688 0x00000000);
6689 spr_register(env, SPR_SPRG7, "SPRG7",
6690 SPR_NOACCESS, SPR_NOACCESS,
6691 &spr_read_generic, &spr_write_generic,
6692 0x00000000);
6693 spr_register(env, SPR_USPRG7, "USPRG7",
6694 &spr_read_ureg, SPR_NOACCESS,
6695 &spr_read_ureg, SPR_NOACCESS,
6696 0x00000000);
6697 /* Memory management */
6698 register_low_BATs(env);
6699 register_high_BATs(env);
6700 register_74xx_soft_tlb(env, 128, 2);
6701 init_excp_7450(env);
6702 env->dcache_line_size = 32;
6703 env->icache_line_size = 32;
6704 /* Allocate hardware IRQ controller */
6705 ppc6xx_irq_init(env_archcpu(env));
6708 POWERPC_FAMILY(e600)(ObjectClass *oc, void *data)
6710 DeviceClass *dc = DEVICE_CLASS(oc);
6711 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6713 dc->desc = "PowerPC e600";
6714 pcc->init_proc = init_proc_e600;
6715 pcc->check_pow = check_pow_hid0_74xx;
6716 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6717 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6718 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6719 PPC_FLOAT_STFIWX |
6720 PPC_CACHE | PPC_CACHE_ICBI |
6721 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6722 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6723 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6724 PPC_MEM_TLBIA | PPC_74xx_TLB |
6725 PPC_SEGMENT | PPC_EXTERN |
6726 PPC_ALTIVEC;
6727 pcc->insns_flags2 = PPC_NONE;
6728 pcc->msr_mask = (1ull << MSR_VR) |
6729 (1ull << MSR_POW) |
6730 (1ull << MSR_ILE) |
6731 (1ull << MSR_EE) |
6732 (1ull << MSR_PR) |
6733 (1ull << MSR_FP) |
6734 (1ull << MSR_ME) |
6735 (1ull << MSR_FE0) |
6736 (1ull << MSR_SE) |
6737 (1ull << MSR_DE) |
6738 (1ull << MSR_FE1) |
6739 (1ull << MSR_EP) |
6740 (1ull << MSR_IR) |
6741 (1ull << MSR_DR) |
6742 (1ull << MSR_PMM) |
6743 (1ull << MSR_RI) |
6744 (1ull << MSR_LE);
6745 pcc->mmu_model = POWERPC_MMU_32B;
6746 #if defined(CONFIG_SOFTMMU)
6747 pcc->handle_mmu_fault = ppc_hash32_handle_mmu_fault;
6748 #endif
6749 pcc->excp_model = POWERPC_EXCP_74xx;
6750 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6751 pcc->bfd_mach = bfd_mach_ppc_7400;
6752 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6753 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6754 POWERPC_FLAG_BUS_CLK;
6757 #if defined(TARGET_PPC64)
6758 #if defined(CONFIG_USER_ONLY)
6759 #define POWERPC970_HID5_INIT 0x00000080
6760 #else
6761 #define POWERPC970_HID5_INIT 0x00000000
6762 #endif
6764 static int check_pow_970(CPUPPCState *env)
6766 if (env->spr[SPR_HID0] & (HID0_DEEPNAP | HID0_DOZE | HID0_NAP)) {
6767 return 1;
6770 return 0;
6773 static void register_970_hid_sprs(CPUPPCState *env)
6775 /* Hardware implementation registers */
6776 /* XXX : not implemented */
6777 spr_register(env, SPR_HID0, "HID0",
6778 SPR_NOACCESS, SPR_NOACCESS,
6779 &spr_read_generic, &spr_write_clear,
6780 0x60000000);
6781 spr_register(env, SPR_HID1, "HID1",
6782 SPR_NOACCESS, SPR_NOACCESS,
6783 &spr_read_generic, &spr_write_generic,
6784 0x00000000);
6785 spr_register(env, SPR_970_HID5, "HID5",
6786 SPR_NOACCESS, SPR_NOACCESS,
6787 &spr_read_generic, &spr_write_generic,
6788 POWERPC970_HID5_INIT);
6791 static void register_970_hior_sprs(CPUPPCState *env)
6793 spr_register(env, SPR_HIOR, "SPR_HIOR",
6794 SPR_NOACCESS, SPR_NOACCESS,
6795 &spr_read_hior, &spr_write_hior,
6796 0x00000000);
6799 static void register_book3s_ctrl_sprs(CPUPPCState *env)
6801 spr_register(env, SPR_CTRL, "SPR_CTRL",
6802 SPR_NOACCESS, SPR_NOACCESS,
6803 SPR_NOACCESS, &spr_write_generic,
6804 0x00000000);
6805 spr_register(env, SPR_UCTRL, "SPR_UCTRL",
6806 &spr_read_ureg, SPR_NOACCESS,
6807 &spr_read_ureg, SPR_NOACCESS,
6808 0x00000000);
6811 static void register_book3s_altivec_sprs(CPUPPCState *env)
6813 if (!(env->insns_flags & PPC_ALTIVEC)) {
6814 return;
6817 spr_register_kvm(env, SPR_VRSAVE, "VRSAVE",
6818 &spr_read_generic, &spr_write_generic,
6819 &spr_read_generic, &spr_write_generic,
6820 KVM_REG_PPC_VRSAVE, 0x00000000);
6824 static void register_book3s_dbg_sprs(CPUPPCState *env)
6827 * TODO: different specs define different scopes for these,
6828 * will have to address this:
6829 * 970: super/write and super/read
6830 * powerisa 2.03..2.04: hypv/write and super/read.
6831 * powerisa 2.05 and newer: hypv/write and hypv/read.
6833 spr_register_kvm(env, SPR_DABR, "DABR",
6834 SPR_NOACCESS, SPR_NOACCESS,
6835 &spr_read_generic, &spr_write_generic,
6836 KVM_REG_PPC_DABR, 0x00000000);
6837 spr_register_kvm(env, SPR_DABRX, "DABRX",
6838 SPR_NOACCESS, SPR_NOACCESS,
6839 &spr_read_generic, &spr_write_generic,
6840 KVM_REG_PPC_DABRX, 0x00000000);
6843 static void register_book3s_207_dbg_sprs(CPUPPCState *env)
6845 spr_register_kvm_hv(env, SPR_DAWR0, "DAWR0",
6846 SPR_NOACCESS, SPR_NOACCESS,
6847 SPR_NOACCESS, SPR_NOACCESS,
6848 &spr_read_generic, &spr_write_generic,
6849 KVM_REG_PPC_DAWR, 0x00000000);
6850 spr_register_kvm_hv(env, SPR_DAWRX0, "DAWRX0",
6851 SPR_NOACCESS, SPR_NOACCESS,
6852 SPR_NOACCESS, SPR_NOACCESS,
6853 &spr_read_generic, &spr_write_generic,
6854 KVM_REG_PPC_DAWRX, 0x00000000);
6855 spr_register_kvm_hv(env, SPR_CIABR, "CIABR",
6856 SPR_NOACCESS, SPR_NOACCESS,
6857 SPR_NOACCESS, SPR_NOACCESS,
6858 &spr_read_generic, &spr_write_generic,
6859 KVM_REG_PPC_CIABR, 0x00000000);
6862 static void register_970_dbg_sprs(CPUPPCState *env)
6864 /* Breakpoints */
6865 spr_register(env, SPR_IABR, "IABR",
6866 SPR_NOACCESS, SPR_NOACCESS,
6867 &spr_read_generic, &spr_write_generic,
6868 0x00000000);
6871 static void register_book3s_pmu_sup_sprs(CPUPPCState *env)
6873 spr_register_kvm(env, SPR_POWER_MMCR0, "MMCR0",
6874 SPR_NOACCESS, SPR_NOACCESS,
6875 &spr_read_generic, &spr_write_generic,
6876 KVM_REG_PPC_MMCR0, 0x00000000);
6877 spr_register_kvm(env, SPR_POWER_MMCR1, "MMCR1",
6878 SPR_NOACCESS, SPR_NOACCESS,
6879 &spr_read_generic, &spr_write_generic,
6880 KVM_REG_PPC_MMCR1, 0x00000000);
6881 spr_register_kvm(env, SPR_POWER_MMCRA, "MMCRA",
6882 SPR_NOACCESS, SPR_NOACCESS,
6883 &spr_read_generic, &spr_write_generic,
6884 KVM_REG_PPC_MMCRA, 0x00000000);
6885 spr_register_kvm(env, SPR_POWER_PMC1, "PMC1",
6886 SPR_NOACCESS, SPR_NOACCESS,
6887 &spr_read_generic, &spr_write_generic,
6888 KVM_REG_PPC_PMC1, 0x00000000);
6889 spr_register_kvm(env, SPR_POWER_PMC2, "PMC2",
6890 SPR_NOACCESS, SPR_NOACCESS,
6891 &spr_read_generic, &spr_write_generic,
6892 KVM_REG_PPC_PMC2, 0x00000000);
6893 spr_register_kvm(env, SPR_POWER_PMC3, "PMC3",
6894 SPR_NOACCESS, SPR_NOACCESS,
6895 &spr_read_generic, &spr_write_generic,
6896 KVM_REG_PPC_PMC3, 0x00000000);
6897 spr_register_kvm(env, SPR_POWER_PMC4, "PMC4",
6898 SPR_NOACCESS, SPR_NOACCESS,
6899 &spr_read_generic, &spr_write_generic,
6900 KVM_REG_PPC_PMC4, 0x00000000);
6901 spr_register_kvm(env, SPR_POWER_PMC5, "PMC5",
6902 SPR_NOACCESS, SPR_NOACCESS,
6903 &spr_read_generic, &spr_write_generic,
6904 KVM_REG_PPC_PMC5, 0x00000000);
6905 spr_register_kvm(env, SPR_POWER_PMC6, "PMC6",
6906 SPR_NOACCESS, SPR_NOACCESS,
6907 &spr_read_generic, &spr_write_generic,
6908 KVM_REG_PPC_PMC6, 0x00000000);
6909 spr_register_kvm(env, SPR_POWER_SIAR, "SIAR",
6910 SPR_NOACCESS, SPR_NOACCESS,
6911 &spr_read_generic, &spr_write_generic,
6912 KVM_REG_PPC_SIAR, 0x00000000);
6913 spr_register_kvm(env, SPR_POWER_SDAR, "SDAR",
6914 SPR_NOACCESS, SPR_NOACCESS,
6915 &spr_read_generic, &spr_write_generic,
6916 KVM_REG_PPC_SDAR, 0x00000000);
6919 static void register_book3s_pmu_user_sprs(CPUPPCState *env)
6921 spr_register(env, SPR_POWER_UMMCR0, "UMMCR0",
6922 &spr_read_ureg, SPR_NOACCESS,
6923 &spr_read_ureg, &spr_write_ureg,
6924 0x00000000);
6925 spr_register(env, SPR_POWER_UMMCR1, "UMMCR1",
6926 &spr_read_ureg, SPR_NOACCESS,
6927 &spr_read_ureg, &spr_write_ureg,
6928 0x00000000);
6929 spr_register(env, SPR_POWER_UMMCRA, "UMMCRA",
6930 &spr_read_ureg, SPR_NOACCESS,
6931 &spr_read_ureg, &spr_write_ureg,
6932 0x00000000);
6933 spr_register(env, SPR_POWER_UPMC1, "UPMC1",
6934 &spr_read_ureg, SPR_NOACCESS,
6935 &spr_read_ureg, &spr_write_ureg,
6936 0x00000000);
6937 spr_register(env, SPR_POWER_UPMC2, "UPMC2",
6938 &spr_read_ureg, SPR_NOACCESS,
6939 &spr_read_ureg, &spr_write_ureg,
6940 0x00000000);
6941 spr_register(env, SPR_POWER_UPMC3, "UPMC3",
6942 &spr_read_ureg, SPR_NOACCESS,
6943 &spr_read_ureg, &spr_write_ureg,
6944 0x00000000);
6945 spr_register(env, SPR_POWER_UPMC4, "UPMC4",
6946 &spr_read_ureg, SPR_NOACCESS,
6947 &spr_read_ureg, &spr_write_ureg,
6948 0x00000000);
6949 spr_register(env, SPR_POWER_UPMC5, "UPMC5",
6950 &spr_read_ureg, SPR_NOACCESS,
6951 &spr_read_ureg, &spr_write_ureg,
6952 0x00000000);
6953 spr_register(env, SPR_POWER_UPMC6, "UPMC6",
6954 &spr_read_ureg, SPR_NOACCESS,
6955 &spr_read_ureg, &spr_write_ureg,
6956 0x00000000);
6957 spr_register(env, SPR_POWER_USIAR, "USIAR",
6958 &spr_read_ureg, SPR_NOACCESS,
6959 &spr_read_ureg, &spr_write_ureg,
6960 0x00000000);
6961 spr_register(env, SPR_POWER_USDAR, "USDAR",
6962 &spr_read_ureg, SPR_NOACCESS,
6963 &spr_read_ureg, &spr_write_ureg,
6964 0x00000000);
6967 static void register_970_pmu_sup_sprs(CPUPPCState *env)
6969 spr_register_kvm(env, SPR_970_PMC7, "PMC7",
6970 SPR_NOACCESS, SPR_NOACCESS,
6971 &spr_read_generic, &spr_write_generic,
6972 KVM_REG_PPC_PMC7, 0x00000000);
6973 spr_register_kvm(env, SPR_970_PMC8, "PMC8",
6974 SPR_NOACCESS, SPR_NOACCESS,
6975 &spr_read_generic, &spr_write_generic,
6976 KVM_REG_PPC_PMC8, 0x00000000);
6979 static void register_970_pmu_user_sprs(CPUPPCState *env)
6981 spr_register(env, SPR_970_UPMC7, "UPMC7",
6982 &spr_read_ureg, SPR_NOACCESS,
6983 &spr_read_ureg, &spr_write_ureg,
6984 0x00000000);
6985 spr_register(env, SPR_970_UPMC8, "UPMC8",
6986 &spr_read_ureg, SPR_NOACCESS,
6987 &spr_read_ureg, &spr_write_ureg,
6988 0x00000000);
6991 static void register_power8_pmu_sup_sprs(CPUPPCState *env)
6993 spr_register_kvm(env, SPR_POWER_MMCR2, "MMCR2",
6994 SPR_NOACCESS, SPR_NOACCESS,
6995 &spr_read_generic, &spr_write_generic,
6996 KVM_REG_PPC_MMCR2, 0x00000000);
6997 spr_register_kvm(env, SPR_POWER_MMCRS, "MMCRS",
6998 SPR_NOACCESS, SPR_NOACCESS,
6999 &spr_read_generic, &spr_write_generic,
7000 KVM_REG_PPC_MMCRS, 0x00000000);
7001 spr_register_kvm(env, SPR_POWER_SIER, "SIER",
7002 SPR_NOACCESS, SPR_NOACCESS,
7003 &spr_read_generic, &spr_write_generic,
7004 KVM_REG_PPC_SIER, 0x00000000);
7005 spr_register_kvm(env, SPR_POWER_SPMC1, "SPMC1",
7006 SPR_NOACCESS, SPR_NOACCESS,
7007 &spr_read_generic, &spr_write_generic,
7008 KVM_REG_PPC_SPMC1, 0x00000000);
7009 spr_register_kvm(env, SPR_POWER_SPMC2, "SPMC2",
7010 SPR_NOACCESS, SPR_NOACCESS,
7011 &spr_read_generic, &spr_write_generic,
7012 KVM_REG_PPC_SPMC2, 0x00000000);
7013 spr_register_kvm(env, SPR_TACR, "TACR",
7014 SPR_NOACCESS, SPR_NOACCESS,
7015 &spr_read_generic, &spr_write_generic,
7016 KVM_REG_PPC_TACR, 0x00000000);
7017 spr_register_kvm(env, SPR_TCSCR, "TCSCR",
7018 SPR_NOACCESS, SPR_NOACCESS,
7019 &spr_read_generic, &spr_write_generic,
7020 KVM_REG_PPC_TCSCR, 0x00000000);
7021 spr_register_kvm(env, SPR_CSIGR, "CSIGR",
7022 SPR_NOACCESS, SPR_NOACCESS,
7023 &spr_read_generic, &spr_write_generic,
7024 KVM_REG_PPC_CSIGR, 0x00000000);
7027 static void register_power8_pmu_user_sprs(CPUPPCState *env)
7029 spr_register(env, SPR_POWER_UMMCR2, "UMMCR2",
7030 &spr_read_ureg, SPR_NOACCESS,
7031 &spr_read_ureg, &spr_write_ureg,
7032 0x00000000);
7033 spr_register(env, SPR_POWER_USIER, "USIER",
7034 &spr_read_generic, SPR_NOACCESS,
7035 &spr_read_generic, &spr_write_generic,
7036 0x00000000);
7039 static void register_power5p_ear_sprs(CPUPPCState *env)
7041 /* External access control */
7042 spr_register(env, SPR_EAR, "EAR",
7043 SPR_NOACCESS, SPR_NOACCESS,
7044 &spr_read_generic, &spr_write_generic,
7045 0x00000000);
7048 static void register_power5p_tb_sprs(CPUPPCState *env)
7050 /* TBU40 (High 40 bits of the Timebase register */
7051 spr_register_hv(env, SPR_TBU40, "TBU40",
7052 SPR_NOACCESS, SPR_NOACCESS,
7053 SPR_NOACCESS, SPR_NOACCESS,
7054 SPR_NOACCESS, &spr_write_tbu40,
7055 0x00000000);
7058 static void register_970_lpar_sprs(CPUPPCState *env)
7060 #if !defined(CONFIG_USER_ONLY)
7062 * PPC970: HID4 covers things later controlled by the LPCR and
7063 * RMOR in later CPUs, but with a different encoding. We only
7064 * support the 970 in "Apple mode" which has all hypervisor
7065 * facilities disabled by strapping, so we can basically just
7066 * ignore it
7068 spr_register(env, SPR_970_HID4, "HID4",
7069 SPR_NOACCESS, SPR_NOACCESS,
7070 &spr_read_generic, &spr_write_generic,
7071 0x00000000);
7072 #endif
7075 static void register_power5p_lpar_sprs(CPUPPCState *env)
7077 #if !defined(CONFIG_USER_ONLY)
7078 /* Logical partitionning */
7079 spr_register_kvm_hv(env, SPR_LPCR, "LPCR",
7080 SPR_NOACCESS, SPR_NOACCESS,
7081 SPR_NOACCESS, SPR_NOACCESS,
7082 &spr_read_generic, &spr_write_lpcr,
7083 KVM_REG_PPC_LPCR, LPCR_LPES0 | LPCR_LPES1);
7084 spr_register_hv(env, SPR_HDEC, "HDEC",
7085 SPR_NOACCESS, SPR_NOACCESS,
7086 SPR_NOACCESS, SPR_NOACCESS,
7087 &spr_read_hdecr, &spr_write_hdecr, 0);
7088 #endif
7091 static void register_book3s_ids_sprs(CPUPPCState *env)
7093 /* FIXME: Will need to deal with thread vs core only SPRs */
7095 /* Processor identification */
7096 spr_register_hv(env, SPR_PIR, "PIR",
7097 SPR_NOACCESS, SPR_NOACCESS,
7098 &spr_read_generic, SPR_NOACCESS,
7099 &spr_read_generic, NULL,
7100 0x00000000);
7101 spr_register_hv(env, SPR_HID0, "HID0",
7102 SPR_NOACCESS, SPR_NOACCESS,
7103 SPR_NOACCESS, SPR_NOACCESS,
7104 &spr_read_generic, &spr_write_generic,
7105 0x00000000);
7106 spr_register_hv(env, SPR_TSCR, "TSCR",
7107 SPR_NOACCESS, SPR_NOACCESS,
7108 SPR_NOACCESS, SPR_NOACCESS,
7109 &spr_read_generic, &spr_write_generic,
7110 0x00000000);
7111 spr_register_hv(env, SPR_HMER, "HMER",
7112 SPR_NOACCESS, SPR_NOACCESS,
7113 SPR_NOACCESS, SPR_NOACCESS,
7114 &spr_read_generic, &spr_write_hmer,
7115 0x00000000);
7116 spr_register_hv(env, SPR_HMEER, "HMEER",
7117 SPR_NOACCESS, SPR_NOACCESS,
7118 SPR_NOACCESS, SPR_NOACCESS,
7119 &spr_read_generic, &spr_write_generic,
7120 0x00000000);
7121 spr_register_hv(env, SPR_TFMR, "TFMR",
7122 SPR_NOACCESS, SPR_NOACCESS,
7123 SPR_NOACCESS, SPR_NOACCESS,
7124 &spr_read_generic, &spr_write_generic,
7125 0x00000000);
7126 spr_register_hv(env, SPR_LPIDR, "LPIDR",
7127 SPR_NOACCESS, SPR_NOACCESS,
7128 SPR_NOACCESS, SPR_NOACCESS,
7129 &spr_read_generic, &spr_write_lpidr,
7130 0x00000000);
7131 spr_register_hv(env, SPR_HFSCR, "HFSCR",
7132 SPR_NOACCESS, SPR_NOACCESS,
7133 SPR_NOACCESS, SPR_NOACCESS,
7134 &spr_read_generic, &spr_write_generic,
7135 0x00000000);
7136 spr_register_hv(env, SPR_MMCRC, "MMCRC",
7137 SPR_NOACCESS, SPR_NOACCESS,
7138 SPR_NOACCESS, SPR_NOACCESS,
7139 &spr_read_generic, &spr_write_generic,
7140 0x00000000);
7141 spr_register_hv(env, SPR_MMCRH, "MMCRH",
7142 SPR_NOACCESS, SPR_NOACCESS,
7143 SPR_NOACCESS, SPR_NOACCESS,
7144 &spr_read_generic, &spr_write_generic,
7145 0x00000000);
7146 spr_register_hv(env, SPR_HSPRG0, "HSPRG0",
7147 SPR_NOACCESS, SPR_NOACCESS,
7148 SPR_NOACCESS, SPR_NOACCESS,
7149 &spr_read_generic, &spr_write_generic,
7150 0x00000000);
7151 spr_register_hv(env, SPR_HSPRG1, "HSPRG1",
7152 SPR_NOACCESS, SPR_NOACCESS,
7153 SPR_NOACCESS, SPR_NOACCESS,
7154 &spr_read_generic, &spr_write_generic,
7155 0x00000000);
7156 spr_register_hv(env, SPR_HSRR0, "HSRR0",
7157 SPR_NOACCESS, SPR_NOACCESS,
7158 SPR_NOACCESS, SPR_NOACCESS,
7159 &spr_read_generic, &spr_write_generic,
7160 0x00000000);
7161 spr_register_hv(env, SPR_HSRR1, "HSRR1",
7162 SPR_NOACCESS, SPR_NOACCESS,
7163 SPR_NOACCESS, SPR_NOACCESS,
7164 &spr_read_generic, &spr_write_generic,
7165 0x00000000);
7166 spr_register_hv(env, SPR_HDAR, "HDAR",
7167 SPR_NOACCESS, SPR_NOACCESS,
7168 SPR_NOACCESS, SPR_NOACCESS,
7169 &spr_read_generic, &spr_write_generic,
7170 0x00000000);
7171 spr_register_hv(env, SPR_HDSISR, "HDSISR",
7172 SPR_NOACCESS, SPR_NOACCESS,
7173 SPR_NOACCESS, SPR_NOACCESS,
7174 &spr_read_generic, &spr_write_generic,
7175 0x00000000);
7176 spr_register_hv(env, SPR_HRMOR, "HRMOR",
7177 SPR_NOACCESS, SPR_NOACCESS,
7178 SPR_NOACCESS, SPR_NOACCESS,
7179 &spr_read_generic, &spr_write_generic,
7180 0x00000000);
7183 static void register_rmor_sprs(CPUPPCState *env)
7185 spr_register_hv(env, SPR_RMOR, "RMOR",
7186 SPR_NOACCESS, SPR_NOACCESS,
7187 SPR_NOACCESS, SPR_NOACCESS,
7188 &spr_read_generic, &spr_write_generic,
7189 0x00000000);
7192 static void register_power8_ids_sprs(CPUPPCState *env)
7194 /* Thread identification */
7195 spr_register(env, SPR_TIR, "TIR",
7196 SPR_NOACCESS, SPR_NOACCESS,
7197 &spr_read_generic, SPR_NOACCESS,
7198 0x00000000);
7201 static void register_book3s_purr_sprs(CPUPPCState *env)
7203 #if !defined(CONFIG_USER_ONLY)
7204 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
7205 spr_register_kvm_hv(env, SPR_PURR, "PURR",
7206 &spr_read_purr, SPR_NOACCESS,
7207 &spr_read_purr, SPR_NOACCESS,
7208 &spr_read_purr, &spr_write_purr,
7209 KVM_REG_PPC_PURR, 0x00000000);
7210 spr_register_kvm_hv(env, SPR_SPURR, "SPURR",
7211 &spr_read_purr, SPR_NOACCESS,
7212 &spr_read_purr, SPR_NOACCESS,
7213 &spr_read_purr, &spr_write_purr,
7214 KVM_REG_PPC_SPURR, 0x00000000);
7215 #endif
7218 static void register_power6_dbg_sprs(CPUPPCState *env)
7220 #if !defined(CONFIG_USER_ONLY)
7221 spr_register(env, SPR_CFAR, "SPR_CFAR",
7222 SPR_NOACCESS, SPR_NOACCESS,
7223 &spr_read_cfar, &spr_write_cfar,
7224 0x00000000);
7225 #endif
7228 static void register_power5p_common_sprs(CPUPPCState *env)
7230 spr_register_kvm(env, SPR_PPR, "PPR",
7231 &spr_read_generic, &spr_write_generic,
7232 &spr_read_generic, &spr_write_generic,
7233 KVM_REG_PPC_PPR, 0x00000000);
7236 static void register_power6_common_sprs(CPUPPCState *env)
7238 #if !defined(CONFIG_USER_ONLY)
7239 spr_register_kvm(env, SPR_DSCR, "SPR_DSCR",
7240 SPR_NOACCESS, SPR_NOACCESS,
7241 &spr_read_generic, &spr_write_generic,
7242 KVM_REG_PPC_DSCR, 0x00000000);
7243 #endif
7245 * Register PCR to report POWERPC_EXCP_PRIV_REG instead of
7246 * POWERPC_EXCP_INVAL_SPR in userspace. Permit hypervisor access.
7248 spr_register_hv(env, SPR_PCR, "PCR",
7249 SPR_NOACCESS, SPR_NOACCESS,
7250 SPR_NOACCESS, SPR_NOACCESS,
7251 &spr_read_generic, &spr_write_pcr,
7252 0x00000000);
7255 static void register_power8_tce_address_control_sprs(CPUPPCState *env)
7257 spr_register_kvm(env, SPR_TAR, "TAR",
7258 &spr_read_tar, &spr_write_tar,
7259 &spr_read_generic, &spr_write_generic,
7260 KVM_REG_PPC_TAR, 0x00000000);
7263 static void register_power8_tm_sprs(CPUPPCState *env)
7265 spr_register_kvm(env, SPR_TFHAR, "TFHAR",
7266 &spr_read_tm, &spr_write_tm,
7267 &spr_read_tm, &spr_write_tm,
7268 KVM_REG_PPC_TFHAR, 0x00000000);
7269 spr_register_kvm(env, SPR_TFIAR, "TFIAR",
7270 &spr_read_tm, &spr_write_tm,
7271 &spr_read_tm, &spr_write_tm,
7272 KVM_REG_PPC_TFIAR, 0x00000000);
7273 spr_register_kvm(env, SPR_TEXASR, "TEXASR",
7274 &spr_read_tm, &spr_write_tm,
7275 &spr_read_tm, &spr_write_tm,
7276 KVM_REG_PPC_TEXASR, 0x00000000);
7277 spr_register(env, SPR_TEXASRU, "TEXASRU",
7278 &spr_read_tm_upper32, &spr_write_tm_upper32,
7279 &spr_read_tm_upper32, &spr_write_tm_upper32,
7280 0x00000000);
7283 static void register_power8_ebb_sprs(CPUPPCState *env)
7285 spr_register(env, SPR_BESCRS, "BESCRS",
7286 &spr_read_ebb, &spr_write_ebb,
7287 &spr_read_generic, &spr_write_generic,
7288 0x00000000);
7289 spr_register(env, SPR_BESCRSU, "BESCRSU",
7290 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
7291 &spr_read_prev_upper32, &spr_write_prev_upper32,
7292 0x00000000);
7293 spr_register(env, SPR_BESCRR, "BESCRR",
7294 &spr_read_ebb, &spr_write_ebb,
7295 &spr_read_generic, &spr_write_generic,
7296 0x00000000);
7297 spr_register(env, SPR_BESCRRU, "BESCRRU",
7298 &spr_read_ebb_upper32, &spr_write_ebb_upper32,
7299 &spr_read_prev_upper32, &spr_write_prev_upper32,
7300 0x00000000);
7301 spr_register_kvm(env, SPR_EBBHR, "EBBHR",
7302 &spr_read_ebb, &spr_write_ebb,
7303 &spr_read_generic, &spr_write_generic,
7304 KVM_REG_PPC_EBBHR, 0x00000000);
7305 spr_register_kvm(env, SPR_EBBRR, "EBBRR",
7306 &spr_read_ebb, &spr_write_ebb,
7307 &spr_read_generic, &spr_write_generic,
7308 KVM_REG_PPC_EBBRR, 0x00000000);
7309 spr_register_kvm(env, SPR_BESCR, "BESCR",
7310 &spr_read_ebb, &spr_write_ebb,
7311 &spr_read_generic, &spr_write_generic,
7312 KVM_REG_PPC_BESCR, 0x00000000);
7315 /* Virtual Time Base */
7316 static void register_vtb_sprs(CPUPPCState *env)
7318 spr_register_kvm_hv(env, SPR_VTB, "VTB",
7319 SPR_NOACCESS, SPR_NOACCESS,
7320 &spr_read_vtb, SPR_NOACCESS,
7321 &spr_read_vtb, &spr_write_vtb,
7322 KVM_REG_PPC_VTB, 0x00000000);
7325 static void register_power8_fscr_sprs(CPUPPCState *env)
7327 #if defined(CONFIG_USER_ONLY)
7328 target_ulong initval = 1ULL << FSCR_TAR;
7329 #else
7330 target_ulong initval = 0;
7331 #endif
7332 spr_register_kvm(env, SPR_FSCR, "FSCR",
7333 SPR_NOACCESS, SPR_NOACCESS,
7334 &spr_read_generic, &spr_write_generic,
7335 KVM_REG_PPC_FSCR, initval);
7338 static void register_power8_pspb_sprs(CPUPPCState *env)
7340 spr_register_kvm(env, SPR_PSPB, "PSPB",
7341 SPR_NOACCESS, SPR_NOACCESS,
7342 &spr_read_generic, &spr_write_generic32,
7343 KVM_REG_PPC_PSPB, 0);
7346 static void register_power8_dpdes_sprs(CPUPPCState *env)
7348 #if !defined(CONFIG_USER_ONLY)
7349 /* Directed Privileged Door-bell Exception State, used for IPI */
7350 spr_register_kvm_hv(env, SPR_DPDES, "DPDES",
7351 SPR_NOACCESS, SPR_NOACCESS,
7352 &spr_read_dpdes, SPR_NOACCESS,
7353 &spr_read_dpdes, &spr_write_dpdes,
7354 KVM_REG_PPC_DPDES, 0x00000000);
7355 #endif
7358 static void register_power8_ic_sprs(CPUPPCState *env)
7360 #if !defined(CONFIG_USER_ONLY)
7361 spr_register_hv(env, SPR_IC, "IC",
7362 SPR_NOACCESS, SPR_NOACCESS,
7363 &spr_read_generic, SPR_NOACCESS,
7364 &spr_read_generic, &spr_write_generic,
7366 #endif
7369 static void register_power8_book4_sprs(CPUPPCState *env)
7371 /* Add a number of P8 book4 registers */
7372 #if !defined(CONFIG_USER_ONLY)
7373 spr_register_kvm(env, SPR_ACOP, "ACOP",
7374 SPR_NOACCESS, SPR_NOACCESS,
7375 &spr_read_generic, &spr_write_generic,
7376 KVM_REG_PPC_ACOP, 0);
7377 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
7378 SPR_NOACCESS, SPR_NOACCESS,
7379 &spr_read_generic, &spr_write_pidr,
7380 KVM_REG_PPC_PID, 0);
7381 spr_register_kvm(env, SPR_WORT, "WORT",
7382 SPR_NOACCESS, SPR_NOACCESS,
7383 &spr_read_generic, &spr_write_generic,
7384 KVM_REG_PPC_WORT, 0);
7385 #endif
7388 static void register_power7_book4_sprs(CPUPPCState *env)
7390 /* Add a number of P7 book4 registers */
7391 #if !defined(CONFIG_USER_ONLY)
7392 spr_register_kvm(env, SPR_ACOP, "ACOP",
7393 SPR_NOACCESS, SPR_NOACCESS,
7394 &spr_read_generic, &spr_write_generic,
7395 KVM_REG_PPC_ACOP, 0);
7396 spr_register_kvm(env, SPR_BOOKS_PID, "PID",
7397 SPR_NOACCESS, SPR_NOACCESS,
7398 &spr_read_generic, &spr_write_generic,
7399 KVM_REG_PPC_PID, 0);
7400 #endif
7403 static void register_power8_rpr_sprs(CPUPPCState *env)
7405 #if !defined(CONFIG_USER_ONLY)
7406 spr_register_hv(env, SPR_RPR, "RPR",
7407 SPR_NOACCESS, SPR_NOACCESS,
7408 SPR_NOACCESS, SPR_NOACCESS,
7409 &spr_read_generic, &spr_write_generic,
7410 0x00000103070F1F3F);
7411 #endif
7414 static void register_power9_mmu_sprs(CPUPPCState *env)
7416 #if !defined(CONFIG_USER_ONLY)
7417 /* Partition Table Control */
7418 spr_register_kvm_hv(env, SPR_PTCR, "PTCR",
7419 SPR_NOACCESS, SPR_NOACCESS,
7420 SPR_NOACCESS, SPR_NOACCESS,
7421 &spr_read_generic, &spr_write_ptcr,
7422 KVM_REG_PPC_PTCR, 0x00000000);
7423 /* Address Segment Descriptor Register */
7424 spr_register_hv(env, SPR_ASDR, "ASDR",
7425 SPR_NOACCESS, SPR_NOACCESS,
7426 SPR_NOACCESS, SPR_NOACCESS,
7427 &spr_read_generic, &spr_write_generic,
7428 0x0000000000000000);
7429 #endif
7432 static void init_proc_book3s_common(CPUPPCState *env)
7434 register_ne_601_sprs(env);
7435 register_tbl(env);
7436 register_usprg3_sprs(env);
7437 register_book3s_altivec_sprs(env);
7438 register_book3s_pmu_sup_sprs(env);
7439 register_book3s_pmu_user_sprs(env);
7440 register_book3s_ctrl_sprs(env);
7442 * Can't find information on what this should be on reset. This
7443 * value is the one used by 74xx processors.
7445 vscr_init(env, 0x00010000);
7448 static void init_proc_970(CPUPPCState *env)
7450 /* Common Registers */
7451 init_proc_book3s_common(env);
7452 register_sdr1_sprs(env);
7453 register_book3s_dbg_sprs(env);
7455 /* 970 Specific Registers */
7456 register_970_hid_sprs(env);
7457 register_970_hior_sprs(env);
7458 register_low_BATs(env);
7459 register_970_pmu_sup_sprs(env);
7460 register_970_pmu_user_sprs(env);
7461 register_970_lpar_sprs(env);
7462 register_970_dbg_sprs(env);
7464 /* env variables */
7465 env->dcache_line_size = 128;
7466 env->icache_line_size = 128;
7468 /* Allocate hardware IRQ controller */
7469 init_excp_970(env);
7470 ppc970_irq_init(env_archcpu(env));
7473 POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
7475 DeviceClass *dc = DEVICE_CLASS(oc);
7476 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7478 dc->desc = "PowerPC 970";
7479 pcc->init_proc = init_proc_970;
7480 pcc->check_pow = check_pow_970;
7481 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7482 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7483 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7484 PPC_FLOAT_STFIWX |
7485 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7486 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7487 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7488 PPC_64B | PPC_ALTIVEC |
7489 PPC_SEGMENT_64B | PPC_SLBI;
7490 pcc->insns_flags2 = PPC2_FP_CVT_S64;
7491 pcc->msr_mask = (1ull << MSR_SF) |
7492 (1ull << MSR_VR) |
7493 (1ull << MSR_POW) |
7494 (1ull << MSR_EE) |
7495 (1ull << MSR_PR) |
7496 (1ull << MSR_FP) |
7497 (1ull << MSR_ME) |
7498 (1ull << MSR_FE0) |
7499 (1ull << MSR_SE) |
7500 (1ull << MSR_DE) |
7501 (1ull << MSR_FE1) |
7502 (1ull << MSR_IR) |
7503 (1ull << MSR_DR) |
7504 (1ull << MSR_PMM) |
7505 (1ull << MSR_RI);
7506 pcc->mmu_model = POWERPC_MMU_64B;
7507 #if defined(CONFIG_SOFTMMU)
7508 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
7509 pcc->hash64_opts = &ppc_hash64_opts_basic;
7510 #endif
7511 pcc->excp_model = POWERPC_EXCP_970;
7512 pcc->bus_model = PPC_FLAGS_INPUT_970;
7513 pcc->bfd_mach = bfd_mach_ppc64;
7514 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7515 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7516 POWERPC_FLAG_BUS_CLK;
7517 pcc->l1_dcache_size = 0x8000;
7518 pcc->l1_icache_size = 0x10000;
7521 static void init_proc_power5plus(CPUPPCState *env)
7523 /* Common Registers */
7524 init_proc_book3s_common(env);
7525 register_sdr1_sprs(env);
7526 register_book3s_dbg_sprs(env);
7528 /* POWER5+ Specific Registers */
7529 register_970_hid_sprs(env);
7530 register_970_hior_sprs(env);
7531 register_low_BATs(env);
7532 register_970_pmu_sup_sprs(env);
7533 register_970_pmu_user_sprs(env);
7534 register_power5p_common_sprs(env);
7535 register_power5p_lpar_sprs(env);
7536 register_power5p_ear_sprs(env);
7537 register_power5p_tb_sprs(env);
7539 /* env variables */
7540 env->dcache_line_size = 128;
7541 env->icache_line_size = 128;
7543 /* Allocate hardware IRQ controller */
7544 init_excp_970(env);
7545 ppc970_irq_init(env_archcpu(env));
7548 POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
7550 DeviceClass *dc = DEVICE_CLASS(oc);
7551 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7553 dc->fw_name = "PowerPC,POWER5";
7554 dc->desc = "POWER5+";
7555 pcc->init_proc = init_proc_power5plus;
7556 pcc->check_pow = check_pow_970;
7557 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7558 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7559 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7560 PPC_FLOAT_STFIWX |
7561 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7562 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7563 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7564 PPC_64B |
7565 PPC_SEGMENT_64B | PPC_SLBI;
7566 pcc->insns_flags2 = PPC2_FP_CVT_S64;
7567 pcc->msr_mask = (1ull << MSR_SF) |
7568 (1ull << MSR_VR) |
7569 (1ull << MSR_POW) |
7570 (1ull << MSR_EE) |
7571 (1ull << MSR_PR) |
7572 (1ull << MSR_FP) |
7573 (1ull << MSR_ME) |
7574 (1ull << MSR_FE0) |
7575 (1ull << MSR_SE) |
7576 (1ull << MSR_DE) |
7577 (1ull << MSR_FE1) |
7578 (1ull << MSR_IR) |
7579 (1ull << MSR_DR) |
7580 (1ull << MSR_PMM) |
7581 (1ull << MSR_RI);
7582 pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 |
7583 LPCR_RMI | LPCR_HDICE;
7584 pcc->mmu_model = POWERPC_MMU_2_03;
7585 #if defined(CONFIG_SOFTMMU)
7586 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
7587 pcc->hash64_opts = &ppc_hash64_opts_basic;
7588 pcc->lrg_decr_bits = 32;
7589 #endif
7590 pcc->excp_model = POWERPC_EXCP_970;
7591 pcc->bus_model = PPC_FLAGS_INPUT_970;
7592 pcc->bfd_mach = bfd_mach_ppc64;
7593 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7594 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7595 POWERPC_FLAG_BUS_CLK;
7596 pcc->l1_dcache_size = 0x8000;
7597 pcc->l1_icache_size = 0x10000;
7600 static void init_proc_POWER7(CPUPPCState *env)
7602 /* Common Registers */
7603 init_proc_book3s_common(env);
7604 register_sdr1_sprs(env);
7605 register_book3s_dbg_sprs(env);
7607 /* POWER7 Specific Registers */
7608 register_book3s_ids_sprs(env);
7609 register_rmor_sprs(env);
7610 register_amr_sprs(env);
7611 register_book3s_purr_sprs(env);
7612 register_power5p_common_sprs(env);
7613 register_power5p_lpar_sprs(env);
7614 register_power5p_ear_sprs(env);
7615 register_power5p_tb_sprs(env);
7616 register_power6_common_sprs(env);
7617 register_power6_dbg_sprs(env);
7618 register_power7_book4_sprs(env);
7620 /* env variables */
7621 env->dcache_line_size = 128;
7622 env->icache_line_size = 128;
7624 /* Allocate hardware IRQ controller */
7625 init_excp_POWER7(env);
7626 ppcPOWER7_irq_init(env_archcpu(env));
7629 static bool ppc_pvr_match_power7(PowerPCCPUClass *pcc, uint32_t pvr)
7631 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7P_BASE) {
7632 return true;
7634 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER7_BASE) {
7635 return true;
7637 return false;
7640 static bool cpu_has_work_POWER7(CPUState *cs)
7642 PowerPCCPU *cpu = POWERPC_CPU(cs);
7643 CPUPPCState *env = &cpu->env;
7645 if (cs->halted) {
7646 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
7647 return false;
7649 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
7650 (env->spr[SPR_LPCR] & LPCR_P7_PECE0)) {
7651 return true;
7653 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
7654 (env->spr[SPR_LPCR] & LPCR_P7_PECE1)) {
7655 return true;
7657 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
7658 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
7659 return true;
7661 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
7662 (env->spr[SPR_LPCR] & LPCR_P7_PECE2)) {
7663 return true;
7665 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
7666 return true;
7668 return false;
7669 } else {
7670 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
7674 POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
7676 DeviceClass *dc = DEVICE_CLASS(oc);
7677 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7678 CPUClass *cc = CPU_CLASS(oc);
7680 dc->fw_name = "PowerPC,POWER7";
7681 dc->desc = "POWER7";
7682 pcc->pvr_match = ppc_pvr_match_power7;
7683 pcc->pcr_mask = PCR_VEC_DIS | PCR_VSX_DIS | PCR_COMPAT_2_05;
7684 pcc->pcr_supported = PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
7685 pcc->init_proc = init_proc_POWER7;
7686 pcc->check_pow = check_pow_nocheck;
7687 cc->has_work = cpu_has_work_POWER7;
7688 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
7689 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7690 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7691 PPC_FLOAT_FRSQRTES |
7692 PPC_FLOAT_STFIWX |
7693 PPC_FLOAT_EXT |
7694 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7695 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7696 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7697 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
7698 PPC_SEGMENT_64B | PPC_SLBI |
7699 PPC_POPCNTB | PPC_POPCNTWD |
7700 PPC_CILDST;
7701 pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205 |
7702 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
7703 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
7704 PPC2_FP_TST_ISA206 | PPC2_FP_CVT_S64 |
7705 PPC2_PM_ISA206;
7706 pcc->msr_mask = (1ull << MSR_SF) |
7707 (1ull << MSR_VR) |
7708 (1ull << MSR_VSX) |
7709 (1ull << MSR_EE) |
7710 (1ull << MSR_PR) |
7711 (1ull << MSR_FP) |
7712 (1ull << MSR_ME) |
7713 (1ull << MSR_FE0) |
7714 (1ull << MSR_SE) |
7715 (1ull << MSR_DE) |
7716 (1ull << MSR_FE1) |
7717 (1ull << MSR_IR) |
7718 (1ull << MSR_DR) |
7719 (1ull << MSR_PMM) |
7720 (1ull << MSR_RI) |
7721 (1ull << MSR_LE);
7722 pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
7723 LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
7724 LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
7725 LPCR_MER | LPCR_TC |
7726 LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE;
7727 pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
7728 pcc->mmu_model = POWERPC_MMU_2_06;
7729 #if defined(CONFIG_SOFTMMU)
7730 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
7731 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
7732 pcc->lrg_decr_bits = 32;
7733 #endif
7734 pcc->excp_model = POWERPC_EXCP_POWER7;
7735 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
7736 pcc->bfd_mach = bfd_mach_ppc64;
7737 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7738 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7739 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
7740 POWERPC_FLAG_VSX;
7741 pcc->l1_dcache_size = 0x8000;
7742 pcc->l1_icache_size = 0x8000;
7743 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
7746 static void init_proc_POWER8(CPUPPCState *env)
7748 /* Common Registers */
7749 init_proc_book3s_common(env);
7750 register_sdr1_sprs(env);
7751 register_book3s_207_dbg_sprs(env);
7753 /* POWER8 Specific Registers */
7754 register_book3s_ids_sprs(env);
7755 register_rmor_sprs(env);
7756 register_amr_sprs(env);
7757 register_iamr_sprs(env);
7758 register_book3s_purr_sprs(env);
7759 register_power5p_common_sprs(env);
7760 register_power5p_lpar_sprs(env);
7761 register_power5p_ear_sprs(env);
7762 register_power5p_tb_sprs(env);
7763 register_power6_common_sprs(env);
7764 register_power6_dbg_sprs(env);
7765 register_power8_tce_address_control_sprs(env);
7766 register_power8_ids_sprs(env);
7767 register_power8_ebb_sprs(env);
7768 register_power8_fscr_sprs(env);
7769 register_power8_pmu_sup_sprs(env);
7770 register_power8_pmu_user_sprs(env);
7771 register_power8_tm_sprs(env);
7772 register_power8_pspb_sprs(env);
7773 register_power8_dpdes_sprs(env);
7774 register_vtb_sprs(env);
7775 register_power8_ic_sprs(env);
7776 register_power8_book4_sprs(env);
7777 register_power8_rpr_sprs(env);
7779 /* env variables */
7780 env->dcache_line_size = 128;
7781 env->icache_line_size = 128;
7783 /* Allocate hardware IRQ controller */
7784 init_excp_POWER8(env);
7785 ppcPOWER7_irq_init(env_archcpu(env));
7788 static bool ppc_pvr_match_power8(PowerPCCPUClass *pcc, uint32_t pvr)
7790 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8NVL_BASE) {
7791 return true;
7793 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8E_BASE) {
7794 return true;
7796 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER8_BASE) {
7797 return true;
7799 return false;
7802 static bool cpu_has_work_POWER8(CPUState *cs)
7804 PowerPCCPU *cpu = POWERPC_CPU(cs);
7805 CPUPPCState *env = &cpu->env;
7807 if (cs->halted) {
7808 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
7809 return false;
7811 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
7812 (env->spr[SPR_LPCR] & LPCR_P8_PECE2)) {
7813 return true;
7815 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
7816 (env->spr[SPR_LPCR] & LPCR_P8_PECE3)) {
7817 return true;
7819 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK)) &&
7820 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
7821 return true;
7823 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HMI)) &&
7824 (env->spr[SPR_LPCR] & LPCR_P8_PECE4)) {
7825 return true;
7827 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
7828 (env->spr[SPR_LPCR] & LPCR_P8_PECE0)) {
7829 return true;
7831 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
7832 (env->spr[SPR_LPCR] & LPCR_P8_PECE1)) {
7833 return true;
7835 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
7836 return true;
7838 return false;
7839 } else {
7840 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
7844 POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
7846 DeviceClass *dc = DEVICE_CLASS(oc);
7847 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7848 CPUClass *cc = CPU_CLASS(oc);
7850 dc->fw_name = "PowerPC,POWER8";
7851 dc->desc = "POWER8";
7852 pcc->pvr_match = ppc_pvr_match_power8;
7853 pcc->pcr_mask = PCR_TM_DIS | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
7854 pcc->pcr_supported = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
7855 pcc->init_proc = init_proc_POWER8;
7856 pcc->check_pow = check_pow_nocheck;
7857 cc->has_work = cpu_has_work_POWER8;
7858 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
7859 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7860 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7861 PPC_FLOAT_FRSQRTES |
7862 PPC_FLOAT_STFIWX |
7863 PPC_FLOAT_EXT |
7864 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7865 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7866 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7867 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
7868 PPC_SEGMENT_64B | PPC_SLBI |
7869 PPC_POPCNTB | PPC_POPCNTWD |
7870 PPC_CILDST;
7871 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
7872 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
7873 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
7874 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
7875 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
7876 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
7877 PPC2_TM | PPC2_PM_ISA206;
7878 pcc->msr_mask = (1ull << MSR_SF) |
7879 (1ull << MSR_HV) |
7880 (1ull << MSR_TM) |
7881 (1ull << MSR_VR) |
7882 (1ull << MSR_VSX) |
7883 (1ull << MSR_EE) |
7884 (1ull << MSR_PR) |
7885 (1ull << MSR_FP) |
7886 (1ull << MSR_ME) |
7887 (1ull << MSR_FE0) |
7888 (1ull << MSR_SE) |
7889 (1ull << MSR_DE) |
7890 (1ull << MSR_FE1) |
7891 (1ull << MSR_IR) |
7892 (1ull << MSR_DR) |
7893 (1ull << MSR_PMM) |
7894 (1ull << MSR_RI) |
7895 (1ull << MSR_TS0) |
7896 (1ull << MSR_TS1) |
7897 (1ull << MSR_LE);
7898 pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
7899 LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
7900 LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
7901 LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
7902 LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE;
7903 pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
7904 LPCR_P8_PECE3 | LPCR_P8_PECE4;
7905 pcc->mmu_model = POWERPC_MMU_2_07;
7906 #if defined(CONFIG_SOFTMMU)
7907 pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
7908 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
7909 pcc->lrg_decr_bits = 32;
7910 pcc->n_host_threads = 8;
7911 #endif
7912 pcc->excp_model = POWERPC_EXCP_POWER8;
7913 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
7914 pcc->bfd_mach = bfd_mach_ppc64;
7915 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7916 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7917 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
7918 POWERPC_FLAG_VSX | POWERPC_FLAG_TM;
7919 pcc->l1_dcache_size = 0x8000;
7920 pcc->l1_icache_size = 0x8000;
7921 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
7924 #ifdef CONFIG_SOFTMMU
7926 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
7927 * Encoded as array of int_32s in the form:
7928 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
7929 * x -> AP encoding
7930 * y -> radix mode supported page size (encoded as a shift)
7932 static struct ppc_radix_page_info POWER9_radix_page_info = {
7933 .count = 4,
7934 .entries = {
7935 0x0000000c, /* 4K - enc: 0x0 */
7936 0xa0000010, /* 64K - enc: 0x5 */
7937 0x20000015, /* 2M - enc: 0x1 */
7938 0x4000001e /* 1G - enc: 0x2 */
7941 #endif /* CONFIG_SOFTMMU */
7943 static void init_proc_POWER9(CPUPPCState *env)
7945 /* Common Registers */
7946 init_proc_book3s_common(env);
7947 register_book3s_207_dbg_sprs(env);
7949 /* POWER8 Specific Registers */
7950 register_book3s_ids_sprs(env);
7951 register_amr_sprs(env);
7952 register_iamr_sprs(env);
7953 register_book3s_purr_sprs(env);
7954 register_power5p_common_sprs(env);
7955 register_power5p_lpar_sprs(env);
7956 register_power5p_ear_sprs(env);
7957 register_power5p_tb_sprs(env);
7958 register_power6_common_sprs(env);
7959 register_power6_dbg_sprs(env);
7960 register_power8_tce_address_control_sprs(env);
7961 register_power8_ids_sprs(env);
7962 register_power8_ebb_sprs(env);
7963 register_power8_fscr_sprs(env);
7964 register_power8_pmu_sup_sprs(env);
7965 register_power8_pmu_user_sprs(env);
7966 register_power8_tm_sprs(env);
7967 register_power8_pspb_sprs(env);
7968 register_power8_dpdes_sprs(env);
7969 register_vtb_sprs(env);
7970 register_power8_ic_sprs(env);
7971 register_power8_book4_sprs(env);
7972 register_power8_rpr_sprs(env);
7973 register_power9_mmu_sprs(env);
7975 /* POWER9 Specific registers */
7976 spr_register_kvm(env, SPR_TIDR, "TIDR", NULL, NULL,
7977 spr_read_generic, spr_write_generic,
7978 KVM_REG_PPC_TIDR, 0);
7980 /* FIXME: Filter fields properly based on privilege level */
7981 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
7982 spr_read_generic, spr_write_generic,
7983 KVM_REG_PPC_PSSCR, 0);
7985 /* env variables */
7986 env->dcache_line_size = 128;
7987 env->icache_line_size = 128;
7989 /* Allocate hardware IRQ controller */
7990 init_excp_POWER9(env);
7991 ppcPOWER9_irq_init(env_archcpu(env));
7994 static bool ppc_pvr_match_power9(PowerPCCPUClass *pcc, uint32_t pvr)
7996 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER9_BASE) {
7997 return true;
7999 return false;
8002 static bool cpu_has_work_POWER9(CPUState *cs)
8004 PowerPCCPU *cpu = POWERPC_CPU(cs);
8005 CPUPPCState *env = &cpu->env;
8007 if (cs->halted) {
8008 uint64_t psscr = env->spr[SPR_PSSCR];
8010 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8011 return false;
8014 /* If EC is clear, just return true on any pending interrupt */
8015 if (!(psscr & PSSCR_EC)) {
8016 return true;
8018 /* External Exception */
8019 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8020 (env->spr[SPR_LPCR] & LPCR_EEE)) {
8021 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
8022 if (heic == 0 || !msr_hv || msr_pr) {
8023 return true;
8026 /* Decrementer Exception */
8027 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8028 (env->spr[SPR_LPCR] & LPCR_DEE)) {
8029 return true;
8031 /* Machine Check or Hypervisor Maintenance Exception */
8032 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK |
8033 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) {
8034 return true;
8036 /* Privileged Doorbell Exception */
8037 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
8038 (env->spr[SPR_LPCR] & LPCR_PDEE)) {
8039 return true;
8041 /* Hypervisor Doorbell Exception */
8042 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
8043 (env->spr[SPR_LPCR] & LPCR_HDEE)) {
8044 return true;
8046 /* Hypervisor virtualization exception */
8047 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) &&
8048 (env->spr[SPR_LPCR] & LPCR_HVEE)) {
8049 return true;
8051 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8052 return true;
8054 return false;
8055 } else {
8056 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8060 POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
8062 DeviceClass *dc = DEVICE_CLASS(oc);
8063 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8064 CPUClass *cc = CPU_CLASS(oc);
8066 dc->fw_name = "PowerPC,POWER9";
8067 dc->desc = "POWER9";
8068 pcc->pvr_match = ppc_pvr_match_power9;
8069 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07;
8070 pcc->pcr_supported = PCR_COMPAT_3_00 | PCR_COMPAT_2_07 | PCR_COMPAT_2_06 |
8071 PCR_COMPAT_2_05;
8072 pcc->init_proc = init_proc_POWER9;
8073 pcc->check_pow = check_pow_nocheck;
8074 cc->has_work = cpu_has_work_POWER9;
8075 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8076 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8077 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8078 PPC_FLOAT_FRSQRTES |
8079 PPC_FLOAT_STFIWX |
8080 PPC_FLOAT_EXT |
8081 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8082 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8083 PPC_MEM_TLBSYNC |
8084 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8085 PPC_SEGMENT_64B | PPC_SLBI |
8086 PPC_POPCNTB | PPC_POPCNTWD |
8087 PPC_CILDST;
8088 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
8089 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8090 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8091 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
8092 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
8093 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
8094 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
8095 pcc->msr_mask = (1ull << MSR_SF) |
8096 (1ull << MSR_HV) |
8097 (1ull << MSR_TM) |
8098 (1ull << MSR_VR) |
8099 (1ull << MSR_VSX) |
8100 (1ull << MSR_EE) |
8101 (1ull << MSR_PR) |
8102 (1ull << MSR_FP) |
8103 (1ull << MSR_ME) |
8104 (1ull << MSR_FE0) |
8105 (1ull << MSR_SE) |
8106 (1ull << MSR_DE) |
8107 (1ull << MSR_FE1) |
8108 (1ull << MSR_IR) |
8109 (1ull << MSR_DR) |
8110 (1ull << MSR_PMM) |
8111 (1ull << MSR_RI) |
8112 (1ull << MSR_LE);
8113 pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
8114 (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
8115 LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
8116 (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
8117 LPCR_DEE | LPCR_OEE))
8118 | LPCR_MER | LPCR_GTSE | LPCR_TC |
8119 LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
8120 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
8121 pcc->mmu_model = POWERPC_MMU_3_00;
8122 #if defined(CONFIG_SOFTMMU)
8123 pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault;
8124 /* segment page size remain the same */
8125 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8126 pcc->radix_page_info = &POWER9_radix_page_info;
8127 pcc->lrg_decr_bits = 56;
8128 pcc->n_host_threads = 4;
8129 #endif
8130 pcc->excp_model = POWERPC_EXCP_POWER9;
8131 pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
8132 pcc->bfd_mach = bfd_mach_ppc64;
8133 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8134 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8135 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8136 POWERPC_FLAG_VSX | POWERPC_FLAG_TM | POWERPC_FLAG_SCV;
8137 pcc->l1_dcache_size = 0x8000;
8138 pcc->l1_icache_size = 0x8000;
8139 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8142 #ifdef CONFIG_SOFTMMU
8144 * Radix pg sizes and AP encodings for dt node ibm,processor-radix-AP-encodings
8145 * Encoded as array of int_32s in the form:
8146 * 0bxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
8147 * x -> AP encoding
8148 * y -> radix mode supported page size (encoded as a shift)
8150 static struct ppc_radix_page_info POWER10_radix_page_info = {
8151 .count = 4,
8152 .entries = {
8153 0x0000000c, /* 4K - enc: 0x0 */
8154 0xa0000010, /* 64K - enc: 0x5 */
8155 0x20000015, /* 2M - enc: 0x1 */
8156 0x4000001e /* 1G - enc: 0x2 */
8159 #endif /* CONFIG_SOFTMMU */
8161 static void init_proc_POWER10(CPUPPCState *env)
8163 /* Common Registers */
8164 init_proc_book3s_common(env);
8165 register_book3s_207_dbg_sprs(env);
8167 /* POWER8 Specific Registers */
8168 register_book3s_ids_sprs(env);
8169 register_amr_sprs(env);
8170 register_iamr_sprs(env);
8171 register_book3s_purr_sprs(env);
8172 register_power5p_common_sprs(env);
8173 register_power5p_lpar_sprs(env);
8174 register_power5p_ear_sprs(env);
8175 register_power6_common_sprs(env);
8176 register_power6_dbg_sprs(env);
8177 register_power8_tce_address_control_sprs(env);
8178 register_power8_ids_sprs(env);
8179 register_power8_ebb_sprs(env);
8180 register_power8_fscr_sprs(env);
8181 register_power8_pmu_sup_sprs(env);
8182 register_power8_pmu_user_sprs(env);
8183 register_power8_tm_sprs(env);
8184 register_power8_pspb_sprs(env);
8185 register_vtb_sprs(env);
8186 register_power8_ic_sprs(env);
8187 register_power8_book4_sprs(env);
8188 register_power8_rpr_sprs(env);
8189 register_power9_mmu_sprs(env);
8191 /* FIXME: Filter fields properly based on privilege level */
8192 spr_register_kvm_hv(env, SPR_PSSCR, "PSSCR", NULL, NULL, NULL, NULL,
8193 spr_read_generic, spr_write_generic,
8194 KVM_REG_PPC_PSSCR, 0);
8196 /* env variables */
8197 env->dcache_line_size = 128;
8198 env->icache_line_size = 128;
8200 /* Allocate hardware IRQ controller */
8201 init_excp_POWER10(env);
8202 ppcPOWER9_irq_init(env_archcpu(env));
8205 static bool ppc_pvr_match_power10(PowerPCCPUClass *pcc, uint32_t pvr)
8207 if ((pvr & CPU_POWERPC_POWER_SERVER_MASK) == CPU_POWERPC_POWER10_BASE) {
8208 return true;
8210 return false;
8213 static bool cpu_has_work_POWER10(CPUState *cs)
8215 PowerPCCPU *cpu = POWERPC_CPU(cs);
8216 CPUPPCState *env = &cpu->env;
8218 if (cs->halted) {
8219 uint64_t psscr = env->spr[SPR_PSSCR];
8221 if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
8222 return false;
8225 /* If EC is clear, just return true on any pending interrupt */
8226 if (!(psscr & PSSCR_EC)) {
8227 return true;
8229 /* External Exception */
8230 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
8231 (env->spr[SPR_LPCR] & LPCR_EEE)) {
8232 bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
8233 if (heic == 0 || !msr_hv || msr_pr) {
8234 return true;
8237 /* Decrementer Exception */
8238 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DECR)) &&
8239 (env->spr[SPR_LPCR] & LPCR_DEE)) {
8240 return true;
8242 /* Machine Check or Hypervisor Maintenance Exception */
8243 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_MCK |
8244 1u << PPC_INTERRUPT_HMI)) && (env->spr[SPR_LPCR] & LPCR_OEE)) {
8245 return true;
8247 /* Privileged Doorbell Exception */
8248 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_DOORBELL)) &&
8249 (env->spr[SPR_LPCR] & LPCR_PDEE)) {
8250 return true;
8252 /* Hypervisor Doorbell Exception */
8253 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HDOORBELL)) &&
8254 (env->spr[SPR_LPCR] & LPCR_HDEE)) {
8255 return true;
8257 /* Hypervisor virtualization exception */
8258 if ((env->pending_interrupts & (1u << PPC_INTERRUPT_HVIRT)) &&
8259 (env->spr[SPR_LPCR] & LPCR_HVEE)) {
8260 return true;
8262 if (env->pending_interrupts & (1u << PPC_INTERRUPT_RESET)) {
8263 return true;
8265 return false;
8266 } else {
8267 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8271 POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
8273 DeviceClass *dc = DEVICE_CLASS(oc);
8274 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8275 CPUClass *cc = CPU_CLASS(oc);
8277 dc->fw_name = "PowerPC,POWER10";
8278 dc->desc = "POWER10";
8279 pcc->pvr_match = ppc_pvr_match_power10;
8280 pcc->pcr_mask = PCR_COMPAT_2_05 | PCR_COMPAT_2_06 | PCR_COMPAT_2_07 |
8281 PCR_COMPAT_3_00;
8282 pcc->pcr_supported = PCR_COMPAT_3_10 | PCR_COMPAT_3_00 | PCR_COMPAT_2_07 |
8283 PCR_COMPAT_2_06 | PCR_COMPAT_2_05;
8284 pcc->init_proc = init_proc_POWER10;
8285 pcc->check_pow = check_pow_nocheck;
8286 cc->has_work = cpu_has_work_POWER10;
8287 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB |
8288 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
8289 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
8290 PPC_FLOAT_FRSQRTES |
8291 PPC_FLOAT_STFIWX |
8292 PPC_FLOAT_EXT |
8293 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
8294 PPC_MEM_SYNC | PPC_MEM_EIEIO |
8295 PPC_MEM_TLBSYNC |
8296 PPC_64B | PPC_64H | PPC_64BX | PPC_ALTIVEC |
8297 PPC_SEGMENT_64B | PPC_SLBI |
8298 PPC_POPCNTB | PPC_POPCNTWD |
8299 PPC_CILDST;
8300 pcc->insns_flags2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX |
8301 PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 |
8302 PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 |
8303 PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 |
8304 PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 |
8305 PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
8306 PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL | PPC2_ISA310;
8307 pcc->msr_mask = (1ull << MSR_SF) |
8308 (1ull << MSR_HV) |
8309 (1ull << MSR_TM) |
8310 (1ull << MSR_VR) |
8311 (1ull << MSR_VSX) |
8312 (1ull << MSR_EE) |
8313 (1ull << MSR_PR) |
8314 (1ull << MSR_FP) |
8315 (1ull << MSR_ME) |
8316 (1ull << MSR_FE0) |
8317 (1ull << MSR_SE) |
8318 (1ull << MSR_DE) |
8319 (1ull << MSR_FE1) |
8320 (1ull << MSR_IR) |
8321 (1ull << MSR_DR) |
8322 (1ull << MSR_PMM) |
8323 (1ull << MSR_RI) |
8324 (1ull << MSR_LE);
8325 pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
8326 (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
8327 LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
8328 (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
8329 LPCR_DEE | LPCR_OEE))
8330 | LPCR_MER | LPCR_GTSE | LPCR_TC |
8331 LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
8332 pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
8333 pcc->mmu_model = POWERPC_MMU_3_00;
8334 #if defined(CONFIG_SOFTMMU)
8335 pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault;
8336 /* segment page size remain the same */
8337 pcc->hash64_opts = &ppc_hash64_opts_POWER7;
8338 pcc->radix_page_info = &POWER10_radix_page_info;
8339 pcc->lrg_decr_bits = 56;
8340 #endif
8341 pcc->excp_model = POWERPC_EXCP_POWER10;
8342 pcc->bus_model = PPC_FLAGS_INPUT_POWER9;
8343 pcc->bfd_mach = bfd_mach_ppc64;
8344 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
8345 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
8346 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR |
8347 POWERPC_FLAG_VSX | POWERPC_FLAG_TM | POWERPC_FLAG_SCV;
8348 pcc->l1_dcache_size = 0x8000;
8349 pcc->l1_icache_size = 0x8000;
8350 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
8353 #if !defined(CONFIG_USER_ONLY)
8354 void cpu_ppc_set_vhyp(PowerPCCPU *cpu, PPCVirtualHypervisor *vhyp)
8356 CPUPPCState *env = &cpu->env;
8358 cpu->vhyp = vhyp;
8361 * With a virtual hypervisor mode we never allow the CPU to go
8362 * hypervisor mode itself
8364 env->msr_mask &= ~MSR_HVB;
8367 #endif /* !defined(CONFIG_USER_ONLY) */
8369 #endif /* defined(TARGET_PPC64) */
8371 /*****************************************************************************/
8372 /* Generic CPU instantiation routine */
8373 static void init_ppc_proc(PowerPCCPU *cpu)
8375 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8376 CPUPPCState *env = &cpu->env;
8377 #if !defined(CONFIG_USER_ONLY)
8378 int i;
8380 env->irq_inputs = NULL;
8381 /* Set all exception vectors to an invalid address */
8382 for (i = 0; i < POWERPC_EXCP_NB; i++) {
8383 env->excp_vectors[i] = (target_ulong)(-1ULL);
8385 env->ivor_mask = 0x00000000;
8386 env->ivpr_mask = 0x00000000;
8387 /* Default MMU definitions */
8388 env->nb_BATs = 0;
8389 env->nb_tlb = 0;
8390 env->nb_ways = 0;
8391 env->tlb_type = TLB_NONE;
8392 #endif
8393 /* Register SPR common to all PowerPC implementations */
8394 register_generic_sprs(env);
8395 spr_register(env, SPR_PVR, "PVR",
8396 /* Linux permits userspace to read PVR */
8397 #if defined(CONFIG_LINUX_USER)
8398 &spr_read_generic,
8399 #else
8400 SPR_NOACCESS,
8401 #endif
8402 SPR_NOACCESS,
8403 &spr_read_generic, SPR_NOACCESS,
8404 pcc->pvr);
8405 /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
8406 if (pcc->svr != POWERPC_SVR_NONE) {
8407 if (pcc->svr & POWERPC_SVR_E500) {
8408 spr_register(env, SPR_E500_SVR, "SVR",
8409 SPR_NOACCESS, SPR_NOACCESS,
8410 &spr_read_generic, SPR_NOACCESS,
8411 pcc->svr & ~POWERPC_SVR_E500);
8412 } else {
8413 spr_register(env, SPR_SVR, "SVR",
8414 SPR_NOACCESS, SPR_NOACCESS,
8415 &spr_read_generic, SPR_NOACCESS,
8416 pcc->svr);
8419 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
8420 (*pcc->init_proc)(env);
8422 #if !defined(CONFIG_USER_ONLY)
8423 ppc_gdb_gen_spr_xml(cpu);
8424 #endif
8426 /* MSR bits & flags consistency checks */
8427 if (env->msr_mask & (1 << 25)) {
8428 switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
8429 case POWERPC_FLAG_SPE:
8430 case POWERPC_FLAG_VRE:
8431 break;
8432 default:
8433 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8434 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
8435 exit(1);
8437 } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
8438 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8439 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
8440 exit(1);
8442 if (env->msr_mask & (1 << 17)) {
8443 switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
8444 case POWERPC_FLAG_TGPR:
8445 case POWERPC_FLAG_CE:
8446 break;
8447 default:
8448 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8449 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
8450 exit(1);
8452 } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
8453 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8454 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
8455 exit(1);
8457 if (env->msr_mask & (1 << 10)) {
8458 switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
8459 POWERPC_FLAG_UBLE)) {
8460 case POWERPC_FLAG_SE:
8461 case POWERPC_FLAG_DWE:
8462 case POWERPC_FLAG_UBLE:
8463 break;
8464 default:
8465 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8466 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
8467 "POWERPC_FLAG_UBLE\n");
8468 exit(1);
8470 } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
8471 POWERPC_FLAG_UBLE)) {
8472 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8473 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
8474 "POWERPC_FLAG_UBLE\n");
8475 exit(1);
8477 if (env->msr_mask & (1 << 9)) {
8478 switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
8479 case POWERPC_FLAG_BE:
8480 case POWERPC_FLAG_DE:
8481 break;
8482 default:
8483 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8484 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
8485 exit(1);
8487 } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
8488 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8489 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
8490 exit(1);
8492 if (env->msr_mask & (1 << 2)) {
8493 switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
8494 case POWERPC_FLAG_PX:
8495 case POWERPC_FLAG_PMM:
8496 break;
8497 default:
8498 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8499 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
8500 exit(1);
8502 } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
8503 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
8504 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
8505 exit(1);
8507 if ((env->flags & (POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_BUS_CLK)) == 0) {
8508 fprintf(stderr, "PowerPC flags inconsistency\n"
8509 "Should define the time-base and decrementer clock source\n");
8510 exit(1);
8512 /* Allocate TLBs buffer when needed */
8513 #if !defined(CONFIG_USER_ONLY)
8514 if (env->nb_tlb != 0) {
8515 int nb_tlb = env->nb_tlb;
8516 if (env->id_tlbs != 0) {
8517 nb_tlb *= 2;
8519 switch (env->tlb_type) {
8520 case TLB_6XX:
8521 env->tlb.tlb6 = g_new0(ppc6xx_tlb_t, nb_tlb);
8522 break;
8523 case TLB_EMB:
8524 env->tlb.tlbe = g_new0(ppcemb_tlb_t, nb_tlb);
8525 break;
8526 case TLB_MAS:
8527 env->tlb.tlbm = g_new0(ppcmas_tlb_t, nb_tlb);
8528 break;
8530 /* Pre-compute some useful values */
8531 env->tlb_per_way = env->nb_tlb / env->nb_ways;
8533 if (env->irq_inputs == NULL) {
8534 warn_report("no internal IRQ controller registered."
8535 " Attempt QEMU to crash very soon !");
8537 #endif
8538 if (env->check_pow == NULL) {
8539 warn_report("no power management check handler registered."
8540 " Attempt QEMU to crash very soon !");
8545 static void ppc_cpu_realize(DeviceState *dev, Error **errp)
8547 CPUState *cs = CPU(dev);
8548 PowerPCCPU *cpu = POWERPC_CPU(dev);
8549 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8550 Error *local_err = NULL;
8552 cpu_exec_realizefn(cs, &local_err);
8553 if (local_err != NULL) {
8554 error_propagate(errp, local_err);
8555 return;
8557 if (cpu->vcpu_id == UNASSIGNED_CPU_INDEX) {
8558 cpu->vcpu_id = cs->cpu_index;
8561 if (tcg_enabled()) {
8562 if (ppc_fixup_cpu(cpu) != 0) {
8563 error_setg(errp, "Unable to emulate selected CPU with TCG");
8564 goto unrealize;
8568 create_ppc_opcodes(cpu, &local_err);
8569 if (local_err != NULL) {
8570 error_propagate(errp, local_err);
8571 goto unrealize;
8573 init_ppc_proc(cpu);
8575 ppc_gdb_init(cs, pcc);
8576 qemu_init_vcpu(cs);
8578 pcc->parent_realize(dev, errp);
8580 return;
8582 unrealize:
8583 cpu_exec_unrealizefn(cs);
8586 static void ppc_cpu_unrealize(DeviceState *dev)
8588 PowerPCCPU *cpu = POWERPC_CPU(dev);
8589 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8591 pcc->parent_unrealize(dev);
8593 cpu_remove_sync(CPU(cpu));
8595 destroy_ppc_opcodes(cpu);
8598 static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
8600 ObjectClass *oc = (ObjectClass *)a;
8601 uint32_t pvr = *(uint32_t *)b;
8602 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
8604 /* -cpu host does a PVR lookup during construction */
8605 if (unlikely(strcmp(object_class_get_name(oc),
8606 TYPE_HOST_POWERPC_CPU) == 0)) {
8607 return -1;
8610 return pcc->pvr == pvr ? 0 : -1;
8613 PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
8615 GSList *list, *item;
8616 PowerPCCPUClass *pcc = NULL;
8618 list = object_class_get_list(TYPE_POWERPC_CPU, false);
8619 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
8620 if (item != NULL) {
8621 pcc = POWERPC_CPU_CLASS(item->data);
8623 g_slist_free(list);
8625 return pcc;
8628 static gint ppc_cpu_compare_class_pvr_mask(gconstpointer a, gconstpointer b)
8630 ObjectClass *oc = (ObjectClass *)a;
8631 uint32_t pvr = *(uint32_t *)b;
8632 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
8634 /* -cpu host does a PVR lookup during construction */
8635 if (unlikely(strcmp(object_class_get_name(oc),
8636 TYPE_HOST_POWERPC_CPU) == 0)) {
8637 return -1;
8640 if (pcc->pvr_match(pcc, pvr)) {
8641 return 0;
8644 return -1;
8647 PowerPCCPUClass *ppc_cpu_class_by_pvr_mask(uint32_t pvr)
8649 GSList *list, *item;
8650 PowerPCCPUClass *pcc = NULL;
8652 list = object_class_get_list(TYPE_POWERPC_CPU, true);
8653 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr_mask);
8654 if (item != NULL) {
8655 pcc = POWERPC_CPU_CLASS(item->data);
8657 g_slist_free(list);
8659 return pcc;
8662 static const char *ppc_cpu_lookup_alias(const char *alias)
8664 int ai;
8666 for (ai = 0; ppc_cpu_aliases[ai].alias != NULL; ai++) {
8667 if (strcmp(ppc_cpu_aliases[ai].alias, alias) == 0) {
8668 return ppc_cpu_aliases[ai].model;
8672 return NULL;
8675 static ObjectClass *ppc_cpu_class_by_name(const char *name)
8677 char *cpu_model, *typename;
8678 ObjectClass *oc;
8679 const char *p;
8680 unsigned long pvr;
8683 * Lookup by PVR if cpu_model is valid 8 digit hex number (excl:
8684 * 0x prefix if present)
8686 if (!qemu_strtoul(name, &p, 16, &pvr)) {
8687 int len = p - name;
8688 len = (len == 10) && (name[1] == 'x') ? len - 2 : len;
8689 if ((len == 8) && (*p == '\0')) {
8690 return OBJECT_CLASS(ppc_cpu_class_by_pvr(pvr));
8694 cpu_model = g_ascii_strdown(name, -1);
8695 p = ppc_cpu_lookup_alias(cpu_model);
8696 if (p) {
8697 g_free(cpu_model);
8698 cpu_model = g_strdup(p);
8701 typename = g_strdup_printf("%s" POWERPC_CPU_TYPE_SUFFIX, cpu_model);
8702 oc = object_class_by_name(typename);
8703 g_free(typename);
8704 g_free(cpu_model);
8706 return oc;
8709 PowerPCCPUClass *ppc_cpu_get_family_class(PowerPCCPUClass *pcc)
8711 ObjectClass *oc = OBJECT_CLASS(pcc);
8713 while (oc && !object_class_is_abstract(oc)) {
8714 oc = object_class_get_parent(oc);
8716 assert(oc);
8718 return POWERPC_CPU_CLASS(oc);
8721 /* Sort by PVR, ordering special case "host" last. */
8722 static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
8724 ObjectClass *oc_a = (ObjectClass *)a;
8725 ObjectClass *oc_b = (ObjectClass *)b;
8726 PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
8727 PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
8728 const char *name_a = object_class_get_name(oc_a);
8729 const char *name_b = object_class_get_name(oc_b);
8731 if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
8732 return 1;
8733 } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
8734 return -1;
8735 } else {
8736 /* Avoid an integer overflow during subtraction */
8737 if (pcc_a->pvr < pcc_b->pvr) {
8738 return -1;
8739 } else if (pcc_a->pvr > pcc_b->pvr) {
8740 return 1;
8741 } else {
8742 return 0;
8747 static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
8749 ObjectClass *oc = data;
8750 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8751 DeviceClass *family = DEVICE_CLASS(ppc_cpu_get_family_class(pcc));
8752 const char *typename = object_class_get_name(oc);
8753 char *name;
8754 int i;
8756 if (unlikely(strcmp(typename, TYPE_HOST_POWERPC_CPU) == 0)) {
8757 return;
8760 name = g_strndup(typename,
8761 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
8762 qemu_printf("PowerPC %-16s PVR %08x\n", name, pcc->pvr);
8763 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
8764 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
8765 ObjectClass *alias_oc = ppc_cpu_class_by_name(alias->model);
8767 if (alias_oc != oc) {
8768 continue;
8771 * If running with KVM, we might update the family alias later, so
8772 * avoid printing the wrong alias here and use "preferred" instead
8774 if (strcmp(alias->alias, family->desc) == 0) {
8775 qemu_printf("PowerPC %-16s (alias for preferred %s CPU)\n",
8776 alias->alias, family->desc);
8777 } else {
8778 qemu_printf("PowerPC %-16s (alias for %s)\n",
8779 alias->alias, name);
8782 g_free(name);
8785 void ppc_cpu_list(void)
8787 GSList *list;
8789 list = object_class_get_list(TYPE_POWERPC_CPU, false);
8790 list = g_slist_sort(list, ppc_cpu_list_compare);
8791 g_slist_foreach(list, ppc_cpu_list_entry, NULL);
8792 g_slist_free(list);
8794 #ifdef CONFIG_KVM
8795 qemu_printf("\n");
8796 qemu_printf("PowerPC %-16s\n", "host");
8797 #endif
8800 static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
8802 ObjectClass *oc = data;
8803 CpuDefinitionInfoList **first = user_data;
8804 const char *typename;
8805 CpuDefinitionInfo *info;
8807 typename = object_class_get_name(oc);
8808 info = g_malloc0(sizeof(*info));
8809 info->name = g_strndup(typename,
8810 strlen(typename) - strlen(POWERPC_CPU_TYPE_SUFFIX));
8812 QAPI_LIST_PREPEND(*first, info);
8815 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
8817 CpuDefinitionInfoList *cpu_list = NULL;
8818 GSList *list;
8819 int i;
8821 list = object_class_get_list(TYPE_POWERPC_CPU, false);
8822 g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
8823 g_slist_free(list);
8825 for (i = 0; ppc_cpu_aliases[i].alias != NULL; i++) {
8826 PowerPCCPUAlias *alias = &ppc_cpu_aliases[i];
8827 ObjectClass *oc;
8828 CpuDefinitionInfo *info;
8830 oc = ppc_cpu_class_by_name(alias->model);
8831 if (oc == NULL) {
8832 continue;
8835 info = g_malloc0(sizeof(*info));
8836 info->name = g_strdup(alias->alias);
8837 info->q_typename = g_strdup(object_class_get_name(oc));
8839 QAPI_LIST_PREPEND(cpu_list, info);
8842 return cpu_list;
8845 static void ppc_cpu_set_pc(CPUState *cs, vaddr value)
8847 PowerPCCPU *cpu = POWERPC_CPU(cs);
8849 cpu->env.nip = value;
8852 static bool ppc_cpu_has_work(CPUState *cs)
8854 PowerPCCPU *cpu = POWERPC_CPU(cs);
8855 CPUPPCState *env = &cpu->env;
8857 return msr_ee && (cs->interrupt_request & CPU_INTERRUPT_HARD);
8860 static void ppc_cpu_reset(DeviceState *dev)
8862 CPUState *s = CPU(dev);
8863 PowerPCCPU *cpu = POWERPC_CPU(s);
8864 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8865 CPUPPCState *env = &cpu->env;
8866 target_ulong msr;
8867 int i;
8869 pcc->parent_reset(dev);
8871 msr = (target_ulong)0;
8872 msr |= (target_ulong)MSR_HVB;
8873 msr |= (target_ulong)0 << MSR_AP; /* TO BE CHECKED */
8874 msr |= (target_ulong)0 << MSR_SA; /* TO BE CHECKED */
8875 msr |= (target_ulong)1 << MSR_EP;
8876 #if defined(DO_SINGLE_STEP) && 0
8877 /* Single step trace mode */
8878 msr |= (target_ulong)1 << MSR_SE;
8879 msr |= (target_ulong)1 << MSR_BE;
8880 #endif
8881 #if defined(CONFIG_USER_ONLY)
8882 msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */
8883 msr |= (target_ulong)1 << MSR_FE0; /* Allow floating point exceptions */
8884 msr |= (target_ulong)1 << MSR_FE1;
8885 msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */
8886 msr |= (target_ulong)1 << MSR_VSX; /* Allow VSX usage */
8887 msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */
8888 msr |= (target_ulong)1 << MSR_PR;
8889 #if defined(TARGET_PPC64)
8890 msr |= (target_ulong)1 << MSR_TM; /* Transactional memory */
8891 #endif
8892 #if !defined(TARGET_WORDS_BIGENDIAN)
8893 msr |= (target_ulong)1 << MSR_LE; /* Little-endian user mode */
8894 if (!((env->msr_mask >> MSR_LE) & 1)) {
8895 fprintf(stderr, "Selected CPU does not support little-endian.\n");
8896 exit(1);
8898 #endif
8899 #endif
8901 #if defined(TARGET_PPC64)
8902 if (mmu_is_64bit(env->mmu_model)) {
8903 msr |= (1ULL << MSR_SF);
8905 #endif
8907 hreg_store_msr(env, msr, 1);
8909 #if !defined(CONFIG_USER_ONLY)
8910 env->nip = env->hreset_vector | env->excp_prefix;
8911 if (env->mmu_model != POWERPC_MMU_REAL) {
8912 ppc_tlb_invalidate_all(env);
8914 #endif
8916 hreg_compute_hflags(env);
8917 env->reserve_addr = (target_ulong)-1ULL;
8918 /* Be sure no exception or interrupt is pending */
8919 env->pending_interrupts = 0;
8920 s->exception_index = POWERPC_EXCP_NONE;
8921 env->error_code = 0;
8922 ppc_irq_reset(cpu);
8924 /* tininess for underflow is detected before rounding */
8925 set_float_detect_tininess(float_tininess_before_rounding,
8926 &env->fp_status);
8928 for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
8929 ppc_spr_t *spr = &env->spr_cb[i];
8931 if (!spr->name) {
8932 continue;
8934 env->spr[i] = spr->default_value;
8938 #ifndef CONFIG_USER_ONLY
8940 static bool ppc_cpu_is_big_endian(CPUState *cs)
8942 PowerPCCPU *cpu = POWERPC_CPU(cs);
8943 CPUPPCState *env = &cpu->env;
8945 cpu_synchronize_state(cs);
8947 return !msr_le;
8950 #ifdef CONFIG_TCG
8951 static void ppc_cpu_exec_enter(CPUState *cs)
8953 PowerPCCPU *cpu = POWERPC_CPU(cs);
8955 if (cpu->vhyp) {
8956 PPCVirtualHypervisorClass *vhc =
8957 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
8958 vhc->cpu_exec_enter(cpu->vhyp, cpu);
8962 static void ppc_cpu_exec_exit(CPUState *cs)
8964 PowerPCCPU *cpu = POWERPC_CPU(cs);
8966 if (cpu->vhyp) {
8967 PPCVirtualHypervisorClass *vhc =
8968 PPC_VIRTUAL_HYPERVISOR_GET_CLASS(cpu->vhyp);
8969 vhc->cpu_exec_exit(cpu->vhyp, cpu);
8972 #endif /* CONFIG_TCG */
8974 #endif /* !CONFIG_USER_ONLY */
8976 static void ppc_cpu_instance_init(Object *obj)
8978 PowerPCCPU *cpu = POWERPC_CPU(obj);
8979 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8980 CPUPPCState *env = &cpu->env;
8982 cpu_set_cpustate_pointers(cpu);
8983 cpu->vcpu_id = UNASSIGNED_CPU_INDEX;
8985 env->msr_mask = pcc->msr_mask;
8986 env->mmu_model = pcc->mmu_model;
8987 env->excp_model = pcc->excp_model;
8988 env->bus_model = pcc->bus_model;
8989 env->insns_flags = pcc->insns_flags;
8990 env->insns_flags2 = pcc->insns_flags2;
8991 env->flags = pcc->flags;
8992 env->bfd_mach = pcc->bfd_mach;
8993 env->check_pow = pcc->check_pow;
8996 * Mark HV mode as supported if the CPU has an MSR_HV bit in the
8997 * msr_mask. The mask can later be cleared by PAPR mode but the hv
8998 * mode support will remain, thus enforcing that we cannot use
8999 * priv. instructions in guest in PAPR mode. For 970 we currently
9000 * simply don't set HV in msr_mask thus simulating an "Apple mode"
9001 * 970. If we ever want to support 970 HV mode, we'll have to add
9002 * a processor attribute of some sort.
9004 #if !defined(CONFIG_USER_ONLY)
9005 env->has_hv_mode = !!(env->msr_mask & MSR_HVB);
9006 #endif
9008 ppc_hash64_init(cpu);
9011 static void ppc_cpu_instance_finalize(Object *obj)
9013 PowerPCCPU *cpu = POWERPC_CPU(obj);
9015 ppc_hash64_finalize(cpu);
9018 static bool ppc_pvr_match_default(PowerPCCPUClass *pcc, uint32_t pvr)
9020 return pcc->pvr == pvr;
9023 static void ppc_disas_set_info(CPUState *cs, disassemble_info *info)
9025 PowerPCCPU *cpu = POWERPC_CPU(cs);
9026 CPUPPCState *env = &cpu->env;
9028 if ((env->hflags >> MSR_LE) & 1) {
9029 info->endian = BFD_ENDIAN_LITTLE;
9031 info->mach = env->bfd_mach;
9032 if (!env->bfd_mach) {
9033 #ifdef TARGET_PPC64
9034 info->mach = bfd_mach_ppc64;
9035 #else
9036 info->mach = bfd_mach_ppc;
9037 #endif
9039 info->disassembler_options = (char *)"any";
9040 info->print_insn = print_insn_ppc;
9042 info->cap_arch = CS_ARCH_PPC;
9043 #ifdef TARGET_PPC64
9044 info->cap_mode = CS_MODE_64;
9045 #endif
9048 static Property ppc_cpu_properties[] = {
9049 DEFINE_PROP_BOOL("pre-2.8-migration", PowerPCCPU, pre_2_8_migration, false),
9050 DEFINE_PROP_BOOL("pre-2.10-migration", PowerPCCPU, pre_2_10_migration,
9051 false),
9052 DEFINE_PROP_BOOL("pre-3.0-migration", PowerPCCPU, pre_3_0_migration,
9053 false),
9054 DEFINE_PROP_END_OF_LIST(),
9057 #ifndef CONFIG_USER_ONLY
9058 #include "hw/core/sysemu-cpu-ops.h"
9060 static const struct SysemuCPUOps ppc_sysemu_ops = {
9061 .get_phys_page_debug = ppc_cpu_get_phys_page_debug,
9062 .write_elf32_note = ppc32_cpu_write_elf32_note,
9063 .write_elf64_note = ppc64_cpu_write_elf64_note,
9064 .virtio_is_big_endian = ppc_cpu_is_big_endian,
9065 .legacy_vmsd = &vmstate_ppc_cpu,
9067 #endif
9069 #ifdef CONFIG_TCG
9070 #include "hw/core/tcg-cpu-ops.h"
9072 static const struct TCGCPUOps ppc_tcg_ops = {
9073 .initialize = ppc_translate_init,
9074 .cpu_exec_interrupt = ppc_cpu_exec_interrupt,
9075 .tlb_fill = ppc_cpu_tlb_fill,
9077 #ifndef CONFIG_USER_ONLY
9078 .do_interrupt = ppc_cpu_do_interrupt,
9079 .cpu_exec_enter = ppc_cpu_exec_enter,
9080 .cpu_exec_exit = ppc_cpu_exec_exit,
9081 .do_unaligned_access = ppc_cpu_do_unaligned_access,
9082 #endif /* !CONFIG_USER_ONLY */
9084 #endif /* CONFIG_TCG */
9086 static void ppc_cpu_class_init(ObjectClass *oc, void *data)
9088 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
9089 CPUClass *cc = CPU_CLASS(oc);
9090 DeviceClass *dc = DEVICE_CLASS(oc);
9092 device_class_set_parent_realize(dc, ppc_cpu_realize,
9093 &pcc->parent_realize);
9094 device_class_set_parent_unrealize(dc, ppc_cpu_unrealize,
9095 &pcc->parent_unrealize);
9096 pcc->pvr_match = ppc_pvr_match_default;
9097 pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_always;
9098 device_class_set_props(dc, ppc_cpu_properties);
9100 device_class_set_parent_reset(dc, ppc_cpu_reset, &pcc->parent_reset);
9102 cc->class_by_name = ppc_cpu_class_by_name;
9103 cc->has_work = ppc_cpu_has_work;
9104 cc->dump_state = ppc_cpu_dump_state;
9105 cc->set_pc = ppc_cpu_set_pc;
9106 cc->gdb_read_register = ppc_cpu_gdb_read_register;
9107 cc->gdb_write_register = ppc_cpu_gdb_write_register;
9108 #ifndef CONFIG_USER_ONLY
9109 cc->sysemu_ops = &ppc_sysemu_ops;
9110 #endif
9112 cc->gdb_num_core_regs = 71;
9113 #ifndef CONFIG_USER_ONLY
9114 cc->gdb_get_dynamic_xml = ppc_gdb_get_dynamic_xml;
9115 #endif
9116 #ifdef USE_APPLE_GDB
9117 cc->gdb_read_register = ppc_cpu_gdb_read_register_apple;
9118 cc->gdb_write_register = ppc_cpu_gdb_write_register_apple;
9119 cc->gdb_num_core_regs = 71 + 32;
9120 #endif
9122 cc->gdb_arch_name = ppc_gdb_arch_name;
9123 #if defined(TARGET_PPC64)
9124 cc->gdb_core_xml_file = "power64-core.xml";
9125 #else
9126 cc->gdb_core_xml_file = "power-core.xml";
9127 #endif
9128 cc->disas_set_info = ppc_disas_set_info;
9130 dc->fw_name = "PowerPC,UNKNOWN";
9132 #ifdef CONFIG_TCG
9133 cc->tcg_ops = &ppc_tcg_ops;
9134 #endif /* CONFIG_TCG */
9137 static const TypeInfo ppc_cpu_type_info = {
9138 .name = TYPE_POWERPC_CPU,
9139 .parent = TYPE_CPU,
9140 .instance_size = sizeof(PowerPCCPU),
9141 .instance_align = __alignof__(PowerPCCPU),
9142 .instance_init = ppc_cpu_instance_init,
9143 .instance_finalize = ppc_cpu_instance_finalize,
9144 .abstract = true,
9145 .class_size = sizeof(PowerPCCPUClass),
9146 .class_init = ppc_cpu_class_init,
9149 #ifndef CONFIG_USER_ONLY
9150 static const TypeInfo ppc_vhyp_type_info = {
9151 .name = TYPE_PPC_VIRTUAL_HYPERVISOR,
9152 .parent = TYPE_INTERFACE,
9153 .class_size = sizeof(PPCVirtualHypervisorClass),
9155 #endif
9157 static void ppc_cpu_register_types(void)
9159 type_register_static(&ppc_cpu_type_info);
9160 #ifndef CONFIG_USER_ONLY
9161 type_register_static(&ppc_vhyp_type_info);
9162 #endif
9165 void ppc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
9167 #define RGPL 4
9168 #define RFPL 4
9170 PowerPCCPU *cpu = POWERPC_CPU(cs);
9171 CPUPPCState *env = &cpu->env;
9172 int i;
9174 qemu_fprintf(f, "NIP " TARGET_FMT_lx " LR " TARGET_FMT_lx " CTR "
9175 TARGET_FMT_lx " XER " TARGET_FMT_lx " CPU#%d\n",
9176 env->nip, env->lr, env->ctr, cpu_read_xer(env),
9177 cs->cpu_index);
9178 qemu_fprintf(f, "MSR " TARGET_FMT_lx " HID0 " TARGET_FMT_lx " HF "
9179 "%08x iidx %d didx %d\n",
9180 env->msr, env->spr[SPR_HID0], env->hflags,
9181 cpu_mmu_index(env, true), cpu_mmu_index(env, false));
9182 #if !defined(NO_TIMER_DUMP)
9183 qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64
9184 #if !defined(CONFIG_USER_ONLY)
9185 " DECR " TARGET_FMT_lu
9186 #endif
9187 "\n",
9188 cpu_ppc_load_tbu(env), cpu_ppc_load_tbl(env)
9189 #if !defined(CONFIG_USER_ONLY)
9190 , cpu_ppc_load_decr(env)
9191 #endif
9193 #endif
9194 for (i = 0; i < 32; i++) {
9195 if ((i & (RGPL - 1)) == 0) {
9196 qemu_fprintf(f, "GPR%02d", i);
9198 qemu_fprintf(f, " %016" PRIx64, ppc_dump_gpr(env, i));
9199 if ((i & (RGPL - 1)) == (RGPL - 1)) {
9200 qemu_fprintf(f, "\n");
9203 qemu_fprintf(f, "CR ");
9204 for (i = 0; i < 8; i++)
9205 qemu_fprintf(f, "%01x", env->crf[i]);
9206 qemu_fprintf(f, " [");
9207 for (i = 0; i < 8; i++) {
9208 char a = '-';
9209 if (env->crf[i] & 0x08) {
9210 a = 'L';
9211 } else if (env->crf[i] & 0x04) {
9212 a = 'G';
9213 } else if (env->crf[i] & 0x02) {
9214 a = 'E';
9216 qemu_fprintf(f, " %c%c", a, env->crf[i] & 0x01 ? 'O' : ' ');
9218 qemu_fprintf(f, " ] RES " TARGET_FMT_lx "\n",
9219 env->reserve_addr);
9221 if (flags & CPU_DUMP_FPU) {
9222 for (i = 0; i < 32; i++) {
9223 if ((i & (RFPL - 1)) == 0) {
9224 qemu_fprintf(f, "FPR%02d", i);
9226 qemu_fprintf(f, " %016" PRIx64, *cpu_fpr_ptr(env, i));
9227 if ((i & (RFPL - 1)) == (RFPL - 1)) {
9228 qemu_fprintf(f, "\n");
9231 qemu_fprintf(f, "FPSCR " TARGET_FMT_lx "\n", env->fpscr);
9234 #if !defined(CONFIG_USER_ONLY)
9235 qemu_fprintf(f, " SRR0 " TARGET_FMT_lx " SRR1 " TARGET_FMT_lx
9236 " PVR " TARGET_FMT_lx " VRSAVE " TARGET_FMT_lx "\n",
9237 env->spr[SPR_SRR0], env->spr[SPR_SRR1],
9238 env->spr[SPR_PVR], env->spr[SPR_VRSAVE]);
9240 qemu_fprintf(f, "SPRG0 " TARGET_FMT_lx " SPRG1 " TARGET_FMT_lx
9241 " SPRG2 " TARGET_FMT_lx " SPRG3 " TARGET_FMT_lx "\n",
9242 env->spr[SPR_SPRG0], env->spr[SPR_SPRG1],
9243 env->spr[SPR_SPRG2], env->spr[SPR_SPRG3]);
9245 qemu_fprintf(f, "SPRG4 " TARGET_FMT_lx " SPRG5 " TARGET_FMT_lx
9246 " SPRG6 " TARGET_FMT_lx " SPRG7 " TARGET_FMT_lx "\n",
9247 env->spr[SPR_SPRG4], env->spr[SPR_SPRG5],
9248 env->spr[SPR_SPRG6], env->spr[SPR_SPRG7]);
9250 #if defined(TARGET_PPC64)
9251 if (env->excp_model == POWERPC_EXCP_POWER7 ||
9252 env->excp_model == POWERPC_EXCP_POWER8 ||
9253 env->excp_model == POWERPC_EXCP_POWER9 ||
9254 env->excp_model == POWERPC_EXCP_POWER10) {
9255 qemu_fprintf(f, "HSRR0 " TARGET_FMT_lx " HSRR1 " TARGET_FMT_lx "\n",
9256 env->spr[SPR_HSRR0], env->spr[SPR_HSRR1]);
9258 #endif
9259 if (env->excp_model == POWERPC_EXCP_BOOKE) {
9260 qemu_fprintf(f, "CSRR0 " TARGET_FMT_lx " CSRR1 " TARGET_FMT_lx
9261 " MCSRR0 " TARGET_FMT_lx " MCSRR1 " TARGET_FMT_lx "\n",
9262 env->spr[SPR_BOOKE_CSRR0], env->spr[SPR_BOOKE_CSRR1],
9263 env->spr[SPR_BOOKE_MCSRR0], env->spr[SPR_BOOKE_MCSRR1]);
9265 qemu_fprintf(f, " TCR " TARGET_FMT_lx " TSR " TARGET_FMT_lx
9266 " ESR " TARGET_FMT_lx " DEAR " TARGET_FMT_lx "\n",
9267 env->spr[SPR_BOOKE_TCR], env->spr[SPR_BOOKE_TSR],
9268 env->spr[SPR_BOOKE_ESR], env->spr[SPR_BOOKE_DEAR]);
9270 qemu_fprintf(f, " PIR " TARGET_FMT_lx " DECAR " TARGET_FMT_lx
9271 " IVPR " TARGET_FMT_lx " EPCR " TARGET_FMT_lx "\n",
9272 env->spr[SPR_BOOKE_PIR], env->spr[SPR_BOOKE_DECAR],
9273 env->spr[SPR_BOOKE_IVPR], env->spr[SPR_BOOKE_EPCR]);
9275 qemu_fprintf(f, " MCSR " TARGET_FMT_lx " SPRG8 " TARGET_FMT_lx
9276 " EPR " TARGET_FMT_lx "\n",
9277 env->spr[SPR_BOOKE_MCSR], env->spr[SPR_BOOKE_SPRG8],
9278 env->spr[SPR_BOOKE_EPR]);
9280 /* FSL-specific */
9281 qemu_fprintf(f, " MCAR " TARGET_FMT_lx " PID1 " TARGET_FMT_lx
9282 " PID2 " TARGET_FMT_lx " SVR " TARGET_FMT_lx "\n",
9283 env->spr[SPR_Exxx_MCAR], env->spr[SPR_BOOKE_PID1],
9284 env->spr[SPR_BOOKE_PID2], env->spr[SPR_E500_SVR]);
9287 * IVORs are left out as they are large and do not change often --
9288 * they can be read with "p $ivor0", "p $ivor1", etc.
9292 #if defined(TARGET_PPC64)
9293 if (env->flags & POWERPC_FLAG_CFAR) {
9294 qemu_fprintf(f, " CFAR " TARGET_FMT_lx"\n", env->cfar);
9296 #endif
9298 if (env->spr_cb[SPR_LPCR].name) {
9299 qemu_fprintf(f, " LPCR " TARGET_FMT_lx "\n", env->spr[SPR_LPCR]);
9302 switch (env->mmu_model) {
9303 case POWERPC_MMU_32B:
9304 case POWERPC_MMU_601:
9305 case POWERPC_MMU_SOFT_6xx:
9306 case POWERPC_MMU_SOFT_74xx:
9307 #if defined(TARGET_PPC64)
9308 case POWERPC_MMU_64B:
9309 case POWERPC_MMU_2_03:
9310 case POWERPC_MMU_2_06:
9311 case POWERPC_MMU_2_07:
9312 case POWERPC_MMU_3_00:
9313 #endif
9314 if (env->spr_cb[SPR_SDR1].name) { /* SDR1 Exists */
9315 qemu_fprintf(f, " SDR1 " TARGET_FMT_lx " ", env->spr[SPR_SDR1]);
9317 if (env->spr_cb[SPR_PTCR].name) { /* PTCR Exists */
9318 qemu_fprintf(f, " PTCR " TARGET_FMT_lx " ", env->spr[SPR_PTCR]);
9320 qemu_fprintf(f, " DAR " TARGET_FMT_lx " DSISR " TARGET_FMT_lx "\n",
9321 env->spr[SPR_DAR], env->spr[SPR_DSISR]);
9322 break;
9323 case POWERPC_MMU_BOOKE206:
9324 qemu_fprintf(f, " MAS0 " TARGET_FMT_lx " MAS1 " TARGET_FMT_lx
9325 " MAS2 " TARGET_FMT_lx " MAS3 " TARGET_FMT_lx "\n",
9326 env->spr[SPR_BOOKE_MAS0], env->spr[SPR_BOOKE_MAS1],
9327 env->spr[SPR_BOOKE_MAS2], env->spr[SPR_BOOKE_MAS3]);
9329 qemu_fprintf(f, " MAS4 " TARGET_FMT_lx " MAS6 " TARGET_FMT_lx
9330 " MAS7 " TARGET_FMT_lx " PID " TARGET_FMT_lx "\n",
9331 env->spr[SPR_BOOKE_MAS4], env->spr[SPR_BOOKE_MAS6],
9332 env->spr[SPR_BOOKE_MAS7], env->spr[SPR_BOOKE_PID]);
9334 qemu_fprintf(f, "MMUCFG " TARGET_FMT_lx " TLB0CFG " TARGET_FMT_lx
9335 " TLB1CFG " TARGET_FMT_lx "\n",
9336 env->spr[SPR_MMUCFG], env->spr[SPR_BOOKE_TLB0CFG],
9337 env->spr[SPR_BOOKE_TLB1CFG]);
9338 break;
9339 default:
9340 break;
9342 #endif
9344 #undef RGPL
9345 #undef RFPL
9347 type_init(ppc_cpu_register_types)