target/arm: Don't warn about exception return with PC low bit set for v8M
In the v8M architecture, return from an exception to a PC which has bit 0 set is not UNPREDICTABLE; it is defined that bit 0 is discarded [R_HRJH]. Restrict our complaint about this to v7M. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 1506092407-26985-9-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
cb484f9a6e
commit
4e4259d3c5
@ -6431,16 +6431,24 @@ static void do_v7m_exception_exit(ARMCPU *cpu)
|
|||||||
env->regs[12] = ldl_phys(cs->as, frameptr + 0x10);
|
env->regs[12] = ldl_phys(cs->as, frameptr + 0x10);
|
||||||
env->regs[14] = ldl_phys(cs->as, frameptr + 0x14);
|
env->regs[14] = ldl_phys(cs->as, frameptr + 0x14);
|
||||||
env->regs[15] = ldl_phys(cs->as, frameptr + 0x18);
|
env->regs[15] = ldl_phys(cs->as, frameptr + 0x18);
|
||||||
|
|
||||||
|
/* Returning from an exception with a PC with bit 0 set is defined
|
||||||
|
* behaviour on v8M (bit 0 is ignored), but for v7M it was specified
|
||||||
|
* to be UNPREDICTABLE. In practice actual v7M hardware seems to ignore
|
||||||
|
* the lsbit, and there are several RTOSes out there which incorrectly
|
||||||
|
* assume the r15 in the stack frame should be a Thumb-style "lsbit
|
||||||
|
* indicates ARM/Thumb" value, so ignore the bit on v7M as well, but
|
||||||
|
* complain about the badly behaved guest.
|
||||||
|
*/
|
||||||
if (env->regs[15] & 1) {
|
if (env->regs[15] & 1) {
|
||||||
qemu_log_mask(LOG_GUEST_ERROR,
|
|
||||||
"M profile return from interrupt with misaligned "
|
|
||||||
"PC is UNPREDICTABLE\n");
|
|
||||||
/* Actual hardware seems to ignore the lsbit, and there are several
|
|
||||||
* RTOSes out there which incorrectly assume the r15 in the stack
|
|
||||||
* frame should be a Thumb-style "lsbit indicates ARM/Thumb" value.
|
|
||||||
*/
|
|
||||||
env->regs[15] &= ~1U;
|
env->regs[15] &= ~1U;
|
||||||
|
if (!arm_feature(env, ARM_FEATURE_V8)) {
|
||||||
|
qemu_log_mask(LOG_GUEST_ERROR,
|
||||||
|
"M profile return from interrupt with misaligned "
|
||||||
|
"PC is UNPREDICTABLE on v7M\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xpsr = ldl_phys(cs->as, frameptr + 0x1c);
|
xpsr = ldl_phys(cs->as, frameptr + 0x1c);
|
||||||
|
|
||||||
if (arm_feature(env, ARM_FEATURE_V8)) {
|
if (arm_feature(env, ARM_FEATURE_V8)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user