diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-08-10 21:48:43 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2003-08-10 21:48:43 +0000 |
commit | 4cbf74b6b8097ca4c2396449babff639dab601cf (patch) | |
tree | 5d207930046c5a314b50ef6a6a475ca72bb2cec8 | |
parent | 33417e7025afa5ea1c38c3c2b2ea53d975b5648b (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.c | 29 |
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; } |