Commit 4cbf74b6b8097ca4c2396449babff639dab601cf
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 | } | ... | ... |