Intel 64 and IA-32 Architectures Software Developers Manual Volume 1, Basic Architecture
D-28 Vol. 1
GUIDELINES FOR WRITING X87 FPU EXCEPTION HANDLERS
DNA handler resumes execution, completing the FNSAVE of the old floating-point
context of thread A and the FRSTOR of the floating-point context for thread B.
Thread A eventually gets an opportunity to handle the exception that was discarded
during the task switch. After some time, thread B is suspended, and thread A
resumes execution. When thread A starts to execute an floating-point instruction,
once again the DNA exception handler is entered. B’s x87 FPU state is Finessed, and
A’s x87 FPU state is Frustrate. Note that in restoring the x87 FPU state from A’s save
area, the pending numeric exception flags are reloaded into the floating-point status
word. Now when the DNA exception handler returns, thread A resumes execution of
the faulting floating-point instruction just long enough to immediately generate a
numeric exception, which now gets handled in the normal way. The net result is that
the task switch and resulting x87 FPU state swap via the DNA exception handler
causes an extra numeric exception which can be safely discarded.
D.3.6.4 Interrupt Routing From the Kernel
In MS-DOS, an application that wishes to handle numeric exceptions hooks interrupt
16 by placing its handler address in the interrupt vector table, and exiting via a jump
to the previous interrupt 16 handler. Protected mode systems that run MS-DOS
programs under a subsystem can emulate this exception delivery mechanism. For
example, assume a protected mode OS. that runs with CR0.NE[bit 5] = 1, and that
runs MS-DOS programs in a virtual machine subsystem. The MS-DOS program is
set up in a virtual machine that provides a virtualized interrupt table. The MS-DOS
application hooks interrupt 16 in the virtual machine in the normal way. A numeric
exception will trap to the kernel via the real INT 16 residing in the kernel at ring 0.
The INT 16 handler in the kernel then locates the correct MS-DOS virtual machine,
and reflects the interrupt to the virtual machine monitor. The virtual machine monitor
then emulates an interrupt by jumping through the address in the virtualized inter-
rupt table, eventually reaching the application’s numeric exception handler.
D.3.6.5 Special Considerations for Operating Systems that Support
Streaming SIMD Extensions
Operating systems that support Streaming SIMD Extensions instructions introduced
with the Pentium III processor should use the FXSAVE and FXRSTOR instructions to
save and restore the new SIMD floating-point instruction register state as well as the
floating-point state. Such operating systems must consider the following issues:
1. Enlarged state save area — FNSAVE/FRSTOR instructions operate on a
94-byte or 108-byte memory region, depending on whether they are executed
in 16-bit or 32-bit mode. The FXSAVE/FXRSTOR instructions operate on a
512-byte memory region.
2. Alignment requirements — FXSAVE/FXRSTOR instructions require the
memory region on which they operate to be 16-byte aligned (refer to the
individual instruction instructions descriptions in Chapter 3 of the Intel® 64 and