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