mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 02:30:03 +01:00
iommu: avoid triggering ASSERT_UNREACHABLE() on ARM...
...when the IOMMU is not enabled.
80ff3d338d "iommu: tidy up iommu_use_hap_pt() and need_iommu_pt_sync()
macros" introduced CONFIG_IOMMU_FORCE_PT_SHARE, which causes the global
'iommu_hap_pt_share' option to be replaced with a #define-d value of true.
In this configuration, calling clear_iommu_hap_pt_share() will result
trigger the aforementioned ASSERT.
CONFIG_IOMMU_FORCE_PT_SHARE is always selected for ARM builds and,
because clear_iommu_hap_pt_share() is called by the common iommu_setup()
function if the IOMMU is not enabled, it is no longer safe to disable the
IOMMU on ARM systems.
However, running with the IOMMU disabled is a valid configuration for ARM
systems, so this patch rectifies the problem by removing the call to
clear_iommu_hap_pt_share() from common code. As a side effect of this,
however, it becomes possible on x86 systems for iommu_enabled to be false
but iommu_hap_pt_share to be true. Thus the code in sysctl.c
needs to be changed to make sure that XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share
is not erroneously advertised when the IOMMU has been disabled.
Reported-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Acked-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
8f78242899
commit
52633db2c5
2 files changed
+4
-5
No files matched your search
+4
-2
@@ -268,9 +268,11 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
|
||||
pi->max_mfn = get_upper_mfn_bound();
|
||||
arch_do_physinfo(pi);
|
||||
if ( iommu_enabled )
|
||||
{
|
||||
pi->capabilities |= XEN_SYSCTL_PHYSCAP_directio;
|
||||
if ( iommu_hap_pt_share )
|
||||
pi->capabilities |= XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share;
|
||||
if ( iommu_hap_pt_share )
|
||||
pi->capabilities |= XEN_SYSCTL_PHYSCAP_iommu_hap_pt_share;
|
||||
}
|
||||
|
||||
if ( copy_to_guest(u_sysctl, op, 1) )
|
||||
ret = -EFAULT;
|
||||
|
||||
@@ -454,10 +454,7 @@ int __init iommu_setup(void)
|
||||
iommu_enabled = (rc == 0);
|
||||
}
|
||||
if ( !iommu_enabled )
|
||||
{
|
||||
iommu_intremap = 0;
|
||||
clear_iommu_hap_pt_share();
|
||||
}
|
||||
|
||||
if ( (force_iommu && !iommu_enabled) ||
|
||||
(force_intremap && !iommu_intremap) )
|
||||
|
||||