From: Jan Kiszka <jan.kiszka@web.de>
To: Arthur Chunqi Li <yzt356@gmail.com>
Cc: kvm <kvm@vger.kernel.org>, Gleb Natapov <gleb@redhat.com>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [PATCH] kvm-unit-tests: VMX: Split VMX test suites to separate file
Date: Sun, 04 Aug 2013 19:23:30 +0200 [thread overview]
Message-ID: <51FE8E12.60201@web.de> (raw)
In-Reply-To: <CABpY8M+56=65ERvYe2MVPs4zsjnriAFYF8Am9pokPPThRdy_6A@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 5502 bytes --]
On 2013-08-04 19:18, Arthur Chunqi Li wrote:
>>> diff --git a/x86/vmx.h b/x86/vmx.h
>>> index d80e000..f82bf5a 100644
>>> --- a/x86/vmx.h
>>> +++ b/x86/vmx.h
>>> @@ -1,5 +1,5 @@
>>> -#ifndef __HYPERVISOR_H
>>> -#define __HYPERVISOR_H
>>> +#ifndef __VMX_H
>>> +#define __VMX_H
>>>
>>> #include "libcflat.h"
>>>
>>> @@ -41,7 +41,7 @@ struct vmx_test {
>>> int exits;
>>> };
>>>
>>> -static union vmx_basic {
>>> +union vmx_basic {
>>> u64 val;
>>> struct {
>>> u32 revision;
>>> @@ -55,35 +55,35 @@ static union vmx_basic {
>>> };
>>> } basic;
>>
>> extern union vmx_basic basic, and stick the definition in vmx.c. Same
>> pattern for the other cases.
> Here you mean put definition in vmx.c and "extern" definition in vmx.h?
Yes.
>>
>>>
>>> -static union vmx_ctrl_pin {
>>> +union vmx_ctrl_pin {
>>> u64 val;
>>> struct {
>>> u32 set, clr;
>>> };
>>> } ctrl_pin_rev;
>>>
>>> -static union vmx_ctrl_cpu {
>>> +union vmx_ctrl_cpu {
>>> u64 val;
>>> struct {
>>> u32 set, clr;
>>> };
>>> } ctrl_cpu_rev[2];
>>>
>>> -static union vmx_ctrl_exit {
>>> +union vmx_ctrl_exit {
>>> u64 val;
>>> struct {
>>> u32 set, clr;
>>> };
>>> } ctrl_exit_rev;
>>>
>>> -static union vmx_ctrl_ent {
>>> +union vmx_ctrl_ent {
>>> u64 val;
>>> struct {
>>> u32 set, clr;
>>> };
>>> } ctrl_enter_rev;
>>>
>>> -static union vmx_ept_vpid {
>>> +union vmx_ept_vpid {
>>> u64 val;
>>> struct {
>>> u32:16,
>>> @@ -432,6 +432,20 @@ enum Ctrl1 {
>>> #define HYPERCALL_MASK 0xFFF
>>> #define HYPERCALL_VMEXIT 0x1
>>>
>>> +
>>> +u32 *vmxon_region;
>>> +struct vmcs *vmcs_root;
>>> +void *guest_stack, *guest_syscall_stack;
>>> +int fails, tests;
>>> +u64 hypercall_field;
>>> +u32 vpid_cnt;
>>> +u32 ctrl_pin, ctrl_enter, ctrl_exit, ctrl_cpu[2];
>>> +ulong fix_cr0_set, fix_cr0_clr;
>>> +ulong fix_cr4_set, fix_cr4_clr;
>>> +struct regs regs;
>>> +struct vmx_test *current;
>>> +bool launched;
>>> +
>>
>> extern <type> <varname>
>>
>> But do all these variables need to be exported to the test cases? Better
>> confine it to a minimum, exporting more when test cases come along that
>> actually need them.
>>
>>> static inline int vmcs_clear(struct vmcs *vmcs)
>>> {
>>> bool ret;
>>> @@ -462,5 +476,18 @@ static inline int vmcs_save(struct vmcs **vmcs)
>>> return ret;
>>> }
>>>
>>> +static inline void report(const char *name, int result)
>>> +{
>>> + ++tests;
>>> + if (result)
>>> + printf("PASS: %s\n", name);
>>> + else {
>>> + printf("FAIL: %s\n", name);
>>> + ++fails;
>>> + }
>>> +}
>>> +
>>
>> Why static inline? Better leave this as service of the vmx core.
> You mean put it in vmx.c and "extern" it here?
Yes.
>>
>>> +void print_vmexit_info();
>>> +
>>> #endif
>>>
>>> diff --git a/x86/vmx_tests.c b/x86/vmx_tests.c
>>> new file mode 100644
>>> index 0000000..6bd36b0
>>> --- /dev/null
>>> +++ b/x86/vmx_tests.c
>>> @@ -0,0 +1,43 @@
>>> +#include "vmx.h"
>>> +
>>> +void vmenter_main()
>>> +{
>>> + u64 rax;
>>> + u64 rsp, resume_rsp;
>>> +
>>> + report("test vmlaunch", 1);
>>> +
>>> + asm volatile(
>>> + "mov %%rsp, %0\n\t"
>>> + "mov %3, %%rax\n\t"
>>> + "vmcall\n\t"
>>> + "mov %%rax, %1\n\t"
>>> + "mov %%rsp, %2\n\t"
>>> + : "=r"(rsp), "=r"(rax), "=r"(resume_rsp)
>>> + : "g"(0xABCD));
>>> + report("test vmresume", (rax == 0xFFFF) && (rsp == resume_rsp));
>>> +}
>>> +
>>> +int vmenter_exit_handler()
>>> +{
>>> + u64 guest_rip;
>>> + ulong reason;
>>> +
>>> + guest_rip = vmcs_read(GUEST_RIP);
>>> + reason = vmcs_read(EXI_REASON) & 0xff;
>>> + switch (reason) {
>>> + case VMX_VMCALL:
>>> + if (current->guest_regs.rax != 0xABCD) {
>>> + report("test vmresume", 0);
>>> + return VMX_TEST_VMEXIT;
>>> + }
>>> + current->guest_regs.rax = 0xFFFF;
>>> + vmcs_write(GUEST_RIP, guest_rip + 3);
>>> + return VMX_TEST_RESUME;
>>> + default:
>>> + report("test vmresume", 0);
>>> + print_vmexit_info();
>>> + }
>>> + return VMX_TEST_VMEXIT;
>>> +}
>>> +
>>> diff --git a/x86/vmx_tests.h b/x86/vmx_tests.h
>>> new file mode 100644
>>> index 0000000..41580ff
>>> --- /dev/null
>>> +++ b/x86/vmx_tests.h
>>> @@ -0,0 +1,7 @@
>>> +#ifndef __VMX_TESTS_H
>>> +#define __VMX_TESTS_H
>>> +
>>> +void vmenter_main();
>>> +int vmenter_exit_handler();
>>
>> I'd rather move vmx_tests to, well, vmx_tests.c
> I have tried to put vmx_tests in vmx_tests.c and extern definition in
> vmx.h. But it is impossible to get its size statically when compiling,
> thus the codes "for (i = 1; i < ARRAY_SIZE(vmx_tests); ++i) {" in main
> of vmx.c is invalid. If we use ARRAY_SIZE to get its size, we should
> make it static.
>
> An alternative solution is put vmx_tests in vmx_tests.h, which will be
> included by vmx.c
Another alternative is to iterate over vmx_tests until you hit a NULL
entry (one mandatory element of an entry is NULL), i.e. exploring its
size at runtime.
Jan
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 263 bytes --]
prev parent reply other threads:[~2013-08-04 17:23 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-31 9:22 [PATCH] kvm-unit-tests: VMX: Split VMX test suites to separate file Arthur Chunqi Li
2013-08-04 16:54 ` Jan Kiszka
2013-08-04 17:18 ` Arthur Chunqi Li
2013-08-04 17:23 ` Jan Kiszka [this message]
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=51FE8E12.60201@web.de \
--to=jan.kiszka@web.de \
--cc=gleb@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=pbonzini@redhat.com \
--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