VirtualBox

Changeset 61845 in vbox


Ignore:
Timestamp:
Jun 23, 2016 11:27:38 AM (8 years ago)
Author:
vboxsync
Message:

IOAPIC: Don't clear read-only bits when the guest updates redirection-table entries. Possibly fixes the Windows 10 guest hangs.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevIOAPIC_New.cpp

    r61842 r61845  
    470470        if (!(uIndex & 1))
    471471        {
    472             uint32_t const u32RteNewLo    = uValue & RT_LO_U32(IOAPIC_RTE_VALID_WRITE_MASK);
    473             uint64_t const u64RteHi       = u64Rte & UINT64_C(0xffffffff00000000);
    474             pThis->au64RedirTable[idxRte] = u64RteHi | u32RteNewLo;
     472            uint32_t const u32RtePreserveLo = RT_LO_U32(u64Rte) & ~RT_LO_U32(IOAPIC_RTE_VALID_WRITE_MASK);
     473            uint32_t const u32RteNewLo      = (uValue & RT_LO_U32(IOAPIC_RTE_VALID_WRITE_MASK)) | u32RtePreserveLo;
     474            uint64_t const u64RteHi         = u64Rte & UINT64_C(0xffffffff00000000);
     475            pThis->au64RedirTable[idxRte]   = u64RteHi | u32RteNewLo;
    475476        }
    476477        else
    477478        {
    478             uint32_t const u32RteLo       = RT_LO_U32(u64Rte);
    479             uint64_t const u64RteNewHi    = (uint64_t)(uValue & RT_HI_U32(IOAPIC_RTE_VALID_WRITE_MASK)) << 32;
    480             pThis->au64RedirTable[idxRte] = u64RteNewHi | u32RteLo;
     479            uint32_t const u32RtePreserveHi = RT_HI_U32(u64Rte) & ~RT_HI_U32(IOAPIC_RTE_VALID_WRITE_MASK);
     480            uint32_t const u32RteLo         = RT_LO_U32(u64Rte);
     481            uint64_t const u64RteNewHi      = ((uint64_t)(uValue & RT_HI_U32(IOAPIC_RTE_VALID_WRITE_MASK)) << 32) | u32RtePreserveHi;
     482            pThis->au64RedirTable[idxRte]   = u64RteNewHi | u32RteLo;
    481483        }
    482484
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