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:
Andrew Cooper committed 2022-03-03 11:21:35 +00:00
1 parent 4b7fd8153d
commit 3e56754b08
4 files changed
+12 -8

No files matched your search

+6 -6
View File
@@ -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.*)
-1
View File
@@ -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)
-1
View File
@@ -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)
{
+6
View File
@@ -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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.