mirror of
https://github.com/xemu-project/xemu.git
synced 2024-12-18 01:08:51 +00:00
x86: Introduce CPU_INTERRUPT_NMI
(Jan Kiszka) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4205 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
6a0d8a1d23
commit
474ea8494a
@ -753,6 +753,7 @@ extern int code_copy_enabled;
|
||||
#define CPU_INTERRUPT_SMI 0x40 /* (x86 only) SMI interrupt pending */
|
||||
#define CPU_INTERRUPT_DEBUG 0x80 /* Debug event occured. */
|
||||
#define CPU_INTERRUPT_VIRQ 0x100 /* virtual interrupt pending. */
|
||||
#define CPU_INTERRUPT_NMI 0x200 /* NMI pending. */
|
||||
|
||||
void cpu_interrupt(CPUState *s, int mask);
|
||||
void cpu_reset_interrupt(CPUState *env, int mask);
|
||||
|
@ -444,6 +444,12 @@ int cpu_exec(CPUState *env1)
|
||||
env->interrupt_request &= ~CPU_INTERRUPT_SMI;
|
||||
do_smm_enter();
|
||||
BREAK_CHAIN;
|
||||
} else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
|
||||
!(env->hflags & HF_NMI_MASK)) {
|
||||
env->interrupt_request &= ~CPU_INTERRUPT_NMI;
|
||||
env->hflags |= HF_NMI_MASK;
|
||||
do_interrupt(EXCP02_NMI, 0, 0, 0, 1);
|
||||
BREAK_CHAIN;
|
||||
} else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
|
||||
(env->eflags & IF_MASK || env->hflags & HF_HIF_MASK) &&
|
||||
!(env->hflags & HF_INHIBIT_IRQ_MASK)) {
|
||||
|
@ -148,6 +148,7 @@
|
||||
#define HF_SMM_SHIFT 19 /* CPU in SMM mode */
|
||||
#define HF_GIF_SHIFT 20 /* if set CPU takes interrupts */
|
||||
#define HF_HIF_SHIFT 21 /* shadow copy of IF_MASK when in SVM */
|
||||
#define HF_NMI_SHIFT 22 /* CPU serving NMI */
|
||||
|
||||
#define HF_CPL_MASK (3 << HF_CPL_SHIFT)
|
||||
#define HF_SOFTMMU_MASK (1 << HF_SOFTMMU_SHIFT)
|
||||
@ -167,6 +168,7 @@
|
||||
#define HF_SMM_MASK (1 << HF_SMM_SHIFT)
|
||||
#define HF_GIF_MASK (1 << HF_GIF_SHIFT)
|
||||
#define HF_HIF_MASK (1 << HF_HIF_SHIFT)
|
||||
#define HF_NMI_MASK (1 << HF_NMI_SHIFT)
|
||||
|
||||
#define CR0_PE_MASK (1 << 0)
|
||||
#define CR0_MP_MASK (1 << 1)
|
||||
|
@ -593,8 +593,9 @@ static inline int cpu_halted(CPUState *env) {
|
||||
if (!(env->hflags & HF_HALTED_MASK))
|
||||
return 0;
|
||||
/* disable halt condition */
|
||||
if ((env->interrupt_request & CPU_INTERRUPT_HARD) &&
|
||||
(env->eflags & IF_MASK)) {
|
||||
if (((env->interrupt_request & CPU_INTERRUPT_HARD) &&
|
||||
(env->eflags & IF_MASK)) ||
|
||||
(env->interrupt_request & CPU_INTERRUPT_NMI)) {
|
||||
env->hflags &= ~HF_HALTED_MASK;
|
||||
return 0;
|
||||
}
|
||||
|
@ -2383,6 +2383,7 @@ void helper_iret_real(int shift)
|
||||
if (shift == 0)
|
||||
eflags_mask &= 0xffff;
|
||||
load_eflags(new_eflags, eflags_mask);
|
||||
env->hflags &= ~HF_NMI_MASK;
|
||||
}
|
||||
|
||||
static inline void validate_seg(int seg_reg, int cpl)
|
||||
@ -2634,6 +2635,7 @@ void helper_iret_protected(int shift, int next_eip)
|
||||
} else {
|
||||
helper_ret_protected(shift, 1, 0);
|
||||
}
|
||||
env->hflags &= ~HF_NMI_MASK;
|
||||
#ifdef USE_KQEMU
|
||||
if (kqemu_is_ok(env)) {
|
||||
CC_OP = CC_OP_EFLAGS;
|
||||
|
Loading…
Reference in New Issue
Block a user