VirtualBox

Ignore:
Timestamp:
Mar 28, 2025 10:09:33 AM (6 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168212
Message:

VMM/GIC: bugref:10877 Make GITS MMIO handlers deal directly with 64-bit wide accesses.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/GICAll.cpp

    r108778 r108779  
    32783278    RT_NOREF_PV(pvUser);
    32793279    Assert(!(off & 0x3));
    3280     Assert(cb == 4); RT_NOREF_PV(cb);
     3280    Assert(cb == 8 || cb == 4);
    32813281
    32823282    PCGICDEV  pGicDev  = PDMDEVINS_2_DATA(pDevIns, PCGICDEV);
    32833283    PCGITSDEV pGitsDev = &pGicDev->Gits;
    3284 
    3285     VBOXSTRICTRC rcStrict;
     3284    uint64_t  uReg;
    32863285    if (off < GITS_REG_FRAME_SIZE)
    32873286    {
    32883287        /* Control registers space. */
    32893288        uint16_t const offReg = off & 0xfffc;
    3290         uint32_t       uValue = 0;
    3291         rcStrict = gitsMmioReadCtrl(pGitsDev, offReg, &uValue);
    3292         *(uint32_t *)pv = uValue;
    3293         LogFlowFunc(("offReg=%#RX16 (%s) read %#RX32\n", offReg, gitsGetCtrlRegDescription(offReg), uValue));
     3289        uReg = gitsMmioReadCtrl(pGitsDev, offReg, cb);
     3290        LogFlowFunc(("offReg=%#RX16 (%s) read %#RX64\n", offReg, gitsGetCtrlRegDescription(offReg), uReg));
    32943291    }
    32953292    else
    32963293    {
    32973294        /* Translation registers space. */
    3298         off -= GITS_REG_FRAME_SIZE;
    3299         uint16_t const offReg = off & 0xfffc;
    3300         uint32_t       uValue = 0;
    3301         rcStrict = gitsMmioReadTranslate(pGitsDev, offReg, &uValue);
    3302         *(uint32_t *)pv = uValue;
    3303         LogFlowFunc(("offReg=%#RX16 (%s) read %#RX32\n", offReg, gitsGetTranslationRegDescription(offReg), uValue));
    3304     }
    3305     return rcStrict;
     3295        uint16_t const offReg = (off - GITS_REG_FRAME_SIZE) & 0xfffc;
     3296        uReg = gitsMmioReadTranslate(pGitsDev, offReg, cb);
     3297        LogFlowFunc(("offReg=%#RX16 (%s) read %#RX64\n", offReg, gitsGetTranslationRegDescription(offReg), uReg));
     3298    }
     3299
     3300    if (cb == 8)
     3301        *(uint64_t *)pv = uReg;
     3302    else
     3303        *(uint32_t *)pv = uReg;
     3304    return VINF_SUCCESS;
    33063305}
    33073306
     
    33143313    RT_NOREF_PV(pvUser);
    33153314    Assert(!(off & 0x3));
    3316     Assert(cb == 4); RT_NOREF_PV(cb);
     3315    Assert(cb == 8 || cb == 4);
    33173316
    33183317    PGICDEV  pGicDev  = PDMDEVINS_2_DATA(pDevIns, PGICDEV);
    33193318    PGITSDEV pGitsDev = &pGicDev->Gits;
    33203319
    3321     VBOXSTRICTRC rcStrict;
     3320    uint64_t const uValue = cb == 8 ? *(uint64_t *)pv : *(uint32_t *)pv;
    33223321    if (off < GITS_REG_FRAME_SIZE)
    33233322    {
    33243323        /* Control registers space. */
    33253324        uint16_t const offReg = off & 0xfffc;
    3326         uint32_t const uValue = *(uint32_t *)pv;
    3327         rcStrict = gitsMmioWriteCtrl(pGitsDev, offReg, uValue);
    3328         *(uint32_t *)pv = uValue;
    3329         LogFlowFunc(("offReg=%#RX16 (%s) written %#RX32\n", offReg, gitsGetCtrlRegDescription(offReg), uValue));
     3325        gitsMmioWriteCtrl(pGitsDev, offReg, uValue, cb);
     3326        LogFlowFunc(("offReg=%#RX16 (%s) written %#RX64\n", offReg, gitsGetCtrlRegDescription(offReg), uValue));
    33303327    }
    33313328    else
    33323329    {
    33333330        /* Translation registers space. */
    3334         off -= GITS_REG_FRAME_SIZE;
    3335         uint16_t const offReg = off & 0xfffc;
    3336         uint32_t const uValue = *(uint32_t *)pv;
    3337         rcStrict = gitsMmioWriteTranslate(pGitsDev, offReg, uValue);
    3338         *(uint32_t *)pv = uValue;
    3339         LogFlowFunc(("offReg=%#RX16 (%s) written %#RX32\n", offReg, gitsGetTranslationRegDescription(offReg), uValue));
    3340     }
    3341     return rcStrict;
     3331        uint16_t const offReg = (off - GITS_REG_FRAME_SIZE) & 0xfffc;
     3332        gitsMmioWriteTranslate(pGitsDev, offReg, uValue, cb);
     3333        LogFlowFunc(("offReg=%#RX16 (%s) written %#RX64\n", offReg, gitsGetTranslationRegDescription(offReg), uValue));
     3334    }
     3335    return VINF_SUCCESS;
    33423336}
    33433337
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