]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: semihosting: Fix returning from traps on ARMv6 and lower
authorSean Anderson <sean.anderson@seco.com>
Fri, 27 Oct 2023 20:40:14 +0000 (16:40 -0400)
committerTom Rini <trini@konsulko.com>
Fri, 10 Nov 2023 17:52:28 +0000 (12:52 -0500)
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>
arch/arm/lib/semihosting.S

index 393aade94a535ef050b2c19710270e95829a2cdc..6e1691a832c1311fe2f090a7686337c92830e29e 100644 (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