x86/retbleed: Add SKL call thunk
authorThomas Gleixner <tglx@linutronix.de>
Thu, 15 Sep 2022 11:11:29 +0000 (13:11 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 17 Oct 2022 14:41:15 +0000 (16:41 +0200)
Add the actual SKL call thunk for call depth accounting.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220915111148.101125588@infradead.org
arch/x86/kernel/callthunks.c

index 7b9d998..01f6f6b 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/moduleloader.h>
 
 #include <asm/alternative.h>
+#include <asm/asm-offsets.h>
 #include <asm/cpu.h>
 #include <asm/ftrace.h>
 #include <asm/insn.h>
@@ -55,7 +56,21 @@ static const struct core_text builtin_coretext = {
        .name = "builtin",
 };
 
-static struct thunk_desc callthunk_desc __ro_after_init;
+asm (
+       ".pushsection .rodata                           \n"
+       ".global skl_call_thunk_template                \n"
+       "skl_call_thunk_template:                       \n"
+               __stringify(INCREMENT_CALL_DEPTH)"      \n"
+       ".global skl_call_thunk_tail                    \n"
+       "skl_call_thunk_tail:                           \n"
+       ".popsection                                    \n"
+);
+
+extern u8 skl_call_thunk_template[];
+extern u8 skl_call_thunk_tail[];
+
+#define SKL_TMPL_SIZE \
+       ((unsigned int)(skl_call_thunk_tail - skl_call_thunk_template))
 
 extern void error_entry(void);
 extern void xen_error_entry(void);
@@ -157,11 +172,11 @@ static const u8 nops[] = {
 
 static __init_or_module void *patch_dest(void *dest, bool direct)
 {
-       unsigned int tsize = callthunk_desc.template_size;
+       unsigned int tsize = SKL_TMPL_SIZE;
        u8 *pad = dest - tsize;
 
        /* Already patched? */
-       if (!bcmp(pad, callthunk_desc.template, tsize))
+       if (!bcmp(pad, skl_call_thunk_template, tsize))
                return pad;
 
        /* Ensure there are nops */
@@ -171,9 +186,9 @@ static __init_or_module void *patch_dest(void *dest, bool direct)
        }
 
        if (direct)
-               memcpy(pad, callthunk_desc.template, tsize);
+               memcpy(pad, skl_call_thunk_template, tsize);
        else
-               text_poke_copy_locked(pad, callthunk_desc.template, tsize, true);
+               text_poke_copy_locked(pad, skl_call_thunk_template, tsize, true);
        return pad;
 }