cvs commit: src/sys/amd64/amd64 vm_machdep.c src/sys/i386/i386
vm_machdep.c
John Baldwin
jhb at FreeBSD.org
Tue Apr 24 21:17:46 UTC 2007
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 after
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
Revision Changes Path
1.254 +8 -3 src/sys/amd64/amd64/vm_machdep.c
1.279 +7 -3 src/sys/i386/i386/vm_machdep.c
More information about the cvs-src
mailing list