Revert "ANDROID: KVM: arm64: iommu: Avoid mapping devices in host stage-2"

This reverts commit 3212c41a2f.

Bug: 233587962
Signed-off-by: Will Deacon <willdeacon@google.com>
Change-Id: I446a83f3ef9f6704e18e02dd40655681d4ad7f50
This commit is contained in:
Will Deacon
2022-07-07 15:49:05 +01:00
parent 32a6eafeb0
commit 951a4dc774
3 changed files with 6 additions and 55 deletions

View File

@@ -18,15 +18,7 @@ struct pkvm_iommu_ops {
int (*init)(void *data, size_t size);
};
struct pkvm_iommu {
struct list_head list;
phys_addr_t pa;
size_t size;
};
int __pkvm_iommu_driver_init(enum pkvm_iommu_driver_id id, void *data, size_t size);
int pkvm_iommu_host_stage2_adjust_range(phys_addr_t addr, phys_addr_t *start,
phys_addr_t *end);
struct kvm_iommu_ops {
int (*init)(void);

View File

@@ -25,14 +25,6 @@ struct pkvm_iommu_driver {
static struct pkvm_iommu_driver iommu_drivers[PKVM_IOMMU_NR_DRIVERS];
/* IOMMU device list. Must only be accessed with host_kvm.lock held. */
static LIST_HEAD(iommu_list);
static void assert_host_component_locked(void)
{
hyp_assert_lock_held(&host_kvm.lock);
}
/*
* Find IOMMU driver by its ID. The input ID is treated as unstrusted
* and is properly validated.
@@ -109,36 +101,3 @@ out:
driver_release_init(drv, /*success=*/!ret);
return ret;
}
/*
* Check host memory access against IOMMUs' MMIO regions.
* Returns -EPERM if the address is within the bounds of a registered device.
* Otherwise returns zero and adjusts boundaries of the new mapping to avoid
* MMIO regions of registered IOMMUs.
*/
int pkvm_iommu_host_stage2_adjust_range(phys_addr_t addr, phys_addr_t *start,
phys_addr_t *end)
{
struct pkvm_iommu *dev;
phys_addr_t new_start = *start;
phys_addr_t new_end = *end;
phys_addr_t dev_start, dev_end;
assert_host_component_locked();
list_for_each_entry(dev, &iommu_list, list) {
dev_start = dev->pa;
dev_end = dev_start + dev->size;
if (addr < dev_start)
new_end = min(new_end, dev_start);
else if (addr >= dev_end)
new_start = max(new_start, dev_end);
else
return -EPERM;
}
*start = new_start;
*end = new_end;
return 0;
}

View File

@@ -572,13 +572,13 @@ static int host_stage2_idmap(u64 addr)
prot = is_memory ? PKVM_HOST_MEM_PROT : PKVM_HOST_MMIO_PROT;
/*
* Adjust against IOMMU devices first. host_stage2_adjust_range() should
* be called last for proper alignment.
/**
* Let device drivers adjust the permitted range first.
* host_stage2_adjust_range() should be last to also properly align it.
*/
if (!is_memory) {
ret = pkvm_iommu_host_stage2_adjust_range(addr, &range.start,
&range.end);
if (!is_memory && kvm_iommu_ops.host_stage2_adjust_mmio_range) {
ret = kvm_iommu_ops.host_stage2_adjust_mmio_range(addr, &range.start,
&range.end);
if (ret)
return ret;
}