VirtualBox

Changeset 83278 in vbox for trunk/src


Ignore:
Timestamp:
Mar 13, 2020 11:43:47 AM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
136433
Message:

VMSVGA: The SVGA_REG_BITS_PER_PIXEL must be initialized to the host bpp value and can't contain an invalid value, since it used to be read-only. Fixes old X11 drivers.

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

Legend:

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

    r83274 r83278  
    991991        case SVGA_REG_HOST_BITS_PER_PIXEL: /* (Deprecated) */
    992992            STAM_REL_COUNTER_INC(&pThis->svga.StatRegHostBitsPerPixelRd);
    993             if (    pThis->svga.fEnabled
    994                 &&  pThis->svga.uBpp != VMSVGA_VAL_UNINITIALIZED)
    995                 *pu32 = pThis->svga.uBpp;
    996             else
    997             {
    998 #ifndef IN_RING3
    999                 rc = VINF_IOM_R3_IOPORT_READ;
    1000 #else
    1001                 *pu32 = pThisCC->pDrv->cBits;
    1002 #endif
    1003             }
     993            *pu32 = pThis->svga.uHostBpp;
    1004994            break;
    1005995
    1006996        case SVGA_REG_BITS_PER_PIXEL:      /* Current bpp in the guest */
    1007997            STAM_REL_COUNTER_INC(&pThis->svga.StatRegBitsPerPixelRd);
    1008             if (    pThis->svga.fEnabled
    1009                 &&  pThis->svga.uBpp != VMSVGA_VAL_UNINITIALIZED)
    1010                 *pu32 = (pThis->svga.uBpp + 7) & ~7;
    1011             else
    1012             {
    1013 #ifndef IN_RING3
    1014                 rc = VINF_IOM_R3_IOPORT_READ;
    1015 #else
    1016                 *pu32 = (pThisCC->pDrv->cBits + 7) & ~7;
    1017 #endif
    1018             }
     998            *pu32 = pThis->svga.uBpp;
    1019999            break;
    10201000
     
    10301010            uint32_t uBpp;
    10311011
    1032             if (    pThis->svga.fEnabled
    1033                 &&  pThis->svga.uBpp != VMSVGA_VAL_UNINITIALIZED)
    1034             {
     1012            if (pThis->svga.fEnabled)
    10351013                uBpp = pThis->svga.uBpp;
    1036             }
    10371014            else
    1038             {
    1039 #ifndef IN_RING3
    1040                 rc = VINF_IOM_R3_IOPORT_READ;
    1041                 break;
    1042 #else
    1043                 uBpp = pThisCC->pDrv->cBits;
    1044 #endif
    1045             }
     1015                uBpp = pThis->svga.uHostBpp;
     1016
    10461017            uint32_t u32RedMask, u32GreenMask, u32BlueMask;
    10471018            switch (uBpp)
     
    14691440        pThis->svga.uWidth  = VMSVGA_VAL_UNINITIALIZED;
    14701441        pThis->svga.uHeight = VMSVGA_VAL_UNINITIALIZED;
    1471         pThis->svga.uBpp    = VMSVGA_VAL_UNINITIALIZED;
     1442        pThis->svga.uBpp    = pThis->svga.uHostBpp;
    14721443    }
    14731444
     
    17021673            {
    17031674                if (    pThis->svga.uWidth  == VMSVGA_VAL_UNINITIALIZED
    1704                     &&  pThis->svga.uHeight == VMSVGA_VAL_UNINITIALIZED
    1705                     &&  pThis->svga.uBpp    == VMSVGA_VAL_UNINITIALIZED)
     1675                    &&  pThis->svga.uHeight == VMSVGA_VAL_UNINITIALIZED)
    17061676                {
    17071677                    /* Keep the current mode. */
     
    17121682
    17131683                if (    pThis->svga.uWidth  != VMSVGA_VAL_UNINITIALIZED
    1714                     &&  pThis->svga.uHeight != VMSVGA_VAL_UNINITIALIZED
    1715                     &&  pThis->svga.uBpp    != VMSVGA_VAL_UNINITIALIZED)
     1684                    &&  pThis->svga.uHeight != VMSVGA_VAL_UNINITIALIZED)
    17161685                    ASMAtomicOrU32(&pThis->svga.u32ActionFlags, VMSVGA_ACTION_CHANGEMODE);
    17171686# ifdef LOG_ENABLED
     
    63096278    pThis->svga.uWidth       = VMSVGA_VAL_UNINITIALIZED;
    63106279    pThis->svga.uHeight      = VMSVGA_VAL_UNINITIALIZED;
    6311     pThis->svga.uBpp         = VMSVGA_VAL_UNINITIALIZED;
     6280    pThis->svga.uBpp         = pThis->svga.uHostBpp;
    63126281    pThis->svga.cbScanline   = 0;
    63136282    pThis->svga.u32PitchLock = 0;
     
    64296398    pThis->svga.fVRAMTracking = true;
    64306399
     6400    /* Set up the host bpp. This value is as a default for the programmable
     6401     * bpp value. On old implementations, SVGA_REG_HOST_BITS_PER_PIXEL did not
     6402     * exist and SVGA_REG_BITS_PER_PIXEL was read-only, returning what was later
     6403     * separated as SVGA_REG_HOST_BITS_PER_PIXEL.
     6404     *
     6405     * NB: The driver cBits value is currently constant for the lifetime of the
     6406     * VM. If that changes, the host bpp logic might need revisiting.
     6407     */
     6408    pThis->svga.uHostBpp = (pThisCC->pDrv->cBits + 7) & ~7;
     6409
    64316410    /* Invalidate current settings. */
    64326411    pThis->svga.uWidth     = VMSVGA_VAL_UNINITIALIZED;
    64336412    pThis->svga.uHeight    = VMSVGA_VAL_UNINITIALIZED;
    6434     pThis->svga.uBpp       = VMSVGA_VAL_UNINITIALIZED;
     6413    pThis->svga.uBpp       = pThis->svga.uHostBpp;
    64356414    pThis->svga.cbScanline = 0;
    64366415
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.h

    r83274 r83278  
    213213    /** True when the guest modifies the GFB mode registers. */
    214214    bool                        fGFBRegisters;
    215     bool                        afPadding[2];
     215    bool                        afPadding[6];
    216216    uint32_t                    uWidth;
    217217    uint32_t                    uHeight;
    218218    uint32_t                    uBpp;
    219219    uint32_t                    cbScanline;
     220    uint32_t                    uHostBpp;
    220221    /** Maximum width supported. */
    221222    uint32_t                    u32MaxWidth;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette