/*** V8086.H * * 8086 Emulation Export Include File * * Description: * * Contains the exported structures, defines and VDH * function prototypes for 8086 emulation. * */ /*INT32*/ /***ET+ Low memory defines - used by VBIOS */ #define IVT_START 0 /* Interrupt vector table start */ #define IVT_LEN 0x400 /* " " " length */ /*end*/ /***ET+ flVdmStatus flags */ #define VDM_STATUS_VPM_32 0x00000001 /* 32 bit DPMI app */ #define VDM_STATUS_VPM_32_BIT 0 #define VDM_STATUS_VPM_APP 0x00000002 /* DPMI app started */ #define VDM_STATUS_VPM_APP_BIT 1 #define VDM_STATUS_VPM_EXEC 0x00000004 /* in VDM protected mode */ #define VDM_STATUS_VPM_EXEC_BIT 2 #define VDM_STATUS_VPM_TRAPMODE 0x00000008 /* V86 mode at kernel entry? */ #define VDM_STATUS_VPM_TRAP_BIT 3 #define VDM_STATUS_VPM_IF_FLAG 0x00000010 /* Virtual IF flag */ #define VDM_STATUS_VPM_IF_BIT 4 #define VDM_STATUS_VPM_08_HOOK 0x00000020 /* protect 08h hooked? */ #define VDM_STATUS_VPM_08_BIT 5 #define VDM_STATUS_VPM_1C_HOOK 0x00000040 /* protect 1Ch hooked? */ #define VDM_STATUS_VPM_1C_BIT 6 #define VDM_STATUS_VPM_PERM 0x00000080 /* protected mode allowed? */ #define VDM_STATUS_VPM_PERM_BIT 7 #define VDM_STATUS_VPM_XDOS 0x00000100 /* DOS API Extension active? */ #define VDM_STATUS_VPM_XDOS_BIT 8 #define VDM_STATUS_VPM_TERM 0x00000200 /* VDM terminating? */ #define VDM_STATUS_VPM_TERM_BIT 9 /*end*/ /***ET+ VDHInstallIntHook options */ #define VDH_ASM_HOOK 0x00000001L /*end*/ /***ET+ VDHInstallIOHook options */ #define VDHIIH_ASM_HOOK VDH_ASM_HOOK #define VDHIIH_ALWAYS_TRAP 0x00000002L #define VDHIIH_NO_SIMULATE 0x00000004L #define VDHIIH_IGNORE 0x00000010L /*end*/ /***ET+ VDHSetIOHookState options */ #define SETIO_TRAP TRUE #define SETIO_NOTRAP FALSE /*end*/ /***ET+ I/O type flags - VDHInstallIOPort pfnOther handler */ #define IO_TYPE_SHIFT 8 #define IO_TYPE_MASK 0x00000F00L #define IO_TYPE_INPUT 0x00000100L #define IO_TYPE_OUTPUT 0x00000000L #define IO_TYPE_STRING 0x00000200L #define IO_TYPE_BYTE 0x00000400L #define IO_TYPE_WORD 0x00000000L #define IO_TYPE_DWORD 0x00000800L #define IO_TYPE_ADDR32 0x00001000L #define IO_TYPE_REP 0x00002000L #define IO_TYPE_REVERSE 0x00008000L #define IO_SEG_SHIFT 16 #define IO_SEG_MASK 0x000f0000L #define IO_SEG_ES 0x00000000L #define IO_SEG_CS 0x00010000L #define IO_SEG_SS 0x00020000L #define IO_SEG_DS 0x00030000L #define IO_SEG_FS 0x00040000L #define IO_SEG_GS 0x00050000L /*end*/ /***ET+ VDHCheckPagePerm and private DPMI options */ #define VPMPG_W 0x00000002 /* Writable */ #define VPMPG_U 0x00000004 /* user mode accessible */ #define VPMPG_X 0x00000008 /* eXecutable */ #define VPMPG_R 0x00000010 /* Readable */ /*end*/ /***ET+ VDHAllocHook options */ #define VDH_CONTEXT_HOOK 0 #define VDH_STI_HOOK 1 #define VDH_RETURN_HOOK 2 #define VDH_TIMER_HOOK 3 #define VDH_BP_HOOK 4 /*end*/ /***ET+ VDHArmContextHook options */ #define GLOBAL_CONTEXT_HOOK ((HVDM) -1) /*end*/ /***ET+ VDHArmReturnHook options */ #define VDHARH_NORMAL_RET 0 #define VDHARH_NORMAL_IRET 1 #define VDHARH_RECURSIVE_RET 2 #define VDHARH_RECURSIVE_IRET 3 #define VDHARH_CSEIP_HOOK 4 #define VDHARH_RECURSIVE_CSEIP_HOOK 5 /*end*/ /***ET+ VDHArmReturnHook recursive user stack usage * * VDHARH_RECURSIVE_CSEIP_HOOK stack usage will vary depend * on the VDM protected mode "bitness". If 32 bit, there * will be 8 bytes on the stack; otherwise, 4 bytes. */ #define VDHARH_RECURSIVE_STACK_USAGE 4 /*end*/ /***ET+ VDHPushFarCall user stack usage */ #define VDHPFC_STACK_USAGE 4 /*end*/ /***ET+ VDHPushInt user stack usage */ #define VDHPI_STACK_USAGE 6 /*end*/ /***ET+ VDHPushRegs/VDHPopRegs flags */ #define VDHREG_AX 0x00000001L #define VDHREG_BX 0x00000002L #define VDHREG_CX 0x00000004L #define VDHREG_DX 0x00000008L #define VDHREG_SI 0x00000010L #define VDHREG_DI 0x00000020L #define VDHREG_BP 0x00000040L #define VDHREG_SP 0x00000080L #define VDHREG_DS 0x00000100L #define VDHREG_ES 0x00000200L #define VDHREG_SS 0x00000400L #define VDHREG_FLAG 0x00000800L #define VDHREG_ALL (VDHREG_AX | VDHREG_BX | \ VDHREG_CX | VDHREG_DX | \ VDHREG_SI | VDHREG_DI | \ VDHREG_BP | VDHREG_SP | \ VDHREG_DS | VDHREG_ES | \ VDHREG_SS | VDHREG_FLAG) #define VDHREG_GENERAL (VDHREG_AX | VDHREG_BX | \ VDHREG_CX | VDHREG_DX | \ VDHREG_SI | VDHREG_DI | \ VDHREG_BP | VDHREG_DS | \ VDHREG_ES | VDHREG_FLAG) /*end*/ /***ET+ CRF - Client Register Frame * * The EBX register points to the CRF structure on entry * to I/O port handlers and VDD interrupt handlers. VDDs * can retrieve or modify the client's registers with this * interface. */ typedef struct crf_s { ULONG crf_edi; ULONG crf_esi; ULONG crf_ebp; ULONG crf_padesp; ULONG crf_ebx; ULONG crf_edx; ULONG crf_ecx; ULONG crf_eax; ULONG crf_pad2[2]; ULONG crf_eip; USHORT crf_cs; USHORT crf_padcs; ULONG crf_eflag; ULONG crf_esp; USHORT crf_ss; USHORT crf_padss; USHORT crf_es; USHORT crf_pades; USHORT crf_ds; USHORT crf_padds; USHORT crf_fs; USHORT crf_padfs; USHORT crf_gs; USHORT crf_padgs; ULONG crf_alteip; /* other modes register set */ USHORT crf_altcs; USHORT crf_altpadcs; ULONG crf_alteflag; ULONG crf_altesp; USHORT crf_altss; USHORT crf_altpadss; USHORT crf_altes; USHORT crf_altpades; USHORT crf_altds; USHORT crf_altpadds; USHORT crf_altfs; USHORT crf_altpadfs; USHORT crf_altgs; USHORT crf_altpadgs; } CRF; typedef CRF *PCRF; /*end*/ /*c-begin */ /***ET+ Macros to improve VDM register manipulations from C */ #define AX(pcrf) WORDOF(pcrf->crf_eax,0) #define AL(pcrf) BYTEOF(pcrf->crf_eax,0) #define AH(pcrf) BYTEOF(pcrf->crf_eax,1) #define BX(pcrf) WORDOF(pcrf->crf_ebx,0) #define BL(pcrf) BYTEOF(pcrf->crf_ebx,0) #define BH(pcrf) BYTEOF(pcrf->crf_ebx,1) #define CX(pcrf) WORDOF(pcrf->crf_ecx,0) #define CL(pcrf) BYTEOF(pcrf->crf_ecx,0) #define CH(pcrf) BYTEOF(pcrf->crf_ecx,1) #define DX(pcrf) WORDOF(pcrf->crf_edx,0) #define DL(pcrf) BYTEOF(pcrf->crf_edx,0) #define DH(pcrf) BYTEOF(pcrf->crf_edx,1) #define SI(pcrf) WORDOF(pcrf->crf_esi,0) #define DI(pcrf) WORDOF(pcrf->crf_edi,0) #define BP(pcrf) WORDOF(pcrf->crf_ebp,0) #define SP(pcrf) WORDOF(pcrf->crf_esp,0) #define CS(pcrf) WORDOF(pcrf->crf_cs,0) #define IP(pcrf) WORDOF(pcrf->crf_eip,0) #define DS(pcrf) WORDOF(pcrf->crf_ds,0) #define ES(pcrf) WORDOF(pcrf->crf_es,0) #define SS(pcrf) WORDOF(pcrf->crf_ss,0) #define FL(pcrf) WORDOF(pcrf->crf_eflag,0) /* General purpose macros */ #define INT_PIC1BASE 0x08 #define INT_PIC2BASE 0x70 #define INTFROMIRQ(irq) (((irq) < 8)? (irq) + INT_PIC1BASE: \ (irq) - 8 + INT_PIC2BASE) /*c-end */ /* VDHReadUBuf and VDHWriteUBuf flags */ #define VPM_FAULT_IF_RW_SET 0x01 #define VPM_FAULT_IF_SU_SET 0x02 #define VPM_SEL_PRESENT 0x04 #define VPM_SEL_WRITEABLE 0x08 #define VPM_FAULT_IF_RO 0x10 #define VPM_SEL_IS_SS 0x20 #define VPM_PROT_READ 0x40 #define VPM_PROT_WRITE 0x80 #define VPM_XCPTRET_ALT 0x100 /***ET+ Hook routine typedefs */ typedef BYTE HOOKENTRY BIH(ULONG, PCRF); /* I/O hook routines */ typedef VOID HOOKENTRY BOH(BYTE, ULONG, PCRF); typedef WORD HOOKENTRY WIH(ULONG, PCRF); typedef VOID HOOKENTRY WOH(WORD, ULONG, PCRF); typedef BOOL HOOKENTRY OTH(ULONG, PULONG, ULONG, ULONG, PCRF); typedef BYTE (*HOOKENTRY PBIH)(ULONG, PCRF); /* pointers to I/O hook routines */ typedef VOID (*HOOKENTRY PBOH)(BYTE, ULONG, PCRF); typedef WORD (*HOOKENTRY PWIH)(ULONG, PCRF); typedef VOID (*HOOKENTRY PWOH)(WORD, ULONG, PCRF); typedef BOOL (*HOOKENTRY POTH)(ULONG, PULONG, ULONG, ULONG, PCRF); typedef BOOL HOOKENTRY FNHOOK(PCRF); /* hook routine */ typedef BOOL (*HOOKENTRY PFNHOOK)(PCRF); /* pointer to hook routine */ typedef VOID HOOKENTRY FNARM(); /* arm hook routine */ typedef VOID (*HOOKENTRY PFNARM)(); /* pointer to arm hook routine */ /***ET+ IOH - I/O Port Hook Entry * * This is the structure for the parameter to the VDHInstallIOHook * service. Only the byte input and output handlers are required. * A null (0) entry indicates that the type of I/O should be * simulated. The structure passed by VDHInstallIOHook is * copied and saved away after the NULLs are replaced with the * addresses of the simulation routines. */ typedef struct ioh_s { PBIH ioh_pbihByteInput; /* byte input handler */ PBOH ioh_pbohByteOutput; /* byte output handler */ PWIH ioh_pwihWordInput; /* word input handler */ PWOH ioh_pwohWordOutput; /* word output handler */ POTH ioh_pothOther; /* dword and string I/O handler */ } IOH; typedef IOH *PIOH; /* pointer to IOH entry */ /*end*/ /* 8086 emulation VDH services */ BOOL VDHENTRY VDHInstallIOHook(HVDM, PORT, ULONG, PIOH, FLAGS); VOID VDHENTRY VDHRemoveIOHook(HVDM, PORT, ULONG, PIOH); VOID VDHENTRY VDHSetIOHookState(HVDM, PORT, ULONG, PIOH, BOOL); BOOL VDHENTRY VDHInstallIntHook(HVDM, ULONG, PFNHOOK, FLAGS); HHOOK VDHENTRY VDHAllocHook(ULONG, PFNARM, ULONG); PVOID VDHENTRY VDHQueryHookData(HHOOK); VOID VDHENTRY VDHFreeHook(HHOOK); VOID VDHENTRY VDHArmContextHook(HHOOK, HVDM); VOID VDHENTRY VDHArmSTIHook(HHOOK, HVDM); BOOL VDHENTRY VDHArmReturnHook(HHOOK, ULONG); VPVOID VDHENTRY VDHArmBPHook(HHOOK); BOOL VDHENTRY VDHPushInt(ULONG); BOOL VDHENTRY VDHPopInt(VOID); BOOL VDHENTRY VDHPushRegs(FLAGS); BOOL VDHENTRY VDHPopRegs(FLAGS); BOOL VDHENTRY VDHPushStack(ULONG,PVOID); BOOL VDHENTRY VDHPopStack(ULONG,PVOID); VOID VDHENTRY VDHSetA20(BOOL); BOOL VDHENTRY VDHQueryA20(VOID); VOID VDHENTRY VDHSetFlags(ULONG); VOID VDHENTRY VDHSwitchToV86(VOID); VOID VDHENTRY VDHSwitchToVPM(VOID); BOOL VDHENTRY VDHCheckVPMIntVector(ULONG); BOOL VDHENTRY VDHGetVPMIntVector(ULONG,PFPFN); BOOL VDHENTRY VDHGetSelBase(SEL,PULONG); BOOL VDHENTRY VDHChangeVPMIF(BOOL); BOOL VDHENTRY VDHReadUBuf(PVOID,ULONG,SEL,PULONG,ULONG); BOOL VDHENTRY VDHWriteUBuf(PVOID,ULONG,SEL,PULONG,ULONG); BOOL VDHENTRY VDHCheckPagePerm(ULONG,PVOID,ULONG,ULONG); BOOL VDHENTRY VDHRaiseException(ULONG,ULONG,ULONG); BOOL VDHENTRY VDHStartHWInt(BOOL); BOOL VDHENTRY VDHGetVPMExcept(ULONG,PFPFN,PBYTE); BOOL VDHENTRY VDHProbeUBuf(SEL,ULONG,ULONG,ULONG); BOOL VDHENTRY VDHPrepVPMIret(HHOOK); BOOL VDHENTRY VDHPopVPMFarRet(VOID); /* c-begin */ BOOL VDHENTRY VDHSetVPMIntVector(ULONG, FPFN); BOOL VDHENTRY VDHSetVPMExcept(ULONG, FPFN, BYTE); BOOL VDHENTRY VDHPushFarCall(FPFN); /* c-end */ /* masm-begin */ /* VDHENTRY VDHSetVPMIntVector */ /* VDHENTRY VDHSetVPMExcept */ /* BOOL VDHENTRY VDHPushFarCall(ULONG, ULONG); */ /* masm-end */ FPFN VDHENTRY VDHArmVPMBPHook(HHOOK); VOID VDHENTRY VDHEndUseVPMStack(VOID); VOID VDHENTRY VDHBeginUseVPMStack(VOID); /* c-begin */ extern ULONG flVdmStatus; /* c-end */