Triple Faulting the CPU


*** We owe our thanks ***

A word of warning to all of you people who have known how to do this for years, and now read this and think of yourself as really cool. Triple-faulting the CPU to trigger a SHUTDOWN cycle was the brain-child of Intel. Just look in the first edition of the 80286 Programmer's Reference Manual -- Appendix -A and you will find it there. IBM took the next logical step and included circuitry in the IBM-AT which would assert RESET when a triple-fault was detected. Even though Intel gave this to IBM on a silver-platter, and IBM put in the RESET circuitry, the IBM software engineers didn't connect the dots, and realize that this could be very useful for getting out of protected mode. Instead, IBM put in that kludgy keyboard controller command to assert RESET to get out of protected mode. Then one day, a friend of mine (Mike Meisner of MR BIOS) was having a problem with this new Intel AboveBoard which had the new 80386 on it. This board plugged into an ISA slot, but had a cable which converted the 80386 bus signals to 80286-compatible signals. Mike didn't want to use the keyboard controller to get out of protected mode, because he knew it was very slow. So he noticed the triple-fault method mentioned in the Intel manual, and tried it on the 80286. Much to his surprise, it was much faster than the keyboard controller. Now the problem was the AboveBoard. This board didn't propogate the shutdown cycle to the 80286 bus. So working with a collegue, (Rhod Williams), Mike and Rhod connected all of the dots and gave us the following elegant RESET technique. Mike is now the sole proprietor of Microid Research (MR BIOS). Rhod Williams is now a director of Engineering at Phoenix Technologies.


If the processor encounters an exception while trying to invoke an exception handler, a DOUBLE FAULT exception occurs. This can rarely occur, but is possible. For example, if the invocation of an exception causes the stack to overflow, then this would cause a double fault. This is a bad example of a double fault, because the same condition that caused the double fault obviously still persists, and the CPU will fail to invoke the double fault exception handler. When this happens, the CPU will triple fault and cause a SHUTDOWN cycle to occur. This special cycle should be interpreted by the motherboard hardware, who then pulls RESET, which ultimately resets the CPU and the computer.

Triple faulting the CPU can be useful for testing purposes, and in production code. Generating a triple fault is useful for test purposes to test that the special SHUTDOWN cycle is recognized by the hardware, and appropriately resets the CPU. In production code, triple faulting the CPU is an effective way to force the CPU out of protected mode. Since the 80286 has no way of exiting protected mode, IBM defined a keyboard controller command to reset the system. Unfortunately the keyboard controller responds slowly to the command and the reset takes many hundred micro-seconds. Triple faulting the CPU is about 1/3 faster than using the keyboard controller method (your mileage may vary depending on how and where you drive).

Understanding how to triple fault the CPU leads to writing elegant assembly language code that will take both the 80286 and 80386 (and above) out of protected mode in the manner best suited to each. Unlike the example stated above, there is a very elegant way to triple fault the '286, while simply returning the '386 from protected mode in its native manner. To do this, we need to first generate a DOUBLE FAULT, and guarantee that its generation will cause the desired TRIPLE FAULT. Easy! Load the interrupt descriptor table register (IDTR) with a value whose limit=0. Then generate an interrupt! Loading IDTR with a value whose limit=0, will guarantee that the invocation of ANY interrupt will triple fault the CPU. The CPU won't be able to service the first interrupt because the limit is too small. This itself causes an interrupt -- DOUBLE FAULT. Since the same condition still persists, a TRIPLE FAULT occurs, and resets the CPU. How do you do this in practice?


View source code for elegant reset:
ftp:://ftp.x86.org/pub/x86/source/3fault/reset.asm

Download entire source code archive for Elegant Reset:
ftp://ftp.x86.org/pub/x86/dloads/RESET.ZIP

Back to Productivity Enhancements