From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gleb Natapov Subject: Re: [PATCH] kvm-unit-tests : The first version of VMX nested test case Date: Tue, 16 Jul 2013 19:45:20 +0300 Message-ID: <20130716164519.GE8981@redhat.com> References: <1373966841-22206-1-git-send-email-yzt356@gmail.com> <51E52035.1050401@redhat.com> <20130716152035.GB8981@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: Paolo Bonzini , kvm , Jan Kiszka To: Arthur Chunqi Li Return-path: Received: from mx1.redhat.com ([209.132.183.28]:33164 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933133Ab3GPQpX (ORCPT ); Tue, 16 Jul 2013 12:45:23 -0400 Content-Disposition: inline In-Reply-To: Sender: kvm-owner@vger.kernel.org List-ID: On Tue, Jul 16, 2013 at 11:29:20PM +0800, Arthur Chunqi Li wrote: > On Tue, Jul 16, 2013 at 11:20 PM, Gleb Natapov wrote: > > On Tue, Jul 16, 2013 at 12:28:05PM +0200, Paolo Bonzini wrote: > >> > +void vmx_exit(void) > >> > +{ > >> > + test_vmxoff(); > >> > + printf("\nSUMMARY: %d tests, %d failures\n", tests, fails); > >> > + exit(fails ? -1 : 0); > >> > +} > >> > >> Can you try to jump back to main, and do test_vmxoff there? This will > >> avoid having to write our tests in callback style, which is a pain. > >> Basically something similar to setjmp/longjmp. In main: > >> > >> if (setjmp(jmpbuf) == 0) { > >> vmx_run(); > >> /* Should not reach here */ > >> report("test vmlaunch", 0); > >> } > >> test_vmxoff(); > >> > >> exit: > >> printf("\nSUMMARY: %d tests, %d failures\n", tests, fails); > >> return fails ? 1 : 0; > >> > >> In vmx_handler: > >> > >> case VMX_HLT: > >> printf("\nVM exit.\n"); > >> longjmp(jmpbuf, 1); > >> > > Why not just make vmexit occur after vmlaunch/vmresume like KVM does. It > > will make code much more straightforward and easer to follow. > The concept "easier to follow" may have different meanings in > different view. This achievement puts all the test cases in main > function instead of scattering everywhere, which is another view to > "easy to follow". As this is just a test case, I prefer this one. > I do not see why what I propose will prevent you to put all tests into main. vmx_run() will looks like that: vmlaunch while(1) { vmresume <---- vmexit jumps here switch(exit reason) { case reason1: break; case reason2: break; case HLT return; } } > Besides, this way we can start another VM following the previous one > simply in main function. This is flexible if we want to test re-enter > to VMX mode or so. > That's what I am missing. How do one writes more tests now? I was thinking about interface like that: guest_func_test1() { } tes1t_exit_handlers[] = {test1_handle_hlt, test1_handle_exception, ....} main() { init_vmcs(); /* generic stuff */ init_vmcs_test1(); /* test1 related stuff */ r = run_in_guest(guest_func_test1, test1_exit_handlers); report("test1", r); } -- Gleb.