]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/ibt: Add exact_endbr() helper
authorPeter Zijlstra <peterz@infradead.org>
Mon, 24 Feb 2025 12:37:05 +0000 (13:37 +0100)
committerIngo Molnar <mingo@kernel.org>
Wed, 26 Feb 2025 11:11:18 +0000 (12:11 +0100)
For when we want to exactly match ENDBR, and not everything that we
can scribble it with.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Kees Cook <kees@kernel.org>
Link: https://lore.kernel.org/r/20250224124200.059556588@infradead.org
arch/x86/kernel/alternative.c

index 1142ebd3bb49cde8890498bc29ea8f6dbc0d012e..83316ea470b2bed35f84e0ddaded0f5dafce6e99 100644 (file)
@@ -863,6 +863,21 @@ Efault:
        return false;
 }
 
+#ifdef CONFIG_FINEIBT
+
+static __noendbr bool exact_endbr(u32 *val)
+{
+       u32 endbr;
+
+       __get_kernel_nofault(&endbr, val, u32, Efault);
+       return endbr == gen_endbr();
+
+Efault:
+       return false;
+}
+
+#endif
+
 static void poison_cfi(void *addr);
 
 static void __init_or_module poison_endbr(void *addr)
@@ -1426,10 +1441,9 @@ static void poison_cfi(void *addr)
 bool decode_fineibt_insn(struct pt_regs *regs, unsigned long *target, u32 *type)
 {
        unsigned long addr = regs->ip - fineibt_preamble_ud2;
-       u32 endbr, hash;
+       u32 hash;
 
-       __get_kernel_nofault(&endbr, addr, u32, Efault);
-       if (endbr != gen_endbr())
+       if (!exact_endbr((void *)addr))
                return false;
 
        *target = addr + fineibt_preamble_size;