diff options
| -rw-r--r-- | arch/sh/Kconfig.debug | 20 | ||||
| -rw-r--r-- | arch/sh/Makefile | 4 | ||||
| -rw-r--r-- | arch/sh/boot/compressed/Makefile | 2 | ||||
| -rw-r--r-- | arch/sh/kernel/irq.c | 17 | ||||
| -rw-r--r-- | arch/sh/kernel/sh_ksyms_32.c | 4 | ||||
| -rw-r--r-- | arch/sh/lib/Makefile | 3 | ||||
| -rw-r--r-- | arch/sh/lib/mcount.S | 83 |
7 files changed, 60 insertions, 73 deletions
diff --git a/arch/sh/Kconfig.debug b/arch/sh/Kconfig.debug index 52a132c24aab..b440fd936714 100644 --- a/arch/sh/Kconfig.debug +++ b/arch/sh/Kconfig.debug | |||
| @@ -61,12 +61,14 @@ config EARLY_PRINTK | |||
| 61 | select both the EARLY_SCIF_CONSOLE and SH_STANDARD_BIOS, using | 61 | select both the EARLY_SCIF_CONSOLE and SH_STANDARD_BIOS, using |
| 62 | the kernel command line option to toggle back and forth. | 62 | the kernel command line option to toggle back and forth. |
| 63 | 63 | ||
| 64 | config DEBUG_STACKOVERFLOW | 64 | config STACK_DEBUG |
| 65 | bool "Check for stack overflows" | 65 | bool "Check for stack overflows" |
| 66 | depends on DEBUG_KERNEL && SUPERH32 | 66 | depends on DEBUG_KERNEL && SUPERH32 |
| 67 | help | 67 | help |
| 68 | This option will cause messages to be printed if free stack space | 68 | This option will cause messages to be printed if free stack space |
| 69 | drops below a certain limit. | 69 | drops below a certain limit. Saying Y here will add overhead to |
| 70 | every function call and will therefore incur a major | ||
| 71 | performance hit. Most users should say N. | ||
| 70 | 72 | ||
| 71 | config DEBUG_STACK_USAGE | 73 | config DEBUG_STACK_USAGE |
| 72 | bool "Stack utilization instrumentation" | 74 | bool "Stack utilization instrumentation" |
| @@ -123,15 +125,9 @@ config SH64_SR_WATCH | |||
| 123 | bool "Debug: set SR.WATCH to enable hardware watchpoints and trace" | 125 | bool "Debug: set SR.WATCH to enable hardware watchpoints and trace" |
| 124 | depends on SUPERH64 | 126 | depends on SUPERH64 |
| 125 | 127 | ||
| 126 | config STACK_DEBUG | 128 | config MCOUNT |
| 127 | bool "Enable diagnostic checks of the kernel stack" | 129 | def_bool y |
| 128 | depends on FUNCTION_TRACER | 130 | depends on SUPERH32 |
| 129 | select DEBUG_STACKOVERFLOW | 131 | depends on STACK_DEBUG || FUNCTION_TRACER |
| 130 | default n | ||
| 131 | help | ||
| 132 | This option allows checks to be performed on the kernel stack | ||
| 133 | at runtime. Saying Y here will add overhead to every function | ||
| 134 | call and will therefore incur a major performance hit. Most | ||
| 135 | users should say N. | ||
| 136 | 132 | ||
| 137 | endmenu | 133 | endmenu |
diff --git a/arch/sh/Makefile b/arch/sh/Makefile index 75d049b03f7e..52c34bf56962 100644 --- a/arch/sh/Makefile +++ b/arch/sh/Makefile | |||
| @@ -186,6 +186,10 @@ KBUILD_CFLAGS += -pipe $(cflags-y) | |||
| 186 | KBUILD_CPPFLAGS += $(cflags-y) | 186 | KBUILD_CPPFLAGS += $(cflags-y) |
| 187 | KBUILD_AFLAGS += $(cflags-y) | 187 | KBUILD_AFLAGS += $(cflags-y) |
| 188 | 188 | ||
| 189 | ifeq ($(CONFIG_MCOUNT),y) | ||
| 190 | KBUILD_CFLAGS += -pg | ||
| 191 | endif | ||
| 192 | |||
| 189 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) | 193 | libs-$(CONFIG_SUPERH32) := arch/sh/lib/ $(libs-y) |
| 190 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) | 194 | libs-$(CONFIG_SUPERH64) := arch/sh/lib64/ $(libs-y) |
| 191 | 195 | ||
diff --git a/arch/sh/boot/compressed/Makefile b/arch/sh/boot/compressed/Makefile index 3324019e207e..59e2937caa2f 100644 --- a/arch/sh/boot/compressed/Makefile +++ b/arch/sh/boot/compressed/Makefile | |||
| @@ -24,7 +24,7 @@ IMAGE_OFFSET := $(shell /bin/bash -c 'printf "0x%08x" \ | |||
| 24 | 24 | ||
| 25 | LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) | 25 | LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) |
| 26 | 26 | ||
| 27 | ifeq ($(CONFIG_FUNCTION_TRACER),y) | 27 | ifeq ($(CONFIG_MCOUNT),y) |
| 28 | ORIG_CFLAGS := $(KBUILD_CFLAGS) | 28 | ORIG_CFLAGS := $(KBUILD_CFLAGS) |
| 29 | KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) | 29 | KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) |
| 30 | endif | 30 | endif |
diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c index 3d09062f4682..278c68c60488 100644 --- a/arch/sh/kernel/irq.c +++ b/arch/sh/kernel/irq.c | |||
| @@ -114,23 +114,6 @@ asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs) | |||
| 114 | #endif | 114 | #endif |
| 115 | 115 | ||
| 116 | irq_enter(); | 116 | irq_enter(); |
| 117 | |||
| 118 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | ||
| 119 | /* Debugging check for stack overflow: is there less than 1KB free? */ | ||
| 120 | { | ||
| 121 | long sp; | ||
| 122 | |||
| 123 | __asm__ __volatile__ ("and r15, %0" : | ||
| 124 | "=r" (sp) : "0" (THREAD_SIZE - 1)); | ||
| 125 | |||
| 126 | if (unlikely(sp < (sizeof(struct thread_info) + STACK_WARN))) { | ||
| 127 | printk("do_IRQ: stack overflow: %ld\n", | ||
| 128 | sp - sizeof(struct thread_info)); | ||
| 129 | dump_stack(); | ||
| 130 | } | ||
| 131 | } | ||
| 132 | #endif | ||
| 133 | |||
| 134 | irq = irq_demux(intc_evt2irq(irq)); | 117 | irq = irq_demux(intc_evt2irq(irq)); |
| 135 | 118 | ||
| 136 | #ifdef CONFIG_IRQSTACKS | 119 | #ifdef CONFIG_IRQSTACKS |
diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c index fcc5de31f83b..cec610888e28 100644 --- a/arch/sh/kernel/sh_ksyms_32.c +++ b/arch/sh/kernel/sh_ksyms_32.c | |||
| @@ -106,8 +106,8 @@ EXPORT_SYMBOL(flush_dcache_page); | |||
| 106 | EXPORT_SYMBOL(clear_user_page); | 106 | EXPORT_SYMBOL(clear_user_page); |
| 107 | #endif | 107 | #endif |
| 108 | 108 | ||
| 109 | #ifdef CONFIG_FUNCTION_TRACER | 109 | #ifdef CONFIG_MCOUNT |
| 110 | EXPORT_SYMBOL(mcount); | 110 | DECLARE_EXPORT(mcount); |
| 111 | #endif | 111 | #endif |
| 112 | EXPORT_SYMBOL(csum_partial); | 112 | EXPORT_SYMBOL(csum_partial); |
| 113 | EXPORT_SYMBOL(csum_partial_copy_generic); | 113 | EXPORT_SYMBOL(csum_partial_copy_generic); |
diff --git a/arch/sh/lib/Makefile b/arch/sh/lib/Makefile index 19328d90a2d1..c2b28d8b2dd1 100644 --- a/arch/sh/lib/Makefile +++ b/arch/sh/lib/Makefile | |||
| @@ -24,8 +24,7 @@ memcpy-y := memcpy.o | |||
| 24 | memcpy-$(CONFIG_CPU_SH4) := memcpy-sh4.o | 24 | memcpy-$(CONFIG_CPU_SH4) := memcpy-sh4.o |
| 25 | 25 | ||
| 26 | lib-$(CONFIG_MMU) += copy_page.o clear_page.o | 26 | lib-$(CONFIG_MMU) += copy_page.o clear_page.o |
| 27 | lib-$(CONFIG_FUNCTION_TRACER) += mcount.o | 27 | lib-$(CONFIG_MCOUNT) += mcount.o |
| 28 | lib-$(CONFIG_FUNCTION_GRAPH_TRACER) += mcount.o | ||
| 29 | lib-y += $(memcpy-y) $(udivsi3-y) | 28 | lib-y += $(memcpy-y) $(udivsi3-y) |
| 30 | 29 | ||
| 31 | EXTRA_CFLAGS += -Werror | 30 | EXTRA_CFLAGS += -Werror |
diff --git a/arch/sh/lib/mcount.S b/arch/sh/lib/mcount.S index bd3ec648becc..84a57761f17e 100644 --- a/arch/sh/lib/mcount.S +++ b/arch/sh/lib/mcount.S | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * arch/sh/lib/mcount.S | 2 | * arch/sh/lib/mcount.S |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2008 Paul Mundt | 4 | * Copyright (C) 2008, 2009 Paul Mundt |
| 5 | * Copyright (C) 2008, 2009 Matt Fleming | 5 | * Copyright (C) 2008, 2009 Matt Fleming |
| 6 | * | 6 | * |
| 7 | * This file is subject to the terms and conditions of the GNU General Public | 7 | * This file is subject to the terms and conditions of the GNU General Public |
| @@ -86,13 +86,18 @@ | |||
| 86 | .type mcount,@function | 86 | .type mcount,@function |
| 87 | _mcount: | 87 | _mcount: |
| 88 | mcount: | 88 | mcount: |
| 89 | STACK_CHECK() | ||
| 90 | |||
| 91 | #ifndef CONFIG_FUNCTION_TRACER | ||
| 92 | rts | ||
| 93 | nop | ||
| 94 | #else | ||
| 89 | #ifndef CONFIG_DYNAMIC_FTRACE | 95 | #ifndef CONFIG_DYNAMIC_FTRACE |
| 90 | mov.l .Lfunction_trace_stop, r0 | 96 | mov.l .Lfunction_trace_stop, r0 |
| 91 | mov.l @r0, r0 | 97 | mov.l @r0, r0 |
| 92 | tst r0, r0 | 98 | tst r0, r0 |
| 93 | bf ftrace_stub | 99 | bf ftrace_stub |
| 94 | #endif | 100 | #endif |
| 95 | STACK_CHECK() | ||
| 96 | 101 | ||
| 97 | MCOUNT_ENTER() | 102 | MCOUNT_ENTER() |
| 98 | 103 | ||
| @@ -174,8 +179,6 @@ ftrace_caller: | |||
| 174 | tst r0, r0 | 179 | tst r0, r0 |
| 175 | bf ftrace_stub | 180 | bf ftrace_stub |
| 176 | 181 | ||
| 177 | STACK_CHECK() | ||
| 178 | |||
| 179 | MCOUNT_ENTER() | 182 | MCOUNT_ENTER() |
| 180 | 183 | ||
| 181 | .globl ftrace_call | 184 | .globl ftrace_call |
| @@ -192,6 +195,10 @@ ftrace_call: | |||
| 192 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 195 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
| 193 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 196 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
| 194 | 197 | ||
| 198 | .align 2 | ||
| 199 | .Lfunction_trace_stop: | ||
| 200 | .long function_trace_stop | ||
| 201 | |||
| 195 | /* | 202 | /* |
| 196 | * NOTE: From here on the locations of the .Lftrace_stub label and | 203 | * NOTE: From here on the locations of the .Lftrace_stub label and |
| 197 | * ftrace_stub itself are fixed. Adding additional data here will skew | 204 | * ftrace_stub itself are fixed. Adding additional data here will skew |
| @@ -199,7 +206,6 @@ ftrace_call: | |||
| 199 | * Place new labels either after the ftrace_stub body, or before | 206 | * Place new labels either after the ftrace_stub body, or before |
| 200 | * ftrace_caller. You have been warned. | 207 | * ftrace_caller. You have been warned. |
| 201 | */ | 208 | */ |
| 202 | .align 2 | ||
| 203 | .Lftrace_stub: | 209 | .Lftrace_stub: |
| 204 | .long ftrace_stub | 210 | .long ftrace_stub |
| 205 | 211 | ||
| @@ -208,40 +214,6 @@ ftrace_stub: | |||
| 208 | rts | 214 | rts |
| 209 | nop | 215 | nop |
| 210 | 216 | ||
| 211 | #ifdef CONFIG_STACK_DEBUG | ||
| 212 | .globl stack_panic | ||
| 213 | stack_panic: | ||
| 214 | mov.l .Ldump_stack, r0 | ||
| 215 | jsr @r0 | ||
| 216 | nop | ||
| 217 | |||
| 218 | mov.l .Lpanic, r0 | ||
| 219 | jsr @r0 | ||
| 220 | mov.l .Lpanic_s, r4 | ||
| 221 | |||
| 222 | rts | ||
| 223 | nop | ||
| 224 | |||
| 225 | .align 2 | ||
| 226 | .Lfunction_trace_stop: | ||
| 227 | .long function_trace_stop | ||
| 228 | .L_ebss: | ||
| 229 | .long _ebss | ||
| 230 | .L_init_thread_union: | ||
| 231 | .long init_thread_union | ||
| 232 | .Lpanic: | ||
| 233 | .long panic | ||
| 234 | .Lpanic_s: | ||
| 235 | .long .Lpanic_str | ||
| 236 | .Ldump_stack: | ||
| 237 | .long dump_stack | ||
| 238 | |||
| 239 | .section .rodata | ||
| 240 | .align 2 | ||
| 241 | .Lpanic_str: | ||
| 242 | .string "Stack error" | ||
| 243 | #endif /* CONFIG_STACK_DEBUG */ | ||
| 244 | |||
| 245 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 217 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
| 246 | .globl ftrace_graph_caller | 218 | .globl ftrace_graph_caller |
| 247 | ftrace_graph_caller: | 219 | ftrace_graph_caller: |
| @@ -303,3 +275,36 @@ return_to_handler: | |||
| 303 | .Lftrace_return_to_handler: | 275 | .Lftrace_return_to_handler: |
| 304 | .long ftrace_return_to_handler | 276 | .long ftrace_return_to_handler |
| 305 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ | 277 | #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ |
| 278 | #endif /* CONFIG_FUNCTION_TRACER */ | ||
| 279 | |||
| 280 | #ifdef CONFIG_STACK_DEBUG | ||
| 281 | .globl stack_panic | ||
| 282 | stack_panic: | ||
| 283 | mov.l .Ldump_stack, r0 | ||
| 284 | jsr @r0 | ||
| 285 | nop | ||
| 286 | |||
| 287 | mov.l .Lpanic, r0 | ||
| 288 | jsr @r0 | ||
| 289 | mov.l .Lpanic_s, r4 | ||
| 290 | |||
| 291 | rts | ||
| 292 | nop | ||
| 293 | |||
| 294 | .align 2 | ||
| 295 | .L_ebss: | ||
| 296 | .long _ebss | ||
| 297 | .L_init_thread_union: | ||
| 298 | .long init_thread_union | ||
| 299 | .Lpanic: | ||
| 300 | .long panic | ||
| 301 | .Lpanic_s: | ||
| 302 | .long .Lpanic_str | ||
| 303 | .Ldump_stack: | ||
| 304 | .long dump_stack | ||
| 305 | |||
| 306 | .section .rodata | ||
| 307 | .align 2 | ||
| 308 | .Lpanic_str: | ||
| 309 | .string "Stack error" | ||
| 310 | #endif /* CONFIG_STACK_DEBUG */ | ||
