diff options
-rw-r--r-- | cpu-exec.c | 1 | ||||
-rw-r--r-- | exec-all.h | 2 | ||||
-rw-r--r-- | exec.c | 15 |
3 files changed, 10 insertions, 8 deletions
diff --git a/cpu-exec.c b/cpu-exec.c index bd0cbb35e7..4e2d77f3a8 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -142,6 +142,7 @@ int cpu_exec(CPUState *env1) /* prepare setjmp context for exception handling */ for(;;) { if (setjmp(env->jmp_env) == 0) { + env->current_tb = NULL; /* if an exception is pending, we execute it here */ if (env->exception_index >= 0) { if (env->exception_index >= EXCP_INTERRUPT) { diff --git a/exec-all.h b/exec-all.h index 9c7e5ed83f..407e963281 100644 --- a/exec-all.h +++ b/exec-all.h @@ -85,7 +85,7 @@ int page_unprotect(unsigned long address); void tb_invalidate_page_range(target_ulong start, target_ulong end); void tlb_flush_page(CPUState *env, uint32_t addr); void tlb_flush_page_write(CPUState *env, uint32_t addr); -void tlb_flush(CPUState *env); +void tlb_flush(CPUState *env, int flush_global); int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, int is_user, int is_softmmu); @@ -260,10 +260,6 @@ void tb_flush(CPUState *env) nb_tbs, nb_tbs > 0 ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0); #endif - /* must reset current TB so that interrupts cannot modify the - links while we are modifying them */ - env->current_tb = NULL; - nb_tbs = 0; for(i = 0;i < CODE_GEN_HASH_SIZE; i++) tb_hash[i] = NULL; @@ -970,13 +966,16 @@ void cpu_set_log_filename(const char *filename) void cpu_interrupt(CPUState *env, int mask) { TranslationBlock *tb; + static int interrupt_lock; env->interrupt_request |= mask; /* if the cpu is currently executing code, we must unlink it and all the potentially executing TB */ tb = env->current_tb; - if (tb) { + if (tb && !testandset(&interrupt_lock)) { + env->current_tb = NULL; tb_reset_jump_recursive(tb); + interrupt_lock = 0; } } @@ -998,7 +997,9 @@ void cpu_abort(CPUState *env, const char *fmt, ...) #if !defined(CONFIG_USER_ONLY) -void tlb_flush(CPUState *env) +/* NOTE: if flush_global is true, also flush global entries (not + implemented yet) */ +void tlb_flush(CPUState *env, int flush_global) { int i; @@ -1293,7 +1294,7 @@ int page_unprotect(unsigned long addr) #else -void tlb_flush(CPUState *env) +void tlb_flush(CPUState *env, int flush_global) { } |