cvs commit: src/sys/amd64/amd64 vm_machdep.c src/sys/i386/i386 vm_machdep.c

John Baldwin jhb at
Tue Apr 24 21:23:05 UTC 2007

On Tuesday 24 April 2007 05:17:45 pm John Baldwin wrote:
> jhb         2007-04-24 21:17:45 UTC
>   FreeBSD src repository
>   Modified files:
>     sys/amd64/amd64      vm_machdep.c 
>     sys/i386/i386        vm_machdep.c 
>   Log:
>   Fix the triple fault used as a last resort during a reboot to actually
>   fault.  The previous method zero'd out the page tables, invalidated the
>   TLB, and then entered a spin loop.  The idea was that the instruction 
>   the TLB invalidate would result in a page fault and the page fault and
>   subsequent double fault wouldn't be able to determine the physical page
>   for their fault handlers' first instruction.  This stopped working when
>   PGE (PG_G PTE/PDE bit) support was added as a TLB invalidate via %cr3
>   reload doesn't clear TLB entries with PG_G set.  Thus, the CPU was still
>   able to map the virtual address for the spin loop and happily performed
>   its infinite loop.
>   The triple fault now uses a much more deterministic sledge-hammer approach
>   to generate a triple fault.  First, the IDT descriptor is set to point to
>   an empty IDT, so any interrupts (including a double fault) will instantly
>   fault.  Second, we trigger a int 3 breakpoint to force an interrupt and
>   kick off a triple fault.
>   MFC after:      3 days

This and the other changes to support more methods for kicking off a reset 
might fix problems people have with machines not rebooting but just hanging.  
IIRC, there was a problem on some Dell 1950s that wouldn't reboot properly, 
so they might be a good candidate for this.  I ran into this at work on a 
machine that didn't have a functional keyboard controller, so it didn't 
reboot when the keyboard reset failed, but just hung.

John Baldwin

More information about the cvs-src mailing list