cvs commit: src/sys/amd64/amd64 vm_machdep.c src/sys/i386/i386
jhb at freebsd.org
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
> 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.
More information about the cvs-src