SD card emulation (initial implementation by Andrzei Zaborowski).
[qemu/mini2440.git] / target-ppc / translate_init.c
blobd5626316c9c2ee57a9b4a9cd4608fd2dd492f567
1 /*
2 * PowerPC CPU initialization for qemu.
3 *
4 * Copyright (c) 2003-2007 Jocelyn Mayer
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 /* A lot of PowerPC definition have been included here.
22 * Most of them are not usable for now but have been kept
23 * inside "#if defined(TODO) ... #endif" statements to make tests easier.
26 //#define PPC_DUMP_CPU
27 //#define PPC_DEBUG_SPR
29 struct ppc_def_t {
30 const unsigned char *name;
31 uint32_t pvr;
32 uint32_t pvr_mask;
33 uint64_t insns_flags;
34 uint32_t flags;
35 uint64_t msr_mask;
38 /* Generic callbacks:
39 * do nothing but store/retrieve spr value
41 static void spr_read_generic (void *opaque, int sprn)
43 gen_op_load_spr(sprn);
46 static void spr_write_generic (void *opaque, int sprn)
48 gen_op_store_spr(sprn);
51 /* SPR common to all PowerPC */
52 /* XER */
53 static void spr_read_xer (void *opaque, int sprn)
55 gen_op_load_xer();
58 static void spr_write_xer (void *opaque, int sprn)
60 gen_op_store_xer();
63 /* LR */
64 static void spr_read_lr (void *opaque, int sprn)
66 gen_op_load_lr();
69 static void spr_write_lr (void *opaque, int sprn)
71 gen_op_store_lr();
74 /* CTR */
75 static void spr_read_ctr (void *opaque, int sprn)
77 gen_op_load_ctr();
80 static void spr_write_ctr (void *opaque, int sprn)
82 gen_op_store_ctr();
85 /* User read access to SPR */
86 /* USPRx */
87 /* UMMCRx */
88 /* UPMCx */
89 /* USIA */
90 /* UDECR */
91 static void spr_read_ureg (void *opaque, int sprn)
93 gen_op_load_spr(sprn + 0x10);
96 /* SPR common to all non-embedded PowerPC */
97 /* DECR */
98 #if !defined(CONFIG_USER_ONLY)
99 static void spr_read_decr (void *opaque, int sprn)
101 gen_op_load_decr();
104 static void spr_write_decr (void *opaque, int sprn)
106 gen_op_store_decr();
108 #endif
110 /* SPR common to all non-embedded PowerPC, except 601 */
111 /* Time base */
112 static void spr_read_tbl (void *opaque, int sprn)
114 gen_op_load_tbl();
117 static void spr_read_tbu (void *opaque, int sprn)
119 gen_op_load_tbu();
122 #if !defined(CONFIG_USER_ONLY)
123 static void spr_write_tbl (void *opaque, int sprn)
125 gen_op_store_tbl();
128 static void spr_write_tbu (void *opaque, int sprn)
130 gen_op_store_tbu();
132 #endif
134 #if !defined(CONFIG_USER_ONLY)
135 /* IBAT0U...IBAT0U */
136 /* IBAT0L...IBAT7L */
137 static void spr_read_ibat (void *opaque, int sprn)
139 gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
142 static void spr_read_ibat_h (void *opaque, int sprn)
144 gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);
147 static void spr_write_ibatu (void *opaque, int sprn)
149 DisasContext *ctx = opaque;
151 gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);
152 RET_STOP(ctx);
155 static void spr_write_ibatu_h (void *opaque, int sprn)
157 DisasContext *ctx = opaque;
159 gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);
160 RET_STOP(ctx);
163 static void spr_write_ibatl (void *opaque, int sprn)
165 DisasContext *ctx = opaque;
167 gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);
168 RET_STOP(ctx);
171 static void spr_write_ibatl_h (void *opaque, int sprn)
173 DisasContext *ctx = opaque;
175 gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);
176 RET_STOP(ctx);
179 /* DBAT0U...DBAT7U */
180 /* DBAT0L...DBAT7L */
181 static void spr_read_dbat (void *opaque, int sprn)
183 gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);
186 static void spr_read_dbat_h (void *opaque, int sprn)
188 gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);
191 static void spr_write_dbatu (void *opaque, int sprn)
193 DisasContext *ctx = opaque;
195 gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);
196 RET_STOP(ctx);
199 static void spr_write_dbatu_h (void *opaque, int sprn)
201 DisasContext *ctx = opaque;
203 gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);
204 RET_STOP(ctx);
207 static void spr_write_dbatl (void *opaque, int sprn)
209 DisasContext *ctx = opaque;
211 gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);
212 RET_STOP(ctx);
215 static void spr_write_dbatl_h (void *opaque, int sprn)
217 DisasContext *ctx = opaque;
219 gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);
220 RET_STOP(ctx);
223 /* SDR1 */
224 static void spr_read_sdr1 (void *opaque, int sprn)
226 gen_op_load_sdr1();
229 static void spr_write_sdr1 (void *opaque, int sprn)
231 DisasContext *ctx = opaque;
233 gen_op_store_sdr1();
234 RET_STOP(ctx);
237 /* 64 bits PowerPC specific SPRs */
238 /* ASR */
239 #if defined(TARGET_PPC64)
240 static void spr_read_asr (void *opaque, int sprn)
242 gen_op_load_asr();
245 static void spr_write_asr (void *opaque, int sprn)
247 DisasContext *ctx = opaque;
249 gen_op_store_asr();
250 RET_STOP(ctx);
252 #endif
253 #endif /* !defined(CONFIG_USER_ONLY) */
255 /* PowerPC 601 specific registers */
256 /* RTC */
257 static void spr_read_601_rtcl (void *opaque, int sprn)
259 gen_op_load_601_rtcl();
262 static void spr_read_601_rtcu (void *opaque, int sprn)
264 gen_op_load_601_rtcu();
267 #if !defined(CONFIG_USER_ONLY)
268 static void spr_write_601_rtcu (void *opaque, int sprn)
270 gen_op_store_601_rtcu();
273 static void spr_write_601_rtcl (void *opaque, int sprn)
275 gen_op_store_601_rtcl();
277 #endif
279 /* Unified bats */
280 #if !defined(CONFIG_USER_ONLY)
281 static void spr_read_601_ubat (void *opaque, int sprn)
283 gen_op_load_601_bat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
286 static void spr_write_601_ubatu (void *opaque, int sprn)
288 DisasContext *ctx = opaque;
290 gen_op_store_601_batu((sprn - SPR_IBAT0U) / 2);
291 RET_STOP(ctx);
294 static void spr_write_601_ubatl (void *opaque, int sprn)
296 DisasContext *ctx = opaque;
298 gen_op_store_601_batl((sprn - SPR_IBAT0L) / 2);
299 RET_STOP(ctx);
301 #endif
303 /* PowerPC 40x specific registers */
304 #if !defined(CONFIG_USER_ONLY)
305 static void spr_read_40x_pit (void *opaque, int sprn)
307 gen_op_load_40x_pit();
310 static void spr_write_40x_pit (void *opaque, int sprn)
312 gen_op_store_40x_pit();
315 static void spr_write_booke_tcr (void *opaque, int sprn)
317 gen_op_store_booke_tcr();
320 static void spr_write_booke_tsr (void *opaque, int sprn)
322 gen_op_store_booke_tsr();
324 #endif
326 /* PowerPC 403 specific registers */
327 /* PBL1 / PBU1 / PBL2 / PBU2 */
328 #if !defined(CONFIG_USER_ONLY)
329 static void spr_read_403_pbr (void *opaque, int sprn)
331 gen_op_load_403_pb(sprn - SPR_403_PBL1);
334 static void spr_write_403_pbr (void *opaque, int sprn)
336 DisasContext *ctx = opaque;
338 gen_op_store_403_pb(sprn - SPR_403_PBL1);
339 RET_STOP(ctx);
342 static void spr_write_pir (void *opaque, int sprn)
344 gen_op_store_pir();
346 #endif
348 #if defined(CONFIG_USER_ONLY)
349 #define spr_register(env, num, name, uea_read, uea_write, \
350 oea_read, oea_write, initial_value) \
351 do { \
352 _spr_register(env, num, name, uea_read, uea_write, initial_value); \
353 } while (0)
354 static inline void _spr_register (CPUPPCState *env, int num,
355 const unsigned char *name,
356 void (*uea_read)(void *opaque, int sprn),
357 void (*uea_write)(void *opaque, int sprn),
358 target_ulong initial_value)
359 #else
360 static inline void spr_register (CPUPPCState *env, int num,
361 const unsigned char *name,
362 void (*uea_read)(void *opaque, int sprn),
363 void (*uea_write)(void *opaque, int sprn),
364 void (*oea_read)(void *opaque, int sprn),
365 void (*oea_write)(void *opaque, int sprn),
366 target_ulong initial_value)
367 #endif
369 ppc_spr_t *spr;
371 spr = &env->spr_cb[num];
372 if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
373 #if !defined(CONFIG_USER_ONLY)
374 spr->oea_read != NULL || spr->oea_write != NULL ||
375 #endif
376 spr->uea_read != NULL || spr->uea_write != NULL) {
377 printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
378 exit(1);
380 #if defined(PPC_DEBUG_SPR)
381 printf("*** register spr %d (%03x) %s val " ADDRX "\n", num, num, name,
382 initial_value);
383 #endif
384 spr->name = name;
385 spr->uea_read = uea_read;
386 spr->uea_write = uea_write;
387 #if !defined(CONFIG_USER_ONLY)
388 spr->oea_read = oea_read;
389 spr->oea_write = oea_write;
390 #endif
391 env->spr[num] = initial_value;
394 /* Generic PowerPC SPRs */
395 static void gen_spr_generic (CPUPPCState *env)
397 /* Integer processing */
398 spr_register(env, SPR_XER, "XER",
399 &spr_read_xer, &spr_write_xer,
400 &spr_read_xer, &spr_write_xer,
401 0x00000000);
402 /* Branch contol */
403 spr_register(env, SPR_LR, "LR",
404 &spr_read_lr, &spr_write_lr,
405 &spr_read_lr, &spr_write_lr,
406 0x00000000);
407 spr_register(env, SPR_CTR, "CTR",
408 &spr_read_ctr, &spr_write_ctr,
409 &spr_read_ctr, &spr_write_ctr,
410 0x00000000);
411 /* Interrupt processing */
412 spr_register(env, SPR_SRR0, "SRR0",
413 SPR_NOACCESS, SPR_NOACCESS,
414 &spr_read_generic, &spr_write_generic,
415 0x00000000);
416 spr_register(env, SPR_SRR1, "SRR1",
417 SPR_NOACCESS, SPR_NOACCESS,
418 &spr_read_generic, &spr_write_generic,
419 0x00000000);
420 /* Processor control */
421 spr_register(env, SPR_SPRG0, "SPRG0",
422 SPR_NOACCESS, SPR_NOACCESS,
423 &spr_read_generic, &spr_write_generic,
424 0x00000000);
425 spr_register(env, SPR_SPRG1, "SPRG1",
426 SPR_NOACCESS, SPR_NOACCESS,
427 &spr_read_generic, &spr_write_generic,
428 0x00000000);
429 spr_register(env, SPR_SPRG2, "SPRG2",
430 SPR_NOACCESS, SPR_NOACCESS,
431 &spr_read_generic, &spr_write_generic,
432 0x00000000);
433 spr_register(env, SPR_SPRG3, "SPRG3",
434 SPR_NOACCESS, SPR_NOACCESS,
435 &spr_read_generic, &spr_write_generic,
436 0x00000000);
439 /* SPR common to all non-embedded PowerPC, including 601 */
440 static void gen_spr_ne_601 (CPUPPCState *env)
442 /* Exception processing */
443 spr_register(env, SPR_DSISR, "DSISR",
444 SPR_NOACCESS, SPR_NOACCESS,
445 &spr_read_generic, &spr_write_generic,
446 0x00000000);
447 spr_register(env, SPR_DAR, "DAR",
448 SPR_NOACCESS, SPR_NOACCESS,
449 &spr_read_generic, &spr_write_generic,
450 0x00000000);
451 /* Timer */
452 spr_register(env, SPR_DECR, "DECR",
453 SPR_NOACCESS, SPR_NOACCESS,
454 &spr_read_decr, &spr_write_decr,
455 0x00000000);
456 /* Memory management */
457 spr_register(env, SPR_SDR1, "SDR1",
458 SPR_NOACCESS, SPR_NOACCESS,
459 &spr_read_sdr1, &spr_write_sdr1,
460 0x00000000);
463 /* BATs 0-3 */
464 static void gen_low_BATs (CPUPPCState *env)
466 spr_register(env, SPR_IBAT0U, "IBAT0U",
467 SPR_NOACCESS, SPR_NOACCESS,
468 &spr_read_ibat, &spr_write_ibatu,
469 0x00000000);
470 spr_register(env, SPR_IBAT0L, "IBAT0L",
471 SPR_NOACCESS, SPR_NOACCESS,
472 &spr_read_ibat, &spr_write_ibatl,
473 0x00000000);
474 spr_register(env, SPR_IBAT1U, "IBAT1U",
475 SPR_NOACCESS, SPR_NOACCESS,
476 &spr_read_ibat, &spr_write_ibatu,
477 0x00000000);
478 spr_register(env, SPR_IBAT1L, "IBAT1L",
479 SPR_NOACCESS, SPR_NOACCESS,
480 &spr_read_ibat, &spr_write_ibatl,
481 0x00000000);
482 spr_register(env, SPR_IBAT2U, "IBAT2U",
483 SPR_NOACCESS, SPR_NOACCESS,
484 &spr_read_ibat, &spr_write_ibatu,
485 0x00000000);
486 spr_register(env, SPR_IBAT2L, "IBAT2L",
487 SPR_NOACCESS, SPR_NOACCESS,
488 &spr_read_ibat, &spr_write_ibatl,
489 0x00000000);
490 spr_register(env, SPR_IBAT3U, "IBAT3U",
491 SPR_NOACCESS, SPR_NOACCESS,
492 &spr_read_ibat, &spr_write_ibatu,
493 0x00000000);
494 spr_register(env, SPR_IBAT3L, "IBAT3L",
495 SPR_NOACCESS, SPR_NOACCESS,
496 &spr_read_ibat, &spr_write_ibatl,
497 0x00000000);
498 spr_register(env, SPR_DBAT0U, "DBAT0U",
499 SPR_NOACCESS, SPR_NOACCESS,
500 &spr_read_dbat, &spr_write_dbatu,
501 0x00000000);
502 spr_register(env, SPR_DBAT0L, "DBAT0L",
503 SPR_NOACCESS, SPR_NOACCESS,
504 &spr_read_dbat, &spr_write_dbatl,
505 0x00000000);
506 spr_register(env, SPR_DBAT1U, "DBAT1U",
507 SPR_NOACCESS, SPR_NOACCESS,
508 &spr_read_dbat, &spr_write_dbatu,
509 0x00000000);
510 spr_register(env, SPR_DBAT1L, "DBAT1L",
511 SPR_NOACCESS, SPR_NOACCESS,
512 &spr_read_dbat, &spr_write_dbatl,
513 0x00000000);
514 spr_register(env, SPR_DBAT2U, "DBAT2U",
515 SPR_NOACCESS, SPR_NOACCESS,
516 &spr_read_dbat, &spr_write_dbatu,
517 0x00000000);
518 spr_register(env, SPR_DBAT2L, "DBAT2L",
519 SPR_NOACCESS, SPR_NOACCESS,
520 &spr_read_dbat, &spr_write_dbatl,
521 0x00000000);
522 spr_register(env, SPR_DBAT3U, "DBAT3U",
523 SPR_NOACCESS, SPR_NOACCESS,
524 &spr_read_dbat, &spr_write_dbatu,
525 0x00000000);
526 spr_register(env, SPR_DBAT3L, "DBAT3L",
527 SPR_NOACCESS, SPR_NOACCESS,
528 &spr_read_dbat, &spr_write_dbatl,
529 0x00000000);
530 env->nb_BATs = 4;
533 /* BATs 4-7 */
534 static void gen_high_BATs (CPUPPCState *env)
536 spr_register(env, SPR_IBAT4U, "IBAT4U",
537 SPR_NOACCESS, SPR_NOACCESS,
538 &spr_read_ibat_h, &spr_write_ibatu_h,
539 0x00000000);
540 spr_register(env, SPR_IBAT4L, "IBAT4L",
541 SPR_NOACCESS, SPR_NOACCESS,
542 &spr_read_ibat_h, &spr_write_ibatl_h,
543 0x00000000);
544 spr_register(env, SPR_IBAT5U, "IBAT5U",
545 SPR_NOACCESS, SPR_NOACCESS,
546 &spr_read_ibat_h, &spr_write_ibatu_h,
547 0x00000000);
548 spr_register(env, SPR_IBAT5L, "IBAT5L",
549 SPR_NOACCESS, SPR_NOACCESS,
550 &spr_read_ibat_h, &spr_write_ibatl_h,
551 0x00000000);
552 spr_register(env, SPR_IBAT6U, "IBAT6U",
553 SPR_NOACCESS, SPR_NOACCESS,
554 &spr_read_ibat_h, &spr_write_ibatu_h,
555 0x00000000);
556 spr_register(env, SPR_IBAT6L, "IBAT6L",
557 SPR_NOACCESS, SPR_NOACCESS,
558 &spr_read_ibat_h, &spr_write_ibatl_h,
559 0x00000000);
560 spr_register(env, SPR_IBAT7U, "IBAT7U",
561 SPR_NOACCESS, SPR_NOACCESS,
562 &spr_read_ibat_h, &spr_write_ibatu_h,
563 0x00000000);
564 spr_register(env, SPR_IBAT7L, "IBAT7L",
565 SPR_NOACCESS, SPR_NOACCESS,
566 &spr_read_ibat_h, &spr_write_ibatl_h,
567 0x00000000);
568 spr_register(env, SPR_DBAT4U, "DBAT4U",
569 SPR_NOACCESS, SPR_NOACCESS,
570 &spr_read_dbat_h, &spr_write_dbatu_h,
571 0x00000000);
572 spr_register(env, SPR_DBAT4L, "DBAT4L",
573 SPR_NOACCESS, SPR_NOACCESS,
574 &spr_read_dbat_h, &spr_write_dbatl_h,
575 0x00000000);
576 spr_register(env, SPR_DBAT5U, "DBAT5U",
577 SPR_NOACCESS, SPR_NOACCESS,
578 &spr_read_dbat_h, &spr_write_dbatu_h,
579 0x00000000);
580 spr_register(env, SPR_DBAT5L, "DBAT5L",
581 SPR_NOACCESS, SPR_NOACCESS,
582 &spr_read_dbat_h, &spr_write_dbatl_h,
583 0x00000000);
584 spr_register(env, SPR_DBAT6U, "DBAT6U",
585 SPR_NOACCESS, SPR_NOACCESS,
586 &spr_read_dbat_h, &spr_write_dbatu_h,
587 0x00000000);
588 spr_register(env, SPR_DBAT6L, "DBAT6L",
589 SPR_NOACCESS, SPR_NOACCESS,
590 &spr_read_dbat_h, &spr_write_dbatl_h,
591 0x00000000);
592 spr_register(env, SPR_DBAT7U, "DBAT7U",
593 SPR_NOACCESS, SPR_NOACCESS,
594 &spr_read_dbat_h, &spr_write_dbatu_h,
595 0x00000000);
596 spr_register(env, SPR_DBAT7L, "DBAT7L",
597 SPR_NOACCESS, SPR_NOACCESS,
598 &spr_read_dbat_h, &spr_write_dbatl_h,
599 0x00000000);
600 env->nb_BATs = 8;
603 /* Generic PowerPC time base */
604 static void gen_tbl (CPUPPCState *env)
606 spr_register(env, SPR_VTBL, "TBL",
607 &spr_read_tbl, SPR_NOACCESS,
608 &spr_read_tbl, SPR_NOACCESS,
609 0x00000000);
610 spr_register(env, SPR_TBL, "TBL",
611 SPR_NOACCESS, SPR_NOACCESS,
612 SPR_NOACCESS, &spr_write_tbl,
613 0x00000000);
614 spr_register(env, SPR_VTBU, "TBU",
615 &spr_read_tbu, SPR_NOACCESS,
616 &spr_read_tbu, SPR_NOACCESS,
617 0x00000000);
618 spr_register(env, SPR_TBU, "TBU",
619 SPR_NOACCESS, SPR_NOACCESS,
620 SPR_NOACCESS, &spr_write_tbu,
621 0x00000000);
624 /* Softare table search registers */
625 static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
627 env->nb_tlb = nb_tlbs;
628 env->nb_ways = nb_ways;
629 env->id_tlbs = 1;
630 spr_register(env, SPR_DMISS, "DMISS",
631 SPR_NOACCESS, SPR_NOACCESS,
632 &spr_read_generic, SPR_NOACCESS,
633 0x00000000);
634 spr_register(env, SPR_DCMP, "DCMP",
635 SPR_NOACCESS, SPR_NOACCESS,
636 &spr_read_generic, SPR_NOACCESS,
637 0x00000000);
638 spr_register(env, SPR_HASH1, "HASH1",
639 SPR_NOACCESS, SPR_NOACCESS,
640 &spr_read_generic, SPR_NOACCESS,
641 0x00000000);
642 spr_register(env, SPR_HASH2, "HASH2",
643 SPR_NOACCESS, SPR_NOACCESS,
644 &spr_read_generic, SPR_NOACCESS,
645 0x00000000);
646 spr_register(env, SPR_IMISS, "IMISS",
647 SPR_NOACCESS, SPR_NOACCESS,
648 &spr_read_generic, SPR_NOACCESS,
649 0x00000000);
650 spr_register(env, SPR_ICMP, "ICMP",
651 SPR_NOACCESS, SPR_NOACCESS,
652 &spr_read_generic, SPR_NOACCESS,
653 0x00000000);
654 spr_register(env, SPR_RPA, "RPA",
655 SPR_NOACCESS, SPR_NOACCESS,
656 &spr_read_generic, &spr_write_generic,
657 0x00000000);
660 /* SPR common to MPC755 and G2 */
661 static void gen_spr_G2_755 (CPUPPCState *env)
663 /* SGPRs */
664 spr_register(env, SPR_SPRG4, "SPRG4",
665 SPR_NOACCESS, SPR_NOACCESS,
666 &spr_read_generic, &spr_write_generic,
667 0x00000000);
668 spr_register(env, SPR_SPRG5, "SPRG5",
669 SPR_NOACCESS, SPR_NOACCESS,
670 &spr_read_generic, &spr_write_generic,
671 0x00000000);
672 spr_register(env, SPR_SPRG6, "SPRG6",
673 SPR_NOACCESS, SPR_NOACCESS,
674 &spr_read_generic, &spr_write_generic,
675 0x00000000);
676 spr_register(env, SPR_SPRG7, "SPRG7",
677 SPR_NOACCESS, SPR_NOACCESS,
678 &spr_read_generic, &spr_write_generic,
679 0x00000000);
680 /* External access control */
681 /* XXX : not implemented */
682 spr_register(env, SPR_EAR, "EAR",
683 SPR_NOACCESS, SPR_NOACCESS,
684 &spr_read_generic, &spr_write_generic,
685 0x00000000);
688 /* SPR common to all 7xx PowerPC implementations */
689 static void gen_spr_7xx (CPUPPCState *env)
691 /* Breakpoints */
692 /* XXX : not implemented */
693 spr_register(env, SPR_DABR, "DABR",
694 SPR_NOACCESS, SPR_NOACCESS,
695 &spr_read_generic, &spr_write_generic,
696 0x00000000);
697 /* XXX : not implemented */
698 spr_register(env, SPR_IABR, "IABR",
699 SPR_NOACCESS, SPR_NOACCESS,
700 &spr_read_generic, &spr_write_generic,
701 0x00000000);
702 /* Cache management */
703 /* XXX : not implemented */
704 spr_register(env, SPR_ICTC, "ICTC",
705 SPR_NOACCESS, SPR_NOACCESS,
706 &spr_read_generic, &spr_write_generic,
707 0x00000000);
708 /* XXX : not implemented */
709 spr_register(env, SPR_L2CR, "L2CR",
710 SPR_NOACCESS, SPR_NOACCESS,
711 &spr_read_generic, &spr_write_generic,
712 0x00000000);
713 /* Performance monitors */
714 /* XXX : not implemented */
715 spr_register(env, SPR_MMCR0, "MMCR0",
716 SPR_NOACCESS, SPR_NOACCESS,
717 &spr_read_generic, &spr_write_generic,
718 0x00000000);
719 /* XXX : not implemented */
720 spr_register(env, SPR_MMCR1, "MMCR1",
721 SPR_NOACCESS, SPR_NOACCESS,
722 &spr_read_generic, &spr_write_generic,
723 0x00000000);
724 /* XXX : not implemented */
725 spr_register(env, SPR_PMC1, "PMC1",
726 SPR_NOACCESS, SPR_NOACCESS,
727 &spr_read_generic, &spr_write_generic,
728 0x00000000);
729 /* XXX : not implemented */
730 spr_register(env, SPR_PMC2, "PMC2",
731 SPR_NOACCESS, SPR_NOACCESS,
732 &spr_read_generic, &spr_write_generic,
733 0x00000000);
734 /* XXX : not implemented */
735 spr_register(env, SPR_PMC3, "PMC3",
736 SPR_NOACCESS, SPR_NOACCESS,
737 &spr_read_generic, &spr_write_generic,
738 0x00000000);
739 /* XXX : not implemented */
740 spr_register(env, SPR_PMC4, "PMC4",
741 SPR_NOACCESS, SPR_NOACCESS,
742 &spr_read_generic, &spr_write_generic,
743 0x00000000);
744 /* XXX : not implemented */
745 spr_register(env, SPR_SIA, "SIA",
746 SPR_NOACCESS, SPR_NOACCESS,
747 &spr_read_generic, SPR_NOACCESS,
748 0x00000000);
749 spr_register(env, SPR_UMMCR0, "UMMCR0",
750 &spr_read_ureg, SPR_NOACCESS,
751 &spr_read_ureg, SPR_NOACCESS,
752 0x00000000);
753 spr_register(env, SPR_UMMCR1, "UMMCR1",
754 &spr_read_ureg, SPR_NOACCESS,
755 &spr_read_ureg, SPR_NOACCESS,
756 0x00000000);
757 spr_register(env, SPR_UPMC1, "UPMC1",
758 &spr_read_ureg, SPR_NOACCESS,
759 &spr_read_ureg, SPR_NOACCESS,
760 0x00000000);
761 spr_register(env, SPR_UPMC2, "UPMC2",
762 &spr_read_ureg, SPR_NOACCESS,
763 &spr_read_ureg, SPR_NOACCESS,
764 0x00000000);
765 spr_register(env, SPR_UPMC3, "UPMC3",
766 &spr_read_ureg, SPR_NOACCESS,
767 &spr_read_ureg, SPR_NOACCESS,
768 0x00000000);
769 spr_register(env, SPR_UPMC4, "UPMC4",
770 &spr_read_ureg, SPR_NOACCESS,
771 &spr_read_ureg, SPR_NOACCESS,
772 0x00000000);
773 spr_register(env, SPR_USIA, "USIA",
774 &spr_read_ureg, SPR_NOACCESS,
775 &spr_read_ureg, SPR_NOACCESS,
776 0x00000000);
777 /* Thermal management */
778 /* XXX : not implemented */
779 spr_register(env, SPR_THRM1, "THRM1",
780 SPR_NOACCESS, SPR_NOACCESS,
781 &spr_read_generic, &spr_write_generic,
782 0x00000000);
783 /* XXX : not implemented */
784 spr_register(env, SPR_THRM2, "THRM2",
785 SPR_NOACCESS, SPR_NOACCESS,
786 &spr_read_generic, &spr_write_generic,
787 0x00000000);
788 /* XXX : not implemented */
789 spr_register(env, SPR_THRM3, "THRM3",
790 SPR_NOACCESS, SPR_NOACCESS,
791 &spr_read_generic, &spr_write_generic,
792 0x00000000);
793 /* External access control */
794 /* XXX : not implemented */
795 spr_register(env, SPR_EAR, "EAR",
796 SPR_NOACCESS, SPR_NOACCESS,
797 &spr_read_generic, &spr_write_generic,
798 0x00000000);
801 /* SPR specific to PowerPC 604 implementation */
802 static void gen_spr_604 (CPUPPCState *env)
804 /* Processor identification */
805 spr_register(env, SPR_PIR, "PIR",
806 SPR_NOACCESS, SPR_NOACCESS,
807 &spr_read_generic, &spr_write_pir,
808 0x00000000);
809 /* Breakpoints */
810 /* XXX : not implemented */
811 spr_register(env, SPR_IABR, "IABR",
812 SPR_NOACCESS, SPR_NOACCESS,
813 &spr_read_generic, &spr_write_generic,
814 0x00000000);
815 /* XXX : not implemented */
816 spr_register(env, SPR_DABR, "DABR",
817 SPR_NOACCESS, SPR_NOACCESS,
818 &spr_read_generic, &spr_write_generic,
819 0x00000000);
820 /* Performance counters */
821 /* XXX : not implemented */
822 spr_register(env, SPR_MMCR0, "MMCR0",
823 SPR_NOACCESS, SPR_NOACCESS,
824 &spr_read_generic, &spr_write_generic,
825 0x00000000);
826 /* XXX : not implemented */
827 spr_register(env, SPR_MMCR1, "MMCR1",
828 SPR_NOACCESS, SPR_NOACCESS,
829 &spr_read_generic, &spr_write_generic,
830 0x00000000);
831 /* XXX : not implemented */
832 spr_register(env, SPR_PMC1, "PMC1",
833 SPR_NOACCESS, SPR_NOACCESS,
834 &spr_read_generic, &spr_write_generic,
835 0x00000000);
836 /* XXX : not implemented */
837 spr_register(env, SPR_PMC2, "PMC2",
838 SPR_NOACCESS, SPR_NOACCESS,
839 &spr_read_generic, &spr_write_generic,
840 0x00000000);
841 /* XXX : not implemented */
842 spr_register(env, SPR_PMC3, "PMC3",
843 SPR_NOACCESS, SPR_NOACCESS,
844 &spr_read_generic, &spr_write_generic,
845 0x00000000);
846 /* XXX : not implemented */
847 spr_register(env, SPR_PMC4, "PMC4",
848 SPR_NOACCESS, SPR_NOACCESS,
849 &spr_read_generic, &spr_write_generic,
850 0x00000000);
851 /* XXX : not implemented */
852 spr_register(env, SPR_SIA, "SIA",
853 SPR_NOACCESS, SPR_NOACCESS,
854 &spr_read_generic, SPR_NOACCESS,
855 0x00000000);
856 /* XXX : not implemented */
857 spr_register(env, SPR_SDA, "SDA",
858 SPR_NOACCESS, SPR_NOACCESS,
859 &spr_read_generic, SPR_NOACCESS,
860 0x00000000);
861 /* External access control */
862 /* XXX : not implemented */
863 spr_register(env, SPR_EAR, "EAR",
864 SPR_NOACCESS, SPR_NOACCESS,
865 &spr_read_generic, &spr_write_generic,
866 0x00000000);
869 /* SPR specific to PowerPC 603 implementation */
870 static void gen_spr_603 (CPUPPCState *env)
872 /* External access control */
873 /* XXX : not implemented */
874 spr_register(env, SPR_EAR, "EAR",
875 SPR_NOACCESS, SPR_NOACCESS,
876 &spr_read_generic, &spr_write_generic,
877 0x00000000);
880 /* SPR specific to PowerPC G2 implementation */
881 static void gen_spr_G2 (CPUPPCState *env)
883 /* Memory base address */
884 /* MBAR */
885 spr_register(env, SPR_MBAR, "MBAR",
886 SPR_NOACCESS, SPR_NOACCESS,
887 &spr_read_generic, &spr_write_generic,
888 0x00000000);
889 /* System version register */
890 /* SVR */
891 spr_register(env, SPR_SVR, "SVR",
892 SPR_NOACCESS, SPR_NOACCESS,
893 &spr_read_generic, SPR_NOACCESS,
894 0x00000000);
895 /* Exception processing */
896 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
897 SPR_NOACCESS, SPR_NOACCESS,
898 &spr_read_generic, &spr_write_generic,
899 0x00000000);
900 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
901 SPR_NOACCESS, SPR_NOACCESS,
902 &spr_read_generic, &spr_write_generic,
903 0x00000000);
904 /* Breakpoints */
905 /* XXX : not implemented */
906 spr_register(env, SPR_DABR, "DABR",
907 SPR_NOACCESS, SPR_NOACCESS,
908 &spr_read_generic, &spr_write_generic,
909 0x00000000);
910 /* XXX : not implemented */
911 spr_register(env, SPR_DABR2, "DABR2",
912 SPR_NOACCESS, SPR_NOACCESS,
913 &spr_read_generic, &spr_write_generic,
914 0x00000000);
915 /* XXX : not implemented */
916 spr_register(env, SPR_IABR, "IABR",
917 SPR_NOACCESS, SPR_NOACCESS,
918 &spr_read_generic, &spr_write_generic,
919 0x00000000);
920 /* XXX : not implemented */
921 spr_register(env, SPR_IABR2, "IABR2",
922 SPR_NOACCESS, SPR_NOACCESS,
923 &spr_read_generic, &spr_write_generic,
924 0x00000000);
925 /* XXX : not implemented */
926 spr_register(env, SPR_IBCR, "IBCR",
927 SPR_NOACCESS, SPR_NOACCESS,
928 &spr_read_generic, &spr_write_generic,
929 0x00000000);
930 /* XXX : not implemented */
931 spr_register(env, SPR_DBCR, "DBCR",
932 SPR_NOACCESS, SPR_NOACCESS,
933 &spr_read_generic, &spr_write_generic,
934 0x00000000);
937 /* SPR specific to PowerPC 602 implementation */
938 static void gen_spr_602 (CPUPPCState *env)
940 /* ESA registers */
941 /* XXX : not implemented */
942 spr_register(env, SPR_SER, "SER",
943 SPR_NOACCESS, SPR_NOACCESS,
944 &spr_read_generic, &spr_write_generic,
945 0x00000000);
946 /* XXX : not implemented */
947 spr_register(env, SPR_SEBR, "SEBR",
948 SPR_NOACCESS, SPR_NOACCESS,
949 &spr_read_generic, &spr_write_generic,
950 0x00000000);
951 /* XXX : not implemented */
952 spr_register(env, SPR_ESASR, "ESASR",
953 SPR_NOACCESS, SPR_NOACCESS,
954 &spr_read_generic, &spr_write_generic,
955 0x00000000);
956 /* Floating point status */
957 /* XXX : not implemented */
958 spr_register(env, SPR_SP, "SP",
959 SPR_NOACCESS, SPR_NOACCESS,
960 &spr_read_generic, &spr_write_generic,
961 0x00000000);
962 /* XXX : not implemented */
963 spr_register(env, SPR_LT, "LT",
964 SPR_NOACCESS, SPR_NOACCESS,
965 &spr_read_generic, &spr_write_generic,
966 0x00000000);
967 /* Watchdog timer */
968 /* XXX : not implemented */
969 spr_register(env, SPR_TCR, "TCR",
970 SPR_NOACCESS, SPR_NOACCESS,
971 &spr_read_generic, &spr_write_generic,
972 0x00000000);
973 /* Interrupt base */
974 spr_register(env, SPR_IBR, "IBR",
975 SPR_NOACCESS, SPR_NOACCESS,
976 &spr_read_generic, &spr_write_generic,
977 0x00000000);
980 /* SPR specific to PowerPC 601 implementation */
981 static void gen_spr_601 (CPUPPCState *env)
983 /* Multiplication/division register */
984 /* MQ */
985 spr_register(env, SPR_MQ, "MQ",
986 &spr_read_generic, &spr_write_generic,
987 &spr_read_generic, &spr_write_generic,
988 0x00000000);
989 /* RTC registers */
990 spr_register(env, SPR_601_RTCU, "RTCU",
991 SPR_NOACCESS, SPR_NOACCESS,
992 SPR_NOACCESS, &spr_write_601_rtcu,
993 0x00000000);
994 spr_register(env, SPR_601_VRTCU, "RTCU",
995 &spr_read_601_rtcu, SPR_NOACCESS,
996 &spr_read_601_rtcu, SPR_NOACCESS,
997 0x00000000);
998 spr_register(env, SPR_601_RTCL, "RTCL",
999 SPR_NOACCESS, SPR_NOACCESS,
1000 SPR_NOACCESS, &spr_write_601_rtcl,
1001 0x00000000);
1002 spr_register(env, SPR_601_VRTCL, "RTCL",
1003 &spr_read_601_rtcl, SPR_NOACCESS,
1004 &spr_read_601_rtcl, SPR_NOACCESS,
1005 0x00000000);
1006 /* Timer */
1007 #if 0 /* ? */
1008 spr_register(env, SPR_601_UDECR, "UDECR",
1009 &spr_read_decr, SPR_NOACCESS,
1010 &spr_read_decr, SPR_NOACCESS,
1011 0x00000000);
1012 #endif
1013 /* External access control */
1014 /* XXX : not implemented */
1015 spr_register(env, SPR_EAR, "EAR",
1016 SPR_NOACCESS, SPR_NOACCESS,
1017 &spr_read_generic, &spr_write_generic,
1018 0x00000000);
1019 /* Memory management */
1020 spr_register(env, SPR_IBAT0U, "IBAT0U",
1021 SPR_NOACCESS, SPR_NOACCESS,
1022 &spr_read_601_ubat, &spr_write_601_ubatu,
1023 0x00000000);
1024 spr_register(env, SPR_IBAT0L, "IBAT0L",
1025 SPR_NOACCESS, SPR_NOACCESS,
1026 &spr_read_601_ubat, &spr_write_601_ubatl,
1027 0x00000000);
1028 spr_register(env, SPR_IBAT1U, "IBAT1U",
1029 SPR_NOACCESS, SPR_NOACCESS,
1030 &spr_read_601_ubat, &spr_write_601_ubatu,
1031 0x00000000);
1032 spr_register(env, SPR_IBAT1L, "IBAT1L",
1033 SPR_NOACCESS, SPR_NOACCESS,
1034 &spr_read_601_ubat, &spr_write_601_ubatl,
1035 0x00000000);
1036 spr_register(env, SPR_IBAT2U, "IBAT2U",
1037 SPR_NOACCESS, SPR_NOACCESS,
1038 &spr_read_601_ubat, &spr_write_601_ubatu,
1039 0x00000000);
1040 spr_register(env, SPR_IBAT2L, "IBAT2L",
1041 SPR_NOACCESS, SPR_NOACCESS,
1042 &spr_read_601_ubat, &spr_write_601_ubatl,
1043 0x00000000);
1044 spr_register(env, SPR_IBAT3U, "IBAT3U",
1045 SPR_NOACCESS, SPR_NOACCESS,
1046 &spr_read_601_ubat, &spr_write_601_ubatu,
1047 0x00000000);
1048 spr_register(env, SPR_IBAT3L, "IBAT3L",
1049 SPR_NOACCESS, SPR_NOACCESS,
1050 &spr_read_601_ubat, &spr_write_601_ubatl,
1051 0x00000000);
1054 /* PowerPC BookE SPR */
1055 static void gen_spr_BookE (CPUPPCState *env)
1057 /* Processor identification */
1058 spr_register(env, SPR_BOOKE_PIR, "PIR",
1059 SPR_NOACCESS, SPR_NOACCESS,
1060 &spr_read_generic, &spr_write_pir,
1061 0x00000000);
1062 /* Interrupt processing */
1063 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1064 SPR_NOACCESS, SPR_NOACCESS,
1065 &spr_read_generic, &spr_write_generic,
1066 0x00000000);
1067 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1068 SPR_NOACCESS, SPR_NOACCESS,
1069 &spr_read_generic, &spr_write_generic,
1070 0x00000000);
1071 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1072 SPR_NOACCESS, SPR_NOACCESS,
1073 &spr_read_generic, &spr_write_generic,
1074 0x00000000);
1075 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1076 SPR_NOACCESS, SPR_NOACCESS,
1077 &spr_read_generic, &spr_write_generic,
1078 0x00000000);
1079 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
1080 SPR_NOACCESS, SPR_NOACCESS,
1081 &spr_read_generic, &spr_write_generic,
1082 0x00000000);
1083 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
1084 SPR_NOACCESS, SPR_NOACCESS,
1085 &spr_read_generic, &spr_write_generic,
1086 0x00000000);
1087 /* Debug */
1088 /* XXX : not implemented */
1089 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1090 SPR_NOACCESS, SPR_NOACCESS,
1091 &spr_read_generic, &spr_write_generic,
1092 0x00000000);
1093 /* XXX : not implemented */
1094 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1095 SPR_NOACCESS, SPR_NOACCESS,
1096 &spr_read_generic, &spr_write_generic,
1097 0x00000000);
1098 /* XXX : not implemented */
1099 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1100 SPR_NOACCESS, SPR_NOACCESS,
1101 &spr_read_generic, &spr_write_generic,
1102 0x00000000);
1103 /* XXX : not implemented */
1104 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1105 SPR_NOACCESS, SPR_NOACCESS,
1106 &spr_read_generic, &spr_write_generic,
1107 0x00000000);
1108 /* XXX : not implemented */
1109 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1110 SPR_NOACCESS, SPR_NOACCESS,
1111 &spr_read_generic, &spr_write_generic,
1112 0x00000000);
1113 /* XXX : not implemented */
1114 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1115 SPR_NOACCESS, SPR_NOACCESS,
1116 &spr_read_generic, &spr_write_generic,
1117 0x00000000);
1118 /* XXX : not implemented */
1119 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1120 SPR_NOACCESS, SPR_NOACCESS,
1121 &spr_read_generic, &spr_write_generic,
1122 0x00000000);
1123 /* XXX : not implemented */
1124 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1125 SPR_NOACCESS, SPR_NOACCESS,
1126 &spr_read_generic, &spr_write_generic,
1127 0x00000000);
1128 /* XXX : not implemented */
1129 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1130 SPR_NOACCESS, SPR_NOACCESS,
1131 &spr_read_generic, &spr_write_generic,
1132 0x00000000);
1133 /* XXX : not implemented */
1134 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1135 SPR_NOACCESS, SPR_NOACCESS,
1136 &spr_read_generic, &spr_write_generic,
1137 0x00000000);
1138 /* XXX : not implemented */
1139 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1140 SPR_NOACCESS, SPR_NOACCESS,
1141 &spr_read_generic, &spr_write_generic,
1142 0x00000000);
1143 /* XXX : not implemented */
1144 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1145 SPR_NOACCESS, SPR_NOACCESS,
1146 &spr_read_generic, &spr_write_generic,
1147 0x00000000);
1148 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1149 SPR_NOACCESS, SPR_NOACCESS,
1150 &spr_read_generic, &spr_write_generic,
1151 0x00000000);
1152 spr_register(env, SPR_BOOKE_ESR, "ESR",
1153 SPR_NOACCESS, SPR_NOACCESS,
1154 &spr_read_generic, &spr_write_generic,
1155 0x00000000);
1156 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1157 SPR_NOACCESS, SPR_NOACCESS,
1158 &spr_read_generic, &spr_write_generic,
1159 0x00000000);
1160 /* Exception vectors */
1161 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1162 SPR_NOACCESS, SPR_NOACCESS,
1163 &spr_read_generic, &spr_write_generic,
1164 0x00000000);
1165 spr_register(env, SPR_BOOKE_IVOR0, "IVOR0",
1166 SPR_NOACCESS, SPR_NOACCESS,
1167 &spr_read_generic, &spr_write_generic,
1168 0x00000000);
1169 spr_register(env, SPR_BOOKE_IVOR1, "IVOR1",
1170 SPR_NOACCESS, SPR_NOACCESS,
1171 &spr_read_generic, &spr_write_generic,
1172 0x00000000);
1173 spr_register(env, SPR_BOOKE_IVOR2, "IVOR2",
1174 SPR_NOACCESS, SPR_NOACCESS,
1175 &spr_read_generic, &spr_write_generic,
1176 0x00000000);
1177 spr_register(env, SPR_BOOKE_IVOR3, "IVOR3",
1178 SPR_NOACCESS, SPR_NOACCESS,
1179 &spr_read_generic, &spr_write_generic,
1180 0x00000000);
1181 spr_register(env, SPR_BOOKE_IVOR4, "IVOR4",
1182 SPR_NOACCESS, SPR_NOACCESS,
1183 &spr_read_generic, &spr_write_generic,
1184 0x00000000);
1185 spr_register(env, SPR_BOOKE_IVOR5, "IVOR5",
1186 SPR_NOACCESS, SPR_NOACCESS,
1187 &spr_read_generic, &spr_write_generic,
1188 0x00000000);
1189 spr_register(env, SPR_BOOKE_IVOR6, "IVOR6",
1190 SPR_NOACCESS, SPR_NOACCESS,
1191 &spr_read_generic, &spr_write_generic,
1192 0x00000000);
1193 spr_register(env, SPR_BOOKE_IVOR7, "IVOR7",
1194 SPR_NOACCESS, SPR_NOACCESS,
1195 &spr_read_generic, &spr_write_generic,
1196 0x00000000);
1197 spr_register(env, SPR_BOOKE_IVOR8, "IVOR8",
1198 SPR_NOACCESS, SPR_NOACCESS,
1199 &spr_read_generic, &spr_write_generic,
1200 0x00000000);
1201 spr_register(env, SPR_BOOKE_IVOR9, "IVOR9",
1202 SPR_NOACCESS, SPR_NOACCESS,
1203 &spr_read_generic, &spr_write_generic,
1204 0x00000000);
1205 spr_register(env, SPR_BOOKE_IVOR10, "IVOR10",
1206 SPR_NOACCESS, SPR_NOACCESS,
1207 &spr_read_generic, &spr_write_generic,
1208 0x00000000);
1209 spr_register(env, SPR_BOOKE_IVOR11, "IVOR11",
1210 SPR_NOACCESS, SPR_NOACCESS,
1211 &spr_read_generic, &spr_write_generic,
1212 0x00000000);
1213 spr_register(env, SPR_BOOKE_IVOR12, "IVOR12",
1214 SPR_NOACCESS, SPR_NOACCESS,
1215 &spr_read_generic, &spr_write_generic,
1216 0x00000000);
1217 spr_register(env, SPR_BOOKE_IVOR13, "IVOR13",
1218 SPR_NOACCESS, SPR_NOACCESS,
1219 &spr_read_generic, &spr_write_generic,
1220 0x00000000);
1221 spr_register(env, SPR_BOOKE_IVOR14, "IVOR14",
1222 SPR_NOACCESS, SPR_NOACCESS,
1223 &spr_read_generic, &spr_write_generic,
1224 0x00000000);
1225 spr_register(env, SPR_BOOKE_IVOR15, "IVOR15",
1226 SPR_NOACCESS, SPR_NOACCESS,
1227 &spr_read_generic, &spr_write_generic,
1228 0x00000000);
1229 spr_register(env, SPR_BOOKE_IVOR32, "IVOR32",
1230 SPR_NOACCESS, SPR_NOACCESS,
1231 &spr_read_generic, &spr_write_generic,
1232 0x00000000);
1233 spr_register(env, SPR_BOOKE_IVOR33, "IVOR33",
1234 SPR_NOACCESS, SPR_NOACCESS,
1235 &spr_read_generic, &spr_write_generic,
1236 0x00000000);
1237 spr_register(env, SPR_BOOKE_IVOR34, "IVOR34",
1238 SPR_NOACCESS, SPR_NOACCESS,
1239 &spr_read_generic, &spr_write_generic,
1240 0x00000000);
1241 spr_register(env, SPR_BOOKE_IVOR35, "IVOR35",
1242 SPR_NOACCESS, SPR_NOACCESS,
1243 &spr_read_generic, &spr_write_generic,
1244 0x00000000);
1245 spr_register(env, SPR_BOOKE_IVOR36, "IVOR36",
1246 SPR_NOACCESS, SPR_NOACCESS,
1247 &spr_read_generic, &spr_write_generic,
1248 0x00000000);
1249 spr_register(env, SPR_BOOKE_IVOR37, "IVOR37",
1250 SPR_NOACCESS, SPR_NOACCESS,
1251 &spr_read_generic, &spr_write_generic,
1252 0x00000000);
1253 spr_register(env, SPR_BOOKE_PID, "PID",
1254 SPR_NOACCESS, SPR_NOACCESS,
1255 &spr_read_generic, &spr_write_generic,
1256 0x00000000);
1257 spr_register(env, SPR_BOOKE_TCR, "TCR",
1258 SPR_NOACCESS, SPR_NOACCESS,
1259 &spr_read_generic, &spr_write_booke_tcr,
1260 0x00000000);
1261 spr_register(env, SPR_BOOKE_TSR, "TSR",
1262 SPR_NOACCESS, SPR_NOACCESS,
1263 &spr_read_generic, &spr_write_booke_tsr,
1264 0x00000000);
1265 /* Timer */
1266 spr_register(env, SPR_DECR, "DECR",
1267 SPR_NOACCESS, SPR_NOACCESS,
1268 &spr_read_decr, &spr_write_decr,
1269 0x00000000);
1270 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1271 SPR_NOACCESS, SPR_NOACCESS,
1272 SPR_NOACCESS, &spr_write_generic,
1273 0x00000000);
1274 /* SPRGs */
1275 spr_register(env, SPR_USPRG0, "USPRG0",
1276 &spr_read_generic, &spr_write_generic,
1277 &spr_read_generic, &spr_write_generic,
1278 0x00000000);
1279 spr_register(env, SPR_SPRG4, "SPRG4",
1280 SPR_NOACCESS, SPR_NOACCESS,
1281 &spr_read_generic, &spr_write_generic,
1282 0x00000000);
1283 spr_register(env, SPR_USPRG4, "USPRG4",
1284 &spr_read_ureg, SPR_NOACCESS,
1285 &spr_read_ureg, SPR_NOACCESS,
1286 0x00000000);
1287 spr_register(env, SPR_SPRG5, "SPRG5",
1288 SPR_NOACCESS, SPR_NOACCESS,
1289 &spr_read_generic, &spr_write_generic,
1290 0x00000000);
1291 spr_register(env, SPR_USPRG5, "USPRG5",
1292 &spr_read_ureg, SPR_NOACCESS,
1293 &spr_read_ureg, SPR_NOACCESS,
1294 0x00000000);
1295 spr_register(env, SPR_SPRG6, "SPRG6",
1296 SPR_NOACCESS, SPR_NOACCESS,
1297 &spr_read_generic, &spr_write_generic,
1298 0x00000000);
1299 spr_register(env, SPR_USPRG6, "USPRG6",
1300 &spr_read_ureg, SPR_NOACCESS,
1301 &spr_read_ureg, SPR_NOACCESS,
1302 0x00000000);
1303 spr_register(env, SPR_SPRG7, "SPRG7",
1304 SPR_NOACCESS, SPR_NOACCESS,
1305 &spr_read_generic, &spr_write_generic,
1306 0x00000000);
1307 spr_register(env, SPR_USPRG7, "USPRG7",
1308 &spr_read_ureg, SPR_NOACCESS,
1309 &spr_read_ureg, SPR_NOACCESS,
1310 0x00000000);
1313 /* FSL storage control registers */
1314 static void gen_spr_BookE_FSL (CPUPPCState *env)
1316 /* TLB assist registers */
1317 spr_register(env, SPR_BOOKE_MAS0, "MAS0",
1318 SPR_NOACCESS, SPR_NOACCESS,
1319 &spr_read_generic, &spr_write_generic,
1320 0x00000000);
1321 spr_register(env, SPR_BOOKE_MAS1, "MAS2",
1322 SPR_NOACCESS, SPR_NOACCESS,
1323 &spr_read_generic, &spr_write_generic,
1324 0x00000000);
1325 spr_register(env, SPR_BOOKE_MAS2, "MAS3",
1326 SPR_NOACCESS, SPR_NOACCESS,
1327 &spr_read_generic, &spr_write_generic,
1328 0x00000000);
1329 spr_register(env, SPR_BOOKE_MAS3, "MAS4",
1330 SPR_NOACCESS, SPR_NOACCESS,
1331 &spr_read_generic, &spr_write_generic,
1332 0x00000000);
1333 spr_register(env, SPR_BOOKE_MAS4, "MAS5",
1334 SPR_NOACCESS, SPR_NOACCESS,
1335 &spr_read_generic, &spr_write_generic,
1336 0x00000000);
1337 spr_register(env, SPR_BOOKE_MAS6, "MAS6",
1338 SPR_NOACCESS, SPR_NOACCESS,
1339 &spr_read_generic, &spr_write_generic,
1340 0x00000000);
1341 spr_register(env, SPR_BOOKE_MAS7, "MAS7",
1342 SPR_NOACCESS, SPR_NOACCESS,
1343 &spr_read_generic, &spr_write_generic,
1344 0x00000000);
1345 if (env->nb_pids > 1) {
1346 spr_register(env, SPR_BOOKE_PID1, "PID1",
1347 SPR_NOACCESS, SPR_NOACCESS,
1348 &spr_read_generic, &spr_write_generic,
1349 0x00000000);
1351 if (env->nb_pids > 2) {
1352 spr_register(env, SPR_BOOKE_PID2, "PID2",
1353 SPR_NOACCESS, SPR_NOACCESS,
1354 &spr_read_generic, &spr_write_generic,
1355 0x00000000);
1357 spr_register(env, SPR_BOOKE_MMUCFG, "MMUCFG",
1358 SPR_NOACCESS, SPR_NOACCESS,
1359 &spr_read_generic, SPR_NOACCESS,
1360 0x00000000); /* TOFIX */
1361 spr_register(env, SPR_BOOKE_MMUCSR0, "MMUCSR0",
1362 SPR_NOACCESS, SPR_NOACCESS,
1363 &spr_read_generic, &spr_write_generic,
1364 0x00000000); /* TOFIX */
1365 switch (env->nb_ways) {
1366 case 4:
1367 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1368 SPR_NOACCESS, SPR_NOACCESS,
1369 &spr_read_generic, SPR_NOACCESS,
1370 0x00000000); /* TOFIX */
1371 /* Fallthru */
1372 case 3:
1373 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1374 SPR_NOACCESS, SPR_NOACCESS,
1375 &spr_read_generic, SPR_NOACCESS,
1376 0x00000000); /* TOFIX */
1377 /* Fallthru */
1378 case 2:
1379 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1380 SPR_NOACCESS, SPR_NOACCESS,
1381 &spr_read_generic, SPR_NOACCESS,
1382 0x00000000); /* TOFIX */
1383 /* Fallthru */
1384 case 1:
1385 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1386 SPR_NOACCESS, SPR_NOACCESS,
1387 &spr_read_generic, SPR_NOACCESS,
1388 0x00000000); /* TOFIX */
1389 /* Fallthru */
1390 case 0:
1391 default:
1392 break;
1396 /* SPR specific to PowerPC 440 implementation */
1397 static void gen_spr_440 (CPUPPCState *env)
1399 /* Cache control */
1400 /* XXX : not implemented */
1401 spr_register(env, SPR_440_DNV0, "DNV0",
1402 SPR_NOACCESS, SPR_NOACCESS,
1403 &spr_read_generic, &spr_write_generic,
1404 0x00000000);
1405 /* XXX : not implemented */
1406 spr_register(env, SPR_440_DNV1, "DNV1",
1407 SPR_NOACCESS, SPR_NOACCESS,
1408 &spr_read_generic, &spr_write_generic,
1409 0x00000000);
1410 /* XXX : not implemented */
1411 spr_register(env, SPR_440_DNV2, "DNV2",
1412 SPR_NOACCESS, SPR_NOACCESS,
1413 &spr_read_generic, &spr_write_generic,
1414 0x00000000);
1415 /* XXX : not implemented */
1416 spr_register(env, SPR_440_DNV3, "DNV3",
1417 SPR_NOACCESS, SPR_NOACCESS,
1418 &spr_read_generic, &spr_write_generic,
1419 0x00000000);
1420 /* XXX : not implemented */
1421 spr_register(env, SPR_440_DVT0, "DVT0",
1422 SPR_NOACCESS, SPR_NOACCESS,
1423 &spr_read_generic, &spr_write_generic,
1424 0x00000000);
1425 /* XXX : not implemented */
1426 spr_register(env, SPR_440_DVT1, "DVT1",
1427 SPR_NOACCESS, SPR_NOACCESS,
1428 &spr_read_generic, &spr_write_generic,
1429 0x00000000);
1430 /* XXX : not implemented */
1431 spr_register(env, SPR_440_DVT2, "DVT2",
1432 SPR_NOACCESS, SPR_NOACCESS,
1433 &spr_read_generic, &spr_write_generic,
1434 0x00000000);
1435 /* XXX : not implemented */
1436 spr_register(env, SPR_440_DVT3, "DVT3",
1437 SPR_NOACCESS, SPR_NOACCESS,
1438 &spr_read_generic, &spr_write_generic,
1439 0x00000000);
1440 /* XXX : not implemented */
1441 spr_register(env, SPR_440_DVLIM, "DVLIM",
1442 SPR_NOACCESS, SPR_NOACCESS,
1443 &spr_read_generic, &spr_write_generic,
1444 0x00000000);
1445 /* XXX : not implemented */
1446 spr_register(env, SPR_440_INV0, "INV0",
1447 SPR_NOACCESS, SPR_NOACCESS,
1448 &spr_read_generic, &spr_write_generic,
1449 0x00000000);
1450 /* XXX : not implemented */
1451 spr_register(env, SPR_440_INV1, "INV1",
1452 SPR_NOACCESS, SPR_NOACCESS,
1453 &spr_read_generic, &spr_write_generic,
1454 0x00000000);
1455 /* XXX : not implemented */
1456 spr_register(env, SPR_440_INV2, "INV2",
1457 SPR_NOACCESS, SPR_NOACCESS,
1458 &spr_read_generic, &spr_write_generic,
1459 0x00000000);
1460 /* XXX : not implemented */
1461 spr_register(env, SPR_440_INV3, "INV3",
1462 SPR_NOACCESS, SPR_NOACCESS,
1463 &spr_read_generic, &spr_write_generic,
1464 0x00000000);
1465 /* XXX : not implemented */
1466 spr_register(env, SPR_440_IVT0, "IVT0",
1467 SPR_NOACCESS, SPR_NOACCESS,
1468 &spr_read_generic, &spr_write_generic,
1469 0x00000000);
1470 /* XXX : not implemented */
1471 spr_register(env, SPR_440_IVT1, "IVT1",
1472 SPR_NOACCESS, SPR_NOACCESS,
1473 &spr_read_generic, &spr_write_generic,
1474 0x00000000);
1475 /* XXX : not implemented */
1476 spr_register(env, SPR_440_IVT2, "IVT2",
1477 SPR_NOACCESS, SPR_NOACCESS,
1478 &spr_read_generic, &spr_write_generic,
1479 0x00000000);
1480 /* XXX : not implemented */
1481 spr_register(env, SPR_440_IVT3, "IVT3",
1482 SPR_NOACCESS, SPR_NOACCESS,
1483 &spr_read_generic, &spr_write_generic,
1484 0x00000000);
1485 /* XXX : not implemented */
1486 spr_register(env, SPR_440_IVLIM, "IVLIM",
1487 SPR_NOACCESS, SPR_NOACCESS,
1488 &spr_read_generic, &spr_write_generic,
1489 0x00000000);
1490 /* Cache debug */
1491 /* XXX : not implemented */
1492 spr_register(env, SPR_BOOKE_DCBTRH, "DCBTRH",
1493 SPR_NOACCESS, SPR_NOACCESS,
1494 &spr_read_generic, SPR_NOACCESS,
1495 0x00000000);
1496 /* XXX : not implemented */
1497 spr_register(env, SPR_BOOKE_DCBTRL, "DCBTRL",
1498 SPR_NOACCESS, SPR_NOACCESS,
1499 &spr_read_generic, SPR_NOACCESS,
1500 0x00000000);
1501 /* XXX : not implemented */
1502 spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1503 SPR_NOACCESS, SPR_NOACCESS,
1504 &spr_read_generic, SPR_NOACCESS,
1505 0x00000000);
1506 /* XXX : not implemented */
1507 spr_register(env, SPR_BOOKE_ICBTRH, "ICBTRH",
1508 SPR_NOACCESS, SPR_NOACCESS,
1509 &spr_read_generic, SPR_NOACCESS,
1510 0x00000000);
1511 /* XXX : not implemented */
1512 spr_register(env, SPR_BOOKE_ICBTRL, "ICBTRL",
1513 SPR_NOACCESS, SPR_NOACCESS,
1514 &spr_read_generic, SPR_NOACCESS,
1515 0x00000000);
1516 /* XXX : not implemented */
1517 spr_register(env, SPR_440_DBDR, "DBDR",
1518 SPR_NOACCESS, SPR_NOACCESS,
1519 &spr_read_generic, &spr_write_generic,
1520 0x00000000);
1521 /* Processor control */
1522 spr_register(env, SPR_4xx_CCR0, "CCR0",
1523 SPR_NOACCESS, SPR_NOACCESS,
1524 &spr_read_generic, &spr_write_generic,
1525 0x00000000);
1526 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1527 SPR_NOACCESS, SPR_NOACCESS,
1528 &spr_read_generic, SPR_NOACCESS,
1529 0x00000000);
1530 /* Storage control */
1531 spr_register(env, SPR_440_MMUCR, "MMUCR",
1532 SPR_NOACCESS, SPR_NOACCESS,
1533 &spr_read_generic, &spr_write_generic,
1534 0x00000000);
1537 /* SPR shared between PowerPC 40x implementations */
1538 static void gen_spr_40x (CPUPPCState *env)
1540 /* Cache */
1541 /* XXX : not implemented */
1542 spr_register(env, SPR_40x_DCCR, "DCCR",
1543 SPR_NOACCESS, SPR_NOACCESS,
1544 &spr_read_generic, &spr_write_generic,
1545 0x00000000);
1546 /* XXX : not implemented */
1547 spr_register(env, SPR_40x_DCWR, "DCWR",
1548 SPR_NOACCESS, SPR_NOACCESS,
1549 &spr_read_generic, &spr_write_generic,
1550 0x00000000);
1551 /* XXX : not implemented */
1552 spr_register(env, SPR_40x_ICCR, "ICCR",
1553 SPR_NOACCESS, SPR_NOACCESS,
1554 &spr_read_generic, &spr_write_generic,
1555 0x00000000);
1556 /* XXX : not implemented */
1557 spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1558 SPR_NOACCESS, SPR_NOACCESS,
1559 &spr_read_generic, SPR_NOACCESS,
1560 0x00000000);
1561 /* Bus access control */
1562 spr_register(env, SPR_40x_SGR, "SGR",
1563 SPR_NOACCESS, SPR_NOACCESS,
1564 &spr_read_generic, &spr_write_generic,
1565 0xFFFFFFFF);
1566 spr_register(env, SPR_40x_ZPR, "ZPR",
1567 SPR_NOACCESS, SPR_NOACCESS,
1568 &spr_read_generic, &spr_write_generic,
1569 0x00000000);
1570 /* MMU */
1571 spr_register(env, SPR_40x_PID, "PID",
1572 SPR_NOACCESS, SPR_NOACCESS,
1573 &spr_read_generic, &spr_write_generic,
1574 0x00000000);
1575 /* Exception */
1576 spr_register(env, SPR_40x_DEAR, "DEAR",
1577 SPR_NOACCESS, SPR_NOACCESS,
1578 &spr_read_generic, &spr_write_generic,
1579 0x00000000);
1580 spr_register(env, SPR_40x_ESR, "ESR",
1581 SPR_NOACCESS, SPR_NOACCESS,
1582 &spr_read_generic, &spr_write_generic,
1583 0x00000000);
1584 spr_register(env, SPR_40x_EVPR, "EVPR",
1585 SPR_NOACCESS, SPR_NOACCESS,
1586 &spr_read_generic, &spr_write_generic,
1587 0x00000000);
1588 spr_register(env, SPR_40x_SRR2, "SRR2",
1589 &spr_read_generic, &spr_write_generic,
1590 &spr_read_generic, &spr_write_generic,
1591 0x00000000);
1592 spr_register(env, SPR_40x_SRR3, "SRR3",
1593 &spr_read_generic, &spr_write_generic,
1594 &spr_read_generic, &spr_write_generic,
1595 0x00000000);
1596 /* Timers */
1597 spr_register(env, SPR_40x_PIT, "PIT",
1598 SPR_NOACCESS, SPR_NOACCESS,
1599 &spr_read_40x_pit, &spr_write_40x_pit,
1600 0x00000000);
1601 spr_register(env, SPR_40x_TCR, "TCR",
1602 SPR_NOACCESS, SPR_NOACCESS,
1603 &spr_read_generic, &spr_write_booke_tcr,
1604 0x00000000);
1605 spr_register(env, SPR_40x_TSR, "TSR",
1606 SPR_NOACCESS, SPR_NOACCESS,
1607 &spr_read_generic, &spr_write_booke_tsr,
1608 0x00000000);
1609 /* Debug interface */
1610 /* XXX : not implemented */
1611 spr_register(env, SPR_40x_DAC1, "DAC1",
1612 SPR_NOACCESS, SPR_NOACCESS,
1613 &spr_read_generic, &spr_write_generic,
1614 0x00000000);
1615 spr_register(env, SPR_40x_DAC2, "DAC2",
1616 SPR_NOACCESS, SPR_NOACCESS,
1617 &spr_read_generic, &spr_write_generic,
1618 0x00000000);
1619 /* XXX : not implemented */
1620 spr_register(env, SPR_40x_DBCR0, "DBCR0",
1621 SPR_NOACCESS, SPR_NOACCESS,
1622 &spr_read_generic, &spr_write_generic,
1623 0x00000000);
1624 /* XXX : not implemented */
1625 spr_register(env, SPR_40x_DBSR, "DBSR",
1626 SPR_NOACCESS, SPR_NOACCESS,
1627 &spr_read_generic, &spr_write_generic,
1628 /* Last reset was system reset (system boot */
1629 0x00000300);
1630 /* XXX : not implemented */
1631 spr_register(env, SPR_40x_IAC1, "IAC1",
1632 SPR_NOACCESS, SPR_NOACCESS,
1633 &spr_read_generic, &spr_write_generic,
1634 0x00000000);
1635 spr_register(env, SPR_40x_IAC2, "IAC2",
1636 SPR_NOACCESS, SPR_NOACCESS,
1637 &spr_read_generic, &spr_write_generic,
1638 0x00000000);
1641 /* SPR specific to PowerPC 405 implementation */
1642 static void gen_spr_405 (CPUPPCState *env)
1644 spr_register(env, SPR_4xx_CCR0, "CCR0",
1645 SPR_NOACCESS, SPR_NOACCESS,
1646 &spr_read_generic, &spr_write_generic,
1647 0x00700000);
1648 /* Debug */
1649 /* XXX : not implemented */
1650 spr_register(env, SPR_405_DBCR1, "DBCR1",
1651 SPR_NOACCESS, SPR_NOACCESS,
1652 &spr_read_generic, &spr_write_generic,
1653 0x00000000);
1654 /* XXX : not implemented */
1655 spr_register(env, SPR_405_DVC1, "DVC1",
1656 SPR_NOACCESS, SPR_NOACCESS,
1657 &spr_read_generic, &spr_write_generic,
1658 0x00000000);
1659 /* XXX : not implemented */
1660 spr_register(env, SPR_405_DVC2, "DVC2",
1661 SPR_NOACCESS, SPR_NOACCESS,
1662 &spr_read_generic, &spr_write_generic,
1663 0x00000000);
1664 /* XXX : not implemented */
1665 spr_register(env, SPR_405_IAC3, "IAC3",
1666 SPR_NOACCESS, SPR_NOACCESS,
1667 &spr_read_generic, &spr_write_generic,
1668 0x00000000);
1669 /* XXX : not implemented */
1670 spr_register(env, SPR_405_IAC4, "IAC4",
1671 SPR_NOACCESS, SPR_NOACCESS,
1672 &spr_read_generic, &spr_write_generic,
1673 0x00000000);
1674 /* Storage control */
1675 /* XXX : not implemented */
1676 spr_register(env, SPR_405_SLER, "SLER",
1677 SPR_NOACCESS, SPR_NOACCESS,
1678 &spr_read_generic, &spr_write_generic,
1679 0x00000000);
1680 /* XXX : not implemented */
1681 spr_register(env, SPR_405_SU0R, "SU0R",
1682 SPR_NOACCESS, SPR_NOACCESS,
1683 &spr_read_generic, &spr_write_generic,
1684 0x00000000);
1685 /* SPRG */
1686 spr_register(env, SPR_USPRG0, "USPRG0",
1687 &spr_read_ureg, SPR_NOACCESS,
1688 &spr_read_ureg, SPR_NOACCESS,
1689 0x00000000);
1690 spr_register(env, SPR_SPRG4, "SPRG4",
1691 SPR_NOACCESS, SPR_NOACCESS,
1692 SPR_NOACCESS, &spr_write_generic,
1693 0x00000000);
1694 spr_register(env, SPR_USPRG4, "USPRG4",
1695 &spr_read_ureg, SPR_NOACCESS,
1696 &spr_read_ureg, SPR_NOACCESS,
1697 0x00000000);
1698 spr_register(env, SPR_SPRG5, "SPRG5",
1699 SPR_NOACCESS, SPR_NOACCESS,
1700 SPR_NOACCESS, &spr_write_generic,
1701 0x00000000);
1702 spr_register(env, SPR_USPRG5, "USPRG5",
1703 &spr_read_ureg, SPR_NOACCESS,
1704 &spr_read_ureg, SPR_NOACCESS,
1705 0x00000000);
1706 spr_register(env, SPR_SPRG6, "SPRG6",
1707 SPR_NOACCESS, SPR_NOACCESS,
1708 SPR_NOACCESS, &spr_write_generic,
1709 0x00000000);
1710 spr_register(env, SPR_USPRG6, "USPRG6",
1711 &spr_read_ureg, SPR_NOACCESS,
1712 &spr_read_ureg, SPR_NOACCESS,
1713 0x00000000);
1714 spr_register(env, SPR_SPRG7, "SPRG7",
1715 SPR_NOACCESS, SPR_NOACCESS,
1716 SPR_NOACCESS, &spr_write_generic,
1717 0x00000000);
1718 spr_register(env, SPR_USPRG7, "USPRG7",
1719 &spr_read_ureg, SPR_NOACCESS,
1720 &spr_read_ureg, SPR_NOACCESS,
1721 0x00000000);
1722 /* Debug */
1723 /* XXX : not implemented */
1724 spr_register(env, SPR_40x_DAC2, "DAC2",
1725 SPR_NOACCESS, SPR_NOACCESS,
1726 &spr_read_generic, &spr_write_generic,
1727 0x00000000);
1728 /* XXX : not implemented */
1729 spr_register(env, SPR_40x_IAC2, "IAC2",
1730 SPR_NOACCESS, SPR_NOACCESS,
1731 &spr_read_generic, &spr_write_generic,
1732 0x00000000);
1735 /* SPR shared between PowerPC 401 & 403 implementations */
1736 static void gen_spr_401_403 (CPUPPCState *env)
1738 /* Time base */
1739 spr_register(env, SPR_403_VTBL, "TBL",
1740 &spr_read_tbl, SPR_NOACCESS,
1741 &spr_read_tbl, SPR_NOACCESS,
1742 0x00000000);
1743 spr_register(env, SPR_403_TBL, "TBL",
1744 SPR_NOACCESS, SPR_NOACCESS,
1745 SPR_NOACCESS, &spr_write_tbl,
1746 0x00000000);
1747 spr_register(env, SPR_403_VTBU, "TBU",
1748 &spr_read_tbu, SPR_NOACCESS,
1749 &spr_read_tbu, SPR_NOACCESS,
1750 0x00000000);
1751 spr_register(env, SPR_403_TBU, "TBU",
1752 SPR_NOACCESS, SPR_NOACCESS,
1753 SPR_NOACCESS, &spr_write_tbu,
1754 0x00000000);
1755 /* Debug */
1756 /* XXX: not implemented */
1757 spr_register(env, SPR_403_CDBCR, "CDBCR",
1758 SPR_NOACCESS, SPR_NOACCESS,
1759 &spr_read_generic, &spr_write_generic,
1760 0x00000000);
1763 /* SPR specific to PowerPC 403 implementation */
1764 static void gen_spr_403 (CPUPPCState *env)
1766 /* MMU */
1767 spr_register(env, SPR_403_PBL1, "PBL1",
1768 SPR_NOACCESS, SPR_NOACCESS,
1769 &spr_read_403_pbr, &spr_write_403_pbr,
1770 0x00000000);
1771 spr_register(env, SPR_403_PBU1, "PBU1",
1772 SPR_NOACCESS, SPR_NOACCESS,
1773 &spr_read_403_pbr, &spr_write_403_pbr,
1774 0x00000000);
1775 spr_register(env, SPR_403_PBL2, "PBL2",
1776 SPR_NOACCESS, SPR_NOACCESS,
1777 &spr_read_403_pbr, &spr_write_403_pbr,
1778 0x00000000);
1779 spr_register(env, SPR_403_PBU2, "PBU2",
1780 SPR_NOACCESS, SPR_NOACCESS,
1781 &spr_read_403_pbr, &spr_write_403_pbr,
1782 0x00000000);
1783 /* Debug */
1784 /* XXX : not implemented */
1785 spr_register(env, SPR_40x_DAC2, "DAC2",
1786 SPR_NOACCESS, SPR_NOACCESS,
1787 &spr_read_generic, &spr_write_generic,
1788 0x00000000);
1789 /* XXX : not implemented */
1790 spr_register(env, SPR_40x_IAC2, "IAC2",
1791 SPR_NOACCESS, SPR_NOACCESS,
1792 &spr_read_generic, &spr_write_generic,
1793 0x00000000);
1796 /* SPR specific to PowerPC compression coprocessor extension */
1797 #if defined (TODO)
1798 static void gen_spr_compress (CPUPPCState *env)
1800 spr_register(env, SPR_401_SKR, "SKR",
1801 SPR_NOACCESS, SPR_NOACCESS,
1802 &spr_read_generic, &spr_write_generic,
1803 0x00000000);
1805 #endif
1807 // XXX: TODO (64 bits PowerPC SPRs)
1809 * ASR => SPR 280 (64 bits)
1810 * FPECR => SPR 1022 (?)
1811 * VRSAVE => SPR 256 (Altivec)
1812 * SCOMC => SPR 276 (64 bits ?)
1813 * SCOMD => SPR 277 (64 bits ?)
1814 * HSPRG0 => SPR 304 (hypervisor)
1815 * HSPRG1 => SPR 305 (hypervisor)
1816 * HDEC => SPR 310 (hypervisor)
1817 * HIOR => SPR 311 (hypervisor)
1818 * RMOR => SPR 312 (970)
1819 * HRMOR => SPR 313 (hypervisor)
1820 * HSRR0 => SPR 314 (hypervisor)
1821 * HSRR1 => SPR 315 (hypervisor)
1822 * LPCR => SPR 316 (970)
1823 * LPIDR => SPR 317 (970)
1824 * ... and more (thermal management, performance counters, ...)
1827 static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
1829 env->reserve = -1;
1830 /* Default MMU definitions */
1831 env->nb_BATs = -1;
1832 env->nb_tlb = 0;
1833 env->nb_ways = 0;
1834 /* XXX: missing:
1835 * 32 bits PowerPC:
1836 * - MPC5xx(x)
1837 * - MPC8xx(x)
1838 * - RCPU (same as MPC5xx ?)
1840 spr_register(env, SPR_PVR, "PVR",
1841 SPR_NOACCESS, SPR_NOACCESS,
1842 &spr_read_generic, SPR_NOACCESS,
1843 def->pvr);
1844 printf("%s: PVR %08x mask %08x => %08x\n", __func__,
1845 def->pvr, def->pvr_mask, def->pvr & def->pvr_mask);
1846 switch (def->pvr & def->pvr_mask) {
1847 /* Embedded PowerPC from IBM */
1848 case CPU_PPC_401A1: /* 401 A1 family */
1849 case CPU_PPC_401B2: /* 401 B2 family */
1850 case CPU_PPC_401C2: /* 401 C2 family */
1851 case CPU_PPC_401D2: /* 401 D2 family */
1852 case CPU_PPC_401E2: /* 401 E2 family */
1853 case CPU_PPC_401F2: /* 401 F2 family */
1854 case CPU_PPC_401G2: /* 401 G2 family */
1855 case CPU_PPC_IOP480: /* IOP 480 family */
1856 case CPU_PPC_COBRA: /* IBM Processor for Network Resources */
1857 gen_spr_generic(env);
1858 gen_spr_40x(env);
1859 gen_spr_401_403(env);
1860 #if defined (TODO)
1861 /* XXX: optional ? */
1862 gen_spr_compress(env);
1863 #endif
1864 env->nb_BATs = 0;
1865 env->nb_tlb = 64;
1866 env->nb_ways = 1;
1867 env->id_tlbs = 0;
1868 break;
1870 case CPU_PPC_403GA: /* 403 GA family */
1871 case CPU_PPC_403GB: /* 403 GB family */
1872 case CPU_PPC_403GC: /* 403 GC family */
1873 case CPU_PPC_403GCX: /* 403 GCX family */
1874 gen_spr_generic(env);
1875 gen_spr_40x(env);
1876 gen_spr_401_403(env);
1877 gen_spr_403(env);
1878 env->nb_BATs = 0;
1879 env->nb_tlb = 64;
1880 env->nb_ways = 1;
1881 env->id_tlbs = 0;
1882 break;
1884 case CPU_PPC_405CR: /* 405 GP/CR family */
1885 case CPU_PPC_405EP: /* 405 EP family */
1886 case CPU_PPC_405GPR: /* 405 GPR family */
1887 case CPU_PPC_405D2: /* 405 D2 family */
1888 case CPU_PPC_405D4: /* 405 D4 family */
1889 gen_spr_generic(env);
1890 /* Time base */
1891 gen_tbl(env);
1892 gen_spr_40x(env);
1893 gen_spr_405(env);
1894 env->nb_BATs = 0;
1895 env->nb_tlb = 64;
1896 env->nb_ways = 1;
1897 env->id_tlbs = 0;
1898 break;
1900 case CPU_PPC_NPE405H: /* NPe405 H family */
1901 case CPU_PPC_NPE405H2:
1902 case CPU_PPC_NPE405L: /* Npe405 L family */
1903 gen_spr_generic(env);
1904 /* Time base */
1905 gen_tbl(env);
1906 gen_spr_40x(env);
1907 gen_spr_405(env);
1908 env->nb_BATs = 0;
1909 env->nb_tlb = 64;
1910 env->nb_ways = 1;
1911 env->id_tlbs = 0;
1912 break;
1914 #if defined (TODO)
1915 case CPU_PPC_STB01000:
1916 #endif
1917 #if defined (TODO)
1918 case CPU_PPC_STB01010:
1919 #endif
1920 #if defined (TODO)
1921 case CPU_PPC_STB0210:
1922 #endif
1923 case CPU_PPC_STB03: /* STB03 family */
1924 #if defined (TODO)
1925 case CPU_PPC_STB043: /* STB043 family */
1926 #endif
1927 #if defined (TODO)
1928 case CPU_PPC_STB045: /* STB045 family */
1929 #endif
1930 case CPU_PPC_STB25: /* STB25 family */
1931 #if defined (TODO)
1932 case CPU_PPC_STB130: /* STB130 family */
1933 #endif
1934 gen_spr_generic(env);
1935 /* Time base */
1936 gen_tbl(env);
1937 gen_spr_40x(env);
1938 gen_spr_405(env);
1939 env->nb_BATs = 0;
1940 env->nb_tlb = 64;
1941 env->nb_ways = 1;
1942 env->id_tlbs = 0;
1943 break;
1945 case CPU_PPC_440EP: /* 440 EP family */
1946 case CPU_PPC_440GP: /* 440 GP family */
1947 case CPU_PPC_440GX: /* 440 GX family */
1948 case CPU_PPC_440GXc: /* 440 GXc family */
1949 case CPU_PPC_440GXf: /* 440 GXf family */
1950 case CPU_PPC_440SP: /* 440 SP family */
1951 case CPU_PPC_440SP2:
1952 case CPU_PPC_440SPE: /* 440 SPE family */
1953 gen_spr_generic(env);
1954 /* Time base */
1955 gen_tbl(env);
1956 gen_spr_BookE(env);
1957 gen_spr_440(env);
1958 env->nb_BATs = 0;
1959 env->nb_tlb = 64;
1960 env->nb_ways = 1;
1961 env->id_tlbs = 0;
1962 break;
1964 /* Embedded PowerPC from Freescale */
1965 #if defined (TODO)
1966 case CPU_PPC_5xx:
1967 break;
1968 #endif
1969 #if defined (TODO)
1970 case CPU_PPC_8xx: /* MPC821 / 823 / 850 / 860 */
1971 break;
1972 #endif
1973 #if defined (TODO)
1974 case CPU_PPC_82xx_HIP3: /* MPC8240 / 8260 */
1975 case CPU_PPC_82xx_HIP4: /* MPC8240 / 8260 */
1976 break;
1977 #endif
1978 #if defined (TODO)
1979 case CPU_PPC_827x: /* MPC 827x / 828x */
1980 break;
1981 #endif
1983 /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
1984 case CPU_PPC_e500v110:
1985 case CPU_PPC_e500v120:
1986 case CPU_PPC_e500v210:
1987 case CPU_PPC_e500v220:
1988 gen_spr_generic(env);
1989 /* Time base */
1990 gen_tbl(env);
1991 gen_spr_BookE(env);
1992 gen_spr_BookE_FSL(env);
1993 env->nb_BATs = 0;
1994 env->nb_tlb = 64;
1995 env->nb_ways = 1;
1996 env->id_tlbs = 0;
1997 break;
1999 #if defined (TODO)
2000 case CPU_PPC_e600:
2001 break;
2002 #endif
2004 /* 32 bits PowerPC */
2005 case CPU_PPC_601: /* PowerPC 601 */
2006 gen_spr_generic(env);
2007 gen_spr_ne_601(env);
2008 gen_spr_601(env);
2009 /* Hardware implementation registers */
2010 /* XXX : not implemented */
2011 spr_register(env, SPR_HID0, "HID0",
2012 SPR_NOACCESS, SPR_NOACCESS,
2013 &spr_read_generic, &spr_write_generic,
2014 0x00000000);
2015 /* XXX : not implemented */
2016 spr_register(env, SPR_HID1, "HID1",
2017 SPR_NOACCESS, SPR_NOACCESS,
2018 &spr_read_generic, &spr_write_generic,
2019 0x00000000);
2020 /* XXX : not implemented */
2021 spr_register(env, SPR_601_HID2, "HID2",
2022 SPR_NOACCESS, SPR_NOACCESS,
2023 &spr_read_generic, &spr_write_generic,
2024 0x00000000);
2025 /* XXX : not implemented */
2026 spr_register(env, SPR_601_HID5, "HID5",
2027 SPR_NOACCESS, SPR_NOACCESS,
2028 &spr_read_generic, &spr_write_generic,
2029 0x00000000);
2030 /* XXX : not implemented */
2031 #if 0 /* ? */
2032 spr_register(env, SPR_601_HID15, "HID15",
2033 SPR_NOACCESS, SPR_NOACCESS,
2034 &spr_read_generic, &spr_write_generic,
2035 0x00000000);
2036 #endif
2037 env->nb_tlb = 64;
2038 env->nb_ways = 2;
2039 env->id_tlbs = 0;
2040 env->id_tlbs = 0;
2041 break;
2043 case CPU_PPC_602: /* PowerPC 602 */
2044 gen_spr_generic(env);
2045 gen_spr_ne_601(env);
2046 /* Memory management */
2047 gen_low_BATs(env);
2048 /* Time base */
2049 gen_tbl(env);
2050 gen_6xx_7xx_soft_tlb(env, 64, 2);
2051 gen_spr_602(env);
2052 /* hardware implementation registers */
2053 /* XXX : not implemented */
2054 spr_register(env, SPR_HID0, "HID0",
2055 SPR_NOACCESS, SPR_NOACCESS,
2056 &spr_read_generic, &spr_write_generic,
2057 0x00000000);
2058 /* XXX : not implemented */
2059 spr_register(env, SPR_HID1, "HID1",
2060 SPR_NOACCESS, SPR_NOACCESS,
2061 &spr_read_generic, &spr_write_generic,
2062 0x00000000);
2063 break;
2065 case CPU_PPC_603: /* PowerPC 603 */
2066 case CPU_PPC_603E: /* PowerPC 603e */
2067 case CPU_PPC_603E7v:
2068 case CPU_PPC_603E7v2:
2069 case CPU_PPC_603P: /* PowerPC 603p */
2070 case CPU_PPC_603R: /* PowerPC 603r */
2071 gen_spr_generic(env);
2072 gen_spr_ne_601(env);
2073 /* Memory management */
2074 gen_low_BATs(env);
2075 /* Time base */
2076 gen_tbl(env);
2077 gen_6xx_7xx_soft_tlb(env, 64, 2);
2078 gen_spr_603(env);
2079 /* hardware implementation registers */
2080 /* XXX : not implemented */
2081 spr_register(env, SPR_HID0, "HID0",
2082 SPR_NOACCESS, SPR_NOACCESS,
2083 &spr_read_generic, &spr_write_generic,
2084 0x00000000);
2085 /* XXX : not implemented */
2086 spr_register(env, SPR_HID1, "HID1",
2087 SPR_NOACCESS, SPR_NOACCESS,
2088 &spr_read_generic, &spr_write_generic,
2089 0x00000000);
2090 break;
2092 case CPU_PPC_G2: /* PowerPC G2 family */
2093 case CPU_PPC_G2H4:
2094 case CPU_PPC_G2gp:
2095 case CPU_PPC_G2ls:
2096 case CPU_PPC_G2LE: /* PowerPC G2LE family */
2097 case CPU_PPC_G2LEgp:
2098 case CPU_PPC_G2LEls:
2099 gen_spr_generic(env);
2100 gen_spr_ne_601(env);
2101 /* Memory management */
2102 gen_low_BATs(env);
2103 /* Time base */
2104 gen_tbl(env);
2105 /* Memory management */
2106 gen_high_BATs(env);
2107 gen_6xx_7xx_soft_tlb(env, 64, 2);
2108 gen_spr_G2_755(env);
2109 gen_spr_G2(env);
2110 /* Hardware implementation register */
2111 /* XXX : not implemented */
2112 spr_register(env, SPR_HID0, "HID0",
2113 SPR_NOACCESS, SPR_NOACCESS,
2114 &spr_read_generic, &spr_write_generic,
2115 0x00000000);
2116 /* XXX : not implemented */
2117 spr_register(env, SPR_HID1, "HID1",
2118 SPR_NOACCESS, SPR_NOACCESS,
2119 &spr_read_generic, &spr_write_generic,
2120 0x00000000);
2121 /* XXX : not implemented */
2122 spr_register(env, SPR_HID2, "HID2",
2123 SPR_NOACCESS, SPR_NOACCESS,
2124 &spr_read_generic, &spr_write_generic,
2125 0x00000000);
2126 break;
2128 case CPU_PPC_604: /* PowerPC 604 */
2129 case CPU_PPC_604E: /* PowerPC 604e */
2130 case CPU_PPC_604R: /* PowerPC 604r */
2131 gen_spr_generic(env);
2132 gen_spr_ne_601(env);
2133 /* Memory management */
2134 gen_low_BATs(env);
2135 /* Time base */
2136 gen_tbl(env);
2137 gen_spr_604(env);
2138 /* Hardware implementation registers */
2139 /* XXX : not implemented */
2140 spr_register(env, SPR_HID0, "HID0",
2141 SPR_NOACCESS, SPR_NOACCESS,
2142 &spr_read_generic, &spr_write_generic,
2143 0x00000000);
2144 /* XXX : not implemented */
2145 spr_register(env, SPR_HID1, "HID1",
2146 SPR_NOACCESS, SPR_NOACCESS,
2147 &spr_read_generic, &spr_write_generic,
2148 0x00000000);
2149 break;
2151 case CPU_PPC_74x: /* PowerPC 740 / 750 */
2152 case CPU_PPC_740E:
2153 case CPU_PPC_750E:
2154 case CPU_PPC_74xP: /* PowerPC 740P / 750P */
2155 case CPU_PPC_750CXE21: /* IBM PowerPC 750cxe */
2156 case CPU_PPC_750CXE22:
2157 case CPU_PPC_750CXE23:
2158 case CPU_PPC_750CXE24:
2159 case CPU_PPC_750CXE24b:
2160 case CPU_PPC_750CXE31:
2161 case CPU_PPC_750CXE31b:
2162 case CPU_PPC_750CXR:
2163 gen_spr_generic(env);
2164 gen_spr_ne_601(env);
2165 /* Memory management */
2166 gen_low_BATs(env);
2167 /* Time base */
2168 gen_tbl(env);
2169 gen_spr_7xx(env);
2170 /* Hardware implementation registers */
2171 /* XXX : not implemented */
2172 spr_register(env, SPR_HID0, "HID0",
2173 SPR_NOACCESS, SPR_NOACCESS,
2174 &spr_read_generic, &spr_write_generic,
2175 0x00000000);
2176 /* XXX : not implemented */
2177 spr_register(env, SPR_HID1, "HID1",
2178 SPR_NOACCESS, SPR_NOACCESS,
2179 &spr_read_generic, &spr_write_generic,
2180 0x00000000);
2181 break;
2183 case CPU_PPC_750FX10: /* IBM PowerPC 750 FX */
2184 case CPU_PPC_750FX20:
2185 case CPU_PPC_750FX21:
2186 case CPU_PPC_750FX22:
2187 case CPU_PPC_750FX23:
2188 case CPU_PPC_750GX10: /* IBM PowerPC 750 GX */
2189 case CPU_PPC_750GX11:
2190 case CPU_PPC_750GX12:
2191 gen_spr_generic(env);
2192 gen_spr_ne_601(env);
2193 /* Memory management */
2194 gen_low_BATs(env);
2195 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2196 gen_high_BATs(env);
2197 /* Time base */
2198 gen_tbl(env);
2199 gen_spr_7xx(env);
2200 /* Hardware implementation registers */
2201 /* XXX : not implemented */
2202 spr_register(env, SPR_HID0, "HID0",
2203 SPR_NOACCESS, SPR_NOACCESS,
2204 &spr_read_generic, &spr_write_generic,
2205 0x00000000);
2206 /* XXX : not implemented */
2207 spr_register(env, SPR_HID1, "HID1",
2208 SPR_NOACCESS, SPR_NOACCESS,
2209 &spr_read_generic, &spr_write_generic,
2210 0x00000000);
2211 /* XXX : not implemented */
2212 spr_register(env, SPR_750_HID2, "HID2",
2213 SPR_NOACCESS, SPR_NOACCESS,
2214 &spr_read_generic, &spr_write_generic,
2215 0x00000000);
2216 break;
2218 case CPU_PPC_755_10: /* PowerPC 755 */
2219 case CPU_PPC_755_11:
2220 case CPU_PPC_755_20:
2221 case CPU_PPC_755D:
2222 case CPU_PPC_755E:
2223 gen_spr_generic(env);
2224 gen_spr_ne_601(env);
2225 /* Memory management */
2226 gen_low_BATs(env);
2227 /* Time base */
2228 gen_tbl(env);
2229 /* Memory management */
2230 gen_high_BATs(env);
2231 gen_6xx_7xx_soft_tlb(env, 64, 2);
2232 gen_spr_G2_755(env);
2233 /* L2 cache control */
2234 /* XXX : not implemented */
2235 spr_register(env, SPR_ICTC, "ICTC",
2236 SPR_NOACCESS, SPR_NOACCESS,
2237 &spr_read_generic, &spr_write_generic,
2238 0x00000000);
2239 /* XXX : not implemented */
2240 spr_register(env, SPR_L2PM, "L2PM",
2241 SPR_NOACCESS, SPR_NOACCESS,
2242 &spr_read_generic, &spr_write_generic,
2243 0x00000000);
2244 /* Hardware implementation registers */
2245 /* XXX : not implemented */
2246 spr_register(env, SPR_HID0, "HID0",
2247 SPR_NOACCESS, SPR_NOACCESS,
2248 &spr_read_generic, &spr_write_generic,
2249 0x00000000);
2250 /* XXX : not implemented */
2251 spr_register(env, SPR_HID1, "HID1",
2252 SPR_NOACCESS, SPR_NOACCESS,
2253 &spr_read_generic, &spr_write_generic,
2254 0x00000000);
2255 /* XXX : not implemented */
2256 spr_register(env, SPR_HID2, "HID2",
2257 SPR_NOACCESS, SPR_NOACCESS,
2258 &spr_read_generic, &spr_write_generic,
2259 0x00000000);
2260 break;
2262 #if defined (TODO)
2263 /* G4 family */
2264 case CPU_PPC_7400: /* PowerPC 7400 */
2265 case CPU_PPC_7410C: /* PowerPC 7410 */
2266 case CPU_PPC_7410D:
2267 case CPU_PPC_7410E:
2268 case CPU_PPC_7441: /* PowerPC 7441 */
2269 case CPU_PPC_7445: /* PowerPC 7445 */
2270 case CPU_PPC_7447: /* PowerPC 7447 */
2271 case CPU_PPC_7447A: /* PowerPC 7447A */
2272 case CPU_PPC_7448: /* PowerPC 7448 */
2273 case CPU_PPC_7450: /* PowerPC 7450 */
2274 case CPU_PPC_7450b:
2275 case CPU_PPC_7451: /* PowerPC 7451 */
2276 case CPU_PPC_7451G:
2277 case CPU_PPC_7455: /* PowerPC 7455 */
2278 case CPU_PPC_7455F:
2279 case CPU_PPC_7455G:
2280 case CPU_PPC_7457: /* PowerPC 7457 */
2281 case CPU_PPC_7457C:
2282 case CPU_PPC_7457A: /* PowerPC 7457A */
2283 break;
2284 #endif
2286 /* 64 bits PowerPC */
2287 #if defined (TARGET_PPC64)
2288 #if defined (TODO)
2289 case CPU_PPC_620: /* PowerPC 620 */
2290 case CPU_PPC_630: /* PowerPC 630 (Power 3) */
2291 case CPU_PPC_631: /* PowerPC 631 (Power 3+) */
2292 case CPU_PPC_POWER4: /* Power 4 */
2293 case CPU_PPC_POWER4P: /* Power 4+ */
2294 case CPU_PPC_POWER5: /* Power 5 */
2295 case CPU_PPC_POWER5P: /* Power 5+ */
2296 #endif
2297 case CPU_PPC_970: /* PowerPC 970 */
2298 case CPU_PPC_970FX10: /* PowerPC 970 FX */
2299 case CPU_PPC_970FX20:
2300 case CPU_PPC_970FX21:
2301 case CPU_PPC_970FX30:
2302 case CPU_PPC_970FX31:
2303 case CPU_PPC_970MP10: /* PowerPC 970 MP */
2304 case CPU_PPC_970MP11:
2305 #if defined (TODO)
2306 case CPU_PPC_CELL10: /* Cell family */
2307 case CPU_PPC_CELL20:
2308 case CPU_PPC_CELL30:
2309 case CPU_PPC_CELL31:
2310 #endif
2311 #if defined (TODO)
2312 case CPU_PPC_RS64: /* Apache (RS64/A35) */
2313 case CPU_PPC_RS64II: /* NorthStar (RS64-II/A50) */
2314 case CPU_PPC_RS64III: /* Pulsar (RS64-III) */
2315 case CPU_PPC_RS64IV: /* IceStar/IStar/SStar (RS64-IV) */
2316 #endif
2317 break;
2318 #endif /* defined (TARGET_PPC64) */
2320 #if defined (TODO)
2321 /* POWER */
2322 case CPU_POWER: /* POWER */
2323 case CPU_POWER2: /* POWER2 */
2324 break;
2325 #endif
2327 default:
2328 gen_spr_generic(env);
2329 break;
2331 if (env->nb_BATs == -1)
2332 env->nb_BATs = 4;
2333 /* Allocate TLBs buffer when needed */
2334 if (env->nb_tlb != 0) {
2335 int nb_tlb = env->nb_tlb;
2336 if (env->id_tlbs != 0)
2337 nb_tlb *= 2;
2338 env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
2339 /* Pre-compute some useful values */
2340 env->tlb_per_way = env->nb_tlb / env->nb_ways;
2344 #if defined(PPC_DUMP_CPU)
2345 static void dump_sprs (CPUPPCState *env)
2347 ppc_spr_t *spr;
2348 uint32_t pvr = env->spr[SPR_PVR];
2349 uint32_t sr, sw, ur, uw;
2350 int i, j, n;
2352 printf("* SPRs for PVR=%08x\n", pvr);
2353 for (i = 0; i < 32; i++) {
2354 for (j = 0; j < 32; j++) {
2355 n = (i << 5) | j;
2356 spr = &env->spr_cb[n];
2357 #if !defined(CONFIG_USER_ONLY)
2358 sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
2359 sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
2360 #else
2361 sw = 0;
2362 sr = 0;
2363 #endif
2364 uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
2365 ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
2366 if (sw || sr || uw || ur) {
2367 printf("%4d (%03x) %8s s%c%c u%c%c\n",
2368 (i << 5) | j, (i << 5) | j, spr->name,
2369 sw ? 'w' : '-', sr ? 'r' : '-',
2370 uw ? 'w' : '-', ur ? 'r' : '-');
2374 fflush(stdout);
2375 fflush(stderr);
2377 #endif
2379 /*****************************************************************************/
2380 #include <stdlib.h>
2381 #include <string.h>
2383 int fflush (FILE *stream);
2385 /* Opcode types */
2386 enum {
2387 PPC_DIRECT = 0, /* Opcode routine */
2388 PPC_INDIRECT = 1, /* Indirect opcode table */
2391 static inline int is_indirect_opcode (void *handler)
2393 return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
2396 static inline opc_handler_t **ind_table(void *handler)
2398 return (opc_handler_t **)((unsigned long)handler & ~3);
2401 /* Instruction table creation */
2402 /* Opcodes tables creation */
2403 static void fill_new_table (opc_handler_t **table, int len)
2405 int i;
2407 for (i = 0; i < len; i++)
2408 table[i] = &invalid_handler;
2411 static int create_new_table (opc_handler_t **table, unsigned char idx)
2413 opc_handler_t **tmp;
2415 tmp = malloc(0x20 * sizeof(opc_handler_t));
2416 if (tmp == NULL)
2417 return -1;
2418 fill_new_table(tmp, 0x20);
2419 table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
2421 return 0;
2424 static int insert_in_table (opc_handler_t **table, unsigned char idx,
2425 opc_handler_t *handler)
2427 if (table[idx] != &invalid_handler)
2428 return -1;
2429 table[idx] = handler;
2431 return 0;
2434 static int register_direct_insn (opc_handler_t **ppc_opcodes,
2435 unsigned char idx, opc_handler_t *handler)
2437 if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
2438 printf("*** ERROR: opcode %02x already assigned in main "
2439 "opcode table\n", idx);
2440 return -1;
2443 return 0;
2446 static int register_ind_in_table (opc_handler_t **table,
2447 unsigned char idx1, unsigned char idx2,
2448 opc_handler_t *handler)
2450 if (table[idx1] == &invalid_handler) {
2451 if (create_new_table(table, idx1) < 0) {
2452 printf("*** ERROR: unable to create indirect table "
2453 "idx=%02x\n", idx1);
2454 return -1;
2456 } else {
2457 if (!is_indirect_opcode(table[idx1])) {
2458 printf("*** ERROR: idx %02x already assigned to a direct "
2459 "opcode\n", idx1);
2460 return -1;
2463 if (handler != NULL &&
2464 insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
2465 printf("*** ERROR: opcode %02x already assigned in "
2466 "opcode table %02x\n", idx2, idx1);
2467 return -1;
2470 return 0;
2473 static int register_ind_insn (opc_handler_t **ppc_opcodes,
2474 unsigned char idx1, unsigned char idx2,
2475 opc_handler_t *handler)
2477 int ret;
2479 ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
2481 return ret;
2484 static int register_dblind_insn (opc_handler_t **ppc_opcodes,
2485 unsigned char idx1, unsigned char idx2,
2486 unsigned char idx3, opc_handler_t *handler)
2488 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
2489 printf("*** ERROR: unable to join indirect table idx "
2490 "[%02x-%02x]\n", idx1, idx2);
2491 return -1;
2493 if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
2494 handler) < 0) {
2495 printf("*** ERROR: unable to insert opcode "
2496 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
2497 return -1;
2500 return 0;
2503 static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
2505 if (insn->opc2 != 0xFF) {
2506 if (insn->opc3 != 0xFF) {
2507 if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
2508 insn->opc3, &insn->handler) < 0)
2509 return -1;
2510 } else {
2511 if (register_ind_insn(ppc_opcodes, insn->opc1,
2512 insn->opc2, &insn->handler) < 0)
2513 return -1;
2515 } else {
2516 if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
2517 return -1;
2520 return 0;
2523 static int test_opcode_table (opc_handler_t **table, int len)
2525 int i, count, tmp;
2527 for (i = 0, count = 0; i < len; i++) {
2528 /* Consistency fixup */
2529 if (table[i] == NULL)
2530 table[i] = &invalid_handler;
2531 if (table[i] != &invalid_handler) {
2532 if (is_indirect_opcode(table[i])) {
2533 tmp = test_opcode_table(ind_table(table[i]), 0x20);
2534 if (tmp == 0) {
2535 free(table[i]);
2536 table[i] = &invalid_handler;
2537 } else {
2538 count++;
2540 } else {
2541 count++;
2546 return count;
2549 static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
2551 if (test_opcode_table(ppc_opcodes, 0x40) == 0)
2552 printf("*** WARNING: no opcode defined !\n");
2555 /*****************************************************************************/
2556 static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
2558 opcode_t *opc, *start, *end;
2560 fill_new_table(env->opcodes, 0x40);
2561 #if defined(PPC_DUMP_CPU)
2562 printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2563 " %08x\n",
2564 def->pvr, def->name, def->insns_flags, def->flags);
2565 #endif
2566 if (&opc_start < &opc_end) {
2567 start = &opc_start;
2568 end = &opc_end;
2569 } else {
2570 start = &opc_end;
2571 end = &opc_start;
2573 for (opc = start + 1; opc != end; opc++) {
2574 if ((opc->handler.type & def->insns_flags) != 0) {
2575 if (register_insn(env->opcodes, opc) < 0) {
2576 printf("*** ERROR initializing PowerPC instruction "
2577 "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
2578 opc->opc3);
2579 return -1;
2581 #if defined(PPC_DUMP_CPU)
2582 if (opc1 != 0x00) {
2583 if (opc->opc3 == 0xFF) {
2584 if (opc->opc2 == 0xFF) {
2585 printf(" %02x -- -- (%2d ----) : %s\n",
2586 opc->opc1, opc->opc1, opc->oname);
2587 } else {
2588 printf(" %02x %02x -- (%2d %4d) : %s\n",
2589 opc->opc1, opc->opc2, opc->opc1, opc->opc2,
2590 opc->oname);
2592 } else {
2593 printf(" %02x %02x %02x (%2d %4d) : %s\n",
2594 opc->opc1, opc->opc2, opc->opc3,
2595 opc->opc1, (opc->opc3 << 5) | opc->opc2,
2596 opc->oname);
2599 #endif
2602 fix_opcode_tables(env->opcodes);
2603 fflush(stdout);
2604 fflush(stderr);
2606 return 0;
2609 int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
2611 env->msr_mask = def->msr_mask;
2612 env->flags = def->flags;
2613 if (create_ppc_opcodes(env, def) < 0)
2614 return -1;
2615 init_ppc_proc(env, def);
2616 #if defined(PPC_DUMP_CPU)
2617 dump_sprs(env);
2618 if (env->tlb != NULL) {
2619 printf("%d %s TLB in %d ways\n", env->nb_tlb,
2620 env->id_tlbs ? "splitted" : "merged", env->nb_ways);
2622 #endif
2624 return 0;
2627 void do_compute_hflags (CPUPPCState *env);
2628 CPUPPCState *cpu_ppc_init (void)
2630 CPUPPCState *env;
2632 env = qemu_mallocz(sizeof(CPUPPCState));
2633 if (!env)
2634 return NULL;
2635 cpu_exec_init(env);
2636 tlb_flush(env, 1);
2637 #if defined (DO_SINGLE_STEP) && 0
2638 /* Single step trace mode */
2639 msr_se = 1;
2640 msr_be = 1;
2641 #endif
2642 msr_fp = 1; /* Allow floating point exceptions */
2643 msr_me = 1; /* Allow machine check exceptions */
2644 #if defined(CONFIG_USER_ONLY)
2645 msr_pr = 1;
2646 #else
2647 env->nip = 0xFFFFFFFC;
2648 #endif
2649 do_compute_hflags(env);
2650 env->reserve = -1;
2651 return env;
2654 void cpu_ppc_close(CPUPPCState *env)
2656 /* Should also remove all opcode tables... */
2657 free(env);
2660 /*****************************************************************************/
2661 /* PowerPC CPU definitions */
2662 static ppc_def_t ppc_defs[] =
2664 /* Embedded PowerPC */
2665 #if defined (TODO)
2666 /* PowerPC 401 */
2668 .name = "401",
2669 .pvr = CPU_PPC_401,
2670 .pvr_mask = 0xFFFF0000,
2671 .insns_flags = PPC_INSNS_401,
2672 .flags = PPC_FLAGS_401,
2673 .msr_mask = xxx,
2675 #endif
2676 #if defined (TODO)
2677 /* IOP480 (401 microcontroler) */
2679 .name = "iop480",
2680 .pvr = CPU_PPC_IOP480,
2681 .pvr_mask = 0xFFFF0000,
2682 .insns_flags = PPC_INSNS_401,
2683 .flags = PPC_FLAGS_401,
2684 .msr_mask = xxx,
2686 #endif
2687 #if defined (TODO)
2688 /* IBM Processor for Network Resources */
2690 .name = "Cobra",
2691 .pvr = CPU_PPC_COBRA,
2692 .pvr_mask = 0xFFFF0000,
2693 .insns_flags = PPC_INSNS_401,
2694 .flags = PPC_FLAGS_401,
2695 .msr_mask = xxx,
2697 #endif
2698 #if defined (TODO)
2699 /* Generic PowerPC 403 */
2701 .name = "403",
2702 .pvr = CPU_PPC_403,
2703 .pvr_mask = 0xFFFFFF00,
2704 .insns_flags = PPC_INSNS_403,
2705 .flags = PPC_FLAGS_403,
2706 .msr_mask = 0x000000000007D23D,
2708 #endif
2709 #if defined (TODO)
2710 /* PowerPC 403 GA */
2712 .name = "403ga",
2713 .pvr = CPU_PPC_403GA,
2714 .pvr_mask = 0xFFFFFF00,
2715 .insns_flags = PPC_INSNS_403,
2716 .flags = PPC_FLAGS_403,
2717 .msr_mask = 0x000000000007D23D,
2719 #endif
2720 #if defined (TODO)
2721 /* PowerPC 403 GB */
2723 .name = "403gb",
2724 .pvr = CPU_PPC_403GB,
2725 .pvr_mask = 0xFFFFFF00,
2726 .insns_flags = PPC_INSNS_403,
2727 .flags = PPC_FLAGS_403,
2728 .msr_mask = 0x000000000007D23D,
2730 #endif
2731 #if defined (TODO)
2732 /* PowerPC 403 GC */
2734 .name = "403gc",
2735 .pvr = CPU_PPC_403GC,
2736 .pvr_mask = 0xFFFFFF00,
2737 .insns_flags = PPC_INSNS_403,
2738 .flags = PPC_FLAGS_403,
2739 .msr_mask = 0x000000000007D23D,
2741 #endif
2742 #if defined (TODO)
2743 /* PowerPC 403 GCX */
2745 .name = "403gcx",
2746 .pvr = CPU_PPC_403GCX,
2747 .pvr_mask = 0xFFFFFF00,
2748 .insns_flags = PPC_INSNS_403,
2749 .flags = PPC_FLAGS_403,
2750 .msr_mask = 0x000000000007D23D,
2752 #endif
2753 #if defined (TODO)
2754 /* Generic PowerPC 405 */
2756 .name = "405",
2757 .pvr = CPU_PPC_405,
2758 .pvr_mask = 0xFFFF0000,
2759 .insns_flags = PPC_INSNS_405,
2760 .flags = PPC_FLAGS_405,
2761 .msr_mask = 0x00000000020EFF30,
2763 #endif
2764 #if defined (TODO)
2765 /* PowerPC 405 CR */
2767 .name = "405cr",
2768 .pvr = CPU_PPC_405,
2769 .pvr_mask = 0xFFFF0000,
2770 .insns_flags = PPC_INSNS_405,
2771 .flags = PPC_FLAGS_405,
2772 .msr_mask = 0x00000000020EFF30,
2774 #endif
2775 #if defined (TODO)
2776 /* PowerPC 405 GP */
2778 .name = "405gp",
2779 .pvr = CPU_PPC_405,
2780 .pvr_mask = 0xFFFF0000,
2781 .insns_flags = PPC_INSNS_405,
2782 .flags = PPC_FLAGS_405,
2783 .msr_mask = 0x00000000020EFF30,
2785 #endif
2786 #if defined (TODO)
2787 /* PowerPC 405 EP */
2789 .name = "405ep",
2790 .pvr = CPU_PPC_405EP,
2791 .pvr_mask = 0xFFFF0000,
2792 .insns_flags = PPC_INSNS_405,
2793 .flags = PPC_FLAGS_405,
2794 .msr_mask = 0x00000000020EFF30,
2796 #endif
2797 #if defined (TODO)
2798 /* PowerPC 405 GPR */
2800 .name = "405gpr",
2801 .pvr = CPU_PPC_405GPR,
2802 .pvr_mask = 0xFFFF0000,
2803 .insns_flags = PPC_INSNS_405,
2804 .flags = PPC_FLAGS_405,
2805 .msr_mask = 0x00000000020EFF30,
2807 #endif
2808 #if defined (TODO)
2809 /* PowerPC 405 D2 */
2811 .name = "405d2",
2812 .pvr = CPU_PPC_405D2,
2813 .pvr_mask = 0xFFFF0000,
2814 .insns_flags = PPC_INSNS_405,
2815 .flags = PPC_FLAGS_405,
2816 .msr_mask = 0x00000000020EFF30,
2818 #endif
2819 #if defined (TODO)
2820 /* PowerPC 405 D4 */
2822 .name = "405d4",
2823 .pvr = CPU_PPC_405D4,
2824 .pvr_mask = 0xFFFF0000,
2825 .insns_flags = PPC_INSNS_405,
2826 .flags = PPC_FLAGS_405,
2827 .msr_mask = 0x00000000020EFF30,
2829 #endif
2830 #if defined (TODO)
2831 /* Npe405 H */
2833 .name = "Npe405H",
2834 .pvr = CPU_PPC_NPE405H,
2835 .pvr_mask = 0xFFFF0000,
2836 .insns_flags = PPC_INSNS_405,
2837 .flags = PPC_FLAGS_405,
2838 .msr_mask = 0x00000000020EFF30,
2840 #endif
2841 #if defined (TODO)
2842 /* Npe405 L */
2844 .name = "Npe405L",
2845 .pvr = CPU_PPC_NPE405L,
2846 .pvr_mask = 0xFFFF0000,
2847 .insns_flags = PPC_INSNS_405,
2848 .flags = PPC_FLAGS_405,
2849 .msr_mask = 0x00000000020EFF30,
2851 #endif
2852 #if defined (TODO)
2853 /* STB010000 */
2855 .name = "STB01000",
2856 .pvr = CPU_PPC_STB01000,
2857 .pvr_mask = 0xFFFF0000,
2858 .insns_flags = PPC_INSNS_405,
2859 .flags = PPC_FLAGS_405,
2860 .msr_mask = 0x00000000020EFF30,
2862 #endif
2863 #if defined (TODO)
2864 /* STB01010 */
2866 .name = "STB01010",
2867 .pvr = CPU_PPC_STB01010,
2868 .pvr_mask = 0xFFFF0000,
2869 .insns_flags = PPC_INSNS_405,
2870 .flags = PPC_FLAGS_405,
2871 .msr_mask = 0x00000000020EFF30,
2873 #endif
2874 #if defined (TODO)
2875 /* STB0210 */
2877 .name = "STB0210",
2878 .pvr = CPU_PPC_STB0210,
2879 .pvr_mask = 0xFFFF0000,
2880 .insns_flags = PPC_INSNS_405,
2881 .flags = PPC_FLAGS_405,
2882 .msr_mask = 0x00000000020EFF30,
2884 #endif
2885 #if defined (TODO)
2886 /* STB03xx */
2888 .name = "STB03",
2889 .pvr = CPU_PPC_STB03,
2890 .pvr_mask = 0xFFFF0000,
2891 .insns_flags = PPC_INSNS_405,
2892 .flags = PPC_FLAGS_405,
2893 .msr_mask = 0x00000000020EFF30,
2895 #endif
2896 #if defined (TODO)
2897 /* STB043x */
2899 .name = "STB043",
2900 .pvr = CPU_PPC_STB043,
2901 .pvr_mask = 0xFFFF0000,
2902 .insns_flags = PPC_INSNS_405,
2903 .flags = PPC_FLAGS_405,
2904 .msr_mask = 0x00000000020EFF30,
2906 #endif
2907 #if defined (TODO)
2908 /* STB045x */
2910 .name = "STB045",
2911 .pvr = CPU_PPC_STB045,
2912 .pvr_mask = 0xFFFF0000,
2913 .insns_flags = PPC_INSNS_405,
2914 .flags = PPC_FLAGS_405,
2915 .msr_mask = 0x00000000020EFF30,
2917 #endif
2918 #if defined (TODO)
2919 /* STB25xx */
2921 .name = "STB25",
2922 .pvr = CPU_PPC_STB25,
2923 .pvr_mask = 0xFFFF0000,
2924 .insns_flags = PPC_INSNS_405,
2925 .flags = PPC_FLAGS_405,
2926 .msr_mask = 0x00000000020EFF30,
2928 #endif
2929 #if defined (TODO)
2930 /* STB130 */
2932 .name = "STB130",
2933 .pvr = CPU_PPC_STB130,
2934 .pvr_mask = 0xFFFF0000,
2935 .insns_flags = PPC_INSNS_405,
2936 .flags = PPC_FLAGS_405,
2937 .msr_mask = 0x00000000020EFF30,
2939 #endif
2940 /* Xilinx PowerPC 405 cores */
2941 #if defined (TODO)
2943 .name = "x2vp4",
2944 .pvr = CPU_PPC_X2VP4,
2945 .pvr_mask = 0xFFFF0000,
2946 .insns_flags = PPC_INSNS_405,
2947 .flags = PPC_FLAGS_405,
2948 .msr_mask = 0x00000000020EFF30,
2951 .name = "x2vp7",
2952 .pvr = CPU_PPC_X2VP7,
2953 .pvr_mask = 0xFFFF0000,
2954 .insns_flags = PPC_INSNS_405,
2955 .flags = PPC_FLAGS_405,
2956 .msr_mask = 0x00000000020EFF30,
2959 .name = "x2vp20",
2960 .pvr = CPU_PPC_X2VP20,
2961 .pvr_mask = 0xFFFF0000,
2962 .insns_flags = PPC_INSNS_405,
2963 .flags = PPC_FLAGS_405,
2964 .msr_mask = 0x00000000020EFF30,
2967 .name = "x2vp50",
2968 .pvr = CPU_PPC_X2VP50,
2969 .pvr_mask = 0xFFFF0000,
2970 .insns_flags = PPC_INSNS_405,
2971 .flags = PPC_FLAGS_405,
2972 .msr_mask = 0x00000000020EFF30,
2974 #endif
2975 #if defined (TODO)
2976 /* PowerPC 440 EP */
2978 .name = "440ep",
2979 .pvr = CPU_PPC_440EP,
2980 .pvr_mask = 0xFFFF0000,
2981 .insns_flags = PPC_INSNS_440,
2982 .flags = PPC_FLAGS_440,
2983 .msr_mask = 0x000000000006D630,
2985 #endif
2986 #if defined (TODO)
2987 /* PowerPC 440 GR */
2989 .name = "440gr",
2990 .pvr = CPU_PPC_440GR,
2991 .pvr_mask = 0xFFFF0000,
2992 .insns_flags = PPC_INSNS_440,
2993 .flags = PPC_FLAGS_440,
2994 .msr_mask = 0x000000000006D630,
2996 #endif
2997 #if defined (TODO)
2998 /* PowerPC 440 GP */
3000 .name = "440gp",
3001 .pvr = CPU_PPC_440GP,
3002 .pvr_mask = 0xFFFFFF00,
3003 .insns_flags = PPC_INSNS_440,
3004 .flags = PPC_FLAGS_440,
3005 .msr_mask = 0x000000000006D630,
3007 #endif
3008 #if defined (TODO)
3009 /* PowerPC 440 GX */
3011 .name = "440gx",
3012 .pvr = CPU_PPC_440GX,
3013 .pvr_mask = 0xFFFF0000,
3014 .insns_flags = PPC_INSNS_405,
3015 .flags = PPC_FLAGS_440,
3016 .msr_mask = 0x000000000006D630,
3018 #endif
3019 #if defined (TODO)
3020 /* PowerPC 440 GXc */
3022 .name = "440gxc",
3023 .pvr = CPU_PPC_440GXC,
3024 .pvr_mask = 0xFFFF0000,
3025 .insns_flags = PPC_INSNS_405,
3026 .flags = PPC_FLAGS_440,
3027 .msr_mask = 0x000000000006D630,
3029 #endif
3030 #if defined (TODO)
3031 /* PowerPC 440 GXf */
3033 .name = "440gxf",
3034 .pvr = CPU_PPC_440GXF,
3035 .pvr_mask = 0xFFFF0000,
3036 .insns_flags = PPC_INSNS_405,
3037 .flags = PPC_FLAGS_440,
3038 .msr_mask = 0x000000000006D630,
3040 #endif
3041 #if defined (TODO)
3042 /* PowerPC 440 SP */
3044 .name = "440sp",
3045 .pvr = CPU_PPC_440SP,
3046 .pvr_mask = 0xFFFF0000,
3047 .insns_flags = PPC_INSNS_405,
3048 .flags = PPC_FLAGS_440,
3049 .msr_mask = 0x000000000006D630,
3051 #endif
3052 #if defined (TODO)
3053 /* PowerPC 440 SP2 */
3055 .name = "440sp2",
3056 .pvr = CPU_PPC_440SP2,
3057 .pvr_mask = 0xFFFF0000,
3058 .insns_flags = PPC_INSNS_405,
3059 .flags = PPC_FLAGS_440,
3060 .msr_mask = 0x000000000006D630,
3062 #endif
3063 #if defined (TODO)
3064 /* PowerPC 440 SPE */
3066 .name = "440spe",
3067 .pvr = CPU_PPC_440SPE,
3068 .pvr_mask = 0xFFFF0000,
3069 .insns_flags = PPC_INSNS_405,
3070 .flags = PPC_FLAGS_440,
3071 .msr_mask = 0x000000000006D630,
3073 #endif
3074 /* Fake generic BookE PowerPC */
3076 .name = "BookE",
3077 .pvr = CPU_PPC_e500,
3078 .pvr_mask = 0xFFFFFFFF,
3079 .insns_flags = PPC_INSNS_BOOKE,
3080 .flags = PPC_FLAGS_BOOKE,
3081 .msr_mask = 0x000000000006D630,
3083 /* PowerPC 460 cores - TODO */
3084 /* PowerPC MPC 5xx cores - TODO */
3085 /* PowerPC MPC 8xx cores - TODO */
3086 /* PowerPC MPC 8xxx cores - TODO */
3087 /* e200 cores - TODO */
3088 /* e500 cores - TODO */
3089 /* e600 cores - TODO */
3091 /* 32 bits "classic" PowerPC */
3092 #if defined (TODO)
3093 /* PowerPC 601 */
3095 .name = "601",
3096 .pvr = CPU_PPC_601,
3097 .pvr_mask = 0xFFFF0000,
3098 .insns_flags = PPC_INSNS_601,
3099 .flags = PPC_FLAGS_601,
3100 .msr_mask = 0x000000000000FD70,
3102 #endif
3103 #if defined (TODO)
3104 /* PowerPC 602 */
3106 .name = "602",
3107 .pvr = CPU_PPC_602,
3108 .pvr_mask = 0xFFFF0000,
3109 .insns_flags = PPC_INSNS_602,
3110 .flags = PPC_FLAGS_602,
3111 .msr_mask = 0x0000000000C7FF73,
3113 #endif
3114 /* PowerPC 603 */
3116 .name = "603",
3117 .pvr = CPU_PPC_603,
3118 .pvr_mask = 0xFFFFFFFF,
3119 .insns_flags = PPC_INSNS_603,
3120 .flags = PPC_FLAGS_603,
3121 .msr_mask = 0x000000000007FF73,
3123 /* PowerPC 603e */
3125 .name = "603e",
3126 .pvr = CPU_PPC_603E,
3127 .pvr_mask = 0xFFFFFFFF,
3128 .insns_flags = PPC_INSNS_603,
3129 .flags = PPC_FLAGS_603,
3130 .msr_mask = 0x000000000007FF73,
3133 .name = "Stretch",
3134 .pvr = CPU_PPC_603E,
3135 .pvr_mask = 0xFFFFFFFF,
3136 .insns_flags = PPC_INSNS_603,
3137 .flags = PPC_FLAGS_603,
3138 .msr_mask = 0x000000000007FF73,
3140 /* PowerPC 603p */
3142 .name = "603p",
3143 .pvr = CPU_PPC_603P,
3144 .pvr_mask = 0xFFFFFFFF,
3145 .insns_flags = PPC_INSNS_603,
3146 .flags = PPC_FLAGS_603,
3147 .msr_mask = 0x000000000007FF73,
3149 /* PowerPC 603e7 */
3151 .name = "603e7",
3152 .pvr = CPU_PPC_603E7,
3153 .pvr_mask = 0xFFFFFFFF,
3154 .insns_flags = PPC_INSNS_603,
3155 .flags = PPC_FLAGS_603,
3156 .msr_mask = 0x000000000007FF73,
3158 /* PowerPC 603e7v */
3160 .name = "603e7v",
3161 .pvr = CPU_PPC_603E7v,
3162 .pvr_mask = 0xFFFFFFFF,
3163 .insns_flags = PPC_INSNS_603,
3164 .flags = PPC_FLAGS_603,
3165 .msr_mask = 0x000000000007FF73,
3167 /* PowerPC 603e7v2 */
3169 .name = "603e7v2",
3170 .pvr = CPU_PPC_603E7v2,
3171 .pvr_mask = 0xFFFFFFFF,
3172 .insns_flags = PPC_INSNS_603,
3173 .flags = PPC_FLAGS_603,
3174 .msr_mask = 0x000000000007FF73,
3176 /* PowerPC 603r */
3178 .name = "603r",
3179 .pvr = CPU_PPC_603R,
3180 .pvr_mask = 0xFFFFFFFF,
3181 .insns_flags = PPC_INSNS_603,
3182 .flags = PPC_FLAGS_603,
3183 .msr_mask = 0x000000000007FF73,
3186 .name = "Goldeneye",
3187 .pvr = CPU_PPC_603R,
3188 .pvr_mask = 0xFFFFFFFF,
3189 .insns_flags = PPC_INSNS_603,
3190 .flags = PPC_FLAGS_603,
3191 .msr_mask = 0x000000000007FF73,
3193 #if defined (TODO)
3194 /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */
3196 .name = "G2",
3197 .pvr = CPU_PPC_G2,
3198 .pvr_mask = 0xFFFF0000,
3199 .insns_flags = PPC_INSNS_G2,
3200 .flags = PPC_FLAGS_G2,
3201 .msr_mask = 0x000000000006FFF2,
3204 .name = "G2h4",
3205 .pvr = CPU_PPC_G2H4,
3206 .pvr_mask = 0xFFFF0000,
3207 .insns_flags = PPC_INSNS_G2,
3208 .flags = PPC_FLAGS_G2,
3209 .msr_mask = 0x000000000006FFF2,
3212 .name = "G2gp",
3213 .pvr = CPU_PPC_G2gp,
3214 .pvr_mask = 0xFFFF0000,
3215 .insns_flags = PPC_INSNS_G2,
3216 .flags = PPC_FLAGS_G2,
3217 .msr_mask = 0x000000000006FFF2,
3220 .name = "G2ls",
3221 .pvr = CPU_PPC_G2ls,
3222 .pvr_mask = 0xFFFF0000,
3223 .insns_flags = PPC_INSNS_G2,
3224 .flags = PPC_FLAGS_G2,
3225 .msr_mask = 0x000000000006FFF2,
3227 { /* Same as G2, with LE mode support */
3228 .name = "G2le",
3229 .pvr = CPU_PPC_G2LE,
3230 .pvr_mask = 0xFFFF0000,
3231 .insns_flags = PPC_INSNS_G2,
3232 .flags = PPC_FLAGS_G2,
3233 .msr_mask = 0x000000000007FFF3,
3236 .name = "G2legp",
3237 .pvr = CPU_PPC_G2LEgp,
3238 .pvr_mask = 0xFFFF0000,
3239 .insns_flags = PPC_INSNS_G2,
3240 .flags = PPC_FLAGS_G2,
3241 .msr_mask = 0x000000000007FFF3,
3244 .name = "G2lels",
3245 .pvr = CPU_PPC_G2LEls,
3246 .pvr_mask = 0xFFFF0000,
3247 .insns_flags = PPC_INSNS_G2,
3248 .flags = PPC_FLAGS_G2,
3249 .msr_mask = 0x000000000007FFF3,
3251 #endif
3252 /* PowerPC 604 */
3254 .name = "604",
3255 .pvr = CPU_PPC_604,
3256 .pvr_mask = 0xFFFFFFFF,
3257 .insns_flags = PPC_INSNS_604,
3258 .flags = PPC_FLAGS_604,
3259 .msr_mask = 0x000000000005FF77,
3261 /* PowerPC 604e */
3263 .name = "604e",
3264 .pvr = CPU_PPC_604E,
3265 .pvr_mask = 0xFFFFFFFF,
3266 .insns_flags = PPC_INSNS_604,
3267 .flags = PPC_FLAGS_604,
3268 .msr_mask = 0x000000000005FF77,
3270 /* PowerPC 604r */
3272 .name = "604r",
3273 .pvr = CPU_PPC_604R,
3274 .pvr_mask = 0xFFFFFFFF,
3275 .insns_flags = PPC_INSNS_604,
3276 .flags = PPC_FLAGS_604,
3277 .msr_mask = 0x000000000005FF77,
3279 /* generic G3 */
3281 .name = "G3",
3282 .pvr = CPU_PPC_74x,
3283 .pvr_mask = 0xFFFFFFFF,
3284 .insns_flags = PPC_INSNS_7x0,
3285 .flags = PPC_FLAGS_7x0,
3286 .msr_mask = 0x000000000007FF77,
3288 /* MPC740 (G3) */
3290 .name = "740",
3291 .pvr = CPU_PPC_74x,
3292 .pvr_mask = 0xFFFFFFFF,
3293 .insns_flags = PPC_INSNS_7x0,
3294 .flags = PPC_FLAGS_7x0,
3295 .msr_mask = 0x000000000007FF77,
3298 .name = "Arthur",
3299 .pvr = CPU_PPC_74x,
3300 .pvr_mask = 0xFFFFFFFF,
3301 .insns_flags = PPC_INSNS_7x0,
3302 .flags = PPC_FLAGS_7x0,
3303 .msr_mask = 0x000000000007FF77,
3305 #if defined (TODO)
3306 /* MPC745 (G3) */
3308 .name = "745",
3309 .pvr = CPU_PPC_74x,
3310 .pvr_mask = 0xFFFFF000,
3311 .insns_flags = PPC_INSNS_7x5,
3312 .flags = PPC_FLAGS_7x5,
3313 .msr_mask = 0x000000000007FF77,
3316 .name = "Goldfinger",
3317 .pvr = CPU_PPC_74x,
3318 .pvr_mask = 0xFFFFF000,
3319 .insns_flags = PPC_INSNS_7x5,
3320 .flags = PPC_FLAGS_7x5,
3321 .msr_mask = 0x000000000007FF77,
3323 #endif
3324 /* MPC750 (G3) */
3326 .name = "750",
3327 .pvr = CPU_PPC_74x,
3328 .pvr_mask = 0xFFFFFFFF,
3329 .insns_flags = PPC_INSNS_7x0,
3330 .flags = PPC_FLAGS_7x0,
3331 .msr_mask = 0x000000000007FF77,
3333 #if defined (TODO)
3334 /* MPC755 (G3) */
3336 .name = "755",
3337 .pvr = CPU_PPC_755,
3338 .pvr_mask = 0xFFFFF000,
3339 .insns_flags = PPC_INSNS_7x5,
3340 .flags = PPC_FLAGS_7x5,
3341 .msr_mask = 0x000000000007FF77,
3343 #endif
3344 /* MPC740P (G3) */
3346 .name = "740p",
3347 .pvr = CPU_PPC_74xP,
3348 .pvr_mask = 0xFFFFFFFF,
3349 .insns_flags = PPC_INSNS_7x0,
3350 .flags = PPC_FLAGS_7x0,
3351 .msr_mask = 0x000000000007FF77,
3354 .name = "Conan/Doyle",
3355 .pvr = CPU_PPC_74xP,
3356 .pvr_mask = 0xFFFFFFFF,
3357 .insns_flags = PPC_INSNS_7x0,
3358 .flags = PPC_FLAGS_7x0,
3359 .msr_mask = 0x000000000007FF77,
3361 #if defined (TODO)
3362 /* MPC745P (G3) */
3364 .name = "745p",
3365 .pvr = CPU_PPC_74xP,
3366 .pvr_mask = 0xFFFFF000,
3367 .insns_flags = PPC_INSNS_7x5,
3368 .flags = PPC_FLAGS_7x5,
3369 .msr_mask = 0x000000000007FF77,
3371 #endif
3372 /* MPC750P (G3) */
3374 .name = "750p",
3375 .pvr = CPU_PPC_74xP,
3376 .pvr_mask = 0xFFFFFFFF,
3377 .insns_flags = PPC_INSNS_7x0,
3378 .flags = PPC_FLAGS_7x0,
3379 .msr_mask = 0x000000000007FF77,
3381 #if defined (TODO)
3382 /* MPC755P (G3) */
3384 .name = "755p",
3385 .pvr = CPU_PPC_74xP,
3386 .pvr_mask = 0xFFFFF000,
3387 .insns_flags = PPC_INSNS_7x5,
3388 .flags = PPC_FLAGS_7x5,
3389 .msr_mask = 0x000000000007FF77,
3391 #endif
3392 /* IBM 750CXe (G3 embedded) */
3394 .name = "750cxe",
3395 .pvr = CPU_PPC_750CXE,
3396 .pvr_mask = 0xFFFFFFFF,
3397 .insns_flags = PPC_INSNS_7x0,
3398 .flags = PPC_FLAGS_7x0,
3399 .msr_mask = 0x000000000007FF77,
3401 /* IBM 750FX (G3 embedded) */
3403 .name = "750fx",
3404 .pvr = CPU_PPC_750FX,
3405 .pvr_mask = 0xFFFFFFFF,
3406 .insns_flags = PPC_INSNS_7x0,
3407 .flags = PPC_FLAGS_7x0,
3408 .msr_mask = 0x000000000007FF77,
3410 /* IBM 750GX (G3 embedded) */
3412 .name = "750gx",
3413 .pvr = CPU_PPC_750GX,
3414 .pvr_mask = 0xFFFFFFFF,
3415 .insns_flags = PPC_INSNS_7x0,
3416 .flags = PPC_FLAGS_7x0,
3417 .msr_mask = 0x000000000007FF77,
3419 #if defined (TODO)
3420 /* generic G4 */
3422 .name = "G4",
3423 .pvr = CPU_PPC_7400,
3424 .pvr_mask = 0xFFFF0000,
3425 .insns_flags = PPC_INSNS_74xx,
3426 .flags = PPC_FLAGS_74xx,
3427 .msr_mask = 0x000000000205FF77,
3429 #endif
3430 #if defined (TODO)
3431 /* PowerPC 7400 (G4) */
3433 .name = "7400",
3434 .pvr = CPU_PPC_7400,
3435 .pvr_mask = 0xFFFF0000,
3436 .insns_flags = PPC_INSNS_74xx,
3437 .flags = PPC_FLAGS_74xx,
3438 .msr_mask = 0x000000000205FF77,
3441 .name = "Max",
3442 .pvr = CPU_PPC_7400,
3443 .pvr_mask = 0xFFFF0000,
3444 .insns_flags = PPC_INSNS_74xx,
3445 .flags = PPC_FLAGS_74xx,
3446 .msr_mask = 0x000000000205FF77,
3448 #endif
3449 #if defined (TODO)
3450 /* PowerPC 7410 (G4) */
3452 .name = "7410",
3453 .pvr = CPU_PPC_7410,
3454 .pvr_mask = 0xFFFF0000,
3455 .insns_flags = PPC_INSNS_74xx,
3456 .flags = PPC_FLAGS_74xx,
3457 .msr_mask = 0x000000000205FF77,
3460 .name = "Nitro",
3461 .pvr = CPU_PPC_7410,
3462 .pvr_mask = 0xFFFF0000,
3463 .insns_flags = PPC_INSNS_74xx,
3464 .flags = PPC_FLAGS_74xx,
3465 .msr_mask = 0x000000000205FF77,
3467 #endif
3468 /* XXX: 7441 */
3469 /* XXX: 7445 */
3470 /* XXX: 7447 */
3471 /* XXX: 7447A */
3472 #if defined (TODO)
3473 /* PowerPC 7450 (G4) */
3475 .name = "7450",
3476 .pvr = CPU_PPC_7450,
3477 .pvr_mask = 0xFFFF0000,
3478 .insns_flags = PPC_INSNS_74xx,
3479 .flags = PPC_FLAGS_74xx,
3480 .msr_mask = 0x000000000205FF77,
3483 .name = "Vger",
3484 .pvr = CPU_PPC_7450,
3485 .pvr_mask = 0xFFFF0000,
3486 .insns_flags = PPC_INSNS_74xx,
3487 .flags = PPC_FLAGS_74xx,
3488 .msr_mask = 0x000000000205FF77,
3490 #endif
3491 /* XXX: 7451 */
3492 #if defined (TODO)
3493 /* PowerPC 7455 (G4) */
3495 .name = "7455",
3496 .pvr = CPU_PPC_7455,
3497 .pvr_mask = 0xFFFF0000,
3498 .insns_flags = PPC_INSNS_74xx,
3499 .flags = PPC_FLAGS_74xx,
3500 .msr_mask = 0x000000000205FF77,
3503 .name = "Apollo 6",
3504 .pvr = CPU_PPC_7455,
3505 .pvr_mask = 0xFFFF0000,
3506 .insns_flags = PPC_INSNS_74xx,
3507 .flags = PPC_FLAGS_74xx,
3508 .msr_mask = 0x000000000205FF77,
3510 #endif
3511 #if defined (TODO)
3512 /* PowerPC 7457 (G4) */
3514 .name = "7457",
3515 .pvr = CPU_PPC_7457,
3516 .pvr_mask = 0xFFFF0000,
3517 .insns_flags = PPC_INSNS_74xx,
3518 .flags = PPC_FLAGS_74xx,
3519 .msr_mask = 0x000000000205FF77,
3522 .name = "Apollo 7",
3523 .pvr = CPU_PPC_7457,
3524 .pvr_mask = 0xFFFF0000,
3525 .insns_flags = PPC_INSNS_74xx,
3526 .flags = PPC_FLAGS_74xx,
3527 .msr_mask = 0x000000000205FF77,
3529 #endif
3530 #if defined (TODO)
3531 /* PowerPC 7457A (G4) */
3533 .name = "7457A",
3534 .pvr = CPU_PPC_7457A,
3535 .pvr_mask = 0xFFFF0000,
3536 .insns_flags = PPC_INSNS_74xx,
3537 .flags = PPC_FLAGS_74xx,
3538 .msr_mask = 0x000000000205FF77,
3541 .name = "Apollo 7 PM",
3542 .pvr = CPU_PPC_7457A,
3543 .pvr_mask = 0xFFFF0000,
3544 .insns_flags = PPC_INSNS_74xx,
3545 .flags = PPC_FLAGS_74xx,
3546 .msr_mask = 0x000000000205FF77,
3548 #endif
3549 /* 64 bits PowerPC */
3550 #if defined (TARGET_PPC64)
3551 #if defined (TODO)
3552 /* PowerPC 620 */
3554 .name = "620",
3555 .pvr = CPU_PPC_620,
3556 .pvr_mask = 0xFFFF0000,
3557 .insns_flags = PPC_INSNS_620,
3558 .flags = PPC_FLAGS_620,
3559 .msr_mask = 0x800000000005FF73,
3561 #endif
3562 #if defined (TODO)
3563 /* PowerPC 630 (POWER3) */
3565 .name = "630",
3566 .pvr = CPU_PPC_630,
3567 .pvr_mask = 0xFFFF0000,
3568 .insns_flags = PPC_INSNS_630,
3569 .flags = PPC_FLAGS_630,
3570 .msr_mask = xxx,
3573 .name = "POWER3",
3574 .pvr = CPU_PPC_630,
3575 .pvr_mask = 0xFFFF0000,
3576 .insns_flags = PPC_INSNS_630,
3577 .flags = PPC_FLAGS_630,
3578 .msr_mask = xxx,
3580 #endif
3581 #if defined (TODO)
3582 /* PowerPC 631 (Power 3+)*/
3584 .name = "631",
3585 .pvr = CPU_PPC_631,
3586 .pvr_mask = 0xFFFF0000,
3587 .insns_flags = PPC_INSNS_631,
3588 .flags = PPC_FLAGS_631,
3589 .msr_mask = xxx,
3592 .name = "POWER3+",
3593 .pvr = CPU_PPC_631,
3594 .pvr_mask = 0xFFFF0000,
3595 .insns_flags = PPC_INSNS_631,
3596 .flags = PPC_FLAGS_631,
3597 .msr_mask = xxx,
3599 #endif
3600 #if defined (TODO)
3601 /* POWER4 */
3603 .name = "POWER4",
3604 .pvr = CPU_PPC_POWER4,
3605 .pvr_mask = 0xFFFF0000,
3606 .insns_flags = PPC_INSNS_POWER4,
3607 .flags = PPC_FLAGS_POWER4,
3608 .msr_mask = xxx,
3610 #endif
3611 #if defined (TODO)
3612 /* POWER4p */
3614 .name = "POWER4+",
3615 .pvr = CPU_PPC_POWER4P,
3616 .pvr_mask = 0xFFFF0000,
3617 .insns_flags = PPC_INSNS_POWER4,
3618 .flags = PPC_FLAGS_POWER4,
3619 .msr_mask = xxx,
3621 #endif
3622 #if defined (TODO)
3623 /* POWER5 */
3625 .name = "POWER5",
3626 .pvr = CPU_PPC_POWER5,
3627 .pvr_mask = 0xFFFF0000,
3628 .insns_flags = PPC_INSNS_POWER5,
3629 .flags = PPC_FLAGS_POWER5,
3630 .msr_mask = xxx,
3632 #endif
3633 #if defined (TODO)
3634 /* POWER5+ */
3636 .name = "POWER5+",
3637 .pvr = CPU_PPC_POWER5P,
3638 .pvr_mask = 0xFFFF0000,
3639 .insns_flags = PPC_INSNS_POWER5,
3640 .flags = PPC_FLAGS_POWER5,
3641 .msr_mask = xxx,
3643 #endif
3644 #if defined (TODO)
3645 /* PowerPC 970 */
3647 .name = "970",
3648 .pvr = CPU_PPC_970,
3649 .pvr_mask = 0xFFFF0000,
3650 .insns_flags = PPC_INSNS_970,
3651 .flags = PPC_FLAGS_970,
3652 .msr_mask = 0x900000000204FF36,
3654 #endif
3655 #if defined (TODO)
3656 /* PowerPC 970FX (G5) */
3658 .name = "970fx",
3659 .pvr = CPU_PPC_970FX,
3660 .pvr_mask = 0xFFFF0000,
3661 .insns_flags = PPC_INSNS_970FX,
3662 .flags = PPC_FLAGS_970FX,
3663 .msr_mask = 0x800000000204FF36,
3665 #endif
3666 #if defined (TODO)
3667 /* RS64 (Apache/A35) */
3668 /* This one seems to support the whole POWER2 instruction set
3669 * and the PowerPC 64 one.
3672 .name = "RS64",
3673 .pvr = CPU_PPC_RS64,
3674 .pvr_mask = 0xFFFF0000,
3675 .insns_flags = PPC_INSNS_RS64,
3676 .flags = PPC_FLAGS_RS64,
3677 .msr_mask = xxx,
3680 .name = "Apache",
3681 .pvr = CPU_PPC_RS64,
3682 .pvr_mask = 0xFFFF0000,
3683 .insns_flags = PPC_INSNS_RS64,
3684 .flags = PPC_FLAGS_RS64,
3685 .msr_mask = xxx,
3688 .name = "A35",
3689 .pvr = CPU_PPC_RS64,
3690 .pvr_mask = 0xFFFF0000,
3691 .insns_flags = PPC_INSNS_RS64,
3692 .flags = PPC_FLAGS_RS64,
3693 .msr_mask = xxx,
3695 #endif
3696 #if defined (TODO)
3697 /* RS64-II (NorthStar/A50) */
3699 .name = "RS64-II",
3700 .pvr = CPU_PPC_RS64II,
3701 .pvr_mask = 0xFFFF0000,
3702 .insns_flags = PPC_INSNS_RS64,
3703 .flags = PPC_FLAGS_RS64,
3704 .msr_mask = xxx,
3707 .name = "NortStar",
3708 .pvr = CPU_PPC_RS64II,
3709 .pvr_mask = 0xFFFF0000,
3710 .insns_flags = PPC_INSNS_RS64,
3711 .flags = PPC_FLAGS_RS64,
3712 .msr_mask = xxx,
3715 .name = "A50",
3716 .pvr = CPU_PPC_RS64II,
3717 .pvr_mask = 0xFFFF0000,
3718 .insns_flags = PPC_INSNS_RS64,
3719 .flags = PPC_FLAGS_RS64,
3720 .msr_mask = xxx,
3722 #endif
3723 #if defined (TODO)
3724 /* RS64-III (Pulsar) */
3726 .name = "RS64-III",
3727 .pvr = CPU_PPC_RS64III,
3728 .pvr_mask = 0xFFFF0000,
3729 .insns_flags = PPC_INSNS_RS64,
3730 .flags = PPC_FLAGS_RS64,
3731 .msr_mask = xxx,
3734 .name = "Pulsar",
3735 .pvr = CPU_PPC_RS64III,
3736 .pvr_mask = 0xFFFF0000,
3737 .insns_flags = PPC_INSNS_RS64,
3738 .flags = PPC_FLAGS_RS64,
3739 .msr_mask = xxx,
3741 #endif
3742 #if defined (TODO)
3743 /* RS64-IV (IceStar/IStar/SStar) */
3745 .name = "RS64-IV",
3746 .pvr = CPU_PPC_RS64IV,
3747 .pvr_mask = 0xFFFF0000,
3748 .insns_flags = PPC_INSNS_RS64,
3749 .flags = PPC_FLAGS_RS64,
3750 .msr_mask = xxx,
3753 .name = "IceStar",
3754 .pvr = CPU_PPC_RS64IV,
3755 .pvr_mask = 0xFFFF0000,
3756 .insns_flags = PPC_INSNS_RS64,
3757 .flags = PPC_FLAGS_RS64,
3758 .msr_mask = xxx,
3761 .name = "IStar",
3762 .pvr = CPU_PPC_RS64IV,
3763 .pvr_mask = 0xFFFF0000,
3764 .insns_flags = PPC_INSNS_RS64,
3765 .flags = PPC_FLAGS_RS64,
3766 .msr_mask = xxx,
3769 .name = "SStar",
3770 .pvr = CPU_PPC_RS64IV,
3771 .pvr_mask = 0xFFFF0000,
3772 .insns_flags = PPC_INSNS_RS64,
3773 .flags = PPC_FLAGS_RS64,
3774 .msr_mask = xxx,
3776 #endif
3777 /* POWER */
3778 #if defined (TODO)
3779 /* Original POWER */
3781 .name = "POWER",
3782 .pvr = CPU_POWER,
3783 .pvr_mask = 0xFFFF0000,
3784 .insns_flags = PPC_INSNS_POWER,
3785 .flags = PPC_FLAGS_POWER,
3786 .msr_mask = xxx,
3788 #endif
3789 #endif /* defined (TARGET_PPC64) */
3790 #if defined (TODO)
3791 /* POWER2 */
3793 .name = "POWER2",
3794 .pvr = CPU_POWER2,
3795 .pvr_mask = 0xFFFF0000,
3796 .insns_flags = PPC_INSNS_POWER,
3797 .flags = PPC_FLAGS_POWER,
3798 .msr_mask = xxx,
3800 #endif
3801 /* Generic PowerPCs */
3802 #if defined (TODO)
3804 .name = "ppc64",
3805 .pvr = CPU_PPC_970,
3806 .pvr_mask = 0xFFFF0000,
3807 .insns_flags = PPC_INSNS_PPC64,
3808 .flags = PPC_FLAGS_PPC64,
3809 .msr_mask = 0xA00000000204FF36,
3811 #endif
3813 .name = "ppc32",
3814 .pvr = CPU_PPC_604,
3815 .pvr_mask = 0xFFFFFFFF,
3816 .insns_flags = PPC_INSNS_PPC32,
3817 .flags = PPC_FLAGS_PPC32,
3818 .msr_mask = 0x000000000005FF77,
3820 /* Fallback */
3822 .name = "ppc",
3823 .pvr = CPU_PPC_604,
3824 .pvr_mask = 0xFFFFFFFF,
3825 .insns_flags = PPC_INSNS_PPC32,
3826 .flags = PPC_FLAGS_PPC32,
3827 .msr_mask = 0x000000000005FF77,
3831 int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
3833 int i, ret;
3835 ret = -1;
3836 *def = NULL;
3837 for (i = 0; strcmp(ppc_defs[i].name, "ppc") != 0; i++) {
3838 if (strcasecmp(name, ppc_defs[i].name) == 0) {
3839 *def = &ppc_defs[i];
3840 ret = 0;
3841 break;
3845 return ret;
3848 int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
3850 int i, ret;
3852 ret = -1;
3853 *def = NULL;
3854 for (i = 0; ppc_defs[i].name != NULL; i++) {
3855 if ((pvr & ppc_defs[i].pvr_mask) ==
3856 (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
3857 *def = &ppc_defs[i];
3858 ret = 0;
3859 break;
3863 return ret;
3866 void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3868 int i;
3870 for (i = 0; ; i++) {
3871 (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n",
3872 ppc_defs[i].name,
3873 ppc_defs[i].pvr, ppc_defs[i].pvr_mask);
3874 if (strcmp(ppc_defs[i].name, "ppc") == 0)
3875 break;