Index: /trunk/include/VBox/dis.h
===================================================================
--- /trunk/include/VBox/dis.h	(revision 41691)
+++ /trunk/include/VBox/dis.h	(revision 41692)
@@ -27,7 +27,7 @@
 #define ___VBox_dis_h
 
-#include <VBox/cdefs.h>
 #include <VBox/types.h>
 #include <VBox/disopcode.h>
+#include <iprt/assert.h>
 
 
@@ -390,5 +390,5 @@
  * Operand Parameter.
  */
-typedef struct OP_PARAMETER
+typedef struct DISOPPARAM
 {
     uint64_t        parval;
@@ -410,23 +410,23 @@
     union
     {
-        uint32_t    reg_gen;
+        uint8_t     reg_gen;
         /** ST(0) - ST(7) */
-        uint32_t    reg_fp;
+        uint8_t     reg_fp;
         /** MMX0 - MMX7 */
-        uint32_t    reg_mmx;
+        uint8_t     reg_mmx;
         /** XMM0 - XMM7 */
-        uint32_t    reg_xmm;
-        /** {ES, CS, SS, DS, FS, GS} */
-        DIS_SELREG  reg_seg;
+        uint8_t     reg_xmm;
+        /** {ES, CS, SS, DS, FS, GS} (DIS_SELREG). */
+        uint8_t     reg_seg;
         /** TR0-TR7 (?) */
-        uint32_t    reg_test;
+        uint8_t     reg_test;
         /** CR0-CR4 */
-        uint32_t    reg_ctrl;
+        uint8_t     reg_ctrl;
         /** DR0-DR7 */
-        uint32_t    reg_dbg;
+        uint8_t     reg_dbg;
     } base;
     union
     {
-        uint32_t    reg_gen;
+        uint8_t     reg_gen;
     } index;
 
@@ -435,9 +435,10 @@
     /** Parameter size. */
     uint8_t         cb;
-} OP_PARAMETER;
+} DISOPPARAM;
+AssertCompileSize(DISOPPARAM, 32);
 /** Pointer to opcode parameter. */
-typedef OP_PARAMETER *POP_PARAMETER;
+typedef DISOPPARAM *PDISOPPARAM;
 /** Pointer to opcode parameter. */
-typedef const OP_PARAMETER *PCOP_PARAMETER;
+typedef const DISOPPARAM *PCOP_PARAMETER;
 
 
@@ -462,28 +463,18 @@
 /** Parser callback.
  * @remark no DECLCALLBACK() here because it's considered to be internal (really, I'm too lazy to update all the functions). */
