diff options
Diffstat (limited to 'arch/x86/xen/xen-asm_64.S')
-rw-r--r-- | arch/x86/xen/xen-asm_64.S | 28 |
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) | |||
47 | ENDPATCH(xen_iret) | 49 | ENDPATCH(xen_iret) |
48 | RELOC(xen_iret, 1b+1) | 50 | RELOC(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 | */ | ||
54 | ENTRY(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 | ||
62 | 1: jmp hypercall_iret | ||
63 | ENDPATCH(xen_sysexit) | ||
64 | RELOC(xen_sysexit, 1b+1) | ||
65 | |||
66 | ENTRY(xen_sysret64) | 52 | ENTRY(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 */ |
129 | ENTRY(xen_syscall_target) | 115 | ENTRY(xen_syscall_target) |
130 | undo_xen_syscall | 116 | undo_xen_syscall |
131 | jmp system_call_after_swapgs | 117 | jmp entry_SYSCALL_64_after_swapgs |
132 | ENDPROC(xen_syscall_target) | 118 | ENDPROC(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 */ |
137 | ENTRY(xen_syscall32_target) | 123 | ENTRY(xen_syscall32_target) |
138 | undo_xen_syscall | 124 | undo_xen_syscall |
139 | jmp ia32_cstar_target | 125 | jmp entry_SYSCALL_compat |
140 | ENDPROC(xen_syscall32_target) | 126 | ENDPROC(xen_syscall32_target) |
141 | 127 | ||
142 | /* 32-bit compat sysenter target */ | 128 | /* 32-bit compat sysenter target */ |
143 | ENTRY(xen_sysenter_target) | 129 | ENTRY(xen_sysenter_target) |
144 | undo_xen_syscall | 130 | undo_xen_syscall |
145 | jmp ia32_sysenter_target | 131 | jmp entry_SYSENTER_compat |
146 | ENDPROC(xen_sysenter_target) | 132 | ENDPROC(xen_sysenter_target) |
147 | 133 | ||
148 | #else /* !CONFIG_IA32_EMULATION */ | 134 | #else /* !CONFIG_IA32_EMULATION */ |