VirtualBox

Changeset 53775 in vbox


Ignore:
Timestamp:
Jan 12, 2015 3:54:53 PM (10 years ago)
Author:
vboxsync
Message:

DevVGA-SVGA.cpp: Fixed bugs in SVGA_REG_BITS_PER_PIXEL, SVGA_REG_HEIGHT, and SVGA_REG_HEIGHT write handlers that was uncovered by enabling the code in ring-0 and raw-mode contexts. The device state was changed before we decided that we needed to handle the request in ring-3, and because of the state change nothing was actually done in ring-3.

File:
1 edited

Legend:

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

    r53756 r53775  
    3939#include <iprt/uuid.h>
    4040#ifdef IN_RING3
    41 #include <iprt/mem.h>
     41# include <iprt/mem.h>
    4242#endif
    4343
     
    5151#ifdef DEBUG
    5252/* Enable to log FIFO register accesses. */
    53 //#define DEBUG_FIFO_ACCESS
     53//# define DEBUG_FIFO_ACCESS
    5454/* Enable to log GMR page accesses. */
    55 //#define DEBUG_GMR_ACCESS
     55//# define DEBUG_GMR_ACCESS
    5656#endif
    5757
     
    6363#include "vmsvga/svga3d_caps.h"
    6464#ifdef VBOX_WITH_VMSVGA3D
    65 #include "DevVGA-SVGA3d.h"
     65# include "DevVGA-SVGA3d.h"
    6666#endif
    6767
     
    201201    SSMFIELD_ENTRY_TERM()
    202202};
     203
     204static void vmsvgaSetTraces(PVGASTATE pThis, bool fTraces);
     205
    203206#endif /* IN_RING3 */
    204 
    205 RT_C_DECLS_BEGIN
    206 
    207 #ifdef IN_RING3
    208 static void vmsvgaSetTraces(PVGASTATE pThis, bool fTraces);
    209 #endif
    210 
    211 RT_C_DECLS_END
    212207
    213208
     
    745740            break;
    746741#else
    747             /* @todo bit crude */
     742            /** @todo bit crude */
    748743            RTThreadSleep(50);
    749744#endif
     
    848843        break;
    849844    }
    850     Log(("vmsvgaReadPort index=%s (%d) val=%x rc=%x\n", vmsvgaIndexToString(pThis), pThis->svga.u32IndexReg, *pu32, rc));
     845    Log(("vmsvgaReadPort index=%s (%d) val=%#x rc=%x\n", vmsvgaIndexToString(pThis), pThis->svga.u32IndexReg, *pu32, rc));
    851846    return rc;
    852847}
     
    933928    int          rc = VINF_SUCCESS;
    934929
    935     Log(("vmsvgaWritePort index=%s (%d) val=%x\n", vmsvgaIndexToString(pThis), pThis->svga.u32IndexReg, u32));
     930    Log(("vmsvgaWritePort index=%s (%d) val=%#x\n", vmsvgaIndexToString(pThis), pThis->svga.u32IndexReg, u32));
    936931    switch (pThis->svga.u32IndexReg)
    937932    {
     
    10091004
    10101005    case SVGA_REG_WIDTH:
    1011         if (pThis->svga.uWidth == u32)
    1012             break; /* nop */
    1013 
    1014         pThis->svga.uWidth = u32;
    1015         if (pThis->svga.fEnabled)
    1016         {
     1006        if (pThis->svga.uWidth != u32)
     1007        {
     1008            if (pThis->svga.fEnabled)
     1009            {
    10171010#ifdef IN_RING3
    1018             rc = vmsvgaChangeMode(pThis);
    1019             AssertRCReturn(rc, rc);
     1011                pThis->svga.uWidth = u32;
     1012                rc = vmsvgaChangeMode(pThis);
     1013                AssertRCReturn(rc, rc);
    10201014#else
    1021             rc = VINF_IOM_R3_IOPORT_WRITE;
    1022             break;
     1015                rc = VINF_IOM_R3_IOPORT_WRITE;
    10231016#endif
    1024         }
     1017            }
     1018            else
     1019                pThis->svga.uWidth = u32;
     1020        }
     1021        /* else: nop */
    10251022        break;
    10261023
    10271024    case SVGA_REG_HEIGHT:
    1028         if (pThis->svga.uHeight == u32)
    1029             break; /* nop */
    1030 
    1031         pThis->svga.uHeight = u32;
    1032         if (pThis->svga.fEnabled)
    1033         {
     1025        if (pThis->svga.uHeight != u32)
     1026        {
     1027            if (pThis->svga.fEnabled)
     1028            {
    10341029#ifdef IN_RING3
    1035             rc = vmsvgaChangeMode(pThis);
    1036             AssertRCReturn(rc, rc);
     1030                pThis->svga.uHeight = u32;
     1031                rc = vmsvgaChangeMode(pThis);
     1032                AssertRCReturn(rc, rc);
    10371033#else
    1038             rc = VINF_IOM_R3_IOPORT_WRITE;
    1039             break;
     1034                rc = VINF_IOM_R3_IOPORT_WRITE;
    10401035#endif
    1041         }
     1036            }
     1037            else
     1038                pThis->svga.uHeight = u32;
     1039        }
     1040        /* else: nop */
    10421041        break;
    10431042
     
    10471046
    10481047    case SVGA_REG_BITS_PER_PIXEL:      /* Current bpp in the guest */
    1049         if (pThis->svga.uBpp == u32)
    1050             break; /* nop */
    1051 
    1052         pThis->svga.uBpp = u32;
    1053         if (pThis->svga.fEnabled)
    1054         {
     1048        if (pThis->svga.uBpp != u32)
     1049        {
     1050            if (pThis->svga.fEnabled)
     1051            {
    10551052#ifdef IN_RING3
    1056             rc = vmsvgaChangeMode(pThis);
    1057             AssertRCReturn(rc, rc);
     1053                pThis->svga.uBpp = u32;
     1054                rc = vmsvgaChangeMode(pThis);
     1055                AssertRCReturn(rc, rc);
    10581056#else
    1059             rc = VINF_IOM_R3_IOPORT_WRITE;
    1060             break;
     1057                rc = VINF_IOM_R3_IOPORT_WRITE;
    10611058#endif
    1062         }
     1059            }
     1060            else
     1061                pThis->svga.uBpp = u32;
     1062        }
     1063        /* else: nop */
    10631064        break;
    10641065
     
    11541155
    11551156    case SVGA_REG_GMR_DESCRIPTOR:
    1156 #ifndef IN_RING3
     1157# ifndef IN_RING3
    11571158        rc = VINF_IOM_R3_IOPORT_WRITE;
    11581159        break;
    1159 #else
     1160# else /* IN_RING3 */
    11601161    {
    11611162        SVGAGuestMemDescriptor desc;
     
    12251226        break;
    12261227    }
    1227 #endif
     1228# endif /* IN_RING3 */
    12281229#endif // VBOX_WITH_VMSVGA3D
    12291230
     
    17481749    return rc;
    17491750}
     1751
    17501752# endif /* IN_RING3 */
    1751 #endif /* DEBUG */
     1753#endif /* DEBUG_FIFO_ACCESS */
    17521754
    17531755#ifdef DEBUG_GMR_ACCESS
     
    17991801}
    18001802
    1801 #ifdef IN_RING3
     1803# ifdef IN_RING3
     1804
    18021805/* Callback handler for VMR3ReqCallWait */
    18031806static DECLCALLBACK(int) vmsvgaRegisterGMR(PPDMDEVINS pDevIns, uint32_t gmrId)
     
    18571860    return VINF_SUCCESS;
    18581861}
    1859 #endif /* IN_RING3 */
    1860 
    1861 
     1862
     1863# endif /* IN_RING3 */
    18621864#endif /* DEBUG_GMR_ACCESS */
    18631865
     
    18651867
    18661868#ifdef IN_RING3
    1867 
    1868 #include <iprt/mem.h>
    18691869
    18701870static void *vmsvgaFIFOGetCmdBuffer(PPDMTHREAD pThread, uint32_t *pFIFO, uint32_t cbCmd, uint32_t *pSize, void **ppfBounceBuffer)
     
    19631963            case VMSVGA_FIFO_EXTCMD_RESET:
    19641964                Log(("vmsvgaFIFOLoop: reset the fifo thread.\n"));
    1965 #ifdef VBOX_WITH_VMSVGA3D
     1965# ifdef VBOX_WITH_VMSVGA3D
    19661966                if (pThis->svga.f3DEnabled)
    19671967                {
     
    19691969                    vmsvga3dReset(pThis);
    19701970                }
    1971 #endif
     1971# endif
    19721972                break;
    19731973
    19741974            case VMSVGA_FIFO_EXTCMD_TERMINATE:
    19751975                Log(("vmsvgaFIFOLoop: terminate the fifo thread.\n"));
    1976 #ifdef VBOX_WITH_VMSVGA3D
     1976# ifdef VBOX_WITH_VMSVGA3D
    19771977                if (pThis->svga.f3DEnabled)
    19781978                {
     
    19801980                    vmsvga3dTerminate(pThis);
    19811981                }
    1982 #endif
     1982# endif
    19831983                break;
    19841984
    19851985            case VMSVGA_FIFO_EXTCMD_SAVESTATE:
    19861986                Log(("vmsvgaFIFOLoop: VMSVGA_FIFO_EXTCMD_SAVESTATE.\n"));
    1987 #ifdef VBOX_WITH_VMSVGA3D
     1987# ifdef VBOX_WITH_VMSVGA3D
    19881988                vmsvga3dSaveExec(pThis, (PSSMHANDLE)pThis->svga.pFIFOExtCmdParam);
    1989 #endif
     1989# endif
    19901990                break;
    19911991
     
    19931993            {
    19941994                Log(("vmsvgaFIFOLoop: VMSVGA_FIFO_EXTCMD_LOADSTATE.\n"));
    1995 #ifdef VBOX_WITH_VMSVGA3D
     1995# ifdef VBOX_WITH_VMSVGA3D
    19961996                PVMSVGA_STATE_LOAD pLoadState = (PVMSVGA_STATE_LOAD)pThis->svga.pFIFOExtCmdParam;
    19971997                vmsvga3dLoadExec(pThis, pLoadState->pSSM, pLoadState->uVersion, pLoadState->uPass);
    1998 #endif
     1998# endif
    19991999                break;
    20002000            }
     
    20482048            /* First check any pending actions. */
    20492049            if (ASMBitTestAndClear(&pThis->svga.u32ActionFlags, VMSVGA_ACTION_CHANGEMODE_BIT))
    2050 #ifdef VBOX_WITH_VMSVGA3D
     2050# ifdef VBOX_WITH_VMSVGA3D
    20512051                vmsvga3dChangeMode(pThis);
    2052 #else
    2053                 {}
    2054 #endif
     2052# else
     2053                {/*nothing*/}
     2054# endif
    20552055            /* Check for pending external commands. */
    20562056            if (pThis->svga.u8FIFOExtCommand != VMSVGA_FIFO_EXTCMD_NONE)
     
    22112211                break;
    22122212            }
    2213 #ifdef VBOX_WITH_VMSVGA3D
     2213# ifdef VBOX_WITH_VMSVGA3D
    22142214            case SVGA_CMD_DEFINE_GMR2:
    22152215            {
     
    22972297                if (pCmd->flags & SVGA_REMAP_GMR2_VIA_GMR)
    22982298                {
    2299                     /* @todo */
     2299                    /** @todo */
    23002300                    AssertFailed();
    23012301                }
     
    23652365                    RTMemFree(paNewPage64);
    23662366
    2367 #ifdef DEBUG_GMR_ACCESS
     2367#  ifdef DEBUG_GMR_ACCESS
    23682368                VMR3ReqCallWait(PDMDevHlpGetVM(pThis->pDevInsR3), VMCPUID_ANY, (PFNRT)vmsvgaRegisterGMR, 2, pThis->pDevInsR3, pCmd->gmrId);
    2369 #endif
     2369#  endif
    23702370                break;
    23712371            }
    2372 #endif // VBOX_WITH_VMSVGA3D
     2372# endif // VBOX_WITH_VMSVGA3D
    23732373            case SVGA_CMD_DEFINE_SCREEN:
    23742374            {
     
    24022402                break;
    24032403            }
    2404 #ifdef VBOX_WITH_VMSVGA3D
     2404# ifdef VBOX_WITH_VMSVGA3D
    24052405            case SVGA_CMD_DEFINE_GMRFB:
    24062406            {
     
    24682468                break;
    24692469            }
    2470 #endif // VBOX_WITH_VMSVGA3D
     2470# endif // VBOX_WITH_VMSVGA3D
    24712471            case SVGA_CMD_ANNOTATION_FILL:
    24722472            {
     
    24882488
    24892489            default:
    2490 #ifdef VBOX_WITH_VMSVGA3D
     2490# ifdef VBOX_WITH_VMSVGA3D
    24912491                if (    pFIFO[u32Cmd] >= SVGA_3D_CMD_BASE
    24922492                    &&  pFIFO[u32Cmd] < SVGA_3D_CMD_MAX)
     
    25122512                        cMipLevels = (pHdr->size - sizeof(*pCmd)) / sizeof(SVGA3dSize);
    25132513                        rc = vmsvga3dSurfaceDefine(pThis, pCmd->sid, (uint32_t)pCmd->surfaceFlags, pCmd->format, pCmd->face, 0, SVGA3D_TEX_FILTER_NONE, cMipLevels, (SVGA3dSize *)(pCmd + 1));
    2514 #ifdef DEBUG_GMR_ACCESS
     2514#  ifdef DEBUG_GMR_ACCESS
    25152515                        VMR3ReqCallWait(PDMDevHlpGetVM(pThis->pDevInsR3), VMCPUID_ANY, (PFNRT)vmsvgaResetGMRHandlers, 1, pThis);
    2516 #endif
     2516#  endif
    25172517                        break;
    25182518                    }
     
    28002800                }
    28012801                else
    2802 #endif // VBOX_WITH_VMSVGA3D
     2802# endif // VBOX_WITH_VMSVGA3D
    28032803                    AssertFailed();
    28042804            }
     
    28522852    {
    28532853        PGMR pGMR = &pSVGAState->aGMR[idGMR];
    2854 #ifdef DEBUG_GMR_ACCESS
     2854# ifdef DEBUG_GMR_ACCESS
    28552855        VMR3ReqCallWait(PDMDevHlpGetVM(pThis->pDevInsR3), VMCPUID_ANY, (PFNRT)vmsvgaUnregisterGMR, 2, pThis->pDevInsR3, idGMR);
    2856 #endif
     2856# endif
    28572857
    28582858        Assert(pGMR->paDesc);
     
    31283128            AssertRC(rc);
    31293129
    3130 #ifdef DEBUG_FIFO_ACCESS
     3130# ifdef DEBUG_FIFO_ACCESS
    31313131            if (RT_SUCCESS(rc))
    31323132            {
     
    31403140                AssertRC(rc);
    31413141            }
    3142 #endif
     3142# endif
    31433143            if (RT_SUCCESS(rc))
    31443144            {
     
    31503150        {
    31513151            Assert(pThis->svga.GCPhysFIFO);
    3152 #ifdef DEBUG_FIFO_ACCESS
     3152# ifdef DEBUG_FIFO_ACCESS
    31533153            rc = PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns), pThis->svga.GCPhysFIFO);
    31543154            AssertRC(rc);
    3155 #endif
     3155# endif
    31563156            pThis->svga.GCPhysFIFO = 0;
    31573157        }
     
    32163216    }
    32173217
    3218 #ifdef VBOX_WITH_VMSVGA3D
     3218# ifdef VBOX_WITH_VMSVGA3D
    32193219    if (pThis->svga.f3DEnabled)
    32203220    {
     
    32383238        PDMR3ThreadSuspend(pThis->svga.pFIFOIOThread);
    32393239    }
    3240 #endif
     3240# endif
    32413241
    32423242    return VINF_SUCCESS;
     
    33133313    }
    33143314
    3315 #ifdef VBOX_WITH_VMSVGA3D
     3315# ifdef VBOX_WITH_VMSVGA3D
    33163316    if (pThis->svga.f3DEnabled)
    33173317    {
     
    33293329        PDMR3ThreadSuspend(pThis->svga.pFIFOIOThread);
    33303330    }
    3331 #endif
     3331# endif
    33323332    return VINF_SUCCESS;
    33333333}
     
    33663366    /* Register caps. */
    33673367    pThis->svga.u32RegCaps = SVGA_CAP_GMR | SVGA_CAP_GMR2 | SVGA_CAP_CURSOR | SVGA_CAP_CURSOR_BYPASS_2 | SVGA_CAP_EXTENDED_FIFO | SVGA_CAP_IRQMASK | SVGA_CAP_PITCHLOCK | SVGA_CAP_TRACES | SVGA_CAP_SCREEN_OBJECT_2 | SVGA_CAP_ALPHA_CURSOR;
    3368 #ifdef VBOX_WITH_VMSVGA3D
     3368# ifdef VBOX_WITH_VMSVGA3D
    33693369    pThis->svga.u32RegCaps |= SVGA_CAP_3D;
    3370 #endif
     3370# endif
    33713371
    33723372    /* Setup FIFO capabilities. */
     
    34863486    /* Register caps. */
    34873487    pThis->svga.u32RegCaps = SVGA_CAP_GMR | SVGA_CAP_GMR2 | SVGA_CAP_CURSOR | SVGA_CAP_CURSOR_BYPASS_2 | SVGA_CAP_EXTENDED_FIFO | SVGA_CAP_IRQMASK | SVGA_CAP_PITCHLOCK | SVGA_CAP_TRACES | SVGA_CAP_SCREEN_OBJECT_2 | SVGA_CAP_ALPHA_CURSOR;
    3488 #ifdef VBOX_WITH_VMSVGA3D
     3488# ifdef VBOX_WITH_VMSVGA3D
    34893489    pThis->svga.u32RegCaps |= SVGA_CAP_3D;
    3490 #endif
     3490# endif
    34913491
    34923492    /* Setup FIFO capabilities. */
     
    34973497
    34983498    pThis->svga.pFIFOR3[SVGA_FIFO_3D_HWVERSION] = pThis->svga.pFIFOR3[SVGA_FIFO_3D_HWVERSION_REVISED] = 0;    /* no 3d available. */
    3499 #ifdef VBOX_WITH_VMSVGA3D
     3499# ifdef VBOX_WITH_VMSVGA3D
    35003500    if (pThis->svga.f3DEnabled)
    35013501    {
     
    35073507        }
    35083508    }
    3509 #endif
     3509# endif
    35103510    /* VRAM tracking is enabled by default during bootup. */
    35113511    pThis->svga.fVRAMTracking = true;
     
    35593559    int       rc;
    35603560
    3561 #ifdef VBOX_WITH_VMSVGA3D
     3561# ifdef VBOX_WITH_VMSVGA3D
    35623562    if (pThis->svga.f3DEnabled)
    35633563    {
     
    35983598        }
    35993599    }
    3600 #endif // VBOX_WITH_VMSVGA3D
     3600# endif // VBOX_WITH_VMSVGA3D
    36013601}
    36023602
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