diff options
Diffstat (limited to '')
-rw-r--r-- | src/VBox/Devices/Graphics/DevVGA.cpp | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/src/VBox/Devices/Graphics/DevVGA.cpp b/src/VBox/Devices/Graphics/DevVGA.cpp index a2ce3b39..e1060783 100644 --- a/src/VBox/Devices/Graphics/DevVGA.cpp +++ b/src/VBox/Devices/Graphics/DevVGA.cpp @@ -387,9 +387,9 @@ DECLINLINE(bool) vgaR3IsDirty(PVGASTATE pThis, RTGCPHYS offVRAM) */ DECLINLINE(void) vgaR3ResetDirty(PVGASTATE pThis, RTGCPHYS offVRAMStart, RTGCPHYS offVRAMEnd) { - Assert(offVRAMStart < pThis->vram_size); - Assert(offVRAMEnd <= pThis->vram_size); - Assert(offVRAMStart < offVRAMEnd); + AssertReturnVoid(offVRAMStart < pThis->vram_size); + AssertReturnVoid(offVRAMEnd <= pThis->vram_size); + AssertReturnVoid(offVRAMStart < offVRAMEnd); ASMBitClearRange(&pThis->bmDirtyBitmap[0], offVRAMStart >> GUEST_PAGE_SHIFT, offVRAMEnd >> GUEST_PAGE_SHIFT); } @@ -962,9 +962,9 @@ static void recalculate_data(PVGASTATE pThis) offStart += offX >> 1; else offStart += offX * ((cBPP + 7) >> 3); - offStart >>= 2; + pThis->vbe_line_offset = RT_MIN(cbLinePitch, pThis->vram_size); - pThis->vbe_start_addr = RT_MIN(offStart, pThis->vram_size); + pThis->vbe_start_addr = RT_MIN(offStart, pThis->vram_size) >> 2; /* The VBE_DISPI_INDEX_VIRT_HEIGHT is used to prevent setting resolution bigger than * the VRAM size permits. It is used instead of VBE_DISPI_INDEX_YRES *only* in case @@ -985,10 +985,14 @@ static VBOXSTRICTRC vbe_ioport_write_data(PPDMDEVINS pDevIns, PVGASTATE pThis, P uint32_t max_bank; RT_NOREF(pThisCC, addr); - if (pThis->vbe_index <= VBE_DISPI_INDEX_NB) { + uint16_t const idxVbe = pThis->vbe_index; + if (idxVbe <= VBE_DISPI_INDEX_NB) + { + RT_UNTRUSTED_VALIDATED_FENCE(); + bool fRecalculate = false; - Log(("VBE: write index=0x%x val=0x%x\n", pThis->vbe_index, val)); - switch(pThis->vbe_index) { + Log(("VBE: write index=0x%x val=0x%x\n", idxVbe, val)); + switch(idxVbe) { case VBE_DISPI_INDEX_ID: if (val == VBE_DISPI_ID0 || val == VBE_DISPI_ID1 || @@ -1003,27 +1007,27 @@ static VBOXSTRICTRC vbe_ioport_write_data(PPDMDEVINS pDevIns, PVGASTATE pThis, P # endif val == VBE_DISPI_ID_CFG) { - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[VBE_DISPI_INDEX_ID] = val; } break; case VBE_DISPI_INDEX_XRES: if (val <= VBE_DISPI_MAX_XRES) { - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[VBE_DISPI_INDEX_XRES] = val; pThis->vbe_regs[VBE_DISPI_INDEX_VIRT_WIDTH] = val; fRecalculate = true; } break; case VBE_DISPI_INDEX_YRES: if (val <= VBE_DISPI_MAX_YRES) - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[VBE_DISPI_INDEX_YRES] = val; break; case VBE_DISPI_INDEX_BPP: if (val == 0) val = 8; if (val == 4 || val == 8 || val == 15 || val == 16 || val == 24 || val == 32) { - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[VBE_DISPI_INDEX_BPP] = val; fRecalculate = true; } break; @@ -1039,7 +1043,7 @@ static VBOXSTRICTRC vbe_ioport_write_data(PPDMDEVINS pDevIns, PVGASTATE pThis, P val &= 0xff; if (val > max_bank) val = max_bank; - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[VBE_DISPI_INDEX_BANK] = val; pThis->bank_offset = (val << 16); # ifndef IN_RC @@ -1143,7 +1147,7 @@ static VBOXSTRICTRC vbe_ioport_write_data(PPDMDEVINS pDevIns, PVGASTATE pThis, P */ pThis->bank_offset = 0; } - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[VBE_DISPI_INDEX_ENABLE] = val; /* * LFB video mode is either disabled or changed. Notify the display * and reset VBVA. @@ -1167,7 +1171,7 @@ static VBOXSTRICTRC vbe_ioport_write_data(PPDMDEVINS pDevIns, PVGASTATE pThis, P case VBE_DISPI_INDEX_X_OFFSET: case VBE_DISPI_INDEX_Y_OFFSET: { - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[idxVbe] = val; fRecalculate = true; } break; @@ -1185,7 +1189,7 @@ static VBOXSTRICTRC vbe_ioport_write_data(PPDMDEVINS pDevIns, PVGASTATE pThis, P # endif /* IN_RING3 */ break; case VBE_DISPI_INDEX_CFG: - pThis->vbe_regs[pThis->vbe_index] = val; + pThis->vbe_regs[VBE_DISPI_INDEX_CFG] = val; break; default: break; |