On Fri, Jun 26, 2020 at 1:30 PM Andy Lutomirski <[email protected]> wrote: > > The SYSENTER frame setup was nonsense. It worked by accident > because the normal code into which the Xen asm jumped > (entry_SYSENTER_32/compat) threw away SP without touching the stack. > entry_SYSENTER_compat was recently modified such that it relied on > having a valid stack pointer, so now the Xen asm needs to invoke it > with a valid stack. > > Fix it up like SYSCALL: use the Xen-provided frame and skip the bare > metal prologue. > > Cc: Boris Ostrovsky <[email protected]> > Cc: Juergen Gross <[email protected]> > Cc: Stefano Stabellini <[email protected]> > Cc: [email protected] > Fixes: 1c3e5d3f60e2 ("x86/entry: Make entry_64_compat.S objtool clean") > Signed-off-by: Andy Lutomirski <[email protected]> > --- > arch/x86/entry/entry_64_compat.S | 1 + > arch/x86/xen/xen-asm_64.S | 20 ++++++++++++++++---- > 2 files changed, 17 insertions(+), 4 deletions(-) > > diff --git a/arch/x86/entry/entry_64_compat.S > b/arch/x86/entry/entry_64_compat.S > index 7b9d8150f652..381a6de7de9c 100644 > --- a/arch/x86/entry/entry_64_compat.S > +++ b/arch/x86/entry/entry_64_compat.S > @@ -79,6 +79,7 @@ SYM_CODE_START(entry_SYSENTER_compat) > pushfq /* pt_regs->flags (except IF = 0) */ > pushq $__USER32_CS /* pt_regs->cs */ > pushq $0 /* pt_regs->ip = 0 (placeholder) */ > +SYM_INNER_LABEL(entry_SYSENTER_compat_after_hwframe, SYM_L_GLOBAL)
This skips over the section that truncates the syscall number to 32-bits. The comments present some doubt that it is actually necessary, but the Xen path shouldn't differ from native. That code should be moved after this new label. -- Brian Gerst

