提交 97428a4d 编写于 作者: T ths

Fix exception handling cornercase for rdhwr.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2641 c046a42c-6fe2-441c-8c8c-71466251a162
上级 dac93210
...@@ -2126,7 +2126,7 @@ void op_deret (void) ...@@ -2126,7 +2126,7 @@ void op_deret (void)
void op_rdhwr_cpunum(void) void op_rdhwr_cpunum(void)
{ {
if (!(env->hflags & MIPS_HFLAG_UM) || if (!(env->hflags & MIPS_HFLAG_UM) ||
(env->CP0_HWREna & (1 << 0)) || (env->CP0_HWREna & (1 << 0)) ||
(env->CP0_Status & (1 << CP0St_CU0))) (env->CP0_Status & (1 << CP0St_CU0)))
T0 = env->CP0_EBase & 0x3ff; T0 = env->CP0_EBase & 0x3ff;
else else
...@@ -2137,7 +2137,7 @@ void op_rdhwr_cpunum(void) ...@@ -2137,7 +2137,7 @@ void op_rdhwr_cpunum(void)
void op_rdhwr_synci_step(void) void op_rdhwr_synci_step(void)
{ {
if (!(env->hflags & MIPS_HFLAG_UM) || if (!(env->hflags & MIPS_HFLAG_UM) ||
(env->CP0_HWREna & (1 << 1)) || (env->CP0_HWREna & (1 << 1)) ||
(env->CP0_Status & (1 << CP0St_CU0))) (env->CP0_Status & (1 << CP0St_CU0)))
T0 = env->SYNCI_Step; T0 = env->SYNCI_Step;
else else
...@@ -2148,7 +2148,7 @@ void op_rdhwr_synci_step(void) ...@@ -2148,7 +2148,7 @@ void op_rdhwr_synci_step(void)
void op_rdhwr_cc(void) void op_rdhwr_cc(void)
{ {
if (!(env->hflags & MIPS_HFLAG_UM) || if (!(env->hflags & MIPS_HFLAG_UM) ||
(env->CP0_HWREna & (1 << 2)) || (env->CP0_HWREna & (1 << 2)) ||
(env->CP0_Status & (1 << CP0St_CU0))) (env->CP0_Status & (1 << CP0St_CU0)))
T0 = env->CP0_Count; T0 = env->CP0_Count;
else else
...@@ -2159,7 +2159,7 @@ void op_rdhwr_cc(void) ...@@ -2159,7 +2159,7 @@ void op_rdhwr_cc(void)
void op_rdhwr_ccres(void) void op_rdhwr_ccres(void)
{ {
if (!(env->hflags & MIPS_HFLAG_UM) || if (!(env->hflags & MIPS_HFLAG_UM) ||
(env->CP0_HWREna & (1 << 3)) || (env->CP0_HWREna & (1 << 3)) ||
(env->CP0_Status & (1 << CP0St_CU0))) (env->CP0_Status & (1 << CP0St_CU0)))
T0 = env->CCRes; T0 = env->CCRes;
else else
...@@ -2167,28 +2167,6 @@ void op_rdhwr_ccres(void) ...@@ -2167,28 +2167,6 @@ void op_rdhwr_ccres(void)
RETURN(); RETURN();
} }
void op_rdhwr_unimpl30(void)
{
if (!(env->hflags & MIPS_HFLAG_UM) ||
(env->CP0_HWREna & (1 << 30)) ||
(env->CP0_Status & (1 << CP0St_CU0)))
T0 = 0;
else
CALL_FROM_TB1(do_raise_exception, EXCP_RI);
RETURN();
}
void op_rdhwr_unimpl31(void)
{
if (!(env->hflags & MIPS_HFLAG_UM) ||
(env->CP0_HWREna & (1 << 31)) ||
(env->CP0_Status & (1 << CP0St_CU0)))
T0 = 0;
else
CALL_FROM_TB1(do_raise_exception, EXCP_RI);
RETURN();
}
void op_save_state (void) void op_save_state (void)
{ {
env->hflags = PARAM1; env->hflags = PARAM1;
......
...@@ -4825,32 +4825,26 @@ static void decode_opc (CPUState *env, DisasContext *ctx) ...@@ -4825,32 +4825,26 @@ static void decode_opc (CPUState *env, DisasContext *ctx)
case OPC_RDHWR: case OPC_RDHWR:
switch (rd) { switch (rd) {
case 0: case 0:
save_cpu_state(ctx, 1);
gen_op_rdhwr_cpunum(); gen_op_rdhwr_cpunum();
break; break;
case 1: case 1:
save_cpu_state(ctx, 1);
gen_op_rdhwr_synci_step(); gen_op_rdhwr_synci_step();
break; break;
case 2: case 2:
save_cpu_state(ctx, 1);
gen_op_rdhwr_cc(); gen_op_rdhwr_cc();
break; break;
case 3: case 3:
save_cpu_state(ctx, 1);
gen_op_rdhwr_ccres(); gen_op_rdhwr_ccres();
break; break;
case 29: case 29:
#if defined (CONFIG_USER_ONLY) #if defined (CONFIG_USER_ONLY)
gen_op_tls_value (); gen_op_tls_value ();
#else
generate_exception(ctx, EXCP_RI);
#endif
break;
case 30:
/* Implementation dependent */;
gen_op_rdhwr_unimpl30();
break;
case 31:
/* Implementation dependent */;
gen_op_rdhwr_unimpl31();
break; break;
#endif
default: /* Invalid */ default: /* Invalid */
MIPS_INVAL("rdhwr"); MIPS_INVAL("rdhwr");
generate_exception(ctx, EXCP_RI); generate_exception(ctx, EXCP_RI);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册