Messages in this thread Patch in this message | | | From | Joan Bruguera <> | Subject | Re: Wake-up from suspend to RAM broken under `retbleed=stuff` | Date | Mon, 9 Jan 2023 04:05:31 +0000 |
| |
This fixes wakeup for me on both QEMU and real HW (just a proof of concept, don't merge)
diff --git a/arch/x86/kernel/callthunks.c b/arch/x86/kernel/callthunks.c index ffea98f9064b..8704bcc0ce32 100644 --- a/arch/x86/kernel/callthunks.c +++ b/arch/x86/kernel/callthunks.c @@ -7,6 +7,7 @@ #include <linux/memory.h> #include <linux/moduleloader.h> #include <linux/static_call.h> +#include <linux/suspend.h> #include <asm/alternative.h> #include <asm/asm-offsets.h> @@ -150,6 +151,10 @@ static bool skip_addr(void *dest) if (dest >= (void *)hypercall_page && dest < (void*)hypercall_page + PAGE_SIZE) return true; +#endif +#ifdef CONFIG_PM_SLEEP + if (dest == restore_processor_state) + return true; #endif return false; } diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c index 236447ee9beb..e667894936f7 100644 --- a/arch/x86/power/cpu.c +++ b/arch/x86/power/cpu.c @@ -281,6 +281,9 @@ static void notrace __restore_processor_state(struct saved_context *ctxt) /* Needed by apm.c */ void notrace restore_processor_state(void) { + /* Restore GS before calling anything to avoid crash on call depth accounting */ + native_wrmsrl(MSR_GS_BASE, saved_context.kernelmode_gs_base); + __restore_processor_state(&saved_context); } #ifdef CONFIG_X86_32
| |