Intel 64 and IA-32 Architectures Software Developers Manual Volume 3A, System Programming Guide, Part 1

15-20 Vol. 3A
8086 EMULATION
The protected-mode interrupt or exception handler can call the virtual-8086
monitor to handle the interrupt or exception.
The virtual-8086 monitor (if called) can in turn pass control back to the 8086
program’s interrupt and exception handler.
If the interrupt or exception is handled with a protected-mode handler, the handler
can return to the interrupted program in virtual-8086 mode by executing an IRET
instruction. This instruction loads the EFLAGS and segment registers from the
images saved in the privilege level 0 stack (see Figure 15-4). A set VM flag in the
EFLAGS image causes the processor to switch back to virtual-8086 mode. The CPL at
the time the IRET instruction is executed must be 0, otherwise the processor does
not change the state of the VM flag.
The virtual-8086 monitor runs at privilege level 0, like the protected-mode interrupt
and exception handlers. It is commonly closely tied to the protected-mode general-
protection exception (#GP, vector 13) handler. If the protected-mode interrupt or
exception handler calls the virtual-8086 monitor to handle the interrupt or exception,
the return from the virtual-8086 monitor to the interrupted virtual-8086 mode
program requires two return instructions: a RET instruction to return to the
protected-mode handler and an IRET instruction to return to the interrupted
program.
The virtual-8086 monitor has the option of directing the interrupt and exception
back to an interrupt or exception handler that is part of the interrupted 8086
program, as described in Section 15.3.1.2, “Handling an Interrupt or Exception With
an 8086 Program Interrupt or Exception Handler”.
15.3.1.2 Handling an Interrupt or Exception With an
8086 Program Interrupt or Exception Handler
Because it was designed to run on an 8086 processor, an 8086 program running in a
virtual-8086-mode task contains an 8086-style interrupt vector table, which starts at
linear address 0. If the virtual-8086 monitor correctly directs an interrupt or excep-
tion vector back to the virtual-8086-mode task it came from, the handlers in the
8086 program can handle the interrupt or exception. The virtual-8086 monitor must
carry out the following steps to send an interrupt or exception back to the 8086
program:
1. Use the 8086 interrupt vector to locate the appropriate handler procedure in the
8086 program interrupt table.
2. Store the EFLAGS (low-order 16 bits only), CS and EIP values of the 8086
program on the privilege-level 3 stack. This is the stack that the virtual-8086-
mode task is using. (The 8086 handler may use or modify this information.)
3. Change the return link on the privilege-level 0 stack to point to the privilege-level
3 handler procedure.
4. Execute an IRET instruction to pass control to the 8086 program handler.