arm: semihosting: Fix returning from traps on ARMv6 and lower

U-Boot runs in supervisor mode. On ARMv6 and lower, software interrupts
are taken in supervisor mode. When entering an interrupt, the link
register is set to the address of the next instruction. However, if we
are already in supervisor mode, this clobbers the link register. The
debugger can't help us, since by the time it notices we've taken a
software interrupt, the link register is already gone. Work around this
by moving the return address to another register.

Signed-off-by: Sean Anderson <sean.anderson@seco.com>
This commit is contained in:
Sean Anderson 2023-10-27 16:40:14 -04:00 committed by Tom Rini
parent 298c26c5c7
commit 6ef83ab6be

View file

@ -18,11 +18,17 @@ ENTRY(smh_trap)
#elif defined(CONFIG_SYS_THUMB_BUILD)
svc #0xab
#else
#if CONFIG_SYS_ARM_ARCH < 7
/* Before the ARMv7 exception model, svc (swi) clobbers lr */
mov r2, lr
#endif
svc #0x123456
#endif
#if defined(CONFIG_ARM64)
ret
#elif CONFIG_SYS_ARM_ARCH < 7
bx r2
#else
bx lr
#endif