Skip to content

Commit ffae641

Browse files
amlutoKAGA-KOKO
authored andcommitted
x86/entry/64/compat: Fix Xen PV SYSENTER frame setup
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. Fixes: 1c3e5d3 ("x86/entry: Make entry_64_compat.S objtool clean") Signed-off-by: Andy Lutomirski <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Boris Ostrovsky <[email protected]> Link: https://lkml.kernel.org/r/947880c41ade688ff4836f665d0c9fcaa9bd1201.1593191971.git.luto@kernel.org
1 parent d172125 commit ffae641

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

arch/x86/entry/entry_64_compat.S

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ SYM_CODE_START(entry_SYSENTER_compat)
7979
pushfq /* pt_regs->flags (except IF = 0) */
8080
pushq $__USER32_CS /* pt_regs->cs */
8181
pushq $0 /* pt_regs->ip = 0 (placeholder) */
82+
SYM_INNER_LABEL(entry_SYSENTER_compat_after_hwframe, SYM_L_GLOBAL)
8283
pushq %rax /* pt_regs->orig_ax */
8384
pushq %rdi /* pt_regs->di */
8485
pushq %rsi /* pt_regs->si */

arch/x86/xen/xen-asm_64.S

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,22 @@ SYM_FUNC_END(xen_syscall32_target)
161161

162162
/* 32-bit compat sysenter target */
163163
SYM_FUNC_START(xen_sysenter_target)
164-
mov 0*8(%rsp), %rcx
165-
mov 1*8(%rsp), %r11
166-
mov 5*8(%rsp), %rsp
167-
jmp entry_SYSENTER_compat
164+
/*
165+
* NB: Xen is polite and clears TF from EFLAGS for us. This means
166+
* that we don't need to guard against single step exceptions here.
167+
*/
168+
popq %rcx
169+
popq %r11
170+
171+
/*
172+
* Neither Xen nor the kernel really knows what the old SS and
173+
* CS were. The kernel expects __USER32_DS and __USER32_CS, so
174+
* report those values even though Xen will guess its own values.
175+
*/
176+
movq $__USER32_DS, 4*8(%rsp)
177+
movq $__USER32_CS, 1*8(%rsp)
178+
179+
jmp entry_SYSENTER_compat_after_hwframe
168180
SYM_FUNC_END(xen_sysenter_target)
169181

170182
#else /* !CONFIG_IA32_EMULATION */

0 commit comments

Comments
 (0)