533 |
533 |
/* BATs 0-3 */
|
534 |
534 |
static void gen_low_BATs (CPUPPCState *env)
|
535 |
535 |
{
|
|
536 |
#if !defined(CONFIG_USER_ONLY)
|
536 |
537 |
spr_register(env, SPR_IBAT0U, "IBAT0U",
|
537 |
538 |
SPR_NOACCESS, SPR_NOACCESS,
|
538 |
539 |
&spr_read_ibat, &spr_write_ibatu,
|
... | ... | |
598 |
599 |
&spr_read_dbat, &spr_write_dbatl,
|
599 |
600 |
0x00000000);
|
600 |
601 |
env->nb_BATs += 4;
|
|
602 |
#endif
|
601 |
603 |
}
|
602 |
604 |
|
603 |
605 |
/* BATs 4-7 */
|
604 |
606 |
static void gen_high_BATs (CPUPPCState *env)
|
605 |
607 |
{
|
|
608 |
#if !defined(CONFIG_USER_ONLY)
|
606 |
609 |
spr_register(env, SPR_IBAT4U, "IBAT4U",
|
607 |
610 |
SPR_NOACCESS, SPR_NOACCESS,
|
608 |
611 |
&spr_read_ibat_h, &spr_write_ibatu_h,
|
... | ... | |
668 |
671 |
&spr_read_dbat_h, &spr_write_dbatl_h,
|
669 |
672 |
0x00000000);
|
670 |
673 |
env->nb_BATs += 4;
|
|
674 |
#endif
|
671 |
675 |
}
|
672 |
676 |
|
673 |
677 |
/* Generic PowerPC time base */
|
... | ... | |
694 |
698 |
/* Softare table search registers */
|
695 |
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 |
702 |
env->nb_tlb = nb_tlbs;
|
698 |
703 |
env->nb_ways = nb_ways;
|
699 |
704 |
env->id_tlbs = 1;
|
... | ... | |
725 |
730 |
SPR_NOACCESS, SPR_NOACCESS,
|
726 |
731 |
&spr_read_generic, &spr_write_generic,
|
727 |
732 |
0x00000000);
|
|
733 |
#endif
|
728 |
734 |
}
|
729 |
735 |
|
730 |
736 |
/* SPR common to MPC755 and G2 */
|
... | ... | |
1105 |
1111 |
&spr_read_generic, &spr_write_generic,
|
1106 |
1112 |
0x00000000);
|
1107 |
1113 |
/* Memory management */
|
|
1114 |
#if !defined(CONFIG_USER_ONLY)
|
1108 |
1115 |
spr_register(env, SPR_IBAT0U, "IBAT0U",
|
1109 |
1116 |
SPR_NOACCESS, SPR_NOACCESS,
|
1110 |
1117 |
&spr_read_601_ubat, &spr_write_601_ubatu,
|
... | ... | |
1138 |
1145 |
&spr_read_601_ubat, &spr_write_601_ubatl,
|
1139 |
1146 |
0x00000000);
|
1140 |
1147 |
env->nb_BATs = 4;
|
|
1148 |
#endif
|
1141 |
1149 |
}
|
1142 |
1150 |
|
1143 |
1151 |
static void gen_spr_74xx (CPUPPCState *env)
|
... | ... | |
1238 |
1246 |
|
1239 |
1247 |
static void gen_74xx_soft_tlb (CPUPPCState *env, int nb_tlbs, int nb_ways)
|
1240 |
1248 |
{
|
|
1249 |
#if !defined(CONFIG_USER_ONLY)
|
1241 |
1250 |
env->nb_tlb = nb_tlbs;
|
1242 |
1251 |
env->nb_ways = nb_ways;
|
1243 |
1252 |
env->id_tlbs = 1;
|
... | ... | |
1256 |
1265 |
SPR_NOACCESS, SPR_NOACCESS,
|
1257 |
1266 |
&spr_read_generic, &spr_write_generic,
|
1258 |
1267 |
0x00000000);
|
|
1268 |
#endif
|
1259 |
1269 |
}
|
1260 |
1270 |
|
1261 |
1271 |
/* PowerPC BookE SPR */
|
... | ... | |
1512 |
1522 |
/* FSL storage control registers */
|
1513 |
1523 |
static void gen_spr_BookE_FSL (CPUPPCState *env)
|
1514 |
1524 |
{
|
|
1525 |
#if !defined(CONFIG_USER_ONLY)
|
1515 |
1526 |
/* TLB assist registers */
|
1516 |
1527 |
/* XXX : not implemented */
|
1517 |
1528 |
spr_register(env, SPR_BOOKE_MAS0, "MAS0",
|
... | ... | |
1605 |
1616 |
default:
|
1606 |
1617 |
break;
|
1607 |
1618 |
}
|
|
1619 |
#endif
|
1608 |
1620 |
}
|
1609 |
1621 |
|
1610 |
1622 |
/* SPR specific to PowerPC 440 implementation */
|
... | ... | |
2616 |
2628 |
gen_spr_401x2(env);
|
2617 |
2629 |
gen_spr_compress(env);
|
2618 |
2630 |
/* Memory management */
|
|
2631 |
#if !defined(CONFIG_USER_ONLY)
|
2619 |
2632 |
env->nb_tlb = 64;
|
2620 |
2633 |
env->nb_ways = 1;
|
2621 |
2634 |
env->id_tlbs = 0;
|
|
2635 |
#endif
|
2622 |
2636 |
init_excp_4xx_softmmu(env);
|
2623 |
2637 |
env->dcache_line_size = 32;
|
2624 |
2638 |
env->icache_line_size = 32;
|
... | ... | |
2674 |
2688 |
gen_spr_401x2(env);
|
2675 |
2689 |
gen_spr_compress(env);
|
2676 |
2690 |
/* Memory management */
|
|
2691 |
#if !defined(CONFIG_USER_ONLY)
|
2677 |
2692 |
env->nb_tlb = 64;
|
2678 |
2693 |
env->nb_ways = 1;
|
2679 |
2694 |
env->id_tlbs = 0;
|
|
2695 |
#endif
|
2680 |
2696 |
init_excp_4xx_softmmu(env);
|
2681 |
2697 |
env->dcache_line_size = 32;
|
2682 |
2698 |
env->icache_line_size = 32;
|
... | ... | |
2744 |
2760 |
&spr_read_generic, &spr_write_generic,
|
2745 |
2761 |
0x00000000);
|
2746 |
2762 |
/* Memory management */
|
|
2763 |
#if !defined(CONFIG_USER_ONLY)
|
2747 |
2764 |
env->nb_tlb = 64;
|
2748 |
2765 |
env->nb_ways = 1;
|
2749 |
2766 |
env->id_tlbs = 0;
|
|
2767 |
#endif
|
2750 |
2768 |
init_excp_4xx_softmmu(env);
|
2751 |
2769 |
env->dcache_line_size = 32;
|
2752 |
2770 |
env->icache_line_size = 32;
|
... | ... | |
2785 |
2803 |
&spr_read_generic, &spr_write_generic,
|
2786 |
2804 |
0x00000000);
|
2787 |
2805 |
/* Memory management */
|
|
2806 |
#if !defined(CONFIG_USER_ONLY)
|
2788 |
2807 |
env->nb_tlb = 64;
|
2789 |
2808 |
env->nb_ways = 1;
|
2790 |
2809 |
env->id_tlbs = 0;
|
|
2810 |
#endif
|
2791 |
2811 |
init_excp_4xx_softmmu(env);
|
2792 |
2812 |
env->dcache_line_size = 32;
|
2793 |
2813 |
env->icache_line_size = 32;
|
... | ... | |
2832 |
2852 |
&spr_read_generic, &spr_write_generic,
|
2833 |
2853 |
0x00000000);
|
2834 |
2854 |
/* Memory management */
|
|
2855 |
#if !defined(CONFIG_USER_ONLY)
|
2835 |
2856 |
env->nb_tlb = 64;
|
2836 |
2857 |
env->nb_ways = 1;
|
2837 |
2858 |
env->id_tlbs = 0;
|
|
2859 |
#endif
|
2838 |
2860 |
init_excp_BookE(env);
|
2839 |
2861 |
env->dcache_line_size = 32;
|
2840 |
2862 |
env->icache_line_size = 32;
|
... | ... | |
2860 |
2882 |
gen_spr_BookE(env);
|
2861 |
2883 |
gen_spr_440(env);
|
2862 |
2884 |
/* Memory management */
|
|
2885 |
#if !defined(CONFIG_USER_ONLY)
|
2863 |
2886 |
env->nb_tlb = 64;
|
2864 |
2887 |
env->nb_ways = 1;
|
2865 |
2888 |
env->id_tlbs = 0;
|
|
2889 |
#endif
|
2866 |
2890 |
init_excp_BookE(env);
|
2867 |
2891 |
env->dcache_line_size = 32;
|
2868 |
2892 |
env->icache_line_size = 32;
|
... | ... | |
2889 |
2913 |
gen_spr_BookE(env);
|
2890 |
2914 |
gen_spr_440(env);
|
2891 |
2915 |
/* Memory management */
|
|
2916 |
#if !defined(CONFIG_USER_ONLY)
|
2892 |
2917 |
env->nb_tlb = 64;
|
2893 |
2918 |
env->nb_ways = 1;
|
2894 |
2919 |
env->id_tlbs = 0;
|
|
2920 |
#endif
|
2895 |
2921 |
init_excp_BookE(env);
|
2896 |
2922 |
env->dcache_line_size = 32;
|
2897 |
2923 |
env->icache_line_size = 32;
|
... | ... | |
2935 |
2961 |
&spr_read_generic, &spr_write_generic,
|
2936 |
2962 |
0x00000000);
|
2937 |
2963 |
/* Memory management */
|
|
2964 |
#if !defined(CONFIG_USER_ONLY)
|
2938 |
2965 |
env->nb_tlb = 64;
|
2939 |
2966 |
env->nb_ways = 1;
|
2940 |
2967 |
env->id_tlbs = 0;
|
|
2968 |
#endif
|
2941 |
2969 |
init_excp_BookE(env);
|
2942 |
2970 |
env->dcache_line_size = 32;
|
2943 |
2971 |
env->icache_line_size = 32;
|
... | ... | |
2987 |
3015 |
&spr_read_generic, &spr_write_generic,
|
2988 |
3016 |
0x00000000);
|
2989 |
3017 |
/* Memory management */
|
|
3018 |
#if !defined(CONFIG_USER_ONLY)
|
2990 |
3019 |
env->nb_tlb = 64;
|
2991 |
3020 |
env->nb_ways = 1;
|
2992 |
3021 |
env->id_tlbs = 0;
|
|
3022 |
#endif
|
2993 |
3023 |
init_excp_BookE(env);
|
2994 |
3024 |
env->dcache_line_size = 32;
|
2995 |
3025 |
env->icache_line_size = 32;
|
... | ... | |
3042 |
3072 |
&spr_read_generic, &spr_write_generic,
|
3043 |
3073 |
0x00000000);
|
3044 |
3074 |
/* Memory management */
|
|
3075 |
#if !defined(CONFIG_USER_ONLY)
|
3045 |
3076 |
env->nb_tlb = 64;
|
3046 |
3077 |
env->nb_ways = 1;
|
3047 |
3078 |
env->id_tlbs = 0;
|
|
3079 |
#endif
|
3048 |
3080 |
init_excp_BookE(env);
|
3049 |
3081 |
env->dcache_line_size = 32;
|
3050 |
3082 |
env->icache_line_size = 32;
|
... | ... | |
3097 |
3129 |
gen_spr_BookE(env);
|
3098 |
3130 |
/* Memory management */
|
3099 |
3131 |
gen_spr_BookE_FSL(env);
|
|
3132 |
#if !defined(CONFIG_USER_ONLY)
|
3100 |
3133 |
env->nb_tlb = 64;
|
3101 |
3134 |
env->nb_ways = 1;
|
3102 |
3135 |
env->id_tlbs = 0;
|
|
3136 |
#endif
|
3103 |
3137 |
init_excp_BookE(env);
|
3104 |
3138 |
env->dcache_line_size = 32;
|
3105 |
3139 |
env->icache_line_size = 32;
|
... | ... | |
3167 |
3201 |
&spr_read_generic, &spr_write_generic,
|
3168 |
3202 |
0x00000000);
|
3169 |
3203 |
/* Memory management */
|
|
3204 |
#if !defined(CONFIG_USER_ONLY)
|
3170 |
3205 |
env->nb_tlb = 64;
|
3171 |
3206 |
env->nb_ways = 2;
|
3172 |
3207 |
env->id_tlbs = 0;
|
3173 |
|
env->id_tlbs = 0;
|
|
3208 |
#endif
|
3174 |
3209 |
init_excp_601(env);
|
3175 |
3210 |
env->dcache_line_size = 64;
|
3176 |
3211 |
env->icache_line_size = 64;
|
... | ... | |
4041 |
4076 |
#if !defined(CONFIG_USER_ONLY)
|
4042 |
4077 |
env->excp_prefix = 0xFFF00000;
|
4043 |
4078 |
#endif
|
|
4079 |
#if !defined(CONFIG_USER_ONLY)
|
4044 |
4080 |
env->slb_nr = 32;
|
|
4081 |
#endif
|
4045 |
4082 |
init_excp_970(env);
|
4046 |
4083 |
env->dcache_line_size = 128;
|
4047 |
4084 |
env->icache_line_size = 128;
|
... | ... | |
4112 |
4149 |
#if !defined(CONFIG_USER_ONLY)
|
4113 |
4150 |
env->excp_prefix = 0xFFF00000;
|
4114 |
4151 |
#endif
|
|
4152 |
#if !defined(CONFIG_USER_ONLY)
|
4115 |
4153 |
env->slb_nr = 32;
|
|
4154 |
#endif
|
4116 |
4155 |
init_excp_970(env);
|
4117 |
4156 |
env->dcache_line_size = 128;
|
4118 |
4157 |
env->icache_line_size = 128;
|
... | ... | |
4183 |
4222 |
#if !defined(CONFIG_USER_ONLY)
|
4184 |
4223 |
env->excp_prefix = 0xFFF00000;
|
4185 |
4224 |
#endif
|
|
4225 |
#if !defined(CONFIG_USER_ONLY)
|
4186 |
4226 |
env->slb_nr = 32;
|
|
4227 |
#endif
|
4187 |
4228 |
init_excp_970(env);
|
4188 |
4229 |
env->dcache_line_size = 128;
|
4189 |
4230 |
env->icache_line_size = 128;
|
... | ... | |
5729 |
5770 |
env->excp_prefix = 0x00000000;
|
5730 |
5771 |
env->ivor_mask = 0x00000000;
|
5731 |
5772 |
env->ivpr_mask = 0x00000000;
|
5732 |
|
#endif
|
5733 |
5773 |
/* Default MMU definitions */
|
5734 |
5774 |
env->nb_BATs = 0;
|
5735 |
5775 |
env->nb_tlb = 0;
|
5736 |
5776 |
env->nb_ways = 0;
|
|
5777 |
#endif
|
5737 |
5778 |
/* Register SPR common to all PowerPC implementations */
|
5738 |
5779 |
gen_spr_generic(env);
|
5739 |
5780 |
spr_register(env, SPR_PVR, "PVR",
|
... | ... | |
5743 |
5784 |
/* PowerPC implementation specific initialisations (SPRs, timers, ...) */
|
5744 |
5785 |
(*def->init_proc)(env);
|
5745 |
5786 |
/* Allocate TLBs buffer when needed */
|
|
5787 |
#if !defined(CONFIG_USER_ONLY)
|
5746 |
5788 |
if (env->nb_tlb != 0) {
|
5747 |
5789 |
int nb_tlb = env->nb_tlb;
|
5748 |
5790 |
if (env->id_tlbs != 0)
|
... | ... | |
5751 |
5793 |
/* Pre-compute some useful values */
|
5752 |
5794 |
env->tlb_per_way = env->nb_tlb / env->nb_ways;
|
5753 |
5795 |
}
|
5754 |
|
#if !defined(CONFIG_USER_ONLY)
|
5755 |
5796 |
if (env->irq_inputs == NULL) {
|
5756 |
5797 |
fprintf(stderr, "WARNING: no internal IRQ controller registered.\n"
|
5757 |
5798 |
" Attempt Qemu to crash very soon !\n");
|
... | ... | |
6171 |
6212 |
printf("PowerPC %-12s : PVR %08x MSR %016" PRIx64 "\n"
|
6172 |
6213 |
" MMU model : %s\n",
|
6173 |
6214 |
def->name, def->pvr, def->msr_mask, mmu_model);
|
|
6215 |
#if !defined(CONFIG_USER_ONLY)
|
6174 |
6216 |
if (env->tlb != NULL) {
|
6175 |
6217 |
printf(" %d %s TLB in %d ways\n",
|
6176 |
6218 |
env->nb_tlb, env->id_tlbs ? "splitted" : "merged",
|
6177 |
6219 |
env->nb_ways);
|
6178 |
6220 |
}
|
|
6221 |
#endif
|
6179 |
6222 |
printf(" Exceptions model : %s\n"
|
6180 |
6223 |
" Bus model : %s\n",
|
6181 |
6224 |
excp_model, bus_model);
|