mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +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
master commit: 9cd7e31b3f
master date: 2022-04-26 10:23:58 +0200
This commit is contained in:
1 parent
2e6062aa82
commit
3b1031b3b4
4 files changed
+18
-14
No files matched your search
+1
-10
@@ -174,16 +174,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1374,7 +1374,7 @@ long arch_do_domctl(
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = iommu_do_domctl(domctl, d, u_domctl);
|
||||
ret = -ENOSYS;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -866,6 +866,13 @@ long 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;
|
||||
|
||||
@@ -344,8 +344,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);
|
||||
@@ -359,9 +368,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);
|
||||
|
||||
/*
|
||||
|
||||