aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/x86_64/entry.S
diff options
context:
space:
mode:
authorKeir Fraser <keir@xensource.com>2007-10-15 12:13:41 +0100
committerKeir Fraser <keir@xensource.com>2007-10-15 12:13:41 +0100
commitb28b3c245ac495e87da7303954e2a1350dc6dd9d (patch)
tree01dcc69a007e88adb9ef6beaab0a087cd39f1ff5 /xen/arch/x86/x86_64/entry.S
parent4b90f16ed7bbde0563fbea879e50ae102f93ff37 (diff)
downloadxen-b28b3c245ac495e87da7303954e2a1350dc6dd9d.tar.gz
xen-b28b3c245ac495e87da7303954e2a1350dc6dd9d.tar.bz2
xen-b28b3c245ac495e87da7303954e2a1350dc6dd9d.zip
x86/64: Do not clobber %r11 (user rflags) on syscall from guest
userspace to guest kernel. The flags are saved on the guest kernel stack anyway, but some guests rely on %r11 instead. Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/arch/x86/x86_64/entry.S')
-rw-r--r--xen/arch/x86/x86_64/entry.S3
1 files changed, 2 insertions, 1 deletions
diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S
index ad9e9ceebc..ca67151e0b 100644
--- a/xen/arch/x86/x86_64/entry.S
+++ b/xen/arch/x86/x86_64/entry.S
@@ -106,7 +106,7 @@ restore_all_xen:
* When entering SYSCALL from kernel mode:
* %rax = hypercall vector
* %rdi, %rsi, %rdx, %r10, %r8, %9 = hypercall arguments
- * %r11, %rcx = SYSCALL-saved %rflags and %rip
+ * %rcx = SYSCALL-saved %rip
* NB. We must move %r10 to %rcx for C function-calling ABI.
*
* When entering SYSCALL from user mode:
@@ -125,6 +125,7 @@ ENTRY(syscall_enter)
pushq %rcx
pushq $0
movl $TRAP_syscall,4(%rsp)
+ movq 24(%rsp),%r11 /* Re-load user RFLAGS into %r11 before SAVE_ALL */
SAVE_ALL
GET_CURRENT(%rbx)
testb $TF_kernel_mode,VCPU_thread_flags(%rbx)