From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Andy Lutomirski <luto@amacapital.net>
Cc: X86 ML <x86@kernel.org>,
Boris Ostrovsky <boris.ostrovsky@oracle.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"Borislav Petkov" <bp@alien8.de>,
Steven Rostedt <rostedt@goodmis.org>,
"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: Getting rid of invalid SYSCALL RSP under Xen?
Date: Mon, 27 Jul 2015 14:52:32 +0100 [thread overview]
Message-ID: <55B637A0.5000101@citrix.com> (raw)
In-Reply-To: <CALCETrXruMOU2XHM7QxyTsnULKbyqdryrR_kMC8enQa3_vN3Dg@mail.gmail.com>
On 27/07/15 00:27, Andy Lutomirski wrote:
>
>>>>> For SYSRET, I think the way to go is to force Xen to always use the
>>>>> syscall slow path. Instead, Xen could hook into
>>>>> syscall_return_via_sysret or even right before the opportunistic
>>>>> sysret stuff. Then we could remove the USERGS_SYSRET hooks entirely.
>>>>>
>>>>> Would this work?
>>>> None of the opportunistic sysret stuff makes sense under Xen. The path
>>>> will inevitably end up in xen_iret making a hypercall. Short circuiting
>>>> all of this seems like a good idea, especially if it allows for the
>>>> removal of the UERGS_SYSRET.
>>> Doesn't Xen decide what to do based on VGCF_IN_SYSCALL? Maybe Xen
>>> should have its own opportunistic VGCF_IN_SYSCALL logic.
>> VGCF_in_syscall affects whether the extra r11/rcx get restored or not,
>> as the hypercall itself is implemented using syscall. As the extra
>> r11/rcx (and rax for that matter) are unconditionally saved in the
>> hypercall stub, I can't see anything Linux could usefully do,
>> opportunistically speaking.
> Xen does:
>
> /* %rbx: struct vcpu, interrupts disabled */
> restore_all_guest:
> ASSERT_INTERRUPTS_DISABLED
> RESTORE_ALL
> testw $TRAP_syscall,4(%rsp)
> jz iret_exit_to_guest
>
> /* Don't use SYSRET path if the return address is not canonical. */
> movq 8(%rsp),%rcx
> sarq $47,%rcx
> incl %ecx
> cmpl $1,%ecx
> ja .Lforce_iret
>
> cmpw $FLAT_USER_CS32,16(%rsp)# CS
> movq 8(%rsp),%rcx # RIP
> movq 24(%rsp),%r11 # RFLAGS
> movq 32(%rsp),%rsp # RSP
> je 1f
> sysretq
> 1: sysretl
>
> That's essentially the same thing as opportunistic sysret. If Linux
> stops setting VGCF_in_syscall, though, I think we'll bypass that code,
> which will hurt performance. Whether this should be fixed in the
> hypervisor or in the guest kernel hooks, I don't know, but it would be
> easy to have a very simple xen_opportunistic_sysret path that checks
> rcx==rip and r11==rflags and, if so, sets VGCF_in_syscall.
I see your point. I didn't intend to suggest that Linux should stop
setting VGCF_in_syscall, as it is the only entity which knows whether it
is safe to clobber rcx/r11 in user context.
Having said this, Xen could certainly do its own opportunistic sysret
calculations as well. There are a number of issues in the Xen sysret
code which I plan to fix in due course, and I will see about making this
adjustment.
>
>>> Hmm, maybe some of this would be easier to think about if, rather than
>>> having a paravirt op, we could have:
>>>
>>> ALTERNATIVE "", "jmp xen_pop_things_and_iret", X86_FEATURE_XEN
>>>
>>> Or just IF_XEN("jmp ...");
>>>
>>> As a practical matter, x86_64 has native and Xen -- I don't think
>>> there's any other paravirt platform that needs the asm hooks.
>> It would certainly seem so. A careful use of IF_XEN() or two would make
>> the code far clearer to read, and to drop the hooks.
>>
> Want to add an IF_XEN macro?
I currently have a blocker bug against the impending Xen 4.6 release
which is higher on my todo list, but I will look into this as soon as I can.
~Andrew
next prev parent reply other threads:[~2015-07-27 13:52 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-23 16:49 Getting rid of invalid SYSCALL RSP under Xen? Andy Lutomirski
2015-07-26 19:34 ` Andrew Cooper
2015-07-26 19:34 ` Andrew Cooper
2015-07-26 22:08 ` Andy Lutomirski
2015-07-26 23:05 ` Andrew Cooper
2015-07-26 23:05 ` Andrew Cooper
2015-07-26 23:27 ` Andy Lutomirski
2015-07-27 13:52 ` Andrew Cooper
2015-07-27 13:52 ` Andrew Cooper [this message]
2015-07-26 23:27 ` Andy Lutomirski
2015-07-26 22:08 ` Andy Lutomirski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55B637A0.5000101@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=boris.ostrovsky@oracle.com \
--cc=bp@alien8.de \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=rostedt@goodmis.org \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.