obj-$(CONFIG_HPET_TIMER) += time_hpet.o
obj-$(CONFIG_EFI) += efi.o efi_stub.o
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+obj-$(CONFIG_X86_STACK_CHECK) += dstackdump.o dstack.o stackoverflow.o
EXTRA_AFLAGS := -traditional -m32
--- /dev/null
+/*
+ * linux/arch/i386/dstack.S
+ *
+ * Copyright (C) 2005 Marc E. Fiuczynski
+ */
+
+/*
+ * dstack.s contains the system specific support for stack overflows
+ * and discontiguous stack support.
+ */
+
+#include <linux/config.h>
+#include <linux/linkage.h>
+#include <asm/thread_info.h>
+#include <asm/errno.h>
+#include <asm/segment.h>
+#include <asm/smp.h>
+#include <asm/page.h>
+
+.data
+.globl stack_overflowed
+stack_overflowed:
+ .long 0
+.text
+
+ENTRY(mcount)
+#warning stack check enabled
+ push %eax
+ movl $(THREAD_SIZE - 1),%eax
+ andl %esp,%eax
+ cmpl $STACK_WARN,%eax
+ jle 1f
+2:
+ popl %eax
+ ret
+1:
+ /* prevent infinite recursion from call to mcount from the
+ * stack_overflow function. Need to revisit this code for
+ * SMP based systems.
+ */
+ lock; btsl $0,stack_overflowed
+ jc 2b
+
+ /* prepare to jmp to stack_overflow directly, as if it were
+ * called directly by the caller of mcount.
+ */
+ pushl %ebp
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+
+ call stack_overflow
+ /* Note that stack_overflow() will clear the stack_overflowed
+ * variable.
+ */
+
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
+
+ popl %eax
+ ret
--- /dev/null
+/*
+ * linux/arch/i386/kernel/stackoverflow.c
+ *
+ * Copyright (C) 2005 Marc E. Fiuczynski
+ *
+ */
+
+/*
+ * This file handles the architecture-dependent parts of stack overflow handling...
+ */
+
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/thread_info.h>
+#include <asm/processor.h>
+
+void dstackdump(void)
+{
+ unsigned long esp = current_stack_pointer();
+ int panicing = ((esp&(THREAD_SIZE-1)) <= STACK_PANIC);
+
+ oops_in_progress = 1;
+ printk( "esp: 0x%lx masked: 0x%lx STACK_PANIC:0x%lx %d %d\n",
+ esp, (esp&(THREAD_SIZE-1)), STACK_PANIC,
+ (((esp&(THREAD_SIZE-1)) <= STACK_PANIC)), panicing);
+
+ show_trace(current,(void*)esp);
+
+ if (panicing)
+ panic("stack overflow\n");
+
+ oops_in_progress = 0;
+
+ /* Just let it happen once per task, as otherwise it goes nuts
+ * in printing stack traces. This means that I need to dump
+ * the stack_overflowed boolean into the task or thread_info
+ * structure. For now just turn it off all together.
+ */
+
+ /* stack_overflowed = 0; */
+}
#ifdef USE_IOPRIO_SYSCALLS
.long sys_ioprio_set /* 285 */
.long sys_ioprio_get
-#else
-#warning MEF not includig sys_ioprio_{set,get} syscalls
#endif
syscall_table_size=(.-sys_call_table)
-#ifdef CONFIG_X86_STACK_CHECK
-.data
-.globl stack_overflowed
-stack_overflowed:
- .long 0
-.text
-
-ENTRY(mcount)
-#warning stack check enabled
- push %eax
- movl $(THREAD_SIZE - 1),%eax
- andl %esp,%eax
- cmpl $STACK_WARN,%eax
- jle 1f
-2:
- popl %eax
- ret
-1:
- /* prevent infinite recursion from call to mcount from the
- * stack_overflow function. Need to revisit this code for
- * SMP based systems.
- */
- lock; btsl $0,stack_overflowed
- jc 2b
-
- /* prepare to jmp to stack_overflow directly, as if it were
- * called directly by the caller of mcount.
- */
- pushl %ebp
- pushl %ebx
- pushl %esi
- pushl %edi
-
- call stack_overflow
- /* Note that stack_overflow() will clear the stack_overflowed
- * variable.
- */
-
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
-
- popl %eax
- ret
-#endif
__setup("idle=", idle_setup);
-void stack_overflow(void)
-{
- unsigned long esp = current_stack_pointer();
- int panicing = ((esp&(THREAD_SIZE-1)) <= STACK_PANIC);
-
- oops_in_progress = 1;
- printk( "esp: 0x%lx masked: 0x%lx STACK_PANIC:0x%lx %d %d\n",
- esp, (esp&(THREAD_SIZE-1)), STACK_PANIC,
- (((esp&(THREAD_SIZE-1)) <= STACK_PANIC)), panicing);
- show_trace(current,(void*)esp);
-
- if (panicing)
- panic("stack overflow\n");
-
- oops_in_progress = 0;
-
- /* Just let it happen once per task, as otherwise it goes nuts
- * in printing stack traces. This means that I need to dump
- * the stack_overflowed boolean into the task or thread_info
- * structure. For now just turn it off all together.
- */
-
- /* stack_overflowed = 0; */
-}
-
void show_regs(struct pt_regs * regs)
{
unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;
--- /dev/null
+/*
+ * linux/arch/i386/kernel/stackoverflow.c
+ *
+ * Copyright (C) 2005 Marc E. Fiuczynski
+ *
+ */
+
+/*
+ * This file handles the architecture-dependent parts of stack overflow handling...
+ */
+
+#include <linux/kernel.h>
+#include <linux/thread_info.h>
+#include <linux/sched.h>
+#include <asm/processor.h>
+
+void stack_overflow(void)
+{
+ unsigned long esp = current_stack_pointer();
+ int panicing = ((esp&(THREAD_SIZE-1)) <= STACK_PANIC);
+
+ oops_in_progress = 1;
+ printk( "esp: 0x%lx masked: 0x%lx STACK_PANIC:0x%lx %d %d\n",
+ esp, (esp&(THREAD_SIZE-1)), STACK_PANIC,
+ (((esp&(THREAD_SIZE-1)) <= STACK_PANIC)), panicing);
+ show_trace(current,(void*)esp);
+
+ if (panicing)
+ panic("stack overflow\n");
+
+ oops_in_progress = 0;
+
+ /* Just let it happen once per task, as otherwise it goes nuts
+ * in printing stack traces. This means that I need to dump
+ * the stack_overflowed boolean into the task or thread_info
+ * structure. For now just turn it off all together.
+ */
+
+ /* stack_overflowed = 0; */
+}