home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ddkx86v1.zip / DDKX86 / H / MI.H < prev    next >
Text File  |  1995-04-14  |  15KB  |  518 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. /*static char *SCCSID = "@(#)mi.h       6.1 90/11/15";*/
  13. /*
  14.  *    Machine instruction, flag definitions and character types
  15.  *
  16.  *    SCCSID = @(#)mi.h    13.17 90/09/13
  17.  */
  18.  
  19. //    386 eflags definitions
  20.  
  21. #define F_ID        0x00200000    // CPU ID instruction supported
  22. #define F_VIP        0x00100000    // (V)irtual (I)nterrupt (P)ending
  23. #define F_VIF        0x00080000    // (V)irtual (I)nterrupt (F)lag
  24. #define F_AC        0x00040000    // (A)lignment (C)heck
  25. #define F_VM        0x00020000    // (V)irtual 8086 (M)ode
  26. #define F_RF        0x00010000    // (R)esume (F)lag
  27. #define F_NT        0x00004000    // (N)ested (T)ask
  28. #define F_NTCLEAR    (~F_NT)
  29. #define F_IOPL0     0
  30. #define F_IOPL1     0x00001000
  31. #define F_IOPL2     0x00002000
  32. #define F_IOPL3     0x00003000
  33. #define F_IOPLMASK    0x00003000    // (I)/(O) (P)rivilege (L)evel
  34. #define F_IOPLSYS    F_IOPL3     // wide open
  35. #define F_IOPLclear    (~F_IOPLMASK)
  36. #define F_OVERFLOW    0x00000800
  37. #define F_DIRECTION    0x00000400
  38. #define F_INTERRUPT    0x00000200
  39. #define F_TRACE     0x00000100
  40. #define F_SIGN        0x00000080
  41. #define F_ZERO        0x00000040
  42. #define F_AUX        0x00000010
  43. #define F_PARITY    0x00000004
  44. #define F_CARRY     0x00000001
  45. #define F_UNDEFINED    0x0000802A
  46.  
  47. //    CR0 (Machine Status Register) bits
  48.  
  49. #define CR0_PE        0x00000001    // (P)rotect (E)nable
  50. #define CR0_MP        0x00000002    // (M)onitor (P)rocessor extension
  51. #define CR0_EM        0x00000004    // (EM)ulate processor extension
  52. #define CR0_TS        0x00000008    // (T)ask (thread) (S)witched
  53. #define CR0_ET        0x00000010    // (E)xtension (T)ype, 0/1=287/387
  54. #define CR0_NE        0x00000020    // (N)umeric (E)xception 0/1=use 2/10h
  55. #define CR0_WP        0x00010000    // (W)rite (P)rotect in rings 0-2
  56. #define CR0_AM        0x00040000    // (A)lignment (M)ask, enable EFlags.AC
  57. #define CR0_NW        0x20000000    // (N)o (W)rite-through cache
  58. #define CR0_CD        0x40000000    // (C)ache (D)isable
  59. #define CR0_PG        0x80000000    // (P)a(G)ing enable
  60. #define CR0_RESERVED    0x1ffaffc0    // reserved bits
  61.  
  62. /*
  63.  *    Cache Operating Modes:
  64.  *
  65.  *    CR0_CD CR0_NW    Cache Fills    Write-Throughs and Invalidates
  66.  *    ------ ------    -----------    ------------------------------
  67.  *       1      1     disabled        disabled
  68.  *       1      0     disabled        enabled
  69.  *       0      1     INVALID combination - CR0 load causes GP fault
  70.  *       0      0     enabled        enabled (Normal mode)
  71.  */
  72.  
  73. //    Machine Status Word bits (obsolete)
  74.  
  75. #define MSW_PE        CR0_PE
  76. #define MSW_MP        CR0_MP
  77. #define MSW_EM        CR0_EM
  78. #define MSW_TS        CR0_TS
  79. #define MSW_ET        CR0_ET
  80.  
  81. //    CR3 (Page Directory Base Register) bits
  82.  
  83. #define CR3_WRITETHROUGH 0x00000008    // write-through cache (486 ignores)
  84. #define CR3_CACHEDISABLE 0x00000010    // cache disable
  85. #define CR3_FRAME     0xfffff000    // page directory physical frame number
  86. #define CR3_RESERVED     0x00000fe7    // reserved bits
  87.  
  88. //    CR4 bits
  89. #define CR4_VME      0x00000001
  90. #define CR4_PVI      0x00000002
  91.  
  92. //    Debug Registers
  93.  
  94. #define DR_COUNT    0x4        // number of debug registers
  95.  
  96. //    DR6 (Debug Registers Status Register) bits
  97.  
  98. #define DR6_B0        0x00000001    // breakpoint register 0 triggered
  99. #define DR6_B1        0x00000002    // breakpoint register 1 triggered
  100. #define DR6_B2        0x00000004    // breakpoint register 2 triggered
  101. #define DR6_B3        0x00000008    // breakpoint register 3 triggered
  102. #define DR6_BD        0x00002000    // ICE hardware active
  103. #define DR6_BS_BIT_INDEX       0xe    // Single step trap
  104. #define DR6_BS        (1 << DR6_BS_BIT_INDEX)
  105. #define DR6_BT        0x00008000    // TSS trap
  106.  
  107. #define DR6_VALID    (DR6_B0|DR6_B1|DR6_B2|DR6_B3|DR6_BD|DR6_BS|DR6_BT)
  108. #define DR6_RESERVED    ~(DR6_VALID)
  109.  
  110. //    DR7 (Debug Register Control Register) bits
  111.  
  112. #define DR7_L0        0x00000001    /* DR0 Local Enable  */
  113. #define DR7_G0        0x00000002    /* DR0 Global Enable */
  114. #define DR7_L1        0x00000004    /* DR1 Local Enable  */
  115. #define DR7_G1        0x00000008    /* DR1 Global Enable */
  116. #define DR7_L2        0x00000010    /* DR2 Local Enable  */
  117. #define DR7_G2        0x00000020    /* DR2 Global Enable */
  118. #define DR7_L3        0x00000040    /* DR3 Local Enable  */
  119. #define DR7_G3        0x00000080    /* DR3 Global Enable */
  120.  
  121. #define DR7_LE        0x00000100    /* Local  - Exact Match */
  122. #define DR7_GE        0x00000200    /* Global - Exact Match */
  123.  
  124. #define DR7_RW0     0x00030000    /* DR0 RW bits    */
  125. #define DR7_LEN0    0x000c0000    /* DR0 Len bits */
  126. #define DR7_RW1     0x00300000    /* DR1 RW bits    */
  127. #define DR7_LEN1    0x00c00000    /* DR1 Len bits */
  128. #define DR7_RW2     0x03000000    /* DR2 RW bits    */
  129. #define DR7_LEN2    0x0c000000    /* DR2 Len bits */
  130. #define DR7_RW3     0x30000000    /* DR3 RW bits    */
  131. #define DR7_LEN3    0xc0000000    /* DR3 Len bits */
  132.  
  133. #define DR7_RESERVED    0x0000fc00    /* DR7 Intel Reserved */
  134.  
  135. #define DR7_EXECUTE    0x0        /* Execute        */
  136. #define DR7_WRITE    0x1        /* Data Write        */
  137. #define DR7_READWRITE    0x3        /* Data Read or Write    */
  138.  
  139. #define DR7_LEN_1    0x0        /* Length 1 bits    */
  140. #define DR7_LEN_2    0x1        /* Length 2        */
  141. #define DR7_LEN_4    0x3        /* Length 4        */
  142.  
  143. //    Machine instruction, flag definitions and character types
  144.  
  145. #define MI_ARPL     0x63        // ARPL instruction
  146. #define MI_HLT        0xf4        // HLT instruction
  147. #define MI_OPERANDSIZE    0x66        // Operand size override prefix
  148. #define MI_ADDRESSSIZE    0x67        // Address size override prefix
  149. #define MI_TWOBYTEOP    0x0f        // Two byte opcode prefix
  150.  
  151. #define MI_POP_DS    0x1f
  152. #define MI_POP_ES    0x07
  153. #define MI_POP_FS    0xA1        // second byte to 0Fh opcode
  154. #define MI_POP_GS    0xA9        // second byte to 0Fh opcode
  155.  
  156. #define MI_INT3     0xCC
  157. #define MI_INT        0xCD
  158. #define MI_IRET     0xCF
  159. #define MI_LONG_JMP    0xEA
  160. #define MI_LONG_CALL    0x9A
  161. #define MI_LONG_RET    0xCB
  162. #define MI_LONG_RETn    0xCA
  163. #define MI_NEAR_RET    0xC3
  164.  
  165. #define MI_IN_PORT_AL    0xE4        // Opcode of IN port,AL
  166. #define MI_IN_PORT_AX    0xE5        // Opcode of IN port,AX
  167. #define MI_OUT_PORT_AL    0xE6        // Opcode of OUT port,AL
  168. #define MI_OUT_PORT_AX    0xE7        // Opcode of OUT port,AX
  169. #define MI_IN_DX_AL    0xEC        // Opcode of IN DX,AL
  170. #define MI_IN_DX_AX    0xED        // Opcode of IN DX,AX
  171. #define MI_OUT_DX_AL    0xEE        // Opcode of OUT DX,AL
  172. #define MI_OUT_DX_AX    0xEF        // Opcode of OUT DX,AX
  173.  
  174. #define MI_GROUP5    0xFF        // 5th group of 11-bit opcode inst.s
  175. #define MI_SEGES    0x26        // ES override prefix
  176. #define MI_SEGCS    0x2E        // CS override prefix
  177. #define MI_SEGSS    0x36        // SS override prefix
  178. #define MI_SEGDS    0x3E        // DS override prefix
  179. #define MI_SEGFS    0x64        // FS override prefix
  180. #define MI_SEGGS    0x65        // GS override prefix
  181.  
  182. //    ESC opcode prefix and mask
  183.  
  184. #define MI_ESCMASK    0xF8
  185. #define MI_ESC        0xD8
  186.  
  187. //    MOD field equates
  188.  
  189. #define MI_MODMASK    0xC0        // MOD field mask
  190. #define MI_MODSHIFT    6        // MOD field shift
  191. #define MI_MODNONE    0x00        // MOD = 0 (no displacement)
  192. #define MI_MODBYTE    0x40        // MOD = 1 (byte displacement)
  193. #define MI_MODWORD    0x80        // MOD = 2 (word displacement)
  194. #define MI_MODREG    0xC0        // MOD = 3 (R/M field selects register)
  195.  
  196. //    REG field equates
  197.  
  198. #define MI_REGMASK    0x38        // REG field mask
  199. #define MI_REGSHIFT    3        // REG field shift
  200. #define MI_REGAX    0x00        // REG = 0 (AX/AL)
  201. #define MI_REGCX    0x08        // REG = 1 (CX/CL)
  202. #define MI_REGDX    0x10        // REG = 2 (DX/DL)
  203. #define MI_REGBX    0x18        // REG = 3 (BX/BL)
  204. #define MI_REG3     0x18        // REG = 3 (part of 11-bit opcode)
  205. #define MI_REGSP    0x20        // REG = 4 (SP/AH)
  206. #define MI_REGBP    0x28        // REG = 5 (BP/CH)
  207. #define MI_REGSI    0x30        // REG = 6 (SI/DH)
  208. #define MI_REGDI    0x38        // REG = 7 (DI/BH)
  209.  
  210. #define MI_REGES    0x00        // REG = 0  MOV seg,r/m or MOV r/m,seg
  211. #define MI_REGCS    0x08        // REG = 1
  212. #define MI_REGSS    0x10        // REG = 2
  213. #define MI_REGDS    0x18        // REG = 3
  214. #define MI_REGFS    0x20        // REG = 4
  215. #define MI_REGGS    0x28        // REG = 5
  216.  
  217. //    R/M field equates for memory operands (for 16-bit instructions)
  218.  
  219. #define MI_RMMASK    0x07        // R/M field mask
  220. #define MI_RMSHIFT    0        // R/M field shift
  221. #define MI_RMBXSI    0x00        // R/M = 0 ([BX+SI])
  222. #define MI_RMBXDI    0x01        // R/M = 1 ([BX+DI])
  223. #define MI_RMBPSI    0x02        // R/M = 2 ([BP+SI])
  224. #define MI_RMBPDI    0x03        // R/M = 3 ([BP+DI])
  225. #define MI_RMSI     0x04        // R/M = 4 ([SI])
  226. #define MI_RMDI     0x05        // R/M = 5 ([DI])
  227. #define MI_RMBP     0x06        // R/M = 6 ([BP])
  228. #define MI_RMBX     0x07        // R/M = 7 ([BX])
  229.  
  230. //    32 bit instruction equates
  231.  
  232. #define MI_SIB_SSMASK        0xc0
  233. #define MI_SIB_SSSHIFT        0x06
  234.  
  235. #define MI_SIB_INDEXMASK    0x38
  236. #define MI_SIB_INDEXSHIFT    0x03
  237. #define MI_SIB_INDEXNONE    0x20
  238.  
  239. #define MI_SIB_BASEMASK     0x07
  240. #define MI_SIB_BASESHIFT    0x00
  241. #define MI_SIB_BASEESP        0x04
  242. #define MI_SIB_BASENONE     0x05
  243.  
  244. #define MI_RMEDX        0x02
  245. #define MI_RMSIB        0x04
  246. #define MI_RMDISP        0x05
  247. #define MI_RMEBP        0x05
  248.  
  249. #define MI_REG6         0x30
  250. #define MI_REGCR0        0x00
  251.  
  252. //    following machine instructions are used in Enable_386_Specific_code
  253. //    in virtmgr.asm
  254.  
  255. #define MI_PUSH_AX        0x50    // "push ax" instruction
  256. #define MI_PUSH_IMM        0x68    // "push immediate 16/32" instruction
  257. #define MI_MOV_REG_IMM        0xB8    // opcode for "mov reg,immediate" instr
  258. #define MI_MOV_REG_IMMEDIATE    0xB8    // opcode for "mov reg,immediate" instr
  259. #define MI_MOV_REG_REGMEM    0x8B    // opcode for "mov reg,r/m 16/32" instr
  260.  
  261. //    Miscellaneous Opcodes
  262.  
  263. #define MI_ADD_AX_IMM        0x05    // Opcode for Add (E)AX,imm(32)16
  264. #define MI_CALL_NEAR_REL    0xE8    // Opcode for Call NEAR (relative)
  265. #define SIZE_CALL_NEAR_REL    5    // Length of Call NEAR (relative) instr
  266.  
  267. #define MI_LMSW_OPCODE        0x01    // LMSW
  268.  
  269. #define MI_GET_CRx_OPCODE    0x20    // MOV r32,CRx
  270. #define MI_GET_DRx_OPCODE    0x21    // MOV r32,DRx
  271. #define MI_SET_CRx_OPCODE    0x22    // MOV CRx,r32
  272. #define MI_SET_DRx_OPCODE    0x23    // MOV DRx,r32
  273. #define MI_GET_TRx_OPCODE    0x24    // MOV r32,TRx
  274. #define MI_SET_TRx_OPCODE    0x26    // MOV TRx,r32
  275.  
  276. #define MI_MOV_REG8_MEM8    0x8A    // MOV reg8,mem8
  277. #define MI_MOV_SEG_MEM_OPCODE    0x8e    // MOV seg,r/m16
  278.  
  279. // WORD structure
  280.  
  281. struct w_s {
  282.     uchar_t lobyte;
  283.     uchar_t hibyte;
  284. };
  285. #define LowByte     lobyte
  286. #define HighByte    hibyte
  287.  
  288. // DWORD structure
  289.  
  290. struct dw_s {
  291.     ushort_t loword;
  292.     ushort_t hiword;
  293. };
  294. #define LowWord     loword
  295. #define HighWord    hiword
  296.  
  297. // Far pointer structure
  298.  
  299. struct    FarPtr {
  300.     ushort_t Offst;
  301.     ushort_t Segmt;
  302. };
  303.  
  304. // Far 32 bit pointer structure
  305.  
  306. struct FarPtr32 {
  307.     ulong_t Offst32;    // 32 bit offset
  308.     ushort_t Segmt32;    // segment
  309.     ushort_t Pad32;     // segment pad
  310. };
  311.  
  312. /***    RETF16 - 16 bit RETF frame definition
  313.  *
  314.  *    16 bit RETF frame structure
  315.  */
  316.  
  317. typedef struct retf16_s {
  318.     ushort_t retf16_ip;
  319.     ushort_t retf16_cs;
  320. } RETF16;
  321.  
  322. typedef RETF16 *PRETF16;
  323.  
  324. /***    RETF32 - 32 bit RETF frame definition
  325.  *
  326.  *    32 bit RETF frame structure
  327.  */
  328.  
  329. typedef struct retf32_s {
  330.     ulong_t retf32_eip;
  331.     ushort_t retf32_cs;
  332.     ushort_t retf32_padcs;
  333. } RETF32;
  334.  
  335. typedef RETF32 *PRETF32;
  336.  
  337. /***    IRET16 - 16 bit IRET frame definition
  338.  *
  339.  *    16 bit IRET frame structure
  340.  */
  341.  
  342. typedef struct iret16_s {
  343.     ushort_t iret16_ip;
  344.     ushort_t iret16_cs;
  345.     ushort_t iret16_flag;
  346. } IRET16;
  347.  
  348. typedef IRET16 *PIRET16;
  349.  
  350. // 16 bit Iret stack frame without privilege level transition
  351.  
  352. struct Iret_s {
  353.     struct    FarPtr    I_CSIP;
  354.     ushort_t I_FLAGS;
  355. };
  356.  
  357. struct IretFrame {
  358.     ushort_t IretIP ;
  359.     ushort_t IretCS ;
  360.     ushort_t IretFLAGS;
  361. };
  362.  
  363. /* ASM IretCSIP EQU    <DWORD PTR IretIP> */
  364.  
  365. /***    IRET32 - 32 bit IRET frame definition
  366.  *
  367.  *    32 bit IRET frame structure
  368.  */
  369.  
  370. typedef struct iret32_s {
  371.     ulong_t iret32_eip;
  372.     ushort_t iret32_cs;
  373.     ushort_t iret32_padcs;
  374.     ulong_t iret32_eflag;
  375. } IRET32;
  376.  
  377. typedef IRET32 *PIRET32;
  378.  
  379. // 32 bit Iret stack frame without privilege level transition
  380.  
  381. struct Iret32_s {
  382.     struct    FarPtr32 I32_CSEIP;
  383.     ulong_t I32_EFLAGS;
  384. };
  385. /* ASM
  386. I32_CS        EQU    <I32_CSEIP.Segmt32>
  387. I32_EIP     EQU    <I32_CSEIP.Offst32>
  388. I32_IP        EQU    <I32_CSEIP.Offst32.loword>
  389. I32_FLAGS    EQU    <I32_EFLAGS.loword>
  390. */
  391.  
  392. /***    PLTIRET16 - 16 bit IRET frame definition
  393.  *
  394.  *    16 bit IRET frame structure with privilege level transtion
  395.  */
  396.  
  397. typedef struct pltiret16_s {
  398.     ushort_t pltiret16_ip;
  399.     ushort_t pltiret16_cs;
  400.     ushort_t pltiret16_flag;
  401.     ushort_t pltiret16_sp;
  402.     ushort_t pltiret16_ss;
  403. } PLTIRET16;
  404.  
  405. typedef PLTIRET16 *PPLTIRET16;
  406.  
  407. // 16 bit Protected mode iret stack frame with privilege level transition
  408.  
  409. struct PLTIret_s {
  410.     struct    FarPtr    PI_CSIP;
  411.     ushort_t PI_FLAGS;
  412.     struct    FarPtr    PI_SSSP;
  413. };
  414.  
  415. struct PLTIretFrame {
  416.     ushort_t PLTIretIP;
  417.     ushort_t PLTIretCS;
  418.     ushort_t PLTIretFLAGS;
  419.     ushort_t PLTIretSP;
  420.     ushort_t PLTIretSS;
  421. };
  422.  
  423. /* ASM
  424. PLTIretCSIP    EQU    DWORD PTR PLTIretIP
  425. PLTIretSSSP    EQU    DWORD PTR PLTIretSP
  426. */
  427.  
  428. /***    PLTIRET32 - 32 bit IRET frame definition
  429.  *
  430.  *    32 bit IRET frame structure with privilege level transtion
  431.  */
  432.  
  433. typedef struct pltiret32_s {
  434.     ulong_t pltiret32_eip;
  435.     ushort_t pltiret32_cs;
  436.     ushort_t pltiret32_padcs;
  437.     ulong_t pltiret32_eflag;
  438.     ulong_t pltiret32_esp;
  439.     ushort_t pltiret32_ss;
  440.     ushort_t pltiret32_padss;
  441. } PLTIRET32;
  442.  
  443. typedef PLTIRET32 *PPLTIRET32;
  444.  
  445. // 32 bit Protected mode iret stack frame with privilege level transition
  446.  
  447. struct PLTIret32_s {
  448.     struct    FarPtr32 PI32_CSEIP;
  449.     ulong_t PI32_EFLAGS;
  450.     struct    FarPtr32 PI32_SSESP;
  451. };
  452. /* ASM
  453. PI32_CS     EQU    <PI32_CSEIP.Segmt32>
  454. PI32_EIP    EQU    <PI32_CSEIP.Offst32>
  455. PI32_SS     EQU    <PI32_SSESP.Segmt32>
  456. PI32_ESP    EQU    <PI32_SSESP.Offst32>
  457. PI32_FLAGS    EQU    <WORD PTR PI32_EFLAGS>
  458. */
  459.  
  460. // Generic 32-bit pointer structure
  461.  
  462. /* XLATOFF */
  463. union ptr_u {
  464.     struct FarPtr    ptr_far16;    /* 16-bit far pointer */
  465.     ulong_t     ptr_flat;    /* 32-bit flat pointer */
  466. };
  467. typedef union ptr_u    ptr_t;        /* Generic pointer type */
  468.  
  469. #define ptr_sel     ptr_far16.Segmt
  470. #define ptr_off     ptr_far16.Offst
  471. /* XLATON */
  472.  
  473. /* ASM
  474. ptr_t    STRUC
  475.     ptr_flat    DD    ?
  476. ptr_t    ENDS
  477. ptr_off     equ    <ptr_flat.Offst>
  478. ptr_sel     equ    <ptr_flat.Segmt>
  479. */
  480.  
  481.  
  482. // PUSHA stack frame
  483.  
  484. struct pusha_s {
  485.     ushort_t pas_di;
  486.     ushort_t pas_si;
  487.     ushort_t pas_bp;
  488.     ushort_t pas_sp;
  489.     ushort_t pas_bx;
  490.     ushort_t pas_dx;
  491.     ushort_t pas_cx;
  492.     ushort_t pas_ax;
  493. };
  494.  
  495. // PUSHAD stack frame
  496.  
  497. struct    pushad_s {
  498.     ulong_t pads_edi;
  499.     ulong_t pads_esi;
  500.     ulong_t pads_ebp;
  501.     ulong_t pads_esp;
  502.     ulong_t pads_ebx;
  503.     ulong_t pads_edx;
  504.     ulong_t pads_ecx;
  505.     ulong_t pads_eax;
  506. };
  507.  
  508. /* ASM
  509. pads_di EQU    <WORD PTR pads_edi>
  510. pads_si EQU    <WORD PTR pads_esi>
  511. pads_bp EQU    <WORD PTR pads_ebp>
  512. pads_sp EQU    <WORD PTR pads_esp>
  513. pads_bx EQU    <WORD PTR pads_ebx>
  514. pads_dx EQU    <WORD PTR pads_edx>
  515. pads_cx EQU    <WORD PTR pads_ecx>
  516. pads_ax EQU    <WORD PTR pads_eax>
  517. */
  518.