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