--- /dev/null
+From 2f62f36e62daec43aa7b9633ef7f18e042a80bed Mon Sep 17 00:00:00 2001
+From: Miroslav Benes <mbenes@suse.cz>
+Date: Thu, 26 Mar 2020 10:26:02 +0100
+Subject: x86/xen: Make the boot CPU idle task reliable
+
+From: Miroslav Benes <mbenes@suse.cz>
+
+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 <mbenes@suse.cz>
+Reviewed-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Markus Boehme <markubo@amazon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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
--- /dev/null
+From c3881eb58d56116c79ac4ee4f40fd15ead124c4b Mon Sep 17 00:00:00 2001
+From: Miroslav Benes <mbenes@suse.cz>
+Date: Thu, 26 Mar 2020 10:26:03 +0100
+Subject: x86/xen: Make the secondary CPU idle tasks reliable
+
+From: Miroslav Benes <mbenes@suse.cz>
+
+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 <mbenes@suse.cz>
+Reviewed-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Markus Boehme <markubo@amazon.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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