Commit 4cbf74b6b8097ca4c2396449babff639dab601cf

Authored by bellard
1 parent 33417e70

soft mmu support


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@355 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 23 additions and 6 deletions
cpu-exec.c
... ... @@ -245,6 +245,7 @@ int cpu_exec(CPUState *env1)
245 245 (unsigned long)env->segs[R_SS].base) != 0) <<
246 246 GEN_FLAG_ADDSEG_SHIFT;
247 247 flags |= env->cpl << GEN_FLAG_CPL_SHIFT;
  248 + flags |= env->soft_mmu << GEN_FLAG_SOFT_MMU_SHIFT;
248 249 flags |= (env->eflags & VM_MASK) >> (17 - GEN_FLAG_VM_SHIFT);
249 250 flags |= (env->eflags & (IOPL_MASK | TF_MASK));
250 251 cs_base = env->segs[R_CS].base;
... ... @@ -333,6 +334,15 @@ int cpu_exec(CPUState *env1)
333 334 gen_func();
334 335 #endif
335 336 env->current_tb = NULL;
  337 + /* reset soft MMU for next block (it can currently
  338 + only be set by a memory fault) */
  339 +#if defined(TARGET_I386) && !defined(CONFIG_SOFTMMU)
  340 + if (env->soft_mmu) {
  341 + env->soft_mmu = 0;
  342 + /* do not allow linking to another block */
  343 + T0 = 0;
  344 + }
  345 +#endif
336 346 }
337 347 } else {
338 348 }
... ... @@ -478,14 +488,21 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
478 488 a virtual CPU fault */
479 489 cpu_restore_state(tb, env, pc);
480 490 }
  491 + if (ret == 1) {
481 492 #if 0
482   - printf("PF exception: EIP=0x%08x CR2=0x%08x error=0x%x\n",
483   - env->eip, env->cr[2], env->error_code);
  493 + printf("PF exception: EIP=0x%08x CR2=0x%08x error=0x%x\n",
  494 + env->eip, env->cr[2], env->error_code);
484 495 #endif
485   - /* we restore the process signal mask as the sigreturn should
486   - do it (XXX: use sigsetjmp) */
487   - sigprocmask(SIG_SETMASK, old_set, NULL);
488   - raise_exception_err(EXCP0E_PAGE, env->error_code);
  496 + /* we restore the process signal mask as the sigreturn should
  497 + do it (XXX: use sigsetjmp) */
  498 + sigprocmask(SIG_SETMASK, old_set, NULL);
  499 + raise_exception_err(EXCP0E_PAGE, env->error_code);
  500 + } else {
  501 + /* activate soft MMU for this block */
  502 + env->soft_mmu = 1;
  503 + sigprocmask(SIG_SETMASK, old_set, NULL);
  504 + cpu_loop_exit();
  505 + }
489 506 /* never comes here */
490 507 return 1;
491 508 }
... ...