aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/xen/xen-asm_64.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/xen/xen-asm_64.S')
-rw-r--r--arch/x86/xen/xen-asm_64.S28
1 files changed, 7 insertions, 21 deletions
diff --git a/arch/x86/xen/xen-asm_64.S b/arch/x86/xen/xen-asm_64.S
index 985fc3ee0973..f22667abf7b9 100644
--- a/arch/x86/xen/xen-asm_64.S
+++ b/arch/x86/xen/xen-asm_64.S
@@ -15,6 +15,8 @@
15#include <asm/percpu.h> 15#include <asm/percpu.h>
16#include <asm/processor-flags.h> 16#include <asm/processor-flags.h>
17#include <asm/segment.h> 17#include <asm/segment.h>
18#include <asm/asm-offsets.h>
19#include <asm/thread_info.h>
18 20
19#include <xen/interface/xen.h> 21#include <xen/interface/xen.h>
20 22
@@ -47,29 +49,13 @@ ENTRY(xen_iret)
47ENDPATCH(xen_iret) 49ENDPATCH(xen_iret)
48RELOC(xen_iret, 1b+1) 50RELOC(xen_iret, 1b+1)
49 51
50/*
51 * sysexit is not used for 64-bit processes, so it's only ever used to
52 * return to 32-bit compat userspace.
53 */
54ENTRY(xen_sysexit)
55 pushq $__USER32_DS
56 pushq %rcx
57 pushq $X86_EFLAGS_IF
58 pushq $__USER32_CS
59 pushq %rdx
60
61 pushq $0
621: jmp hypercall_iret
63ENDPATCH(xen_sysexit)
64RELOC(xen_sysexit, 1b+1)
65
66ENTRY(xen_sysret64) 52ENTRY(xen_sysret64)
67 /* 53 /*
68 * We're already on the usermode stack at this point, but 54 * We're already on the usermode stack at this point, but
69 * still with the kernel gs, so we can easily switch back 55 * still with the kernel gs, so we can easily switch back
70 */ 56 */
71 movq %rsp, PER_CPU_VAR(rsp_scratch) 57 movq %rsp, PER_CPU_VAR(rsp_scratch)
72 movq PER_CPU_VAR(kernel_stack), %rsp 58 movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
73 59
74 pushq $__USER_DS 60 pushq $__USER_DS
75 pushq PER_CPU_VAR(rsp_scratch) 61 pushq PER_CPU_VAR(rsp_scratch)
@@ -88,7 +74,7 @@ ENTRY(xen_sysret32)
88 * still with the kernel gs, so we can easily switch back 74 * still with the kernel gs, so we can easily switch back
89 */ 75 */
90 movq %rsp, PER_CPU_VAR(rsp_scratch) 76 movq %rsp, PER_CPU_VAR(rsp_scratch)
91 movq PER_CPU_VAR(kernel_stack), %rsp 77 movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
92 78
93 pushq $__USER32_DS 79 pushq $__USER32_DS
94 pushq PER_CPU_VAR(rsp_scratch) 80 pushq PER_CPU_VAR(rsp_scratch)
@@ -128,7 +114,7 @@ RELOC(xen_sysret32, 1b+1)
128/* Normal 64-bit system call target */ 114/* Normal 64-bit system call target */
129ENTRY(xen_syscall_target) 115ENTRY(xen_syscall_target)
130 undo_xen_syscall 116 undo_xen_syscall
131 jmp system_call_after_swapgs 117 jmp entry_SYSCALL_64_after_swapgs
132ENDPROC(xen_syscall_target) 118ENDPROC(xen_syscall_target)
133 119
134#ifdef CONFIG_IA32_EMULATION 120#ifdef CONFIG_IA32_EMULATION
@@ -136,13 +122,13 @@ ENDPROC(xen_syscall_target)
136/* 32-bit compat syscall target */ 122/* 32-bit compat syscall target */
137ENTRY(xen_syscall32_target) 123ENTRY(xen_syscall32_target)
138 undo_xen_syscall 124 undo_xen_syscall
139 jmp ia32_cstar_target 125 jmp entry_SYSCALL_compat
140ENDPROC(xen_syscall32_target) 126ENDPROC(xen_syscall32_target)
141 127
142/* 32-bit compat sysenter target */ 128/* 32-bit compat sysenter target */
143ENTRY(xen_sysenter_target) 129ENTRY(xen_sysenter_target)
144 undo_xen_syscall 130 undo_xen_syscall
145 jmp ia32_sysenter_target 131 jmp entry_SYSENTER_compat
146ENDPROC(xen_sysenter_target) 132ENDPROC(xen_sysenter_target)
147 133
148#else /* !CONFIG_IA32_EMULATION */ 134#else /* !CONFIG_IA32_EMULATION */