On Mon, Aug 5, 2013 at 9:18 PM, Gleb Natapov <gleb@xxxxxxxxxx> wrote: > On Mon, Aug 05, 2013 at 08:43:25PM +0800, Arthur Chunqi Li wrote: >> Separate host_rflags and guest_rflags (regs.rflags used for guest). >> Fix bug of set/get guest rflags when vmenter/vmexit. >> >> Signed-off-by: Arthur Chunqi Li <yzt356@xxxxxxxxx> >> --- >> x86/vmx.c | 11 +++++++---- >> x86/vmx.h | 4 ++-- >> 2 files changed, 9 insertions(+), 6 deletions(-) >> >> diff --git a/x86/vmx.c b/x86/vmx.c >> index 7467927..7b28aca 100644 >> --- a/x86/vmx.c >> +++ b/x86/vmx.c >> @@ -19,6 +19,7 @@ struct regs regs; >> struct vmx_test *current; >> u64 hypercall_field = 0; >> bool launched; >> +u64 host_rflags; >> > Can't you define in on stack? Currently I don't use it outside vmx_run(), but it may be used in user defined exit_handler in the future, so I put it globally. Arthur > >> extern u64 gdt64_desc[]; >> extern u64 idt_descr[]; >> @@ -440,12 +441,14 @@ static int exit_handler() >> int ret; >> >> current->exits++; >> + regs.rflags = vmcs_read(GUEST_RFLAGS); >> current->guest_regs = regs; >> if (is_hypercall()) >> ret = handle_hypercall(); >> else >> ret = current->exit_handler(); >> regs = current->guest_regs; >> + vmcs_write(GUEST_RFLAGS, regs.rflags); >> switch (ret) { >> case VMX_TEST_VMEXIT: >> case VMX_TEST_RESUME: >> @@ -505,15 +508,15 @@ static int vmx_run() >> return 0; >> case VMX_TEST_LAUNCH_ERR: >> printf("%s : vmlaunch failed.\n", __func__); >> - if ((!(regs.rflags & X86_EFLAGS_CF) && !(regs.rflags & X86_EFLAGS_ZF)) >> - || ((regs.rflags & X86_EFLAGS_CF) && (regs.rflags & X86_EFLAGS_ZF))) >> + if ((!(host_rflags & X86_EFLAGS_CF) && !(host_rflags & X86_EFLAGS_ZF)) >> + || ((host_rflags & X86_EFLAGS_CF) && (host_rflags & X86_EFLAGS_ZF))) >> printf("\tvmlaunch set wrong flags\n"); >> report("test vmlaunch", 0); >> break; >> case VMX_TEST_RESUME_ERR: >> printf("%s : vmresume failed.\n", __func__); >> - if ((!(regs.rflags & X86_EFLAGS_CF) && !(regs.rflags & X86_EFLAGS_ZF)) >> - || ((regs.rflags & X86_EFLAGS_CF) && (regs.rflags & X86_EFLAGS_ZF))) >> + if ((!(host_rflags & X86_EFLAGS_CF) && !(host_rflags & X86_EFLAGS_ZF)) >> + || ((host_rflags & X86_EFLAGS_CF) && (host_rflags & X86_EFLAGS_ZF))) >> printf("\tvmresume set wrong flags\n"); >> report("test vmresume", 0); >> break; >> diff --git a/x86/vmx.h b/x86/vmx.h >> index 1fb9738..d4f979c 100644 >> --- a/x86/vmx.h >> +++ b/x86/vmx.h >> @@ -403,10 +403,10 @@ enum Ctrl1 { >> >> #define SAVE_RFLAGS \ >> "pushf\n\t" \ >> - "pop regs+0x80\n\t" >> + "pop host_rflags\n\t" >> >> #define LOAD_RFLAGS \ >> - "push regs+0x80\n\t" \ >> + "push host_rflags\n\t" \ >> "popf\n\t" >> >> #define VMX_IO_SIZE_MASK 0x7 >> -- >> 1.7.9.5 > > -- > Gleb. -- 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