aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2012-02-22 15:58:03 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-03-24 05:38:55 -0400
commit9b5a146a43db3733c731d47022f4f5259e6b31e6 (patch)
tree3fc6d02c65c3f373d6408f9c332de183be7230b0
parent101d9b0dedbc9e560737d3357104bf09db48eb3e (diff)
ARM: 7338/1: add support for early console output via semihosting
This is a very simple method for code running in an emulator, or under the supervision of a debugger, to use I/O facilities on the controlling host. Tested with OpenOCD, and ARM's Fast Models. Details on semihosting can be found in chapter 8 of DUI0203I_rvct_developer_guide.pdf from ARM Ltd. Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--arch/arm/Kconfig.debug16
-rw-r--r--arch/arm/kernel/debug.S25
-rw-r--r--arch/arm/kernel/head.S8
3 files changed, 44 insertions, 5 deletions
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
index e0d236d7ff73..755d9fbe3238 100644
--- a/arch/arm/Kconfig.debug
+++ b/arch/arm/Kconfig.debug
@@ -100,6 +100,22 @@ choice
100 Note that the system will appear to hang during boot if there 100 Note that the system will appear to hang during boot if there
101 is nothing connected to read from the DCC. 101 is nothing connected to read from the DCC.
102 102
103 config DEBUG_SEMIHOSTING
104 bool "Kernel low-level debug output via semihosting I"
105 help
106 Semihosting enables code running on an ARM target to use
107 the I/O facilities on a host debugger/emulator through a
108 simple SVC calls. The host debugger or emulator must have
109 semihosting enabled for the special svc call to be trapped
110 otherwise the kernel will crash.
111
112 This is known to work with OpenOCD, as wellas
113 ARM's Fast Models, or any other controlling environment
114 that implements semihosting.
115
116 For more details about semihosting, please see
117 chapter 8 of DUI0203I_rvct_developer_guide.pdf from ARM Ltd.
118
103 config AT91_DEBUG_LL_DBGU0 119 config AT91_DEBUG_LL_DBGU0
104 bool "Kernel low-level debugging on rm9200, 9260/9g20, 9261/9g10 and 9rl" 120 bool "Kernel low-level debugging on rm9200, 9260/9g20, 9261/9g10 and 9rl"
105 depends on HAVE_AT91_DBGU0 121 depends on HAVE_AT91_DBGU0
diff --git a/arch/arm/kernel/debug.S b/arch/arm/kernel/debug.S
index 204e2160cfcc..e5a765c5f06a 100644
--- a/arch/arm/kernel/debug.S
+++ b/arch/arm/kernel/debug.S
@@ -100,7 +100,7 @@
100 100
101#endif /* CONFIG_CPU_V6 */ 101#endif /* CONFIG_CPU_V6 */
102 102
103#else 103#elif !defined(CONFIG_DEBUG_SEMIHOSTING)
104#include <mach/debug-macro.S> 104#include <mach/debug-macro.S>
105#endif /* CONFIG_DEBUG_ICEDCC */ 105#endif /* CONFIG_DEBUG_ICEDCC */
106 106
@@ -155,6 +155,8 @@ hexbuf: .space 16
155 155
156 .ltorg 156 .ltorg
157 157
158#ifndef CONFIG_DEBUG_SEMIHOSTING
159
158ENTRY(printascii) 160ENTRY(printascii)
159 addruart_current r3, r1, r2 161 addruart_current r3, r1, r2
160 b 2f 162 b 2f
@@ -177,3 +179,24 @@ ENTRY(printch)
177 mov r0, #0 179 mov r0, #0
178 b 1b 180 b 1b
179ENDPROC(printch) 181ENDPROC(printch)
182
183#else
184
185ENTRY(printascii)
186 mov r1, r0
187 mov r0, #0x04 @ SYS_WRITE0
188 ARM( svc #0x123456 )
189 THUMB( svc #0xab )
190 mov pc, lr
191ENDPROC(printascii)
192
193ENTRY(printch)
194 adr r1, hexbuf
195 strb r0, [r1]
196 mov r0, #0x03 @ SYS_WRITEC
197 ARM( svc #0x123456 )
198 THUMB( svc #0xab )
199 mov pc, lr
200ENDPROC(printch)
201
202#endif
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index a2e9694a68ee..3bf0c7f8b043 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -265,7 +265,7 @@ __create_page_tables:
265 str r6, [r3] 265 str r6, [r3]
266 266
267#ifdef CONFIG_DEBUG_LL 267#ifdef CONFIG_DEBUG_LL
268#ifndef CONFIG_DEBUG_ICEDCC 268#if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING)
269 /* 269 /*
270 * Map in IO space for serial debugging. 270 * Map in IO space for serial debugging.
271 * This allows debug messages to be output 271 * This allows debug messages to be output
@@ -297,10 +297,10 @@ __create_page_tables:
297 cmp r0, r6 297 cmp r0, r6
298 blo 1b 298 blo 1b
299 299
300#else /* CONFIG_DEBUG_ICEDCC */ 300#else /* CONFIG_DEBUG_ICEDCC || CONFIG_DEBUG_SEMIHOSTING */
301 /* we don't need any serial debugging mappings for ICEDCC */ 301 /* we don't need any serial debugging mappings */
302 ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags 302 ldr r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags
303#endif /* !CONFIG_DEBUG_ICEDCC */ 303#endif
304 304
305#if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS) 305#if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS)
306 /* 306 /*