Subject: arrange for a guard page on cpu 0's IRQ stack vmap() cpu 0's IRQ stack to ensure a guard page for it. Index: linux-2.6/arch/i386/kernel/irq.c =================================================================== --- linux-2.6.orig/arch/i386/kernel/irq.c 2007-03-03 23:45:04.000000000 -0800 +++ linux-2.6/arch/i386/kernel/irq.c 2007-03-03 23:45:10.000000000 -0800 @@ -17,6 +17,7 @@ #include #include #include +#include #include #include @@ -156,6 +157,41 @@ static DEFINE_PER_CPU(char *, hardirq_stack); #ifdef CONFIG_VMALLOC_STACK +static void * __init irq_remap_stack(void *stack) +{ + int i; + struct page *pages[THREAD_SIZE/PAGE_SIZE]; + + for (i = 0; i < ARRAY_SIZE(pages); ++i) + pages[i] = virt_to_page(stack + PAGE_SIZE*i); + return vmap(pages, THREAD_SIZE/PAGE_SIZE, VM_IOREMAP, PAGE_KERNEL); +} + +static int __init irq_guard_cpu0(void) +{ + unsigned long flags; + void *tmp; + + tmp = irq_remap_stack(per_cpu(softirq_stack, 0)); + if (!tmp) + return -ENOMEM; + else { + local_irq_save(flags); + per_cpu(softirq_stack, 0) = tmp; + local_irq_restore(flags); + } + tmp = irq_remap_stack(per_cpu(hardirq_stack, 0)); + if (!tmp) + return -ENOMEM; + else { + local_irq_save(flags); + per_cpu(hardirq_stack, 0) = tmp; + local_irq_restore(flags); + } + return 0; +} +core_initcall(irq_guard_cpu0); + static void * __init __alloc_irqstack(int cpu) { int i;