On Mon, 7 May 2001, Linus Torvalds wrote:
> On Mon, 7 May 2001, Brian Gerst wrote:
> > This patch will still cause the user process to seg fault: The error
> > code on the stack will not match the address in %cr2.
> 
> You've convinced me. Good thinking. Let's do the irq thing.

I've actually seen user processes seg faulting because of this with the
fully preemptible kernel patch applied.  The fix we used in that patch
was to use an interrupt gate for the fault handler, then to simply
restore the interrupt state:

diff -Nur 2.4.2/arch/i386/kernel/traps.c linux/arch/i386/kernel/traps.c
--- 2.4.2/arch/i386/kernel/traps.c      Mon Mar 26 18:41:05 2001
+++ linux/arch/i386/kernel/traps.c      Tue Mar 27 15:13:33 2001
@@ -973,7 +973,7 @@
        set_trap_gate(11,&segment_not_present);
        set_trap_gate(12,&stack_segment);
        set_trap_gate(13,&general_protection);
-       set_trap_gate(14,&page_fault);
+       set_intr_gate(14,&page_fault);
        set_trap_gate(15,&spurious_interrupt_bug);
        set_trap_gate(16,&coprocessor_error);
        set_trap_gate(17,&alignment_check);
diff -Nur 2.4.2/arch/i386/mm/fault.c linux/arch/i386/mm/fault.c
--- 2.4.2/arch/i386/mm/fault.c  Mon Mar 26 18:41:06 2001
+++ linux/arch/i386/mm/fault.c  Tue Mar 27 15:13:33 2001
@@ -117,6 +117,9 @@
        /* get the address */
        __asm__("movl %%cr2,%0":"=r" (address));
 
+       /* It's safe to allow preemption after cr2 has been saved */
+       local_irq_restore(regs->eflags);
+
        tsk = current;
 
        /*

Nigel Gamble                                    [EMAIL PROTECTED]
Mountain View, CA, USA.                         http://www.nrg.org/

MontaVista Software                             [EMAIL PROTECTED]

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to