diff -r d2935f9c217f xen/arch/x86/hvm/svm/svm.c --- a/xen/arch/x86/hvm/svm/svm.c Sat Nov 17 13:11:25 2007 +0000 +++ b/xen/arch/x86/hvm/svm/svm.c Tue Nov 20 15:51:20 2007 +0100 @@ -1925,20 +1925,22 @@ static void svm_vmexit_do_hlt(struct vmc static void svm_vmexit_do_hlt(struct vmcb_struct *vmcb, struct cpu_user_regs *regs) { - struct hvm_intack intack = hvm_vcpu_has_pending_irq(current); + struct vcpu *v = current; + struct hvm_intack intack = hvm_vcpu_has_pending_irq(v); + enum hvm_intblk intblk = svm_interrupt_blocked(v, intack); __update_guest_eip(regs, 1); /* Check for interrupt not handled or new interrupt. */ if ( vmcb->eventinj.fields.v || - ((intack.source != hvm_intsrc_none) && - !svm_interrupt_blocked(current, intack)) ) - { - HVMTRACE_1D(HLT, current, /*int pending=*/ 1); + (intblk == hvm_intblk_shadow) || /* very likely a STI shadow */ + ((intack.source != hvm_intsrc_none) && (!intblk)) ) + { + HVMTRACE_1D(HLT, v, /*int pending=*/ 1); return; } - HVMTRACE_1D(HLT, current, /*int pending=*/ 0); + HVMTRACE_1D(HLT, v, /*int pending=*/ 0); hvm_hlt(regs->eflags); }