From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [PATCH] Clear temporary interrupt blocking on halt in real mode Date: Sun, 10 Aug 2008 11:36:08 +0300 Message-ID: <489EA878.4040503@qumranet.com> References: <12179254282930-git-send-email-Laurent.Vivier@bull.net> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, Stefan Hajnoczi To: Laurent Vivier Return-path: Received: from il.qumranet.com ([212.179.150.194]:35726 "EHLO il.qumranet.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752155AbYHJIgK (ORCPT ); Sun, 10 Aug 2008 04:36:10 -0400 In-Reply-To: <12179254282930-git-send-email-Laurent.Vivier@bull.net> Sender: kvm-owner@vger.kernel.org List-ID: Laurent Vivier wrote: > When "halt" is emulated, skip_emulated_instruction() is called and interruptibility state is cleared. > But when halt is emulated in real mode, skip_emulated_instruction() is not called and the interruptiblity state is not cleared. > > The following code, from gPXE, never exits from loop because interrupts are not delivered to increase %fs:(0x6c): > > movl %fs:(0x6c), %eax > 1: pushf > sti > hlt > popf > cmpl %fs:(0x6c), %eax > je 1b > > This patch clears the interruptibility state when halt is emulated in real mode. > > Signed-off-by: Laurent Vivier > --- > arch/x86/kvm/vmx.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index c4510fe..82c4324 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -2329,7 +2329,17 @@ static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) > handle_rmode_exception(vcpu, intr_info & INTR_INFO_VECTOR_MASK, > error_code)) { > if (vcpu->arch.halt_request) { > + u32 interruptibility; > vcpu->arch.halt_request = 0; > + /* > + * We emulated an instruction, so temporary interrupt blocking > + * should be removed, if set. > + */ > + interruptibility = vmcs_read32(GUEST_INTERRUPTIBILITY_INFO); > + if (interruptibility & 3) > + vmcs_write32(GUEST_INTERRUPTIBILITY_INFO, > + interruptibility & ~3); > + vcpu->arch.interrupt_window_open = 1; > return kvm_emulate_halt(vcpu); > } > return 1; > Shouldn't interruptibility state be cleared if *any* instruction is emulated? (of course, an emulated instruction may update interruptibility state itself, say sti). -- error compiling committee.c: too many arguments to function