Commit f2e63a42c9151d17d734ce5a173d81f1598f0565
1 parent
d26bfc9a
Reorganize the CPUPPCState structure to group features.
Add #ifdef to avoid compiling not relevant resources: - MMU related stuff for user-mode only targets - PowerPC 64 only resources for PowerPC 32 targets - embedded PowerPC extensions for non-ppcemb targets. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3343 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
69 additions
and
19 deletions
target-ppc/cpu.h
@@ -495,9 +495,14 @@ struct CPUPPCState { | @@ -495,9 +495,14 @@ struct CPUPPCState { | ||
495 | int access_type; /* when a memory exception occurs, the access | 495 | int access_type; /* when a memory exception occurs, the access |
496 | type is stored here */ | 496 | type is stored here */ |
497 | 497 | ||
498 | - /* MMU context */ | 498 | + /* MMU context - only relevant for full system emulation */ |
499 | +#if !defined(CONFIG_USER_ONLY) | ||
500 | +#if defined(TARGET_PPC64) | ||
499 | /* Address space register */ | 501 | /* Address space register */ |
500 | target_ulong asr; | 502 | target_ulong asr; |
503 | + /* PowerPC 64 SLB area */ | ||
504 | + int slb_nr; | ||
505 | +#endif | ||
501 | /* segment registers */ | 506 | /* segment registers */ |
502 | target_ulong sdr1; | 507 | target_ulong sdr1; |
503 | target_ulong sr[16]; | 508 | target_ulong sr[16]; |
@@ -505,17 +510,31 @@ struct CPUPPCState { | @@ -505,17 +510,31 @@ struct CPUPPCState { | ||
505 | int nb_BATs; | 510 | int nb_BATs; |
506 | target_ulong DBAT[2][8]; | 511 | target_ulong DBAT[2][8]; |
507 | target_ulong IBAT[2][8]; | 512 | target_ulong IBAT[2][8]; |
513 | + /* PowerPC TLB registers (for 4xx and 60x software driven TLBs) */ | ||
514 | + int nb_tlb; /* Total number of TLB */ | ||
515 | + int tlb_per_way; /* Speed-up helper: used to avoid divisions at run time */ | ||
516 | + int nb_ways; /* Number of ways in the TLB set */ | ||
517 | + int last_way; /* Last used way used to allocate TLB in a LRU way */ | ||
518 | + int id_tlbs; /* If 1, MMU has separated TLBs for instructions & data */ | ||
519 | + int nb_pids; /* Number of available PID registers */ | ||
520 | + ppc_tlb_t *tlb; /* TLB is optional. Allocate them only if needed */ | ||
521 | + /* 403 dedicated access protection registers */ | ||
522 | + target_ulong pb[4]; | ||
523 | +#endif | ||
508 | 524 | ||
509 | /* Other registers */ | 525 | /* Other registers */ |
510 | /* Special purpose registers */ | 526 | /* Special purpose registers */ |
511 | target_ulong spr[1024]; | 527 | target_ulong spr[1024]; |
528 | + ppc_spr_t spr_cb[1024]; | ||
512 | /* Altivec registers */ | 529 | /* Altivec registers */ |
513 | ppc_avr_t avr[32]; | 530 | ppc_avr_t avr[32]; |
514 | uint32_t vscr; | 531 | uint32_t vscr; |
532 | +#if defined(TARGET_PPCEMB) | ||
515 | /* SPE registers */ | 533 | /* SPE registers */ |
516 | ppc_gpr_t spe_acc; | 534 | ppc_gpr_t spe_acc; |
517 | float_status spe_status; | 535 | float_status spe_status; |
518 | uint32_t spe_fscr; | 536 | uint32_t spe_fscr; |
537 | +#endif | ||
519 | 538 | ||
520 | /* Internal devices resources */ | 539 | /* Internal devices resources */ |
521 | /* Time base and decrementer */ | 540 | /* Time base and decrementer */ |
@@ -523,19 +542,6 @@ struct CPUPPCState { | @@ -523,19 +542,6 @@ struct CPUPPCState { | ||
523 | /* Device control registers */ | 542 | /* Device control registers */ |
524 | ppc_dcr_t *dcr_env; | 543 | ppc_dcr_t *dcr_env; |
525 | 544 | ||
526 | - /* PowerPC TLB registers (for 4xx and 60x software driven TLBs) */ | ||
527 | - int nb_tlb; /* Total number of TLB */ | ||
528 | - int tlb_per_way; /* Speed-up helper: used to avoid divisions at run time */ | ||
529 | - int nb_ways; /* Number of ways in the TLB set */ | ||
530 | - int last_way; /* Last used way used to allocate TLB in a LRU way */ | ||
531 | - int id_tlbs; /* If 1, MMU has separated TLBs for instructions & data */ | ||
532 | - int nb_pids; /* Number of available PID registers */ | ||
533 | - ppc_tlb_t *tlb; /* TLB is optional. Allocate them only if needed */ | ||
534 | - /* 403 dedicated access protection registers */ | ||
535 | - target_ulong pb[4]; | ||
536 | - /* PowerPC 64 SLB area */ | ||
537 | - int slb_nr; | ||
538 | - | ||
539 | int dcache_line_size; | 545 | int dcache_line_size; |
540 | int icache_line_size; | 546 | int icache_line_size; |
541 | 547 | ||
@@ -570,8 +576,7 @@ struct CPUPPCState { | @@ -570,8 +576,7 @@ struct CPUPPCState { | ||
570 | /* Those resources are used only during code translation */ | 576 | /* Those resources are used only during code translation */ |
571 | /* Next instruction pointer */ | 577 | /* Next instruction pointer */ |
572 | target_ulong nip; | 578 | target_ulong nip; |
573 | - /* SPR translation callbacks */ | ||
574 | - ppc_spr_t spr_cb[1024]; | 579 | + |
575 | /* opcode handlers */ | 580 | /* opcode handlers */ |
576 | opc_handler_t *opcodes[0x40]; | 581 | opc_handler_t *opcodes[0x40]; |
577 | 582 |
target-ppc/translate.c
@@ -6448,9 +6448,11 @@ void cpu_dump_state (CPUState *env, FILE *f, | @@ -6448,9 +6448,11 @@ void cpu_dump_state (CPUState *env, FILE *f, | ||
6448 | if ((i & (RFPL - 1)) == (RFPL - 1)) | 6448 | if ((i & (RFPL - 1)) == (RFPL - 1)) |
6449 | cpu_fprintf(f, "\n"); | 6449 | cpu_fprintf(f, "\n"); |
6450 | } | 6450 | } |
6451 | +#if !defined(CONFIG_USER_ONLY) | ||
6451 | cpu_fprintf(f, "SRR0 " REGX " SRR1 " REGX " " FILL FILL FILL | 6452 | cpu_fprintf(f, "SRR0 " REGX " SRR1 " REGX " " FILL FILL FILL |
6452 | "SDR1 " REGX "\n", | 6453 | "SDR1 " REGX "\n", |
6453 | env->spr[SPR_SRR0], env->spr[SPR_SRR1], env->sdr1); | 6454 | env->spr[SPR_SRR0], env->spr[SPR_SRR1], env->sdr1); |
6455 | +#endif | ||
6454 | 6456 | ||
6455 | #undef RGPL | 6457 | #undef RGPL |
6456 | #undef RFPL | 6458 | #undef RFPL |
target-ppc/translate_init.c
@@ -533,6 +533,7 @@ static void gen_spr_ne_601 (CPUPPCState *env) | @@ -533,6 +533,7 @@ static void gen_spr_ne_601 (CPUPPCState *env) | ||
533 | /* BATs 0-3 */ | 533 | /* BATs 0-3 */ |
534 | static void gen_low_BATs (CPUPPCState *env) | 534 | static void gen_low_BATs (CPUPPCState *env) |
535 | { | 535 | { |
536 | +#if !defined(CONFIG_USER_ONLY) | ||
536 | spr_register(env, SPR_IBAT0U, "IBAT0U", | 537 | spr_register(env, SPR_IBAT0U, "IBAT0U", |
537 | SPR_NOACCESS, SPR_NOACCESS, | 538 | SPR_NOACCESS, SPR_NOACCESS, |
538 | &spr_read_ibat, &spr_write_ibatu, | 539 | &spr_read_ibat, &spr_write_ibatu, |
@@ -598,11 +599,13 @@ static void gen_low_BATs (CPUPPCState *env) | @@ -598,11 +599,13 @@ static void gen_low_BATs (CPUPPCState *env) | ||
598 | &spr_read_dbat, &spr_write_dbatl, | 599 | &spr_read_dbat, &spr_write_dbatl, |
599 | 0x00000000); | 600 | 0x00000000); |
600 | env->nb_BATs += 4; | 601 | env->nb_BATs += 4; |
602 | +#endif | ||
601 | } | 603 | } |
602 | 604 | ||
603 | /* BATs 4-7 */ | 605 | /* BATs 4-7 */ |
604 | static void gen_high_BATs (CPUPPCState *env) | 606 | static void gen_high_BATs (CPUPPCState *env) |
605 | { | 607 | { |
608 | +#if !defined(CONFIG_USER_ONLY) | ||
606 | spr_register(env, SPR_IBAT4U, "IBAT4U", | 609 | spr_register(env, SPR_IBAT4U, "IBAT4U", |
607 | SPR_NOACCESS, SPR_NOACCESS, | 610 | SPR_NOACCESS, SPR_NOACCESS, |
608 | &spr_read_ibat_h, &spr_write_ibatu_h, | 611 | &spr_read_ibat_h, &spr_write_ibatu_h, |
@@ -668,6 +671,7 @@ static void gen_high_BATs (CPUPPCState *env) | @@ -668,6 +671,7 @@ static void gen_high_BATs (CPUPPCState *env) | ||
668 | &spr_read_dbat_h, &spr_write_dbatl_h, | 671 | &spr_read_dbat_h, &spr_write_dbatl_h, |
669 | 0x00000000); | 672 | 0x00000000); |
670 | env->nb_BATs += 4; | 673 | env->nb_BATs += 4; |
674 | +#endif | ||
671 | } | 675 | } |
672 | 676 | ||
673 | /* Generic PowerPC time base */ | 677 | /* Generic PowerPC time base */ |
@@ -694,6 +698,7 @@ static void gen_tbl (CPUPPCState *env) | @@ -694,6 +698,7 @@ static void gen_tbl (CPUPPCState *env) | ||
694 | /* Softare table search registers */ | 698 | /* Softare table search registers */ |
695 | static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) | 699 | static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) |
696 | { | 700 | { |
701 | +#if !defined(CONFIG_USER_ONLY) | ||
697 | env->nb_tlb = nb_tlbs; | 702 | env->nb_tlb = nb_tlbs; |
698 | env->nb_ways = nb_ways; | 703 | env->nb_ways = nb_ways; |
699 | env->id_tlbs = 1; | 704 | env->id_tlbs = 1; |
@@ -725,6 +730,7 @@ static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) | @@ -725,6 +730,7 @@ static void gen_6xx_7xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) | ||
725 | SPR_NOACCESS, SPR_NOACCESS, | 730 | SPR_NOACCESS, SPR_NOACCESS, |
726 | &spr_read_generic, &spr_write_generic, | 731 | &spr_read_generic, &spr_write_generic, |
727 | 0x00000000); | 732 | 0x00000000); |
733 | +#endif | ||
728 | } | 734 | } |
729 | 735 | ||
730 | /* SPR common to MPC755 and G2 */ | 736 | /* SPR common to MPC755 and G2 */ |
@@ -1105,6 +1111,7 @@ static void gen_spr_601 (CPUPPCState *env) | @@ -1105,6 +1111,7 @@ static void gen_spr_601 (CPUPPCState *env) | ||
1105 | &spr_read_generic, &spr_write_generic, | 1111 | &spr_read_generic, &spr_write_generic, |
1106 | 0x00000000); | 1112 | 0x00000000); |
1107 | /* Memory management */ | 1113 | /* Memory management */ |
1114 | +#if !defined(CONFIG_USER_ONLY) | ||
1108 | spr_register(env, SPR_IBAT0U, "IBAT0U", | 1115 | spr_register(env, SPR_IBAT0U, "IBAT0U", |
1109 | SPR_NOACCESS, SPR_NOACCESS, | 1116 | SPR_NOACCESS, SPR_NOACCESS, |
1110 | &spr_read_601_ubat, &spr_write_601_ubatu, | 1117 | &spr_read_601_ubat, &spr_write_601_ubatu, |
@@ -1138,6 +1145,7 @@ static void gen_spr_601 (CPUPPCState *env) | @@ -1138,6 +1145,7 @@ static void gen_spr_601 (CPUPPCState *env) | ||
1138 | &spr_read_601_ubat, &spr_write_601_ubatl, | 1145 | &spr_read_601_ubat, &spr_write_601_ubatl, |
1139 | 0x00000000); | 1146 | 0x00000000); |
1140 | env->nb_BATs = 4; | 1147 | env->nb_BATs = 4; |
1148 | +#endif | ||
1141 | } | 1149 | } |
1142 | 1150 | ||
1143 | static void gen_spr_74xx (CPUPPCState *env) | 1151 | static void gen_spr_74xx (CPUPPCState *env) |
@@ -1238,6 +1246,7 @@ static void gen_l3_ctrl (CPUPPCState *env) | @@ -1238,6 +1246,7 @@ static void gen_l3_ctrl (CPUPPCState *env) | ||
1238 | 1246 | ||
1239 | static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) | 1247 | static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) |
1240 | { | 1248 | { |
1249 | +#if !defined(CONFIG_USER_ONLY) | ||
1241 | env->nb_tlb = nb_tlbs; | 1250 | env->nb_tlb = nb_tlbs; |
1242 | env->nb_ways = nb_ways; | 1251 | env->nb_ways = nb_ways; |
1243 | env->id_tlbs = 1; | 1252 | env->id_tlbs = 1; |
@@ -1256,6 +1265,7 @@ static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) | @@ -1256,6 +1265,7 @@ static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways) | ||
1256 | SPR_NOACCESS, SPR_NOACCESS, | 1265 | SPR_NOACCESS, SPR_NOACCESS, |
1257 | &spr_read_generic, &spr_write_generic, | 1266 | &spr_read_generic, &spr_write_generic, |
1258 | 0x00000000); | 1267 | 0x00000000); |
1268 | +#endif | ||
1259 | } | 1269 | } |
1260 | 1270 | ||
1261 | /* PowerPC BookE SPR */ | 1271 | /* PowerPC BookE SPR */ |
@@ -1512,6 +1522,7 @@ static void gen_spr_BookE (CPUPPCState *env) | @@ -1512,6 +1522,7 @@ static void gen_spr_BookE (CPUPPCState *env) | ||
1512 | /* FSL storage control registers */ | 1522 | /* FSL storage control registers */ |
1513 | static void gen_spr_BookE_FSL (CPUPPCState *env) | 1523 | static void gen_spr_BookE_FSL (CPUPPCState *env) |
1514 | { | 1524 | { |
1525 | +#if !defined(CONFIG_USER_ONLY) | ||
1515 | /* TLB assist registers */ | 1526 | /* TLB assist registers */ |
1516 | /* XXX : not implemented */ | 1527 | /* XXX : not implemented */ |
1517 | spr_register(env, SPR_BOOKE_MAS0, "MAS0", | 1528 | spr_register(env, SPR_BOOKE_MAS0, "MAS0", |
@@ -1605,6 +1616,7 @@ static void gen_spr_BookE_FSL (CPUPPCState *env) | @@ -1605,6 +1616,7 @@ static void gen_spr_BookE_FSL (CPUPPCState *env) | ||
1605 | default: | 1616 | default: |
1606 | break; | 1617 | break; |
1607 | } | 1618 | } |
1619 | +#endif | ||
1608 | } | 1620 | } |
1609 | 1621 | ||
1610 | /* SPR specific to PowerPC 440 implementation */ | 1622 | /* SPR specific to PowerPC 440 implementation */ |
@@ -2616,9 +2628,11 @@ static void init_proc_401x2 (CPUPPCState *env) | @@ -2616,9 +2628,11 @@ static void init_proc_401x2 (CPUPPCState *env) | ||
2616 | gen_spr_401x2(env); | 2628 | gen_spr_401x2(env); |
2617 | gen_spr_compress(env); | 2629 | gen_spr_compress(env); |
2618 | /* Memory management */ | 2630 | /* Memory management */ |
2631 | +#if !defined(CONFIG_USER_ONLY) | ||
2619 | env->nb_tlb = 64; | 2632 | env->nb_tlb = 64; |
2620 | env->nb_ways = 1; | 2633 | env->nb_ways = 1; |
2621 | env->id_tlbs = 0; | 2634 | env->id_tlbs = 0; |
2635 | +#endif | ||
2622 | init_excp_4xx_softmmu(env); | 2636 | init_excp_4xx_softmmu(env); |
2623 | env->dcache_line_size = 32; | 2637 | env->dcache_line_size = 32; |
2624 | env->icache_line_size = 32; | 2638 | env->icache_line_size = 32; |
@@ -2674,9 +2688,11 @@ static void init_proc_IOP480 (CPUPPCState *env) | @@ -2674,9 +2688,11 @@ static void init_proc_IOP480 (CPUPPCState *env) | ||
2674 | gen_spr_401x2(env); | 2688 | gen_spr_401x2(env); |
2675 | gen_spr_compress(env); | 2689 | gen_spr_compress(env); |
2676 | /* Memory management */ | 2690 | /* Memory management */ |
2691 | +#if !defined(CONFIG_USER_ONLY) | ||
2677 | env->nb_tlb = 64; | 2692 | env->nb_tlb = 64; |
2678 | env->nb_ways = 1; | 2693 | env->nb_ways = 1; |
2679 | env->id_tlbs = 0; | 2694 | env->id_tlbs = 0; |
2695 | +#endif | ||
2680 | init_excp_4xx_softmmu(env); | 2696 | init_excp_4xx_softmmu(env); |
2681 | env->dcache_line_size = 32; | 2697 | env->dcache_line_size = 32; |
2682 | env->icache_line_size = 32; | 2698 | env->icache_line_size = 32; |
@@ -2744,9 +2760,11 @@ static void init_proc_403GCX (CPUPPCState *env) | @@ -2744,9 +2760,11 @@ static void init_proc_403GCX (CPUPPCState *env) | ||
2744 | &spr_read_generic, &spr_write_generic, | 2760 | &spr_read_generic, &spr_write_generic, |
2745 | 0x00000000); | 2761 | 0x00000000); |
2746 | /* Memory management */ | 2762 | /* Memory management */ |
2763 | +#if !defined(CONFIG_USER_ONLY) | ||
2747 | env->nb_tlb = 64; | 2764 | env->nb_tlb = 64; |
2748 | env->nb_ways = 1; | 2765 | env->nb_ways = 1; |
2749 | env->id_tlbs = 0; | 2766 | env->id_tlbs = 0; |
2767 | +#endif | ||
2750 | init_excp_4xx_softmmu(env); | 2768 | init_excp_4xx_softmmu(env); |
2751 | env->dcache_line_size = 32; | 2769 | env->dcache_line_size = 32; |
2752 | env->icache_line_size = 32; | 2770 | env->icache_line_size = 32; |
@@ -2785,9 +2803,11 @@ static void init_proc_405 (CPUPPCState *env) | @@ -2785,9 +2803,11 @@ static void init_proc_405 (CPUPPCState *env) | ||
2785 | &spr_read_generic, &spr_write_generic, | 2803 | &spr_read_generic, &spr_write_generic, |
2786 | 0x00000000); | 2804 | 0x00000000); |
2787 | /* Memory management */ | 2805 | /* Memory management */ |
2806 | +#if !defined(CONFIG_USER_ONLY) | ||
2788 | env->nb_tlb = 64; | 2807 | env->nb_tlb = 64; |
2789 | env->nb_ways = 1; | 2808 | env->nb_ways = 1; |
2790 | env->id_tlbs = 0; | 2809 | env->id_tlbs = 0; |
2810 | +#endif | ||
2791 | init_excp_4xx_softmmu(env); | 2811 | init_excp_4xx_softmmu(env); |
2792 | env->dcache_line_size = 32; | 2812 | env->dcache_line_size = 32; |
2793 | env->icache_line_size = 32; | 2813 | env->icache_line_size = 32; |
@@ -2832,9 +2852,11 @@ static void init_proc_440EP (CPUPPCState *env) | @@ -2832,9 +2852,11 @@ static void init_proc_440EP (CPUPPCState *env) | ||
2832 | &spr_read_generic, &spr_write_generic, | 2852 | &spr_read_generic, &spr_write_generic, |
2833 | 0x00000000); | 2853 | 0x00000000); |
2834 | /* Memory management */ | 2854 | /* Memory management */ |
2855 | +#if !defined(CONFIG_USER_ONLY) | ||
2835 | env->nb_tlb = 64; | 2856 | env->nb_tlb = 64; |
2836 | env->nb_ways = 1; | 2857 | env->nb_ways = 1; |
2837 | env->id_tlbs = 0; | 2858 | env->id_tlbs = 0; |
2859 | +#endif | ||
2838 | init_excp_BookE(env); | 2860 | init_excp_BookE(env); |
2839 | env->dcache_line_size = 32; | 2861 | env->dcache_line_size = 32; |
2840 | env->icache_line_size = 32; | 2862 | env->icache_line_size = 32; |
@@ -2860,9 +2882,11 @@ static void init_proc_440GP (CPUPPCState *env) | @@ -2860,9 +2882,11 @@ static void init_proc_440GP (CPUPPCState *env) | ||
2860 | gen_spr_BookE(env); | 2882 | gen_spr_BookE(env); |
2861 | gen_spr_440(env); | 2883 | gen_spr_440(env); |
2862 | /* Memory management */ | 2884 | /* Memory management */ |
2885 | +#if !defined(CONFIG_USER_ONLY) | ||
2863 | env->nb_tlb = 64; | 2886 | env->nb_tlb = 64; |
2864 | env->nb_ways = 1; | 2887 | env->nb_ways = 1; |
2865 | env->id_tlbs = 0; | 2888 | env->id_tlbs = 0; |
2889 | +#endif | ||
2866 | init_excp_BookE(env); | 2890 | init_excp_BookE(env); |
2867 | env->dcache_line_size = 32; | 2891 | env->dcache_line_size = 32; |
2868 | env->icache_line_size = 32; | 2892 | env->icache_line_size = 32; |
@@ -2889,9 +2913,11 @@ static void init_proc_440x4 (CPUPPCState *env) | @@ -2889,9 +2913,11 @@ static void init_proc_440x4 (CPUPPCState *env) | ||
2889 | gen_spr_BookE(env); | 2913 | gen_spr_BookE(env); |
2890 | gen_spr_440(env); | 2914 | gen_spr_440(env); |
2891 | /* Memory management */ | 2915 | /* Memory management */ |
2916 | +#if !defined(CONFIG_USER_ONLY) | ||
2892 | env->nb_tlb = 64; | 2917 | env->nb_tlb = 64; |
2893 | env->nb_ways = 1; | 2918 | env->nb_ways = 1; |
2894 | env->id_tlbs = 0; | 2919 | env->id_tlbs = 0; |
2920 | +#endif | ||
2895 | init_excp_BookE(env); | 2921 | init_excp_BookE(env); |
2896 | env->dcache_line_size = 32; | 2922 | env->dcache_line_size = 32; |
2897 | env->icache_line_size = 32; | 2923 | env->icache_line_size = 32; |
@@ -2935,9 +2961,11 @@ static void init_proc_440x5 (CPUPPCState *env) | @@ -2935,9 +2961,11 @@ static void init_proc_440x5 (CPUPPCState *env) | ||
2935 | &spr_read_generic, &spr_write_generic, | 2961 | &spr_read_generic, &spr_write_generic, |
2936 | 0x00000000); | 2962 | 0x00000000); |
2937 | /* Memory management */ | 2963 | /* Memory management */ |
2964 | +#if !defined(CONFIG_USER_ONLY) | ||
2938 | env->nb_tlb = 64; | 2965 | env->nb_tlb = 64; |
2939 | env->nb_ways = 1; | 2966 | env->nb_ways = 1; |
2940 | env->id_tlbs = 0; | 2967 | env->id_tlbs = 0; |
2968 | +#endif | ||
2941 | init_excp_BookE(env); | 2969 | init_excp_BookE(env); |
2942 | env->dcache_line_size = 32; | 2970 | env->dcache_line_size = 32; |
2943 | env->icache_line_size = 32; | 2971 | env->icache_line_size = 32; |
@@ -2987,9 +3015,11 @@ static void init_proc_460 (CPUPPCState *env) | @@ -2987,9 +3015,11 @@ static void init_proc_460 (CPUPPCState *env) | ||
2987 | &spr_read_generic, &spr_write_generic, | 3015 | &spr_read_generic, &spr_write_generic, |
2988 | 0x00000000); | 3016 | 0x00000000); |
2989 | /* Memory management */ | 3017 | /* Memory management */ |
3018 | +#if !defined(CONFIG_USER_ONLY) | ||
2990 | env->nb_tlb = 64; | 3019 | env->nb_tlb = 64; |
2991 | env->nb_ways = 1; | 3020 | env->nb_ways = 1; |
2992 | env->id_tlbs = 0; | 3021 | env->id_tlbs = 0; |
3022 | +#endif | ||
2993 | init_excp_BookE(env); | 3023 | init_excp_BookE(env); |
2994 | env->dcache_line_size = 32; | 3024 | env->dcache_line_size = 32; |
2995 | env->icache_line_size = 32; | 3025 | env->icache_line_size = 32; |
@@ -3042,9 +3072,11 @@ static void init_proc_460F (CPUPPCState *env) | @@ -3042,9 +3072,11 @@ static void init_proc_460F (CPUPPCState *env) | ||
3042 | &spr_read_generic, &spr_write_generic, | 3072 | &spr_read_generic, &spr_write_generic, |
3043 | 0x00000000); | 3073 | 0x00000000); |
3044 | /* Memory management */ | 3074 | /* Memory management */ |
3075 | +#if !defined(CONFIG_USER_ONLY) | ||
3045 | env->nb_tlb = 64; | 3076 | env->nb_tlb = 64; |
3046 | env->nb_ways = 1; | 3077 | env->nb_ways = 1; |
3047 | env->id_tlbs = 0; | 3078 | env->id_tlbs = 0; |
3079 | +#endif | ||
3048 | init_excp_BookE(env); | 3080 | init_excp_BookE(env); |
3049 | env->dcache_line_size = 32; | 3081 | env->dcache_line_size = 32; |
3050 | env->icache_line_size = 32; | 3082 | env->icache_line_size = 32; |
@@ -3097,9 +3129,11 @@ static void init_proc_e500 (CPUPPCState *env) | @@ -3097,9 +3129,11 @@ static void init_proc_e500 (CPUPPCState *env) | ||
3097 | gen_spr_BookE(env); | 3129 | gen_spr_BookE(env); |
3098 | /* Memory management */ | 3130 | /* Memory management */ |
3099 | gen_spr_BookE_FSL(env); | 3131 | gen_spr_BookE_FSL(env); |
3132 | +#if !defined(CONFIG_USER_ONLY) | ||
3100 | env->nb_tlb = 64; | 3133 | env->nb_tlb = 64; |
3101 | env->nb_ways = 1; | 3134 | env->nb_ways = 1; |
3102 | env->id_tlbs = 0; | 3135 | env->id_tlbs = 0; |
3136 | +#endif | ||
3103 | init_excp_BookE(env); | 3137 | init_excp_BookE(env); |
3104 | env->dcache_line_size = 32; | 3138 | env->dcache_line_size = 32; |
3105 | env->icache_line_size = 32; | 3139 | env->icache_line_size = 32; |
@@ -3167,10 +3201,11 @@ static void init_proc_601 (CPUPPCState *env) | @@ -3167,10 +3201,11 @@ static void init_proc_601 (CPUPPCState *env) | ||
3167 | &spr_read_generic, &spr_write_generic, | 3201 | &spr_read_generic, &spr_write_generic, |
3168 | 0x00000000); | 3202 | 0x00000000); |
3169 | /* Memory management */ | 3203 | /* Memory management */ |
3204 | +#if !defined(CONFIG_USER_ONLY) | ||
3170 | env->nb_tlb = 64; | 3205 | env->nb_tlb = 64; |
3171 | env->nb_ways = 2; | 3206 | env->nb_ways = 2; |
3172 | env->id_tlbs = 0; | 3207 | env->id_tlbs = 0; |
3173 | - env->id_tlbs = 0; | 3208 | +#endif |
3174 | init_excp_601(env); | 3209 | init_excp_601(env); |
3175 | env->dcache_line_size = 64; | 3210 | env->dcache_line_size = 64; |
3176 | env->icache_line_size = 64; | 3211 | env->icache_line_size = 64; |
@@ -4041,7 +4076,9 @@ static void init_proc_970 (CPUPPCState *env) | @@ -4041,7 +4076,9 @@ static void init_proc_970 (CPUPPCState *env) | ||
4041 | #if !defined(CONFIG_USER_ONLY) | 4076 | #if !defined(CONFIG_USER_ONLY) |
4042 | env->excp_prefix = 0xFFF00000; | 4077 | env->excp_prefix = 0xFFF00000; |
4043 | #endif | 4078 | #endif |
4079 | +#if !defined(CONFIG_USER_ONLY) | ||
4044 | env->slb_nr = 32; | 4080 | env->slb_nr = 32; |
4081 | +#endif | ||
4045 | init_excp_970(env); | 4082 | init_excp_970(env); |
4046 | env->dcache_line_size = 128; | 4083 | env->dcache_line_size = 128; |
4047 | env->icache_line_size = 128; | 4084 | env->icache_line_size = 128; |
@@ -4112,7 +4149,9 @@ static void init_proc_970FX (CPUPPCState *env) | @@ -4112,7 +4149,9 @@ static void init_proc_970FX (CPUPPCState *env) | ||
4112 | #if !defined(CONFIG_USER_ONLY) | 4149 | #if !defined(CONFIG_USER_ONLY) |
4113 | env->excp_prefix = 0xFFF00000; | 4150 | env->excp_prefix = 0xFFF00000; |
4114 | #endif | 4151 | #endif |
4152 | +#if !defined(CONFIG_USER_ONLY) | ||
4115 | env->slb_nr = 32; | 4153 | env->slb_nr = 32; |
4154 | +#endif | ||
4116 | init_excp_970(env); | 4155 | init_excp_970(env); |
4117 | env->dcache_line_size = 128; | 4156 | env->dcache_line_size = 128; |
4118 | env->icache_line_size = 128; | 4157 | env->icache_line_size = 128; |
@@ -4183,7 +4222,9 @@ static void init_proc_970GX (CPUPPCState *env) | @@ -4183,7 +4222,9 @@ static void init_proc_970GX (CPUPPCState *env) | ||
4183 | #if !defined(CONFIG_USER_ONLY) | 4222 | #if !defined(CONFIG_USER_ONLY) |
4184 | env->excp_prefix = 0xFFF00000; | 4223 | env->excp_prefix = 0xFFF00000; |
4185 | #endif | 4224 | #endif |
4225 | +#if !defined(CONFIG_USER_ONLY) | ||
4186 | env->slb_nr = 32; | 4226 | env->slb_nr = 32; |
4227 | +#endif | ||
4187 | init_excp_970(env); | 4228 | init_excp_970(env); |
4188 | env->dcache_line_size = 128; | 4229 | env->dcache_line_size = 128; |
4189 | env->icache_line_size = 128; | 4230 | env->icache_line_size = 128; |
@@ -5729,11 +5770,11 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | @@ -5729,11 +5770,11 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | ||
5729 | env->excp_prefix = 0x00000000; | 5770 | env->excp_prefix = 0x00000000; |
5730 | env->ivor_mask = 0x00000000; | 5771 | env->ivor_mask = 0x00000000; |
5731 | env->ivpr_mask = 0x00000000; | 5772 | env->ivpr_mask = 0x00000000; |
5732 | -#endif | ||
5733 | /* Default MMU definitions */ | 5773 | /* Default MMU definitions */ |
5734 | env->nb_BATs = 0; | 5774 | env->nb_BATs = 0; |
5735 | env->nb_tlb = 0; | 5775 | env->nb_tlb = 0; |
5736 | env->nb_ways = 0; | 5776 | env->nb_ways = 0; |
5777 | +#endif | ||
5737 | /* Register SPR common to all PowerPC implementations */ | 5778 | /* Register SPR common to all PowerPC implementations */ |
5738 | gen_spr_generic(env); | 5779 | gen_spr_generic(env); |
5739 | spr_register(env, SPR_PVR, "PVR", | 5780 | spr_register(env, SPR_PVR, "PVR", |
@@ -5743,6 +5784,7 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | @@ -5743,6 +5784,7 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | ||
5743 | /* PowerPC implementation specific initialisations (SPRs, timers, ...) */ | 5784 | /* PowerPC implementation specific initialisations (SPRs, timers, ...) */ |
5744 | (*def->init_proc)(env); | 5785 | (*def->init_proc)(env); |
5745 | /* Allocate TLBs buffer when needed */ | 5786 | /* Allocate TLBs buffer when needed */ |
5787 | +#if !defined(CONFIG_USER_ONLY) | ||
5746 | if (env->nb_tlb != 0) { | 5788 | if (env->nb_tlb != 0) { |
5747 | int nb_tlb = env->nb_tlb; | 5789 | int nb_tlb = env->nb_tlb; |
5748 | if (env->id_tlbs != 0) | 5790 | if (env->id_tlbs != 0) |
@@ -5751,7 +5793,6 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | @@ -5751,7 +5793,6 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | ||
5751 | /* Pre-compute some useful values */ | 5793 | /* Pre-compute some useful values */ |
5752 | env->tlb_per_way = env->nb_tlb / env->nb_ways; | 5794 | env->tlb_per_way = env->nb_tlb / env->nb_ways; |
5753 | } | 5795 | } |
5754 | -#if !defined(CONFIG_USER_ONLY) | ||
5755 | if (env->irq_inputs == NULL) { | 5796 | if (env->irq_inputs == NULL) { |
5756 | fprintf(stderr, "WARNING: no internal IRQ controller registered.\n" | 5797 | fprintf(stderr, "WARNING: no internal IRQ controller registered.\n" |
5757 | " Attempt Qemu to crash very soon !\n"); | 5798 | " Attempt Qemu to crash very soon !\n"); |
@@ -6171,11 +6212,13 @@ int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def) | @@ -6171,11 +6212,13 @@ int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def) | ||
6171 | printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n" | 6212 | printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n" |
6172 | " MMU model : %s\n", | 6213 | " MMU model : %s\n", |
6173 | def->name, def->pvr, def->msr_mask, mmu_model); | 6214 | def->name, def->pvr, def->msr_mask, mmu_model); |
6215 | +#if !defined(CONFIG_USER_ONLY) | ||
6174 | if (env->tlb != NULL) { | 6216 | if (env->tlb != NULL) { |
6175 | printf(" %d %s TLB in %d ways\n", | 6217 | printf(" %d %s TLB in %d ways\n", |
6176 | env->nb_tlb, env->id_tlbs ? "splitted" : "merged", | 6218 | env->nb_tlb, env->id_tlbs ? "splitted" : "merged", |
6177 | env->nb_ways); | 6219 | env->nb_ways); |
6178 | } | 6220 | } |
6221 | +#endif | ||
6179 | printf(" Exceptions model : %s\n" | 6222 | printf(" Exceptions model : %s\n" |
6180 | " Bus model : %s\n", | 6223 | " Bus model : %s\n", |
6181 | excp_model, bus_model); | 6224 | excp_model, bus_model); |