Revision 474ea849

b/cpu-all.h
753 753
#define CPU_INTERRUPT_SMI    0x40 /* (x86 only) SMI interrupt pending */
754 754
#define CPU_INTERRUPT_DEBUG  0x80 /* Debug event occured.  */
755 755
#define CPU_INTERRUPT_VIRQ   0x100 /* virtual interrupt pending.  */
756
#define CPU_INTERRUPT_NMI    0x200 /* NMI pending. */
756 757

  
757 758
void cpu_interrupt(CPUState *s, int mask);
758 759
void cpu_reset_interrupt(CPUState *env, int mask);
b/cpu-exec.c
444 444
                        env->interrupt_request &= ~CPU_INTERRUPT_SMI;
445 445
                        do_smm_enter();
446 446
                        BREAK_CHAIN;
447
                    } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
448
                        !(env->hflags & HF_NMI_MASK)) {
449
                        env->interrupt_request &= ~CPU_INTERRUPT_NMI;
450
                        env->hflags |= HF_NMI_MASK;
451
                        do_interrupt(EXCP02_NMI, 0, 0, 0, 1);
452
                        BREAK_CHAIN;
447 453
                    } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
448 454
                        (env->eflags & IF_MASK || env->hflags & HF_HIF_MASK) &&
449 455
                        !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
b/target-i386/cpu.h
148 148
#define HF_SMM_SHIFT        19 /* CPU in SMM mode */
149 149
#define HF_GIF_SHIFT        20 /* if set CPU takes interrupts */
150 150
#define HF_HIF_SHIFT        21 /* shadow copy of IF_MASK when in SVM */
151
#define HF_NMI_SHIFT        22 /* CPU serving NMI */
151 152

  
152 153
#define HF_CPL_MASK          (3 << HF_CPL_SHIFT)
153 154
#define HF_SOFTMMU_MASK      (1 << HF_SOFTMMU_SHIFT)
......
167 168
#define HF_SMM_MASK          (1 << HF_SMM_SHIFT)
168 169
#define HF_GIF_MASK          (1 << HF_GIF_SHIFT)
169 170
#define HF_HIF_MASK          (1 << HF_HIF_SHIFT)
171
#define HF_NMI_MASK          (1 << HF_NMI_SHIFT)
170 172

  
171 173
#define CR0_PE_MASK  (1 << 0)
172 174
#define CR0_MP_MASK  (1 << 1)
b/target-i386/exec.h
593 593
    if (!(env->hflags & HF_HALTED_MASK))
594 594
        return 0;
595 595
    /* disable halt condition */
596
    if ((env->interrupt_request & CPU_INTERRUPT_HARD) &&
597
        (env->eflags & IF_MASK)) {
596
    if (((env->interrupt_request & CPU_INTERRUPT_HARD) &&
597
         (env->eflags & IF_MASK)) ||
598
        (env->interrupt_request & CPU_INTERRUPT_NMI)) {
598 599
        env->hflags &= ~HF_HALTED_MASK;
599 600
        return 0;
600 601
    }
b/target-i386/helper.c
2383 2383
    if (shift == 0)
2384 2384
        eflags_mask &= 0xffff;
2385 2385
    load_eflags(new_eflags, eflags_mask);
2386
    env->hflags &= ~HF_NMI_MASK;
2386 2387
}
2387 2388

  
2388 2389
static inline void validate_seg(int seg_reg, int cpl)
......
2634 2635
    } else {
2635 2636
        helper_ret_protected(shift, 1, 0);
2636 2637
    }
2638
    env->hflags &= ~HF_NMI_MASK;
2637 2639
#ifdef USE_KQEMU
2638 2640
    if (kqemu_is_ok(env)) {
2639 2641
        CC_OP = CC_OP_EFLAGS;

Also available in: Unified diff