Re: [RFC PATCH] kvm-unit-tests: VMX: Reconstruct VMX codes to add new test suites

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jan, Gleb and Paolo,

This is a RFC version of reconstruct VMX codes, this version puts all
test suites in x86/nvmx/ and changes the config files. The changes to
config files are trivial since all files in x86/nvmx/* are for VMX
testing. Is there any good solutions?

Arthur

On Wed, Jul 31, 2013 at 1:12 PM, Arthur Chunqi Li <yzt356@xxxxxxxxx> wrote:
> Reconstruct VMX codes, add new test suites in a subdirectory. New
> test suites locates in x86/nvmx/.
>
> Add an empty test suite ctrl_fields in x86/nvmx/.
>
> Signed-off-by: Arthur Chunqi Li <yzt356@xxxxxxxxx>
> ---
>  config-x86-common.mak  |    7 +++++--
>  x86/nvmx/ctrl_fields.c |   10 ++++++++++
>  x86/nvmx/ctrl_fields.h |    7 +++++++
>  x86/vmx.c              |   30 ++++++------------------------
>  x86/vmx.h              |   38 ++++++++++++++++++++++++++++++++------
>  5 files changed, 60 insertions(+), 32 deletions(-)
>  create mode 100644 x86/nvmx/ctrl_fields.c
>  create mode 100644 x86/nvmx/ctrl_fields.h
>
> diff --git a/config-x86-common.mak b/config-x86-common.mak
> index 34a41e1..a5f4d45 100644
> --- a/config-x86-common.mak
> +++ b/config-x86-common.mak
> @@ -47,6 +47,8 @@ endif
>
>  tests_and_config = $(TEST_DIR)/*.flat $(TEST_DIR)/unittests.cfg
>
> +nvmx_objs = $(TEST_DIR)/nvmx/ctrl_fields.o
> +
>  test_cases: $(tests-common) $(tests)
>
>  $(TEST_DIR)/%.o: CFLAGS += -std=gnu99 -ffreestanding -I lib -I lib/x86
> @@ -101,11 +103,12 @@ $(TEST_DIR)/asyncpf.elf: $(cstart.o) $(TEST_DIR)/asyncpf.o
>
>  $(TEST_DIR)/pcid.elf: $(cstart.o) $(TEST_DIR)/pcid.o
>
> -$(TEST_DIR)/vmx.elf: $(cstart.o) $(TEST_DIR)/vmx.o
> +$(TEST_DIR)/vmx.elf: $(cstart.o) $(TEST_DIR)/vmx.o $(nvmx_objs)
>
>  arch_clean:
>         $(RM) $(TEST_DIR)/*.o $(TEST_DIR)/*.flat $(TEST_DIR)/*.elf \
> -       $(TEST_DIR)/.*.d $(TEST_DIR)/lib/.*.d $(TEST_DIR)/lib/*.o
> +       $(TEST_DIR)/.*.d $(TEST_DIR)/lib/.*.d $(TEST_DIR)/lib/*.o \
> +       $(TEST_DIR)/nvmx/*.o
>
>  api/%.o: CFLAGS += -m32
>
> diff --git a/x86/nvmx/ctrl_fields.c b/x86/nvmx/ctrl_fields.c
> new file mode 100644
> index 0000000..7d9ea01
> --- /dev/null
> +++ b/x86/nvmx/ctrl_fields.c
> @@ -0,0 +1,10 @@
> +#include "../vmx.h"
> +
> +void ctrl_fields_main()
> +{
> +}
> +
> +int ctrl_fields_exit_handler()
> +{
> +       return VMX_TEST_VMEXIT;
> +}
> diff --git a/x86/nvmx/ctrl_fields.h b/x86/nvmx/ctrl_fields.h
> new file mode 100644
> index 0000000..7af6a2e
> --- /dev/null
> +++ b/x86/nvmx/ctrl_fields.h
> @@ -0,0 +1,7 @@
> +#ifndef __CTRL_FIELDS_H
> +#define __CTRL_FIELDS_H
> +
> +void ctrl_fields_main();
> +int ctrl_fields_exit_handler();
> +
> +#endif
> diff --git a/x86/vmx.c b/x86/vmx.c
> index 082c3bb..f57c6d2 100644
> --- a/x86/vmx.c
> +++ b/x86/vmx.c
> @@ -7,18 +7,7 @@
>  #include "smp.h"
>  #include "io.h"
>
> -int fails = 0, tests = 0;
> -u32 *vmxon_region;
> -struct vmcs *vmcs_root;
> -u32 vpid_cnt;
> -void *guest_stack, *guest_syscall_stack;
> -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;
> -u64 hypercall_field = 0;
> -bool launched;
> +#include "nvmx/ctrl_fields.h"
>
>  extern u64 gdt64_desc[];
>  extern u64 idt_descr[];
> @@ -27,17 +16,6 @@ extern void *vmx_return;
>  extern void *entry_sysenter;
>  extern void *guest_entry;
>
> -static void report(const char *name, int result)
> -{
> -       ++tests;
> -       if (result)
> -               printf("PASS: %s\n", name);
> -       else {
> -               printf("FAIL: %s\n", name);
> -               ++fails;
> -       }
> -}
> -
>  static int make_vmcs_current(struct vmcs *vmcs)
>  {
>         bool ret;
> @@ -80,7 +58,7 @@ static inline int vmx_off()
>         return ret;
>  }
>
> -static void print_vmexit_info()
> +void print_vmexit_info()
>  {
>         u64 guest_rip, guest_rsp;
>         ulong reason = vmcs_read(EXI_REASON) & 0xff;
> @@ -636,6 +614,8 @@ static struct vmx_test vmx_tests[] = {
>                 basic_syscall_handler, {0} },
>         { "vmenter", basic_init, vmenter_main, vmenter_exit_handler,
>                 basic_syscall_handler, {0} },
> +       { "ctrl_fields", basic_init, ctrl_fields_main, ctrl_fields_exit_handler,
> +               basic_syscall_handler, {0} },
>  };
>
>  int main(void)
> @@ -644,6 +624,8 @@ int main(void)
>
>         setup_vm();
>         setup_idt();
> +       fails = tests = 0;
> +       hypercall_field = 0;
>
>         if (test_vmx_capability() != 0) {
>                 printf("ERROR : vmx not supported, check +vmx option\n");
> diff --git a/x86/vmx.h b/x86/vmx.h
> index d80e000..305de1b 100644
> --- a/x86/vmx.h
> +++ b/x86/vmx.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;
>
> -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,
> @@ -462,5 +462,31 @@ static inline int vmcs_save(struct vmcs **vmcs)
>         return ret;
>  }
>
> +int fails, tests;
> +u64 hypercall_field;
> +u32 *vmxon_region;
> +struct vmcs *vmcs_root;
> +u32 vpid_cnt;
> +void *guest_stack, *guest_syscall_stack;
> +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;
> +
> +static inline void report(const char *name, int result)
> +{
> +       ++tests;
> +       if (result)
> +               printf("PASS: %s\n", name);
> +       else {
> +               printf("FAIL: %s\n", name);
> +               ++fails;
> +       }
> +}
> +
> +void print_vmexit_info();
> +
>  #endif
>
> --
> 1.7.9.5
>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux