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 <[EMAIL PROTECTED]> --- 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; -- 1.5.2.4 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html