--- ./arch/i386/kernel/traps.c.dumpstack 2004-10-01 14:21:40.000000000 +0400 +++ ./arch/i386/kernel/traps.c 2004-10-01 14:30:10.109733400 +0400 @@ -95,11 +95,16 @@ static int kstack_depth_to_print = 24; static int valid_stack_ptr(struct task_struct *task, void *p) { - if (p <= (void *)task->thread_info) - return 0; - if (kstack_end(p)) - return 0; - return 1; + extern int is_irq_stack_ptr(struct task_struct *, void *); + + if (is_irq_stack_ptr(task, p)) + return 1; + if (p >= (void *)task->thread_info && + p < (void *)task->thread_info + THREAD_SIZE && + !kstack_end(p)) + return 1; + + return 0; } #ifdef CONFIG_FRAME_POINTER --- ./arch/i386/kernel/irq.c.dumpstack 2004-09-20 14:14:58.000000000 +0400 +++ ./arch/i386/kernel/irq.c 2004-10-01 14:28:15.806110192 +0400 @@ -1126,6 +1126,21 @@ void init_irq_proc (void) static char softirq_stack[NR_CPUS * THREAD_SIZE] __attribute__((__aligned__(THREAD_SIZE))); static char hardirq_stack[NR_CPUS * THREAD_SIZE] __attribute__((__aligned__(THREAD_SIZE))); +int is_irq_stack_ptr(struct task_struct *task, void *p) +{ + unsigned long off; + + off = task->thread_info->cpu * THREAD_SIZE; + if (p >= (void *)hardirq_stack + off && + p < (void *)hardirq_stack + off + THREAD_SIZE) + return 1; + if (p >= (void *)softirq_stack + off && + p < (void *)softirq_stack + off + THREAD_SIZE) + return 1; + + return 0; +} + /* * allocate per-cpu stacks for hardirq and for softirq processing */