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 | /* |
