From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=35728 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OJVYe-00058L-Nw for qemu-devel@nongnu.org; Tue, 01 Jun 2010 13:47:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OJVYc-000597-C7 for qemu-devel@nongnu.org; Tue, 01 Jun 2010 13:47:20 -0400 Received: from thoth.sbs.de ([192.35.17.2]:24993) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OJVYc-00057m-3G for qemu-devel@nongnu.org; Tue, 01 Jun 2010 13:47:18 -0400 Message-ID: <4C05479E.3010705@siemens.com> Date: Tue, 01 Jun 2010 19:47:10 +0200 From: Jan Kiszka MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] x86: svm: Always clear event_inj on vmexit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel Cc: Joerg Roedel , Erik van der Kouwe , Gleb Natapov We currently only clear SVM_EVTINJ_VALID after successful interrupt delivery. This apparently does not match real hardware which clears the whole event_inj field on every vmexit, including unsuccessful interrupt delivery. Reported-by: Erik van der Kouwe Signed-off-by: Jan Kiszka --- (before it gets lost) Erik, please confirm that this works for you. target-i386/op_helper.c | 8 +------- 1 files changed, 1 insertions(+), 7 deletions(-) diff --git a/target-i386/op_helper.c b/target-i386/op_helper.c index dcbdfe7..caabdb4 100644 --- a/target-i386/op_helper.c +++ b/target-i386/op_helper.c @@ -1263,13 +1263,6 @@ void do_interrupt(int intno, int is_int, int error_code, #endif do_interrupt_real(intno, is_int, error_code, next_eip); } - -#if !defined(CONFIG_USER_ONLY) - if (env->hflags & HF_SVMI_MASK) { - uint32_t event_inj = ldl_phys(env->vm_vmcb + offsetof(struct vmcb, control.event_inj)); - stl_phys(env->vm_vmcb + offsetof(struct vmcb, control.event_inj), event_inj & ~SVM_EVTINJ_VALID); - } -#endif } /* This should come from sysemu.h - if we could include it here... */ @@ -5388,6 +5381,7 @@ void helper_vmexit(uint32_t exit_code, uint64_t exit_info_1) ldl_phys(env->vm_vmcb + offsetof(struct vmcb, control.event_inj))); stl_phys(env->vm_vmcb + offsetof(struct vmcb, control.exit_int_info_err), ldl_phys(env->vm_vmcb + offsetof(struct vmcb, control.event_inj_err))); + stl_phys(env->vm_vmcb + offsetof(struct vmcb, control.event_inj), 0); env->hflags2 &= ~HF2_GIF_MASK; /* FIXME: Resets the current ASID register to zero (host ASID). */ -- 1.6.0.2