From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeremy Fitzhardinge Subject: Re: Crash with paravirt-ops 2.6.31.6 kernel Date: Wed, 25 Nov 2009 13:24:16 -0800 Message-ID: <4B0DA080.7030904@goop.org> References: <28846609.721258484676784.JavaMail.root@ifrit.dereferenced.org> <20091122095403.GA1496@wavehammer.waldi.eu.org> <1258989935.7590.52.camel@zakaz.uk.xensource.com> <4B0AC6FA0200007800021812@vpn.id2.novell.com> <1258994658.7590.80.camel@zakaz.uk.xensource.com> <4B0D13850200007800021FC6@vpn.id2.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <4B0D13850200007800021FC6@vpn.id2.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Jan Beulich Cc: "544145@bugs.debian.org" <544145@bugs.debian.org>, "xen-devel@lists.xensource.com" , Ian Campbell , Bastian Blank List-Id: xen-devel@lists.xenproject.org On 11/25/09 02:22, Jan Beulich wrote: > Okay, I think I spotted the relevant difference: 2.6.18 and forward ports > set VGCF_in_syscall only when returning from 64-bit system calls (through > ret_from_sys_call) - 32-bit syscalls (regardless of the entry path taken) > return through int_ret_from_sys_call. 32-bit guest kernels shouldn't be > affected by this, as compat mode returns from the hypervisor > (compat_restore_all_guest) always use iret. > I think dropping the VCGF_in_syscall flag is the simplest possible fix then. There doesn't seem to be a huge benefit to using sysret in this case. Does this look OK? J Subject: [PATCH] xen: use iret for return from 64b kernel to 32b usermode If Xen wants to return to a 32b usermode with sysret it must use the right form. When using VCGF_in_syscall to trigger this, it looks at the code segment and does a 32b sysret if it is FLAT_USER_CS32. However, this is different from __USER32_CS, so it fails to return properly if we use the normal Linux segment. So avoid the whole mess by dropping VCGF_in_syscall and simply use plain iret to return to usermode. Signed-off-by: Jeremy Fitzhardinge diff --git a/arch/x86/xen/xen-asm_64.S b/arch/x86/xen/xen-asm_64.S index 02f496a..f681d55 100644 --- a/arch/x86/xen/xen-asm_64.S +++ b/arch/x86/xen/xen-asm_64.S @@ -96,7 +96,7 @@ ENTRY(xen_sysret32) pushq $__USER32_CS pushq %rcx - pushq $VGCF_in_syscall + pushq $0 1: jmp hypercall_iret ENDPATCH(xen_sysret32) RELOC(xen_sysret32, 1b+1)