Skip to content

Commit

Permalink
x86/iommu: introduce a cache sync hook
Browse files Browse the repository at this point in the history
The hook is only implemented for VT-d and it uses the already existing
iommu_sync_cache function present in VT-d code. The new hook is
added so that the cache can be flushed by code outside of VT-d when
using shared page tables.

Note that alloc_pgtable_maddr must use the now locally defined
sync_cache function, because IOMMU ops are not yet setup the first
time the function gets called during IOMMU initialization.

No functional change intended.

This is part of XSA-321.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
  • Loading branch information
royger authored and jbeulich committed Jul 7, 2020
1 parent 6229882 commit 91526b4
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 3 deletions.
1 change: 0 additions & 1 deletion xen/drivers/passthrough/vtd/extern.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ void disable_qinval(struct vtd_iommu *iommu);
int enable_intremap(struct vtd_iommu *iommu, int eim);
void disable_intremap(struct vtd_iommu *iommu);

void iommu_sync_cache(const void *addr, unsigned int size);
int iommu_alloc(struct acpi_drhd_unit *drhd);
void iommu_free(struct acpi_drhd_unit *drhd);

Expand Down
5 changes: 3 additions & 2 deletions xen/drivers/passthrough/vtd/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ static int context_get_domain_id(struct context_entry *context,

static int iommus_incoherent;

void iommu_sync_cache(const void *addr, unsigned int size)
static void sync_cache(const void *addr, unsigned int size)
{
int i;
static unsigned int clflush_size = 0;
Expand Down Expand Up @@ -180,7 +180,7 @@ uint64_t alloc_pgtable_maddr(unsigned long npages, nodeid_t node)
vaddr = __map_domain_page(cur_pg);
memset(vaddr, 0, PAGE_SIZE);

iommu_sync_cache(vaddr, PAGE_SIZE);
sync_cache(vaddr, PAGE_SIZE);
unmap_domain_page(vaddr);
cur_pg++;
}
Expand Down Expand Up @@ -2778,6 +2778,7 @@ const struct iommu_ops __initconstrel intel_iommu_ops = {
.iotlb_flush_all = iommu_flush_iotlb_all,
.get_reserved_device_memory = intel_iommu_get_reserved_device_memory,
.dump_p2m_table = vtd_dump_p2m_table,
.sync_cache = sync_cache,
};

const struct iommu_init_ops __initconstrel intel_iommu_init_ops = {
Expand Down
7 changes: 7 additions & 0 deletions xen/include/asm-x86/iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,13 @@ extern bool untrusted_msi;
int pi_update_irte(const struct pi_desc *pi_desc, const struct pirq *pirq,
const uint8_t gvec);

#define iommu_sync_cache(addr, size) ({ \
const struct iommu_ops *ops = iommu_get_ops(); \
\
if ( ops->sync_cache ) \
iommu_vcall(ops, sync_cache, addr, size); \
})

#endif /* !__ARCH_X86_IOMMU_H__ */
/*
* Local variables:
Expand Down
1 change: 1 addition & 0 deletions xen/include/xen/iommu.h
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ struct iommu_ops {
int (*setup_hpet_msi)(struct msi_desc *);

int (*adjust_irq_affinities)(void);
void (*sync_cache)(const void *addr, unsigned int size);
#endif /* CONFIG_X86 */

int __must_check (*suspend)(void);
Expand Down

0 comments on commit 91526b4

Please sign in to comment.