Skip to contentSkip to conversation

arm: mach-keystone: Fixes issue with return values in inline assembly

PATCH In review Andrew F. Davis 2 participants 3 messages Jul 17, 2017 – Jul 26, 2017

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 arm: mach-keystone: Fixes issue with return values in inline assembly

From: "Srinivas, Madan" <[email protected]>

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.

---
 arch/arm/mach-keystone/mon.c | 4 ++++
 1 file changed, 4 insertions(+)
arch/arm/mach-keystone/mon.c +4 -0
index 7076a2a67b..dd446ab011 100644
@@ -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)
Signature · 1 line
2.13.0
#1 lore raw

PATCH 1/1 arm: mach-keystone: Fixes issue with return values in inline assembly

Quoted 6 lines · Andrew F. Davis

From: "Srinivas, Madan" <[email protected]>

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.

Quoted 8 lines

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.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170718/21b724e4/attachment.sig>
#2 lore raw
In reply to Andrew F. Davis
Quoted 10 lines · Andrew F. Davis

From: "Srinivas, Madan" <[email protected]>

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.

Quoted 5 lines

To fix this disconnect, we must explicitly move the return value from the smc/bl call to the variable that the function returns.

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20170726/b4be02a3/attachment.sig>