Revision 24c7b0e3 target-mips/op.c
b/target-mips/op.c | ||
---|---|---|
1105 | 1105 |
void op_mfc0_status (void) |
1106 | 1106 |
{ |
1107 | 1107 |
T0 = env->CP0_Status; |
1108 |
if (env->hflags & MIPS_HFLAG_UM) |
|
1109 |
T0 |= (1 << CP0St_UM); |
|
1110 |
if (env->hflags & MIPS_HFLAG_ERL) |
|
1111 |
T0 |= (1 << CP0St_ERL); |
|
1112 |
if (env->hflags & MIPS_HFLAG_EXL) |
|
1113 |
T0 |= (1 << CP0St_EXL); |
|
1114 | 1108 |
RETURN(); |
1115 | 1109 |
} |
1116 | 1110 |
|
... | ... | |
1365 | 1359 |
{ |
1366 | 1360 |
uint32_t val, old; |
1367 | 1361 |
|
1368 |
val = (int32_t)T0 & 0xFA78FF01; |
|
1362 |
/* No 64bit FPU, no reverse endianness, no MDMX/DSP, no 64bit ops, |
|
1363 |
no 64bit addressing implemented. */ |
|
1364 |
val = (int32_t)T0 & 0xF878FF17; |
|
1369 | 1365 |
old = env->CP0_Status; |
1370 |
if (T0 & (1 << CP0St_UM)) |
|
1371 |
env->hflags |= MIPS_HFLAG_UM; |
|
1372 |
else |
|
1373 |
env->hflags &= ~MIPS_HFLAG_UM; |
|
1374 |
if (T0 & (1 << CP0St_ERL)) |
|
1375 |
env->hflags |= MIPS_HFLAG_ERL; |
|
1376 |
else |
|
1377 |
env->hflags &= ~MIPS_HFLAG_ERL; |
|
1378 |
if (T0 & (1 << CP0St_EXL)) |
|
1379 |
env->hflags |= MIPS_HFLAG_EXL; |
|
1380 |
else |
|
1381 |
env->hflags &= ~MIPS_HFLAG_EXL; |
|
1382 | 1366 |
env->CP0_Status = val; |
1383 | 1367 |
if (loglevel & CPU_LOG_TB_IN_ASM) |
1384 | 1368 |
CALL_FROM_TB2(do_mtc0_status_debug, old, val); |
... | ... | |
1662 | 1646 |
# define DEBUG_FPU_STATE() do { } while(0) |
1663 | 1647 |
#endif |
1664 | 1648 |
|
1649 |
void op_cp0_enabled(void) |
|
1650 |
{ |
|
1651 |
if (!(env->CP0_Status & (1 << CP0St_CU0)) && |
|
1652 |
(env->hflags & MIPS_HFLAG_UM)) { |
|
1653 |
CALL_FROM_TB2(do_raise_exception_direct_err, EXCP_CpU, 0); |
|
1654 |
} |
|
1655 |
RETURN(); |
|
1656 |
} |
|
1657 |
|
|
1665 | 1658 |
void op_cp1_enabled(void) |
1666 | 1659 |
{ |
1667 | 1660 |
if (!(env->CP0_Status & (1 << CP0St_CU1))) { |
... | ... | |
2091 | 2084 |
void op_eret (void) |
2092 | 2085 |
{ |
2093 | 2086 |
CALL_FROM_TB0(debug_eret); |
2094 |
if (env->hflags & MIPS_HFLAG_ERL) {
|
|
2087 |
if (env->CP0_Status & (1 << CP0St_ERL)) {
|
|
2095 | 2088 |
env->PC = env->CP0_ErrorEPC; |
2096 |
env->hflags &= ~MIPS_HFLAG_ERL; |
|
2097 |
env->CP0_Status &= ~(1 << CP0St_ERL); |
|
2089 |
env->CP0_Status &= ~(1 << CP0St_ERL); |
|
2098 | 2090 |
} else { |
2099 | 2091 |
env->PC = env->CP0_EPC; |
2100 |
env->hflags &= ~MIPS_HFLAG_EXL; |
|
2101 |
env->CP0_Status &= ~(1 << CP0St_EXL); |
|
2092 |
env->CP0_Status &= ~(1 << CP0St_EXL); |
|
2102 | 2093 |
} |
2094 |
if (!(env->CP0_Status & (1 << CP0St_EXL)) && |
|
2095 |
!(env->CP0_Status & (1 << CP0St_ERL)) && |
|
2096 |
!(env->hflags & MIPS_HFLAG_DM) && |
|
2097 |
(env->CP0_Status & (1 << CP0St_UM))) |
|
2098 |
env->hflags |= MIPS_HFLAG_UM; |
|
2103 | 2099 |
env->CP0_LLAddr = 1; |
2104 | 2100 |
RETURN(); |
2105 | 2101 |
} |
... | ... | |
2108 | 2104 |
{ |
2109 | 2105 |
CALL_FROM_TB0(debug_eret); |
2110 | 2106 |
env->PC = env->CP0_DEPC; |
2107 |
env->hflags |= MIPS_HFLAG_DM; |
|
2108 |
if (!(env->CP0_Status & (1 << CP0St_EXL)) && |
|
2109 |
!(env->CP0_Status & (1 << CP0St_ERL)) && |
|
2110 |
!(env->hflags & MIPS_HFLAG_DM) && |
|
2111 |
(env->CP0_Status & (1 << CP0St_UM))) |
|
2112 |
env->hflags |= MIPS_HFLAG_UM; |
|
2113 |
env->CP0_LLAddr = 1; |
|
2111 | 2114 |
RETURN(); |
2112 | 2115 |
} |
2113 | 2116 |
|
Also available in: Unified diff