VirtualBox

Ignore:
Timestamp:
Jun 26, 2015 2:21:23 PM (9 years ago)
Author:
vboxsync
Message:

iomMmioCommonPfHandler: Deal with IEM failure.

File:
1 edited

Legend:

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

    r56640 r56660  
    16621662
    16631663/**
    1664  * \#PF Handler callback for MMIO ranges.
     1664 * Common worker for the \#PF handler and IOMMMIOPhysHandler (APIC+VT-x).
    16651665 *
    16661666 * @returns VBox status code (appropriate for GC return).
     
    16731673 * @param   pvUser      Pointer to the MMIO ring-3 range entry.
    16741674 */
    1675 static VBOXSTRICTRC iomMMIOHandler(PVM pVM, PVMCPU pVCpu, uint32_t uErrorCode, PCPUMCTXCORE pCtxCore, RTGCPHYS GCPhysFault, void *pvUser)
     1675static VBOXSTRICTRC iomMmioCommonPfHandler(PVM pVM, PVMCPU pVCpu, uint32_t uErrorCode, PCPUMCTXCORE pCtxCore,
     1676                                           RTGCPHYS GCPhysFault, void *pvUser)
    16761677{
    16771678    int rc = IOM_LOCK_SHARED(pVM);
     
    16831684
    16841685    STAM_PROFILE_START(&pVM->iom.s.StatRZMMIOHandler, a);
    1685     Log(("iomMMIOHandler: GCPhys=%RGp uErr=%#x rip=%RGv\n", GCPhysFault, uErrorCode, (RTGCPTR)pCtxCore->rip));
     1686    Log(("iomMmioCommonPfHandler: GCPhys=%RGp uErr=%#x rip=%RGv\n", GCPhysFault, uErrorCode, (RTGCPTR)pCtxCore->rip));
    16861687
    16871688    PIOMMMIORANGE pRange = (PIOMMMIORANGE)pvUser;
     
    17591760    PDMCritSectLeave(pDevIns->CTX_SUFF(pCritSectRo));
    17601761    iomMmioReleaseRange(pVM, pRange);
     1762    if (RT_SUCCESS(rcStrict))
     1763        return rcStrict;
     1764    if (   rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED
     1765        || rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED)
     1766    {
     1767        Log(("IOM: Hit unsupported IEM feature!\n"));
     1768        rcStrict = VINF_EM_RAW_EMULATE_INSTR;
     1769    }
    17611770    return rcStrict;
    17621771
     
    19231932    LogFlow(("iomMmioPfHandler: GCPhys=%RGp uErr=%#x pvFault=%RGv rip=%RGv\n",
    19241933             GCPhysFault, (uint32_t)uErrorCode, pvFault, (RTGCPTR)pCtxCore->rip));
    1925     return iomMMIOHandler(pVM, pVCpu, (uint32_t)uErrorCode, pCtxCore, GCPhysFault, pvUser);
     1934    return iomMmioCommonPfHandler(pVM, pVCpu, (uint32_t)uErrorCode, pCtxCore, GCPhysFault, pvUser);
    19261935}
    19271936
     
    19561965    IOM_UNLOCK_SHARED(pVM);
    19571966
    1958     VBOXSTRICTRC rcStrict = iomMMIOHandler(pVM, pVCpu, (uint32_t)uErrorCode, pCtxCore, GCPhysFault, pRange);
     1967    VBOXSTRICTRC rcStrict = iomMmioCommonPfHandler(pVM, pVCpu, (uint32_t)uErrorCode, pCtxCore, GCPhysFault, pRange);
    19591968
    19601969    iomMmioReleaseRange(pVM, pRange);
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