VirtualBox

Changeset 109011 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Apr 17, 2025 10:19:52 AM (3 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168539
Message:

VMM/GIC: bugref:10877 Base register's physical address is split when 64K pages are used (Fedora guests wants to use 64K pages).

File:
1 edited

Legend:

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

    r109010 r109011  
    219219
    220220
     221static RTGCPHYS gitsGetBaseRegPhysAddr(uint64_t uGitsBaseReg)
     222{
     223    /* Mask for physical address bits [47:12]. */
     224    static uint64_t const s_auPhysAddrLoMasks[] =
     225    {
     226        UINT64_C(0x0000fffffffff000), /* 4K  bits[47:12] */
     227        UINT64_C(0x0000ffffffffe000), /* 16K bits[47:13] */
     228        UINT64_C(0x0000ffffffff0000), /* 64K bits[47:16] */
     229        UINT64_C(0x0000ffffffff0000)  /* 64K bits[47:16] */
     230    };
     231
     232    /* Mask for physical address bits [51:48]. */
     233    static uint64_t const s_auPhysAddrHiMasks[] =
     234    {
     235        UINT64_C(0x0),                /* 4K  bits[51:48] = 0 */
     236        UINT64_C(0x0),                /* 16K bits[51:48] = 0 */
     237        UINT64_C(0x000000000000f000), /* 64K bits[51:48] = bits[15:12] */
     238        UINT64_C(0x000000000000f000)  /* 64K bits[51:48] = bits[15:12] */
     239    };
     240    AssertCompile(RT_ELEMENTS(s_auPhysAddrLoMasks) == RT_ELEMENTS(s_auPhysAddrHiMasks));
     241
     242    uint8_t const idxPageSize = RT_BF_GET(uGitsBaseReg, GITS_BF_CTRL_REG_BASER_PAGESIZE);
     243    Assert(idxPageSize < RT_ELEMENTS(s_auPhysAddrLoMasks));
     244    RTGCPHYS const GCPhys =  (uGitsBaseReg & s_auPhysAddrLoMasks[idxPageSize])
     245                          | ((uGitsBaseReg & s_auPhysAddrHiMasks[idxPageSize]) << (48 - 12));
     246    return GCPhys;
     247}
     248
     249
    221250static void gitsCmdQueueSetError(PPDMDEVINS pDevIns, PGITSDEV pGitsDev, GITSDIAG enmDiag, bool fStallQueue)
    222251{
     
    530559        pHlp->pfnPrintf(pHlp, "    Size               = %#x (pages=%u total=%.Rhcb)\n", uSize, cPages, cbItsTable);
    531560        pHlp->pfnPrintf(pHlp, "    Page size          = %#x (%.Rhcb)\n", idxPageSize, s_acbPageSize[idxPageSize]);
    532         pHlp->pfnPrintf(pHlp, "    Shareability       = %#x\n", RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_SHAREABILITY));
    533         pHlp->pfnPrintf(pHlp, "    Phys addr          = %#RX64\n", uReg & GITS_BF_CTRL_REG_BASER_PHYS_ADDR_MASK);
     561        pHlp->pfnPrintf(pHlp, "    Shareability       = %#x\n",      RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_SHAREABILITY));
     562        pHlp->pfnPrintf(pHlp, "    Phys addr          = %#RX64 (addr=%#RX64)\n", uReg & GITS_BF_CTRL_REG_BASER_PHYS_ADDR_MASK,
     563                                                                                 gitsGetBaseRegPhysAddr(uReg));
    534564        pHlp->pfnPrintf(pHlp, "    Entry size         = %#x (%u bytes)\n", uEntrySize, uEntrySize > 0 ? uEntrySize + 1 : 0);
    535         pHlp->pfnPrintf(pHlp, "    Outer cache        = %#x\n", RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_OUTER_CACHE));
     565        pHlp->pfnPrintf(pHlp, "    Outer cache        = %#x\n",      RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_OUTER_CACHE));
    536566        pHlp->pfnPrintf(pHlp, "    Type               = %#x (%s)\n", idxType, pszType);
    537         pHlp->pfnPrintf(pHlp, "    Inner cache        = %#x\n", RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_INNER_CACHE));
    538         pHlp->pfnPrintf(pHlp, "    Indirect           = %RTbool\n", RT_BOOL(RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_INDIRECT)));
    539         pHlp->pfnPrintf(pHlp, "    Valid              = %RTbool\n", RT_BOOL(RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_VALID)));
     567        pHlp->pfnPrintf(pHlp, "    Inner cache        = %#x\n",      RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_INNER_CACHE));
     568        pHlp->pfnPrintf(pHlp, "    Indirect           = %RTbool\n",  RT_BOOL(RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_INDIRECT)));
     569        pHlp->pfnPrintf(pHlp, "    Valid              = %RTbool\n",  RT_BOOL(RT_BF_GET(uReg, GITS_BF_CTRL_REG_BASER_VALID)));
    540570    }
    541571
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