Revision a412ac57 cpu-exec.c
b/cpu-exec.c | ||
---|---|---|
244 | 244 |
(unsigned long)env->segs[R_ES].base | |
245 | 245 |
(unsigned long)env->segs[R_SS].base) != 0) << |
246 | 246 |
GEN_FLAG_ADDSEG_SHIFT; |
247 |
if (!(env->eflags & VM_MASK)) {
|
|
248 |
flags |= (env->segs[R_CS].selector & 3) << GEN_FLAG_CPL_SHIFT;
|
|
249 |
} else {
|
|
250 |
/* NOTE: a dummy CPL is kept */
|
|
251 |
flags |= (1 << GEN_FLAG_VM_SHIFT);
|
|
252 |
flags |= (3 << GEN_FLAG_CPL_SHIFT);
|
|
247 |
if (env->cr[0] & CR0_PE_MASK) {
|
|
248 |
if (!(env->eflags & VM_MASK))
|
|
249 |
flags |= (env->segs[R_CS].selector & 3) <<
|
|
250 |
GEN_FLAG_CPL_SHIFT;
|
|
251 |
else
|
|
252 |
flags |= (1 << GEN_FLAG_VM_SHIFT);
|
|
253 | 253 |
} |
254 | 254 |
flags |= (env->eflags & (IOPL_MASK | TF_MASK)); |
255 | 255 |
cs_base = env->segs[R_CS].base; |
... | ... | |
396 | 396 |
|
397 | 397 |
saved_env = env; |
398 | 398 |
env = s; |
399 |
if (env->eflags & VM_MASK) {
|
|
399 |
if (!(env->cr[0] & CR0_PE_MASK) || (env->eflags & VM_MASK)) {
|
|
400 | 400 |
SegmentCache *sc; |
401 | 401 |
selector &= 0xffff; |
402 | 402 |
sc = &env->segs[seg_reg]; |
403 |
/* NOTE: in VM86 mode, limit and flags are never reloaded, |
|
404 |
so we must load them here */ |
|
405 | 403 |
sc->base = (void *)(selector << 4); |
406 | 404 |
sc->limit = 0xffff; |
407 | 405 |
sc->flags = 0; |
Also available in: Unified diff