2 * PowerPC CPU initialization for qemu.
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
28 //#define PPC_DEBUG_IRQ
31 const unsigned char *name;
39 /* For user-mode emulation, we don't emulate any IRQ controller */
40 #if defined(CONFIG_USER_ONLY)
41 #define PPC_IRQ_INIT_FN(name) \
42 static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \
46 #define PPC_IRQ_INIT_FN(name) \
47 void glue(glue(ppc, name),_irq_init) (CPUPPCState *env);
54 * do nothing but store/retrieve spr value
56 static void spr_read_generic (void *opaque, int sprn)
58 gen_op_load_spr(sprn);
61 static void spr_write_generic (void *opaque, int sprn)
63 gen_op_store_spr(sprn);
66 static void spr_read_dump (void *opaque, int sprn)
68 gen_op_load_dump_spr(sprn);
71 static void spr_write_dump (void *opaque, int sprn)
73 gen_op_store_dump_spr(sprn);
76 #if !defined(CONFIG_USER_ONLY)
77 static void spr_write_clear (void *opaque, int sprn)
79 gen_op_mask_spr(sprn);
83 /* SPR common to all PowerPC */
85 static void spr_read_xer (void *opaque, int sprn)
90 static void spr_write_xer (void *opaque, int sprn)
96 static void spr_read_lr (void *opaque, int sprn)
101 static void spr_write_lr (void *opaque, int sprn)
107 static void spr_read_ctr (void *opaque, int sprn)
112 static void spr_write_ctr (void *opaque, int sprn)
117 /* User read access to SPR */
123 static void spr_read_ureg (void *opaque, int sprn)
125 gen_op_load_spr(sprn + 0x10);
128 /* SPR common to all non-embedded PowerPC */
130 #if !defined(CONFIG_USER_ONLY)
131 static void spr_read_decr (void *opaque, int sprn)
136 static void spr_write_decr (void *opaque, int sprn)
142 /* SPR common to all non-embedded PowerPC, except 601 */
144 static void spr_read_tbl (void *opaque, int sprn)
149 static void spr_read_tbu (void *opaque, int sprn)
154 #if !defined(CONFIG_USER_ONLY)
155 static void spr_write_tbl (void *opaque, int sprn)
160 static void spr_write_tbu (void *opaque, int sprn)
166 #if !defined(CONFIG_USER_ONLY)
167 /* IBAT0U...IBAT0U */
168 /* IBAT0L...IBAT7L */
169 static void spr_read_ibat (void *opaque, int sprn)
171 gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
174 static void spr_read_ibat_h (void *opaque, int sprn)
176 gen_op_load_ibat(sprn & 1, (sprn - SPR_IBAT4U) / 2);
179 static void spr_write_ibatu (void *opaque, int sprn)
181 DisasContext *ctx = opaque;
183 gen_op_store_ibatu((sprn - SPR_IBAT0U) / 2);
187 static void spr_write_ibatu_h (void *opaque, int sprn)
189 DisasContext *ctx = opaque;
191 gen_op_store_ibatu((sprn - SPR_IBAT4U) / 2);
195 static void spr_write_ibatl (void *opaque, int sprn)
197 DisasContext *ctx = opaque;
199 gen_op_store_ibatl((sprn - SPR_IBAT0L) / 2);
203 static void spr_write_ibatl_h (void *opaque, int sprn)
205 DisasContext *ctx = opaque;
207 gen_op_store_ibatl((sprn - SPR_IBAT4L) / 2);
211 /* DBAT0U...DBAT7U */
212 /* DBAT0L...DBAT7L */
213 static void spr_read_dbat (void *opaque, int sprn)
215 gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT0U) / 2);
218 static void spr_read_dbat_h (void *opaque, int sprn)
220 gen_op_load_dbat(sprn & 1, (sprn - SPR_DBAT4U) / 2);
223 static void spr_write_dbatu (void *opaque, int sprn)
225 DisasContext *ctx = opaque;
227 gen_op_store_dbatu((sprn - SPR_DBAT0U) / 2);
231 static void spr_write_dbatu_h (void *opaque, int sprn)
233 DisasContext *ctx = opaque;
235 gen_op_store_dbatu((sprn - SPR_DBAT4U) / 2);
239 static void spr_write_dbatl (void *opaque, int sprn)
241 DisasContext *ctx = opaque;
243 gen_op_store_dbatl((sprn - SPR_DBAT0L) / 2);
247 static void spr_write_dbatl_h (void *opaque, int sprn)
249 DisasContext *ctx = opaque;
251 gen_op_store_dbatl((sprn - SPR_DBAT4L) / 2);
256 static void spr_read_sdr1 (void *opaque, int sprn)
261 static void spr_write_sdr1 (void *opaque, int sprn)
263 DisasContext *ctx = opaque;
269 /* 64 bits PowerPC specific SPRs */
271 #if defined(TARGET_PPC64)
272 static void spr_read_asr (void *opaque, int sprn)
277 static void spr_write_asr (void *opaque, int sprn)
279 DisasContext *ctx = opaque;
285 #endif /* !defined(CONFIG_USER_ONLY) */
287 /* PowerPC 601 specific registers */
289 static void spr_read_601_rtcl (void *opaque, int sprn)
291 gen_op_load_601_rtcl();
294 static void spr_read_601_rtcu (void *opaque, int sprn)
296 gen_op_load_601_rtcu();
299 #if !defined(CONFIG_USER_ONLY)
300 static void spr_write_601_rtcu (void *opaque, int sprn)
302 gen_op_store_601_rtcu();
305 static void spr_write_601_rtcl (void *opaque, int sprn)
307 gen_op_store_601_rtcl();
312 #if !defined(CONFIG_USER_ONLY)
313 static void spr_read_601_ubat (void *opaque, int sprn)
315 gen_op_load_601_bat(sprn & 1, (sprn - SPR_IBAT0U) / 2);
318 static void spr_write_601_ubatu (void *opaque, int sprn)
320 DisasContext *ctx = opaque;
322 gen_op_store_601_batu((sprn - SPR_IBAT0U) / 2);
326 static void spr_write_601_ubatl (void *opaque, int sprn)
328 DisasContext *ctx = opaque;
330 gen_op_store_601_batl((sprn - SPR_IBAT0L) / 2);
335 /* PowerPC 40x specific registers */
336 #if !defined(CONFIG_USER_ONLY)
337 static void spr_read_40x_pit (void *opaque, int sprn)
339 gen_op_load_40x_pit();
342 static void spr_write_40x_pit (void *opaque, int sprn)
344 gen_op_store_40x_pit();
347 static void spr_write_40x_dbcr0 (void *opaque, int sprn)
349 DisasContext *ctx = opaque;
351 gen_op_store_40x_dbcr0();
352 /* We must stop translation as we may have rebooted */
356 static void spr_write_booke_tcr (void *opaque, int sprn)
358 gen_op_store_booke_tcr();
361 static void spr_write_booke_tsr (void *opaque, int sprn)
363 gen_op_store_booke_tsr();
367 /* PowerPC 403 specific registers */
368 /* PBL1 / PBU1 / PBL2 / PBU2 */
369 #if !defined(CONFIG_USER_ONLY)
370 static void spr_read_403_pbr (void *opaque, int sprn)
372 gen_op_load_403_pb(sprn - SPR_403_PBL1);
375 static void spr_write_403_pbr (void *opaque, int sprn)
377 DisasContext *ctx = opaque;
379 gen_op_store_403_pb(sprn - SPR_403_PBL1);
383 static void spr_write_pir (void *opaque, int sprn)
389 #if defined(CONFIG_USER_ONLY)
390 #define spr_register(env, num, name, uea_read, uea_write, \
391 oea_read, oea_write, initial_value) \
393 _spr_register(env, num, name, uea_read, uea_write, initial_value); \
395 static inline void _spr_register (CPUPPCState *env, int num,
396 const unsigned char *name,
397 void (*uea_read)(void *opaque, int sprn),
398 void (*uea_write)(void *opaque, int sprn),
399 target_ulong initial_value)
401 static inline void spr_register (CPUPPCState *env, int num,
402 const unsigned char *name,
403 void (*uea_read)(void *opaque, int sprn),
404 void (*uea_write)(void *opaque, int sprn),
405 void (*oea_read)(void *opaque, int sprn),
406 void (*oea_write)(void *opaque, int sprn),
407 target_ulong initial_value)
412 spr = &env->spr_cb[num];
413 if (spr->name != NULL ||env-> spr[num] != 0x00000000 ||
414 #if !defined(CONFIG_USER_ONLY)
415 spr->oea_read != NULL || spr->oea_write != NULL ||
417 spr->uea_read != NULL || spr->uea_write != NULL) {
418 printf("Error: Trying to register SPR %d (%03x) twice !\n", num, num);
421 #if defined(PPC_DEBUG_SPR)
422 printf("*** register spr %d (%03x) %s val " ADDRX "\n", num, num, name,
426 spr->uea_read = uea_read;
427 spr->uea_write = uea_write;
428 #if !defined(CONFIG_USER_ONLY)
429 spr->oea_read = oea_read;
430 spr->oea_write = oea_write;
432 env->spr[num] = initial_value;
435 /* Generic PowerPC SPRs */
436 static void gen_spr_generic (CPUPPCState *env)
438 /* Integer processing */
439 spr_register(env, SPR_XER, "XER",
440 &spr_read_xer, &spr_write_xer,
441 &spr_read_xer, &spr_write_xer,
444 spr_register(env, SPR_LR, "LR",
445 &spr_read_lr, &spr_write_lr,
446 &spr_read_lr, &spr_write_lr,
448 spr_register(env, SPR_CTR, "CTR",
449 &spr_read_ctr, &spr_write_ctr,
450 &spr_read_ctr, &spr_write_ctr,
452 /* Interrupt processing */
453 spr_register(env, SPR_SRR0, "SRR0",
454 SPR_NOACCESS, SPR_NOACCESS,
455 &spr_read_generic, &spr_write_generic,
457 spr_register(env, SPR_SRR1, "SRR1",
458 SPR_NOACCESS, SPR_NOACCESS,
459 &spr_read_generic, &spr_write_generic,
461 /* Processor control */
462 spr_register(env, SPR_SPRG0, "SPRG0",
463 SPR_NOACCESS, SPR_NOACCESS,
464 &spr_read_generic, &spr_write_generic,
466 spr_register(env, SPR_SPRG1, "SPRG1",
467 SPR_NOACCESS, SPR_NOACCESS,
468 &spr_read_generic, &spr_write_generic,
470 spr_register(env, SPR_SPRG2, "SPRG2",
471 SPR_NOACCESS, SPR_NOACCESS,
472 &spr_read_generic, &spr_write_generic,
474 spr_register(env, SPR_SPRG3, "SPRG3",
475 SPR_NOACCESS, SPR_NOACCESS,
476 &spr_read_generic, &spr_write_generic,
480 /* SPR common to all non-embedded PowerPC, including 601 */
481 static void gen_spr_ne_601 (CPUPPCState *env)
483 /* Exception processing */
484 spr_register(env, SPR_DSISR, "DSISR",
485 SPR_NOACCESS, SPR_NOACCESS,
486 &spr_read_generic, &spr_write_generic,
488 spr_register(env, SPR_DAR, "DAR",
489 SPR_NOACCESS, SPR_NOACCESS,
490 &spr_read_generic, &spr_write_generic,
493 spr_register(env, SPR_DECR, "DECR",
494 SPR_NOACCESS, SPR_NOACCESS,
495 &spr_read_decr, &spr_write_decr,
497 /* Memory management */
498 spr_register(env, SPR_SDR1, "SDR1",
499 SPR_NOACCESS, SPR_NOACCESS,
500 &spr_read_sdr1, &spr_write_sdr1,
505 static void gen_low_BATs (CPUPPCState *env)
507 spr_register(env, SPR_IBAT0U, "IBAT0U",
508 SPR_NOACCESS, SPR_NOACCESS,
509 &spr_read_ibat, &spr_write_ibatu,
511 spr_register(env, SPR_IBAT0L, "IBAT0L",
512 SPR_NOACCESS, SPR_NOACCESS,
513 &spr_read_ibat, &spr_write_ibatl,
515 spr_register(env, SPR_IBAT1U, "IBAT1U",
516 SPR_NOACCESS, SPR_NOACCESS,
517 &spr_read_ibat, &spr_write_ibatu,
519 spr_register(env, SPR_IBAT1L, "IBAT1L",
520 SPR_NOACCESS, SPR_NOACCESS,
521 &spr_read_ibat, &spr_write_ibatl,
523 spr_register(env, SPR_IBAT2U, "IBAT2U",
524 SPR_NOACCESS, SPR_NOACCESS,
525 &spr_read_ibat, &spr_write_ibatu,
527 spr_register(env, SPR_IBAT2L, "IBAT2L",
528 SPR_NOACCESS, SPR_NOACCESS,
529 &spr_read_ibat, &spr_write_ibatl,
531 spr_register(env, SPR_IBAT3U, "IBAT3U",
532 SPR_NOACCESS, SPR_NOACCESS,
533 &spr_read_ibat, &spr_write_ibatu,
535 spr_register(env, SPR_IBAT3L, "IBAT3L",
536 SPR_NOACCESS, SPR_NOACCESS,
537 &spr_read_ibat, &spr_write_ibatl,
539 spr_register(env, SPR_DBAT0U, "DBAT0U",
540 SPR_NOACCESS, SPR_NOACCESS,
541 &spr_read_dbat, &spr_write_dbatu,
543 spr_register(env, SPR_DBAT0L, "DBAT0L",
544 SPR_NOACCESS, SPR_NOACCESS,
545 &spr_read_dbat, &spr_write_dbatl,
547 spr_register(env, SPR_DBAT1U, "DBAT1U",
548 SPR_NOACCESS, SPR_NOACCESS,
549 &spr_read_dbat, &spr_write_dbatu,
551 spr_register(env, SPR_DBAT1L, "DBAT1L",
552 SPR_NOACCESS, SPR_NOACCESS,
553 &spr_read_dbat, &spr_write_dbatl,
555 spr_register(env, SPR_DBAT2U, "DBAT2U",
556 SPR_NOACCESS, SPR_NOACCESS,
557 &spr_read_dbat, &spr_write_dbatu,
559 spr_register(env, SPR_DBAT2L, "DBAT2L",
560 SPR_NOACCESS, SPR_NOACCESS,
561 &spr_read_dbat, &spr_write_dbatl,
563 spr_register(env, SPR_DBAT3U, "DBAT3U",
564 SPR_NOACCESS, SPR_NOACCESS,
565 &spr_read_dbat, &spr_write_dbatu,
567 spr_register(env, SPR_DBAT3L, "DBAT3L",
568 SPR_NOACCESS, SPR_NOACCESS,
569 &spr_read_dbat, &spr_write_dbatl,
575 static void gen_high_BATs (CPUPPCState *env)
577 spr_register(env, SPR_IBAT4U, "IBAT4U",
578 SPR_NOACCESS, SPR_NOACCESS,
579 &spr_read_ibat_h, &spr_write_ibatu_h,
581 spr_register(env, SPR_IBAT4L, "IBAT4L",
582 SPR_NOACCESS, SPR_NOACCESS,
583 &spr_read_ibat_h, &spr_write_ibatl_h,
585 spr_register(env, SPR_IBAT5U, "IBAT5U",
586 SPR_NOACCESS, SPR_NOACCESS,
587 &spr_read_ibat_h, &spr_write_ibatu_h,
589 spr_register(env, SPR_IBAT5L, "IBAT5L",
590 SPR_NOACCESS, SPR_NOACCESS,
591 &spr_read_ibat_h, &spr_write_ibatl_h,
593 spr_register(env, SPR_IBAT6U, "IBAT6U",
594 SPR_NOACCESS, SPR_NOACCESS,
595 &spr_read_ibat_h, &spr_write_ibatu_h,
597 spr_register(env, SPR_IBAT6L, "IBAT6L",
598 SPR_NOACCESS, SPR_NOACCESS,
599 &spr_read_ibat_h, &spr_write_ibatl_h,
601 spr_register(env, SPR_IBAT7U, "IBAT7U",
602 SPR_NOACCESS, SPR_NOACCESS,
603 &spr_read_ibat_h, &spr_write_ibatu_h,
605 spr_register(env, SPR_IBAT7L, "IBAT7L",
606 SPR_NOACCESS, SPR_NOACCESS,
607 &spr_read_ibat_h, &spr_write_ibatl_h,
609 spr_register(env, SPR_DBAT4U, "DBAT4U",
610 SPR_NOACCESS, SPR_NOACCESS,
611 &spr_read_dbat_h, &spr_write_dbatu_h,
613 spr_register(env, SPR_DBAT4L, "DBAT4L",
614 SPR_NOACCESS, SPR_NOACCESS,
615 &spr_read_dbat_h, &spr_write_dbatl_h,
617 spr_register(env, SPR_DBAT5U, "DBAT5U",
618 SPR_NOACCESS, SPR_NOACCESS,
619 &spr_read_dbat_h, &spr_write_dbatu_h,
621 spr_register(env, SPR_DBAT5L, "DBAT5L",
622 SPR_NOACCESS, SPR_NOACCESS,
623 &spr_read_dbat_h, &spr_write_dbatl_h,
625 spr_register(env, SPR_DBAT6U, "DBAT6U",
626 SPR_NOACCESS, SPR_NOACCESS,
627 &spr_read_dbat_h, &spr_write_dbatu_h,
629 spr_register(env, SPR_DBAT6L, "DBAT6L",
630 SPR_NOACCESS, SPR_NOACCESS,
631 &spr_read_dbat_h, &spr_write_dbatl_h,
633 spr_register(env, SPR_DBAT7U, "DBAT7U",
634 SPR_NOACCESS, SPR_NOACCESS,
635 &spr_read_dbat_h, &spr_write_dbatu_h,
637 spr_register(env, SPR_DBAT7L, "DBAT7L",
638 SPR_NOACCESS, SPR_NOACCESS,
639 &spr_read_dbat_h, &spr_write_dbatl_h,
644 /* Generic PowerPC time base */
645 static void gen_tbl (CPUPPCState *env)
647 spr_register(env, SPR_VTBL, "TBL",
648 &spr_read_tbl, SPR_NOACCESS,
649 &spr_read_tbl, SPR_NOACCESS,
651 spr_register(env, SPR_TBL, "TBL",
652 SPR_NOACCESS, SPR_NOACCESS,
653 SPR_NOACCESS, &spr_write_tbl,
655 spr_register(env, SPR_VTBU, "TBU",
656 &spr_read_tbu, SPR_NOACCESS,
657 &spr_read_tbu, SPR_NOACCESS,
659 spr_register(env, SPR_TBU, "TBU",
660 SPR_NOACCESS, SPR_NOACCESS,
661 SPR_NOACCESS, &spr_write_tbu,
665 /* Softare table search registers */
666 static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
668 env->nb_tlb = nb_tlbs;
669 env->nb_ways = nb_ways;
671 spr_register(env, SPR_DMISS, "DMISS",
672 SPR_NOACCESS, SPR_NOACCESS,
673 &spr_read_generic, SPR_NOACCESS,
675 spr_register(env, SPR_DCMP, "DCMP",
676 SPR_NOACCESS, SPR_NOACCESS,
677 &spr_read_generic, SPR_NOACCESS,
679 spr_register(env, SPR_HASH1, "HASH1",
680 SPR_NOACCESS, SPR_NOACCESS,
681 &spr_read_generic, SPR_NOACCESS,
683 spr_register(env, SPR_HASH2, "HASH2",
684 SPR_NOACCESS, SPR_NOACCESS,
685 &spr_read_generic, SPR_NOACCESS,
687 spr_register(env, SPR_IMISS, "IMISS",
688 SPR_NOACCESS, SPR_NOACCESS,
689 &spr_read_generic, SPR_NOACCESS,
691 spr_register(env, SPR_ICMP, "ICMP",
692 SPR_NOACCESS, SPR_NOACCESS,
693 &spr_read_generic, SPR_NOACCESS,
695 spr_register(env, SPR_RPA, "RPA",
696 SPR_NOACCESS, SPR_NOACCESS,
697 &spr_read_generic, &spr_write_generic,
701 /* SPR common to MPC755 and G2 */
702 static void gen_spr_G2_755 (CPUPPCState *env)
705 spr_register(env, SPR_SPRG4, "SPRG4",
706 SPR_NOACCESS, SPR_NOACCESS,
707 &spr_read_generic, &spr_write_generic,
709 spr_register(env, SPR_SPRG5, "SPRG5",
710 SPR_NOACCESS, SPR_NOACCESS,
711 &spr_read_generic, &spr_write_generic,
713 spr_register(env, SPR_SPRG6, "SPRG6",
714 SPR_NOACCESS, SPR_NOACCESS,
715 &spr_read_generic, &spr_write_generic,
717 spr_register(env, SPR_SPRG7, "SPRG7",
718 SPR_NOACCESS, SPR_NOACCESS,
719 &spr_read_generic, &spr_write_generic,
721 /* External access control */
722 /* XXX : not implemented */
723 spr_register(env, SPR_EAR, "EAR",
724 SPR_NOACCESS, SPR_NOACCESS,
725 &spr_read_generic, &spr_write_generic,
729 /* SPR common to all 7xx PowerPC implementations */
730 static void gen_spr_7xx (CPUPPCState *env)
733 /* XXX : not implemented */
734 spr_register(env, SPR_DABR, "DABR",
735 SPR_NOACCESS, SPR_NOACCESS,
736 &spr_read_generic, &spr_write_generic,
738 /* XXX : not implemented */
739 spr_register(env, SPR_IABR, "IABR",
740 SPR_NOACCESS, SPR_NOACCESS,
741 &spr_read_generic, &spr_write_generic,
743 /* Cache management */
744 /* XXX : not implemented */
745 spr_register(env, SPR_ICTC, "ICTC",
746 SPR_NOACCESS, SPR_NOACCESS,
747 &spr_read_generic, &spr_write_generic,
749 /* XXX : not implemented */
750 spr_register(env, SPR_L2CR, "L2CR",
751 SPR_NOACCESS, SPR_NOACCESS,
752 &spr_read_generic, &spr_write_generic,
754 /* Performance monitors */
755 /* XXX : not implemented */
756 spr_register(env, SPR_MMCR0, "MMCR0",
757 SPR_NOACCESS, SPR_NOACCESS,
758 &spr_read_generic, &spr_write_generic,
760 /* XXX : not implemented */
761 spr_register(env, SPR_MMCR1, "MMCR1",
762 SPR_NOACCESS, SPR_NOACCESS,
763 &spr_read_generic, &spr_write_generic,
765 /* XXX : not implemented */
766 spr_register(env, SPR_PMC1, "PMC1",
767 SPR_NOACCESS, SPR_NOACCESS,
768 &spr_read_generic, &spr_write_generic,
770 /* XXX : not implemented */
771 spr_register(env, SPR_PMC2, "PMC2",
772 SPR_NOACCESS, SPR_NOACCESS,
773 &spr_read_generic, &spr_write_generic,
775 /* XXX : not implemented */
776 spr_register(env, SPR_PMC3, "PMC3",
777 SPR_NOACCESS, SPR_NOACCESS,
778 &spr_read_generic, &spr_write_generic,
780 /* XXX : not implemented */
781 spr_register(env, SPR_PMC4, "PMC4",
782 SPR_NOACCESS, SPR_NOACCESS,
783 &spr_read_generic, &spr_write_generic,
785 /* XXX : not implemented */
786 spr_register(env, SPR_SIA, "SIA",
787 SPR_NOACCESS, SPR_NOACCESS,
788 &spr_read_generic, SPR_NOACCESS,
790 spr_register(env, SPR_UMMCR0, "UMMCR0",
791 &spr_read_ureg, SPR_NOACCESS,
792 &spr_read_ureg, SPR_NOACCESS,
794 spr_register(env, SPR_UMMCR1, "UMMCR1",
795 &spr_read_ureg, SPR_NOACCESS,
796 &spr_read_ureg, SPR_NOACCESS,
798 spr_register(env, SPR_UPMC1, "UPMC1",
799 &spr_read_ureg, SPR_NOACCESS,
800 &spr_read_ureg, SPR_NOACCESS,
802 spr_register(env, SPR_UPMC2, "UPMC2",
803 &spr_read_ureg, SPR_NOACCESS,
804 &spr_read_ureg, SPR_NOACCESS,
806 spr_register(env, SPR_UPMC3, "UPMC3",
807 &spr_read_ureg, SPR_NOACCESS,
808 &spr_read_ureg, SPR_NOACCESS,
810 spr_register(env, SPR_UPMC4, "UPMC4",
811 &spr_read_ureg, SPR_NOACCESS,
812 &spr_read_ureg, SPR_NOACCESS,
814 spr_register(env, SPR_USIA, "USIA",
815 &spr_read_ureg, SPR_NOACCESS,
816 &spr_read_ureg, SPR_NOACCESS,
818 /* Thermal management */
819 /* XXX : not implemented */
820 spr_register(env, SPR_THRM1, "THRM1",
821 SPR_NOACCESS, SPR_NOACCESS,
822 &spr_read_generic, &spr_write_generic,
824 /* XXX : not implemented */
825 spr_register(env, SPR_THRM2, "THRM2",
826 SPR_NOACCESS, SPR_NOACCESS,
827 &spr_read_generic, &spr_write_generic,
829 /* XXX : not implemented */
830 spr_register(env, SPR_THRM3, "THRM3",
831 SPR_NOACCESS, SPR_NOACCESS,
832 &spr_read_generic, &spr_write_generic,
834 /* External access control */
835 /* XXX : not implemented */
836 spr_register(env, SPR_EAR, "EAR",
837 SPR_NOACCESS, SPR_NOACCESS,
838 &spr_read_generic, &spr_write_generic,
842 /* SPR specific to PowerPC 604 implementation */
843 static void gen_spr_604 (CPUPPCState *env)
845 /* Processor identification */
846 spr_register(env, SPR_PIR, "PIR",
847 SPR_NOACCESS, SPR_NOACCESS,
848 &spr_read_generic, &spr_write_pir,
851 /* XXX : not implemented */
852 spr_register(env, SPR_IABR, "IABR",
853 SPR_NOACCESS, SPR_NOACCESS,
854 &spr_read_generic, &spr_write_generic,
856 /* XXX : not implemented */
857 spr_register(env, SPR_DABR, "DABR",
858 SPR_NOACCESS, SPR_NOACCESS,
859 &spr_read_generic, &spr_write_generic,
861 /* Performance counters */
862 /* XXX : not implemented */
863 spr_register(env, SPR_MMCR0, "MMCR0",
864 SPR_NOACCESS, SPR_NOACCESS,
865 &spr_read_generic, &spr_write_generic,
867 /* XXX : not implemented */
868 spr_register(env, SPR_MMCR1, "MMCR1",
869 SPR_NOACCESS, SPR_NOACCESS,
870 &spr_read_generic, &spr_write_generic,
872 /* XXX : not implemented */
873 spr_register(env, SPR_PMC1, "PMC1",
874 SPR_NOACCESS, SPR_NOACCESS,
875 &spr_read_generic, &spr_write_generic,
877 /* XXX : not implemented */
878 spr_register(env, SPR_PMC2, "PMC2",
879 SPR_NOACCESS, SPR_NOACCESS,
880 &spr_read_generic, &spr_write_generic,
882 /* XXX : not implemented */
883 spr_register(env, SPR_PMC3, "PMC3",
884 SPR_NOACCESS, SPR_NOACCESS,
885 &spr_read_generic, &spr_write_generic,
887 /* XXX : not implemented */
888 spr_register(env, SPR_PMC4, "PMC4",
889 SPR_NOACCESS, SPR_NOACCESS,
890 &spr_read_generic, &spr_write_generic,
892 /* XXX : not implemented */
893 spr_register(env, SPR_SIA, "SIA",
894 SPR_NOACCESS, SPR_NOACCESS,
895 &spr_read_generic, SPR_NOACCESS,
897 /* XXX : not implemented */
898 spr_register(env, SPR_SDA, "SDA",
899 SPR_NOACCESS, SPR_NOACCESS,
900 &spr_read_generic, SPR_NOACCESS,
902 /* External access control */
903 /* XXX : not implemented */
904 spr_register(env, SPR_EAR, "EAR",
905 SPR_NOACCESS, SPR_NOACCESS,
906 &spr_read_generic, &spr_write_generic,
910 /* SPR specific to PowerPC 603 implementation */
911 static void gen_spr_603 (CPUPPCState *env)
913 /* External access control */
914 /* XXX : not implemented */
915 spr_register(env, SPR_EAR, "EAR",
916 SPR_NOACCESS, SPR_NOACCESS,
917 &spr_read_generic, &spr_write_generic,
921 /* SPR specific to PowerPC G2 implementation */
922 static void gen_spr_G2 (CPUPPCState *env)
924 /* Memory base address */
926 spr_register(env, SPR_MBAR, "MBAR",
927 SPR_NOACCESS, SPR_NOACCESS,
928 &spr_read_generic, &spr_write_generic,
930 /* System version register */
932 spr_register(env, SPR_SVR, "SVR",
933 SPR_NOACCESS, SPR_NOACCESS,
934 &spr_read_generic, SPR_NOACCESS,
936 /* Exception processing */
937 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
938 SPR_NOACCESS, SPR_NOACCESS,
939 &spr_read_generic, &spr_write_generic,
941 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
942 SPR_NOACCESS, SPR_NOACCESS,
943 &spr_read_generic, &spr_write_generic,
946 /* XXX : not implemented */
947 spr_register(env, SPR_DABR, "DABR",
948 SPR_NOACCESS, SPR_NOACCESS,
949 &spr_read_generic, &spr_write_generic,
951 /* XXX : not implemented */
952 spr_register(env, SPR_DABR2, "DABR2",
953 SPR_NOACCESS, SPR_NOACCESS,
954 &spr_read_generic, &spr_write_generic,
956 /* XXX : not implemented */
957 spr_register(env, SPR_IABR, "IABR",
958 SPR_NOACCESS, SPR_NOACCESS,
959 &spr_read_generic, &spr_write_generic,
961 /* XXX : not implemented */
962 spr_register(env, SPR_IABR2, "IABR2",
963 SPR_NOACCESS, SPR_NOACCESS,
964 &spr_read_generic, &spr_write_generic,
966 /* XXX : not implemented */
967 spr_register(env, SPR_IBCR, "IBCR",
968 SPR_NOACCESS, SPR_NOACCESS,
969 &spr_read_generic, &spr_write_generic,
971 /* XXX : not implemented */
972 spr_register(env, SPR_DBCR, "DBCR",
973 SPR_NOACCESS, SPR_NOACCESS,
974 &spr_read_generic, &spr_write_generic,
978 /* SPR specific to PowerPC 602 implementation */
979 static void gen_spr_602 (CPUPPCState *env)
982 /* XXX : not implemented */
983 spr_register(env, SPR_SER, "SER",
984 SPR_NOACCESS, SPR_NOACCESS,
985 &spr_read_generic, &spr_write_generic,
987 /* XXX : not implemented */
988 spr_register(env, SPR_SEBR, "SEBR",
989 SPR_NOACCESS, SPR_NOACCESS,
990 &spr_read_generic, &spr_write_generic,
992 /* XXX : not implemented */
993 spr_register(env, SPR_ESASR, "ESASR",
994 SPR_NOACCESS, SPR_NOACCESS,
995 &spr_read_generic, &spr_write_generic,
997 /* Floating point status */
998 /* XXX : not implemented */
999 spr_register(env, SPR_SP, "SP",
1000 SPR_NOACCESS, SPR_NOACCESS,
1001 &spr_read_generic, &spr_write_generic,
1003 /* XXX : not implemented */
1004 spr_register(env, SPR_LT, "LT",
1005 SPR_NOACCESS, SPR_NOACCESS,
1006 &spr_read_generic, &spr_write_generic,
1008 /* Watchdog timer */
1009 /* XXX : not implemented */
1010 spr_register(env, SPR_TCR, "TCR",
1011 SPR_NOACCESS, SPR_NOACCESS,
1012 &spr_read_generic, &spr_write_generic,
1014 /* Interrupt base */
1015 spr_register(env, SPR_IBR, "IBR",
1016 SPR_NOACCESS, SPR_NOACCESS,
1017 &spr_read_generic, &spr_write_generic,
1021 /* SPR specific to PowerPC 601 implementation */
1022 static void gen_spr_601 (CPUPPCState *env)
1024 /* Multiplication/division register */
1026 spr_register(env, SPR_MQ, "MQ",
1027 &spr_read_generic, &spr_write_generic,
1028 &spr_read_generic, &spr_write_generic,
1031 spr_register(env, SPR_601_RTCU, "RTCU",
1032 SPR_NOACCESS, SPR_NOACCESS,
1033 SPR_NOACCESS, &spr_write_601_rtcu,
1035 spr_register(env, SPR_601_VRTCU, "RTCU",
1036 &spr_read_601_rtcu, SPR_NOACCESS,
1037 &spr_read_601_rtcu, SPR_NOACCESS,
1039 spr_register(env, SPR_601_RTCL, "RTCL",
1040 SPR_NOACCESS, SPR_NOACCESS,
1041 SPR_NOACCESS, &spr_write_601_rtcl,
1043 spr_register(env, SPR_601_VRTCL, "RTCL",
1044 &spr_read_601_rtcl, SPR_NOACCESS,
1045 &spr_read_601_rtcl, SPR_NOACCESS,
1049 spr_register(env, SPR_601_UDECR, "UDECR",
1050 &spr_read_decr, SPR_NOACCESS,
1051 &spr_read_decr, SPR_NOACCESS,
1054 /* External access control */
1055 /* XXX : not implemented */
1056 spr_register(env, SPR_EAR, "EAR",
1057 SPR_NOACCESS, SPR_NOACCESS,
1058 &spr_read_generic, &spr_write_generic,
1060 /* Memory management */
1061 spr_register(env, SPR_IBAT0U, "IBAT0U",
1062 SPR_NOACCESS, SPR_NOACCESS,
1063 &spr_read_601_ubat, &spr_write_601_ubatu,
1065 spr_register(env, SPR_IBAT0L, "IBAT0L",
1066 SPR_NOACCESS, SPR_NOACCESS,
1067 &spr_read_601_ubat, &spr_write_601_ubatl,
1069 spr_register(env, SPR_IBAT1U, "IBAT1U",
1070 SPR_NOACCESS, SPR_NOACCESS,
1071 &spr_read_601_ubat, &spr_write_601_ubatu,
1073 spr_register(env, SPR_IBAT1L, "IBAT1L",
1074 SPR_NOACCESS, SPR_NOACCESS,
1075 &spr_read_601_ubat, &spr_write_601_ubatl,
1077 spr_register(env, SPR_IBAT2U, "IBAT2U",
1078 SPR_NOACCESS, SPR_NOACCESS,
1079 &spr_read_601_ubat, &spr_write_601_ubatu,
1081 spr_register(env, SPR_IBAT2L, "IBAT2L",
1082 SPR_NOACCESS, SPR_NOACCESS,
1083 &spr_read_601_ubat, &spr_write_601_ubatl,
1085 spr_register(env, SPR_IBAT3U, "IBAT3U",
1086 SPR_NOACCESS, SPR_NOACCESS,
1087 &spr_read_601_ubat, &spr_write_601_ubatu,
1089 spr_register(env, SPR_IBAT3L, "IBAT3L",
1090 SPR_NOACCESS, SPR_NOACCESS,
1091 &spr_read_601_ubat, &spr_write_601_ubatl,
1095 /* PowerPC BookE SPR */
1096 static void gen_spr_BookE (CPUPPCState *env)
1098 /* Processor identification */
1099 spr_register(env, SPR_BOOKE_PIR, "PIR",
1100 SPR_NOACCESS, SPR_NOACCESS,
1101 &spr_read_generic, &spr_write_pir,
1103 /* Interrupt processing */
1104 spr_register(env, SPR_BOOKE_CSRR0, "CSRR0",
1105 SPR_NOACCESS, SPR_NOACCESS,
1106 &spr_read_generic, &spr_write_generic,
1108 spr_register(env, SPR_BOOKE_CSRR1, "CSRR1",
1109 SPR_NOACCESS, SPR_NOACCESS,
1110 &spr_read_generic, &spr_write_generic,
1112 spr_register(env, SPR_BOOKE_DSRR0, "DSRR0",
1113 SPR_NOACCESS, SPR_NOACCESS,
1114 &spr_read_generic, &spr_write_generic,
1116 spr_register(env, SPR_BOOKE_DSRR1, "DSRR1",
1117 SPR_NOACCESS, SPR_NOACCESS,
1118 &spr_read_generic, &spr_write_generic,
1120 spr_register(env, SPR_BOOKE_MCSRR0, "MCSRR0",
1121 SPR_NOACCESS, SPR_NOACCESS,
1122 &spr_read_generic, &spr_write_generic,
1124 spr_register(env, SPR_BOOKE_MCSRR1, "MCSRR1",
1125 SPR_NOACCESS, SPR_NOACCESS,
1126 &spr_read_generic, &spr_write_generic,
1129 /* XXX : not implemented */
1130 spr_register(env, SPR_BOOKE_IAC1, "IAC1",
1131 SPR_NOACCESS, SPR_NOACCESS,
1132 &spr_read_generic, &spr_write_generic,
1134 /* XXX : not implemented */
1135 spr_register(env, SPR_BOOKE_IAC2, "IAC2",
1136 SPR_NOACCESS, SPR_NOACCESS,
1137 &spr_read_generic, &spr_write_generic,
1139 /* XXX : not implemented */
1140 spr_register(env, SPR_BOOKE_IAC3, "IAC3",
1141 SPR_NOACCESS, SPR_NOACCESS,
1142 &spr_read_generic, &spr_write_generic,
1144 /* XXX : not implemented */
1145 spr_register(env, SPR_BOOKE_IAC4, "IAC4",
1146 SPR_NOACCESS, SPR_NOACCESS,
1147 &spr_read_generic, &spr_write_generic,
1149 /* XXX : not implemented */
1150 spr_register(env, SPR_BOOKE_DAC1, "DAC1",
1151 SPR_NOACCESS, SPR_NOACCESS,
1152 &spr_read_generic, &spr_write_generic,
1154 /* XXX : not implemented */
1155 spr_register(env, SPR_BOOKE_DAC2, "DAC2",
1156 SPR_NOACCESS, SPR_NOACCESS,
1157 &spr_read_generic, &spr_write_generic,
1159 /* XXX : not implemented */
1160 spr_register(env, SPR_BOOKE_DVC1, "DVC1",
1161 SPR_NOACCESS, SPR_NOACCESS,
1162 &spr_read_generic, &spr_write_generic,
1164 /* XXX : not implemented */
1165 spr_register(env, SPR_BOOKE_DVC2, "DVC2",
1166 SPR_NOACCESS, SPR_NOACCESS,
1167 &spr_read_generic, &spr_write_generic,
1169 /* XXX : not implemented */
1170 spr_register(env, SPR_BOOKE_DBCR0, "DBCR0",
1171 SPR_NOACCESS, SPR_NOACCESS,
1172 &spr_read_generic, &spr_write_generic,
1174 /* XXX : not implemented */
1175 spr_register(env, SPR_BOOKE_DBCR1, "DBCR1",
1176 SPR_NOACCESS, SPR_NOACCESS,
1177 &spr_read_generic, &spr_write_generic,
1179 /* XXX : not implemented */
1180 spr_register(env, SPR_BOOKE_DBCR2, "DBCR2",
1181 SPR_NOACCESS, SPR_NOACCESS,
1182 &spr_read_generic, &spr_write_generic,
1184 /* XXX : not implemented */
1185 spr_register(env, SPR_BOOKE_DBSR, "DBSR",
1186 SPR_NOACCESS, SPR_NOACCESS,
1187 &spr_read_generic, &spr_write_clear,
1189 spr_register(env, SPR_BOOKE_DEAR, "DEAR",
1190 SPR_NOACCESS, SPR_NOACCESS,
1191 &spr_read_generic, &spr_write_generic,
1193 spr_register(env, SPR_BOOKE_ESR, "ESR",
1194 SPR_NOACCESS, SPR_NOACCESS,
1195 &spr_read_generic, &spr_write_generic,
1197 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1198 SPR_NOACCESS, SPR_NOACCESS,
1199 &spr_read_generic, &spr_write_generic,
1201 /* Exception vectors */
1202 spr_register(env, SPR_BOOKE_IVPR, "IVPR",
1203 SPR_NOACCESS, SPR_NOACCESS,
1204 &spr_read_generic, &spr_write_generic,
1206 spr_register(env, SPR_BOOKE_IVOR0, "IVOR0",
1207 SPR_NOACCESS, SPR_NOACCESS,
1208 &spr_read_generic, &spr_write_generic,
1210 spr_register(env, SPR_BOOKE_IVOR1, "IVOR1",
1211 SPR_NOACCESS, SPR_NOACCESS,
1212 &spr_read_generic, &spr_write_generic,
1214 spr_register(env, SPR_BOOKE_IVOR2, "IVOR2",
1215 SPR_NOACCESS, SPR_NOACCESS,
1216 &spr_read_generic, &spr_write_generic,
1218 spr_register(env, SPR_BOOKE_IVOR3, "IVOR3",
1219 SPR_NOACCESS, SPR_NOACCESS,
1220 &spr_read_generic, &spr_write_generic,
1222 spr_register(env, SPR_BOOKE_IVOR4, "IVOR4",
1223 SPR_NOACCESS, SPR_NOACCESS,
1224 &spr_read_generic, &spr_write_generic,
1226 spr_register(env, SPR_BOOKE_IVOR5, "IVOR5",
1227 SPR_NOACCESS, SPR_NOACCESS,
1228 &spr_read_generic, &spr_write_generic,
1230 spr_register(env, SPR_BOOKE_IVOR6, "IVOR6",
1231 SPR_NOACCESS, SPR_NOACCESS,
1232 &spr_read_generic, &spr_write_generic,
1234 spr_register(env, SPR_BOOKE_IVOR7, "IVOR7",
1235 SPR_NOACCESS, SPR_NOACCESS,
1236 &spr_read_generic, &spr_write_generic,
1238 spr_register(env, SPR_BOOKE_IVOR8, "IVOR8",
1239 SPR_NOACCESS, SPR_NOACCESS,
1240 &spr_read_generic, &spr_write_generic,
1242 spr_register(env, SPR_BOOKE_IVOR9, "IVOR9",
1243 SPR_NOACCESS, SPR_NOACCESS,
1244 &spr_read_generic, &spr_write_generic,
1246 spr_register(env, SPR_BOOKE_IVOR10, "IVOR10",
1247 SPR_NOACCESS, SPR_NOACCESS,
1248 &spr_read_generic, &spr_write_generic,
1250 spr_register(env, SPR_BOOKE_IVOR11, "IVOR11",
1251 SPR_NOACCESS, SPR_NOACCESS,
1252 &spr_read_generic, &spr_write_generic,
1254 spr_register(env, SPR_BOOKE_IVOR12, "IVOR12",
1255 SPR_NOACCESS, SPR_NOACCESS,
1256 &spr_read_generic, &spr_write_generic,
1258 spr_register(env, SPR_BOOKE_IVOR13, "IVOR13",
1259 SPR_NOACCESS, SPR_NOACCESS,
1260 &spr_read_generic, &spr_write_generic,
1262 spr_register(env, SPR_BOOKE_IVOR14, "IVOR14",
1263 SPR_NOACCESS, SPR_NOACCESS,
1264 &spr_read_generic, &spr_write_generic,
1266 spr_register(env, SPR_BOOKE_IVOR15, "IVOR15",
1267 SPR_NOACCESS, SPR_NOACCESS,
1268 &spr_read_generic, &spr_write_generic,
1270 spr_register(env, SPR_BOOKE_IVOR32, "IVOR32",
1271 SPR_NOACCESS, SPR_NOACCESS,
1272 &spr_read_generic, &spr_write_generic,
1274 spr_register(env, SPR_BOOKE_IVOR33, "IVOR33",
1275 SPR_NOACCESS, SPR_NOACCESS,
1276 &spr_read_generic, &spr_write_generic,
1278 spr_register(env, SPR_BOOKE_IVOR34, "IVOR34",
1279 SPR_NOACCESS, SPR_NOACCESS,
1280 &spr_read_generic, &spr_write_generic,
1282 spr_register(env, SPR_BOOKE_IVOR35, "IVOR35",
1283 SPR_NOACCESS, SPR_NOACCESS,
1284 &spr_read_generic, &spr_write_generic,
1286 spr_register(env, SPR_BOOKE_IVOR36, "IVOR36",
1287 SPR_NOACCESS, SPR_NOACCESS,
1288 &spr_read_generic, &spr_write_generic,
1290 spr_register(env, SPR_BOOKE_IVOR37, "IVOR37",
1291 SPR_NOACCESS, SPR_NOACCESS,
1292 &spr_read_generic, &spr_write_generic,
1294 spr_register(env, SPR_BOOKE_PID, "PID",
1295 SPR_NOACCESS, SPR_NOACCESS,
1296 &spr_read_generic, &spr_write_generic,
1298 spr_register(env, SPR_BOOKE_TCR, "TCR",
1299 SPR_NOACCESS, SPR_NOACCESS,
1300 &spr_read_generic, &spr_write_booke_tcr,
1302 spr_register(env, SPR_BOOKE_TSR, "TSR",
1303 SPR_NOACCESS, SPR_NOACCESS,
1304 &spr_read_generic, &spr_write_booke_tsr,
1307 spr_register(env, SPR_DECR, "DECR",
1308 SPR_NOACCESS, SPR_NOACCESS,
1309 &spr_read_decr, &spr_write_decr,
1311 spr_register(env, SPR_BOOKE_DECAR, "DECAR",
1312 SPR_NOACCESS, SPR_NOACCESS,
1313 SPR_NOACCESS, &spr_write_generic,
1316 spr_register(env, SPR_USPRG0, "USPRG0",
1317 &spr_read_generic, &spr_write_generic,
1318 &spr_read_generic, &spr_write_generic,
1320 spr_register(env, SPR_SPRG4, "SPRG4",
1321 SPR_NOACCESS, SPR_NOACCESS,
1322 &spr_read_generic, &spr_write_generic,
1324 spr_register(env, SPR_USPRG4, "USPRG4",
1325 &spr_read_ureg, SPR_NOACCESS,
1326 &spr_read_ureg, SPR_NOACCESS,
1328 spr_register(env, SPR_SPRG5, "SPRG5",
1329 SPR_NOACCESS, SPR_NOACCESS,
1330 &spr_read_generic, &spr_write_generic,
1332 spr_register(env, SPR_USPRG5, "USPRG5",
1333 &spr_read_ureg, SPR_NOACCESS,
1334 &spr_read_ureg, SPR_NOACCESS,
1336 spr_register(env, SPR_SPRG6, "SPRG6",
1337 SPR_NOACCESS, SPR_NOACCESS,
1338 &spr_read_generic, &spr_write_generic,
1340 spr_register(env, SPR_USPRG6, "USPRG6",
1341 &spr_read_ureg, SPR_NOACCESS,
1342 &spr_read_ureg, SPR_NOACCESS,
1344 spr_register(env, SPR_SPRG7, "SPRG7",
1345 SPR_NOACCESS, SPR_NOACCESS,
1346 &spr_read_generic, &spr_write_generic,
1348 spr_register(env, SPR_USPRG7, "USPRG7",
1349 &spr_read_ureg, SPR_NOACCESS,
1350 &spr_read_ureg, SPR_NOACCESS,
1354 /* FSL storage control registers */
1355 static void gen_spr_BookE_FSL (CPUPPCState *env)
1357 /* TLB assist registers */
1358 spr_register(env, SPR_BOOKE_MAS0, "MAS0",
1359 SPR_NOACCESS, SPR_NOACCESS,
1360 &spr_read_generic, &spr_write_generic,
1362 spr_register(env, SPR_BOOKE_MAS1, "MAS2",
1363 SPR_NOACCESS, SPR_NOACCESS,
1364 &spr_read_generic, &spr_write_generic,
1366 spr_register(env, SPR_BOOKE_MAS2, "MAS3",
1367 SPR_NOACCESS, SPR_NOACCESS,
1368 &spr_read_generic, &spr_write_generic,
1370 spr_register(env, SPR_BOOKE_MAS3, "MAS4",
1371 SPR_NOACCESS, SPR_NOACCESS,
1372 &spr_read_generic, &spr_write_generic,
1374 spr_register(env, SPR_BOOKE_MAS4, "MAS5",
1375 SPR_NOACCESS, SPR_NOACCESS,
1376 &spr_read_generic, &spr_write_generic,
1378 spr_register(env, SPR_BOOKE_MAS6, "MAS6",
1379 SPR_NOACCESS, SPR_NOACCESS,
1380 &spr_read_generic, &spr_write_generic,
1382 spr_register(env, SPR_BOOKE_MAS7, "MAS7",
1383 SPR_NOACCESS, SPR_NOACCESS,
1384 &spr_read_generic, &spr_write_generic,
1386 if (env->nb_pids > 1) {
1387 spr_register(env, SPR_BOOKE_PID1, "PID1",
1388 SPR_NOACCESS, SPR_NOACCESS,
1389 &spr_read_generic, &spr_write_generic,
1392 if (env->nb_pids > 2) {
1393 spr_register(env, SPR_BOOKE_PID2, "PID2",
1394 SPR_NOACCESS, SPR_NOACCESS,
1395 &spr_read_generic, &spr_write_generic,
1398 spr_register(env, SPR_BOOKE_MMUCFG, "MMUCFG",
1399 SPR_NOACCESS, SPR_NOACCESS,
1400 &spr_read_generic, SPR_NOACCESS,
1401 0x00000000); /* TOFIX */
1402 spr_register(env, SPR_BOOKE_MMUCSR0, "MMUCSR0",
1403 SPR_NOACCESS, SPR_NOACCESS,
1404 &spr_read_generic, &spr_write_generic,
1405 0x00000000); /* TOFIX */
1406 switch (env->nb_ways) {
1408 spr_register(env, SPR_BOOKE_TLB3CFG, "TLB3CFG",
1409 SPR_NOACCESS, SPR_NOACCESS,
1410 &spr_read_generic, SPR_NOACCESS,
1411 0x00000000); /* TOFIX */
1414 spr_register(env, SPR_BOOKE_TLB2CFG, "TLB2CFG",
1415 SPR_NOACCESS, SPR_NOACCESS,
1416 &spr_read_generic, SPR_NOACCESS,
1417 0x00000000); /* TOFIX */
1420 spr_register(env, SPR_BOOKE_TLB1CFG, "TLB1CFG",
1421 SPR_NOACCESS, SPR_NOACCESS,
1422 &spr_read_generic, SPR_NOACCESS,
1423 0x00000000); /* TOFIX */
1426 spr_register(env, SPR_BOOKE_TLB0CFG, "TLB0CFG",
1427 SPR_NOACCESS, SPR_NOACCESS,
1428 &spr_read_generic, SPR_NOACCESS,
1429 0x00000000); /* TOFIX */
1437 /* SPR specific to PowerPC 440 implementation */
1438 static void gen_spr_440 (CPUPPCState *env)
1441 /* XXX : not implemented */
1442 spr_register(env, SPR_440_DNV0, "DNV0",
1443 SPR_NOACCESS, SPR_NOACCESS,
1444 &spr_read_generic, &spr_write_generic,
1446 /* XXX : not implemented */
1447 spr_register(env, SPR_440_DNV1, "DNV1",
1448 SPR_NOACCESS, SPR_NOACCESS,
1449 &spr_read_generic, &spr_write_generic,
1451 /* XXX : not implemented */
1452 spr_register(env, SPR_440_DNV2, "DNV2",
1453 SPR_NOACCESS, SPR_NOACCESS,
1454 &spr_read_generic, &spr_write_generic,
1456 /* XXX : not implemented */
1457 spr_register(env, SPR_440_DNV3, "DNV3",
1458 SPR_NOACCESS, SPR_NOACCESS,
1459 &spr_read_generic, &spr_write_generic,
1461 /* XXX : not implemented */
1462 spr_register(env, SPR_440_DVT0, "DVT0",
1463 SPR_NOACCESS, SPR_NOACCESS,
1464 &spr_read_generic, &spr_write_generic,
1466 /* XXX : not implemented */
1467 spr_register(env, SPR_440_DVT1, "DVT1",
1468 SPR_NOACCESS, SPR_NOACCESS,
1469 &spr_read_generic, &spr_write_generic,
1471 /* XXX : not implemented */
1472 spr_register(env, SPR_440_DVT2, "DVT2",
1473 SPR_NOACCESS, SPR_NOACCESS,
1474 &spr_read_generic, &spr_write_generic,
1476 /* XXX : not implemented */
1477 spr_register(env, SPR_440_DVT3, "DVT3",
1478 SPR_NOACCESS, SPR_NOACCESS,
1479 &spr_read_generic, &spr_write_generic,
1481 /* XXX : not implemented */
1482 spr_register(env, SPR_440_DVLIM, "DVLIM",
1483 SPR_NOACCESS, SPR_NOACCESS,
1484 &spr_read_generic, &spr_write_generic,
1486 /* XXX : not implemented */
1487 spr_register(env, SPR_440_INV0, "INV0",
1488 SPR_NOACCESS, SPR_NOACCESS,
1489 &spr_read_generic, &spr_write_generic,
1491 /* XXX : not implemented */
1492 spr_register(env, SPR_440_INV1, "INV1",
1493 SPR_NOACCESS, SPR_NOACCESS,
1494 &spr_read_generic, &spr_write_generic,
1496 /* XXX : not implemented */
1497 spr_register(env, SPR_440_INV2, "INV2",
1498 SPR_NOACCESS, SPR_NOACCESS,
1499 &spr_read_generic, &spr_write_generic,
1501 /* XXX : not implemented */
1502 spr_register(env, SPR_440_INV3, "INV3",
1503 SPR_NOACCESS, SPR_NOACCESS,
1504 &spr_read_generic, &spr_write_generic,
1506 /* XXX : not implemented */
1507 spr_register(env, SPR_440_IVT0, "IVT0",
1508 SPR_NOACCESS, SPR_NOACCESS,
1509 &spr_read_generic, &spr_write_generic,
1511 /* XXX : not implemented */
1512 spr_register(env, SPR_440_IVT1, "IVT1",
1513 SPR_NOACCESS, SPR_NOACCESS,
1514 &spr_read_generic, &spr_write_generic,
1516 /* XXX : not implemented */
1517 spr_register(env, SPR_440_IVT2, "IVT2",
1518 SPR_NOACCESS, SPR_NOACCESS,
1519 &spr_read_generic, &spr_write_generic,
1521 /* XXX : not implemented */
1522 spr_register(env, SPR_440_IVT3, "IVT3",
1523 SPR_NOACCESS, SPR_NOACCESS,
1524 &spr_read_generic, &spr_write_generic,
1526 /* XXX : not implemented */
1527 spr_register(env, SPR_440_IVLIM, "IVLIM",
1528 SPR_NOACCESS, SPR_NOACCESS,
1529 &spr_read_generic, &spr_write_generic,
1532 /* XXX : not implemented */
1533 spr_register(env, SPR_BOOKE_DCBTRH, "DCBTRH",
1534 SPR_NOACCESS, SPR_NOACCESS,
1535 &spr_read_generic, SPR_NOACCESS,
1537 /* XXX : not implemented */
1538 spr_register(env, SPR_BOOKE_DCBTRL, "DCBTRL",
1539 SPR_NOACCESS, SPR_NOACCESS,
1540 &spr_read_generic, SPR_NOACCESS,
1542 /* XXX : not implemented */
1543 spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1544 SPR_NOACCESS, SPR_NOACCESS,
1545 &spr_read_generic, SPR_NOACCESS,
1547 /* XXX : not implemented */
1548 spr_register(env, SPR_BOOKE_ICBTRH, "ICBTRH",
1549 SPR_NOACCESS, SPR_NOACCESS,
1550 &spr_read_generic, SPR_NOACCESS,
1552 /* XXX : not implemented */
1553 spr_register(env, SPR_BOOKE_ICBTRL, "ICBTRL",
1554 SPR_NOACCESS, SPR_NOACCESS,
1555 &spr_read_generic, SPR_NOACCESS,
1557 /* XXX : not implemented */
1558 spr_register(env, SPR_440_DBDR, "DBDR",
1559 SPR_NOACCESS, SPR_NOACCESS,
1560 &spr_read_generic, &spr_write_generic,
1562 /* Processor control */
1563 spr_register(env, SPR_4xx_CCR0, "CCR0",
1564 SPR_NOACCESS, SPR_NOACCESS,
1565 &spr_read_generic, &spr_write_generic,
1567 spr_register(env, SPR_440_RSTCFG, "RSTCFG",
1568 SPR_NOACCESS, SPR_NOACCESS,
1569 &spr_read_generic, SPR_NOACCESS,
1571 /* Storage control */
1572 spr_register(env, SPR_440_MMUCR, "MMUCR",
1573 SPR_NOACCESS, SPR_NOACCESS,
1574 &spr_read_generic, &spr_write_generic,
1578 /* SPR shared between PowerPC 40x implementations */
1579 static void gen_spr_40x (CPUPPCState *env)
1582 /* XXX : not implemented */
1583 spr_register(env, SPR_40x_DCCR, "DCCR",
1584 SPR_NOACCESS, SPR_NOACCESS,
1585 &spr_read_generic, &spr_write_generic,
1587 /* XXX : not implemented */
1588 spr_register(env, SPR_40x_DCWR, "DCWR",
1589 SPR_NOACCESS, SPR_NOACCESS,
1590 &spr_read_generic, &spr_write_generic,
1592 /* XXX : not implemented */
1593 spr_register(env, SPR_40x_ICCR, "ICCR",
1594 SPR_NOACCESS, SPR_NOACCESS,
1595 &spr_read_generic, &spr_write_generic,
1597 /* XXX : not implemented */
1598 spr_register(env, SPR_BOOKE_ICBDR, "ICBDR",
1599 SPR_NOACCESS, SPR_NOACCESS,
1600 &spr_read_generic, SPR_NOACCESS,
1602 /* Bus access control */
1603 spr_register(env, SPR_40x_SGR, "SGR",
1604 SPR_NOACCESS, SPR_NOACCESS,
1605 &spr_read_generic, &spr_write_generic,
1607 spr_register(env, SPR_40x_ZPR, "ZPR",
1608 SPR_NOACCESS, SPR_NOACCESS,
1609 &spr_read_generic, &spr_write_generic,
1612 spr_register(env, SPR_40x_PID, "PID",
1613 SPR_NOACCESS, SPR_NOACCESS,
1614 &spr_read_generic, &spr_write_generic,
1617 spr_register(env, SPR_40x_DEAR, "DEAR",
1618 SPR_NOACCESS, SPR_NOACCESS,
1619 &spr_read_generic, &spr_write_generic,
1621 spr_register(env, SPR_40x_ESR, "ESR",
1622 SPR_NOACCESS, SPR_NOACCESS,
1623 &spr_read_generic, &spr_write_generic,
1625 spr_register(env, SPR_40x_EVPR, "EVPR",
1626 SPR_NOACCESS, SPR_NOACCESS,
1627 &spr_read_generic, &spr_write_generic,
1629 spr_register(env, SPR_40x_SRR2, "SRR2",
1630 &spr_read_generic, &spr_write_generic,
1631 &spr_read_generic, &spr_write_generic,
1633 spr_register(env, SPR_40x_SRR3, "SRR3",
1634 &spr_read_generic, &spr_write_generic,
1635 &spr_read_generic, &spr_write_generic,
1638 spr_register(env, SPR_40x_PIT, "PIT",
1639 SPR_NOACCESS, SPR_NOACCESS,
1640 &spr_read_40x_pit, &spr_write_40x_pit,
1642 spr_register(env, SPR_40x_TCR, "TCR",
1643 SPR_NOACCESS, SPR_NOACCESS,
1644 &spr_read_generic, &spr_write_booke_tcr,
1646 spr_register(env, SPR_40x_TSR, "TSR",
1647 SPR_NOACCESS, SPR_NOACCESS,
1648 &spr_read_generic, &spr_write_booke_tsr,
1650 /* Debug interface */
1651 /* XXX : not implemented */
1652 spr_register(env, SPR_40x_DAC1, "DAC1",
1653 SPR_NOACCESS, SPR_NOACCESS,
1654 &spr_read_generic, &spr_write_generic,
1656 spr_register(env, SPR_40x_DAC2, "DAC2",
1657 SPR_NOACCESS, SPR_NOACCESS,
1658 &spr_read_generic, &spr_write_generic,
1660 /* XXX : not implemented */
1661 spr_register(env, SPR_40x_DBCR0, "DBCR0",
1662 SPR_NOACCESS, SPR_NOACCESS,
1663 &spr_read_generic, &spr_write_40x_dbcr0,
1665 /* XXX : not implemented */
1666 spr_register(env, SPR_40x_DBSR, "DBSR",
1667 SPR_NOACCESS, SPR_NOACCESS,
1668 &spr_read_generic, &spr_write_clear,
1669 /* Last reset was system reset */
1671 /* XXX : not implemented */
1672 spr_register(env, SPR_40x_IAC1, "IAC1",
1673 SPR_NOACCESS, SPR_NOACCESS,
1674 &spr_read_generic, &spr_write_generic,
1676 spr_register(env, SPR_40x_IAC2, "IAC2",
1677 SPR_NOACCESS, SPR_NOACCESS,
1678 &spr_read_generic, &spr_write_generic,
1682 /* SPR specific to PowerPC 405 implementation */
1683 static void gen_spr_405 (CPUPPCState *env)
1685 spr_register(env, SPR_4xx_CCR0, "CCR0",
1686 SPR_NOACCESS, SPR_NOACCESS,
1687 &spr_read_generic, &spr_write_generic,
1690 /* XXX : not implemented */
1691 spr_register(env, SPR_405_DBCR1, "DBCR1",
1692 SPR_NOACCESS, SPR_NOACCESS,
1693 &spr_read_generic, &spr_write_generic,
1695 /* XXX : not implemented */
1696 spr_register(env, SPR_405_DVC1, "DVC1",
1697 SPR_NOACCESS, SPR_NOACCESS,
1698 &spr_read_generic, &spr_write_generic,
1700 /* XXX : not implemented */
1701 spr_register(env, SPR_405_DVC2, "DVC2",
1702 SPR_NOACCESS, SPR_NOACCESS,
1703 &spr_read_generic, &spr_write_generic,
1705 /* XXX : not implemented */
1706 spr_register(env, SPR_405_IAC3, "IAC3",
1707 SPR_NOACCESS, SPR_NOACCESS,
1708 &spr_read_generic, &spr_write_generic,
1710 /* XXX : not implemented */
1711 spr_register(env, SPR_405_IAC4, "IAC4",
1712 SPR_NOACCESS, SPR_NOACCESS,
1713 &spr_read_generic, &spr_write_generic,
1715 /* Storage control */
1716 /* XXX : not implemented */
1717 spr_register(env, SPR_405_SLER, "SLER",
1718 SPR_NOACCESS, SPR_NOACCESS,
1719 &spr_read_generic, &spr_write_generic,
1721 /* XXX : not implemented */
1722 spr_register(env, SPR_405_SU0R, "SU0R",
1723 SPR_NOACCESS, SPR_NOACCESS,
1724 &spr_read_generic, &spr_write_generic,
1727 spr_register(env, SPR_USPRG0, "USPRG0",
1728 &spr_read_ureg, SPR_NOACCESS,
1729 &spr_read_ureg, SPR_NOACCESS,
1731 spr_register(env, SPR_SPRG4, "SPRG4",
1732 SPR_NOACCESS, SPR_NOACCESS,
1733 SPR_NOACCESS, &spr_write_generic,
1735 spr_register(env, SPR_USPRG4, "USPRG4",
1736 &spr_read_ureg, SPR_NOACCESS,
1737 &spr_read_ureg, SPR_NOACCESS,
1739 spr_register(env, SPR_SPRG5, "SPRG5",
1740 SPR_NOACCESS, SPR_NOACCESS,
1741 SPR_NOACCESS, &spr_write_generic,
1743 spr_register(env, SPR_USPRG5, "USPRG5",
1744 &spr_read_ureg, SPR_NOACCESS,
1745 &spr_read_ureg, SPR_NOACCESS,
1747 spr_register(env, SPR_SPRG6, "SPRG6",
1748 SPR_NOACCESS, SPR_NOACCESS,
1749 SPR_NOACCESS, &spr_write_generic,
1751 spr_register(env, SPR_USPRG6, "USPRG6",
1752 &spr_read_ureg, SPR_NOACCESS,
1753 &spr_read_ureg, SPR_NOACCESS,
1755 spr_register(env, SPR_SPRG7, "SPRG7",
1756 SPR_NOACCESS, SPR_NOACCESS,
1757 SPR_NOACCESS, &spr_write_generic,
1759 spr_register(env, SPR_USPRG7, "USPRG7",
1760 &spr_read_ureg, SPR_NOACCESS,
1761 &spr_read_ureg, SPR_NOACCESS,
1765 /* SPR shared between PowerPC 401 & 403 implementations */
1766 static void gen_spr_401_403 (CPUPPCState *env)
1769 spr_register(env, SPR_403_VTBL, "TBL",
1770 &spr_read_tbl, SPR_NOACCESS,
1771 &spr_read_tbl, SPR_NOACCESS,
1773 spr_register(env, SPR_403_TBL, "TBL",
1774 SPR_NOACCESS, SPR_NOACCESS,
1775 SPR_NOACCESS, &spr_write_tbl,
1777 spr_register(env, SPR_403_VTBU, "TBU",
1778 &spr_read_tbu, SPR_NOACCESS,
1779 &spr_read_tbu, SPR_NOACCESS,
1781 spr_register(env, SPR_403_TBU, "TBU",
1782 SPR_NOACCESS, SPR_NOACCESS,
1783 SPR_NOACCESS, &spr_write_tbu,
1786 /* XXX: not implemented */
1787 spr_register(env, SPR_403_CDBCR, "CDBCR",
1788 SPR_NOACCESS, SPR_NOACCESS,
1789 &spr_read_generic, &spr_write_generic,
1793 /* SPR specific to PowerPC 403 implementation */
1794 static void gen_spr_403 (CPUPPCState *env)
1797 spr_register(env, SPR_403_PBL1, "PBL1",
1798 SPR_NOACCESS, SPR_NOACCESS,
1799 &spr_read_403_pbr, &spr_write_403_pbr,
1801 spr_register(env, SPR_403_PBU1, "PBU1",
1802 SPR_NOACCESS, SPR_NOACCESS,
1803 &spr_read_403_pbr, &spr_write_403_pbr,
1805 spr_register(env, SPR_403_PBL2, "PBL2",
1806 SPR_NOACCESS, SPR_NOACCESS,
1807 &spr_read_403_pbr, &spr_write_403_pbr,
1809 spr_register(env, SPR_403_PBU2, "PBU2",
1810 SPR_NOACCESS, SPR_NOACCESS,
1811 &spr_read_403_pbr, &spr_write_403_pbr,
1814 /* XXX : not implemented */
1815 spr_register(env, SPR_40x_DAC2, "DAC2",
1816 SPR_NOACCESS, SPR_NOACCESS,
1817 &spr_read_generic, &spr_write_generic,
1819 /* XXX : not implemented */
1820 spr_register(env, SPR_40x_IAC2, "IAC2",
1821 SPR_NOACCESS, SPR_NOACCESS,
1822 &spr_read_generic, &spr_write_generic,
1826 /* SPR specific to PowerPC compression coprocessor extension */
1828 static void gen_spr_compress (CPUPPCState *env)
1830 spr_register(env, SPR_401_SKR, "SKR",
1831 SPR_NOACCESS, SPR_NOACCESS,
1832 &spr_read_generic, &spr_write_generic,
1837 // XXX: TODO (64 bits PowerPC SPRs)
1839 * ASR => SPR 280 (64 bits)
1840 * FPECR => SPR 1022 (?)
1841 * VRSAVE => SPR 256 (Altivec)
1842 * SCOMC => SPR 276 (64 bits ?)
1843 * SCOMD => SPR 277 (64 bits ?)
1844 * HSPRG0 => SPR 304 (hypervisor)
1845 * HSPRG1 => SPR 305 (hypervisor)
1846 * HDEC => SPR 310 (hypervisor)
1847 * HIOR => SPR 311 (hypervisor)
1848 * RMOR => SPR 312 (970)
1849 * HRMOR => SPR 313 (hypervisor)
1850 * HSRR0 => SPR 314 (hypervisor)
1851 * HSRR1 => SPR 315 (hypervisor)
1852 * LPCR => SPR 316 (970)
1853 * LPIDR => SPR 317 (970)
1854 * ... and more (thermal management, performance counters, ...)
1857 static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def)
1860 /* Default MMU definitions */
1868 * - RCPU (same as MPC5xx ?)
1870 spr_register(env, SPR_PVR, "PVR",
1871 SPR_NOACCESS, SPR_NOACCESS,
1872 &spr_read_generic, SPR_NOACCESS,
1874 printf("%s: PVR %08x mask %08x => %08x\n", __func__,
1875 def->pvr, def->pvr_mask, def->pvr & def->pvr_mask);
1877 /* Embedded PowerPC from IBM */
1878 case CPU_PPC_401A1: /* 401 A1 family */
1879 case CPU_PPC_401B2: /* 401 B2 family */
1880 case CPU_PPC_401C2: /* 401 C2 family */
1881 case CPU_PPC_401D2: /* 401 D2 family */
1882 case CPU_PPC_401E2: /* 401 E2 family */
1883 case CPU_PPC_401F2: /* 401 F2 family */
1884 case CPU_PPC_401G2: /* 401 G2 family */
1885 case CPU_PPC_IOP480: /* IOP 480 family */
1886 case CPU_PPC_COBRA: /* IBM Processor for Network Resources */
1887 gen_spr_generic(env);
1889 gen_spr_401_403(env);
1891 /* XXX: optional ? */
1892 gen_spr_compress(env);
1898 /* XXX: TODO: allocate internal IRQ controller */
1901 case CPU_PPC_403GA: /* 403 GA family */
1902 case CPU_PPC_403GB: /* 403 GB family */
1903 case CPU_PPC_403GC: /* 403 GC family */
1904 case CPU_PPC_403GCX: /* 403 GCX family */
1905 gen_spr_generic(env);
1907 gen_spr_401_403(env);
1913 /* XXX: TODO: allocate internal IRQ controller */
1916 case CPU_PPC_405CR: /* 405 GP/CR family */
1917 case CPU_PPC_405EP: /* 405 EP family */
1918 case CPU_PPC_405GPR: /* 405 GPR family */
1919 case CPU_PPC_405D2: /* 405 D2 family */
1920 case CPU_PPC_405D4: /* 405 D4 family */
1921 gen_spr_generic(env);
1930 /* Allocate hardware IRQ controller */
1931 ppc405_irq_init(env);
1934 case CPU_PPC_NPE405H: /* NPe405 H family */
1935 case CPU_PPC_NPE405H2:
1936 case CPU_PPC_NPE405L: /* Npe405 L family */
1937 gen_spr_generic(env);
1946 /* Allocate hardware IRQ controller */
1947 ppc405_irq_init(env);
1951 case CPU_PPC_STB01000:
1954 case CPU_PPC_STB01010:
1957 case CPU_PPC_STB0210:
1959 case CPU_PPC_STB03: /* STB03 family */
1961 case CPU_PPC_STB043: /* STB043 family */
1964 case CPU_PPC_STB045: /* STB045 family */
1966 case CPU_PPC_STB25: /* STB25 family */
1968 case CPU_PPC_STB130: /* STB130 family */
1970 gen_spr_generic(env);
1979 /* Allocate hardware IRQ controller */
1980 ppc405_irq_init(env);
1983 case CPU_PPC_440EP: /* 440 EP family */
1984 case CPU_PPC_440GP: /* 440 GP family */
1985 case CPU_PPC_440GX: /* 440 GX family */
1986 case CPU_PPC_440GXc: /* 440 GXc family */
1987 case CPU_PPC_440GXf: /* 440 GXf family */
1988 case CPU_PPC_440SP: /* 440 SP family */
1989 case CPU_PPC_440SP2:
1990 case CPU_PPC_440SPE: /* 440 SPE family */
1991 gen_spr_generic(env);
2000 /* XXX: TODO: allocate internal IRQ controller */
2003 /* Embedded PowerPC from Freescale */
2009 case CPU_PPC_8xx: /* MPC821 / 823 / 850 / 860 */
2013 case CPU_PPC_82xx_HIP3: /* MPC8240 / 8260 */
2014 case CPU_PPC_82xx_HIP4: /* MPC8240 / 8260 */
2018 case CPU_PPC_827x: /* MPC 827x / 828x */
2022 /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
2023 case CPU_PPC_e500v110:
2024 case CPU_PPC_e500v120:
2025 case CPU_PPC_e500v210:
2026 case CPU_PPC_e500v220:
2027 gen_spr_generic(env);
2031 gen_spr_BookE_FSL(env);
2036 /* XXX: TODO: allocate internal IRQ controller */
2044 /* 32 bits PowerPC */
2045 case CPU_PPC_601: /* PowerPC 601 */
2046 gen_spr_generic(env);
2047 gen_spr_ne_601(env);
2049 /* Hardware implementation registers */
2050 /* XXX : not implemented */
2051 spr_register(env, SPR_HID0, "HID0",
2052 SPR_NOACCESS, SPR_NOACCESS,
2053 &spr_read_generic, &spr_write_generic,
2055 /* XXX : not implemented */
2056 spr_register(env, SPR_HID1, "HID1",
2057 SPR_NOACCESS, SPR_NOACCESS,
2058 &spr_read_generic, &spr_write_generic,
2060 /* XXX : not implemented */
2061 spr_register(env, SPR_601_HID2, "HID2",
2062 SPR_NOACCESS, SPR_NOACCESS,
2063 &spr_read_generic, &spr_write_generic,
2065 /* XXX : not implemented */
2066 spr_register(env, SPR_601_HID5, "HID5",
2067 SPR_NOACCESS, SPR_NOACCESS,
2068 &spr_read_generic, &spr_write_generic,
2070 /* XXX : not implemented */
2072 spr_register(env, SPR_601_HID15, "HID15",
2073 SPR_NOACCESS, SPR_NOACCESS,
2074 &spr_read_generic, &spr_write_generic,
2081 /* XXX: TODO: allocate internal IRQ controller */
2084 case CPU_PPC_602: /* PowerPC 602 */
2085 gen_spr_generic(env);
2086 gen_spr_ne_601(env);
2087 /* Memory management */
2091 gen_6xx_7xx_soft_tlb(env, 64, 2);
2093 /* hardware implementation registers */
2094 /* XXX : not implemented */
2095 spr_register(env, SPR_HID0, "HID0",
2096 SPR_NOACCESS, SPR_NOACCESS,
2097 &spr_read_generic, &spr_write_generic,
2099 /* XXX : not implemented */
2100 spr_register(env, SPR_HID1, "HID1",
2101 SPR_NOACCESS, SPR_NOACCESS,
2102 &spr_read_generic, &spr_write_generic,
2104 /* Allocate hardware IRQ controller */
2105 ppc6xx_irq_init(env);
2108 case CPU_PPC_603: /* PowerPC 603 */
2109 case CPU_PPC_603E: /* PowerPC 603e */
2110 case CPU_PPC_603E7v:
2111 case CPU_PPC_603E7v2:
2112 case CPU_PPC_603P: /* PowerPC 603p */
2113 case CPU_PPC_603R: /* PowerPC 603r */
2114 gen_spr_generic(env);
2115 gen_spr_ne_601(env);
2116 /* Memory management */
2120 gen_6xx_7xx_soft_tlb(env, 64, 2);
2122 /* hardware implementation registers */
2123 /* XXX : not implemented */
2124 spr_register(env, SPR_HID0, "HID0",
2125 SPR_NOACCESS, SPR_NOACCESS,
2126 &spr_read_generic, &spr_write_generic,
2128 /* XXX : not implemented */
2129 spr_register(env, SPR_HID1, "HID1",
2130 SPR_NOACCESS, SPR_NOACCESS,
2131 &spr_read_generic, &spr_write_generic,
2133 /* Allocate hardware IRQ controller */
2134 ppc6xx_irq_init(env);
2137 case CPU_PPC_G2: /* PowerPC G2 family */
2141 case CPU_PPC_G2LE: /* PowerPC G2LE family */
2142 case CPU_PPC_G2LEgp:
2143 case CPU_PPC_G2LEls:
2144 gen_spr_generic(env);
2145 gen_spr_ne_601(env);
2146 /* Memory management */
2150 /* Memory management */
2152 gen_6xx_7xx_soft_tlb(env, 64, 2);
2153 gen_spr_G2_755(env);
2155 /* Hardware implementation register */
2156 /* XXX : not implemented */
2157 spr_register(env, SPR_HID0, "HID0",
2158 SPR_NOACCESS, SPR_NOACCESS,
2159 &spr_read_generic, &spr_write_generic,
2161 /* XXX : not implemented */
2162 spr_register(env, SPR_HID1, "HID1",
2163 SPR_NOACCESS, SPR_NOACCESS,
2164 &spr_read_generic, &spr_write_generic,
2166 /* XXX : not implemented */
2167 spr_register(env, SPR_HID2, "HID2",
2168 SPR_NOACCESS, SPR_NOACCESS,
2169 &spr_read_generic, &spr_write_generic,
2171 /* Allocate hardware IRQ controller */
2172 ppc6xx_irq_init(env);
2175 case CPU_PPC_604: /* PowerPC 604 */
2176 case CPU_PPC_604E: /* PowerPC 604e */
2177 case CPU_PPC_604R: /* PowerPC 604r */
2178 gen_spr_generic(env);
2179 gen_spr_ne_601(env);
2180 /* Memory management */
2185 /* Hardware implementation registers */
2186 /* XXX : not implemented */
2187 spr_register(env, SPR_HID0, "HID0",
2188 SPR_NOACCESS, SPR_NOACCESS,
2189 &spr_read_generic, &spr_write_generic,
2191 /* XXX : not implemented */
2192 spr_register(env, SPR_HID1, "HID1",
2193 SPR_NOACCESS, SPR_NOACCESS,
2194 &spr_read_generic, &spr_write_generic,
2196 /* Allocate hardware IRQ controller */
2197 ppc6xx_irq_init(env);
2200 case CPU_PPC_74x: /* PowerPC 740 / 750 */
2203 case CPU_PPC_74xP: /* PowerPC 740P / 750P */
2204 case CPU_PPC_750CXE21: /* IBM PowerPC 750cxe */
2205 case CPU_PPC_750CXE22:
2206 case CPU_PPC_750CXE23:
2207 case CPU_PPC_750CXE24:
2208 case CPU_PPC_750CXE24b:
2209 case CPU_PPC_750CXE31:
2210 case CPU_PPC_750CXE31b:
2211 case CPU_PPC_750CXR:
2212 gen_spr_generic(env);
2213 gen_spr_ne_601(env);
2214 /* Memory management */
2219 /* Hardware implementation registers */
2220 /* XXX : not implemented */
2221 spr_register(env, SPR_HID0, "HID0",
2222 SPR_NOACCESS, SPR_NOACCESS,
2223 &spr_read_generic, &spr_write_generic,
2225 /* XXX : not implemented */
2226 spr_register(env, SPR_HID1, "HID1",
2227 SPR_NOACCESS, SPR_NOACCESS,
2228 &spr_read_generic, &spr_write_generic,
2230 /* Allocate hardware IRQ controller */
2231 ppc6xx_irq_init(env);
2234 case CPU_PPC_750FX10: /* IBM PowerPC 750 FX */
2235 case CPU_PPC_750FX20:
2236 case CPU_PPC_750FX21:
2237 case CPU_PPC_750FX22:
2238 case CPU_PPC_750FX23:
2239 case CPU_PPC_750GX10: /* IBM PowerPC 750 GX */
2240 case CPU_PPC_750GX11:
2241 case CPU_PPC_750GX12:
2242 gen_spr_generic(env);
2243 gen_spr_ne_601(env);
2244 /* Memory management */
2246 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2251 /* Hardware implementation registers */
2252 /* XXX : not implemented */
2253 spr_register(env, SPR_HID0, "HID0",
2254 SPR_NOACCESS, SPR_NOACCESS,
2255 &spr_read_generic, &spr_write_generic,
2257 /* XXX : not implemented */
2258 spr_register(env, SPR_HID1, "HID1",
2259 SPR_NOACCESS, SPR_NOACCESS,
2260 &spr_read_generic, &spr_write_generic,
2262 /* XXX : not implemented */
2263 spr_register(env, SPR_750_HID2, "HID2",
2264 SPR_NOACCESS, SPR_NOACCESS,
2265 &spr_read_generic, &spr_write_generic,
2267 /* Allocate hardware IRQ controller */
2268 ppc6xx_irq_init(env);
2271 case CPU_PPC_755_10: /* PowerPC 755 */
2272 case CPU_PPC_755_11:
2273 case CPU_PPC_755_20:
2276 gen_spr_generic(env);
2277 gen_spr_ne_601(env);
2278 /* Memory management */
2282 /* Memory management */
2284 gen_6xx_7xx_soft_tlb(env, 64, 2);
2285 gen_spr_G2_755(env);
2286 /* L2 cache control */
2287 /* XXX : not implemented */
2288 spr_register(env, SPR_ICTC, "ICTC",
2289 SPR_NOACCESS, SPR_NOACCESS,
2290 &spr_read_generic, &spr_write_generic,
2292 /* XXX : not implemented */
2293 spr_register(env, SPR_L2PM, "L2PM",
2294 SPR_NOACCESS, SPR_NOACCESS,
2295 &spr_read_generic, &spr_write_generic,
2297 /* Hardware implementation registers */
2298 /* XXX : not implemented */
2299 spr_register(env, SPR_HID0, "HID0",
2300 SPR_NOACCESS, SPR_NOACCESS,
2301 &spr_read_generic, &spr_write_generic,
2303 /* XXX : not implemented */
2304 spr_register(env, SPR_HID1, "HID1",
2305 SPR_NOACCESS, SPR_NOACCESS,
2306 &spr_read_generic, &spr_write_generic,
2308 /* XXX : not implemented */
2309 spr_register(env, SPR_HID2, "HID2",
2310 SPR_NOACCESS, SPR_NOACCESS,
2311 &spr_read_generic, &spr_write_generic,
2313 /* Allocate hardware IRQ controller */
2314 ppc6xx_irq_init(env);
2319 case CPU_PPC_7400: /* PowerPC 7400 */
2320 case CPU_PPC_7410C: /* PowerPC 7410 */
2323 case CPU_PPC_7441: /* PowerPC 7441 */
2324 case CPU_PPC_7445: /* PowerPC 7445 */
2325 case CPU_PPC_7447: /* PowerPC 7447 */
2326 case CPU_PPC_7447A: /* PowerPC 7447A */
2327 case CPU_PPC_7448: /* PowerPC 7448 */
2328 case CPU_PPC_7450: /* PowerPC 7450 */
2330 case CPU_PPC_7451: /* PowerPC 7451 */
2332 case CPU_PPC_7455: /* PowerPC 7455 */
2335 case CPU_PPC_7457: /* PowerPC 7457 */
2337 case CPU_PPC_7457A: /* PowerPC 7457A */
2341 /* 64 bits PowerPC */
2342 #if defined (TARGET_PPC64)
2344 case CPU_PPC_620: /* PowerPC 620 */
2345 case CPU_PPC_630: /* PowerPC 630 (Power 3) */
2346 case CPU_PPC_631: /* PowerPC 631 (Power 3+) */
2347 case CPU_PPC_POWER4: /* Power 4 */
2348 case CPU_PPC_POWER4P: /* Power 4+ */
2349 case CPU_PPC_POWER5: /* Power 5 */
2350 case CPU_PPC_POWER5P: /* Power 5+ */
2354 case CPU_PPC_970: /* PowerPC 970 */
2355 case CPU_PPC_970FX10: /* PowerPC 970 FX */
2356 case CPU_PPC_970FX20:
2357 case CPU_PPC_970FX21:
2358 case CPU_PPC_970FX30:
2359 case CPU_PPC_970FX31:
2360 case CPU_PPC_970MP10: /* PowerPC 970 MP */
2361 case CPU_PPC_970MP11:
2362 gen_spr_generic(env);
2363 gen_spr_ne_601(env);
2364 /* XXX: not correct */
2369 /* Hardware implementation registers */
2370 /* XXX : not implemented */
2371 spr_register(env, SPR_HID0, "HID0",
2372 SPR_NOACCESS, SPR_NOACCESS,
2373 &spr_read_generic, &spr_write_generic,
2375 /* XXX : not implemented */
2376 spr_register(env, SPR_HID1, "HID1",
2377 SPR_NOACCESS, SPR_NOACCESS,
2378 &spr_read_generic, &spr_write_generic,
2380 /* XXX : not implemented */
2381 spr_register(env, SPR_750_HID2, "HID2",
2382 SPR_NOACCESS, SPR_NOACCESS,
2383 &spr_read_generic, &spr_write_generic,
2385 /* Allocate hardware IRQ controller */
2386 ppc970_irq_init(env);
2390 case CPU_PPC_CELL10: /* Cell family */
2391 case CPU_PPC_CELL20:
2392 case CPU_PPC_CELL30:
2393 case CPU_PPC_CELL31:
2398 case CPU_PPC_RS64: /* Apache (RS64/A35) */
2399 case CPU_PPC_RS64II: /* NorthStar (RS64-II/A50) */
2400 case CPU_PPC_RS64III: /* Pulsar (RS64-III) */
2401 case CPU_PPC_RS64IV: /* IceStar/IStar/SStar (RS64-IV) */
2404 #endif /* defined (TARGET_PPC64) */
2408 case CPU_POWER: /* POWER */
2409 case CPU_POWER2: /* POWER2 */
2414 gen_spr_generic(env);
2415 /* XXX: TODO: allocate internal IRQ controller */
2418 if (env->nb_BATs == -1)
2420 /* Allocate TLBs buffer when needed */
2421 if (env->nb_tlb != 0) {
2422 int nb_tlb = env->nb_tlb;
2423 if (env->id_tlbs != 0)
2425 env->tlb = qemu_mallocz(nb_tlb * sizeof(ppc_tlb_t));
2426 /* Pre-compute some useful values */
2427 env->tlb_per_way = env->nb_tlb / env->nb_ways;
2431 #if defined(PPC_DUMP_CPU)
2432 static void dump_sprs (CPUPPCState *env)
2435 uint32_t pvr = env->spr[SPR_PVR];
2436 uint32_t sr, sw, ur, uw;
2439 printf("* SPRs for PVR=%08x\n", pvr);
2440 for (i = 0; i < 32; i++) {
2441 for (j = 0; j < 32; j++) {
2443 spr = &env->spr_cb[n];
2444 #if !defined(CONFIG_USER_ONLY)
2445 sw = spr->oea_write != NULL && spr->oea_write != SPR_NOACCESS;
2446 sr = spr->oea_read != NULL && spr->oea_read != SPR_NOACCESS;
2451 uw = spr->uea_write != NULL && spr->uea_write != SPR_NOACCESS;
2452 ur = spr->uea_read != NULL && spr->uea_read != SPR_NOACCESS;
2453 if (sw || sr || uw || ur) {
2454 printf("%4d (%03x) %8s s%c%c u%c%c\n",
2455 (i << 5) | j, (i << 5) | j, spr->name,
2456 sw ? 'w' : '-', sr ? 'r' : '-',
2457 uw ? 'w' : '-', ur ? 'r' : '-');
2466 /*****************************************************************************/
2470 int fflush (FILE *stream);
2474 PPC_DIRECT = 0, /* Opcode routine */
2475 PPC_INDIRECT = 1, /* Indirect opcode table */
2478 static inline int is_indirect_opcode (void *handler)
2480 return ((unsigned long)handler & 0x03) == PPC_INDIRECT;
2483 static inline opc_handler_t **ind_table(void *handler)
2485 return (opc_handler_t **)((unsigned long)handler & ~3);
2488 /* Instruction table creation */
2489 /* Opcodes tables creation */
2490 static void fill_new_table (opc_handler_t **table, int len)
2494 for (i = 0; i < len; i++)
2495 table[i] = &invalid_handler;
2498 static int create_new_table (opc_handler_t **table, unsigned char idx)
2500 opc_handler_t **tmp;
2502 tmp = malloc(0x20 * sizeof(opc_handler_t));
2505 fill_new_table(tmp, 0x20);
2506 table[idx] = (opc_handler_t *)((unsigned long)tmp | PPC_INDIRECT);
2511 static int insert_in_table (opc_handler_t **table, unsigned char idx,
2512 opc_handler_t *handler)
2514 if (table[idx] != &invalid_handler)
2516 table[idx] = handler;
2521 static int register_direct_insn (opc_handler_t **ppc_opcodes,
2522 unsigned char idx, opc_handler_t *handler)
2524 if (insert_in_table(ppc_opcodes, idx, handler) < 0) {
2525 printf("*** ERROR: opcode %02x already assigned in main "
2526 "opcode table\n", idx);
2533 static int register_ind_in_table (opc_handler_t **table,
2534 unsigned char idx1, unsigned char idx2,
2535 opc_handler_t *handler)
2537 if (table[idx1] == &invalid_handler) {
2538 if (create_new_table(table, idx1) < 0) {
2539 printf("*** ERROR: unable to create indirect table "
2540 "idx=%02x\n", idx1);
2544 if (!is_indirect_opcode(table[idx1])) {
2545 printf("*** ERROR: idx %02x already assigned to a direct "
2550 if (handler != NULL &&
2551 insert_in_table(ind_table(table[idx1]), idx2, handler) < 0) {
2552 printf("*** ERROR: opcode %02x already assigned in "
2553 "opcode table %02x\n", idx2, idx1);
2560 static int register_ind_insn (opc_handler_t **ppc_opcodes,
2561 unsigned char idx1, unsigned char idx2,
2562 opc_handler_t *handler)
2566 ret = register_ind_in_table(ppc_opcodes, idx1, idx2, handler);
2571 static int register_dblind_insn (opc_handler_t **ppc_opcodes,
2572 unsigned char idx1, unsigned char idx2,
2573 unsigned char idx3, opc_handler_t *handler)
2575 if (register_ind_in_table(ppc_opcodes, idx1, idx2, NULL) < 0) {
2576 printf("*** ERROR: unable to join indirect table idx "
2577 "[%02x-%02x]\n", idx1, idx2);
2580 if (register_ind_in_table(ind_table(ppc_opcodes[idx1]), idx2, idx3,
2582 printf("*** ERROR: unable to insert opcode "
2583 "[%02x-%02x-%02x]\n", idx1, idx2, idx3);
2590 static int register_insn (opc_handler_t **ppc_opcodes, opcode_t *insn)
2592 if (insn->opc2 != 0xFF) {
2593 if (insn->opc3 != 0xFF) {
2594 if (register_dblind_insn(ppc_opcodes, insn->opc1, insn->opc2,
2595 insn->opc3, &insn->handler) < 0)
2598 if (register_ind_insn(ppc_opcodes, insn->opc1,
2599 insn->opc2, &insn->handler) < 0)
2603 if (register_direct_insn(ppc_opcodes, insn->opc1, &insn->handler) < 0)
2610 static int test_opcode_table (opc_handler_t **table, int len)
2614 for (i = 0, count = 0; i < len; i++) {
2615 /* Consistency fixup */
2616 if (table[i] == NULL)
2617 table[i] = &invalid_handler;
2618 if (table[i] != &invalid_handler) {
2619 if (is_indirect_opcode(table[i])) {
2620 tmp = test_opcode_table(ind_table(table[i]), 0x20);
2623 table[i] = &invalid_handler;
2636 static void fix_opcode_tables (opc_handler_t **ppc_opcodes)
2638 if (test_opcode_table(ppc_opcodes, 0x40) == 0)
2639 printf("*** WARNING: no opcode defined !\n");
2642 /*****************************************************************************/
2643 static int create_ppc_opcodes (CPUPPCState *env, ppc_def_t *def)
2645 opcode_t *opc, *start, *end;
2647 fill_new_table(env->opcodes, 0x40);
2648 #if defined(PPC_DUMP_CPU)
2649 printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2651 def->pvr, def->name, def->insns_flags, def->flags);
2653 if (&opc_start < &opc_end) {
2660 for (opc = start + 1; opc != end; opc++) {
2661 if ((opc->handler.type & def->insns_flags) != 0) {
2662 if (register_insn(env->opcodes, opc) < 0) {
2663 printf("*** ERROR initializing PowerPC instruction "
2664 "0x%02x 0x%02x 0x%02x\n", opc->opc1, opc->opc2,
2668 #if defined(PPC_DUMP_CPU)
2670 if (opc->opc3 == 0xFF) {
2671 if (opc->opc2 == 0xFF) {
2672 printf(" %02x -- -- (%2d ----) : %s\n",
2673 opc->opc1, opc->opc1, opc->oname);
2675 printf(" %02x %02x -- (%2d %4d) : %s\n",
2676 opc->opc1, opc->opc2, opc->opc1, opc->opc2,
2680 printf(" %02x %02x %02x (%2d %4d) : %s\n",
2681 opc->opc1, opc->opc2, opc->opc3,
2682 opc->opc1, (opc->opc3 << 5) | opc->opc2,
2689 fix_opcode_tables(env->opcodes);
2696 int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def)
2698 env->msr_mask = def->msr_mask;
2699 env->flags = def->flags;
2700 if (create_ppc_opcodes(env, def) < 0)
2702 init_ppc_proc(env, def);
2703 #if defined(PPC_DUMP_CPU)
2705 if (env->tlb != NULL) {
2706 printf("%d %s TLB in %d ways\n", env->nb_tlb,
2707 env->id_tlbs ? "splitted" : "merged", env->nb_ways);
2714 /*****************************************************************************/
2715 /* PowerPC CPU definitions */
2716 static ppc_def_t ppc_defs[] = {
2717 /* Embedded PowerPC */
2723 .pvr_mask = 0xFFFF0000,
2724 .insns_flags = PPC_INSNS_401,
2725 .flags = PPC_FLAGS_401,
2730 /* IOP480 (401 microcontroler) */
2733 .pvr = CPU_PPC_IOP480,
2734 .pvr_mask = 0xFFFF0000,
2735 .insns_flags = PPC_INSNS_401,
2736 .flags = PPC_FLAGS_401,
2741 /* IBM Processor for Network Resources */
2744 .pvr = CPU_PPC_COBRA,
2745 .pvr_mask = 0xFFFF0000,
2746 .insns_flags = PPC_INSNS_401,
2747 .flags = PPC_FLAGS_401,
2752 /* Generic PowerPC 403 */
2756 .pvr_mask = 0xFFFFFF00,
2757 .insns_flags = PPC_INSNS_403,
2758 .flags = PPC_FLAGS_403,
2759 .msr_mask = 0x000000000007D23D,
2763 /* PowerPC 403 GA */
2766 .pvr = CPU_PPC_403GA,
2767 .pvr_mask = 0xFFFFFF00,
2768 .insns_flags = PPC_INSNS_403,
2769 .flags = PPC_FLAGS_403,
2770 .msr_mask = 0x000000000007D23D,
2774 /* PowerPC 403 GB */
2777 .pvr = CPU_PPC_403GB,
2778 .pvr_mask = 0xFFFFFF00,
2779 .insns_flags = PPC_INSNS_403,
2780 .flags = PPC_FLAGS_403,
2781 .msr_mask = 0x000000000007D23D,
2785 /* PowerPC 403 GC */
2788 .pvr = CPU_PPC_403GC,
2789 .pvr_mask = 0xFFFFFF00,
2790 .insns_flags = PPC_INSNS_403,
2791 .flags = PPC_FLAGS_403,
2792 .msr_mask = 0x000000000007D23D,
2796 /* PowerPC 403 GCX */
2799 .pvr = CPU_PPC_403GCX,
2800 .pvr_mask = 0xFFFFFF00,
2801 .insns_flags = PPC_INSNS_403,
2802 .flags = PPC_FLAGS_403,
2803 .msr_mask = 0x000000000007D23D,
2806 /* Generic PowerPC 405 */
2810 .pvr_mask = 0xFFFF0000,
2811 .insns_flags = PPC_INSNS_405,
2812 .flags = PPC_FLAGS_405,
2813 .msr_mask = 0x00000000020EFF30,
2815 /* PowerPC 405 CR */
2819 .pvr_mask = 0xFFFFFFFF,
2820 .insns_flags = PPC_INSNS_405,
2821 .flags = PPC_FLAGS_405,
2822 .msr_mask = 0x00000000020EFF30,
2825 /* PowerPC 405 GP */
2829 .pvr_mask = 0xFFFFFFFF,
2830 .insns_flags = PPC_INSNS_405,
2831 .flags = PPC_FLAGS_405,
2832 .msr_mask = 0x00000000020EFF30,
2835 /* PowerPC 405 EP */
2838 .pvr = CPU_PPC_405EP,
2839 .pvr_mask = 0xFFFFFFFF,
2840 .insns_flags = PPC_INSNS_405,
2841 .flags = PPC_FLAGS_405,
2842 .msr_mask = 0x00000000020EFF30,
2845 /* PowerPC 405 EZ */
2848 .pvr = CPU_PPC_405EZ,
2849 .pvr_mask = 0xFFFFFFFF,
2850 .insns_flags = PPC_INSNS_405,
2851 .flags = PPC_FLAGS_405,
2852 .msr_mask = 0x00000000020EFF30,
2856 /* PowerPC 405 GPR */
2859 .pvr = CPU_PPC_405GPR,
2860 .pvr_mask = 0xFFFFFFFF,
2861 .insns_flags = PPC_INSNS_405,
2862 .flags = PPC_FLAGS_405,
2863 .msr_mask = 0x00000000020EFF30,
2867 /* PowerPC 405 D2 */
2870 .pvr = CPU_PPC_405D2,
2871 .pvr_mask = 0xFFFFFFFF,
2872 .insns_flags = PPC_INSNS_405,
2873 .flags = PPC_FLAGS_405,
2874 .msr_mask = 0x00000000020EFF30,
2878 /* PowerPC 405 D4 */
2881 .pvr = CPU_PPC_405D4,
2882 .pvr_mask = 0xFFFFFFFF,
2883 .insns_flags = PPC_INSNS_405,
2884 .flags = PPC_FLAGS_405,
2885 .msr_mask = 0x00000000020EFF30,
2892 .pvr = CPU_PPC_NPE405H,
2893 .pvr_mask = 0xFFFFFFFF,
2894 .insns_flags = PPC_INSNS_405,
2895 .flags = PPC_FLAGS_405,
2896 .msr_mask = 0x00000000020EFF30,
2903 .pvr = CPU_PPC_NPE405L,
2904 .pvr_mask = 0xFFFFFFFF,
2905 .insns_flags = PPC_INSNS_405,
2906 .flags = PPC_FLAGS_405,
2907 .msr_mask = 0x00000000020EFF30,
2914 .pvr = CPU_PPC_STB01000,
2915 .pvr_mask = 0xFFFFFFFF,
2916 .insns_flags = PPC_INSNS_405,
2917 .flags = PPC_FLAGS_405,
2918 .msr_mask = 0x00000000020EFF30,
2925 .pvr = CPU_PPC_STB01010,
2926 .pvr_mask = 0xFFFFFFFF,
2927 .insns_flags = PPC_INSNS_405,
2928 .flags = PPC_FLAGS_405,
2929 .msr_mask = 0x00000000020EFF30,
2936 .pvr = CPU_PPC_STB0210,
2937 .pvr_mask = 0xFFFFFFFF,
2938 .insns_flags = PPC_INSNS_405,
2939 .flags = PPC_FLAGS_405,
2940 .msr_mask = 0x00000000020EFF30,
2943 #if defined (TODO) || 1
2947 .pvr = CPU_PPC_STB03,
2948 .pvr_mask = 0xFFFFFFFF,
2949 .insns_flags = PPC_INSNS_405,
2950 .flags = PPC_FLAGS_405,
2951 .msr_mask = 0x00000000020EFF30,
2958 .pvr = CPU_PPC_STB043,
2959 .pvr_mask = 0xFFFFFFFF,
2960 .insns_flags = PPC_INSNS_405,
2961 .flags = PPC_FLAGS_405,
2962 .msr_mask = 0x00000000020EFF30,
2969 .pvr = CPU_PPC_STB045,
2970 .pvr_mask = 0xFFFFFFFF,
2971 .insns_flags = PPC_INSNS_405,
2972 .flags = PPC_FLAGS_405,
2973 .msr_mask = 0x00000000020EFF30,
2976 #if defined (TODO) || 1
2980 .pvr = CPU_PPC_STB25,
2981 .pvr_mask = 0xFFFFFFFF,
2982 .insns_flags = PPC_INSNS_405,
2983 .flags = PPC_FLAGS_405,
2984 .msr_mask = 0x00000000020EFF30,
2991 .pvr = CPU_PPC_STB130,
2992 .pvr_mask = 0xFFFFFFFF,
2993 .insns_flags = PPC_INSNS_405,
2994 .flags = PPC_FLAGS_405,
2995 .msr_mask = 0x00000000020EFF30,
2998 /* Xilinx PowerPC 405 cores */
3002 .pvr = CPU_PPC_X2VP4,
3003 .pvr_mask = 0xFFFFFFFF,
3004 .insns_flags = PPC_INSNS_405,
3005 .flags = PPC_FLAGS_405,
3006 .msr_mask = 0x00000000020EFF30,
3010 .pvr = CPU_PPC_X2VP7,
3011 .pvr_mask = 0xFFFFFFFF,
3012 .insns_flags = PPC_INSNS_405,
3013 .flags = PPC_FLAGS_405,
3014 .msr_mask = 0x00000000020EFF30,
3018 .pvr = CPU_PPC_X2VP20,
3019 .pvr_mask = 0xFFFFFFFF,
3020 .insns_flags = PPC_INSNS_405,
3021 .flags = PPC_FLAGS_405,
3022 .msr_mask = 0x00000000020EFF30,
3026 .pvr = CPU_PPC_X2VP50,
3027 .pvr_mask = 0xFFFFFFFF,
3028 .insns_flags = PPC_INSNS_405,
3029 .flags = PPC_FLAGS_405,
3030 .msr_mask = 0x00000000020EFF30,
3034 /* PowerPC 440 EP */
3037 .pvr = CPU_PPC_440EP,
3038 .pvr_mask = 0xFFFF0000,
3039 .insns_flags = PPC_INSNS_440,
3040 .flags = PPC_FLAGS_440,
3041 .msr_mask = 0x000000000006D630,
3045 /* PowerPC 440 GR */
3048 .pvr = CPU_PPC_440GR,
3049 .pvr_mask = 0xFFFF0000,
3050 .insns_flags = PPC_INSNS_440,
3051 .flags = PPC_FLAGS_440,
3052 .msr_mask = 0x000000000006D630,
3056 /* PowerPC 440 GP */
3059 .pvr = CPU_PPC_440GP,
3060 .pvr_mask = 0xFFFFFF00,
3061 .insns_flags = PPC_INSNS_440,
3062 .flags = PPC_FLAGS_440,
3063 .msr_mask = 0x000000000006D630,
3067 /* PowerPC 440 GX */
3070 .pvr = CPU_PPC_440GX,
3071 .pvr_mask = 0xFFFF0000,
3072 .insns_flags = PPC_INSNS_405,
3073 .flags = PPC_FLAGS_440,
3074 .msr_mask = 0x000000000006D630,
3078 /* PowerPC 440 GXc */
3081 .pvr = CPU_PPC_440GXC,
3082 .pvr_mask = 0xFFFF0000,
3083 .insns_flags = PPC_INSNS_405,
3084 .flags = PPC_FLAGS_440,
3085 .msr_mask = 0x000000000006D630,
3089 /* PowerPC 440 GXf */
3092 .pvr = CPU_PPC_440GXF,
3093 .pvr_mask = 0xFFFF0000,
3094 .insns_flags = PPC_INSNS_405,
3095 .flags = PPC_FLAGS_440,
3096 .msr_mask = 0x000000000006D630,
3100 /* PowerPC 440 SP */
3103 .pvr = CPU_PPC_440SP,
3104 .pvr_mask = 0xFFFF0000,
3105 .insns_flags = PPC_INSNS_405,
3106 .flags = PPC_FLAGS_440,
3107 .msr_mask = 0x000000000006D630,
3111 /* PowerPC 440 SP2 */
3114 .pvr = CPU_PPC_440SP2,
3115 .pvr_mask = 0xFFFF0000,
3116 .insns_flags = PPC_INSNS_405,
3117 .flags = PPC_FLAGS_440,
3118 .msr_mask = 0x000000000006D630,
3122 /* PowerPC 440 SPE */
3125 .pvr = CPU_PPC_440SPE,
3126 .pvr_mask = 0xFFFF0000,
3127 .insns_flags = PPC_INSNS_405,
3128 .flags = PPC_FLAGS_440,
3129 .msr_mask = 0x000000000006D630,
3132 /* Fake generic BookE PowerPC */
3135 .pvr = CPU_PPC_e500,
3136 .pvr_mask = 0xFFFFFFFF,
3137 .insns_flags = PPC_INSNS_BOOKE,
3138 .flags = PPC_FLAGS_BOOKE,
3139 .msr_mask = 0x000000000006D630,
3141 /* PowerPC 460 cores - TODO */
3142 /* PowerPC MPC 5xx cores - TODO */
3143 /* PowerPC MPC 8xx cores - TODO */
3144 /* PowerPC MPC 8xxx cores - TODO */
3145 /* e200 cores - TODO */
3146 /* e500 cores - TODO */
3147 /* e600 cores - TODO */
3149 /* 32 bits "classic" PowerPC */
3155 .pvr_mask = 0xFFFF0000,
3156 .insns_flags = PPC_INSNS_601,
3157 .flags = PPC_FLAGS_601,
3158 .msr_mask = 0x000000000000FD70,
3166 .pvr_mask = 0xFFFF0000,
3167 .insns_flags = PPC_INSNS_602,
3168 .flags = PPC_FLAGS_602,
3169 .msr_mask = 0x0000000000C7FF73,
3176 .pvr_mask = 0xFFFFFFFF,
3177 .insns_flags = PPC_INSNS_603,
3178 .flags = PPC_FLAGS_603,
3179 .msr_mask = 0x000000000007FF73,
3184 .pvr = CPU_PPC_603E,
3185 .pvr_mask = 0xFFFFFFFF,
3186 .insns_flags = PPC_INSNS_603,
3187 .flags = PPC_FLAGS_603,
3188 .msr_mask = 0x000000000007FF73,
3192 .pvr = CPU_PPC_603E,
3193 .pvr_mask = 0xFFFFFFFF,
3194 .insns_flags = PPC_INSNS_603,
3195 .flags = PPC_FLAGS_603,
3196 .msr_mask = 0x000000000007FF73,
3201 .pvr = CPU_PPC_603P,
3202 .pvr_mask = 0xFFFFFFFF,
3203 .insns_flags = PPC_INSNS_603,
3204 .flags = PPC_FLAGS_603,
3205 .msr_mask = 0x000000000007FF73,
3210 .pvr = CPU_PPC_603E7,
3211 .pvr_mask = 0xFFFFFFFF,
3212 .insns_flags = PPC_INSNS_603,
3213 .flags = PPC_FLAGS_603,
3214 .msr_mask = 0x000000000007FF73,
3216 /* PowerPC 603e7v */
3219 .pvr = CPU_PPC_603E7v,
3220 .pvr_mask = 0xFFFFFFFF,
3221 .insns_flags = PPC_INSNS_603,
3222 .flags = PPC_FLAGS_603,
3223 .msr_mask = 0x000000000007FF73,
3225 /* PowerPC 603e7v2 */
3228 .pvr = CPU_PPC_603E7v2,
3229 .pvr_mask = 0xFFFFFFFF,
3230 .insns_flags = PPC_INSNS_603,
3231 .flags = PPC_FLAGS_603,
3232 .msr_mask = 0x000000000007FF73,
3237 .pvr = CPU_PPC_603R,
3238 .pvr_mask = 0xFFFFFFFF,
3239 .insns_flags = PPC_INSNS_603,
3240 .flags = PPC_FLAGS_603,
3241 .msr_mask = 0x000000000007FF73,
3244 .name = "Goldeneye",
3245 .pvr = CPU_PPC_603R,
3246 .pvr_mask = 0xFFFFFFFF,
3247 .insns_flags = PPC_INSNS_603,
3248 .flags = PPC_FLAGS_603,
3249 .msr_mask = 0x000000000007FF73,
3252 /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */
3256 .pvr_mask = 0xFFFF0000,
3257 .insns_flags = PPC_INSNS_G2,
3258 .flags = PPC_FLAGS_G2,
3259 .msr_mask = 0x000000000006FFF2,
3263 .pvr = CPU_PPC_G2H4,
3264 .pvr_mask = 0xFFFF0000,
3265 .insns_flags = PPC_INSNS_G2,
3266 .flags = PPC_FLAGS_G2,
3267 .msr_mask = 0x000000000006FFF2,
3271 .pvr = CPU_PPC_G2gp,
3272 .pvr_mask = 0xFFFF0000,
3273 .insns_flags = PPC_INSNS_G2,
3274 .flags = PPC_FLAGS_G2,
3275 .msr_mask = 0x000000000006FFF2,
3279 .pvr = CPU_PPC_G2ls,
3280 .pvr_mask = 0xFFFF0000,
3281 .insns_flags = PPC_INSNS_G2,
3282 .flags = PPC_FLAGS_G2,
3283 .msr_mask = 0x000000000006FFF2,
3285 { /* Same as G2, with LE mode support */
3287 .pvr = CPU_PPC_G2LE,
3288 .pvr_mask = 0xFFFF0000,
3289 .insns_flags = PPC_INSNS_G2,
3290 .flags = PPC_FLAGS_G2,
3291 .msr_mask = 0x000000000007FFF3,
3295 .pvr = CPU_PPC_G2LEgp,
3296 .pvr_mask = 0xFFFF0000,
3297 .insns_flags = PPC_INSNS_G2,
3298 .flags = PPC_FLAGS_G2,
3299 .msr_mask = 0x000000000007FFF3,
3303 .pvr = CPU_PPC_G2LEls,
3304 .pvr_mask = 0xFFFF0000,
3305 .insns_flags = PPC_INSNS_G2,
3306 .flags = PPC_FLAGS_G2,
3307 .msr_mask = 0x000000000007FFF3,
3314 .pvr_mask = 0xFFFFFFFF,
3315 .insns_flags = PPC_INSNS_604,
3316 .flags = PPC_FLAGS_604,
3317 .msr_mask = 0x000000000005FF77,
3322 .pvr = CPU_PPC_604E,
3323 .pvr_mask = 0xFFFFFFFF,
3324 .insns_flags = PPC_INSNS_604,
3325 .flags = PPC_FLAGS_604,
3326 .msr_mask = 0x000000000005FF77,
3331 .pvr = CPU_PPC_604R,
3332 .pvr_mask = 0xFFFFFFFF,
3333 .insns_flags = PPC_INSNS_604,
3334 .flags = PPC_FLAGS_604,
3335 .msr_mask = 0x000000000005FF77,
3341 .pvr_mask = 0xFFFFFFFF,
3342 .insns_flags = PPC_INSNS_7x0,
3343 .flags = PPC_FLAGS_7x0,
3344 .msr_mask = 0x000000000007FF77,
3350 .pvr_mask = 0xFFFFFFFF,
3351 .insns_flags = PPC_INSNS_7x0,
3352 .flags = PPC_FLAGS_7x0,
3353 .msr_mask = 0x000000000007FF77,
3358 .pvr_mask = 0xFFFFFFFF,
3359 .insns_flags = PPC_INSNS_7x0,
3360 .flags = PPC_FLAGS_7x0,
3361 .msr_mask = 0x000000000007FF77,
3368 .pvr_mask = 0xFFFFF000,
3369 .insns_flags = PPC_INSNS_7x5,
3370 .flags = PPC_FLAGS_7x5,
3371 .msr_mask = 0x000000000007FF77,
3374 .name = "Goldfinger",
3376 .pvr_mask = 0xFFFFF000,
3377 .insns_flags = PPC_INSNS_7x5,
3378 .flags = PPC_FLAGS_7x5,
3379 .msr_mask = 0x000000000007FF77,
3386 .pvr_mask = 0xFFFFFFFF,
3387 .insns_flags = PPC_INSNS_7x0,
3388 .flags = PPC_FLAGS_7x0,
3389 .msr_mask = 0x000000000007FF77,
3396 .pvr_mask = 0xFFFFF000,
3397 .insns_flags = PPC_INSNS_7x5,
3398 .flags = PPC_FLAGS_7x5,
3399 .msr_mask = 0x000000000007FF77,
3405 .pvr = CPU_PPC_74xP,
3406 .pvr_mask = 0xFFFFFFFF,
3407 .insns_flags = PPC_INSNS_7x0,
3408 .flags = PPC_FLAGS_7x0,
3409 .msr_mask = 0x000000000007FF77,
3412 .name = "Conan/Doyle",
3413 .pvr = CPU_PPC_74xP,
3414 .pvr_mask = 0xFFFFFFFF,
3415 .insns_flags = PPC_INSNS_7x0,
3416 .flags = PPC_FLAGS_7x0,
3417 .msr_mask = 0x000000000007FF77,
3423 .pvr = CPU_PPC_74xP,
3424 .pvr_mask = 0xFFFFF000,
3425 .insns_flags = PPC_INSNS_7x5,
3426 .flags = PPC_FLAGS_7x5,
3427 .msr_mask = 0x000000000007FF77,
3433 .pvr = CPU_PPC_74xP,
3434 .pvr_mask = 0xFFFFFFFF,
3435 .insns_flags = PPC_INSNS_7x0,
3436 .flags = PPC_FLAGS_7x0,
3437 .msr_mask = 0x000000000007FF77,
3443 .pvr = CPU_PPC_74xP,
3444 .pvr_mask = 0xFFFFF000,
3445 .insns_flags = PPC_INSNS_7x5,
3446 .flags = PPC_FLAGS_7x5,
3447 .msr_mask = 0x000000000007FF77,
3450 /* IBM 750CXe (G3 embedded) */
3453 .pvr = CPU_PPC_750CXE,
3454 .pvr_mask = 0xFFFFFFFF,
3455 .insns_flags = PPC_INSNS_7x0,
3456 .flags = PPC_FLAGS_7x0,
3457 .msr_mask = 0x000000000007FF77,
3459 /* IBM 750FX (G3 embedded) */
3462 .pvr = CPU_PPC_750FX,
3463 .pvr_mask = 0xFFFFFFFF,
3464 .insns_flags = PPC_INSNS_7x0,
3465 .flags = PPC_FLAGS_7x0,
3466 .msr_mask = 0x000000000007FF77,
3468 /* IBM 750GX (G3 embedded) */
3471 .pvr = CPU_PPC_750GX,
3472 .pvr_mask = 0xFFFFFFFF,
3473 .insns_flags = PPC_INSNS_7x0,
3474 .flags = PPC_FLAGS_7x0,
3475 .msr_mask = 0x000000000007FF77,
3481 .pvr = CPU_PPC_7400,
3482 .pvr_mask = 0xFFFF0000,
3483 .insns_flags = PPC_INSNS_74xx,
3484 .flags = PPC_FLAGS_74xx,
3485 .msr_mask = 0x000000000205FF77,
3489 /* PowerPC 7400 (G4) */
3492 .pvr = CPU_PPC_7400,
3493 .pvr_mask = 0xFFFF0000,
3494 .insns_flags = PPC_INSNS_74xx,
3495 .flags = PPC_FLAGS_74xx,
3496 .msr_mask = 0x000000000205FF77,
3500 .pvr = CPU_PPC_7400,
3501 .pvr_mask = 0xFFFF0000,
3502 .insns_flags = PPC_INSNS_74xx,
3503 .flags = PPC_FLAGS_74xx,
3504 .msr_mask = 0x000000000205FF77,
3508 /* PowerPC 7410 (G4) */
3511 .pvr = CPU_PPC_7410,
3512 .pvr_mask = 0xFFFF0000,
3513 .insns_flags = PPC_INSNS_74xx,
3514 .flags = PPC_FLAGS_74xx,
3515 .msr_mask = 0x000000000205FF77,
3519 .pvr = CPU_PPC_7410,
3520 .pvr_mask = 0xFFFF0000,
3521 .insns_flags = PPC_INSNS_74xx,
3522 .flags = PPC_FLAGS_74xx,
3523 .msr_mask = 0x000000000205FF77,
3531 /* PowerPC 7450 (G4) */
3534 .pvr = CPU_PPC_7450,
3535 .pvr_mask = 0xFFFF0000,
3536 .insns_flags = PPC_INSNS_74xx,
3537 .flags = PPC_FLAGS_74xx,
3538 .msr_mask = 0x000000000205FF77,
3542 .pvr = CPU_PPC_7450,
3543 .pvr_mask = 0xFFFF0000,
3544 .insns_flags = PPC_INSNS_74xx,
3545 .flags = PPC_FLAGS_74xx,
3546 .msr_mask = 0x000000000205FF77,
3551 /* PowerPC 7455 (G4) */
3554 .pvr = CPU_PPC_7455,
3555 .pvr_mask = 0xFFFF0000,
3556 .insns_flags = PPC_INSNS_74xx,
3557 .flags = PPC_FLAGS_74xx,
3558 .msr_mask = 0x000000000205FF77,
3562 .pvr = CPU_PPC_7455,
3563 .pvr_mask = 0xFFFF0000,
3564 .insns_flags = PPC_INSNS_74xx,
3565 .flags = PPC_FLAGS_74xx,
3566 .msr_mask = 0x000000000205FF77,
3570 /* PowerPC 7457 (G4) */
3573 .pvr = CPU_PPC_7457,
3574 .pvr_mask = 0xFFFF0000,
3575 .insns_flags = PPC_INSNS_74xx,
3576 .flags = PPC_FLAGS_74xx,
3577 .msr_mask = 0x000000000205FF77,
3581 .pvr = CPU_PPC_7457,
3582 .pvr_mask = 0xFFFF0000,
3583 .insns_flags = PPC_INSNS_74xx,
3584 .flags = PPC_FLAGS_74xx,
3585 .msr_mask = 0x000000000205FF77,
3589 /* PowerPC 7457A (G4) */
3592 .pvr = CPU_PPC_7457A,
3593 .pvr_mask = 0xFFFF0000,
3594 .insns_flags = PPC_INSNS_74xx,
3595 .flags = PPC_FLAGS_74xx,
3596 .msr_mask = 0x000000000205FF77,
3599 .name = "Apollo 7 PM",
3600 .pvr = CPU_PPC_7457A,
3601 .pvr_mask = 0xFFFF0000,
3602 .insns_flags = PPC_INSNS_74xx,
3603 .flags = PPC_FLAGS_74xx,
3604 .msr_mask = 0x000000000205FF77,
3607 /* 64 bits PowerPC */
3608 #if defined (TARGET_PPC64)
3614 .pvr_mask = 0xFFFF0000,
3615 .insns_flags = PPC_INSNS_620,
3616 .flags = PPC_FLAGS_620,
3617 .msr_mask = 0x800000000005FF73,
3621 /* PowerPC 630 (POWER3) */
3625 .pvr_mask = 0xFFFF0000,
3626 .insns_flags = PPC_INSNS_630,
3627 .flags = PPC_FLAGS_630,
3633 .pvr_mask = 0xFFFF0000,
3634 .insns_flags = PPC_INSNS_630,
3635 .flags = PPC_FLAGS_630,
3640 /* PowerPC 631 (Power 3+)*/
3644 .pvr_mask = 0xFFFF0000,
3645 .insns_flags = PPC_INSNS_631,
3646 .flags = PPC_FLAGS_631,
3652 .pvr_mask = 0xFFFF0000,
3653 .insns_flags = PPC_INSNS_631,
3654 .flags = PPC_FLAGS_631,
3662 .pvr = CPU_PPC_POWER4,
3663 .pvr_mask = 0xFFFF0000,
3664 .insns_flags = PPC_INSNS_POWER4,
3665 .flags = PPC_FLAGS_POWER4,
3673 .pvr = CPU_PPC_POWER4P,
3674 .pvr_mask = 0xFFFF0000,
3675 .insns_flags = PPC_INSNS_POWER4,
3676 .flags = PPC_FLAGS_POWER4,
3684 .pvr = CPU_PPC_POWER5,
3685 .pvr_mask = 0xFFFF0000,
3686 .insns_flags = PPC_INSNS_POWER5,
3687 .flags = PPC_FLAGS_POWER5,
3695 .pvr = CPU_PPC_POWER5P,
3696 .pvr_mask = 0xFFFF0000,
3697 .insns_flags = PPC_INSNS_POWER5,
3698 .flags = PPC_FLAGS_POWER5,
3702 #if defined (TODO) || 1
3707 .pvr_mask = 0xFFFF0000,
3708 .insns_flags = PPC_INSNS_970,
3709 .flags = PPC_FLAGS_970,
3710 .msr_mask = 0x900000000204FF36,
3714 /* PowerPC 970FX (G5) */
3717 .pvr = CPU_PPC_970FX,
3718 .pvr_mask = 0xFFFF0000,
3719 .insns_flags = PPC_INSNS_970FX,
3720 .flags = PPC_FLAGS_970FX,
3721 .msr_mask = 0x800000000204FF36,
3725 /* RS64 (Apache/A35) */
3726 /* This one seems to support the whole POWER2 instruction set
3727 * and the PowerPC 64 one.
3731 .pvr = CPU_PPC_RS64,
3732 .pvr_mask = 0xFFFF0000,
3733 .insns_flags = PPC_INSNS_RS64,
3734 .flags = PPC_FLAGS_RS64,
3739 .pvr = CPU_PPC_RS64,
3740 .pvr_mask = 0xFFFF0000,
3741 .insns_flags = PPC_INSNS_RS64,
3742 .flags = PPC_FLAGS_RS64,
3747 .pvr = CPU_PPC_RS64,
3748 .pvr_mask = 0xFFFF0000,
3749 .insns_flags = PPC_INSNS_RS64,
3750 .flags = PPC_FLAGS_RS64,
3755 /* RS64-II (NorthStar/A50) */
3758 .pvr = CPU_PPC_RS64II,
3759 .pvr_mask = 0xFFFF0000,
3760 .insns_flags = PPC_INSNS_RS64,
3761 .flags = PPC_FLAGS_RS64,
3766 .pvr = CPU_PPC_RS64II,
3767 .pvr_mask = 0xFFFF0000,
3768 .insns_flags = PPC_INSNS_RS64,
3769 .flags = PPC_FLAGS_RS64,
3774 .pvr = CPU_PPC_RS64II,
3775 .pvr_mask = 0xFFFF0000,
3776 .insns_flags = PPC_INSNS_RS64,
3777 .flags = PPC_FLAGS_RS64,
3782 /* RS64-III (Pulsar) */
3785 .pvr = CPU_PPC_RS64III,
3786 .pvr_mask = 0xFFFF0000,
3787 .insns_flags = PPC_INSNS_RS64,
3788 .flags = PPC_FLAGS_RS64,
3793 .pvr = CPU_PPC_RS64III,
3794 .pvr_mask = 0xFFFF0000,
3795 .insns_flags = PPC_INSNS_RS64,
3796 .flags = PPC_FLAGS_RS64,
3801 /* RS64-IV (IceStar/IStar/SStar) */
3804 .pvr = CPU_PPC_RS64IV,
3805 .pvr_mask = 0xFFFF0000,
3806 .insns_flags = PPC_INSNS_RS64,
3807 .flags = PPC_FLAGS_RS64,
3812 .pvr = CPU_PPC_RS64IV,
3813 .pvr_mask = 0xFFFF0000,
3814 .insns_flags = PPC_INSNS_RS64,
3815 .flags = PPC_FLAGS_RS64,
3820 .pvr = CPU_PPC_RS64IV,
3821 .pvr_mask = 0xFFFF0000,
3822 .insns_flags = PPC_INSNS_RS64,
3823 .flags = PPC_FLAGS_RS64,
3828 .pvr = CPU_PPC_RS64IV,
3829 .pvr_mask = 0xFFFF0000,
3830 .insns_flags = PPC_INSNS_RS64,
3831 .flags = PPC_FLAGS_RS64,
3837 /* Original POWER */
3841 .pvr_mask = 0xFFFF0000,
3842 .insns_flags = PPC_INSNS_POWER,
3843 .flags = PPC_FLAGS_POWER,
3847 #endif /* defined (TARGET_PPC64) */
3853 .pvr_mask = 0xFFFF0000,
3854 .insns_flags = PPC_INSNS_POWER,
3855 .flags = PPC_FLAGS_POWER,
3859 /* Generic PowerPCs */
3860 #if defined (TODO) || 1
3864 .pvr_mask = 0xFFFF0000,
3865 .insns_flags = PPC_INSNS_PPC64,
3866 .flags = PPC_FLAGS_PPC64,
3867 .msr_mask = 0xA00000000204FF36,
3873 .pvr_mask = 0xFFFFFFFF,
3874 .insns_flags = PPC_INSNS_PPC32,
3875 .flags = PPC_FLAGS_PPC32,
3876 .msr_mask = 0x000000000005FF77,
3882 .pvr_mask = 0xFFFFFFFF,
3883 .insns_flags = PPC_INSNS_PPC32,
3884 .flags = PPC_FLAGS_PPC32,
3885 .msr_mask = 0x000000000005FF77,
3889 int ppc_find_by_name (const unsigned char *name, ppc_def_t **def)
3895 for (i = 0; strcmp(ppc_defs[i].name, "ppc") != 0; i++) {
3896 if (strcasecmp(name, ppc_defs[i].name) == 0) {
3897 *def = &ppc_defs[i];
3906 int ppc_find_by_pvr (uint32_t pvr, ppc_def_t **def)
3912 for (i = 0; ppc_defs[i].name != NULL; i++) {
3913 if ((pvr & ppc_defs[i].pvr_mask) ==
3914 (ppc_defs[i].pvr & ppc_defs[i].pvr_mask)) {
3915 *def = &ppc_defs[i];
3924 void ppc_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
3928 for (i = 0; ; i++) {
3929 (*cpu_fprintf)(f, "PowerPC %16s PVR %08x mask %08x\n",
3931 ppc_defs[i].pvr, ppc_defs[i].pvr_mask);
3932 if (strcmp(ppc_defs[i].name, "ppc") == 0)