]> git.proxmox.com Git - qemu.git/blob - target-ppc/translate_init.c
target-ppc: Split model definitions out of translate_init.c
[qemu.git] / target-ppc / translate_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 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 "disas/bfd.h"
22 #include "exec/gdbstub.h"
23 #include <sysemu/kvm.h>
24 #include "kvm_ppc.h"
25 #include "sysemu/arch_init.h"
26 #include "sysemu/cpus.h"
27 #include "cpu-models.h"
28
29 //#define PPC_DUMP_CPU
30 //#define PPC_DEBUG_SPR
31 //#define PPC_DUMP_SPR_ACCESSES
32
33 /* For user-mode emulation, we don't emulate any IRQ controller */
34 #if defined(CONFIG_USER_ONLY)
35 #define PPC_IRQ_INIT_FN(name) \
36 static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \
37 { \
38 }
39 #else
40 #define PPC_IRQ_INIT_FN(name) \
41 void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
42 #endif
43
44 PPC_IRQ_INIT_FN(40x);
45 PPC_IRQ_INIT_FN(6xx);
46 PPC_IRQ_INIT_FN(970);
47 PPC_IRQ_INIT_FN(POWER7);
48 PPC_IRQ_INIT_FN(e500);
49
50 /* Generic callbacks:
51 * do nothing but store/retrieve spr value
52 */
53 static void spr_load_dump_spr(int sprn)
54 {
55 #ifdef PPC_DUMP_SPR_ACCESSES
56 TCGv_i32 t0 = tcg_const_i32(sprn);
57 gen_helper_load_dump_spr(t0);
58 tcg_temp_free_i32(t0);
59 #endif
60 }
61
62 static void spr_read_generic (void *opaque, int gprn, int sprn)
63 {
64 gen_load_spr(cpu_gpr[gprn], sprn);
65 spr_load_dump_spr(sprn);
66 }
67
68 static void spr_store_dump_spr(int sprn)
69 {
70 #ifdef PPC_DUMP_SPR_ACCESSES
71 TCGv_i32 t0 = tcg_const_i32(sprn);
72 gen_helper_store_dump_spr(t0);
73 tcg_temp_free_i32(t0);
74 #endif
75 }
76
77 static void spr_write_generic (void *opaque, int sprn, int gprn)
78 {
79 gen_store_spr(sprn, cpu_gpr[gprn]);
80 spr_store_dump_spr(sprn);
81 }
82
83 #if !defined(CONFIG_USER_ONLY)
84 static void spr_write_generic32(void *opaque, int sprn, int gprn)
85 {
86 #ifdef TARGET_PPC64
87 TCGv t0 = tcg_temp_new();
88 tcg_gen_ext32u_tl(t0, cpu_gpr[gprn]);
89 gen_store_spr(sprn, t0);
90 tcg_temp_free(t0);
91 spr_store_dump_spr(sprn);
92 #else
93 spr_write_generic(opaque, sprn, gprn);
94 #endif
95 }
96
97 static void spr_write_clear (void *opaque, int sprn, int gprn)
98 {
99 TCGv t0 = tcg_temp_new();
100 TCGv t1 = tcg_temp_new();
101 gen_load_spr(t0, sprn);
102 tcg_gen_neg_tl(t1, cpu_gpr[gprn]);
103 tcg_gen_and_tl(t0, t0, t1);
104 gen_store_spr(sprn, t0);
105 tcg_temp_free(t0);
106 tcg_temp_free(t1);
107 }
108 #endif
109
110 /* SPR common to all PowerPC */
111 /* XER */
112 static void spr_read_xer (void *opaque, int gprn, int sprn)
113 {
114 gen_read_xer(cpu_gpr[gprn]);
115 }
116
117 static void spr_write_xer (void *opaque, int sprn, int gprn)
118 {
119 gen_write_xer(cpu_gpr[gprn]);
120 }
121
122 /* LR */
123 static void spr_read_lr (void *opaque, int gprn, int sprn)
124 {
125 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_lr);
126 }
127
128 static void spr_write_lr (void *opaque, int sprn, int gprn)
129 {
130 tcg_gen_mov_tl(cpu_lr, cpu_gpr[gprn]);
131 }
132
133 /* CFAR */
134 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
135 static void spr_read_cfar (void *opaque, int gprn, int sprn)
136 {
137 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_cfar);
138 }
139
140 static void spr_write_cfar (void *opaque, int sprn, int gprn)
141 {
142 tcg_gen_mov_tl(cpu_cfar, cpu_gpr[gprn]);
143 }
144 #endif /* defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY) */
145
146 /* CTR */
147 static void spr_read_ctr (void *opaque, int gprn, int sprn)
148 {
149 tcg_gen_mov_tl(cpu_gpr[gprn], cpu_ctr);
150 }
151
152 static void spr_write_ctr (void *opaque, int sprn, int gprn)
153 {
154 tcg_gen_mov_tl(cpu_ctr, cpu_gpr[gprn]);
155 }
156
157 /* User read access to SPR */
158 /* USPRx */
159 /* UMMCRx */
160 /* UPMCx */
161 /* USIA */
162 /* UDECR */
163 static void spr_read_ureg (void *opaque, int gprn, int sprn)
164 {
165 gen_load_spr(cpu_gpr[gprn], sprn + 0x10);
166 }
167
168 /* SPR common to all non-embedded PowerPC */
169 /* DECR */
170 #if !defined(CONFIG_USER_ONLY)
171 static void spr_read_decr (void *opaque, int gprn, int sprn)
172 {
173 if (use_icount) {
174 gen_io_start();
175 }
176 gen_helper_load_decr(cpu_gpr[gprn], cpu_env);
177 if (use_icount) {
178 gen_io_end();
179 gen_stop_exception(opaque);
180 }
181 }
182
183 static void spr_write_decr (void *opaque, int sprn, int gprn)
184 {
185 if (use_icount) {
186 gen_io_start();
187 }
188 gen_helper_store_decr(cpu_env, cpu_gpr[gprn]);
189 if (use_icount) {
190 gen_io_end();
191 gen_stop_exception(opaque);
192 }
193 }
194 #endif
195
196 /* SPR common to all non-embedded PowerPC, except 601 */
197 /* Time base */
198 static void spr_read_tbl (void *opaque, int gprn, int sprn)
199 {
200 if (use_icount) {
201 gen_io_start();
202 }
203 gen_helper_load_tbl(cpu_gpr[gprn], cpu_env);
204 if (use_icount) {
205 gen_io_end();
206 gen_stop_exception(opaque);
207 }
208 }
209
210 static void spr_read_tbu (void *opaque, int gprn, int sprn)
211 {
212 if (use_icount) {
213 gen_io_start();
214 }
215 gen_helper_load_tbu(cpu_gpr[gprn], cpu_env);
216 if (use_icount) {
217 gen_io_end();
218 gen_stop_exception(opaque);
219 }
220 }
221
222 __attribute__ (( unused ))
223 static void spr_read_atbl (void *opaque, int gprn, int sprn)
224 {
225 gen_helper_load_atbl(cpu_gpr[gprn], cpu_env);
226 }
227
228 __attribute__ (( unused ))
229 static void spr_read_atbu (void *opaque, int gprn, int sprn)
230 {
231 gen_helper_load_atbu(cpu_gpr[gprn], cpu_env);
232 }
233
234 #if !defined(CONFIG_USER_ONLY)
235 static void spr_write_tbl (void *opaque, int sprn, int gprn)
236 {
237 if (use_icount) {
238 gen_io_start();
239 }
240 gen_helper_store_tbl(cpu_env, cpu_gpr[gprn]);
241 if (use_icount) {
242 gen_io_end();
243 gen_stop_exception(opaque);
244 }
245 }
246
247 static void spr_write_tbu (void *opaque, int sprn, int gprn)
248 {
249 if (use_icount) {
250 gen_io_start();
251 }
252 gen_helper_store_tbu(cpu_env, cpu_gpr[gprn]);
253 if (use_icount) {
254 gen_io_end();
255 gen_stop_exception(opaque);
256 }
257 }
258
259 __attribute__ (( unused ))
260 static void spr_write_atbl (void *opaque, int sprn, int gprn)
261 {
262 gen_helper_store_atbl(cpu_env, cpu_gpr[gprn]);
263 }
264
265 __attribute__ (( unused ))
266 static void spr_write_atbu (void *opaque, int sprn, int gprn)
267 {
268 gen_helper_store_atbu(cpu_env, cpu_gpr[gprn]);
269 }
270
271 #if defined(TARGET_PPC64)
272 __attribute__ (( unused ))
273 static void spr_read_purr (void *opaque, int gprn, int sprn)
274 {
275 gen_helper_load_purr(cpu_gpr[gprn], cpu_env);
276 }
277 #endif
278 #endif
279
280 #if !defined(CONFIG_USER_ONLY)
281 /* IBAT0U...IBAT0U */
282 /* IBAT0L...IBAT7L */
283 static void spr_read_ibat (void *opaque, int gprn, int sprn)
284 {
285 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
286 }
287
288 static void spr_read_ibat_h (void *opaque, int gprn, int sprn)
289 {
290 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT4U) / 2]));
291 }
292
293 static void spr_write_ibatu (void *opaque, int sprn, int gprn)
294 {
295 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
296 gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
297 tcg_temp_free_i32(t0);
298 }
299
300 static void spr_write_ibatu_h (void *opaque, int sprn, int gprn)
301 {
302 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4U) / 2) + 4);
303 gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]);
304 tcg_temp_free_i32(t0);
305 }
306
307 static void spr_write_ibatl (void *opaque, int sprn, int gprn)
308 {
309 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2);
310 gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
311 tcg_temp_free_i32(t0);
312 }
313
314 static void spr_write_ibatl_h (void *opaque, int sprn, int gprn)
315 {
316 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4L) / 2) + 4);
317 gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]);
318 tcg_temp_free_i32(t0);
319 }
320
321 /* DBAT0U...DBAT7U */
322 /* DBAT0L...DBAT7L */
323 static void spr_read_dbat (void *opaque, int gprn, int sprn)
324 {
325 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][(sprn - SPR_DBAT0U) / 2]));
326 }
327
328 static void spr_read_dbat_h (void *opaque, int gprn, int sprn)
329 {
330 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, DBAT[sprn & 1][((sprn - SPR_DBAT4U) / 2) + 4]));
331 }
332
333 static void spr_write_dbatu (void *opaque, int sprn, int gprn)
334 {
335 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2);
336 gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
337 tcg_temp_free_i32(t0);
338 }
339
340 static void spr_write_dbatu_h (void *opaque, int sprn, int gprn)
341 {
342 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4);
343 gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]);
344 tcg_temp_free_i32(t0);
345 }
346
347 static void spr_write_dbatl (void *opaque, int sprn, int gprn)
348 {
349 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2);
350 gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
351 tcg_temp_free_i32(t0);
352 }
353
354 static void spr_write_dbatl_h (void *opaque, int sprn, int gprn)
355 {
356 TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4);
357 gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]);
358 tcg_temp_free_i32(t0);
359 }
360
361 /* SDR1 */
362 static void spr_write_sdr1 (void *opaque, int sprn, int gprn)
363 {
364 gen_helper_store_sdr1(cpu_env, cpu_gpr[gprn]);
365 }
366
367 /* 64 bits PowerPC specific SPRs */
368 /* ASR */
369 #if defined(TARGET_PPC64)
370 static void spr_read_hior (void *opaque, int gprn, int sprn)
371 {
372 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, excp_prefix));
373 }
374
375 static void spr_write_hior (void *opaque, int sprn, int gprn)
376 {
377 TCGv t0 = tcg_temp_new();
378 tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL);
379 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
380 tcg_temp_free(t0);
381 }
382
383 static void spr_read_asr (void *opaque, int gprn, int sprn)
384 {
385 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, asr));
386 }
387
388 static void spr_write_asr (void *opaque, int sprn, int gprn)
389 {
390 gen_helper_store_asr(cpu_env, cpu_gpr[gprn]);
391 }
392 #endif
393 #endif
394
395 /* PowerPC 601 specific registers */
396 /* RTC */
397 static void spr_read_601_rtcl (void *opaque, int gprn, int sprn)
398 {
399 gen_helper_load_601_rtcl(cpu_gpr[gprn], cpu_env);
400 }
401
402 static void spr_read_601_rtcu (void *opaque, int gprn, int sprn)
403 {
404 gen_helper_load_601_rtcu(cpu_gpr[gprn], cpu_env);
405 }
406
407 #if !defined(CONFIG_USER_ONLY)
408 static void spr_write_601_rtcu (void *opaque, int sprn, int gprn)
409 {
410 gen_helper_store_601_rtcu(cpu_env, cpu_gpr[gprn]);
411 }
412
413 static void spr_write_601_rtcl (void *opaque, int sprn, int gprn)
414 {
415 gen_helper_store_601_rtcl(cpu_env, cpu_gpr[gprn]);
416 }
417
418 static void spr_write_hid0_601 (void *opaque, int sprn, int gprn)
419 {
420 DisasContext *ctx = opaque;
421
422 gen_helper_store_hid0_601(cpu_env, cpu_gpr[gprn]);
423 /* Must stop the translation as endianness may have changed */
424 gen_stop_exception(ctx);
425 }
426 #endif
427
428 /* Unified bats */
429 #if !defined(CONFIG_USER_ONLY)
430 static void spr_read_601_ubat (void *opaque, int gprn, int sprn)
431 {
432 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, IBAT[sprn & 1][(sprn - SPR_IBAT0U) / 2]));
433 }
434
435 static void spr_write_601_ubatu (void *opaque, int sprn, int gprn)
436 {
437 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
438 gen_helper_store_601_batl(cpu_env, t0, cpu_gpr[gprn]);
439 tcg_temp_free_i32(t0);
440 }
441
442 static void spr_write_601_ubatl (void *opaque, int sprn, int gprn)
443 {
444 TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2);
445 gen_helper_store_601_batu(cpu_env, t0, cpu_gpr[gprn]);
446 tcg_temp_free_i32(t0);
447 }
448 #endif
449
450 /* PowerPC 40x specific registers */
451 #if !defined(CONFIG_USER_ONLY)
452 static void spr_read_40x_pit (void *opaque, int gprn, int sprn)
453 {
454 gen_helper_load_40x_pit(cpu_gpr[gprn], cpu_env);
455 }
456
457 static void spr_write_40x_pit (void *opaque, int sprn, int gprn)
458 {
459 gen_helper_store_40x_pit(cpu_env, cpu_gpr[gprn]);
460 }
461
462 static void spr_write_40x_dbcr0 (void *opaque, int sprn, int gprn)
463 {
464 DisasContext *ctx = opaque;
465
466 gen_helper_store_40x_dbcr0(cpu_env, cpu_gpr[gprn]);
467 /* We must stop translation as we may have rebooted */
468 gen_stop_exception(ctx);
469 }
470
471 static void spr_write_40x_sler (void *opaque, int sprn, int gprn)
472 {
473 gen_helper_store_40x_sler(cpu_env, cpu_gpr[gprn]);
474 }
475
476 static void spr_write_booke_tcr (void *opaque, int sprn, int gprn)
477 {
478 gen_helper_store_booke_tcr(cpu_env, cpu_gpr[gprn]);
479 }
480
481 static void spr_write_booke_tsr (void *opaque, int sprn, int gprn)
482 {
483 gen_helper_store_booke_tsr(cpu_env, cpu_gpr[gprn]);
484 }
485 #endif
486
487 /* PowerPC 403 specific registers */
488 /* PBL1 / PBU1 / PBL2 / PBU2 */
489 #if !defined(CONFIG_USER_ONLY)
490 static void spr_read_403_pbr (void *opaque, int gprn, int sprn)
491 {
492 tcg_gen_ld_tl(cpu_gpr[gprn], cpu_env, offsetof(CPUPPCState, pb[sprn - SPR_403_PBL1]));
493 }
494
495 static void spr_write_403_pbr (void *opaque, int sprn, int gprn)
496 {
497 TCGv_i32 t0 = tcg_const_i32(sprn - SPR_403_PBL1);
498 gen_helper_store_403_pbr(cpu_env, t0, cpu_gpr[gprn]);
499 tcg_temp_free_i32(t0);
500 }
501
502 static void spr_write_pir (void *opaque, int sprn, int gprn)
503 {
504 TCGv t0 = tcg_temp_new();
505 tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF);
506 gen_store_spr(SPR_PIR, t0);
507 tcg_temp_free(t0);
508 }
509 #endif
510
511 /* SPE specific registers */
512 static void spr_read_spefscr (void *opaque, int gprn, int sprn)
513 {
514 TCGv_i32 t0 = tcg_temp_new_i32();
515 tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
516 tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0);
517 tcg_temp_free_i32(t0);
518 }
519
520 static void spr_write_spefscr (void *opaque, int sprn, int gprn)
521 {
522 TCGv_i32 t0 = tcg_temp_new_i32();
523 tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]);
524 tcg_gen_st_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr));
525 tcg_temp_free_i32(t0);
526 }
527
528 #if !defined(CONFIG_USER_ONLY)
529 /* Callback used to write the exception vector base */
530 static void spr_write_excp_prefix (void *opaque, int sprn, int gprn)
531 {
532 TCGv t0 = tcg_temp_new();
533 tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivpr_mask));
534 tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
535 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix));
536 gen_store_spr(sprn, t0);
537 tcg_temp_free(t0);
538 }
539
540 static void spr_write_excp_vector (void *opaque, int sprn, int gprn)
541 {
542 DisasContext *ctx = opaque;
543 int sprn_offs;
544
545 if (sprn >= SPR_BOOKE_IVOR0 && sprn <= SPR_BOOKE_IVOR15) {
546 sprn_offs = sprn - SPR_BOOKE_IVOR0;
547 } else if (sprn >= SPR_BOOKE_IVOR32 && sprn <= SPR_BOOKE_IVOR37) {
548 sprn_offs = sprn - SPR_BOOKE_IVOR32 + 32;
549 } else if (sprn >= SPR_BOOKE_IVOR38 && sprn <= SPR_BOOKE_IVOR42) {
550 sprn_offs = sprn - SPR_BOOKE_IVOR38 + 38;
551 } else {
552 printf("Trying to write an unknown exception vector %d %03x\n",
553 sprn, sprn);
554 gen_inval_exception(ctx, POWERPC_EXCP_PRIV_REG);
555 return;
556 }
557
558 TCGv t0 = tcg_temp_new();
559 tcg_gen_ld_tl(t0, cpu_env, offsetof(CPUPPCState, ivor_mask));
560 tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]);
561 tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_vectors[sprn_offs]));
562 gen_store_spr(sprn, t0);
563 tcg_temp_free(t0);
564 }
565 #endif
566
567 static inline void vscr_init (CPUPPCState *env, uint32_t val)
568 {
569 env->vscr = val;
570 /* Altivec always uses round-to-nearest */
571 set_float_rounding_mode(float_round_nearest_even, &env->vec_status);
572 set_flush_to_zero(vscr_nj, &env->vec_status);
573 }
574
575 #if defined(CONFIG_USER_ONLY)
576 #define spr_register(env, num, name, uea_read, uea_write, \
577 oea_read, oea_write, initial_value) \
578 do { \
579 _spr_register(env, num, name, uea_read, uea_write, initial_value); \
580 } while (0)
581 static inline void _spr_register (CPUPPCState *env, int num,
582 const char *name,
583 void (*uea_read)(void *opaque, int gprn, int sprn),
584 void (*uea_write)(void *opaque, int sprn, int gprn),
585 target_ulong initial_value)
586 #else
587 static inline void spr_register (CPUPPCState *env, int num,
588 const char *name,
589 void (*uea_read)(void *opaque, int gprn, int sprn),
590 void (*uea_write)(void *opaque, int sprn, int gprn),
591 void (*oea_read)(void *opaque, int gprn, int sprn),
592 void (*oea_write)(void *opaque, int sprn, int gprn),
593 target_ulong initial_value)
594 #endif
595 {
596 ppc_spr_t *spr;
597
598 spr = &env->spr_cb[num];
599 if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
600 #if !defined(CONFIG_USER_ONLY)
601 spr->oea_read != NULL || spr->oea_write != NULL ||
602 #endif
603 spr->uea_read != NULL || spr->uea_write != NULL) {
604 printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
605 exit(1);
606 }
607 #if defined(PPC_DEBUG_SPR)
608 printf("*** register spr %d (%03x) %s val " TARGET_FMT_lx "\n", num, num,
609 name, initial_value);
610 #endif
611 spr->name = name;
612 spr->uea_read = uea_read;
613 spr->uea_write = uea_write;
614 #if !defined(CONFIG_USER_ONLY)
615 spr->oea_read = oea_read;
616 spr->oea_write = oea_write;
617 #endif
618 env->spr[num] = initial_value;
619 }
620
621 /* Generic PowerPC SPRs */
622 static void gen_spr_generic (CPUPPCState *env)
623 {
624 /* Integer processing */
625 spr_register(env, SPR_XER, "XER",
626 &spr_read_xer, &spr_write_xer,
627 &spr_read_xer, &spr_write_xer,
628 0x00000000);
629 /* Branch contol */
630 spr_register(env, SPR_LR, "LR",
631 &spr_read_lr, &spr_write_lr,
632 &spr_read_lr, &spr_write_lr,
633 0x00000000);
634 spr_register(env, SPR_CTR, "CTR",
635 &spr_read_ctr, &spr_write_ctr,
636 &spr_read_ctr, &spr_write_ctr,
637 0x00000000);
638 /* Interrupt processing */
639 spr_register(env, SPR_SRR0, "SRR0",
640 SPR_NOACCESS, SPR_NOACCESS,
641 &spr_read_generic, &spr_write_generic,
642 0x00000000);
643 spr_register(env, SPR_SRR1, "SRR1",
644 SPR_NOACCESS, SPR_NOACCESS,
645 &spr_read_generic, &spr_write_generic,
646 0x00000000);
647 /* Processor control */
648 spr_register(env, SPR_SPRG0, "SPRG0",
649 SPR_NOACCESS, SPR_NOACCESS,
650 &spr_read_generic, &spr_write_generic,
651 0x00000000);
652 spr_register(env, SPR_SPRG1, "SPRG1",
653 SPR_NOACCESS, SPR_NOACCESS,
654 &spr_read_generic, &spr_write_generic,
655 0x00000000);
656 spr_register(env, SPR_SPRG2, "SPRG2",
657 SPR_NOACCESS, SPR_NOACCESS,
658 &spr_read_generic, &spr_write_generic,
659 0x00000000);
660 spr_register(env, SPR_SPRG3, "SPRG3",
661 SPR_NOACCESS, SPR_NOACCESS,
662 &spr_read_generic, &spr_write_generic,
663 0x00000000);
664 }
665
666 /* SPR common to all non-embedded PowerPC, including 601 */
667 static void gen_spr_ne_601 (CPUPPCState *env)
668 {
669 /* Exception processing */
670 spr_register(env, SPR_DSISR, "DSISR",
671 SPR_NOACCESS, SPR_NOACCESS,
672 &spr_read_generic, &spr_write_generic,
673 0x00000000);
674 spr_register(env, SPR_DAR, "DAR",
675 SPR_NOACCESS, SPR_NOACCESS,
676 &spr_read_generic, &spr_write_generic,
677 0x00000000);
678 /* Timer */
679 spr_register(env, SPR_DECR, "DECR",
680 SPR_NOACCESS, SPR_NOACCESS,
681 &spr_read_decr, &spr_write_decr,
682 0x00000000);
683 /* Memory management */
684 spr_register(env, SPR_SDR1, "SDR1",
685 SPR_NOACCESS, SPR_NOACCESS,
686 &spr_read_generic, &spr_write_sdr1,
687 0x00000000);
688 }
689
690 /* BATs 0-3 */
691 static void gen_low_BATs (CPUPPCState *env)
692 {
693 #if !defined(CONFIG_USER_ONLY)
694 spr_register(env, SPR_IBAT0U, "IBAT0U",
695 SPR_NOACCESS, SPR_NOACCESS,
696 &spr_read_ibat, &spr_write_ibatu,
697 0x00000000);
698 spr_register(env, SPR_IBAT0L, "IBAT0L",
699 SPR_NOACCESS, SPR_NOACCESS,
700 &spr_read_ibat, &spr_write_ibatl,
701 0x00000000);
702 spr_register(env, SPR_IBAT1U, "IBAT1U",
703 SPR_NOACCESS, SPR_NOACCESS,
704 &spr_read_ibat, &spr_write_ibatu,
705 0x00000000);
706 spr_register(env, SPR_IBAT1L, "IBAT1L",
707 SPR_NOACCESS, SPR_NOACCESS,
708 &spr_read_ibat, &spr_write_ibatl,
709 0x00000000);
710 spr_register(env, SPR_IBAT2U, "IBAT2U",
711 SPR_NOACCESS, SPR_NOACCESS,
712 &spr_read_ibat, &spr_write_ibatu,
713 0x00000000);
714 spr_register(env, SPR_IBAT2L, "IBAT2L",
715 SPR_NOACCESS, SPR_NOACCESS,
716 &spr_read_ibat, &spr_write_ibatl,
717 0x00000000);
718 spr_register(env, SPR_IBAT3U, "IBAT3U",
719 SPR_NOACCESS, SPR_NOACCESS,
720 &spr_read_ibat, &spr_write_ibatu,
721 0x00000000);
722 spr_register(env, SPR_IBAT3L, "IBAT3L",
723 SPR_NOACCESS, SPR_NOACCESS,
724 &spr_read_ibat, &spr_write_ibatl,
725 0x00000000);
726 spr_register(env, SPR_DBAT0U, "DBAT0U",
727 SPR_NOACCESS, SPR_NOACCESS,
728 &spr_read_dbat, &spr_write_dbatu,
729 0x00000000);
730 spr_register(env, SPR_DBAT0L, "DBAT0L",
731 SPR_NOACCESS, SPR_NOACCESS,
732 &spr_read_dbat, &spr_write_dbatl,
733 0x00000000);
734 spr_register(env, SPR_DBAT1U, "DBAT1U",
735 SPR_NOACCESS, SPR_NOACCESS,
736 &spr_read_dbat, &spr_write_dbatu,
737 0x00000000);
738 spr_register(env, SPR_DBAT1L, "DBAT1L",
739 SPR_NOACCESS, SPR_NOACCESS,
740 &spr_read_dbat, &spr_write_dbatl,
741 0x00000000);
742 spr_register(env, SPR_DBAT2U, "DBAT2U",
743 SPR_NOACCESS, SPR_NOACCESS,
744 &spr_read_dbat, &spr_write_dbatu,
745 0x00000000);
746 spr_register(env, SPR_DBAT2L, "DBAT2L",
747 SPR_NOACCESS, SPR_NOACCESS,
748 &spr_read_dbat, &spr_write_dbatl,
749 0x00000000);
750 spr_register(env, SPR_DBAT3U, "DBAT3U",
751 SPR_NOACCESS, SPR_NOACCESS,
752 &spr_read_dbat, &spr_write_dbatu,
753 0x00000000);
754 spr_register(env, SPR_DBAT3L, "DBAT3L",
755 SPR_NOACCESS, SPR_NOACCESS,
756 &spr_read_dbat, &spr_write_dbatl,
757 0x00000000);
758 env->nb_BATs += 4;
759 #endif
760 }
761
762 /* BATs 4-7 */
763 static void gen_high_BATs (CPUPPCState *env)
764 {
765 #if !defined(CONFIG_USER_ONLY)
766 spr_register(env, SPR_IBAT4U, "IBAT4U",
767 SPR_NOACCESS, SPR_NOACCESS,
768 &spr_read_ibat_h, &spr_write_ibatu_h,
769 0x00000000);
770 spr_register(env, SPR_IBAT4L, "IBAT4L",
771 SPR_NOACCESS, SPR_NOACCESS,
772 &spr_read_ibat_h, &spr_write_ibatl_h,
773 0x00000000);
774 spr_register(env, SPR_IBAT5U, "IBAT5U",
775 SPR_NOACCESS, SPR_NOACCESS,
776 &spr_read_ibat_h, &spr_write_ibatu_h,
777 0x00000000);
778 spr_register(env, SPR_IBAT5L, "IBAT5L",
779 SPR_NOACCESS, SPR_NOACCESS,
780 &spr_read_ibat_h, &spr_write_ibatl_h,
781 0x00000000);
782 spr_register(env, SPR_IBAT6U, "IBAT6U",
783 SPR_NOACCESS, SPR_NOACCESS,
784 &spr_read_ibat_h, &spr_write_ibatu_h,
785 0x00000000);
786 spr_register(env, SPR_IBAT6L, "IBAT6L",
787 SPR_NOACCESS, SPR_NOACCESS,
788 &spr_read_ibat_h, &spr_write_ibatl_h,
789 0x00000000);
790 spr_register(env, SPR_IBAT7U, "IBAT7U",
791 SPR_NOACCESS, SPR_NOACCESS,
792 &spr_read_ibat_h, &spr_write_ibatu_h,
793 0x00000000);
794 spr_register(env, SPR_IBAT7L, "IBAT7L",
795 SPR_NOACCESS, SPR_NOACCESS,
796 &spr_read_ibat_h, &spr_write_ibatl_h,
797 0x00000000);
798 spr_register(env, SPR_DBAT4U, "DBAT4U",
799 SPR_NOACCESS, SPR_NOACCESS,
800 &spr_read_dbat_h, &spr_write_dbatu_h,
801 0x00000000);
802 spr_register(env, SPR_DBAT4L, "DBAT4L",
803 SPR_NOACCESS, SPR_NOACCESS,
804 &spr_read_dbat_h, &spr_write_dbatl_h,
805 0x00000000);
806 spr_register(env, SPR_DBAT5U, "DBAT5U",
807 SPR_NOACCESS, SPR_NOACCESS,
808 &spr_read_dbat_h, &spr_write_dbatu_h,
809 0x00000000);
810 spr_register(env, SPR_DBAT5L, "DBAT5L",
811 SPR_NOACCESS, SPR_NOACCESS,
812 &spr_read_dbat_h, &spr_write_dbatl_h,
813 0x00000000);
814 spr_register(env, SPR_DBAT6U, "DBAT6U",
815 SPR_NOACCESS, SPR_NOACCESS,
816 &spr_read_dbat_h, &spr_write_dbatu_h,
817 0x00000000);
818 spr_register(env, SPR_DBAT6L, "DBAT6L",
819 SPR_NOACCESS, SPR_NOACCESS,
820 &spr_read_dbat_h, &spr_write_dbatl_h,
821 0x00000000);
822 spr_register(env, SPR_DBAT7U, "DBAT7U",
823 SPR_NOACCESS, SPR_NOACCESS,
824 &spr_read_dbat_h, &spr_write_dbatu_h,
825 0x00000000);
826 spr_register(env, SPR_DBAT7L, "DBAT7L",
827 SPR_NOACCESS, SPR_NOACCESS,
828 &spr_read_dbat_h, &spr_write_dbatl_h,
829 0x00000000);
830 env->nb_BATs += 4;
831 #endif
832 }
833
834 /* Generic PowerPC time base */
835 static void gen_tbl (CPUPPCState *env)
836 {
837 spr_register(env, SPR_VTBL, "TBL",
838 &spr_read_tbl, SPR_NOACCESS,
839 &spr_read_tbl, SPR_NOACCESS,
840 0x00000000);
841 spr_register(env, SPR_TBL, "TBL",
842 &spr_read_tbl, SPR_NOACCESS,
843 &spr_read_tbl, &spr_write_tbl,
844 0x00000000);
845 spr_register(env, SPR_VTBU, "TBU",
846 &spr_read_tbu, SPR_NOACCESS,
847 &spr_read_tbu, SPR_NOACCESS,
848 0x00000000);
849 spr_register(env, SPR_TBU, "TBU",
850 &spr_read_tbu, SPR_NOACCESS,
851 &spr_read_tbu, &spr_write_tbu,
852 0x00000000);
853 }
854
855 /* Softare table search registers */
856 static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
857 {
858 #if !defined(CONFIG_USER_ONLY)
859 env->nb_tlb = nb_tlbs;
860 env->nb_ways = nb_ways;
861 env->id_tlbs = 1;
862 env->tlb_type = TLB_6XX;
863 spr_register(env, SPR_DMISS, "DMISS",
864 SPR_NOACCESS, SPR_NOACCESS,
865 &spr_read_generic, SPR_NOACCESS,
866 0x00000000);
867 spr_register(env, SPR_DCMP, "DCMP",
868 SPR_NOACCESS, SPR_NOACCESS,
869 &spr_read_generic, SPR_NOACCESS,
870 0x00000000);
871 spr_register(env, SPR_HASH1, "HASH1",
872 SPR_NOACCESS, SPR_NOACCESS,
873 &spr_read_generic, SPR_NOACCESS,
874 0x00000000);
875 spr_register(env, SPR_HASH2, "HASH2",
876 SPR_NOACCESS, SPR_NOACCESS,
877 &spr_read_generic, SPR_NOACCESS,
878 0x00000000);
879 spr_register(env, SPR_IMISS, "IMISS",
880 SPR_NOACCESS, SPR_NOACCESS,
881 &spr_read_generic, SPR_NOACCESS,
882 0x00000000);
883 spr_register(env, SPR_ICMP, "ICMP",
884 SPR_NOACCESS, SPR_NOACCESS,
885 &spr_read_generic, SPR_NOACCESS,
886 0x00000000);
887 spr_register(env, SPR_RPA, "RPA",
888 SPR_NOACCESS, SPR_NOACCESS,
889 &spr_read_generic, &spr_write_generic,
890 0x00000000);
891 #endif
892 }
893
894 /* SPR common to MPC755 and G2 */
895 static void gen_spr_G2_755 (CPUPPCState *env)
896 {
897 /* SGPRs */
898 spr_register(env, SPR_SPRG4, "SPRG4",
899 SPR_NOACCESS, SPR_NOACCESS,
900 &spr_read_generic, &spr_write_generic,
901 0x00000000);
902 spr_register(env, SPR_SPRG5, "SPRG5",
903 SPR_NOACCESS, SPR_NOACCESS,
904 &spr_read_generic, &spr_write_generic,
905 0x00000000);
906 spr_register(env, SPR_SPRG6, "SPRG6",
907 SPR_NOACCESS, SPR_NOACCESS,
908 &spr_read_generic, &spr_write_generic,
909 0x00000000);
910 spr_register(env, SPR_SPRG7, "SPRG7",
911 SPR_NOACCESS, SPR_NOACCESS,
912 &spr_read_generic, &spr_write_generic,
913 0x00000000);
914 }
915
916 /* SPR common to all 7xx PowerPC implementations */
917 static void gen_spr_7xx (CPUPPCState *env)
918 {
919 /* Breakpoints */
920 /* XXX : not implemented */
921 spr_register(env, SPR_DABR, "DABR",
922 SPR_NOACCESS, SPR_NOACCESS,
923 &spr_read_generic, &spr_write_generic,
924 0x00000000);
925 /* XXX : not implemented */
926 spr_register(env, SPR_IABR, "IABR",
927 SPR_NOACCESS, SPR_NOACCESS,
928 &spr_read_generic, &spr_write_generic,
929 0x00000000);
930 /* Cache management */
931 /* XXX : not implemented */
932 spr_register(env, SPR_ICTC, "ICTC",
933 SPR_NOACCESS, SPR_NOACCESS,
934 &spr_read_generic, &spr_write_generic,
935 0x00000000);
936 /* Performance monitors */
937 /* XXX : not implemented */
938 spr_register(env, SPR_MMCR0, "MMCR0",
939 SPR_NOACCESS, SPR_NOACCESS,
940 &spr_read_generic, &spr_write_generic,
941 0x00000000);
942 /* XXX : not implemented */
943 spr_register(env, SPR_MMCR1, "MMCR1",
944 SPR_NOACCESS, SPR_NOACCESS,
945 &spr_read_generic, &spr_write_generic,
946 0x00000000);
947 /* XXX : not implemented */
948 spr_register(env, SPR_PMC1, "PMC1",
949 SPR_NOACCESS, SPR_NOACCESS,
950 &spr_read_generic, &spr_write_generic,
951 0x00000000);
952 /* XXX : not implemented */
953 spr_register(env, SPR_PMC2, "PMC2",
954 SPR_NOACCESS, SPR_NOACCESS,
955 &spr_read_generic, &spr_write_generic,
956 0x00000000);
957 /* XXX : not implemented */
958 spr_register(env, SPR_PMC3, "PMC3",
959 SPR_NOACCESS, SPR_NOACCESS,
960 &spr_read_generic, &spr_write_generic,
961 0x00000000);
962 /* XXX : not implemented */
963 spr_register(env, SPR_PMC4, "PMC4",
964 SPR_NOACCESS, SPR_NOACCESS,
965 &spr_read_generic, &spr_write_generic,
966 0x00000000);
967 /* XXX : not implemented */
968 spr_register(env, SPR_SIAR, "SIAR",
969 SPR_NOACCESS, SPR_NOACCESS,
970 &spr_read_generic, SPR_NOACCESS,
971 0x00000000);
972 /* XXX : not implemented */
973 spr_register(env, SPR_UMMCR0, "UMMCR0",
974 &spr_read_ureg, SPR_NOACCESS,
975 &spr_read_ureg, SPR_NOACCESS,
976 0x00000000);
977 /* XXX : not implemented */
978 spr_register(env, SPR_UMMCR1, "UMMCR1",
979 &spr_read_ureg, SPR_NOACCESS,
980 &spr_read_ureg, SPR_NOACCESS,
981 0x00000000);
982 /* XXX : not implemented */
983 spr_register(env, SPR_UPMC1, "UPMC1",
984 &spr_read_ureg, SPR_NOACCESS,
985 &spr_read_ureg, SPR_NOACCESS,
986 0x00000000);
987 /* XXX : not implemented */
988 spr_register(env, SPR_UPMC2, "UPMC2",
989 &spr_read_ureg, SPR_NOACCESS,
990 &spr_read_ureg, SPR_NOACCESS,
991 0x00000000);
992 /* XXX : not implemented */
993 spr_register(env, SPR_UPMC3, "UPMC3",
994 &spr_read_ureg, SPR_NOACCESS,
995 &spr_read_ureg, SPR_NOACCESS,
996 0x00000000);
997 /* XXX : not implemented */
998 spr_register(env, SPR_UPMC4, "UPMC4",
999 &spr_read_ureg, SPR_NOACCESS,
1000 &spr_read_ureg, SPR_NOACCESS,
1001 0x00000000);
1002 /* XXX : not implemented */
1003 spr_register(env, SPR_USIAR, "USIAR",
1004 &spr_read_ureg, SPR_NOACCESS,
1005 &spr_read_ureg, SPR_NOACCESS,
1006 0x00000000);
1007 /* External access control */
1008 /* XXX : not implemented */
1009 spr_register(env, SPR_EAR, "EAR",
1010 SPR_NOACCESS, SPR_NOACCESS,
1011 &spr_read_generic, &spr_write_generic,
1012 0x00000000);
1013 }
1014
1015 static void gen_spr_thrm (CPUPPCState *env)
1016 {
1017 /* Thermal management */
1018 /* XXX : not implemented */
1019 spr_register(env, SPR_THRM1, "THRM1",
1020 SPR_NOACCESS, SPR_NOACCESS,
1021 &spr_read_generic, &spr_write_generic,
1022 0x00000000);
1023 /* XXX : not implemented */
1024 spr_register(env, SPR_THRM2, "THRM2",
1025 SPR_NOACCESS, SPR_NOACCESS,
1026 &spr_read_generic, &spr_write_generic,
1027 0x00000000);
1028 /* XXX : not implemented */
1029 spr_register(env, SPR_THRM3, "THRM3",
1030 SPR_NOACCESS, SPR_NOACCESS,
1031 &spr_read_generic, &spr_write_generic,
1032 0x00000000);
1033 }
1034
1035 /* SPR specific to PowerPC 604 implementation */
1036 static void gen_spr_604 (CPUPPCState *env)
1037 {
1038 /* Processor identification */
1039 spr_register(env, SPR_PIR, "PIR",
1040 SPR_NOACCESS, SPR_NOACCESS,
1041 &spr_read_generic, &spr_write_pir,
1042 0x00000000);
1043 /* Breakpoints */
1044 /* XXX : not implemented */
1045 spr_register(env, SPR_IABR, "IABR",
1046 SPR_NOACCESS, SPR_NOACCESS,
1047 &spr_read_generic, &spr_write_generic,
1048 0x00000000);
1049 /* XXX : not implemented */
1050 spr_register(env, SPR_DABR, "DABR",
1051 SPR_NOACCESS, SPR_NOACCESS,
1052 &spr_read_generic, &spr_write_generic,
1053 0x00000000);
1054 /* Performance counters */
1055 /* XXX : not implemented */
1056 spr_register(env, SPR_MMCR0, "MMCR0",
1057 SPR_NOACCESS, SPR_NOACCESS,
1058 &spr_read_generic, &spr_write_generic,
1059 0x00000000);
1060 /* XXX : not implemented */
1061 spr_register(env, SPR_PMC1, "PMC1",
1062 SPR_NOACCESS, SPR_NOACCESS,
1063 &spr_read_generic, &spr_write_generic,
1064 0x00000000);
1065 /* XXX : not implemented */
1066 spr_register(env, SPR_PMC2, "PMC2",
1067 SPR_NOACCESS, SPR_NOACCESS,
1068 &spr_read_generic, &spr_write_generic,
1069 0x00000000);
1070 /* XXX : not implemented */
1071 spr_register(env, SPR_SIAR, "SIAR",
1072 SPR_NOACCESS, SPR_NOACCESS,
1073 &spr_read_generic, SPR_NOACCESS,
1074 0x00000000);
1075 /* XXX : not implemented */
1076 spr_register(env, SPR_SDA, "SDA",
1077 SPR_NOACCESS, SPR_NOACCESS,
1078 &spr_read_generic, SPR_NOACCESS,
1079 0x00000000);
1080 /* External access control */
1081 /* XXX : not implemented */
1082 spr_register(env, SPR_EAR, "EAR",
1083 SPR_NOACCESS, SPR_NOACCESS,
1084 &spr_read_generic, &spr_write_generic,
1085 0x00000000);
1086 }
1087
1088 /* SPR specific to PowerPC 603 implementation */
1089 static void gen_spr_603 (CPUPPCState *env)
1090 {
1091 /* External access control */
1092 /* XXX : not implemented */
1093 spr_register(env, SPR_EAR, "EAR",
1094 SPR_NOACCESS, SPR_NOACCESS,
1095 &spr_read_generic, &spr_write_generic,
1096 0x00000000);
1097 }
1098
1099 /* SPR specific to PowerPC G2 implementation */
1100 static void gen_spr_G2 (CPUPPCState *env)
1101 {
1102 /* Memory base address */
1103 /* MBAR */
1104 /* XXX : not implemented */
1105 spr_register(env, SPR_MBAR, "MBAR",
1106 SPR_NOACCESS, SPR_NOACCESS,
1107 &spr_read_generic, &spr_write_generic,
1108 0x00000000);
1109 /* Exception processing */
1110 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1111 SPR_NOACCESS, SPR_NOACCESS,
1112 &spr_read_generic, &spr_write_generic,
1113 0x00000000);
1114 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1115 SPR_NOACCESS, SPR_NOACCESS,
1116 &spr_read_generic, &spr_write_generic,
1117 0x00000000);
1118 /* Breakpoints */
1119 /* XXX : not implemented */
1120 spr_register(env, SPR_DABR, "DABR",
1121 SPR_NOACCESS, SPR_NOACCESS,
1122 &spr_read_generic, &spr_write_generic,
1123 0x00000000);
1124 /* XXX : not implemented */
1125 spr_register(env, SPR_DABR2, "DABR2",
1126 SPR_NOACCESS, SPR_NOACCESS,
1127 &spr_read_generic, &spr_write_generic,
1128 0x00000000);
1129 /* XXX : not implemented */
1130 spr_register(env, SPR_IABR, "IABR",
1131 SPR_NOACCESS, SPR_NOACCESS,
1132 &spr_read_generic, &spr_write_generic,
1133 0x00000000);
1134 /* XXX : not implemented */
1135 spr_register(env, SPR_IABR2, "IABR2",
1136 SPR_NOACCESS, SPR_NOACCESS,
1137 &spr_read_generic, &spr_write_generic,
1138 0x00000000);
1139 /* XXX : not implemented */
1140 spr_register(env, SPR_IBCR, "IBCR",
1141 SPR_NOACCESS, SPR_NOACCESS,
1142 &spr_read_generic, &spr_write_generic,
1143 0x00000000);
1144 /* XXX : not implemented */
1145 spr_register(env, SPR_DBCR, "DBCR",
1146 SPR_NOACCESS, SPR_NOACCESS,
1147 &spr_read_generic, &spr_write_generic,
1148 0x00000000);
1149 }
1150
1151 /* SPR specific to PowerPC 602 implementation */
1152 static void gen_spr_602 (CPUPPCState *env)
1153 {
1154 /* ESA registers */
1155 /* XXX : not implemented */
1156 spr_register(env, SPR_SER, "SER",
1157 SPR_NOACCESS, SPR_NOACCESS,
1158 &spr_read_generic, &spr_write_generic,
1159 0x00000000);
1160 /* XXX : not implemented */
1161 spr_register(env, SPR_SEBR, "SEBR",
1162 SPR_NOACCESS, SPR_NOACCESS,
1163 &spr_read_generic, &spr_write_generic,
1164 0x00000000);
1165 /* XXX : not implemented */
1166 spr_register(env, SPR_ESASRR, "ESASRR",
1167 SPR_NOACCESS, SPR_NOACCESS,
1168 &spr_read_generic, &spr_write_generic,
1169 0x00000000);
1170 /* Floating point status */
1171 /* XXX : not implemented */
1172 spr_register(env, SPR_SP, "SP",
1173 SPR_NOACCESS, SPR_NOACCESS,
1174 &spr_read_generic, &spr_write_generic,
1175 0x00000000);
1176 /* XXX : not implemented */
1177 spr_register(env, SPR_LT, "LT",
1178 SPR_NOACCESS, SPR_NOACCESS,
1179 &spr_read_generic, &spr_write_generic,
1180 0x00000000);
1181 /* Watchdog timer */
1182 /* XXX : not implemented */
1183 spr_register(env, SPR_TCR, "TCR",
1184 SPR_NOACCESS, SPR_NOACCESS,
1185 &spr_read_generic, &spr_write_generic,
1186 0x00000000);
1187 /* Interrupt base */
1188 spr_register(env, SPR_IBR, "IBR",
1189 SPR_NOACCESS, SPR_NOACCESS,
1190 &spr_read_generic, &spr_write_generic,
1191 0x00000000);
1192 /* XXX : not implemented */
1193 spr_register(env, SPR_IABR, "IABR",
1194 SPR_NOACCESS, SPR_NOACCESS,
1195 &spr_read_generic, &spr_write_generic,
1196 0x00000000);
1197 }
1198
1199 /* SPR specific to PowerPC 601 implementation */
1200 static void gen_spr_601 (CPUPPCState *env)
1201 {
1202 /* Multiplication/division register */
1203 /* MQ */
1204 spr_register(env, SPR_MQ, "MQ",
1205 &spr_read_generic, &spr_write_generic,
1206 &spr_read_generic, &spr_write_generic,
1207 0x00000000);
1208 /* RTC registers */
1209 spr_register(env, SPR_601_RTCU, "RTCU",
1210 SPR_NOACCESS, SPR_NOACCESS,
1211 SPR_NOACCESS, &spr_write_601_rtcu,
1212 0x00000000);
1213 spr_register(env, SPR_601_VRTCU, "RTCU",
1214 &spr_read_601_rtcu, SPR_NOACCESS,
1215 &spr_read_601_rtcu, SPR_NOACCESS,
1216 0x00000000);
1217 spr_register(env, SPR_601_RTCL, "RTCL",
1218 SPR_NOACCESS, SPR_NOACCESS,
1219 SPR_NOACCESS, &spr_write_601_rtcl,
1220 0x00000000);
1221 spr_register(env, SPR_601_VRTCL, "RTCL",
1222 &spr_read_601_rtcl, SPR_NOACCESS,
1223 &spr_read_601_rtcl, SPR_NOACCESS,
1224 0x00000000);
1225 /* Timer */
1226 #if 0 /* ? */
1227 spr_register(env, SPR_601_UDECR, "UDECR",
1228 &spr_read_decr, SPR_NOACCESS,
1229 &spr_read_decr, SPR_NOACCESS,
1230 0x00000000);
1231 #endif
1232 /* External access control */
1233 /* XXX : not implemented */
1234 spr_register(env, SPR_EAR, "EAR",
1235 SPR_NOACCESS, SPR_NOACCESS,
1236 &spr_read_generic, &spr_write_generic,
1237 0x00000000);
1238 /* Memory management */
1239 #if !defined(CONFIG_USER_ONLY)
1240 spr_register(env, SPR_IBAT0U, "IBAT0U",
1241 SPR_NOACCESS, SPR_NOACCESS,
1242 &spr_read_601_ubat, &spr_write_601_ubatu,
1243 0x00000000);
1244 spr_register(env, SPR_IBAT0L, "IBAT0L",
1245 SPR_NOACCESS, SPR_NOACCESS,
1246 &spr_read_601_ubat, &spr_write_601_ubatl,
1247 0x00000000);
1248 spr_register(env, SPR_IBAT1U, "IBAT1U",
1249 SPR_NOACCESS, SPR_NOACCESS,
1250 &spr_read_601_ubat, &spr_write_601_ubatu,
1251 0x00000000);
1252 spr_register(env, SPR_IBAT1L, "IBAT1L",
1253 SPR_NOACCESS, SPR_NOACCESS,
1254 &spr_read_601_ubat, &spr_write_601_ubatl,
1255 0x00000000);
1256 spr_register(env, SPR_IBAT2U, "IBAT2U",
1257 SPR_NOACCESS, SPR_NOACCESS,
1258 &spr_read_601_ubat, &spr_write_601_ubatu,
1259 0x00000000);
1260 spr_register(env, SPR_IBAT2L, "IBAT2L",
1261 SPR_NOACCESS, SPR_NOACCESS,
1262 &spr_read_601_ubat, &spr_write_601_ubatl,
1263 0x00000000);
1264 spr_register(env, SPR_IBAT3U, "IBAT3U",
1265 SPR_NOACCESS, SPR_NOACCESS,
1266 &spr_read_601_ubat, &spr_write_601_ubatu,
1267 0x00000000);
1268 spr_register(env, SPR_IBAT3L, "IBAT3L",
1269 SPR_NOACCESS, SPR_NOACCESS,
1270 &spr_read_601_ubat, &spr_write_601_ubatl,
1271 0x00000000);
1272 env->nb_BATs = 4;
1273 #endif
1274 }
1275
1276 static void gen_spr_74xx (CPUPPCState *env)
1277 {
1278 /* Processor identification */
1279 spr_register(env, SPR_PIR, "PIR",
1280 SPR_NOACCESS, SPR_NOACCESS,
1281 &spr_read_generic, &spr_write_pir,
1282 0x00000000);
1283 /* XXX : not implemented */
1284 spr_register(env, SPR_MMCR2, "MMCR2",
1285 SPR_NOACCESS, SPR_NOACCESS,
1286 &spr_read_generic, &spr_write_generic,
1287 0x00000000);
1288 /* XXX : not implemented */
1289 spr_register(env, SPR_UMMCR2, "UMMCR2",
1290 &spr_read_ureg, SPR_NOACCESS,
1291 &spr_read_ureg, SPR_NOACCESS,
1292 0x00000000);
1293 /* XXX: not implemented */
1294 spr_register(env, SPR_BAMR, "BAMR",
1295 SPR_NOACCESS, SPR_NOACCESS,
1296 &spr_read_generic, &spr_write_generic,
1297 0x00000000);
1298 /* XXX : not implemented */
1299 spr_register(env, SPR_MSSCR0, "MSSCR0",
1300 SPR_NOACCESS, SPR_NOACCESS,
1301 &spr_read_generic, &spr_write_generic,
1302 0x00000000);
1303 /* Hardware implementation registers */
1304 /* XXX : not implemented */
1305 spr_register(env, SPR_HID0, "HID0",
1306 SPR_NOACCESS, SPR_NOACCESS,
1307 &spr_read_generic, &spr_write_generic,
1308 0x00000000);
1309 /* XXX : not implemented */
1310 spr_register(env, SPR_HID1, "HID1",
1311 SPR_NOACCESS, SPR_NOACCESS,
1312 &spr_read_generic, &spr_write_generic,
1313 0x00000000);
1314 /* Altivec */
1315 spr_register(env, SPR_VRSAVE, "VRSAVE",
1316 &spr_read_generic, &spr_write_generic,
1317 &spr_read_generic, &spr_write_generic,
1318 0x00000000);
1319 /* XXX : not implemented */
1320 spr_register(env, SPR_L2CR, "L2CR",
1321 SPR_NOACCESS, SPR_NOACCESS,
1322 &spr_read_generic, &spr_write_generic,
1323 0x00000000);
1324 /* Not strictly an SPR */
1325 vscr_init(env, 0x00010000);
1326 }
1327
1328 static void gen_l3_ctrl (CPUPPCState *env)
1329 {
1330 /* L3CR */
1331 /* XXX : not implemented */
1332 spr_register(env, SPR_L3CR, "L3CR",
1333 SPR_NOACCESS, SPR_NOACCESS,
1334 &spr_read_generic, &spr_write_generic,
1335 0x00000000);
1336 /* L3ITCR0 */
1337 /* XXX : not implemented */
1338 spr_register(env, SPR_L3ITCR0, "L3ITCR0",
1339 SPR_NOACCESS, SPR_NOACCESS,
1340 &spr_read_generic, &spr_write_generic,
1341 0x00000000);
1342 /* L3PM */
1343 /* XXX : not implemented */
1344 spr_register(env, SPR_L3PM, "L3PM",
1345 SPR_NOACCESS, SPR_NOACCESS,
1346 &spr_read_generic, &spr_write_generic,
1347 0x00000000);
1348 }
1349
1350 static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
1351 {
1352 #if !defined(CONFIG_USER_ONLY)
1353 env->nb_tlb = nb_tlbs;
1354 env->nb_ways = nb_ways;
1355 env->id_tlbs = 1;
1356 env->tlb_type = TLB_6XX;
1357 /* XXX : not implemented */
1358 spr_register(env, SPR_PTEHI, "PTEHI",
1359 SPR_NOACCESS, SPR_NOACCESS,
1360 &spr_read_generic, &spr_write_generic,
1361 0x00000000);
1362 /* XXX : not implemented */
1363 spr_register(env, SPR_PTELO, "PTELO",
1364 SPR_NOACCESS, SPR_NOACCESS,
1365 &spr_read_generic, &spr_write_generic,
1366 0x00000000);
1367 /* XXX : not implemented */
1368 spr_register(env, SPR_TLBMISS, "TLBMISS",
1369 SPR_NOACCESS, SPR_NOACCESS,
1370 &spr_read_generic, &spr_write_generic,
1371 0x00000000);
1372 #endif
1373 }
1374
1375 #if !defined(CONFIG_USER_ONLY)
1376 static void spr_write_e500_l1csr0 (void *opaque, int sprn, int gprn)
1377 {
1378 TCGv t0 = tcg_temp_new();
1379
1380 tcg_gen_andi_tl(t0, cpu_gpr[gprn], ~256);
1381 gen_store_spr(sprn, t0);
1382 tcg_temp_free(t0);
1383 }
1384
1385 static void spr_write_booke206_mmucsr0 (void *opaque, int sprn, int gprn)
1386 {
1387 TCGv_i32 t0 = tcg_const_i32(sprn);
1388 gen_helper_booke206_tlbflush(cpu_env, t0);
1389 tcg_temp_free_i32(t0);
1390 }
1391
1392 static void spr_write_booke_pid (void *opaque, int sprn, int gprn)
1393 {
1394 TCGv_i32 t0 = tcg_const_i32(sprn);
1395 gen_helper_booke_setpid(cpu_env, t0, cpu_gpr[gprn]);
1396 tcg_temp_free_i32(t0);
1397 }
1398 #endif
1399
1400 static void gen_spr_usprgh (CPUPPCState *env)
1401 {
1402 spr_register(env, SPR_USPRG4, "USPRG4",
1403 &spr_read_ureg, SPR_NOACCESS,
1404 &spr_read_ureg, SPR_NOACCESS,
1405 0x00000000);
1406 spr_register(env, SPR_USPRG5, "USPRG5",
1407 &spr_read_ureg, SPR_NOACCESS,
1408 &spr_read_ureg, SPR_NOACCESS,
1409 0x00000000);
1410 spr_register(env, SPR_USPRG6, "USPRG6",
1411 &spr_read_ureg, SPR_NOACCESS,
1412 &spr_read_ureg, SPR_NOACCESS,
1413 0x00000000);
1414 spr_register(env, SPR_USPRG7, "USPRG7",
1415 &spr_read_ureg, SPR_NOACCESS,
1416 &spr_read_ureg, SPR_NOACCESS,
1417 0x00000000);
1418 }
1419
1420 /* PowerPC BookE SPR */
1421 static void gen_spr_BookE (CPUPPCState *env, uint64_t ivor_mask)
1422 {
1423 const char *ivor_names[64] = {
1424 "IVOR0", "IVOR1", "IVOR2", "IVOR3",
1425 "IVOR4", "IVOR5", "IVOR6", "IVOR7",
1426 "IVOR8", "IVOR9", "IVOR10", "IVOR11",
1427 "IVOR12", "IVOR13", "IVOR14", "IVOR15",
1428 "IVOR16", "IVOR17", "IVOR18", "IVOR19",
1429 "IVOR20", "IVOR21", "IVOR22", "IVOR23",
1430 "IVOR24", "IVOR25", "IVOR26", "IVOR27",
1431 "IVOR28", "IVOR29", "IVOR30", "IVOR31",
1432 "IVOR32", "IVOR33", "IVOR34", "IVOR35",
1433 "IVOR36", "IVOR37", "IVOR38", "IVOR39",
1434 "IVOR40", "IVOR41", "IVOR42", "IVOR43",
1435 "IVOR44", "IVOR45", "IVOR46", "IVOR47",
1436 "IVOR48", "IVOR49", "IVOR50", "IVOR51",
1437 "IVOR52", "IVOR53", "IVOR54", "IVOR55",
1438 "IVOR56", "IVOR57", "IVOR58", "IVOR59",
1439 "IVOR60", "IVOR61", "IVOR62", "IVOR63",
1440 };
1441 #define SPR_BOOKE_IVORxx (-1)
1442 int ivor_sprn[64] = {
1443 SPR_BOOKE_IVOR0, SPR_BOOKE_IVOR1, SPR_BOOKE_IVOR2, SPR_BOOKE_IVOR3,
1444 SPR_BOOKE_IVOR4, SPR_BOOKE_IVOR5, SPR_BOOKE_IVOR6, SPR_BOOKE_IVOR7,
1445 SPR_BOOKE_IVOR8, SPR_BOOKE_IVOR9, SPR_BOOKE_IVOR10, SPR_BOOKE_IVOR11,
1446 SPR_BOOKE_IVOR12, SPR_BOOKE_IVOR13, SPR_BOOKE_IVOR14, SPR_BOOKE_IVOR15,
1447 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1448 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1449 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1450 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1451 SPR_BOOKE_IVOR32, SPR_BOOKE_IVOR33, SPR_BOOKE_IVOR34, SPR_BOOKE_IVOR35,
1452 SPR_BOOKE_IVOR36, SPR_BOOKE_IVOR37, SPR_BOOKE_IVOR38, SPR_BOOKE_IVOR39,
1453 SPR_BOOKE_IVOR40, SPR_BOOKE_IVOR41, SPR_BOOKE_IVOR42, SPR_BOOKE_IVORxx,
1454 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1455 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1456 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1457 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1458 SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx, SPR_BOOKE_IVORxx,
1459 };
1460 int i;
1461
1462 /* Interrupt processing */
1463 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1464 SPR_NOACCESS, SPR_NOACCESS,
1465 &spr_read_generic, &spr_write_generic,
1466 0x00000000);
1467 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1468 SPR_NOACCESS, SPR_NOACCESS,
1469 &spr_read_generic, &spr_write_generic,
1470 0x00000000);
1471 /* Debug */
1472 /* XXX : not implemented */
1473 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1474 SPR_NOACCESS, SPR_NOACCESS,
1475 &spr_read_generic, &spr_write_generic,
1476 0x00000000);
1477 /* XXX : not implemented */
1478 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1479 SPR_NOACCESS, SPR_NOACCESS,
1480 &spr_read_generic, &spr_write_generic,
1481 0x00000000);
1482 /* XXX : not implemented */
1483 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1484 SPR_NOACCESS, SPR_NOACCESS,
1485 &spr_read_generic, &spr_write_generic,
1486 0x00000000);
1487 /* XXX : not implemented */
1488 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1489 SPR_NOACCESS, SPR_NOACCESS,
1490 &spr_read_generic, &spr_write_generic,
1491 0x00000000);
1492 /* XXX : not implemented */
1493 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1494 SPR_NOACCESS, SPR_NOACCESS,
1495 &spr_read_generic, &spr_write_40x_dbcr0,
1496 0x00000000);
1497 /* XXX : not implemented */
1498 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1499 SPR_NOACCESS, SPR_NOACCESS,
1500 &spr_read_generic, &spr_write_generic,
1501 0x00000000);
1502 /* XXX : not implemented */
1503 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1504 SPR_NOACCESS, SPR_NOACCESS,
1505 &spr_read_generic, &spr_write_generic,
1506 0x00000000);
1507 /* XXX : not implemented */
1508 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1509 SPR_NOACCESS, SPR_NOACCESS,
1510 &spr_read_generic, &spr_write_clear,
1511 0x00000000);
1512 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1513 SPR_NOACCESS, SPR_NOACCESS,
1514 &spr_read_generic, &spr_write_generic,
1515 0x00000000);
1516 spr_register(env, SPR_BOOKE_ESR, "ESR",
1517 SPR_NOACCESS, SPR_NOACCESS,
1518 &spr_read_generic, &spr_write_generic,
1519 0x00000000);
1520 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1521 SPR_NOACCESS, SPR_NOACCESS,
1522 &spr_read_generic, &spr_write_excp_prefix,
1523 0x00000000);
1524 /* Exception vectors */
1525 for (i = 0; i < 64; i++) {
1526 if (ivor_mask & (1ULL << i)) {
1527 if (ivor_sprn[i] == SPR_BOOKE_IVORxx) {
1528 fprintf(stderr, "ERROR: IVOR %d SPR is not defined\n", i);
1529 exit(1);
1530 }
1531 spr_register(env, ivor_sprn[i], ivor_names[i],
1532 SPR_NOACCESS, SPR_NOACCESS,
1533 &spr_read_generic, &spr_write_excp_vector,
1534 0x00000000);
1535 }
1536 }
1537 spr_register(env, SPR_BOOKE_PID, "PID",
1538 SPR_NOACCESS, SPR_NOACCESS,
1539 &spr_read_generic, &spr_write_booke_pid,
1540 0x00000000);
1541 spr_register(env, SPR_BOOKE_TCR, "TCR",
1542 SPR_NOACCESS, SPR_NOACCESS,
1543 &spr_read_generic, &spr_write_booke_tcr,
1544 0x00000000);
1545 spr_register(env, SPR_BOOKE_TSR, "TSR",
1546 SPR_NOACCESS, SPR_NOACCESS,
1547 &spr_read_generic, &spr_write_booke_tsr,
1548 0x00000000);
1549 /* Timer */
1550 spr_register(env, SPR_DECR, "DECR",
1551 SPR_NOACCESS, SPR_NOACCESS,
1552 &spr_read_decr, &spr_write_decr,
1553 0x00000000);
1554 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1555 SPR_NOACCESS, SPR_NOACCESS,
1556 SPR_NOACCESS, &spr_write_generic,
1557 0x00000000);
1558 /* SPRGs */
1559 spr_register(env, SPR_USPRG0, "USPRG0",
1560 &spr_read_generic, &spr_write_generic,
1561 &spr_read_generic, &spr_write_generic,
1562 0x00000000);
1563 spr_register(env, SPR_SPRG4, "SPRG4",
1564 SPR_NOACCESS, SPR_NOACCESS,
1565 &spr_read_generic, &spr_write_generic,
1566 0x00000000);
1567 spr_register(env, SPR_SPRG5, "SPRG5",
1568 SPR_NOACCESS, SPR_NOACCESS,
1569 &spr_read_generic, &spr_write_generic,
1570 0x00000000);
1571 spr_register(env, SPR_SPRG6, "SPRG6",
1572 SPR_NOACCESS, SPR_NOACCESS,
1573 &spr_read_generic, &spr_write_generic,
1574 0x00000000);
1575 spr_register(env, SPR_SPRG7, "SPRG7",
1576 SPR_NOACCESS, SPR_NOACCESS,
1577 &spr_read_generic, &spr_write_generic,
1578 0x00000000);
1579 }
1580
1581 static inline uint32_t gen_tlbncfg(uint32_t assoc, uint32_t minsize,
1582 uint32_t maxsize, uint32_t flags,
1583 uint32_t nentries)
1584 {
1585 return (assoc << TLBnCFG_ASSOC_SHIFT) |
1586 (minsize << TLBnCFG_MINSIZE_SHIFT) |
1587 (maxsize << TLBnCFG_MAXSIZE_SHIFT) |
1588 flags | nentries;
1589 }
1590
1591 /* BookE 2.06 storage control registers */
1592 static void gen_spr_BookE206(CPUPPCState *env, uint32_t mas_mask,
1593 uint32_t *tlbncfg)
1594 {
1595 #if !defined(CONFIG_USER_ONLY)
1596 const char *mas_names[8] = {
1597 "MAS0", "MAS1", "MAS2", "MAS3", "MAS4", "MAS5", "MAS6", "MAS7",
1598 };
1599 int mas_sprn[8] = {
1600 SPR_BOOKE_MAS0, SPR_BOOKE_MAS1, SPR_BOOKE_MAS2, SPR_BOOKE_MAS3,
1601 SPR_BOOKE_MAS4, SPR_BOOKE_MAS5, SPR_BOOKE_MAS6, SPR_BOOKE_MAS7,
1602 };
1603 int i;
1604
1605 /* TLB assist registers */
1606 /* XXX : not implemented */
1607 for (i = 0; i < 8; i++) {
1608 void (*uea_write)(void *o, int sprn, int gprn) = &spr_write_generic32;
1609 if (i == 2 && (mas_mask & (1 << i)) && (env->insns_flags & PPC_64B)) {
1610 uea_write = &spr_write_generic;
1611 }
1612 if (mas_mask & (1 << i)) {
1613 spr_register(env, mas_sprn[i], mas_names[i],
1614 SPR_NOACCESS, SPR_NOACCESS,
1615 &spr_read_generic, uea_write,
1616 0x00000000);
1617 }
1618 }
1619 if (env->nb_pids > 1) {
1620 /* XXX : not implemented */
1621 spr_register(env, SPR_BOOKE_PID1, "PID1",
1622 SPR_NOACCESS, SPR_NOACCESS,
1623 &spr_read_generic, &spr_write_booke_pid,
1624 0x00000000);
1625 }
1626 if (env->nb_pids > 2) {
1627 /* XXX : not implemented */
1628 spr_register(env, SPR_BOOKE_PID2, "PID2",
1629 SPR_NOACCESS, SPR_NOACCESS,
1630 &spr_read_generic, &spr_write_booke_pid,
1631 0x00000000);
1632 }
1633 /* XXX : not implemented */
1634 spr_register(env, SPR_MMUCFG, "MMUCFG",
1635 SPR_NOACCESS, SPR_NOACCESS,
1636 &spr_read_generic, SPR_NOACCESS,
1637 0x00000000); /* TOFIX */
1638 switch (env->nb_ways) {
1639 case 4:
1640 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1641 SPR_NOACCESS, SPR_NOACCESS,
1642 &spr_read_generic, SPR_NOACCESS,
1643 tlbncfg[3]);
1644 /* Fallthru */
1645 case 3:
1646 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1647 SPR_NOACCESS, SPR_NOACCESS,
1648 &spr_read_generic, SPR_NOACCESS,
1649 tlbncfg[2]);
1650 /* Fallthru */
1651 case 2:
1652 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1653 SPR_NOACCESS, SPR_NOACCESS,
1654 &spr_read_generic, SPR_NOACCESS,
1655 tlbncfg[1]);
1656 /* Fallthru */
1657 case 1:
1658 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1659 SPR_NOACCESS, SPR_NOACCESS,
1660 &spr_read_generic, SPR_NOACCESS,
1661 tlbncfg[0]);
1662 /* Fallthru */
1663 case 0:
1664 default:
1665 break;
1666 }
1667 #endif
1668
1669 gen_spr_usprgh(env);
1670 }
1671
1672 /* SPR specific to PowerPC 440 implementation */
1673 static void gen_spr_440 (CPUPPCState *env)
1674 {
1675 /* Cache control */
1676 /* XXX : not implemented */
1677 spr_register(env, SPR_440_DNV0, "DNV0",
1678 SPR_NOACCESS, SPR_NOACCESS,
1679 &spr_read_generic, &spr_write_generic,
1680 0x00000000);
1681 /* XXX : not implemented */
1682 spr_register(env, SPR_440_DNV1, "DNV1",
1683 SPR_NOACCESS, SPR_NOACCESS,
1684 &spr_read_generic, &spr_write_generic,
1685 0x00000000);
1686 /* XXX : not implemented */
1687 spr_register(env, SPR_440_DNV2, "DNV2",
1688 SPR_NOACCESS, SPR_NOACCESS,
1689 &spr_read_generic, &spr_write_generic,
1690 0x00000000);
1691 /* XXX : not implemented */
1692 spr_register(env, SPR_440_DNV3, "DNV3",
1693 SPR_NOACCESS, SPR_NOACCESS,
1694 &spr_read_generic, &spr_write_generic,
1695 0x00000000);
1696 /* XXX : not implemented */
1697 spr_register(env, SPR_440_DTV0, "DTV0",
1698 SPR_NOACCESS, SPR_NOACCESS,
1699 &spr_read_generic, &spr_write_generic,
1700 0x00000000);
1701 /* XXX : not implemented */
1702 spr_register(env, SPR_440_DTV1, "DTV1",
1703 SPR_NOACCESS, SPR_NOACCESS,
1704 &spr_read_generic, &spr_write_generic,
1705 0x00000000);
1706 /* XXX : not implemented */
1707 spr_register(env, SPR_440_DTV2, "DTV2",
1708 SPR_NOACCESS, SPR_NOACCESS,
1709 &spr_read_generic, &spr_write_generic,
1710 0x00000000);
1711 /* XXX : not implemented */
1712 spr_register(env, SPR_440_DTV3, "DTV3",
1713 SPR_NOACCESS, SPR_NOACCESS,
1714 &spr_read_generic, &spr_write_generic,
1715 0x00000000);
1716 /* XXX : not implemented */
1717 spr_register(env, SPR_440_DVLIM, "DVLIM",
1718 SPR_NOACCESS, SPR_NOACCESS,
1719 &spr_read_generic, &spr_write_generic,
1720 0x00000000);
1721 /* XXX : not implemented */
1722 spr_register(env, SPR_440_INV0, "INV0",
1723 SPR_NOACCESS, SPR_NOACCESS,
1724 &spr_read_generic, &spr_write_generic,
1725 0x00000000);
1726 /* XXX : not implemented */
1727 spr_register(env, SPR_440_INV1, "INV1",
1728 SPR_NOACCESS, SPR_NOACCESS,
1729 &spr_read_generic, &spr_write_generic,
1730 0x00000000);
1731 /* XXX : not implemented */
1732 spr_register(env, SPR_440_INV2, "INV2",
1733 SPR_NOACCESS, SPR_NOACCESS,
1734 &spr_read_generic, &spr_write_generic,
1735 0x00000000);
1736 /* XXX : not implemented */
1737 spr_register(env, SPR_440_INV3, "INV3",
1738 SPR_NOACCESS, SPR_NOACCESS,
1739 &spr_read_generic, &spr_write_generic,
1740 0x00000000);
1741 /* XXX : not implemented */
1742 spr_register(env, SPR_440_ITV0, "ITV0",
1743 SPR_NOACCESS, SPR_NOACCESS,
1744 &spr_read_generic, &spr_write_generic,
1745 0x00000000);
1746 /* XXX : not implemented */
1747 spr_register(env, SPR_440_ITV1, "ITV1",
1748 SPR_NOACCESS, SPR_NOACCESS,
1749 &spr_read_generic, &spr_write_generic,
1750 0x00000000);
1751 /* XXX : not implemented */
1752 spr_register(env, SPR_440_ITV2, "ITV2",
1753 SPR_NOACCESS, SPR_NOACCESS,
1754 &spr_read_generic, &spr_write_generic,
1755 0x00000000);
1756 /* XXX : not implemented */
1757 spr_register(env, SPR_440_ITV3, "ITV3",
1758 SPR_NOACCESS, SPR_NOACCESS,
1759 &spr_read_generic, &spr_write_generic,
1760 0x00000000);
1761 /* XXX : not implemented */
1762 spr_register(env, SPR_440_IVLIM, "IVLIM",
1763 SPR_NOACCESS, SPR_NOACCESS,
1764 &spr_read_generic, &spr_write_generic,
1765 0x00000000);
1766 /* Cache debug */
1767 /* XXX : not implemented */
1768 spr_register(env, SPR_BOOKE_DCDBTRH, "DCDBTRH",
1769 SPR_NOACCESS, SPR_NOACCESS,
1770 &spr_read_generic, SPR_NOACCESS,
1771 0x00000000);
1772 /* XXX : not implemented */
1773 spr_register(env, SPR_BOOKE_DCDBTRL, "DCDBTRL",
1774 SPR_NOACCESS, SPR_NOACCESS,
1775 &spr_read_generic, SPR_NOACCESS,
1776 0x00000000);
1777 /* XXX : not implemented */
1778 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1779 SPR_NOACCESS, SPR_NOACCESS,
1780 &spr_read_generic, SPR_NOACCESS,
1781 0x00000000);
1782 /* XXX : not implemented */
1783 spr_register(env, SPR_BOOKE_ICDBTRH, "ICDBTRH",
1784 SPR_NOACCESS, SPR_NOACCESS,
1785 &spr_read_generic, SPR_NOACCESS,
1786 0x00000000);
1787 /* XXX : not implemented */
1788 spr_register(env, SPR_BOOKE_ICDBTRL, "ICDBTRL",
1789 SPR_NOACCESS, SPR_NOACCESS,
1790 &spr_read_generic, SPR_NOACCESS,
1791 0x00000000);
1792 /* XXX : not implemented */
1793 spr_register(env, SPR_440_DBDR, "DBDR",
1794 SPR_NOACCESS, SPR_NOACCESS,
1795 &spr_read_generic, &spr_write_generic,
1796 0x00000000);
1797 /* Processor control */
1798 spr_register(env, SPR_4xx_CCR0, "CCR0",
1799 SPR_NOACCESS, SPR_NOACCESS,
1800 &spr_read_generic, &spr_write_generic,
1801 0x00000000);
1802 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1803 SPR_NOACCESS, SPR_NOACCESS,
1804 &spr_read_generic, SPR_NOACCESS,
1805 0x00000000);
1806 /* Storage control */
1807 spr_register(env, SPR_440_MMUCR, "MMUCR",
1808 SPR_NOACCESS, SPR_NOACCESS,
1809 &spr_read_generic, &spr_write_generic,
1810 0x00000000);
1811 }
1812
1813 /* SPR shared between PowerPC 40x implementations */
1814 static void gen_spr_40x (CPUPPCState *env)
1815 {
1816 /* Cache */
1817 /* not emulated, as QEMU do not emulate caches */
1818 spr_register(env, SPR_40x_DCCR, "DCCR",
1819 SPR_NOACCESS, SPR_NOACCESS,
1820 &spr_read_generic, &spr_write_generic,
1821 0x00000000);
1822 /* not emulated, as QEMU do not emulate caches */
1823 spr_register(env, SPR_40x_ICCR, "ICCR",
1824 SPR_NOACCESS, SPR_NOACCESS,
1825 &spr_read_generic, &spr_write_generic,
1826 0x00000000);
1827 /* not emulated, as QEMU do not emulate caches */
1828 spr_register(env, SPR_BOOKE_ICDBDR, "ICDBDR",
1829 SPR_NOACCESS, SPR_NOACCESS,
1830 &spr_read_generic, SPR_NOACCESS,
1831 0x00000000);
1832 /* Exception */
1833 spr_register(env, SPR_40x_DEAR, "DEAR",
1834 SPR_NOACCESS, SPR_NOACCESS,
1835 &spr_read_generic, &spr_write_generic,
1836 0x00000000);
1837 spr_register(env, SPR_40x_ESR, "ESR",
1838 SPR_NOACCESS, SPR_NOACCESS,
1839 &spr_read_generic, &spr_write_generic,
1840 0x00000000);
1841 spr_register(env, SPR_40x_EVPR, "EVPR",
1842 SPR_NOACCESS, SPR_NOACCESS,
1843 &spr_read_generic, &spr_write_excp_prefix,
1844 0x00000000);
1845 spr_register(env, SPR_40x_SRR2, "SRR2",
1846 &spr_read_generic, &spr_write_generic,
1847 &spr_read_generic, &spr_write_generic,
1848 0x00000000);
1849 spr_register(env, SPR_40x_SRR3, "SRR3",
1850 &spr_read_generic, &spr_write_generic,
1851 &spr_read_generic, &spr_write_generic,
1852 0x00000000);
1853 /* Timers */
1854 spr_register(env, SPR_40x_PIT, "PIT",
1855 SPR_NOACCESS, SPR_NOACCESS,
1856 &spr_read_40x_pit, &spr_write_40x_pit,
1857 0x00000000);
1858 spr_register(env, SPR_40x_TCR, "TCR",
1859 SPR_NOACCESS, SPR_NOACCESS,
1860 &spr_read_generic, &spr_write_booke_tcr,
1861 0x00000000);
1862 spr_register(env, SPR_40x_TSR, "TSR",
1863 SPR_NOACCESS, SPR_NOACCESS,
1864 &spr_read_generic, &spr_write_booke_tsr,
1865 0x00000000);
1866 }
1867
1868 /* SPR specific to PowerPC 405 implementation */
1869 static void gen_spr_405 (CPUPPCState *env)
1870 {
1871 /* MMU */
1872 spr_register(env, SPR_40x_PID, "PID",
1873 SPR_NOACCESS, SPR_NOACCESS,
1874 &spr_read_generic, &spr_write_generic,
1875 0x00000000);
1876 spr_register(env, SPR_4xx_CCR0, "CCR0",
1877 SPR_NOACCESS, SPR_NOACCESS,
1878 &spr_read_generic, &spr_write_generic,
1879 0x00700000);
1880 /* Debug interface */
1881 /* XXX : not implemented */
1882 spr_register(env, SPR_40x_DBCR0, "DBCR0",
1883 SPR_NOACCESS, SPR_NOACCESS,
1884 &spr_read_generic, &spr_write_40x_dbcr0,
1885 0x00000000);
1886 /* XXX : not implemented */
1887 spr_register(env, SPR_405_DBCR1, "DBCR1",
1888 SPR_NOACCESS, SPR_NOACCESS,
1889 &spr_read_generic, &spr_write_generic,
1890 0x00000000);
1891 /* XXX : not implemented */
1892 spr_register(env, SPR_40x_DBSR, "DBSR",
1893 SPR_NOACCESS, SPR_NOACCESS,
1894 &spr_read_generic, &spr_write_clear,
1895 /* Last reset was system reset */
1896 0x00000300);
1897 /* XXX : not implemented */
1898 spr_register(env, SPR_40x_DAC1, "DAC1",
1899 SPR_NOACCESS, SPR_NOACCESS,
1900 &spr_read_generic, &spr_write_generic,
1901 0x00000000);
1902 spr_register(env, SPR_40x_DAC2, "DAC2",
1903 SPR_NOACCESS, SPR_NOACCESS,
1904 &spr_read_generic, &spr_write_generic,
1905 0x00000000);
1906 /* XXX : not implemented */
1907 spr_register(env, SPR_405_DVC1, "DVC1",
1908 SPR_NOACCESS, SPR_NOACCESS,
1909 &spr_read_generic, &spr_write_generic,
1910 0x00000000);
1911 /* XXX : not implemented */
1912 spr_register(env, SPR_405_DVC2, "DVC2",
1913 SPR_NOACCESS, SPR_NOACCESS,
1914 &spr_read_generic, &spr_write_generic,
1915 0x00000000);
1916 /* XXX : not implemented */
1917 spr_register(env, SPR_40x_IAC1, "IAC1",
1918 SPR_NOACCESS, SPR_NOACCESS,
1919 &spr_read_generic, &spr_write_generic,
1920 0x00000000);
1921 spr_register(env, SPR_40x_IAC2, "IAC2",
1922 SPR_NOACCESS, SPR_NOACCESS,
1923 &spr_read_generic, &spr_write_generic,
1924 0x00000000);
1925 /* XXX : not implemented */
1926 spr_register(env, SPR_405_IAC3, "IAC3",
1927 SPR_NOACCESS, SPR_NOACCESS,
1928 &spr_read_generic, &spr_write_generic,
1929 0x00000000);
1930 /* XXX : not implemented */
1931 spr_register(env, SPR_405_IAC4, "IAC4",
1932 SPR_NOACCESS, SPR_NOACCESS,
1933 &spr_read_generic, &spr_write_generic,
1934 0x00000000);
1935 /* Storage control */
1936 /* XXX: TODO: not implemented */
1937 spr_register(env, SPR_405_SLER, "SLER",
1938 SPR_NOACCESS, SPR_NOACCESS,
1939 &spr_read_generic, &spr_write_40x_sler,
1940 0x00000000);
1941 spr_register(env, SPR_40x_ZPR, "ZPR",
1942 SPR_NOACCESS, SPR_NOACCESS,
1943 &spr_read_generic, &spr_write_generic,
1944 0x00000000);
1945 /* XXX : not implemented */
1946 spr_register(env, SPR_405_SU0R, "SU0R",
1947 SPR_NOACCESS, SPR_NOACCESS,
1948 &spr_read_generic, &spr_write_generic,
1949 0x00000000);
1950 /* SPRG */
1951 spr_register(env, SPR_USPRG0, "USPRG0",
1952 &spr_read_ureg, SPR_NOACCESS,
1953 &spr_read_ureg, SPR_NOACCESS,
1954 0x00000000);
1955 spr_register(env, SPR_SPRG4, "SPRG4",
1956 SPR_NOACCESS, SPR_NOACCESS,
1957 &spr_read_generic, &spr_write_generic,
1958 0x00000000);
1959 spr_register(env, SPR_SPRG5, "SPRG5",
1960 SPR_NOACCESS, SPR_NOACCESS,
1961 spr_read_generic, &spr_write_generic,
1962 0x00000000);
1963 spr_register(env, SPR_SPRG6, "SPRG6",
1964 SPR_NOACCESS, SPR_NOACCESS,
1965 spr_read_generic, &spr_write_generic,
1966 0x00000000);
1967 spr_register(env, SPR_SPRG7, "SPRG7",
1968 SPR_NOACCESS, SPR_NOACCESS,
1969 spr_read_generic, &spr_write_generic,
1970 0x00000000);
1971 gen_spr_usprgh(env);
1972 }
1973
1974 /* SPR shared between PowerPC 401 & 403 implementations */
1975 static void gen_spr_401_403 (CPUPPCState *env)
1976 {
1977 /* Time base */
1978 spr_register(env, SPR_403_VTBL, "TBL",
1979 &spr_read_tbl, SPR_NOACCESS,
1980 &spr_read_tbl, SPR_NOACCESS,
1981 0x00000000);
1982 spr_register(env, SPR_403_TBL, "TBL",
1983 SPR_NOACCESS, SPR_NOACCESS,
1984 SPR_NOACCESS, &spr_write_tbl,
1985 0x00000000);
1986 spr_register(env, SPR_403_VTBU, "TBU",
1987 &spr_read_tbu, SPR_NOACCESS,
1988 &spr_read_tbu, SPR_NOACCESS,
1989 0x00000000);
1990 spr_register(env, SPR_403_TBU, "TBU",
1991 SPR_NOACCESS, SPR_NOACCESS,
1992 SPR_NOACCESS, &spr_write_tbu,
1993 0x00000000);
1994 /* Debug */
1995 /* not emulated, as QEMU do not emulate caches */
1996 spr_register(env, SPR_403_CDBCR, "CDBCR",
1997 SPR_NOACCESS, SPR_NOACCESS,
1998 &spr_read_generic, &spr_write_generic,
1999 0x00000000);
2000 }
2001
2002 /* SPR specific to PowerPC 401 implementation */
2003 static void gen_spr_401 (CPUPPCState *env)
2004 {
2005 /* Debug interface */
2006 /* XXX : not implemented */
2007 spr_register(env, SPR_40x_DBCR0, "DBCR",
2008 SPR_NOACCESS, SPR_NOACCESS,
2009 &spr_read_generic, &spr_write_40x_dbcr0,
2010 0x00000000);
2011 /* XXX : not implemented */
2012 spr_register(env, SPR_40x_DBSR, "DBSR",
2013 SPR_NOACCESS, SPR_NOACCESS,
2014 &spr_read_generic, &spr_write_clear,
2015 /* Last reset was system reset */
2016 0x00000300);
2017 /* XXX : not implemented */
2018 spr_register(env, SPR_40x_DAC1, "DAC",
2019 SPR_NOACCESS, SPR_NOACCESS,
2020 &spr_read_generic, &spr_write_generic,
2021 0x00000000);
2022 /* XXX : not implemented */
2023 spr_register(env, SPR_40x_IAC1, "IAC",
2024 SPR_NOACCESS, SPR_NOACCESS,
2025 &spr_read_generic, &spr_write_generic,
2026 0x00000000);
2027 /* Storage control */
2028 /* XXX: TODO: not implemented */
2029 spr_register(env, SPR_405_SLER, "SLER",
2030 SPR_NOACCESS, SPR_NOACCESS,
2031 &spr_read_generic, &spr_write_40x_sler,
2032 0x00000000);
2033 /* not emulated, as QEMU never does speculative access */
2034 spr_register(env, SPR_40x_SGR, "SGR",
2035 SPR_NOACCESS, SPR_NOACCESS,
2036 &spr_read_generic, &spr_write_generic,
2037 0xFFFFFFFF);
2038 /* not emulated, as QEMU do not emulate caches */
2039 spr_register(env, SPR_40x_DCWR, "DCWR",
2040 SPR_NOACCESS, SPR_NOACCESS,
2041 &spr_read_generic, &spr_write_generic,
2042 0x00000000);
2043 }
2044
2045 static void gen_spr_401x2 (CPUPPCState *env)
2046 {
2047 gen_spr_401(env);
2048 spr_register(env, SPR_40x_PID, "PID",
2049 SPR_NOACCESS, SPR_NOACCESS,
2050 &spr_read_generic, &spr_write_generic,
2051 0x00000000);
2052 spr_register(env, SPR_40x_ZPR, "ZPR",
2053 SPR_NOACCESS, SPR_NOACCESS,
2054 &spr_read_generic, &spr_write_generic,
2055 0x00000000);
2056 }
2057
2058 /* SPR specific to PowerPC 403 implementation */
2059 static void gen_spr_403 (CPUPPCState *env)
2060 {
2061 /* Debug interface */
2062 /* XXX : not implemented */
2063 spr_register(env, SPR_40x_DBCR0, "DBCR0",
2064 SPR_NOACCESS, SPR_NOACCESS,
2065 &spr_read_generic, &spr_write_40x_dbcr0,
2066 0x00000000);
2067 /* XXX : not implemented */
2068 spr_register(env, SPR_40x_DBSR, "DBSR",
2069 SPR_NOACCESS, SPR_NOACCESS,
2070 &spr_read_generic, &spr_write_clear,
2071 /* Last reset was system reset */
2072 0x00000300);
2073 /* XXX : not implemented */
2074 spr_register(env, SPR_40x_DAC1, "DAC1",
2075 SPR_NOACCESS, SPR_NOACCESS,
2076 &spr_read_generic, &spr_write_generic,
2077 0x00000000);
2078 /* XXX : not implemented */
2079 spr_register(env, SPR_40x_DAC2, "DAC2",
2080 SPR_NOACCESS, SPR_NOACCESS,
2081 &spr_read_generic, &spr_write_generic,
2082 0x00000000);
2083 /* XXX : not implemented */
2084 spr_register(env, SPR_40x_IAC1, "IAC1",
2085 SPR_NOACCESS, SPR_NOACCESS,
2086 &spr_read_generic, &spr_write_generic,
2087 0x00000000);
2088 /* XXX : not implemented */
2089 spr_register(env, SPR_40x_IAC2, "IAC2",
2090 SPR_NOACCESS, SPR_NOACCESS,
2091 &spr_read_generic, &spr_write_generic,
2092 0x00000000);
2093 }
2094
2095 static void gen_spr_403_real (CPUPPCState *env)
2096 {
2097 spr_register(env, SPR_403_PBL1, "PBL1",
2098 SPR_NOACCESS, SPR_NOACCESS,
2099 &spr_read_403_pbr, &spr_write_403_pbr,
2100 0x00000000);
2101 spr_register(env, SPR_403_PBU1, "PBU1",
2102 SPR_NOACCESS, SPR_NOACCESS,
2103 &spr_read_403_pbr, &spr_write_403_pbr,
2104 0x00000000);
2105 spr_register(env, SPR_403_PBL2, "PBL2",
2106 SPR_NOACCESS, SPR_NOACCESS,
2107 &spr_read_403_pbr, &spr_write_403_pbr,
2108 0x00000000);
2109 spr_register(env, SPR_403_PBU2, "PBU2",
2110 SPR_NOACCESS, SPR_NOACCESS,
2111 &spr_read_403_pbr, &spr_write_403_pbr,
2112 0x00000000);
2113 }
2114
2115 static void gen_spr_403_mmu (CPUPPCState *env)
2116 {
2117 /* MMU */
2118 spr_register(env, SPR_40x_PID, "PID",
2119 SPR_NOACCESS, SPR_NOACCESS,
2120 &spr_read_generic, &spr_write_generic,
2121 0x00000000);
2122 spr_register(env, SPR_40x_ZPR, "ZPR",
2123 SPR_NOACCESS, SPR_NOACCESS,
2124 &spr_read_generic, &spr_write_generic,
2125 0x00000000);
2126 }
2127
2128 /* SPR specific to PowerPC compression coprocessor extension */
2129 static void gen_spr_compress (CPUPPCState *env)
2130 {
2131 /* XXX : not implemented */
2132 spr_register(env, SPR_401_SKR, "SKR",
2133 SPR_NOACCESS, SPR_NOACCESS,
2134 &spr_read_generic, &spr_write_generic,
2135 0x00000000);
2136 }
2137
2138 #if defined (TARGET_PPC64)
2139 /* SPR specific to PowerPC 620 */
2140 static void gen_spr_620 (CPUPPCState *env)
2141 {
2142 /* Processor identification */
2143 spr_register(env, SPR_PIR, "PIR",
2144 SPR_NOACCESS, SPR_NOACCESS,
2145 &spr_read_generic, &spr_write_pir,
2146 0x00000000);
2147 spr_register(env, SPR_ASR, "ASR",
2148 SPR_NOACCESS, SPR_NOACCESS,
2149 &spr_read_asr, &spr_write_asr,
2150 0x00000000);
2151 /* Breakpoints */
2152 /* XXX : not implemented */
2153 spr_register(env, SPR_IABR, "IABR",
2154 SPR_NOACCESS, SPR_NOACCESS,
2155 &spr_read_generic, &spr_write_generic,
2156 0x00000000);
2157 /* XXX : not implemented */
2158 spr_register(env, SPR_DABR, "DABR",
2159 SPR_NOACCESS, SPR_NOACCESS,
2160 &spr_read_generic, &spr_write_generic,
2161 0x00000000);
2162 /* XXX : not implemented */
2163 spr_register(env, SPR_SIAR, "SIAR",
2164 SPR_NOACCESS, SPR_NOACCESS,
2165 &spr_read_generic, SPR_NOACCESS,
2166 0x00000000);
2167 /* XXX : not implemented */
2168 spr_register(env, SPR_SDA, "SDA",
2169 SPR_NOACCESS, SPR_NOACCESS,
2170 &spr_read_generic, SPR_NOACCESS,
2171 0x00000000);
2172 /* XXX : not implemented */
2173 spr_register(env, SPR_620_PMC1R, "PMC1",
2174 SPR_NOACCESS, SPR_NOACCESS,
2175 &spr_read_generic, SPR_NOACCESS,
2176 0x00000000);
2177 spr_register(env, SPR_620_PMC1W, "PMC1",
2178 SPR_NOACCESS, SPR_NOACCESS,
2179 SPR_NOACCESS, &spr_write_generic,
2180 0x00000000);
2181 /* XXX : not implemented */
2182 spr_register(env, SPR_620_PMC2R, "PMC2",
2183 SPR_NOACCESS, SPR_NOACCESS,
2184 &spr_read_generic, SPR_NOACCESS,
2185 0x00000000);
2186 spr_register(env, SPR_620_PMC2W, "PMC2",
2187 SPR_NOACCESS, SPR_NOACCESS,
2188 SPR_NOACCESS, &spr_write_generic,
2189 0x00000000);
2190 /* XXX : not implemented */
2191 spr_register(env, SPR_620_MMCR0R, "MMCR0",
2192 SPR_NOACCESS, SPR_NOACCESS,
2193 &spr_read_generic, SPR_NOACCESS,
2194 0x00000000);
2195 spr_register(env, SPR_620_MMCR0W, "MMCR0",
2196 SPR_NOACCESS, SPR_NOACCESS,
2197 SPR_NOACCESS, &spr_write_generic,
2198 0x00000000);
2199 /* External access control */
2200 /* XXX : not implemented */
2201 spr_register(env, SPR_EAR, "EAR",
2202 SPR_NOACCESS, SPR_NOACCESS,
2203 &spr_read_generic, &spr_write_generic,
2204 0x00000000);
2205 #if 0 // XXX: check this
2206 /* XXX : not implemented */
2207 spr_register(env, SPR_620_PMR0, "PMR0",
2208 SPR_NOACCESS, SPR_NOACCESS,
2209 &spr_read_generic, &spr_write_generic,
2210 0x00000000);
2211 /* XXX : not implemented */
2212 spr_register(env, SPR_620_PMR1, "PMR1",
2213 SPR_NOACCESS, SPR_NOACCESS,
2214 &spr_read_generic, &spr_write_generic,
2215 0x00000000);
2216 /* XXX : not implemented */
2217 spr_register(env, SPR_620_PMR2, "PMR2",
2218 SPR_NOACCESS, SPR_NOACCESS,
2219 &spr_read_generic, &spr_write_generic,
2220 0x00000000);
2221 /* XXX : not implemented */
2222 spr_register(env, SPR_620_PMR3, "PMR3",
2223 SPR_NOACCESS, SPR_NOACCESS,
2224 &spr_read_generic, &spr_write_generic,
2225 0x00000000);
2226 /* XXX : not implemented */
2227 spr_register(env, SPR_620_PMR4, "PMR4",
2228 SPR_NOACCESS, SPR_NOACCESS,
2229 &spr_read_generic, &spr_write_generic,
2230 0x00000000);
2231 /* XXX : not implemented */
2232 spr_register(env, SPR_620_PMR5, "PMR5",
2233 SPR_NOACCESS, SPR_NOACCESS,
2234 &spr_read_generic, &spr_write_generic,
2235 0x00000000);
2236 /* XXX : not implemented */
2237 spr_register(env, SPR_620_PMR6, "PMR6",
2238 SPR_NOACCESS, SPR_NOACCESS,
2239 &spr_read_generic, &spr_write_generic,
2240 0x00000000);
2241 /* XXX : not implemented */
2242 spr_register(env, SPR_620_PMR7, "PMR7",
2243 SPR_NOACCESS, SPR_NOACCESS,
2244 &spr_read_generic, &spr_write_generic,
2245 0x00000000);
2246 /* XXX : not implemented */
2247 spr_register(env, SPR_620_PMR8, "PMR8",
2248 SPR_NOACCESS, SPR_NOACCESS,
2249 &spr_read_generic, &spr_write_generic,
2250 0x00000000);
2251 /* XXX : not implemented */
2252 spr_register(env, SPR_620_PMR9, "PMR9",
2253 SPR_NOACCESS, SPR_NOACCESS,
2254 &spr_read_generic, &spr_write_generic,
2255 0x00000000);
2256 /* XXX : not implemented */
2257 spr_register(env, SPR_620_PMRA, "PMR10",
2258 SPR_NOACCESS, SPR_NOACCESS,
2259 &spr_read_generic, &spr_write_generic,
2260 0x00000000);
2261 /* XXX : not implemented */
2262 spr_register(env, SPR_620_PMRB, "PMR11",
2263 SPR_NOACCESS, SPR_NOACCESS,
2264 &spr_read_generic, &spr_write_generic,
2265 0x00000000);
2266 /* XXX : not implemented */
2267 spr_register(env, SPR_620_PMRC, "PMR12",
2268 SPR_NOACCESS, SPR_NOACCESS,
2269 &spr_read_generic, &spr_write_generic,
2270 0x00000000);
2271 /* XXX : not implemented */
2272 spr_register(env, SPR_620_PMRD, "PMR13",
2273 SPR_NOACCESS, SPR_NOACCESS,
2274 &spr_read_generic, &spr_write_generic,
2275 0x00000000);
2276 /* XXX : not implemented */
2277 spr_register(env, SPR_620_PMRE, "PMR14",
2278 SPR_NOACCESS, SPR_NOACCESS,
2279 &spr_read_generic, &spr_write_generic,
2280 0x00000000);
2281 /* XXX : not implemented */
2282 spr_register(env, SPR_620_PMRF, "PMR15",
2283 SPR_NOACCESS, SPR_NOACCESS,
2284 &spr_read_generic, &spr_write_generic,
2285 0x00000000);
2286 #endif
2287 /* XXX : not implemented */
2288 spr_register(env, SPR_620_BUSCSR, "BUSCSR",
2289 SPR_NOACCESS, SPR_NOACCESS,
2290 &spr_read_generic, &spr_write_generic,
2291 0x00000000);
2292 /* XXX : not implemented */
2293 spr_register(env, SPR_620_L2CR, "L2CR",
2294 SPR_NOACCESS, SPR_NOACCESS,
2295 &spr_read_generic, &spr_write_generic,
2296 0x00000000);
2297 /* XXX : not implemented */
2298 spr_register(env, SPR_620_L2SR, "L2SR",
2299 SPR_NOACCESS, SPR_NOACCESS,
2300 &spr_read_generic, &spr_write_generic,
2301 0x00000000);
2302 }
2303 #endif /* defined (TARGET_PPC64) */
2304
2305 static void gen_spr_5xx_8xx (CPUPPCState *env)
2306 {
2307 /* Exception processing */
2308 spr_register(env, SPR_DSISR, "DSISR",
2309 SPR_NOACCESS, SPR_NOACCESS,
2310 &spr_read_generic, &spr_write_generic,
2311 0x00000000);
2312 spr_register(env, SPR_DAR, "DAR",
2313 SPR_NOACCESS, SPR_NOACCESS,
2314 &spr_read_generic, &spr_write_generic,
2315 0x00000000);
2316 /* Timer */
2317 spr_register(env, SPR_DECR, "DECR",
2318 SPR_NOACCESS, SPR_NOACCESS,
2319 &spr_read_decr, &spr_write_decr,
2320 0x00000000);
2321 /* XXX : not implemented */
2322 spr_register(env, SPR_MPC_EIE, "EIE",
2323 SPR_NOACCESS, SPR_NOACCESS,
2324 &spr_read_generic, &spr_write_generic,
2325 0x00000000);
2326 /* XXX : not implemented */
2327 spr_register(env, SPR_MPC_EID, "EID",
2328 SPR_NOACCESS, SPR_NOACCESS,
2329 &spr_read_generic, &spr_write_generic,
2330 0x00000000);
2331 /* XXX : not implemented */
2332 spr_register(env, SPR_MPC_NRI, "NRI",
2333 SPR_NOACCESS, SPR_NOACCESS,
2334 &spr_read_generic, &spr_write_generic,
2335 0x00000000);
2336 /* XXX : not implemented */
2337 spr_register(env, SPR_MPC_CMPA, "CMPA",
2338 SPR_NOACCESS, SPR_NOACCESS,
2339 &spr_read_generic, &spr_write_generic,
2340 0x00000000);
2341 /* XXX : not implemented */
2342 spr_register(env, SPR_MPC_CMPB, "CMPB",
2343 SPR_NOACCESS, SPR_NOACCESS,
2344 &spr_read_generic, &spr_write_generic,
2345 0x00000000);
2346 /* XXX : not implemented */
2347 spr_register(env, SPR_MPC_CMPC, "CMPC",
2348 SPR_NOACCESS, SPR_NOACCESS,
2349 &spr_read_generic, &spr_write_generic,
2350 0x00000000);
2351 /* XXX : not implemented */
2352 spr_register(env, SPR_MPC_CMPD, "CMPD",
2353 SPR_NOACCESS, SPR_NOACCESS,
2354 &spr_read_generic, &spr_write_generic,
2355 0x00000000);
2356 /* XXX : not implemented */
2357 spr_register(env, SPR_MPC_ECR, "ECR",
2358 SPR_NOACCESS, SPR_NOACCESS,
2359 &spr_read_generic, &spr_write_generic,
2360 0x00000000);
2361 /* XXX : not implemented */
2362 spr_register(env, SPR_MPC_DER, "DER",
2363 SPR_NOACCESS, SPR_NOACCESS,
2364 &spr_read_generic, &spr_write_generic,
2365 0x00000000);
2366 /* XXX : not implemented */
2367 spr_register(env, SPR_MPC_COUNTA, "COUNTA",
2368 SPR_NOACCESS, SPR_NOACCESS,
2369 &spr_read_generic, &spr_write_generic,
2370 0x00000000);
2371 /* XXX : not implemented */
2372 spr_register(env, SPR_MPC_COUNTB, "COUNTB",
2373 SPR_NOACCESS, SPR_NOACCESS,
2374 &spr_read_generic, &spr_write_generic,
2375 0x00000000);
2376 /* XXX : not implemented */
2377 spr_register(env, SPR_MPC_CMPE, "CMPE",
2378 SPR_NOACCESS, SPR_NOACCESS,
2379 &spr_read_generic, &spr_write_generic,
2380 0x00000000);
2381 /* XXX : not implemented */
2382 spr_register(env, SPR_MPC_CMPF, "CMPF",
2383 SPR_NOACCESS, SPR_NOACCESS,
2384 &spr_read_generic, &spr_write_generic,
2385 0x00000000);
2386 /* XXX : not implemented */
2387 spr_register(env, SPR_MPC_CMPG, "CMPG",
2388 SPR_NOACCESS, SPR_NOACCESS,
2389 &spr_read_generic, &spr_write_generic,
2390 0x00000000);
2391 /* XXX : not implemented */
2392 spr_register(env, SPR_MPC_CMPH, "CMPH",
2393 SPR_NOACCESS, SPR_NOACCESS,
2394 &spr_read_generic, &spr_write_generic,
2395 0x00000000);
2396 /* XXX : not implemented */
2397 spr_register(env, SPR_MPC_LCTRL1, "LCTRL1",
2398 SPR_NOACCESS, SPR_NOACCESS,
2399 &spr_read_generic, &spr_write_generic,
2400 0x00000000);
2401 /* XXX : not implemented */
2402 spr_register(env, SPR_MPC_LCTRL2, "LCTRL2",
2403 SPR_NOACCESS, SPR_NOACCESS,
2404 &spr_read_generic, &spr_write_generic,
2405 0x00000000);
2406 /* XXX : not implemented */
2407 spr_register(env, SPR_MPC_BAR, "BAR",
2408 SPR_NOACCESS, SPR_NOACCESS,
2409 &spr_read_generic, &spr_write_generic,
2410 0x00000000);
2411 /* XXX : not implemented */
2412 spr_register(env, SPR_MPC_DPDR, "DPDR",
2413 SPR_NOACCESS, SPR_NOACCESS,
2414 &spr_read_generic, &spr_write_generic,
2415 0x00000000);
2416 /* XXX : not implemented */
2417 spr_register(env, SPR_MPC_IMMR, "IMMR",
2418 SPR_NOACCESS, SPR_NOACCESS,
2419 &spr_read_generic, &spr_write_generic,
2420 0x00000000);
2421 }
2422
2423 static void gen_spr_5xx (CPUPPCState *env)
2424 {
2425 /* XXX : not implemented */
2426 spr_register(env, SPR_RCPU_MI_GRA, "MI_GRA",
2427 SPR_NOACCESS, SPR_NOACCESS,
2428 &spr_read_generic, &spr_write_generic,
2429 0x00000000);
2430 /* XXX : not implemented */
2431 spr_register(env, SPR_RCPU_L2U_GRA, "L2U_GRA",
2432 SPR_NOACCESS, SPR_NOACCESS,
2433 &spr_read_generic, &spr_write_generic,
2434 0x00000000);
2435 /* XXX : not implemented */
2436 spr_register(env, SPR_RPCU_BBCMCR, "L2U_BBCMCR",
2437 SPR_NOACCESS, SPR_NOACCESS,
2438 &spr_read_generic, &spr_write_generic,
2439 0x00000000);
2440 /* XXX : not implemented */
2441 spr_register(env, SPR_RCPU_L2U_MCR, "L2U_MCR",
2442 SPR_NOACCESS, SPR_NOACCESS,
2443 &spr_read_generic, &spr_write_generic,
2444 0x00000000);
2445 /* XXX : not implemented */
2446 spr_register(env, SPR_RCPU_MI_RBA0, "MI_RBA0",
2447 SPR_NOACCESS, SPR_NOACCESS,
2448 &spr_read_generic, &spr_write_generic,
2449 0x00000000);
2450 /* XXX : not implemented */
2451 spr_register(env, SPR_RCPU_MI_RBA1, "MI_RBA1",
2452 SPR_NOACCESS, SPR_NOACCESS,
2453 &spr_read_generic, &spr_write_generic,
2454 0x00000000);
2455 /* XXX : not implemented */
2456 spr_register(env, SPR_RCPU_MI_RBA2, "MI_RBA2",
2457 SPR_NOACCESS, SPR_NOACCESS,
2458 &spr_read_generic, &spr_write_generic,
2459 0x00000000);
2460 /* XXX : not implemented */
2461 spr_register(env, SPR_RCPU_MI_RBA3, "MI_RBA3",
2462 SPR_NOACCESS, SPR_NOACCESS,
2463 &spr_read_generic, &spr_write_generic,
2464 0x00000000);
2465 /* XXX : not implemented */
2466 spr_register(env, SPR_RCPU_L2U_RBA0, "L2U_RBA0",
2467 SPR_NOACCESS, SPR_NOACCESS,
2468 &spr_read_generic, &spr_write_generic,
2469 0x00000000);
2470 /* XXX : not implemented */
2471 spr_register(env, SPR_RCPU_L2U_RBA1, "L2U_RBA1",
2472 SPR_NOACCESS, SPR_NOACCESS,
2473 &spr_read_generic, &spr_write_generic,
2474 0x00000000);
2475 /* XXX : not implemented */
2476 spr_register(env, SPR_RCPU_L2U_RBA2, "L2U_RBA2",
2477 SPR_NOACCESS, SPR_NOACCESS,
2478 &spr_read_generic, &spr_write_generic,
2479 0x00000000);
2480 /* XXX : not implemented */
2481 spr_register(env, SPR_RCPU_L2U_RBA3, "L2U_RBA3",
2482 SPR_NOACCESS, SPR_NOACCESS,
2483 &spr_read_generic, &spr_write_generic,
2484 0x00000000);
2485 /* XXX : not implemented */
2486 spr_register(env, SPR_RCPU_MI_RA0, "MI_RA0",
2487 SPR_NOACCESS, SPR_NOACCESS,
2488 &spr_read_generic, &spr_write_generic,
2489 0x00000000);
2490 /* XXX : not implemented */
2491 spr_register(env, SPR_RCPU_MI_RA1, "MI_RA1",
2492 SPR_NOACCESS, SPR_NOACCESS,
2493 &spr_read_generic, &spr_write_generic,
2494 0x00000000);
2495 /* XXX : not implemented */
2496 spr_register(env, SPR_RCPU_MI_RA2, "MI_RA2",
2497 SPR_NOACCESS, SPR_NOACCESS,
2498 &spr_read_generic, &spr_write_generic,
2499 0x00000000);
2500 /* XXX : not implemented */
2501 spr_register(env, SPR_RCPU_MI_RA3, "MI_RA3",
2502 SPR_NOACCESS, SPR_NOACCESS,
2503 &spr_read_generic, &spr_write_generic,
2504 0x00000000);
2505 /* XXX : not implemented */
2506 spr_register(env, SPR_RCPU_L2U_RA0, "L2U_RA0",
2507 SPR_NOACCESS, SPR_NOACCESS,
2508 &spr_read_generic, &spr_write_generic,
2509 0x00000000);
2510 /* XXX : not implemented */
2511 spr_register(env, SPR_RCPU_L2U_RA1, "L2U_RA1",
2512 SPR_NOACCESS, SPR_NOACCESS,
2513 &spr_read_generic, &spr_write_generic,
2514 0x00000000);
2515 /* XXX : not implemented */
2516 spr_register(env, SPR_RCPU_L2U_RA2, "L2U_RA2",
2517 SPR_NOACCESS, SPR_NOACCESS,
2518 &spr_read_generic, &spr_write_generic,
2519 0x00000000);
2520 /* XXX : not implemented */
2521 spr_register(env, SPR_RCPU_L2U_RA3, "L2U_RA3",
2522 SPR_NOACCESS, SPR_NOACCESS,
2523 &spr_read_generic, &spr_write_generic,
2524 0x00000000);
2525 /* XXX : not implemented */
2526 spr_register(env, SPR_RCPU_FPECR, "FPECR",
2527 SPR_NOACCESS, SPR_NOACCESS,
2528 &spr_read_generic, &spr_write_generic,
2529 0x00000000);
2530 }
2531
2532 static void gen_spr_8xx (CPUPPCState *env)
2533 {
2534 /* XXX : not implemented */
2535 spr_register(env, SPR_MPC_IC_CST, "IC_CST",
2536 SPR_NOACCESS, SPR_NOACCESS,
2537 &spr_read_generic, &spr_write_generic,
2538 0x00000000);
2539 /* XXX : not implemented */
2540 spr_register(env, SPR_MPC_IC_ADR, "IC_ADR",
2541 SPR_NOACCESS, SPR_NOACCESS,
2542 &spr_read_generic, &spr_write_generic,
2543 0x00000000);
2544 /* XXX : not implemented */
2545 spr_register(env, SPR_MPC_IC_DAT, "IC_DAT",
2546 SPR_NOACCESS, SPR_NOACCESS,
2547 &spr_read_generic, &spr_write_generic,
2548 0x00000000);
2549 /* XXX : not implemented */
2550 spr_register(env, SPR_MPC_DC_CST, "DC_CST",
2551 SPR_NOACCESS, SPR_NOACCESS,
2552 &spr_read_generic, &spr_write_generic,
2553 0x00000000);
2554 /* XXX : not implemented */
2555 spr_register(env, SPR_MPC_DC_ADR, "DC_ADR",
2556 SPR_NOACCESS, SPR_NOACCESS,
2557 &spr_read_generic, &spr_write_generic,
2558 0x00000000);
2559 /* XXX : not implemented */
2560 spr_register(env, SPR_MPC_DC_DAT, "DC_DAT",
2561 SPR_NOACCESS, SPR_NOACCESS,
2562 &spr_read_generic, &spr_write_generic,
2563 0x00000000);
2564 /* XXX : not implemented */
2565 spr_register(env, SPR_MPC_MI_CTR, "MI_CTR",
2566 SPR_NOACCESS, SPR_NOACCESS,
2567 &spr_read_generic, &spr_write_generic,
2568 0x00000000);
2569 /* XXX : not implemented */
2570 spr_register(env, SPR_MPC_MI_AP, "MI_AP",
2571 SPR_NOACCESS, SPR_NOACCESS,
2572 &spr_read_generic, &spr_write_generic,
2573 0x00000000);
2574 /* XXX : not implemented */
2575 spr_register(env, SPR_MPC_MI_EPN, "MI_EPN",
2576 SPR_NOACCESS, SPR_NOACCESS,
2577 &spr_read_generic, &spr_write_generic,
2578 0x00000000);
2579 /* XXX : not implemented */
2580 spr_register(env, SPR_MPC_MI_TWC, "MI_TWC",
2581 SPR_NOACCESS, SPR_NOACCESS,
2582 &spr_read_generic, &spr_write_generic,
2583 0x00000000);
2584 /* XXX : not implemented */
2585 spr_register(env, SPR_MPC_MI_RPN, "MI_RPN",
2586 SPR_NOACCESS, SPR_NOACCESS,
2587 &spr_read_generic, &spr_write_generic,
2588 0x00000000);
2589 /* XXX : not implemented */
2590 spr_register(env, SPR_MPC_MI_DBCAM, "MI_DBCAM",
2591 SPR_NOACCESS, SPR_NOACCESS,
2592 &spr_read_generic, &spr_write_generic,
2593 0x00000000);
2594 /* XXX : not implemented */
2595 spr_register(env, SPR_MPC_MI_DBRAM0, "MI_DBRAM0",
2596 SPR_NOACCESS, SPR_NOACCESS,
2597 &spr_read_generic, &spr_write_generic,
2598 0x00000000);
2599 /* XXX : not implemented */
2600 spr_register(env, SPR_MPC_MI_DBRAM1, "MI_DBRAM1",
2601 SPR_NOACCESS, SPR_NOACCESS,
2602 &spr_read_generic, &spr_write_generic,
2603 0x00000000);
2604 /* XXX : not implemented */
2605 spr_register(env, SPR_MPC_MD_CTR, "MD_CTR",
2606 SPR_NOACCESS, SPR_NOACCESS,
2607 &spr_read_generic, &spr_write_generic,
2608 0x00000000);
2609 /* XXX : not implemented */
2610 spr_register(env, SPR_MPC_MD_CASID, "MD_CASID",
2611 SPR_NOACCESS, SPR_NOACCESS,
2612 &spr_read_generic, &spr_write_generic,
2613 0x00000000);
2614 /* XXX : not implemented */
2615 spr_register(env, SPR_MPC_MD_AP, "MD_AP",
2616 SPR_NOACCESS, SPR_NOACCESS,
2617 &spr_read_generic, &spr_write_generic,
2618 0x00000000);
2619 /* XXX : not implemented */
2620 spr_register(env, SPR_MPC_MD_EPN, "MD_EPN",
2621 SPR_NOACCESS, SPR_NOACCESS,
2622 &spr_read_generic, &spr_write_generic,
2623 0x00000000);
2624 /* XXX : not implemented */
2625 spr_register(env, SPR_MPC_MD_TWB, "MD_TWB",
2626 SPR_NOACCESS, SPR_NOACCESS,
2627 &spr_read_generic, &spr_write_generic,
2628 0x00000000);
2629 /* XXX : not implemented */
2630 spr_register(env, SPR_MPC_MD_TWC, "MD_TWC",
2631 SPR_NOACCESS, SPR_NOACCESS,
2632 &spr_read_generic, &spr_write_generic,
2633 0x00000000);
2634 /* XXX : not implemented */
2635 spr_register(env, SPR_MPC_MD_RPN, "MD_RPN",
2636 SPR_NOACCESS, SPR_NOACCESS,
2637 &spr_read_generic, &spr_write_generic,
2638 0x00000000);
2639 /* XXX : not implemented */
2640 spr_register(env, SPR_MPC_MD_TW, "MD_TW",
2641 SPR_NOACCESS, SPR_NOACCESS,
2642 &spr_read_generic, &spr_write_generic,
2643 0x00000000);
2644 /* XXX : not implemented */
2645 spr_register(env, SPR_MPC_MD_DBCAM, "MD_DBCAM",
2646 SPR_NOACCESS, SPR_NOACCESS,
2647 &spr_read_generic, &spr_write_generic,
2648 0x00000000);
2649 /* XXX : not implemented */
2650 spr_register(env, SPR_MPC_MD_DBRAM0, "MD_DBRAM0",
2651 SPR_NOACCESS, SPR_NOACCESS,
2652 &spr_read_generic, &spr_write_generic,
2653 0x00000000);
2654 /* XXX : not implemented */
2655 spr_register(env, SPR_MPC_MD_DBRAM1, "MD_DBRAM1",
2656 SPR_NOACCESS, SPR_NOACCESS,
2657 &spr_read_generic, &spr_write_generic,
2658 0x00000000);
2659 }
2660
2661 // XXX: TODO
2662 /*
2663 * AMR => SPR 29 (Power 2.04)
2664 * CTRL => SPR 136 (Power 2.04)
2665 * CTRL => SPR 152 (Power 2.04)
2666 * SCOMC => SPR 276 (64 bits ?)
2667 * SCOMD => SPR 277 (64 bits ?)
2668 * TBU40 => SPR 286 (Power 2.04 hypv)
2669 * HSPRG0 => SPR 304 (Power 2.04 hypv)
2670 * HSPRG1 => SPR 305 (Power 2.04 hypv)
2671 * HDSISR => SPR 306 (Power 2.04 hypv)
2672 * HDAR => SPR 307 (Power 2.04 hypv)
2673 * PURR => SPR 309 (Power 2.04 hypv)
2674 * HDEC => SPR 310 (Power 2.04 hypv)
2675 * HIOR => SPR 311 (hypv)
2676 * RMOR => SPR 312 (970)
2677 * HRMOR => SPR 313 (Power 2.04 hypv)
2678 * HSRR0 => SPR 314 (Power 2.04 hypv)
2679 * HSRR1 => SPR 315 (Power 2.04 hypv)
2680 * LPCR => SPR 316 (970)
2681 * LPIDR => SPR 317 (970)
2682 * EPR => SPR 702 (Power 2.04 emb)
2683 * perf => 768-783 (Power 2.04)
2684 * perf => 784-799 (Power 2.04)
2685 * PPR => SPR 896 (Power 2.04)
2686 * EPLC => SPR 947 (Power 2.04 emb)
2687 * EPSC => SPR 948 (Power 2.04 emb)
2688 * DABRX => 1015 (Power 2.04 hypv)
2689 * FPECR => SPR 1022 (?)
2690 * ... and more (thermal management, performance counters, ...)
2691 */
2692
2693 /*****************************************************************************/
2694 /* Exception vectors models */
2695 static void init_excp_4xx_real (CPUPPCState *env)
2696 {
2697 #if !defined(CONFIG_USER_ONLY)
2698 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2699 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2700 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2701 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2702 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2703 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2704 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2705 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2706 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2707 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2708 env->hreset_excp_prefix = 0x00000000UL;
2709 env->ivor_mask = 0x0000FFF0UL;
2710 env->ivpr_mask = 0xFFFF0000UL;
2711 /* Hardware reset vector */
2712 env->hreset_vector = 0xFFFFFFFCUL;
2713 #endif
2714 }
2715
2716 static void init_excp_4xx_softmmu (CPUPPCState *env)
2717 {
2718 #if !defined(CONFIG_USER_ONLY)
2719 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000100;
2720 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2721 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2722 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2723 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2724 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2725 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2726 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2727 env->excp_vectors[POWERPC_EXCP_PIT] = 0x00001000;
2728 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00001010;
2729 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001020;
2730 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001100;
2731 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001200;
2732 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00002000;
2733 env->hreset_excp_prefix = 0x00000000UL;
2734 env->ivor_mask = 0x0000FFF0UL;
2735 env->ivpr_mask = 0xFFFF0000UL;
2736 /* Hardware reset vector */
2737 env->hreset_vector = 0xFFFFFFFCUL;
2738 #endif
2739 }
2740
2741 static void init_excp_MPC5xx (CPUPPCState *env)
2742 {
2743 #if !defined(CONFIG_USER_ONLY)
2744 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2745 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2746 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2747 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2748 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2749 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2750 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2751 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2752 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2753 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2754 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2755 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2756 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2757 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2758 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2759 env->hreset_excp_prefix = 0x00000000UL;
2760 env->ivor_mask = 0x0000FFF0UL;
2761 env->ivpr_mask = 0xFFFF0000UL;
2762 /* Hardware reset vector */
2763 env->hreset_vector = 0xFFFFFFFCUL;
2764 #endif
2765 }
2766
2767 static void init_excp_MPC8xx (CPUPPCState *env)
2768 {
2769 #if !defined(CONFIG_USER_ONLY)
2770 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2771 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2772 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2773 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2774 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2775 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2776 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2777 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000900;
2778 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2779 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2780 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2781 env->excp_vectors[POWERPC_EXCP_FPA] = 0x00000E00;
2782 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001000;
2783 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00001100;
2784 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00001200;
2785 env->excp_vectors[POWERPC_EXCP_ITLBE] = 0x00001300;
2786 env->excp_vectors[POWERPC_EXCP_DTLBE] = 0x00001400;
2787 env->excp_vectors[POWERPC_EXCP_DABR] = 0x00001C00;
2788 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001C00;
2789 env->excp_vectors[POWERPC_EXCP_MEXTBR] = 0x00001E00;
2790 env->excp_vectors[POWERPC_EXCP_NMEXTBR] = 0x00001F00;
2791 env->hreset_excp_prefix = 0x00000000UL;
2792 env->ivor_mask = 0x0000FFF0UL;
2793 env->ivpr_mask = 0xFFFF0000UL;
2794 /* Hardware reset vector */
2795 env->hreset_vector = 0xFFFFFFFCUL;
2796 #endif
2797 }
2798
2799 static void init_excp_G2 (CPUPPCState *env)
2800 {
2801 #if !defined(CONFIG_USER_ONLY)
2802 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2803 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2804 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2805 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2806 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2807 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2808 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2809 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2810 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2811 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000A00;
2812 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2813 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2814 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2815 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2816 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2817 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2818 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2819 env->hreset_excp_prefix = 0x00000000UL;
2820 /* Hardware reset vector */
2821 env->hreset_vector = 0xFFFFFFFCUL;
2822 #endif
2823 }
2824
2825 static void init_excp_e200(CPUPPCState *env, target_ulong ivpr_mask)
2826 {
2827 #if !defined(CONFIG_USER_ONLY)
2828 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000FFC;
2829 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2830 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2831 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2832 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2833 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2834 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2835 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2836 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2837 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2838 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2839 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2840 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2841 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2842 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2843 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2844 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2845 env->excp_vectors[POWERPC_EXCP_SPEU] = 0x00000000;
2846 env->excp_vectors[POWERPC_EXCP_EFPDI] = 0x00000000;
2847 env->excp_vectors[POWERPC_EXCP_EFPRI] = 0x00000000;
2848 env->hreset_excp_prefix = 0x00000000UL;
2849 env->ivor_mask = 0x0000FFF7UL;
2850 env->ivpr_mask = ivpr_mask;
2851 /* Hardware reset vector */
2852 env->hreset_vector = 0xFFFFFFFCUL;
2853 #endif
2854 }
2855
2856 static void init_excp_BookE (CPUPPCState *env)
2857 {
2858 #if !defined(CONFIG_USER_ONLY)
2859 env->excp_vectors[POWERPC_EXCP_CRITICAL] = 0x00000000;
2860 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000000;
2861 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000000;
2862 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000000;
2863 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000000;
2864 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000000;
2865 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000000;
2866 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000000;
2867 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000000;
2868 env->excp_vectors[POWERPC_EXCP_APU] = 0x00000000;
2869 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000000;
2870 env->excp_vectors[POWERPC_EXCP_FIT] = 0x00000000;
2871 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00000000;
2872 env->excp_vectors[POWERPC_EXCP_DTLB] = 0x00000000;
2873 env->excp_vectors[POWERPC_EXCP_ITLB] = 0x00000000;
2874 env->excp_vectors[POWERPC_EXCP_DEBUG] = 0x00000000;
2875 env->hreset_excp_prefix = 0x00000000UL;
2876 env->ivor_mask = 0x0000FFE0UL;
2877 env->ivpr_mask = 0xFFFF0000UL;
2878 /* Hardware reset vector */
2879 env->hreset_vector = 0xFFFFFFFCUL;
2880 #endif
2881 }
2882
2883 static void init_excp_601 (CPUPPCState *env)
2884 {
2885 #if !defined(CONFIG_USER_ONLY)
2886 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2887 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2888 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2889 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2890 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2891 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2892 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2893 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2894 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2895 env->excp_vectors[POWERPC_EXCP_IO] = 0x00000A00;
2896 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2897 env->excp_vectors[POWERPC_EXCP_RUNM] = 0x00002000;
2898 env->hreset_excp_prefix = 0xFFF00000UL;
2899 /* Hardware reset vector */
2900 env->hreset_vector = 0x00000100UL;
2901 #endif
2902 }
2903
2904 static void init_excp_602 (CPUPPCState *env)
2905 {
2906 #if !defined(CONFIG_USER_ONLY)
2907 /* XXX: exception prefix has a special behavior on 602 */
2908 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2909 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2910 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2911 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2912 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2913 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2914 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2915 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2916 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2917 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2918 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2919 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2920 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2921 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2922 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2923 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2924 env->excp_vectors[POWERPC_EXCP_WDT] = 0x00001500;
2925 env->excp_vectors[POWERPC_EXCP_EMUL] = 0x00001600;
2926 env->hreset_excp_prefix = 0xFFF00000UL;
2927 /* Hardware reset vector */
2928 env->hreset_vector = 0xFFFFFFFCUL;
2929 #endif
2930 }
2931
2932 static void init_excp_603 (CPUPPCState *env)
2933 {
2934 #if !defined(CONFIG_USER_ONLY)
2935 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2936 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2937 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2938 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2939 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2940 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2941 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2942 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2943 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2944 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2945 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2946 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
2947 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
2948 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
2949 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2950 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2951 env->hreset_excp_prefix = 0x00000000UL;
2952 /* Hardware reset vector */
2953 env->hreset_vector = 0xFFFFFFFCUL;
2954 #endif
2955 }
2956
2957 static void init_excp_604 (CPUPPCState *env)
2958 {
2959 #if !defined(CONFIG_USER_ONLY)
2960 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2961 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2962 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2963 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2964 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2965 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2966 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2967 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2968 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2969 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2970 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2971 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2972 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2973 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2974 env->hreset_excp_prefix = 0xFFF00000UL;
2975 /* Hardware reset vector */
2976 env->hreset_vector = 0x00000100UL;
2977 #endif
2978 }
2979
2980 #if defined(TARGET_PPC64)
2981 static void init_excp_620 (CPUPPCState *env)
2982 {
2983 #if !defined(CONFIG_USER_ONLY)
2984 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
2985 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
2986 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
2987 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
2988 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
2989 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
2990 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
2991 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
2992 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
2993 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
2994 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
2995 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
2996 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
2997 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
2998 env->hreset_excp_prefix = 0xFFF00000UL;
2999 /* Hardware reset vector */
3000 env->hreset_vector = 0x0000000000000100ULL;
3001 #endif
3002 }
3003 #endif /* defined(TARGET_PPC64) */
3004
3005 static void init_excp_7x0 (CPUPPCState *env)
3006 {
3007 #if !defined(CONFIG_USER_ONLY)
3008 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3009 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3010 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3011 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3012 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3013 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3014 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3015 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3016 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3017 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3018 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3019 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3020 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3021 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3022 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3023 env->hreset_excp_prefix = 0x00000000UL;
3024 /* Hardware reset vector */
3025 env->hreset_vector = 0xFFFFFFFCUL;
3026 #endif
3027 }
3028
3029 static void init_excp_750cl (CPUPPCState *env)
3030 {
3031 #if !defined(CONFIG_USER_ONLY)
3032 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3033 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3034 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3035 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3036 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3037 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3038 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3039 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3040 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3041 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3042 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3043 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3044 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3045 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3046 env->hreset_excp_prefix = 0x00000000UL;
3047 /* Hardware reset vector */
3048 env->hreset_vector = 0xFFFFFFFCUL;
3049 #endif
3050 }
3051
3052 static void init_excp_750cx (CPUPPCState *env)
3053 {
3054 #if !defined(CONFIG_USER_ONLY)
3055 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3056 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3057 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3058 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3059 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3060 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3061 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3062 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3063 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3064 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3065 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3066 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3067 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3068 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3069 env->hreset_excp_prefix = 0x00000000UL;
3070 /* Hardware reset vector */
3071 env->hreset_vector = 0xFFFFFFFCUL;
3072 #endif
3073 }
3074
3075 /* XXX: Check if this is correct */
3076 static void init_excp_7x5 (CPUPPCState *env)
3077 {
3078 #if !defined(CONFIG_USER_ONLY)
3079 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3080 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3081 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3082 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3083 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3084 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3085 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3086 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3087 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3088 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3089 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3090 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3091 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3092 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3093 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3094 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3095 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3096 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3097 env->hreset_excp_prefix = 0x00000000UL;
3098 /* Hardware reset vector */
3099 env->hreset_vector = 0xFFFFFFFCUL;
3100 #endif
3101 }
3102
3103 static void init_excp_7400 (CPUPPCState *env)
3104 {
3105 #if !defined(CONFIG_USER_ONLY)
3106 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3107 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3108 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3109 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3110 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3111 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3112 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3113 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3114 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3115 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3116 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3117 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3118 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3119 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3120 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3121 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
3122 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001700;
3123 env->hreset_excp_prefix = 0x00000000UL;
3124 /* Hardware reset vector */
3125 env->hreset_vector = 0xFFFFFFFCUL;
3126 #endif
3127 }
3128
3129 static void init_excp_7450 (CPUPPCState *env)
3130 {
3131 #if !defined(CONFIG_USER_ONLY)
3132 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3133 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3134 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3135 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3136 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3137 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3138 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3139 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3140 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3141 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3142 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3143 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3144 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3145 env->excp_vectors[POWERPC_EXCP_IFTLB] = 0x00001000;
3146 env->excp_vectors[POWERPC_EXCP_DLTLB] = 0x00001100;
3147 env->excp_vectors[POWERPC_EXCP_DSTLB] = 0x00001200;
3148 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3149 env->excp_vectors[POWERPC_EXCP_SMI] = 0x00001400;
3150 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001600;
3151 env->hreset_excp_prefix = 0x00000000UL;
3152 /* Hardware reset vector */
3153 env->hreset_vector = 0xFFFFFFFCUL;
3154 #endif
3155 }
3156
3157 #if defined (TARGET_PPC64)
3158 static void init_excp_970 (CPUPPCState *env)
3159 {
3160 #if !defined(CONFIG_USER_ONLY)
3161 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3162 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3163 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3164 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
3165 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3166 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
3167 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3168 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3169 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3170 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3171 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3172 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
3173 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3174 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3175 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3176 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3177 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3178 env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
3179 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
3180 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800;
3181 env->hreset_excp_prefix = 0x00000000FFF00000ULL;
3182 /* Hardware reset vector */
3183 env->hreset_vector = 0x0000000000000100ULL;
3184 #endif
3185 }
3186
3187 static void init_excp_POWER7 (CPUPPCState *env)
3188 {
3189 #if !defined(CONFIG_USER_ONLY)
3190 env->excp_vectors[POWERPC_EXCP_RESET] = 0x00000100;
3191 env->excp_vectors[POWERPC_EXCP_MCHECK] = 0x00000200;
3192 env->excp_vectors[POWERPC_EXCP_DSI] = 0x00000300;
3193 env->excp_vectors[POWERPC_EXCP_DSEG] = 0x00000380;
3194 env->excp_vectors[POWERPC_EXCP_ISI] = 0x00000400;
3195 env->excp_vectors[POWERPC_EXCP_ISEG] = 0x00000480;
3196 env->excp_vectors[POWERPC_EXCP_EXTERNAL] = 0x00000500;
3197 env->excp_vectors[POWERPC_EXCP_ALIGN] = 0x00000600;
3198 env->excp_vectors[POWERPC_EXCP_PROGRAM] = 0x00000700;
3199 env->excp_vectors[POWERPC_EXCP_FPU] = 0x00000800;
3200 env->excp_vectors[POWERPC_EXCP_DECR] = 0x00000900;
3201 env->excp_vectors[POWERPC_EXCP_HDECR] = 0x00000980;
3202 env->excp_vectors[POWERPC_EXCP_SYSCALL] = 0x00000C00;
3203 env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
3204 env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
3205 env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
3206 env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
3207 env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
3208 env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
3209 env->excp_vectors[POWERPC_EXCP_THERM] = 0x00001800;
3210 env->hreset_excp_prefix = 0;
3211 /* Hardware reset vector */
3212 env->hreset_vector = 0x0000000000000100ULL;
3213 #endif
3214 }
3215 #endif
3216
3217 /*****************************************************************************/
3218 /* Power management enable checks */
3219 static int check_pow_none (CPUPPCState *env)
3220 {
3221 return 0;
3222 }
3223
3224 static int check_pow_nocheck (CPUPPCState *env)
3225 {
3226 return 1;
3227 }
3228
3229 static int check_pow_hid0 (CPUPPCState *env)
3230 {
3231 if (env->spr[SPR_HID0] & 0x00E00000)
3232 return 1;
3233
3234 return 0;
3235 }
3236
3237 static int check_pow_hid0_74xx (CPUPPCState *env)
3238 {
3239 if (env->spr[SPR_HID0] & 0x00600000)
3240 return 1;
3241
3242 return 0;
3243 }
3244
3245 /*****************************************************************************/
3246 /* PowerPC implementations definitions */
3247
3248 #define POWERPC_FAMILY(_name) \
3249 static void \
3250 glue(glue(ppc_, _name), _cpu_family_class_init)(ObjectClass *, void *); \
3251 \
3252 static const TypeInfo \
3253 glue(glue(ppc_, _name), _cpu_family_type_info) = { \
3254 .name = stringify(_name) "-family-" TYPE_POWERPC_CPU, \
3255 .parent = TYPE_POWERPC_CPU, \
3256 .abstract = true, \
3257 .class_init = glue(glue(ppc_, _name), _cpu_family_class_init), \
3258 }; \
3259 \
3260 static void glue(glue(ppc_, _name), _cpu_family_register_types)(void) \
3261 { \
3262 type_register_static( \
3263 &glue(glue(ppc_, _name), _cpu_family_type_info)); \
3264 } \
3265 \
3266 type_init(glue(glue(ppc_, _name), _cpu_family_register_types)) \
3267 \
3268 static void glue(glue(ppc_, _name), _cpu_family_class_init)
3269
3270 static void init_proc_401 (CPUPPCState *env)
3271 {
3272 gen_spr_40x(env);
3273 gen_spr_401_403(env);
3274 gen_spr_401(env);
3275 init_excp_4xx_real(env);
3276 env->dcache_line_size = 32;
3277 env->icache_line_size = 32;
3278 /* Allocate hardware IRQ controller */
3279 ppc40x_irq_init(env);
3280
3281 SET_FIT_PERIOD(12, 16, 20, 24);
3282 SET_WDT_PERIOD(16, 20, 24, 28);
3283 }
3284
3285 POWERPC_FAMILY(401)(ObjectClass *oc, void *data)
3286 {
3287 DeviceClass *dc = DEVICE_CLASS(oc);
3288 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3289
3290 dc->desc = "PowerPC 401";
3291 pcc->init_proc = init_proc_401;
3292 pcc->check_pow = check_pow_nocheck;
3293 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3294 PPC_WRTEE | PPC_DCR |
3295 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3296 PPC_CACHE_DCBZ |
3297 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3298 PPC_4xx_COMMON | PPC_40x_EXCP;
3299 pcc->insns_flags2 = PPC_NONE;
3300 pcc->msr_mask = 0x00000000000FD201ULL;
3301 pcc->mmu_model = POWERPC_MMU_REAL;
3302 pcc->excp_model = POWERPC_EXCP_40x;
3303 pcc->bus_model = PPC_FLAGS_INPUT_401;
3304 pcc->bfd_mach = bfd_mach_ppc_403;
3305 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3306 POWERPC_FLAG_BUS_CLK;
3307 }
3308
3309 static void init_proc_401x2 (CPUPPCState *env)
3310 {
3311 gen_spr_40x(env);
3312 gen_spr_401_403(env);
3313 gen_spr_401x2(env);
3314 gen_spr_compress(env);
3315 /* Memory management */
3316 #if !defined(CONFIG_USER_ONLY)
3317 env->nb_tlb = 64;
3318 env->nb_ways = 1;
3319 env->id_tlbs = 0;
3320 env->tlb_type = TLB_EMB;
3321 #endif
3322 init_excp_4xx_softmmu(env);
3323 env->dcache_line_size = 32;
3324 env->icache_line_size = 32;
3325 /* Allocate hardware IRQ controller */
3326 ppc40x_irq_init(env);
3327
3328 SET_FIT_PERIOD(12, 16, 20, 24);
3329 SET_WDT_PERIOD(16, 20, 24, 28);
3330 }
3331
3332 POWERPC_FAMILY(401x2)(ObjectClass *oc, void *data)
3333 {
3334 DeviceClass *dc = DEVICE_CLASS(oc);
3335 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3336
3337 dc->desc = "PowerPC 401x2";
3338 pcc->init_proc = init_proc_401x2;
3339 pcc->check_pow = check_pow_nocheck;
3340 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3341 PPC_DCR | PPC_WRTEE |
3342 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3343 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3344 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3345 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3346 PPC_4xx_COMMON | PPC_40x_EXCP;
3347 pcc->insns_flags2 = PPC_NONE;
3348 pcc->msr_mask = 0x00000000001FD231ULL;
3349 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3350 pcc->excp_model = POWERPC_EXCP_40x;
3351 pcc->bus_model = PPC_FLAGS_INPUT_401;
3352 pcc->bfd_mach = bfd_mach_ppc_403;
3353 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3354 POWERPC_FLAG_BUS_CLK;
3355 }
3356
3357 static void init_proc_401x3 (CPUPPCState *env)
3358 {
3359 gen_spr_40x(env);
3360 gen_spr_401_403(env);
3361 gen_spr_401(env);
3362 gen_spr_401x2(env);
3363 gen_spr_compress(env);
3364 init_excp_4xx_softmmu(env);
3365 env->dcache_line_size = 32;
3366 env->icache_line_size = 32;
3367 /* Allocate hardware IRQ controller */
3368 ppc40x_irq_init(env);
3369
3370 SET_FIT_PERIOD(12, 16, 20, 24);
3371 SET_WDT_PERIOD(16, 20, 24, 28);
3372 }
3373
3374 POWERPC_FAMILY(401x3)(ObjectClass *oc, void *data)
3375 {
3376 DeviceClass *dc = DEVICE_CLASS(oc);
3377 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3378
3379 dc->desc = "PowerPC 401x3";
3380 pcc->init_proc = init_proc_401x3;
3381 pcc->check_pow = check_pow_nocheck;
3382 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3383 PPC_DCR | PPC_WRTEE |
3384 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3385 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3386 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3387 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3388 PPC_4xx_COMMON | PPC_40x_EXCP;
3389 pcc->insns_flags2 = PPC_NONE;
3390 pcc->msr_mask = 0x00000000001FD631ULL;
3391 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3392 pcc->excp_model = POWERPC_EXCP_40x;
3393 pcc->bus_model = PPC_FLAGS_INPUT_401;
3394 pcc->bfd_mach = bfd_mach_ppc_403;
3395 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3396 POWERPC_FLAG_BUS_CLK;
3397 }
3398
3399 static void init_proc_IOP480 (CPUPPCState *env)
3400 {
3401 gen_spr_40x(env);
3402 gen_spr_401_403(env);
3403 gen_spr_401x2(env);
3404 gen_spr_compress(env);
3405 /* Memory management */
3406 #if !defined(CONFIG_USER_ONLY)
3407 env->nb_tlb = 64;
3408 env->nb_ways = 1;
3409 env->id_tlbs = 0;
3410 env->tlb_type = TLB_EMB;
3411 #endif
3412 init_excp_4xx_softmmu(env);
3413 env->dcache_line_size = 32;
3414 env->icache_line_size = 32;
3415 /* Allocate hardware IRQ controller */
3416 ppc40x_irq_init(env);
3417
3418 SET_FIT_PERIOD(8, 12, 16, 20);
3419 SET_WDT_PERIOD(16, 20, 24, 28);
3420 }
3421
3422 POWERPC_FAMILY(IOP480)(ObjectClass *oc, void *data)
3423 {
3424 DeviceClass *dc = DEVICE_CLASS(oc);
3425 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3426
3427 dc->desc = "IOP480";
3428 pcc->init_proc = init_proc_IOP480;
3429 pcc->check_pow = check_pow_nocheck;
3430 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3431 PPC_DCR | PPC_WRTEE |
3432 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3433 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3434 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3435 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3436 PPC_4xx_COMMON | PPC_40x_EXCP;
3437 pcc->insns_flags2 = PPC_NONE;
3438 pcc->msr_mask = 0x00000000001FD231ULL;
3439 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3440 pcc->excp_model = POWERPC_EXCP_40x;
3441 pcc->bus_model = PPC_FLAGS_INPUT_401;
3442 pcc->bfd_mach = bfd_mach_ppc_403;
3443 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
3444 POWERPC_FLAG_BUS_CLK;
3445 }
3446
3447 static void init_proc_403 (CPUPPCState *env)
3448 {
3449 gen_spr_40x(env);
3450 gen_spr_401_403(env);
3451 gen_spr_403(env);
3452 gen_spr_403_real(env);
3453 init_excp_4xx_real(env);
3454 env->dcache_line_size = 32;
3455 env->icache_line_size = 32;
3456 /* Allocate hardware IRQ controller */
3457 ppc40x_irq_init(env);
3458
3459 SET_FIT_PERIOD(8, 12, 16, 20);
3460 SET_WDT_PERIOD(16, 20, 24, 28);
3461 }
3462
3463 POWERPC_FAMILY(403)(ObjectClass *oc, void *data)
3464 {
3465 DeviceClass *dc = DEVICE_CLASS(oc);
3466 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3467
3468 dc->desc = "PowerPC 403";
3469 pcc->init_proc = init_proc_403;
3470 pcc->check_pow = check_pow_nocheck;
3471 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3472 PPC_DCR | PPC_WRTEE |
3473 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3474 PPC_CACHE_DCBZ |
3475 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3476 PPC_4xx_COMMON | PPC_40x_EXCP;
3477 pcc->insns_flags2 = PPC_NONE;
3478 pcc->msr_mask = 0x000000000007D00DULL;
3479 pcc->mmu_model = POWERPC_MMU_REAL;
3480 pcc->excp_model = POWERPC_EXCP_40x;
3481 pcc->bus_model = PPC_FLAGS_INPUT_401;
3482 pcc->bfd_mach = bfd_mach_ppc_403;
3483 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3484 POWERPC_FLAG_BUS_CLK;
3485 }
3486
3487 static void init_proc_403GCX (CPUPPCState *env)
3488 {
3489 gen_spr_40x(env);
3490 gen_spr_401_403(env);
3491 gen_spr_403(env);
3492 gen_spr_403_real(env);
3493 gen_spr_403_mmu(env);
3494 /* Bus access control */
3495 /* not emulated, as QEMU never does speculative access */
3496 spr_register(env, SPR_40x_SGR, "SGR",
3497 SPR_NOACCESS, SPR_NOACCESS,
3498 &spr_read_generic, &spr_write_generic,
3499 0xFFFFFFFF);
3500 /* not emulated, as QEMU do not emulate caches */
3501 spr_register(env, SPR_40x_DCWR, "DCWR",
3502 SPR_NOACCESS, SPR_NOACCESS,
3503 &spr_read_generic, &spr_write_generic,
3504 0x00000000);
3505 /* Memory management */
3506 #if !defined(CONFIG_USER_ONLY)
3507 env->nb_tlb = 64;
3508 env->nb_ways = 1;
3509 env->id_tlbs = 0;
3510 env->tlb_type = TLB_EMB;
3511 #endif
3512 init_excp_4xx_softmmu(env);
3513 env->dcache_line_size = 32;
3514 env->icache_line_size = 32;
3515 /* Allocate hardware IRQ controller */
3516 ppc40x_irq_init(env);
3517
3518 SET_FIT_PERIOD(8, 12, 16, 20);
3519 SET_WDT_PERIOD(16, 20, 24, 28);
3520 }
3521
3522 POWERPC_FAMILY(403GCX)(ObjectClass *oc, void *data)
3523 {
3524 DeviceClass *dc = DEVICE_CLASS(oc);
3525 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3526
3527 dc->desc = "PowerPC 403 GCX";
3528 pcc->init_proc = init_proc_403GCX;
3529 pcc->check_pow = check_pow_nocheck;
3530 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3531 PPC_DCR | PPC_WRTEE |
3532 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3533 PPC_CACHE_DCBZ |
3534 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3535 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3536 PPC_4xx_COMMON | PPC_40x_EXCP;
3537 pcc->insns_flags2 = PPC_NONE;
3538 pcc->msr_mask = 0x000000000007D00DULL;
3539 pcc->mmu_model = POWERPC_MMU_SOFT_4xx_Z;
3540 pcc->excp_model = POWERPC_EXCP_40x;
3541 pcc->bus_model = PPC_FLAGS_INPUT_401;
3542 pcc->bfd_mach = bfd_mach_ppc_403;
3543 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_PX |
3544 POWERPC_FLAG_BUS_CLK;
3545 }
3546
3547 static void init_proc_405 (CPUPPCState *env)
3548 {
3549 /* Time base */
3550 gen_tbl(env);
3551 gen_spr_40x(env);
3552 gen_spr_405(env);
3553 /* Bus access control */
3554 /* not emulated, as QEMU never does speculative access */
3555 spr_register(env, SPR_40x_SGR, "SGR",
3556 SPR_NOACCESS, SPR_NOACCESS,
3557 &spr_read_generic, &spr_write_generic,
3558 0xFFFFFFFF);
3559 /* not emulated, as QEMU do not emulate caches */
3560 spr_register(env, SPR_40x_DCWR, "DCWR",
3561 SPR_NOACCESS, SPR_NOACCESS,
3562 &spr_read_generic, &spr_write_generic,
3563 0x00000000);
3564 /* Memory management */
3565 #if !defined(CONFIG_USER_ONLY)
3566 env->nb_tlb = 64;
3567 env->nb_ways = 1;
3568 env->id_tlbs = 0;
3569 env->tlb_type = TLB_EMB;
3570 #endif
3571 init_excp_4xx_softmmu(env);
3572 env->dcache_line_size = 32;
3573 env->icache_line_size = 32;
3574 /* Allocate hardware IRQ controller */
3575 ppc40x_irq_init(env);
3576
3577 SET_FIT_PERIOD(8, 12, 16, 20);
3578 SET_WDT_PERIOD(16, 20, 24, 28);
3579 }
3580
3581 POWERPC_FAMILY(405)(ObjectClass *oc, void *data)
3582 {
3583 DeviceClass *dc = DEVICE_CLASS(oc);
3584 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3585
3586 dc->desc = "PowerPC 405";
3587 pcc->init_proc = init_proc_405;
3588 pcc->check_pow = check_pow_nocheck;
3589 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
3590 PPC_DCR | PPC_WRTEE |
3591 PPC_CACHE | PPC_CACHE_ICBI | PPC_40x_ICBT |
3592 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3593 PPC_MEM_SYNC | PPC_MEM_EIEIO |
3594 PPC_40x_TLB | PPC_MEM_TLBIA | PPC_MEM_TLBSYNC |
3595 PPC_4xx_COMMON | PPC_405_MAC | PPC_40x_EXCP;
3596 pcc->insns_flags2 = PPC_NONE;
3597 pcc->msr_mask = 0x000000000006E630ULL;
3598 pcc->mmu_model = POWERPC_MMU_SOFT_4xx;
3599 pcc->excp_model = POWERPC_EXCP_40x;
3600 pcc->bus_model = PPC_FLAGS_INPUT_405;
3601 pcc->bfd_mach = bfd_mach_ppc_403;
3602 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3603 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3604 }
3605
3606 static void init_proc_440EP (CPUPPCState *env)
3607 {
3608 /* Time base */
3609 gen_tbl(env);
3610 gen_spr_BookE(env, 0x000000000000FFFFULL);
3611 gen_spr_440(env);
3612 gen_spr_usprgh(env);
3613 /* Processor identification */
3614 spr_register(env, SPR_BOOKE_PIR, "PIR",
3615 SPR_NOACCESS, SPR_NOACCESS,
3616 &spr_read_generic, &spr_write_pir,
3617 0x00000000);
3618 /* XXX : not implemented */
3619 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3620 SPR_NOACCESS, SPR_NOACCESS,
3621 &spr_read_generic, &spr_write_generic,
3622 0x00000000);
3623 /* XXX : not implemented */
3624 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3625 SPR_NOACCESS, SPR_NOACCESS,
3626 &spr_read_generic, &spr_write_generic,
3627 0x00000000);
3628 /* XXX : not implemented */
3629 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3630 SPR_NOACCESS, SPR_NOACCESS,
3631 &spr_read_generic, &spr_write_generic,
3632 0x00000000);
3633 /* XXX : not implemented */
3634 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3635 SPR_NOACCESS, SPR_NOACCESS,
3636 &spr_read_generic, &spr_write_generic,
3637 0x00000000);
3638 /* XXX : not implemented */
3639 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3640 SPR_NOACCESS, SPR_NOACCESS,
3641 &spr_read_generic, &spr_write_generic,
3642 0x00000000);
3643 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3644 SPR_NOACCESS, SPR_NOACCESS,
3645 &spr_read_generic, &spr_write_generic,
3646 0x00000000);
3647 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3648 SPR_NOACCESS, SPR_NOACCESS,
3649 &spr_read_generic, &spr_write_generic,
3650 0x00000000);
3651 /* XXX : not implemented */
3652 spr_register(env, SPR_440_CCR1, "CCR1",
3653 SPR_NOACCESS, SPR_NOACCESS,
3654 &spr_read_generic, &spr_write_generic,
3655 0x00000000);
3656 /* Memory management */
3657 #if !defined(CONFIG_USER_ONLY)
3658 env->nb_tlb = 64;
3659 env->nb_ways = 1;
3660 env->id_tlbs = 0;
3661 env->tlb_type = TLB_EMB;
3662 #endif
3663 init_excp_BookE(env);
3664 env->dcache_line_size = 32;
3665 env->icache_line_size = 32;
3666 ppc40x_irq_init(env);
3667
3668 SET_FIT_PERIOD(12, 16, 20, 24);
3669 SET_WDT_PERIOD(20, 24, 28, 32);
3670 }
3671
3672 POWERPC_FAMILY(440EP)(ObjectClass *oc, void *data)
3673 {
3674 DeviceClass *dc = DEVICE_CLASS(oc);
3675 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3676
3677 dc->desc = "PowerPC 440 EP";
3678 pcc->init_proc = init_proc_440EP;
3679 pcc->check_pow = check_pow_nocheck;
3680 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3681 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
3682 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
3683 PPC_FLOAT_STFIWX |
3684 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3685 PPC_CACHE | PPC_CACHE_ICBI |
3686 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3687 PPC_MEM_TLBSYNC | PPC_MFTB |
3688 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3689 PPC_440_SPEC;
3690 pcc->insns_flags2 = PPC_NONE;
3691 pcc->msr_mask = 0x000000000006FF30ULL;
3692 pcc->mmu_model = POWERPC_MMU_BOOKE;
3693 pcc->excp_model = POWERPC_EXCP_BOOKE;
3694 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3695 pcc->bfd_mach = bfd_mach_ppc_403;
3696 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3697 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3698 }
3699
3700 static void init_proc_440GP (CPUPPCState *env)
3701 {
3702 /* Time base */
3703 gen_tbl(env);
3704 gen_spr_BookE(env, 0x000000000000FFFFULL);
3705 gen_spr_440(env);
3706 gen_spr_usprgh(env);
3707 /* Processor identification */
3708 spr_register(env, SPR_BOOKE_PIR, "PIR",
3709 SPR_NOACCESS, SPR_NOACCESS,
3710 &spr_read_generic, &spr_write_pir,
3711 0x00000000);
3712 /* XXX : not implemented */
3713 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3714 SPR_NOACCESS, SPR_NOACCESS,
3715 &spr_read_generic, &spr_write_generic,
3716 0x00000000);
3717 /* XXX : not implemented */
3718 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3719 SPR_NOACCESS, SPR_NOACCESS,
3720 &spr_read_generic, &spr_write_generic,
3721 0x00000000);
3722 /* XXX : not implemented */
3723 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3724 SPR_NOACCESS, SPR_NOACCESS,
3725 &spr_read_generic, &spr_write_generic,
3726 0x00000000);
3727 /* XXX : not implemented */
3728 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3729 SPR_NOACCESS, SPR_NOACCESS,
3730 &spr_read_generic, &spr_write_generic,
3731 0x00000000);
3732 /* Memory management */
3733 #if !defined(CONFIG_USER_ONLY)
3734 env->nb_tlb = 64;
3735 env->nb_ways = 1;
3736 env->id_tlbs = 0;
3737 env->tlb_type = TLB_EMB;
3738 #endif
3739 init_excp_BookE(env);
3740 env->dcache_line_size = 32;
3741 env->icache_line_size = 32;
3742 /* XXX: TODO: allocate internal IRQ controller */
3743
3744 SET_FIT_PERIOD(12, 16, 20, 24);
3745 SET_WDT_PERIOD(20, 24, 28, 32);
3746 }
3747
3748 POWERPC_FAMILY(440GP)(ObjectClass *oc, void *data)
3749 {
3750 DeviceClass *dc = DEVICE_CLASS(oc);
3751 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3752
3753 dc->desc = "PowerPC 440 GP";
3754 pcc->init_proc = init_proc_440GP;
3755 pcc->check_pow = check_pow_nocheck;
3756 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3757 PPC_DCR | PPC_DCRX | PPC_WRTEE | PPC_MFAPIDI |
3758 PPC_CACHE | PPC_CACHE_ICBI |
3759 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3760 PPC_MEM_TLBSYNC | PPC_TLBIVA | PPC_MFTB |
3761 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3762 PPC_440_SPEC;
3763 pcc->insns_flags2 = PPC_NONE;
3764 pcc->msr_mask = 0x000000000006FF30ULL;
3765 pcc->mmu_model = POWERPC_MMU_BOOKE;
3766 pcc->excp_model = POWERPC_EXCP_BOOKE;
3767 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3768 pcc->bfd_mach = bfd_mach_ppc_403;
3769 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3770 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3771 }
3772
3773 static void init_proc_440x4 (CPUPPCState *env)
3774 {
3775 /* Time base */
3776 gen_tbl(env);
3777 gen_spr_BookE(env, 0x000000000000FFFFULL);
3778 gen_spr_440(env);
3779 gen_spr_usprgh(env);
3780 /* Processor identification */
3781 spr_register(env, SPR_BOOKE_PIR, "PIR",
3782 SPR_NOACCESS, SPR_NOACCESS,
3783 &spr_read_generic, &spr_write_pir,
3784 0x00000000);
3785 /* XXX : not implemented */
3786 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3787 SPR_NOACCESS, SPR_NOACCESS,
3788 &spr_read_generic, &spr_write_generic,
3789 0x00000000);
3790 /* XXX : not implemented */
3791 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3792 SPR_NOACCESS, SPR_NOACCESS,
3793 &spr_read_generic, &spr_write_generic,
3794 0x00000000);
3795 /* XXX : not implemented */
3796 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3797 SPR_NOACCESS, SPR_NOACCESS,
3798 &spr_read_generic, &spr_write_generic,
3799 0x00000000);
3800 /* XXX : not implemented */
3801 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3802 SPR_NOACCESS, SPR_NOACCESS,
3803 &spr_read_generic, &spr_write_generic,
3804 0x00000000);
3805 /* Memory management */
3806 #if !defined(CONFIG_USER_ONLY)
3807 env->nb_tlb = 64;
3808 env->nb_ways = 1;
3809 env->id_tlbs = 0;
3810 env->tlb_type = TLB_EMB;
3811 #endif
3812 init_excp_BookE(env);
3813 env->dcache_line_size = 32;
3814 env->icache_line_size = 32;
3815 /* XXX: TODO: allocate internal IRQ controller */
3816
3817 SET_FIT_PERIOD(12, 16, 20, 24);
3818 SET_WDT_PERIOD(20, 24, 28, 32);
3819 }
3820
3821 POWERPC_FAMILY(440x4)(ObjectClass *oc, void *data)
3822 {
3823 DeviceClass *dc = DEVICE_CLASS(oc);
3824 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3825
3826 dc->desc = "PowerPC 440x4";
3827 pcc->init_proc = init_proc_440x4;
3828 pcc->check_pow = check_pow_nocheck;
3829 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3830 PPC_DCR | PPC_WRTEE |
3831 PPC_CACHE | PPC_CACHE_ICBI |
3832 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3833 PPC_MEM_TLBSYNC | PPC_MFTB |
3834 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3835 PPC_440_SPEC;
3836 pcc->insns_flags2 = PPC_NONE;
3837 pcc->msr_mask = 0x000000000006FF30ULL;
3838 pcc->mmu_model = POWERPC_MMU_BOOKE;
3839 pcc->excp_model = POWERPC_EXCP_BOOKE;
3840 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3841 pcc->bfd_mach = bfd_mach_ppc_403;
3842 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3843 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3844 }
3845
3846 static void init_proc_440x5 (CPUPPCState *env)
3847 {
3848 /* Time base */
3849 gen_tbl(env);
3850 gen_spr_BookE(env, 0x000000000000FFFFULL);
3851 gen_spr_440(env);
3852 gen_spr_usprgh(env);
3853 /* Processor identification */
3854 spr_register(env, SPR_BOOKE_PIR, "PIR",
3855 SPR_NOACCESS, SPR_NOACCESS,
3856 &spr_read_generic, &spr_write_pir,
3857 0x00000000);
3858 /* XXX : not implemented */
3859 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3860 SPR_NOACCESS, SPR_NOACCESS,
3861 &spr_read_generic, &spr_write_generic,
3862 0x00000000);
3863 /* XXX : not implemented */
3864 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3865 SPR_NOACCESS, SPR_NOACCESS,
3866 &spr_read_generic, &spr_write_generic,
3867 0x00000000);
3868 /* XXX : not implemented */
3869 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3870 SPR_NOACCESS, SPR_NOACCESS,
3871 &spr_read_generic, &spr_write_generic,
3872 0x00000000);
3873 /* XXX : not implemented */
3874 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3875 SPR_NOACCESS, SPR_NOACCESS,
3876 &spr_read_generic, &spr_write_generic,
3877 0x00000000);
3878 /* XXX : not implemented */
3879 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3880 SPR_NOACCESS, SPR_NOACCESS,
3881 &spr_read_generic, &spr_write_generic,
3882 0x00000000);
3883 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3884 SPR_NOACCESS, SPR_NOACCESS,
3885 &spr_read_generic, &spr_write_generic,
3886 0x00000000);
3887 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3888 SPR_NOACCESS, SPR_NOACCESS,
3889 &spr_read_generic, &spr_write_generic,
3890 0x00000000);
3891 /* XXX : not implemented */
3892 spr_register(env, SPR_440_CCR1, "CCR1",
3893 SPR_NOACCESS, SPR_NOACCESS,
3894 &spr_read_generic, &spr_write_generic,
3895 0x00000000);
3896 /* Memory management */
3897 #if !defined(CONFIG_USER_ONLY)
3898 env->nb_tlb = 64;
3899 env->nb_ways = 1;
3900 env->id_tlbs = 0;
3901 env->tlb_type = TLB_EMB;
3902 #endif
3903 init_excp_BookE(env);
3904 env->dcache_line_size = 32;
3905 env->icache_line_size = 32;
3906 ppc40x_irq_init(env);
3907
3908 SET_FIT_PERIOD(12, 16, 20, 24);
3909 SET_WDT_PERIOD(20, 24, 28, 32);
3910 }
3911
3912 POWERPC_FAMILY(440x5)(ObjectClass *oc, void *data)
3913 {
3914 DeviceClass *dc = DEVICE_CLASS(oc);
3915 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
3916
3917 dc->desc = "PowerPC 440x5";
3918 pcc->init_proc = init_proc_440x5;
3919 pcc->check_pow = check_pow_nocheck;
3920 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
3921 PPC_DCR | PPC_WRTEE | PPC_RFMCI |
3922 PPC_CACHE | PPC_CACHE_ICBI |
3923 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
3924 PPC_MEM_TLBSYNC | PPC_MFTB |
3925 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
3926 PPC_440_SPEC;
3927 pcc->insns_flags2 = PPC_NONE;
3928 pcc->msr_mask = 0x000000000006FF30ULL;
3929 pcc->mmu_model = POWERPC_MMU_BOOKE;
3930 pcc->excp_model = POWERPC_EXCP_BOOKE;
3931 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
3932 pcc->bfd_mach = bfd_mach_ppc_403;
3933 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
3934 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
3935 }
3936
3937 static void init_proc_460 (CPUPPCState *env)
3938 {
3939 /* Time base */
3940 gen_tbl(env);
3941 gen_spr_BookE(env, 0x000000000000FFFFULL);
3942 gen_spr_440(env);
3943 gen_spr_usprgh(env);
3944 /* Processor identification */
3945 spr_register(env, SPR_BOOKE_PIR, "PIR",
3946 SPR_NOACCESS, SPR_NOACCESS,
3947 &spr_read_generic, &spr_write_pir,
3948 0x00000000);
3949 /* XXX : not implemented */
3950 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
3951 SPR_NOACCESS, SPR_NOACCESS,
3952 &spr_read_generic, &spr_write_generic,
3953 0x00000000);
3954 /* XXX : not implemented */
3955 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
3956 SPR_NOACCESS, SPR_NOACCESS,
3957 &spr_read_generic, &spr_write_generic,
3958 0x00000000);
3959 /* XXX : not implemented */
3960 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
3961 SPR_NOACCESS, SPR_NOACCESS,
3962 &spr_read_generic, &spr_write_generic,
3963 0x00000000);
3964 /* XXX : not implemented */
3965 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
3966 SPR_NOACCESS, SPR_NOACCESS,
3967 &spr_read_generic, &spr_write_generic,
3968 0x00000000);
3969 /* XXX : not implemented */
3970 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
3971 SPR_NOACCESS, SPR_NOACCESS,
3972 &spr_read_generic, &spr_write_generic,
3973 0x00000000);
3974 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
3975 SPR_NOACCESS, SPR_NOACCESS,
3976 &spr_read_generic, &spr_write_generic,
3977 0x00000000);
3978 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
3979 SPR_NOACCESS, SPR_NOACCESS,
3980 &spr_read_generic, &spr_write_generic,
3981 0x00000000);
3982 /* XXX : not implemented */
3983 spr_register(env, SPR_440_CCR1, "CCR1",
3984 SPR_NOACCESS, SPR_NOACCESS,
3985 &spr_read_generic, &spr_write_generic,
3986 0x00000000);
3987 /* XXX : not implemented */
3988 spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
3989 &spr_read_generic, &spr_write_generic,
3990 &spr_read_generic, &spr_write_generic,
3991 0x00000000);
3992 /* Memory management */
3993 #if !defined(CONFIG_USER_ONLY)
3994 env->nb_tlb = 64;
3995 env->nb_ways = 1;
3996 env->id_tlbs = 0;
3997 env->tlb_type = TLB_EMB;
3998 #endif
3999 init_excp_BookE(env);
4000 env->dcache_line_size = 32;
4001 env->icache_line_size = 32;
4002 /* XXX: TODO: allocate internal IRQ controller */
4003
4004 SET_FIT_PERIOD(12, 16, 20, 24);
4005 SET_WDT_PERIOD(20, 24, 28, 32);
4006 }
4007
4008 POWERPC_FAMILY(460)(ObjectClass *oc, void *data)
4009 {
4010 DeviceClass *dc = DEVICE_CLASS(oc);
4011 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4012
4013 dc->desc = "PowerPC 460 (guessed)";
4014 pcc->init_proc = init_proc_460;
4015 pcc->check_pow = check_pow_nocheck;
4016 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4017 PPC_DCR | PPC_DCRX | PPC_DCRUX |
4018 PPC_WRTEE | PPC_MFAPIDI | PPC_MFTB |
4019 PPC_CACHE | PPC_CACHE_ICBI |
4020 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4021 PPC_MEM_TLBSYNC | PPC_TLBIVA |
4022 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4023 PPC_440_SPEC;
4024 pcc->insns_flags2 = PPC_NONE;
4025 pcc->msr_mask = 0x000000000006FF30ULL;
4026 pcc->mmu_model = POWERPC_MMU_BOOKE;
4027 pcc->excp_model = POWERPC_EXCP_BOOKE;
4028 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4029 pcc->bfd_mach = bfd_mach_ppc_403;
4030 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4031 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4032 }
4033
4034 static void init_proc_460F (CPUPPCState *env)
4035 {
4036 /* Time base */
4037 gen_tbl(env);
4038 gen_spr_BookE(env, 0x000000000000FFFFULL);
4039 gen_spr_440(env);
4040 gen_spr_usprgh(env);
4041 /* Processor identification */
4042 spr_register(env, SPR_BOOKE_PIR, "PIR",
4043 SPR_NOACCESS, SPR_NOACCESS,
4044 &spr_read_generic, &spr_write_pir,
4045 0x00000000);
4046 /* XXX : not implemented */
4047 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4048 SPR_NOACCESS, SPR_NOACCESS,
4049 &spr_read_generic, &spr_write_generic,
4050 0x00000000);
4051 /* XXX : not implemented */
4052 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4053 SPR_NOACCESS, SPR_NOACCESS,
4054 &spr_read_generic, &spr_write_generic,
4055 0x00000000);
4056 /* XXX : not implemented */
4057 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
4058 SPR_NOACCESS, SPR_NOACCESS,
4059 &spr_read_generic, &spr_write_generic,
4060 0x00000000);
4061 /* XXX : not implemented */
4062 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
4063 SPR_NOACCESS, SPR_NOACCESS,
4064 &spr_read_generic, &spr_write_generic,
4065 0x00000000);
4066 /* XXX : not implemented */
4067 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4068 SPR_NOACCESS, SPR_NOACCESS,
4069 &spr_read_generic, &spr_write_generic,
4070 0x00000000);
4071 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4072 SPR_NOACCESS, SPR_NOACCESS,
4073 &spr_read_generic, &spr_write_generic,
4074 0x00000000);
4075 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4076 SPR_NOACCESS, SPR_NOACCESS,
4077 &spr_read_generic, &spr_write_generic,
4078 0x00000000);
4079 /* XXX : not implemented */
4080 spr_register(env, SPR_440_CCR1, "CCR1",
4081 SPR_NOACCESS, SPR_NOACCESS,
4082 &spr_read_generic, &spr_write_generic,
4083 0x00000000);
4084 /* XXX : not implemented */
4085 spr_register(env, SPR_DCRIPR, "SPR_DCRIPR",
4086 &spr_read_generic, &spr_write_generic,
4087 &spr_read_generic, &spr_write_generic,
4088 0x00000000);
4089 /* Memory management */
4090 #if !defined(CONFIG_USER_ONLY)
4091 env->nb_tlb = 64;
4092 env->nb_ways = 1;
4093 env->id_tlbs = 0;
4094 env->tlb_type = TLB_EMB;
4095 #endif
4096 init_excp_BookE(env);
4097 env->dcache_line_size = 32;
4098 env->icache_line_size = 32;
4099 /* XXX: TODO: allocate internal IRQ controller */
4100
4101 SET_FIT_PERIOD(12, 16, 20, 24);
4102 SET_WDT_PERIOD(20, 24, 28, 32);
4103 }
4104
4105 POWERPC_FAMILY(460F)(ObjectClass *oc, void *data)
4106 {
4107 DeviceClass *dc = DEVICE_CLASS(oc);
4108 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4109
4110 dc->desc = "PowerPC 460F (guessed)";
4111 pcc->init_proc = init_proc_460F;
4112 pcc->check_pow = check_pow_nocheck;
4113 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4114 PPC_FLOAT | PPC_FLOAT_FRES | PPC_FLOAT_FSEL |
4115 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
4116 PPC_FLOAT_STFIWX | PPC_MFTB |
4117 PPC_DCR | PPC_DCRX | PPC_DCRUX |
4118 PPC_WRTEE | PPC_MFAPIDI |
4119 PPC_CACHE | PPC_CACHE_ICBI |
4120 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4121 PPC_MEM_TLBSYNC | PPC_TLBIVA |
4122 PPC_BOOKE | PPC_4xx_COMMON | PPC_405_MAC |
4123 PPC_440_SPEC;
4124 pcc->insns_flags2 = PPC_NONE;
4125 pcc->msr_mask = 0x000000000006FF30ULL;
4126 pcc->mmu_model = POWERPC_MMU_BOOKE;
4127 pcc->excp_model = POWERPC_EXCP_BOOKE;
4128 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4129 pcc->bfd_mach = bfd_mach_ppc_403;
4130 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DWE |
4131 POWERPC_FLAG_DE | POWERPC_FLAG_BUS_CLK;
4132 }
4133
4134 static void init_proc_MPC5xx (CPUPPCState *env)
4135 {
4136 /* Time base */
4137 gen_tbl(env);
4138 gen_spr_5xx_8xx(env);
4139 gen_spr_5xx(env);
4140 init_excp_MPC5xx(env);
4141 env->dcache_line_size = 32;
4142 env->icache_line_size = 32;
4143 /* XXX: TODO: allocate internal IRQ controller */
4144 }
4145
4146 POWERPC_FAMILY(MPC5xx)(ObjectClass *oc, void *data)
4147 {
4148 DeviceClass *dc = DEVICE_CLASS(oc);
4149 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4150
4151 dc->desc = "Freescale 5xx cores (aka RCPU)";
4152 pcc->init_proc = init_proc_MPC5xx;
4153 pcc->check_pow = check_pow_none;
4154 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4155 PPC_MEM_EIEIO | PPC_MEM_SYNC |
4156 PPC_CACHE_ICBI | PPC_FLOAT | PPC_FLOAT_STFIWX |
4157 PPC_MFTB;
4158 pcc->insns_flags2 = PPC_NONE;
4159 pcc->msr_mask = 0x000000000001FF43ULL;
4160 pcc->mmu_model = POWERPC_MMU_REAL;
4161 pcc->excp_model = POWERPC_EXCP_603;
4162 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4163 pcc->bfd_mach = bfd_mach_ppc_505;
4164 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4165 POWERPC_FLAG_BUS_CLK;
4166 }
4167
4168 static void init_proc_MPC8xx (CPUPPCState *env)
4169 {
4170 /* Time base */
4171 gen_tbl(env);
4172 gen_spr_5xx_8xx(env);
4173 gen_spr_8xx(env);
4174 init_excp_MPC8xx(env);
4175 env->dcache_line_size = 32;
4176 env->icache_line_size = 32;
4177 /* XXX: TODO: allocate internal IRQ controller */
4178 }
4179
4180 POWERPC_FAMILY(MPC8xx)(ObjectClass *oc, void *data)
4181 {
4182 DeviceClass *dc = DEVICE_CLASS(oc);
4183 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4184
4185 dc->desc = "Freescale 8xx cores (aka PowerQUICC)";
4186 pcc->init_proc = init_proc_MPC8xx;
4187 pcc->check_pow = check_pow_none;
4188 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING |
4189 PPC_MEM_EIEIO | PPC_MEM_SYNC |
4190 PPC_CACHE_ICBI | PPC_MFTB;
4191 pcc->insns_flags2 = PPC_NONE;
4192 pcc->msr_mask = 0x000000000001F673ULL;
4193 pcc->mmu_model = POWERPC_MMU_MPC8xx;
4194 pcc->excp_model = POWERPC_EXCP_603;
4195 pcc->bus_model = PPC_FLAGS_INPUT_RCPU;
4196 pcc->bfd_mach = bfd_mach_ppc_860;
4197 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
4198 POWERPC_FLAG_BUS_CLK;
4199 }
4200
4201 /* Freescale 82xx cores (aka PowerQUICC-II) */
4202
4203 static void init_proc_G2 (CPUPPCState *env)
4204 {
4205 gen_spr_ne_601(env);
4206 gen_spr_G2_755(env);
4207 gen_spr_G2(env);
4208 /* Time base */
4209 gen_tbl(env);
4210 /* External access control */
4211 /* XXX : not implemented */
4212 spr_register(env, SPR_EAR, "EAR",
4213 SPR_NOACCESS, SPR_NOACCESS,
4214 &spr_read_generic, &spr_write_generic,
4215 0x00000000);
4216 /* Hardware implementation register */
4217 /* XXX : not implemented */
4218 spr_register(env, SPR_HID0, "HID0",
4219 SPR_NOACCESS, SPR_NOACCESS,
4220 &spr_read_generic, &spr_write_generic,
4221 0x00000000);
4222 /* XXX : not implemented */
4223 spr_register(env, SPR_HID1, "HID1",
4224 SPR_NOACCESS, SPR_NOACCESS,
4225 &spr_read_generic, &spr_write_generic,
4226 0x00000000);
4227 /* XXX : not implemented */
4228 spr_register(env, SPR_HID2, "HID2",
4229 SPR_NOACCESS, SPR_NOACCESS,
4230 &spr_read_generic, &spr_write_generic,
4231 0x00000000);
4232 /* Memory management */
4233 gen_low_BATs(env);
4234 gen_high_BATs(env);
4235 gen_6xx_7xx_soft_tlb(env, 64, 2);
4236 init_excp_G2(env);
4237 env->dcache_line_size = 32;
4238 env->icache_line_size = 32;
4239 /* Allocate hardware IRQ controller */
4240 ppc6xx_irq_init(env);
4241 }
4242
4243 POWERPC_FAMILY(G2)(ObjectClass *oc, void *data)
4244 {
4245 DeviceClass *dc = DEVICE_CLASS(oc);
4246 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4247
4248 dc->desc = "PowerPC G2";
4249 pcc->init_proc = init_proc_G2;
4250 pcc->check_pow = check_pow_hid0;
4251 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4252 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4253 PPC_FLOAT_STFIWX |
4254 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4255 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4256 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4257 PPC_SEGMENT | PPC_EXTERN;
4258 pcc->insns_flags2 = PPC_NONE;
4259 pcc->msr_mask = 0x000000000006FFF2ULL;
4260 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4261 pcc->excp_model = POWERPC_EXCP_G2;
4262 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4263 pcc->bfd_mach = bfd_mach_ppc_ec603e;
4264 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4265 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4266 }
4267
4268 static void init_proc_G2LE (CPUPPCState *env)
4269 {
4270 gen_spr_ne_601(env);
4271 gen_spr_G2_755(env);
4272 gen_spr_G2(env);
4273 /* Time base */
4274 gen_tbl(env);
4275 /* External access control */
4276 /* XXX : not implemented */
4277 spr_register(env, SPR_EAR, "EAR",
4278 SPR_NOACCESS, SPR_NOACCESS,
4279 &spr_read_generic, &spr_write_generic,
4280 0x00000000);
4281 /* Hardware implementation register */
4282 /* XXX : not implemented */
4283 spr_register(env, SPR_HID0, "HID0",
4284 SPR_NOACCESS, SPR_NOACCESS,
4285 &spr_read_generic, &spr_write_generic,
4286 0x00000000);
4287 /* XXX : not implemented */
4288 spr_register(env, SPR_HID1, "HID1",
4289 SPR_NOACCESS, SPR_NOACCESS,
4290 &spr_read_generic, &spr_write_generic,
4291 0x00000000);
4292 /* XXX : not implemented */
4293 spr_register(env, SPR_HID2, "HID2",
4294 SPR_NOACCESS, SPR_NOACCESS,
4295 &spr_read_generic, &spr_write_generic,
4296 0x00000000);
4297 /* Memory management */
4298 gen_low_BATs(env);
4299 gen_high_BATs(env);
4300 gen_6xx_7xx_soft_tlb(env, 64, 2);
4301 init_excp_G2(env);
4302 env->dcache_line_size = 32;
4303 env->icache_line_size = 32;
4304 /* Allocate hardware IRQ controller */
4305 ppc6xx_irq_init(env);
4306 }
4307
4308 POWERPC_FAMILY(G2LE)(ObjectClass *oc, void *data)
4309 {
4310 DeviceClass *dc = DEVICE_CLASS(oc);
4311 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4312
4313 dc->desc = "PowerPC G2LE";
4314 pcc->init_proc = init_proc_G2LE;
4315 pcc->check_pow = check_pow_hid0;
4316 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4317 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4318 PPC_FLOAT_STFIWX |
4319 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4320 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4321 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4322 PPC_SEGMENT | PPC_EXTERN;
4323 pcc->insns_flags2 = PPC_NONE;
4324 pcc->msr_mask = 0x000000000007FFF3ULL;
4325 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4326 pcc->excp_model = POWERPC_EXCP_G2;
4327 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4328 pcc->bfd_mach = bfd_mach_ppc_ec603e;
4329 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4330 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4331 }
4332
4333 static void init_proc_e200 (CPUPPCState *env)
4334 {
4335 /* Time base */
4336 gen_tbl(env);
4337 gen_spr_BookE(env, 0x000000070000FFFFULL);
4338 /* XXX : not implemented */
4339 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4340 &spr_read_spefscr, &spr_write_spefscr,
4341 &spr_read_spefscr, &spr_write_spefscr,
4342 0x00000000);
4343 /* Memory management */
4344 gen_spr_BookE206(env, 0x0000005D, NULL);
4345 /* XXX : not implemented */
4346 spr_register(env, SPR_HID0, "HID0",
4347 SPR_NOACCESS, SPR_NOACCESS,
4348 &spr_read_generic, &spr_write_generic,
4349 0x00000000);
4350 /* XXX : not implemented */
4351 spr_register(env, SPR_HID1, "HID1",
4352 SPR_NOACCESS, SPR_NOACCESS,
4353 &spr_read_generic, &spr_write_generic,
4354 0x00000000);
4355 /* XXX : not implemented */
4356 spr_register(env, SPR_Exxx_ALTCTXCR, "ALTCTXCR",
4357 SPR_NOACCESS, SPR_NOACCESS,
4358 &spr_read_generic, &spr_write_generic,
4359 0x00000000);
4360 /* XXX : not implemented */
4361 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4362 SPR_NOACCESS, SPR_NOACCESS,
4363 &spr_read_generic, &spr_write_generic,
4364 0x00000000);
4365 /* XXX : not implemented */
4366 spr_register(env, SPR_Exxx_CTXCR, "CTXCR",
4367 SPR_NOACCESS, SPR_NOACCESS,
4368 &spr_read_generic, &spr_write_generic,
4369 0x00000000);
4370 /* XXX : not implemented */
4371 spr_register(env, SPR_Exxx_DBCNT, "DBCNT",
4372 SPR_NOACCESS, SPR_NOACCESS,
4373 &spr_read_generic, &spr_write_generic,
4374 0x00000000);
4375 /* XXX : not implemented */
4376 spr_register(env, SPR_Exxx_DBCR3, "DBCR3",
4377 SPR_NOACCESS, SPR_NOACCESS,
4378 &spr_read_generic, &spr_write_generic,
4379 0x00000000);
4380 /* XXX : not implemented */
4381 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4382 SPR_NOACCESS, SPR_NOACCESS,
4383 &spr_read_generic, &spr_write_generic,
4384 0x00000000);
4385 /* XXX : not implemented */
4386 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4387 SPR_NOACCESS, SPR_NOACCESS,
4388 &spr_read_generic, &spr_write_generic,
4389 0x00000000);
4390 /* XXX : not implemented */
4391 spr_register(env, SPR_Exxx_L1FINV0, "L1FINV0",
4392 SPR_NOACCESS, SPR_NOACCESS,
4393 &spr_read_generic, &spr_write_generic,
4394 0x00000000);
4395 /* XXX : not implemented */
4396 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
4397 SPR_NOACCESS, SPR_NOACCESS,
4398 &spr_read_generic, &spr_write_generic,
4399 0x00000000);
4400 /* XXX : not implemented */
4401 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
4402 SPR_NOACCESS, SPR_NOACCESS,
4403 &spr_read_generic, &spr_write_generic,
4404 0x00000000);
4405 /* XXX : not implemented */
4406 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
4407 SPR_NOACCESS, SPR_NOACCESS,
4408 &spr_read_generic, &spr_write_generic,
4409 0x00000000);
4410 /* XXX : not implemented */
4411 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
4412 SPR_NOACCESS, SPR_NOACCESS,
4413 &spr_read_generic, &spr_write_generic,
4414 0x00000000);
4415 /* XXX : not implemented */
4416 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4417 SPR_NOACCESS, SPR_NOACCESS,
4418 &spr_read_generic, &spr_write_generic,
4419 0x00000000); /* TOFIX */
4420 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
4421 SPR_NOACCESS, SPR_NOACCESS,
4422 &spr_read_generic, &spr_write_generic,
4423 0x00000000);
4424 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
4425 SPR_NOACCESS, SPR_NOACCESS,
4426 &spr_read_generic, &spr_write_generic,
4427 0x00000000);
4428 #if !defined(CONFIG_USER_ONLY)
4429 env->nb_tlb = 64;
4430 env->nb_ways = 1;
4431 env->id_tlbs = 0;
4432 env->tlb_type = TLB_EMB;
4433 #endif
4434 init_excp_e200(env, 0xFFFF0000UL);
4435 env->dcache_line_size = 32;
4436 env->icache_line_size = 32;
4437 /* XXX: TODO: allocate internal IRQ controller */
4438 }
4439
4440 POWERPC_FAMILY(e200)(ObjectClass *oc, void *data)
4441 {
4442 DeviceClass *dc = DEVICE_CLASS(oc);
4443 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4444
4445 dc->desc = "e200 core";
4446 pcc->init_proc = init_proc_e200;
4447 pcc->check_pow = check_pow_hid0;
4448 /* XXX: unimplemented instructions:
4449 * dcblc
4450 * dcbtlst
4451 * dcbtstls
4452 * icblc
4453 * icbtls
4454 * tlbivax
4455 * all SPE multiply-accumulate instructions
4456 */
4457 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4458 PPC_SPE | PPC_SPE_SINGLE |
4459 PPC_WRTEE | PPC_RFDI |
4460 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4461 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4462 PPC_MEM_TLBSYNC | PPC_TLBIVAX |
4463 PPC_BOOKE;
4464 pcc->insns_flags2 = PPC_NONE;
4465 pcc->msr_mask = 0x000000000606FF30ULL;
4466 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4467 pcc->excp_model = POWERPC_EXCP_BOOKE;
4468 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4469 pcc->bfd_mach = bfd_mach_ppc_860;
4470 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4471 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4472 POWERPC_FLAG_BUS_CLK;
4473 }
4474
4475 static void init_proc_e300 (CPUPPCState *env)
4476 {
4477 gen_spr_ne_601(env);
4478 gen_spr_603(env);
4479 /* Time base */
4480 gen_tbl(env);
4481 /* hardware implementation registers */
4482 /* XXX : not implemented */
4483 spr_register(env, SPR_HID0, "HID0",
4484 SPR_NOACCESS, SPR_NOACCESS,
4485 &spr_read_generic, &spr_write_generic,
4486 0x00000000);
4487 /* XXX : not implemented */
4488 spr_register(env, SPR_HID1, "HID1",
4489 SPR_NOACCESS, SPR_NOACCESS,
4490 &spr_read_generic, &spr_write_generic,
4491 0x00000000);
4492 /* XXX : not implemented */
4493 spr_register(env, SPR_HID2, "HID2",
4494 SPR_NOACCESS, SPR_NOACCESS,
4495 &spr_read_generic, &spr_write_generic,
4496 0x00000000);
4497 /* Memory management */
4498 gen_low_BATs(env);
4499 gen_high_BATs(env);
4500 gen_6xx_7xx_soft_tlb(env, 64, 2);
4501 init_excp_603(env);
4502 env->dcache_line_size = 32;
4503 env->icache_line_size = 32;
4504 /* Allocate hardware IRQ controller */
4505 ppc6xx_irq_init(env);
4506 }
4507
4508 POWERPC_FAMILY(e300)(ObjectClass *oc, void *data)
4509 {
4510 DeviceClass *dc = DEVICE_CLASS(oc);
4511 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4512
4513 dc->desc = "e300 core";
4514 pcc->init_proc = init_proc_e300;
4515 pcc->check_pow = check_pow_hid0;
4516 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
4517 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
4518 PPC_FLOAT_STFIWX |
4519 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4520 PPC_MEM_SYNC | PPC_MEM_EIEIO |
4521 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
4522 PPC_SEGMENT | PPC_EXTERN;
4523 pcc->insns_flags2 = PPC_NONE;
4524 pcc->msr_mask = 0x000000000007FFF3ULL;
4525 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
4526 pcc->excp_model = POWERPC_EXCP_603;
4527 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4528 pcc->bfd_mach = bfd_mach_ppc_603;
4529 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
4530 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
4531 }
4532
4533 #if !defined(CONFIG_USER_ONLY)
4534 static void spr_write_mas73(void *opaque, int sprn, int gprn)
4535 {
4536 TCGv val = tcg_temp_new();
4537 tcg_gen_ext32u_tl(val, cpu_gpr[gprn]);
4538 gen_store_spr(SPR_BOOKE_MAS3, val);
4539 tcg_gen_shri_tl(val, cpu_gpr[gprn], 32);
4540 gen_store_spr(SPR_BOOKE_MAS7, val);
4541 tcg_temp_free(val);
4542 }
4543
4544 static void spr_read_mas73(void *opaque, int gprn, int sprn)
4545 {
4546 TCGv mas7 = tcg_temp_new();
4547 TCGv mas3 = tcg_temp_new();
4548 gen_load_spr(mas7, SPR_BOOKE_MAS7);
4549 tcg_gen_shli_tl(mas7, mas7, 32);
4550 gen_load_spr(mas3, SPR_BOOKE_MAS3);
4551 tcg_gen_or_tl(cpu_gpr[gprn], mas3, mas7);
4552 tcg_temp_free(mas3);
4553 tcg_temp_free(mas7);
4554 }
4555
4556 #endif
4557
4558 enum fsl_e500_version {
4559 fsl_e500v1,
4560 fsl_e500v2,
4561 fsl_e500mc,
4562 fsl_e5500,
4563 };
4564
4565 static void init_proc_e500 (CPUPPCState *env, int version)
4566 {
4567 uint32_t tlbncfg[2];
4568 uint64_t ivor_mask;
4569 uint64_t ivpr_mask = 0xFFFF0000ULL;
4570 uint32_t l1cfg0 = 0x3800 /* 8 ways */
4571 | 0x0020; /* 32 kb */
4572 #if !defined(CONFIG_USER_ONLY)
4573 int i;
4574 #endif
4575
4576 /* Time base */
4577 gen_tbl(env);
4578 /*
4579 * XXX The e500 doesn't implement IVOR7 and IVOR9, but doesn't
4580 * complain when accessing them.
4581 * gen_spr_BookE(env, 0x0000000F0000FD7FULL);
4582 */
4583 switch (version) {
4584 case fsl_e500v1:
4585 case fsl_e500v2:
4586 default:
4587 ivor_mask = 0x0000000F0000FFFFULL;
4588 break;
4589 case fsl_e500mc:
4590 case fsl_e5500:
4591 ivor_mask = 0x000003FE0000FFFFULL;
4592 break;
4593 }
4594 gen_spr_BookE(env, ivor_mask);
4595 /* Processor identification */
4596 spr_register(env, SPR_BOOKE_PIR, "PIR",
4597 SPR_NOACCESS, SPR_NOACCESS,
4598 &spr_read_generic, &spr_write_pir,
4599 0x00000000);
4600 /* XXX : not implemented */
4601 spr_register(env, SPR_BOOKE_SPEFSCR, "SPEFSCR",
4602 &spr_read_spefscr, &spr_write_spefscr,
4603 &spr_read_spefscr, &spr_write_spefscr,
4604 0x00000000);
4605 #if !defined(CONFIG_USER_ONLY)
4606 /* Memory management */
4607 env->nb_pids = 3;
4608 env->nb_ways = 2;
4609 env->id_tlbs = 0;
4610 switch (version) {
4611 case fsl_e500v1:
4612 tlbncfg[0] = gen_tlbncfg(2, 1, 1, 0, 256);
4613 tlbncfg[1] = gen_tlbncfg(16, 1, 9, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4614 break;
4615 case fsl_e500v2:
4616 tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4617 tlbncfg[1] = gen_tlbncfg(16, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 16);
4618 break;
4619 case fsl_e500mc:
4620 case fsl_e5500:
4621 tlbncfg[0] = gen_tlbncfg(4, 1, 1, 0, 512);
4622 tlbncfg[1] = gen_tlbncfg(64, 1, 12, TLBnCFG_AVAIL | TLBnCFG_IPROT, 64);
4623 break;
4624 default:
4625 cpu_abort(env, "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4626 }
4627 #endif
4628 /* Cache sizes */
4629 switch (version) {
4630 case fsl_e500v1:
4631 case fsl_e500v2:
4632 env->dcache_line_size = 32;
4633 env->icache_line_size = 32;
4634 break;
4635 case fsl_e500mc:
4636 case fsl_e5500:
4637 env->dcache_line_size = 64;
4638 env->icache_line_size = 64;
4639 l1cfg0 |= 0x1000000; /* 64 byte cache block size */
4640 break;
4641 default:
4642 cpu_abort(env, "Unknown CPU: " TARGET_FMT_lx "\n", env->spr[SPR_PVR]);
4643 }
4644 gen_spr_BookE206(env, 0x000000DF, tlbncfg);
4645 /* XXX : not implemented */
4646 spr_register(env, SPR_HID0, "HID0",
4647 SPR_NOACCESS, SPR_NOACCESS,
4648 &spr_read_generic, &spr_write_generic,
4649 0x00000000);
4650 /* XXX : not implemented */
4651 spr_register(env, SPR_HID1, "HID1",
4652 SPR_NOACCESS, SPR_NOACCESS,
4653 &spr_read_generic, &spr_write_generic,
4654 0x00000000);
4655 /* XXX : not implemented */
4656 spr_register(env, SPR_Exxx_BBEAR, "BBEAR",
4657 SPR_NOACCESS, SPR_NOACCESS,
4658 &spr_read_generic, &spr_write_generic,
4659 0x00000000);
4660 /* XXX : not implemented */
4661 spr_register(env, SPR_Exxx_BBTAR, "BBTAR",
4662 SPR_NOACCESS, SPR_NOACCESS,
4663 &spr_read_generic, &spr_write_generic,
4664 0x00000000);
4665 /* XXX : not implemented */
4666 spr_register(env, SPR_Exxx_MCAR, "MCAR",
4667 SPR_NOACCESS, SPR_NOACCESS,
4668 &spr_read_generic, &spr_write_generic,
4669 0x00000000);
4670 /* XXX : not implemented */
4671 spr_register(env, SPR_BOOKE_MCSR, "MCSR",
4672 SPR_NOACCESS, SPR_NOACCESS,
4673 &spr_read_generic, &spr_write_generic,
4674 0x00000000);
4675 /* XXX : not implemented */
4676 spr_register(env, SPR_Exxx_NPIDR, "NPIDR",
4677 SPR_NOACCESS, SPR_NOACCESS,
4678 &spr_read_generic, &spr_write_generic,
4679 0x00000000);
4680 /* XXX : not implemented */
4681 spr_register(env, SPR_Exxx_BUCSR, "BUCSR",
4682 SPR_NOACCESS, SPR_NOACCESS,
4683 &spr_read_generic, &spr_write_generic,
4684 0x00000000);
4685 /* XXX : not implemented */
4686 spr_register(env, SPR_Exxx_L1CFG0, "L1CFG0",
4687 SPR_NOACCESS, SPR_NOACCESS,
4688 &spr_read_generic, &spr_write_generic,
4689 l1cfg0);
4690 /* XXX : not implemented */
4691 spr_register(env, SPR_Exxx_L1CSR0, "L1CSR0",
4692 SPR_NOACCESS, SPR_NOACCESS,
4693 &spr_read_generic, &spr_write_e500_l1csr0,
4694 0x00000000);
4695 /* XXX : not implemented */
4696 spr_register(env, SPR_Exxx_L1CSR1, "L1CSR1",
4697 SPR_NOACCESS, SPR_NOACCESS,
4698 &spr_read_generic, &spr_write_generic,
4699 0x00000000);
4700 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
4701 SPR_NOACCESS, SPR_NOACCESS,
4702 &spr_read_generic, &spr_write_generic,
4703 0x00000000);
4704 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
4705 SPR_NOACCESS, SPR_NOACCESS,
4706 &spr_read_generic, &spr_write_generic,
4707 0x00000000);
4708 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
4709 SPR_NOACCESS, SPR_NOACCESS,
4710 &spr_read_generic, &spr_write_booke206_mmucsr0,
4711 0x00000000);
4712 spr_register(env, SPR_BOOKE_EPR, "EPR",
4713 SPR_NOACCESS, SPR_NOACCESS,
4714 &spr_read_generic, SPR_NOACCESS,
4715 0x00000000);
4716 /* XXX better abstract into Emb.xxx features */
4717 if (version == fsl_e5500) {
4718 spr_register(env, SPR_BOOKE_EPCR, "EPCR",
4719 SPR_NOACCESS, SPR_NOACCESS,
4720 &spr_read_generic, &spr_write_generic,
4721 0x00000000);
4722 spr_register(env, SPR_BOOKE_MAS7_MAS3, "MAS7_MAS3",
4723 SPR_NOACCESS, SPR_NOACCESS,
4724 &spr_read_mas73, &spr_write_mas73,
4725 0x00000000);
4726 ivpr_mask = (target_ulong)~0xFFFFULL;
4727 }
4728
4729 #if !defined(CONFIG_USER_ONLY)
4730 env->nb_tlb = 0;
4731 env->tlb_type = TLB_MAS;
4732 for (i = 0; i < BOOKE206_MAX_TLBN; i++) {
4733 env->nb_tlb += booke206_tlb_size(env, i);
4734 }
4735 #endif
4736
4737 init_excp_e200(env, ivpr_mask);
4738 /* Allocate hardware IRQ controller */
4739 ppce500_irq_init(env);
4740 }
4741
4742 static void init_proc_e500v1(CPUPPCState *env)
4743 {
4744 init_proc_e500(env, fsl_e500v1);
4745 }
4746
4747 POWERPC_FAMILY(e500v1)(ObjectClass *oc, void *data)
4748 {
4749 DeviceClass *dc = DEVICE_CLASS(oc);
4750 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4751
4752 dc->desc = "e500v1 core";
4753 pcc->init_proc = init_proc_e500v1;
4754 pcc->check_pow = check_pow_hid0;
4755 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4756 PPC_SPE | PPC_SPE_SINGLE |
4757 PPC_WRTEE | PPC_RFDI |
4758 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4759 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4760 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4761 pcc->insns_flags2 = PPC2_BOOKE206;
4762 pcc->msr_mask = 0x000000000606FF30ULL;
4763 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4764 pcc->excp_model = POWERPC_EXCP_BOOKE;
4765 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4766 pcc->bfd_mach = bfd_mach_ppc_860;
4767 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4768 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4769 POWERPC_FLAG_BUS_CLK;
4770 }
4771
4772 static void init_proc_e500v2(CPUPPCState *env)
4773 {
4774 init_proc_e500(env, fsl_e500v2);
4775 }
4776
4777 POWERPC_FAMILY(e500v2)(ObjectClass *oc, void *data)
4778 {
4779 DeviceClass *dc = DEVICE_CLASS(oc);
4780 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4781
4782 dc->desc = "e500v2 core";
4783 pcc->init_proc = init_proc_e500v2;
4784 pcc->check_pow = check_pow_hid0;
4785 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4786 PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |
4787 PPC_WRTEE | PPC_RFDI |
4788 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4789 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4790 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4791 pcc->insns_flags2 = PPC2_BOOKE206;
4792 pcc->msr_mask = 0x000000000606FF30ULL;
4793 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4794 pcc->excp_model = POWERPC_EXCP_BOOKE;
4795 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4796 pcc->bfd_mach = bfd_mach_ppc_860;
4797 pcc->flags = POWERPC_FLAG_SPE | POWERPC_FLAG_CE |
4798 POWERPC_FLAG_UBLE | POWERPC_FLAG_DE |
4799 POWERPC_FLAG_BUS_CLK;
4800 }
4801
4802 static void init_proc_e500mc(CPUPPCState *env)
4803 {
4804 init_proc_e500(env, fsl_e500mc);
4805 }
4806
4807 POWERPC_FAMILY(e500mc)(ObjectClass *oc, void *data)
4808 {
4809 DeviceClass *dc = DEVICE_CLASS(oc);
4810 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4811
4812 dc->desc = "e500mc core";
4813 pcc->init_proc = init_proc_e500mc;
4814 pcc->check_pow = check_pow_none;
4815 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4816 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
4817 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4818 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4819 PPC_FLOAT | PPC_FLOAT_FRES |
4820 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
4821 PPC_FLOAT_STFIWX | PPC_WAIT |
4822 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC;
4823 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
4824 pcc->msr_mask = 0x000000001402FB36ULL;
4825 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4826 pcc->excp_model = POWERPC_EXCP_BOOKE;
4827 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4828 /* FIXME: figure out the correct flag for e500mc */
4829 pcc->bfd_mach = bfd_mach_ppc_e500;
4830 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
4831 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4832 }
4833
4834 #ifdef TARGET_PPC64
4835 static void init_proc_e5500(CPUPPCState *env)
4836 {
4837 init_proc_e500(env, fsl_e5500);
4838 }
4839
4840 POWERPC_FAMILY(e5500)(ObjectClass *oc, void *data)
4841 {
4842 DeviceClass *dc = DEVICE_CLASS(oc);
4843 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4844
4845 dc->desc = "e5500 core";
4846 pcc->init_proc = init_proc_e5500;
4847 pcc->check_pow = check_pow_none;
4848 pcc->insns_flags = PPC_INSNS_BASE | PPC_ISEL |
4849 PPC_WRTEE | PPC_RFDI | PPC_RFMCI |
4850 PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |
4851 PPC_CACHE_DCBZ | PPC_CACHE_DCBA |
4852 PPC_FLOAT | PPC_FLOAT_FRES |
4853 PPC_FLOAT_FRSQRTE | PPC_FLOAT_FSEL |
4854 PPC_FLOAT_STFIWX | PPC_WAIT |
4855 PPC_MEM_TLBSYNC | PPC_TLBIVAX | PPC_MEM_SYNC |
4856 PPC_64B | PPC_POPCNTB | PPC_POPCNTWD;
4857 pcc->insns_flags2 = PPC2_BOOKE206 | PPC2_PRCNTL;
4858 pcc->msr_mask = 0x000000009402FB36ULL;
4859 pcc->mmu_model = POWERPC_MMU_BOOKE206;
4860 pcc->excp_model = POWERPC_EXCP_BOOKE;
4861 pcc->bus_model = PPC_FLAGS_INPUT_BookE;
4862 /* FIXME: figure out the correct flag for e5500 */
4863 pcc->bfd_mach = bfd_mach_ppc_e500;
4864 pcc->flags = POWERPC_FLAG_CE | POWERPC_FLAG_DE |
4865 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
4866 }
4867 #endif
4868
4869 /* Non-embedded PowerPC */
4870
4871 /* POWER : same as 601, without mfmsr, mfsr */
4872 POWERPC_FAMILY(POWER)(ObjectClass *oc, void *data)
4873 {
4874 DeviceClass *dc = DEVICE_CLASS(oc);
4875 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4876
4877 dc->desc = "POWER";
4878 /* pcc->insns_flags = XXX_TODO; */
4879 /* POWER RSC (from RAD6000) */
4880 pcc->msr_mask = 0x00000000FEF0ULL;
4881 }
4882
4883 #define POWERPC_MSRR_601 (0x0000000000001040ULL)
4884
4885 static void init_proc_601 (CPUPPCState *env)
4886 {
4887 gen_spr_ne_601(env);
4888 gen_spr_601(env);
4889 /* Hardware implementation registers */
4890 /* XXX : not implemented */
4891 spr_register(env, SPR_HID0, "HID0",
4892 SPR_NOACCESS, SPR_NOACCESS,
4893 &spr_read_generic, &spr_write_hid0_601,
4894 0x80010080);
4895 /* XXX : not implemented */
4896 spr_register(env, SPR_HID1, "HID1",
4897 SPR_NOACCESS, SPR_NOACCESS,
4898 &spr_read_generic, &spr_write_generic,
4899 0x00000000);
4900 /* XXX : not implemented */
4901 spr_register(env, SPR_601_HID2, "HID2",
4902 SPR_NOACCESS, SPR_NOACCESS,
4903 &spr_read_generic, &spr_write_generic,
4904 0x00000000);
4905 /* XXX : not implemented */
4906 spr_register(env, SPR_601_HID5, "HID5",
4907 SPR_NOACCESS, SPR_NOACCESS,
4908 &spr_read_generic, &spr_write_generic,
4909 0x00000000);
4910 /* Memory management */
4911 init_excp_601(env);
4912 /* XXX: beware that dcache line size is 64
4913 * but dcbz uses 32 bytes "sectors"
4914 * XXX: this breaks clcs instruction !
4915 */
4916 env->dcache_line_size = 32;
4917 env->icache_line_size = 64;
4918 /* Allocate hardware IRQ controller */
4919 ppc6xx_irq_init(env);
4920 }
4921
4922 POWERPC_FAMILY(601)(ObjectClass *oc, void *data)
4923 {
4924 DeviceClass *dc = DEVICE_CLASS(oc);
4925 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4926
4927 dc->desc = "PowerPC 601";
4928 pcc->init_proc = init_proc_601;
4929 pcc->check_pow = check_pow_none;
4930 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
4931 PPC_FLOAT |
4932 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4933 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
4934 PPC_SEGMENT | PPC_EXTERN;
4935 pcc->insns_flags2 = PPC_NONE;
4936 pcc->msr_mask = 0x000000000000FD70ULL;
4937 pcc->mmu_model = POWERPC_MMU_601;
4938 pcc->excp_model = POWERPC_EXCP_601;
4939 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4940 pcc->bfd_mach = bfd_mach_ppc_601;
4941 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
4942 }
4943
4944 #define POWERPC_MSRR_601v (0x0000000000001040ULL)
4945
4946 static void init_proc_601v (CPUPPCState *env)
4947 {
4948 init_proc_601(env);
4949 /* XXX : not implemented */
4950 spr_register(env, SPR_601_HID15, "HID15",
4951 SPR_NOACCESS, SPR_NOACCESS,
4952 &spr_read_generic, &spr_write_generic,
4953 0x00000000);
4954 }
4955
4956 POWERPC_FAMILY(601v)(ObjectClass *oc, void *data)
4957 {
4958 DeviceClass *dc = DEVICE_CLASS(oc);
4959 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
4960
4961 dc->desc = "PowerPC 601v";
4962 pcc->init_proc = init_proc_601v;
4963 pcc->check_pow = check_pow_none;
4964 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_POWER_BR |
4965 PPC_FLOAT |
4966 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
4967 PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE |
4968 PPC_SEGMENT | PPC_EXTERN;
4969 pcc->insns_flags2 = PPC_NONE;
4970 pcc->msr_mask = 0x000000000000FD70ULL;
4971 pcc->mmu_model = POWERPC_MMU_601;
4972 pcc->excp_model = POWERPC_EXCP_601;
4973 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
4974 pcc->bfd_mach = bfd_mach_ppc_601;
4975 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_RTC_CLK;
4976 }
4977
4978 static void init_proc_602 (CPUPPCState *env)
4979 {
4980 gen_spr_ne_601(env);
4981 gen_spr_602(env);
4982 /* Time base */
4983 gen_tbl(env);
4984 /* hardware implementation registers */
4985 /* XXX : not implemented */
4986 spr_register(env, SPR_HID0, "HID0",
4987 SPR_NOACCESS, SPR_NOACCESS,
4988 &spr_read_generic, &spr_write_generic,
4989 0x00000000);
4990 /* XXX : not implemented */
4991 spr_register(env, SPR_HID1, "HID1",
4992 SPR_NOACCESS, SPR_NOACCESS,
4993 &spr_read_generic, &spr_write_generic,
4994 0x00000000);
4995 /* Memory management */
4996 gen_low_BATs(env);
4997 gen_6xx_7xx_soft_tlb(env, 64, 2);
4998 init_excp_602(env);
4999 env->dcache_line_size = 32;
5000 env->icache_line_size = 32;
5001 /* Allocate hardware IRQ controller */
5002 ppc6xx_irq_init(env);
5003 }
5004
5005 POWERPC_FAMILY(602)(ObjectClass *oc, void *data)
5006 {
5007 DeviceClass *dc = DEVICE_CLASS(oc);
5008 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5009
5010 dc->desc = "PowerPC 602";
5011 pcc->init_proc = init_proc_602;
5012 pcc->check_pow = check_pow_hid0;
5013 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5014 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5015 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5016 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5017 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5018 PPC_MEM_TLBIE | PPC_6xx_TLB | PPC_MEM_TLBSYNC |
5019 PPC_SEGMENT | PPC_602_SPEC;
5020 pcc->insns_flags2 = PPC_NONE;
5021 pcc->msr_mask = 0x0000000000C7FF73ULL;
5022 /* XXX: 602 MMU is quite specific. Should add a special case */
5023 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5024 pcc->excp_model = POWERPC_EXCP_602;
5025 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5026 pcc->bfd_mach = bfd_mach_ppc_602;
5027 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5028 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5029 }
5030
5031 static void init_proc_603 (CPUPPCState *env)
5032 {
5033 gen_spr_ne_601(env);
5034 gen_spr_603(env);
5035 /* Time base */
5036 gen_tbl(env);
5037 /* hardware implementation registers */
5038 /* XXX : not implemented */
5039 spr_register(env, SPR_HID0, "HID0",
5040 SPR_NOACCESS, SPR_NOACCESS,
5041 &spr_read_generic, &spr_write_generic,
5042 0x00000000);
5043 /* XXX : not implemented */
5044 spr_register(env, SPR_HID1, "HID1",
5045 SPR_NOACCESS, SPR_NOACCESS,
5046 &spr_read_generic, &spr_write_generic,
5047 0x00000000);
5048 /* Memory management */
5049 gen_low_BATs(env);
5050 gen_6xx_7xx_soft_tlb(env, 64, 2);
5051 init_excp_603(env);
5052 env->dcache_line_size = 32;
5053 env->icache_line_size = 32;
5054 /* Allocate hardware IRQ controller */
5055 ppc6xx_irq_init(env);
5056 }
5057
5058 POWERPC_FAMILY(603)(ObjectClass *oc, void *data)
5059 {
5060 DeviceClass *dc = DEVICE_CLASS(oc);
5061 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5062
5063 dc->desc = "PowerPC 603";
5064 pcc->init_proc = init_proc_603;
5065 pcc->check_pow = check_pow_hid0;
5066 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5067 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5068 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5069 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5070 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5071 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5072 PPC_SEGMENT | PPC_EXTERN;
5073 pcc->insns_flags2 = PPC_NONE;
5074 pcc->msr_mask = 0x000000000007FF73ULL;
5075 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5076 pcc->excp_model = POWERPC_EXCP_603;
5077 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5078 pcc->bfd_mach = bfd_mach_ppc_603;
5079 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5080 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5081 }
5082
5083 static void init_proc_603E (CPUPPCState *env)
5084 {
5085 gen_spr_ne_601(env);
5086 gen_spr_603(env);
5087 /* Time base */
5088 gen_tbl(env);
5089 /* hardware implementation registers */
5090 /* XXX : not implemented */
5091 spr_register(env, SPR_HID0, "HID0",
5092 SPR_NOACCESS, SPR_NOACCESS,
5093 &spr_read_generic, &spr_write_generic,
5094 0x00000000);
5095 /* XXX : not implemented */
5096 spr_register(env, SPR_HID1, "HID1",
5097 SPR_NOACCESS, SPR_NOACCESS,
5098 &spr_read_generic, &spr_write_generic,
5099 0x00000000);
5100 /* XXX : not implemented */
5101 spr_register(env, SPR_IABR, "IABR",
5102 SPR_NOACCESS, SPR_NOACCESS,
5103 &spr_read_generic, &spr_write_generic,
5104 0x00000000);
5105 /* Memory management */
5106 gen_low_BATs(env);
5107 gen_6xx_7xx_soft_tlb(env, 64, 2);
5108 init_excp_603(env);
5109 env->dcache_line_size = 32;
5110 env->icache_line_size = 32;
5111 /* Allocate hardware IRQ controller */
5112 ppc6xx_irq_init(env);
5113 }
5114
5115 POWERPC_FAMILY(603E)(ObjectClass *oc, void *data)
5116 {
5117 DeviceClass *dc = DEVICE_CLASS(oc);
5118 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5119
5120 dc->desc = "PowerPC 603e";
5121 pcc->init_proc = init_proc_603E;
5122 pcc->check_pow = check_pow_hid0;
5123 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5124 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5125 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5126 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5127 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5128 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5129 PPC_SEGMENT | PPC_EXTERN;
5130 pcc->insns_flags2 = PPC_NONE;
5131 pcc->msr_mask = 0x000000000007FF73ULL;
5132 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5133 pcc->excp_model = POWERPC_EXCP_603E;
5134 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5135 pcc->bfd_mach = bfd_mach_ppc_ec603e;
5136 pcc->flags = POWERPC_FLAG_TGPR | POWERPC_FLAG_SE |
5137 POWERPC_FLAG_BE | POWERPC_FLAG_BUS_CLK;
5138 }
5139
5140 static void init_proc_604 (CPUPPCState *env)
5141 {
5142 gen_spr_ne_601(env);
5143 gen_spr_604(env);
5144 /* Time base */
5145 gen_tbl(env);
5146 /* Hardware implementation registers */
5147 /* XXX : not implemented */
5148 spr_register(env, SPR_HID0, "HID0",
5149 SPR_NOACCESS, SPR_NOACCESS,
5150 &spr_read_generic, &spr_write_generic,
5151 0x00000000);
5152 /* Memory management */
5153 gen_low_BATs(env);
5154 init_excp_604(env);
5155 env->dcache_line_size = 32;
5156 env->icache_line_size = 32;
5157 /* Allocate hardware IRQ controller */
5158 ppc6xx_irq_init(env);
5159 }
5160
5161 POWERPC_FAMILY(604)(ObjectClass *oc, void *data)
5162 {
5163 DeviceClass *dc = DEVICE_CLASS(oc);
5164 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5165
5166 dc->desc = "PowerPC 604";
5167 pcc->init_proc = init_proc_604;
5168 pcc->check_pow = check_pow_nocheck;
5169 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5170 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5171 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5172 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5173 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5174 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5175 PPC_SEGMENT | PPC_EXTERN;
5176 pcc->insns_flags2 = PPC_NONE;
5177 pcc->msr_mask = 0x000000000005FF77ULL;
5178 pcc->mmu_model = POWERPC_MMU_32B;
5179 pcc->excp_model = POWERPC_EXCP_604;
5180 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5181 pcc->bfd_mach = bfd_mach_ppc_604;
5182 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5183 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5184 }
5185
5186 static void init_proc_604E (CPUPPCState *env)
5187 {
5188 gen_spr_ne_601(env);
5189 gen_spr_604(env);
5190 /* XXX : not implemented */
5191 spr_register(env, SPR_MMCR1, "MMCR1",
5192 SPR_NOACCESS, SPR_NOACCESS,
5193 &spr_read_generic, &spr_write_generic,
5194 0x00000000);
5195 /* XXX : not implemented */
5196 spr_register(env, SPR_PMC3, "PMC3",
5197 SPR_NOACCESS, SPR_NOACCESS,
5198 &spr_read_generic, &spr_write_generic,
5199 0x00000000);
5200 /* XXX : not implemented */
5201 spr_register(env, SPR_PMC4, "PMC4",
5202 SPR_NOACCESS, SPR_NOACCESS,
5203 &spr_read_generic, &spr_write_generic,
5204 0x00000000);
5205 /* Time base */
5206 gen_tbl(env);
5207 /* Hardware implementation registers */
5208 /* XXX : not implemented */
5209 spr_register(env, SPR_HID0, "HID0",
5210 SPR_NOACCESS, SPR_NOACCESS,
5211 &spr_read_generic, &spr_write_generic,
5212 0x00000000);
5213 /* XXX : not implemented */
5214 spr_register(env, SPR_HID1, "HID1",
5215 SPR_NOACCESS, SPR_NOACCESS,
5216 &spr_read_generic, &spr_write_generic,
5217 0x00000000);
5218 /* Memory management */
5219 gen_low_BATs(env);
5220 init_excp_604(env);
5221 env->dcache_line_size = 32;
5222 env->icache_line_size = 32;
5223 /* Allocate hardware IRQ controller */
5224 ppc6xx_irq_init(env);
5225 }
5226
5227 POWERPC_FAMILY(604E)(ObjectClass *oc, void *data)
5228 {
5229 DeviceClass *dc = DEVICE_CLASS(oc);
5230 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5231
5232 dc->desc = "PowerPC 604E";
5233 pcc->init_proc = init_proc_604E;
5234 pcc->check_pow = check_pow_nocheck;
5235 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5236 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5237 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5238 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5239 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5240 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5241 PPC_SEGMENT | PPC_EXTERN;
5242 pcc->insns_flags2 = PPC_NONE;
5243 pcc->msr_mask = 0x000000000005FF77ULL;
5244 pcc->mmu_model = POWERPC_MMU_32B;
5245 pcc->excp_model = POWERPC_EXCP_604;
5246 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5247 pcc->bfd_mach = bfd_mach_ppc_604;
5248 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5249 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5250 }
5251
5252 static void init_proc_740 (CPUPPCState *env)
5253 {
5254 gen_spr_ne_601(env);
5255 gen_spr_7xx(env);
5256 /* Time base */
5257 gen_tbl(env);
5258 /* Thermal management */
5259 gen_spr_thrm(env);
5260 /* Hardware implementation registers */
5261 /* XXX : not implemented */
5262 spr_register(env, SPR_HID0, "HID0",
5263 SPR_NOACCESS, SPR_NOACCESS,
5264 &spr_read_generic, &spr_write_generic,
5265 0x00000000);
5266 /* XXX : not implemented */
5267 spr_register(env, SPR_HID1, "HID1",
5268 SPR_NOACCESS, SPR_NOACCESS,
5269 &spr_read_generic, &spr_write_generic,
5270 0x00000000);
5271 /* Memory management */
5272 gen_low_BATs(env);
5273 init_excp_7x0(env);
5274 env->dcache_line_size = 32;
5275 env->icache_line_size = 32;
5276 /* Allocate hardware IRQ controller */
5277 ppc6xx_irq_init(env);
5278 }
5279
5280 POWERPC_FAMILY(740)(ObjectClass *oc, void *data)
5281 {
5282 DeviceClass *dc = DEVICE_CLASS(oc);
5283 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5284
5285 dc->desc = "PowerPC 740";
5286 pcc->init_proc = init_proc_740;
5287 pcc->check_pow = check_pow_hid0;
5288 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5289 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5290 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5291 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5292 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5293 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5294 PPC_SEGMENT | PPC_EXTERN;
5295 pcc->insns_flags2 = PPC_NONE;
5296 pcc->msr_mask = 0x000000000005FF77ULL;
5297 pcc->mmu_model = POWERPC_MMU_32B;
5298 pcc->excp_model = POWERPC_EXCP_7x0;
5299 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5300 pcc->bfd_mach = bfd_mach_ppc_750;
5301 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5302 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5303 }
5304
5305 static void init_proc_750 (CPUPPCState *env)
5306 {
5307 gen_spr_ne_601(env);
5308 gen_spr_7xx(env);
5309 /* XXX : not implemented */
5310 spr_register(env, SPR_L2CR, "L2CR",
5311 SPR_NOACCESS, SPR_NOACCESS,
5312 &spr_read_generic, &spr_write_generic,
5313 0x00000000);
5314 /* Time base */
5315 gen_tbl(env);
5316 /* Thermal management */
5317 gen_spr_thrm(env);
5318 /* Hardware implementation registers */
5319 /* XXX : not implemented */
5320 spr_register(env, SPR_HID0, "HID0",
5321 SPR_NOACCESS, SPR_NOACCESS,
5322 &spr_read_generic, &spr_write_generic,
5323 0x00000000);
5324 /* XXX : not implemented */
5325 spr_register(env, SPR_HID1, "HID1",
5326 SPR_NOACCESS, SPR_NOACCESS,
5327 &spr_read_generic, &spr_write_generic,
5328 0x00000000);
5329 /* Memory management */
5330 gen_low_BATs(env);
5331 /* XXX: high BATs are also present but are known to be bugged on
5332 * die version 1.x
5333 */
5334 init_excp_7x0(env);
5335 env->dcache_line_size = 32;
5336 env->icache_line_size = 32;
5337 /* Allocate hardware IRQ controller */
5338 ppc6xx_irq_init(env);
5339 }
5340
5341 POWERPC_FAMILY(750)(ObjectClass *oc, void *data)
5342 {
5343 DeviceClass *dc = DEVICE_CLASS(oc);
5344 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5345
5346 dc->desc = "PowerPC 750";
5347 pcc->init_proc = init_proc_750;
5348 pcc->check_pow = check_pow_hid0;
5349 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5350 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5351 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5352 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5353 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5354 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5355 PPC_SEGMENT | PPC_EXTERN;
5356 pcc->insns_flags2 = PPC_NONE;
5357 pcc->msr_mask = 0x000000000005FF77ULL;
5358 pcc->mmu_model = POWERPC_MMU_32B;
5359 pcc->excp_model = POWERPC_EXCP_7x0;
5360 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5361 pcc->bfd_mach = bfd_mach_ppc_750;
5362 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5363 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5364 }
5365
5366 static void init_proc_750cl (CPUPPCState *env)
5367 {
5368 gen_spr_ne_601(env);
5369 gen_spr_7xx(env);
5370 /* XXX : not implemented */
5371 spr_register(env, SPR_L2CR, "L2CR",
5372 SPR_NOACCESS, SPR_NOACCESS,
5373 &spr_read_generic, &spr_write_generic,
5374 0x00000000);
5375 /* Time base */
5376 gen_tbl(env);
5377 /* Thermal management */
5378 /* Those registers are fake on 750CL */
5379 spr_register(env, SPR_THRM1, "THRM1",
5380 SPR_NOACCESS, SPR_NOACCESS,
5381 &spr_read_generic, &spr_write_generic,
5382 0x00000000);
5383 spr_register(env, SPR_THRM2, "THRM2",
5384 SPR_NOACCESS, SPR_NOACCESS,
5385 &spr_read_generic, &spr_write_generic,
5386 0x00000000);
5387 spr_register(env, SPR_THRM3, "THRM3",
5388 SPR_NOACCESS, SPR_NOACCESS,
5389 &spr_read_generic, &spr_write_generic,
5390 0x00000000);
5391 /* XXX: not implemented */
5392 spr_register(env, SPR_750_TDCL, "TDCL",
5393 SPR_NOACCESS, SPR_NOACCESS,
5394 &spr_read_generic, &spr_write_generic,
5395 0x00000000);
5396 spr_register(env, SPR_750_TDCH, "TDCH",
5397 SPR_NOACCESS, SPR_NOACCESS,
5398 &spr_read_generic, &spr_write_generic,
5399 0x00000000);
5400 /* DMA */
5401 /* XXX : not implemented */
5402 spr_register(env, SPR_750_WPAR, "WPAR",
5403 SPR_NOACCESS, SPR_NOACCESS,
5404 &spr_read_generic, &spr_write_generic,
5405 0x00000000);
5406 spr_register(env, SPR_750_DMAL, "DMAL",
5407 SPR_NOACCESS, SPR_NOACCESS,
5408 &spr_read_generic, &spr_write_generic,
5409 0x00000000);
5410 spr_register(env, SPR_750_DMAU, "DMAU",
5411 SPR_NOACCESS, SPR_NOACCESS,
5412 &spr_read_generic, &spr_write_generic,
5413 0x00000000);
5414 /* Hardware implementation registers */
5415 /* XXX : not implemented */
5416 spr_register(env, SPR_HID0, "HID0",
5417 SPR_NOACCESS, SPR_NOACCESS,
5418 &spr_read_generic, &spr_write_generic,
5419 0x00000000);
5420 /* XXX : not implemented */
5421 spr_register(env, SPR_HID1, "HID1",
5422 SPR_NOACCESS, SPR_NOACCESS,
5423 &spr_read_generic, &spr_write_generic,
5424 0x00000000);
5425 /* XXX : not implemented */
5426 spr_register(env, SPR_750CL_HID2, "HID2",
5427 SPR_NOACCESS, SPR_NOACCESS,
5428 &spr_read_generic, &spr_write_generic,
5429 0x00000000);
5430 /* XXX : not implemented */
5431 spr_register(env, SPR_750CL_HID4, "HID4",
5432 SPR_NOACCESS, SPR_NOACCESS,
5433 &spr_read_generic, &spr_write_generic,
5434 0x00000000);
5435 /* Quantization registers */
5436 /* XXX : not implemented */
5437 spr_register(env, SPR_750_GQR0, "GQR0",
5438 SPR_NOACCESS, SPR_NOACCESS,
5439 &spr_read_generic, &spr_write_generic,
5440 0x00000000);
5441 /* XXX : not implemented */
5442 spr_register(env, SPR_750_GQR1, "GQR1",
5443 SPR_NOACCESS, SPR_NOACCESS,
5444 &spr_read_generic, &spr_write_generic,
5445 0x00000000);
5446 /* XXX : not implemented */
5447 spr_register(env, SPR_750_GQR2, "GQR2",
5448 SPR_NOACCESS, SPR_NOACCESS,
5449 &spr_read_generic, &spr_write_generic,
5450 0x00000000);
5451 /* XXX : not implemented */
5452 spr_register(env, SPR_750_GQR3, "GQR3",
5453 SPR_NOACCESS, SPR_NOACCESS,
5454 &spr_read_generic, &spr_write_generic,
5455 0x00000000);
5456 /* XXX : not implemented */
5457 spr_register(env, SPR_750_GQR4, "GQR4",
5458 SPR_NOACCESS, SPR_NOACCESS,
5459 &spr_read_generic, &spr_write_generic,
5460 0x00000000);
5461 /* XXX : not implemented */
5462 spr_register(env, SPR_750_GQR5, "GQR5",
5463 SPR_NOACCESS, SPR_NOACCESS,
5464 &spr_read_generic, &spr_write_generic,
5465 0x00000000);
5466 /* XXX : not implemented */
5467 spr_register(env, SPR_750_GQR6, "GQR6",
5468 SPR_NOACCESS, SPR_NOACCESS,
5469 &spr_read_generic, &spr_write_generic,
5470 0x00000000);
5471 /* XXX : not implemented */
5472 spr_register(env, SPR_750_GQR7, "GQR7",
5473 SPR_NOACCESS, SPR_NOACCESS,
5474 &spr_read_generic, &spr_write_generic,
5475 0x00000000);
5476 /* Memory management */
5477 gen_low_BATs(env);
5478 /* PowerPC 750cl has 8 DBATs and 8 IBATs */
5479 gen_high_BATs(env);
5480 init_excp_750cl(env);
5481 env->dcache_line_size = 32;
5482 env->icache_line_size = 32;
5483 /* Allocate hardware IRQ controller */
5484 ppc6xx_irq_init(env);
5485 }
5486
5487 POWERPC_FAMILY(750cl)(ObjectClass *oc, void *data)
5488 {
5489 DeviceClass *dc = DEVICE_CLASS(oc);
5490 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5491
5492 dc->desc = "PowerPC 750 CL";
5493 pcc->init_proc = init_proc_750cl;
5494 pcc->check_pow = check_pow_hid0;
5495 /* XXX: not implemented:
5496 * cache lock instructions:
5497 * dcbz_l
5498 * floating point paired instructions
5499 * psq_lux
5500 * psq_lx
5501 * psq_stux
5502 * psq_stx
5503 * ps_abs
5504 * ps_add
5505 * ps_cmpo0
5506 * ps_cmpo1
5507 * ps_cmpu0
5508 * ps_cmpu1
5509 * ps_div
5510 * ps_madd
5511 * ps_madds0
5512 * ps_madds1
5513 * ps_merge00
5514 * ps_merge01
5515 * ps_merge10
5516 * ps_merge11
5517 * ps_mr
5518 * ps_msub
5519 * ps_mul
5520 * ps_muls0
5521 * ps_muls1
5522 * ps_nabs
5523 * ps_neg
5524 * ps_nmadd
5525 * ps_nmsub
5526 * ps_res
5527 * ps_rsqrte
5528 * ps_sel
5529 * ps_sub
5530 * ps_sum0
5531 * ps_sum1
5532 */
5533 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5534 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5535 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5536 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5537 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5538 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5539 PPC_SEGMENT | PPC_EXTERN;
5540 pcc->insns_flags2 = PPC_NONE;
5541 pcc->msr_mask = 0x000000000005FF77ULL;
5542 pcc->mmu_model = POWERPC_MMU_32B;
5543 pcc->excp_model = POWERPC_EXCP_7x0;
5544 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5545 pcc->bfd_mach = bfd_mach_ppc_750;
5546 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5547 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5548 }
5549
5550 static void init_proc_750cx (CPUPPCState *env)
5551 {
5552 gen_spr_ne_601(env);
5553 gen_spr_7xx(env);
5554 /* XXX : not implemented */
5555 spr_register(env, SPR_L2CR, "L2CR",
5556 SPR_NOACCESS, SPR_NOACCESS,
5557 &spr_read_generic, &spr_write_generic,
5558 0x00000000);
5559 /* Time base */
5560 gen_tbl(env);
5561 /* Thermal management */
5562 gen_spr_thrm(env);
5563 /* This register is not implemented but is present for compatibility */
5564 spr_register(env, SPR_SDA, "SDA",
5565 SPR_NOACCESS, SPR_NOACCESS,
5566 &spr_read_generic, &spr_write_generic,
5567 0x00000000);
5568 /* Hardware implementation registers */
5569 /* XXX : not implemented */
5570 spr_register(env, SPR_HID0, "HID0",
5571 SPR_NOACCESS, SPR_NOACCESS,
5572 &spr_read_generic, &spr_write_generic,
5573 0x00000000);
5574 /* XXX : not implemented */
5575 spr_register(env, SPR_HID1, "HID1",
5576 SPR_NOACCESS, SPR_NOACCESS,
5577 &spr_read_generic, &spr_write_generic,
5578 0x00000000);
5579 /* Memory management */
5580 gen_low_BATs(env);
5581 /* PowerPC 750cx has 8 DBATs and 8 IBATs */
5582 gen_high_BATs(env);
5583 init_excp_750cx(env);
5584 env->dcache_line_size = 32;
5585 env->icache_line_size = 32;
5586 /* Allocate hardware IRQ controller */
5587 ppc6xx_irq_init(env);
5588 }
5589
5590 POWERPC_FAMILY(750cx)(ObjectClass *oc, void *data)
5591 {
5592 DeviceClass *dc = DEVICE_CLASS(oc);
5593 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5594
5595 dc->desc = "PowerPC 750CX";
5596 pcc->init_proc = init_proc_750cx;
5597 pcc->check_pow = check_pow_hid0;
5598 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5599 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5600 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5601 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5602 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5603 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5604 PPC_SEGMENT | PPC_EXTERN;
5605 pcc->insns_flags2 = PPC_NONE;
5606 pcc->msr_mask = 0x000000000005FF77ULL;
5607 pcc->mmu_model = POWERPC_MMU_32B;
5608 pcc->excp_model = POWERPC_EXCP_7x0;
5609 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5610 pcc->bfd_mach = bfd_mach_ppc_750;
5611 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5612 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5613 }
5614
5615 static void init_proc_750fx (CPUPPCState *env)
5616 {
5617 gen_spr_ne_601(env);
5618 gen_spr_7xx(env);
5619 /* XXX : not implemented */
5620 spr_register(env, SPR_L2CR, "L2CR",
5621 SPR_NOACCESS, SPR_NOACCESS,
5622 &spr_read_generic, &spr_write_generic,
5623 0x00000000);
5624 /* Time base */
5625 gen_tbl(env);
5626 /* Thermal management */
5627 gen_spr_thrm(env);
5628 /* XXX : not implemented */
5629 spr_register(env, SPR_750_THRM4, "THRM4",
5630 SPR_NOACCESS, SPR_NOACCESS,
5631 &spr_read_generic, &spr_write_generic,
5632 0x00000000);
5633 /* Hardware implementation registers */
5634 /* XXX : not implemented */
5635 spr_register(env, SPR_HID0, "HID0",
5636 SPR_NOACCESS, SPR_NOACCESS,
5637 &spr_read_generic, &spr_write_generic,
5638 0x00000000);
5639 /* XXX : not implemented */
5640 spr_register(env, SPR_HID1, "HID1",
5641 SPR_NOACCESS, SPR_NOACCESS,
5642 &spr_read_generic, &spr_write_generic,
5643 0x00000000);
5644 /* XXX : not implemented */
5645 spr_register(env, SPR_750FX_HID2, "HID2",
5646 SPR_NOACCESS, SPR_NOACCESS,
5647 &spr_read_generic, &spr_write_generic,
5648 0x00000000);
5649 /* Memory management */
5650 gen_low_BATs(env);
5651 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5652 gen_high_BATs(env);
5653 init_excp_7x0(env);
5654 env->dcache_line_size = 32;
5655 env->icache_line_size = 32;
5656 /* Allocate hardware IRQ controller */
5657 ppc6xx_irq_init(env);
5658 }
5659
5660 POWERPC_FAMILY(750fx)(ObjectClass *oc, void *data)
5661 {
5662 DeviceClass *dc = DEVICE_CLASS(oc);
5663 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5664
5665 dc->desc = "PowerPC 750FX";
5666 pcc->init_proc = init_proc_750fx;
5667 pcc->check_pow = check_pow_hid0;
5668 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5669 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5670 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5671 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5672 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5673 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5674 PPC_SEGMENT | PPC_EXTERN;
5675 pcc->insns_flags2 = PPC_NONE;
5676 pcc->msr_mask = 0x000000000005FF77ULL;
5677 pcc->mmu_model = POWERPC_MMU_32B;
5678 pcc->excp_model = POWERPC_EXCP_7x0;
5679 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5680 pcc->bfd_mach = bfd_mach_ppc_750;
5681 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5682 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5683 }
5684
5685 static void init_proc_750gx (CPUPPCState *env)
5686 {
5687 gen_spr_ne_601(env);
5688 gen_spr_7xx(env);
5689 /* XXX : not implemented (XXX: different from 750fx) */
5690 spr_register(env, SPR_L2CR, "L2CR",
5691 SPR_NOACCESS, SPR_NOACCESS,
5692 &spr_read_generic, &spr_write_generic,
5693 0x00000000);
5694 /* Time base */
5695 gen_tbl(env);
5696 /* Thermal management */
5697 gen_spr_thrm(env);
5698 /* XXX : not implemented */
5699 spr_register(env, SPR_750_THRM4, "THRM4",
5700 SPR_NOACCESS, SPR_NOACCESS,
5701 &spr_read_generic, &spr_write_generic,
5702 0x00000000);
5703 /* Hardware implementation registers */
5704 /* XXX : not implemented (XXX: different from 750fx) */
5705 spr_register(env, SPR_HID0, "HID0",
5706 SPR_NOACCESS, SPR_NOACCESS,
5707 &spr_read_generic, &spr_write_generic,
5708 0x00000000);
5709 /* XXX : not implemented */
5710 spr_register(env, SPR_HID1, "HID1",
5711 SPR_NOACCESS, SPR_NOACCESS,
5712 &spr_read_generic, &spr_write_generic,
5713 0x00000000);
5714 /* XXX : not implemented (XXX: different from 750fx) */
5715 spr_register(env, SPR_750FX_HID2, "HID2",
5716 SPR_NOACCESS, SPR_NOACCESS,
5717 &spr_read_generic, &spr_write_generic,
5718 0x00000000);
5719 /* Memory management */
5720 gen_low_BATs(env);
5721 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
5722 gen_high_BATs(env);
5723 init_excp_7x0(env);
5724 env->dcache_line_size = 32;
5725 env->icache_line_size = 32;
5726 /* Allocate hardware IRQ controller */
5727 ppc6xx_irq_init(env);
5728 }
5729
5730 POWERPC_FAMILY(750gx)(ObjectClass *oc, void *data)
5731 {
5732 DeviceClass *dc = DEVICE_CLASS(oc);
5733 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5734
5735 dc->desc = "PowerPC 750GX";
5736 pcc->init_proc = init_proc_750gx;
5737 pcc->check_pow = check_pow_hid0;
5738 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5739 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5740 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5741 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5742 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5743 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5744 PPC_SEGMENT | PPC_EXTERN;
5745 pcc->insns_flags2 = PPC_NONE;
5746 pcc->msr_mask = 0x000000000005FF77ULL;
5747 pcc->mmu_model = POWERPC_MMU_32B;
5748 pcc->excp_model = POWERPC_EXCP_7x0;
5749 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5750 pcc->bfd_mach = bfd_mach_ppc_750;
5751 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5752 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5753 }
5754
5755 static void init_proc_745 (CPUPPCState *env)
5756 {
5757 gen_spr_ne_601(env);
5758 gen_spr_7xx(env);
5759 gen_spr_G2_755(env);
5760 /* Time base */
5761 gen_tbl(env);
5762 /* Thermal management */
5763 gen_spr_thrm(env);
5764 /* Hardware implementation registers */
5765 /* XXX : not implemented */
5766 spr_register(env, SPR_HID0, "HID0",
5767 SPR_NOACCESS, SPR_NOACCESS,
5768 &spr_read_generic, &spr_write_generic,
5769 0x00000000);
5770 /* XXX : not implemented */
5771 spr_register(env, SPR_HID1, "HID1",
5772 SPR_NOACCESS, SPR_NOACCESS,
5773 &spr_read_generic, &spr_write_generic,
5774 0x00000000);
5775 /* XXX : not implemented */
5776 spr_register(env, SPR_HID2, "HID2",
5777 SPR_NOACCESS, SPR_NOACCESS,
5778 &spr_read_generic, &spr_write_generic,
5779 0x00000000);
5780 /* Memory management */
5781 gen_low_BATs(env);
5782 gen_high_BATs(env);
5783 gen_6xx_7xx_soft_tlb(env, 64, 2);
5784 init_excp_7x5(env);
5785 env->dcache_line_size = 32;
5786 env->icache_line_size = 32;
5787 /* Allocate hardware IRQ controller */
5788 ppc6xx_irq_init(env);
5789 }
5790
5791 POWERPC_FAMILY(745)(ObjectClass *oc, void *data)
5792 {
5793 DeviceClass *dc = DEVICE_CLASS(oc);
5794 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5795
5796 dc->desc = "PowerPC 745";
5797 pcc->init_proc = init_proc_745;
5798 pcc->check_pow = check_pow_hid0;
5799 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5800 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5801 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5802 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5803 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5804 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5805 PPC_SEGMENT | PPC_EXTERN;
5806 pcc->insns_flags2 = PPC_NONE;
5807 pcc->msr_mask = 0x000000000005FF77ULL;
5808 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5809 pcc->excp_model = POWERPC_EXCP_7x5;
5810 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5811 pcc->bfd_mach = bfd_mach_ppc_750;
5812 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5813 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5814 }
5815
5816 static void init_proc_755 (CPUPPCState *env)
5817 {
5818 gen_spr_ne_601(env);
5819 gen_spr_7xx(env);
5820 gen_spr_G2_755(env);
5821 /* Time base */
5822 gen_tbl(env);
5823 /* L2 cache control */
5824 /* XXX : not implemented */
5825 spr_register(env, SPR_L2CR, "L2CR",
5826 SPR_NOACCESS, SPR_NOACCESS,
5827 &spr_read_generic, &spr_write_generic,
5828 0x00000000);
5829 /* XXX : not implemented */
5830 spr_register(env, SPR_L2PMCR, "L2PMCR",
5831 SPR_NOACCESS, SPR_NOACCESS,
5832 &spr_read_generic, &spr_write_generic,
5833 0x00000000);
5834 /* Thermal management */
5835 gen_spr_thrm(env);
5836 /* Hardware implementation registers */
5837 /* XXX : not implemented */
5838 spr_register(env, SPR_HID0, "HID0",
5839 SPR_NOACCESS, SPR_NOACCESS,
5840 &spr_read_generic, &spr_write_generic,
5841 0x00000000);
5842 /* XXX : not implemented */
5843 spr_register(env, SPR_HID1, "HID1",
5844 SPR_NOACCESS, SPR_NOACCESS,
5845 &spr_read_generic, &spr_write_generic,
5846 0x00000000);
5847 /* XXX : not implemented */
5848 spr_register(env, SPR_HID2, "HID2",
5849 SPR_NOACCESS, SPR_NOACCESS,
5850 &spr_read_generic, &spr_write_generic,
5851 0x00000000);
5852 /* Memory management */
5853 gen_low_BATs(env);
5854 gen_high_BATs(env);
5855 gen_6xx_7xx_soft_tlb(env, 64, 2);
5856 init_excp_7x5(env);
5857 env->dcache_line_size = 32;
5858 env->icache_line_size = 32;
5859 /* Allocate hardware IRQ controller */
5860 ppc6xx_irq_init(env);
5861 }
5862
5863 POWERPC_FAMILY(755)(ObjectClass *oc, void *data)
5864 {
5865 DeviceClass *dc = DEVICE_CLASS(oc);
5866 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5867
5868 dc->desc = "PowerPC 755";
5869 pcc->init_proc = init_proc_755;
5870 pcc->check_pow = check_pow_hid0;
5871 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5872 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5873 PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX |
5874 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
5875 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5876 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_6xx_TLB |
5877 PPC_SEGMENT | PPC_EXTERN;
5878 pcc->insns_flags2 = PPC_NONE;
5879 pcc->msr_mask = 0x000000000005FF77ULL;
5880 pcc->mmu_model = POWERPC_MMU_SOFT_6xx;
5881 pcc->excp_model = POWERPC_EXCP_7x5;
5882 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5883 pcc->bfd_mach = bfd_mach_ppc_750;
5884 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
5885 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
5886 }
5887
5888 static void init_proc_7400 (CPUPPCState *env)
5889 {
5890 gen_spr_ne_601(env);
5891 gen_spr_7xx(env);
5892 /* Time base */
5893 gen_tbl(env);
5894 /* 74xx specific SPR */
5895 gen_spr_74xx(env);
5896 /* XXX : not implemented */
5897 spr_register(env, SPR_UBAMR, "UBAMR",
5898 &spr_read_ureg, SPR_NOACCESS,
5899 &spr_read_ureg, SPR_NOACCESS,
5900 0x00000000);
5901 /* XXX: this seems not implemented on all revisions. */
5902 /* XXX : not implemented */
5903 spr_register(env, SPR_MSSCR1, "MSSCR1",
5904 SPR_NOACCESS, SPR_NOACCESS,
5905 &spr_read_generic, &spr_write_generic,
5906 0x00000000);
5907 /* Thermal management */
5908 gen_spr_thrm(env);
5909 /* Memory management */
5910 gen_low_BATs(env);
5911 init_excp_7400(env);
5912 env->dcache_line_size = 32;
5913 env->icache_line_size = 32;
5914 /* Allocate hardware IRQ controller */
5915 ppc6xx_irq_init(env);
5916 }
5917
5918 POWERPC_FAMILY(7400)(ObjectClass *oc, void *data)
5919 {
5920 DeviceClass *dc = DEVICE_CLASS(oc);
5921 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5922
5923 dc->desc = "PowerPC 7400 (aka G4)";
5924 pcc->init_proc = init_proc_7400;
5925 pcc->check_pow = check_pow_hid0;
5926 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5927 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5928 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5929 PPC_FLOAT_STFIWX |
5930 PPC_CACHE | PPC_CACHE_ICBI |
5931 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5932 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5933 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
5934 PPC_MEM_TLBIA |
5935 PPC_SEGMENT | PPC_EXTERN |
5936 PPC_ALTIVEC;
5937 pcc->insns_flags2 = PPC_NONE;
5938 pcc->msr_mask = 0x000000000205FF77ULL;
5939 pcc->mmu_model = POWERPC_MMU_32B;
5940 pcc->excp_model = POWERPC_EXCP_74xx;
5941 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
5942 pcc->bfd_mach = bfd_mach_ppc_7400;
5943 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
5944 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
5945 POWERPC_FLAG_BUS_CLK;
5946 }
5947
5948 static void init_proc_7410 (CPUPPCState *env)
5949 {
5950 gen_spr_ne_601(env);
5951 gen_spr_7xx(env);
5952 /* Time base */
5953 gen_tbl(env);
5954 /* 74xx specific SPR */
5955 gen_spr_74xx(env);
5956 /* XXX : not implemented */
5957 spr_register(env, SPR_UBAMR, "UBAMR",
5958 &spr_read_ureg, SPR_NOACCESS,
5959 &spr_read_ureg, SPR_NOACCESS,
5960 0x00000000);
5961 /* Thermal management */
5962 gen_spr_thrm(env);
5963 /* L2PMCR */
5964 /* XXX : not implemented */
5965 spr_register(env, SPR_L2PMCR, "L2PMCR",
5966 SPR_NOACCESS, SPR_NOACCESS,
5967 &spr_read_generic, &spr_write_generic,
5968 0x00000000);
5969 /* LDSTDB */
5970 /* XXX : not implemented */
5971 spr_register(env, SPR_LDSTDB, "LDSTDB",
5972 SPR_NOACCESS, SPR_NOACCESS,
5973 &spr_read_generic, &spr_write_generic,
5974 0x00000000);
5975 /* Memory management */
5976 gen_low_BATs(env);
5977 init_excp_7400(env);
5978 env->dcache_line_size = 32;
5979 env->icache_line_size = 32;
5980 /* Allocate hardware IRQ controller */
5981 ppc6xx_irq_init(env);
5982 }
5983
5984 POWERPC_FAMILY(7410)(ObjectClass *oc, void *data)
5985 {
5986 DeviceClass *dc = DEVICE_CLASS(oc);
5987 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
5988
5989 dc->desc = "PowerPC 7410 (aka G4)";
5990 pcc->init_proc = init_proc_7410;
5991 pcc->check_pow = check_pow_hid0;
5992 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
5993 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
5994 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
5995 PPC_FLOAT_STFIWX |
5996 PPC_CACHE | PPC_CACHE_ICBI |
5997 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
5998 PPC_MEM_SYNC | PPC_MEM_EIEIO |
5999 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6000 PPC_MEM_TLBIA |
6001 PPC_SEGMENT | PPC_EXTERN |
6002 PPC_ALTIVEC;
6003 pcc->insns_flags2 = PPC_NONE;
6004 pcc->msr_mask = 0x000000000205FF77ULL;
6005 pcc->mmu_model = POWERPC_MMU_32B;
6006 pcc->excp_model = POWERPC_EXCP_74xx;
6007 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6008 pcc->bfd_mach = bfd_mach_ppc_7400;
6009 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6010 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6011 POWERPC_FLAG_BUS_CLK;
6012 }
6013
6014 static void init_proc_7440 (CPUPPCState *env)
6015 {
6016 gen_spr_ne_601(env);
6017 gen_spr_7xx(env);
6018 /* Time base */
6019 gen_tbl(env);
6020 /* 74xx specific SPR */
6021 gen_spr_74xx(env);
6022 /* XXX : not implemented */
6023 spr_register(env, SPR_UBAMR, "UBAMR",
6024 &spr_read_ureg, SPR_NOACCESS,
6025 &spr_read_ureg, SPR_NOACCESS,
6026 0x00000000);
6027 /* LDSTCR */
6028 /* XXX : not implemented */
6029 spr_register(env, SPR_LDSTCR, "LDSTCR",
6030 SPR_NOACCESS, SPR_NOACCESS,
6031 &spr_read_generic, &spr_write_generic,
6032 0x00000000);
6033 /* ICTRL */
6034 /* XXX : not implemented */
6035 spr_register(env, SPR_ICTRL, "ICTRL",
6036 SPR_NOACCESS, SPR_NOACCESS,
6037 &spr_read_generic, &spr_write_generic,
6038 0x00000000);
6039 /* MSSSR0 */
6040 /* XXX : not implemented */
6041 spr_register(env, SPR_MSSSR0, "MSSSR0",
6042 SPR_NOACCESS, SPR_NOACCESS,
6043 &spr_read_generic, &spr_write_generic,
6044 0x00000000);
6045 /* PMC */
6046 /* XXX : not implemented */
6047 spr_register(env, SPR_PMC5, "PMC5",
6048 SPR_NOACCESS, SPR_NOACCESS,
6049 &spr_read_generic, &spr_write_generic,
6050 0x00000000);
6051 /* XXX : not implemented */
6052 spr_register(env, SPR_UPMC5, "UPMC5",
6053 &spr_read_ureg, SPR_NOACCESS,
6054 &spr_read_ureg, SPR_NOACCESS,
6055 0x00000000);
6056 /* XXX : not implemented */
6057 spr_register(env, SPR_PMC6, "PMC6",
6058 SPR_NOACCESS, SPR_NOACCESS,
6059 &spr_read_generic, &spr_write_generic,
6060 0x00000000);
6061 /* XXX : not implemented */
6062 spr_register(env, SPR_UPMC6, "UPMC6",
6063 &spr_read_ureg, SPR_NOACCESS,
6064 &spr_read_ureg, SPR_NOACCESS,
6065 0x00000000);
6066 /* Memory management */
6067 gen_low_BATs(env);
6068 gen_74xx_soft_tlb(env, 128, 2);
6069 init_excp_7450(env);
6070 env->dcache_line_size = 32;
6071 env->icache_line_size = 32;
6072 /* Allocate hardware IRQ controller */
6073 ppc6xx_irq_init(env);
6074 }
6075
6076 POWERPC_FAMILY(7440)(ObjectClass *oc, void *data)
6077 {
6078 DeviceClass *dc = DEVICE_CLASS(oc);
6079 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6080
6081 dc->desc = "PowerPC 7440 (aka G4)";
6082 pcc->init_proc = init_proc_7440;
6083 pcc->check_pow = check_pow_hid0_74xx;
6084 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6085 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6086 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6087 PPC_FLOAT_STFIWX |
6088 PPC_CACHE | PPC_CACHE_ICBI |
6089 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6090 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6091 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6092 PPC_MEM_TLBIA | PPC_74xx_TLB |
6093 PPC_SEGMENT | PPC_EXTERN |
6094 PPC_ALTIVEC;
6095 pcc->insns_flags2 = PPC_NONE;
6096 pcc->msr_mask = 0x000000000205FF77ULL;
6097 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6098 pcc->excp_model = POWERPC_EXCP_74xx;
6099 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6100 pcc->bfd_mach = bfd_mach_ppc_7400;
6101 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6102 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6103 POWERPC_FLAG_BUS_CLK;
6104 }
6105
6106 static void init_proc_7450 (CPUPPCState *env)
6107 {
6108 gen_spr_ne_601(env);
6109 gen_spr_7xx(env);
6110 /* Time base */
6111 gen_tbl(env);
6112 /* 74xx specific SPR */
6113 gen_spr_74xx(env);
6114 /* Level 3 cache control */
6115 gen_l3_ctrl(env);
6116 /* L3ITCR1 */
6117 /* XXX : not implemented */
6118 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6119 SPR_NOACCESS, SPR_NOACCESS,
6120 &spr_read_generic, &spr_write_generic,
6121 0x00000000);
6122 /* L3ITCR2 */
6123 /* XXX : not implemented */
6124 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6125 SPR_NOACCESS, SPR_NOACCESS,
6126 &spr_read_generic, &spr_write_generic,
6127 0x00000000);
6128 /* L3ITCR3 */
6129 /* XXX : not implemented */
6130 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6131 SPR_NOACCESS, SPR_NOACCESS,
6132 &spr_read_generic, &spr_write_generic,
6133 0x00000000);
6134 /* L3OHCR */
6135 /* XXX : not implemented */
6136 spr_register(env, SPR_L3OHCR, "L3OHCR",
6137 SPR_NOACCESS, SPR_NOACCESS,
6138 &spr_read_generic, &spr_write_generic,
6139 0x00000000);
6140 /* XXX : not implemented */
6141 spr_register(env, SPR_UBAMR, "UBAMR",
6142 &spr_read_ureg, SPR_NOACCESS,
6143 &spr_read_ureg, SPR_NOACCESS,
6144 0x00000000);
6145 /* LDSTCR */
6146 /* XXX : not implemented */
6147 spr_register(env, SPR_LDSTCR, "LDSTCR",
6148 SPR_NOACCESS, SPR_NOACCESS,
6149 &spr_read_generic, &spr_write_generic,
6150 0x00000000);
6151 /* ICTRL */
6152 /* XXX : not implemented */
6153 spr_register(env, SPR_ICTRL, "ICTRL",
6154 SPR_NOACCESS, SPR_NOACCESS,
6155 &spr_read_generic, &spr_write_generic,
6156 0x00000000);
6157 /* MSSSR0 */
6158 /* XXX : not implemented */
6159 spr_register(env, SPR_MSSSR0, "MSSSR0",
6160 SPR_NOACCESS, SPR_NOACCESS,
6161 &spr_read_generic, &spr_write_generic,
6162 0x00000000);
6163 /* PMC */
6164 /* XXX : not implemented */
6165 spr_register(env, SPR_PMC5, "PMC5",
6166 SPR_NOACCESS, SPR_NOACCESS,
6167 &spr_read_generic, &spr_write_generic,
6168 0x00000000);
6169 /* XXX : not implemented */
6170 spr_register(env, SPR_UPMC5, "UPMC5",
6171 &spr_read_ureg, SPR_NOACCESS,
6172 &spr_read_ureg, SPR_NOACCESS,
6173 0x00000000);
6174 /* XXX : not implemented */
6175 spr_register(env, SPR_PMC6, "PMC6",
6176 SPR_NOACCESS, SPR_NOACCESS,
6177 &spr_read_generic, &spr_write_generic,
6178 0x00000000);
6179 /* XXX : not implemented */
6180 spr_register(env, SPR_UPMC6, "UPMC6",
6181 &spr_read_ureg, SPR_NOACCESS,
6182 &spr_read_ureg, SPR_NOACCESS,
6183 0x00000000);
6184 /* Memory management */
6185 gen_low_BATs(env);
6186 gen_74xx_soft_tlb(env, 128, 2);
6187 init_excp_7450(env);
6188 env->dcache_line_size = 32;
6189 env->icache_line_size = 32;
6190 /* Allocate hardware IRQ controller */
6191 ppc6xx_irq_init(env);
6192 }
6193
6194 POWERPC_FAMILY(7450)(ObjectClass *oc, void *data)
6195 {
6196 DeviceClass *dc = DEVICE_CLASS(oc);
6197 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6198
6199 dc->desc = "PowerPC 7450 (aka G4)";
6200 pcc->init_proc = init_proc_7450;
6201 pcc->check_pow = check_pow_hid0_74xx;
6202 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6203 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6204 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6205 PPC_FLOAT_STFIWX |
6206 PPC_CACHE | PPC_CACHE_ICBI |
6207 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6208 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6209 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6210 PPC_MEM_TLBIA | PPC_74xx_TLB |
6211 PPC_SEGMENT | PPC_EXTERN |
6212 PPC_ALTIVEC;
6213 pcc->insns_flags2 = PPC_NONE;
6214 pcc->msr_mask = 0x000000000205FF77ULL;
6215 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6216 pcc->excp_model = POWERPC_EXCP_74xx;
6217 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6218 pcc->bfd_mach = bfd_mach_ppc_7400;
6219 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6220 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6221 POWERPC_FLAG_BUS_CLK;
6222 }
6223
6224 static void init_proc_7445 (CPUPPCState *env)
6225 {
6226 gen_spr_ne_601(env);
6227 gen_spr_7xx(env);
6228 /* Time base */
6229 gen_tbl(env);
6230 /* 74xx specific SPR */
6231 gen_spr_74xx(env);
6232 /* LDSTCR */
6233 /* XXX : not implemented */
6234 spr_register(env, SPR_LDSTCR, "LDSTCR",
6235 SPR_NOACCESS, SPR_NOACCESS,
6236 &spr_read_generic, &spr_write_generic,
6237 0x00000000);
6238 /* ICTRL */
6239 /* XXX : not implemented */
6240 spr_register(env, SPR_ICTRL, "ICTRL",
6241 SPR_NOACCESS, SPR_NOACCESS,
6242 &spr_read_generic, &spr_write_generic,
6243 0x00000000);
6244 /* MSSSR0 */
6245 /* XXX : not implemented */
6246 spr_register(env, SPR_MSSSR0, "MSSSR0",
6247 SPR_NOACCESS, SPR_NOACCESS,
6248 &spr_read_generic, &spr_write_generic,
6249 0x00000000);
6250 /* PMC */
6251 /* XXX : not implemented */
6252 spr_register(env, SPR_PMC5, "PMC5",
6253 SPR_NOACCESS, SPR_NOACCESS,
6254 &spr_read_generic, &spr_write_generic,
6255 0x00000000);
6256 /* XXX : not implemented */
6257 spr_register(env, SPR_UPMC5, "UPMC5",
6258 &spr_read_ureg, SPR_NOACCESS,
6259 &spr_read_ureg, SPR_NOACCESS,
6260 0x00000000);
6261 /* XXX : not implemented */
6262 spr_register(env, SPR_PMC6, "PMC6",
6263 SPR_NOACCESS, SPR_NOACCESS,
6264 &spr_read_generic, &spr_write_generic,
6265 0x00000000);
6266 /* XXX : not implemented */
6267 spr_register(env, SPR_UPMC6, "UPMC6",
6268 &spr_read_ureg, SPR_NOACCESS,
6269 &spr_read_ureg, SPR_NOACCESS,
6270 0x00000000);
6271 /* SPRGs */
6272 spr_register(env, SPR_SPRG4, "SPRG4",
6273 SPR_NOACCESS, SPR_NOACCESS,
6274 &spr_read_generic, &spr_write_generic,
6275 0x00000000);
6276 spr_register(env, SPR_USPRG4, "USPRG4",
6277 &spr_read_ureg, SPR_NOACCESS,
6278 &spr_read_ureg, SPR_NOACCESS,
6279 0x00000000);
6280 spr_register(env, SPR_SPRG5, "SPRG5",
6281 SPR_NOACCESS, SPR_NOACCESS,
6282 &spr_read_generic, &spr_write_generic,
6283 0x00000000);
6284 spr_register(env, SPR_USPRG5, "USPRG5",
6285 &spr_read_ureg, SPR_NOACCESS,
6286 &spr_read_ureg, SPR_NOACCESS,
6287 0x00000000);
6288 spr_register(env, SPR_SPRG6, "SPRG6",
6289 SPR_NOACCESS, SPR_NOACCESS,
6290 &spr_read_generic, &spr_write_generic,
6291 0x00000000);
6292 spr_register(env, SPR_USPRG6, "USPRG6",
6293 &spr_read_ureg, SPR_NOACCESS,
6294 &spr_read_ureg, SPR_NOACCESS,
6295 0x00000000);
6296 spr_register(env, SPR_SPRG7, "SPRG7",
6297 SPR_NOACCESS, SPR_NOACCESS,
6298 &spr_read_generic, &spr_write_generic,
6299 0x00000000);
6300 spr_register(env, SPR_USPRG7, "USPRG7",
6301 &spr_read_ureg, SPR_NOACCESS,
6302 &spr_read_ureg, SPR_NOACCESS,
6303 0x00000000);
6304 /* Memory management */
6305 gen_low_BATs(env);
6306 gen_high_BATs(env);
6307 gen_74xx_soft_tlb(env, 128, 2);
6308 init_excp_7450(env);
6309 env->dcache_line_size = 32;
6310 env->icache_line_size = 32;
6311 /* Allocate hardware IRQ controller */
6312 ppc6xx_irq_init(env);
6313 }
6314
6315 POWERPC_FAMILY(7445)(ObjectClass *oc, void *data)
6316 {
6317 DeviceClass *dc = DEVICE_CLASS(oc);
6318 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6319
6320 dc->desc = "PowerPC 7445 (aka G4)";
6321 pcc->init_proc = init_proc_7445;
6322 pcc->check_pow = check_pow_hid0_74xx;
6323 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6324 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6325 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6326 PPC_FLOAT_STFIWX |
6327 PPC_CACHE | PPC_CACHE_ICBI |
6328 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6329 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6330 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6331 PPC_MEM_TLBIA | PPC_74xx_TLB |
6332 PPC_SEGMENT | PPC_EXTERN |
6333 PPC_ALTIVEC;
6334 pcc->insns_flags2 = PPC_NONE;
6335 pcc->msr_mask = 0x000000000205FF77ULL;
6336 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6337 pcc->excp_model = POWERPC_EXCP_74xx;
6338 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6339 pcc->bfd_mach = bfd_mach_ppc_7400;
6340 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6341 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6342 POWERPC_FLAG_BUS_CLK;
6343 }
6344
6345 static void init_proc_7455 (CPUPPCState *env)
6346 {
6347 gen_spr_ne_601(env);
6348 gen_spr_7xx(env);
6349 /* Time base */
6350 gen_tbl(env);
6351 /* 74xx specific SPR */
6352 gen_spr_74xx(env);
6353 /* Level 3 cache control */
6354 gen_l3_ctrl(env);
6355 /* LDSTCR */
6356 /* XXX : not implemented */
6357 spr_register(env, SPR_LDSTCR, "LDSTCR",
6358 SPR_NOACCESS, SPR_NOACCESS,
6359 &spr_read_generic, &spr_write_generic,
6360 0x00000000);
6361 /* ICTRL */
6362 /* XXX : not implemented */
6363 spr_register(env, SPR_ICTRL, "ICTRL",
6364 SPR_NOACCESS, SPR_NOACCESS,
6365 &spr_read_generic, &spr_write_generic,
6366 0x00000000);
6367 /* MSSSR0 */
6368 /* XXX : not implemented */
6369 spr_register(env, SPR_MSSSR0, "MSSSR0",
6370 SPR_NOACCESS, SPR_NOACCESS,
6371 &spr_read_generic, &spr_write_generic,
6372 0x00000000);
6373 /* PMC */
6374 /* XXX : not implemented */
6375 spr_register(env, SPR_PMC5, "PMC5",
6376 SPR_NOACCESS, SPR_NOACCESS,
6377 &spr_read_generic, &spr_write_generic,
6378 0x00000000);
6379 /* XXX : not implemented */
6380 spr_register(env, SPR_UPMC5, "UPMC5",
6381 &spr_read_ureg, SPR_NOACCESS,
6382 &spr_read_ureg, SPR_NOACCESS,
6383 0x00000000);
6384 /* XXX : not implemented */
6385 spr_register(env, SPR_PMC6, "PMC6",
6386 SPR_NOACCESS, SPR_NOACCESS,
6387 &spr_read_generic, &spr_write_generic,
6388 0x00000000);
6389 /* XXX : not implemented */
6390 spr_register(env, SPR_UPMC6, "UPMC6",
6391 &spr_read_ureg, SPR_NOACCESS,
6392 &spr_read_ureg, SPR_NOACCESS,
6393 0x00000000);
6394 /* SPRGs */
6395 spr_register(env, SPR_SPRG4, "SPRG4",
6396 SPR_NOACCESS, SPR_NOACCESS,
6397 &spr_read_generic, &spr_write_generic,
6398 0x00000000);
6399 spr_register(env, SPR_USPRG4, "USPRG4",
6400 &spr_read_ureg, SPR_NOACCESS,
6401 &spr_read_ureg, SPR_NOACCESS,
6402 0x00000000);
6403 spr_register(env, SPR_SPRG5, "SPRG5",
6404 SPR_NOACCESS, SPR_NOACCESS,
6405 &spr_read_generic, &spr_write_generic,
6406 0x00000000);
6407 spr_register(env, SPR_USPRG5, "USPRG5",
6408 &spr_read_ureg, SPR_NOACCESS,
6409 &spr_read_ureg, SPR_NOACCESS,
6410 0x00000000);
6411 spr_register(env, SPR_SPRG6, "SPRG6",
6412 SPR_NOACCESS, SPR_NOACCESS,
6413 &spr_read_generic, &spr_write_generic,
6414 0x00000000);
6415 spr_register(env, SPR_USPRG6, "USPRG6",
6416 &spr_read_ureg, SPR_NOACCESS,
6417 &spr_read_ureg, SPR_NOACCESS,
6418 0x00000000);
6419 spr_register(env, SPR_SPRG7, "SPRG7",
6420 SPR_NOACCESS, SPR_NOACCESS,
6421 &spr_read_generic, &spr_write_generic,
6422 0x00000000);
6423 spr_register(env, SPR_USPRG7, "USPRG7",
6424 &spr_read_ureg, SPR_NOACCESS,
6425 &spr_read_ureg, SPR_NOACCESS,
6426 0x00000000);
6427 /* Memory management */
6428 gen_low_BATs(env);
6429 gen_high_BATs(env);
6430 gen_74xx_soft_tlb(env, 128, 2);
6431 init_excp_7450(env);
6432 env->dcache_line_size = 32;
6433 env->icache_line_size = 32;
6434 /* Allocate hardware IRQ controller */
6435 ppc6xx_irq_init(env);
6436 }
6437
6438 POWERPC_FAMILY(7455)(ObjectClass *oc, void *data)
6439 {
6440 DeviceClass *dc = DEVICE_CLASS(oc);
6441 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6442
6443 dc->desc = "PowerPC 7455 (aka G4)";
6444 pcc->init_proc = init_proc_7455;
6445 pcc->check_pow = check_pow_hid0_74xx;
6446 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6447 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6448 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6449 PPC_FLOAT_STFIWX |
6450 PPC_CACHE | PPC_CACHE_ICBI |
6451 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6452 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6453 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6454 PPC_MEM_TLBIA | PPC_74xx_TLB |
6455 PPC_SEGMENT | PPC_EXTERN |
6456 PPC_ALTIVEC;
6457 pcc->insns_flags2 = PPC_NONE;
6458 pcc->msr_mask = 0x000000000205FF77ULL;
6459 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6460 pcc->excp_model = POWERPC_EXCP_74xx;
6461 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6462 pcc->bfd_mach = bfd_mach_ppc_7400;
6463 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6464 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6465 POWERPC_FLAG_BUS_CLK;
6466 }
6467
6468 static void init_proc_7457 (CPUPPCState *env)
6469 {
6470 gen_spr_ne_601(env);
6471 gen_spr_7xx(env);
6472 /* Time base */
6473 gen_tbl(env);
6474 /* 74xx specific SPR */
6475 gen_spr_74xx(env);
6476 /* Level 3 cache control */
6477 gen_l3_ctrl(env);
6478 /* L3ITCR1 */
6479 /* XXX : not implemented */
6480 spr_register(env, SPR_L3ITCR1, "L3ITCR1",
6481 SPR_NOACCESS, SPR_NOACCESS,
6482 &spr_read_generic, &spr_write_generic,
6483 0x00000000);
6484 /* L3ITCR2 */
6485 /* XXX : not implemented */
6486 spr_register(env, SPR_L3ITCR2, "L3ITCR2",
6487 SPR_NOACCESS, SPR_NOACCESS,
6488 &spr_read_generic, &spr_write_generic,
6489 0x00000000);
6490 /* L3ITCR3 */
6491 /* XXX : not implemented */
6492 spr_register(env, SPR_L3ITCR3, "L3ITCR3",
6493 SPR_NOACCESS, SPR_NOACCESS,
6494 &spr_read_generic, &spr_write_generic,
6495 0x00000000);
6496 /* L3OHCR */
6497 /* XXX : not implemented */
6498 spr_register(env, SPR_L3OHCR, "L3OHCR",
6499 SPR_NOACCESS, SPR_NOACCESS,
6500 &spr_read_generic, &spr_write_generic,
6501 0x00000000);
6502 /* LDSTCR */
6503 /* XXX : not implemented */
6504 spr_register(env, SPR_LDSTCR, "LDSTCR",
6505 SPR_NOACCESS, SPR_NOACCESS,
6506 &spr_read_generic, &spr_write_generic,
6507 0x00000000);
6508 /* ICTRL */
6509 /* XXX : not implemented */
6510 spr_register(env, SPR_ICTRL, "ICTRL",
6511 SPR_NOACCESS, SPR_NOACCESS,
6512 &spr_read_generic, &spr_write_generic,
6513 0x00000000);
6514 /* MSSSR0 */
6515 /* XXX : not implemented */
6516 spr_register(env, SPR_MSSSR0, "MSSSR0",
6517 SPR_NOACCESS, SPR_NOACCESS,
6518 &spr_read_generic, &spr_write_generic,
6519 0x00000000);
6520 /* PMC */
6521 /* XXX : not implemented */
6522 spr_register(env, SPR_PMC5, "PMC5",
6523 SPR_NOACCESS, SPR_NOACCESS,
6524 &spr_read_generic, &spr_write_generic,
6525 0x00000000);
6526 /* XXX : not implemented */
6527 spr_register(env, SPR_UPMC5, "UPMC5",
6528 &spr_read_ureg, SPR_NOACCESS,
6529 &spr_read_ureg, SPR_NOACCESS,
6530 0x00000000);
6531 /* XXX : not implemented */
6532 spr_register(env, SPR_PMC6, "PMC6",
6533 SPR_NOACCESS, SPR_NOACCESS,
6534 &spr_read_generic, &spr_write_generic,
6535 0x00000000);
6536 /* XXX : not implemented */
6537 spr_register(env, SPR_UPMC6, "UPMC6",
6538 &spr_read_ureg, SPR_NOACCESS,
6539 &spr_read_ureg, SPR_NOACCESS,
6540 0x00000000);
6541 /* SPRGs */
6542 spr_register(env, SPR_SPRG4, "SPRG4",
6543 SPR_NOACCESS, SPR_NOACCESS,
6544 &spr_read_generic, &spr_write_generic,
6545 0x00000000);
6546 spr_register(env, SPR_USPRG4, "USPRG4",
6547 &spr_read_ureg, SPR_NOACCESS,
6548 &spr_read_ureg, SPR_NOACCESS,
6549 0x00000000);
6550 spr_register(env, SPR_SPRG5, "SPRG5",
6551 SPR_NOACCESS, SPR_NOACCESS,
6552 &spr_read_generic, &spr_write_generic,
6553 0x00000000);
6554 spr_register(env, SPR_USPRG5, "USPRG5",
6555 &spr_read_ureg, SPR_NOACCESS,
6556 &spr_read_ureg, SPR_NOACCESS,
6557 0x00000000);
6558 spr_register(env, SPR_SPRG6, "SPRG6",
6559 SPR_NOACCESS, SPR_NOACCESS,
6560 &spr_read_generic, &spr_write_generic,
6561 0x00000000);
6562 spr_register(env, SPR_USPRG6, "USPRG6",
6563 &spr_read_ureg, SPR_NOACCESS,
6564 &spr_read_ureg, SPR_NOACCESS,
6565 0x00000000);
6566 spr_register(env, SPR_SPRG7, "SPRG7",
6567 SPR_NOACCESS, SPR_NOACCESS,
6568 &spr_read_generic, &spr_write_generic,
6569 0x00000000);
6570 spr_register(env, SPR_USPRG7, "USPRG7",
6571 &spr_read_ureg, SPR_NOACCESS,
6572 &spr_read_ureg, SPR_NOACCESS,
6573 0x00000000);
6574 /* Memory management */
6575 gen_low_BATs(env);
6576 gen_high_BATs(env);
6577 gen_74xx_soft_tlb(env, 128, 2);
6578 init_excp_7450(env);
6579 env->dcache_line_size = 32;
6580 env->icache_line_size = 32;
6581 /* Allocate hardware IRQ controller */
6582 ppc6xx_irq_init(env);
6583 }
6584
6585 POWERPC_FAMILY(7457)(ObjectClass *oc, void *data)
6586 {
6587 DeviceClass *dc = DEVICE_CLASS(oc);
6588 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6589
6590 dc->desc = "PowerPC 7457 (aka G4)";
6591 pcc->init_proc = init_proc_7457;
6592 pcc->check_pow = check_pow_hid0_74xx;
6593 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6594 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6595 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6596 PPC_FLOAT_STFIWX |
6597 PPC_CACHE | PPC_CACHE_ICBI |
6598 PPC_CACHE_DCBA | PPC_CACHE_DCBZ |
6599 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6600 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6601 PPC_MEM_TLBIA | PPC_74xx_TLB |
6602 PPC_SEGMENT | PPC_EXTERN |
6603 PPC_ALTIVEC;
6604 pcc->insns_flags2 = PPC_NONE;
6605 pcc->msr_mask = 0x000000000205FF77ULL;
6606 pcc->mmu_model = POWERPC_MMU_SOFT_74xx;
6607 pcc->excp_model = POWERPC_EXCP_74xx;
6608 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
6609 pcc->bfd_mach = bfd_mach_ppc_7400;
6610 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6611 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6612 POWERPC_FLAG_BUS_CLK;
6613 }
6614
6615 #if defined (TARGET_PPC64)
6616 #if defined(CONFIG_USER_ONLY)
6617 #define POWERPC970_HID5_INIT 0x00000080
6618 #else
6619 #define POWERPC970_HID5_INIT 0x00000000
6620 #endif
6621
6622 static int check_pow_970 (CPUPPCState *env)
6623 {
6624 if (env->spr[SPR_HID0] & 0x00600000)
6625 return 1;
6626
6627 return 0;
6628 }
6629
6630 static void init_proc_970 (CPUPPCState *env)
6631 {
6632 gen_spr_ne_601(env);
6633 gen_spr_7xx(env);
6634 /* Time base */
6635 gen_tbl(env);
6636 /* Hardware implementation registers */
6637 /* XXX : not implemented */
6638 spr_register(env, SPR_HID0, "HID0",
6639 SPR_NOACCESS, SPR_NOACCESS,
6640 &spr_read_generic, &spr_write_clear,
6641 0x60000000);
6642 /* XXX : not implemented */
6643 spr_register(env, SPR_HID1, "HID1",
6644 SPR_NOACCESS, SPR_NOACCESS,
6645 &spr_read_generic, &spr_write_generic,
6646 0x00000000);
6647 /* XXX : not implemented */
6648 spr_register(env, SPR_750FX_HID2, "HID2",
6649 SPR_NOACCESS, SPR_NOACCESS,
6650 &spr_read_generic, &spr_write_generic,
6651 0x00000000);
6652 /* XXX : not implemented */
6653 spr_register(env, SPR_970_HID5, "HID5",
6654 SPR_NOACCESS, SPR_NOACCESS,
6655 &spr_read_generic, &spr_write_generic,
6656 POWERPC970_HID5_INIT);
6657 /* XXX : not implemented */
6658 spr_register(env, SPR_L2CR, "L2CR",
6659 SPR_NOACCESS, SPR_NOACCESS,
6660 &spr_read_generic, &spr_write_generic,
6661 0x00000000);
6662 /* Memory management */
6663 /* XXX: not correct */
6664 gen_low_BATs(env);
6665 /* XXX : not implemented */
6666 spr_register(env, SPR_MMUCFG, "MMUCFG",
6667 SPR_NOACCESS, SPR_NOACCESS,
6668 &spr_read_generic, SPR_NOACCESS,
6669 0x00000000); /* TOFIX */
6670 /* XXX : not implemented */
6671 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6672 SPR_NOACCESS, SPR_NOACCESS,
6673 &spr_read_generic, &spr_write_generic,
6674 0x00000000); /* TOFIX */
6675 spr_register(env, SPR_HIOR, "SPR_HIOR",
6676 SPR_NOACCESS, SPR_NOACCESS,
6677 &spr_read_hior, &spr_write_hior,
6678 0x00000000);
6679 #if !defined(CONFIG_USER_ONLY)
6680 env->slb_nr = 32;
6681 #endif
6682 init_excp_970(env);
6683 env->dcache_line_size = 128;
6684 env->icache_line_size = 128;
6685 /* Allocate hardware IRQ controller */
6686 ppc970_irq_init(env);
6687 /* Can't find information on what this should be on reset. This
6688 * value is the one used by 74xx processors. */
6689 vscr_init(env, 0x00010000);
6690 }
6691
6692 POWERPC_FAMILY(970)(ObjectClass *oc, void *data)
6693 {
6694 DeviceClass *dc = DEVICE_CLASS(oc);
6695 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6696
6697 dc->desc = "PowerPC 970";
6698 pcc->init_proc = init_proc_970;
6699 pcc->check_pow = check_pow_970;
6700 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6701 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6702 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6703 PPC_FLOAT_STFIWX |
6704 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6705 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6706 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6707 PPC_64B | PPC_ALTIVEC |
6708 PPC_SEGMENT_64B | PPC_SLBI;
6709 pcc->insns_flags2 = PPC_NONE;
6710 pcc->msr_mask = 0x900000000204FF36ULL;
6711 pcc->mmu_model = POWERPC_MMU_64B;
6712 pcc->excp_model = POWERPC_EXCP_970;
6713 pcc->bus_model = PPC_FLAGS_INPUT_970;
6714 pcc->bfd_mach = bfd_mach_ppc64;
6715 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6716 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6717 POWERPC_FLAG_BUS_CLK;
6718 }
6719
6720 static int check_pow_970FX (CPUPPCState *env)
6721 {
6722 if (env->spr[SPR_HID0] & 0x00600000)
6723 return 1;
6724
6725 return 0;
6726 }
6727
6728 static void init_proc_970FX (CPUPPCState *env)
6729 {
6730 gen_spr_ne_601(env);
6731 gen_spr_7xx(env);
6732 /* Time base */
6733 gen_tbl(env);
6734 /* Hardware implementation registers */
6735 /* XXX : not implemented */
6736 spr_register(env, SPR_HID0, "HID0",
6737 SPR_NOACCESS, SPR_NOACCESS,
6738 &spr_read_generic, &spr_write_clear,
6739 0x60000000);
6740 /* XXX : not implemented */
6741 spr_register(env, SPR_HID1, "HID1",
6742 SPR_NOACCESS, SPR_NOACCESS,
6743 &spr_read_generic, &spr_write_generic,
6744 0x00000000);
6745 /* XXX : not implemented */
6746 spr_register(env, SPR_750FX_HID2, "HID2",
6747 SPR_NOACCESS, SPR_NOACCESS,
6748 &spr_read_generic, &spr_write_generic,
6749 0x00000000);
6750 /* XXX : not implemented */
6751 spr_register(env, SPR_970_HID5, "HID5",
6752 SPR_NOACCESS, SPR_NOACCESS,
6753 &spr_read_generic, &spr_write_generic,
6754 POWERPC970_HID5_INIT);
6755 /* XXX : not implemented */
6756 spr_register(env, SPR_L2CR, "L2CR",
6757 SPR_NOACCESS, SPR_NOACCESS,
6758 &spr_read_generic, &spr_write_generic,
6759 0x00000000);
6760 /* Memory management */
6761 /* XXX: not correct */
6762 gen_low_BATs(env);
6763 /* XXX : not implemented */
6764 spr_register(env, SPR_MMUCFG, "MMUCFG",
6765 SPR_NOACCESS, SPR_NOACCESS,
6766 &spr_read_generic, SPR_NOACCESS,
6767 0x00000000); /* TOFIX */
6768 /* XXX : not implemented */
6769 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6770 SPR_NOACCESS, SPR_NOACCESS,
6771 &spr_read_generic, &spr_write_generic,
6772 0x00000000); /* TOFIX */
6773 spr_register(env, SPR_HIOR, "SPR_HIOR",
6774 SPR_NOACCESS, SPR_NOACCESS,
6775 &spr_read_hior, &spr_write_hior,
6776 0x00000000);
6777 spr_register(env, SPR_CTRL, "SPR_CTRL",
6778 SPR_NOACCESS, SPR_NOACCESS,
6779 &spr_read_generic, &spr_write_generic,
6780 0x00000000);
6781 spr_register(env, SPR_UCTRL, "SPR_UCTRL",
6782 SPR_NOACCESS, SPR_NOACCESS,
6783 &spr_read_generic, &spr_write_generic,
6784 0x00000000);
6785 spr_register(env, SPR_VRSAVE, "SPR_VRSAVE",
6786 &spr_read_generic, &spr_write_generic,
6787 &spr_read_generic, &spr_write_generic,
6788 0x00000000);
6789 #if !defined(CONFIG_USER_ONLY)
6790 env->slb_nr = 64;
6791 #endif
6792 init_excp_970(env);
6793 env->dcache_line_size = 128;
6794 env->icache_line_size = 128;
6795 /* Allocate hardware IRQ controller */
6796 ppc970_irq_init(env);
6797 /* Can't find information on what this should be on reset. This
6798 * value is the one used by 74xx processors. */
6799 vscr_init(env, 0x00010000);
6800 }
6801
6802 POWERPC_FAMILY(970FX)(ObjectClass *oc, void *data)
6803 {
6804 DeviceClass *dc = DEVICE_CLASS(oc);
6805 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6806
6807 dc->desc = "PowerPC 970FX (aka G5)";
6808 pcc->init_proc = init_proc_970FX;
6809 pcc->check_pow = check_pow_970FX;
6810 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6811 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6812 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6813 PPC_FLOAT_STFIWX |
6814 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6815 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6816 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6817 PPC_64B | PPC_ALTIVEC |
6818 PPC_SEGMENT_64B | PPC_SLBI;
6819 pcc->insns_flags2 = PPC_NONE;
6820 pcc->msr_mask = 0x800000000204FF36ULL;
6821 pcc->mmu_model = POWERPC_MMU_64B;
6822 pcc->excp_model = POWERPC_EXCP_970;
6823 pcc->bus_model = PPC_FLAGS_INPUT_970;
6824 pcc->bfd_mach = bfd_mach_ppc64;
6825 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6826 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6827 POWERPC_FLAG_BUS_CLK;
6828 }
6829
6830 static int check_pow_970GX (CPUPPCState *env)
6831 {
6832 if (env->spr[SPR_HID0] & 0x00600000)
6833 return 1;
6834
6835 return 0;
6836 }
6837
6838 static void init_proc_970GX (CPUPPCState *env)
6839 {
6840 gen_spr_ne_601(env);
6841 gen_spr_7xx(env);
6842 /* Time base */
6843 gen_tbl(env);
6844 /* Hardware implementation registers */
6845 /* XXX : not implemented */
6846 spr_register(env, SPR_HID0, "HID0",
6847 SPR_NOACCESS, SPR_NOACCESS,
6848 &spr_read_generic, &spr_write_clear,
6849 0x60000000);
6850 /* XXX : not implemented */
6851 spr_register(env, SPR_HID1, "HID1",
6852 SPR_NOACCESS, SPR_NOACCESS,
6853 &spr_read_generic, &spr_write_generic,
6854 0x00000000);
6855 /* XXX : not implemented */
6856 spr_register(env, SPR_750FX_HID2, "HID2",
6857 SPR_NOACCESS, SPR_NOACCESS,
6858 &spr_read_generic, &spr_write_generic,
6859 0x00000000);
6860 /* XXX : not implemented */
6861 spr_register(env, SPR_970_HID5, "HID5",
6862 SPR_NOACCESS, SPR_NOACCESS,
6863 &spr_read_generic, &spr_write_generic,
6864 POWERPC970_HID5_INIT);
6865 /* XXX : not implemented */
6866 spr_register(env, SPR_L2CR, "L2CR",
6867 SPR_NOACCESS, SPR_NOACCESS,
6868 &spr_read_generic, &spr_write_generic,
6869 0x00000000);
6870 /* Memory management */
6871 /* XXX: not correct */
6872 gen_low_BATs(env);
6873 /* XXX : not implemented */
6874 spr_register(env, SPR_MMUCFG, "MMUCFG",
6875 SPR_NOACCESS, SPR_NOACCESS,
6876 &spr_read_generic, SPR_NOACCESS,
6877 0x00000000); /* TOFIX */
6878 /* XXX : not implemented */
6879 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6880 SPR_NOACCESS, SPR_NOACCESS,
6881 &spr_read_generic, &spr_write_generic,
6882 0x00000000); /* TOFIX */
6883 spr_register(env, SPR_HIOR, "SPR_HIOR",
6884 SPR_NOACCESS, SPR_NOACCESS,
6885 &spr_read_hior, &spr_write_hior,
6886 0x00000000);
6887 #if !defined(CONFIG_USER_ONLY)
6888 env->slb_nr = 32;
6889 #endif
6890 init_excp_970(env);
6891 env->dcache_line_size = 128;
6892 env->icache_line_size = 128;
6893 /* Allocate hardware IRQ controller */
6894 ppc970_irq_init(env);
6895 /* Can't find information on what this should be on reset. This
6896 * value is the one used by 74xx processors. */
6897 vscr_init(env, 0x00010000);
6898 }
6899
6900 POWERPC_FAMILY(970GX)(ObjectClass *oc, void *data)
6901 {
6902 DeviceClass *dc = DEVICE_CLASS(oc);
6903 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
6904
6905 dc->desc = "PowerPC 970 GX";
6906 pcc->init_proc = init_proc_970GX;
6907 pcc->check_pow = check_pow_970GX;
6908 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
6909 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
6910 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
6911 PPC_FLOAT_STFIWX |
6912 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
6913 PPC_MEM_SYNC | PPC_MEM_EIEIO |
6914 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
6915 PPC_64B | PPC_ALTIVEC |
6916 PPC_SEGMENT_64B | PPC_SLBI;
6917 pcc->insns_flags2 = PPC_NONE;
6918 pcc->msr_mask = 0x800000000204FF36ULL;
6919 pcc->mmu_model = POWERPC_MMU_64B;
6920 pcc->excp_model = POWERPC_EXCP_970;
6921 pcc->bus_model = PPC_FLAGS_INPUT_970;
6922 pcc->bfd_mach = bfd_mach_ppc64;
6923 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
6924 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
6925 POWERPC_FLAG_BUS_CLK;
6926 }
6927
6928 static int check_pow_970MP (CPUPPCState *env)
6929 {
6930 if (env->spr[SPR_HID0] & 0x01C00000)
6931 return 1;
6932
6933 return 0;
6934 }
6935
6936 static void init_proc_970MP (CPUPPCState *env)
6937 {
6938 gen_spr_ne_601(env);
6939 gen_spr_7xx(env);
6940 /* Time base */
6941 gen_tbl(env);
6942 /* Hardware implementation registers */
6943 /* XXX : not implemented */
6944 spr_register(env, SPR_HID0, "HID0",
6945 SPR_NOACCESS, SPR_NOACCESS,
6946 &spr_read_generic, &spr_write_clear,
6947 0x60000000);
6948 /* XXX : not implemented */
6949 spr_register(env, SPR_HID1, "HID1",
6950 SPR_NOACCESS, SPR_NOACCESS,
6951 &spr_read_generic, &spr_write_generic,
6952 0x00000000);
6953 /* XXX : not implemented */
6954 spr_register(env, SPR_750FX_HID2, "HID2",
6955 SPR_NOACCESS, SPR_NOACCESS,
6956 &spr_read_generic, &spr_write_generic,
6957 0x00000000);
6958 /* XXX : not implemented */
6959 spr_register(env, SPR_970_HID5, "HID5",
6960 SPR_NOACCESS, SPR_NOACCESS,
6961 &spr_read_generic, &spr_write_generic,
6962 POWERPC970_HID5_INIT);
6963 /* XXX : not implemented */
6964 spr_register(env, SPR_L2CR, "L2CR",
6965 SPR_NOACCESS, SPR_NOACCESS,
6966 &spr_read_generic, &spr_write_generic,
6967 0x00000000);
6968 /* Memory management */
6969 /* XXX: not correct */
6970 gen_low_BATs(env);
6971 /* XXX : not implemented */
6972 spr_register(env, SPR_MMUCFG, "MMUCFG",
6973 SPR_NOACCESS, SPR_NOACCESS,
6974 &spr_read_generic, SPR_NOACCESS,
6975 0x00000000); /* TOFIX */
6976 /* XXX : not implemented */
6977 spr_register(env, SPR_MMUCSR0, "MMUCSR0",
6978 SPR_NOACCESS, SPR_NOACCESS,
6979 &spr_read_generic, &spr_write_generic,
6980 0x00000000); /* TOFIX */
6981 spr_register(env, SPR_HIOR, "SPR_HIOR",
6982 SPR_NOACCESS, SPR_NOACCESS,
6983 &spr_read_hior, &spr_write_hior,
6984 0x00000000);
6985 #if !defined(CONFIG_USER_ONLY)
6986 env->slb_nr = 32;
6987 #endif
6988 init_excp_970(env);
6989 env->dcache_line_size = 128;
6990 env->icache_line_size = 128;
6991 /* Allocate hardware IRQ controller */
6992 ppc970_irq_init(env);
6993 /* Can't find information on what this should be on reset. This
6994 * value is the one used by 74xx processors. */
6995 vscr_init(env, 0x00010000);
6996 }
6997
6998 POWERPC_FAMILY(970MP)(ObjectClass *oc, void *data)
6999 {
7000 DeviceClass *dc = DEVICE_CLASS(oc);
7001 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7002
7003 dc->desc = "PowerPC 970 MP";
7004 pcc->init_proc = init_proc_970MP;
7005 pcc->check_pow = check_pow_970MP;
7006 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7007 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7008 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7009 PPC_FLOAT_STFIWX |
7010 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7011 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7012 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7013 PPC_64B | PPC_ALTIVEC |
7014 PPC_SEGMENT_64B | PPC_SLBI;
7015 pcc->insns_flags2 = PPC_NONE;
7016 pcc->msr_mask = 0x900000000204FF36ULL;
7017 pcc->mmu_model = POWERPC_MMU_64B;
7018 pcc->excp_model = POWERPC_EXCP_970;
7019 pcc->bus_model = PPC_FLAGS_INPUT_970;
7020 pcc->bfd_mach = bfd_mach_ppc64;
7021 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7022 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7023 POWERPC_FLAG_BUS_CLK;
7024 }
7025
7026 static void init_proc_POWER7 (CPUPPCState *env)
7027 {
7028 gen_spr_ne_601(env);
7029 gen_spr_7xx(env);
7030 /* Time base */
7031 gen_tbl(env);
7032 /* Processor identification */
7033 spr_register(env, SPR_PIR, "PIR",
7034 SPR_NOACCESS, SPR_NOACCESS,
7035 &spr_read_generic, &spr_write_pir,
7036 0x00000000);
7037 #if !defined(CONFIG_USER_ONLY)
7038 /* PURR & SPURR: Hack - treat these as aliases for the TB for now */
7039 spr_register(env, SPR_PURR, "PURR",
7040 &spr_read_purr, SPR_NOACCESS,
7041 &spr_read_purr, SPR_NOACCESS,
7042 0x00000000);
7043 spr_register(env, SPR_SPURR, "SPURR",
7044 &spr_read_purr, SPR_NOACCESS,
7045 &spr_read_purr, SPR_NOACCESS,
7046 0x00000000);
7047 spr_register(env, SPR_CFAR, "SPR_CFAR",
7048 SPR_NOACCESS, SPR_NOACCESS,
7049 &spr_read_cfar, &spr_write_cfar,
7050 0x00000000);
7051 spr_register(env, SPR_DSCR, "SPR_DSCR",
7052 SPR_NOACCESS, SPR_NOACCESS,
7053 &spr_read_generic, &spr_write_generic,
7054 0x00000000);
7055 #endif /* !CONFIG_USER_ONLY */
7056 /* Memory management */
7057 /* XXX : not implemented */
7058 spr_register(env, SPR_MMUCFG, "MMUCFG",
7059 SPR_NOACCESS, SPR_NOACCESS,
7060 &spr_read_generic, SPR_NOACCESS,
7061 0x00000000); /* TOFIX */
7062 /* XXX : not implemented */
7063 spr_register(env, SPR_CTRL, "SPR_CTRLT",
7064 SPR_NOACCESS, SPR_NOACCESS,
7065 &spr_read_generic, &spr_write_generic,
7066 0x80800000);
7067 spr_register(env, SPR_UCTRL, "SPR_CTRLF",
7068 SPR_NOACCESS, SPR_NOACCESS,
7069 &spr_read_generic, &spr_write_generic,
7070 0x80800000);
7071 spr_register(env, SPR_VRSAVE, "SPR_VRSAVE",
7072 &spr_read_generic, &spr_write_generic,
7073 &spr_read_generic, &spr_write_generic,
7074 0x00000000);
7075 #if !defined(CONFIG_USER_ONLY)
7076 env->slb_nr = 32;
7077 #endif
7078 init_excp_POWER7(env);
7079 env->dcache_line_size = 128;
7080 env->icache_line_size = 128;
7081 /* Allocate hardware IRQ controller */
7082 ppcPOWER7_irq_init(env);
7083 /* Can't find information on what this should be on reset. This
7084 * value is the one used by 74xx processors. */
7085 vscr_init(env, 0x00010000);
7086 }
7087
7088 POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
7089 {
7090 DeviceClass *dc = DEVICE_CLASS(oc);
7091 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7092
7093 dc->desc = "POWER7";
7094 pcc->init_proc = init_proc_POWER7;
7095 pcc->check_pow = check_pow_nocheck;
7096 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7097 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7098 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7099 PPC_FLOAT_STFIWX |
7100 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7101 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7102 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7103 PPC_64B | PPC_ALTIVEC |
7104 PPC_SEGMENT_64B | PPC_SLBI |
7105 PPC_POPCNTB | PPC_POPCNTWD;
7106 pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX;
7107 pcc->msr_mask = 0x800000000204FF36ULL;
7108 pcc->mmu_model = POWERPC_MMU_2_06;
7109 pcc->excp_model = POWERPC_EXCP_POWER7;
7110 pcc->bus_model = PPC_FLAGS_INPUT_POWER7;
7111 pcc->bfd_mach = bfd_mach_ppc64;
7112 pcc->flags = POWERPC_FLAG_VRE | POWERPC_FLAG_SE |
7113 POWERPC_FLAG_BE | POWERPC_FLAG_PMM |
7114 POWERPC_FLAG_BUS_CLK | POWERPC_FLAG_CFAR;
7115 }
7116
7117 static void init_proc_620 (CPUPPCState *env)
7118 {
7119 gen_spr_ne_601(env);
7120 gen_spr_620(env);
7121 /* Time base */
7122 gen_tbl(env);
7123 /* Hardware implementation registers */
7124 /* XXX : not implemented */
7125 spr_register(env, SPR_HID0, "HID0",
7126 SPR_NOACCESS, SPR_NOACCESS,
7127 &spr_read_generic, &spr_write_generic,
7128 0x00000000);
7129 /* Memory management */
7130 gen_low_BATs(env);
7131 init_excp_620(env);
7132 env->dcache_line_size = 64;
7133 env->icache_line_size = 64;
7134 /* Allocate hardware IRQ controller */
7135 ppc6xx_irq_init(env);
7136 }
7137
7138 POWERPC_FAMILY(620)(ObjectClass *oc, void *data)
7139 {
7140 DeviceClass *dc = DEVICE_CLASS(oc);
7141 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
7142
7143 dc->desc = "PowerPC 620";
7144 pcc->init_proc = init_proc_620;
7145 pcc->check_pow = check_pow_nocheck; /* Check this */
7146 pcc->insns_flags = PPC_INSNS_BASE | PPC_STRING | PPC_MFTB |
7147 PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES |
7148 PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE |
7149 PPC_FLOAT_STFIWX |
7150 PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ |
7151 PPC_MEM_SYNC | PPC_MEM_EIEIO |
7152 PPC_MEM_TLBIE | PPC_MEM_TLBSYNC |
7153 PPC_SEGMENT | PPC_EXTERN |
7154 PPC_64B | PPC_SLBI;
7155 pcc->insns_flags2 = PPC_NONE;
7156 pcc->msr_mask = 0x800000000005FF77ULL;
7157 pcc->mmu_model = POWERPC_MMU_620;
7158 pcc->excp_model = POWERPC_EXCP_970;
7159 pcc->bus_model = PPC_FLAGS_INPUT_6xx;
7160 pcc->bfd_mach = bfd_mach_ppc64;
7161 pcc->flags = POWERPC_FLAG_SE | POWERPC_FLAG_BE |
7162 POWERPC_FLAG_PMM | POWERPC_FLAG_BUS_CLK;
7163 }
7164
7165 #endif /* defined (TARGET_PPC64) */
7166
7167
7168 typedef struct PowerPCCPUAlias {
7169 const char *alias;
7170 const char *model;
7171 } PowerPCCPUAlias;
7172
7173 static const PowerPCCPUAlias ppc_cpu_aliases[] = {
7174 { "403", "403GC" },
7175 { "405", "405D4" },
7176 { "405CR", "405CRc" },
7177 { "405GP", "405GPd" },
7178 { "405GPe", "405CRc" },
7179 { "x2vp7", "x2vp4" },
7180 { "x2vp50", "x2vp20" },
7181
7182 { "440EP", "440EPb" },
7183 { "440GP", "440GPc" },
7184 { "440GR", "440GRa" },
7185 { "440GX", "440GXf" },
7186
7187 { "RCPU", "MPC5xx" },
7188 /* MPC5xx microcontrollers */
7189 { "MGT560", "MPC5xx" },
7190 { "MPC509", "MPC5xx" },
7191 { "MPC533", "MPC5xx" },
7192 { "MPC534", "MPC5xx" },
7193 { "MPC555", "MPC5xx" },
7194 { "MPC556", "MPC5xx" },
7195 { "MPC560", "MPC5xx" },
7196 { "MPC561", "MPC5xx" },
7197 { "MPC562", "MPC5xx" },
7198 { "MPC563", "MPC5xx" },
7199 { "MPC564", "MPC5xx" },
7200 { "MPC565", "MPC5xx" },
7201 { "MPC566", "MPC5xx" },
7202
7203 { "PowerQUICC", "MPC8xx" },
7204 /* MPC8xx microcontrollers */
7205 { "MGT823", "MPC8xx" },
7206 { "MPC821", "MPC8xx" },
7207 { "MPC823", "MPC8xx" },
7208 { "MPC850", "MPC8xx" },
7209 { "MPC852T", "MPC8xx" },
7210 { "MPC855T", "MPC8xx" },
7211 { "MPC857", "MPC8xx" },
7212 { "MPC859", "MPC8xx" },
7213 { "MPC860", "MPC8xx" },
7214 { "MPC862", "MPC8xx" },
7215 { "MPC866", "MPC8xx" },
7216 { "MPC870", "MPC8xx" },
7217 { "MPC875", "MPC8xx" },
7218 { "MPC880", "MPC8xx" },
7219 { "MPC885", "MPC8xx" },
7220
7221 /* PowerPC MPC603 microcontrollers */
7222 { "MPC8240", "603" },
7223
7224 { "MPC52xx", "MPC5200" },
7225 { "MPC5200", "MPC5200_v12" },
7226 { "MPC5200B", "MPC5200B_v21" },
7227
7228 { "MPC82xx", "MPC8280" },
7229 { "PowerQUICC-II", "MPC82xx" },
7230 { "MPC8241", "G2HiP4" },
7231 { "MPC8245", "G2HiP4" },
7232 { "MPC8247", "G2leGP3" },
7233 { "MPC8248", "G2leGP3" },
7234 { "MPC8250", "MPC8250_HiP4" },
7235 { "MPC8250_HiP3", "G2HiP3" },
7236 { "MPC8250_HiP4", "G2HiP4" },
7237 { "MPC8255", "MPC8255_HiP4" },
7238 { "MPC8255_HiP3", "G2HiP3" },
7239 { "MPC8255_HiP4", "G2HiP4" },
7240 { "MPC8260", "MPC8260_HiP4" },
7241 { "MPC8260_HiP3", "G2HiP3" },
7242 { "MPC8260_HiP4", "G2HiP4" },
7243 { "MPC8264", "MPC8264_HiP4" },
7244 { "MPC8264_HiP3", "G2HiP3" },
7245 { "MPC8264_HiP4", "G2HiP4" },
7246 { "MPC8265", "MPC8265_HiP4" },
7247 { "MPC8265_HiP3", "G2HiP3" },
7248 { "MPC8265_HiP4", "G2HiP4" },
7249 { "MPC8266", "MPC8266_HiP4" },
7250 { "MPC8266_HiP3", "G2HiP3" },
7251 { "MPC8266_HiP4", "G2HiP4" },
7252 { "MPC8270", "G2leGP3" },
7253 { "MPC8271", "G2leGP3" },
7254 { "MPC8272", "G2leGP3" },
7255 { "MPC8275", "G2leGP3" },
7256 { "MPC8280", "G2leGP3" },
7257 { "e200", "e200z6" },
7258 { "e300", "e300c3" },
7259 { "MPC8347", "MPC8347T" },
7260 { "MPC8347A", "MPC8347AT" },
7261 { "MPC8347E", "MPC8347ET" },
7262 { "MPC8347EA", "MPC8347EAT" },
7263 { "e500", "e500v2_v22" },
7264 { "e500v1", "e500_v20" },
7265 { "e500v2", "e500v2_v22" },
7266 { "MPC8533", "MPC8533_v11" },
7267 { "MPC8533E", "MPC8533E_v11" },
7268 { "MPC8540", "MPC8540_v21" },
7269 { "MPC8541", "MPC8541_v11" },
7270 { "MPC8541E", "MPC8541E_v11" },
7271 { "MPC8543", "MPC8543_v21" },
7272 { "MPC8543E", "MPC8543E_v21" },
7273 { "MPC8544", "MPC8544_v11" },
7274 { "MPC8544E", "MPC8544E_v11" },
7275 { "MPC8545", "MPC8545_v21" },
7276 { "MPC8545E", "MPC8545E_v21" },
7277 { "MPC8547E", "MPC8547E_v21" },
7278 { "MPC8548", "MPC8548_v21" },
7279 { "MPC8548E", "MPC8548E_v21" },
7280 { "MPC8555", "MPC8555_v11" },
7281 { "MPC8555E", "MPC8555E_v11" },
7282 { "MPC8560", "MPC8560_v21" },
7283 { "601", "601_v2" },
7284 { "601v", "601_v2" },
7285 { "Vanilla", "603" },
7286 { "603e", "603e_v4.1" },
7287 { "Stretch", "603e" },
7288 { "Vaillant", "603e7v" },
7289 { "603r", "603e7t" },
7290 { "Goldeneye", "603r" },
7291 { "604e", "604e_v2.4" },
7292 { "Sirocco", "604e" },
7293 { "Mach5", "604r" },
7294 { "740", "740_v3.1" },
7295 { "Arthur", "740" },
7296 { "750", "750_v3.1" },
7297 { "Typhoon", "750" },
7298 { "G3", "750" },
7299 { "Conan/Doyle", "750p" },
7300 { "750cl", "750cl_v2.0" },
7301 { "750cx", "750cx_v2.2" },
7302 { "750cxe", "750cxe_v3.1b" },
7303 { "750fx", "750fx_v2.3" },
7304 { "750gx", "750gx_v1.2" },
7305 { "750l", "750l_v3.2" },
7306 { "LoneStar", "750l" },
7307 { "745", "745_v2.8" },
7308 { "755", "755_v2.8" },
7309 { "Goldfinger", "755" },
7310 { "7400", "7400_v2.9" },
7311 { "Max", "7400" },
7312 { "G4", "7400" },
7313 { "7410", "7410_v1.4" },
7314 { "Nitro", "7410" },
7315 { "7448", "7448_v2.1" },
7316 { "7450", "7450_v2.1" },
7317 { "Vger", "7450" },
7318 { "7441", "7441_v2.3" },
7319 { "7451", "7451_v2.3" },
7320 { "7445", "7445_v3.2" },
7321 { "7455", "7455_v3.2" },
7322 { "Apollo6", "7455" },
7323 { "7447", "7447_v1.2" },
7324 { "7457", "7457_v1.2" },
7325 { "Apollo7", "7457" },
7326 { "7447A", "7447A_v1.2" },
7327 { "7457A", "7457A_v1.2" },
7328 { "Apollo7PM", "7457A_v1.0" },
7329 #if defined(TARGET_PPC64)
7330 { "Trident", "620" },
7331 { "POWER3", "630" },
7332 { "Boxer", "POWER3" },
7333 { "Dino", "POWER3" },
7334 { "POWER3+", "631" },
7335 { "POWER7", "POWER7_v2.0" },
7336 { "970fx", "970fx_v3.1" },
7337 { "970mp", "970mp_v1.1" },
7338 { "Apache", "RS64" },
7339 { "A35", "RS64" },
7340 { "NorthStar", "RS64-II" },
7341 { "A50", "RS64-II" },
7342 { "Pulsar", "RS64-III" },
7343 { "IceStar", "RS64-IV" },
7344 { "IStar", "RS64-IV" },
7345 { "SStar", "RS64-IV" },
7346 #endif
7347 { "RIOS", "POWER" },
7348 { "RSC", "POWER" },
7349 { "RSC3308", "POWER" },
7350 { "RSC4608", "POWER" },
7351 { "RSC2", "POWER2" },
7352 { "P2SC", "POWER2" },
7353
7354 /* Generic PowerPCs */
7355 #if defined(TARGET_PPC64)
7356 { "ppc64", "970fx" },
7357 #endif
7358 { "ppc32", "604" },
7359 { "ppc", "ppc32" },
7360 { "default", "ppc" },
7361 };
7362
7363 /*****************************************************************************/
7364 /* Generic CPU instantiation routine */
7365 static void init_ppc_proc(PowerPCCPU *cpu)
7366 {
7367 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7368 CPUPPCState *env = &cpu->env;
7369 #if !defined(CONFIG_USER_ONLY)
7370 int i;
7371
7372 env->irq_inputs = NULL;
7373 /* Set all exception vectors to an invalid address */
7374 for (i = 0; i < POWERPC_EXCP_NB; i++)
7375 env->excp_vectors[i] = (target_ulong)(-1ULL);
7376 env->hreset_excp_prefix = 0x00000000;
7377 env->ivor_mask = 0x00000000;
7378 env->ivpr_mask = 0x00000000;
7379 /* Default MMU definitions */
7380 env->nb_BATs = 0;
7381 env->nb_tlb = 0;
7382 env->nb_ways = 0;
7383 env->tlb_type = TLB_NONE;
7384 #endif
7385 /* Register SPR common to all PowerPC implementations */
7386 gen_spr_generic(env);
7387 spr_register(env, SPR_PVR, "PVR",
7388 /* Linux permits userspace to read PVR */
7389 #if defined(CONFIG_LINUX_USER)
7390 &spr_read_generic,
7391 #else
7392 SPR_NOACCESS,
7393 #endif
7394 SPR_NOACCESS,
7395 &spr_read_generic, SPR_NOACCESS,
7396 pcc->pvr);
7397 /* Register SVR if it's defined to anything else than POWERPC_SVR_NONE */
7398 if (pcc->svr != POWERPC_SVR_NONE) {
7399 if (pcc->svr & POWERPC_SVR_E500) {
7400 spr_register(env, SPR_E500_SVR, "SVR",
7401 SPR_NOACCESS, SPR_NOACCESS,
7402 &spr_read_generic, SPR_NOACCESS,
7403 pcc->svr & ~POWERPC_SVR_E500);
7404 } else {
7405 spr_register(env, SPR_SVR, "SVR",
7406 SPR_NOACCESS, SPR_NOACCESS,
7407 &spr_read_generic, SPR_NOACCESS,
7408 pcc->svr);
7409 }
7410 }
7411 /* PowerPC implementation specific initialisations (SPRs, timers, ...) */
7412 (*pcc->init_proc)(env);
7413 #if !defined(CONFIG_USER_ONLY)
7414 env->excp_prefix = env->hreset_excp_prefix;
7415 #endif
7416 /* MSR bits & flags consistency checks */
7417 if (env->msr_mask & (1 << 25)) {
7418 switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
7419 case POWERPC_FLAG_SPE:
7420 case POWERPC_FLAG_VRE:
7421 break;
7422 default:
7423 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7424 "Should define POWERPC_FLAG_SPE or POWERPC_FLAG_VRE\n");
7425 exit(1);
7426 }
7427 } else if (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
7428 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7429 "Should not define POWERPC_FLAG_SPE nor POWERPC_FLAG_VRE\n");
7430 exit(1);
7431 }
7432 if (env->msr_mask & (1 << 17)) {
7433 switch (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
7434 case POWERPC_FLAG_TGPR:
7435 case POWERPC_FLAG_CE:
7436 break;
7437 default:
7438 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7439 "Should define POWERPC_FLAG_TGPR or POWERPC_FLAG_CE\n");
7440 exit(1);
7441 }
7442 } else if (env->flags & (POWERPC_FLAG_TGPR | POWERPC_FLAG_CE)) {
7443 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7444 "Should not define POWERPC_FLAG_TGPR nor POWERPC_FLAG_CE\n");
7445 exit(1);
7446 }
7447 if (env->msr_mask & (1 << 10)) {
7448 switch (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
7449 POWERPC_FLAG_UBLE)) {
7450 case POWERPC_FLAG_SE:
7451 case POWERPC_FLAG_DWE:
7452 case POWERPC_FLAG_UBLE:
7453 break;
7454 default:
7455 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7456 "Should define POWERPC_FLAG_SE or POWERPC_FLAG_DWE or "
7457 "POWERPC_FLAG_UBLE\n");
7458 exit(1);
7459 }
7460 } else if (env->flags & (POWERPC_FLAG_SE | POWERPC_FLAG_DWE |
7461 POWERPC_FLAG_UBLE)) {
7462 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7463 "Should not define POWERPC_FLAG_SE nor POWERPC_FLAG_DWE nor "
7464 "POWERPC_FLAG_UBLE\n");
7465 exit(1);
7466 }
7467 if (env->msr_mask & (1 << 9)) {
7468 switch (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
7469 case POWERPC_FLAG_BE:
7470 case POWERPC_FLAG_DE:
7471 break;
7472 default:
7473 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7474 "Should define POWERPC_FLAG_BE or POWERPC_FLAG_DE\n");
7475 exit(1);
7476 }
7477 } else if (env->flags & (POWERPC_FLAG_BE | POWERPC_FLAG_DE)) {
7478 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7479 "Should not define POWERPC_FLAG_BE nor POWERPC_FLAG_DE\n");
7480 exit(1);
7481 }
7482 if (env->msr_mask & (1 << 2)) {
7483 switch (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
7484 case POWERPC_FLAG_PX:
7485 case POWERPC_FLAG_PMM:
7486 break;
7487 default:
7488 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7489 "Should define POWERPC_FLAG_PX or POWERPC_FLAG_PMM\n");
7490 exit(1);
7491 }
7492 } else if (env->flags & (POWERPC_FLAG_PX | POWERPC_FLAG_PMM)) {
7493 fprintf(stderr, "PowerPC MSR definition inconsistency\n"
7494 "Should not define POWERPC_FLAG_PX nor POWERPC_FLAG_PMM\n");
7495 exit(1);
7496 }
7497 if ((env->flags & (POWERPC_FLAG_RTC_CLK | POWERPC_FLAG_BUS_CLK)) == 0) {
7498 fprintf(stderr, "PowerPC flags inconsistency\n"
7499 "Should define the time-base and decrementer clock source\n");
7500 exit(1);
7501 }
7502 /* Allocate TLBs buffer when needed */
7503 #if !defined(CONFIG_USER_ONLY)
7504 if (env->nb_tlb != 0) {
7505 int nb_tlb = env->nb_tlb;
7506 if (env->id_tlbs != 0)
7507 nb_tlb *= 2;
7508 switch (env->tlb_type) {
7509 case TLB_6XX:
7510 env->tlb.tlb6 = g_malloc0(nb_tlb * sizeof(ppc6xx_tlb_t));
7511 break;
7512 case TLB_EMB:
7513 env->tlb.tlbe = g_malloc0(nb_tlb * sizeof(ppcemb_tlb_t));
7514 break;
7515 case TLB_MAS:
7516 env->tlb.tlbm = g_malloc0(nb_tlb * sizeof(ppcmas_tlb_t));
7517 break;
7518 }
7519 /* Pre-compute some useful values */
7520 env->tlb_per_way = env->nb_tlb / env->nb_ways;
7521 }
7522 if (env->irq_inputs == NULL) {
7523 fprintf(stderr, "WARNING: no internal IRQ controller registered.\n"
7524 " Attempt QEMU to crash very soon !\n");
7525 }
7526 #endif
7527 if (env->check_pow == NULL) {
7528 fprintf(stderr, "WARNING: no power management check handler "
7529 "registered.\n"
7530 " Attempt QEMU to crash very soon !\n");
7531 }
7532 }
7533
7534 #if defined(PPC_DUMP_CPU)
7535 static void dump_ppc_sprs (CPUPPCState *env)
7536 {
7537 ppc_spr_t *spr;
7538 #if !defined(CONFIG_USER_ONLY)
7539 uint32_t sr, sw;
7540 #endif
7541 uint32_t ur, uw;
7542 int i, j, n;
7543
7544 printf("Special purpose registers:\n");
7545 for (i = 0; i < 32; i++) {
7546 for (j = 0; j < 32; j++) {
7547 n = (i << 5) | j;
7548 spr = &env->spr_cb[n];
7549 uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
7550 ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
7551 #if !defined(CONFIG_USER_ONLY)
7552 sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
7553 sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
7554 if (sw || sr || uw || ur) {
7555 printf("SPR: %4d (%03x) %-8s s%c%c u%c%c\n",
7556 (i << 5) | j, (i << 5) | j, spr->name,
7557 sw ? 'w' : '-', sr ? 'r' : '-',
7558 uw ? 'w' : '-', ur ? 'r' : '-');
7559 }
7560 #else
7561 if (uw || ur) {
7562 printf("SPR: %4d (%03x) %-8s u%c%c\n",
7563 (i << 5) | j, (i << 5) | j, spr->name,
7564 uw ? 'w' : '-', ur ? 'r' : '-');
7565 }
7566 #endif
7567 }
7568 }
7569 fflush(stdout);
7570 fflush(stderr);
7571 }
7572 #endif
7573
7574 /*****************************************************************************/
7575 #include <stdlib.h>
7576 #include <string.h>
7577
7578 /* Opcode types */
7579 enum {
7580 PPC_DIRECT = 0, /* Opcode routine */
7581 PPC_INDIRECT = 1, /* Indirect opcode table */
7582 };
7583
7584 static inline int is_indirect_opcode (void *handler)
7585 {
7586 return ((uintptr_t)handler & 0x03) == PPC_INDIRECT;
7587 }
7588
7589 static inline opc_handler_t **ind_table(void *handler)
7590 {
7591 return (opc_handler_t **)((uintptr_t)handler & ~3);
7592 }
7593
7594 /* Instruction table creation */
7595 /* Opcodes tables creation */
7596 static void fill_new_table (opc_handler_t **table, int len)
7597 {
7598 int i;
7599
7600 for (i = 0; i < len; i++)
7601 table[i] = &invalid_handler;
7602 }
7603
7604 static int create_new_table (opc_handler_t **table, unsigned char idx)
7605 {
7606 opc_handler_t **tmp;
7607
7608 tmp = malloc(0x20 * sizeof(opc_handler_t));
7609 fill_new_table(tmp, 0x20);
7610 table[idx] = (opc_handler_t *)((uintptr_t)tmp | PPC_INDIRECT);
7611
7612 return 0;
7613 }
7614
7615 static int insert_in_table (opc_handler_t **table, unsigned char idx,
7616 opc_handler_t *handler)
7617 {
7618 if (table[idx] != &invalid_handler)
7619 return -1;
7620 table[idx] = handler;
7621
7622 return 0;
7623 }
7624
7625 static int register_direct_insn (opc_handler_t **ppc_opcodes,
7626 unsigned char idx, opc_handler_t *handler)
7627 {
7628 if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
7629 printf("*** ERROR: opcode %02x already assigned in main "
7630 "opcode table\n", idx);
7631 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
7632 printf(" Registered handler '%s' - new handler '%s'\n",
7633 ppc_opcodes[idx]->oname, handler->oname);
7634 #endif
7635 return -1;
7636 }
7637
7638 return 0;
7639 }
7640
7641 static int register_ind_in_table (opc_handler_t **table,
7642 unsigned char idx1, unsigned char idx2,
7643 opc_handler_t *handler)
7644 {
7645 if (table[idx1] == &invalid_handler) {
7646 if (create_new_table(table, idx1) < 0) {
7647 printf("*** ERROR: unable to create indirect table "
7648 "idx=%02x\n", idx1);
7649 return -1;
7650 }
7651 } else {
7652 if (!is_indirect_opcode(table[idx1])) {
7653 printf("*** ERROR: idx %02x already assigned to a direct "
7654 "opcode\n", idx1);
7655 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
7656 printf(" Registered handler '%s' - new handler '%s'\n",
7657 ind_table(table[idx1])[idx2]->oname, handler->oname);
7658 #endif
7659 return -1;
7660 }
7661 }
7662 if (handler != NULL &&
7663 insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
7664 printf("*** ERROR: opcode %02x already assigned in "
7665 "opcode table %02x\n", idx2, idx1);
7666 #if defined(DO_PPC_STATISTICS) || defined(PPC_DUMP_CPU)
7667 printf(" Registered handler '%s' - new handler '%s'\n",
7668 ind_table(table[idx1])[idx2]->oname, handler->oname);
7669 #endif
7670 return -1;
7671 }
7672
7673 return 0;
7674 }
7675
7676 static int register_ind_insn (opc_handler_t **ppc_opcodes,
7677 unsigned char idx1, unsigned char idx2,
7678 opc_handler_t *handler)
7679 {
7680 int ret;
7681
7682 ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
7683
7684 return ret;
7685 }
7686
7687 static int register_dblind_insn (opc_handler_t **ppc_opcodes,
7688 unsigned char idx1, unsigned char idx2,
7689 unsigned char idx3, opc_handler_t *handler)
7690 {
7691 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
7692 printf("*** ERROR: unable to join indirect table idx "
7693 "[%02x-%02x]\n", idx1, idx2);
7694 return -1;
7695 }
7696 if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
7697 handler) < 0) {
7698 printf("*** ERROR: unable to insert opcode "
7699 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
7700 return -1;
7701 }
7702
7703 return 0;
7704 }
7705
7706 static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
7707 {
7708 if (insn->opc2 != 0xFF) {
7709 if (insn->opc3 != 0xFF) {
7710 if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
7711 insn->opc3, &insn->handler) < 0)
7712 return -1;
7713 } else {
7714 if (register_ind_insn(ppc_opcodes, insn->opc1,
7715 insn->opc2, &insn->handler) < 0)
7716 return -1;
7717 }
7718 } else {
7719 if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
7720 return -1;
7721 }
7722
7723 return 0;
7724 }
7725
7726 static int test_opcode_table (opc_handler_t **table, int len)
7727 {
7728 int i, count, tmp;
7729
7730 for (i = 0, count = 0; i < len; i++) {
7731 /* Consistency fixup */
7732 if (table[i] == NULL)
7733 table[i] = &invalid_handler;
7734 if (table[i] != &invalid_handler) {
7735 if (is_indirect_opcode(table[i])) {
7736 tmp = test_opcode_table(ind_table(table[i]), 0x20);
7737 if (tmp == 0) {
7738 free(table[i]);
7739 table[i] = &invalid_handler;
7740 } else {
7741 count++;
7742 }
7743 } else {
7744 count++;
7745 }
7746 }
7747 }
7748
7749 return count;
7750 }
7751
7752 static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
7753 {
7754 if (test_opcode_table(ppc_opcodes, 0x40) == 0)
7755 printf("*** WARNING: no opcode defined !\n");
7756 }
7757
7758 /*****************************************************************************/
7759 static void create_ppc_opcodes(PowerPCCPU *cpu, Error **errp)
7760 {
7761 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
7762 CPUPPCState *env = &cpu->env;
7763 opcode_t *opc;
7764
7765 fill_new_table(env->opcodes, 0x40);
7766 for (opc = opcodes; opc < &opcodes[ARRAY_SIZE(opcodes)]; opc++) {
7767 if (((opc->handler.type & pcc->insns_flags) != 0) ||
7768 ((opc->handler.type2 & pcc->insns_flags2) != 0)) {
7769 if (register_insn(env->opcodes, opc) < 0) {
7770 error_setg(errp, "ERROR initializing PowerPC instruction "
7771 "0x%02x 0x%02x 0x%02x", opc->opc1, opc->opc2,
7772 opc->opc3);
7773 return;
7774 }
7775 }
7776 }
7777 fix_opcode_tables(env->opcodes);
7778 fflush(stdout);
7779 fflush(stderr);
7780 }
7781
7782 #if defined(PPC_DUMP_CPU)
7783 static void dump_ppc_insns (CPUPPCState *env)
7784 {
7785 opc_handler_t **table, *handler;
7786 const char *p, *q;
7787 uint8_t opc1, opc2, opc3;
7788
7789 printf("Instructions set:\n");
7790 /* opc1 is 6 bits long */
7791 for (opc1 = 0x00; opc1 < 0x40; opc1++) {
7792 table = env->opcodes;
7793 handler = table[opc1];
7794 if (is_indirect_opcode(handler)) {
7795 /* opc2 is 5 bits long */
7796 for (opc2 = 0; opc2 < 0x20; opc2++) {
7797 table = env->opcodes;
7798 handler = env->opcodes[opc1];
7799 table = ind_table(handler);
7800 handler = table[opc2];
7801 if (is_indirect_opcode(handler)) {
7802 table = ind_table(handler);
7803 /* opc3 is 5 bits long */
7804 for (opc3 = 0; opc3 < 0x20; opc3++) {
7805 handler = table[opc3];
7806 if (handler->handler != &gen_invalid) {
7807 /* Special hack to properly dump SPE insns */
7808 p = strchr(handler->oname, '_');
7809 if (p == NULL) {
7810 printf("INSN: %02x %02x %02x (%02d %04d) : "
7811 "%s\n",
7812 opc1, opc2, opc3, opc1,
7813 (opc3 << 5) | opc2,
7814 handler->oname);
7815 } else {
7816 q = "speundef";
7817 if ((p - handler->oname) != strlen(q) ||
7818 memcmp(handler->oname, q, strlen(q)) != 0) {
7819 /* First instruction */
7820 printf("INSN: %02x %02x %02x (%02d %04d) : "
7821 "%.*s\n",
7822 opc1, opc2 << 1, opc3, opc1,
7823 (opc3 << 6) | (opc2 << 1),
7824 (int)(p - handler->oname),
7825 handler->oname);
7826 }
7827 if (strcmp(p + 1, q) != 0) {
7828 /* Second instruction */
7829 printf("INSN: %02x %02x %02x (%02d %04d) : "
7830 "%s\n",
7831 opc1, (opc2 << 1) | 1, opc3, opc1,
7832 (opc3 << 6) | (opc2 << 1) | 1,
7833 p + 1);
7834 }
7835 }
7836 }
7837 }
7838 } else {
7839 if (handler->handler != &gen_invalid) {
7840 printf("INSN: %02x %02x -- (%02d %04d) : %s\n",
7841 opc1, opc2, opc1, opc2, handler->oname);
7842 }
7843 }
7844 }
7845 } else {
7846 if (handler->handler != &gen_invalid) {
7847 printf("INSN: %02x -- -- (%02d ----) : %s\n",
7848 opc1, opc1, handler->oname);
7849 }
7850 }
7851 }
7852 }
7853 #endif
7854
7855 static int gdb_get_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7856 {
7857 if (n < 32) {
7858 stfq_p(mem_buf, env->fpr[n]);
7859 return 8;
7860 }
7861 if (n == 32) {
7862 stl_p(mem_buf, env->fpscr);
7863 return 4;
7864 }
7865 return 0;
7866 }
7867
7868 static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7869 {
7870 if (n < 32) {
7871 env->fpr[n] = ldfq_p(mem_buf);
7872 return 8;
7873 }
7874 if (n == 32) {
7875 /* FPSCR not implemented */
7876 return 4;
7877 }
7878 return 0;
7879 }
7880
7881 static int gdb_get_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7882 {
7883 if (n < 32) {
7884 #ifdef HOST_WORDS_BIGENDIAN
7885 stq_p(mem_buf, env->avr[n].u64[0]);
7886 stq_p(mem_buf+8, env->avr[n].u64[1]);
7887 #else
7888 stq_p(mem_buf, env->avr[n].u64[1]);
7889 stq_p(mem_buf+8, env->avr[n].u64[0]);
7890 #endif
7891 return 16;
7892 }
7893 if (n == 32) {
7894 stl_p(mem_buf, env->vscr);
7895 return 4;
7896 }
7897 if (n == 33) {
7898 stl_p(mem_buf, (uint32_t)env->spr[SPR_VRSAVE]);
7899 return 4;
7900 }
7901 return 0;
7902 }
7903
7904 static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7905 {
7906 if (n < 32) {
7907 #ifdef HOST_WORDS_BIGENDIAN
7908 env->avr[n].u64[0] = ldq_p(mem_buf);
7909 env->avr[n].u64[1] = ldq_p(mem_buf+8);
7910 #else
7911 env->avr[n].u64[1] = ldq_p(mem_buf);
7912 env->avr[n].u64[0] = ldq_p(mem_buf+8);
7913 #endif
7914 return 16;
7915 }
7916 if (n == 32) {
7917 env->vscr = ldl_p(mem_buf);
7918 return 4;
7919 }
7920 if (n == 33) {
7921 env->spr[SPR_VRSAVE] = (target_ulong)ldl_p(mem_buf);
7922 return 4;
7923 }
7924 return 0;
7925 }
7926
7927 static int gdb_get_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7928 {
7929 if (n < 32) {
7930 #if defined(TARGET_PPC64)
7931 stl_p(mem_buf, env->gpr[n] >> 32);
7932 #else
7933 stl_p(mem_buf, env->gprh[n]);
7934 #endif
7935 return 4;
7936 }
7937 if (n == 32) {
7938 stq_p(mem_buf, env->spe_acc);
7939 return 8;
7940 }
7941 if (n == 33) {
7942 stl_p(mem_buf, env->spe_fscr);
7943 return 4;
7944 }
7945 return 0;
7946 }
7947
7948 static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
7949 {
7950 if (n < 32) {
7951 #if defined(TARGET_PPC64)
7952 target_ulong lo = (uint32_t)env->gpr[n];
7953 target_ulong hi = (target_ulong)ldl_p(mem_buf) << 32;
7954 env->gpr[n] = lo | hi;
7955 #else
7956 env->gprh[n] = ldl_p(mem_buf);
7957 #endif
7958 return 4;
7959 }
7960 if (n == 32) {
7961 env->spe_acc = ldq_p(mem_buf);
7962 return 8;
7963 }
7964 if (n == 33) {
7965 env->spe_fscr = ldl_p(mem_buf);
7966 return 4;
7967 }
7968 return 0;
7969 }
7970
7971 static int ppc_fixup_cpu(PowerPCCPU *cpu)
7972 {
7973 CPUPPCState *env = &cpu->env;
7974
7975 /* TCG doesn't (yet) emulate some groups of instructions that
7976 * are implemented on some otherwise supported CPUs (e.g. VSX
7977 * and decimal floating point instructions on POWER7). We
7978 * remove unsupported instruction groups from the cpu state's
7979 * instruction masks and hope the guest can cope. For at
7980 * least the pseries machine, the unavailability of these
7981 * instructions can be advertised to the guest via the device
7982 * tree. */
7983 if ((env->insns_flags & ~PPC_TCG_INSNS)
7984 || (env->insns_flags2 & ~PPC_TCG_INSNS2)) {
7985 fprintf(stderr, "Warning: Disabling some instructions which are not "
7986 "emulated by TCG (0x%" PRIx64 ", 0x%" PRIx64 ")\n",
7987 env->insns_flags & ~PPC_TCG_INSNS,
7988 env->insns_flags2 & ~PPC_TCG_INSNS2);
7989 }
7990 env->insns_flags &= PPC_TCG_INSNS;
7991 env->insns_flags2 &= PPC_TCG_INSNS2;
7992 return 0;
7993 }
7994
7995 static void ppc_cpu_realizefn(DeviceState *dev, Error **errp)
7996 {
7997 PowerPCCPU *cpu = POWERPC_CPU(dev);
7998 CPUPPCState *env = &cpu->env;
7999 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8000 Error *local_err = NULL;
8001 #if !defined(CONFIG_USER_ONLY)
8002 int max_smt = kvm_enabled() ? kvmppc_smt_threads() : 1;
8003 #endif
8004
8005 #if !defined(CONFIG_USER_ONLY)
8006 if (smp_threads > max_smt) {
8007 error_setg(errp, "Cannot support more than %d threads on PPC with %s",
8008 max_smt, kvm_enabled() ? "KVM" : "TCG");
8009 return;
8010 }
8011 #endif
8012
8013 if (kvm_enabled()) {
8014 if (kvmppc_fixup_cpu(cpu) != 0) {
8015 error_setg(errp, "Unable to virtualize selected CPU with KVM");
8016 return;
8017 }
8018 } else {
8019 if (ppc_fixup_cpu(cpu) != 0) {
8020 error_setg(errp, "Unable to emulate selected CPU with TCG");
8021 return;
8022 }
8023 }
8024
8025 #if defined(TARGET_PPCEMB)
8026 if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
8027 error_setg(errp, "CPU does not possess a BookE MMU. "
8028 "Please use qemu-system-ppc or qemu-system-ppc64 instead "
8029 "or choose another CPU model.");
8030 return;
8031 }
8032 #endif
8033
8034 create_ppc_opcodes(cpu, &local_err);
8035 if (local_err != NULL) {
8036 error_propagate(errp, local_err);
8037 return;
8038 }
8039 init_ppc_proc(cpu);
8040
8041 if (pcc->insns_flags & PPC_FLOAT) {
8042 gdb_register_coprocessor(env, gdb_get_float_reg, gdb_set_float_reg,
8043 33, "power-fpu.xml", 0);
8044 }
8045 if (pcc->insns_flags & PPC_ALTIVEC) {
8046 gdb_register_coprocessor(env, gdb_get_avr_reg, gdb_set_avr_reg,
8047 34, "power-altivec.xml", 0);
8048 }
8049 if (pcc->insns_flags & PPC_SPE) {
8050 gdb_register_coprocessor(env, gdb_get_spe_reg, gdb_set_spe_reg,
8051 34, "power-spe.xml", 0);
8052 }
8053
8054 qemu_init_vcpu(env);
8055
8056 pcc->parent_realize(dev, errp);
8057
8058 #if defined(PPC_DUMP_CPU)
8059 {
8060 const char *mmu_model, *excp_model, *bus_model;
8061 switch (env->mmu_model) {
8062 case POWERPC_MMU_32B:
8063 mmu_model = "PowerPC 32";
8064 break;
8065 case POWERPC_MMU_SOFT_6xx:
8066 mmu_model = "PowerPC 6xx/7xx with software driven TLBs";
8067 break;
8068 case POWERPC_MMU_SOFT_74xx:
8069 mmu_model = "PowerPC 74xx with software driven TLBs";
8070 break;
8071 case POWERPC_MMU_SOFT_4xx:
8072 mmu_model = "PowerPC 4xx with software driven TLBs";
8073 break;
8074 case POWERPC_MMU_SOFT_4xx_Z:
8075 mmu_model = "PowerPC 4xx with software driven TLBs "
8076 "and zones protections";
8077 break;
8078 case POWERPC_MMU_REAL:
8079 mmu_model = "PowerPC real mode only";
8080 break;
8081 case POWERPC_MMU_MPC8xx:
8082 mmu_model = "PowerPC MPC8xx";
8083 break;
8084 case POWERPC_MMU_BOOKE:
8085 mmu_model = "PowerPC BookE";
8086 break;
8087 case POWERPC_MMU_BOOKE206:
8088 mmu_model = "PowerPC BookE 2.06";
8089 break;
8090 case POWERPC_MMU_601:
8091 mmu_model = "PowerPC 601";
8092 break;
8093 #if defined (TARGET_PPC64)
8094 case POWERPC_MMU_64B:
8095 mmu_model = "PowerPC 64";
8096 break;
8097 case POWERPC_MMU_620:
8098 mmu_model = "PowerPC 620";
8099 break;
8100 #endif
8101 default:
8102 mmu_model = "Unknown or invalid";
8103 break;
8104 }
8105 switch (env->excp_model) {
8106 case POWERPC_EXCP_STD:
8107 excp_model = "PowerPC";
8108 break;
8109 case POWERPC_EXCP_40x:
8110 excp_model = "PowerPC 40x";
8111 break;
8112 case POWERPC_EXCP_601:
8113 excp_model = "PowerPC 601";
8114 break;
8115 case POWERPC_EXCP_602:
8116 excp_model = "PowerPC 602";
8117 break;
8118 case POWERPC_EXCP_603:
8119 excp_model = "PowerPC 603";
8120 break;
8121 case POWERPC_EXCP_603E:
8122 excp_model = "PowerPC 603e";
8123 break;
8124 case POWERPC_EXCP_604:
8125 excp_model = "PowerPC 604";
8126 break;
8127 case POWERPC_EXCP_7x0:
8128 excp_model = "PowerPC 740/750";
8129 break;
8130 case POWERPC_EXCP_7x5:
8131 excp_model = "PowerPC 745/755";
8132 break;
8133 case POWERPC_EXCP_74xx:
8134 excp_model = "PowerPC 74xx";
8135 break;
8136 case POWERPC_EXCP_BOOKE:
8137 excp_model = "PowerPC BookE";
8138 break;
8139 #if defined (TARGET_PPC64)
8140 case POWERPC_EXCP_970:
8141 excp_model = "PowerPC 970";
8142 break;
8143 #endif
8144 default:
8145 excp_model = "Unknown or invalid";
8146 break;
8147 }
8148 switch (env->bus_model) {
8149 case PPC_FLAGS_INPUT_6xx:
8150 bus_model = "PowerPC 6xx";
8151 break;
8152 case PPC_FLAGS_INPUT_BookE:
8153 bus_model = "PowerPC BookE";
8154 break;
8155 case PPC_FLAGS_INPUT_405:
8156 bus_model = "PowerPC 405";
8157 break;
8158 case PPC_FLAGS_INPUT_401:
8159 bus_model = "PowerPC 401/403";
8160 break;
8161 case PPC_FLAGS_INPUT_RCPU:
8162 bus_model = "RCPU / MPC8xx";
8163 break;
8164 #if defined (TARGET_PPC64)
8165 case PPC_FLAGS_INPUT_970:
8166 bus_model = "PowerPC 970";
8167 break;
8168 #endif
8169 default:
8170 bus_model = "Unknown or invalid";
8171 break;
8172 }
8173 printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
8174 " MMU model : %s\n",
8175 pcc->name, pcc->pvr, pcc->msr_mask, mmu_model);
8176 #if !defined(CONFIG_USER_ONLY)
8177 if (env->tlb != NULL) {
8178 printf(" %d %s TLB in %d ways\n",
8179 env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
8180 env->nb_ways);
8181 }
8182 #endif
8183 printf(" Exceptions model : %s\n"
8184 " Bus model : %s\n",
8185 excp_model, bus_model);
8186 printf(" MSR features :\n");
8187 if (env->flags & POWERPC_FLAG_SPE)
8188 printf(" signal processing engine enable"
8189 "\n");
8190 else if (env->flags & POWERPC_FLAG_VRE)
8191 printf(" vector processor enable\n");
8192 if (env->flags & POWERPC_FLAG_TGPR)
8193 printf(" temporary GPRs\n");
8194 else if (env->flags & POWERPC_FLAG_CE)
8195 printf(" critical input enable\n");
8196 if (env->flags & POWERPC_FLAG_SE)
8197 printf(" single-step trace mode\n");
8198 else if (env->flags & POWERPC_FLAG_DWE)
8199 printf(" debug wait enable\n");
8200 else if (env->flags & POWERPC_FLAG_UBLE)
8201 printf(" user BTB lock enable\n");
8202 if (env->flags & POWERPC_FLAG_BE)
8203 printf(" branch-step trace mode\n");
8204 else if (env->flags & POWERPC_FLAG_DE)
8205 printf(" debug interrupt enable\n");
8206 if (env->flags & POWERPC_FLAG_PX)
8207 printf(" inclusive protection\n");
8208 else if (env->flags & POWERPC_FLAG_PMM)
8209 printf(" performance monitor mark\n");
8210 if (env->flags == POWERPC_FLAG_NONE)
8211 printf(" none\n");
8212 printf(" Time-base/decrementer clock source: %s\n",
8213 env->flags & POWERPC_FLAG_RTC_CLK ? "RTC clock" : "bus clock");
8214 }
8215 dump_ppc_insns(env);
8216 dump_ppc_sprs(env);
8217 fflush(stdout);
8218 #endif
8219 }
8220
8221 static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
8222 {
8223 ObjectClass *oc = (ObjectClass *)a;
8224 uint32_t pvr = *(uint32_t *)b;
8225 PowerPCCPUClass *pcc = (PowerPCCPUClass *)a;
8226
8227 /* -cpu host does a PVR lookup during construction */
8228 if (unlikely(strcmp(object_class_get_name(oc),
8229 TYPE_HOST_POWERPC_CPU) == 0)) {
8230 return -1;
8231 }
8232
8233 #if defined(TARGET_PPCEMB)
8234 if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
8235 return -1;
8236 }
8237 #endif
8238
8239 return pcc->pvr == pvr ? 0 : -1;
8240 }
8241
8242 PowerPCCPUClass *ppc_cpu_class_by_pvr(uint32_t pvr)
8243 {
8244 GSList *list, *item;
8245 PowerPCCPUClass *pcc = NULL;
8246
8247 list = object_class_get_list(TYPE_POWERPC_CPU, false);
8248 item = g_slist_find_custom(list, &pvr, ppc_cpu_compare_class_pvr);
8249 if (item != NULL) {
8250 pcc = POWERPC_CPU_CLASS(item->data);
8251 }
8252 g_slist_free(list);
8253
8254 return pcc;
8255 }
8256
8257 static gint ppc_cpu_compare_class_name(gconstpointer a, gconstpointer b)
8258 {
8259 ObjectClass *oc = (ObjectClass *)a;
8260 const char *name = b;
8261 #if defined(TARGET_PPCEMB)
8262 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8263 #endif
8264
8265 if (strncasecmp(name, object_class_get_name(oc), strlen(name)) == 0 &&
8266 #if defined(TARGET_PPCEMB)
8267 pcc->mmu_model == POWERPC_MMU_BOOKE &&
8268 #endif
8269 strcmp(object_class_get_name(oc) + strlen(name),
8270 "-" TYPE_POWERPC_CPU) == 0) {
8271 return 0;
8272 }
8273 return -1;
8274 }
8275
8276 #include <ctype.h>
8277
8278 static ObjectClass *ppc_cpu_class_by_name(const char *name)
8279 {
8280 GSList *list, *item;
8281 ObjectClass *ret = NULL;
8282 const char *p;
8283 int i, len;
8284
8285 if (strcasecmp(name, "host") == 0) {
8286 if (kvm_enabled()) {
8287 ret = object_class_by_name(TYPE_HOST_POWERPC_CPU);
8288 }
8289 return ret;
8290 }
8291
8292 /* Check if the given name is a PVR */
8293 len = strlen(name);
8294 if (len == 10 && name[0] == '0' && name[1] == 'x') {
8295 p = name + 2;
8296 goto check_pvr;
8297 } else if (len == 8) {
8298 p = name;
8299 check_pvr:
8300 for (i = 0; i < 8; i++) {
8301 if (!qemu_isxdigit(*p++))
8302 break;
8303 }
8304 if (i == 8) {
8305 ret = OBJECT_CLASS(ppc_cpu_class_by_pvr(strtoul(name, NULL, 16)));
8306 return ret;
8307 }
8308 }
8309
8310 for (i = 0; i < ARRAY_SIZE(ppc_cpu_aliases); i++) {
8311 if (strcmp(ppc_cpu_aliases[i].alias, name) == 0) {
8312 return ppc_cpu_class_by_name(ppc_cpu_aliases[i].model);
8313 }
8314 }
8315
8316 list = object_class_get_list(TYPE_POWERPC_CPU, false);
8317 item = g_slist_find_custom(list, name, ppc_cpu_compare_class_name);
8318 if (item != NULL) {
8319 ret = OBJECT_CLASS(item->data);
8320 }
8321 g_slist_free(list);
8322
8323 return ret;
8324 }
8325
8326 PowerPCCPU *cpu_ppc_init(const char *cpu_model)
8327 {
8328 PowerPCCPU *cpu;
8329 CPUPPCState *env;
8330 ObjectClass *oc;
8331 Error *err = NULL;
8332
8333 oc = ppc_cpu_class_by_name(cpu_model);
8334 if (oc == NULL) {
8335 return NULL;
8336 }
8337
8338 cpu = POWERPC_CPU(object_new(object_class_get_name(oc)));
8339 env = &cpu->env;
8340 env->cpu_model_str = cpu_model;
8341
8342 object_property_set_bool(OBJECT(cpu), true, "realized", &err);
8343 if (err != NULL) {
8344 fprintf(stderr, "%s\n", error_get_pretty(err));
8345 error_free(err);
8346 object_unref(OBJECT(cpu));
8347 return NULL;
8348 }
8349
8350 return cpu;
8351 }
8352
8353 /* Sort by PVR, ordering special case "host" last. */
8354 static gint ppc_cpu_list_compare(gconstpointer a, gconstpointer b)
8355 {
8356 ObjectClass *oc_a = (ObjectClass *)a;
8357 ObjectClass *oc_b = (ObjectClass *)b;
8358 PowerPCCPUClass *pcc_a = POWERPC_CPU_CLASS(oc_a);
8359 PowerPCCPUClass *pcc_b = POWERPC_CPU_CLASS(oc_b);
8360 const char *name_a = object_class_get_name(oc_a);
8361 const char *name_b = object_class_get_name(oc_b);
8362
8363 if (strcmp(name_a, TYPE_HOST_POWERPC_CPU) == 0) {
8364 return 1;
8365 } else if (strcmp(name_b, TYPE_HOST_POWERPC_CPU) == 0) {
8366 return -1;
8367 } else {
8368 /* Avoid an integer overflow during subtraction */
8369 if (pcc_a->pvr < pcc_b->pvr) {
8370 return -1;
8371 } else if (pcc_a->pvr > pcc_b->pvr) {
8372 return 1;
8373 } else {
8374 return 0;
8375 }
8376 }
8377 }
8378
8379 static void ppc_cpu_list_entry(gpointer data, gpointer user_data)
8380 {
8381 ObjectClass *oc = data;
8382 CPUListState *s = user_data;
8383 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8384 const char *typename = object_class_get_name(oc);
8385 char *name;
8386
8387 #if defined(TARGET_PPCEMB)
8388 if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
8389 return;
8390 }
8391 #endif
8392
8393 name = g_strndup(typename,
8394 strlen(typename) - strlen("-" TYPE_POWERPC_CPU));
8395 (*s->cpu_fprintf)(s->file, "PowerPC %-16s PVR %08x\n",
8396 name, pcc->pvr);
8397 g_free(name);
8398 }
8399
8400 void ppc_cpu_list(FILE *f, fprintf_function cpu_fprintf)
8401 {
8402 CPUListState s = {
8403 .file = f,
8404 .cpu_fprintf = cpu_fprintf,
8405 };
8406 GSList *list;
8407 int i;
8408
8409 list = object_class_get_list(TYPE_POWERPC_CPU, false);
8410 list = g_slist_sort(list, ppc_cpu_list_compare);
8411 g_slist_foreach(list, ppc_cpu_list_entry, &s);
8412 g_slist_free(list);
8413
8414 cpu_fprintf(f, "\n");
8415 for (i = 0; i < ARRAY_SIZE(ppc_cpu_aliases); i++) {
8416 ObjectClass *oc = ppc_cpu_class_by_name(ppc_cpu_aliases[i].model);
8417 if (oc == NULL) {
8418 /* Hide aliases that point to a TODO or TODO_USER_ONLY model */
8419 continue;
8420 }
8421 cpu_fprintf(f, "PowerPC %-16s\n",
8422 ppc_cpu_aliases[i].alias);
8423 }
8424 }
8425
8426 static void ppc_cpu_defs_entry(gpointer data, gpointer user_data)
8427 {
8428 ObjectClass *oc = data;
8429 CpuDefinitionInfoList **first = user_data;
8430 const char *typename;
8431 CpuDefinitionInfoList *entry;
8432 CpuDefinitionInfo *info;
8433 #if defined(TARGET_PPCEMB)
8434 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8435
8436 if (pcc->mmu_model != POWERPC_MMU_BOOKE) {
8437 return;
8438 }
8439 #endif
8440
8441 typename = object_class_get_name(oc);
8442 info = g_malloc0(sizeof(*info));
8443 info->name = g_strndup(typename,
8444 strlen(typename) - strlen("-" TYPE_POWERPC_CPU));
8445
8446 entry = g_malloc0(sizeof(*entry));
8447 entry->value = info;
8448 entry->next = *first;
8449 *first = entry;
8450 }
8451
8452 CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
8453 {
8454 CpuDefinitionInfoList *cpu_list = NULL;
8455 GSList *list;
8456
8457 list = object_class_get_list(TYPE_POWERPC_CPU, false);
8458 g_slist_foreach(list, ppc_cpu_defs_entry, &cpu_list);
8459 g_slist_free(list);
8460
8461 return cpu_list;
8462 }
8463
8464 /* CPUClass::reset() */
8465 static void ppc_cpu_reset(CPUState *s)
8466 {
8467 PowerPCCPU *cpu = POWERPC_CPU(s);
8468 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8469 CPUPPCState *env = &cpu->env;
8470 target_ulong msr;
8471
8472 if (qemu_loglevel_mask(CPU_LOG_RESET)) {
8473 qemu_log("CPU Reset (CPU %d)\n", s->cpu_index);
8474 log_cpu_state(env, 0);
8475 }
8476
8477 pcc->parent_reset(s);
8478
8479 msr = (target_ulong)0;
8480 if (0) {
8481 /* XXX: find a suitable condition to enable the hypervisor mode */
8482 msr |= (target_ulong)MSR_HVB;
8483 }
8484 msr |= (target_ulong)0 << MSR_AP; /* TO BE CHECKED */
8485 msr |= (target_ulong)0 << MSR_SA; /* TO BE CHECKED */
8486 msr |= (target_ulong)1 << MSR_EP;
8487 #if defined(DO_SINGLE_STEP) && 0
8488 /* Single step trace mode */
8489 msr |= (target_ulong)1 << MSR_SE;
8490 msr |= (target_ulong)1 << MSR_BE;
8491 #endif
8492 #if defined(CONFIG_USER_ONLY)
8493 msr |= (target_ulong)1 << MSR_FP; /* Allow floating point usage */
8494 msr |= (target_ulong)1 << MSR_VR; /* Allow altivec usage */
8495 msr |= (target_ulong)1 << MSR_SPE; /* Allow SPE usage */
8496 msr |= (target_ulong)1 << MSR_PR;
8497 #else
8498 env->excp_prefix = env->hreset_excp_prefix;
8499 env->nip = env->hreset_vector | env->excp_prefix;
8500 if (env->mmu_model != POWERPC_MMU_REAL) {
8501 ppc_tlb_invalidate_all(env);
8502 }
8503 #endif
8504 env->msr = msr & env->msr_mask;
8505 #if defined(TARGET_PPC64)
8506 if (env->mmu_model & POWERPC_MMU_64) {
8507 env->msr |= (1ULL << MSR_SF);
8508 }
8509 #endif
8510 hreg_compute_hflags(env);
8511 env->reserve_addr = (target_ulong)-1ULL;
8512 /* Be sure no exception or interrupt is pending */
8513 env->pending_interrupts = 0;
8514 env->exception_index = POWERPC_EXCP_NONE;
8515 env->error_code = 0;
8516
8517 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
8518 env->vpa_addr = 0;
8519 env->slb_shadow_addr = 0;
8520 env->slb_shadow_size = 0;
8521 env->dtl_addr = 0;
8522 env->dtl_size = 0;
8523 #endif /* TARGET_PPC64 */
8524
8525 /* Flush all TLBs */
8526 tlb_flush(env, 1);
8527 }
8528
8529 static void ppc_cpu_initfn(Object *obj)
8530 {
8531 CPUState *cs = CPU(obj);
8532 PowerPCCPU *cpu = POWERPC_CPU(obj);
8533 PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
8534 CPUPPCState *env = &cpu->env;
8535
8536 cs->env_ptr = env;
8537 cpu_exec_init(env);
8538
8539 env->msr_mask = pcc->msr_mask;
8540 env->mmu_model = pcc->mmu_model;
8541 env->excp_model = pcc->excp_model;
8542 env->bus_model = pcc->bus_model;
8543 env->insns_flags = pcc->insns_flags;
8544 env->insns_flags2 = pcc->insns_flags2;
8545 env->flags = pcc->flags;
8546 env->bfd_mach = pcc->bfd_mach;
8547 env->check_pow = pcc->check_pow;
8548
8549 #if defined(TARGET_PPC64)
8550 if (pcc->sps) {
8551 env->sps = *pcc->sps;
8552 } else if (env->mmu_model & POWERPC_MMU_64) {
8553 /* Use default sets of page sizes */
8554 static const struct ppc_segment_page_sizes defsps = {
8555 .sps = {
8556 { .page_shift = 12, /* 4K */
8557 .slb_enc = 0,
8558 .enc = { { .page_shift = 12, .pte_enc = 0 } }
8559 },
8560 { .page_shift = 24, /* 16M */
8561 .slb_enc = 0x100,
8562 .enc = { { .page_shift = 24, .pte_enc = 0 } }
8563 },
8564 },
8565 };
8566 env->sps = defsps;
8567 }
8568 #endif /* defined(TARGET_PPC64) */
8569
8570 if (tcg_enabled()) {
8571 ppc_translate_init();
8572 }
8573 }
8574
8575 static void ppc_cpu_class_init(ObjectClass *oc, void *data)
8576 {
8577 PowerPCCPUClass *pcc = POWERPC_CPU_CLASS(oc);
8578 CPUClass *cc = CPU_CLASS(oc);
8579 DeviceClass *dc = DEVICE_CLASS(oc);
8580
8581 pcc->parent_realize = dc->realize;
8582 dc->realize = ppc_cpu_realizefn;
8583
8584 pcc->parent_reset = cc->reset;
8585 cc->reset = ppc_cpu_reset;
8586
8587 cc->class_by_name = ppc_cpu_class_by_name;
8588 }
8589
8590 static const TypeInfo ppc_cpu_type_info = {
8591 .name = TYPE_POWERPC_CPU,
8592 .parent = TYPE_CPU,
8593 .instance_size = sizeof(PowerPCCPU),
8594 .instance_init = ppc_cpu_initfn,
8595 .abstract = true,
8596 .class_size = sizeof(PowerPCCPUClass),
8597 .class_init = ppc_cpu_class_init,
8598 };
8599
8600 static void ppc_cpu_register_types(void)
8601 {
8602 type_register_static(&ppc_cpu_type_info);
8603 }
8604
8605 type_init(ppc_cpu_register_types)