]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
arm: smh: Allow semihosting trap calls to be inlined
authorAndre Przywara <andre.przywara@arm.com>
Wed, 5 Oct 2022 16:38:49 +0000 (17:38 +0100)
committerTom Rini <trini@konsulko.com>
Wed, 2 Nov 2022 17:31:40 +0000 (13:31 -0400)
Currently our semihosting trap function is somewhat fragile: we rely
on the current compiler behaviour to assign the second inline assembly
argument to the next free register (r1/x1), which happens to be the
"addr" argument to the smh_trap() function (per the calling convention).
I guess this is also the reason for the noinline attribute.

Make it explicit what we want: the "addr" argument needs to go into r1,
so we add another register variable. This allows to drop the "noinline"
attribute, so now the compiler beautifully inlines just the trap
instruction directly into the calling function.

Signed-off-by: Andre Przywara <andre.przywara@arm.com>
arch/arm/lib/semihosting.c

index 3dee7d51b363f66f6b7ce110d62cfb3fb410c90a..939c0f75132b26dffa31abce4d9d181b51f6f461 100644 (file)
 /*
  * Call the handler
  */
-static noinline long smh_trap(unsigned int sysnum, void *addr)
+static long smh_trap(unsigned int sysnum, void *addr)
 {
        register long result asm("r0");
+       register void *_addr asm("r1") = addr;
 
        /*
         * We need a memory clobber (aka compiler barrier) for two reasons:
@@ -53,7 +54,7 @@ static noinline long smh_trap(unsigned int sysnum, void *addr)
         */
        asm volatile (SMH_TRAP
                      : "=r" (result)
-                     : "0"(sysnum), "r"(USE_PTR(addr))
+                     : "0"(sysnum), "r"(USE_PTR(_addr))
                      : "memory");
 
        return result;