home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddrivers.zip / VDD / V8086.H < prev    next >
Text File  |  1993-02-19  |  11KB  |  366 lines

  1. /***    V8086.H
  2.  *
  3.  *    8086 Emulation Export Include File
  4.  *
  5.  *    Description:
  6.  *
  7.  *    Contains the exported structures, defines and VDH
  8.  *    function prototypes for 8086 emulation.
  9.  *
  10.  */
  11.  
  12.  
  13. /*INT32*/
  14.  
  15. /***ET+ Low memory defines - used by VBIOS */
  16.  
  17. #define IVT_START        0    /* Interrupt vector table start */
  18. #define IVT_LEN         0x400    /*     "        "     "   length */
  19. /*end*/
  20.  
  21. /***ET+ flVdmStatus flags */
  22.  
  23. #define VDM_STATUS_VPM_32    0x00000001    /* 32 bit DPMI app */
  24. #define VDM_STATUS_VPM_32_BIT    0
  25. #define VDM_STATUS_VPM_APP    0x00000002    /* DPMI app started */
  26. #define VDM_STATUS_VPM_APP_BIT    1
  27. #define VDM_STATUS_VPM_EXEC    0x00000004    /* in VDM protected mode */
  28. #define VDM_STATUS_VPM_EXEC_BIT 2
  29. #define VDM_STATUS_VPM_TRAPMODE 0x00000008    /* V86 mode at kernel entry? */
  30. #define VDM_STATUS_VPM_TRAP_BIT 3
  31. #define VDM_STATUS_VPM_IF_FLAG    0x00000010    /* Virtual IF flag */
  32. #define VDM_STATUS_VPM_IF_BIT    4
  33. #define VDM_STATUS_VPM_08_HOOK    0x00000020    /* protect 08h hooked? */
  34. #define VDM_STATUS_VPM_08_BIT    5
  35. #define VDM_STATUS_VPM_1C_HOOK    0x00000040    /* protect 1Ch hooked? */
  36. #define VDM_STATUS_VPM_1C_BIT    6
  37. #define VDM_STATUS_VPM_PERM    0x00000080    /* protected mode allowed? */
  38. #define VDM_STATUS_VPM_PERM_BIT 7
  39. #define VDM_STATUS_VPM_XDOS    0x00000100    /* DOS API Extension active? */
  40. #define VDM_STATUS_VPM_XDOS_BIT 8
  41. #define VDM_STATUS_VPM_TERM    0x00000200    /* VDM terminating? */
  42. #define VDM_STATUS_VPM_TERM_BIT 9
  43. /*end*/
  44.  
  45. /***ET+ VDHInstallIntHook options */
  46.  
  47. #define VDH_ASM_HOOK        0x00000001L
  48. /*end*/
  49.  
  50. /***ET+ VDHInstallIOHook options */
  51.  
  52. #define VDHIIH_ASM_HOOK     VDH_ASM_HOOK
  53. #define VDHIIH_ALWAYS_TRAP    0x00000002L
  54. #define VDHIIH_NO_SIMULATE    0x00000004L
  55. #define VDHIIH_IGNORE        0x00000010L
  56. /*end*/
  57.  
  58. /***ET+ VDHSetIOHookState options */
  59.  
  60. #define SETIO_TRAP        TRUE
  61. #define SETIO_NOTRAP        FALSE
  62. /*end*/
  63.  
  64. /***ET+ I/O type flags - VDHInstallIOPort pfnOther handler */
  65.  
  66. #define IO_TYPE_SHIFT        8
  67. #define IO_TYPE_MASK        0x00000F00L
  68. #define IO_TYPE_INPUT        0x00000100L
  69. #define IO_TYPE_OUTPUT        0x00000000L
  70. #define IO_TYPE_STRING        0x00000200L
  71. #define IO_TYPE_BYTE        0x00000400L
  72. #define IO_TYPE_WORD        0x00000000L
  73. #define IO_TYPE_DWORD        0x00000800L
  74.  
  75. #define IO_TYPE_ADDR32        0x00001000L
  76. #define IO_TYPE_REP        0x00002000L
  77. #define IO_TYPE_REVERSE     0x00008000L
  78.  
  79. #define IO_SEG_SHIFT        16
  80. #define IO_SEG_MASK        0x000f0000L
  81. #define IO_SEG_ES        0x00000000L
  82. #define IO_SEG_CS        0x00010000L
  83. #define IO_SEG_SS        0x00020000L
  84. #define IO_SEG_DS        0x00030000L
  85. #define IO_SEG_FS        0x00040000L
  86. #define IO_SEG_GS        0x00050000L
  87. /*end*/
  88.  
  89. /***ET+ VDHCheckPagePerm and private DPMI options */
  90.  
  91. #define VPMPG_W        0x00000002       /* Writable */
  92. #define VPMPG_U        0x00000004       /* user mode accessible */
  93. #define VPMPG_X        0x00000008       /* eXecutable */
  94. #define VPMPG_R        0x00000010       /* Readable */
  95. /*end*/
  96.  
  97.  
  98. /***ET+ VDHAllocHook options */
  99.  
  100. #define VDH_CONTEXT_HOOK        0
  101. #define VDH_STI_HOOK            1
  102. #define VDH_RETURN_HOOK         2
  103. #define VDH_TIMER_HOOK            3
  104. #define VDH_BP_HOOK            4
  105. /*end*/
  106.  
  107. /***ET+ VDHArmContextHook options */
  108.  
  109. #define GLOBAL_CONTEXT_HOOK    ((HVDM) -1)
  110. /*end*/
  111.  
  112. /***ET+ VDHArmReturnHook options */
  113.  
  114. #define VDHARH_NORMAL_RET        0
  115. #define VDHARH_NORMAL_IRET        1
  116. #define VDHARH_RECURSIVE_RET        2
  117. #define VDHARH_RECURSIVE_IRET        3
  118. #define VDHARH_CSEIP_HOOK        4
  119. #define VDHARH_RECURSIVE_CSEIP_HOOK    5
  120. /*end*/
  121.  
  122. /***ET+ VDHArmReturnHook recursive user stack usage
  123.  *
  124.  *    VDHARH_RECURSIVE_CSEIP_HOOK stack usage will vary depend
  125.  *    on the VDM protected mode "bitness".   If 32 bit, there
  126.  *    will be 8 bytes on the stack; otherwise, 4 bytes.
  127.  */
  128.  
  129. #define VDHARH_RECURSIVE_STACK_USAGE    4
  130. /*end*/
  131.  
  132. /***ET+ VDHPushFarCall user stack usage */
  133.  
  134. #define VDHPFC_STACK_USAGE        4
  135. /*end*/
  136.  
  137. /***ET+ VDHPushInt user stack usage */
  138.  
  139. #define VDHPI_STACK_USAGE        6
  140. /*end*/
  141.  
  142. /***ET+ VDHPushRegs/VDHPopRegs flags */
  143.  
  144. #define VDHREG_AX        0x00000001L
  145. #define VDHREG_BX        0x00000002L
  146. #define VDHREG_CX        0x00000004L
  147. #define VDHREG_DX        0x00000008L
  148. #define VDHREG_SI        0x00000010L
  149. #define VDHREG_DI        0x00000020L
  150. #define VDHREG_BP        0x00000040L
  151. #define VDHREG_SP        0x00000080L
  152. #define VDHREG_DS        0x00000100L
  153. #define VDHREG_ES        0x00000200L
  154. #define VDHREG_SS        0x00000400L
  155. #define VDHREG_FLAG        0x00000800L
  156. #define VDHREG_ALL        (VDHREG_AX | VDHREG_BX | \
  157.                  VDHREG_CX | VDHREG_DX | \
  158.                  VDHREG_SI | VDHREG_DI | \
  159.                  VDHREG_BP | VDHREG_SP | \
  160.                  VDHREG_DS | VDHREG_ES | \
  161.                  VDHREG_SS | VDHREG_FLAG)
  162. #define VDHREG_GENERAL        (VDHREG_AX | VDHREG_BX | \
  163.                  VDHREG_CX | VDHREG_DX | \
  164.                  VDHREG_SI | VDHREG_DI | \
  165.                  VDHREG_BP | VDHREG_DS | \
  166.                  VDHREG_ES | VDHREG_FLAG)
  167. /*end*/
  168.  
  169. /***ET+ CRF - Client Register Frame
  170.  *
  171.  *    The EBX register points to the CRF structure on entry
  172.  *    to I/O port handlers and VDD interrupt handlers.  VDDs
  173.  *    can retrieve or modify the client's registers with this
  174.  *    interface.
  175.  */
  176.  
  177. typedef struct crf_s {
  178.     ULONG crf_edi;
  179.     ULONG crf_esi;
  180.     ULONG crf_ebp;
  181.     ULONG crf_padesp;
  182.     ULONG crf_ebx;
  183.     ULONG crf_edx;
  184.     ULONG crf_ecx;
  185.     ULONG crf_eax;
  186.     ULONG crf_pad2[2];
  187.     ULONG crf_eip;
  188.     USHORT crf_cs;
  189.     USHORT crf_padcs;
  190.     ULONG crf_eflag;
  191.     ULONG crf_esp;
  192.     USHORT crf_ss;
  193.     USHORT crf_padss;
  194.     USHORT crf_es;
  195.     USHORT crf_pades;
  196.     USHORT crf_ds;
  197.     USHORT crf_padds;
  198.     USHORT crf_fs;
  199.     USHORT crf_padfs;
  200.     USHORT crf_gs;
  201.     USHORT crf_padgs;
  202.     ULONG crf_alteip;        /* other modes register set */
  203.     USHORT crf_altcs;
  204.     USHORT crf_altpadcs;
  205.     ULONG crf_alteflag;
  206.     ULONG crf_altesp;
  207.     USHORT crf_altss;
  208.     USHORT crf_altpadss;
  209.     USHORT crf_altes;
  210.     USHORT crf_altpades;
  211.     USHORT crf_altds;
  212.     USHORT crf_altpadds;
  213.     USHORT crf_altfs;
  214.     USHORT crf_altpadfs;
  215.     USHORT crf_altgs;
  216.     USHORT crf_altpadgs;
  217. } CRF;
  218.  
  219. typedef CRF *PCRF;
  220. /*end*/
  221.  
  222.  
  223. /*c-begin */
  224. /***ET+ Macros to improve VDM register manipulations from C */
  225.  
  226. #define AX(pcrf)    WORDOF(pcrf->crf_eax,0)
  227. #define AL(pcrf)    BYTEOF(pcrf->crf_eax,0)
  228. #define AH(pcrf)    BYTEOF(pcrf->crf_eax,1)
  229. #define BX(pcrf)    WORDOF(pcrf->crf_ebx,0)
  230. #define BL(pcrf)    BYTEOF(pcrf->crf_ebx,0)
  231. #define BH(pcrf)    BYTEOF(pcrf->crf_ebx,1)
  232. #define CX(pcrf)    WORDOF(pcrf->crf_ecx,0)
  233. #define CL(pcrf)    BYTEOF(pcrf->crf_ecx,0)
  234. #define CH(pcrf)    BYTEOF(pcrf->crf_ecx,1)
  235. #define DX(pcrf)    WORDOF(pcrf->crf_edx,0)
  236. #define DL(pcrf)    BYTEOF(pcrf->crf_edx,0)
  237. #define DH(pcrf)    BYTEOF(pcrf->crf_edx,1)
  238. #define SI(pcrf)    WORDOF(pcrf->crf_esi,0)
  239. #define DI(pcrf)    WORDOF(pcrf->crf_edi,0)
  240. #define BP(pcrf)    WORDOF(pcrf->crf_ebp,0)
  241. #define SP(pcrf)    WORDOF(pcrf->crf_esp,0)
  242. #define CS(pcrf)    WORDOF(pcrf->crf_cs,0)
  243. #define IP(pcrf)    WORDOF(pcrf->crf_eip,0)
  244. #define DS(pcrf)    WORDOF(pcrf->crf_ds,0)
  245. #define ES(pcrf)    WORDOF(pcrf->crf_es,0)
  246. #define SS(pcrf)    WORDOF(pcrf->crf_ss,0)
  247. #define FL(pcrf)    WORDOF(pcrf->crf_eflag,0)
  248.  
  249. /* General purpose macros */
  250.  
  251. #define INT_PIC1BASE    0x08
  252. #define INT_PIC2BASE    0x70
  253. #define INTFROMIRQ(irq) (((irq) < 8)? (irq) + INT_PIC1BASE: \
  254.                       (irq) - 8 + INT_PIC2BASE)
  255. /*c-end */
  256.  
  257. /* VDHReadUBuf and VDHWriteUBuf flags */
  258.  
  259. #define VPM_FAULT_IF_RW_SET    0x01
  260. #define VPM_FAULT_IF_SU_SET    0x02
  261. #define VPM_SEL_PRESENT     0x04
  262. #define VPM_SEL_WRITEABLE    0x08
  263. #define VPM_FAULT_IF_RO     0x10
  264. #define VPM_SEL_IS_SS        0x20
  265. #define VPM_PROT_READ        0x40
  266. #define VPM_PROT_WRITE        0x80
  267. #define VPM_XCPTRET_ALT     0x100
  268.  
  269. /***ET+ Hook routine typedefs */
  270.  
  271. typedef BYTE HOOKENTRY BIH(ULONG, PCRF);    /* I/O hook routines */
  272. typedef VOID HOOKENTRY BOH(BYTE, ULONG, PCRF);
  273. typedef WORD HOOKENTRY WIH(ULONG, PCRF);
  274. typedef VOID HOOKENTRY WOH(WORD, ULONG, PCRF);
  275. typedef BOOL HOOKENTRY OTH(ULONG, PULONG, ULONG, ULONG, PCRF);
  276.  
  277. typedef BYTE (*HOOKENTRY PBIH)(ULONG, PCRF);    /* pointers to I/O hook routines */
  278. typedef VOID (*HOOKENTRY PBOH)(BYTE, ULONG, PCRF);
  279. typedef WORD (*HOOKENTRY PWIH)(ULONG, PCRF);
  280. typedef VOID (*HOOKENTRY PWOH)(WORD, ULONG, PCRF);
  281. typedef BOOL (*HOOKENTRY POTH)(ULONG, PULONG, ULONG, ULONG, PCRF);
  282.  
  283. typedef BOOL HOOKENTRY FNHOOK(PCRF);        /* hook routine */
  284. typedef BOOL (*HOOKENTRY PFNHOOK)(PCRF);    /* pointer to hook routine */
  285.  
  286. typedef VOID HOOKENTRY FNARM();         /* arm hook routine */
  287. typedef VOID (*HOOKENTRY PFNARM)();        /* pointer to arm hook routine */
  288.  
  289.  
  290. /***ET+ IOH - I/O Port Hook Entry
  291.  *
  292.  *    This is the structure for the parameter to the VDHInstallIOHook
  293.  *    service.  Only the byte input and output handlers are required.
  294.  *    A null (0) entry indicates that the type of I/O should be
  295.  *    simulated.  The structure passed by VDHInstallIOHook is
  296.  *    copied and saved away after the NULLs are replaced with the
  297.  *    addresses of the simulation routines.
  298.  */
  299.  
  300. typedef struct ioh_s {
  301.     PBIH ioh_pbihByteInput;         /* byte input handler */
  302.     PBOH ioh_pbohByteOutput;        /* byte output handler */
  303.     PWIH ioh_pwihWordInput;         /* word input handler */
  304.     PWOH ioh_pwohWordOutput;        /* word output handler */
  305.     POTH ioh_pothOther;               /* dword and string I/O handler */
  306. } IOH;
  307.  
  308. typedef IOH *PIOH;                /* pointer to IOH entry */
  309. /*end*/
  310.  
  311.  
  312. /* 8086 emulation VDH services */
  313.  
  314. BOOL VDHENTRY VDHInstallIOHook(HVDM, PORT, ULONG, PIOH, FLAGS);
  315. VOID VDHENTRY VDHRemoveIOHook(HVDM, PORT, ULONG, PIOH);
  316. VOID VDHENTRY VDHSetIOHookState(HVDM, PORT, ULONG, PIOH, BOOL);
  317. BOOL VDHENTRY VDHInstallIntHook(HVDM, ULONG, PFNHOOK, FLAGS);
  318. HHOOK VDHENTRY VDHAllocHook(ULONG, PFNARM, ULONG);
  319. PVOID VDHENTRY VDHQueryHookData(HHOOK);
  320. VOID VDHENTRY VDHFreeHook(HHOOK);
  321. VOID VDHENTRY VDHArmContextHook(HHOOK, HVDM);
  322. VOID VDHENTRY VDHArmSTIHook(HHOOK, HVDM);
  323. BOOL VDHENTRY VDHArmReturnHook(HHOOK, ULONG);
  324. VPVOID VDHENTRY VDHArmBPHook(HHOOK);
  325. BOOL VDHENTRY VDHPushInt(ULONG);
  326. BOOL VDHENTRY VDHPopInt(VOID);
  327. BOOL VDHENTRY VDHPushRegs(FLAGS);
  328. BOOL VDHENTRY VDHPopRegs(FLAGS);
  329. BOOL VDHENTRY VDHPushStack(ULONG,PVOID);
  330. BOOL VDHENTRY VDHPopStack(ULONG,PVOID);
  331. VOID VDHENTRY VDHSetA20(BOOL);
  332. BOOL VDHENTRY VDHQueryA20(VOID);
  333. VOID VDHENTRY VDHSetFlags(ULONG);
  334. VOID VDHENTRY VDHSwitchToV86(VOID);
  335. VOID VDHENTRY VDHSwitchToVPM(VOID);
  336. BOOL VDHENTRY VDHCheckVPMIntVector(ULONG);
  337. BOOL VDHENTRY VDHGetVPMIntVector(ULONG,PFPFN);
  338. BOOL VDHENTRY VDHGetSelBase(SEL,PULONG);
  339. BOOL VDHENTRY VDHChangeVPMIF(BOOL);
  340. BOOL VDHENTRY VDHReadUBuf(PVOID,ULONG,SEL,PULONG,ULONG);
  341. BOOL VDHENTRY VDHWriteUBuf(PVOID,ULONG,SEL,PULONG,ULONG);
  342. BOOL VDHENTRY VDHCheckPagePerm(ULONG,PVOID,ULONG,ULONG);
  343. BOOL VDHENTRY VDHRaiseException(ULONG,ULONG,ULONG);
  344. BOOL VDHENTRY VDHStartHWInt(BOOL);
  345. BOOL VDHENTRY VDHGetVPMExcept(ULONG,PFPFN,PBYTE);
  346. BOOL VDHENTRY VDHProbeUBuf(SEL,ULONG,ULONG,ULONG);
  347. BOOL VDHENTRY VDHPrepVPMIret(HHOOK);
  348. BOOL VDHENTRY VDHPopVPMFarRet(VOID);
  349.  
  350. /* c-begin */
  351. BOOL VDHENTRY VDHSetVPMIntVector(ULONG, FPFN);
  352. BOOL VDHENTRY VDHSetVPMExcept(ULONG, FPFN, BYTE);
  353. BOOL VDHENTRY VDHPushFarCall(FPFN);
  354. /* c-end    */
  355. /* masm-begin */
  356. /* VDHENTRY VDHSetVPMIntVector    <ULONG, ULONG, ULONG>  */
  357. /* VDHENTRY VDHSetVPMExcept  <ULONG, ULONG, ULONG, BYTE>    */
  358. /* BOOL VDHENTRY VDHPushFarCall(ULONG, ULONG); */
  359. /* masm-end    */
  360. FPFN VDHENTRY VDHArmVPMBPHook(HHOOK);
  361. VOID VDHENTRY VDHEndUseVPMStack(VOID);
  362. VOID VDHENTRY VDHBeginUseVPMStack(VOID);
  363. /* c-begin */
  364. extern ULONG flVdmStatus;
  365. /* c-end    */
  366.