VirtualBox

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


Ignore:
Timestamp:
Sep 26, 2007 9:03:00 AM (17 years ago)
Author:
vboxsync
Message:

GC phys/virt to HC virt functions are no longer accessible in our PDM interface.
Rewrote disassembly functions to use the mapping functions.

Code that runs in EMT (like CSAM/PATM) can still use the old conversion functions. Easier to use
and (far) less overhead.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/CPUM.cpp

    r4958 r5040  
    15141514    /** Pointer to the current page - GC Ptr. */
    15151515    RTGCPTR         pvPageGC;
     1516    /** The lock information that PGMPhysReleasePageMappingLock needs. */
     1517    PGMPAGEMAPLOCK  pageMapLock;
    15161518} CPUMDISASSTATE, *PCPUMDISASSTATE;
    15171519
     
    15521554            }
    15531555            else
    1554                 rc = PGMPhysGCPtr2HCPtr(pState->pVM, pState->pvPageGC, &pState->pvPageHC);
     1556            {
     1557                /* Release mapping lock previously acquired. */
     1558                if (PGMPhysIsPageMappingLockValid(pState->pVM, &pState->pageMapLock))
     1559                    PGMPhysReleasePageMappingLock(pState->pVM, &pState->pageMapLock);
     1560
     1561                rc = PGMPhysGCPtr2CCPtrReadOnly(pState->pVM, pState->pvPageGC, &pState->pvPageHC, &pState->pageMapLock);
     1562            }
    15551563            if (VBOX_FAILURE(rc))
    15561564            {
     
    16741682            Log(("%s", szOutput));
    16751683#endif
    1676         return VINF_SUCCESS;
    1677     }
    1678 
    1679     Log(("CPUMR3DisasmInstrCPU: DISInstr failed for %04X:%VGv rc=%Vrc\n", pCtx->cs, GCPtrPC, rc));
     1684        rc = VINF_SUCCESS;
     1685    }
     1686    else
     1687        Log(("CPUMR3DisasmInstrCPU: DISInstr failed for %04X:%VGv rc=%Vrc\n", pCtx->cs, GCPtrPC, rc));
     1688
     1689    /* Release mapping lock acquired in cpumR3DisasInstrRead. */
     1690    if (PGMPhysIsPageMappingLockValid(pVM, &State.pageMapLock))
     1691        PGMPhysReleasePageMappingLock(pVM, &State.pageMapLock);
     1692
    16801693    return rc;
    16811694}
  • trunk/src/VBox/VMM/DBGFDisas.cpp

    r4953 r5040  
    6767    /** Pointer to the next instruction (relative to GCPtrSegBase). */
    6868    RTGCUINTPTR     GCPtrNext;
     69    /** The lock information that PGMPhysReleasePageMappingLock needs. */
     70    PGMPAGEMAPLOCK  pageMapLock;
    6971} DBGFDISASSTATE, *PDBGFDISASSTATE;
    7072
     
    9597    uint32_t cbInstr;
    9698    int rc = DISInstr(&pState->Cpu, GCPtr, 0, &cbInstr, NULL);
     99
     100    /* Release mapping lock acquired in dbgfR3DisasInstrRead */
     101    if (PGMPhysIsPageMappingLockValid(pVM, &pState->pageMapLock))
     102        PGMPhysReleasePageMappingLock(pVM, &pState->pageMapLock);
     103
    97104    if (VBOX_SUCCESS(rc))
    98105    {
     
    159166                    rc = VERR_INVALID_POINTER;
    160167            }
    161             else if (pState->enmMode <= PGMMODE_PROTECTED)
    162                 rc = PGMPhysGCPhys2HCPtr(pState->pVM, pState->pvPageGC, PAGE_SIZE, &pState->pvPageHC);
    163             else
    164                 rc = PGMPhysGCPtr2HCPtr(pState->pVM, pState->pvPageGC, &pState->pvPageHC);
     168            else
     169            {
     170                if (PGMPhysIsPageMappingLockValid(pState->pVM, &pState->pageMapLock))
     171                    PGMPhysReleasePageMappingLock(pState->pVM, &pState->pageMapLock);
     172
     173                if (pState->enmMode <= PGMMODE_PROTECTED)
     174                    rc = PGMPhysGCPhys2CCPtrReadOnly(pState->pVM, pState->pvPageGC, &pState->pvPageHC, &pState->pageMapLock);
     175                else
     176                    rc = PGMPhysGCPtr2CCPtrReadOnly(pState->pVM, pState->pvPageGC, &pState->pvPageHC, &pState->pageMapLock);
     177            }
    165178            if (VBOX_FAILURE(rc))
    166179            {
     
    539552        rc = dbgfR3DisasInstrRead(GCPtr, pau8Bits, cbBits, &State);
    540553        AssertRC(rc);
     554
     555        /* Release mapping lock acquired in dbgfR3DisasInstrRead */
     556        if (PGMPhysIsPageMappingLockValid(pVM, &State.pageMapLock))
     557            PGMPhysReleasePageMappingLock(pVM, &State.pageMapLock);
     558
    541559        if (fFlags & DBGF_DISAS_FLAGS_NO_ADDRESS)
    542560            RTStrPrintf(pszOutput, cchOutput, "%.*Vhxs%*s %s",
  • trunk/src/VBox/VMM/PDMDevice.cpp

    r4787 r5040  
    143143static DECLCALLBACK(int) pdmR3DevHlp_PhysWriteGCVirt(PPDMDEVINS pDevIns, RTGCPTR GCVirtDst, const void *pvSrc, size_t cb);
    144144static DECLCALLBACK(int) pdmR3DevHlp_PhysReserve(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, const char *pszDesc);
    145 static DECLCALLBACK(int) pdmR3DevHlp_Phys2HCVirt(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR ppvHC);
    146145static DECLCALLBACK(int) pdmR3DevHlp_PhysGCPtr2GCPhys(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTGCPHYS pGCPhys);
    147 static DECLCALLBACK(int) pdmR3DevHlp_PhysGCPtr2HCPtr(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTHCPTR pHCPtr);
    148146static DECLCALLBACK(bool) pdmR3DevHlp_A20IsEnabled(PPDMDEVINS pDevIns);
    149147static DECLCALLBACK(void) pdmR3DevHlp_A20Set(PPDMDEVINS pDevIns, bool fEnable);
     
    177175static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_PhysWriteGCVirt(PPDMDEVINS pDevIns, RTGCPTR GCVirtDst, const void *pvSrc, size_t cb);
    178176static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_PhysReserve(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, const char *pszDesc);
    179 static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_Phys2HCVirt(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR ppvHC);
    180 static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_PhysGCPtr2HCPtr(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTHCPTR pHCPtr);
     177static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_Obsolete_Phys2HCVirt(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR ppvHC);
     178static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_Obsolete_PhysGCPtr2HCPtr(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTHCPTR pHCPtr);
     179
    181180static DECLCALLBACK(bool) pdmR3DevHlp_Untrusted_A20IsEnabled(PPDMDEVINS pDevIns);
    182181static DECLCALLBACK(void) pdmR3DevHlp_Untrusted_A20Set(PPDMDEVINS pDevIns, bool fEnable);
     
    341340    pdmR3DevHlp_PhysWriteGCVirt,
    342341    pdmR3DevHlp_PhysReserve,
    343     pdmR3DevHlp_Phys2HCVirt,
    344     pdmR3DevHlp_PhysGCPtr2HCPtr,
     342    pdmR3DevHlp_Untrusted_Obsolete_Phys2HCVirt,
     343    pdmR3DevHlp_Untrusted_Obsolete_PhysGCPtr2HCPtr,
    345344    pdmR3DevHlp_A20IsEnabled,
    346345    pdmR3DevHlp_A20Set,
     
    430429    pdmR3DevHlp_Untrusted_PhysWriteGCVirt,
    431430    pdmR3DevHlp_Untrusted_PhysReserve,
    432     pdmR3DevHlp_Untrusted_Phys2HCVirt,
    433     pdmR3DevHlp_Untrusted_PhysGCPtr2HCPtr,
     431    pdmR3DevHlp_Untrusted_Obsolete_Phys2HCVirt,
     432    pdmR3DevHlp_Untrusted_Obsolete_PhysGCPtr2HCPtr,
    434433    pdmR3DevHlp_Untrusted_A20IsEnabled,
    435434    pdmR3DevHlp_Untrusted_A20Set,
     
    32683267}
    32693268
    3270 
    3271 /** @copydoc PDMDEVHLP::pfnPhys2HCVirt */
    3272 static DECLCALLBACK(int) pdmR3DevHlp_Phys2HCVirt(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR ppvHC)
    3273 {
    3274     PDMDEV_ASSERT_DEVINS(pDevIns);
    3275     PVM pVM = pDevIns->Internal.s.pVMHC;
    3276     VM_ASSERT_EMT(pVM);
    3277     LogFlow(("pdmR3DevHlp_Phys2HCVirt: caller='%s'/%d: GCPhys=%VGp cbRange=%#x ppvHC=%p\n",
    3278              pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPhys, cbRange, ppvHC));
    3279 
    3280     if (!VM_IS_EMT(pVM))
    3281         return VERR_ACCESS_DENIED;
    3282 
    3283     int rc = PGMPhysGCPhys2HCPtr(pVM, GCPhys, cbRange, ppvHC);
    3284 
    3285     LogFlow(("pdmR3DevHlp_Phys2HCVirt: caller='%s'/%d: returns %Vrc *ppvHC=%p\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc, *ppvHC));
    3286 
    3287     return rc;
    3288 }
    3289 
    3290 
    3291 /** @copydoc PDMDEVHLP::pfnPhysGCPtr2HCPtr */
    3292 static DECLCALLBACK(int) pdmR3DevHlp_PhysGCPtr2HCPtr(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTHCPTR pHCPtr)
    3293 {
    3294     PDMDEV_ASSERT_DEVINS(pDevIns);
    3295     PVM pVM = pDevIns->Internal.s.pVMHC;
    3296     VM_ASSERT_EMT(pVM);
    3297     LogFlow(("pdmR3DevHlp_PhysGCPtr2HCPtr: caller='%s'/%d: GCPtr=%VGv pHCPtr=%p\n",
    3298              pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, GCPtr, pHCPtr));
    3299 
    3300     if (!VM_IS_EMT(pVM))
    3301         return VERR_ACCESS_DENIED;
    3302 
    3303     int rc = PGMPhysGCPtr2HCPtr(pVM, GCPtr, pHCPtr);
    3304 
    3305     LogFlow(("pdmR3DevHlp_PhysGCPtr2HCPtr: caller='%s'/%d: returns %Vrc *pHCPtr=%p\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc, *pHCPtr));
    3306 
    3307     return rc;
    3308 }
    3309 
    33103269/** @copydoc PDMDEVHLP::pfnPhysGCPtr2GCPhys */
    33113270static DECLCALLBACK(int) pdmR3DevHlp_PhysGCPtr2GCPhys(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTGCPHYS pGCPhys)
     
    37693728
    37703729/** @copydoc PDMDEVHLP::pfnPhys2HCVirt */
    3771 static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_Phys2HCVirt(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR ppvHC)
     3730static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_Obsolete_Phys2HCVirt(PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR ppvHC)
    37723731{
    37733732    PDMDEV_ASSERT_DEVINS(pDevIns);
     
    37813740
    37823741/** @copydoc PDMDEVHLP::pfnPhysGCPtr2HCPtr */
    3783 static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_PhysGCPtr2HCPtr(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTHCPTR pHCPtr)
     3742static DECLCALLBACK(int) pdmR3DevHlp_Untrusted_Obsolete_PhysGCPtr2HCPtr(PPDMDEVINS pDevIns, RTGCPTR GCPtr, PRTHCPTR pHCPtr)
    37843743{
    37853744    PDMDEV_ASSERT_DEVINS(pDevIns);
     
    37893748    return VERR_ACCESS_DENIED;
    37903749}
    3791 
    37923750
    37933751/** @copydoc PDMDEVHLP::pfnA20IsEnabled */
  • trunk/src/VBox/VMM/PGMInternal.h

    r5017 r5040  
    30933093}
    30943094
    3095 
    3096 #if 0
    3097 /** Soon to be obsolete conversion functions */
    3098 
    3099 /**
    3100  * Converts a GC physical address to a HC pointer.
    3101  *
    3102  * @returns VINF_SUCCESS on success.
    3103  * @returns VERR_PGM_PHYS_PAGE_RESERVED it it's a valid GC physical
    3104  *          page but has no physical backing.
    3105  * @returns VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS if it's not a valid
    3106  *          GC physical address.
    3107  * @param   pVM     The VM handle.
    3108  * @param   GCPhys  The GC physical address to convert.
    3109  * @param   cbRange Physical range
    3110  * @param   pHCPtr  Where to store the HC pointer on success.
    3111  */
    3112 PGMDECL(int) PGMPhysGCPhys2HCPtr(PVM pVM, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR pHCPtr);
    3113 
    3114 /**
    3115  * Converts a guest pointer to a HC pointer.
    3116  *
    3117  * This uses the current CR3/CR0/CR4 of the guest.
    3118  *
    3119  * @returns VBox status code.
    3120  * @param   pVM         The VM Handle
    3121  * @param   GCPtr       The guest pointer to convert.
    3122  * @param   pHCPtr      Where to store the HC virtual address.
    3123  */
    3124 PGMDECL(int) PGMPhysGCPtr2HCPtr(PVM pVM, RTGCPTR GCPtr, PRTHCPTR pHCPtr);
    3125 
    3126 /**
    3127  * Converts a guest virtual address to a HC pointer by specfied CR3 and flags.
    3128  *
    3129  * @returns VBox status code.
    3130  * @param   pVM         The VM Handle
    3131  * @param   GCPtr       The guest pointer to convert.
    3132  * @param   cr3         The guest CR3.
    3133  * @param   fFlags      Flags used for interpreting the PD correctly: X86_CR4_PSE and X86_CR4_PAE
    3134  * @param   pHCPtr      Where to store the HC pointer.
    3135  *
    3136  * @remark  This function is used by the REM at a time where PGM could
    3137  *          potentially not be in sync. It could also be used by a
    3138  *          future DBGF API to cpu state independent conversions.
    3139  */
    3140 PGMDECL(int) PGMPhysGCPtr2HCPtrByGstCR3(PVM pVM, RTGCPTR GCPtr, uint32_t cr3, unsigned fFlags, PRTHCPTR pHCPtr);
    3141 #endif
    3142 
    31433095/** @} */
    31443096
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r4811 r5040  
    759759PGMDECL(int) PGMPhysGCPhys2HCPtr(PVM pVM, RTGCPHYS GCPhys, RTUINT cbRange, PRTHCPTR pHCPtr)
    760760{
     761#ifdef NEW_PHYS_CODE
     762    VM_ASSERT_EMT(pVM); /* no longer safe for use outside the EMT thread! */
     763#endif
     764
    761765#ifdef PGM_DYNAMIC_RAM_ALLOC
    762766    if ((GCPhys & PGM_DYNAMIC_CHUNK_BASE_MASK) != ((GCPhys+cbRange-1) & PGM_DYNAMIC_CHUNK_BASE_MASK))
     
    850854PGMDECL(int) PGMPhysGCPtr2HCPtr(PVM pVM, RTGCPTR GCPtr, PRTHCPTR pHCPtr)
    851855{
     856#ifdef NEW_PHYS_CODE
     857    VM_ASSERT_EMT(pVM); /* no longer safe for use outside the EMT thread! */
     858#endif
     859
    852860    RTGCPHYS GCPhys;
    853861    int rc = PGM_GST_PFN(GetPage,pVM)(pVM, (RTGCUINTPTR)GCPtr, NULL, &GCPhys);
     
    874882PGMDECL(int) PGMPhysGCPtr2HCPtrByGstCR3(PVM pVM, RTGCPTR GCPtr, uint32_t cr3, unsigned fFlags, PRTHCPTR pHCPtr)
    875883{
     884#ifdef NEW_PHYS_CODE
     885    VM_ASSERT_EMT(pVM); /* no longer safe for use outside the EMT thread! */
     886#endif
    876887    /*
    877888     * PAE or 32-bit?
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