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 | ... | ... |