(3/4) stack updates for x86
PATCH 1/1 (3/4) stack updates for x86
C-stack_usage_check-2.5.52+bk-6.patch
Check for stack overflows on entry to each funtion. Use gcc's -p profiling feature to do it.
Signature · 2 lines
Dave Hansen [email protected]
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas:
# ChangeSet 1.860.1.2 -> 1.866
# arch/i386/kernel/process.c 1.32.1.3 -> 1.38
# arch/i386/kernel/irq.c 1.23.1.2 -> 1.26
# Makefile 1.344 -> 1.346
# include/asm-i386/thread_info.h 1.10.1.2 -> 1.14
# arch/i386/Kconfig 1.13 -> 1.15
# arch/i386/kernel/entry.S 1.38.1.6 -> 1.49
# arch/i386/Makefile 1.24.2.7 -> 1.30
# arch/i386/boot/compressed/misc.c 1.9 -> 1.10
# arch/i386/kernel/init_task.c 1.6.1.1 -> 1.8
# arch/i386/kernel/i386_ksyms.c 1.36.2.4 -> 1.41
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/12/15 haveblue@elm3b96.(none) 1.859.1.2
# Merge elm3b96.(none):/work/dave/bk/linux-2.5-thread_info_infra
# into elm3b96.(none):/work/dave/bk/linux-2.5-overflow-detect # -------------------------------------------- # 02/12/15 haveblue@elm3b96.(none) 1.865 # Merge elm3b96.(none):/work/dave/bk/linux-2.5-irq-stack # into elm3b96.(none):/work/dave/bk/linux-2.5-irq-stack+overflow-detect # -------------------------------------------- # 02/12/15 haveblue@elm3b96.(none) 1.866 # Merge elm3b96.(none):/work/dave/bk/linux-2.5-overflow-detect # into elm3b96.(none):/work/dave/bk/linux-2.5-irq-stack+overflow-detect # -------------------------------------------- # diff -Nru a/arch/i386/Kconfig b/arch/i386/Kconfig --- a/arch/i386/Kconfig Sun Dec 15 21:16:27 2002 +++ b/arch/i386/Kconfig Sun Dec 15 21:16:27 2002 @@ -1573,6 +1573,25 @@ If you don't debug the kernel, you can say N, but we may not be able to solve problems without frame pointers.
+config X86_STACK_CHECK
+ bool "Detect stack overflows"
+ depends on FRAME_POINTER
+ help
+ Say Y here to have the kernel attempt to detect when the per-task + kernel stack overflows. This is much more robust checking than + the above overflow check, which will only occasionally detect + an overflow. The level of guarantee here is much greater. + + Some older versions of gcc don't handle the -p option correctly. + Kernprof is affected by the same problem, which is described here: + http://oss.sgi.com/projects/kernprof/faq.html#Q9 + + Basically, if you get oopses in __free_pages_ok during boot when + you have this turned on, you need to fix gcc. The Redhat 2.96 + version and gcc-3.x seem to work.
+
+ If not debugging a stack overflow problem, say N
+
config X86_EXTRA_IRQS
bool
depends on X86_LOCAL_APIC
arch/i386/Makefile +4 -0
@@ -52,6 +52,10 @@ MACHINE := mach-generic endif +ifdef CONFIG_X86_STACK_CHECK +CFLAGS += -p +endif + HEAD := arch/i386/kernel/head.o arch/i386/kernel/init_task.o libs-y += arch/i386/lib/
arch/i386/boot/compressed/misc.c +4 -0
@@ -377,3 +377,7 @@if (high_loaded)close_output_buffer_if_we_run_high (mv);return high_loaded; } + +/* We don't actually check for stack overflows this early. */ +__asm__(".globl mcount ; mcount: ret\n" ); +
arch/i386/kernel/entry.S +55 -0
61 lines not on this page · raw message
arch/i386/kernel/i386_ksyms.c +5 -0
@@ -216,3 +216,8 @@EXPORT_SYMBOL (edd);EXPORT_SYMBOL (eddnr);#endif + +#ifdef CONFIG_X86_STACK_CHECK +extern void mcount (void ); +EXPORT_SYMBOL (mcount); +#endif
arch/i386/kernel/init_task.c +4 -0
@@ -16,6 +16,10 @@ union thread_union init_irq_union __attribute__((__section__(".data.init_task"))); +#ifdef CONFIG_X86_STACK_CHECK +union thread_union stack_overflow_stack + __attribute__((__section__(".data.init_task"))); +#endif /* * Initial thread structure.
arch/i386/kernel/process.c +19 -1
@@ -158,7 +158,25 @@__setup ("idle=" , idle_setup); -void show_regs (struct pt_regs * regs) +void stack_overflow (unsigned long esp,unsigned long eip) +{ +int panicing = ((esp&(THREAD_SIZE -1 )) <=STACK_PANIC ); + +printk ("esp: 0x%x masked: 0x%x STACK_PANIC:0x%x %d %d\n" , + esp, (esp&(THREAD_SIZE -1 )),STACK_PANIC , (((esp&(THREAD_SIZE -1 )) <=STACK_PANIC )), panicing ); + +if (panicing) +print_symbol ("stack overflow from %s\n" , eip); +else +print_symbol ("excessive stack use from %s\n" , eip); +printk ("esp: %p\n" , (void *)esp); +show_trace ((void *)esp); + +if (panicing) +panic ("stack overflow\n" ); +} + +asmlinkage void show_regs(struct pt_regs * regs) {unsigned long cr0 =0L , cr2 =0L , cr3 =0L , cr4 =0L ;
include/asm-i386/thread_info.h +2 -0
@@ -63,6 +63,8 @@*/ #define THREAD_ORDER 1#define INIT_THREAD_SIZE THREAD_SIZE +#define STACK_PANIC 0x200ul +#define STACK_WARN ((THREAD_SIZE)>>1)#ifndef __ASSEMBLY__