mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
xen/cet: Fix __initconst_cf_clobber
The linker script collecting .init.rodata.* ahead of .init.rodata.cf_clobber accidentally causes __initconst_cf_clobber to be a no-op. Rearrange the linker script to unbreak this. The IOMMU adjust_irq_affinities() hooks currently violate the safety requirement for being cf_clobber, by also being plain __initcall()'s. Consolidate to a single initcall using the iommu_adjust_irq_affinities() wrapper (satisfying the cf_clobber safety requirement by using iommu_call() under the hood), and also removes the dubious property that we'd call into both vendors IOMMU drivers on boot, relying on the for_each_*() loops to be empty for safety. With this fixed, an all-enabled build of Xen has 1681 endbr64's in .text with 382 (23%) being clobbered during boot. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
4b7fd8153d
commit
3e56754b08
4 files changed
+12
-8
No files matched your search
@@ -210,6 +210,12 @@ SECTIONS
|
||||
DECL_SECTION(.init.data) {
|
||||
#endif
|
||||
|
||||
. = ALIGN(POINTER_ALIGN);
|
||||
__initdata_cf_clobber_start = .;
|
||||
*(.init.data.cf_clobber)
|
||||
*(.init.rodata.cf_clobber)
|
||||
__initdata_cf_clobber_end = .;
|
||||
|
||||
*(.init.rodata)
|
||||
*(.init.rodata.*)
|
||||
|
||||
@@ -224,12 +230,6 @@ SECTIONS
|
||||
*(.initcall1.init)
|
||||
__initcall_end = .;
|
||||
|
||||
. = ALIGN(POINTER_ALIGN);
|
||||
__initdata_cf_clobber_start = .;
|
||||
*(.init.data.cf_clobber)
|
||||
*(.init.rodata.cf_clobber)
|
||||
__initdata_cf_clobber_end = .;
|
||||
|
||||
*(.init.data)
|
||||
*(.init.data.rel)
|
||||
*(.init.data.rel.*)
|
||||
|
||||
@@ -831,7 +831,6 @@ int cf_check iov_adjust_irq_affinities(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
__initcall(iov_adjust_irq_affinities);
|
||||
|
||||
/*
|
||||
* Family15h Model 10h-1fh erratum 746 (IOMMU Logging May Stall Translations)
|
||||
|
||||
@@ -2119,7 +2119,6 @@ static int cf_check adjust_vtd_irq_affinities(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
__initcall(adjust_vtd_irq_affinities);
|
||||
|
||||
static int __must_check init_vtd_hw(bool resume)
|
||||
{
|
||||
|
||||
@@ -462,6 +462,12 @@ bool arch_iommu_use_permitted(const struct domain *d)
|
||||
likely(!p2m_get_hostp2m(d)->global_logdirty));
|
||||
}
|
||||
|
||||
static int __init cf_check adjust_irq_affinities(void)
|
||||
{
|
||||
return iommu_adjust_irq_affinities();
|
||||
}
|
||||
__initcall(adjust_irq_affinities);
|
||||
|
||||
/*
|
||||
* Local variables:
|
||||
* mode: C
|
||||
|
||||