|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH 4/8] x86/alternatives: Factor seal_endbr64() out of _apply_alternatives()
We are going to need to reposition the call in a change with several moving
parts.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
---
xen/arch/x86/alternative.c | 70 ++++++++++++++++++++++----------------
1 file changed, 40 insertions(+), 30 deletions(-)
diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c
index 9aa591b364a4..4b9f8d860153 100644
--- a/xen/arch/x86/alternative.c
+++ b/xen/arch/x86/alternative.c
@@ -162,6 +162,44 @@ text_poke(void *addr, const void *opcode, size_t len)
extern void *const __initdata_cf_clobber_start[];
extern void *const __initdata_cf_clobber_end[];
+/*
+ * In CET-IBT enabled builds, clobber endbr64 instructions after altcall has
+ * finished optimising all indirect branches to direct ones.
+ */
+static void __init seal_endbr64(void)
+{
+ void *const *val;
+ unsigned int clobbered = 0;
+
+ if ( !cpu_has_xen_ibt )
+ return;
+
+ /*
+ * This is some minor structure (ab)use. We walk the entire contents
+ * of .init.{ro,}data.cf_clobber as if it were an array of pointers.
+ *
+ * If the pointer points into .text, and at an endbr64 instruction,
+ * nop out the endbr64. This causes the pointer to no longer be a
+ * legal indirect branch target under CET-IBT. This is a
+ * defence-in-depth measure, to reduce the options available to an
+ * adversary who has managed to hijack a function pointer.
+ */
+ for ( val = __initdata_cf_clobber_start;
+ val < __initdata_cf_clobber_end;
+ val++ )
+ {
+ void *ptr = *val;
+
+ if ( !is_kernel_text(ptr) || !is_endbr64(ptr) )
+ continue;
+
+ place_endbr64_poison(ptr);
+ clobbered++;
+ }
+
+ printk("altcall: Optimised away %u endbr64 instructions\n", clobbered);
+}
+
/*
* Replace instructions with better alternatives for this CPU type.
* This runs before SMP is initialized to avoid SMP problems with
@@ -344,36 +382,8 @@ static int init_or_livepatch _apply_alternatives(struct
alt_instr *start,
* Clobber endbr64 instructions now that altcall has finished optimising
* all indirect branches to direct ones.
*/
- if ( force && cpu_has_xen_ibt && system_state < SYS_STATE_active )
- {
- void *const *val;
- unsigned int clobbered = 0;
-
- /*
- * This is some minor structure (ab)use. We walk the entire contents
- * of .init.{ro,}data.cf_clobber as if it were an array of pointers.
- *
- * If the pointer points into .text, and at an endbr64 instruction,
- * nop out the endbr64. This causes the pointer to no longer be a
- * legal indirect branch target under CET-IBT. This is a
- * defence-in-depth measure, to reduce the options available to an
- * adversary who has managed to hijack a function pointer.
- */
- for ( val = __initdata_cf_clobber_start;
- val < __initdata_cf_clobber_end;
- val++ )
- {
- void *ptr = *val;
-
- if ( !is_kernel_text(ptr) || !is_endbr64(ptr) )
- continue;
-
- place_endbr64_poison(ptr);
- clobbered++;
- }
-
- printk("altcall: Optimised away %u endbr64 instructions\n", clobbered);
- }
+ if ( force && system_state < SYS_STATE_active )
+ seal_endbr64();
return 0;
}
--
2.39.5
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |