Commit fd88b6abab9a4425505b292b5fedbad31d0dfe4f
1 parent
df1561e2
The 24k wants more watch and srsmap registers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2849 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
45 additions
and
261 deletions
target-mips/cpu.h
| ... | ... | @@ -216,8 +216,8 @@ struct CPUMIPSState { |
| 216 | 216 | int32_t CP0_Config6; |
| 217 | 217 | int32_t CP0_Config7; |
| 218 | 218 | target_ulong CP0_LLAddr; |
| 219 | - target_ulong CP0_WatchLo; | |
| 220 | - int32_t CP0_WatchHi; | |
| 219 | + target_ulong CP0_WatchLo[8]; | |
| 220 | + int32_t CP0_WatchHi[8]; | |
| 221 | 221 | target_ulong CP0_XContext; |
| 222 | 222 | int32_t CP0_Framemask; |
| 223 | 223 | int32_t CP0_Debug; | ... | ... |
target-mips/helper.c
| ... | ... | @@ -381,7 +381,7 @@ void do_interrupt (CPUState *env) |
| 381 | 381 | break; |
| 382 | 382 | case EXCP_SRESET: |
| 383 | 383 | env->CP0_Status |= (1 << CP0St_SR); |
| 384 | - env->CP0_WatchLo = 0; | |
| 384 | + memset(env->CP0_WatchLo, 0, sizeof(*env->CP0_WatchLo)); | |
| 385 | 385 | goto set_error_EPC; |
| 386 | 386 | case EXCP_NMI: |
| 387 | 387 | env->CP0_Status |= (1 << CP0St_NMI); | ... | ... |
target-mips/op.c
| ... | ... | @@ -1171,15 +1171,15 @@ void op_mfc0_lladdr (void) |
| 1171 | 1171 | RETURN(); |
| 1172 | 1172 | } |
| 1173 | 1173 | |
| 1174 | -void op_mfc0_watchlo0 (void) | |
| 1174 | +void op_mfc0_watchlo (void) | |
| 1175 | 1175 | { |
| 1176 | - T0 = (int32_t)env->CP0_WatchLo; | |
| 1176 | + T0 = (int32_t)env->CP0_WatchLo[PARAM1]; | |
| 1177 | 1177 | RETURN(); |
| 1178 | 1178 | } |
| 1179 | 1179 | |
| 1180 | -void op_mfc0_watchhi0 (void) | |
| 1180 | +void op_mfc0_watchhi (void) | |
| 1181 | 1181 | { |
| 1182 | - T0 = env->CP0_WatchHi; | |
| 1182 | + T0 = env->CP0_WatchHi[PARAM1]; | |
| 1183 | 1183 | RETURN(); |
| 1184 | 1184 | } |
| 1185 | 1185 | |
| ... | ... | @@ -1423,18 +1423,18 @@ void op_mtc0_config2 (void) |
| 1423 | 1423 | RETURN(); |
| 1424 | 1424 | } |
| 1425 | 1425 | |
| 1426 | -void op_mtc0_watchlo0 (void) | |
| 1426 | +void op_mtc0_watchlo (void) | |
| 1427 | 1427 | { |
| 1428 | 1428 | /* Watch exceptions for instructions, data loads, data stores |
| 1429 | 1429 | not implemented. */ |
| 1430 | - env->CP0_WatchLo = (T0 & ~0x7); | |
| 1430 | + env->CP0_WatchLo[PARAM1] = (T0 & ~0x7); | |
| 1431 | 1431 | RETURN(); |
| 1432 | 1432 | } |
| 1433 | 1433 | |
| 1434 | -void op_mtc0_watchhi0 (void) | |
| 1434 | +void op_mtc0_watchhi (void) | |
| 1435 | 1435 | { |
| 1436 | - env->CP0_WatchHi = (T0 & 0x40FF0FF8); | |
| 1437 | - env->CP0_WatchHi &= ~(env->CP0_WatchHi & T0 & 0x7); | |
| 1436 | + env->CP0_WatchHi[PARAM1] = (T0 & 0x40FF0FF8); | |
| 1437 | + env->CP0_WatchHi[PARAM1] &= ~(env->CP0_WatchHi[PARAM1] & T0 & 0x7); | |
| 1438 | 1438 | RETURN(); |
| 1439 | 1439 | } |
| 1440 | 1440 | |
| ... | ... | @@ -1551,9 +1551,9 @@ void op_dmfc0_lladdr (void) |
| 1551 | 1551 | RETURN(); |
| 1552 | 1552 | } |
| 1553 | 1553 | |
| 1554 | -void op_dmfc0_watchlo0 (void) | |
| 1554 | +void op_dmfc0_watchlo (void) | |
| 1555 | 1555 | { |
| 1556 | - T0 = env->CP0_WatchLo; | |
| 1556 | + T0 = env->CP0_WatchLo[PARAM1]; | |
| 1557 | 1557 | RETURN(); |
| 1558 | 1558 | } |
| 1559 | 1559 | ... | ... |
target-mips/translate.c
| ... | ... | @@ -2035,9 +2035,9 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) |
| 2035 | 2035 | rn = "SRSCtl"; |
| 2036 | 2036 | break; |
| 2037 | 2037 | case 3: |
| 2038 | -// gen_op_mfc0_srsmap(); /* shadow registers */ | |
| 2038 | + gen_op_mfc0_srsmap(); | |
| 2039 | 2039 | rn = "SRSMap"; |
| 2040 | -// break; | |
| 2040 | + break; | |
| 2041 | 2041 | default: |
| 2042 | 2042 | goto die; |
| 2043 | 2043 | } |
| ... | ... | @@ -2120,76 +2120,20 @@ static void gen_mfc0 (DisasContext *ctx, int reg, int sel) |
| 2120 | 2120 | break; |
| 2121 | 2121 | case 18: |
| 2122 | 2122 | switch (sel) { |
| 2123 | - case 0: | |
| 2124 | - gen_op_mfc0_watchlo0(); | |
| 2123 | + case 0 ... 7: | |
| 2124 | + gen_op_mfc0_watchlo(sel); | |
| 2125 | 2125 | rn = "WatchLo"; |
| 2126 | 2126 | break; |
| 2127 | - case 1: | |
| 2128 | -// gen_op_mfc0_watchlo1(); | |
| 2129 | - rn = "WatchLo1"; | |
| 2130 | -// break; | |
| 2131 | - case 2: | |
| 2132 | -// gen_op_mfc0_watchlo2(); | |
| 2133 | - rn = "WatchLo2"; | |
| 2134 | -// break; | |
| 2135 | - case 3: | |
| 2136 | -// gen_op_mfc0_watchlo3(); | |
| 2137 | - rn = "WatchLo3"; | |
| 2138 | -// break; | |
| 2139 | - case 4: | |
| 2140 | -// gen_op_mfc0_watchlo4(); | |
| 2141 | - rn = "WatchLo4"; | |
| 2142 | -// break; | |
| 2143 | - case 5: | |
| 2144 | -// gen_op_mfc0_watchlo5(); | |
| 2145 | - rn = "WatchLo5"; | |
| 2146 | -// break; | |
| 2147 | - case 6: | |
| 2148 | -// gen_op_mfc0_watchlo6(); | |
| 2149 | - rn = "WatchLo6"; | |
| 2150 | -// break; | |
| 2151 | - case 7: | |
| 2152 | -// gen_op_mfc0_watchlo7(); | |
| 2153 | - rn = "WatchLo7"; | |
| 2154 | -// break; | |
| 2155 | 2127 | default: |
| 2156 | 2128 | goto die; |
| 2157 | 2129 | } |
| 2158 | 2130 | break; |
| 2159 | 2131 | case 19: |
| 2160 | 2132 | switch (sel) { |
| 2161 | - case 0: | |
| 2162 | - gen_op_mfc0_watchhi0(); | |
| 2133 | + case 0 ...7: | |
| 2134 | + gen_op_mfc0_watchhi(sel); | |
| 2163 | 2135 | rn = "WatchHi"; |
| 2164 | 2136 | break; |
| 2165 | - case 1: | |
| 2166 | -// gen_op_mfc0_watchhi1(); | |
| 2167 | - rn = "WatchHi1"; | |
| 2168 | -// break; | |
| 2169 | - case 2: | |
| 2170 | -// gen_op_mfc0_watchhi2(); | |
| 2171 | - rn = "WatchHi2"; | |
| 2172 | -// break; | |
| 2173 | - case 3: | |
| 2174 | -// gen_op_mfc0_watchhi3(); | |
| 2175 | - rn = "WatchHi3"; | |
| 2176 | -// break; | |
| 2177 | - case 4: | |
| 2178 | -// gen_op_mfc0_watchhi4(); | |
| 2179 | - rn = "WatchHi4"; | |
| 2180 | -// break; | |
| 2181 | - case 5: | |
| 2182 | -// gen_op_mfc0_watchhi5(); | |
| 2183 | - rn = "WatchHi5"; | |
| 2184 | -// break; | |
| 2185 | - case 6: | |
| 2186 | -// gen_op_mfc0_watchhi6(); | |
| 2187 | - rn = "WatchHi6"; | |
| 2188 | -// break; | |
| 2189 | - case 7: | |
| 2190 | -// gen_op_mfc0_watchhi7(); | |
| 2191 | - rn = "WatchHi7"; | |
| 2192 | -// break; | |
| 2193 | 2137 | default: |
| 2194 | 2138 | goto die; |
| 2195 | 2139 | } |
| ... | ... | @@ -2625,9 +2569,9 @@ static void gen_mtc0 (DisasContext *ctx, int reg, int sel) |
| 2625 | 2569 | rn = "SRSCtl"; |
| 2626 | 2570 | break; |
| 2627 | 2571 | case 3: |
| 2628 | -// gen_op_mtc0_srsmap(); /* shadow registers */ | |
| 2572 | + gen_op_mtc0_srsmap(); | |
| 2629 | 2573 | rn = "SRSMap"; |
| 2630 | -// break; | |
| 2574 | + break; | |
| 2631 | 2575 | default: |
| 2632 | 2576 | goto die; |
| 2633 | 2577 | } |
| ... | ... | @@ -2719,76 +2663,20 @@ static void gen_mtc0 (DisasContext *ctx, int reg, int sel) |
| 2719 | 2663 | break; |
| 2720 | 2664 | case 18: |
| 2721 | 2665 | switch (sel) { |
| 2722 | - case 0: | |
| 2723 | - gen_op_mtc0_watchlo0(); | |
| 2666 | + case 0 ... 7: | |
| 2667 | + gen_op_mtc0_watchlo(sel); | |
| 2724 | 2668 | rn = "WatchLo"; |
| 2725 | 2669 | break; |
| 2726 | - case 1: | |
| 2727 | -// gen_op_mtc0_watchlo1(); | |
| 2728 | - rn = "WatchLo1"; | |
| 2729 | -// break; | |
| 2730 | - case 2: | |
| 2731 | -// gen_op_mtc0_watchlo2(); | |
| 2732 | - rn = "WatchLo2"; | |
| 2733 | -// break; | |
| 2734 | - case 3: | |
| 2735 | -// gen_op_mtc0_watchlo3(); | |
| 2736 | - rn = "WatchLo3"; | |
| 2737 | -// break; | |
| 2738 | - case 4: | |
| 2739 | -// gen_op_mtc0_watchlo4(); | |
| 2740 | - rn = "WatchLo4"; | |
| 2741 | -// break; | |
| 2742 | - case 5: | |
| 2743 | -// gen_op_mtc0_watchlo5(); | |
| 2744 | - rn = "WatchLo5"; | |
| 2745 | -// break; | |
| 2746 | - case 6: | |
| 2747 | -// gen_op_mtc0_watchlo6(); | |
| 2748 | - rn = "WatchLo6"; | |
| 2749 | -// break; | |
| 2750 | - case 7: | |
| 2751 | -// gen_op_mtc0_watchlo7(); | |
| 2752 | - rn = "WatchLo7"; | |
| 2753 | -// break; | |
| 2754 | 2670 | default: |
| 2755 | 2671 | goto die; |
| 2756 | 2672 | } |
| 2757 | 2673 | break; |
| 2758 | 2674 | case 19: |
| 2759 | 2675 | switch (sel) { |
| 2760 | - case 0: | |
| 2761 | - gen_op_mtc0_watchhi0(); | |
| 2676 | + case 0 ... 7: | |
| 2677 | + gen_op_mtc0_watchhi(sel); | |
| 2762 | 2678 | rn = "WatchHi"; |
| 2763 | 2679 | break; |
| 2764 | - case 1: | |
| 2765 | -// gen_op_mtc0_watchhi1(); | |
| 2766 | - rn = "WatchHi1"; | |
| 2767 | -// break; | |
| 2768 | - case 2: | |
| 2769 | -// gen_op_mtc0_watchhi2(); | |
| 2770 | - rn = "WatchHi2"; | |
| 2771 | -// break; | |
| 2772 | - case 3: | |
| 2773 | -// gen_op_mtc0_watchhi3(); | |
| 2774 | - rn = "WatchHi3"; | |
| 2775 | -// break; | |
| 2776 | - case 4: | |
| 2777 | -// gen_op_mtc0_watchhi4(); | |
| 2778 | - rn = "WatchHi4"; | |
| 2779 | -// break; | |
| 2780 | - case 5: | |
| 2781 | -// gen_op_mtc0_watchhi5(); | |
| 2782 | - rn = "WatchHi5"; | |
| 2783 | -// break; | |
| 2784 | - case 6: | |
| 2785 | -// gen_op_mtc0_watchhi6(); | |
| 2786 | - rn = "WatchHi6"; | |
| 2787 | -// break; | |
| 2788 | - case 7: | |
| 2789 | -// gen_op_mtc0_watchhi7(); | |
| 2790 | - rn = "WatchHi7"; | |
| 2791 | -// break; | |
| 2792 | 2680 | default: |
| 2793 | 2681 | goto die; |
| 2794 | 2682 | } |
| ... | ... | @@ -3309,76 +3197,20 @@ static void gen_dmfc0 (DisasContext *ctx, int reg, int sel) |
| 3309 | 3197 | break; |
| 3310 | 3198 | case 18: |
| 3311 | 3199 | switch (sel) { |
| 3312 | - case 0: | |
| 3313 | - gen_op_dmfc0_watchlo0(); | |
| 3200 | + case 0 ... 7: | |
| 3201 | + gen_op_dmfc0_watchlo(sel); | |
| 3314 | 3202 | rn = "WatchLo"; |
| 3315 | 3203 | break; |
| 3316 | - case 1: | |
| 3317 | -// gen_op_dmfc0_watchlo1(); | |
| 3318 | - rn = "WatchLo1"; | |
| 3319 | -// break; | |
| 3320 | - case 2: | |
| 3321 | -// gen_op_dmfc0_watchlo2(); | |
| 3322 | - rn = "WatchLo2"; | |
| 3323 | -// break; | |
| 3324 | - case 3: | |
| 3325 | -// gen_op_dmfc0_watchlo3(); | |
| 3326 | - rn = "WatchLo3"; | |
| 3327 | -// break; | |
| 3328 | - case 4: | |
| 3329 | -// gen_op_dmfc0_watchlo4(); | |
| 3330 | - rn = "WatchLo4"; | |
| 3331 | -// break; | |
| 3332 | - case 5: | |
| 3333 | -// gen_op_dmfc0_watchlo5(); | |
| 3334 | - rn = "WatchLo5"; | |
| 3335 | -// break; | |
| 3336 | - case 6: | |
| 3337 | -// gen_op_dmfc0_watchlo6(); | |
| 3338 | - rn = "WatchLo6"; | |
| 3339 | -// break; | |
| 3340 | - case 7: | |
| 3341 | -// gen_op_dmfc0_watchlo7(); | |
| 3342 | - rn = "WatchLo7"; | |
| 3343 | -// break; | |
| 3344 | 3204 | default: |
| 3345 | 3205 | goto die; |
| 3346 | 3206 | } |
| 3347 | 3207 | break; |
| 3348 | 3208 | case 19: |
| 3349 | 3209 | switch (sel) { |
| 3350 | - case 0: | |
| 3351 | - gen_op_mfc0_watchhi0(); | |
| 3210 | + case 0 ... 7: | |
| 3211 | + gen_op_mfc0_watchhi(sel); | |
| 3352 | 3212 | rn = "WatchHi"; |
| 3353 | 3213 | break; |
| 3354 | - case 1: | |
| 3355 | -// gen_op_mfc0_watchhi1(); | |
| 3356 | - rn = "WatchHi1"; | |
| 3357 | -// break; | |
| 3358 | - case 2: | |
| 3359 | -// gen_op_mfc0_watchhi2(); | |
| 3360 | - rn = "WatchHi2"; | |
| 3361 | -// break; | |
| 3362 | - case 3: | |
| 3363 | -// gen_op_mfc0_watchhi3(); | |
| 3364 | - rn = "WatchHi3"; | |
| 3365 | -// break; | |
| 3366 | - case 4: | |
| 3367 | -// gen_op_mfc0_watchhi4(); | |
| 3368 | - rn = "WatchHi4"; | |
| 3369 | -// break; | |
| 3370 | - case 5: | |
| 3371 | -// gen_op_mfc0_watchhi5(); | |
| 3372 | - rn = "WatchHi5"; | |
| 3373 | -// break; | |
| 3374 | - case 6: | |
| 3375 | -// gen_op_mfc0_watchhi6(); | |
| 3376 | - rn = "WatchHi6"; | |
| 3377 | -// break; | |
| 3378 | - case 7: | |
| 3379 | -// gen_op_mfc0_watchhi7(); | |
| 3380 | - rn = "WatchHi7"; | |
| 3381 | -// break; | |
| 3382 | 3214 | default: |
| 3383 | 3215 | goto die; |
| 3384 | 3216 | } |
| ... | ... | @@ -3814,7 +3646,7 @@ static void gen_dmtc0 (DisasContext *ctx, int reg, int sel) |
| 3814 | 3646 | rn = "SRSCtl"; |
| 3815 | 3647 | break; |
| 3816 | 3648 | case 3: |
| 3817 | - gen_op_mtc0_srsmap(); /* shadow registers */ | |
| 3649 | + gen_op_mtc0_srsmap(); | |
| 3818 | 3650 | rn = "SRSMap"; |
| 3819 | 3651 | break; |
| 3820 | 3652 | default: |
| ... | ... | @@ -3899,76 +3731,20 @@ static void gen_dmtc0 (DisasContext *ctx, int reg, int sel) |
| 3899 | 3731 | break; |
| 3900 | 3732 | case 18: |
| 3901 | 3733 | switch (sel) { |
| 3902 | - case 0: | |
| 3903 | - gen_op_mtc0_watchlo0(); | |
| 3734 | + case 0 ... 7: | |
| 3735 | + gen_op_mtc0_watchlo(sel); | |
| 3904 | 3736 | rn = "WatchLo"; |
| 3905 | 3737 | break; |
| 3906 | - case 1: | |
| 3907 | -// gen_op_mtc0_watchlo1(); | |
| 3908 | - rn = "WatchLo1"; | |
| 3909 | -// break; | |
| 3910 | - case 2: | |
| 3911 | -// gen_op_mtc0_watchlo2(); | |
| 3912 | - rn = "WatchLo2"; | |
| 3913 | -// break; | |
| 3914 | - case 3: | |
| 3915 | -// gen_op_mtc0_watchlo3(); | |
| 3916 | - rn = "WatchLo3"; | |
| 3917 | -// break; | |
| 3918 | - case 4: | |
| 3919 | -// gen_op_mtc0_watchlo4(); | |
| 3920 | - rn = "WatchLo4"; | |
| 3921 | -// break; | |
| 3922 | - case 5: | |
| 3923 | -// gen_op_mtc0_watchlo5(); | |
| 3924 | - rn = "WatchLo5"; | |
| 3925 | -// break; | |
| 3926 | - case 6: | |
| 3927 | -// gen_op_mtc0_watchlo6(); | |
| 3928 | - rn = "WatchLo6"; | |
| 3929 | -// break; | |
| 3930 | - case 7: | |
| 3931 | -// gen_op_mtc0_watchlo7(); | |
| 3932 | - rn = "WatchLo7"; | |
| 3933 | -// break; | |
| 3934 | 3738 | default: |
| 3935 | 3739 | goto die; |
| 3936 | 3740 | } |
| 3937 | 3741 | break; |
| 3938 | 3742 | case 19: |
| 3939 | 3743 | switch (sel) { |
| 3940 | - case 0: | |
| 3941 | - gen_op_mtc0_watchhi0(); | |
| 3744 | + case 0 ... 7: | |
| 3745 | + gen_op_mtc0_watchhi(sel); | |
| 3942 | 3746 | rn = "WatchHi"; |
| 3943 | 3747 | break; |
| 3944 | - case 1: | |
| 3945 | -// gen_op_mtc0_watchhi1(); | |
| 3946 | - rn = "WatchHi1"; | |
| 3947 | -// break; | |
| 3948 | - case 2: | |
| 3949 | -// gen_op_mtc0_watchhi2(); | |
| 3950 | - rn = "WatchHi2"; | |
| 3951 | -// break; | |
| 3952 | - case 3: | |
| 3953 | -// gen_op_mtc0_watchhi3(); | |
| 3954 | - rn = "WatchHi3"; | |
| 3955 | -// break; | |
| 3956 | - case 4: | |
| 3957 | -// gen_op_mtc0_watchhi4(); | |
| 3958 | - rn = "WatchHi4"; | |
| 3959 | -// break; | |
| 3960 | - case 5: | |
| 3961 | -// gen_op_mtc0_watchhi5(); | |
| 3962 | - rn = "WatchHi5"; | |
| 3963 | -// break; | |
| 3964 | - case 6: | |
| 3965 | -// gen_op_mtc0_watchhi6(); | |
| 3966 | - rn = "WatchHi6"; | |
| 3967 | -// break; | |
| 3968 | - case 7: | |
| 3969 | -// gen_op_mtc0_watchhi7(); | |
| 3970 | - rn = "WatchHi7"; | |
| 3971 | -// break; | |
| 3972 | 3748 | default: |
| 3973 | 3749 | goto die; |
| 3974 | 3750 | } |
| ... | ... | @@ -6269,8 +6045,16 @@ void cpu_reset (CPUMIPSState *env) |
| 6269 | 6045 | /* vectored interrupts not implemented, timer on int 7, |
| 6270 | 6046 | no performance counters. */ |
| 6271 | 6047 | env->CP0_IntCtl = 0xe0000000; |
| 6272 | - env->CP0_WatchLo = 0; | |
| 6273 | - env->CP0_WatchHi = 0; | |
| 6048 | + { | |
| 6049 | + int i; | |
| 6050 | + | |
| 6051 | + for (i = 0; i < 7; i++) { | |
| 6052 | + env->CP0_WatchLo[i] = 0; | |
| 6053 | + env->CP0_WatchHi[i] = 0x80000000; | |
| 6054 | + } | |
| 6055 | + env->CP0_WatchLo[7] = 0; | |
| 6056 | + env->CP0_WatchHi[7] = 0; | |
| 6057 | + } | |
| 6274 | 6058 | /* Count register increments in debug mode, EJTAG version 1 */ |
| 6275 | 6059 | env->CP0_Debug = (1 << CP0DB_CNT) | (0x1 << CP0DB_VER); |
| 6276 | 6060 | #endif | ... | ... |