-typedef unsigned FNDISPARSE(RTUINTPTR pu8CodeBlock, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
+typedef unsigned FNDISPARSE(RTUINTPTR pu8CodeBlock, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu);
 typedef FNDISPARSE *PFNDISPARSE;
+typedef PFNDISPARSE const *PCPFNDISPARSE;
 
 typedef struct DISCPUSTATE
 {
-    /** Global setting. */
-    DISCPUMODE      mode;
-
-    /** Per instruction prefix settings. */
-    uint32_t        prefix;  /**< @todo change to uint8_t */
-    /** segment prefix value. */
-    DIS_SELREG      enmPrefixSeg;
-    /** rex prefix value (64 bits only */
-    uint32_t        prefix_rex; /**< @todo change to uint8_t */
-    /** addressing mode (16 or 32 bits). (CPUMODE_*) */
-    DISCPUMODE      addrmode;
-    /** operand mode (16 or 32 bits). (CPUMODE_*) */
-    DISCPUMODE      opmode;
-
-    OP_PARAMETER    param1;
-    OP_PARAMETER    param2;
-    OP_PARAMETER    param3;
-
-    /** ModRM fields. */
+    /* Because of apvUserData[1] and apvUserData[2], put the less frequently
+       used bits at the top for now.  (Might be better off in the middle?) */
+    DISOPPARAM      param3;
+    DISOPPARAM      param2;
+    DISOPPARAM      param1;
+
+    /* off: 0x060 (96) */
+    /** ModRM fields. */                
     union
     {
@@ -498,5 +489,4 @@
         unsigned            u;
     } ModRM;
-
     /** SIB fields. */
     union
@@ -512,40 +502,66 @@
         unsigned            u;
     } SIB;
-    int32_t         i32SibDisp;
-
+    int32_t         i32SibDisp;         
+
+    /* off: 0x06c (108) */
+    /** The CPU mode (DISCPUMODE). */
+    uint8_t         mode;               
+    /** The addressing mode (DISCPUMODE). */
+    uint8_t         addrmode;
+    /** The operand mode (DISCPUMODE). */
+    uint8_t         opmode;
+    /** Per instruction prefix settings. */
+    uint8_t         prefix;  
+    /* off: 0x070 (112) */
+    /** REX prefix value (64 bits only). */
+    uint8_t         prefix_rex;         
+    /** Segment prefix value (DIS_SELREG). */
+    uint8_t         idxSegPrefix;
+    /** Last prefix byte (for SSE2 extension tables). */
+    uint8_t         lastprefix;
+    /** First opcode byte of instruction. */
+    uint8_t         opcode;
+    /* off: 0x074 (116) */
+    /** The size of the prefix bytes. */
+    uint8_t         cbPrefix;           
     /** The instruction size. */
-    uint32_t        opsize;
+    uint8_t         opsize;
+    uint8_t         abUnused[2];
+    /* off: 0x078 (120) */
+    /** Return code set by a worker function like the opcode bytes readers. */
+    int32_t         rc;
+    /** Internal: instruction filter */
+    uint32_t        fFilter;
+    /* off: 0x080 (128) */
+    /** Internal: pointer to disassembly function table */
+    PCPFNDISPARSE   pfnDisasmFnTable;
+#if ARCH_BITS == 32
+    uint32_t        uPtrPadding1;
+#endif
+    /** Pointer to the current instruction. */
+    PCDISOPCODE     pCurInstr;
+#if ARCH_BITS == 32
+    uint32_t        uPtrPadding2;
+#endif
+    /* off: 0x090 (144) */
     /** The address of the instruction. */
     RTUINTPTR       uInstrAddr;
-    /** The size of the prefix bytes. */
-    uint8_t         cbPrefix;
-
-    /** First opcode byte of instruction. */
-    uint8_t         opcode;
-    /** Last prefix byte (for SSE2 extension tables). */
-    uint8_t         lastprefix;
+    /* off: 0x098 (152) */
+    /** Optional read function */
+    PFNDISREADBYTES pfnReadBytes;
+#if ARCH_BITS == 32
+    uint32_t        uPadding3;
+#endif
+    /* off: 0x0a0 (160) */
     /** The instruction bytes. */
     uint8_t         abInstr[16];
-
-    /** Internal: pointer to disassembly function table */
-    PFNDISPARSE    *pfnDisasmFnTable;
-    /** Internal: instruction filter */
-    uint32_t        fFilter;
-    /** Return code set by a worker function like the opcode bytes readers. */
-    int32_t         rc;
-
-    /** Pointer to the current instruction. */
-    PCDISOPCODE     pCurInstr;
-#ifndef DIS_CORE_ONLY
-    /** Opcode format string for current instruction. */
-    const char      *pszOpcode;
-#endif
-
-    /** Optional read function */
-    PFNDISREADBYTES pfnReadBytes;
+    /* off: 0x0b0 (176) */
     /** User data slots for the read callback.  The first entry is used for the
      *  pvUser argument, the rest are up for grabs.
      * @remarks This must come last so that we can memset everything before this. */
     void           *apvUserData[3];
+#if ARCH_BITS == 32
+    uint32_t        auPadding4[3];
+#endif
 } DISCPUSTATE;
 
@@ -568,5 +584,4 @@
     uint16_t    param2;
     uint16_t    param3;
-
     uint32_t    optype;
 } DISOPCODE;
@@ -589,10 +604,10 @@
                        PDISCPUSTATE pCpu, uint32_t *pcbInstr);
 
-DISDECL(int)        DISGetParamSize(PDISCPUSTATE pCpu, POP_PARAMETER pParam);
-DISDECL(DIS_SELREG) DISDetectSegReg(PDISCPUSTATE pCpu, POP_PARAMETER pParam);
+DISDECL(int)        DISGetParamSize(PDISCPUSTATE pCpu, PDISOPPARAM pParam);
+DISDECL(DIS_SELREG) DISDetectSegReg(PDISCPUSTATE pCpu, PDISOPPARAM pParam);
 DISDECL(uint8_t)    DISQuerySegPrefixByte(PDISCPUSTATE pCpu);
 
-DISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, POP_PARAMVAL pParamVal, PARAM_TYPE parmtype);
-DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, void **ppReg, size_t *pcbSize);
+DISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, PDISOPPARAM pParam, POP_PARAMVAL pParamVal, PARAM_TYPE parmtype);
+DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, PDISOPPARAM pParam, void **ppReg, size_t *pcbSize);
 
 DISDECL(int) DISFetchReg8(PCCPUMCTXCORE pCtx, unsigned reg8, uint8_t *pVal);
Index: /trunk/src/VBox/Disassembler/DisasmCore.cpp
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmCore.cpp	(revision 41691)
+++ /trunk/src/VBox/Disassembler/DisasmCore.cpp	(revision 41692)
@@ -37,12 +37,12 @@
 static unsigned disParseInstruction(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISCPUSTATE pCpu);
 
