home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v2.zip / DDKX86 / DBCSDD / H / V8086.H < prev    next >
Text File  |  1995-04-14  |  15KB  |  402 lines

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