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
30 const unsigned char *name
;
39 * do nothing but store/retrieve spr value
41 static void spr_read_generic (void *opaque
, int sprn
)
43 gen_op_load_spr(sprn
);
46 static void spr_write_generic (void *opaque
, int sprn
)
48 gen_op_store_spr(sprn
);
51 /* SPR common to all PowerPC */
53 static void spr_read_xer (void *opaque
, int sprn
)
58 static void spr_write_xer (void *opaque
, int sprn
)
64 static void spr_read_lr (void *opaque
, int sprn
)
69 static void spr_write_lr (void *opaque
, int sprn
)
75 static void spr_read_ctr (void *opaque
, int sprn
)
80 static void spr_write_ctr (void *opaque
, int sprn
)
85 /* User read access to SPR */
91 static void spr_read_ureg (void *opaque
, int sprn
)
93 gen_op_load_spr(sprn
+ 0x10);
96 /* SPR common to all non-embedded PowerPC */
98 #if !defined(CONFIG_USER_ONLY)
99 static void spr_read_decr (void *opaque
, int sprn
)
104 static void spr_write_decr (void *opaque
, int sprn
)
110 /* SPR common to all non-embedded PowerPC, except 601 */
112 static void spr_read_tbl (void *opaque
, int sprn
)
117 static void spr_read_tbu (void *opaque
, int sprn
)
122 #if !defined(CONFIG_USER_ONLY)
123 static void spr_write_tbl (void *opaque
, int sprn
)
128 static void spr_write_tbu (void *opaque
, int sprn
)
134 #if !defined(CONFIG_USER_ONLY)
135 /* IBAT0U...IBAT0U */
136 /* IBAT0L...IBAT7L */
137 static void spr_read_ibat (void *opaque
, int sprn
)
139 gen_op_load_ibat(sprn
& 1, (sprn
- SPR_IBAT0U
) / 2);
142 static void spr_read_ibat_h (void *opaque
, int sprn
)
144 gen_op_load_ibat(sprn
& 1, (sprn
- SPR_IBAT4U
) / 2);
147 static void spr_write_ibatu (void *opaque
, int sprn
)
149 DisasContext
*ctx
= opaque
;
151 gen_op_store_ibatu((sprn
- SPR_IBAT0U
) / 2);
155 static void spr_write_ibatu_h (void *opaque
, int sprn
)
157 DisasContext
*ctx
= opaque
;
159 gen_op_store_ibatu((sprn
- SPR_IBAT4U
) / 2);
163 static void spr_write_ibatl (void *opaque
, int sprn
)
165 DisasContext
*ctx
= opaque
;
167 gen_op_store_ibatl((sprn
- SPR_IBAT0L
) / 2);
171 static void spr_write_ibatl_h (void *opaque
, int sprn
)
173 DisasContext
*ctx
= opaque
;
175 gen_op_store_ibatl((sprn
- SPR_IBAT4L
) / 2);
179 /* DBAT0U...DBAT7U */
180 /* DBAT0L...DBAT7L */
181 static void spr_read_dbat (void *opaque
, int sprn
)
183 gen_op_load_dbat(sprn
& 1, (sprn
- SPR_DBAT0U
) / 2);
186 static void spr_read_dbat_h (void *opaque
, int sprn
)
188 gen_op_load_dbat(sprn
& 1, (sprn
- SPR_DBAT4U
) / 2);
191 static void spr_write_dbatu (void *opaque
, int sprn
)
193 DisasContext
*ctx
= opaque
;
195 gen_op_store_dbatu((sprn
- SPR_DBAT0U
) / 2);
199 static void spr_write_dbatu_h (void *opaque
, int sprn
)
201 DisasContext
*ctx
= opaque
;
203 gen_op_store_dbatu((sprn
- SPR_DBAT4U
) / 2);
207 static void spr_write_dbatl (void *opaque
, int sprn
)
209 DisasContext
*ctx
= opaque
;
211 gen_op_store_dbatl((sprn
- SPR_DBAT0L
) / 2);
215 static void spr_write_dbatl_h (void *opaque
, int sprn
)
217 DisasContext
*ctx
= opaque
;
219 gen_op_store_dbatl((sprn
- SPR_DBAT4L
) / 2);
224 static void spr_read_sdr1 (void *opaque
, int sprn
)
229 static void spr_write_sdr1 (void *opaque
, int sprn
)
231 DisasContext
*ctx
= opaque
;
237 /* 64 bits PowerPC specific SPRs */
239 #if defined(TARGET_PPC64)
240 static void spr_read_asr (void *opaque
, int sprn
)
245 static void spr_write_asr (void *opaque
, int sprn
)
247 DisasContext
*ctx
= opaque
;
253 #endif /* !defined(CONFIG_USER_ONLY) */
255 /* PowerPC 601 specific registers */
257 static void spr_read_601_rtcl (void *opaque
, int sprn
)
259 gen_op_load_601_rtcl();
262 static void spr_read_601_rtcu (void *opaque
, int sprn
)
264 gen_op_load_601_rtcu();
267 #if !defined(CONFIG_USER_ONLY)
268 static void spr_write_601_rtcu (void *opaque
, int sprn
)
270 gen_op_store_601_rtcu();
273 static void spr_write_601_rtcl (void *opaque
, int sprn
)
275 gen_op_store_601_rtcl();
280 #if !defined(CONFIG_USER_ONLY)
281 static void spr_read_601_ubat (void *opaque
, int sprn
)
283 gen_op_load_601_bat(sprn
& 1, (sprn
- SPR_IBAT0U
) / 2);
286 static void spr_write_601_ubatu (void *opaque
, int sprn
)
288 DisasContext
*ctx
= opaque
;
290 gen_op_store_601_batu((sprn
- SPR_IBAT0U
) / 2);
294 static void spr_write_601_ubatl (void *opaque
, int sprn
)
296 DisasContext
*ctx
= opaque
;
298 gen_op_store_601_batl((sprn
- SPR_IBAT0L
) / 2);
303 /* PowerPC 40x specific registers */
304 #if !defined(CONFIG_USER_ONLY)
305 static void spr_read_40x_pit (void *opaque
, int sprn
)
307 gen_op_load_40x_pit();
310 static void spr_write_40x_pit (void *opaque
, int sprn
)
312 gen_op_store_40x_pit();
315 static void spr_write_booke_tcr (void *opaque
, int sprn
)
317 gen_op_store_booke_tcr();
320 static void spr_write_booke_tsr (void *opaque
, int sprn
)
322 gen_op_store_booke_tsr();
326 /* PowerPC 403 specific registers */
327 /* PBL1 / PBU1 / PBL2 / PBU2 */
328 #if !defined(CONFIG_USER_ONLY)
329 static void spr_read_403_pbr (void *opaque
, int sprn
)
331 gen_op_load_403_pb(sprn
- SPR_403_PBL1
);
334 static void spr_write_403_pbr (void *opaque
, int sprn
)
336 DisasContext
*ctx
= opaque
;
338 gen_op_store_403_pb(sprn
- SPR_403_PBL1
);
342 static void spr_write_pir (void *opaque
, int sprn
)
348 #if defined(CONFIG_USER_ONLY)
349 #define spr_register(env, num, name, uea_read, uea_write, \
350 oea_read, oea_write, initial_value) \
352 _spr_register(env, num, name, uea_read, uea_write, initial_value); \
354 static inline void _spr_register (CPUPPCState
*env
, int num
,
355 const unsigned char *name
,
356 void (*uea_read
)(void *opaque
, int sprn
),
357 void (*uea_write
)(void *opaque
, int sprn
),
358 target_ulong initial_value
)
360 static inline void spr_register (CPUPPCState
*env
, int num
,
361 const unsigned char *name
,
362 void (*uea_read
)(void *opaque
, int sprn
),
363 void (*uea_write
)(void *opaque
, int sprn
),
364 void (*oea_read
)(void *opaque
, int sprn
),
365 void (*oea_write
)(void *opaque
, int sprn
),
366 target_ulong initial_value
)
371 spr
= &env
->spr_cb
[num
];
372 if (spr
->name
!= NULL
||env
-> spr
[num
] != 0x00000000 ||
373 #if !defined(CONFIG_USER_ONLY)
374 spr
->oea_read
!= NULL
|| spr
->oea_write
!= NULL
||
376 spr
->uea_read
!= NULL
|| spr
->uea_write
!= NULL
) {
377 printf("Error: Trying to register SPR %d (%03x) twice !\n", num
, num
);
380 #if defined(PPC_DEBUG_SPR)
381 printf("*** register spr %d (%03x) %s val " ADDRX
"\n", num
, num
, name
,
385 spr
->uea_read
= uea_read
;
386 spr
->uea_write
= uea_write
;
387 #if !defined(CONFIG_USER_ONLY)
388 spr
->oea_read
= oea_read
;
389 spr
->oea_write
= oea_write
;
391 env
->spr
[num
] = initial_value
;
394 /* Generic PowerPC SPRs */
395 static void gen_spr_generic (CPUPPCState
*env
)
397 /* Integer processing */
398 spr_register(env
, SPR_XER
, "XER",
399 &spr_read_xer
, &spr_write_xer
,
400 &spr_read_xer
, &spr_write_xer
,
403 spr_register(env
, SPR_LR
, "LR",
404 &spr_read_lr
, &spr_write_lr
,
405 &spr_read_lr
, &spr_write_lr
,
407 spr_register(env
, SPR_CTR
, "CTR",
408 &spr_read_ctr
, &spr_write_ctr
,
409 &spr_read_ctr
, &spr_write_ctr
,
411 /* Interrupt processing */
412 spr_register(env
, SPR_SRR0
, "SRR0",
413 SPR_NOACCESS
, SPR_NOACCESS
,
414 &spr_read_generic
, &spr_write_generic
,
416 spr_register(env
, SPR_SRR1
, "SRR1",
417 SPR_NOACCESS
, SPR_NOACCESS
,
418 &spr_read_generic
, &spr_write_generic
,
420 /* Processor control */
421 spr_register(env
, SPR_SPRG0
, "SPRG0",
422 SPR_NOACCESS
, SPR_NOACCESS
,
423 &spr_read_generic
, &spr_write_generic
,
425 spr_register(env
, SPR_SPRG1
, "SPRG1",
426 SPR_NOACCESS
, SPR_NOACCESS
,
427 &spr_read_generic
, &spr_write_generic
,
429 spr_register(env
, SPR_SPRG2
, "SPRG2",
430 SPR_NOACCESS
, SPR_NOACCESS
,
431 &spr_read_generic
, &spr_write_generic
,
433 spr_register(env
, SPR_SPRG3
, "SPRG3",
434 SPR_NOACCESS
, SPR_NOACCESS
,
435 &spr_read_generic
, &spr_write_generic
,
439 /* SPR common to all non-embedded PowerPC, including 601 */
440 static void gen_spr_ne_601 (CPUPPCState
*env
)
442 /* Exception processing */
443 spr_register(env
, SPR_DSISR
, "DSISR",
444 SPR_NOACCESS
, SPR_NOACCESS
,
445 &spr_read_generic
, &spr_write_generic
,
447 spr_register(env
, SPR_DAR
, "DAR",
448 SPR_NOACCESS
, SPR_NOACCESS
,
449 &spr_read_generic
, &spr_write_generic
,
452 spr_register(env
, SPR_DECR
, "DECR",
453 SPR_NOACCESS
, SPR_NOACCESS
,
454 &spr_read_decr
, &spr_write_decr
,
456 /* Memory management */
457 spr_register(env
, SPR_SDR1
, "SDR1",
458 SPR_NOACCESS
, SPR_NOACCESS
,
459 &spr_read_sdr1
, &spr_write_sdr1
,
464 static void gen_low_BATs (CPUPPCState
*env
)
466 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
467 SPR_NOACCESS
, SPR_NOACCESS
,
468 &spr_read_ibat
, &spr_write_ibatu
,
470 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
471 SPR_NOACCESS
, SPR_NOACCESS
,
472 &spr_read_ibat
, &spr_write_ibatl
,
474 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
475 SPR_NOACCESS
, SPR_NOACCESS
,
476 &spr_read_ibat
, &spr_write_ibatu
,
478 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
479 SPR_NOACCESS
, SPR_NOACCESS
,
480 &spr_read_ibat
, &spr_write_ibatl
,
482 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
483 SPR_NOACCESS
, SPR_NOACCESS
,
484 &spr_read_ibat
, &spr_write_ibatu
,
486 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
487 SPR_NOACCESS
, SPR_NOACCESS
,
488 &spr_read_ibat
, &spr_write_ibatl
,
490 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
491 SPR_NOACCESS
, SPR_NOACCESS
,
492 &spr_read_ibat
, &spr_write_ibatu
,
494 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
495 SPR_NOACCESS
, SPR_NOACCESS
,
496 &spr_read_ibat
, &spr_write_ibatl
,
498 spr_register(env
, SPR_DBAT0U
, "DBAT0U",
499 SPR_NOACCESS
, SPR_NOACCESS
,
500 &spr_read_dbat
, &spr_write_dbatu
,
502 spr_register(env
, SPR_DBAT0L
, "DBAT0L",
503 SPR_NOACCESS
, SPR_NOACCESS
,
504 &spr_read_dbat
, &spr_write_dbatl
,
506 spr_register(env
, SPR_DBAT1U
, "DBAT1U",
507 SPR_NOACCESS
, SPR_NOACCESS
,
508 &spr_read_dbat
, &spr_write_dbatu
,
510 spr_register(env
, SPR_DBAT1L
, "DBAT1L",
511 SPR_NOACCESS
, SPR_NOACCESS
,
512 &spr_read_dbat
, &spr_write_dbatl
,
514 spr_register(env
, SPR_DBAT2U
, "DBAT2U",
515 SPR_NOACCESS
, SPR_NOACCESS
,
516 &spr_read_dbat
, &spr_write_dbatu
,
518 spr_register(env
, SPR_DBAT2L
, "DBAT2L",
519 SPR_NOACCESS
, SPR_NOACCESS
,
520 &spr_read_dbat
, &spr_write_dbatl
,
522 spr_register(env
, SPR_DBAT3U
, "DBAT3U",
523 SPR_NOACCESS
, SPR_NOACCESS
,
524 &spr_read_dbat
, &spr_write_dbatu
,
526 spr_register(env
, SPR_DBAT3L
, "DBAT3L",
527 SPR_NOACCESS
, SPR_NOACCESS
,
528 &spr_read_dbat
, &spr_write_dbatl
,
534 static void gen_high_BATs (CPUPPCState
*env
)
536 spr_register(env
, SPR_IBAT4U
, "IBAT4U",
537 SPR_NOACCESS
, SPR_NOACCESS
,
538 &spr_read_ibat_h
, &spr_write_ibatu_h
,
540 spr_register(env
, SPR_IBAT4L
, "IBAT4L",
541 SPR_NOACCESS
, SPR_NOACCESS
,
542 &spr_read_ibat_h
, &spr_write_ibatl_h
,
544 spr_register(env
, SPR_IBAT5U
, "IBAT5U",
545 SPR_NOACCESS
, SPR_NOACCESS
,
546 &spr_read_ibat_h
, &spr_write_ibatu_h
,
548 spr_register(env
, SPR_IBAT5L
, "IBAT5L",
549 SPR_NOACCESS
, SPR_NOACCESS
,
550 &spr_read_ibat_h
, &spr_write_ibatl_h
,
552 spr_register(env
, SPR_IBAT6U
, "IBAT6U",
553 SPR_NOACCESS
, SPR_NOACCESS
,
554 &spr_read_ibat_h
, &spr_write_ibatu_h
,
556 spr_register(env
, SPR_IBAT6L
, "IBAT6L",
557 SPR_NOACCESS
, SPR_NOACCESS
,
558 &spr_read_ibat_h
, &spr_write_ibatl_h
,
560 spr_register(env
, SPR_IBAT7U
, "IBAT7U",
561 SPR_NOACCESS
, SPR_NOACCESS
,
562 &spr_read_ibat_h
, &spr_write_ibatu_h
,
564 spr_register(env
, SPR_IBAT7L
, "IBAT7L",
565 SPR_NOACCESS
, SPR_NOACCESS
,
566 &spr_read_ibat_h
, &spr_write_ibatl_h
,
568 spr_register(env
, SPR_DBAT4U
, "DBAT4U",
569 SPR_NOACCESS
, SPR_NOACCESS
,
570 &spr_read_dbat_h
, &spr_write_dbatu_h
,
572 spr_register(env
, SPR_DBAT4L
, "DBAT4L",
573 SPR_NOACCESS
, SPR_NOACCESS
,
574 &spr_read_dbat_h
, &spr_write_dbatl_h
,
576 spr_register(env
, SPR_DBAT5U
, "DBAT5U",
577 SPR_NOACCESS
, SPR_NOACCESS
,
578 &spr_read_dbat_h
, &spr_write_dbatu_h
,
580 spr_register(env
, SPR_DBAT5L
, "DBAT5L",
581 SPR_NOACCESS
, SPR_NOACCESS
,
582 &spr_read_dbat_h
, &spr_write_dbatl_h
,
584 spr_register(env
, SPR_DBAT6U
, "DBAT6U",
585 SPR_NOACCESS
, SPR_NOACCESS
,
586 &spr_read_dbat_h
, &spr_write_dbatu_h
,
588 spr_register(env
, SPR_DBAT6L
, "DBAT6L",
589 SPR_NOACCESS
, SPR_NOACCESS
,
590 &spr_read_dbat_h
, &spr_write_dbatl_h
,
592 spr_register(env
, SPR_DBAT7U
, "DBAT7U",
593 SPR_NOACCESS
, SPR_NOACCESS
,
594 &spr_read_dbat_h
, &spr_write_dbatu_h
,
596 spr_register(env
, SPR_DBAT7L
, "DBAT7L",
597 SPR_NOACCESS
, SPR_NOACCESS
,
598 &spr_read_dbat_h
, &spr_write_dbatl_h
,
603 /* Generic PowerPC time base */
604 static void gen_tbl (CPUPPCState
*env
)
606 spr_register(env
, SPR_VTBL
, "TBL",
607 &spr_read_tbl
, SPR_NOACCESS
,
608 &spr_read_tbl
, SPR_NOACCESS
,
610 spr_register(env
, SPR_TBL
, "TBL",
611 SPR_NOACCESS
, SPR_NOACCESS
,
612 SPR_NOACCESS
, &spr_write_tbl
,
614 spr_register(env
, SPR_VTBU
, "TBU",
615 &spr_read_tbu
, SPR_NOACCESS
,
616 &spr_read_tbu
, SPR_NOACCESS
,
618 spr_register(env
, SPR_TBU
, "TBU",
619 SPR_NOACCESS
, SPR_NOACCESS
,
620 SPR_NOACCESS
, &spr_write_tbu
,
624 /* Softare table search registers */
625 static void gen_6xx_7xx_soft_tlb (CPUPPCState
*env
, int nb_tlbs
, int nb_ways
)
627 env
->nb_tlb
= nb_tlbs
;
628 env
->nb_ways
= nb_ways
;
630 spr_register(env
, SPR_DMISS
, "DMISS",
631 SPR_NOACCESS
, SPR_NOACCESS
,
632 &spr_read_generic
, SPR_NOACCESS
,
634 spr_register(env
, SPR_DCMP
, "DCMP",
635 SPR_NOACCESS
, SPR_NOACCESS
,
636 &spr_read_generic
, SPR_NOACCESS
,
638 spr_register(env
, SPR_HASH1
, "HASH1",
639 SPR_NOACCESS
, SPR_NOACCESS
,
640 &spr_read_generic
, SPR_NOACCESS
,
642 spr_register(env
, SPR_HASH2
, "HASH2",
643 SPR_NOACCESS
, SPR_NOACCESS
,
644 &spr_read_generic
, SPR_NOACCESS
,
646 spr_register(env
, SPR_IMISS
, "IMISS",
647 SPR_NOACCESS
, SPR_NOACCESS
,
648 &spr_read_generic
, SPR_NOACCESS
,
650 spr_register(env
, SPR_ICMP
, "ICMP",
651 SPR_NOACCESS
, SPR_NOACCESS
,
652 &spr_read_generic
, SPR_NOACCESS
,
654 spr_register(env
, SPR_RPA
, "RPA",
655 SPR_NOACCESS
, SPR_NOACCESS
,
656 &spr_read_generic
, &spr_write_generic
,
660 /* SPR common to MPC755 and G2 */
661 static void gen_spr_G2_755 (CPUPPCState
*env
)
664 spr_register(env
, SPR_SPRG4
, "SPRG4",
665 SPR_NOACCESS
, SPR_NOACCESS
,
666 &spr_read_generic
, &spr_write_generic
,
668 spr_register(env
, SPR_SPRG5
, "SPRG5",
669 SPR_NOACCESS
, SPR_NOACCESS
,
670 &spr_read_generic
, &spr_write_generic
,
672 spr_register(env
, SPR_SPRG6
, "SPRG6",
673 SPR_NOACCESS
, SPR_NOACCESS
,
674 &spr_read_generic
, &spr_write_generic
,
676 spr_register(env
, SPR_SPRG7
, "SPRG7",
677 SPR_NOACCESS
, SPR_NOACCESS
,
678 &spr_read_generic
, &spr_write_generic
,
680 /* External access control */
681 /* XXX : not implemented */
682 spr_register(env
, SPR_EAR
, "EAR",
683 SPR_NOACCESS
, SPR_NOACCESS
,
684 &spr_read_generic
, &spr_write_generic
,
688 /* SPR common to all 7xx PowerPC implementations */
689 static void gen_spr_7xx (CPUPPCState
*env
)
692 /* XXX : not implemented */
693 spr_register(env
, SPR_DABR
, "DABR",
694 SPR_NOACCESS
, SPR_NOACCESS
,
695 &spr_read_generic
, &spr_write_generic
,
697 /* XXX : not implemented */
698 spr_register(env
, SPR_IABR
, "IABR",
699 SPR_NOACCESS
, SPR_NOACCESS
,
700 &spr_read_generic
, &spr_write_generic
,
702 /* Cache management */
703 /* XXX : not implemented */
704 spr_register(env
, SPR_ICTC
, "ICTC",
705 SPR_NOACCESS
, SPR_NOACCESS
,
706 &spr_read_generic
, &spr_write_generic
,
708 /* XXX : not implemented */
709 spr_register(env
, SPR_L2CR
, "L2CR",
710 SPR_NOACCESS
, SPR_NOACCESS
,
711 &spr_read_generic
, &spr_write_generic
,
713 /* Performance monitors */
714 /* XXX : not implemented */
715 spr_register(env
, SPR_MMCR0
, "MMCR0",
716 SPR_NOACCESS
, SPR_NOACCESS
,
717 &spr_read_generic
, &spr_write_generic
,
719 /* XXX : not implemented */
720 spr_register(env
, SPR_MMCR1
, "MMCR1",
721 SPR_NOACCESS
, SPR_NOACCESS
,
722 &spr_read_generic
, &spr_write_generic
,
724 /* XXX : not implemented */
725 spr_register(env
, SPR_PMC1
, "PMC1",
726 SPR_NOACCESS
, SPR_NOACCESS
,
727 &spr_read_generic
, &spr_write_generic
,
729 /* XXX : not implemented */
730 spr_register(env
, SPR_PMC2
, "PMC2",
731 SPR_NOACCESS
, SPR_NOACCESS
,
732 &spr_read_generic
, &spr_write_generic
,
734 /* XXX : not implemented */
735 spr_register(env
, SPR_PMC3
, "PMC3",
736 SPR_NOACCESS
, SPR_NOACCESS
,
737 &spr_read_generic
, &spr_write_generic
,
739 /* XXX : not implemented */
740 spr_register(env
, SPR_PMC4
, "PMC4",
741 SPR_NOACCESS
, SPR_NOACCESS
,
742 &spr_read_generic
, &spr_write_generic
,
744 /* XXX : not implemented */
745 spr_register(env
, SPR_SIA
, "SIA",
746 SPR_NOACCESS
, SPR_NOACCESS
,
747 &spr_read_generic
, SPR_NOACCESS
,
749 spr_register(env
, SPR_UMMCR0
, "UMMCR0",
750 &spr_read_ureg
, SPR_NOACCESS
,
751 &spr_read_ureg
, SPR_NOACCESS
,
753 spr_register(env
, SPR_UMMCR1
, "UMMCR1",
754 &spr_read_ureg
, SPR_NOACCESS
,
755 &spr_read_ureg
, SPR_NOACCESS
,
757 spr_register(env
, SPR_UPMC1
, "UPMC1",
758 &spr_read_ureg
, SPR_NOACCESS
,
759 &spr_read_ureg
, SPR_NOACCESS
,
761 spr_register(env
, SPR_UPMC2
, "UPMC2",
762 &spr_read_ureg
, SPR_NOACCESS
,
763 &spr_read_ureg
, SPR_NOACCESS
,
765 spr_register(env
, SPR_UPMC3
, "UPMC3",
766 &spr_read_ureg
, SPR_NOACCESS
,
767 &spr_read_ureg
, SPR_NOACCESS
,
769 spr_register(env
, SPR_UPMC4
, "UPMC4",
770 &spr_read_ureg
, SPR_NOACCESS
,
771 &spr_read_ureg
, SPR_NOACCESS
,
773 spr_register(env
, SPR_USIA
, "USIA",
774 &spr_read_ureg
, SPR_NOACCESS
,
775 &spr_read_ureg
, SPR_NOACCESS
,
777 /* Thermal management */
778 /* XXX : not implemented */
779 spr_register(env
, SPR_THRM1
, "THRM1",
780 SPR_NOACCESS
, SPR_NOACCESS
,
781 &spr_read_generic
, &spr_write_generic
,
783 /* XXX : not implemented */
784 spr_register(env
, SPR_THRM2
, "THRM2",
785 SPR_NOACCESS
, SPR_NOACCESS
,
786 &spr_read_generic
, &spr_write_generic
,
788 /* XXX : not implemented */
789 spr_register(env
, SPR_THRM3
, "THRM3",
790 SPR_NOACCESS
, SPR_NOACCESS
,
791 &spr_read_generic
, &spr_write_generic
,
793 /* External access control */
794 /* XXX : not implemented */
795 spr_register(env
, SPR_EAR
, "EAR",
796 SPR_NOACCESS
, SPR_NOACCESS
,
797 &spr_read_generic
, &spr_write_generic
,
801 /* SPR specific to PowerPC 604 implementation */
802 static void gen_spr_604 (CPUPPCState
*env
)
804 /* Processor identification */
805 spr_register(env
, SPR_PIR
, "PIR",
806 SPR_NOACCESS
, SPR_NOACCESS
,
807 &spr_read_generic
, &spr_write_pir
,
810 /* XXX : not implemented */
811 spr_register(env
, SPR_IABR
, "IABR",
812 SPR_NOACCESS
, SPR_NOACCESS
,
813 &spr_read_generic
, &spr_write_generic
,
815 /* XXX : not implemented */
816 spr_register(env
, SPR_DABR
, "DABR",
817 SPR_NOACCESS
, SPR_NOACCESS
,
818 &spr_read_generic
, &spr_write_generic
,
820 /* Performance counters */
821 /* XXX : not implemented */
822 spr_register(env
, SPR_MMCR0
, "MMCR0",
823 SPR_NOACCESS
, SPR_NOACCESS
,
824 &spr_read_generic
, &spr_write_generic
,
826 /* XXX : not implemented */
827 spr_register(env
, SPR_MMCR1
, "MMCR1",
828 SPR_NOACCESS
, SPR_NOACCESS
,
829 &spr_read_generic
, &spr_write_generic
,
831 /* XXX : not implemented */
832 spr_register(env
, SPR_PMC1
, "PMC1",
833 SPR_NOACCESS
, SPR_NOACCESS
,
834 &spr_read_generic
, &spr_write_generic
,
836 /* XXX : not implemented */
837 spr_register(env
, SPR_PMC2
, "PMC2",
838 SPR_NOACCESS
, SPR_NOACCESS
,
839 &spr_read_generic
, &spr_write_generic
,
841 /* XXX : not implemented */
842 spr_register(env
, SPR_PMC3
, "PMC3",
843 SPR_NOACCESS
, SPR_NOACCESS
,
844 &spr_read_generic
, &spr_write_generic
,
846 /* XXX : not implemented */
847 spr_register(env
, SPR_PMC4
, "PMC4",
848 SPR_NOACCESS
, SPR_NOACCESS
,
849 &spr_read_generic
, &spr_write_generic
,
851 /* XXX : not implemented */
852 spr_register(env
, SPR_SIA
, "SIA",
853 SPR_NOACCESS
, SPR_NOACCESS
,
854 &spr_read_generic
, SPR_NOACCESS
,
856 /* XXX : not implemented */
857 spr_register(env
, SPR_SDA
, "SDA",
858 SPR_NOACCESS
, SPR_NOACCESS
,
859 &spr_read_generic
, SPR_NOACCESS
,
861 /* External access control */
862 /* XXX : not implemented */
863 spr_register(env
, SPR_EAR
, "EAR",
864 SPR_NOACCESS
, SPR_NOACCESS
,
865 &spr_read_generic
, &spr_write_generic
,
869 /* SPR specific to PowerPC 603 implementation */
870 static void gen_spr_603 (CPUPPCState
*env
)
872 /* External access control */
873 /* XXX : not implemented */
874 spr_register(env
, SPR_EAR
, "EAR",
875 SPR_NOACCESS
, SPR_NOACCESS
,
876 &spr_read_generic
, &spr_write_generic
,
880 /* SPR specific to PowerPC G2 implementation */
881 static void gen_spr_G2 (CPUPPCState
*env
)
883 /* Memory base address */
885 spr_register(env
, SPR_MBAR
, "MBAR",
886 SPR_NOACCESS
, SPR_NOACCESS
,
887 &spr_read_generic
, &spr_write_generic
,
889 /* System version register */
891 spr_register(env
, SPR_SVR
, "SVR",
892 SPR_NOACCESS
, SPR_NOACCESS
,
893 &spr_read_generic
, SPR_NOACCESS
,
895 /* Exception processing */
896 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
897 SPR_NOACCESS
, SPR_NOACCESS
,
898 &spr_read_generic
, &spr_write_generic
,
900 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
901 SPR_NOACCESS
, SPR_NOACCESS
,
902 &spr_read_generic
, &spr_write_generic
,
905 /* XXX : not implemented */
906 spr_register(env
, SPR_DABR
, "DABR",
907 SPR_NOACCESS
, SPR_NOACCESS
,
908 &spr_read_generic
, &spr_write_generic
,
910 /* XXX : not implemented */
911 spr_register(env
, SPR_DABR2
, "DABR2",
912 SPR_NOACCESS
, SPR_NOACCESS
,
913 &spr_read_generic
, &spr_write_generic
,
915 /* XXX : not implemented */
916 spr_register(env
, SPR_IABR
, "IABR",
917 SPR_NOACCESS
, SPR_NOACCESS
,
918 &spr_read_generic
, &spr_write_generic
,
920 /* XXX : not implemented */
921 spr_register(env
, SPR_IABR2
, "IABR2",
922 SPR_NOACCESS
, SPR_NOACCESS
,
923 &spr_read_generic
, &spr_write_generic
,
925 /* XXX : not implemented */
926 spr_register(env
, SPR_IBCR
, "IBCR",
927 SPR_NOACCESS
, SPR_NOACCESS
,
928 &spr_read_generic
, &spr_write_generic
,
930 /* XXX : not implemented */
931 spr_register(env
, SPR_DBCR
, "DBCR",
932 SPR_NOACCESS
, SPR_NOACCESS
,
933 &spr_read_generic
, &spr_write_generic
,
937 /* SPR specific to PowerPC 602 implementation */
938 static void gen_spr_602 (CPUPPCState
*env
)
941 /* XXX : not implemented */
942 spr_register(env
, SPR_SER
, "SER",
943 SPR_NOACCESS
, SPR_NOACCESS
,
944 &spr_read_generic
, &spr_write_generic
,
946 /* XXX : not implemented */
947 spr_register(env
, SPR_SEBR
, "SEBR",
948 SPR_NOACCESS
, SPR_NOACCESS
,
949 &spr_read_generic
, &spr_write_generic
,
951 /* XXX : not implemented */
952 spr_register(env
, SPR_ESASR
, "ESASR",
953 SPR_NOACCESS
, SPR_NOACCESS
,
954 &spr_read_generic
, &spr_write_generic
,
956 /* Floating point status */
957 /* XXX : not implemented */
958 spr_register(env
, SPR_SP
, "SP",
959 SPR_NOACCESS
, SPR_NOACCESS
,
960 &spr_read_generic
, &spr_write_generic
,
962 /* XXX : not implemented */
963 spr_register(env
, SPR_LT
, "LT",
964 SPR_NOACCESS
, SPR_NOACCESS
,
965 &spr_read_generic
, &spr_write_generic
,
968 /* XXX : not implemented */
969 spr_register(env
, SPR_TCR
, "TCR",
970 SPR_NOACCESS
, SPR_NOACCESS
,
971 &spr_read_generic
, &spr_write_generic
,
974 spr_register(env
, SPR_IBR
, "IBR",
975 SPR_NOACCESS
, SPR_NOACCESS
,
976 &spr_read_generic
, &spr_write_generic
,
980 /* SPR specific to PowerPC 601 implementation */
981 static void gen_spr_601 (CPUPPCState
*env
)
983 /* Multiplication/division register */
985 spr_register(env
, SPR_MQ
, "MQ",
986 &spr_read_generic
, &spr_write_generic
,
987 &spr_read_generic
, &spr_write_generic
,
990 spr_register(env
, SPR_601_RTCU
, "RTCU",
991 SPR_NOACCESS
, SPR_NOACCESS
,
992 SPR_NOACCESS
, &spr_write_601_rtcu
,
994 spr_register(env
, SPR_601_VRTCU
, "RTCU",
995 &spr_read_601_rtcu
, SPR_NOACCESS
,
996 &spr_read_601_rtcu
, SPR_NOACCESS
,
998 spr_register(env
, SPR_601_RTCL
, "RTCL",
999 SPR_NOACCESS
, SPR_NOACCESS
,
1000 SPR_NOACCESS
, &spr_write_601_rtcl
,
1002 spr_register(env
, SPR_601_VRTCL
, "RTCL",
1003 &spr_read_601_rtcl
, SPR_NOACCESS
,
1004 &spr_read_601_rtcl
, SPR_NOACCESS
,
1008 spr_register(env
, SPR_601_UDECR
, "UDECR",
1009 &spr_read_decr
, SPR_NOACCESS
,
1010 &spr_read_decr
, SPR_NOACCESS
,
1013 /* External access control */
1014 /* XXX : not implemented */
1015 spr_register(env
, SPR_EAR
, "EAR",
1016 SPR_NOACCESS
, SPR_NOACCESS
,
1017 &spr_read_generic
, &spr_write_generic
,
1019 /* Memory management */
1020 spr_register(env
, SPR_IBAT0U
, "IBAT0U",
1021 SPR_NOACCESS
, SPR_NOACCESS
,
1022 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1024 spr_register(env
, SPR_IBAT0L
, "IBAT0L",
1025 SPR_NOACCESS
, SPR_NOACCESS
,
1026 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1028 spr_register(env
, SPR_IBAT1U
, "IBAT1U",
1029 SPR_NOACCESS
, SPR_NOACCESS
,
1030 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1032 spr_register(env
, SPR_IBAT1L
, "IBAT1L",
1033 SPR_NOACCESS
, SPR_NOACCESS
,
1034 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1036 spr_register(env
, SPR_IBAT2U
, "IBAT2U",
1037 SPR_NOACCESS
, SPR_NOACCESS
,
1038 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1040 spr_register(env
, SPR_IBAT2L
, "IBAT2L",
1041 SPR_NOACCESS
, SPR_NOACCESS
,
1042 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1044 spr_register(env
, SPR_IBAT3U
, "IBAT3U",
1045 SPR_NOACCESS
, SPR_NOACCESS
,
1046 &spr_read_601_ubat
, &spr_write_601_ubatu
,
1048 spr_register(env
, SPR_IBAT3L
, "IBAT3L",
1049 SPR_NOACCESS
, SPR_NOACCESS
,
1050 &spr_read_601_ubat
, &spr_write_601_ubatl
,
1054 /* PowerPC BookE SPR */
1055 static void gen_spr_BookE (CPUPPCState
*env
)
1057 /* Processor identification */
1058 spr_register(env
, SPR_BOOKE_PIR
, "PIR",
1059 SPR_NOACCESS
, SPR_NOACCESS
,
1060 &spr_read_generic
, &spr_write_pir
,
1062 /* Interrupt processing */
1063 spr_register(env
, SPR_BOOKE_CSRR0
, "CSRR0",
1064 SPR_NOACCESS
, SPR_NOACCESS
,
1065 &spr_read_generic
, &spr_write_generic
,
1067 spr_register(env
, SPR_BOOKE_CSRR1
, "CSRR1",
1068 SPR_NOACCESS
, SPR_NOACCESS
,
1069 &spr_read_generic
, &spr_write_generic
,
1071 spr_register(env
, SPR_BOOKE_DSRR0
, "DSRR0",
1072 SPR_NOACCESS
, SPR_NOACCESS
,
1073 &spr_read_generic
, &spr_write_generic
,
1075 spr_register(env
, SPR_BOOKE_DSRR1
, "DSRR1",
1076 SPR_NOACCESS
, SPR_NOACCESS
,
1077 &spr_read_generic
, &spr_write_generic
,
1079 spr_register(env
, SPR_BOOKE_MCSRR0
, "MCSRR0",
1080 SPR_NOACCESS
, SPR_NOACCESS
,
1081 &spr_read_generic
, &spr_write_generic
,
1083 spr_register(env
, SPR_BOOKE_MCSRR1
, "MCSRR1",
1084 SPR_NOACCESS
, SPR_NOACCESS
,
1085 &spr_read_generic
, &spr_write_generic
,
1088 /* XXX : not implemented */
1089 spr_register(env
, SPR_BOOKE_IAC1
, "IAC1",
1090 SPR_NOACCESS
, SPR_NOACCESS
,
1091 &spr_read_generic
, &spr_write_generic
,
1093 /* XXX : not implemented */
1094 spr_register(env
, SPR_BOOKE_IAC2
, "IAC2",
1095 SPR_NOACCESS
, SPR_NOACCESS
,
1096 &spr_read_generic
, &spr_write_generic
,
1098 /* XXX : not implemented */
1099 spr_register(env
, SPR_BOOKE_IAC3
, "IAC3",
1100 SPR_NOACCESS
, SPR_NOACCESS
,
1101 &spr_read_generic
, &spr_write_generic
,
1103 /* XXX : not implemented */
1104 spr_register(env
, SPR_BOOKE_IAC4
, "IAC4",
1105 SPR_NOACCESS
, SPR_NOACCESS
,
1106 &spr_read_generic
, &spr_write_generic
,
1108 /* XXX : not implemented */
1109 spr_register(env
, SPR_BOOKE_DAC1
, "DAC1",
1110 SPR_NOACCESS
, SPR_NOACCESS
,
1111 &spr_read_generic
, &spr_write_generic
,
1113 /* XXX : not implemented */
1114 spr_register(env
, SPR_BOOKE_DAC2
, "DAC2",
1115 SPR_NOACCESS
, SPR_NOACCESS
,
1116 &spr_read_generic
, &spr_write_generic
,
1118 /* XXX : not implemented */
1119 spr_register(env
, SPR_BOOKE_DVC1
, "DVC1",
1120 SPR_NOACCESS
, SPR_NOACCESS
,
1121 &spr_read_generic
, &spr_write_generic
,
1123 /* XXX : not implemented */
1124 spr_register(env
, SPR_BOOKE_DVC2
, "DVC2",
1125 SPR_NOACCESS
, SPR_NOACCESS
,
1126 &spr_read_generic
, &spr_write_generic
,
1128 /* XXX : not implemented */
1129 spr_register(env
, SPR_BOOKE_DBCR0
, "DBCR0",
1130 SPR_NOACCESS
, SPR_NOACCESS
,
1131 &spr_read_generic
, &spr_write_generic
,
1133 /* XXX : not implemented */
1134 spr_register(env
, SPR_BOOKE_DBCR1
, "DBCR1",
1135 SPR_NOACCESS
, SPR_NOACCESS
,
1136 &spr_read_generic
, &spr_write_generic
,
1138 /* XXX : not implemented */
1139 spr_register(env
, SPR_BOOKE_DBCR2
, "DBCR2",
1140 SPR_NOACCESS
, SPR_NOACCESS
,
1141 &spr_read_generic
, &spr_write_generic
,
1143 /* XXX : not implemented */
1144 spr_register(env
, SPR_BOOKE_DBSR
, "DBSR",
1145 SPR_NOACCESS
, SPR_NOACCESS
,
1146 &spr_read_generic
, &spr_write_generic
,
1148 spr_register(env
, SPR_BOOKE_DEAR
, "DEAR",
1149 SPR_NOACCESS
, SPR_NOACCESS
,
1150 &spr_read_generic
, &spr_write_generic
,
1152 spr_register(env
, SPR_BOOKE_ESR
, "ESR",
1153 SPR_NOACCESS
, SPR_NOACCESS
,
1154 &spr_read_generic
, &spr_write_generic
,
1156 spr_register(env
, SPR_BOOKE_IVPR
, "IVPR",
1157 SPR_NOACCESS
, SPR_NOACCESS
,
1158 &spr_read_generic
, &spr_write_generic
,
1160 /* Exception vectors */
1161 spr_register(env
, SPR_BOOKE_IVPR
, "IVPR",
1162 SPR_NOACCESS
, SPR_NOACCESS
,
1163 &spr_read_generic
, &spr_write_generic
,
1165 spr_register(env
, SPR_BOOKE_IVOR0
, "IVOR0",
1166 SPR_NOACCESS
, SPR_NOACCESS
,
1167 &spr_read_generic
, &spr_write_generic
,
1169 spr_register(env
, SPR_BOOKE_IVOR1
, "IVOR1",
1170 SPR_NOACCESS
, SPR_NOACCESS
,
1171 &spr_read_generic
, &spr_write_generic
,
1173 spr_register(env
, SPR_BOOKE_IVOR2
, "IVOR2",
1174 SPR_NOACCESS
, SPR_NOACCESS
,
1175 &spr_read_generic
, &spr_write_generic
,
1177 spr_register(env
, SPR_BOOKE_IVOR3
, "IVOR3",
1178 SPR_NOACCESS
, SPR_NOACCESS
,
1179 &spr_read_generic
, &spr_write_generic
,
1181 spr_register(env
, SPR_BOOKE_IVOR4
, "IVOR4",
1182 SPR_NOACCESS
, SPR_NOACCESS
,
1183 &spr_read_generic
, &spr_write_generic
,
1185 spr_register(env
, SPR_BOOKE_IVOR5
, "IVOR5",
1186 SPR_NOACCESS
, SPR_NOACCESS
,
1187 &spr_read_generic
, &spr_write_generic
,
1189 spr_register(env
, SPR_BOOKE_IVOR6
, "IVOR6",
1190 SPR_NOACCESS
, SPR_NOACCESS
,
1191 &spr_read_generic
, &spr_write_generic
,
1193 spr_register(env
, SPR_BOOKE_IVOR7
, "IVOR7",
1194 SPR_NOACCESS
, SPR_NOACCESS
,
1195 &spr_read_generic
, &spr_write_generic
,
1197 spr_register(env
, SPR_BOOKE_IVOR8
, "IVOR8",
1198 SPR_NOACCESS
, SPR_NOACCESS
,
1199 &spr_read_generic
, &spr_write_generic
,
1201 spr_register(env
, SPR_BOOKE_IVOR9
, "IVOR9",
1202 SPR_NOACCESS
, SPR_NOACCESS
,
1203 &spr_read_generic
, &spr_write_generic
,
1205 spr_register(env
, SPR_BOOKE_IVOR10
, "IVOR10",
1206 SPR_NOACCESS
, SPR_NOACCESS
,
1207 &spr_read_generic
, &spr_write_generic
,
1209 spr_register(env
, SPR_BOOKE_IVOR11
, "IVOR11",
1210 SPR_NOACCESS
, SPR_NOACCESS
,
1211 &spr_read_generic
, &spr_write_generic
,
1213 spr_register(env
, SPR_BOOKE_IVOR12
, "IVOR12",
1214 SPR_NOACCESS
, SPR_NOACCESS
,
1215 &spr_read_generic
, &spr_write_generic
,
1217 spr_register(env
, SPR_BOOKE_IVOR13
, "IVOR13",
1218 SPR_NOACCESS
, SPR_NOACCESS
,
1219 &spr_read_generic
, &spr_write_generic
,
1221 spr_register(env
, SPR_BOOKE_IVOR14
, "IVOR14",
1222 SPR_NOACCESS
, SPR_NOACCESS
,
1223 &spr_read_generic
, &spr_write_generic
,
1225 spr_register(env
, SPR_BOOKE_IVOR15
, "IVOR15",
1226 SPR_NOACCESS
, SPR_NOACCESS
,
1227 &spr_read_generic
, &spr_write_generic
,
1229 spr_register(env
, SPR_BOOKE_IVOR32
, "IVOR32",
1230 SPR_NOACCESS
, SPR_NOACCESS
,
1231 &spr_read_generic
, &spr_write_generic
,
1233 spr_register(env
, SPR_BOOKE_IVOR33
, "IVOR33",
1234 SPR_NOACCESS
, SPR_NOACCESS
,
1235 &spr_read_generic
, &spr_write_generic
,
1237 spr_register(env
, SPR_BOOKE_IVOR34
, "IVOR34",
1238 SPR_NOACCESS
, SPR_NOACCESS
,
1239 &spr_read_generic
, &spr_write_generic
,
1241 spr_register(env
, SPR_BOOKE_IVOR35
, "IVOR35",
1242 SPR_NOACCESS
, SPR_NOACCESS
,
1243 &spr_read_generic
, &spr_write_generic
,
1245 spr_register(env
, SPR_BOOKE_IVOR36
, "IVOR36",
1246 SPR_NOACCESS
, SPR_NOACCESS
,
1247 &spr_read_generic
, &spr_write_generic
,
1249 spr_register(env
, SPR_BOOKE_IVOR37
, "IVOR37",
1250 SPR_NOACCESS
, SPR_NOACCESS
,
1251 &spr_read_generic
, &spr_write_generic
,
1253 spr_register(env
, SPR_BOOKE_PID
, "PID",
1254 SPR_NOACCESS
, SPR_NOACCESS
,
1255 &spr_read_generic
, &spr_write_generic
,
1257 spr_register(env
, SPR_BOOKE_TCR
, "TCR",
1258 SPR_NOACCESS
, SPR_NOACCESS
,
1259 &spr_read_generic
, &spr_write_booke_tcr
,
1261 spr_register(env
, SPR_BOOKE_TSR
, "TSR",
1262 SPR_NOACCESS
, SPR_NOACCESS
,
1263 &spr_read_generic
, &spr_write_booke_tsr
,
1266 spr_register(env
, SPR_DECR
, "DECR",
1267 SPR_NOACCESS
, SPR_NOACCESS
,
1268 &spr_read_decr
, &spr_write_decr
,
1270 spr_register(env
, SPR_BOOKE_DECAR
, "DECAR",
1271 SPR_NOACCESS
, SPR_NOACCESS
,
1272 SPR_NOACCESS
, &spr_write_generic
,
1275 spr_register(env
, SPR_USPRG0
, "USPRG0",
1276 &spr_read_generic
, &spr_write_generic
,
1277 &spr_read_generic
, &spr_write_generic
,
1279 spr_register(env
, SPR_SPRG4
, "SPRG4",
1280 SPR_NOACCESS
, SPR_NOACCESS
,
1281 &spr_read_generic
, &spr_write_generic
,
1283 spr_register(env
, SPR_USPRG4
, "USPRG4",
1284 &spr_read_ureg
, SPR_NOACCESS
,
1285 &spr_read_ureg
, SPR_NOACCESS
,
1287 spr_register(env
, SPR_SPRG5
, "SPRG5",
1288 SPR_NOACCESS
, SPR_NOACCESS
,
1289 &spr_read_generic
, &spr_write_generic
,
1291 spr_register(env
, SPR_USPRG5
, "USPRG5",
1292 &spr_read_ureg
, SPR_NOACCESS
,
1293 &spr_read_ureg
, SPR_NOACCESS
,
1295 spr_register(env
, SPR_SPRG6
, "SPRG6",
1296 SPR_NOACCESS
, SPR_NOACCESS
,
1297 &spr_read_generic
, &spr_write_generic
,
1299 spr_register(env
, SPR_USPRG6
, "USPRG6",
1300 &spr_read_ureg
, SPR_NOACCESS
,
1301 &spr_read_ureg
, SPR_NOACCESS
,
1303 spr_register(env
, SPR_SPRG7
, "SPRG7",
1304 SPR_NOACCESS
, SPR_NOACCESS
,
1305 &spr_read_generic
, &spr_write_generic
,
1307 spr_register(env
, SPR_USPRG7
, "USPRG7",
1308 &spr_read_ureg
, SPR_NOACCESS
,
1309 &spr_read_ureg
, SPR_NOACCESS
,
1313 /* FSL storage control registers */
1314 static void gen_spr_BookE_FSL (CPUPPCState
*env
)
1316 /* TLB assist registers */
1317 spr_register(env
, SPR_BOOKE_MAS0
, "MAS0",
1318 SPR_NOACCESS
, SPR_NOACCESS
,
1319 &spr_read_generic
, &spr_write_generic
,
1321 spr_register(env
, SPR_BOOKE_MAS1
, "MAS2",
1322 SPR_NOACCESS
, SPR_NOACCESS
,
1323 &spr_read_generic
, &spr_write_generic
,
1325 spr_register(env
, SPR_BOOKE_MAS2
, "MAS3",
1326 SPR_NOACCESS
, SPR_NOACCESS
,
1327 &spr_read_generic
, &spr_write_generic
,
1329 spr_register(env
, SPR_BOOKE_MAS3
, "MAS4",
1330 SPR_NOACCESS
, SPR_NOACCESS
,
1331 &spr_read_generic
, &spr_write_generic
,
1333 spr_register(env
, SPR_BOOKE_MAS4
, "MAS5",
1334 SPR_NOACCESS
, SPR_NOACCESS
,
1335 &spr_read_generic
, &spr_write_generic
,
1337 spr_register(env
, SPR_BOOKE_MAS6
, "MAS6",
1338 SPR_NOACCESS
, SPR_NOACCESS
,
1339 &spr_read_generic
, &spr_write_generic
,
1341 spr_register(env
, SPR_BOOKE_MAS7
, "MAS7",
1342 SPR_NOACCESS
, SPR_NOACCESS
,
1343 &spr_read_generic
, &spr_write_generic
,
1345 if (env
->nb_pids
> 1) {
1346 spr_register(env
, SPR_BOOKE_PID1
, "PID1",
1347 SPR_NOACCESS
, SPR_NOACCESS
,
1348 &spr_read_generic
, &spr_write_generic
,
1351 if (env
->nb_pids
> 2) {
1352 spr_register(env
, SPR_BOOKE_PID2
, "PID2",
1353 SPR_NOACCESS
, SPR_NOACCESS
,
1354 &spr_read_generic
, &spr_write_generic
,
1357 spr_register(env
, SPR_BOOKE_MMUCFG
, "MMUCFG",
1358 SPR_NOACCESS
, SPR_NOACCESS
,
1359 &spr_read_generic
, SPR_NOACCESS
,
1360 0x00000000); /* TOFIX */
1361 spr_register(env
, SPR_BOOKE_MMUCSR0
, "MMUCSR0",
1362 SPR_NOACCESS
, SPR_NOACCESS
,
1363 &spr_read_generic
, &spr_write_generic
,
1364 0x00000000); /* TOFIX */
1365 switch (env
->nb_ways
) {
1367 spr_register(env
, SPR_BOOKE_TLB3CFG
, "TLB3CFG",
1368 SPR_NOACCESS
, SPR_NOACCESS
,
1369 &spr_read_generic
, SPR_NOACCESS
,
1370 0x00000000); /* TOFIX */
1373 spr_register(env
, SPR_BOOKE_TLB2CFG
, "TLB2CFG",
1374 SPR_NOACCESS
, SPR_NOACCESS
,
1375 &spr_read_generic
, SPR_NOACCESS
,
1376 0x00000000); /* TOFIX */
1379 spr_register(env
, SPR_BOOKE_TLB1CFG
, "TLB1CFG",
1380 SPR_NOACCESS
, SPR_NOACCESS
,
1381 &spr_read_generic
, SPR_NOACCESS
,
1382 0x00000000); /* TOFIX */
1385 spr_register(env
, SPR_BOOKE_TLB0CFG
, "TLB0CFG",
1386 SPR_NOACCESS
, SPR_NOACCESS
,
1387 &spr_read_generic
, SPR_NOACCESS
,
1388 0x00000000); /* TOFIX */
1396 /* SPR specific to PowerPC 440 implementation */
1397 static void gen_spr_440 (CPUPPCState
*env
)
1400 /* XXX : not implemented */
1401 spr_register(env
, SPR_440_DNV0
, "DNV0",
1402 SPR_NOACCESS
, SPR_NOACCESS
,
1403 &spr_read_generic
, &spr_write_generic
,
1405 /* XXX : not implemented */
1406 spr_register(env
, SPR_440_DNV1
, "DNV1",
1407 SPR_NOACCESS
, SPR_NOACCESS
,
1408 &spr_read_generic
, &spr_write_generic
,
1410 /* XXX : not implemented */
1411 spr_register(env
, SPR_440_DNV2
, "DNV2",
1412 SPR_NOACCESS
, SPR_NOACCESS
,
1413 &spr_read_generic
, &spr_write_generic
,
1415 /* XXX : not implemented */
1416 spr_register(env
, SPR_440_DNV3
, "DNV3",
1417 SPR_NOACCESS
, SPR_NOACCESS
,
1418 &spr_read_generic
, &spr_write_generic
,
1420 /* XXX : not implemented */
1421 spr_register(env
, SPR_440_DVT0
, "DVT0",
1422 SPR_NOACCESS
, SPR_NOACCESS
,
1423 &spr_read_generic
, &spr_write_generic
,
1425 /* XXX : not implemented */
1426 spr_register(env
, SPR_440_DVT1
, "DVT1",
1427 SPR_NOACCESS
, SPR_NOACCESS
,
1428 &spr_read_generic
, &spr_write_generic
,
1430 /* XXX : not implemented */
1431 spr_register(env
, SPR_440_DVT2
, "DVT2",
1432 SPR_NOACCESS
, SPR_NOACCESS
,
1433 &spr_read_generic
, &spr_write_generic
,
1435 /* XXX : not implemented */
1436 spr_register(env
, SPR_440_DVT3
, "DVT3",
1437 SPR_NOACCESS
, SPR_NOACCESS
,
1438 &spr_read_generic
, &spr_write_generic
,
1440 /* XXX : not implemented */
1441 spr_register(env
, SPR_440_DVLIM
, "DVLIM",
1442 SPR_NOACCESS
, SPR_NOACCESS
,
1443 &spr_read_generic
, &spr_write_generic
,
1445 /* XXX : not implemented */
1446 spr_register(env
, SPR_440_INV0
, "INV0",
1447 SPR_NOACCESS
, SPR_NOACCESS
,
1448 &spr_read_generic
, &spr_write_generic
,
1450 /* XXX : not implemented */
1451 spr_register(env
, SPR_440_INV1
, "INV1",
1452 SPR_NOACCESS
, SPR_NOACCESS
,
1453 &spr_read_generic
, &spr_write_generic
,
1455 /* XXX : not implemented */
1456 spr_register(env
, SPR_440_INV2
, "INV2",
1457 SPR_NOACCESS
, SPR_NOACCESS
,
1458 &spr_read_generic
, &spr_write_generic
,
1460 /* XXX : not implemented */
1461 spr_register(env
, SPR_440_INV3
, "INV3",
1462 SPR_NOACCESS
, SPR_NOACCESS
,
1463 &spr_read_generic
, &spr_write_generic
,
1465 /* XXX : not implemented */
1466 spr_register(env
, SPR_440_IVT0
, "IVT0",
1467 SPR_NOACCESS
, SPR_NOACCESS
,
1468 &spr_read_generic
, &spr_write_generic
,
1470 /* XXX : not implemented */
1471 spr_register(env
, SPR_440_IVT1
, "IVT1",
1472 SPR_NOACCESS
, SPR_NOACCESS
,
1473 &spr_read_generic
, &spr_write_generic
,
1475 /* XXX : not implemented */
1476 spr_register(env
, SPR_440_IVT2
, "IVT2",
1477 SPR_NOACCESS
, SPR_NOACCESS
,
1478 &spr_read_generic
, &spr_write_generic
,
1480 /* XXX : not implemented */
1481 spr_register(env
, SPR_440_IVT3
, "IVT3",
1482 SPR_NOACCESS
, SPR_NOACCESS
,
1483 &spr_read_generic
, &spr_write_generic
,
1485 /* XXX : not implemented */
1486 spr_register(env
, SPR_440_IVLIM
, "IVLIM",
1487 SPR_NOACCESS
, SPR_NOACCESS
,
1488 &spr_read_generic
, &spr_write_generic
,
1491 /* XXX : not implemented */
1492 spr_register(env
, SPR_BOOKE_DCBTRH
, "DCBTRH",
1493 SPR_NOACCESS
, SPR_NOACCESS
,
1494 &spr_read_generic
, SPR_NOACCESS
,
1496 /* XXX : not implemented */
1497 spr_register(env
, SPR_BOOKE_DCBTRL
, "DCBTRL",
1498 SPR_NOACCESS
, SPR_NOACCESS
,
1499 &spr_read_generic
, SPR_NOACCESS
,
1501 /* XXX : not implemented */
1502 spr_register(env
, SPR_BOOKE_ICBDR
, "ICBDR",
1503 SPR_NOACCESS
, SPR_NOACCESS
,
1504 &spr_read_generic
, SPR_NOACCESS
,
1506 /* XXX : not implemented */
1507 spr_register(env
, SPR_BOOKE_ICBTRH
, "ICBTRH",
1508 SPR_NOACCESS
, SPR_NOACCESS
,
1509 &spr_read_generic
, SPR_NOACCESS
,
1511 /* XXX : not implemented */
1512 spr_register(env
, SPR_BOOKE_ICBTRL
, "ICBTRL",
1513 SPR_NOACCESS
, SPR_NOACCESS
,
1514 &spr_read_generic
, SPR_NOACCESS
,
1516 /* XXX : not implemented */
1517 spr_register(env
, SPR_440_DBDR
, "DBDR",
1518 SPR_NOACCESS
, SPR_NOACCESS
,
1519 &spr_read_generic
, &spr_write_generic
,
1521 /* Processor control */
1522 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1523 SPR_NOACCESS
, SPR_NOACCESS
,
1524 &spr_read_generic
, &spr_write_generic
,
1526 spr_register(env
, SPR_440_RSTCFG
, "RSTCFG",
1527 SPR_NOACCESS
, SPR_NOACCESS
,
1528 &spr_read_generic
, SPR_NOACCESS
,
1530 /* Storage control */
1531 spr_register(env
, SPR_440_MMUCR
, "MMUCR",
1532 SPR_NOACCESS
, SPR_NOACCESS
,
1533 &spr_read_generic
, &spr_write_generic
,
1537 /* SPR shared between PowerPC 40x implementations */
1538 static void gen_spr_40x (CPUPPCState
*env
)
1541 /* XXX : not implemented */
1542 spr_register(env
, SPR_40x_DCCR
, "DCCR",
1543 SPR_NOACCESS
, SPR_NOACCESS
,
1544 &spr_read_generic
, &spr_write_generic
,
1546 /* XXX : not implemented */
1547 spr_register(env
, SPR_40x_DCWR
, "DCWR",
1548 SPR_NOACCESS
, SPR_NOACCESS
,
1549 &spr_read_generic
, &spr_write_generic
,
1551 /* XXX : not implemented */
1552 spr_register(env
, SPR_40x_ICCR
, "ICCR",
1553 SPR_NOACCESS
, SPR_NOACCESS
,
1554 &spr_read_generic
, &spr_write_generic
,
1556 /* XXX : not implemented */
1557 spr_register(env
, SPR_BOOKE_ICBDR
, "ICBDR",
1558 SPR_NOACCESS
, SPR_NOACCESS
,
1559 &spr_read_generic
, SPR_NOACCESS
,
1561 /* Bus access control */
1562 spr_register(env
, SPR_40x_SGR
, "SGR",
1563 SPR_NOACCESS
, SPR_NOACCESS
,
1564 &spr_read_generic
, &spr_write_generic
,
1566 spr_register(env
, SPR_40x_ZPR
, "ZPR",
1567 SPR_NOACCESS
, SPR_NOACCESS
,
1568 &spr_read_generic
, &spr_write_generic
,
1571 spr_register(env
, SPR_40x_PID
, "PID",
1572 SPR_NOACCESS
, SPR_NOACCESS
,
1573 &spr_read_generic
, &spr_write_generic
,
1576 spr_register(env
, SPR_40x_DEAR
, "DEAR",
1577 SPR_NOACCESS
, SPR_NOACCESS
,
1578 &spr_read_generic
, &spr_write_generic
,
1580 spr_register(env
, SPR_40x_ESR
, "ESR",
1581 SPR_NOACCESS
, SPR_NOACCESS
,
1582 &spr_read_generic
, &spr_write_generic
,
1584 spr_register(env
, SPR_40x_EVPR
, "EVPR",
1585 SPR_NOACCESS
, SPR_NOACCESS
,
1586 &spr_read_generic
, &spr_write_generic
,
1588 spr_register(env
, SPR_40x_SRR2
, "SRR2",
1589 &spr_read_generic
, &spr_write_generic
,
1590 &spr_read_generic
, &spr_write_generic
,
1592 spr_register(env
, SPR_40x_SRR3
, "SRR3",
1593 &spr_read_generic
, &spr_write_generic
,
1594 &spr_read_generic
, &spr_write_generic
,
1597 spr_register(env
, SPR_40x_PIT
, "PIT",
1598 SPR_NOACCESS
, SPR_NOACCESS
,
1599 &spr_read_40x_pit
, &spr_write_40x_pit
,
1601 spr_register(env
, SPR_40x_TCR
, "TCR",
1602 SPR_NOACCESS
, SPR_NOACCESS
,
1603 &spr_read_generic
, &spr_write_booke_tcr
,
1605 spr_register(env
, SPR_40x_TSR
, "TSR",
1606 SPR_NOACCESS
, SPR_NOACCESS
,
1607 &spr_read_generic
, &spr_write_booke_tsr
,
1609 /* Debug interface */
1610 /* XXX : not implemented */
1611 spr_register(env
, SPR_40x_DAC1
, "DAC1",
1612 SPR_NOACCESS
, SPR_NOACCESS
,
1613 &spr_read_generic
, &spr_write_generic
,
1615 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1616 SPR_NOACCESS
, SPR_NOACCESS
,
1617 &spr_read_generic
, &spr_write_generic
,
1619 /* XXX : not implemented */
1620 spr_register(env
, SPR_40x_DBCR0
, "DBCR0",
1621 SPR_NOACCESS
, SPR_NOACCESS
,
1622 &spr_read_generic
, &spr_write_generic
,
1624 /* XXX : not implemented */
1625 spr_register(env
, SPR_40x_DBSR
, "DBSR",
1626 SPR_NOACCESS
, SPR_NOACCESS
,
1627 &spr_read_generic
, &spr_write_generic
,
1628 /* Last reset was system reset (system boot */
1630 /* XXX : not implemented */
1631 spr_register(env
, SPR_40x_IAC1
, "IAC1",
1632 SPR_NOACCESS
, SPR_NOACCESS
,
1633 &spr_read_generic
, &spr_write_generic
,
1635 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1636 SPR_NOACCESS
, SPR_NOACCESS
,
1637 &spr_read_generic
, &spr_write_generic
,
1641 /* SPR specific to PowerPC 405 implementation */
1642 static void gen_spr_405 (CPUPPCState
*env
)
1644 spr_register(env
, SPR_4xx_CCR0
, "CCR0",
1645 SPR_NOACCESS
, SPR_NOACCESS
,
1646 &spr_read_generic
, &spr_write_generic
,
1649 /* XXX : not implemented */
1650 spr_register(env
, SPR_405_DBCR1
, "DBCR1",
1651 SPR_NOACCESS
, SPR_NOACCESS
,
1652 &spr_read_generic
, &spr_write_generic
,
1654 /* XXX : not implemented */
1655 spr_register(env
, SPR_405_DVC1
, "DVC1",
1656 SPR_NOACCESS
, SPR_NOACCESS
,
1657 &spr_read_generic
, &spr_write_generic
,
1659 /* XXX : not implemented */
1660 spr_register(env
, SPR_405_DVC2
, "DVC2",
1661 SPR_NOACCESS
, SPR_NOACCESS
,
1662 &spr_read_generic
, &spr_write_generic
,
1664 /* XXX : not implemented */
1665 spr_register(env
, SPR_405_IAC3
, "IAC3",
1666 SPR_NOACCESS
, SPR_NOACCESS
,
1667 &spr_read_generic
, &spr_write_generic
,
1669 /* XXX : not implemented */
1670 spr_register(env
, SPR_405_IAC4
, "IAC4",
1671 SPR_NOACCESS
, SPR_NOACCESS
,
1672 &spr_read_generic
, &spr_write_generic
,
1674 /* Storage control */
1675 /* XXX : not implemented */
1676 spr_register(env
, SPR_405_SLER
, "SLER",
1677 SPR_NOACCESS
, SPR_NOACCESS
,
1678 &spr_read_generic
, &spr_write_generic
,
1680 /* XXX : not implemented */
1681 spr_register(env
, SPR_405_SU0R
, "SU0R",
1682 SPR_NOACCESS
, SPR_NOACCESS
,
1683 &spr_read_generic
, &spr_write_generic
,
1686 spr_register(env
, SPR_USPRG0
, "USPRG0",
1687 &spr_read_ureg
, SPR_NOACCESS
,
1688 &spr_read_ureg
, SPR_NOACCESS
,
1690 spr_register(env
, SPR_SPRG4
, "SPRG4",
1691 SPR_NOACCESS
, SPR_NOACCESS
,
1692 SPR_NOACCESS
, &spr_write_generic
,
1694 spr_register(env
, SPR_USPRG4
, "USPRG4",
1695 &spr_read_ureg
, SPR_NOACCESS
,
1696 &spr_read_ureg
, SPR_NOACCESS
,
1698 spr_register(env
, SPR_SPRG5
, "SPRG5",
1699 SPR_NOACCESS
, SPR_NOACCESS
,
1700 SPR_NOACCESS
, &spr_write_generic
,
1702 spr_register(env
, SPR_USPRG5
, "USPRG5",
1703 &spr_read_ureg
, SPR_NOACCESS
,
1704 &spr_read_ureg
, SPR_NOACCESS
,
1706 spr_register(env
, SPR_SPRG6
, "SPRG6",
1707 SPR_NOACCESS
, SPR_NOACCESS
,
1708 SPR_NOACCESS
, &spr_write_generic
,
1710 spr_register(env
, SPR_USPRG6
, "USPRG6",
1711 &spr_read_ureg
, SPR_NOACCESS
,
1712 &spr_read_ureg
, SPR_NOACCESS
,
1714 spr_register(env
, SPR_SPRG7
, "SPRG7",
1715 SPR_NOACCESS
, SPR_NOACCESS
,
1716 SPR_NOACCESS
, &spr_write_generic
,
1718 spr_register(env
, SPR_USPRG7
, "USPRG7",
1719 &spr_read_ureg
, SPR_NOACCESS
,
1720 &spr_read_ureg
, SPR_NOACCESS
,
1723 /* XXX : not implemented */
1724 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1725 SPR_NOACCESS
, SPR_NOACCESS
,
1726 &spr_read_generic
, &spr_write_generic
,
1728 /* XXX : not implemented */
1729 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1730 SPR_NOACCESS
, SPR_NOACCESS
,
1731 &spr_read_generic
, &spr_write_generic
,
1735 /* SPR shared between PowerPC 401 & 403 implementations */
1736 static void gen_spr_401_403 (CPUPPCState
*env
)
1739 spr_register(env
, SPR_403_VTBL
, "TBL",
1740 &spr_read_tbl
, SPR_NOACCESS
,
1741 &spr_read_tbl
, SPR_NOACCESS
,
1743 spr_register(env
, SPR_403_TBL
, "TBL",
1744 SPR_NOACCESS
, SPR_NOACCESS
,
1745 SPR_NOACCESS
, &spr_write_tbl
,
1747 spr_register(env
, SPR_403_VTBU
, "TBU",
1748 &spr_read_tbu
, SPR_NOACCESS
,
1749 &spr_read_tbu
, SPR_NOACCESS
,
1751 spr_register(env
, SPR_403_TBU
, "TBU",
1752 SPR_NOACCESS
, SPR_NOACCESS
,
1753 SPR_NOACCESS
, &spr_write_tbu
,
1756 /* XXX: not implemented */
1757 spr_register(env
, SPR_403_CDBCR
, "CDBCR",
1758 SPR_NOACCESS
, SPR_NOACCESS
,
1759 &spr_read_generic
, &spr_write_generic
,
1763 /* SPR specific to PowerPC 403 implementation */
1764 static void gen_spr_403 (CPUPPCState
*env
)
1767 spr_register(env
, SPR_403_PBL1
, "PBL1",
1768 SPR_NOACCESS
, SPR_NOACCESS
,
1769 &spr_read_403_pbr
, &spr_write_403_pbr
,
1771 spr_register(env
, SPR_403_PBU1
, "PBU1",
1772 SPR_NOACCESS
, SPR_NOACCESS
,
1773 &spr_read_403_pbr
, &spr_write_403_pbr
,
1775 spr_register(env
, SPR_403_PBL2
, "PBL2",
1776 SPR_NOACCESS
, SPR_NOACCESS
,
1777 &spr_read_403_pbr
, &spr_write_403_pbr
,
1779 spr_register(env
, SPR_403_PBU2
, "PBU2",
1780 SPR_NOACCESS
, SPR_NOACCESS
,
1781 &spr_read_403_pbr
, &spr_write_403_pbr
,
1784 /* XXX : not implemented */
1785 spr_register(env
, SPR_40x_DAC2
, "DAC2",
1786 SPR_NOACCESS
, SPR_NOACCESS
,
1787 &spr_read_generic
, &spr_write_generic
,
1789 /* XXX : not implemented */
1790 spr_register(env
, SPR_40x_IAC2
, "IAC2",
1791 SPR_NOACCESS
, SPR_NOACCESS
,
1792 &spr_read_generic
, &spr_write_generic
,
1796 /* SPR specific to PowerPC compression coprocessor extension */
1798 static void gen_spr_compress (CPUPPCState
*env
)
1800 spr_register(env
, SPR_401_SKR
, "SKR",
1801 SPR_NOACCESS
, SPR_NOACCESS
,
1802 &spr_read_generic
, &spr_write_generic
,
1807 // XXX: TODO (64 bits PowerPC SPRs)
1809 * ASR => SPR 280 (64 bits)
1810 * FPECR => SPR 1022 (?)
1811 * VRSAVE => SPR 256 (Altivec)
1812 * SCOMC => SPR 276 (64 bits ?)
1813 * SCOMD => SPR 277 (64 bits ?)
1814 * HSPRG0 => SPR 304 (hypervisor)
1815 * HSPRG1 => SPR 305 (hypervisor)
1816 * HDEC => SPR 310 (hypervisor)
1817 * HIOR => SPR 311 (hypervisor)
1818 * RMOR => SPR 312 (970)
1819 * HRMOR => SPR 313 (hypervisor)
1820 * HSRR0 => SPR 314 (hypervisor)
1821 * HSRR1 => SPR 315 (hypervisor)
1822 * LPCR => SPR 316 (970)
1823 * LPIDR => SPR 317 (970)
1824 * ... and more (thermal management, performance counters, ...)
1827 static void init_ppc_proc (CPUPPCState
*env
, ppc_def_t
*def
)
1830 /* Default MMU definitions */
1838 * - RCPU (same as MPC5xx ?)
1840 spr_register(env
, SPR_PVR
, "PVR",
1841 SPR_NOACCESS
, SPR_NOACCESS
,
1842 &spr_read_generic
, SPR_NOACCESS
,
1844 printf("%s: PVR %08x mask %08x => %08x\n", __func__
,
1845 def
->pvr
, def
->pvr_mask
, def
->pvr
& def
->pvr_mask
);
1846 switch (def
->pvr
& def
->pvr_mask
) {
1847 /* Embedded PowerPC from IBM */
1848 case CPU_PPC_401A1
: /* 401 A1 family */
1849 case CPU_PPC_401B2
: /* 401 B2 family */
1850 case CPU_PPC_401C2
: /* 401 C2 family */
1851 case CPU_PPC_401D2
: /* 401 D2 family */
1852 case CPU_PPC_401E2
: /* 401 E2 family */
1853 case CPU_PPC_401F2
: /* 401 F2 family */
1854 case CPU_PPC_401G2
: /* 401 G2 family */
1855 case CPU_PPC_IOP480
: /* IOP 480 family */
1856 case CPU_PPC_COBRA
: /* IBM Processor for Network Resources */
1857 gen_spr_generic(env
);
1859 gen_spr_401_403(env
);
1861 /* XXX: optional ? */
1862 gen_spr_compress(env
);
1870 case CPU_PPC_403GA
: /* 403 GA family */
1871 case CPU_PPC_403GB
: /* 403 GB family */
1872 case CPU_PPC_403GC
: /* 403 GC family */
1873 case CPU_PPC_403GCX
: /* 403 GCX family */
1874 gen_spr_generic(env
);
1876 gen_spr_401_403(env
);
1884 case CPU_PPC_405CR
: /* 405 GP/CR family */
1885 case CPU_PPC_405EP
: /* 405 EP family */
1886 case CPU_PPC_405GPR
: /* 405 GPR family */
1887 case CPU_PPC_405D2
: /* 405 D2 family */
1888 case CPU_PPC_405D4
: /* 405 D4 family */
1889 gen_spr_generic(env
);
1900 case CPU_PPC_NPE405H
: /* NPe405 H family */
1901 case CPU_PPC_NPE405H2
:
1902 case CPU_PPC_NPE405L
: /* Npe405 L family */
1903 gen_spr_generic(env
);
1915 case CPU_PPC_STB01000
:
1918 case CPU_PPC_STB01010
:
1921 case CPU_PPC_STB0210
:
1923 case CPU_PPC_STB03
: /* STB03 family */
1925 case CPU_PPC_STB043
: /* STB043 family */
1928 case CPU_PPC_STB045
: /* STB045 family */
1930 case CPU_PPC_STB25
: /* STB25 family */
1932 case CPU_PPC_STB130
: /* STB130 family */
1934 gen_spr_generic(env
);
1945 case CPU_PPC_440EP
: /* 440 EP family */
1946 case CPU_PPC_440GP
: /* 440 GP family */
1947 case CPU_PPC_440GX
: /* 440 GX family */
1948 case CPU_PPC_440GXc
: /* 440 GXc family */
1949 case CPU_PPC_440GXf
: /* 440 GXf family */
1950 case CPU_PPC_440SP
: /* 440 SP family */
1951 case CPU_PPC_440SP2
:
1952 case CPU_PPC_440SPE
: /* 440 SPE family */
1953 gen_spr_generic(env
);
1964 /* Embedded PowerPC from Freescale */
1970 case CPU_PPC_8xx
: /* MPC821 / 823 / 850 / 860 */
1974 case CPU_PPC_82xx_HIP3
: /* MPC8240 / 8260 */
1975 case CPU_PPC_82xx_HIP4
: /* MPC8240 / 8260 */
1979 case CPU_PPC_827x
: /* MPC 827x / 828x */
1983 /* XXX: Use MPC8540 PVR to implement a test PowerPC BookE target */
1984 case CPU_PPC_e500v110
:
1985 case CPU_PPC_e500v120
:
1986 case CPU_PPC_e500v210
:
1987 case CPU_PPC_e500v220
:
1988 gen_spr_generic(env
);
1992 gen_spr_BookE_FSL(env
);
2004 /* 32 bits PowerPC */
2005 case CPU_PPC_601
: /* PowerPC 601 */
2006 gen_spr_generic(env
);
2007 gen_spr_ne_601(env
);
2009 /* Hardware implementation registers */
2010 /* XXX : not implemented */
2011 spr_register(env
, SPR_HID0
, "HID0",
2012 SPR_NOACCESS
, SPR_NOACCESS
,
2013 &spr_read_generic
, &spr_write_generic
,
2015 /* XXX : not implemented */
2016 spr_register(env
, SPR_HID1
, "HID1",
2017 SPR_NOACCESS
, SPR_NOACCESS
,
2018 &spr_read_generic
, &spr_write_generic
,
2020 /* XXX : not implemented */
2021 spr_register(env
, SPR_601_HID2
, "HID2",
2022 SPR_NOACCESS
, SPR_NOACCESS
,
2023 &spr_read_generic
, &spr_write_generic
,
2025 /* XXX : not implemented */
2026 spr_register(env
, SPR_601_HID5
, "HID5",
2027 SPR_NOACCESS
, SPR_NOACCESS
,
2028 &spr_read_generic
, &spr_write_generic
,
2030 /* XXX : not implemented */
2032 spr_register(env
, SPR_601_HID15
, "HID15",
2033 SPR_NOACCESS
, SPR_NOACCESS
,
2034 &spr_read_generic
, &spr_write_generic
,
2043 case CPU_PPC_602
: /* PowerPC 602 */
2044 gen_spr_generic(env
);
2045 gen_spr_ne_601(env
);
2046 /* Memory management */
2050 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2052 /* hardware implementation registers */
2053 /* XXX : not implemented */
2054 spr_register(env
, SPR_HID0
, "HID0",
2055 SPR_NOACCESS
, SPR_NOACCESS
,
2056 &spr_read_generic
, &spr_write_generic
,
2058 /* XXX : not implemented */
2059 spr_register(env
, SPR_HID1
, "HID1",
2060 SPR_NOACCESS
, SPR_NOACCESS
,
2061 &spr_read_generic
, &spr_write_generic
,
2065 case CPU_PPC_603
: /* PowerPC 603 */
2066 case CPU_PPC_603E
: /* PowerPC 603e */
2067 case CPU_PPC_603E7v
:
2068 case CPU_PPC_603E7v2
:
2069 case CPU_PPC_603P
: /* PowerPC 603p */
2070 case CPU_PPC_603R
: /* PowerPC 603r */
2071 gen_spr_generic(env
);
2072 gen_spr_ne_601(env
);
2073 /* Memory management */
2077 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2079 /* hardware implementation registers */
2080 /* XXX : not implemented */
2081 spr_register(env
, SPR_HID0
, "HID0",
2082 SPR_NOACCESS
, SPR_NOACCESS
,
2083 &spr_read_generic
, &spr_write_generic
,
2085 /* XXX : not implemented */
2086 spr_register(env
, SPR_HID1
, "HID1",
2087 SPR_NOACCESS
, SPR_NOACCESS
,
2088 &spr_read_generic
, &spr_write_generic
,
2092 case CPU_PPC_G2
: /* PowerPC G2 family */
2096 case CPU_PPC_G2LE
: /* PowerPC G2LE family */
2097 case CPU_PPC_G2LEgp
:
2098 case CPU_PPC_G2LEls
:
2099 gen_spr_generic(env
);
2100 gen_spr_ne_601(env
);
2101 /* Memory management */
2105 /* Memory management */
2107 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2108 gen_spr_G2_755(env
);
2110 /* Hardware implementation register */
2111 /* XXX : not implemented */
2112 spr_register(env
, SPR_HID0
, "HID0",
2113 SPR_NOACCESS
, SPR_NOACCESS
,
2114 &spr_read_generic
, &spr_write_generic
,
2116 /* XXX : not implemented */
2117 spr_register(env
, SPR_HID1
, "HID1",
2118 SPR_NOACCESS
, SPR_NOACCESS
,
2119 &spr_read_generic
, &spr_write_generic
,
2121 /* XXX : not implemented */
2122 spr_register(env
, SPR_HID2
, "HID2",
2123 SPR_NOACCESS
, SPR_NOACCESS
,
2124 &spr_read_generic
, &spr_write_generic
,
2128 case CPU_PPC_604
: /* PowerPC 604 */
2129 case CPU_PPC_604E
: /* PowerPC 604e */
2130 case CPU_PPC_604R
: /* PowerPC 604r */
2131 gen_spr_generic(env
);
2132 gen_spr_ne_601(env
);
2133 /* Memory management */
2138 /* Hardware implementation registers */
2139 /* XXX : not implemented */
2140 spr_register(env
, SPR_HID0
, "HID0",
2141 SPR_NOACCESS
, SPR_NOACCESS
,
2142 &spr_read_generic
, &spr_write_generic
,
2144 /* XXX : not implemented */
2145 spr_register(env
, SPR_HID1
, "HID1",
2146 SPR_NOACCESS
, SPR_NOACCESS
,
2147 &spr_read_generic
, &spr_write_generic
,
2151 case CPU_PPC_74x
: /* PowerPC 740 / 750 */
2154 case CPU_PPC_74xP
: /* PowerPC 740P / 750P */
2155 case CPU_PPC_750CXE21
: /* IBM PowerPC 750cxe */
2156 case CPU_PPC_750CXE22
:
2157 case CPU_PPC_750CXE23
:
2158 case CPU_PPC_750CXE24
:
2159 case CPU_PPC_750CXE24b
:
2160 case CPU_PPC_750CXE31
:
2161 case CPU_PPC_750CXE31b
:
2162 case CPU_PPC_750CXR
:
2163 gen_spr_generic(env
);
2164 gen_spr_ne_601(env
);
2165 /* Memory management */
2170 /* Hardware implementation registers */
2171 /* XXX : not implemented */
2172 spr_register(env
, SPR_HID0
, "HID0",
2173 SPR_NOACCESS
, SPR_NOACCESS
,
2174 &spr_read_generic
, &spr_write_generic
,
2176 /* XXX : not implemented */
2177 spr_register(env
, SPR_HID1
, "HID1",
2178 SPR_NOACCESS
, SPR_NOACCESS
,
2179 &spr_read_generic
, &spr_write_generic
,
2183 case CPU_PPC_750FX10
: /* IBM PowerPC 750 FX */
2184 case CPU_PPC_750FX20
:
2185 case CPU_PPC_750FX21
:
2186 case CPU_PPC_750FX22
:
2187 case CPU_PPC_750FX23
:
2188 case CPU_PPC_750GX10
: /* IBM PowerPC 750 GX */
2189 case CPU_PPC_750GX11
:
2190 case CPU_PPC_750GX12
:
2191 gen_spr_generic(env
);
2192 gen_spr_ne_601(env
);
2193 /* Memory management */
2195 /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
2200 /* Hardware implementation registers */
2201 /* XXX : not implemented */
2202 spr_register(env
, SPR_HID0
, "HID0",
2203 SPR_NOACCESS
, SPR_NOACCESS
,
2204 &spr_read_generic
, &spr_write_generic
,
2206 /* XXX : not implemented */
2207 spr_register(env
, SPR_HID1
, "HID1",
2208 SPR_NOACCESS
, SPR_NOACCESS
,
2209 &spr_read_generic
, &spr_write_generic
,
2211 /* XXX : not implemented */
2212 spr_register(env
, SPR_750_HID2
, "HID2",
2213 SPR_NOACCESS
, SPR_NOACCESS
,
2214 &spr_read_generic
, &spr_write_generic
,
2218 case CPU_PPC_755_10
: /* PowerPC 755 */
2219 case CPU_PPC_755_11
:
2220 case CPU_PPC_755_20
:
2223 gen_spr_generic(env
);
2224 gen_spr_ne_601(env
);
2225 /* Memory management */
2229 /* Memory management */
2231 gen_6xx_7xx_soft_tlb(env
, 64, 2);
2232 gen_spr_G2_755(env
);
2233 /* L2 cache control */
2234 /* XXX : not implemented */
2235 spr_register(env
, SPR_ICTC
, "ICTC",
2236 SPR_NOACCESS
, SPR_NOACCESS
,
2237 &spr_read_generic
, &spr_write_generic
,
2239 /* XXX : not implemented */
2240 spr_register(env
, SPR_L2PM
, "L2PM",
2241 SPR_NOACCESS
, SPR_NOACCESS
,
2242 &spr_read_generic
, &spr_write_generic
,
2244 /* Hardware implementation registers */
2245 /* XXX : not implemented */
2246 spr_register(env
, SPR_HID0
, "HID0",
2247 SPR_NOACCESS
, SPR_NOACCESS
,
2248 &spr_read_generic
, &spr_write_generic
,
2250 /* XXX : not implemented */
2251 spr_register(env
, SPR_HID1
, "HID1",
2252 SPR_NOACCESS
, SPR_NOACCESS
,
2253 &spr_read_generic
, &spr_write_generic
,
2255 /* XXX : not implemented */
2256 spr_register(env
, SPR_HID2
, "HID2",
2257 SPR_NOACCESS
, SPR_NOACCESS
,
2258 &spr_read_generic
, &spr_write_generic
,
2264 case CPU_PPC_7400
: /* PowerPC 7400 */
2265 case CPU_PPC_7410C
: /* PowerPC 7410 */
2268 case CPU_PPC_7441
: /* PowerPC 7441 */
2269 case CPU_PPC_7445
: /* PowerPC 7445 */
2270 case CPU_PPC_7447
: /* PowerPC 7447 */
2271 case CPU_PPC_7447A
: /* PowerPC 7447A */
2272 case CPU_PPC_7448
: /* PowerPC 7448 */
2273 case CPU_PPC_7450
: /* PowerPC 7450 */
2275 case CPU_PPC_7451
: /* PowerPC 7451 */
2277 case CPU_PPC_7455
: /* PowerPC 7455 */
2280 case CPU_PPC_7457
: /* PowerPC 7457 */
2282 case CPU_PPC_7457A
: /* PowerPC 7457A */
2286 /* 64 bits PowerPC */
2287 #if defined (TARGET_PPC64)
2289 case CPU_PPC_620
: /* PowerPC 620 */
2290 case CPU_PPC_630
: /* PowerPC 630 (Power 3) */
2291 case CPU_PPC_631
: /* PowerPC 631 (Power 3+) */
2292 case CPU_PPC_POWER4
: /* Power 4 */
2293 case CPU_PPC_POWER4P
: /* Power 4+ */
2294 case CPU_PPC_POWER5
: /* Power 5 */
2295 case CPU_PPC_POWER5P
: /* Power 5+ */
2297 case CPU_PPC_970
: /* PowerPC 970 */
2298 case CPU_PPC_970FX10
: /* PowerPC 970 FX */
2299 case CPU_PPC_970FX20
:
2300 case CPU_PPC_970FX21
:
2301 case CPU_PPC_970FX30
:
2302 case CPU_PPC_970FX31
:
2303 case CPU_PPC_970MP10
: /* PowerPC 970 MP */
2304 case CPU_PPC_970MP11
:
2306 case CPU_PPC_CELL10
: /* Cell family */
2307 case CPU_PPC_CELL20
:
2308 case CPU_PPC_CELL30
:
2309 case CPU_PPC_CELL31
:
2312 case CPU_PPC_RS64
: /* Apache (RS64/A35) */
2313 case CPU_PPC_RS64II
: /* NorthStar (RS64-II/A50) */
2314 case CPU_PPC_RS64III
: /* Pulsar (RS64-III) */
2315 case CPU_PPC_RS64IV
: /* IceStar/IStar/SStar (RS64-IV) */
2318 #endif /* defined (TARGET_PPC64) */
2322 case CPU_POWER
: /* POWER */
2323 case CPU_POWER2
: /* POWER2 */
2328 gen_spr_generic(env
);
2331 if (env
->nb_BATs
== -1)
2333 /* Allocate TLBs buffer when needed */
2334 if (env
->nb_tlb
!= 0) {
2335 int nb_tlb
= env
->nb_tlb
;
2336 if (env
->id_tlbs
!= 0)
2338 env
->tlb
= qemu_mallocz(nb_tlb
* sizeof(ppc_tlb_t
));
2339 /* Pre-compute some useful values */
2340 env
->tlb_per_way
= env
->nb_tlb
/ env
->nb_ways
;
2344 #if defined(PPC_DUMP_CPU)
2345 static void dump_sprs (CPUPPCState
*env
)
2348 uint32_t pvr
= env
->spr
[SPR_PVR
];
2349 uint32_t sr
, sw
, ur
, uw
;
2352 printf("* SPRs for PVR=%08x\n", pvr
);
2353 for (i
= 0; i
< 32; i
++) {
2354 for (j
= 0; j
< 32; j
++) {
2356 spr
= &env
->spr_cb
[n
];
2357 #if !defined(CONFIG_USER_ONLY)
2358 sw
= spr
->oea_write
!= NULL
&& spr
->oea_write
!= SPR_NOACCESS
;
2359 sr
= spr
->oea_read
!= NULL
&& spr
->oea_read
!= SPR_NOACCESS
;
2364 uw
= spr
->uea_write
!= NULL
&& spr
->uea_write
!= SPR_NOACCESS
;
2365 ur
= spr
->uea_read
!= NULL
&& spr
->uea_read
!= SPR_NOACCESS
;
2366 if (sw
|| sr
|| uw
|| ur
) {
2367 printf("%4d (%03x) %8s s%c%c u%c%c\n",
2368 (i
<< 5) | j
, (i
<< 5) | j
, spr
->name
,
2369 sw
? 'w' : '-', sr
? 'r' : '-',
2370 uw
? 'w' : '-', ur
? 'r' : '-');
2379 /*****************************************************************************/
2383 int fflush (FILE *stream
);
2387 PPC_DIRECT
= 0, /* Opcode routine */
2388 PPC_INDIRECT
= 1, /* Indirect opcode table */
2391 static inline int is_indirect_opcode (void *handler
)
2393 return ((unsigned long)handler
& 0x03) == PPC_INDIRECT
;
2396 static inline opc_handler_t
**ind_table(void *handler
)
2398 return (opc_handler_t
**)((unsigned long)handler
& ~3);
2401 /* Instruction table creation */
2402 /* Opcodes tables creation */
2403 static void fill_new_table (opc_handler_t
**table
, int len
)
2407 for (i
= 0; i
< len
; i
++)
2408 table
[i
] = &invalid_handler
;
2411 static int create_new_table (opc_handler_t
**table
, unsigned char idx
)
2413 opc_handler_t
**tmp
;
2415 tmp
= malloc(0x20 * sizeof(opc_handler_t
));
2418 fill_new_table(tmp
, 0x20);
2419 table
[idx
] = (opc_handler_t
*)((unsigned long)tmp
| PPC_INDIRECT
);
2424 static int insert_in_table (opc_handler_t
**table
, unsigned char idx
,
2425 opc_handler_t
*handler
)
2427 if (table
[idx
] != &invalid_handler
)
2429 table
[idx
] = handler
;
2434 static int register_direct_insn (opc_handler_t
**ppc_opcodes
,
2435 unsigned char idx
, opc_handler_t
*handler
)
2437 if (insert_in_table(ppc_opcodes
, idx
, handler
) < 0) {
2438 printf("*** ERROR: opcode %02x already assigned in main "
2439 "opcode table\n", idx
);
2446 static int register_ind_in_table (opc_handler_t
**table
,
2447 unsigned char idx1
, unsigned char idx2
,
2448 opc_handler_t
*handler
)
2450 if (table
[idx1
] == &invalid_handler
) {
2451 if (create_new_table(table
, idx1
) < 0) {
2452 printf("*** ERROR: unable to create indirect table "
2453 "idx=%02x\n", idx1
);
2457 if (!is_indirect_opcode(table
[idx1
])) {
2458 printf("*** ERROR: idx %02x already assigned to a direct "
2463 if (handler
!= NULL
&&
2464 insert_in_table(ind_table(table
[idx1
]), idx2
, handler
) < 0) {
2465 printf("*** ERROR: opcode %02x already assigned in "
2466 "opcode table %02x\n", idx2
, idx1
);
2473 static int register_ind_insn (opc_handler_t
**ppc_opcodes
,
2474 unsigned char idx1
, unsigned char idx2
,
2475 opc_handler_t
*handler
)
2479 ret
= register_ind_in_table(ppc_opcodes
, idx1
, idx2
, handler
);
2484 static int register_dblind_insn (opc_handler_t
**ppc_opcodes
,
2485 unsigned char idx1
, unsigned char idx2
,
2486 unsigned char idx3
, opc_handler_t
*handler
)
2488 if (register_ind_in_table(ppc_opcodes
, idx1
, idx2
, NULL
) < 0) {
2489 printf("*** ERROR: unable to join indirect table idx "
2490 "[%02x-%02x]\n", idx1
, idx2
);
2493 if (register_ind_in_table(ind_table(ppc_opcodes
[idx1
]), idx2
, idx3
,
2495 printf("*** ERROR: unable to insert opcode "
2496 "[%02x-%02x-%02x]\n", idx1
, idx2
, idx3
);
2503 static int register_insn (opc_handler_t
**ppc_opcodes
, opcode_t
*insn
)
2505 if (insn
->opc2
!= 0xFF) {
2506 if (insn
->opc3
!= 0xFF) {
2507 if (register_dblind_insn(ppc_opcodes
, insn
->opc1
, insn
->opc2
,
2508 insn
->opc3
, &insn
->handler
) < 0)
2511 if (register_ind_insn(ppc_opcodes
, insn
->opc1
,
2512 insn
->opc2
, &insn
->handler
) < 0)
2516 if (register_direct_insn(ppc_opcodes
, insn
->opc1
, &insn
->handler
) < 0)
2523 static int test_opcode_table (opc_handler_t
**table
, int len
)
2527 for (i
= 0, count
= 0; i
< len
; i
++) {
2528 /* Consistency fixup */
2529 if (table
[i
] == NULL
)
2530 table
[i
] = &invalid_handler
;
2531 if (table
[i
] != &invalid_handler
) {
2532 if (is_indirect_opcode(table
[i
])) {
2533 tmp
= test_opcode_table(ind_table(table
[i
]), 0x20);
2536 table
[i
] = &invalid_handler
;
2549 static void fix_opcode_tables (opc_handler_t
**ppc_opcodes
)
2551 if (test_opcode_table(ppc_opcodes
, 0x40) == 0)
2552 printf("*** WARNING: no opcode defined !\n");
2555 /*****************************************************************************/
2556 static int create_ppc_opcodes (CPUPPCState
*env
, ppc_def_t
*def
)
2558 opcode_t
*opc
, *start
, *end
;
2560 fill_new_table(env
->opcodes
, 0x40);
2561 #if defined(PPC_DUMP_CPU)
2562 printf("* PowerPC instructions for PVR %08x: %s flags %016" PRIx64
2564 def
->pvr
, def
->name
, def
->insns_flags
, def
->flags
);
2566 if (&opc_start
< &opc_end
) {
2573 for (opc
= start
+ 1; opc
!= end
; opc
++) {
2574 if ((opc
->handler
.type
& def
->insns_flags
) != 0) {
2575 if (register_insn(env
->opcodes
, opc
) < 0) {
2576 printf("*** ERROR initializing PowerPC instruction "
2577 "0x%02x 0x%02x 0x%02x\n", opc
->opc1
, opc
->opc2
,
2581 #if defined(PPC_DUMP_CPU)
2583 if (opc
->opc3
== 0xFF) {
2584 if (opc
->opc2
== 0xFF) {
2585 printf(" %02x -- -- (%2d ----) : %s\n",
2586 opc
->opc1
, opc
->opc1
, opc
->oname
);
2588 printf(" %02x %02x -- (%2d %4d) : %s\n",
2589 opc
->opc1
, opc
->opc2
, opc
->opc1
, opc
->opc2
,
2593 printf(" %02x %02x %02x (%2d %4d) : %s\n",
2594 opc
->opc1
, opc
->opc2
, opc
->opc3
,
2595 opc
->opc1
, (opc
->opc3
<< 5) | opc
->opc2
,
2602 fix_opcode_tables(env
->opcodes
);
2609 int cpu_ppc_register (CPUPPCState
*env
, ppc_def_t
*def
)
2611 env
->msr_mask
= def
->msr_mask
;
2612 env
->flags
= def
->flags
;
2613 if (create_ppc_opcodes(env
, def
) < 0)
2615 init_ppc_proc(env
, def
);
2616 #if defined(PPC_DUMP_CPU)
2618 if (env
->tlb
!= NULL
) {
2619 printf("%d %s TLB in %d ways\n", env
->nb_tlb
,
2620 env
->id_tlbs
? "splitted" : "merged", env
->nb_ways
);
2627 void do_compute_hflags (CPUPPCState
*env
);
2628 CPUPPCState
*cpu_ppc_init (void)
2632 env
= qemu_mallocz(sizeof(CPUPPCState
));
2637 #if defined (DO_SINGLE_STEP) && 0
2638 /* Single step trace mode */
2642 msr_fp
= 1; /* Allow floating point exceptions */
2643 msr_me
= 1; /* Allow machine check exceptions */
2644 #if defined(CONFIG_USER_ONLY)
2647 env
->nip
= 0xFFFFFFFC;
2649 do_compute_hflags(env
);
2654 void cpu_ppc_close(CPUPPCState
*env
)
2656 /* Should also remove all opcode tables... */
2660 /*****************************************************************************/
2661 /* PowerPC CPU definitions */
2662 static ppc_def_t ppc_defs
[] =
2664 /* Embedded PowerPC */
2670 .pvr_mask
= 0xFFFF0000,
2671 .insns_flags
= PPC_INSNS_401
,
2672 .flags
= PPC_FLAGS_401
,
2677 /* IOP480 (401 microcontroler) */
2680 .pvr
= CPU_PPC_IOP480
,
2681 .pvr_mask
= 0xFFFF0000,
2682 .insns_flags
= PPC_INSNS_401
,
2683 .flags
= PPC_FLAGS_401
,
2688 /* IBM Processor for Network Resources */
2691 .pvr
= CPU_PPC_COBRA
,
2692 .pvr_mask
= 0xFFFF0000,
2693 .insns_flags
= PPC_INSNS_401
,
2694 .flags
= PPC_FLAGS_401
,
2699 /* Generic PowerPC 403 */
2703 .pvr_mask
= 0xFFFFFF00,
2704 .insns_flags
= PPC_INSNS_403
,
2705 .flags
= PPC_FLAGS_403
,
2706 .msr_mask
= 0x000000000007D23D,
2710 /* PowerPC 403 GA */
2713 .pvr
= CPU_PPC_403GA
,
2714 .pvr_mask
= 0xFFFFFF00,
2715 .insns_flags
= PPC_INSNS_403
,
2716 .flags
= PPC_FLAGS_403
,
2717 .msr_mask
= 0x000000000007D23D,
2721 /* PowerPC 403 GB */
2724 .pvr
= CPU_PPC_403GB
,
2725 .pvr_mask
= 0xFFFFFF00,
2726 .insns_flags
= PPC_INSNS_403
,
2727 .flags
= PPC_FLAGS_403
,
2728 .msr_mask
= 0x000000000007D23D,
2732 /* PowerPC 403 GC */
2735 .pvr
= CPU_PPC_403GC
,
2736 .pvr_mask
= 0xFFFFFF00,
2737 .insns_flags
= PPC_INSNS_403
,
2738 .flags
= PPC_FLAGS_403
,
2739 .msr_mask
= 0x000000000007D23D,
2743 /* PowerPC 403 GCX */
2746 .pvr
= CPU_PPC_403GCX
,
2747 .pvr_mask
= 0xFFFFFF00,
2748 .insns_flags
= PPC_INSNS_403
,
2749 .flags
= PPC_FLAGS_403
,
2750 .msr_mask
= 0x000000000007D23D,
2754 /* Generic PowerPC 405 */
2758 .pvr_mask
= 0xFFFF0000,
2759 .insns_flags
= PPC_INSNS_405
,
2760 .flags
= PPC_FLAGS_405
,
2761 .msr_mask
= 0x00000000020EFF30,
2765 /* PowerPC 405 CR */
2769 .pvr_mask
= 0xFFFF0000,
2770 .insns_flags
= PPC_INSNS_405
,
2771 .flags
= PPC_FLAGS_405
,
2772 .msr_mask
= 0x00000000020EFF30,
2776 /* PowerPC 405 GP */
2780 .pvr_mask
= 0xFFFF0000,
2781 .insns_flags
= PPC_INSNS_405
,
2782 .flags
= PPC_FLAGS_405
,
2783 .msr_mask
= 0x00000000020EFF30,
2787 /* PowerPC 405 EP */
2790 .pvr
= CPU_PPC_405EP
,
2791 .pvr_mask
= 0xFFFF0000,
2792 .insns_flags
= PPC_INSNS_405
,
2793 .flags
= PPC_FLAGS_405
,
2794 .msr_mask
= 0x00000000020EFF30,
2798 /* PowerPC 405 GPR */
2801 .pvr
= CPU_PPC_405GPR
,
2802 .pvr_mask
= 0xFFFF0000,
2803 .insns_flags
= PPC_INSNS_405
,
2804 .flags
= PPC_FLAGS_405
,
2805 .msr_mask
= 0x00000000020EFF30,
2809 /* PowerPC 405 D2 */
2812 .pvr
= CPU_PPC_405D2
,
2813 .pvr_mask
= 0xFFFF0000,
2814 .insns_flags
= PPC_INSNS_405
,
2815 .flags
= PPC_FLAGS_405
,
2816 .msr_mask
= 0x00000000020EFF30,
2820 /* PowerPC 405 D4 */
2823 .pvr
= CPU_PPC_405D4
,
2824 .pvr_mask
= 0xFFFF0000,
2825 .insns_flags
= PPC_INSNS_405
,
2826 .flags
= PPC_FLAGS_405
,
2827 .msr_mask
= 0x00000000020EFF30,
2834 .pvr
= CPU_PPC_NPE405H
,
2835 .pvr_mask
= 0xFFFF0000,
2836 .insns_flags
= PPC_INSNS_405
,
2837 .flags
= PPC_FLAGS_405
,
2838 .msr_mask
= 0x00000000020EFF30,
2845 .pvr
= CPU_PPC_NPE405L
,
2846 .pvr_mask
= 0xFFFF0000,
2847 .insns_flags
= PPC_INSNS_405
,
2848 .flags
= PPC_FLAGS_405
,
2849 .msr_mask
= 0x00000000020EFF30,
2856 .pvr
= CPU_PPC_STB01000
,
2857 .pvr_mask
= 0xFFFF0000,
2858 .insns_flags
= PPC_INSNS_405
,
2859 .flags
= PPC_FLAGS_405
,
2860 .msr_mask
= 0x00000000020EFF30,
2867 .pvr
= CPU_PPC_STB01010
,
2868 .pvr_mask
= 0xFFFF0000,
2869 .insns_flags
= PPC_INSNS_405
,
2870 .flags
= PPC_FLAGS_405
,
2871 .msr_mask
= 0x00000000020EFF30,
2878 .pvr
= CPU_PPC_STB0210
,
2879 .pvr_mask
= 0xFFFF0000,
2880 .insns_flags
= PPC_INSNS_405
,
2881 .flags
= PPC_FLAGS_405
,
2882 .msr_mask
= 0x00000000020EFF30,
2889 .pvr
= CPU_PPC_STB03
,
2890 .pvr_mask
= 0xFFFF0000,
2891 .insns_flags
= PPC_INSNS_405
,
2892 .flags
= PPC_FLAGS_405
,
2893 .msr_mask
= 0x00000000020EFF30,
2900 .pvr
= CPU_PPC_STB043
,
2901 .pvr_mask
= 0xFFFF0000,
2902 .insns_flags
= PPC_INSNS_405
,
2903 .flags
= PPC_FLAGS_405
,
2904 .msr_mask
= 0x00000000020EFF30,
2911 .pvr
= CPU_PPC_STB045
,
2912 .pvr_mask
= 0xFFFF0000,
2913 .insns_flags
= PPC_INSNS_405
,
2914 .flags
= PPC_FLAGS_405
,
2915 .msr_mask
= 0x00000000020EFF30,
2922 .pvr
= CPU_PPC_STB25
,
2923 .pvr_mask
= 0xFFFF0000,
2924 .insns_flags
= PPC_INSNS_405
,
2925 .flags
= PPC_FLAGS_405
,
2926 .msr_mask
= 0x00000000020EFF30,
2933 .pvr
= CPU_PPC_STB130
,
2934 .pvr_mask
= 0xFFFF0000,
2935 .insns_flags
= PPC_INSNS_405
,
2936 .flags
= PPC_FLAGS_405
,
2937 .msr_mask
= 0x00000000020EFF30,
2940 /* Xilinx PowerPC 405 cores */
2944 .pvr
= CPU_PPC_X2VP4
,
2945 .pvr_mask
= 0xFFFF0000,
2946 .insns_flags
= PPC_INSNS_405
,
2947 .flags
= PPC_FLAGS_405
,
2948 .msr_mask
= 0x00000000020EFF30,
2952 .pvr
= CPU_PPC_X2VP7
,
2953 .pvr_mask
= 0xFFFF0000,
2954 .insns_flags
= PPC_INSNS_405
,
2955 .flags
= PPC_FLAGS_405
,
2956 .msr_mask
= 0x00000000020EFF30,
2960 .pvr
= CPU_PPC_X2VP20
,
2961 .pvr_mask
= 0xFFFF0000,
2962 .insns_flags
= PPC_INSNS_405
,
2963 .flags
= PPC_FLAGS_405
,
2964 .msr_mask
= 0x00000000020EFF30,
2968 .pvr
= CPU_PPC_X2VP50
,
2969 .pvr_mask
= 0xFFFF0000,
2970 .insns_flags
= PPC_INSNS_405
,
2971 .flags
= PPC_FLAGS_405
,
2972 .msr_mask
= 0x00000000020EFF30,
2976 /* PowerPC 440 EP */
2979 .pvr
= CPU_PPC_440EP
,
2980 .pvr_mask
= 0xFFFF0000,
2981 .insns_flags
= PPC_INSNS_440
,
2982 .flags
= PPC_FLAGS_440
,
2983 .msr_mask
= 0x000000000006D630,
2987 /* PowerPC 440 GR */
2990 .pvr
= CPU_PPC_440GR
,
2991 .pvr_mask
= 0xFFFF0000,
2992 .insns_flags
= PPC_INSNS_440
,
2993 .flags
= PPC_FLAGS_440
,
2994 .msr_mask
= 0x000000000006D630,
2998 /* PowerPC 440 GP */
3001 .pvr
= CPU_PPC_440GP
,
3002 .pvr_mask
= 0xFFFFFF00,
3003 .insns_flags
= PPC_INSNS_440
,
3004 .flags
= PPC_FLAGS_440
,
3005 .msr_mask
= 0x000000000006D630,
3009 /* PowerPC 440 GX */
3012 .pvr
= CPU_PPC_440GX
,
3013 .pvr_mask
= 0xFFFF0000,
3014 .insns_flags
= PPC_INSNS_405
,
3015 .flags
= PPC_FLAGS_440
,
3016 .msr_mask
= 0x000000000006D630,
3020 /* PowerPC 440 GXc */
3023 .pvr
= CPU_PPC_440GXC
,
3024 .pvr_mask
= 0xFFFF0000,
3025 .insns_flags
= PPC_INSNS_405
,
3026 .flags
= PPC_FLAGS_440
,
3027 .msr_mask
= 0x000000000006D630,
3031 /* PowerPC 440 GXf */
3034 .pvr
= CPU_PPC_440GXF
,
3035 .pvr_mask
= 0xFFFF0000,
3036 .insns_flags
= PPC_INSNS_405
,
3037 .flags
= PPC_FLAGS_440
,
3038 .msr_mask
= 0x000000000006D630,
3042 /* PowerPC 440 SP */
3045 .pvr
= CPU_PPC_440SP
,
3046 .pvr_mask
= 0xFFFF0000,
3047 .insns_flags
= PPC_INSNS_405
,
3048 .flags
= PPC_FLAGS_440
,
3049 .msr_mask
= 0x000000000006D630,
3053 /* PowerPC 440 SP2 */
3056 .pvr
= CPU_PPC_440SP2
,
3057 .pvr_mask
= 0xFFFF0000,
3058 .insns_flags
= PPC_INSNS_405
,
3059 .flags
= PPC_FLAGS_440
,
3060 .msr_mask
= 0x000000000006D630,
3064 /* PowerPC 440 SPE */
3067 .pvr
= CPU_PPC_440SPE
,
3068 .pvr_mask
= 0xFFFF0000,
3069 .insns_flags
= PPC_INSNS_405
,
3070 .flags
= PPC_FLAGS_440
,
3071 .msr_mask
= 0x000000000006D630,
3074 /* Fake generic BookE PowerPC */
3077 .pvr
= CPU_PPC_e500
,
3078 .pvr_mask
= 0xFFFFFFFF,
3079 .insns_flags
= PPC_INSNS_BOOKE
,
3080 .flags
= PPC_FLAGS_BOOKE
,
3081 .msr_mask
= 0x000000000006D630,
3083 /* PowerPC 460 cores - TODO */
3084 /* PowerPC MPC 5xx cores - TODO */
3085 /* PowerPC MPC 8xx cores - TODO */
3086 /* PowerPC MPC 8xxx cores - TODO */
3087 /* e200 cores - TODO */
3088 /* e500 cores - TODO */
3089 /* e600 cores - TODO */
3091 /* 32 bits "classic" PowerPC */
3097 .pvr_mask
= 0xFFFF0000,
3098 .insns_flags
= PPC_INSNS_601
,
3099 .flags
= PPC_FLAGS_601
,
3100 .msr_mask
= 0x000000000000FD70,
3108 .pvr_mask
= 0xFFFF0000,
3109 .insns_flags
= PPC_INSNS_602
,
3110 .flags
= PPC_FLAGS_602
,
3111 .msr_mask
= 0x0000000000C7FF73,
3118 .pvr_mask
= 0xFFFFFFFF,
3119 .insns_flags
= PPC_INSNS_603
,
3120 .flags
= PPC_FLAGS_603
,
3121 .msr_mask
= 0x000000000007FF73,
3126 .pvr
= CPU_PPC_603E
,
3127 .pvr_mask
= 0xFFFFFFFF,
3128 .insns_flags
= PPC_INSNS_603
,
3129 .flags
= PPC_FLAGS_603
,
3130 .msr_mask
= 0x000000000007FF73,
3134 .pvr
= CPU_PPC_603E
,
3135 .pvr_mask
= 0xFFFFFFFF,
3136 .insns_flags
= PPC_INSNS_603
,
3137 .flags
= PPC_FLAGS_603
,
3138 .msr_mask
= 0x000000000007FF73,
3143 .pvr
= CPU_PPC_603P
,
3144 .pvr_mask
= 0xFFFFFFFF,
3145 .insns_flags
= PPC_INSNS_603
,
3146 .flags
= PPC_FLAGS_603
,
3147 .msr_mask
= 0x000000000007FF73,
3152 .pvr
= CPU_PPC_603E7
,
3153 .pvr_mask
= 0xFFFFFFFF,
3154 .insns_flags
= PPC_INSNS_603
,
3155 .flags
= PPC_FLAGS_603
,
3156 .msr_mask
= 0x000000000007FF73,
3158 /* PowerPC 603e7v */
3161 .pvr
= CPU_PPC_603E7v
,
3162 .pvr_mask
= 0xFFFFFFFF,
3163 .insns_flags
= PPC_INSNS_603
,
3164 .flags
= PPC_FLAGS_603
,
3165 .msr_mask
= 0x000000000007FF73,
3167 /* PowerPC 603e7v2 */
3170 .pvr
= CPU_PPC_603E7v2
,
3171 .pvr_mask
= 0xFFFFFFFF,
3172 .insns_flags
= PPC_INSNS_603
,
3173 .flags
= PPC_FLAGS_603
,
3174 .msr_mask
= 0x000000000007FF73,
3179 .pvr
= CPU_PPC_603R
,
3180 .pvr_mask
= 0xFFFFFFFF,
3181 .insns_flags
= PPC_INSNS_603
,
3182 .flags
= PPC_FLAGS_603
,
3183 .msr_mask
= 0x000000000007FF73,
3186 .name
= "Goldeneye",
3187 .pvr
= CPU_PPC_603R
,
3188 .pvr_mask
= 0xFFFFFFFF,
3189 .insns_flags
= PPC_INSNS_603
,
3190 .flags
= PPC_FLAGS_603
,
3191 .msr_mask
= 0x000000000007FF73,
3194 /* XXX: TODO: according to Motorola UM, this is a derivative to 603e */
3198 .pvr_mask
= 0xFFFF0000,
3199 .insns_flags
= PPC_INSNS_G2
,
3200 .flags
= PPC_FLAGS_G2
,
3201 .msr_mask
= 0x000000000006FFF2,
3205 .pvr
= CPU_PPC_G2H4
,
3206 .pvr_mask
= 0xFFFF0000,
3207 .insns_flags
= PPC_INSNS_G2
,
3208 .flags
= PPC_FLAGS_G2
,
3209 .msr_mask
= 0x000000000006FFF2,
3213 .pvr
= CPU_PPC_G2gp
,
3214 .pvr_mask
= 0xFFFF0000,
3215 .insns_flags
= PPC_INSNS_G2
,
3216 .flags
= PPC_FLAGS_G2
,
3217 .msr_mask
= 0x000000000006FFF2,
3221 .pvr
= CPU_PPC_G2ls
,
3222 .pvr_mask
= 0xFFFF0000,
3223 .insns_flags
= PPC_INSNS_G2
,
3224 .flags
= PPC_FLAGS_G2
,
3225 .msr_mask
= 0x000000000006FFF2,
3227 { /* Same as G2, with LE mode support */
3229 .pvr
= CPU_PPC_G2LE
,
3230 .pvr_mask
= 0xFFFF0000,
3231 .insns_flags
= PPC_INSNS_G2
,
3232 .flags
= PPC_FLAGS_G2
,
3233 .msr_mask
= 0x000000000007FFF3,
3237 .pvr
= CPU_PPC_G2LEgp
,
3238 .pvr_mask
= 0xFFFF0000,
3239 .insns_flags
= PPC_INSNS_G2
,
3240 .flags
= PPC_FLAGS_G2
,
3241 .msr_mask
= 0x000000000007FFF3,
3245 .pvr
= CPU_PPC_G2LEls
,
3246 .pvr_mask
= 0xFFFF0000,
3247 .insns_flags
= PPC_INSNS_G2
,
3248 .flags
= PPC_FLAGS_G2
,
3249 .msr_mask
= 0x000000000007FFF3,
3256 .pvr_mask
= 0xFFFFFFFF,
3257 .insns_flags
= PPC_INSNS_604
,
3258 .flags
= PPC_FLAGS_604
,
3259 .msr_mask
= 0x000000000005FF77,
3264 .pvr
= CPU_PPC_604E
,
3265 .pvr_mask
= 0xFFFFFFFF,
3266 .insns_flags
= PPC_INSNS_604
,
3267 .flags
= PPC_FLAGS_604
,
3268 .msr_mask
= 0x000000000005FF77,
3273 .pvr
= CPU_PPC_604R
,
3274 .pvr_mask
= 0xFFFFFFFF,
3275 .insns_flags
= PPC_INSNS_604
,
3276 .flags
= PPC_FLAGS_604
,
3277 .msr_mask
= 0x000000000005FF77,
3283 .pvr_mask
= 0xFFFFFFFF,
3284 .insns_flags
= PPC_INSNS_7x0
,
3285 .flags
= PPC_FLAGS_7x0
,
3286 .msr_mask
= 0x000000000007FF77,
3292 .pvr_mask
= 0xFFFFFFFF,
3293 .insns_flags
= PPC_INSNS_7x0
,
3294 .flags
= PPC_FLAGS_7x0
,
3295 .msr_mask
= 0x000000000007FF77,
3300 .pvr_mask
= 0xFFFFFFFF,
3301 .insns_flags
= PPC_INSNS_7x0
,
3302 .flags
= PPC_FLAGS_7x0
,
3303 .msr_mask
= 0x000000000007FF77,
3310 .pvr_mask
= 0xFFFFF000,
3311 .insns_flags
= PPC_INSNS_7x5
,
3312 .flags
= PPC_FLAGS_7x5
,
3313 .msr_mask
= 0x000000000007FF77,
3316 .name
= "Goldfinger",
3318 .pvr_mask
= 0xFFFFF000,
3319 .insns_flags
= PPC_INSNS_7x5
,
3320 .flags
= PPC_FLAGS_7x5
,
3321 .msr_mask
= 0x000000000007FF77,
3328 .pvr_mask
= 0xFFFFFFFF,
3329 .insns_flags
= PPC_INSNS_7x0
,
3330 .flags
= PPC_FLAGS_7x0
,
3331 .msr_mask
= 0x000000000007FF77,
3338 .pvr_mask
= 0xFFFFF000,
3339 .insns_flags
= PPC_INSNS_7x5
,
3340 .flags
= PPC_FLAGS_7x5
,
3341 .msr_mask
= 0x000000000007FF77,
3347 .pvr
= CPU_PPC_74xP
,
3348 .pvr_mask
= 0xFFFFFFFF,
3349 .insns_flags
= PPC_INSNS_7x0
,
3350 .flags
= PPC_FLAGS_7x0
,
3351 .msr_mask
= 0x000000000007FF77,
3354 .name
= "Conan/Doyle",
3355 .pvr
= CPU_PPC_74xP
,
3356 .pvr_mask
= 0xFFFFFFFF,
3357 .insns_flags
= PPC_INSNS_7x0
,
3358 .flags
= PPC_FLAGS_7x0
,
3359 .msr_mask
= 0x000000000007FF77,
3365 .pvr
= CPU_PPC_74xP
,
3366 .pvr_mask
= 0xFFFFF000,
3367 .insns_flags
= PPC_INSNS_7x5
,
3368 .flags
= PPC_FLAGS_7x5
,
3369 .msr_mask
= 0x000000000007FF77,
3375 .pvr
= CPU_PPC_74xP
,
3376 .pvr_mask
= 0xFFFFFFFF,
3377 .insns_flags
= PPC_INSNS_7x0
,
3378 .flags
= PPC_FLAGS_7x0
,
3379 .msr_mask
= 0x000000000007FF77,
3385 .pvr
= CPU_PPC_74xP
,
3386 .pvr_mask
= 0xFFFFF000,
3387 .insns_flags
= PPC_INSNS_7x5
,
3388 .flags
= PPC_FLAGS_7x5
,
3389 .msr_mask
= 0x000000000007FF77,
3392 /* IBM 750CXe (G3 embedded) */
3395 .pvr
= CPU_PPC_750CXE
,
3396 .pvr_mask
= 0xFFFFFFFF,
3397 .insns_flags
= PPC_INSNS_7x0
,
3398 .flags
= PPC_FLAGS_7x0
,
3399 .msr_mask
= 0x000000000007FF77,
3401 /* IBM 750FX (G3 embedded) */
3404 .pvr
= CPU_PPC_750FX
,
3405 .pvr_mask
= 0xFFFFFFFF,
3406 .insns_flags
= PPC_INSNS_7x0
,
3407 .flags
= PPC_FLAGS_7x0
,
3408 .msr_mask
= 0x000000000007FF77,
3410 /* IBM 750GX (G3 embedded) */
3413 .pvr
= CPU_PPC_750GX
,
3414 .pvr_mask
= 0xFFFFFFFF,
3415 .insns_flags
= PPC_INSNS_7x0
,
3416 .flags
= PPC_FLAGS_7x0
,
3417 .msr_mask
= 0x000000000007FF77,
3423 .pvr
= CPU_PPC_7400
,
3424 .pvr_mask
= 0xFFFF0000,
3425 .insns_flags
= PPC_INSNS_74xx
,
3426 .flags
= PPC_FLAGS_74xx
,
3427 .msr_mask
= 0x000000000205FF77,
3431 /* PowerPC 7400 (G4) */
3434 .pvr
= CPU_PPC_7400
,
3435 .pvr_mask
= 0xFFFF0000,
3436 .insns_flags
= PPC_INSNS_74xx
,
3437 .flags
= PPC_FLAGS_74xx
,
3438 .msr_mask
= 0x000000000205FF77,
3442 .pvr
= CPU_PPC_7400
,
3443 .pvr_mask
= 0xFFFF0000,
3444 .insns_flags
= PPC_INSNS_74xx
,
3445 .flags
= PPC_FLAGS_74xx
,
3446 .msr_mask
= 0x000000000205FF77,
3450 /* PowerPC 7410 (G4) */
3453 .pvr
= CPU_PPC_7410
,
3454 .pvr_mask
= 0xFFFF0000,
3455 .insns_flags
= PPC_INSNS_74xx
,
3456 .flags
= PPC_FLAGS_74xx
,
3457 .msr_mask
= 0x000000000205FF77,
3461 .pvr
= CPU_PPC_7410
,
3462 .pvr_mask
= 0xFFFF0000,
3463 .insns_flags
= PPC_INSNS_74xx
,
3464 .flags
= PPC_FLAGS_74xx
,
3465 .msr_mask
= 0x000000000205FF77,
3473 /* PowerPC 7450 (G4) */
3476 .pvr
= CPU_PPC_7450
,
3477 .pvr_mask
= 0xFFFF0000,
3478 .insns_flags
= PPC_INSNS_74xx
,
3479 .flags
= PPC_FLAGS_74xx
,
3480 .msr_mask
= 0x000000000205FF77,
3484 .pvr
= CPU_PPC_7450
,
3485 .pvr_mask
= 0xFFFF0000,
3486 .insns_flags
= PPC_INSNS_74xx
,
3487 .flags
= PPC_FLAGS_74xx
,
3488 .msr_mask
= 0x000000000205FF77,
3493 /* PowerPC 7455 (G4) */
3496 .pvr
= CPU_PPC_7455
,
3497 .pvr_mask
= 0xFFFF0000,
3498 .insns_flags
= PPC_INSNS_74xx
,
3499 .flags
= PPC_FLAGS_74xx
,
3500 .msr_mask
= 0x000000000205FF77,
3504 .pvr
= CPU_PPC_7455
,
3505 .pvr_mask
= 0xFFFF0000,
3506 .insns_flags
= PPC_INSNS_74xx
,
3507 .flags
= PPC_FLAGS_74xx
,
3508 .msr_mask
= 0x000000000205FF77,
3512 /* PowerPC 7457 (G4) */
3515 .pvr
= CPU_PPC_7457
,
3516 .pvr_mask
= 0xFFFF0000,
3517 .insns_flags
= PPC_INSNS_74xx
,
3518 .flags
= PPC_FLAGS_74xx
,
3519 .msr_mask
= 0x000000000205FF77,
3523 .pvr
= CPU_PPC_7457
,
3524 .pvr_mask
= 0xFFFF0000,
3525 .insns_flags
= PPC_INSNS_74xx
,
3526 .flags
= PPC_FLAGS_74xx
,
3527 .msr_mask
= 0x000000000205FF77,
3531 /* PowerPC 7457A (G4) */
3534 .pvr
= CPU_PPC_7457A
,
3535 .pvr_mask
= 0xFFFF0000,
3536 .insns_flags
= PPC_INSNS_74xx
,
3537 .flags
= PPC_FLAGS_74xx
,
3538 .msr_mask
= 0x000000000205FF77,
3541 .name
= "Apollo 7 PM",
3542 .pvr
= CPU_PPC_7457A
,
3543 .pvr_mask
= 0xFFFF0000,
3544 .insns_flags
= PPC_INSNS_74xx
,
3545 .flags
= PPC_FLAGS_74xx
,
3546 .msr_mask
= 0x000000000205FF77,
3549 /* 64 bits PowerPC */
3550 #if defined (TARGET_PPC64)
3556 .pvr_mask
= 0xFFFF0000,
3557 .insns_flags
= PPC_INSNS_620
,
3558 .flags
= PPC_FLAGS_620
,
3559 .msr_mask
= 0x800000000005FF73,
3563 /* PowerPC 630 (POWER3) */
3567 .pvr_mask
= 0xFFFF0000,
3568 .insns_flags
= PPC_INSNS_630
,
3569 .flags
= PPC_FLAGS_630
,
3575 .pvr_mask
= 0xFFFF0000,
3576 .insns_flags
= PPC_INSNS_630
,
3577 .flags
= PPC_FLAGS_630
,
3582 /* PowerPC 631 (Power 3+)*/
3586 .pvr_mask
= 0xFFFF0000,
3587 .insns_flags
= PPC_INSNS_631
,
3588 .flags
= PPC_FLAGS_631
,
3594 .pvr_mask
= 0xFFFF0000,
3595 .insns_flags
= PPC_INSNS_631
,
3596 .flags
= PPC_FLAGS_631
,
3604 .pvr
= CPU_PPC_POWER4
,
3605 .pvr_mask
= 0xFFFF0000,
3606 .insns_flags
= PPC_INSNS_POWER4
,
3607 .flags
= PPC_FLAGS_POWER4
,
3615 .pvr
= CPU_PPC_POWER4P
,
3616 .pvr_mask
= 0xFFFF0000,
3617 .insns_flags
= PPC_INSNS_POWER4
,
3618 .flags
= PPC_FLAGS_POWER4
,
3626 .pvr
= CPU_PPC_POWER5
,
3627 .pvr_mask
= 0xFFFF0000,
3628 .insns_flags
= PPC_INSNS_POWER5
,
3629 .flags
= PPC_FLAGS_POWER5
,
3637 .pvr
= CPU_PPC_POWER5P
,
3638 .pvr_mask
= 0xFFFF0000,
3639 .insns_flags
= PPC_INSNS_POWER5
,
3640 .flags
= PPC_FLAGS_POWER5
,
3649 .pvr_mask
= 0xFFFF0000,
3650 .insns_flags
= PPC_INSNS_970
,
3651 .flags
= PPC_FLAGS_970
,
3652 .msr_mask
= 0x900000000204FF36,
3656 /* PowerPC 970FX (G5) */
3659 .pvr
= CPU_PPC_970FX
,
3660 .pvr_mask
= 0xFFFF0000,
3661 .insns_flags
= PPC_INSNS_970FX
,
3662 .flags
= PPC_FLAGS_970FX
,
3663 .msr_mask
= 0x800000000204FF36,
3667 /* RS64 (Apache/A35) */
3668 /* This one seems to support the whole POWER2 instruction set
3669 * and the PowerPC 64 one.
3673 .pvr
= CPU_PPC_RS64
,
3674 .pvr_mask
= 0xFFFF0000,
3675 .insns_flags
= PPC_INSNS_RS64
,
3676 .flags
= PPC_FLAGS_RS64
,
3681 .pvr
= CPU_PPC_RS64
,
3682 .pvr_mask
= 0xFFFF0000,
3683 .insns_flags
= PPC_INSNS_RS64
,
3684 .flags
= PPC_FLAGS_RS64
,
3689 .pvr
= CPU_PPC_RS64
,
3690 .pvr_mask
= 0xFFFF0000,
3691 .insns_flags
= PPC_INSNS_RS64
,
3692 .flags
= PPC_FLAGS_RS64
,
3697 /* RS64-II (NorthStar/A50) */
3700 .pvr
= CPU_PPC_RS64II
,
3701 .pvr_mask
= 0xFFFF0000,
3702 .insns_flags
= PPC_INSNS_RS64
,
3703 .flags
= PPC_FLAGS_RS64
,
3708 .pvr
= CPU_PPC_RS64II
,
3709 .pvr_mask
= 0xFFFF0000,
3710 .insns_flags
= PPC_INSNS_RS64
,
3711 .flags
= PPC_FLAGS_RS64
,
3716 .pvr
= CPU_PPC_RS64II
,
3717 .pvr_mask
= 0xFFFF0000,
3718 .insns_flags
= PPC_INSNS_RS64
,
3719 .flags
= PPC_FLAGS_RS64
,
3724 /* RS64-III (Pulsar) */
3727 .pvr
= CPU_PPC_RS64III
,
3728 .pvr_mask
= 0xFFFF0000,
3729 .insns_flags
= PPC_INSNS_RS64
,
3730 .flags
= PPC_FLAGS_RS64
,
3735 .pvr
= CPU_PPC_RS64III
,
3736 .pvr_mask
= 0xFFFF0000,
3737 .insns_flags
= PPC_INSNS_RS64
,
3738 .flags
= PPC_FLAGS_RS64
,
3743 /* RS64-IV (IceStar/IStar/SStar) */
3746 .pvr
= CPU_PPC_RS64IV
,
3747 .pvr_mask
= 0xFFFF0000,
3748 .insns_flags
= PPC_INSNS_RS64
,
3749 .flags
= PPC_FLAGS_RS64
,
3754 .pvr
= CPU_PPC_RS64IV
,
3755 .pvr_mask
= 0xFFFF0000,
3756 .insns_flags
= PPC_INSNS_RS64
,
3757 .flags
= PPC_FLAGS_RS64
,
3762 .pvr
= CPU_PPC_RS64IV
,
3763 .pvr_mask
= 0xFFFF0000,
3764 .insns_flags
= PPC_INSNS_RS64
,
3765 .flags
= PPC_FLAGS_RS64
,
3770 .pvr
= CPU_PPC_RS64IV
,
3771 .pvr_mask
= 0xFFFF0000,
3772 .insns_flags
= PPC_INSNS_RS64
,
3773 .flags
= PPC_FLAGS_RS64
,
3779 /* Original POWER */
3783 .pvr_mask
= 0xFFFF0000,
3784 .insns_flags
= PPC_INSNS_POWER
,
3785 .flags
= PPC_FLAGS_POWER
,
3789 #endif /* defined (TARGET_PPC64) */
3795 .pvr_mask
= 0xFFFF0000,
3796 .insns_flags
= PPC_INSNS_POWER
,
3797 .flags
= PPC_FLAGS_POWER
,
3801 /* Generic PowerPCs */
3806 .pvr_mask
= 0xFFFF0000,
3807 .insns_flags
= PPC_INSNS_PPC64
,
3808 .flags
= PPC_FLAGS_PPC64
,
3809 .msr_mask
= 0xA00000000204FF36,
3815 .pvr_mask
= 0xFFFFFFFF,
3816 .insns_flags
= PPC_INSNS_PPC32
,
3817 .flags
= PPC_FLAGS_PPC32
,
3818 .msr_mask
= 0x000000000005FF77,
3824 .pvr_mask
= 0xFFFFFFFF,
3825 .insns_flags
= PPC_INSNS_PPC32
,
3826 .flags
= PPC_FLAGS_PPC32
,
3827 .msr_mask
= 0x000000000005FF77,
3831 int ppc_find_by_name (const unsigned char *name
, ppc_def_t
**def
)
3837 for (i
= 0; strcmp(ppc_defs
[i
].name
, "ppc") != 0; i
++) {
3838 if (strcasecmp(name
, ppc_defs
[i
].name
) == 0) {
3839 *def
= &ppc_defs
[i
];
3848 int ppc_find_by_pvr (uint32_t pvr
, ppc_def_t
**def
)
3854 for (i
= 0; ppc_defs
[i
].name
!= NULL
; i
++) {
3855 if ((pvr
& ppc_defs
[i
].pvr_mask
) ==
3856 (ppc_defs
[i
].pvr
& ppc_defs
[i
].pvr_mask
)) {
3857 *def
= &ppc_defs
[i
];
3866 void ppc_cpu_list (FILE *f
, int (*cpu_fprintf
)(FILE *f
, const char *fmt
, ...))
3870 for (i
= 0; ; i
++) {
3871 (*cpu_fprintf
)(f
, "PowerPC %16s PVR %08x mask %08x\n",
3873 ppc_defs
[i
].pvr
, ppc_defs
[i
].pvr_mask
);
3874 if (strcmp(ppc_defs
[i
].name
, "ppc") == 0)