aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-08-10 21:48:43 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2003-08-10 21:48:43 +0000
commit4cbf74b6b8097ca4c2396449babff639dab601cf (patch)
tree5d207930046c5a314b50ef6a6a475ca72bb2cec8
parent33417e7025afa5ea1c38c3c2b2ea53d975b5648b (diff)
soft mmu support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@355 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--cpu-exec.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/cpu-exec.c b/cpu-exec.c
index d478fa8261..ecab6ff11d 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -245,6 +245,7 @@ int cpu_exec(CPUState *env1)
(unsigned long)env->segs[R_SS].base) != 0) <<
GEN_FLAG_ADDSEG_SHIFT;
flags |= env->cpl << GEN_FLAG_CPL_SHIFT;
+ flags |= env->soft_mmu << GEN_FLAG_SOFT_MMU_SHIFT;
flags |= (env->eflags & VM_MASK) >> (17 - GEN_FLAG_VM_SHIFT);
flags |= (env->eflags & (IOPL_MASK | TF_MASK));
cs_base = env->segs[R_CS].base;
@@ -333,6 +334,15 @@ int cpu_exec(CPUState *env1)
gen_func();
#endif
env->current_tb = NULL;
+ /* reset soft MMU for next block (it can currently
+ only be set by a memory fault) */
+#if defined(TARGET_I386) && !defined(CONFIG_SOFTMMU)
+ if (env->soft_mmu) {
+ env->soft_mmu = 0;
+ /* do not allow linking to another block */
+ T0 = 0;
+ }
+#endif
}
} else {
}
@@ -478,14 +488,21 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
a virtual CPU fault */
cpu_restore_state(tb, env, pc);
}
+ if (ret == 1) {
#if 0
- printf("PF exception: EIP=0x%08x CR2=0x%08x error=0x%x\n",
- env->eip, env->cr[2], env->error_code);
+ printf("PF exception: EIP=0x%08x CR2=0x%08x error=0x%x\n",
+ env->eip, env->cr[2], env->error_code);
#endif
- /* we restore the process signal mask as the sigreturn should
- do it (XXX: use sigsetjmp) */
- sigprocmask(SIG_SETMASK, old_set, NULL);
- raise_exception_err(EXCP0E_PAGE, env->error_code);
+ /* we restore the process signal mask as the sigreturn should
+ do it (XXX: use sigsetjmp) */
+ sigprocmask(SIG_SETMASK, old_set, NULL);
+ raise_exception_err(EXCP0E_PAGE, env->error_code);
+ } else {
+ /* activate soft MMU for this block */
+ env->soft_mmu = 1;
+ sigprocmask(SIG_SETMASK, old_set, NULL);
+ cpu_loop_exit();
+ }
/* never comes here */
return 1;
}