VirtualBox

Changeset 95461 in vbox for trunk/src/VBox/Devices/Graphics


Ignore:
Timestamp:
Jun 30, 2022 12:56:31 PM (3 years ago)
Author:
vboxsync
Message:

DevVGA: Fixed problem with VBE banking destroying MMIO2 remapping optimization (see bugref:10251).

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

Legend:

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

    r95292 r95461  
    301301
    302302/**
     303 * Mark a page in VGA A0000-AFFFF range as remapped.
     304 *
     305 * @param   pThis       VGA instance data.
     306 * @param   offVGAMem   The offset within VGA memory.
     307 */
     308DECLINLINE(void) vgaMarkRemapped(PVGASTATE pThis, RTGCPHYS offVGAMem)
     309{
     310    AssertMsg(offVGAMem < _64K, ("offVGAMem = %p > 64K\n", offVGAMem));
     311    ASMBitSet(&pThis->bmPageMapBitmap, offVGAMem >> GUEST_PAGE_SHIFT);
     312    pThis->fRemappedVGA = true;
     313}
     314
     315/**
     316 * Checks if a page in VGA A0000-AFFFF range is remapped.
     317 *
     318 * @returns true if remapped.
     319 * @returns false if not remapped (accesses will trap).
     320 * @param   pThis       VGA instance data.
     321 * @param   offVGAMem   The offset within VGA memory.
     322 */
     323DECLINLINE(bool) vgaIsRemapped(PVGASTATE pThis, RTGCPHYS offVGAMem)
     324{
     325    AssertMsg(offVGAMem < _64K, ("offVGAMem = %p > 64K\n", offVGAMem));
     326    return ASMBitTest(&pThis->bmPageMapBitmap, offVGAMem >> GUEST_PAGE_SHIFT);
     327}
     328
     329/**
     330 * Reset page remap tracking bits.
     331 *
     332 * @param   pThis           VGA instance data.
     333 */
     334DECLINLINE(void) vgaResetRemapped(PVGASTATE pThis)
     335{
     336    pThis->fRemappedVGA = false;
     337    ASMBitClearRange(&pThis->bmPageMapBitmap, 0, _64K >> GUEST_PAGE_SHIFT);
     338}
     339
     340/**
    303341 * Set a VRAM page dirty.
    304342 *
     
    699737            {
    700738                PDMDevHlpMmioResetRegion(pDevIns, pThis->hMmioLegacy);
    701                 pThis->fRemappedVGA = false;
     739                vgaResetRemapped(pThis);
    702740            }
    703741        }
     
    738776            {
    739777                PDMDevHlpMmioResetRegion(pDevIns, pThis->hMmioLegacy);
    740                 pThis->fRemappedVGA = false;
     778                vgaResetRemapped(pThis);
    741779            }
    742780        }
     
    9961034            {
    9971035                PDMDevHlpMmioResetRegion(pDevIns, pThis->hMmioLegacy);
    998                 pThis->fRemappedVGA = false;
     1036                vgaResetRemapped(pThis);
    9991037            }
    10001038# endif
     
    11051143            {
    11061144                PDMDevHlpMmioResetRegion(pDevIns, pThis->hMmioLegacy);
    1107                 pThis->fRemappedVGA = false;
     1145                vgaResetRemapped(pThis);
    11081146            }
    11091147            break;
     
    12001238        /* If all planes are accessible, then map the page to the frame buffer and make it writable. */
    12011239        if (   (pThis->sr[2] & 3) == 3
    1202             && !vgaIsDirty(pThis, addr)
     1240            && !vgaIsRemapped(pThis, GCPhys - 0xa0000)
    12031241            && pThis->GCPhysVRAM)
    12041242        {
     
    12091247            /* Set as dirty as write accesses won't be noticed now. */
    12101248            vgaR3MarkDirty(pThis, addr);
    1211             pThis->fRemappedVGA = true;
     1249            vgaMarkRemapped(pThis, GCPhys - 0xa0000);
    12121250        }
    12131251#endif /* !IN_RC */
     
    13091347            /* If all planes are accessible, then map the page to the frame buffer and make it writable. */
    13101348            if (   (pThis->sr[2] & 3) == 3
    1311                 && !vgaIsDirty(pThis, addr)
     1349                && !vgaIsRemapped(pThis, GCPhys - 0xa0000)
    13121350                && pThis->GCPhysVRAM)
    13131351            {
     
    13151353                PDMDevHlpMmioMapMmio2Page(pDevIns, pThis->hMmioLegacy, GCPhys - 0xa0000,
    13161354                                          pThis->hMmio2VRam, addr, X86_PTE_RW | X86_PTE_P);
    1317                 pThis->fRemappedVGA = true;
     1355                vgaMarkRemapped(pThis, GCPhys - 0xa0000);
    13181356            }
    13191357#endif /* !IN_RC */
     
    46554693        pHlp->pfnPrintf(pHlp, " Linear display start : 0x%04x\n", pThis->vbe_start_addr);
    46564694        pHlp->pfnPrintf(pHlp, " Selected bank: 0x%04x\n", pThis->vbe_regs[VBE_DISPI_INDEX_BANK]);
     4695        pHlp->pfnPrintf(pHlp, " DAC: %d-bit\n", pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] & VBE_DISPI_8BIT_DAC ? 8 : 6);
    46574696    }
    46584697}
     
    48084847    {
    48094848        PDMDevHlpMmioResetRegion(pDevIns, pThis->hMmioLegacy);
    4810         pThis->fRemappedVGA = false;
     4849        vgaResetRemapped(pThis);
    48114850    }
    48124851
     
    48364875    {
    48374876        PDMDevHlpMmioResetRegion(pDevIns, pThis->hMmioLegacy);
    4838         pThis->fRemappedVGA = false;
     4877        vgaResetRemapped(pThis);
    48394878    }
    48404879
     
    60576096    {
    60586097        PDMDevHlpMmioResetRegion(pDevIns, pThis->hMmioLegacy);
    6059         pThis->fRemappedVGA = false;
     6098        vgaResetRemapped(pThis);
    60606099    }
    60616100
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r93944 r95461  
    352352    /** Bitmap tracking dirty pages. */
    353353    uint64_t                    bmDirtyBitmap[VGA_VRAM_MAX / GUEST_PAGE_SIZE / 64];
     354    /** Bitmap tracking remapped pages (only needs 16 bits). */
     355    uint64_t                    bmPageMapBitmap;
    354356
    355357    /** Flag indicating that there are dirty bits. This is used to optimize the handler resetting. */
     
    526528AssertCompileMemberAlignment(VGASTATE, last_ch_attr, 8);
    527529AssertCompileMemberAlignment(VGASTATE, u32Marker, 8);
     530AssertCompile(sizeof(uint64_t)/*bmPageMapBitmap*/ >= (_64K / GUEST_PAGE_SIZE / 8));
    528531#endif
    529532
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