public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] semihosting: Improve ARMv7A support
@ 2015-08-08 22:29 Andrey Smirnov
  2015-09-12  7:12 ` Albert ARIBAUD
  0 siblings, 1 reply; 3+ messages in thread
From: Andrey Smirnov @ 2015-08-08 22:29 UTC (permalink / raw)
  To: u-boot

Previous implementation of semihosting didn't account for cases where
doing an SVC call would clobber various data(most notable case would
be 'lr' and 'spsr' when doing SVC call in Supervisor mode). This patch
is an adaptation of the code from Newlib's Angel_SWI feature (can be
found in libc/sys/arm/swi.h) which hopefuly fixes the problem.

Tested with modified OpenOCD and custom Vybrid VF610 based board

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
---
 arch/arm/lib/semihosting.c | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/arch/arm/lib/semihosting.c b/arch/arm/lib/semihosting.c
index c3e964e..5f22c2d 100644
--- a/arch/arm/lib/semihosting.c
+++ b/arch/arm/lib/semihosting.c
@@ -26,18 +26,40 @@
 /*
  * Call the handler
  */
+#if defined(CONFIG_ARM64)
 static noinline long smh_trap(unsigned int sysnum, void *addr)
 {
 	register long result asm("r0");
-#if defined(CONFIG_ARM64)
 	asm volatile ("hlt #0xf000" : "=r" (result) : "0"(sysnum), "r"(addr));
+	return result;
+}
 #else
-	/* Note - untested placeholder */
-	asm volatile ("svc #0x123456" : "=r" (result) : "0"(sysnum), "r"(addr));
+#if defined (CONFIG_SYS_THUMB_BUILD)
+#error "Support for semihosting in THUMB mode is not implemented"
 #endif
+/*
+ * Call the handler
+ */
+static noinline long smh_trap(unsigned int sysnum, void *addr)
+{
+	int result;
+
+	asm volatile ("mov r0, %1"	"\n\t"
+		      "mov r1, %2"	"\n\t"
+		      "svc #0x123456"	"\n\t"
+		      "mov %0, r0"	"\n\t"
+		      : "=r" (result)
+		      : "r" (sysnum), "r" (addr)
+		      : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc");
+		      /* Clobbers r0 and r1, and lr if in supervisor
+			 mode Accordingly to page 13-77 of ARM DUI
+			 0040D other registers can also be clobbered.
+			 Some memory positions may also be changed by
+			 a system call, so they should not be kept in
+			 registers.  */
 	return result;
 }
-
+#endif
 /*
  * Open a file on the host. Mode is "r" or "rb" currently. Returns a file
  * descriptor or -1 on error.
--
2.1.4

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-09-12 15:59 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-08 22:29 [U-Boot] [PATCH] semihosting: Improve ARMv7A support Andrey Smirnov
2015-09-12  7:12 ` Albert ARIBAUD
2015-09-12 15:59   ` Andrey Smirnov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox