diff options
author | Nicolas Pitre <nicolas.pitre@linaro.org> | 2012-02-22 15:58:03 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-03-24 05:38:55 -0400 |
commit | 9b5a146a43db3733c731d47022f4f5259e6b31e6 (patch) | |
tree | 3fc6d02c65c3f373d6408f9c332de183be7230b0 | |
parent | 101d9b0dedbc9e560737d3357104bf09db48eb3e (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.debug | 16 | ||||
-rw-r--r-- | arch/arm/kernel/debug.S | 25 | ||||
-rw-r--r-- | arch/arm/kernel/head.S | 8 |
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 | |||
158 | ENTRY(printascii) | 160 | ENTRY(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 |
179 | ENDPROC(printch) | 181 | ENDPROC(printch) |
182 | |||
183 | #else | ||
184 | |||
185 | ENTRY(printascii) | ||
186 | mov r1, r0 | ||
187 | mov r0, #0x04 @ SYS_WRITE0 | ||
188 | ARM( svc #0x123456 ) | ||
189 | THUMB( svc #0xab ) | ||
190 | mov pc, lr | ||
191 | ENDPROC(printascii) | ||
192 | |||
193 | ENTRY(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 | ||
200 | ENDPROC(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 | /* |