VirtualBox

Changeset 53751 in vbox


Ignore:
Timestamp:
Jan 6, 2015 4:22:10 AM (10 years ago)
Author:
vboxsync
Message:

DevVGA-SVGA.cpp: Register the I/O ports for ring-0 and raw-mode context callbacks. Changed FIFORequestSem to a cross context semaphore so we can signal it from ring-0.

Location:
trunk/src/VBox/Devices/Graphics
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp

    r53749 r53751  
    3333#include <VBox/log.h>
    3434#include <VBox/vmm/pgm.h>
     35#include <VBox/sup.h>
    3536
    3637#include <iprt/assert.h>
     
    184185    SSMFIELD_ENTRY_IGNORE(          VMSVGAState, BasePort),
    185186    SSMFIELD_ENTRY(                 VMSVGAState, u32IndexReg),
     187    SSMFIELD_ENTRY_IGNORE(          VMSVGAState, pSupDrvSession),
    186188    SSMFIELD_ENTRY_IGNORE(          VMSVGAState, FIFORequestSem),
    187189    SSMFIELD_ENTRY_IGNORE(          VMSVGAState, FIFOExtCmdSem),
     
    10821084            &&  pThis->svga.fConfigured)
    10831085        {
    1084 #ifdef IN_RING3
    1085             Log(("SVGA_REG_SYNC: SVGA_FIFO_BUSY=%d\n", pThis->svga.pFIFOR3[SVGA_FIFO_BUSY]));
     1086#if defined(IN_RING3) || defined(IN_RING0)
     1087            Log(("SVGA_REG_SYNC: SVGA_FIFO_BUSY=%d\n", pThis->svga.CTX_SUFF(pFIFO)[SVGA_FIFO_BUSY]));
    10861088            pThis->svga.fBusy = true;
    1087             pThis->svga.pFIFOR3[SVGA_FIFO_BUSY] = pThis->svga.fBusy;
     1089            pThis->svga.CTX_SUFF(pFIFO)[SVGA_FIFO_BUSY] = pThis->svga.fBusy;
    10881090
    10891091            /* Kick the FIFO thread to start processing commands again. */
    1090             RTSemEventSignal(pThis->svga.FIFORequestSem);
     1092            SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
    10911093#else
    10921094            rc = VINF_IOM_R3_IOPORT_WRITE;
     
    19371939
    19381940        /* Wait for at most 250 ms to start polling. */
    1939         rc = RTSemEventWait(pThis->svga.FIFORequestSem, 250);
    1940         AssertBreak(RT_SUCCESS(rc) || rc == VERR_TIMEOUT);
     1941        rc = SUPSemEventWaitNoResume(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem, 250);
     1942        AssertBreak(RT_SUCCESS(rc) || rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED);
    19411943        if (pThread->enmState != PDMTHREADSTATE_RUNNING)
    19421944        {
     
    30043006    PVGASTATE pThis = (PVGASTATE)pThread->pvUser;
    30053007    Log(("vmsvgaFIFOLoopWakeUp\n"));
    3006     return RTSemEventSignal(pThis->svga.FIFORequestSem);
     3008    return SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
    30073009}
    30083010
     
    30793081    {
    30803082        AssertReturn(iRegion == 0, VERR_INTERNAL_ERROR);
    3081         rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0, vmsvgaIOWrite, vmsvgaIORead, NULL /* OutStr */, NULL /* InStr */, "VMSVGA");
     3083        rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
     3084                                     vmsvgaIOWrite, vmsvgaIORead, NULL /* OutStr */, NULL /* InStr */, "VMSVGA");
    30823085        if (RT_FAILURE(rc))
    30833086            return rc;
     3087        if (pThis->fR0Enabled)
     3088        {
     3089            rc = PDMDevHlpIOPortRegisterR0(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
     3090                                           "vmsvgaIOWrite", "vmsvgaIORead", NULL, NULL, "VMSVGA");
     3091            if (RT_FAILURE(rc))
     3092                return rc;
     3093        }
     3094        if (pThis->fGCEnabled)
     3095        {
     3096            rc = PDMDevHlpIOPortRegisterRC(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
     3097                                           "vmsvgaIOWrite", "vmsvgaIORead", NULL, NULL, "VMSVGA");
     3098            if (RT_FAILURE(rc))
     3099                return rc;
     3100        }
    30843101
    30853102        pThis->svga.BasePort = GCPhysAddress;
     
    32013218         */
    32023219        PDMR3ThreadResume(pThis->svga.pFIFOIOThread);
    3203         RTSemEventSignal(pThis->svga.FIFORequestSem);
     3220        SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
    32043221        /* Wait for the end of the command. */
    32053222        rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, RT_INDEFINITE_WAIT);
     
    32923309         */
    32933310        PDMR3ThreadResume(pThis->svga.pFIFOIOThread);
    3294         RTSemEventSignal(pThis->svga.FIFORequestSem);
     3311        SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
    32953312        /* Wait for the end of the external command. */
    32963313        rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, RT_INDEFINITE_WAIT);
     
    33233340    /* Reset the FIFO thread. */
    33243341    pThis->svga.u8FIFOExtCommand = VMSVGA_FIFO_EXTCMD_RESET;
    3325     RTSemEventSignal(pThis->svga.FIFORequestSem);
     3342    SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
    33263343    /* Wait for the end of the termination sequence. */
    33273344    int rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, 10000);
     
    33763393     */
    33773394    PDMR3ThreadResume(pThis->svga.pFIFOIOThread);
    3378     RTSemEventSignal(pThis->svga.FIFORequestSem);
     3395    SUPSemEventSignal(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
     3396
    33793397    /* Wait for the end of the termination sequence. */
    33803398    rc = RTSemEventWait(pThis->svga.FIFOExtCmdSem, 10000);
     
    33963414    if (pThis->svga.pFrameBufferBackup)
    33973415        RTMemFree(pThis->svga.pFrameBufferBackup);
    3398     if (pThis->svga.FIFOExtCmdSem)
     3416    if (pThis->svga.FIFOExtCmdSem != NIL_RTSEMEVENT)
     3417    {
    33993418        RTSemEventDestroy(pThis->svga.FIFOExtCmdSem);
    3400     if (pThis->svga.FIFORequestSem)
    3401         RTSemEventDestroy(pThis->svga.FIFORequestSem);
     3419        pThis->svga.FIFOExtCmdSem = NIL_RTSEMEVENT;
     3420    }
     3421    if (pThis->svga.FIFORequestSem != NIL_SUPSEMEVENT)
     3422    {
     3423        SUPSemEventClose(pThis->svga.pSupDrvSession, pThis->svga.FIFORequestSem);
     3424        pThis->svga.FIFORequestSem = NIL_SUPSEMEVENT;
     3425    }
    34023426
    34033427    return VINF_SUCCESS;
     
    34293453
    34303454    /* Create event semaphore. */
    3431     rc = RTSemEventCreate(&pThis->svga.FIFORequestSem);
     3455    pThis->svga.pSupDrvSession = PDMDevHlpGetSupDrvSession(pDevIns);
     3456
     3457    rc = SUPSemEventCreate(pThis->svga.pSupDrvSession, &pThis->svga.FIFORequestSem);
    34323458    if (RT_FAILURE(rc))
    34333459    {
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r53532 r53751  
    279279    /** Port io index register. */
    280280    uint32_t                    u32IndexReg;
     281    /** The support driver session handle for use with FIFORequestSem. */
     282    R3R0PTRTYPE(PSUPDRVSESSION) pSupDrvSession;
    281283    /** FIFO request semaphore. */
    282     RTSEMEVENT                  FIFORequestSem;
     284    SUPSEMEVENT                 FIFORequestSem;
    283285    /** FIFO external command semaphore. */
    284     RTSEMEVENT                  FIFOExtCmdSem;
     286    R3PTRTYPE(RTSEMEVENT)       FIFOExtCmdSem;
    285287    /** FIFO IO Thread. */
    286288    R3PTRTYPE(PPDMTHREAD)       pFIFOIOThread;
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