VirtualBox

Ignore:
Timestamp:
Jun 16, 2023 6:54:50 AM (18 months ago)
Author:
vboxsync
Message:

Devices/VMMDev: Add an MMIO interface in addition to the existing PIO interface for guest additions running inside an ARM based guest. Also remove the dependency from the architecture page size and introduce a 4KiB VMM page size as ARM has different page sizes (4KiB, 16KiB, 64KiB) and it can differ between host and guest, bugref:10456

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp

    r98103 r100185  
    691691    if (pPtr->cPages == 1)
    692692        return true;
    693     RTGCPHYS64 Phys = pPtr->paPages[0] + GUEST_PAGE_SIZE;
     693    RTGCPHYS64 Phys = pPtr->paPages[0] + VMMDEV_PAGE_SIZE;
    694694    if (Phys != pPtr->paPages[1])
    695695        return false;
     
    699699        do
    700700        {
    701             Phys += GUEST_PAGE_SIZE;
     701            Phys += VMMDEV_PAGE_SIZE;
    702702            if (Phys != pPtr->paPages[iPage])
    703703                return false;
     
    734734    for (uint32_t iPage = 0; iPage < pPtr->cPages && cbRemaining > 0; ++iPage)
    735735    {
    736         uint32_t cbToRead = GUEST_PAGE_SIZE - offPage;
     736        uint32_t cbToRead = VMMDEV_PAGE_SIZE - offPage;
    737737        if (cbToRead > cbRemaining)
    738738            cbToRead = cbRemaining;
     
    773773    for (iPage = 0; iPage < pPtr->cPages && cbRemaining > 0; ++iPage)
    774774    {
    775         uint32_t cbToWrite = GUEST_PAGE_SIZE - offPage;
     775        uint32_t cbToWrite = VMMDEV_PAGE_SIZE - offPage;
    776776        if (cbToWrite > cbRemaining)
    777777            cbToWrite = cbRemaining;
     
    10981098                ASSERT_GUEST_RETURN(cbData <= VMMDEV_MAX_HGCM_DATA_SIZE, VERR_INVALID_PARAMETER);
    10991099
    1100                 const uint32_t offFirstPage = cbData > 0 ? GCPtr & GUEST_PAGE_OFFSET_MASK : 0;
    1101                 const uint32_t cPages       = cbData > 0 ? (offFirstPage + cbData + GUEST_PAGE_SIZE - 1) / GUEST_PAGE_SIZE : 0;
     1100                const uint32_t offFirstPage = cbData > 0 ? GCPtr & VMMDEV_PAGE_OFFSET_MASK : 0;
     1101                const uint32_t cPages       = cbData > 0 ? (offFirstPage + cbData + VMMDEV_PAGE_SIZE - 1) / VMMDEV_PAGE_SIZE : 0;
    11021102
    11031103                pGuestParm->u.ptr.cbData        = cbData;
     
    11191119
    11201120                    /* Gonvert the guest linear pointers of pages to physical addresses. */
    1121                     GCPtr &= ~(RTGCPTR)GUEST_PAGE_OFFSET_MASK;
     1121                    GCPtr &= ~(RTGCPTR)VMMDEV_PAGE_OFFSET_MASK;
    11221122                    for (uint32_t iPage = 0; iPage < cPages; ++iPage)
    11231123                    {
     
    11341134
    11351135                        pGuestParm->u.ptr.paPages[iPage] = GCPhys;
    1136                         GCPtr += GUEST_PAGE_SIZE;
     1136                        GCPtr += VMMDEV_PAGE_SIZE;
    11371137                    }
    11381138                }
     
    11791179                                        ("%#x\n", pPageListInfo->flags), VERR_INVALID_FLAGS);
    11801180                /* First page offset. */
    1181                 ASSERT_GUEST_MSG_RETURN(pPageListInfo->offFirstPage < GUEST_PAGE_SIZE,
     1181                ASSERT_GUEST_MSG_RETURN(pPageListInfo->offFirstPage < VMMDEV_PAGE_SIZE,
    11821182                                        ("%#x\n", pPageListInfo->offFirstPage), VERR_INVALID_PARAMETER);
    11831183
     
    11871187                ASSERT_GUEST_MSG_RETURN(      pPageListInfo->cPages
    11881188                                           == (pGuestParm->enmType == VMMDevHGCMParmType_ContiguousPageList ? 1
    1189                                                :    RT_ALIGN_32(pPageListInfo->offFirstPage + cbData, GUEST_PAGE_SIZE)
    1190                                                  >> GUEST_PAGE_SHIFT)
     1189                                               :    RT_ALIGN_32(pPageListInfo->offFirstPage + cbData, VMMDEV_PAGE_SIZE)
     1190                                                 >> VMMDEV_PAGE_SHIFT)
    11911191                                        || pGuestParm->enmType == VMMDevHGCMParmType_PageList,
    11921192                                        ("offFirstPage=%#x cbData=%#x cPages=%#x enmType=%d\n",
     
    12031203                {
    12041204                    /* Validate page offsets */
    1205                     ASSERT_GUEST_MSG_RETURN(   !(pPageListInfo->aPages[0] & GUEST_PAGE_OFFSET_MASK)
    1206                                             || (pPageListInfo->aPages[0] & GUEST_PAGE_OFFSET_MASK) == pPageListInfo->offFirstPage,
     1205                    ASSERT_GUEST_MSG_RETURN(   !(pPageListInfo->aPages[0] & VMMDEV_PAGE_OFFSET_MASK)
     1206                                            || (pPageListInfo->aPages[0] & VMMDEV_PAGE_OFFSET_MASK) == pPageListInfo->offFirstPage,
    12071207                                            ("%#RX64 offFirstPage=%#x\n", pPageListInfo->aPages[0], pPageListInfo->offFirstPage),
    12081208                                            VERR_INVALID_POINTER);
    12091209                    uint32_t const cPages = pPageListInfo->cPages;
    12101210                    for (uint32_t iPage = 1; iPage < cPages; iPage++)
    1211                         ASSERT_GUEST_MSG_RETURN(!(pPageListInfo->aPages[iPage] & GUEST_PAGE_OFFSET_MASK),
     1211                        ASSERT_GUEST_MSG_RETURN(!(pPageListInfo->aPages[iPage] & VMMDEV_PAGE_OFFSET_MASK),
    12121212                                                ("[%#zx]=%#RX64\n", iPage, pPageListInfo->aPages[iPage]), VERR_INVALID_POINTER);
    12131213                    RT_UNTRUSTED_VALIDATED_FENCE();
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