|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 2/7] iommu: add iommu_lookup_page to lookup guest gfn for a particular IOMMU mapping
If IOMMU driver does not implement lookup_page function then it returns -ENOMEM.
Returns 0 on success and any other value on failure.
Signed-off-by: Malcolm Crossley <malcolm.crossley@xxxxxxxxxx>
--
Cc: jbeulich@xxxxxxxx
Cc: xen-devel@xxxxxxxxxxxxx
---
xen/drivers/passthrough/iommu.c | 21 +++++++++++++++++++++
xen/include/xen/iommu.h | 2 ++
2 files changed, 23 insertions(+)
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index 0b2abf4..06f21ee 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -257,6 +257,27 @@ int iommu_unmap_page(struct domain *d, unsigned long gfn)
return hd->platform_ops->unmap_page(d, gfn);
}
+int iommu_lookup_page(struct domain *d, unsigned long bfn, unsigned long *gfn)
+{
+ struct hvm_iommu *hd = domain_hvm_iommu(d);
+
+ /*
+ * BFN maps 1:1 to GFN when iommu passthrough is enabled or
+ * when IOMMU shared page tables is in use
+ */
+ if ( iommu_use_hap_pt(d) || (iommu_passthrough && is_hardware_domain(d)) )
+ {
+ *gfn = bfn;
+ return 0;
+ }
+
+ if ( !iommu_enabled || !hd->platform_ops ||
+ !hd->platform_ops->lookup_page )
+ return -ENOMEM;
+
+ return hd->platform_ops->lookup_page(d, bfn, gfn);
+}
+
static void iommu_free_pagetables(unsigned long unused)
{
do {
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 8217cb7..49ca087 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -77,6 +77,7 @@ void iommu_teardown(struct domain *d);
int iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn,
unsigned int flags);
int iommu_unmap_page(struct domain *d, unsigned long gfn);
+int iommu_lookup_page(struct domain *d, unsigned long bfn, unsigned long *gfn);
enum iommu_feature
{
@@ -151,6 +152,7 @@ struct iommu_ops {
int (*map_page)(struct domain *d, unsigned long gfn, unsigned long mfn,
unsigned int flags);
int (*unmap_page)(struct domain *d, unsigned long gfn);
+ int (*lookup_page)(struct domain *d, unsigned long bfn, unsigned long
*gfn);
void (*free_page_table)(struct page_info *);
#ifdef CONFIG_X86
void (*update_ire_from_apic)(unsigned int apic, unsigned int reg, unsigned
int value);
--
1.7.12.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |