RealModeCallBacks topic
Real mode callbacks.
Declaration
RealModeCallBacksDescription
The callback mechanism can be thought of as the converse of calling a real mode procedure (i.e. interrupt), which allows your program to pass information to a real mode program, or obtain services from it in a manner that's transparent to the real mode program. In order to make a real mode callback available, you must first get the real mode callback address of your procedure and the selector and offset of a register data structure. This real mode callback address (this is a segment:offset address) can be passed to a real mode program via a software interrupt, a dos memory block or any other convenient mechanism. When the real mode program calls the callback (via a far call), the DPMI host saves the registers contents in the supplied register data structure, switches into protected mode, and enters the callback routine with the following settings:
- interrupts disabled
-
%CS:%EIP= 48 bit pointer specified in the original call to get_rm_callback -
%DS:%ESI= 48 bit pointer to real modeSS:SP -
%ES:%EDI= 48 bit pointer of real mode register data structure. -
%SS:%ESP= locked protected mode stack - All other registers undefined
The callback procedure can then extract its parameters from the real mode
register data structure and/or copy parameters from the real mode stack to
the protected mode stack. Recall that the segment register fields of the
real mode register data structure contain segment or paragraph addresses
that are not valid in protected mode. Far pointers passed in the real mode
register data structure must be translated to virtual addresses before they
can be used with a protected mode program.
The callback procedure exits by executing an IRET with the address of the
real mode register data structure in %ES:%EDI, passing information back to
the real mode caller by modifying the contents of the real mode register
data structure and/or manipulating the contents of the real mode stack. The
callback procedure is responsible for setting the proper address for
resumption of real mode execution into the real mode register data
structure; typically, this is accomplished by extracting the return address
from the real mode stack and placing it into the %CS:%EIP fields of the real
mode register data structure. After the IRET, the DPMI host switches the CPU
back into real mode, loads ALL registers with the contents of the real mode
register data structure, and finally returns control to the real mode
program.
All variables and code touched by the callback procedure MUST be locked to
prevent page faults.
See also
An experiment, built from development snapshots. Not the official Free Pascal or Lazarus documentation.
