exec: introduce address_space_get_iotlb_entry()
This patch introduces a helper to query the iotlb entry for a possible iova. This will be used by later device IOTLB API to enable the capability for a dataplane (e.g vhost) to query the IOTLB. Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Peter Crosthwaite <crosthwaite.peter@gmail.com> Cc: Richard Henderson <rth@twiddle.net> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
2d3fc5816e
commit
052c8fa998
33
exec.c
33
exec.c
@ -448,6 +448,39 @@ address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *x
|
|||||||
return section;
|
return section;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Called from RCU critical section */
|
||||||
|
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
|
||||||
|
bool is_write)
|
||||||
|
{
|
||||||
|
IOMMUTLBEntry iotlb = {0};
|
||||||
|
MemoryRegionSection *section;
|
||||||
|
MemoryRegion *mr;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
AddressSpaceDispatch *d = atomic_rcu_read(&as->dispatch);
|
||||||
|
section = address_space_lookup_region(d, addr, false);
|
||||||
|
addr = addr - section->offset_within_address_space
|
||||||
|
+ section->offset_within_region;
|
||||||
|
mr = section->mr;
|
||||||
|
|
||||||
|
if (!mr->iommu_ops) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
iotlb = mr->iommu_ops->translate(mr, addr, is_write);
|
||||||
|
if (!(iotlb.perm & (1 << is_write))) {
|
||||||
|
iotlb.target_as = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = ((iotlb.translated_addr & ~iotlb.addr_mask)
|
||||||
|
| (addr & iotlb.addr_mask));
|
||||||
|
as = iotlb.target_as;
|
||||||
|
}
|
||||||
|
|
||||||
|
return iotlb;
|
||||||
|
}
|
||||||
|
|
||||||
/* Called from RCU critical section */
|
/* Called from RCU critical section */
|
||||||
MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
|
MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
|
||||||
hwaddr *xlat, hwaddr *plen,
|
hwaddr *xlat, hwaddr *plen,
|
||||||
|
@ -1537,6 +1537,11 @@ void stl_le_phys_cached(MemoryRegionCache *cache, hwaddr addr, uint32_t val);
|
|||||||
void stl_be_phys_cached(MemoryRegionCache *cache, hwaddr addr, uint32_t val);
|
void stl_be_phys_cached(MemoryRegionCache *cache, hwaddr addr, uint32_t val);
|
||||||
void stq_le_phys_cached(MemoryRegionCache *cache, hwaddr addr, uint64_t val);
|
void stq_le_phys_cached(MemoryRegionCache *cache, hwaddr addr, uint64_t val);
|
||||||
void stq_be_phys_cached(MemoryRegionCache *cache, hwaddr addr, uint64_t val);
|
void stq_be_phys_cached(MemoryRegionCache *cache, hwaddr addr, uint64_t val);
|
||||||
|
/* address_space_get_iotlb_entry: translate an address into an IOTLB
|
||||||
|
* entry. Should be called from an RCU critical section.
|
||||||
|
*/
|
||||||
|
IOMMUTLBEntry address_space_get_iotlb_entry(AddressSpace *as, hwaddr addr,
|
||||||
|
bool is_write);
|
||||||
|
|
||||||
/* address_space_translate: translate an address range into an address space
|
/* address_space_translate: translate an address range into an address space
|
||||||
* into a MemoryRegion and an address range into that section. Should be
|
* into a MemoryRegion and an address range into that section. Should be
|
||||||
|
Loading…
Reference in New Issue
Block a user