VirtualBox

Changeset 9675 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jun 13, 2008 9:49:54 AM (17 years ago)
Author:
vboxsync
Message:

General cleanup of SELMToFlat.

Location:
trunk/src/VBox
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/Disasm.cpp

    r8936 r9675  
    123123
    124124    //reset instruction settings
    125     pCpu->prefix      = PREFIX_NONE;
    126     pCpu->prefix_seg  = 0;
    127     pCpu->ModRM.u     = 0;
    128     pCpu->SIB.u       = 0;
    129     pCpu->lastprefix  = 0;
     125    pCpu->prefix        = PREFIX_NONE;
     126    pCpu->enmPrefixSeg  = DIS_SELREG_DS;
     127    pCpu->ModRM.u       = 0;
     128    pCpu->SIB.u         = 0;
     129    pCpu->lastprefix    = 0;
    130130    pCpu->param1.parval = 0;
    131131    pCpu->param2.parval = 0;
     
    134134    pCpu->param2.szParam[0] = 0;
    135135    pCpu->param3.szParam[0] = 0;
    136     pCpu->param1.size  = 0;
    137     pCpu->param2.size  = 0;
    138     pCpu->param3.size  = 0;
    139     pCpu->param1.flags = 0;
    140     pCpu->param2.flags = 0;
    141     pCpu->param3.flags = 0;
    142     pCpu->uFilter      = uFilter;
     136    pCpu->param1.size   = 0;
     137    pCpu->param2.size   = 0;
     138    pCpu->param3.size   = 0;
     139    pCpu->param1.flags  = 0;
     140    pCpu->param2.flags  = 0;
     141    pCpu->param3.flags  = 0;
     142    pCpu->uFilter       = uFilter;
    143143    pCpu->pfnDisasmFnTable = pfnFullDisasm;
    144144
     
    192192                // segment override prefix byte
    193193                case OP_SEG:
    194                     pCpu->prefix_seg = paOneByteMap[codebyte].param1 - OP_PARM_REG_SEG_START;
     194                    pCpu->enmPrefixSeg = (DIS_SELREG)(paOneByteMap[codebyte].param1 - OP_PARM_REG_SEG_START);
    195195                    /* Segment prefixes for CS, DS, ES and SS are ignored in long mode. */
    196196                    if (   pCpu->mode != CPUMODE_64BIT
    197                         || pCpu->prefix_seg >= OP_PARM_REG_FS)
     197                        || pCpu->enmPrefixSeg >= OP_PARM_REG_FS)
    198198                    {
    199199                        pCpu->prefix    |= PREFIX_SEG;
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r9131 r9675  
    173173     * Reset instruction settings
    174174     */
    175     pCpu->prefix     = PREFIX_NONE;
    176     pCpu->prefix_seg = 0;
    177     pCpu->lastprefix = 0;
    178     pCpu->ModRM.u    = 0;
    179     pCpu->SIB.u      = 0;
     175    pCpu->prefix        = PREFIX_NONE;
     176    pCpu->enmPrefixSeg  = DIS_SELREG_DS;
     177    pCpu->lastprefix    = 0;
     178    pCpu->ModRM.u       = 0;
     179    pCpu->SIB.u         = 0;
    180180    pCpu->param1.parval = 0;
    181181    pCpu->param2.parval = 0;
     
    184184    pCpu->param2.szParam[0] = '\0';
    185185    pCpu->param3.szParam[0] = '\0';
    186     pCpu->param1.flags = 0;
    187     pCpu->param2.flags = 0;
    188     pCpu->param3.flags = 0;
    189     pCpu->param1.size  = 0;
    190     pCpu->param2.size  = 0;
    191     pCpu->param3.size  = 0;
    192     pCpu->pfnReadBytes = 0;
    193     pCpu->uFilter      = OPTYPE_ALL;
     186    pCpu->param1.flags  = 0;
     187    pCpu->param2.flags  = 0;
     188    pCpu->param3.flags  = 0;
     189    pCpu->param1.size   = 0;
     190    pCpu->param2.size   = 0;
     191    pCpu->param3.size   = 0;
     192    pCpu->pfnReadBytes  = 0;
     193    pCpu->uFilter       = OPTYPE_ALL;
    194194    pCpu->pfnDisasmFnTable = pfnFullDisasm;
    195195
     
    217217     * Reset instruction settings
    218218     */
    219     pCpu->prefix     = PREFIX_NONE;
    220     pCpu->prefix_seg = 0;
    221     pCpu->lastprefix = 0;
    222     pCpu->mode       = enmCpuMode;
    223     pCpu->ModRM.u    = 0;
    224     pCpu->SIB.u      = 0;
    225     pCpu->param1.parval = 0;
    226     pCpu->param2.parval = 0;
    227     pCpu->param3.parval = 0;
     219    pCpu->prefix            = PREFIX_NONE;
     220    pCpu->enmPrefixSeg      = DIS_SELREG_DS;
     221    pCpu->lastprefix        = 0;
     222    pCpu->mode              = enmCpuMode;
     223    pCpu->ModRM.u           = 0;
     224    pCpu->SIB.u             = 0;
     225    pCpu->param1.parval     = 0;
     226    pCpu->param2.parval     = 0;
     227    pCpu->param3.parval     = 0;
    228228    pCpu->param1.szParam[0] = '\0';
    229229    pCpu->param2.szParam[0] = '\0';
     
    298298            // segment override prefix byte
    299299            case OP_SEG:
    300                 pCpu->prefix_seg = paOneByteMap[codebyte].param1 - OP_PARM_REG_SEG_START;
     300                pCpu->enmPrefixSeg = (DIS_SELREG)(paOneByteMap[codebyte].param1 - OP_PARM_REG_SEG_START);
    301301                /* Segment prefixes for CS, DS, ES and SS are ignored in long mode. */
    302302                if (   pCpu->mode != CPUMODE_64BIT
    303                     || pCpu->prefix_seg >= OP_PARM_REG_FS)
     303                    || pCpu->enmPrefixSeg >= OP_PARM_REG_FS)
    304304                {
    305305                    pCpu->prefix    |= PREFIX_SEG;
     
    15271527    {
    15281528        /* Segment ES..GS registers. */
    1529         pParam->base.reg_seg = pParam->param - OP_PARM_REG_SEG_START;
     1529        pParam->base.reg_seg = (DIS_SELREG)(pParam->param - OP_PARM_REG_SEG_START);
    15301530        pParam->flags |= USE_REG_SEG;
    15311531        pParam->size   = 2;
     
    21212121static const int   IndexModRMReg16[4] = { USE_REG_SI, USE_REG_DI, USE_REG_SI, USE_REG_DI};
    21222122//*****************************************************************************
    2123 void disasmModRMReg(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam, int fRegAddr)
     2123void disasmModRMReg(PDISCPUSTATE pCpu, PCOPCODE pOp, unsigned idx, POP_PARAMETER pParam, int fRegAddr)
    21242124{
    21252125    int subtype, type, mod;
     
    21552155    case OP_PARM_b:
    21562156#if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED)
    2157         if (idx > (int)RT_ELEMENTS(szModRMReg8))
     2157        if (idx > RT_ELEMENTS(szModRMReg8))
    21582158            disasmAddString(pParam->szParam, szModRMReg8_64[idx]);
    21592159        else
     
    21942194//*****************************************************************************
    21952195//*****************************************************************************
    2196 void disasmModRMReg16(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam)
     2196void disasmModRMReg16(PDISCPUSTATE pCpu, PCOPCODE pOp, unsigned idx, POP_PARAMETER pParam)
    21972197{
    21982198    disasmAddString(pParam->szParam, szModRMReg1616[idx]);
     
    22072207//*****************************************************************************
    22082208//*****************************************************************************
    2209 void disasmModRMSReg(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam)
     2209void disasmModRMSReg(PDISCPUSTATE pCpu, PCOPCODE pOp, unsigned idx, POP_PARAMETER pParam)
    22102210{
    22112211#if 0 //def DEBUG_Sander
    2212     AssertMsg(idx < (int)ELEMENTS(szModRMSegReg), ("idx=%d\n", idx));
     2212    AssertMsg(idx < ELEMENTS(szModRMSegReg), ("idx=%d\n", idx));
    22132213#endif
    22142214#ifdef IN_RING3
    2215     if (idx >= (int)ELEMENTS(szModRMSegReg))
     2215    if (idx >= ELEMENTS(szModRMSegReg))
    22162216    {
    22172217        Log(("disasmModRMSReg %d failed!!\n", idx));
     
    22202220#endif
    22212221
    2222     idx = RT_MIN(idx, (int)ELEMENTS(szModRMSegReg)-1);
     2222    idx = RT_MIN(idx, ELEMENTS(szModRMSegReg)-1);
    22232223    disasmAddString(pParam->szParam, szModRMSegReg[idx]);
    22242224    pParam->flags |= USE_REG_SEG;
    2225     pParam->base.reg_seg = idx;
     2225    pParam->base.reg_seg = (DIS_SELREG)idx;
    22262226}
    22272227//*****************************************************************************
     
    23092309    }
    23102310    if (pCpu->prefix & PREFIX_SEG)
    2311         disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "%s:", szModRMSegReg[pCpu->prefix_seg]);
     2311        disasmAddStringF(pParam->szParam, sizeof(pParam->szParam), "%s:", szModRMSegReg[pCpu->enmPrefixSeg]);
    23122312}
    23132313#ifndef IN_GC
  • trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp

    r9342 r9675  
    617617        do { \
    618618            if (pCpu->prefix & PREFIX_SEG) \
    619                 PUT_STR(s_szSegPrefix[pCpu->prefix_seg], 3); \
     619                PUT_STR(s_szSegPrefix[pCpu->enmPrefixSeg], 3); \
    620620        } while (0)
    621621
     
    629629            &&  !DIS_IS_EFFECTIVE_ADDR(pCpu->param3.flags))
    630630        {
    631             PUT_STR(s_szSegPrefix[pCpu->prefix_seg], 2);
     631            PUT_STR(s_szSegPrefix[pCpu->enmPrefixSeg], 2);
    632632            PUT_C(' ');
    633633        }
     
    899899                        if (pfnGetSymbol)
    900900                        {
    901                             int rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(USE_REG_CS), uTrgAddr, szSymbol, sizeof(szSymbol), &off, pvUser);
     901                            int rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DIS_SELREG_CS), uTrgAddr, szSymbol, sizeof(szSymbol), &off, pvUser);
    902902                            if (RT_SUCCESS(rc))
    903903                            {
     
    950950                                PUT_NUM_16(pParam->parval);
    951951                                if (pfnGetSymbol)
    952                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(USE_REG_CS), (uint16_t)pParam->parval, szSymbol, sizeof(szSymbol), &off, pvUser);
     952                                    rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DIS_SELREG_CS), (uint16_t)pParam->parval, szSymbol, sizeof(szSymbol), &off, pvUser);
    953953                                break;
    954954                            case USE_DISPLACEMENT32:
    955955                                PUT_NUM_32(pParam->parval);
    956956                                if (pfnGetSymbol)
    957                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(USE_REG_CS), (uint32_t)pParam->parval, szSymbol, sizeof(szSymbol), &off, pvUser);
     957                                    rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DIS_SELREG_CS), (uint32_t)pParam->parval, szSymbol, sizeof(szSymbol), &off, pvUser);
    958958                                break;
    959959                            case USE_DISPLACEMENT64:
    960960                                PUT_NUM_64(pParam->parval);
    961961                                if (pfnGetSymbol)
    962                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(USE_REG_CS), (uint64_t)pParam->parval, szSymbol, sizeof(szSymbol), &off, pvUser);
     962                                    rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DIS_SELREG_CS), (uint64_t)pParam->parval, szSymbol, sizeof(szSymbol), &off, pvUser);
    963963                                break;
    964964                            default:
     
    10141014                                PUT_NUM_16(pParam->disp16);
    10151015                                if (pfnGetSymbol)
    1016                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(USE_REG_CS), (uint16_t)pParam->disp16, szSymbol, sizeof(szSymbol), &off, pvUser);
     1016                                    rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DIS_SELREG_CS), (uint16_t)pParam->disp16, szSymbol, sizeof(szSymbol), &off, pvUser);
    10171017                                break;
    10181018                            case USE_DISPLACEMENT32:
    10191019                                PUT_NUM_32(pParam->disp32);
    10201020                                if (pfnGetSymbol)
    1021                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(USE_REG_CS), (uint32_t)pParam->disp32, szSymbol, sizeof(szSymbol), &off, pvUser);
     1021                                    rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DIS_SELREG_CS), (uint32_t)pParam->disp32, szSymbol, sizeof(szSymbol), &off, pvUser);
    10221022                                break;
    10231023                            case USE_DISPLACEMENT64:
    10241024                                PUT_NUM_64(pParam->disp64);
    10251025                                if (pfnGetSymbol)
    1026                                     rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(USE_REG_CS), (uint64_t)pParam->disp64, szSymbol, sizeof(szSymbol), &off, pvUser);
     1026                                    rc = pfnGetSymbol(pCpu, DIS_FMT_SEL_FROM_REG(DIS_SELREG_CS), (uint64_t)pParam->disp64, szSymbol, sizeof(szSymbol), &off, pvUser);
    10271027                                break;
    10281028                            default:
  • trunk/src/VBox/Disassembler/DisasmInternal.h

    r9266 r9675  
    149149void disasmSprintf(char *pszOutput, RTUINTPTR pu8Instruction, PDISCPUSTATE pCpu, POP_PARAMETER pParam1, POP_PARAMETER pParam2, POP_PARAMETER pParam3 = NULL);
    150150void disasmGetPtrString(PDISCPUSTATE pCpu, PCOPCODE pOp, POP_PARAMETER pParam);
    151 void disasmModRMReg(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam, int fRegAddr);
    152 void disasmModRMReg16(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam);
    153 void disasmModRMSReg(PDISCPUSTATE pCpu, PCOPCODE pOp, int idx, POP_PARAMETER pParam);
     151void disasmModRMReg(PDISCPUSTATE pCpu, PCOPCODE pOp, unsigned idx, POP_PARAMETER pParam, int fRegAddr);
     152void disasmModRMReg16(PDISCPUSTATE pCpu, PCOPCODE pOp, unsigned idx, POP_PARAMETER pParam);
     153void disasmModRMSReg(PDISCPUSTATE pCpu, PCOPCODE pOp, unsigned idx, POP_PARAMETER pParam);
    154154void disasmPrintAbs32(POP_PARAMETER pParam);
    155155void disasmPrintDisp32(POP_PARAMETER pParam);
  • trunk/src/VBox/Disassembler/DisasmReg.cpp

    r9132 r9675  
    157157static const unsigned g_aRegSegIndex[] =
    158158{
    159     RT_OFFSETOF(CPUMCTXCORE, es),         /* USE_REG_ES */
    160     RT_OFFSETOF(CPUMCTXCORE, cs),         /* USE_REG_CS */
    161     RT_OFFSETOF(CPUMCTXCORE, ss),         /* USE_REG_SS */
    162     RT_OFFSETOF(CPUMCTXCORE, ds),         /* USE_REG_DS */
    163     RT_OFFSETOF(CPUMCTXCORE, fs),         /* USE_REG_FS */
    164     RT_OFFSETOF(CPUMCTXCORE, gs)          /* USE_REG_GS */
     159    RT_OFFSETOF(CPUMCTXCORE, es),         /* DIS_SELREG_ES */
     160    RT_OFFSETOF(CPUMCTXCORE, cs),         /* DIS_SELREG_CS */
     161    RT_OFFSETOF(CPUMCTXCORE, ss),         /* DIS_SELREG_SS */
     162    RT_OFFSETOF(CPUMCTXCORE, ds),         /* DIS_SELREG_DS */
     163    RT_OFFSETOF(CPUMCTXCORE, fs),         /* DIS_SELREG_FS */
     164    RT_OFFSETOF(CPUMCTXCORE, gs)          /* DIS_SELREG_GS */
    165165};
    166166
    167167static const unsigned g_aRegHidSegIndex[] =
    168168{
    169     RT_OFFSETOF(CPUMCTXCORE, esHid),         /* USE_REG_ES */
    170     RT_OFFSETOF(CPUMCTXCORE, csHid),         /* USE_REG_CS */
    171     RT_OFFSETOF(CPUMCTXCORE, ssHid),         /* USE_REG_SS */
    172     RT_OFFSETOF(CPUMCTXCORE, dsHid),         /* USE_REG_DS */
    173     RT_OFFSETOF(CPUMCTXCORE, fsHid),         /* USE_REG_FS */
    174     RT_OFFSETOF(CPUMCTXCORE, gsHid)          /* USE_REG_GS */
     169    RT_OFFSETOF(CPUMCTXCORE, esHid),         /* DIS_SELREG_ES */
     170    RT_OFFSETOF(CPUMCTXCORE, csHid),         /* DIS_SELREG_CS */
     171    RT_OFFSETOF(CPUMCTXCORE, ssHid),         /* DIS_SELREG_SS */
     172    RT_OFFSETOF(CPUMCTXCORE, dsHid),         /* DIS_SELREG_DS */
     173    RT_OFFSETOF(CPUMCTXCORE, fsHid),         /* DIS_SELREG_FS */
     174    RT_OFFSETOF(CPUMCTXCORE, gsHid)          /* DIS_SELREG_GS */
    175175};
    176176
     
    223223//*****************************************************************************
    224224//*****************************************************************************
    225 DISDECL(int) DISDetectSegReg(PDISCPUSTATE pCpu, POP_PARAMETER pParam)
     225DISDECL(DIS_SELREG) DISDetectSegReg(PDISCPUSTATE pCpu, POP_PARAMETER pParam)
    226226{
    227227    if (pCpu->prefix & PREFIX_SEG)
    228228    {
    229229        /* Use specified SEG: prefix. */
    230         return pCpu->prefix_seg;
     230        return pCpu->enmPrefixSeg;
    231231    }
    232232    else
     
    240240            AssertCompile(USE_REG_EBP == USE_REG_BP);
    241241            if (pParam->base.reg_gen == USE_REG_ESP || pParam->base.reg_gen == USE_REG_EBP)
    242                 return USE_REG_SS;
     242                return DIS_SELREG_SS;
    243243        }
    244244        /* Default is use DS: for data access. */
    245         return USE_REG_DS;
     245        return DIS_SELREG_DS;
    246246    }
    247247}
     
    251251{
    252252    Assert(pCpu->prefix & PREFIX_SEG);
    253     switch(pCpu->prefix_seg)
     253    switch(pCpu->enmPrefixSeg)
    254254    {
    255     case USE_REG_ES:
     255    case DIS_SELREG_ES:
    256256        return 0x26;
    257     case USE_REG_CS:
     257    case DIS_SELREG_CS:
    258258        return 0x2E;
    259     case USE_REG_SS:
     259    case DIS_SELREG_SS:
    260260        return 0x36;
    261     case USE_REG_DS:
     261    case DIS_SELREG_DS:
    262262        return 0x3E;
    263     case USE_REG_FS:
     263    case DIS_SELREG_FS:
    264264        return 0x64;
    265     case USE_REG_GS:
     265    case DIS_SELREG_GS:
    266266        return 0x65;
    267267    default:
     
    372372 *
    373373 */
    374 DISDECL(int) DISFetchRegSeg(PCPUMCTXCORE pCtx, unsigned sel, RTSEL *pVal)
     374DISDECL(int) DISFetchRegSeg(PCPUMCTXCORE pCtx, DIS_SELREG sel, RTSEL *pVal)
    375375{
    376376    AssertReturn(sel < ELEMENTS(g_aRegSegIndex), VERR_INVALID_PARAMETER);
     
    385385 *
    386386 */
    387 DISDECL(int) DISFetchRegSegEx(PCPUMCTXCORE pCtx, unsigned sel, RTSEL *pVal, CPUMSELREGHID **ppSelHidReg)
     387DISDECL(int) DISFetchRegSegEx(PCPUMCTXCORE pCtx, DIS_SELREG sel, RTSEL *pVal, CPUMSELREGHID **ppSelHidReg)
    388388{
    389389    AssertReturn(sel < ELEMENTS(g_aRegSegIndex), VERR_INVALID_PARAMETER);
     
    447447 *
    448448 */
    449 DISDECL(int) DISWriteRegSeg(PCPUMCTXCORE pCtx, unsigned sel, RTSEL val)
     449DISDECL(int) DISWriteRegSeg(PCPUMCTXCORE pCtx, DIS_SELREG sel, RTSEL val)
    450450{
    451451    AssertReturn(sel < ELEMENTS(g_aRegSegIndex), VERR_INVALID_PARAMETER);
  • trunk/src/VBox/VMM/DBGFDisas.cpp

    r9656 r9675  
    250250    if (DIS_FMT_SEL_IS_REG(u32Sel))
    251251    {
    252         if (DIS_FMT_SEL_GET_REG(u32Sel) == USE_REG_CS)
     252        if (DIS_FMT_SEL_GET_REG(u32Sel) == DIS_SELREG_CS)
    253253            rc = DBGFR3SymbolByAddr(pState->pVM, uAddress + pSelInfo->GCPtrBase, &off, &Sym);
    254254        else
  • trunk/src/VBox/VMM/EM.cpp

    r9659 r9675  
    14111411    {
    14121412        Assert(!PATMIsPatchGCAddr(pVM, pCtx->eip));
    1413         CSAMR3CheckCodeEx(pVM, pCtx->cs, &pCtx->csHid, pCtx->eip);
     1413        CSAMR3CheckCodeEx(pVM, CPUMCTX2CORE(pCtx), pCtx->eip);
    14141414    }
    14151415
     
    15071507            if (pCtx->SysEnter.cs != 0)
    15081508            {
    1509                 rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, pCtx->eip),
     1509                rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), pCtx->eip),
    15101510                                        (SELMGetCpuModeFromSelector(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid) == CPUMODE_32BIT) ? PATMFL_CODE32 : 0);
    15111511                if (VBOX_SUCCESS(rc))
     
    17581758            && !PATMIsPatchGCAddr(pVM, pCtx->eip))
    17591759        {
    1760             int rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, pCtx->eip),
     1760            int rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), pCtx->eip),
    17611761                                        (SELMGetCpuModeFromSelector(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid) == CPUMODE_32BIT) ? PATMFL_CODE32 : 0);
    17621762            if (VBOX_SUCCESS(rc))
     
    21082108         */
    21092109        case VINF_PATM_HC_MMIO_PATCH_READ:
    2110             rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, pCtx->eip),
     2110            rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), pCtx->eip),
    21112111                                    PATMFL_MMIO_ACCESS | ((SELMGetCpuModeFromSelector(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid) == CPUMODE_32BIT) ? PATMFL_CODE32 : 0));
    21122112            if (VBOX_FAILURE(rc))
     
    23702370        /* Prefetch pages for EIP and ESP */
    23712371        /** @todo This is rather expensive. Should investigate if it really helps at all. */
    2372         rc = PGMPrefetchPage(pVM, SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, pCtx->eip));
     2372        rc = PGMPrefetchPage(pVM, SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), pCtx->eip));
    23732373        if (rc == VINF_SUCCESS)
    2374             rc = PGMPrefetchPage(pVM, SELMToFlat(pVM, pCtx->eflags, pCtx->ss, &pCtx->ssHid, pCtx->esp));
     2374            rc = PGMPrefetchPage(pVM, SELMToFlat(pVM, DIS_SELREG_SS, CPUMCTX2CORE(pCtx), pCtx->esp));
    23752375        if (rc != VINF_SUCCESS)
    23762376        {
     
    24792479        {
    24802480            STAM_PROFILE_ADV_SUSPEND(&pVM->em.s.StatRAWEntry, b);
    2481             CSAMR3CheckCodeEx(pVM, pCtx->cs, &pCtx->csHid, pCtx->eip);
     2481            CSAMR3CheckCodeEx(pVM, CPUMCTX2CORE(pCtx), pCtx->eip);
    24822482            STAM_PROFILE_ADV_RESUME(&pVM->em.s.StatRAWEntry, b);
    24832483        }
     
    29802980            Log(("Forced action VM_FF_CSAM_SCAN_PAGE\n"));
    29812981
    2982             CSAMR3CheckCodeEx(pVM, pCtx->cs, &pCtx->csHid, pCtx->eip);
     2982            CSAMR3CheckCodeEx(pVM, CPUMCTX2CORE(pCtx), pCtx->eip);
    29832983            VM_FF_CLEAR(pVM, VM_FF_CSAM_SCAN_PAGE);
    29842984        }
  • trunk/src/VBox/VMM/PATM/CSAM.cpp

    r9659 r9675  
    20992099 * @returns VBox status code.
    21002100 * @param   pVM         The VM to operate on.
    2101  * @param   Sel         selector
    2102  * @param   pHiddenSel  The hidden selector register.
     2101 * @param   pCtxCore    CPU context
    21032102 * @param   pInstrGC    Instruction pointer
    21042103 */
    2105 CSAMR3DECL(int) CSAMR3CheckCodeEx(PVM pVM, RTSEL Sel, CPUMSELREGHID *pHiddenSel, RTRCPTR pInstrGC)
     2104CSAMR3DECL(int) CSAMR3CheckCodeEx(PVM pVM, PCPUMCTXCORE pCtxCore, RTRCPTR pInstrGC)
    21062105{
    21072106    if (EMIsRawRing0Enabled(pVM) == false || PATMIsPatchGCAddr(pVM, pInstrGC) == true)
     
    21132112    if (CSAMIsEnabled(pVM))
    21142113    {
    2115         X86EFLAGS fakeflags;
    2116 
    2117         /* we're not in v86 mode here */
    2118         fakeflags.u32 = 0;
    2119 
    21202114        /* Assuming 32 bits code for now. */
    2121         Assert(SELMGetCpuModeFromSelector(pVM, fakeflags, Sel, pHiddenSel) == CPUMODE_32BIT);
    2122 
    2123         pInstrGC = SELMToFlat(pVM, fakeflags, Sel, pHiddenSel, pInstrGC);
    2124 
     2115        Assert(SELMGetCpuModeFromSelector(pVM, pCtxCore->eflags, pCtxCore->cs, &pCtxCore->csHid) == CPUMODE_32BIT);
     2116
     2117        pInstrGC = SELMToFlat(pVM, DIS_SELREG_CS, pCtxCore, pInstrGC);
    21252118        return CSAMR3CheckCode(pVM, pInstrGC);
    21262119    }
     
    23662359            CSAMP2GLOOKUPREC cacheRec = {0};            /* Cache record for PATMGCVirtToHCVirt. */
    23672360            PCSAMPAGE pPage = NULL;
    2368             X86EFLAGS fakeflags;
    23692361            SELMSELINFO selInfo;
    23702362
    2371             /* we're not in v86 mode here */
    2372             fakeflags.u32 = 0;
    2373 
    23742363            pHandler = VBOXIDTE_OFFSET(*pGuestIdte);
    2375             pHandler = SELMToFlat(pVM, fakeflags, pGuestIdte->Gen.u16SegSel, 0, pHandler);
     2364            pHandler = SELMToFlatBySel(pVM, pGuestIdte->Gen.u16SegSel, pHandler);
    23762365
    23772366            rc = SELMR3GetSelectorInfo(pVM, pGuestIdte->Gen.u16SegSel, &selInfo);
  • trunk/src/VBox/VMM/PATM/PATM.cpp

    r9228 r9675  
    16581658            /* mov ss, src? */
    16591659            if (    (pCpu->param1.flags & USE_REG_SEG)
    1660                 &&  (pCpu->param1.base.reg_seg == USE_REG_SS))
     1660                &&  (pCpu->param1.base.reg_seg == DIS_SELREG_SS))
    16611661            {
    16621662                Log(("Force recompilation of next instruction for OP_MOV at %VRv\n", pCurInstrGC));
     
    33733373
    33743374    pBranchTarget = pCtx->edx;
    3375     pBranchTarget = SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, pBranchTarget);
     3375    pBranchTarget = SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), pBranchTarget);
    33763376
    33773377    /* First we check if the duplicate function target lies in some existing function patch already. Will save some space. */
     
    39873987    if (CPUMGetGuestCPL(pVM, CPUMCTX2CORE(pCtx)) == 0)
    39883988    {
    3989         RTRCPTR pInstrGCFlat = SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, pInstrGC);
     3989        RTRCPTR pInstrGCFlat = SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), pInstrGC);
    39903990        if (pInstrGCFlat != pInstrGC)
    39913991        {
     
    60526052
    60536053                    /* continue at the original instruction */
    6054                     *ppNewEip = pNewEip - SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, 0);
     6054                    *ppNewEip = pNewEip - SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), 0);
    60556055                    STAM_PROFILE_ADV_STOP(&pVM->patm.s.StatHandleTrap, a);
    60566056                    return VINF_SUCCESS;
     
    61196119        }
    61206120
    6121         *ppNewEip = pNewEip - SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, 0);
     6121        *ppNewEip = pNewEip - SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), 0);
    61226122        STAM_PROFILE_ADV_STOP(&pVM->patm.s.StatHandleTrap, a);
    61236123        return rc;
     
    61526152
    61536153    /* Return original address, correct by subtracting the CS base address. */
    6154     *ppNewEip = pNewEip - SELMToFlat(pVM, pCtx->eflags, pCtx->cs, &pCtx->csHid, 0);
     6154    *ppNewEip = pNewEip - SELMToFlat(pVM, DIS_SELREG_CS, CPUMCTX2CORE(pCtx), 0);
    61556155
    61566156    /* Reset the PATM stack. */
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r9661 r9675  
    889889}
    890890
     891CPUMDECL(uint64_t) CPUMGetGuestFSBASE(PVM pVM)
     892{
     893    return pVM->cpum.s.Guest.msrFSBASE;
     894}
     895
     896CPUMDECL(uint64_t) CPUMGetGuestGSBASE(PVM pVM)
     897{
     898    return pVM->cpum.s.Guest.msrGSBASE;
     899}
     900
    891901/**
    892902 * Gets a CpuId leaf.
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r9663 r9675  
    344344static RTGCPTR emConvertToFlatAddr(PVM pVM, PCPUMCTXCORE pRegFrame, PDISCPUSTATE pCpu, POP_PARAMETER pParam, RTGCPTR pvAddr)
    345345{
    346     int   prefix_seg, rc;
    347     RTSEL sel;
    348     CPUMSELREGHID *pSelHidReg;
    349 
    350     prefix_seg = DISDetectSegReg(pCpu, pParam);
    351     rc = DISFetchRegSegEx(pRegFrame, prefix_seg, &sel, &pSelHidReg);
    352     if (VBOX_FAILURE(rc))
    353         return pvAddr;
    354 
    355     return SELMToFlat(pVM, pRegFrame->eflags, sel, pSelHidReg, pvAddr);
     346    DIS_SELREG enmPrefixSeg = DISDetectSegReg(pCpu, pParam);
     347    return SELMToFlat(pVM, enmPrefixSeg, pRegFrame, pvAddr);
    356348}
    357349
     
    639631
    640632            /* Convert address; don't bother checking limits etc, as we only read here */
    641             pStackVal = SELMToFlat(pVM, pRegFrame->eflags, pRegFrame->ss, &pRegFrame->ssHid, (RTGCPTR)pRegFrame->esp);
     633            pStackVal = SELMToFlat(pVM, DIS_SELREG_SS, pRegFrame, (RTGCPTR)pRegFrame->esp);
    642634            if (pStackVal == 0)
    643635                return VERR_EM_INTERPRETER;
     
    20372029
    20382030    Assert(pRegFrame->eflags.u32 & X86_EFL_IF);
    2039     Assert(pvFault == SELMToFlat(pVM, pRegFrame->eflags, pRegFrame->cs, &pRegFrame->csHid, (RTGCPTR)pRegFrame->eip));
     2031    Assert(pvFault == SELMToFlat(pVM, DIS_SELREG_CS, pRegFrame, (RTGCPTR)pRegFrame->eip));
    20402032
    20412033    pVM->em.s.GCPtrInhibitInterrupts = pRegFrame->eip + pCpu->opsize;
  • trunk/src/VBox/VMM/VMMAll/SELMAll.cpp

    r9659 r9675  
    5050 * @param   Addr    Address part.
    5151 */
    52 static RTGCPTR selmToFlat(PVM pVM, RTSEL Sel, RTGCPTR Addr)
     52SELMDECL(RTGCPTR) SELMToFlatBySel(PVM pVM, RTSEL Sel, RTGCPTR Addr)
    5353{
    5454    Assert(!CPUMAreHiddenSelRegsValid(pVM));
     
    8181 * @returns Flat address.
    8282 * @param   pVM         VM Handle.
    83  * @param   eflags      Current eflags
    84  * @param   Sel         Selector part.
    85  * @param   pHiddenSel  Hidden selector register
     83 * @param   SelReg      Selector register
     84 * @param   pCtxCore    CPU context
    8685 * @param   Addr        Address part.
    8786 */
    88 SELMDECL(RTGCPTR) SELMToFlat(PVM pVM, X86EFLAGS eflags, RTSEL Sel, CPUMSELREGHID *pHiddenSel, RTGCPTR Addr)
    89 {
    90     Assert(!CPUMIsGuestInLongMode(pVM));    /** @todo */
    91     Assert(pHiddenSel || !CPUMAreHiddenSelRegsValid(pVM));
    92 
    93    /*
    94     * Deal with real & v86 mode first.
    95     */
     87SELMDECL(RTGCPTR) SELMToFlat(PVM pVM, DIS_SELREG SelReg, PCPUMCTXCORE pCtxCore, RTGCPTR Addr)
     88{
     89    PCPUMSELREGHID pHiddenSel;
     90    RTSEL          Sel;
     91    int            rc;
     92
     93    rc = DISFetchRegSegEx(pCtxCore, SelReg, &Sel, &pHiddenSel); AssertRC(rc);
     94
     95    /*
     96     * Deal with real & v86 mode first.
     97     */
    9698    if (    CPUMIsGuestInRealMode(pVM)
    97         ||  eflags.Bits.u1VM)
     99        ||  pCtxCore->eflags.Bits.u1VM)
    98100    {
    99101        RTGCUINTPTR uFlat = (RTGCUINTPTR)Addr & 0xffff;
     
    108110    /** @todo when we're in 16 bits mode, we should cut off the address as well.. */
    109111    if (!CPUMAreHiddenSelRegsValid(pVM))
    110         return selmToFlat(pVM, Sel, Addr);
     112        return SELMToFlatBySel(pVM, Sel, Addr);
     113
     114    /* 64 bits mode: CS, DS, ES and SS are treated as if each segment base is 0 (Intel® 64 and IA-32 Architectures Software Developer's Manual: 3.4.2.1). */
     115    if (    CPUMIsGuestInLongMode(pVM)
     116        &&  pCtxCore->csHid.Attr.n.u1Long)
     117    {
     118        switch (SelReg)
     119        {
     120        case DIS_SELREG_FS:
     121            return (RTGCPTR)(CPUMGetGuestFSBASE(pVM) + Addr);
     122
     123        case DIS_SELREG_GS:
     124            return (RTGCPTR)(CPUMGetGuestGSBASE(pVM) + Addr);
     125
     126        default:
     127            return Addr;    /* base 0 */
     128        }
     129    }
    111130    return (RTGCPTR)(pHiddenSel->u64Base + (RTGCUINTPTR)Addr);
    112131}
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette