VirtualBox

Changeset 23910 in vbox for trunk/src/VBox/Devices/VMMDev


Ignore:
Timestamp:
Oct 20, 2009 3:54:50 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53712
Message:

Properly protect VMM device from concurrent access (guest SMP).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/VMMDev/VMMDev.cpp

    r23016 r23910  
    206206}
    207207
    208 static void vmmdevCtlGuestFilterMask_EMT (VMMDevState *pVMMDevState,
    209                                           uint32_t u32OrMask,
    210                                           uint32_t u32NotMask)
    211 {
     208void VMMDevCtlSetGuestFilterMask (VMMDevState *pVMMDevState,
     209                                  uint32_t u32OrMask,
     210                                  uint32_t u32NotMask)
     211{
     212    PDMCritSectEnter(&pVMMDevState->CritSect, VERR_SEM_BUSY);
     213
    212214    const bool fHadEvents =
    213215        (pVMMDevState->u32HostEventFlags & pVMMDevState->u32GuestFilterMask) != 0;
    214216
    215     Log(("vmmdevCtlGuestFilterMask_EMT: u32OrMask = 0x%08X, u32NotMask = 0x%08X, fHadEvents = %d.\n", u32OrMask, u32NotMask, fHadEvents));
     217    Log(("VMMDevCtlSetGuestFilterMask: u32OrMask = 0x%08X, u32NotMask = 0x%08X, fHadEvents = %d.\n", u32OrMask, u32NotMask, fHadEvents));
    216218    if (fHadEvents)
    217219    {
     
    229231        vmmdevMaybeSetIRQ_EMT (pVMMDevState);
    230232    }
    231 }
    232 
    233 void VMMDevCtlSetGuestFilterMask (VMMDevState *pVMMDevState,
    234                                   uint32_t u32OrMask,
    235                                   uint32_t u32NotMask)
     233    PDMCritSectLeave(&pVMMDevState->CritSect);
     234}
     235
     236void VMMDevNotifyGuest (VMMDevState *pVMMDevState, uint32_t u32EventMask)
    236237{
    237238    PPDMDEVINS pDevIns = VMMDEVSTATE_2_DEVINS(pVMMDevState);
    238     PVM pVM = PDMDevHlpGetVM(pDevIns);
    239 
    240     Log(("VMMDevCtlSetGuestFilterMask: u32OrMask = 0x%08X, u32NotMask = 0x%08X.\n", u32OrMask, u32NotMask));
    241 
    242     if (VM_IS_EMT(pVM))
    243     {
    244         vmmdevCtlGuestFilterMask_EMT (pVMMDevState, u32OrMask, u32NotMask);
    245     }
    246     else
    247     {
    248         int rc = VMR3ReqCallVoidWait (pVM, VMCPUID_ANY, (PFNRT) vmmdevCtlGuestFilterMask_EMT,
    249                                       3, pVMMDevState, u32OrMask, u32NotMask);
    250         AssertReleaseRC (rc);
    251     }
    252 }
    253 
    254 void VMMDevNotifyGuest (VMMDevState *pVMMDevState, uint32_t u32EventMask)
    255 {
    256     PPDMDEVINS pDevIns = VMMDEVSTATE_2_DEVINS(pVMMDevState);
    257     PVM pVM = PDMDevHlpGetVM(pDevIns);
    258     int rc;
    259239
    260240    Log3(("VMMDevNotifyGuest: u32EventMask = 0x%08X.\n", u32EventMask));
     
    266246        return;
    267247
     248    PDMCritSectEnter(&pVMMDevState->CritSect, VERR_SEM_BUSY);
    268249    /* No need to wait for the completion of this request. It is a notification
    269250     * about something, which has already happened.
    270251     */
    271     rc = VMR3ReqCallVoidNoWait(pVM, VMCPUID_ANY, (PFNRT)vmmdevNotifyGuest_EMT, 2, pVMMDevState, u32EventMask);
    272     AssertRC(rc);
     252    vmmdevNotifyGuest_EMT(pVMMDevState, u32EventMask);
     253    PDMCritSectLeave(&pVMMDevState->CritSect);
    273254}
    274255
     
    10561037                 * cannot disable these notifications.
    10571038                 */
    1058                 vmmdevCtlGuestFilterMask_EMT (pThis,
    1059                                               pCtlMaskRequest->u32OrMask,
    1060                                               pCtlMaskRequest->u32NotMask & ~VMMDEV_EVENT_HGCM);
     1039                VMMDevCtlSetGuestFilterMask (pThis,
     1040                                             pCtlMaskRequest->u32OrMask,
     1041                                             pCtlMaskRequest->u32NotMask & ~VMMDEV_EVENT_HGCM);
    10611042                pRequestHeader->rc = VINF_SUCCESS;
    10621043
     
    18541835{
    18551836    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     1837    AssertCompile(sizeof(pThis->mouseXAbs) == sizeof(*pAbsX));
     1838    AssertCompile(sizeof(pThis->mouseYAbs) == sizeof(*pAbsY));
    18561839    if (pAbsX)
    1857         *pAbsX = pThis->mouseXAbs;
     1840        ASMAtomicReadSize(&pThis->mouseXAbs, pAbsX);
    18581841    if (pAbsY)
    1859         *pAbsY = pThis->mouseYAbs;
     1842        ASMAtomicReadSize(&pThis->mouseYAbs, pAbsY);
    18601843    return VINF_SUCCESS;
    18611844}
     
    18711854{
    18721855    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     1856    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
     1857
    18731858    if ((pThis->mouseXAbs == absX) && (pThis->mouseYAbs == absY))
     1859    {
     1860        PDMCritSectLeave(&pThis->CritSect);
    18741861        return VINF_SUCCESS;
     1862    }
    18751863    Log2(("vmmdevSetAbsoluteMouse: settings absolute position to x = %d, y = %d\n", absX, absY));
    18761864    pThis->mouseXAbs = absX;
    18771865    pThis->mouseYAbs = absY;
    18781866    VMMDevNotifyGuest (pThis, VMMDEV_EVENT_MOUSE_POSITION_CHANGED);
     1867    PDMCritSectLeave(&pThis->CritSect);
    18791868    return VINF_SUCCESS;
    18801869}
     
    19041893{
    19051894    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     1895    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    19061896
    19071897    bool bCapsChanged = ((capabilities & VMMDEV_MOUSE_HOST_CAN_ABSOLUTE)
     
    19231913        VMMDevNotifyGuest (pThis, VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED);
    19241914
     1915    PDMCritSectLeave(&pThis->CritSect);
    19251916    return VINF_SUCCESS;
    19261917}
     
    19301921{
    19311922    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     1923    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    19321924
    19331925    /* Verify that the new resolution is different and that guest does not yet know about it. */
     
    19611953    }
    19621954
     1955    PDMCritSectLeave(&pThis->CritSect);
    19631956    return VINF_SUCCESS;
    19641957}
     
    19671960{
    19681961    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     1962    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    19691963
    19701964    /* Verify that the new resolution is different and that guest does not yet know about it. */
     
    19821976    }
    19831977
     1978    PDMCritSectLeave(&pThis->CritSect);
    19841979    return VINF_SUCCESS;
    19851980}
     
    19881983{
    19891984    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     1985    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    19901986
    19911987    /* Verify that the new resolution is different and that guest does not yet know about it. */
     
    20031999    }
    20042000
     2001    PDMCritSectLeave(&pThis->CritSect);
    20052002    return VINF_SUCCESS;
    20062003}
     
    20092006{
    20102007    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     2008    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    20112009
    20122010    bool fSame = (pThis->fVRDPEnabled == fVRDPEnabled);
     
    20222020    }
    20232021
     2022    PDMCritSectLeave(&pThis->CritSect);
    20242023    return VINF_SUCCESS;
    20252024}
     
    20282027{
    20292028    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     2029    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    20302030
    20312031    /* Verify that the new resolution is different and that guest does not yet know about it. */
     
    20432043    }
    20442044
     2045    PDMCritSectLeave(&pThis->CritSect);
    20452046    return VINF_SUCCESS;
    20462047}
     
    20522053{
    20532054    VMMDevState *pThis = IVMMDEVPORT_2_VMMDEVSTATE(pInterface);
     2055    int          rc = VINF_SUCCESS;
     2056
     2057    PDMCritSectEnter(&pThis->CritSect, VERR_SEM_BUSY);
    20542058
    20552059    /* logon mode? */
     
    20732077    }
    20742078    else
    2075         return VERR_INVALID_PARAMETER;
    2076 
    2077     return VINF_SUCCESS;
     2079        rc = VERR_INVALID_PARAMETER;
     2080
     2081    PDMCritSectLeave(&pThis->CritSect);
     2082    return rc;
    20782083}
    20792084
     
    20942099        pThis->u32VideoAccelEnabled = fEnabled;
    20952100    }
    2096 
    20972101    return;
    20982102}
     
    25922596        pThis->pDrv->pfnUpdateGuestCapabilities(pThis->pDrv, pThis->guestCaps);
    25932597}
    2594 
    25952598
    25962599/**
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