VirtualBox

Changeset 20408 in vbox


Ignore:
Timestamp:
Jun 8, 2009 1:50:06 PM (16 years ago)
Author:
vboxsync
Message:

Moved REM locking to VMMAll

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/em.h

    r20399 r20408  
    166166/** @} */
    167167
     168/** @name REM locking routines
     169 * @{ */
     170VMMDECL(void)       EMRemUnlock(PVM pVM);
     171VMMDECL(void)       EMRemLock(PVM pVM);
     172VMMDECL(bool)       EMRemIsLockOwner(PVM pVM);
     173VMMDECL(int)        EMTryEnterRemLock(PVM pVM);
     174/** @} */
     175
    168176#ifdef IN_RING3
    169177/** @defgroup grp_em_r3     The EM Host Context Ring-3 API
     
    183191
    184192VMMR3DECL(void)     EMR3ReleaseOwnedLocks(PVM pVM);
    185 VMMR3DECL(void)     EMR3RemUnlock(PVM pVM);
    186 VMMR3DECL(void)     EMR3RemLock(PVM pVM);
    187 VMMR3DECL(bool)     EMR3RemIsLockOwner(PVM pVM);
    188193
    189194/**
  • trunk/src/VBox/VMM/EM.cpp

    r20406 r20408  
    863863
    864864/**
    865  * Locks REM execution to a single VCpu
    866  *
    867  * @param   pVM         VM handle.
    868  */
    869 VMMR3DECL(void) EMR3RemLock(PVM pVM)
    870 {
    871     if (!PDMCritSectIsInitialized(&pVM->em.s.CritSectREM))
    872         return;     /* early init */
    873 
    874     int rc = PDMCritSectEnter(&pVM->em.s.CritSectREM, VERR_SEM_BUSY);
    875     AssertMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc));
    876 }
    877 
    878 /**
    879  * Unlocks REM execution
    880  *
    881  * @param   pVM         VM handle.
    882  */
    883 VMMR3DECL(void) EMR3RemUnlock(PVM pVM)
    884 {
    885     if (!PDMCritSectIsInitialized(&pVM->em.s.CritSectREM))
    886         return;     /* early init */
    887 
    888     PDMCritSectLeave(&pVM->em.s.CritSectREM);
    889 }
    890 
    891 /**
    892  * Check if this VCPU currently owns the REM lock.
    893  *
    894  * @returns bool owner/not owner
    895  * @param   pVM         The VM to operate on.
    896  */
    897 VMMR3DECL(bool) EMR3RemIsLockOwner(PVM pVM)
    898 {
    899     return PDMCritSectIsOwner(&pVM->em.s.CritSectREM);
    900 }
    901 
    902 /**
    903865 * Steps recompiled code.
    904866 *
     
    913875    LogFlow(("emR3RemStep: cs:eip=%04x:%08x\n", CPUMGetGuestCS(pVCpu),  CPUMGetGuestEIP(pVCpu)));
    914876
    915     EMR3RemLock(pVM);
     877    EMRemLock(pVM);
    916878
    917879    /*
     
    924886        REMR3StateBack(pVM, pVCpu);
    925887    }
    926     EMR3RemUnlock(pVM);
     888    EMRemUnlock(pVM);
    927889
    928890    LogFlow(("emR3RemStep: returns %Rrc cs:eip=%04x:%08x\n", rc, CPUMGetGuestCS(pVCpu),  CPUMGetGuestEIP(pVCpu)));
     
    966928
    967929    /* Big lock, but you are not supposed to own any lock when coming in here. */
    968     EMR3RemLock(pVM);
     930    EMRemLock(pVM);
    969931
    970932    /*
     
    10891051        STAM_PROFILE_STOP(&pVCpu->em.s.StatREMSync, e);
    10901052    }
    1091     EMR3RemUnlock(pVM);
     1053    EMRemUnlock(pVM);
    10921054
    10931055    STAM_REL_PROFILE_ADV_STOP(&pVCpu->em.s.StatREMTotal, a);
     
    14941456    STAM_PROFILE_START(&pVCpu->em.s.StatREMEmu, a);
    14951457    Log(("EMINS: %04x:%RGv RSP=%RGv\n", pCtx->cs, (RTGCPTR)pCtx->rip, (RTGCPTR)pCtx->rsp));
    1496     EMR3RemLock(pVM);
     1458    EMRemLock(pVM);
    14971459    /* Flush the recompiler TLB if the VCPU has changed. */
    14981460    if (pVM->em.s.idLastRemCpu != pVCpu->idCpu)
     
    15011463
    15021464    rc = REMR3EmulateInstruction(pVM, pVCpu);
    1503     EMR3RemUnlock(pVM);
     1465    EMRemUnlock(pVM);
    15041466    STAM_PROFILE_STOP(&pVCpu->em.s.StatREMEmu, a);
    15051467
     
    34533415        if (VM_FF_IS_PENDING_EXCEPT(pVM, VM_FF_REM_HANDLER_NOTIFY, VM_FF_PGM_NO_MEMORY))
    34543416        {
    3455             EMR3RemLock(pVM);
     3417            EMRemLock(pVM);
    34563418            REMR3ReplayHandlerNotifications(pVM);
    3457             EMR3RemUnlock(pVM);
     3419            EMRemUnlock(pVM);
    34583420        }
    34593421
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r20406 r20408  
    33573357}
    33583358
     3359/**
     3360 * Locks REM execution to a single VCpu
     3361 *
     3362 * @param   pVM         VM handle.
     3363 */
     3364VMMDECL(void) EMRemLock(PVM pVM)
     3365{
     3366    if (!PDMCritSectIsInitialized(&pVM->em.s.CritSectREM))
     3367        return;     /* early init */
     3368
     3369    int rc = PDMCritSectEnter(&pVM->em.s.CritSectREM, VERR_SEM_BUSY);
     3370    AssertMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc));
     3371}
     3372
     3373/**
     3374 * Unlocks REM execution
     3375 *
     3376 * @param   pVM         VM handle.
     3377 */
     3378VMMDECL(void) EMRemUnlock(PVM pVM)
     3379{
     3380    if (!PDMCritSectIsInitialized(&pVM->em.s.CritSectREM))
     3381        return;     /* early init */
     3382
     3383    PDMCritSectLeave(&pVM->em.s.CritSectREM);
     3384}
     3385
     3386/**
     3387 * Check if this VCPU currently owns the REM lock.
     3388 *
     3389 * @returns bool owner/not owner
     3390 * @param   pVM         The VM to operate on.
     3391 */
     3392VMMDECL(bool) EMRemIsLockOwner(PVM pVM)
     3393{
     3394    return PDMCritSectIsOwner(&pVM->em.s.CritSectREM);
     3395}
     3396
     3397/**
     3398 * Try to acquire the REM lock.
     3399 *
     3400 * @returns VBox status code
     3401 * @param   pVM         The VM to operate on.
     3402 */
     3403VMMDECL(int) EMTryEnterRemLock(PVM pVM)
     3404{
     3405    return PDMCritSectTryEnter(&pVM->em.s.CritSectREM);
     3406}
     3407
  • trunk/src/recompiler/VBoxREMWrapper.cpp

    r20406 r20408  
    11051105    { "DISInstr",                               (void *)(uintptr_t)&DISInstr,                       &g_aArgsDISInstr[0],                        RT_ELEMENTS(g_aArgsDISInstr),                          REMFNDESC_FLAGS_RET_INT,    sizeof(bool),       NULL },
    11061106    { "EMR3FatalError",                         (void *)(uintptr_t)&EMR3FatalError,                 &g_aArgsEMR3FatalError[0],                  RT_ELEMENTS(g_aArgsEMR3FatalError),                    REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    1107     { "EMR3RemLock",                            (void *)(uintptr_t)&EMR3RemLock,                    &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    1108     { "EMR3RemUnlock",                          (void *)(uintptr_t)&EMR3RemUnlock,                  &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    1109     { "EMR3RemIsLockOwner",                     (void *)(uintptr_t)&EMR3RemIsLockOwner,             &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   sizeof(bool),       NULL },
     1107    { "EMRemLock",                              (void *)(uintptr_t)&EMRemLock,                      &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
     1108    { "EMRemUnlock",                            (void *)(uintptr_t)&EMRemUnlock,                    &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
     1109    { "EMRemIsLockOwner",                       (void *)(uintptr_t)&EMRemIsLockOwner,               &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   sizeof(bool),       NULL },
    11101110    { "HWACCMR3CanExecuteGuest",                (void *)(uintptr_t)&HWACCMR3CanExecuteGuest,        &g_aArgsHWACCMR3CanExecuteGuest[0],         RT_ELEMENTS(g_aArgsHWACCMR3CanExecuteGuest),           REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    11111111    { "IOMIOPortRead",                          (void *)(uintptr_t)&IOMIOPortRead,                  &g_aArgsIOMIOPortRead[0],                   RT_ELEMENTS(g_aArgsIOMIOPortRead),                     REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
  • trunk/src/recompiler/VBoxRecompiler.c

    r20406 r20408  
    26932693REMR3DECL(void) REMR3ReplayHandlerNotifications(PVM pVM)
    26942694{
    2695     Assert(EMR3RemIsLockOwner(pVM));
     2695    Assert(EMRemIsLockOwner(pVM));
    26962696
    26972697    /*
     
    28102810#ifdef VBOX_WITH_REM_LOCKING
    28112811    Assert(!PGMIsLockOwner(pVM));
    2812     EMR3RemLock(pVM);
     2812    EMRemLock(pVM);
    28132813#endif
    28142814    /*
     
    28342834    pVM->rem.s.fIgnoreAll = false;
    28352835#ifdef VBOX_WITH_REM_LOCKING
    2836     EMR3RemUnlock(pVM);
     2836    EMRemUnlock(pVM);
    28372837#endif
    28382838}
     
    28632863
    28642864#ifdef VBOX_WITH_REM_LOCKING
    2865     EMR3RemLock(pVM);
     2865    EMRemLock(pVM);
    28662866#endif
    28672867    /*
     
    28762876    pVM->rem.s.fIgnoreAll = false;
    28772877#ifdef VBOX_WITH_REM_LOCKING
    2878     EMR3RemUnlock(pVM);
     2878    EMRemUnlock(pVM);
    28792879#endif
    28802880}
     
    29012901
    29022902#ifdef VBOX_WITH_REM_LOCKING
    2903     EMR3RemLock(pVM);
     2903    EMRemLock(pVM);
    29042904#endif
    29052905    /*
     
    29142914    pVM->rem.s.fIgnoreAll = false;
    29152915#ifdef VBOX_WITH_REM_LOCKING
    2916     EMR3RemUnlock(pVM);
     2916    EMRemUnlock(pVM);
    29172917#endif
    29182918}
     
    29402940
    29412941#ifdef VBOX_WITH_REM_LOCKING
    2942     EMR3RemLock(pVM);
     2942    EMRemLock(pVM);
    29432943#endif
    29442944    if (pVM->rem.s.cHandlerNotifications)
     
    29562956    pVM->rem.s.fIgnoreAll = false;
    29572957#ifdef VBOX_WITH_REM_LOCKING
    2958     EMR3RemUnlock(pVM);
     2958    EMRemUnlock(pVM);
    29592959#endif
    29602960}
     
    29782978
    29792979#ifdef VBOX_WITH_REM_LOCKING
    2980     EMR3RemLock(pVM);
     2980    EMRemLock(pVM);
    29812981#endif
    29822982    if (pVM->rem.s.cHandlerNotifications)
     
    30073007    pVM->rem.s.fIgnoreAll = false;
    30083008#ifdef VBOX_WITH_REM_LOCKING
    3009     EMR3RemUnlock(pVM);
     3009    EMRemUnlock(pVM);
    30103010#endif
    30113011}
     
    30313031
    30323032#ifdef VBOX_WITH_REM_LOCKING
    3033     EMR3RemLock(pVM);
     3033    EMRemLock(pVM);
    30343034#endif
    30353035    if (pVM->rem.s.cHandlerNotifications)
     
    30653065    }
    30663066#ifdef VBOX_WITH_REM_LOCKING
    3067     EMR3RemUnlock(pVM);
     3067    EMRemUnlock(pVM);
    30683068#endif
    30693069}
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