| From fc24d75a7f91837d7918e40719575951820b2b8f Mon Sep 17 00:00:00 2001 |
| From: Jan Beulich <JBeulich@suse.com> |
| Date: Tue, 15 Jan 2019 09:58:16 -0700 |
| Subject: x86/entry/64/compat: Fix stack switching for XEN PV |
| |
| From: Jan Beulich <JBeulich@suse.com> |
| |
| commit fc24d75a7f91837d7918e40719575951820b2b8f upstream. |
| |
| While in the native case entry into the kernel happens on the trampoline |
| stack, PV Xen kernels get entered with the current thread stack right |
| away. Hence source and destination stacks are identical in that case, |
| and special care is needed. |
| |
| Other than in sync_regs() the copying done on the INT80 path isn't |
| NMI / #MC safe, as either of these events occurring in the middle of the |
| stack copying would clobber data on the (source) stack. |
| |
| There is similar code in interrupt_entry() and nmi(), but there is no fixup |
| required because those code paths are unreachable in XEN PV guests. |
| |
| [ tglx: Sanitized subject, changelog, Fixes tag and stable mail address. Sigh ] |
| |
| Fixes: 7f2590a110b8 ("x86/entry/64: Use a per-CPU trampoline stack for IDT entries") |
| Signed-off-by: Jan Beulich <jbeulich@suse.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Reviewed-by: Juergen Gross <jgross@suse.com> |
| Acked-by: Andy Lutomirski <luto@kernel.org> |
| Cc: Peter Anvin <hpa@zytor.com> |
| Cc: xen-devel@lists.xenproject.org> |
| Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> |
| Cc: stable@vger.kernel.org |
| Link: https://lkml.kernel.org/r/5C3E1128020000780020DFAD@prv1-mh.provo.novell.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/entry/entry_64_compat.S | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/entry/entry_64_compat.S |
| +++ b/arch/x86/entry/entry_64_compat.S |
| @@ -361,7 +361,8 @@ ENTRY(entry_INT80_compat) |
| |
| /* Need to switch before accessing the thread stack. */ |
| SWITCH_TO_KERNEL_CR3 scratch_reg=%rdi |
| - movq %rsp, %rdi |
| + /* In the Xen PV case we already run on the thread stack. */ |
| + ALTERNATIVE "movq %rsp, %rdi", "jmp .Lint80_keep_stack", X86_FEATURE_XENPV |
| movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp |
| |
| pushq 6*8(%rdi) /* regs->ss */ |
| @@ -370,8 +371,9 @@ ENTRY(entry_INT80_compat) |
| pushq 3*8(%rdi) /* regs->cs */ |
| pushq 2*8(%rdi) /* regs->ip */ |
| pushq 1*8(%rdi) /* regs->orig_ax */ |
| - |
| pushq (%rdi) /* pt_regs->di */ |
| +.Lint80_keep_stack: |
| + |
| pushq %rsi /* pt_regs->si */ |
| xorl %esi, %esi /* nospec si */ |
| pushq %rdx /* pt_regs->dx */ |