Message ID | 20170717180202.13072-1-afd@ti.com |
---|---|
State | Accepted |
Commit | 94f536fc4fd70fc9f3c7442d09698a9b1c82f41b |
Delegated to: | Tom Rini |
Headers | show |
On Mon, Jul 17, 2017 at 01:02:02PM -0500, Andrew F. Davis wrote: > From: "Srinivas, Madan" <madans@ti.com> > > The inline assembly functions in mon.c assume that the caller will > check for the return value in r0 according to regular ARM calling > conventions. > > However, this assumption breaks down if the compiler inlines the > functions. The caller is then under no obligation to use r0 for the > result. > > To fix this disconnect, we must explicitly move the return value > from the smc/bl call to the variable that the function returns. > > Signed-off-by: Madan Srinivas <madans@ti.com> Reviewed-by: Tom Rini <trini@konsulko.com>
On Mon, Jul 17, 2017 at 01:02:02PM -0500, Andrew F. Davis wrote: > From: "Srinivas, Madan" <madans@ti.com> > > The inline assembly functions in mon.c assume that the caller will > check for the return value in r0 according to regular ARM calling > conventions. > > However, this assumption breaks down if the compiler inlines the > functions. The caller is then under no obligation to use r0 for the > result. > > To fix this disconnect, we must explicitly move the return value > from the smc/bl call to the variable that the function returns. > > Signed-off-by: Madan Srinivas <madans@ti.com> > Reviewed-by: Tom Rini <trini@konsulko.com> Applied to u-boot/master, thanks!
diff --git a/arch/arm/mach-keystone/mon.c b/arch/arm/mach-keystone/mon.c index 7076a2a67b..dd446ab011 100644 --- a/arch/arm/mach-keystone/mon.c +++ b/arch/arm/mach-keystone/mon.c @@ -24,6 +24,7 @@ int mon_install(u32 addr, u32 dpsc, u32 freq, u32 bm_addr) "mov r2, %3\n" "mov r3, %4\n" "blx r0\n" + "mov %0, r0\n" "ldmfd r13!, {lr}\n" : "=&r" (result) : "r" (addr), "r" (dpsc), "r" (freq), "r" (bm_addr) @@ -41,6 +42,7 @@ int mon_power_on(int core_id, void *ep) "mov r2, %2\n" "mov r0, #0\n" "smc #0\n" + "mov %0, r0\n" "ldmfd r13!, {lr}\n" : "=&r" (result) : "r" (core_id), "r" (ep) @@ -57,6 +59,7 @@ int mon_power_off(int core_id) "mov r1, %1\n" "mov r0, #1\n" "smc #1\n" + "mov %0, r0\n" "ldmfd r13!, {lr}\n" : "=&r" (result) : "r" (core_id) @@ -90,6 +93,7 @@ static int k2_hs_bm_auth(int cmd, void *arg1) "mov r0, %1\n" "mov r1, %2\n" "smc #2\n" + "mov %0, r0\n" "ldmfd r13!, {r4-r12, lr}\n" : "=&r" (result) : "r" (cmd), "r" (arg1)