Commit 97428a4d84a22795e0d9f1517677ec01cb1bede1
1 parent
dac93210
Fix exception handling cornercase for rdhwr.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2641 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
9 additions
and
37 deletions
target-mips/op.c
| ... | ... | @@ -2126,7 +2126,7 @@ void op_deret (void) |
| 2126 | 2126 | void op_rdhwr_cpunum(void) |
| 2127 | 2127 | { |
| 2128 | 2128 | if (!(env->hflags & MIPS_HFLAG_UM) || |
| 2129 | - (env->CP0_HWREna & (1 << 0)) || | |
| 2129 | + (env->CP0_HWREna & (1 << 0)) || | |
| 2130 | 2130 | (env->CP0_Status & (1 << CP0St_CU0))) |
| 2131 | 2131 | T0 = env->CP0_EBase & 0x3ff; |
| 2132 | 2132 | else |
| ... | ... | @@ -2137,7 +2137,7 @@ void op_rdhwr_cpunum(void) |
| 2137 | 2137 | void op_rdhwr_synci_step(void) |
| 2138 | 2138 | { |
| 2139 | 2139 | if (!(env->hflags & MIPS_HFLAG_UM) || |
| 2140 | - (env->CP0_HWREna & (1 << 1)) || | |
| 2140 | + (env->CP0_HWREna & (1 << 1)) || | |
| 2141 | 2141 | (env->CP0_Status & (1 << CP0St_CU0))) |
| 2142 | 2142 | T0 = env->SYNCI_Step; |
| 2143 | 2143 | else |
| ... | ... | @@ -2148,7 +2148,7 @@ void op_rdhwr_synci_step(void) |
| 2148 | 2148 | void op_rdhwr_cc(void) |
| 2149 | 2149 | { |
| 2150 | 2150 | if (!(env->hflags & MIPS_HFLAG_UM) || |
| 2151 | - (env->CP0_HWREna & (1 << 2)) || | |
| 2151 | + (env->CP0_HWREna & (1 << 2)) || | |
| 2152 | 2152 | (env->CP0_Status & (1 << CP0St_CU0))) |
| 2153 | 2153 | T0 = env->CP0_Count; |
| 2154 | 2154 | else |
| ... | ... | @@ -2159,7 +2159,7 @@ void op_rdhwr_cc(void) |
| 2159 | 2159 | void op_rdhwr_ccres(void) |
| 2160 | 2160 | { |
| 2161 | 2161 | if (!(env->hflags & MIPS_HFLAG_UM) || |
| 2162 | - (env->CP0_HWREna & (1 << 3)) || | |
| 2162 | + (env->CP0_HWREna & (1 << 3)) || | |
| 2163 | 2163 | (env->CP0_Status & (1 << CP0St_CU0))) |
| 2164 | 2164 | T0 = env->CCRes; |
| 2165 | 2165 | else |
| ... | ... | @@ -2167,28 +2167,6 @@ void op_rdhwr_ccres(void) |
| 2167 | 2167 | RETURN(); |
| 2168 | 2168 | } |
| 2169 | 2169 | |
| 2170 | -void op_rdhwr_unimpl30(void) | |
| 2171 | -{ | |
| 2172 | - if (!(env->hflags & MIPS_HFLAG_UM) || | |
| 2173 | - (env->CP0_HWREna & (1 << 30)) || | |
| 2174 | - (env->CP0_Status & (1 << CP0St_CU0))) | |
| 2175 | - T0 = 0; | |
| 2176 | - else | |
| 2177 | - CALL_FROM_TB1(do_raise_exception, EXCP_RI); | |
| 2178 | - RETURN(); | |
| 2179 | -} | |
| 2180 | - | |
| 2181 | -void op_rdhwr_unimpl31(void) | |
| 2182 | -{ | |
| 2183 | - if (!(env->hflags & MIPS_HFLAG_UM) || | |
| 2184 | - (env->CP0_HWREna & (1 << 31)) || | |
| 2185 | - (env->CP0_Status & (1 << CP0St_CU0))) | |
| 2186 | - T0 = 0; | |
| 2187 | - else | |
| 2188 | - CALL_FROM_TB1(do_raise_exception, EXCP_RI); | |
| 2189 | - RETURN(); | |
| 2190 | -} | |
| 2191 | - | |
| 2192 | 2170 | void op_save_state (void) |
| 2193 | 2171 | { |
| 2194 | 2172 | env->hflags = PARAM1; | ... | ... |
target-mips/translate.c
| ... | ... | @@ -4825,32 +4825,26 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
| 4825 | 4825 | case OPC_RDHWR: |
| 4826 | 4826 | switch (rd) { |
| 4827 | 4827 | case 0: |
| 4828 | + save_cpu_state(ctx, 1); | |
| 4828 | 4829 | gen_op_rdhwr_cpunum(); |
| 4829 | 4830 | break; |
| 4830 | 4831 | case 1: |
| 4832 | + save_cpu_state(ctx, 1); | |
| 4831 | 4833 | gen_op_rdhwr_synci_step(); |
| 4832 | 4834 | break; |
| 4833 | 4835 | case 2: |
| 4836 | + save_cpu_state(ctx, 1); | |
| 4834 | 4837 | gen_op_rdhwr_cc(); |
| 4835 | 4838 | break; |
| 4836 | 4839 | case 3: |
| 4840 | + save_cpu_state(ctx, 1); | |
| 4837 | 4841 | gen_op_rdhwr_ccres(); |
| 4838 | 4842 | break; |
| 4839 | 4843 | case 29: |
| 4840 | 4844 | #if defined (CONFIG_USER_ONLY) |
| 4841 | 4845 | gen_op_tls_value (); |
| 4842 | -#else | |
| 4843 | - generate_exception(ctx, EXCP_RI); | |
| 4844 | -#endif | |
| 4845 | - break; | |
| 4846 | - case 30: | |
| 4847 | - /* Implementation dependent */; | |
| 4848 | - gen_op_rdhwr_unimpl30(); | |
| 4849 | - break; | |
| 4850 | - case 31: | |
| 4851 | - /* Implementation dependent */; | |
| 4852 | - gen_op_rdhwr_unimpl31(); | |
| 4853 | 4846 | break; |
| 4847 | +#endif | |
| 4854 | 4848 | default: /* Invalid */ |
| 4855 | 4849 | MIPS_INVAL("rdhwr"); |
| 4856 | 4850 | generate_exception(ctx, EXCP_RI); | ... | ... |