VirtualBox

Changeset 42193 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Jul 17, 2012 2:34:30 PM (13 years ago)
Author:
vboxsync
Message:

IEM: Integration work...

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r42188 r42193  
    7878
    7979
    80 #if defined(VBOX_WITH_RAW_MODE) && !defined(IN_RING0)
    81 
     80#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    8281
    8382/**
     
    156155}
    157156
    158 #endif
     157#endif /* VBOX_WITH_RAW_MODE_NOT_R0 */
    159158
    160159
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r42165 r42193  
    7777#define LOG_GROUP   LOG_GROUP_IEM
    7878#include <VBox/vmm/iem.h>
     79#include <VBox/vmm/cpum.h>
    7980#include <VBox/vmm/pgm.h>
    8081#include <internal/pgm.h>
     
    8384#include <VBox/vmm/tm.h>
    8485#include <VBox/vmm/dbgf.h>
     86#ifdef VBOX_WITH_RAW_MODE_NOT_R0
     87# include <VBox/vmm/patm.h>
     88#endif
    8589#ifdef IEM_VERIFICATION_MODE
    8690# include <VBox/vmm/rem.h>
     
    629633    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
    630634
     635#ifdef VBOX_WITH_RAW_MODE_NOT_R0
    631636    CPUMGuestLazyLoadHiddenCsAndSs(IEMCPU_TO_VMCPU(pIemCpu));
     637#endif
    632638    pIemCpu->uCpl               = CPUMGetGuestCPL(IEMCPU_TO_VMCPU(pIemCpu));
    633639    IEMMODE enmMode = CPUMIsGuestIn64BitCodeEx(pCtx)
     
    697703    if (RT_FAILURE(rc))
    698704    {
     705#if defined(IN_RC) && defined(VBOX_WITH_RAW_MODE)
     706        /* Allow interpretation of patch manager code blocks since they can for
     707           instance throw #PFs for perfectly good reasons. */
     708        if (   (pCtx->cs.Sel & X86_SEL_RPL) == 1
     709            && PATMIsPatchGCAddr(IEMCPU_TO_VM(pIemCpu), GCPtrPC))
     710        {
     711            uint32_t cbLeftOnPage = PAGE_SIZE - (GCPtrPC & PAGE_OFFSET_MASK);
     712            if (cbToTryRead > cbLeftOnPage)
     713                cbToTryRead = cbLeftOnPage;
     714            if (cbToTryRead > sizeof(pIemCpu->abOpcode))
     715                cbToTryRead = sizeof(pIemCpu->abOpcode);
     716            memcpy(pIemCpu->abOpcode, (void const *)(uintptr_t)GCPtrPC, cbToTryRead);
     717            pIemCpu->cbOpcode = cbToTryRead;
     718            return VINF_SUCCESS;
     719        }
     720#endif
    699721        Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - rc=%Rrc\n", GCPtrPC, rc));
    700722        return iemRaisePageFault(pIemCpu, GCPtrPC, IEM_ACCESS_INSTRUCTION, rc);
     
    26442666 * @param   iSegReg             The segment register.
    26452667 */
    2646 static PCPUMSELREGHID iemSRegGetHid(PIEMCPU pIemCpu, uint8_t iSegReg)
    2647 {
    2648     PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     2668static PCPUMSELREG iemSRegGetHid(PIEMCPU pIemCpu, uint8_t iSegReg)
     2669{
     2670    PCPUMCTX    pCtx = pIemCpu->CTX_SUFF(pCtx);
     2671    PCPUMSELREG pSReg;
    26492672    switch (iSegReg)
    26502673    {
    2651         case X86_SREG_ES: return &pCtx->es;
    2652         case X86_SREG_CS: return &pCtx->cs;
    2653         case X86_SREG_SS: return &pCtx->ss;
    2654         case X86_SREG_DS: return &pCtx->ds;
    2655         case X86_SREG_FS: return &pCtx->fs;
    2656         case X86_SREG_GS: return &pCtx->gs;
    2657     }
    2658     AssertFailedReturn(NULL);
     2674        case X86_SREG_ES: pSReg = &pCtx->es; break;
     2675        case X86_SREG_CS: pSReg = &pCtx->cs; break;
     2676        case X86_SREG_SS: pSReg = &pCtx->ss; break;
     2677        case X86_SREG_DS: pSReg = &pCtx->ds; break;
     2678        case X86_SREG_FS: pSReg = &pCtx->fs; break;
     2679        case X86_SREG_GS: pSReg = &pCtx->gs; break;
     2680        default:
     2681            AssertFailedReturn(NULL);
     2682    }
     2683#ifdef VBOX_WITH_RAW_MODE_NOT_R0
     2684    if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pSReg))
     2685        CPUMGuestLazyLoadHiddenSelectorReg(IEMCPU_TO_VMCPU(pIemCpu), pSReg);
     2686#else
     2687    Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pSReg));
     2688#endif
     2689    return pSReg;
    26592690}
    26602691
     
    44084439 * @param   fAccess             The intended access.
    44094440 * @param   ppvMem              Where to return the mapping address.
    4410  */
    4411 static int iemMemPageMap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, void **ppvMem)
     4441 * @param   pLock               The PGM lock.
     4442 */
     4443static int iemMemPageMap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, void **ppvMem, PPGMPAGEMAPLOCK pLock)
    44124444{
    44134445#ifdef IEM_VERIFICATION_MODE
     
    44234455    /** @todo need some better API. */
    44244456#ifdef IN_RING3
     4457    RT_ZERO(*pLock);
    44254458    return PGMR3PhysTlbGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu),
    44264459                                  GCPhysMem,
     
    44284461                                  ppvMem);
    44294462#else
    4430 //# error "Implement me"
    44314463    if (fAccess & IEM_ACCESS_TYPE_WRITE)
    44324464        return PGMPhysGCPhys2CCPtr(IEMCPU_TO_VM(pIemCpu),
    44334465                                   GCPhysMem,
    44344466                                   ppvMem,
    4435                                    /** @todo pLock */ NULL);
     4467                                   pLock);
    44364468    return PGMPhysGCPhys2CCPtrReadOnly(IEMCPU_TO_VM(pIemCpu),
    44374469                                       GCPhysMem,
    44384470                                       (void const **)ppvMem,
    4439                                        /** @todo pLock */ NULL);
     4471                                       pLock);
    44404472#endif
    44414473}
     
    44514483 * @param   fAccess             The intended access.
    44524484 * @param   pvMem               What iemMemPageMap returned.
    4453  */
    4454 DECLINLINE(void) iemMemPageUnmap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, const void *pvMem)
     4485 * @param   pLock               The PGM lock.
     4486 */
     4487DECLINLINE(void) iemMemPageUnmap(PIEMCPU pIemCpu, RTGCPHYS GCPhysMem, uint32_t fAccess, const void *pvMem, PPGMPAGEMAPLOCK pLock)
    44554488{
    44564489    NOREF(pIemCpu);
     
    44584491    NOREF(fAccess);
    44594492    NOREF(pvMem);
     4493#ifndef IN_RING3
     4494    PGMPhysReleasePageMappingLock(IEMCPU_TO_VM(pIemCpu), pLock);
     4495#endif
    44604496}
    44614497
     
    48574893
    48584894    void *pvMem;
    4859     rcStrict = iemMemPageMap(pIemCpu, GCPhysFirst, fAccess, &pvMem);
     4895    rcStrict = iemMemPageMap(pIemCpu, GCPhysFirst, fAccess, &pvMem, &pIemCpu->aMemMappingLocks[iMemMap].Lock);
    48604896    if (rcStrict != VINF_SUCCESS)
    48614897        return iemMemBounceBufferMapPhys(pIemCpu, iMemMap, ppvMem, cbMem, GCPhysFirst, fAccess, rcStrict);
     
    48964932        == (IEM_ACCESS_BOUNCE_BUFFERED | IEM_ACCESS_TYPE_WRITE))
    48974933        return iemMemBounceBufferCommitAndUnmap(pIemCpu, iMemMap);
     4934
     4935#ifndef IN_RING3
     4936    /* Unlock it. */
     4937    PGMPhysReleasePageMappingLock(IEMCPU_TO_VM(pIemCpu), &pIemCpu->aMemMappingLocks[iMemMap].Lock);
     4938#endif
    48984939
    48994940    /* Free the entry. */
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r41906 r42193  
    130130             * until the end of the current page.
    131131             */
     132            PGMPAGEMAPLOCK PgLockSrc2Mem;
    132133            OP_TYPE const *puSrc2Mem;
    133             rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem);
     134            rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem, &PgLockSrc2Mem);
    134135            if (rcStrict == VINF_SUCCESS)
    135136            {
     137                PGMPAGEMAPLOCK PgLockSrc1Mem;
    136138                OP_TYPE const *puSrc1Mem;
    137                 rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem);
     139                rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem, &PgLockSrc1Mem);
    138140                if (rcStrict == VINF_SUCCESS)
    139141                {
     
    168170                    pCtx->eflags.u = uEFlags;
    169171
    170                     iemMemPageUnmap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem);
    171                     iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem);
     172                    iemMemPageUnmap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
     173                    iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    172174                    continue;
    173175                }
    174176            }
    175             iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem);
     177            iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    176178        }
    177179
     
    288290             */
    289291            OP_TYPE const *puSrc2Mem;
    290             rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem);
     292            PGMPAGEMAPLOCK PgLockSrc2Mem;
     293            rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, (void **)&puSrc2Mem, &PgLockSrc2Mem);
    291294            if (rcStrict == VINF_SUCCESS)
    292295            {
    293296                OP_TYPE const *puSrc1Mem;
    294                 rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem);
     297                PGMPAGEMAPLOCK PgLockSrc1Mem;
     298                rcStrict = iemMemPageMap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, (void **)&puSrc1Mem, &PgLockSrc1Mem);
    295299                if (rcStrict == VINF_SUCCESS)
    296300                {
     
    325329                    pCtx->eflags.u = uEFlags;
    326330
    327                     iemMemPageUnmap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem);
    328                     iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem);
     331                    iemMemPageUnmap(pIemCpu, GCPhysSrc1Mem, IEM_ACCESS_DATA_R, puSrc1Mem, &PgLockSrc1Mem);
     332                    iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    329333                    continue;
    330334                }
    331                 iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem);
     335                iemMemPageUnmap(pIemCpu, GCPhysSrc2Mem, IEM_ACCESS_DATA_R, puSrc2Mem, &PgLockSrc2Mem);
    332336            }
    333337        }
     
    427431             * until the end of the current page.
    428432             */
     433            PGMPAGEMAPLOCK PgLockMem;
    429434            OP_TYPE const *puMem;
    430             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem);
     435            rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    431436            if (rcStrict == VINF_SUCCESS)
    432437            {
     
    447452                pCtx->eflags.u = uEFlags;
    448453                Assert(!(uEFlags & X86_EFL_ZF) == (i < cLeftPage));
    449                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem);
     454                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    450455                if (fQuit)
    451456                    break;
     
    551556             * until the end of the current page.
    552557             */
     558            PGMPAGEMAPLOCK PgLockMem;
    553559            OP_TYPE const *puMem;
    554             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem);
     560            rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    555561            if (rcStrict == VINF_SUCCESS)
    556562            {
     
    571577                pCtx->eflags.u = uEFlags;
    572578                Assert((!(uEFlags & X86_EFL_ZF) != (i < cLeftPage)) || (i == cLeftPage));
    573                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem);
     579                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    574580                if (fQuit)
    575581                    break;
     
    693699             * until the end of the current page.
    694700             */
     701            PGMPAGEMAPLOCK PgLockDstMem;
    695702            OP_TYPE *puDstMem;
    696             rcStrict = iemMemPageMap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, (void **)&puDstMem);
     703            rcStrict = iemMemPageMap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, (void **)&puDstMem, &PgLockDstMem);
    697704            if (rcStrict == VINF_SUCCESS)
    698705            {
     706                PGMPAGEMAPLOCK PgLockSrcMem;
    699707                OP_TYPE const *puSrcMem;
    700                 rcStrict = iemMemPageMap(pIemCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, (void **)&puSrcMem);
     708                rcStrict = iemMemPageMap(pIemCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, (void **)&puSrcMem, &PgLockSrcMem);
    701709                if (rcStrict == VINF_SUCCESS)
    702710                {
     
    709717                    pCtx->ADDR_rCX = uCounterReg -= cLeftPage;
    710718
    711                     iemMemPageUnmap(pIemCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, puSrcMem);
    712                     iemMemPageUnmap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem);
     719                    iemMemPageUnmap(pIemCpu, GCPhysSrcMem, IEM_ACCESS_DATA_R, puSrcMem, &PgLockSrcMem);
     720                    iemMemPageUnmap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem, &PgLockDstMem);
    713721                    continue;
    714722                }
    715                 iemMemPageUnmap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem);
     723                iemMemPageUnmap(pIemCpu, GCPhysDstMem, IEM_ACCESS_DATA_W, puDstMem, &PgLockDstMem);
    716724            }
    717725        }
     
    805813             * until the end of the current page.
    806814             */
     815            PGMPAGEMAPLOCK PgLockMem;
    807816            OP_TYPE *puMem;
    808             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem);
     817            rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem, &PgLockMem);
    809818            if (rcStrict == VINF_SUCCESS)
    810819            {
     
    823832#endif
    824833
    825                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem);
     834                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem);
    826835
    827836                /* If unaligned, we drop thru and do the page crossing access
     
    917926             * just reading the last value on the page.
    918927             */
     928            PGMPAGEMAPLOCK PgLockMem;
    919929            OP_TYPE const *puMem;
    920             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem);
     930            rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    921931            if (rcStrict == VINF_SUCCESS)
    922932            {
     
    929939                pCtx->ADDR_rCX = uCounterReg -= cLeftPage;
    930940                pCtx->ADDR_rSI = uAddrReg    += cLeftPage * cbIncr;
    931                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem);
     941                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    932942
    933943                /* If unaligned, we drop thru and do the page crossing access
     
    10931103             *        mapped buffers instead of leaving those bits to the
    10941104             *        device implementation? */
     1105            PGMPAGEMAPLOCK PgLockMem;
    10951106            OP_TYPE *puMem;
    1096             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem);
     1107            rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, (void **)&puMem, &PgLockMem);
    10971108            if (rcStrict == VINF_SUCCESS)
    10981109            {
     
    11161127                        if (uCounterReg == 0)
    11171128                            iemRegAddToRip(pIemCpu, cbInstr);
    1118                         iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem);
     1129                        iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem);
    11191130                        return rcStrict;
    11201131                    }
    11211132                    off++;
    11221133                }
    1123                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem);
     1134                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_W, puMem, &PgLockMem);
    11241135
    11251136                /* If unaligned, we drop thru and do the page crossing access
     
    12931304             *        mapped buffers instead of leaving those bits to the
    12941305             *        device implementation? */
     1306            PGMPAGEMAPLOCK PgLockMem;
    12951307            OP_TYPE const *puMem;
    1296             rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem);
     1308            rcStrict = iemMemPageMap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, (void **)&puMem, &PgLockMem);
    12971309            if (rcStrict == VINF_SUCCESS)
    12981310            {
     
    13151327                        if (uCounterReg == 0)
    13161328                            iemRegAddToRip(pIemCpu, cbInstr);
    1317                         iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem);
     1329                        iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    13181330                        return rcStrict;
    13191331                    }
    13201332                    off++;
    13211333                }
    1322                 iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem);
     1334                iemMemPageUnmap(pIemCpu, GCPhysMem, IEM_ACCESS_DATA_R, puMem, &PgLockMem);
    13231335
    13241336                /* If unaligned, we drop thru and do the page crossing access
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r41829 r42193  
    310310#endif
    311311    } aMemMappings[3];
     312
     313    /** Locking records for the mapped memory. */
     314    union
     315    {
     316        PGMPAGEMAPLOCK      Lock;
     317        uint64_t            au64Padding[2];
     318    } aMemMappingLocks[3];
    312319
    313320    /** Bounce buffer info.
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