home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / warptlk3.zip / TOOLKIT / H / MI.H < prev    next >
C/C++ Source or Header  |  1995-08-30  |  18KB  |  519 lines

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