Revision 7eee2a50
b/target-i386/cpu.h | ||
---|---|---|
115 | 115 |
/* copy of CR0.PE (protected mode) */ |
116 | 116 |
#define HF_PE_SHIFT 7 |
117 | 117 |
#define HF_TF_SHIFT 8 /* must be same as eflags */ |
118 |
#define HF_MP_SHIFT 9 /* the order must be MP, EM, TS */ |
|
119 |
#define HF_EM_SHIFT 10 |
|
120 |
#define HF_TS_SHIFT 11 |
|
118 | 121 |
#define HF_IOPL_SHIFT 12 /* must be same as eflags */ |
119 | 122 |
#define HF_VM_SHIFT 17 /* must be same as eflags */ |
120 | 123 |
|
... | ... | |
126 | 129 |
#define HF_ADDSEG_MASK (1 << HF_ADDSEG_SHIFT) |
127 | 130 |
#define HF_PE_MASK (1 << HF_PE_SHIFT) |
128 | 131 |
#define HF_TF_MASK (1 << HF_TF_SHIFT) |
132 |
#define HF_MP_MASK (1 << HF_MP_SHIFT) |
|
133 |
#define HF_EM_MASK (1 << HF_EM_SHIFT) |
|
134 |
#define HF_TS_MASK (1 << HF_TS_SHIFT) |
|
129 | 135 |
|
130 | 136 |
#define CR0_PE_MASK (1 << 0) |
137 |
#define CR0_MP_MASK (1 << 1) |
|
138 |
#define CR0_EM_MASK (1 << 2) |
|
131 | 139 |
#define CR0_TS_MASK (1 << 3) |
140 |
#define CR0_NE_MASK (1 << 5) |
|
132 | 141 |
#define CR0_WP_MASK (1 << 16) |
133 | 142 |
#define CR0_AM_MASK (1 << 18) |
134 | 143 |
#define CR0_PG_MASK (1 << 31) |
... | ... | |
280 | 289 |
unsigned int fpus; |
281 | 290 |
unsigned int fpuc; |
282 | 291 |
uint8_t fptags[8]; /* 0 = valid, 1 = empty */ |
283 |
CPU86_LDouble fpregs[8];
|
|
292 |
CPU86_LDouble fpregs[8]; |
|
284 | 293 |
|
285 | 294 |
/* emulator internal variables */ |
286 | 295 |
CPU86_LDouble ft0; |
... | ... | |
304 | 313 |
uint32_t sysenter_eip; |
305 | 314 |
|
306 | 315 |
/* temporary data for USE_CODE_COPY mode */ |
316 |
#ifdef USE_CODE_COPY |
|
307 | 317 |
uint32_t tmp0; |
308 | 318 |
uint32_t saved_esp; |
319 |
int native_fp_regs; /* if true, the FPU state is in the native CPU regs */ |
|
320 |
#endif |
|
309 | 321 |
|
310 | 322 |
/* exception/interrupt handling */ |
311 | 323 |
jmp_buf jmp_env; |
b/target-i386/op.c | ||
---|---|---|
998 | 998 |
void OPPROTO op_clts(void) |
999 | 999 |
{ |
1000 | 1000 |
env->cr[0] &= ~CR0_TS_MASK; |
1001 |
env->hflags &= ~HF_TS_MASK; |
|
1001 | 1002 |
} |
1002 | 1003 |
|
1003 | 1004 |
/* flags handling */ |
b/target-i386/translate.c | ||
---|---|---|
63 | 63 |
int singlestep_enabled; /* "hardware" single step enabled */ |
64 | 64 |
int jmp_opt; /* use direct block chaining for direct jumps */ |
65 | 65 |
int mem_index; /* select memory access functions */ |
66 |
int flags; /* all execution flags */ |
|
66 | 67 |
struct TranslationBlock *tb; |
67 | 68 |
int popl_esp_hack; /* for correct popl with esp base handling */ |
68 | 69 |
} DisasContext; |
... | ... | |
2814 | 2815 |
/************************/ |
2815 | 2816 |
/* floats */ |
2816 | 2817 |
case 0xd8 ... 0xdf: |
2818 |
if (s->flags & (HF_EM_MASK | HF_TS_MASK)) { |
|
2819 |
/* if CR0.EM or CR0.TS are set, generate an FPU exception */ |
|
2820 |
/* XXX: what to do if illegal op ? */ |
|
2821 |
gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); |
|
2822 |
break; |
|
2823 |
} |
|
2817 | 2824 |
modrm = ldub_code(s->pc++); |
2818 | 2825 |
mod = (modrm >> 6) & 3; |
2819 | 2826 |
rm = modrm & 7; |
... | ... | |
3225 | 3232 |
goto illegal_op; |
3226 | 3233 |
} |
3227 | 3234 |
} |
3235 |
#ifdef USE_CODE_COPY |
|
3236 |
s->tb->cflags |= CF_TB_FP_USED; |
|
3237 |
#endif |
|
3228 | 3238 |
break; |
3229 | 3239 |
/************************/ |
3230 | 3240 |
/* string ops */ |
... | ... | |
3747 | 3757 |
goto illegal_op; |
3748 | 3758 |
break; |
3749 | 3759 |
case 0x9b: /* fwait */ |
3760 |
if ((s->flags & (HF_MP_MASK | HF_TS_MASK)) == |
|
3761 |
(HF_MP_MASK | HF_TS_MASK)) { |
|
3762 |
gen_exception(s, EXCP07_PREX, pc_start - s->cs_base); |
|
3763 |
} |
|
3750 | 3764 |
break; |
3751 | 3765 |
case 0xcc: /* int3 */ |
3752 | 3766 |
gen_interrupt(s, EXCP03_INT3, pc_start - s->cs_base, s->pc - s->cs_base); |
... | ... | |
4140 | 4154 |
gen_exception(s, EXCP0D_GPF, pc_start - s->cs_base); |
4141 | 4155 |
} else { |
4142 | 4156 |
gen_op_clts(); |
4157 |
/* abort block because static cpu state changed */ |
|
4158 |
gen_op_jmp_im(s->pc - s->cs_base); |
|
4159 |
gen_eob(s); |
|
4143 | 4160 |
} |
4144 | 4161 |
break; |
4145 | 4162 |
default: |
... | ... | |
4504 | 4521 |
else |
4505 | 4522 |
dc->mem_index = 3; |
4506 | 4523 |
} |
4524 |
dc->flags = flags; |
|
4507 | 4525 |
dc->jmp_opt = !(dc->tf || env->singlestep_enabled || |
4508 | 4526 |
(flags & HF_INHIBIT_IRQ_MASK) |
4509 | 4527 |
#ifndef CONFIG_SOFTMMU |
Also available in: Unified diff