mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/iommu: cleanup iommu related domctl handling
Today iommu_do_domctl() is being called from arch_do_domctl() in the "default:" case of a switch statement. This has led already to crashes due to unvalidated parameters. Fix that by moving the call of iommu_do_domctl() to the main switch statement of do_domctl(). Signed-off-by: Juergen Gross <jgross@suse.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org> # Arm
This commit is contained in:
1 parent
2419a159fb
commit
9cd7e31b3f
4 files changed
+18
-14
No files matched your search
+1
-10
@@ -176,16 +176,7 @@ long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
|
||||
return rc;
|
||||
}
|
||||
default:
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = subarch_do_domctl(domctl, d, u_domctl);
|
||||
|
||||
if ( rc == -ENOSYS )
|
||||
rc = iommu_do_domctl(domctl, d, u_domctl);
|
||||
|
||||
return rc;
|
||||
}
|
||||
return subarch_do_domctl(domctl, d, u_domctl);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1370,7 +1370,7 @@ long arch_do_domctl(
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = iommu_do_domctl(domctl, d, u_domctl);
|
||||
ret = -ENOSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -871,6 +871,13 @@ long cf_check do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
|
||||
copyback = 1;
|
||||
break;
|
||||
|
||||
case XEN_DOMCTL_assign_device:
|
||||
case XEN_DOMCTL_test_assign_device:
|
||||
case XEN_DOMCTL_deassign_device:
|
||||
case XEN_DOMCTL_get_device_group:
|
||||
ret = iommu_do_domctl(op, d, u_domctl);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = arch_do_domctl(op, d, u_domctl);
|
||||
break;
|
||||
|
||||
@@ -342,8 +342,17 @@ struct domain_iommu {
|
||||
/* Does the IOMMU pagetable need to be kept synchronized with the P2M */
|
||||
#ifdef CONFIG_HAS_PASSTHROUGH
|
||||
#define need_iommu_pt_sync(d) (dom_iommu(d)->need_sync)
|
||||
|
||||
int iommu_do_domctl(struct xen_domctl *domctl, struct domain *d,
|
||||
XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl);
|
||||
#else
|
||||
#define need_iommu_pt_sync(d) ({ (void)(d); false; })
|
||||
|
||||
static inline int iommu_do_domctl(struct xen_domctl *domctl, struct domain *d,
|
||||
XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
#endif
|
||||
|
||||
int __must_check iommu_suspend(void);
|
||||
@@ -357,9 +366,6 @@ int iommu_do_pci_domctl(struct xen_domctl *, struct domain *d,
|
||||
XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
|
||||
#endif
|
||||
|
||||
int iommu_do_domctl(struct xen_domctl *, struct domain *d,
|
||||
XEN_GUEST_HANDLE_PARAM(xen_domctl_t));
|
||||
|
||||
void iommu_dev_iotlb_flush_timeout(struct domain *d, struct pci_dev *pdev);
|
||||
|
||||
/*
|
||||
|
||||