HV: add uint64_t bar_base_mapped[PCI_BAR_COUNT] to struct pci_vdev

To remember the previously mapped/registered vbar base

For the following reasons:
 register_mmio_emulation_handler() will throw an error if the the same addr_lo is
 alreayd registered before

 We are going to remove the base member from struct pci_bar, so we cannot use vdev->bar[idx].base
 in the code any more

 In subsequent commits, we will assume vdev_pt_remap_generic_mem_vbar() is called after a new
 vbar base is set, mainly because of 64-bit mmio bar handling, so we need a
 separate bar_base_mapped[] array to track the previously mapped vbar bases.

Tracked-On: #3241
Signed-off-by: dongshen <dongsheng.x.zhang@intel.com>
Reviewed-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
dongshen
2019-06-27 16:42:29 -07:00
committed by ACRN System Integration
parent 65ca6ae498
commit ed1bdcbbdf
2 changed files with 16 additions and 5 deletions

View File

@@ -245,8 +245,12 @@ void vdev_pt_remap_msix_table_bar(struct pci_vdev *vdev)
addr_lo = round_page_down(msix->mmio_gpa + msix->table_offset);
}
register_mmio_emulation_handler(vdev->vpci->vm, vmsix_table_mmio_access_handler,
addr_lo, addr_hi, vdev);
if (vdev->bar_base_mapped[msix->table_bar] != addr_lo) {
register_mmio_emulation_handler(vdev->vpci->vm, vmsix_table_mmio_access_handler,
addr_lo, addr_hi, vdev);
/* Remember the previously registered MMIO vbar base */
vdev->bar_base_mapped[msix->table_bar] = addr_lo;
}
}
}
@@ -258,15 +262,16 @@ void vdev_pt_remap_msix_table_bar(struct pci_vdev *vdev)
* @pre vdev->vpci != NULL
* @pre vdev->vpci->vm != NULL
*/
static void vdev_pt_remap_generic_mem_vbar(const struct pci_vdev *vdev, uint32_t idx, uint32_t new_base)
static void vdev_pt_remap_generic_mem_vbar(struct pci_vdev *vdev, uint32_t idx, uint32_t new_base)
{
struct acrn_vm *vm = vdev->vpci->vm;
/* If the old vbar is mapped before, unmap it first */
if (vdev->bar[idx].base != 0UL) {
if (vdev->bar_base_mapped[idx] != 0UL) {
ept_del_mr(vm, (uint64_t *)vm->arch_vm.nworld_eptp,
vdev->bar[idx].base, /* GPA (old vbar) */
vdev->bar_base_mapped[idx], /* GPA (old vbar) */
vdev->bar[idx].size);
vdev->bar_base_mapped[idx] = 0UL;
}
if (new_base != 0U) {
@@ -278,6 +283,9 @@ static void vdev_pt_remap_generic_mem_vbar(const struct pci_vdev *vdev, uint32_t
new_base, /*GPA*/
vdev->bar[idx].size,
EPT_WR | EPT_RD | EPT_UNCACHED);
/* Remember the previously mapped MMIO vbar */
vdev->bar_base_mapped[idx] = (uint64_t)new_base;
}
}