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