Revision a2397807
b/target-i386/cpu.h | ||
---|---|---|
145 | 145 |
#define HF_IOPL_SHIFT 12 /* must be same as eflags */ |
146 | 146 |
#define HF_LMA_SHIFT 14 /* only used on x86_64: long mode active */ |
147 | 147 |
#define HF_CS64_SHIFT 15 /* only used on x86_64: 64 bit code segment */ |
148 |
#define HF_OSFXSR_SHIFT 16 /* CR4.OSFXSR */
|
|
148 |
#define HF_RF_SHIFT 16 /* must be same as eflags */
|
|
149 | 149 |
#define HF_VM_SHIFT 17 /* must be same as eflags */ |
150 | 150 |
#define HF_SMM_SHIFT 19 /* CPU in SMM mode */ |
151 | 151 |
#define HF_SVME_SHIFT 20 /* SVME enabled (copy of EFER.SVME) */ |
152 | 152 |
#define HF_SVMI_SHIFT 21 /* SVM intercepts are active */ |
153 |
#define HF_OSFXSR_SHIFT 22 /* CR4.OSFXSR */ |
|
153 | 154 |
|
154 | 155 |
#define HF_CPL_MASK (3 << HF_CPL_SHIFT) |
155 | 156 |
#define HF_SOFTMMU_MASK (1 << HF_SOFTMMU_SHIFT) |
... | ... | |
165 | 166 |
#define HF_IOPL_MASK (3 << HF_IOPL_SHIFT) |
166 | 167 |
#define HF_LMA_MASK (1 << HF_LMA_SHIFT) |
167 | 168 |
#define HF_CS64_MASK (1 << HF_CS64_SHIFT) |
168 |
#define HF_OSFXSR_MASK (1 << HF_OSFXSR_SHIFT)
|
|
169 |
#define HF_RF_MASK (1 << HF_RF_SHIFT)
|
|
169 | 170 |
#define HF_VM_MASK (1 << HF_VM_SHIFT) |
170 | 171 |
#define HF_SMM_MASK (1 << HF_SMM_SHIFT) |
171 | 172 |
#define HF_SVME_MASK (1 << HF_SVME_SHIFT) |
172 | 173 |
#define HF_SVMI_MASK (1 << HF_SVMI_SHIFT) |
174 |
#define HF_OSFXSR_MASK (1 << HF_OSFXSR_SHIFT) |
|
173 | 175 |
|
174 | 176 |
/* hflags2 */ |
175 | 177 |
|
... | ... | |
881 | 883 |
{ |
882 | 884 |
*cs_base = env->segs[R_CS].base; |
883 | 885 |
*pc = *cs_base + env->eip; |
884 |
*flags = env->hflags | (env->eflags & (IOPL_MASK | TF_MASK | VM_MASK)); |
|
886 |
*flags = env->hflags | |
|
887 |
(env->eflags & (IOPL_MASK | TF_MASK | RF_MASK | VM_MASK)); |
|
885 | 888 |
} |
886 | 889 |
|
887 | 890 |
#endif /* CPU_I386_H */ |
b/target-i386/helper.h | ||
---|---|---|
62 | 62 |
DEF_HELPER_1(monitor, void, tl) |
63 | 63 |
DEF_HELPER_1(mwait, void, int) |
64 | 64 |
DEF_HELPER_0(debug, void) |
65 |
DEF_HELPER_0(reset_rf, void) |
|
65 | 66 |
DEF_HELPER_2(raise_interrupt, void, int, int) |
66 | 67 |
DEF_HELPER_1(raise_exception, void, int) |
67 | 68 |
DEF_HELPER_0(cli, void) |
b/target-i386/op_helper.c | ||
---|---|---|
4688 | 4688 |
cpu_loop_exit(); |
4689 | 4689 |
} |
4690 | 4690 |
|
4691 |
void helper_reset_rf(void) |
|
4692 |
{ |
|
4693 |
env->eflags &= ~RF_MASK; |
|
4694 |
} |
|
4695 |
|
|
4691 | 4696 |
void helper_raise_interrupt(int intno, int next_eip_addend) |
4692 | 4697 |
{ |
4693 | 4698 |
raise_interrupt(intno, 1, 0, next_eip_addend); |
b/target-i386/translate.c | ||
---|---|---|
2704 | 2704 |
if (s->tb->flags & HF_INHIBIT_IRQ_MASK) { |
2705 | 2705 |
gen_helper_reset_inhibit_irq(); |
2706 | 2706 |
} |
2707 |
if (s->tb->flags & HF_RF_MASK) { |
|
2708 |
gen_helper_reset_rf(); |
|
2709 |
} |
|
2707 | 2710 |
if (s->singlestep_enabled) { |
2708 | 2711 |
gen_helper_debug(); |
2709 | 2712 |
} else if (s->tf) { |
... | ... | |
7687 | 7690 |
for(;;) { |
7688 | 7691 |
if (unlikely(!TAILQ_EMPTY(&env->breakpoints))) { |
7689 | 7692 |
TAILQ_FOREACH(bp, &env->breakpoints, entry) { |
7690 |
if (bp->pc == pc_ptr) { |
|
7693 |
if (bp->pc == pc_ptr && |
|
7694 |
!((bp->flags & BP_CPU) && (tb->flags & HF_RF_MASK))) { |
|
7691 | 7695 |
gen_debug(dc, pc_ptr - dc->cs_base); |
7692 | 7696 |
break; |
7693 | 7697 |
} |
Also available in: Unified diff