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 #ifdef PPC_DUMP_SPR_ACCESSES
57 static void spr_read_generic (void *opaque
, int sprn
)
59 gen_op_load_dump_spr(sprn
);
62 static void spr_write_generic (void *opaque
, int sprn
)
64 gen_op_store_dump_spr(sprn
);
67 static void spr_read_generic (void *opaque
, int sprn
)
69 gen_op_load_spr(sprn
);
72 static void spr_write_generic (void *opaque
, int sprn
)
74 gen_op_store_spr(sprn
);
78 #if !defined(CONFIG_USER_ONLY)
79 static void spr_write_clear (void *opaque
, int sprn
)
81 gen_op_mask_spr(sprn
);
85 /* SPR common to all PowerPC */
87 static void spr_read_xer (void *opaque
, int sprn
)
92 static void spr_write_xer (void *opaque
, int sprn
)
98 static void spr_read_lr (void *opaque
, int sprn
)
103 static void spr_write_lr (void *opaque
, int sprn
)
109 static void spr_read_ctr (void *opaque
, int sprn
)
114 static void spr_write_ctr (void *opaque
, int sprn
)
119 /* User read access to SPR */
125 static void spr_read_ureg (void *opaque
, int sprn
)
127 gen_op_load_spr(sprn
+ 0x10);
130 /* SPR common to all non-embedded PowerPC */
132 #if !defined(CONFIG_USER_ONLY)
133 static void spr_read_decr (void *opaque
, int sprn
)
138 static void spr_write_decr (void *opaque
, int sprn
)
144 /* SPR common to all non-embedded PowerPC, except 601 */
146 static void spr_read_tbl (void *opaque
, int sprn
)
151 static void spr_read_tbu (void *opaque
, int sprn
)
156 #if !defined(CONFIG_USER_ONLY)
157 static void spr_write_tbl (void *opaque
, int sprn
)
162 static void spr_write_tbu (void *opaque
, int sprn
)
168 #if !defined(CONFIG_USER_ONLY)
169 /* IBAT0U...IBAT0U */
170 /* IBAT0L...IBAT7L */
171 static void spr_read_ibat (void *opaque
, int sprn
)
173 gen_op_load_ibat(sprn
& 1, (sprn
- SPR_IBAT0U
) / 2);
176 static void spr_read_ibat_h (void *opaque
, int sprn
)
178 gen_op_load_ibat(sprn
& 1, (sprn
- SPR_IBAT4U
) / 2);
181 static void spr_write_ibatu (void *opaque
, int sprn
)
183 DisasContext
*ctx
= opaque
;
185 gen_op_store_ibatu((sprn
- SPR_IBAT0U
) / 2);
189 static void spr_write_ibatu_h (void *opaque
, int sprn
)
191 DisasContext
*ctx
= opaque
;
193 gen_op_store_ibatu((sprn
- SPR_IBAT4U
) / 2);
197 static void spr_write_ibatl (void *opaque
, int sprn
)
199 DisasContext
*ctx
= opaque
;
201 gen_op_store_ibatl((sprn
- SPR_IBAT0L
) / 2);
205 static void spr_write_ibatl_h (void *opaque
, int sprn
)
207 DisasContext
*ctx
= opaque
;
209 gen_op_store_ibatl((sprn
- SPR_IBAT4L
) / 2);
213 /* DBAT0U...DBAT7U */
214 /* DBAT0L...DBAT7L */
215 static void spr_read_dbat (void *opaque
, int sprn
)
217 gen_op_load_dbat(sprn
& 1, (sprn
- SPR_DBAT0U
) / 2);
220 static void spr_read_dbat_h (void *opaque
, int sprn
)
222 gen_op_load_dbat(sprn
& 1, (sprn
- SPR_DBAT4U
) / 2);
225 static void spr_write_dbatu (void *opaque
, int sprn
)
227 DisasContext
*ctx
= opaque
;
229 gen_op_store_dbatu((sprn
- SPR_DBAT0U
) / 2);
233 static void spr_write_dbatu_h (void *opaque
, int sprn
)
235 DisasContext
*ctx
= opaque
;
237 gen_op_store_dbatu((sprn
- SPR_DBAT4U
) / 2);
241 static void spr_write_dbatl (void *opaque
, int sprn
)
243 DisasContext
*ctx
= opaque
;
245 gen_op_store_dbatl((sprn
- SPR_DBAT0L
) / 2);
249 static void spr_write_dbatl_h (void *opaque
, int sprn
)
251 DisasContext
*ctx
= opaque
;
253 gen_op_store_dbatl((sprn
- SPR_DBAT4L
) / 2);
258 static void spr_read_sdr1 (void *opaque
, int sprn
)
263 static void spr_write_sdr1 (void *opaque
, int sprn
)
265 DisasContext
*ctx
= opaque
;
271 /* 64 bits PowerPC specific SPRs */
273 #if defined(TARGET_PPC64)
274 static void spr_read_asr (void *opaque
, int sprn
)
279 static void spr_write_asr (void *opaque
, int sprn
)
281 DisasContext
*ctx
= opaque
;
287 #endif /* !defined(CONFIG_USER_ONLY) */
289 /* PowerPC 601 specific registers */
291 static void spr_read_601_rtcl (void *opaque
, int sprn
)
293 gen_op_load_601_rtcl();
296 static void spr_read_601_rtcu (void *opaque
, int sprn
)
298 gen_op_load_601_rtcu();
301 #if !defined(CONFIG_USER_ONLY)
302 static void spr_write_601_rtcu (void *opaque
, int sprn
)
304 gen_op_store_601_rtcu();
307 static void spr_write_601_rtcl (void *opaque
, int sprn
)
309 gen_op_store_601_rtcl();
314 #if !defined(CONFIG_USER_ONLY)
315 static void spr_read_601_ubat (void *opaque
, int sprn
)
317 gen_op_load_601_bat(sprn
& 1, (sprn
- SPR_IBAT0U
) / 2);
320 static void spr_write_601_ubatu (void *opaque
, int sprn
)
322 DisasContext
*ctx
= opaque
;
324 gen_op_store_601_batu((sprn
- SPR_IBAT0U
) / 2);
328 static void spr_write_601_ubatl (void *opaque
, int sprn
)
330 DisasContext
*ctx
= opaque
;
332 gen_op_store_601_batl((sprn
- SPR_IBAT0L
) / 2);
337 /* PowerPC 40x specific registers */
338 #if !defined(CONFIG_USER_ONLY)
339 static void spr_read_40x_pit (void *opaque
, int sprn
)
341 gen_op_load_40x_pit();
344 static void spr_write_40x_pit (void *opaque
, int sprn
)
346 gen_op_store_40x_pit();
349 static void spr_write_40x_dbcr0 (void *opaque
, int sprn
)
351 DisasContext
*ctx
= opaque
;
353 gen_op_store_40x_dbcr0();
354 /* We must stop translation as we may have rebooted */
358 static void spr_write_booke_tcr (void *opaque
, int sprn
)
360 gen_op_store_booke_tcr();
363 static void spr_write_booke_tsr (void *opaque
, int sprn
)
365 gen_op_store_booke_tsr();
369 /* PowerPC 403 specific registers */
370 /* PBL1 / PBU1 / PBL2 / PBU2 */
371 #if !defined(CONFIG_USER_ONLY)
372 static void spr_read_403_pbr (void *opaque
, int sprn
)
374 gen_op_load_403_pb(sprn
- SPR_403_PBL1
);
377 static void spr_write_403_pbr (void *opaque
, int sprn
)
379 DisasContext
*ctx
= opaque
;
381 gen_op_store_403_pb(sprn
- SPR_403_PBL1
);
385 static void spr_write_pir (void *opaque
, int sprn
)
391 #if defined(CONFIG_USER_ONLY)
392 #define spr_register(env, num, name, uea_read, uea_write, \
393 oea_read, oea_write, initial_value) \
395 _spr_register(env, num, name, uea_read, uea_write, initial_value); \
397 static inline void _spr_register (CPUPPCState
*env
, int num
,
398 const unsigned char *name
,
399 void (*uea_read
)(void *opaque
, int sprn
),
400 void (*uea_write
)(void *opaque
, int sprn
),
401 target_ulong initial_value
)
403 static inline void spr_register (CPUPPCState
*env
, int num
,
404 const unsigned char *name
,
405 void (*uea_read
)(void *opaque
, int sprn
),
406 void (*uea_write
)(void *opaque
, int sprn
),
407 void (*oea_read
)(void *opaque
, int sprn
),
408 void (*oea_write
)(void *opaque
, int sprn
),
409 target_ulong initial_value
)
414 spr
= &env
->spr_cb
[num
];
415 if (spr
->name
!= NULL
||env
-> spr
[num
] != 0x00000000 ||
416 #if !defined(CONFIG_USER_ONLY)
417 spr
->oea_read
!= NULL
|| spr
->oea_write
!= NULL
||
419 spr
->uea_read
!= NULL
|| spr
->uea_write
!= NULL
) {
420 printf("Error: Trying to register SPR %d (%03x) twice !\n", num
, num
);
423 #if defined(PPC_DEBUG_SPR)
424 printf("*** register spr %d (%03x) %s val " ADDRX
"\n", num
, num
, name
,
428 spr
->uea_read
= uea_read
;
429 spr
->uea_write
= uea_write
;
430 #if !defined(CONFIG_USER_ONLY)
431 spr
->oea_read
= oea_read
;
432 spr
->oea_write
= oea_write
;
434 env
->spr
[num
] = initial_value
;
437 /* Generic PowerPC SPRs */
438 static void gen_spr_generic (CPUPPCState
*env
)
440 /* Integer processing */
441 spr_register(env
, SPR_XER
, "XER",
442 &spr_read_xer
, &spr_write_xer
,
443 &spr_read_xer
, &spr_write_xer
,
446 spr_register(env
, SPR_LR
, "LR",
447 &spr_read_lr
, &spr_write_lr
,
448 &spr_read_lr
, &spr_write_lr
,
450 spr_register(env
, SPR_CTR
, "CTR",
451 &spr_read_ctr
, &spr_write_ctr
,
452 &spr_read_ctr
, &spr_write_ctr
,
454 /* Interrupt processing */
455 spr_register(env
, SPR_SRR0
, "SRR0",
456 SPR_NOACCESS
, SPR_NOACCESS
,
457 &spr_read_generic
, &spr_write_generic
,
459 spr_register(env
, SPR_SRR1
, "SRR1",
460 SPR_NOACCESS
, SPR_NOACCESS
,
461 &spr_read_generic
, &spr_write_generic
,
463 /* Processor control */
464 spr_register(env
, SPR_SPRG0
, "SPRG0",
465 SPR_NOACCESS
, SPR_NOACCESS
,
466 &spr_read_generic
, &spr_write_generic
,
468 spr_register(env
, SPR_SPRG1
, "SPRG1",
469 SPR_NOACCESS
, SPR_NOACCESS
,
470 &spr_read_generic
, &spr_write_generic
,
472 spr_register(env
, SPR_SPRG2
, "SPRG2",
473 SPR_NOACCESS
, SPR_NOACCESS
,
474 &spr_read_generic
, &spr_write_generic
,
476 spr_register(env
, SPR_SPRG3
, "SPRG3",
477 SPR_NOACCESS
, SPR_NOACCESS
,
478 &spr_read_generic
, &spr_write_generic
,
482 /* SPR common to all non-embedded PowerPC, including 601 */
483 static void gen_spr_ne_601 (CPUPPCState
*env
)
485 /* Exception processing */
486 spr_register(env
, SPR_DSISR
, "DSISR",
487 SPR_NOACCESS
, SPR_NOACCESS
,
488 &spr_read_generic
, &spr_write_generic
,
490 spr_register(env
, SPR_DAR
, "DAR",
491 SPR_NOACCESS
, SPR_NOACCESS
,
492 &spr_read_generic
, &spr_write_generic
,
495 spr_register(env
, SPR_DECR
, "DECR",
496 SPR_NOACCESS
, SPR_NOACCESS
,
497 &spr_read_decr
, &spr_write_decr
,
499 /* Memory management */
500 spr_register(env
, SPR_SDR1
, "SDR1",
501 SPR_NOACCESS
, SPR_NOACCESS
,
502 &spr_read_sdr1
, &spr_write_sdr1
,
507 static void gen_low_BATs (CPUPPCState
*env
)
509 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
510 SPR_NOACCESS
, SPR_NOACCESS
,
511 &spr_read_ibat
, &spr_write_ibatu
,
513 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
514 SPR_NOACCESS
, SPR_NOACCESS
,
515 &spr_read_ibat
, &spr_write_ibatl
,
517 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
518 SPR_NOACCESS
, SPR_NOACCESS
,
519 &spr_read_ibat
, &spr_write_ibatu
,
521 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
522 SPR_NOACCESS
, SPR_NOACCESS
,
523 &spr_read_ibat
, &spr_write_ibatl
,
525 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
526 SPR_NOACCESS
, SPR_NOACCESS
,
527 &spr_read_ibat
, &spr_write_ibatu
,
529 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
530 SPR_NOACCESS
, SPR_NOACCESS
,
531 &spr_read_ibat
, &spr_write_ibatl
,
533 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
534 SPR_NOACCESS
, SPR_NOACCESS
,
535 &spr_read_ibat
, &spr_write_ibatu
,
537 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
538 SPR_NOACCESS
, SPR_NOACCESS
,
539 &spr_read_ibat
, &spr_write_ibatl
,
541 spr_register(env
, SPR_DBAT0U
, "DBAT0U",
542 SPR_NOACCESS
, SPR_NOACCESS
,
543 &spr_read_dbat
, &spr_write_dbatu
,
545 spr_register(env
, SPR_DBAT0L
, "DBAT0L",
546 SPR_NOACCESS
, SPR_NOACCESS
,
547 &spr_read_dbat
, &spr_write_dbatl
,
549 spr_register(env
, SPR_DBAT1U
, "DBAT1U",
550 SPR_NOACCESS
, SPR_NOACCESS
,
551 &spr_read_dbat
, &spr_write_dbatu
,
553 spr_register(env
, SPR_DBAT1L
, "DBAT1L",
554 SPR_NOACCESS
, SPR_NOACCESS
,
555 &spr_read_dbat
, &spr_write_dbatl
,
557 spr_register(env
, SPR_DBAT2U
, "DBAT2U",
558 SPR_NOACCESS
, SPR_NOACCESS
,
559 &spr_read_dbat
, &spr_write_dbatu
,
561 spr_register(env
, SPR_DBAT2L
, "DBAT2L",
562 SPR_NOACCESS
, SPR_NOACCESS
,
563 &spr_read_dbat
, &spr_write_dbatl
,
565 spr_register(env
, SPR_DBAT3U
, "DBAT3U",
566 SPR_NOACCESS
, SPR_NOACCESS
,
567 &spr_read_dbat
, &spr_write_dbatu
,
569 spr_register(env
, SPR_DBAT3L
, "DBAT3L",
570 SPR_NOACCESS
, SPR_NOACCESS
,
571 &spr_read_dbat
, &spr_write_dbatl
,
577 static void gen_high_BATs (CPUPPCState
*env
)
579 spr_register(env
, SPR_IBAT4U
, "IBAT4U",
580 SPR_NOACCESS
, SPR_NOACCESS
,
581 &spr_read_ibat_h
, &spr_write_ibatu_h
,
583 spr_register(env
, SPR_IBAT4L
, "IBAT4L",
584 SPR_NOACCESS
, SPR_NOACCESS
,
585 &spr_read_ibat_h
, &spr_write_ibatl_h
,
587 spr_register(env
, SPR_IBAT5U
, "IBAT5U",
588 SPR_NOACCESS
, SPR_NOACCESS
,
589 &spr_read_ibat_h
, &spr_write_ibatu_h
,
591 spr_register(env
, SPR_IBAT5L
, "IBAT5L",
592 SPR_NOACCESS
, SPR_NOACCESS
,
593 &spr_read_ibat_h
, &spr_write_ibatl_h
,
595 spr_register(env
, SPR_IBAT6U
, "IBAT6U",
596 SPR_NOACCESS
, SPR_NOACCESS
,
597 &spr_read_ibat_h
, &spr_write_ibatu_h
,
599 spr_register(env
, SPR_IBAT6L
, "IBAT6L",
600 SPR_NOACCESS
, SPR_NOACCESS
,
601 &spr_read_ibat_h
, &spr_write_ibatl_h
,
603 spr_register(env
, SPR_IBAT7U
, "IBAT7U",
604 SPR_NOACCESS
, SPR_NOACCESS
,
605 &spr_read_ibat_h
, &spr_write_ibatu_h
,
607 spr_register(env
, SPR_IBAT7L
, "IBAT7L",
608 SPR_NOACCESS
, SPR_NOACCESS
,
609 &spr_read_ibat_h
, &spr_write_ibatl_h
,
611 spr_register(env
, SPR_DBAT4U
, "DBAT4U",
612 SPR_NOACCESS
, SPR_NOACCESS
,
613 &spr_read_dbat_h
, &spr_write_dbatu_h
,
615 spr_register(env
, SPR_DBAT4L
, "DBAT4L",
616 SPR_NOACCESS
, SPR_NOACCESS
,
617 &spr_read_dbat_h
, &spr_write_dbatl_h
,
619 spr_register(env
, SPR_DBAT5U
, "DBAT5U",
620 SPR_NOACCESS
, SPR_NOACCESS
,
621 &spr_read_dbat_h
, &spr_write_dbatu_h
,
623 spr_register(env
, SPR_DBAT5L
, "DBAT5L",
624 SPR_NOACCESS
, SPR_NOACCESS
,
625 &spr_read_dbat_h
, &spr_write_dbatl_h
,
627 spr_register(env
, SPR_DBAT6U
, "DBAT6U",
628 SPR_NOACCESS
, SPR_NOACCESS
,
629 &spr_read_dbat_h
, &spr_write_dbatu_h
,
631 spr_register(env
, SPR_DBAT6L
, "DBAT6L",
632 SPR_NOACCESS
, SPR_NOACCESS
,
633 &spr_read_dbat_h
, &spr_write_dbatl_h
,
635 spr_register(env
, SPR_DBAT7U
, "DBAT7U",
636 SPR_NOACCESS
, SPR_NOACCESS
,
637 &spr_read_dbat_h
, &spr_write_dbatu_h
,
639 spr_register(env
, SPR_DBAT7L
, "DBAT7L",
640 SPR_NOACCESS
, SPR_NOACCESS
,
641 &spr_read_dbat_h
, &spr_write_dbatl_h
,
646 /* Generic PowerPC time base */
647 static void gen_tbl (CPUPPCState
*env
)
649 spr_register(env
, SPR_VTBL
, "TBL",
650 &spr_read_tbl
, SPR_NOACCESS
,
651 &spr_read_tbl
, SPR_NOACCESS
,
653 spr_register(env
, SPR_TBL
, "TBL",
654 SPR_NOACCESS
, SPR_NOACCESS
,
655 SPR_NOACCESS
, &spr_write_tbl
,
657 spr_register(env
, SPR_VTBU
, "TBU",
658 &spr_read_tbu
, SPR_NOACCESS
,
659 &spr_read_tbu
, SPR_NOACCESS
,
661 spr_register(env
, SPR_TBU
, "TBU",
662 SPR_NOACCESS
, SPR_NOACCESS
,
663 SPR_NOACCESS
, &spr_write_tbu
,
667 /* Softare table search registers */
668 static void gen_6xx_7xx_soft_tlb (CPUPPCState
*env
, int nb_tlbs
, int nb_ways
)
670 env
->nb_tlb
= nb_tlbs
;
671 env
->nb_ways
= nb_ways
;
673 spr_register(env
, SPR_DMISS
, "DMISS",
674 SPR_NOACCESS
, SPR_NOACCESS
,
675 &spr_read_generic
, SPR_NOACCESS
,
677 spr_register(env
, SPR_DCMP
, "DCMP",
678 SPR_NOACCESS
, SPR_NOACCESS
,
679 &spr_read_generic
, SPR_NOACCESS
,
681 spr_register(env
, SPR_HASH1
, "HASH1",
682 SPR_NOACCESS
, SPR_NOACCESS
,
683 &spr_read_generic
, SPR_NOACCESS
,
685 spr_register(env
, SPR_HASH2
, "HASH2",
686 SPR_NOACCESS
, SPR_NOACCESS
,
687 &spr_read_generic
, SPR_NOACCESS
,
689 spr_register(env
, SPR_IMISS
, "IMISS",
690 SPR_NOACCESS
, SPR_NOACCESS
,
691 &spr_read_generic
, SPR_NOACCESS
,
693 spr_register(env
, SPR_ICMP
, "ICMP",
694 SPR_NOACCESS
, SPR_NOACCESS
,
695 &spr_read_generic
, SPR_NOACCESS
,
697 spr_register(env
, SPR_RPA
, "RPA",
698 SPR_NOACCESS
, SPR_NOACCESS
,
699 &spr_read_generic
, &spr_write_generic
,
703 /* SPR common to MPC755 and G2 */
704 static void gen_spr_G2_755 (CPUPPCState
*env
)
707 spr_register(env
, SPR_SPRG4
, "SPRG4",
708 SPR_NOACCESS
, SPR_NOACCESS
,
709 &spr_read_generic
, &spr_write_generic
,
711 spr_register(env
, SPR_SPRG5
, "SPRG5",
712 SPR_NOACCESS
, SPR_NOACCESS
,
713 &spr_read_generic
, &spr_write_generic
,
715 spr_register(env
, SPR_SPRG6
, "SPRG6",
716 SPR_NOACCESS
, SPR_NOACCESS
,
717 &spr_read_generic
, &spr_write_generic
,
719 spr_register(env
, SPR_SPRG7
, "SPRG7",
720 SPR_NOACCESS
, SPR_NOACCESS
,
721 &spr_read_generic
, &spr_write_generic
,
723 /* External access control */
724 /* XXX : not implemented */
725 spr_register(env
, SPR_EAR
, "EAR",
726 SPR_NOACCESS
, SPR_NOACCESS
,
727 &spr_read_generic
, &spr_write_generic
,
731 /* SPR common to all 7xx PowerPC implementations */
732 static void gen_spr_7xx (CPUPPCState
*env
)
735 /* XXX : not implemented */
736 spr_register(env
, SPR_DABR
, "DABR",
737 SPR_NOACCESS
, SPR_NOACCESS
,
738 &spr_read_generic
, &spr_write_generic
,
740 /* XXX : not implemented */
741 spr_register(env
, SPR_IABR
, "IABR",
742 SPR_NOACCESS
, SPR_NOACCESS
,
743 &spr_read_generic
, &spr_write_generic
,
745 /* Cache management */
746 /* XXX : not implemented */
747 spr_register(env
, SPR_ICTC
, "ICTC",
748 SPR_NOACCESS
, SPR_NOACCESS
,
749 &spr_read_generic
, &spr_write_generic
,
751 /* XXX : not implemented */
752 spr_register(env
, SPR_L2CR
, "L2CR",
753 SPR_NOACCESS
, SPR_NOACCESS
,
754 &spr_read_generic
, &spr_write_generic
,
756 /* Performance monitors */
757 /* XXX : not implemented */
758 spr_register(env
, SPR_MMCR0
, "MMCR0",
759 SPR_NOACCESS
, SPR_NOACCESS
,
760 &spr_read_generic
, &spr_write_generic
,
762 /* XXX : not implemented */
763 spr_register(env
, SPR_MMCR1
, "MMCR1",
764 SPR_NOACCESS
, SPR_NOACCESS
,
765 &spr_read_generic
, &spr_write_generic
,
767 /* XXX : not implemented */
768 spr_register(env
, SPR_PMC1
, "PMC1",
769 SPR_NOACCESS
, SPR_NOACCESS
,
770 &spr_read_generic
, &spr_write_generic
,
772 /* XXX : not implemented */
773 spr_register(env
, SPR_PMC2
, "PMC2",
774 SPR_NOACCESS
, SPR_NOACCESS
,
775 &spr_read_generic
, &spr_write_generic
,
777 /* XXX : not implemented */
778 spr_register(env
, SPR_PMC3
, "PMC3",
779 SPR_NOACCESS
, SPR_NOACCESS
,
780 &spr_read_generic
, &spr_write_generic
,
782 /* XXX : not implemented */
783 spr_register(env
, SPR_PMC4
, "PMC4",
784 SPR_NOACCESS
, SPR_NOACCESS
,
785 &spr_read_generic
, &spr_write_generic
,
787 /* XXX : not implemented */
788 spr_register(env
, SPR_SIA
, "SIA",
789 SPR_NOACCESS
, SPR_NOACCESS
,
790 &spr_read_generic
, SPR_NOACCESS
,
792 spr_register(env
, SPR_UMMCR0
, "UMMCR0",
793 &spr_read_ureg
, SPR_NOACCESS
,
794 &spr_read_ureg
, SPR_NOACCESS
,
796 spr_register(env
, SPR_UMMCR1
, "UMMCR1",
797 &spr_read_ureg
, SPR_NOACCESS
,
798 &spr_read_ureg
, SPR_NOACCESS
,
800 spr_register(env
, SPR_UPMC1
, "UPMC1",
801 &spr_read_ureg
, SPR_NOACCESS
,
802 &spr_read_ureg
, SPR_NOACCESS
,
804 spr_register(env
, SPR_UPMC2
, "UPMC2",
805 &spr_read_ureg
, SPR_NOACCESS
,
806 &spr_read_ureg
, SPR_NOACCESS
,
808 spr_register(env
, SPR_UPMC3
, "UPMC3",
809 &spr_read_ureg
, SPR_NOACCESS
,
810 &spr_read_ureg
, SPR_NOACCESS
,
812 spr_register(env
, SPR_UPMC4
, "UPMC4",
813 &spr_read_ureg
, SPR_NOACCESS
,
814 &spr_read_ureg
, SPR_NOACCESS
,
816 spr_register(env
, SPR_USIA
, "USIA",
817 &spr_read_ureg
, SPR_NOACCESS
,
818 &spr_read_ureg
, SPR_NOACCESS
,
820 /* Thermal management */
821 /* XXX : not implemented */
822 spr_register(env
, SPR_THRM1
, "THRM1",
823 SPR_NOACCESS
, SPR_NOACCESS
,
824 &spr_read_generic
, &spr_write_generic
,
826 /* XXX : not implemented */
827 spr_register(env
, SPR_THRM2
, "THRM2",
828 SPR_NOACCESS
, SPR_NOACCESS
,
829 &spr_read_generic
, &spr_write_generic
,
831 /* XXX : not implemented */
832 spr_register(env
, SPR_THRM3
, "THRM3",
833 SPR_NOACCESS
, SPR_NOACCESS
,
834 &spr_read_generic
, &spr_write_generic
,
836 /* External access control */
837 /* XXX : not implemented */
838 spr_register(env
, SPR_EAR
, "EAR",
839 SPR_NOACCESS
, SPR_NOACCESS
,
840 &spr_read_generic
, &spr_write_generic
,
844 /* SPR specific to PowerPC 604 implementation */
845 static void gen_spr_604 (CPUPPCState
*env
)
847 /* Processor identification */
848 spr_register(env
, SPR_PIR
, "PIR",
849 SPR_NOACCESS
, SPR_NOACCESS
,
850 &spr_read_generic
, &spr_write_pir
,
853 /* XXX : not implemented */
854 spr_register(env
, SPR_IABR
, "IABR",
855 SPR_NOACCESS
, SPR_NOACCESS
,
856 &spr_read_generic
, &spr_write_generic
,
858 /* XXX : not implemented */
859 spr_register(env
, SPR_DABR
, "DABR",
860 SPR_NOACCESS
, SPR_NOACCESS
,
861 &spr_read_generic
, &spr_write_generic
,
863 /* Performance counters */
864 /* XXX : not implemented */
865 spr_register(env
, SPR_MMCR0
, "MMCR0",
866 SPR_NOACCESS
, SPR_NOACCESS
,
867 &spr_read_generic
, &spr_write_generic
,
869 /* XXX : not implemented */
870 spr_register(env
, SPR_MMCR1
, "MMCR1",
871 SPR_NOACCESS
, SPR_NOACCESS
,
872 &spr_read_generic
, &spr_write_generic
,
874 /* XXX : not implemented */
875 spr_register(env
, SPR_PMC1
, "PMC1",
876 SPR_NOACCESS
, SPR_NOACCESS
,
877 &spr_read_generic
, &spr_write_generic
,
879 /* XXX : not implemented */
880 spr_register(env
, SPR_PMC2
, "PMC2",
881 SPR_NOACCESS
, SPR_NOACCESS
,
882 &spr_read_generic
, &spr_write_generic
,
884 /* XXX : not implemented */
885 spr_register(env
, SPR_PMC3
, "PMC3",
886 SPR_NOACCESS
, SPR_NOACCESS
,
887 &spr_read_generic
, &spr_write_generic
,
889 /* XXX : not implemented */
890 spr_register(env
, SPR_PMC4
, "PMC4",
891 SPR_NOACCESS
, SPR_NOACCESS
,
892 &spr_read_generic
, &spr_write_generic
,
894 /* XXX : not implemented */
895 spr_register(env
, SPR_SIA
, "SIA",
896 SPR_NOACCESS
, SPR_NOACCESS
,
897 &spr_read_generic
, SPR_NOACCESS
,
899 /* XXX : not implemented */
900 spr_register(env
, SPR_SDA
, "SDA",
901 SPR_NOACCESS
, SPR_NOACCESS
,
902 &spr_read_generic
, SPR_NOACCESS
,
904 /* External access control */
905 /* XXX : not implemented */
906 spr_register(env
, SPR_EAR
, "EAR",
907 SPR_NOACCESS
, SPR_NOACCESS
,
908 &spr_read_generic
, &spr_write_generic
,
912 /* SPR specific to PowerPC 603 implementation */
913 static void gen_spr_603 (CPUPPCState
*env
)
915 /* External access control */
916 /* XXX : not implemented */
917 spr_register(env
, SPR_EAR
, "EAR",
918 SPR_NOACCESS
, SPR_NOACCESS
,
919 &spr_read_generic
, &spr_write_generic
,
923 /* SPR specific to PowerPC G2 implementation */
924 static void gen_spr_G2 (CPUPPCState
*env
)
926 /* Memory base address */
928 spr_register(env
, SPR_MBAR
, "MBAR",
929 SPR_NOACCESS
, SPR_NOACCESS
,
930 &spr_read_generic
, &spr_write_generic
,
932 /* System version register */
934 spr_register(env
, SPR_SVR
, "SVR",
935 SPR_NOACCESS
, SPR_NOACCESS
,
936 &spr_read_generic
, SPR_NOACCESS
,
938 /* Exception processing */
939 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
940 SPR_NOACCESS
, SPR_NOACCESS
,
941 &spr_read_generic
, &spr_write_generic
,
943 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
944 SPR_NOACCESS
, SPR_NOACCESS
,
945 &spr_read_generic
, &spr_write_generic
,
948 /* XXX : not implemented */
949 spr_register(env
, SPR_DABR
, "DABR",
950 SPR_NOACCESS
, SPR_NOACCESS
,
951 &spr_read_generic
, &spr_write_generic
,
953 /* XXX : not implemented */
954 spr_register(env
, SPR_DABR2
, "DABR2",
955 SPR_NOACCESS
, SPR_NOACCESS
,
956 &spr_read_generic
, &spr_write_generic
,
958 /* XXX : not implemented */
959 spr_register(env
, SPR_IABR
, "IABR",
960 SPR_NOACCESS
, SPR_NOACCESS
,
961 &spr_read_generic
, &spr_write_generic
,
963 /* XXX : not implemented */
964 spr_register(env
, SPR_IABR2
, "IABR2",
965 SPR_NOACCESS
, SPR_NOACCESS
,
966 &spr_read_generic
, &spr_write_generic
,
968 /* XXX : not implemented */
969 spr_register(env
, SPR_IBCR
, "IBCR",
970 SPR_NOACCESS
, SPR_NOACCESS
,
971 &spr_read_generic
, &spr_write_generic
,
973 /* XXX : not implemented */
974 spr_register(env
, SPR_DBCR
, "DBCR",
975 SPR_NOACCESS
, SPR_NOACCESS
,
976 &spr_read_generic
, &spr_write_generic
,
980 /* SPR specific to PowerPC 602 implementation */
981 static void gen_spr_602 (CPUPPCState
*env
)
984 /* XXX : not implemented */
985 spr_register(env
, SPR_SER
, "SER",
986 SPR_NOACCESS
, SPR_NOACCESS
,
987 &spr_read_generic
, &spr_write_generic
,
989 /* XXX : not implemented */
990 spr_register(env
, SPR_SEBR
, "SEBR",
991 SPR_NOACCESS
, SPR_NOACCESS
,
992 &spr_read_generic
, &spr_write_generic
,
994 /* XXX : not implemented */
995 spr_register(env
, SPR_ESASR
, "ESASR",
996 SPR_NOACCESS
, SPR_NOACCESS
,
997 &spr_read_generic
, &spr_write_generic
,
999 /* Floating point status */
1000 /* XXX : not implemented */
1001 spr_register(env
, SPR_SP
, "SP",
1002 SPR_NOACCESS
, SPR_NOACCESS
,
1003 &spr_read_generic
, &spr_write_generic
,
1005 /* XXX : not implemented */
1006 spr_register(env
, SPR_LT
, "LT",
1007 SPR_NOACCESS
, SPR_NOACCESS
,
1008 &spr_read_generic
, &spr_write_generic
,
1010 /* Watchdog timer */
1011 /* XXX : not implemented */
1012 spr_register(env
, SPR_TCR
, "TCR",
1013 SPR_NOACCESS
, SPR_NOACCESS
,
1014 &spr_read_generic
, &spr_write_generic
,
1016 /* Interrupt base */
1017 spr_register(env
, SPR_IBR
, "IBR",
1018 SPR_NOACCESS
, SPR_NOACCESS
,
1019 &spr_read_generic
, &spr_write_generic
,
1023 /* SPR specific to PowerPC 601 implementation */
1024 static void gen_spr_601 (CPUPPCState
*env
)
1026 /* Multiplication/division register */
1028 spr_register(env
, SPR_MQ
, "MQ",
1029 &spr_read_generic
, &spr_write_generic
,
1030 &spr_read_generic
, &spr_write_generic
,
1033 spr_register(env
, SPR_601_RTCU
, "RTCU",
1034 SPR_NOACCESS
, SPR_NOACCESS
,
1035 SPR_NOACCESS
, &spr_write_601_rtcu
,
1037 spr_register(env
, SPR_601_VRTCU
, "RTCU",
1038 &spr_read_601_rtcu
, SPR_NOACCESS
,
1039 &spr_read_601_rtcu
, SPR_NOACCESS
,
1041 spr_register(env
, SPR_601_RTCL
, "RTCL",
1042 SPR_NOACCESS
, SPR_NOACCESS
,
1043 SPR_NOACCESS
, &spr_write_601_rtcl
,
1045 spr_register(env
, SPR_601_VRTCL
, "RTCL",
1046 &spr_read_601_rtcl
, SPR_NOACCESS
,
1047 &spr_read_601_rtcl
, SPR_NOACCESS
,
1051 spr_register(env
, SPR_601_UDECR
, "UDECR",
1052 &spr_read_decr
, SPR_NOACCESS
,
1053 &spr_read_decr
, SPR_NOACCESS
,
1056 /* External access control */
1057 /* XXX : not implemented */
1058 spr_register(env
, SPR_EAR
, "EAR",
1059 SPR_NOACCESS
, SPR_NOACCESS
,
1060 &spr_read_generic
, &spr_write_generic
,
1062 /* Memory management */
1063 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
1064 SPR_NOACCESS
, SPR_NOACCESS
,
1065 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1067 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
1068 SPR_NOACCESS
, SPR_NOACCESS
,
1069 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1071 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
1072 SPR_NOACCESS
, SPR_NOACCESS
,
1073 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1075 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
1076 SPR_NOACCESS
, SPR_NOACCESS
,
1077 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1079 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
1080 SPR_NOACCESS
, SPR_NOACCESS
,
1081 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1083 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
1084 SPR_NOACCESS
, SPR_NOACCESS
,
1085 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1087 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
1088 SPR_NOACCESS
, SPR_NOACCESS
,
1089 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1091 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
1092 SPR_NOACCESS
, SPR_NOACCESS
,
1093 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1097 /* PowerPC BookE SPR */
1098 static void gen_spr_BookE (CPUPPCState
*env
)
1100 /* Processor identification */
1101 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
1102 SPR_NOACCESS
, SPR_NOACCESS
,
1103 &spr_read_generic
, &spr_write_pir
,
1105 /* Interrupt processing */
1106 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
1107 SPR_NOACCESS
, SPR_NOACCESS
,
1108 &spr_read_generic
, &spr_write_generic
,
1110 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
1111 SPR_NOACCESS
, SPR_NOACCESS
,
1112 &spr_read_generic
, &spr_write_generic
,
1114 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
1115 SPR_NOACCESS
, SPR_NOACCESS
,
1116 &spr_read_generic
, &spr_write_generic
,
1118 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
1119 SPR_NOACCESS
, SPR_NOACCESS
,
1120 &spr_read_generic
, &spr_write_generic
,
1122 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
1123 SPR_NOACCESS
, SPR_NOACCESS
,
1124 &spr_read_generic
, &spr_write_generic
,
1126 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
1127 SPR_NOACCESS
, SPR_NOACCESS
,
1128 &spr_read_generic
, &spr_write_generic
,
1131 /* XXX : not implemented */
1132 spr_register(env
, SPR_BOOKE_IAC1
, "IAC1",
1133 SPR_NOACCESS
, SPR_NOACCESS
,
1134 &spr_read_generic
, &spr_write_generic
,
1136 /* XXX : not implemented */
1137 spr_register(env
, SPR_BOOKE_IAC2
, "IAC2",
1138 SPR_NOACCESS
, SPR_NOACCESS
,
1139 &spr_read_generic
, &spr_write_generic
,
1141 /* XXX : not implemented */
1142 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
1143 SPR_NOACCESS
, SPR_NOACCESS
,
1144 &spr_read_generic
, &spr_write_generic
,
1146 /* XXX : not implemented */
1147 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
1148 SPR_NOACCESS
, SPR_NOACCESS
,
1149 &spr_read_generic
, &spr_write_generic
,
1151 /* XXX : not implemented */
1152 spr_register(env
, SPR_BOOKE_DAC1
, "DAC1",
1153 SPR_NOACCESS
, SPR_NOACCESS
,
1154 &spr_read_generic
, &spr_write_generic
,
1156 /* XXX : not implemented */
1157 spr_register(env
, SPR_BOOKE_DAC2
, "DAC2",
1158 SPR_NOACCESS
, SPR_NOACCESS
,
1159 &spr_read_generic
, &spr_write_generic
,
1161 /* XXX : not implemented */
1162 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
1163 SPR_NOACCESS
, SPR_NOACCESS
,
1164 &spr_read_generic
, &spr_write_generic
,
1166 /* XXX : not implemented */
1167 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
1168 SPR_NOACCESS
, SPR_NOACCESS
,
1169 &spr_read_generic
, &spr_write_generic
,
1171 /* XXX : not implemented */
1172 spr_register(env
, SPR_BOOKE_DBCR0
, "DBCR0",
1173 SPR_NOACCESS
, SPR_NOACCESS
,
1174 &spr_read_generic
, &spr_write_generic
,
1176 /* XXX : not implemented */
1177 spr_register(env
, SPR_BOOKE_DBCR1
, "DBCR1",
1178 SPR_NOACCESS
, SPR_NOACCESS
,
1179 &spr_read_generic
, &spr_write_generic
,
1181 /* XXX : not implemented */
1182 spr_register(env
, SPR_BOOKE_DBCR2
, "DBCR2",
1183 SPR_NOACCESS
, SPR_NOACCESS
,
1184 &spr_read_generic
, &spr_write_generic
,
1186 /* XXX : not implemented */
1187 spr_register(env
, SPR_BOOKE_DBSR
, "DBSR",
1188 SPR_NOACCESS
, SPR_NOACCESS
,
1189 &spr_read_generic
, &spr_write_clear
,
1191 spr_register(env
, SPR_BOOKE_DEAR
, "DEAR",
1192 SPR_NOACCESS
, SPR_NOACCESS
,
1193 &spr_read_generic
, &spr_write_generic
,
1195 spr_register(env
, SPR_BOOKE_ESR
, "ESR",
1196 SPR_NOACCESS
, SPR_NOACCESS
,
1197 &spr_read_generic
, &spr_write_generic
,
1199 spr_register(env
, SPR_BOOKE_IVPR
, "IVPR",
1200 SPR_NOACCESS
, SPR_NOACCESS
,
1201 &spr_read_generic
, &spr_write_generic
,
1203 /* Exception vectors */
1204 spr_register(env
, SPR_BOOKE_IVOR0
, "IVOR0",
1205 SPR_NOACCESS
, SPR_NOACCESS
,
1206 &spr_read_generic
, &spr_write_generic
,
1208 spr_register(env
, SPR_BOOKE_IVOR1
, "IVOR1",
1209 SPR_NOACCESS
, SPR_NOACCESS
,
1210 &spr_read_generic
, &spr_write_generic
,
1212 spr_register(env
, SPR_BOOKE_IVOR2
, "IVOR2",
1213 SPR_NOACCESS
, SPR_NOACCESS
,
1214 &spr_read_generic
, &spr_write_generic
,
1216 spr_register(env
, SPR_BOOKE_IVOR3
, "IVOR3",
1217 SPR_NOACCESS
, SPR_NOACCESS
,
1218 &spr_read_generic
, &spr_write_generic
,
1220 spr_register(env
, SPR_BOOKE_IVOR4
, "IVOR4",
1221 SPR_NOACCESS
, SPR_NOACCESS
,
1222 &spr_read_generic
, &spr_write_generic
,
1224 spr_register(env
, SPR_BOOKE_IVOR5
, "IVOR5",
1225 SPR_NOACCESS
, SPR_NOACCESS
,
1226 &spr_read_generic
, &spr_write_generic
,
1228 spr_register(env
, SPR_BOOKE_IVOR6
, "IVOR6",
1229 SPR_NOACCESS
, SPR_NOACCESS
,
1230 &spr_read_generic
, &spr_write_generic
,
1232 spr_register(env
, SPR_BOOKE_IVOR7
, "IVOR7",
1233 SPR_NOACCESS
, SPR_NOACCESS
,
1234 &spr_read_generic
, &spr_write_generic
,
1236 spr_register(env
, SPR_BOOKE_IVOR8
, "IVOR8",
1237 SPR_NOACCESS
, SPR_NOACCESS
,
1238 &spr_read_generic
, &spr_write_generic
,
1240 spr_register(env
, SPR_BOOKE_IVOR9
, "IVOR9",
1241 SPR_NOACCESS
, SPR_NOACCESS
,
1242 &spr_read_generic
, &spr_write_generic
,
1244 spr_register(env
, SPR_BOOKE_IVOR10
, "IVOR10",
1245 SPR_NOACCESS
, SPR_NOACCESS
,
1246 &spr_read_generic
, &spr_write_generic
,
1248 spr_register(env
, SPR_BOOKE_IVOR11
, "IVOR11",
1249 SPR_NOACCESS
, SPR_NOACCESS
,
1250 &spr_read_generic
, &spr_write_generic
,
1252 spr_register(env
, SPR_BOOKE_IVOR12
, "IVOR12",
1253 SPR_NOACCESS
, SPR_NOACCESS
,
1254 &spr_read_generic
, &spr_write_generic
,
1256 spr_register(env
, SPR_BOOKE_IVOR13
, "IVOR13",
1257 SPR_NOACCESS
, SPR_NOACCESS
,
1258 &spr_read_generic
, &spr_write_generic
,
1260 spr_register(env
, SPR_BOOKE_IVOR14
, "IVOR14",
1261 SPR_NOACCESS
, SPR_NOACCESS
,
1262 &spr_read_generic
, &spr_write_generic
,
1264 spr_register(env
, SPR_BOOKE_IVOR15
, "IVOR15",
1265 SPR_NOACCESS
, SPR_NOACCESS
,
1266 &spr_read_generic
, &spr_write_generic
,
1268 spr_register(env
, SPR_BOOKE_IVOR32
, "IVOR32",
1269 SPR_NOACCESS
, SPR_NOACCESS
,
1270 &spr_read_generic
, &spr_write_generic
,
1272 spr_register(env
, SPR_BOOKE_IVOR33
, "IVOR33",
1273 SPR_NOACCESS
, SPR_NOACCESS
,
1274 &spr_read_generic
, &spr_write_generic
,
1276 spr_register(env
, SPR_BOOKE_IVOR34
, "IVOR34",
1277 SPR_NOACCESS
, SPR_NOACCESS
,
1278 &spr_read_generic
, &spr_write_generic
,
1280 spr_register(env
, SPR_BOOKE_IVOR35
, "IVOR35",
1281 SPR_NOACCESS
, SPR_NOACCESS
,
1282 &spr_read_generic
, &spr_write_generic
,
1284 spr_register(env
, SPR_BOOKE_IVOR36
, "IVOR36",
1285 SPR_NOACCESS
, SPR_NOACCESS
,
1286 &spr_read_generic
, &spr_write_generic
,
1288 spr_register(env
, SPR_BOOKE_IVOR37
, "IVOR37",
1289 SPR_NOACCESS
, SPR_NOACCESS
,
1290 &spr_read_generic
, &spr_write_generic
,
1292 spr_register(env
, SPR_BOOKE_PID
, "PID",
1293 SPR_NOACCESS
, SPR_NOACCESS
,
1294 &spr_read_generic
, &spr_write_generic
,
1296 spr_register(env
, SPR_BOOKE_TCR
, "TCR",
1297 SPR_NOACCESS
, SPR_NOACCESS
,
1298 &spr_read_generic
, &spr_write_booke_tcr
,
1300 spr_register(env
, SPR_BOOKE_TSR
, "TSR",
1301 SPR_NOACCESS
, SPR_NOACCESS
,
1302 &spr_read_generic
, &spr_write_booke_tsr
,
1305 spr_register(env
, SPR_DECR
, "DECR",
1306 SPR_NOACCESS
, SPR_NOACCESS
,
1307 &spr_read_decr
, &spr_write_decr
,
1309 spr_register(env
, SPR_BOOKE_DECAR
, "DECAR",
1310 SPR_NOACCESS
, SPR_NOACCESS
,
1311 SPR_NOACCESS
, &spr_write_generic
,
1314 spr_register(env
, SPR_USPRG0
, "USPRG0",
1315 &spr_read_generic
, &spr_write_generic
,
1316 &spr_read_generic
, &spr_write_generic
,
1318 spr_register(env
, SPR_SPRG4
, "SPRG4",
1319 SPR_NOACCESS
, SPR_NOACCESS
,
1320 &spr_read_generic
, &spr_write_generic
,
1322 spr_register(env
, SPR_USPRG4
, "USPRG4",
1323 &spr_read_ureg
, SPR_NOACCESS
,
1324 &spr_read_ureg
, SPR_NOACCESS
,
1326 spr_register(env
, SPR_SPRG5
, "SPRG5",
1327 SPR_NOACCESS
, SPR_NOACCESS
,
1328 &spr_read_generic
, &spr_write_generic
,
1330 spr_register(env
, SPR_USPRG5
, "USPRG5",
1331 &spr_read_ureg
, SPR_NOACCESS
,
1332 &spr_read_ureg
, SPR_NOACCESS
,
1334 spr_register(env
, SPR_SPRG6
, "SPRG6",
1335 SPR_NOACCESS
, SPR_NOACCESS
,
1336 &spr_read_generic
, &spr_write_generic
,
1338 spr_register(env
, SPR_USPRG6
, "USPRG6",
1339 &spr_read_ureg
, SPR_NOACCESS
,
1340 &spr_read_ureg
, SPR_NOACCESS
,
1342 spr_register(env
, SPR_SPRG7
, "SPRG7",
1343 SPR_NOACCESS
, SPR_NOACCESS
,
1344 &spr_read_generic
, &spr_write_generic
,
1346 spr_register(env
, SPR_USPRG7
, "USPRG7",
1347 &spr_read_ureg
, SPR_NOACCESS
,
1348 &spr_read_ureg
, SPR_NOACCESS
,
1352 /* FSL storage control registers */
1353 static void gen_spr_BookE_FSL (CPUPPCState
*env
)
1355 /* TLB assist registers */
1356 spr_register(env
, SPR_BOOKE_MAS0
, "MAS0",
1357 SPR_NOACCESS
, SPR_NOACCESS
,
1358 &spr_read_generic
, &spr_write_generic
,
1360 spr_register(env
, SPR_BOOKE_MAS1
, "MAS2",
1361 SPR_NOACCESS
, SPR_NOACCESS
,
1362 &spr_read_generic
, &spr_write_generic
,
1364 spr_register(env
, SPR_BOOKE_MAS2
, "MAS3",
1365 SPR_NOACCESS
, SPR_NOACCESS
,
1366 &spr_read_generic
, &spr_write_generic
,
1368 spr_register(env
, SPR_BOOKE_MAS3
, "MAS4",
1369 SPR_NOACCESS
, SPR_NOACCESS
,
1370 &spr_read_generic
, &spr_write_generic
,
1372 spr_register(env
, SPR_BOOKE_MAS4
, "MAS5",
1373 SPR_NOACCESS
, SPR_NOACCESS
,
1374 &spr_read_generic
, &spr_write_generic
,
1376 spr_register(env
, SPR_BOOKE_MAS6
, "MAS6",
1377 SPR_NOACCESS
, SPR_NOACCESS
,
1378 &spr_read_generic
, &spr_write_generic
,
1380 spr_register(env
, SPR_BOOKE_MAS7
, "MAS7",
1381 SPR_NOACCESS
, SPR_NOACCESS
,
1382 &spr_read_generic
, &spr_write_generic
,
1384 if (env
->nb_pids
> 1) {
1385 spr_register(env
, SPR_BOOKE_PID1
, "PID1",
1386 SPR_NOACCESS
, SPR_NOACCESS
,
1387 &spr_read_generic
, &spr_write_generic
,
1390 if (env
->nb_pids
> 2) {
1391 spr_register(env
, SPR_BOOKE_PID2
, "PID2",
1392 SPR_NOACCESS
, SPR_NOACCESS
,
1393 &spr_read_generic
, &spr_write_generic
,
1396 spr_register(env
, SPR_BOOKE_MMUCFG
, "MMUCFG",
1397 SPR_NOACCESS
, SPR_NOACCESS
,
1398 &spr_read_generic
, SPR_NOACCESS
,
1399 0x00000000); /* TOFIX */
1400 spr_register(env
, SPR_BOOKE_MMUCSR0
, "MMUCSR0",
1401 SPR_NOACCESS
, SPR_NOACCESS
,
1402 &spr_read_generic
, &spr_write_generic
,
1403 0x00000000); /* TOFIX */
1404 switch (env
->nb_ways
) {
1406 spr_register(env
, SPR_BOOKE_TLB3CFG
, "TLB3CFG",
1407 SPR_NOACCESS
, SPR_NOACCESS
,
1408 &spr_read_generic
, SPR_NOACCESS
,
1409 0x00000000); /* TOFIX */
1412 spr_register(env
, SPR_BOOKE_TLB2CFG
, "TLB2CFG",
1413 SPR_NOACCESS
, SPR_NOACCESS
,
1414 &spr_read_generic
, SPR_NOACCESS
,
1415 0x00000000); /* TOFIX */
1418 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
1419 SPR_NOACCESS
, SPR_NOACCESS
,
1420 &spr_read_generic
, SPR_NOACCESS
,
1421 0x00000000); /* TOFIX */
1424 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
1425 SPR_NOACCESS
, SPR_NOACCESS
,
1426 &spr_read_generic
, SPR_NOACCESS
,
1427 0x00000000); /* TOFIX */
1435 /* SPR specific to PowerPC 440 implementation */
1436 static void gen_spr_440 (CPUPPCState
*env
)
1439 /* XXX : not implemented */
1440 spr_register(env
, SPR_440_DNV0
, "DNV0",
1441 SPR_NOACCESS
, SPR_NOACCESS
,
1442 &spr_read_generic
, &spr_write_generic
,
1444 /* XXX : not implemented */
1445 spr_register(env
, SPR_440_DNV1
, "DNV1",
1446 SPR_NOACCESS
, SPR_NOACCESS
,
1447 &spr_read_generic
, &spr_write_generic
,
1449 /* XXX : not implemented */
1450 spr_register(env
, SPR_440_DNV2
, "DNV2",
1451 SPR_NOACCESS
, SPR_NOACCESS
,
1452 &spr_read_generic
, &spr_write_generic
,
1454 /* XXX : not implemented */
1455 spr_register(env
, SPR_440_DNV3
, "DNV3",
1456 SPR_NOACCESS
, SPR_NOACCESS
,
1457 &spr_read_generic
, &spr_write_generic
,
1459 /* XXX : not implemented */
1460 spr_register(env
, SPR_440_DVT0
, "DVT0",
1461 SPR_NOACCESS
, SPR_NOACCESS
,
1462 &spr_read_generic
, &spr_write_generic
,
1464 /* XXX : not implemented */
1465 spr_register(env
, SPR_440_DVT1
, "DVT1",
1466 SPR_NOACCESS
, SPR_NOACCESS
,
1467 &spr_read_generic
, &spr_write_generic
,
1469 /* XXX : not implemented */
1470 spr_register(env
, SPR_440_DVT2
, "DVT2",
1471 SPR_NOACCESS
, SPR_NOACCESS
,
1472 &spr_read_generic
, &spr_write_generic
,
1474 /* XXX : not implemented */
1475 spr_register(env
, SPR_440_DVT3
, "DVT3",
1476 SPR_NOACCESS
, SPR_NOACCESS
,
1477 &spr_read_generic
, &spr_write_generic
,
1479 /* XXX : not implemented */
1480 spr_register(env
, SPR_440_DVLIM
, "DVLIM",
1481 SPR_NOACCESS
, SPR_NOACCESS
,
1482 &spr_read_generic
, &spr_write_generic
,
1484 /* XXX : not implemented */
1485 spr_register(env
, SPR_440_INV0
, "INV0",
1486 SPR_NOACCESS
, SPR_NOACCESS
,
1487 &spr_read_generic
, &spr_write_generic
,
1489 /* XXX : not implemented */
1490 spr_register(env
, SPR_440_INV1
, "INV1",
1491 SPR_NOACCESS
, SPR_NOACCESS
,
1492 &spr_read_generic
, &spr_write_generic
,
1494 /* XXX : not implemented */
1495 spr_register(env
, SPR_440_INV2
, "INV2",
1496 SPR_NOACCESS
, SPR_NOACCESS
,
1497 &spr_read_generic
, &spr_write_generic
,
1499 /* XXX : not implemented */
1500 spr_register(env
, SPR_440_INV3
, "INV3",
1501 SPR_NOACCESS
, SPR_NOACCESS
,
1502 &spr_read_generic
, &spr_write_generic
,
1504 /* XXX : not implemented */
1505 spr_register(env
, SPR_440_IVT0
, "IVT0",
1506 SPR_NOACCESS
, SPR_NOACCESS
,
1507 &spr_read_generic
, &spr_write_generic
,
1509 /* XXX : not implemented */
1510 spr_register(env
, SPR_440_IVT1
, "IVT1",
1511 SPR_NOACCESS
, SPR_NOACCESS
,
1512 &spr_read_generic
, &spr_write_generic
,
1514 /* XXX : not implemented */
1515 spr_register(env
, SPR_440_IVT2
, "IVT2",
1516 SPR_NOACCESS
, SPR_NOACCESS
,
1517 &spr_read_generic
, &spr_write_generic
,
1519 /* XXX : not implemented */
1520 spr_register(env
, SPR_440_IVT3
, "IVT3",
1521 SPR_NOACCESS
, SPR_NOACCESS
,
1522 &spr_read_generic
, &spr_write_generic
,
1524 /* XXX : not implemented */
1525 spr_register(env
, SPR_440_IVLIM
, "IVLIM",
1526 SPR_NOACCESS
, SPR_NOACCESS
,
1527 &spr_read_generic
, &spr_write_generic
,
1530 /* XXX : not implemented */
1531 spr_register(env
, SPR_BOOKE_DCBTRH
, "DCBTRH",
1532 SPR_NOACCESS
, SPR_NOACCESS
,
1533 &spr_read_generic
, SPR_NOACCESS
,
1535 /* XXX : not implemented */
1536 spr_register(env
, SPR_BOOKE_DCBTRL
, "DCBTRL",
1537 SPR_NOACCESS
, SPR_NOACCESS
,
1538 &spr_read_generic
, SPR_NOACCESS
,
1540 /* XXX : not implemented */
1541 spr_register(env
, SPR_BOOKE_ICBDR
, "ICBDR",
1542 SPR_NOACCESS
, SPR_NOACCESS
,
1543 &spr_read_generic
, SPR_NOACCESS
,
1545 /* XXX : not implemented */
1546 spr_register(env
, SPR_BOOKE_ICBTRH
, "ICBTRH",
1547 SPR_NOACCESS
, SPR_NOACCESS
,
1548 &spr_read_generic
, SPR_NOACCESS
,
1550 /* XXX : not implemented */
1551 spr_register(env
, SPR_BOOKE_ICBTRL
, "ICBTRL",
1552 SPR_NOACCESS
, SPR_NOACCESS
,
1553 &spr_read_generic
, SPR_NOACCESS
,
1555 /* XXX : not implemented */
1556 spr_register(env
, SPR_440_DBDR
, "DBDR",
1557 SPR_NOACCESS
, SPR_NOACCESS
,
1558 &spr_read_generic
, &spr_write_generic
,
1560 /* Processor control */
1561 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1562 SPR_NOACCESS
, SPR_NOACCESS
,
1563 &spr_read_generic
, &spr_write_generic
,
1565 spr_register(env
, SPR_440_RSTCFG
, "RSTCFG",
1566 SPR_NOACCESS
, SPR_NOACCESS
,
1567 &spr_read_generic
, SPR_NOACCESS
,
1569 /* Storage control */
1570 spr_register(env
, SPR_440_MMUCR
, "MMUCR",
1571 SPR_NOACCESS
, SPR_NOACCESS
,
1572 &spr_read_generic
, &spr_write_generic
,
1576 /* SPR shared between PowerPC 40x implementations */
1577 static void gen_spr_40x (CPUPPCState
*env
)
1580 /* XXX : not implemented */
1581 spr_register(env
, SPR_40x_DCCR
, "DCCR",
1582 SPR_NOACCESS
, SPR_NOACCESS
,
1583 &spr_read_generic
, &spr_write_generic
,
1585 /* XXX : not implemented */
1586 spr_register(env
, SPR_40x_DCWR
, "DCWR",
1587 SPR_NOACCESS
, SPR_NOACCESS
,
1588 &spr_read_generic
, &spr_write_generic
,
1590 /* XXX : not implemented */
1591 spr_register(env
, SPR_40x_ICCR
, "ICCR",
1592 SPR_NOACCESS
, SPR_NOACCESS
,
1593 &spr_read_generic
, &spr_write_generic
,
1595 /* XXX : not implemented */
1596 spr_register(env
, SPR_BOOKE_ICBDR
, "ICBDR",
1597 SPR_NOACCESS
, SPR_NOACCESS
,
1598 &spr_read_generic
, SPR_NOACCESS
,
1600 /* Bus access control */
1601 spr_register(env
, SPR_40x_SGR
, "SGR",
1602 SPR_NOACCESS
, SPR_NOACCESS
,
1603 &spr_read_generic
, &spr_write_generic
,
1605 spr_register(env
, SPR_40x_ZPR
, "ZPR",
1606 SPR_NOACCESS
, SPR_NOACCESS
,
1607 &spr_read_generic
, &spr_write_generic
,
1610 spr_register(env
, SPR_40x_PID
, "PID",
1611 SPR_NOACCESS
, SPR_NOACCESS
,
1612 &spr_read_generic
, &spr_write_generic
,
1615 spr_register(env
, SPR_40x_DEAR
, "DEAR",
1616 SPR_NOACCESS
, SPR_NOACCESS
,
1617 &spr_read_generic
, &spr_write_generic
,
1619 spr_register(env
, SPR_40x_ESR
, "ESR",
1620 SPR_NOACCESS
, SPR_NOACCESS
,
1621 &spr_read_generic
, &spr_write_generic
,
1623 spr_register(env
, SPR_40x_EVPR
, "EVPR",
1624 SPR_NOACCESS
, SPR_NOACCESS
,
1625 &spr_read_generic
, &spr_write_generic
,
1627 spr_register(env
, SPR_40x_SRR2
, "SRR2",
1628 &spr_read_generic
, &spr_write_generic
,
1629 &spr_read_generic
, &spr_write_generic
,
1631 spr_register(env
, SPR_40x_SRR3
, "SRR3",
1632 &spr_read_generic
, &spr_write_generic
,
1633 &spr_read_generic
, &spr_write_generic
,
1636 spr_register(env
, SPR_40x_PIT
, "PIT",
1637 SPR_NOACCESS
, SPR_NOACCESS
,
1638 &spr_read_40x_pit
, &spr_write_40x_pit
,
1640 spr_register(env
, SPR_40x_TCR
, "TCR",
1641 SPR_NOACCESS
, SPR_NOACCESS
,
1642 &spr_read_generic
, &spr_write_booke_tcr
,
1644 spr_register(env
, SPR_40x_TSR
, "TSR",
1645 SPR_NOACCESS
, SPR_NOACCESS
,
1646 &spr_read_generic
, &spr_write_booke_tsr
,
1648 /* Debug interface */
1649 /* XXX : not implemented */
1650 spr_register(env
, SPR_40x_DAC1
, "DAC1",
1651 SPR_NOACCESS
, SPR_NOACCESS
,
1652 &spr_read_generic
, &spr_write_generic
,
1654 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1655 SPR_NOACCESS
, SPR_NOACCESS
,
1656 &spr_read_generic
, &spr_write_generic
,
1658 /* XXX : not implemented */
1659 spr_register(env
, SPR_40x_DBCR0
, "DBCR0",
1660 SPR_NOACCESS
, SPR_NOACCESS
,
1661 &spr_read_generic
, &spr_write_40x_dbcr0
,
1663 /* XXX : not implemented */
1664 spr_register(env
, SPR_40x_DBSR
, "DBSR",
1665 SPR_NOACCESS
, SPR_NOACCESS
,
1666 &spr_read_generic
, &spr_write_clear
,
1667 /* Last reset was system reset */
1669 /* XXX : not implemented */
1670 spr_register(env
, SPR_40x_IAC1
, "IAC1",
1671 SPR_NOACCESS
, SPR_NOACCESS
,
1672 &spr_read_generic
, &spr_write_generic
,
1674 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1675 SPR_NOACCESS
, SPR_NOACCESS
,
1676 &spr_read_generic
, &spr_write_generic
,
1680 /* SPR specific to PowerPC 405 implementation */
1681 static void gen_spr_405 (CPUPPCState
*env
)
1683 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1684 SPR_NOACCESS
, SPR_NOACCESS
,
1685 &spr_read_generic
, &spr_write_generic
,
1688 /* XXX : not implemented */
1689 spr_register(env
, SPR_405_DBCR1
, "DBCR1",
1690 SPR_NOACCESS
, SPR_NOACCESS
,
1691 &spr_read_generic
, &spr_write_generic
,
1693 /* XXX : not implemented */
1694 spr_register(env
, SPR_405_DVC1
, "DVC1",
1695 SPR_NOACCESS
, SPR_NOACCESS
,
1696 &spr_read_generic
, &spr_write_generic
,
1698 /* XXX : not implemented */
1699 spr_register(env
, SPR_405_DVC2
, "DVC2",
1700 SPR_NOACCESS
, SPR_NOACCESS
,
1701 &spr_read_generic
, &spr_write_generic
,
1703 /* XXX : not implemented */
1704 spr_register(env
, SPR_405_IAC3
, "IAC3",
1705 SPR_NOACCESS
, SPR_NOACCESS
,
1706 &spr_read_generic
, &spr_write_generic
,
1708 /* XXX : not implemented */
1709 spr_register(env
, SPR_405_IAC4
, "IAC4",
1710 SPR_NOACCESS
, SPR_NOACCESS
,
1711 &spr_read_generic
, &spr_write_generic
,
1713 /* Storage control */
1714 /* XXX : not implemented */
1715 spr_register(env
, SPR_405_SLER
, "SLER",
1716 SPR_NOACCESS
, SPR_NOACCESS
,
1717 &spr_read_generic
, &spr_write_generic
,
1719 /* XXX : not implemented */
1720 spr_register(env
, SPR_405_SU0R
, "SU0R",
1721 SPR_NOACCESS
, SPR_NOACCESS
,
1722 &spr_read_generic
, &spr_write_generic
,
1725 spr_register(env
, SPR_USPRG0
, "USPRG0",
1726 &spr_read_ureg
, SPR_NOACCESS
,
1727 &spr_read_ureg
, SPR_NOACCESS
,
1729 spr_register(env
, SPR_SPRG4
, "SPRG4",
1730 SPR_NOACCESS
, SPR_NOACCESS
,
1731 &spr_read_generic
, &spr_write_generic
,
1733 spr_register(env
, SPR_USPRG4
, "USPRG4",
1734 &spr_read_ureg
, SPR_NOACCESS
,
1735 &spr_read_ureg
, SPR_NOACCESS
,
1737 spr_register(env
, SPR_SPRG5
, "SPRG5",
1738 SPR_NOACCESS
, SPR_NOACCESS
,
1739 spr_read_generic
, &spr_write_generic
,
1741 spr_register(env
, SPR_USPRG5
, "USPRG5",
1742 &spr_read_ureg
, SPR_NOACCESS
,
1743 &spr_read_ureg
, SPR_NOACCESS
,
1745 spr_register(env
, SPR_SPRG6
, "SPRG6",
1746 SPR_NOACCESS
, SPR_NOACCESS
,
1747 spr_read_generic
, &spr_write_generic
,
1749 spr_register(env
, SPR_USPRG6
, "USPRG6",
1750 &spr_read_ureg
, SPR_NOACCESS
,
1751 &spr_read_ureg
, SPR_NOACCESS
,
1753 spr_register(env
, SPR_SPRG7
, "SPRG7",
1754 SPR_NOACCESS
, SPR_NOACCESS
,
1755 spr_read_generic
, &spr_write_generic
,
1757 spr_register(env
, SPR_USPRG7
, "USPRG7",
1758 &spr_read_ureg
, SPR_NOACCESS
,
1759 &spr_read_ureg
, SPR_NOACCESS
,
1763 /* SPR shared between PowerPC 401 & 403 implementations */
1764 static void gen_spr_401_403 (CPUPPCState
*env
)
1767 spr_register(env
, SPR_403_VTBL
, "TBL",
1768 &spr_read_tbl
, SPR_NOACCESS
,
1769 &spr_read_tbl
, SPR_NOACCESS
,
1771 spr_register(env
, SPR_403_TBL
, "TBL",
1772 SPR_NOACCESS
, SPR_NOACCESS
,
1773 SPR_NOACCESS
, &spr_write_tbl
,
1775 spr_register(env
, SPR_403_VTBU
, "TBU",
1776 &spr_read_tbu
, SPR_NOACCESS
,
1777 &spr_read_tbu
, SPR_NOACCESS
,
1779 spr_register(env
, SPR_403_TBU
, "TBU",
1780 SPR_NOACCESS
, SPR_NOACCESS
,
1781 SPR_NOACCESS
, &spr_write_tbu
,
1784 /* XXX: not implemented */
1785 spr_register(env
, SPR_403_CDBCR
, "CDBCR",
1786 SPR_NOACCESS
, SPR_NOACCESS
,
1787 &spr_read_generic
, &spr_write_generic
,
1791 /* SPR specific to PowerPC 403 implementation */
1792 static void gen_spr_403 (CPUPPCState
*env
)
1795 spr_register(env
, SPR_403_PBL1
, "PBL1",
1796 SPR_NOACCESS
, SPR_NOACCESS
,
1797 &spr_read_403_pbr
, &spr_write_403_pbr
,
1799 spr_register(env
, SPR_403_PBU1
, "PBU1",
1800 SPR_NOACCESS
, SPR_NOACCESS
,
1801 &spr_read_403_pbr
, &spr_write_403_pbr
,
1803 spr_register(env
, SPR_403_PBL2
, "PBL2",
1804 SPR_NOACCESS
, SPR_NOACCESS
,
1805 &spr_read_403_pbr
, &spr_write_403_pbr
,
1807 spr_register(env
, SPR_403_PBU2
, "PBU2",
1808 SPR_NOACCESS
, SPR_NOACCESS
,
1809 &spr_read_403_pbr
, &spr_write_403_pbr
,
1812 /* XXX : not implemented */
1813 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1814 SPR_NOACCESS
, SPR_NOACCESS
,
1815 &spr_read_generic
, &spr_write_generic
,
1817 /* XXX : not implemented */
1818 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1819 SPR_NOACCESS
, SPR_NOACCESS
,
1820 &spr_read_generic
, &spr_write_generic
,
1824 /* SPR specific to PowerPC compression coprocessor extension */
1826 static void gen_spr_compress (CPUPPCState
*env
)
1828 spr_register(env
, SPR_401_SKR
, "SKR",
1829 SPR_NOACCESS
, SPR_NOACCESS
,
1830 &spr_read_generic
, &spr_write_generic
,
1835 // XXX: TODO (64 bits PowerPC SPRs)
1837 * ASR => SPR 280 (64 bits)
1838 * FPECR => SPR 1022 (?)
1839 * VRSAVE => SPR 256 (Altivec)
1840 * SCOMC => SPR 276 (64 bits ?)
1841 * SCOMD => SPR 277 (64 bits ?)
1842 * HSPRG0 => SPR 304 (hypervisor)
1843 * HSPRG1 => SPR 305 (hypervisor)
1844 * HDEC => SPR 310 (hypervisor)
1845 * HIOR => SPR 311 (hypervisor)
1846 * RMOR => SPR 312 (970)
1847 * HRMOR => SPR 313 (hypervisor)
1848 * HSRR0 => SPR 314 (hypervisor)
1849 * HSRR1 => SPR 315 (hypervisor)
1850 * LPCR => SPR 316 (970)
1851 * LPIDR => SPR 317 (970)
1852 * ... and more (thermal management, performance counters, ...)
1855 static void init_ppc_proc (CPUPPCState
*env
, ppc_def_t
*def
)
1858 /* Default MMU definitions */
1866 * - RCPU (same as MPC5xx ?)
1868 spr_register(env
, SPR_PVR
, "PVR",
1869 SPR_NOACCESS
, SPR_NOACCESS
,
1870 &spr_read_generic
, SPR_NOACCESS
,
1872 printf("%s: PVR %08x mask %08x => %08x\n", __func__
,
1873 def
->pvr
, def
->pvr_mask
, def
->pvr
& def
->pvr_mask
);
1875 /* Embedded PowerPC from IBM */
1876 case CPU_PPC_401A1
: /* 401 A1 family */
1877 case CPU_PPC_401B2
: /* 401 B2 family */
1878 case CPU_PPC_401C2
: /* 401 C2 family */
1879 case CPU_PPC_401D2
: /* 401 D2 family */
1880 case CPU_PPC_401E2
: /* 401 E2 family */
1881 case CPU_PPC_401F2
: /* 401 F2 family */
1882 case CPU_PPC_401G2
: /* 401 G2 family */
1883 case CPU_PPC_IOP480
: /* IOP 480 family */
1884 case CPU_PPC_COBRA
: /* IBM Processor for Network Resources */
1885 gen_spr_generic(env
);
1887 gen_spr_401_403(env
);
1889 /* XXX: optional ? */
1890 gen_spr_compress(env
);
1896 /* XXX: TODO: allocate internal IRQ controller */
1899 case CPU_PPC_403GA
: /* 403 GA family */
1900 case CPU_PPC_403GB
: /* 403 GB family */
1901 case CPU_PPC_403GC
: /* 403 GC family */
1902 case CPU_PPC_403GCX
: /* 403 GCX family */
1903 gen_spr_generic(env
);
1905 gen_spr_401_403(env
);
1911 /* XXX: TODO: allocate internal IRQ controller */
1914 case CPU_PPC_405CR
: /* 405 GP/CR family */
1915 case CPU_PPC_405EP
: /* 405 EP family */
1916 case CPU_PPC_405GPR
: /* 405 GPR family */
1917 case CPU_PPC_405D2
: /* 405 D2 family */
1918 case CPU_PPC_405D4
: /* 405 D4 family */
1919 gen_spr_generic(env
);
1928 /* Allocate hardware IRQ controller */
1929 ppc405_irq_init(env
);
1932 case CPU_PPC_NPE405H
: /* NPe405 H family */
1933 case CPU_PPC_NPE405H2
:
1934 case CPU_PPC_NPE405L
: /* Npe405 L family */
1935 gen_spr_generic(env
);
1944 /* Allocate hardware IRQ controller */
1945 ppc405_irq_init(env
);
1949 case CPU_PPC_STB01000
:
1952 case CPU_PPC_STB01010
:
1955 case CPU_PPC_STB0210
:
1957 case CPU_PPC_STB03
: /* STB03 family */
1959 case CPU_PPC_STB043
: /* STB043 family */
1962 case CPU_PPC_STB045
: /* STB045 family */
1964 case CPU_PPC_STB25
: /* STB25 family */
1966 case CPU_PPC_STB130
: /* STB130 family */
1968 gen_spr_generic(env
);
1977 /* Allocate hardware IRQ controller */
1978 ppc405_irq_init(env
);
1981 case CPU_PPC_440EP
: /* 440 EP family */
1982 case CPU_PPC_440GP
: /* 440 GP family */
1983 case CPU_PPC_440GX
: /* 440 GX family */
1984 case CPU_PPC_440GXc
: /* 440 GXc family */
1985 case CPU_PPC_440GXf
: /* 440 GXf family */
1986 case CPU_PPC_440SP
: /* 440 SP family */
1987 case CPU_PPC_440SP2
:
1988 case CPU_PPC_440SPE
: /* 440 SPE family */
1989 gen_spr_generic(env
);
1998 /* XXX: TODO: allocate internal IRQ controller */
2001 /* Embedded PowerPC from Freescale */
2007 case CPU_PPC_8xx
: /* MPC821 / 823 / 850 / 860 */
2011 case CPU_PPC_82xx_HIP3
: /* MPC8240 / 8260 */
2012 case CPU_PPC_82xx_HIP4
: /* MPC8240 / 8260 */
2016 case CPU_PPC_827x
: /* MPC 827x / 828x */
2020 /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
2021 case CPU_PPC_e500v110
:
2022 case CPU_PPC_e500v120
:
2023 case CPU_PPC_e500v210
:
2024 case CPU_PPC_e500v220
:
2025 gen_spr_generic(env
);
2029 gen_spr_BookE_FSL(env
);
2034 /* XXX: TODO: allocate internal IRQ controller */
2042 /* 32 bits PowerPC */
2043 case CPU_PPC_601
: /* PowerPC 601 */
2044 gen_spr_generic(env
);
2045 gen_spr_ne_601(env
);
2047 /* Hardware implementation registers */
2048 /* XXX : not implemented */
2049 spr_register(env
, SPR_HID0
, "HID0",
2050 SPR_NOACCESS
, SPR_NOACCESS
,
2051 &spr_read_generic
, &spr_write_generic
,
2053 /* XXX : not implemented */
2054 spr_register(env
, SPR_HID1
, "HID1",
2055 SPR_NOACCESS
, SPR_NOACCESS
,
2056 &spr_read_generic
, &spr_write_generic
,
2058 /* XXX : not implemented */
2059 spr_register(env
, SPR_601_HID2
, "HID2",
2060 SPR_NOACCESS
, SPR_NOACCESS
,
2061 &spr_read_generic
, &spr_write_generic
,
2063 /* XXX : not implemented */
2064 spr_register(env
, SPR_601_HID5
, "HID5",
2065 SPR_NOACCESS
, SPR_NOACCESS
,
2066 &spr_read_generic
, &spr_write_generic
,
2068 /* XXX : not implemented */
2070 spr_register(env
, SPR_601_HID15
, "HID15",
2071 SPR_NOACCESS
, SPR_NOACCESS
,
2072 &spr_read_generic
, &spr_write_generic
,
2079 /* XXX: TODO: allocate internal IRQ controller */
2082 case CPU_PPC_602
: /* PowerPC 602 */
2083 gen_spr_generic(env
);
2084 gen_spr_ne_601(env
);
2085 /* Memory management */
2089 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2091 /* hardware implementation registers */
2092 /* XXX : not implemented */
2093 spr_register(env
, SPR_HID0
, "HID0",
2094 SPR_NOACCESS
, SPR_NOACCESS
,
2095 &spr_read_generic
, &spr_write_generic
,
2097 /* XXX : not implemented */
2098 spr_register(env
, SPR_HID1
, "HID1",
2099 SPR_NOACCESS
, SPR_NOACCESS
,
2100 &spr_read_generic
, &spr_write_generic
,
2102 /* Allocate hardware IRQ controller */
2103 ppc6xx_irq_init(env
);
2106 case CPU_PPC_603
: /* PowerPC 603 */
2107 case CPU_PPC_603E
: /* PowerPC 603e */
2108 case CPU_PPC_603E7v
:
2109 case CPU_PPC_603E7v2
:
2110 case CPU_PPC_603P
: /* PowerPC 603p */
2111 case CPU_PPC_603R
: /* PowerPC 603r */
2112 gen_spr_generic(env
);
2113 gen_spr_ne_601(env
);
2114 /* Memory management */
2118 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2120 /* hardware implementation registers */
2121 /* XXX : not implemented */
2122 spr_register(env
, SPR_HID0
, "HID0",
2123 SPR_NOACCESS
, SPR_NOACCESS
,
2124 &spr_read_generic
, &spr_write_generic
,
2126 /* XXX : not implemented */
2127 spr_register(env
, SPR_HID1
, "HID1",
2128 SPR_NOACCESS
, SPR_NOACCESS
,
2129 &spr_read_generic
, &spr_write_generic
,
2131 /* Allocate hardware IRQ controller */
2132 ppc6xx_irq_init(env
);
2135 case CPU_PPC_G2
: /* PowerPC G2 family */
2139 case CPU_PPC_G2LE
: /* PowerPC G2LE family */
2140 case CPU_PPC_G2LEgp
:
2141 case CPU_PPC_G2LEls
:
2142 gen_spr_generic(env
);
2143 gen_spr_ne_601(env
);
2144 /* Memory management */
2148 /* Memory management */
2150 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2151 gen_spr_G2_755(env
);
2153 /* Hardware implementation register */
2154 /* XXX : not implemented */
2155 spr_register(env
, SPR_HID0
, "HID0",
2156 SPR_NOACCESS
, SPR_NOACCESS
,
2157 &spr_read_generic
, &spr_write_generic
,
2159 /* XXX : not implemented */
2160 spr_register(env
, SPR_HID1
, "HID1",
2161 SPR_NOACCESS
, SPR_NOACCESS
,
2162 &spr_read_generic
, &spr_write_generic
,
2164 /* XXX : not implemented */
2165 spr_register(env
, SPR_HID2
, "HID2",
2166 SPR_NOACCESS
, SPR_NOACCESS
,
2167 &spr_read_generic
, &spr_write_generic
,
2169 /* Allocate hardware IRQ controller */
2170 ppc6xx_irq_init(env
);
2173 case CPU_PPC_604
: /* PowerPC 604 */
2174 case CPU_PPC_604E
: /* PowerPC 604e */
2175 case CPU_PPC_604R
: /* PowerPC 604r */
2176 gen_spr_generic(env
);
2177 gen_spr_ne_601(env
);
2178 /* Memory management */
2183 /* Hardware implementation registers */
2184 /* XXX : not implemented */
2185 spr_register(env
, SPR_HID0
, "HID0",
2186 SPR_NOACCESS
, SPR_NOACCESS
,
2187 &spr_read_generic
, &spr_write_generic
,
2189 /* XXX : not implemented */
2190 spr_register(env
, SPR_HID1
, "HID1",
2191 SPR_NOACCESS
, SPR_NOACCESS
,
2192 &spr_read_generic
, &spr_write_generic
,
2194 /* Allocate hardware IRQ controller */
2195 ppc6xx_irq_init(env
);
2198 case CPU_PPC_74x
: /* PowerPC 740 / 750 */
2201 case CPU_PPC_74xP
: /* PowerPC 740P / 750P */
2202 case CPU_PPC_750CXE21
: /* IBM PowerPC 750cxe */
2203 case CPU_PPC_750CXE22
:
2204 case CPU_PPC_750CXE23
:
2205 case CPU_PPC_750CXE24
:
2206 case CPU_PPC_750CXE24b
:
2207 case CPU_PPC_750CXE31
:
2208 case CPU_PPC_750CXE31b
:
2209 case CPU_PPC_750CXR
:
2210 gen_spr_generic(env
);
2211 gen_spr_ne_601(env
);
2212 /* Memory management */
2217 /* Hardware implementation registers */
2218 /* XXX : not implemented */
2219 spr_register(env
, SPR_HID0
, "HID0",
2220 SPR_NOACCESS
, SPR_NOACCESS
,
2221 &spr_read_generic
, &spr_write_generic
,
2223 /* XXX : not implemented */
2224 spr_register(env
, SPR_HID1
, "HID1",
2225 SPR_NOACCESS
, SPR_NOACCESS
,
2226 &spr_read_generic
, &spr_write_generic
,
2228 /* Allocate hardware IRQ controller */
2229 ppc6xx_irq_init(env
);
2232 case CPU_PPC_750FX10
: /* IBM PowerPC 750 FX */
2233 case CPU_PPC_750FX20
:
2234 case CPU_PPC_750FX21
:
2235 case CPU_PPC_750FX22
:
2236 case CPU_PPC_750FX23
:
2237 case CPU_PPC_750GX10
: /* IBM PowerPC 750 GX */
2238 case CPU_PPC_750GX11
:
2239 case CPU_PPC_750GX12
:
2240 gen_spr_generic(env
);
2241 gen_spr_ne_601(env
);
2242 /* Memory management */
2244 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2249 /* Hardware implementation registers */
2250 /* XXX : not implemented */
2251 spr_register(env
, SPR_HID0
, "HID0",
2252 SPR_NOACCESS
, SPR_NOACCESS
,
2253 &spr_read_generic
, &spr_write_generic
,
2255 /* XXX : not implemented */
2256 spr_register(env
, SPR_HID1
, "HID1",
2257 SPR_NOACCESS
, SPR_NOACCESS
,
2258 &spr_read_generic
, &spr_write_generic
,
2260 /* XXX : not implemented */
2261 spr_register(env
, SPR_750_HID2
, "HID2",
2262 SPR_NOACCESS
, SPR_NOACCESS
,
2263 &spr_read_generic
, &spr_write_generic
,
2265 /* Allocate hardware IRQ controller */
2266 ppc6xx_irq_init(env
);
2269 case CPU_PPC_755_10
: /* PowerPC 755 */
2270 case CPU_PPC_755_11
:
2271 case CPU_PPC_755_20
:
2274 gen_spr_generic(env
);
2275 gen_spr_ne_601(env
);
2276 /* Memory management */
2280 /* Memory management */
2282 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2283 gen_spr_G2_755(env
);
2284 /* L2 cache control */
2285 /* XXX : not implemented */
2286 spr_register(env
, SPR_ICTC
, "ICTC",
2287 SPR_NOACCESS
, SPR_NOACCESS
,
2288 &spr_read_generic
, &spr_write_generic
,
2290 /* XXX : not implemented */
2291 spr_register(env
, SPR_L2PM
, "L2PM",
2292 SPR_NOACCESS
, SPR_NOACCESS
,
2293 &spr_read_generic
, &spr_write_generic
,
2295 /* Hardware implementation registers */
2296 /* XXX : not implemented */
2297 spr_register(env
, SPR_HID0
, "HID0",
2298 SPR_NOACCESS
, SPR_NOACCESS
,
2299 &spr_read_generic
, &spr_write_generic
,
2301 /* XXX : not implemented */
2302 spr_register(env
, SPR_HID1
, "HID1",
2303 SPR_NOACCESS
, SPR_NOACCESS
,
2304 &spr_read_generic
, &spr_write_generic
,
2306 /* XXX : not implemented */
2307 spr_register(env
, SPR_HID2
, "HID2",
2308 SPR_NOACCESS
, SPR_NOACCESS
,
2309 &spr_read_generic
, &spr_write_generic
,
2311 /* Allocate hardware IRQ controller */
2312 ppc6xx_irq_init(env
);
2317 case CPU_PPC_7400
: /* PowerPC 7400 */
2318 case CPU_PPC_7410C
: /* PowerPC 7410 */
2321 case CPU_PPC_7441
: /* PowerPC 7441 */
2322 case CPU_PPC_7445
: /* PowerPC 7445 */
2323 case CPU_PPC_7447
: /* PowerPC 7447 */
2324 case CPU_PPC_7447A
: /* PowerPC 7447A */
2325 case CPU_PPC_7448
: /* PowerPC 7448 */
2326 case CPU_PPC_7450
: /* PowerPC 7450 */
2328 case CPU_PPC_7451
: /* PowerPC 7451 */
2330 case CPU_PPC_7455
: /* PowerPC 7455 */
2333 case CPU_PPC_7457
: /* PowerPC 7457 */
2335 case CPU_PPC_7457A
: /* PowerPC 7457A */
2339 /* 64 bits PowerPC */
2340 #if defined (TARGET_PPC64)
2342 case CPU_PPC_620
: /* PowerPC 620 */
2343 case CPU_PPC_630
: /* PowerPC 630 (Power 3) */
2344 case CPU_PPC_631
: /* PowerPC 631 (Power 3+) */
2345 case CPU_PPC_POWER4
: /* Power 4 */
2346 case CPU_PPC_POWER4P
: /* Power 4+ */
2347 case CPU_PPC_POWER5
: /* Power 5 */
2348 case CPU_PPC_POWER5P
: /* Power 5+ */
2352 case CPU_PPC_970
: /* PowerPC 970 */
2353 case CPU_PPC_970FX10
: /* PowerPC 970 FX */
2354 case CPU_PPC_970FX20
:
2355 case CPU_PPC_970FX21
:
2356 case CPU_PPC_970FX30
:
2357 case CPU_PPC_970FX31
:
2358 case CPU_PPC_970MP10
: /* PowerPC 970 MP */
2359 case CPU_PPC_970MP11
:
2360 gen_spr_generic(env
);
2361 gen_spr_ne_601(env
);
2362 /* XXX: not correct */
2367 /* Hardware implementation registers */
2368 /* XXX : not implemented */
2369 spr_register(env
, SPR_HID0
, "HID0",
2370 SPR_NOACCESS
, SPR_NOACCESS
,
2371 &spr_read_generic
, &spr_write_generic
,
2373 /* XXX : not implemented */
2374 spr_register(env
, SPR_HID1
, "HID1",
2375 SPR_NOACCESS
, SPR_NOACCESS
,
2376 &spr_read_generic
, &spr_write_generic
,
2378 /* XXX : not implemented */
2379 spr_register(env
, SPR_750_HID2
, "HID2",
2380 SPR_NOACCESS
, SPR_NOACCESS
,
2381 &spr_read_generic
, &spr_write_generic
,
2383 /* Allocate hardware IRQ controller */
2384 ppc970_irq_init(env
);
2388 case CPU_PPC_CELL10
: /* Cell family */
2389 case CPU_PPC_CELL20
:
2390 case CPU_PPC_CELL30
:
2391 case CPU_PPC_CELL31
:
2396 case CPU_PPC_RS64
: /* Apache (RS64/A35) */
2397 case CPU_PPC_RS64II
: /* NorthStar (RS64-II/A50) */
2398 case CPU_PPC_RS64III
: /* Pulsar (RS64-III) */
2399 case CPU_PPC_RS64IV
: /* IceStar/IStar/SStar (RS64-IV) */
2402 #endif /* defined (TARGET_PPC64) */
2406 case CPU_POWER
: /* POWER */
2407 case CPU_POWER2
: /* POWER2 */
2412 gen_spr_generic(env
);
2413 /* XXX: TODO: allocate internal IRQ controller */
2416 if (env
->nb_BATs
== -1)
2418 /* Allocate TLBs buffer when needed */
2419 if (env
->nb_tlb
!= 0) {
2420 int nb_tlb
= env
->nb_tlb
;
2421 if (env
->id_tlbs
!= 0)
2423 env
->tlb
= qemu_mallocz(nb_tlb
* sizeof(ppc_tlb_t
));
2424 /* Pre-compute some useful values */
2425 env
->tlb_per_way
= env
->nb_tlb
/ env
->nb_ways
;
2429 #if defined(PPC_DUMP_CPU)
2430 static void dump_sprs (CPUPPCState
*env
)
2433 uint32_t pvr
= env
->spr
[SPR_PVR
];
2434 uint32_t sr
, sw
, ur
, uw
;
2437 printf("* SPRs for PVR=%08x\n", pvr
);
2438 for (i
= 0; i
< 32; i
++) {
2439 for (j
= 0; j
< 32; j
++) {
2441 spr
= &env
->spr_cb
[n
];
2442 #if !defined(CONFIG_USER_ONLY)
2443 sw
= spr
->oea_write
!= NULL
&& spr
->oea_write
!= SPR_NOACCESS
;
2444 sr
= spr
->oea_read
!= NULL
&& spr
->oea_read
!= SPR_NOACCESS
;
2449 uw
= spr
->uea_write
!= NULL
&& spr
->uea_write
!= SPR_NOACCESS
;
2450 ur
= spr
->uea_read
!= NULL
&& spr
->uea_read
!= SPR_NOACCESS
;
2451 if (sw
|| sr
|| uw
|| ur
) {
2452 printf("%4d (%03x) %8s s%c%c u%c%c\n",
2453 (i
<< 5) | j
, (i
<< 5) | j
, spr
->name
,
2454 sw
? 'w' : '-', sr
? 'r' : '-',
2455 uw
? 'w' : '-', ur
? 'r' : '-');
2464 /*****************************************************************************/
2468 int fflush (FILE *stream
);
2472 PPC_DIRECT
= 0, /* Opcode routine */
2473 PPC_INDIRECT
= 1, /* Indirect opcode table */
2476 static inline int is_indirect_opcode (void *handler
)
2478 return ((unsigned long)handler
& 0x03) == PPC_INDIRECT
;
2481 static inline opc_handler_t
**ind_table(void *handler
)
2483 return (opc_handler_t
**)((unsigned long)handler
& ~3);
2486 /* Instruction table creation */
2487 /* Opcodes tables creation */
2488 static void fill_new_table (opc_handler_t
**table
, int len
)
2492 for (i
= 0; i
< len
; i
++)
2493 table
[i
] = &invalid_handler
;
2496 static int create_new_table (opc_handler_t
**table
, unsigned char idx
)
2498 opc_handler_t
**tmp
;
2500 tmp
= malloc(0x20 * sizeof(opc_handler_t
));
2503 fill_new_table(tmp
, 0x20);
2504 table
[idx
] = (opc_handler_t
*)((unsigned long)tmp
| PPC_INDIRECT
);
2509 static int insert_in_table (opc_handler_t
**table
, unsigned char idx
,
2510 opc_handler_t
*handler
)
2512 if (table
[idx
] != &invalid_handler
)
2514 table
[idx
] = handler
;
2519 static int register_direct_insn (opc_handler_t
**ppc_opcodes
,
2520 unsigned char idx
, opc_handler_t
*handler
)
2522 if (insert_in_table(ppc_opcodes
, idx
, handler
) < 0) {
2523 printf("*** ERROR: opcode %02x already assigned in main "
2524 "opcode table\n", idx
);
2531 static int register_ind_in_table (opc_handler_t
**table
,
2532 unsigned char idx1
, unsigned char idx2
,
2533 opc_handler_t
*handler
)
2535 if (table
[idx1
] == &invalid_handler
) {
2536 if (create_new_table(table
, idx1
) < 0) {
2537 printf("*** ERROR: unable to create indirect table "
2538 "idx=%02x\n", idx1
);
2542 if (!is_indirect_opcode(table
[idx1
])) {
2543 printf("*** ERROR: idx %02x already assigned to a direct "
2548 if (handler
!= NULL
&&
2549 insert_in_table(ind_table(table
[idx1
]), idx2
, handler
) < 0) {
2550 printf("*** ERROR: opcode %02x already assigned in "
2551 "opcode table %02x\n", idx2
, idx1
);
2558 static int register_ind_insn (opc_handler_t
**ppc_opcodes
,
2559 unsigned char idx1
, unsigned char idx2
,
2560 opc_handler_t
*handler
)
2564 ret
= register_ind_in_table(ppc_opcodes
, idx1
, idx2
, handler
);
2569 static int register_dblind_insn (opc_handler_t
**ppc_opcodes
,
2570 unsigned char idx1
, unsigned char idx2
,
2571 unsigned char idx3
, opc_handler_t
*handler
)
2573 if (register_ind_in_table(ppc_opcodes
, idx1
, idx2
, NULL
) < 0) {
2574 printf("*** ERROR: unable to join indirect table idx "
2575 "[%02x-%02x]\n", idx1
, idx2
);
2578 if (register_ind_in_table(ind_table(ppc_opcodes
[idx1
]), idx2
, idx3
,
2580 printf("*** ERROR: unable to insert opcode "
2581 "[%02x-%02x-%02x]\n", idx1
, idx2
, idx3
);
2588 static int register_insn (opc_handler_t
**ppc_opcodes
, opcode_t
*insn
)
2590 if (insn
->opc2
!= 0xFF) {
2591 if (insn
->opc3
!= 0xFF) {
2592 if (register_dblind_insn(ppc_opcodes
, insn
->opc1
, insn
->opc2
,
2593 insn
->opc3
, &insn
->handler
) < 0)
2596 if (register_ind_insn(ppc_opcodes
, insn
->opc1
,
2597 insn
->opc2
, &insn
->handler
) < 0)
2601 if (register_direct_insn(ppc_opcodes
, insn
->opc1
, &insn
->handler
) < 0)
2608 static int test_opcode_table (opc_handler_t
**table
, int len
)
2612 for (i
= 0, count
= 0; i
< len
; i
++) {
2613 /* Consistency fixup */
2614 if (table
[i
] == NULL
)
2615 table
[i
] = &invalid_handler
;
2616 if (table
[i
] != &invalid_handler
) {
2617 if (is_indirect_opcode(table
[i
])) {
2618 tmp
= test_opcode_table(ind_table(table
[i
]), 0x20);
2621 table
[i
] = &invalid_handler
;
2634 static void fix_opcode_tables (opc_handler_t
**ppc_opcodes
)
2636 if (test_opcode_table(ppc_opcodes
, 0x40) == 0)
2637 printf("*** WARNING: no opcode defined !\n");
2640 /*****************************************************************************/
2641 static int create_ppc_opcodes (CPUPPCState
*env
, ppc_def_t
*def
)
2643 opcode_t
*opc
, *start
, *end
;
2645 fill_new_table(env
->opcodes
, 0x40);
2646 #if defined(PPC_DUMP_CPU)
2647 printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2649 def
->pvr
, def
->name
, def
->insns_flags
, def
->flags
);
2651 if (&opc_start
< &opc_end
) {
2658 for (opc
= start
+ 1; opc
!= end
; opc
++) {
2659 if ((opc
->handler
.type
& def
->insns_flags
) != 0) {
2660 if (register_insn(env
->opcodes
, opc
) < 0) {
2661 printf("*** ERROR initializing PowerPC instruction "
2662 "0x%02x 0x%02x 0x%02x\n", opc
->opc1
, opc
->opc2
,
2666 #if defined(PPC_DUMP_CPU)
2668 if (opc
->opc3
== 0xFF) {
2669 if (opc
->opc2
== 0xFF) {
2670 printf(" %02x -- -- (%2d ----) : %s\n",
2671 opc
->opc1
, opc
->opc1
, opc
->oname
);
2673 printf(" %02x %02x -- (%2d %4d) : %s\n",
2674 opc
->opc1
, opc
->opc2
, opc
->opc1
, opc
->opc2
,
2678 printf(" %02x %02x %02x (%2d %4d) : %s\n",
2679 opc
->opc1
, opc
->opc2
, opc
->opc3
,
2680 opc
->opc1
, (opc
->opc3
<< 5) | opc
->opc2
,
2687 fix_opcode_tables(env
->opcodes
);
2694 int cpu_ppc_register (CPUPPCState
*env
, ppc_def_t
*def
)
2696 env
->msr_mask
= def
->msr_mask
;
2697 env
->flags
= def
->flags
;
2698 if (create_ppc_opcodes(env
, def
) < 0)
2700 init_ppc_proc(env
, def
);
2701 #if defined(PPC_DUMP_CPU)
2703 if (env
->tlb
!= NULL
) {
2704 printf("%d %s TLB in %d ways\n", env
->nb_tlb
,
2705 env
->id_tlbs
? "splitted" : "merged", env
->nb_ways
);
2712 /*****************************************************************************/
2713 /* PowerPC CPU definitions */
2714 static ppc_def_t ppc_defs
[] = {
2715 /* Embedded PowerPC */
2721 .pvr_mask
= 0xFFFF0000,
2722 .insns_flags
= PPC_INSNS_401
,
2723 .flags
= PPC_FLAGS_401
,
2728 /* IOP480 (401 microcontroler) */
2731 .pvr
= CPU_PPC_IOP480
,
2732 .pvr_mask
= 0xFFFF0000,
2733 .insns_flags
= PPC_INSNS_401
,
2734 .flags
= PPC_FLAGS_401
,
2739 /* IBM Processor for Network Resources */
2742 .pvr
= CPU_PPC_COBRA
,
2743 .pvr_mask
= 0xFFFF0000,
2744 .insns_flags
= PPC_INSNS_401
,
2745 .flags
= PPC_FLAGS_401
,
2750 /* Generic PowerPC 403 */
2754 .pvr_mask
= 0xFFFFFF00,
2755 .insns_flags
= PPC_INSNS_403
,
2756 .flags
= PPC_FLAGS_403
,
2757 .msr_mask
= 0x000000000007D23DULL
,
2761 /* PowerPC 403 GA */
2764 .pvr
= CPU_PPC_403GA
,
2765 .pvr_mask
= 0xFFFFFF00,
2766 .insns_flags
= PPC_INSNS_403
,
2767 .flags
= PPC_FLAGS_403
,
2768 .msr_mask
= 0x000000000007D23DULL
,
2772 /* PowerPC 403 GB */
2775 .pvr
= CPU_PPC_403GB
,
2776 .pvr_mask
= 0xFFFFFF00,
2777 .insns_flags
= PPC_INSNS_403
,
2778 .flags
= PPC_FLAGS_403
,
2779 .msr_mask
= 0x000000000007D23DULL
,
2783 /* PowerPC 403 GC */
2786 .pvr
= CPU_PPC_403GC
,
2787 .pvr_mask
= 0xFFFFFF00,
2788 .insns_flags
= PPC_INSNS_403
,
2789 .flags
= PPC_FLAGS_403
,
2790 .msr_mask
= 0x000000000007D23DULL
,
2794 /* PowerPC 403 GCX */
2797 .pvr
= CPU_PPC_403GCX
,
2798 .pvr_mask
= 0xFFFFFF00,
2799 .insns_flags
= PPC_INSNS_403
,
2800 .flags
= PPC_FLAGS_403
,
2801 .msr_mask
= 0x000000000007D23DULL
,
2804 /* Generic PowerPC 405 */
2808 .pvr_mask
= 0xFFFF0000,
2809 .insns_flags
= PPC_INSNS_405
,
2810 .flags
= PPC_FLAGS_405
,
2811 .msr_mask
= 0x00000000020EFF30ULL
,
2813 /* PowerPC 405 CR */
2817 .pvr_mask
= 0xFFFFFFFF,
2818 .insns_flags
= PPC_INSNS_405
,
2819 .flags
= PPC_FLAGS_405
,
2820 .msr_mask
= 0x00000000020EFF30ULL
,
2823 /* PowerPC 405 GP */
2827 .pvr_mask
= 0xFFFFFFFF,
2828 .insns_flags
= PPC_INSNS_405
,
2829 .flags
= PPC_FLAGS_405
,
2830 .msr_mask
= 0x00000000020EFF30ULL
,
2833 /* PowerPC 405 EP */
2836 .pvr
= CPU_PPC_405EP
,
2837 .pvr_mask
= 0xFFFFFFFF,
2838 .insns_flags
= PPC_INSNS_405
,
2839 .flags
= PPC_FLAGS_405
,
2840 .msr_mask
= 0x00000000020EFF30ULL
,
2843 /* PowerPC 405 EZ */
2846 .pvr
= CPU_PPC_405EZ
,
2847 .pvr_mask
= 0xFFFFFFFF,
2848 .insns_flags
= PPC_INSNS_405
,
2849 .flags
= PPC_FLAGS_405
,
2850 .msr_mask
= 0x00000000020EFF30ULL
,
2854 /* PowerPC 405 GPR */
2857 .pvr
= CPU_PPC_405GPR
,
2858 .pvr_mask
= 0xFFFFFFFF,
2859 .insns_flags
= PPC_INSNS_405
,
2860 .flags
= PPC_FLAGS_405
,
2861 .msr_mask
= 0x00000000020EFF30ULL
,
2864 /* PowerPC 405 D2 */
2867 .pvr
= CPU_PPC_405D2
,
2868 .pvr_mask
= 0xFFFFFFFF,
2869 .insns_flags
= PPC_INSNS_405
,
2870 .flags
= PPC_FLAGS_405
,
2871 .msr_mask
= 0x00000000020EFF30ULL
,
2873 /* PowerPC 405 D4 */
2876 .pvr
= CPU_PPC_405D4
,
2877 .pvr_mask
= 0xFFFFFFFF,
2878 .insns_flags
= PPC_INSNS_405
,
2879 .flags
= PPC_FLAGS_405
,
2880 .msr_mask
= 0x00000000020EFF30ULL
,
2886 .pvr
= CPU_PPC_NPE405H
,
2887 .pvr_mask
= 0xFFFFFFFF,
2888 .insns_flags
= PPC_INSNS_405
,
2889 .flags
= PPC_FLAGS_405
,
2890 .msr_mask
= 0x00000000020EFF30ULL
,
2897 .pvr
= CPU_PPC_NPE405L
,
2898 .pvr_mask
= 0xFFFFFFFF,
2899 .insns_flags
= PPC_INSNS_405
,
2900 .flags
= PPC_FLAGS_405
,
2901 .msr_mask
= 0x00000000020EFF30ULL
,
2908 .pvr
= CPU_PPC_STB01000
,
2909 .pvr_mask
= 0xFFFFFFFF,
2910 .insns_flags
= PPC_INSNS_405
,
2911 .flags
= PPC_FLAGS_405
,
2912 .msr_mask
= 0x00000000020EFF30ULL
,
2919 .pvr
= CPU_PPC_STB01010
,
2920 .pvr_mask
= 0xFFFFFFFF,
2921 .insns_flags
= PPC_INSNS_405
,
2922 .flags
= PPC_FLAGS_405
,
2923 .msr_mask
= 0x00000000020EFF30ULL
,
2930 .pvr
= CPU_PPC_STB0210
,
2931 .pvr_mask
= 0xFFFFFFFF,
2932 .insns_flags
= PPC_INSNS_405
,
2933 .flags
= PPC_FLAGS_405
,
2934 .msr_mask
= 0x00000000020EFF30ULL
,
2941 .pvr
= CPU_PPC_STB03
,
2942 .pvr_mask
= 0xFFFFFFFF,
2943 .insns_flags
= PPC_INSNS_405
,
2944 .flags
= PPC_FLAGS_405
,
2945 .msr_mask
= 0x00000000020EFF30ULL
,
2952 .pvr
= CPU_PPC_STB043
,
2953 .pvr_mask
= 0xFFFFFFFF,
2954 .insns_flags
= PPC_INSNS_405
,
2955 .flags
= PPC_FLAGS_405
,
2956 .msr_mask
= 0x00000000020EFF30ULL
,
2963 .pvr
= CPU_PPC_STB045
,
2964 .pvr_mask
= 0xFFFFFFFF,
2965 .insns_flags
= PPC_INSNS_405
,
2966 .flags
= PPC_FLAGS_405
,
2967 .msr_mask
= 0x00000000020EFF30ULL
,
2974 .pvr
= CPU_PPC_STB25
,
2975 .pvr_mask
= 0xFFFFFFFF,
2976 .insns_flags
= PPC_INSNS_405
,
2977 .flags
= PPC_FLAGS_405
,
2978 .msr_mask
= 0x00000000020EFF30ULL
,
2985 .pvr
= CPU_PPC_STB130
,
2986 .pvr_mask
= 0xFFFFFFFF,
2987 .insns_flags
= PPC_INSNS_405
,
2988 .flags
= PPC_FLAGS_405
,
2989 .msr_mask
= 0x00000000020EFF30ULL
,
2992 /* Xilinx PowerPC 405 cores */
2996 .pvr
= CPU_PPC_X2VP4
,
2997 .pvr_mask
= 0xFFFFFFFF,
2998 .insns_flags
= PPC_INSNS_405
,
2999 .flags
= PPC_FLAGS_405
,
3000 .msr_mask
= 0x00000000020EFF30ULL
,
3004 .pvr
= CPU_PPC_X2VP7
,
3005 .pvr_mask
= 0xFFFFFFFF,
3006 .insns_flags
= PPC_INSNS_405
,
3007 .flags
= PPC_FLAGS_405
,
3008 .msr_mask
= 0x00000000020EFF30ULL
,
3012 .pvr
= CPU_PPC_X2VP20
,
3013 .pvr_mask
= 0xFFFFFFFF,
3014 .insns_flags
= PPC_INSNS_405
,
3015 .flags
= PPC_FLAGS_405
,
3016 .msr_mask
= 0x00000000020EFF30ULL
,
3020 .pvr
= CPU_PPC_X2VP50
,
3021 .pvr_mask
= 0xFFFFFFFF,
3022 .insns_flags
= PPC_INSNS_405
,
3023 .flags
= PPC_FLAGS_405
,
3024 .msr_mask
= 0x00000000020EFF30ULL
,
3028 /* PowerPC 440 EP */
3031 .pvr
= CPU_PPC_440EP
,
3032 .pvr_mask
= 0xFFFF0000,
3033 .insns_flags
= PPC_INSNS_440
,
3034 .flags
= PPC_FLAGS_440
,
3035 .msr_mask
= 0x000000000006D630ULL
,
3039 /* PowerPC 440 GR */
3042 .pvr
= CPU_PPC_440GR
,
3043 .pvr_mask
= 0xFFFF0000,
3044 .insns_flags
= PPC_INSNS_440
,
3045 .flags
= PPC_FLAGS_440
,
3046 .msr_mask
= 0x000000000006D630ULL
,
3050 /* PowerPC 440 GP */
3053 .pvr
= CPU_PPC_440GP
,
3054 .pvr_mask
= 0xFFFFFF00,
3055 .insns_flags
= PPC_INSNS_440
,
3056 .flags
= PPC_FLAGS_440
,
3057 .msr_mask
= 0x000000000006D630ULL
,
3061 /* PowerPC 440 GX */
3064 .pvr
= CPU_PPC_440GX
,
3065 .pvr_mask
= 0xFFFF0000,
3066 .insns_flags
= PPC_INSNS_405
,
3067 .flags
= PPC_FLAGS_440
,
3068 .msr_mask
= 0x000000000006D630ULL
,
3072 /* PowerPC 440 GXc */
3075 .pvr
= CPU_PPC_440GXC
,
3076 .pvr_mask
= 0xFFFF0000,
3077 .insns_flags
= PPC_INSNS_405
,
3078 .flags
= PPC_FLAGS_440
,
3079 .msr_mask
= 0x000000000006D630ULL
,
3083 /* PowerPC 440 GXf */
3086 .pvr
= CPU_PPC_440GXF
,
3087 .pvr_mask
= 0xFFFF0000,
3088 .insns_flags
= PPC_INSNS_405
,
3089 .flags
= PPC_FLAGS_440
,
3090 .msr_mask
= 0x000000000006D630ULL
,
3094 /* PowerPC 440 SP */
3097 .pvr
= CPU_PPC_440SP
,
3098 .pvr_mask
= 0xFFFF0000,
3099 .insns_flags
= PPC_INSNS_405
,
3100 .flags
= PPC_FLAGS_440
,
3101 .msr_mask
= 0x000000000006D630ULL
,
3105 /* PowerPC 440 SP2 */
3108 .pvr
= CPU_PPC_440SP2
,
3109 .pvr_mask
= 0xFFFF0000,
3110 .insns_flags
= PPC_INSNS_405
,
3111 .flags
= PPC_FLAGS_440
,
3112 .msr_mask
= 0x000000000006D630ULL
,
3116 /* PowerPC 440 SPE */
3119 .pvr
= CPU_PPC_440SPE
,
3120 .pvr_mask
= 0xFFFF0000,
3121 .insns_flags
= PPC_INSNS_405
,
3122 .flags
= PPC_FLAGS_440
,
3123 .msr_mask
= 0x000000000006D630ULL
,
3126 /* Fake generic BookE PowerPC */
3129 .pvr
= CPU_PPC_e500
,
3130 .pvr_mask
= 0xFFFFFFFF,
3131 .insns_flags
= PPC_INSNS_BOOKE
,
3132 .flags
= PPC_FLAGS_BOOKE
,
3133 .msr_mask
= 0x000000000006D630ULL
,
3135 /* PowerPC 460 cores - TODO */
3136 /* PowerPC MPC 5xx cores - TODO */
3137 /* PowerPC MPC 8xx cores - TODO */
3138 /* PowerPC MPC 8xxx cores - TODO */
3139 /* e200 cores - TODO */
3140 /* e500 cores - TODO */
3141 /* e600 cores - TODO */
3143 /* 32 bits "classic" PowerPC */
3149 .pvr_mask
= 0xFFFF0000,
3150 .insns_flags
= PPC_INSNS_601
,
3151 .flags
= PPC_FLAGS_601
,
3152 .msr_mask
= 0x000000000000FD70ULL
,
3160 .pvr_mask
= 0xFFFF0000,
3161 .insns_flags
= PPC_INSNS_602
,
3162 .flags
= PPC_FLAGS_602
,
3163 .msr_mask
= 0x0000000000C7FF73ULL
,
3170 .pvr_mask
= 0xFFFFFFFF,
3171 .insns_flags
= PPC_INSNS_603
,
3172 .flags
= PPC_FLAGS_603
,
3173 .msr_mask
= 0x000000000007FF73ULL
,
3178 .pvr
= CPU_PPC_603E
,
3179 .pvr_mask
= 0xFFFFFFFF,
3180 .insns_flags
= PPC_INSNS_603
,
3181 .flags
= PPC_FLAGS_603
,
3182 .msr_mask
= 0x000000000007FF73ULL
,
3186 .pvr
= CPU_PPC_603E
,
3187 .pvr_mask
= 0xFFFFFFFF,
3188 .insns_flags
= PPC_INSNS_603
,
3189 .flags
= PPC_FLAGS_603
,
3190 .msr_mask
= 0x000000000007FF73ULL
,
3195 .pvr
= CPU_PPC_603P
,
3196 .pvr_mask
= 0xFFFFFFFF,
3197 .insns_flags
= PPC_INSNS_603
,
3198 .flags
= PPC_FLAGS_603
,
3199 .msr_mask
= 0x000000000007FF73ULL
,
3204 .pvr
= CPU_PPC_603E7
,
3205 .pvr_mask
= 0xFFFFFFFF,
3206 .insns_flags
= PPC_INSNS_603
,
3207 .flags
= PPC_FLAGS_603
,
3208 .msr_mask
= 0x000000000007FF73ULL
,
3210 /* PowerPC 603e7v */
3213 .pvr
= CPU_PPC_603E7v
,
3214 .pvr_mask
= 0xFFFFFFFF,
3215 .insns_flags
= PPC_INSNS_603
,
3216 .flags
= PPC_FLAGS_603
,
3217 .msr_mask
= 0x000000000007FF73ULL
,
3219 /* PowerPC 603e7v2 */
3222 .pvr
= CPU_PPC_603E7v2
,
3223 .pvr_mask
= 0xFFFFFFFF,
3224 .insns_flags
= PPC_INSNS_603
,
3225 .flags
= PPC_FLAGS_603
,
3226 .msr_mask
= 0x000000000007FF73ULL
,
3231 .pvr
= CPU_PPC_603R
,
3232 .pvr_mask
= 0xFFFFFFFF,
3233 .insns_flags
= PPC_INSNS_603
,
3234 .flags
= PPC_FLAGS_603
,
3235 .msr_mask
= 0x000000000007FF73ULL
,
3238 .name
= "Goldeneye",
3239 .pvr
= CPU_PPC_603R
,
3240 .pvr_mask
= 0xFFFFFFFF,
3241 .insns_flags
= PPC_INSNS_603
,
3242 .flags
= PPC_FLAGS_603
,
3243 .msr_mask
= 0x000000000007FF73ULL
,
3246 /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */
3250 .pvr_mask
= 0xFFFF0000,
3251 .insns_flags
= PPC_INSNS_G2
,
3252 .flags
= PPC_FLAGS_G2
,
3253 .msr_mask
= 0x000000000006FFF2ULL
,
3257 .pvr
= CPU_PPC_G2H4
,
3258 .pvr_mask
= 0xFFFF0000,
3259 .insns_flags
= PPC_INSNS_G2
,
3260 .flags
= PPC_FLAGS_G2
,
3261 .msr_mask
= 0x000000000006FFF2ULL
,
3265 .pvr
= CPU_PPC_G2gp
,
3266 .pvr_mask
= 0xFFFF0000,
3267 .insns_flags
= PPC_INSNS_G2
,
3268 .flags
= PPC_FLAGS_G2
,
3269 .msr_mask
= 0x000000000006FFF2ULL
,
3273 .pvr
= CPU_PPC_G2ls
,
3274 .pvr_mask
= 0xFFFF0000,
3275 .insns_flags
= PPC_INSNS_G2
,
3276 .flags
= PPC_FLAGS_G2
,
3277 .msr_mask
= 0x000000000006FFF2ULL
,
3279 { /* Same as G2, with LE mode support */
3281 .pvr
= CPU_PPC_G2LE
,
3282 .pvr_mask
= 0xFFFF0000,
3283 .insns_flags
= PPC_INSNS_G2
,
3284 .flags
= PPC_FLAGS_G2
,
3285 .msr_mask
= 0x000000000007FFF3ULL
,
3289 .pvr
= CPU_PPC_G2LEgp
,
3290 .pvr_mask
= 0xFFFF0000,
3291 .insns_flags
= PPC_INSNS_G2
,
3292 .flags
= PPC_FLAGS_G2
,
3293 .msr_mask
= 0x000000000007FFF3ULL
,
3297 .pvr
= CPU_PPC_G2LEls
,
3298 .pvr_mask
= 0xFFFF0000,
3299 .insns_flags
= PPC_INSNS_G2
,
3300 .flags
= PPC_FLAGS_G2
,
3301 .msr_mask
= 0x000000000007FFF3ULL
,
3308 .pvr_mask
= 0xFFFFFFFF,
3309 .insns_flags
= PPC_INSNS_604
,
3310 .flags
= PPC_FLAGS_604
,
3311 .msr_mask
= 0x000000000005FF77ULL
,
3316 .pvr
= CPU_PPC_604E
,
3317 .pvr_mask
= 0xFFFFFFFF,
3318 .insns_flags
= PPC_INSNS_604
,
3319 .flags
= PPC_FLAGS_604
,
3320 .msr_mask
= 0x000000000005FF77ULL
,
3325 .pvr
= CPU_PPC_604R
,
3326 .pvr_mask
= 0xFFFFFFFF,
3327 .insns_flags
= PPC_INSNS_604
,
3328 .flags
= PPC_FLAGS_604
,
3329 .msr_mask
= 0x000000000005FF77ULL
,
3335 .pvr_mask
= 0xFFFFFFFF,
3336 .insns_flags
= PPC_INSNS_7x0
,
3337 .flags
= PPC_FLAGS_7x0
,
3338 .msr_mask
= 0x000000000007FF77ULL
,
3344 .pvr_mask
= 0xFFFFFFFF,
3345 .insns_flags
= PPC_INSNS_7x0
,
3346 .flags
= PPC_FLAGS_7x0
,
3347 .msr_mask
= 0x000000000007FF77ULL
,
3352 .pvr_mask
= 0xFFFFFFFF,
3353 .insns_flags
= PPC_INSNS_7x0
,
3354 .flags
= PPC_FLAGS_7x0
,
3355 .msr_mask
= 0x000000000007FF77ULL
,
3362 .pvr_mask
= 0xFFFFF000,
3363 .insns_flags
= PPC_INSNS_7x5
,
3364 .flags
= PPC_FLAGS_7x5
,
3365 .msr_mask
= 0x000000000007FF77ULL
,
3368 .name
= "Goldfinger",
3370 .pvr_mask
= 0xFFFFF000,
3371 .insns_flags
= PPC_INSNS_7x5
,
3372 .flags
= PPC_FLAGS_7x5
,
3373 .msr_mask
= 0x000000000007FF77ULL
,
3380 .pvr_mask
= 0xFFFFFFFF,
3381 .insns_flags
= PPC_INSNS_7x0
,
3382 .flags
= PPC_FLAGS_7x0
,
3383 .msr_mask
= 0x000000000007FF77ULL
,
3390 .pvr_mask
= 0xFFFFF000,
3391 .insns_flags
= PPC_INSNS_7x5
,
3392 .flags
= PPC_FLAGS_7x5
,
3393 .msr_mask
= 0x000000000007FF77ULL
,
3399 .pvr
= CPU_PPC_74xP
,
3400 .pvr_mask
= 0xFFFFFFFF,
3401 .insns_flags
= PPC_INSNS_7x0
,
3402 .flags
= PPC_FLAGS_7x0
,
3403 .msr_mask
= 0x000000000007FF77ULL
,
3406 .name
= "Conan/Doyle",
3407 .pvr
= CPU_PPC_74xP
,
3408 .pvr_mask
= 0xFFFFFFFF,
3409 .insns_flags
= PPC_INSNS_7x0
,
3410 .flags
= PPC_FLAGS_7x0
,
3411 .msr_mask
= 0x000000000007FF77ULL
,
3417 .pvr
= CPU_PPC_74xP
,
3418 .pvr_mask
= 0xFFFFF000,
3419 .insns_flags
= PPC_INSNS_7x5
,
3420 .flags
= PPC_FLAGS_7x5
,
3421 .msr_mask
= 0x000000000007FF77ULL
,
3427 .pvr
= CPU_PPC_74xP
,
3428 .pvr_mask
= 0xFFFFFFFF,
3429 .insns_flags
= PPC_INSNS_7x0
,
3430 .flags
= PPC_FLAGS_7x0
,
3431 .msr_mask
= 0x000000000007FF77ULL
,
3437 .pvr
= CPU_PPC_74xP
,
3438 .pvr_mask
= 0xFFFFF000,
3439 .insns_flags
= PPC_INSNS_7x5
,
3440 .flags
= PPC_FLAGS_7x5
,
3441 .msr_mask
= 0x000000000007FF77ULL
,
3444 /* IBM 750CXe (G3 embedded) */
3447 .pvr
= CPU_PPC_750CXE
,
3448 .pvr_mask
= 0xFFFFFFFF,
3449 .insns_flags
= PPC_INSNS_7x0
,
3450 .flags
= PPC_FLAGS_7x0
,
3451 .msr_mask
= 0x000000000007FF77ULL
,
3453 /* IBM 750FX (G3 embedded) */
3456 .pvr
= CPU_PPC_750FX
,
3457 .pvr_mask
= 0xFFFFFFFF,
3458 .insns_flags
= PPC_INSNS_7x0
,
3459 .flags
= PPC_FLAGS_7x0
,
3460 .msr_mask
= 0x000000000007FF77ULL
,
3462 /* IBM 750GX (G3 embedded) */
3465 .pvr
= CPU_PPC_750GX
,
3466 .pvr_mask
= 0xFFFFFFFF,
3467 .insns_flags
= PPC_INSNS_7x0
,
3468 .flags
= PPC_FLAGS_7x0
,
3469 .msr_mask
= 0x000000000007FF77ULL
,
3475 .pvr
= CPU_PPC_7400
,
3476 .pvr_mask
= 0xFFFF0000,
3477 .insns_flags
= PPC_INSNS_74xx
,
3478 .flags
= PPC_FLAGS_74xx
,
3479 .msr_mask
= 0x000000000205FF77ULL
,
3483 /* PowerPC 7400 (G4) */
3486 .pvr
= CPU_PPC_7400
,
3487 .pvr_mask
= 0xFFFF0000,
3488 .insns_flags
= PPC_INSNS_74xx
,
3489 .flags
= PPC_FLAGS_74xx
,
3490 .msr_mask
= 0x000000000205FF77ULL
,
3494 .pvr
= CPU_PPC_7400
,
3495 .pvr_mask
= 0xFFFF0000,
3496 .insns_flags
= PPC_INSNS_74xx
,
3497 .flags
= PPC_FLAGS_74xx
,
3498 .msr_mask
= 0x000000000205FF77ULL
,
3502 /* PowerPC 7410 (G4) */
3505 .pvr
= CPU_PPC_7410
,
3506 .pvr_mask
= 0xFFFF0000,
3507 .insns_flags
= PPC_INSNS_74xx
,
3508 .flags
= PPC_FLAGS_74xx
,
3509 .msr_mask
= 0x000000000205FF77ULL
,
3513 .pvr
= CPU_PPC_7410
,
3514 .pvr_mask
= 0xFFFF0000,
3515 .insns_flags
= PPC_INSNS_74xx
,
3516 .flags
= PPC_FLAGS_74xx
,
3517 .msr_mask
= 0x000000000205FF77ULL
,
3525 /* PowerPC 7450 (G4) */
3528 .pvr
= CPU_PPC_7450
,
3529 .pvr_mask
= 0xFFFF0000,
3530 .insns_flags
= PPC_INSNS_74xx
,
3531 .flags
= PPC_FLAGS_74xx
,
3532 .msr_mask
= 0x000000000205FF77ULL
,
3536 .pvr
= CPU_PPC_7450
,
3537 .pvr_mask
= 0xFFFF0000,
3538 .insns_flags
= PPC_INSNS_74xx
,
3539 .flags
= PPC_FLAGS_74xx
,
3540 .msr_mask
= 0x000000000205FF77ULL
,
3545 /* PowerPC 7455 (G4) */
3548 .pvr
= CPU_PPC_7455
,
3549 .pvr_mask
= 0xFFFF0000,
3550 .insns_flags
= PPC_INSNS_74xx
,
3551 .flags
= PPC_FLAGS_74xx
,
3552 .msr_mask
= 0x000000000205FF77ULL
,
3556 .pvr
= CPU_PPC_7455
,
3557 .pvr_mask
= 0xFFFF0000,
3558 .insns_flags
= PPC_INSNS_74xx
,
3559 .flags
= PPC_FLAGS_74xx
,
3560 .msr_mask
= 0x000000000205FF77ULL
,
3564 /* PowerPC 7457 (G4) */
3567 .pvr
= CPU_PPC_7457
,
3568 .pvr_mask
= 0xFFFF0000,
3569 .insns_flags
= PPC_INSNS_74xx
,
3570 .flags
= PPC_FLAGS_74xx
,
3571 .msr_mask
= 0x000000000205FF77ULL
,
3575 .pvr
= CPU_PPC_7457
,
3576 .pvr_mask
= 0xFFFF0000,
3577 .insns_flags
= PPC_INSNS_74xx
,
3578 .flags
= PPC_FLAGS_74xx
,
3579 .msr_mask
= 0x000000000205FF77ULL
,
3583 /* PowerPC 7457A (G4) */
3586 .pvr
= CPU_PPC_7457A
,
3587 .pvr_mask
= 0xFFFF0000,
3588 .insns_flags
= PPC_INSNS_74xx
,
3589 .flags
= PPC_FLAGS_74xx
,
3590 .msr_mask
= 0x000000000205FF77ULL
,
3593 .name
= "Apollo 7 PM",
3594 .pvr
= CPU_PPC_7457A
,
3595 .pvr_mask
= 0xFFFF0000,
3596 .insns_flags
= PPC_INSNS_74xx
,
3597 .flags
= PPC_FLAGS_74xx
,
3598 .msr_mask
= 0x000000000205FF77ULL
,
3601 /* 64 bits PowerPC */
3602 #if defined (TARGET_PPC64)
3608 .pvr_mask
= 0xFFFF0000,
3609 .insns_flags
= PPC_INSNS_620
,
3610 .flags
= PPC_FLAGS_620
,
3611 .msr_mask
= 0x800000000005FF73ULL
,
3615 /* PowerPC 630 (POWER3) */
3619 .pvr_mask
= 0xFFFF0000,
3620 .insns_flags
= PPC_INSNS_630
,
3621 .flags
= PPC_FLAGS_630
,
3627 .pvr_mask
= 0xFFFF0000,
3628 .insns_flags
= PPC_INSNS_630
,
3629 .flags
= PPC_FLAGS_630
,
3634 /* PowerPC 631 (Power 3+)*/
3638 .pvr_mask
= 0xFFFF0000,
3639 .insns_flags
= PPC_INSNS_631
,
3640 .flags
= PPC_FLAGS_631
,
3646 .pvr_mask
= 0xFFFF0000,
3647 .insns_flags
= PPC_INSNS_631
,
3648 .flags
= PPC_FLAGS_631
,
3656 .pvr
= CPU_PPC_POWER4
,
3657 .pvr_mask
= 0xFFFF0000,
3658 .insns_flags
= PPC_INSNS_POWER4
,
3659 .flags
= PPC_FLAGS_POWER4
,
3667 .pvr
= CPU_PPC_POWER4P
,
3668 .pvr_mask
= 0xFFFF0000,
3669 .insns_flags
= PPC_INSNS_POWER4
,
3670 .flags
= PPC_FLAGS_POWER4
,
3678 .pvr
= CPU_PPC_POWER5
,
3679 .pvr_mask
= 0xFFFF0000,
3680 .insns_flags
= PPC_INSNS_POWER5
,
3681 .flags
= PPC_FLAGS_POWER5
,
3689 .pvr
= CPU_PPC_POWER5P
,
3690 .pvr_mask
= 0xFFFF0000,
3691 .insns_flags
= PPC_INSNS_POWER5
,
3692 .flags
= PPC_FLAGS_POWER5
,
3701 .pvr_mask
= 0xFFFF0000,
3702 .insns_flags
= PPC_INSNS_970
,
3703 .flags
= PPC_FLAGS_970
,
3704 .msr_mask
= 0x900000000204FF36ULL
,
3708 /* PowerPC 970FX (G5) */
3711 .pvr
= CPU_PPC_970FX
,
3712 .pvr_mask
= 0xFFFF0000,
3713 .insns_flags
= PPC_INSNS_970FX
,
3714 .flags
= PPC_FLAGS_970FX
,
3715 .msr_mask
= 0x800000000204FF36ULL
,
3719 /* RS64 (Apache/A35) */
3720 /* This one seems to support the whole POWER2 instruction set
3721 * and the PowerPC 64 one.
3725 .pvr
= CPU_PPC_RS64
,
3726 .pvr_mask
= 0xFFFF0000,
3727 .insns_flags
= PPC_INSNS_RS64
,
3728 .flags
= PPC_FLAGS_RS64
,
3733 .pvr
= CPU_PPC_RS64
,
3734 .pvr_mask
= 0xFFFF0000,
3735 .insns_flags
= PPC_INSNS_RS64
,
3736 .flags
= PPC_FLAGS_RS64
,
3741 .pvr
= CPU_PPC_RS64
,
3742 .pvr_mask
= 0xFFFF0000,
3743 .insns_flags
= PPC_INSNS_RS64
,
3744 .flags
= PPC_FLAGS_RS64
,
3749 /* RS64-II (NorthStar/A50) */
3752 .pvr
= CPU_PPC_RS64II
,
3753 .pvr_mask
= 0xFFFF0000,
3754 .insns_flags
= PPC_INSNS_RS64
,
3755 .flags
= PPC_FLAGS_RS64
,
3760 .pvr
= CPU_PPC_RS64II
,
3761 .pvr_mask
= 0xFFFF0000,
3762 .insns_flags
= PPC_INSNS_RS64
,
3763 .flags
= PPC_FLAGS_RS64
,
3768 .pvr
= CPU_PPC_RS64II
,
3769 .pvr_mask
= 0xFFFF0000,
3770 .insns_flags
= PPC_INSNS_RS64
,
3771 .flags
= PPC_FLAGS_RS64
,
3776 /* RS64-III (Pulsar) */
3779 .pvr
= CPU_PPC_RS64III
,
3780 .pvr_mask
= 0xFFFF0000,
3781 .insns_flags
= PPC_INSNS_RS64
,
3782 .flags
= PPC_FLAGS_RS64
,
3787 .pvr
= CPU_PPC_RS64III
,
3788 .pvr_mask
= 0xFFFF0000,
3789 .insns_flags
= PPC_INSNS_RS64
,
3790 .flags
= PPC_FLAGS_RS64
,
3795 /* RS64-IV (IceStar/IStar/SStar) */
3798 .pvr
= CPU_PPC_RS64IV
,
3799 .pvr_mask
= 0xFFFF0000,
3800 .insns_flags
= PPC_INSNS_RS64
,
3801 .flags
= PPC_FLAGS_RS64
,
3806 .pvr
= CPU_PPC_RS64IV
,
3807 .pvr_mask
= 0xFFFF0000,
3808 .insns_flags
= PPC_INSNS_RS64
,
3809 .flags
= PPC_FLAGS_RS64
,
3814 .pvr
= CPU_PPC_RS64IV
,
3815 .pvr_mask
= 0xFFFF0000,
3816 .insns_flags
= PPC_INSNS_RS64
,
3817 .flags
= PPC_FLAGS_RS64
,
3822 .pvr
= CPU_PPC_RS64IV
,
3823 .pvr_mask
= 0xFFFF0000,
3824 .insns_flags
= PPC_INSNS_RS64
,
3825 .flags
= PPC_FLAGS_RS64
,
3831 /* Original POWER */
3835 .pvr_mask
= 0xFFFF0000,
3836 .insns_flags
= PPC_INSNS_POWER
,
3837 .flags
= PPC_FLAGS_POWER
,
3841 #endif /* defined (TARGET_PPC64) */
3847 .pvr_mask
= 0xFFFF0000,
3848 .insns_flags
= PPC_INSNS_POWER
,
3849 .flags
= PPC_FLAGS_POWER
,
3853 /* Generic PowerPCs */
3858 .pvr_mask
= 0xFFFF0000,
3859 .insns_flags
= PPC_INSNS_PPC64
,
3860 .flags
= PPC_FLAGS_PPC64
,
3861 .msr_mask
= 0xA00000000204FF36ULL
,
3867 .pvr_mask
= 0xFFFFFFFF,
3868 .insns_flags
= PPC_INSNS_PPC32
,
3869 .flags
= PPC_FLAGS_PPC32
,
3870 .msr_mask
= 0x000000000005FF77ULL
,
3876 .pvr_mask
= 0xFFFFFFFF,
3877 .insns_flags
= PPC_INSNS_PPC32
,
3878 .flags
= PPC_FLAGS_PPC32
,
3879 .msr_mask
= 0x000000000005FF77ULL
,
3883 int ppc_find_by_name (const unsigned char *name
, ppc_def_t
**def
)
3889 for (i
= 0; strcmp(ppc_defs
[i
].name
, "ppc") != 0; i
++) {
3890 if (strcasecmp(name
, ppc_defs
[i
].name
) == 0) {
3891 *def
= &ppc_defs
[i
];
3900 int ppc_find_by_pvr (uint32_t pvr
, ppc_def_t
**def
)
3906 for (i
= 0; ppc_defs
[i
].name
!= NULL
; i
++) {
3907 if ((pvr
& ppc_defs
[i
].pvr_mask
) ==
3908 (ppc_defs
[i
].pvr
& ppc_defs
[i
].pvr_mask
)) {
3909 *def
= &ppc_defs
[i
];
3918 void ppc_cpu_list (FILE *f
, int (*cpu_fprintf
)(FILE *f
, const char *fmt
, ...))
3922 for (i
= 0; ; i
++) {
3923 (*cpu_fprintf
)(f
, "PowerPC %16s PVR %08x mask %08x\n",
3925 ppc_defs
[i
].pvr
, ppc_defs
[i
].pvr_mask
);
3926 if (strcmp(ppc_defs
[i
].name
, "ppc") == 0)