home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / header45.zip / v8086.h < prev    next >
C/C++ Source or Header  |  1999-03-15  |  14KB  |  380 lines

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