From: Paolo Bonzini <pbonzini@redhat.com>
To: Gleb Natapov <gleb@redhat.com>
Cc: Arthur Chunqi Li <yzt356@gmail.com>,
kvm@vger.kernel.org, jan.kiszka@web.de
Subject: Re: [RFC PATCH] kvm-unit-tests : Basic architecture of VMX nested test case
Date: Thu, 18 Jul 2013 14:08:51 +0200 [thread overview]
Message-ID: <51E7DAD3.8000906@redhat.com> (raw)
In-Reply-To: <20130718110639.GA26173@redhat.com>
Il 18/07/2013 13:06, Gleb Natapov ha scritto:
> On Thu, Jul 18, 2013 at 12:47:46PM +0200, Paolo Bonzini wrote:
>>>> and for a testsuite I'd prefer the latter---which means I'd still favor
>>>> setjmp/longjmp.
>>>>
>>>> Now, here is the long explanation.
>>>>
>>>> I must admit that the code looks nice. There are some nits I'd like to
>>>> see done differently (such as putting vmx_return at the beginning of the
>>>> while (1), and the vmresume asm at the end), but it is indeed nice.
>>>
>>> Why do you prefer setjmp/longjmp then?
>>
>> Because it is still deceiving, and I dislike the deceit more than I like
>> the linear code flow.
>>
> What is deceiving about it? Of course for someone who has no idea how
> vmx works the code will not be obvious, but why should we care. For
> someone who knows what is deceiving about returning into the same
> function guest was launched from by using VMX mechanism
The way the code is written is deceiving. If I see
asm("vmlaunch; seta %0")
while (ret)
I expect HOST_RIP to point at the seta or somewhere near, not at a
completely different label somewhere else.
>> instead of longjmp()?
Look again at the setjmp/longjmp version. longjmp is not used to handle
vmexit. It is used to jump back from the vmexit handler to main, which
is exactly what setjmp/longjmp is meant for.
>> It is still somewhat magic: the "while (ret)" is only there to please
>> the compiler
>
> No, it it there to catch vmlaunch/vmresume errors.
You could change it to "while (0)" and it would still work. That's what
I mean by "only there to please the compiler".
>> the compiler, and you rely on the compiler not changing %rsp between the
>> vmlaunch and the vmx_return label. Minor nit, you cannot anymore print
> HOST_RSP should be loaded on each guest entry.
Right, but my point is: without a big asm blob, you don't know the right
value to load. It depends on the generated code. And the big asm blob
limits a lot the "code looks nice" value of this approach.
>> different error messages for vmlaunch vs. vmresume failure.
> Just because the same variable is used to store error values :)
> Make vmlaunch use err1 and vmresume err2 and do "while (!err1 & !err2)"
Yeah. :)
>> In the end the choice is between "all in asm" and "small asm trampoline"
>> (which also happens to use setjmp/longjmp, but perhaps Arthur can
>> propagate return codes without using setjmp/longjmp, too).
>>
>>> Rewriting the whole guest entry exit path in asm like you suggest bellow
>>> will eliminate the magic too.
>>
>>> I much prefer one big asm statement than many small asm statement
>>> scattered among two or three C lines.
>>
>> It's not many asm statements, it's just a dozen lines:
>>
> I am not talking about overall file, but the how vmx_run() is written:
> asm()
> C code
> asm()
> C code
> ...
>
> I much prefer:
> C code
>
> big asm() blob
>
> C code.
Me too. But the trampoline version is neither, it is
static inline void vmlaunch() { asm("vmlaunch") }
static inline void vmresume() { asm("vmresume") }
small asm() blob
C code
Paolo
next prev parent reply other threads:[~2013-07-18 12:09 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-17 18:54 [RFC PATCH] kvm-unit-tests : Basic architecture of VMX nested test case Arthur Chunqi Li
2013-07-18 5:52 ` Paolo Bonzini
2013-07-18 7:26 ` Gleb Natapov
2013-07-18 10:47 ` Paolo Bonzini
2013-07-18 11:06 ` Gleb Natapov
2013-07-18 12:08 ` Paolo Bonzini [this message]
2013-07-18 14:11 ` Arthur Chunqi Li
2013-07-18 19:57 ` Gleb Natapov
2013-07-19 6:42 ` Paolo Bonzini
2013-07-19 9:40 ` Gleb Natapov
2013-07-19 12:06 ` Paolo Bonzini
2013-07-24 6:11 ` Arthur Chunqi Li
2013-07-24 6:40 ` Paolo Bonzini
2013-07-24 6:46 ` Arthur Chunqi Li
2013-07-24 6:48 ` Paolo Bonzini
2013-07-24 8:48 ` Arthur Chunqi Li
2013-07-24 8:53 ` Jan Kiszka
2013-07-24 9:16 ` Paolo Bonzini
2013-07-24 9:56 ` Arthur Chunqi Li
2013-07-24 10:03 ` Jan Kiszka
2013-07-24 10:16 ` Arthur Chunqi Li
2013-07-24 10:24 ` Jan Kiszka
2013-07-24 11:20 ` Arthur Chunqi Li
2013-07-24 11:25 ` Jan Kiszka
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=51E7DAD3.8000906@redhat.com \
--to=pbonzini@redhat.com \
--cc=gleb@redhat.com \
--cc=jan.kiszka@web.de \
--cc=kvm@vger.kernel.org \
--cc=yzt356@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox