From: Greg Kroah-Hartman Date: Thu, 19 May 2022 12:56:36 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v4.9.316~64 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4db987987b164dd47b5fe64fc44729e5ee24cbaf;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: x86-xen-make-the-boot-cpu-idle-task-reliable.patch x86-xen-make-the-secondary-cpu-idle-tasks-reliable.patch --- diff --git a/queue-5.4/series b/queue-5.4/series index 0a3d63c4ea5..c8f5a38cdce 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -1 +1,3 @@ floppy-use-a-statically-allocated-error-counter.patch +x86-xen-make-the-boot-cpu-idle-task-reliable.patch +x86-xen-make-the-secondary-cpu-idle-tasks-reliable.patch diff --git a/queue-5.4/x86-xen-make-the-boot-cpu-idle-task-reliable.patch b/queue-5.4/x86-xen-make-the-boot-cpu-idle-task-reliable.patch new file mode 100644 index 00000000000..6dbbdcea91a --- /dev/null +++ b/queue-5.4/x86-xen-make-the-boot-cpu-idle-task-reliable.patch @@ -0,0 +1,54 @@ +From 2f62f36e62daec43aa7b9633ef7f18e042a80bed Mon Sep 17 00:00:00 2001 +From: Miroslav Benes +Date: Thu, 26 Mar 2020 10:26:02 +0100 +Subject: x86/xen: Make the boot CPU idle task reliable + +From: Miroslav Benes + +commit 2f62f36e62daec43aa7b9633ef7f18e042a80bed upstream. + +The unwinder reports the boot CPU idle task's stack on XEN PV as +unreliable, which affects at least live patching. There are two reasons +for this. First, the task does not follow the x86 convention that its +stack starts at the offset right below saved pt_regs. It allows the +unwinder to easily detect the end of the stack and verify it. Second, +startup_xen() function does not store the return address before jumping +to xen_start_kernel() which confuses the unwinder. + +Amend both issues by moving the starting point of initial stack in +startup_xen() and storing the return address before the jump, which is +exactly what call instruction does. + +Signed-off-by: Miroslav Benes +Reviewed-by: Juergen Gross +Signed-off-by: Juergen Gross +Signed-off-by: Markus Boehme +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/xen/xen-head.S | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +--- a/arch/x86/xen/xen-head.S ++++ b/arch/x86/xen/xen-head.S +@@ -35,7 +35,11 @@ ENTRY(startup_xen) + rep __ASM_SIZE(stos) + + mov %_ASM_SI, xen_start_info +- mov $init_thread_union+THREAD_SIZE, %_ASM_SP ++#ifdef CONFIG_X86_64 ++ mov initial_stack(%rip), %rsp ++#else ++ mov pa(initial_stack), %esp ++#endif + + #ifdef CONFIG_X86_64 + /* Set up %gs. +@@ -51,7 +55,7 @@ ENTRY(startup_xen) + wrmsr + #endif + +- jmp xen_start_kernel ++ call xen_start_kernel + END(startup_xen) + __FINIT + #endif diff --git a/queue-5.4/x86-xen-make-the-secondary-cpu-idle-tasks-reliable.patch b/queue-5.4/x86-xen-make-the-secondary-cpu-idle-tasks-reliable.patch new file mode 100644 index 00000000000..4a0e6f11120 --- /dev/null +++ b/queue-5.4/x86-xen-make-the-secondary-cpu-idle-tasks-reliable.patch @@ -0,0 +1,70 @@ +From c3881eb58d56116c79ac4ee4f40fd15ead124c4b Mon Sep 17 00:00:00 2001 +From: Miroslav Benes +Date: Thu, 26 Mar 2020 10:26:03 +0100 +Subject: x86/xen: Make the secondary CPU idle tasks reliable + +From: Miroslav Benes + +commit c3881eb58d56116c79ac4ee4f40fd15ead124c4b upstream. + +The unwinder reports the secondary CPU idle tasks' stack on XEN PV as +unreliable, which affects at least live patching. +cpu_initialize_context() sets up the context of the CPU through +VCPUOP_initialise hypercall. After it is woken up, the idle task starts +in cpu_bringup_and_idle() function and its stack starts at the offset +right below pt_regs. The unwinder correctly detects the end of stack +there but it is confused by NULL return address in the last frame. + +Introduce a wrapper in assembly, which just calls +cpu_bringup_and_idle(). The return address is thus pushed on the stack +and the wrapper contains the annotation hint for the unwinder regarding +the stack state. + +Signed-off-by: Miroslav Benes +Reviewed-by: Juergen Gross +Signed-off-by: Juergen Gross +Signed-off-by: Markus Boehme +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/xen/smp_pv.c | 3 ++- + arch/x86/xen/xen-head.S | 10 ++++++++++ + 2 files changed, 12 insertions(+), 1 deletion(-) + +--- a/arch/x86/xen/smp_pv.c ++++ b/arch/x86/xen/smp_pv.c +@@ -53,6 +53,7 @@ static DEFINE_PER_CPU(struct xen_common_ + static DEFINE_PER_CPU(struct xen_common_irq, xen_pmu_irq) = { .irq = -1 }; + + static irqreturn_t xen_irq_work_interrupt(int irq, void *dev_id); ++void asm_cpu_bringup_and_idle(void); + + static void cpu_bringup(void) + { +@@ -310,7 +311,7 @@ cpu_initialize_context(unsigned int cpu, + * pointing just below where pt_regs would be if it were a normal + * kernel entry. + */ +- ctxt->user_regs.eip = (unsigned long)cpu_bringup_and_idle; ++ ctxt->user_regs.eip = (unsigned long)asm_cpu_bringup_and_idle; + ctxt->flags = VGCF_IN_KERNEL; + ctxt->user_regs.eflags = 0x1000; /* IOPL_RING1 */ + ctxt->user_regs.ds = __USER_DS; +--- a/arch/x86/xen/xen-head.S ++++ b/arch/x86/xen/xen-head.S +@@ -58,6 +58,16 @@ ENTRY(startup_xen) + call xen_start_kernel + END(startup_xen) + __FINIT ++ ++#ifdef CONFIG_XEN_PV_SMP ++.pushsection .text ++SYM_CODE_START(asm_cpu_bringup_and_idle) ++ UNWIND_HINT_EMPTY ++ ++ call cpu_bringup_and_idle ++SYM_CODE_END(asm_cpu_bringup_and_idle) ++.popsection ++#endif + #endif + + .pushsection .text