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