VirtualBox

Changeset 42453 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jul 30, 2012 3:23:18 PM (12 years ago)
Author:
vboxsync
Message:

IEM: Status code handling. PGM interface for R0 and RC.

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

Legend:

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

    r42437 r42453  
    657657
    658658/**
     659 * Sets the pass up status.
     660 *
     661 * @returns VINF_SUCCESS.
     662 * @param   pIemCpu             The per CPU IEM state of the calling thread.
     663 * @param   rcPassUp            The pass up status.  Must be informational.
     664 *                              VINF_SUCCESS is not allowed.
     665 */
     666static int iemSetPassUpStatus(PIEMCPU pIemCpu, VBOXSTRICTRC rcPassUp)
     667{
     668    AssertRC(VBOXSTRICTRC_VAL(rcPassUp)); Assert(rcPassUp != VINF_SUCCESS);
     669
     670    int32_t const rcOldPassUp = pIemCpu->rcPassUp;
     671    if (rcOldPassUp == VINF_SUCCESS)
     672        pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
     673    /* If both are EM scheduling code, use EM priority rules. */
     674    else if (   rcOldPassUp >= VINF_EM_FIRST && rcOldPassUp <= VINF_EM_LAST
     675             && rcPassUp    >= VINF_EM_FIRST && rcPassUp    <= VINF_EM_LAST)
     676    {
     677        if (rcPassUp < rcOldPassUp)
     678        {
     679            Log(("IEM: rcPassUp=%Rrc! rcOldPassUp=%Rrc\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp));
     680            pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
     681        }
     682        else
     683            Log(("IEM: rcPassUp=%Rrc  rcOldPassUp=%Rrc!\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp));
     684    }
     685    /* Override EM scheduling with specific status code. */
     686    else if (rcOldPassUp >= VINF_EM_FIRST && rcOldPassUp <= VINF_EM_LAST)
     687    {
     688        Log(("IEM: rcPassUp=%Rrc! rcOldPassUp=%Rrc\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp));
     689        pIemCpu->rcPassUp = VBOXSTRICTRC_VAL(rcPassUp);
     690    }
     691    /* Don't override specific status code, first come first served. */
     692    else
     693        Log(("IEM: rcPassUp=%Rrc  rcOldPassUp=%Rrc!\n", VBOXSTRICTRC_VAL(rcPassUp), rcOldPassUp));
     694    return VINF_SUCCESS;
     695}
     696
     697
     698/**
    659699 * Initializes the decoder state.
    660700 *
     
    688728    pIemCpu->cActiveMappings    = 0;
    689729    pIemCpu->iNextMapping       = 0;
     730    pIemCpu->rcPassUp           = VINF_SUCCESS;
    690731}
    691732
     
    802843    if (rc != VINF_SUCCESS)
    803844    {
    804         Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - read error - rc=%Rrc\n", GCPtrPC, rc));
     845        /** @todo status code handling */
     846        Log(("iemInitDecoderAndPrefetchOpcodes: %RGv - read error - rc=%Rrc (!!)\n", GCPtrPC, rc));
    805847        return rc;
    806848    }
     
    891933    if (rc != VINF_SUCCESS)
    892934    {
    893         Log(("iemOpcodeFetchMoreBytes: %RGv - read error - rc=%Rrc\n", GCPtrNext, rc));
     935        /** @todo status code handling */
     936        Log(("iemOpcodeFetchMoreBytes: %RGv - read error - rc=%Rrc (!!)\n", GCPtrNext, rc));
    894937        return rc;
    895938    }
     
    44864529#endif
    44874530
    4488     /*
    4489      * If we can map the page without trouble, do a block processing
    4490      * until the end of the current page.
    4491      */
    4492     /** @todo need some better API. */
    4493 #ifdef IN_RING3
    4494     RT_ZERO(*pLock);
    4495     return PGMR3PhysTlbGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu),
    4496                                   GCPhysMem,
    4497                                   RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE),
    4498                                   ppvMem);
    4499 #else
    4500     if (fAccess & IEM_ACCESS_TYPE_WRITE)
    4501         return PGMPhysGCPhys2CCPtr(IEMCPU_TO_VM(pIemCpu),
    4502                                    GCPhysMem,
    4503                                    ppvMem,
    4504                                    pLock);
    4505     return PGMPhysGCPhys2CCPtrReadOnly(IEMCPU_TO_VM(pIemCpu),
    4506                                        GCPhysMem,
    4507                                        (void const **)ppvMem,
    4508                                        pLock);
    4509 #endif
     4531    /** @todo This API may require some improving later.  A private deal with PGM
     4532     *        regarding locking and unlocking needs to be struct.  A couple of TLBs
     4533     *        living in PGM, but with publicly accessible inlined access methods
     4534     *        could perhaps be an even better solution. */
     4535    return PGMPhysIemGCPhys2Ptr(IEMCPU_TO_VM(pIemCpu),
     4536                                GCPhysMem,
     4537                                RT_BOOL(fAccess & IEM_ACCESS_TYPE_WRITE),
     4538                                pIemCpu->fByPassHandlers,
     4539                                ppvMem,
     4540                                pLock);
    45104541}
    45114542
     
    46324663                                              cbSecond);
    46334664        }
     4665        if (rc != VINF_SUCCESS)
     4666        {
     4667            /** @todo status code handling */
     4668            Log(("iemMemBounceBufferCommitAndUnmap: %s GCPhysFirst=%RGp/%#x GCPhysSecond=%RGp/%#x %Rrc (!!)\n",
     4669                 pIemCpu->fByPassHandlers ? "PGMPhysWrite" : "PGMPhysSimpleWriteGCPhys",
     4670                 pIemCpu->aMemBbMappings[iMemMap].GCPhysFirst, cbFirst,
     4671                 pIemCpu->aMemBbMappings[iMemMap].GCPhysSecond, cbSecond, rc));
     4672        }
    46344673    }
    46354674    else
     
    47164755            rc = PGMPhysRead(IEMCPU_TO_VM(pIemCpu), GCPhysFirst, pbBuf, cbFirstPage);
    47174756            if (rc != VINF_SUCCESS)
     4757            {
     4758                /** @todo status code handling */
     4759                Log(("iemMemBounceBufferMapPhys: PGMPhysRead GCPhysFirst=%RGp rc=%Rrc (!!)\n", GCPhysFirst, rc));
    47184760                return rc;
     4761            }
    47194762            rc = PGMPhysRead(IEMCPU_TO_VM(pIemCpu), GCPhysSecond, pbBuf + cbFirstPage, cbSecondPage);
    47204763            if (rc != VINF_SUCCESS)
     4764            {
     4765                /** @todo status code handling */
     4766                Log(("iemMemBounceBufferMapPhys: PGMPhysRead GCPhysSecond=%RGp rc=%Rrc (!!)\n", GCPhysSecond, rc));
    47214767                return rc;
     4768            }
    47224769        }
    47234770        else
     
    47254772            rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), pbBuf, GCPhysFirst, cbFirstPage);
    47264773            if (rc != VINF_SUCCESS)
     4774            {
     4775                /** @todo status code handling */
     4776                Log(("iemMemBounceBufferMapPhys: PGMPhysSimpleReadGCPhys GCPhysFirst=%RGp rc=%Rrc (!!)\n", GCPhysFirst, rc));
    47274777                return rc;
     4778            }
    47284779            rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), pbBuf + cbFirstPage, GCPhysSecond, cbSecondPage);
    47294780            if (rc != VINF_SUCCESS)
     4781            {
     4782                /** @todo status code handling */
     4783                Log(("iemMemBounceBufferMapPhys: PGMPhysSimpleReadGCPhys GCPhysSecond=%RGp rc=%Rrc (!!)\n", GCPhysSecond, rc));
    47304784                return rc;
     4785            }
    47314786        }
    47324787
     
    48204875                rc = PGMPhysSimpleReadGCPhys(IEMCPU_TO_VM(pIemCpu), pbBuf, GCPhysFirst, cbMem);
    48214876            if (rc != VINF_SUCCESS)
     4877            {
     4878                /** @todo status code handling */
     4879                Log(("iemMemBounceBufferMapPhys: %s GCPhysFirst=%RGp rc=%Rrc (!!)\n",
     4880                     pIemCpu->fByPassHandlers ? "PGMPhysRead" : "PGMPhysSimpleReadGCPhys",  GCPhysFirst, rc));
    48224881                return rc;
     4882            }
    48234883        }
    48244884
     
    78907950    }
    78917951
     7952    /*
     7953     * Return value fiddling and statistics.
     7954     */
    78927955    if (rcStrict != VINF_SUCCESS)
    78937956    {
    7894         if (rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED)
     7957        if (RT_SUCCESS(rcStrict))
     7958        {
     7959            AssertMsg(rcStrict >= VINF_EM_FIRST && rcStrict <= VINF_EM_LAST, ("rcStrict=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     7960            int32_t const rcPassUp = pIemCpu->rcPassUp;
     7961            if (rcPassUp == VINF_SUCCESS)
     7962                pIemCpu->cRetInfStatuses++;
     7963            else if (   rcPassUp < VINF_EM_FIRST
     7964                     || rcPassUp > VINF_EM_LAST
     7965                     || rcPassUp < VBOXSTRICTRC_VAL(rcStrict))
     7966            {
     7967                Log(("IEM: rcPassUp=%Rrc! rcStrict=%Rrc\n", rcPassUp, VBOXSTRICTRC_VAL(rcStrict)));
     7968                pIemCpu->cRetPassUpStatus++;
     7969                rcStrict = rcPassUp;
     7970            }
     7971            else
     7972            {
     7973                Log(("IEM: rcPassUp=%Rrc  rcStrict=%Rrc!\n", rcPassUp, VBOXSTRICTRC_VAL(rcStrict)));
     7974                pIemCpu->cRetInfStatuses++;
     7975            }
     7976        }
     7977        else if (rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED)
    78957978            pIemCpu->cRetAspectNotImplemented++;
    78967979        else if (rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED)
    78977980            pIemCpu->cRetInstrNotImplemented++;
    7898         else if (RT_SUCCESS(rcStrict))
    7899             pIemCpu->cRetInfStatuses++;
    79007981        else
    79017982            pIemCpu->cRetErrStatuses++;
     7983    }
     7984    else if (pIemCpu->rcPassUp != VINF_SUCCESS)
     7985    {
     7986        pIemCpu->cRetPassUpStatus++;
     7987        rcStrict = pIemCpu->rcPassUp;
    79027988    }
    79037989
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h

    r42437 r42453  
    26372637    {
    26382638        if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    2639             rcStrict = CPUMSetGuestIDTR(IEMCPU_TO_VMCPU(pIemCpu), GCPtrBase, cbLimit);
     2639            CPUMSetGuestIDTR(IEMCPU_TO_VMCPU(pIemCpu), GCPtrBase, cbLimit);
    26402640        else
    26412641        {
     
    26442644            pCtx->idtr.pIdt  = GCPtrBase;
    26452645        }
    2646         if (rcStrict == VINF_SUCCESS)
    2647             iemRegAddToRip(pIemCpu, cbInstr);
     2646        iemRegAddToRip(pIemCpu, cbInstr);
    26482647    }
    26492648    return rcStrict;
     
    30013000             */
    30023001            if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    3003             {
    3004                 rc = CPUMSetGuestCR0(pVCpu, uNewCrX);
    3005                 AssertRCSuccessReturn(rc, RT_FAILURE_NP(rc) ? rc : VERR_INTERNAL_ERROR_3);
    3006             }
     3002                CPUMSetGuestCR0(pVCpu, uNewCrX);
    30073003            else
    30083004                pCtx->cr0 = uNewCrX;
     
    30413037                }
    30423038                rcStrict = PGMChangeMode(pVCpu, pCtx->cr0, pCtx->cr4, pCtx->msrEFER);
    3043                 /** @todo Status code management.  */
    30443039            }
    30453040            else
     
    31073102                    AssertRCReturn(rc, rc);
    31083103                    /* ignore informational status codes */
    3109                     /** @todo status code management */
    31103104                }
    31113105            }
     
    31203114        case 4:
    31213115        {
    3122             uint64_t const uOldCrX = pCtx->cr0;
     3116            uint64_t const uOldCrX = pCtx->cr4;
    31233117
    31243118            /* reserved bits */
     
    31683162                /* SELM - VME may change things wrt to the TSS shadowing. */
    31693163                if ((uNewCrX ^ uOldCrX) & X86_CR4_VME)
     3164                {
     3165                    Log(("iemCImpl_load_CrX: VME %d -> %d => Setting VMCPU_FF_SELM_SYNC_TSS\n",
     3166                         RT_BOOL(uOldCrX & X86_CR4_VME), RT_BOOL(uNewCrX & X86_CR4_VME) ));
    31703167                    VMCPU_FF_SET(pVCpu, VMCPU_FF_SELM_SYNC_TSS);
     3168                }
    31713169
    31723170                /* PGM - flushing and mode. */
     
    31793177                }
    31803178                rcStrict = PGMChangeMode(pVCpu, pCtx->cr0, pCtx->cr4, pCtx->msrEFER);
    3181                 /** @todo Status code management.  */
    31823179            }
    31833180            else
     
    32023199     * Advance the RIP on success.
    32033200     */
    3204     /** @todo Status code management.  */
    3205     if (rcStrict == VINF_SUCCESS)
     3201    if (RT_SUCCESS(rcStrict))
     3202    {
     3203        if (rcStrict != VINF_SUCCESS)
     3204            rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
    32063205        iemRegAddToRip(pIemCpu, cbInstr);
     3206    }
     3207
    32073208    return rcStrict;
    3208 
    32093209}
    32103210
     
    34503450    iemRegAddToRip(pIemCpu, cbInstr);
    34513451
    3452     if (   rc == VINF_SUCCESS
    3453         || rc == VINF_PGM_SYNC_CR3)
     3452    if (rc == VINF_SUCCESS)
    34543453        return VINF_SUCCESS;
     3454    if (rc == VINF_PGM_SYNC_CR3)
     3455        return iemSetPassUpStatus(pIemCpu, rc);
     3456
     3457    AssertMsg(rc == VINF_EM_RAW_EMULATE_INSTR || RT_FAILURE_NP(rc), ("%Rrc\n", rc));
    34553458    Log(("PGMInvalidatePage(%RGv) -> %Rrc\n", rc));
    34563459    return rc;
     
    35633566        iemRegAddToRip(pIemCpu, cbInstr);
    35643567        pIemCpu->cPotentialExits++;
    3565     }
    3566     /** @todo massage rcStrict. */
     3568        if (rcStrict != VINF_SUCCESS)
     3569            rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     3570    }
     3571
    35673572    return rcStrict;
    35683573}
     
    36123617        default: AssertFailedReturn(VERR_INTERNAL_ERROR_3);
    36133618    }
    3614     VBOXSTRICTRC rc;
     3619    VBOXSTRICTRC rcStrict;
    36153620    if (!IEM_VERIFICATION_ENABLED(pIemCpu))
    3616         rc = IOMIOPortWrite(IEMCPU_TO_VM(pIemCpu), u16Port, u32Value, cbReg);
     3621        rcStrict = IOMIOPortWrite(IEMCPU_TO_VM(pIemCpu), u16Port, u32Value, cbReg);
    36173622    else
    3618         rc = iemVerifyFakeIOPortWrite(pIemCpu, u16Port, u32Value, cbReg);
    3619     if (IOM_SUCCESS(rc))
     3623        rcStrict = iemVerifyFakeIOPortWrite(pIemCpu, u16Port, u32Value, cbReg);
     3624    if (IOM_SUCCESS(rcStrict))
    36203625    {
    36213626        iemRegAddToRip(pIemCpu, cbInstr);
    36223627        pIemCpu->cPotentialExits++;
    3623         /** @todo massage rc. */
    3624     }
    3625     return rc;
     3628        if (rcStrict != VINF_SUCCESS)
     3629            rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
     3630    }
     3631    return rcStrict;
    36263632}
    36273633
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h

    r42193 r42453  
    55
    66/*
    7  * Copyright (C) 2011 Oracle Corporation
     7 * Copyright (C) 2011-2012 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    11241124                    if (rcStrict != VINF_SUCCESS)
    11251125                    {
    1126                         /** @todo massage rc */
     1126                        if (IOM_SUCCESS(rcStrict))
     1127                            rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
    11271128                        if (uCounterReg == 0)
    11281129                            iemRegAddToRip(pIemCpu, cbInstr);
     
    11791180            if (rcStrict != VINF_SUCCESS)
    11801181            {
    1181                 /** @todo massage IOM status codes! */
     1182                if (IOM_SUCCESS(rcStrict))
     1183                    rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
    11821184                if (uCounterReg == 0)
    11831185                    iemRegAddToRip(pIemCpu, cbInstr);
     
    12281230                pCtx->ADDR_rSI -= OP_SIZE / 8;
    12291231            iemRegAddToRip(pIemCpu, cbInstr);
    1230             /** @todo massage IOM status codes. */
     1232            if (rcStrict != VINF_SUCCESS)
     1233                rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
    12311234        }
    12321235    }
     
    13241327                    if (rcStrict != VINF_SUCCESS)
    13251328                    {
    1326                         /** @todo massage IOM rc */
     1329                        if (IOM_SUCCESS(rcStrict))
     1330                            rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
    13271331                        if (uCounterReg == 0)
    13281332                            iemRegAddToRip(pIemCpu, cbInstr);
     
    13731377            if (rcStrict != VINF_SUCCESS)
    13741378            {
    1375                 /** @todo massage IOM status codes! */
     1379                if (IOM_SUCCESS(rcStrict))
     1380                    rcStrict = iemSetPassUpStatus(pIemCpu, rcStrict);
    13761381                if (uCounterReg == 0)
    13771382                    iemRegAddToRip(pIemCpu, cbInstr);
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r42186 r42453  
    40024002}
    40034003
     4004
     4005
     4006
     4007/**
     4008 * Converts a GC physical address to a HC ring-3 pointer, with some
     4009 * additional checks.
     4010 *
     4011 * @returns VBox status code.
     4012 * @retval  VINF_SUCCESS on success.
     4013 * @retval  VINF_PGM_PHYS_TLB_CATCH_WRITE and *ppv set if the page has a write
     4014 *          access handler of some kind.
     4015 * @retval  VERR_PGM_PHYS_TLB_CATCH_ALL if the page has a handler catching all
     4016 *          accesses or is odd in any way.
     4017 * @retval  VERR_PGM_PHYS_TLB_UNASSIGNED if the page doesn't exist.
     4018 *
     4019 * @param   pVM         Pointer to the VM.
     4020 * @param   GCPhys      The GC physical address to convert.  Since this is only
     4021 *                      used for filling the REM TLB, the A20 mask must be
     4022 *                      applied before calling this API.
     4023 * @param   fWritable   Whether write access is required.
     4024 * @param   ppv         Where to store the pointer corresponding to GCPhys on
     4025 *                      success.
     4026 * @param   pLock
     4027 *
     4028 * @remarks This is more or a less a copy of PGMR3PhysTlbGCPhys2Ptr.
     4029 */
     4030VMM_INT_DECL(int) PGMPhysIemGCPhys2Ptr(PVM pVM, RTGCPHYS GCPhys, bool fWritable, bool fByPassHandlers,
     4031                                       void **ppv, PPGMPAGEMAPLOCK pLock)
     4032{
     4033    pgmLock(pVM);
     4034    PGM_A20_ASSERT_MASKED(VMMGetCpu(pVM), GCPhys);
     4035
     4036    PPGMRAMRANGE pRam;
     4037    PPGMPAGE pPage;
     4038    int rc = pgmPhysGetPageAndRangeEx(pVM, GCPhys, &pPage, &pRam);
     4039    if (RT_SUCCESS(rc))
     4040    {
     4041        if (PGM_PAGE_IS_BALLOONED(pPage))
     4042            rc = VINF_PGM_PHYS_TLB_CATCH_WRITE;
     4043        else if (   !PGM_PAGE_HAS_ANY_HANDLERS(pPage)
     4044                 || (fByPassHandlers && !PGM_PAGE_IS_MMIO(pPage)) )
     4045            rc = VINF_SUCCESS;
     4046        else
     4047        {
     4048            if (PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage)) /* catches MMIO */
     4049            {
     4050                Assert(!fByPassHandlers || PGM_PAGE_IS_MMIO(pPage));
     4051                rc = VERR_PGM_PHYS_TLB_CATCH_ALL;
     4052            }
     4053            else if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && fWritable)
     4054            {
     4055                Assert(!fByPassHandlers);
     4056                rc = VINF_PGM_PHYS_TLB_CATCH_WRITE;
     4057            }
     4058        }
     4059        if (RT_SUCCESS(rc))
     4060        {
     4061            int rc2;
     4062
     4063            /* Make sure what we return is writable. */
     4064            if (fWritable)
     4065                switch (PGM_PAGE_GET_STATE(pPage))
     4066                {
     4067                    case PGM_PAGE_STATE_ALLOCATED:
     4068                        break;
     4069                    case PGM_PAGE_STATE_BALLOONED:
     4070                        AssertFailed();
     4071                        break;
     4072                    case PGM_PAGE_STATE_ZERO:
     4073                    case PGM_PAGE_STATE_SHARED:
     4074                        if (rc == VINF_PGM_PHYS_TLB_CATCH_WRITE)
     4075                            break;
     4076                    case PGM_PAGE_STATE_WRITE_MONITORED:
     4077                        rc2 = pgmPhysPageMakeWritable(pVM, pPage, GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK);
     4078                        AssertLogRelRCReturn(rc2, rc2);
     4079                        break;
     4080                }
     4081
     4082#if defined(IN_RC) || defined(VBOX_WITH_2X_4GB_ADDR_SPACE_IN_R0)
     4083            PVMCPU pVCpu = VMMGetCpu(pVM);
     4084            void *pv;
     4085            rc = pgmRZDynMapHCPageInlined(pVCpu,
     4086                                          PGM_PAGE_GET_HCPHYS(pPage),
     4087                                          &pv
     4088                                          RTLOG_COMMA_SRC_POS);
     4089            if (RT_FAILURE(rc))
     4090                return rc;
     4091            *ppv = (void *)((uintptr_t)pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK));
     4092            pLock->pvPage = pv;
     4093            pLock->pVCpu  = pVCpu;
     4094
     4095#else
     4096            /* Get a ring-3 mapping of the address. */
     4097            PPGMPAGER3MAPTLBE pTlbe;
     4098            rc2 = pgmPhysPageQueryTlbeWithPage(pVM, pPage, GCPhys, &pTlbe);
     4099            AssertLogRelRCReturn(rc2, rc2);
     4100
     4101            /* Lock it and calculate the address. */
     4102            if (fWritable)
     4103                pgmPhysPageMapLockForWriting(pVM, pPage, pTlbe, pLock);
     4104            else
     4105                pgmPhysPageMapLockForReading(pVM, pPage, pTlbe, pLock);
     4106            *ppv = (void *)((uintptr_t)pTlbe->pv | (uintptr_t)(GCPhys & PAGE_OFFSET_MASK));
     4107#endif
     4108
     4109
     4110            Log6(("PGMPhysIemGCPhys2Ptr: GCPhys=%RGp rc=%Rrc pPage=%R[pgmpage] *ppv=%p\n", GCPhys, rc, pPage, *ppv));
     4111        }
     4112        else
     4113            Log6(("PGMPhysIemGCPhys2Ptr: GCPhys=%RGp rc=%Rrc pPage=%R[pgmpage]\n", GCPhys, rc, pPage));
     4114
     4115        /* else: handler catching all access, no pointer returned. */
     4116    }
     4117    else
     4118        rc = VERR_PGM_PHYS_TLB_UNASSIGNED;
     4119
     4120    pgmUnlock(pVM);
     4121    return rc;
     4122}
     4123
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r42437 r42453  
    221221    /** The current CPU execution mode (CS). */
    222222    IEMMODE                 enmCpuMode;
     223    /** Info status code that needs to be propagated to the IEM caller.
     224     * This cannot be passed internally, as it would complicate all success
     225     * checks within the interpreter making the code larger and almost impossible
     226     * to get right.  Instead, we'll store status codes to pass on here.  Each
     227     * source of these codes will perform appropriate sanity checks. */
     228    int32_t                 rcPassUp;
    223229
    224230    /** @name Statistics
     
    239245    /** Counts other error statuses returned. */
    240246    uint32_t                cRetErrStatuses;
     247    /** Number of times rcPassUp has been used. */
     248    uint32_t                cRetPassUpStatus;
    241249#ifdef IEM_VERIFICATION_MODE
    242250    /** The Number of I/O port reads that has been performed. */
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