178 |
/* we compute the CPU state. We assume it will not |
/* we compute the CPU state. We assume it will not |
179 |
change during the whole generated block. */ |
change during the whole generated block. */ |
180 |
#if defined(TARGET_I386) |
#if defined(TARGET_I386) |
181 |
flags = env->seg_cache[R_CS].seg_32bit << GEN_FLAG_CODE32_SHIFT; |
flags = env->segs[R_CS].seg_32bit << GEN_FLAG_CODE32_SHIFT; |
182 |
flags |= env->seg_cache[R_SS].seg_32bit << GEN_FLAG_SS32_SHIFT; |
flags |= env->segs[R_SS].seg_32bit << GEN_FLAG_SS32_SHIFT; |
183 |
flags |= (((unsigned long)env->seg_cache[R_DS].base | |
flags |= (((unsigned long)env->segs[R_DS].base | |
184 |
(unsigned long)env->seg_cache[R_ES].base | |
(unsigned long)env->segs[R_ES].base | |
185 |
(unsigned long)env->seg_cache[R_SS].base) != 0) << |
(unsigned long)env->segs[R_SS].base) != 0) << |
186 |
GEN_FLAG_ADDSEG_SHIFT; |
GEN_FLAG_ADDSEG_SHIFT; |
187 |
if (!(env->eflags & VM_MASK)) { |
if (!(env->eflags & VM_MASK)) { |
188 |
flags |= (env->segs[R_CS] & 3) << GEN_FLAG_CPL_SHIFT; |
flags |= (env->segs[R_CS].selector & 3) << GEN_FLAG_CPL_SHIFT; |
189 |
} else { |
} else { |
190 |
/* NOTE: a dummy CPL is kept */ |
/* NOTE: a dummy CPL is kept */ |
191 |
flags |= (1 << GEN_FLAG_VM_SHIFT); |
flags |= (1 << GEN_FLAG_VM_SHIFT); |
192 |
flags |= (3 << GEN_FLAG_CPL_SHIFT); |
flags |= (3 << GEN_FLAG_CPL_SHIFT); |
193 |
} |
} |
194 |
flags |= (env->eflags & (IOPL_MASK | TF_MASK)); |
flags |= (env->eflags & (IOPL_MASK | TF_MASK)); |
195 |
cs_base = env->seg_cache[R_CS].base; |
cs_base = env->segs[R_CS].base; |
196 |
pc = cs_base + env->eip; |
pc = cs_base + env->eip; |
197 |
#elif defined(TARGET_ARM) |
#elif defined(TARGET_ARM) |
198 |
flags = 0; |
flags = 0; |
347 |
if (env->eflags & VM_MASK) { |
if (env->eflags & VM_MASK) { |
348 |
SegmentCache *sc; |
SegmentCache *sc; |
349 |
selector &= 0xffff; |
selector &= 0xffff; |
350 |
sc = &env->seg_cache[seg_reg]; |
sc = &env->segs[seg_reg]; |
351 |
/* NOTE: in VM86 mode, limit and seg_32bit are never reloaded, |
/* NOTE: in VM86 mode, limit and seg_32bit are never reloaded, |
352 |
so we must load them here */ |
so we must load them here */ |
353 |
sc->base = (void *)(selector << 4); |
sc->base = (void *)(selector << 4); |
354 |
sc->limit = 0xffff; |
sc->limit = 0xffff; |
355 |
sc->seg_32bit = 0; |
sc->seg_32bit = 0; |
356 |
env->segs[seg_reg] = selector; |
sc->selector = selector; |
357 |
} else { |
} else { |
358 |
load_seg(seg_reg, selector, 0); |
load_seg(seg_reg, selector, 0); |
359 |
} |
} |
426 |
return 0; |
return 0; |
427 |
#if defined(TARGET_I386) |
#if defined(TARGET_I386) |
428 |
env->eip = found_pc - tb->cs_base; |
env->eip = found_pc - tb->cs_base; |
429 |
env->cr2 = address; |
env->cr[2] = address; |
430 |
/* we restore the process signal mask as the sigreturn should |
/* we restore the process signal mask as the sigreturn should |
431 |
do it (XXX: use sigsetjmp) */ |
do it (XXX: use sigsetjmp) */ |
432 |
sigprocmask(SIG_SETMASK, old_set, NULL); |
sigprocmask(SIG_SETMASK, old_set, NULL); |