-static unsigned QueryModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc = NULL);
-static unsigned QueryModRM_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc = NULL);
-static void     UseSIB(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
-static unsigned ParseSIB_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu);
-
-static void     disasmModRMReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, POP_PARAMETER pParam, int fRegAddr);
-static void     disasmModRMReg16(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, POP_PARAMETER pParam);
-static void     disasmModRMSReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, POP_PARAMETER pParam);
+static unsigned QueryModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu, unsigned *pSibInc = NULL);
+static unsigned QueryModRM_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu, unsigned *pSibInc = NULL);
+static void     UseSIB(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu);
+static unsigned ParseSIB_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu);
+
+static void     disasmModRMReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr);
+static void     disasmModRMReg16(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam);
+static void     disasmModRMSReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam);
 
 static void     disValidateLockSequence(PDISCPUSTATE pCpu);
@@ -123,5 +123,5 @@
 *******************************************************************************/
 /** Parser opcode table for full disassembly. */
-static PFNDISPARSE  g_apfnFullDisasm[IDX_ParseMax] =
+static PFNDISPARSE const g_apfnFullDisasm[IDX_ParseMax] =
 {
     ParseIllegal,
@@ -169,5 +169,5 @@
 
 /** Parser opcode table for only calculating instruction size. */
-static PFNDISPARSE  g_apfnCalcSize[IDX_ParseMax] =
+static PFNDISPARSE const g_apfnCalcSize[IDX_ParseMax] =
 {
     ParseIllegal,
@@ -306,5 +306,5 @@
     }
     pCpu->prefix            = DISPREFIX_NONE;
-    pCpu->enmPrefixSeg      = DIS_SELREG_DS;
+    pCpu->idxSegPrefix      = DIS_SELREG_DS;
     pCpu->uInstrAddr        = uInstrAddr;
     pCpu->pfnDisasmFnTable  = g_apfnFullDisasm;
@@ -359,8 +359,8 @@
             // segment override prefix byte
             case OP_SEG:
-                pCpu->enmPrefixSeg = (DIS_SELREG)(paOneByteMap[codebyte].param1 - OP_PARM_REG_SEG_START);
+                pCpu->idxSegPrefix = (DIS_SELREG)(paOneByteMap[codebyte].param1 - OP_PARM_REG_SEG_START);
                 /* Segment prefixes for CS, DS, ES and SS are ignored in long mode. */
                 if (   pCpu->mode != DISCPUMODE_64BIT
-                    || pCpu->enmPrefixSeg >= DIS_SELREG_FS)
+                    || pCpu->idxSegPrefix >= DIS_SELREG_FS)
                 {
                     pCpu->prefix    |= DISPREFIX_SEG;
@@ -454,7 +454,4 @@
 
     // Store the opcode format string for disasmPrintf
-#ifndef DIS_CORE_ONLY
-    pCpu->pszOpcode = pOp->pszOpcode;
-#endif
     pCpu->pCurInstr = pOp;
 
@@ -521,5 +518,5 @@
 /* Floating point opcode parsing */
 //*****************************************************************************
-unsigned ParseEscFP(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseEscFP(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     int index;
@@ -579,9 +576,4 @@
         size += pCpu->pfnDisasmFnTable[fpop->idxParse2](uCodePtr+size, (PCDISOPCODE)fpop, pParam, pCpu);
 
-    // Store the opcode format string for disasmPrintf
-#ifndef DIS_CORE_ONLY
-    pCpu->pszOpcode = fpop->pszOpcode;
-#endif
-
     return size;
 }
@@ -599,5 +591,5 @@
 #endif
 //*****************************************************************************
-void UseSIB(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+void UseSIB(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned scale, base, index, regtype;
@@ -658,5 +650,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseSIB(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseSIB(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = sizeof(uint8_t);
@@ -691,5 +683,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseSIB_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseSIB_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = sizeof(uint8_t);
@@ -725,5 +717,5 @@
 // Mod    Reg/Opcode  R/M
 //*****************************************************************************
-unsigned UseModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned UseModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     int      vtype = OP_PARM_VTYPE(pParam->param);
@@ -902,5 +894,5 @@
 // Query the size of the ModRM parameters and fetch the immediate data (if any)
 //*****************************************************************************
-unsigned QueryModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc)
+unsigned QueryModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu, unsigned *pSibInc)
 {
     unsigned sibinc;
@@ -985,5 +977,5 @@
 // Query the size of the ModRM parameters and fetch the immediate data (if any)
 //*****************************************************************************
-unsigned QueryModRM_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu, unsigned *pSibInc)
+unsigned QueryModRM_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu, unsigned *pSibInc)
 {
     unsigned sibinc;
@@ -1060,5 +1052,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseIllegal(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseIllegal(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
@@ -1068,5 +1060,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseModRM(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = sizeof(uint8_t);   //ModRM byte
@@ -1114,5 +1106,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseModRM_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseModRM_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = sizeof(uint8_t);   //ModRM byte
@@ -1161,5 +1153,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseModFence(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseModFence(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     ////AssertMsgFailed(("??\n"));
@@ -1170,5 +1162,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmByte(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmByte(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1180,5 +1172,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmByte_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmByte_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
@@ -1187,5 +1179,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmByteSX(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmByteSX(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1213,5 +1205,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmByteSX_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmByteSX_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
@@ -1220,5 +1212,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmUshort(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmUshort(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1230,5 +1222,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmUshort_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmUshort_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
@@ -1237,5 +1229,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmUlong(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmUlong(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1247,5 +1239,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmUlong_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmUlong_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
@@ -1254,5 +1246,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmQword(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmQword(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1264,5 +1256,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmQword_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmQword_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
@@ -1271,5 +1263,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmV(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmV(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1297,5 +1289,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmV_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmV_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam);
@@ -1308,5 +1300,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmZ(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmZ(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1337,5 +1329,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmZ_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmZ_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam);
@@ -1349,5 +1341,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-unsigned ParseImmBRel(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmBRel(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1360,5 +1352,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-unsigned ParseImmBRel_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmBRel_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam); NOREF(pCpu);
@@ -1368,5 +1360,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-unsigned ParseImmVRel(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmVRel(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(pOp);
@@ -1396,5 +1388,5 @@
 // Relative displacement for branches (rel. to next instruction)
 //*****************************************************************************
-unsigned ParseImmVRel_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmVRel_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp); NOREF(pParam);
@@ -1406,5 +1398,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmAddr(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmAddr(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     if (pCpu->addrmode == DISCPUMODE_32BIT)
@@ -1468,5 +1460,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmAddr_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmAddr_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp);
@@ -1501,5 +1493,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmAddrF(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmAddrF(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     // immediate far pointers - only 16:16 or 16:32; determined by operand, *not* address size!
@@ -1524,5 +1516,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmAddrF_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmAddrF_SizeOnly(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp);
@@ -1543,5 +1535,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseFixedReg(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseFixedReg(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr);
@@ -1644,5 +1636,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseXv(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseXv(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr);
@@ -1669,5 +1661,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseXb(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseXb(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp);
@@ -1694,5 +1686,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseYv(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseYv(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr);
@@ -1719,5 +1711,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseYb(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseYb(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     NOREF(uCodePtr); NOREF(pOp);
@@ -1744,5 +1736,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseTwoByteEsc(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseTwoByteEsc(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     PCDISOPCODE   pOpcode;
@@ -1803,5 +1795,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseThreeByteEsc4(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseThreeByteEsc4(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     PCDISOPCODE   pOpcode;
@@ -1864,5 +1856,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseThreeByteEsc5(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseThreeByteEsc5(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     PCDISOPCODE   pOpcode;
@@ -1899,5 +1891,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseNopPause(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseNopPause(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0;
@@ -1917,5 +1909,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseImmGrpl(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseImmGrpl(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     int idx = (pCpu->opcode - 0x80) * 8;
@@ -1937,5 +1929,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseShiftGrp2(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseShiftGrp2(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     int idx;
@@ -1977,5 +1969,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp3(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp3(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     int idx = (pCpu->opcode - 0xF6) * 8;
@@ -1998,5 +1990,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp4(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp4(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2018,5 +2010,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp5(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp5(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2042,5 +2034,5 @@
 //
 //*****************************************************************************
-unsigned Parse3DNow(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned Parse3DNow(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrmsize;
@@ -2078,5 +2070,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp6(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp6(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2098,5 +2090,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp7(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp7(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg, rm, mod;
@@ -2126,5 +2118,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp8(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp8(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2146,5 +2138,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp9(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp9(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2166,5 +2158,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp10(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp10(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2186,5 +2178,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp12(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp12(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2208,5 +2200,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp13(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp13(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2230,5 +2222,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp14(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp14(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2252,5 +2244,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp15(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp15(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg, mod, rm;
@@ -2276,5 +2268,5 @@
 //*****************************************************************************
 //*****************************************************************************
-unsigned ParseGrp16(RTUINTPTR uCodePtr, PCDISOPCODE pOp, POP_PARAMETER pParam, PDISCPUSTATE pCpu)
+unsigned ParseGrp16(RTUINTPTR uCodePtr, PCDISOPCODE pOp, PDISOPPARAM pParam, PDISCPUSTATE pCpu)
 {
     unsigned size = 0, modrm, reg;
@@ -2305,5 +2297,5 @@
 static const int   IndexModRMReg16[4] = { USE_REG_SI, USE_REG_DI, USE_REG_SI, USE_REG_DI};
 //*****************************************************************************
-static void disasmModRMReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, POP_PARAMETER pParam, int fRegAddr)
+static void disasmModRMReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam, int fRegAddr)
 {
     int subtype, type, mod;
@@ -2381,5 +2373,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static void disasmModRMReg16(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, POP_PARAMETER pParam)
+static void disasmModRMReg16(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
 {
     NOREF(pCpu); NOREF(pOp);
@@ -2394,5 +2386,5 @@
 //*****************************************************************************
 //*****************************************************************************
-static void disasmModRMSReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, POP_PARAMETER pParam)
+static void disasmModRMSReg(PDISCPUSTATE pCpu, PCDISOPCODE pOp, unsigned idx, PDISOPPARAM pParam)
 {
     NOREF(pOp);
Index: /trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp	(revision 41691)
+++ /trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp	(revision 41692)
@@ -172,5 +172,5 @@
         case DISUSE_REG_SEG:
         {
-            Assert(pParam->base.reg_seg < (DIS_SELREG)RT_ELEMENTS(g_aszYasmRegCRx));
+            Assert(pParam->base.reg_seg < RT_ELEMENTS(g_aszYasmRegCRx));
             const char *psz = g_aszYasmRegSeg[pParam->base.reg_seg];
             *pcchReg = 2;
@@ -605,5 +605,5 @@
         do { \
             if (pCpu->prefix & DISPREFIX_SEG) \
-                PUT_STR(s_szSegPrefix[pCpu->enmPrefixSeg], 3); \
+                PUT_STR(s_szSegPrefix[pCpu->idxSegPrefix], 3); \
         } while (0)
 
@@ -617,5 +617,5 @@
             &&  !DISUSE_IS_EFFECTIVE_ADDR(pCpu->param3.fUse))
         {
-            PUT_STR(s_szSegPrefix[pCpu->enmPrefixSeg], 2);
+            PUT_STR(s_szSegPrefix[pCpu->idxSegPrefix], 2);
             PUT_C(' ');
         }
Index: /trunk/src/VBox/Disassembler/DisasmReg.cpp
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmReg.cpp	(revision 41691)
+++ /trunk/src/VBox/Disassembler/DisasmReg.cpp	(revision 41692)
@@ -201,5 +201,5 @@
 //*****************************************************************************
 //*****************************************************************************
-DISDECL(int) DISGetParamSize(PDISCPUSTATE pCpu, POP_PARAMETER pParam)
+DISDECL(int) DISGetParamSize(PDISCPUSTATE pCpu, PDISOPPARAM pParam)
 {
     int subtype = OP_PARM_VSUBTYPE(pParam->param);
@@ -257,26 +257,22 @@
 //*****************************************************************************
 //*****************************************************************************
-DISDECL(DIS_SELREG) DISDetectSegReg(PDISCPUSTATE pCpu, POP_PARAMETER pParam)
+DISDECL(DIS_SELREG) DISDetectSegReg(PDISCPUSTATE pCpu, PDISOPPARAM pParam)
 {
     if (pCpu->prefix & DISPREFIX_SEG)
+        /* Use specified SEG: prefix. */
+        return (DIS_SELREG)pCpu->idxSegPrefix;
+
+    /* Guess segment register by parameter type. */
+    if (pParam->fUse & (DISUSE_REG_GEN32|DISUSE_REG_GEN64|DISUSE_REG_GEN16))
     {
-        /* Use specified SEG: prefix. */
-        return pCpu->enmPrefixSeg;
+        AssertCompile(USE_REG_ESP == USE_REG_RSP);
+        AssertCompile(USE_REG_EBP == USE_REG_RBP);
+        AssertCompile(USE_REG_ESP == USE_REG_SP);
+        AssertCompile(USE_REG_EBP == USE_REG_BP);
+        if (pParam->base.reg_gen == USE_REG_ESP || pParam->base.reg_gen == USE_REG_EBP)
+            return DIS_SELREG_SS;
     }
-    else
-    {
-        /* Guess segment register by parameter type. */
-        if (pParam->fUse & (DISUSE_REG_GEN32|DISUSE_REG_GEN64|DISUSE_REG_GEN16))
-        {
-            AssertCompile(USE_REG_ESP == USE_REG_RSP);
-            AssertCompile(USE_REG_EBP == USE_REG_RBP);
-            AssertCompile(USE_REG_ESP == USE_REG_SP);
-            AssertCompile(USE_REG_EBP == USE_REG_BP);
-            if (pParam->base.reg_gen == USE_REG_ESP || pParam->base.reg_gen == USE_REG_EBP)
-                return DIS_SELREG_SS;
-        }
-        /* Default is use DS: for data access. */
-        return DIS_SELREG_DS;
-    }
+    /* Default is use DS: for data access. */
+    return DIS_SELREG_DS;
 }
 //*****************************************************************************
@@ -285,5 +281,5 @@
 {
     Assert(pCpu->prefix & DISPREFIX_SEG);
-    switch(pCpu->enmPrefixSeg)
+    switch (pCpu->idxSegPrefix)
     {
     case DIS_SELREG_ES:
@@ -504,5 +500,5 @@
  *
  */
-DISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, POP_PARAMVAL pParamVal, PARAM_TYPE parmtype)
+DISDECL(int) DISQueryParamVal(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, PDISOPPARAM pParam, POP_PARAMVAL pParamVal, PARAM_TYPE parmtype)
 {
     memset(pParamVal, 0, sizeof(*pParamVal));
@@ -763,5 +759,5 @@
  *
  */
-DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, POP_PARAMETER pParam, void **ppReg, size_t *pcbSize)
+DISDECL(int) DISQueryParamRegPtr(PCPUMCTXCORE pCtx, PDISCPUSTATE pCpu, PDISOPPARAM pParam, void **ppReg, size_t *pcbSize)
 {
     NOREF(pCpu);
Index: /trunk/src/VBox/Disassembler/DisasmTables.cpp
===================================================================
--- /trunk/src/VBox/Disassembler/DisasmTables.cpp	(revision 41691)
+++ /trunk/src/VBox/Disassembler/DisasmTables.cpp	(revision 41692)
@@ -664,5 +664,5 @@
 };
 
-/* Two byte opcode map with prefix 0x66 */
+/** Two byte opcode map with prefix 0x66 */
 const DISOPCODE g_aTwoByteMapX86_PF66[256] =
 {
Index: /trunk/src/VBox/Runtime/testcase/tstLdr-3.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstLdr-3.cpp	(revision 41691)
+++ /trunk/src/VBox/Runtime/testcase/tstLdr-3.cpp	(revision 41692)
@@ -164,5 +164,5 @@
         char        szOutput[256];
         unsigned    cbInstr;
-        int rc = DISInstrWithReader(uNearAddr + i, pCpu->mode,
+        int rc = DISInstrWithReader(uNearAddr + i, (DISCPUMODE)pCpu->mode,
                                     MyReadBytes, (uint8_t *)pvCodeBlock - (uintptr_t)uNearAddr,
                                     pCpu, &cbInstr);
Index: /trunk/src/VBox/VMM/VMMAll/EMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/EMAll.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/VMMAll/EMAll.cpp	(revision 41692)
@@ -364,5 +364,5 @@
         State.GCPtr = NIL_RTGCPTR;
     }
-    return DISInstrWithReader(InstrGC, pDis->mode, emReadBytes, &State, pDis, pOpsize);
+    return DISInstrWithReader(InstrGC, (DISCPUMODE)pDis->mode, emReadBytes, &State, pDis, pOpsize);
 }
 
@@ -377,5 +377,5 @@
     State.GCPtr = InstrGC;
 
-    return DISInstrWithReader(InstrGC, pDis->mode, emReadBytes, &State, pDis, pOpsize);
+    return DISInstrWithReader(InstrGC, (DISCPUMODE)pDis->mode, emReadBytes, &State, pDis, pOpsize);
 }
 
@@ -733,5 +733,5 @@
 
 /** Convert sel:addr to a flat GC address. */
-DECLINLINE(RTGCPTR) emConvertToFlatAddr(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pDis, POP_PARAMETER pParam, RTGCPTR pvAddr)
+DECLINLINE(RTGCPTR) emConvertToFlatAddr(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pDis, PDISOPPARAM pParam, RTGCPTR pvAddr)
 {
     DIS_SELREG enmPrefixSeg = DISDetectSegReg(pDis, pParam);
Index: /trunk/src/VBox/VMM/VMMAll/IOMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/IOMAll.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/VMMAll/IOMAll.cpp	(revision 41692)
@@ -137,5 +137,5 @@
         {
             *pcbSize  = 2;
-            DISFetchRegSeg(pRegFrame, pParam->base.reg_seg, (RTSEL *)pu64Data);
+            DISFetchRegSeg(pRegFrame, (DIS_SELREG)pParam->base.reg_seg, (RTSEL *)pu64Data);
             return true;
         } /* Else - error. */
@@ -193,5 +193,5 @@
     if (pParam->fUse & DISUSE_REG_SEG)
     {
-        DISWriteRegSeg(pRegFrame, pParam->base.reg_seg, (RTSEL)u64Data);
+        DISWriteRegSeg(pRegFrame, (DIS_SELREG)pParam->base.reg_seg, (RTSEL)u64Data);
         return true;
     }
Index: /trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp	(revision 41692)
@@ -934,5 +934,5 @@
      * Get bytes/words/dwords/qwords count to copy.
      */
-    uint64_t const fAddrMask = iomDisModeToMask(pCpu->addrmode);
+    uint64_t const fAddrMask = iomDisModeToMask((DISCPUMODE)pCpu->addrmode);
     RTGCUINTREG cTransfers = 1;
     if (pCpu->prefix & DISPREFIX_REP)
@@ -1078,5 +1078,5 @@
     if (rc == VINF_SUCCESS)
     {
-        uint64_t const fAddrMask = iomDisModeToMask(pCpu->addrmode);
+        uint64_t const fAddrMask = iomDisModeToMask((DISCPUMODE)pCpu->addrmode);
         pRegFrame->rsi = ((pRegFrame->rsi + offIncrement) & fAddrMask)
                        | (pRegFrame->rsi & ~fAddrMask);
@@ -2156,5 +2156,5 @@
     }
 
-    return IOMInterpretINSEx(pVM, pRegFrame, Port, pCpu->prefix, pCpu->addrmode, cb);
+    return IOMInterpretINSEx(pVM, pRegFrame, Port, pCpu->prefix, (DISCPUMODE)pCpu->addrmode, cb);
 }
 
@@ -2325,5 +2325,5 @@
     }
 
-    return IOMInterpretOUTSEx(pVM, pRegFrame, Port, pCpu->prefix, pCpu->addrmode, cb);
+    return IOMInterpretOUTSEx(pVM, pRegFrame, Port, pCpu->prefix, (DISCPUMODE)pCpu->addrmode, cb);
 }
 
Index: /trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp	(revision 41692)
@@ -2418,5 +2418,5 @@
                     Log2(("IOMInterpretOUTSEx %RGv %x size=%d\n", (RTGCPTR)pCtx->rip, IoExitInfo.n.u16Port, uIOSize));
                     STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatExitIOStringWrite);
-                    rc = IOMInterpretOUTSEx(pVM, CPUMCTX2CORE(pCtx), IoExitInfo.n.u16Port, pDis->prefix, pDis->addrmode, uIOSize);
+                    rc = IOMInterpretOUTSEx(pVM, CPUMCTX2CORE(pCtx), IoExitInfo.n.u16Port, pDis->prefix, (DISCPUMODE)pDis->addrmode, uIOSize);
                 }
                 else
@@ -2424,5 +2424,5 @@
                     Log2(("IOMInterpretINSEx  %RGv %x size=%d\n", (RTGCPTR)pCtx->rip, IoExitInfo.n.u16Port, uIOSize));
                     STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatExitIOStringRead);
-                    rc = IOMInterpretINSEx(pVM, CPUMCTX2CORE(pCtx), IoExitInfo.n.u16Port, pDis->prefix, pDis->addrmode, uIOSize);
+                    rc = IOMInterpretINSEx(pVM, CPUMCTX2CORE(pCtx), IoExitInfo.n.u16Port, pDis->prefix, (DISCPUMODE)pDis->addrmode, uIOSize);
                 }
             }
Index: /trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp	(revision 41692)
@@ -4321,5 +4321,5 @@
                     Log2(("IOMInterpretOUTSEx %RGv %x size=%d\n", (RTGCPTR)pCtx->rip, uPort, cbSize));
                     STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatExitIOStringWrite);
-                    rc = IOMInterpretOUTSEx(pVM, CPUMCTX2CORE(pCtx), uPort, pDis->prefix, pDis->addrmode, cbSize);
+                    rc = IOMInterpretOUTSEx(pVM, CPUMCTX2CORE(pCtx), uPort, pDis->prefix, (DISCPUMODE)pDis->addrmode, cbSize);
                 }
                 else
@@ -4327,5 +4327,5 @@
                     Log2(("IOMInterpretINSEx  %RGv %x size=%d\n", (RTGCPTR)pCtx->rip, uPort, cbSize));
                     STAM_COUNTER_INC(&pVCpu->hwaccm.s.StatExitIOStringRead);
-                    rc = IOMInterpretINSEx(pVM, CPUMCTX2CORE(pCtx), uPort, pDis->prefix, pDis->addrmode, cbSize);
+                    rc = IOMInterpretINSEx(pVM, CPUMCTX2CORE(pCtx), uPort, pDis->prefix, (DISCPUMODE)pDis->addrmode, cbSize);
                 }
             }
Index: /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/VMMR3/PATMPatch.cpp	(revision 41692)
@@ -421,7 +421,8 @@
     PATCHGEN_PROLOG(pVM, pPatch);
 
-    rc = patmPatchReadBytes(pVM, pPB, pCurInstrGC, pCpu->opsize);
+    uint32_t const cbInstrShutUpGcc = pCpu->opsize;
+    rc = patmPatchReadBytes(pVM, pPB, pCurInstrGC, cbInstrShutUpGcc);
     AssertRC(rc);
-    PATCHGEN_EPILOG(pPatch, pCpu->opsize);
+    PATCHGEN_EPILOG(pPatch, cbInstrShutUpGcc); 
     return rc;
 }
Index: /trunk/src/VBox/VMM/VMMRC/PATMRC.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMRC/PATMRC.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/VMMRC/PATMRC.cpp	(revision 41692)
@@ -523,5 +523,5 @@
             rc = VBOXSTRICTRC_TODO(rcStrict);
 #else
-            rc = DISInstr(&pRec->patch.aPrivInstr[0], cpu.mode, &cpu, &cbOp);
+            rc = DISInstr(&pRec->patch.aPrivInstr[0], (DISCPUMODE)cpu.mode, &cpu, &cbOp);
             if (RT_FAILURE(rc))
             {
Index: /trunk/src/VBox/VMM/include/EMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/EMInternal.h	(revision 41691)
+++ /trunk/src/VBox/VMM/include/EMInternal.h	(revision 41692)
@@ -390,13 +390,6 @@
 
     /** For saving stack space, the disassembler state is allocated here instead of
-     * on the stack.
-     * @note The DISCPUSTATE structure is not R3/R0/RZ clean!  */
-    union
-    {
-        /** The disassembler scratch space. */
-        DISCPUSTATE         DisState;
-        /** Padding. */
-        uint8_t             abDisStatePadding[DISCPUSTATE_PADDING_SIZE];
-    };
+     * on the stack. */
+    DISCPUSTATE             DisState;
 
     /** @name Execution profiling.
Index: /trunk/src/VBox/VMM/include/HWACCMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/HWACCMInternal.h	(revision 41691)
+++ /trunk/src/VBox/VMM/include/HWACCMInternal.h	(revision 41692)
@@ -749,13 +749,6 @@
 
     /** For saving stack space, the disassembler state is allocated here instead of
-     * on the stack.
-     * @note The DISCPUSTATE structure is not R3/R0/RZ clean!  */
-    union
-    {
-        /** The disassembler scratch space. */
-        DISCPUSTATE         DisState;
-        /** Padding. */
-        uint8_t             abDisStatePadding[DISCPUSTATE_PADDING_SIZE];
-    };
+     * on the stack. */
+    DISCPUSTATE             DisState;
 
     uint32_t                padding2[1];
Index: /trunk/src/VBox/VMM/include/IOMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/IOMInternal.h	(revision 41691)
+++ /trunk/src/VBox/VMM/include/IOMInternal.h	(revision 41692)
@@ -403,14 +403,6 @@
 {
     /** For saving stack space, the disassembler state is allocated here instead of
-     * on the stack.
-     * @note The DISCPUSTATE structure is not R3/R0/RZ clean!  */
-    union
-    {
-        /** The disassembler scratch space. */
-        DISCPUSTATE                 DisState;
-        /** Padding. */
-        uint8_t                     abDisStatePadding[DISCPUSTATE_PADDING_SIZE];
-    };
-    uint8_t                         Dummy[16];
+     * on the stack. */
+    DISCPUSTATE                     DisState;
 } IOMCPU;
 /** Pointer to IOM per virtual CPU instance data. */
Index: /trunk/src/VBox/VMM/include/PGMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/PGMInternal.h	(revision 41691)
+++ /trunk/src/VBox/VMM/include/PGMInternal.h	(revision 41692)
@@ -3830,13 +3830,6 @@
 
     /** For saving stack space, the disassembler state is allocated here instead of
-     * on the stack.
-     * @note The DISCPUSTATE structure is not R3/R0/RZ clean!  */
-    union
-    {
-        /** The disassembler scratch space. */
-        DISCPUSTATE                 DisState;
-        /** Padding. */
-        uint8_t                     abDisStatePadding[DISCPUSTATE_PADDING_SIZE];
-    };
+     * on the stack. */
+    DISCPUSTATE                     DisState;
 
     /** Count the number of pgm pool access handler calls. */
Index: /trunk/src/VBox/VMM/testcase/tstVMStruct.h
===================================================================
--- /trunk/src/VBox/VMM/testcase/tstVMStruct.h	(revision 41691)
+++ /trunk/src/VBox/VMM/testcase/tstVMStruct.h	(revision 41692)
@@ -281,5 +281,4 @@
     GEN_CHECK_SIZE(IOMCPU);
     GEN_CHECK_OFF(IOMCPU, DisState);
-    GEN_CHECK_OFF(IOMCPU, Dummy[0]);
 
     GEN_CHECK_SIZE(IOMMMIORANGE);
@@ -1397,2 +1396,11 @@
     GEN_CHECK_OFF(VMCPU, pgm);
 
+#ifndef VBOX_FOR_DTRACE_LIB
+    GEN_CHECK_SIZE(DISCPUSTATE);
+    GEN_CHECK_OFF(DISCPUSTATE, param1);
+    GEN_CHECK_OFF(DISCPUSTATE, param2);
+    GEN_CHECK_OFF(DISCPUSTATE, param3);
+    GEN_CHECK_OFF(DISCPUSTATE, i32SibDisp);
+    GEN_CHECK_OFF(DISCPUSTATE, fFilter);
+    GEN_CHECK_OFF(DISCPUSTATE, uInstrAddr);
+#endif    
Index: /trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
===================================================================
--- /trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp	(revision 41691)
+++ /trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp	(revision 41692)
@@ -57,4 +57,5 @@
 #include <VBox/vmm/gvm.h>
 #include <VBox/param.h>
+#include <VBox/dis.h>
 #include <iprt/x86.h>
 
@@ -407,10 +408,4 @@
     CHECK_MEMBER_ALIGNMENT(HWACCMCPU, Event.intInfo, 8);
 
-    /* The various disassembler state members.  */
-    CHECK_PADDING3(EMCPU, DisState, abDisStatePadding);
-    CHECK_PADDING3(HWACCMCPU, DisState, abDisStatePadding);
-    CHECK_PADDING3(IOMCPU, DisState, abDisStatePadding);
-    CHECK_PADDING3(PGMCPU, DisState, abDisStatePadding);
-
     /* Make sure the set is large enough and has the correct size. */
     CHECK_SIZE(VMCPUSET, 32);
