Commit ee8b7021da823e11e3c6ea9063ebb2ab50406a3e
1 parent
625976da
temporary interrupt locking fix (need rework)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@598 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
10 additions
and
8 deletions
cpu-exec.c
... | ... | @@ -142,6 +142,7 @@ int cpu_exec(CPUState *env1) |
142 | 142 | /* prepare setjmp context for exception handling */ |
143 | 143 | for(;;) { |
144 | 144 | if (setjmp(env->jmp_env) == 0) { |
145 | + env->current_tb = NULL; | |
145 | 146 | /* if an exception is pending, we execute it here */ |
146 | 147 | if (env->exception_index >= 0) { |
147 | 148 | if (env->exception_index >= EXCP_INTERRUPT) { | ... | ... |
exec-all.h
... | ... | @@ -85,7 +85,7 @@ int page_unprotect(unsigned long address); |
85 | 85 | void tb_invalidate_page_range(target_ulong start, target_ulong end); |
86 | 86 | void tlb_flush_page(CPUState *env, uint32_t addr); |
87 | 87 | void tlb_flush_page_write(CPUState *env, uint32_t addr); |
88 | -void tlb_flush(CPUState *env); | |
88 | +void tlb_flush(CPUState *env, int flush_global); | |
89 | 89 | int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, |
90 | 90 | int is_user, int is_softmmu); |
91 | 91 | ... | ... |
exec.c
... | ... | @@ -260,10 +260,6 @@ void tb_flush(CPUState *env) |
260 | 260 | nb_tbs, |
261 | 261 | nb_tbs > 0 ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0); |
262 | 262 | #endif |
263 | - /* must reset current TB so that interrupts cannot modify the | |
264 | - links while we are modifying them */ | |
265 | - env->current_tb = NULL; | |
266 | - | |
267 | 263 | nb_tbs = 0; |
268 | 264 | for(i = 0;i < CODE_GEN_HASH_SIZE; i++) |
269 | 265 | tb_hash[i] = NULL; |
... | ... | @@ -970,13 +966,16 @@ void cpu_set_log_filename(const char *filename) |
970 | 966 | void cpu_interrupt(CPUState *env, int mask) |
971 | 967 | { |
972 | 968 | TranslationBlock *tb; |
969 | + static int interrupt_lock; | |
973 | 970 | |
974 | 971 | env->interrupt_request |= mask; |
975 | 972 | /* if the cpu is currently executing code, we must unlink it and |
976 | 973 | all the potentially executing TB */ |
977 | 974 | tb = env->current_tb; |
978 | - if (tb) { | |
975 | + if (tb && !testandset(&interrupt_lock)) { | |
976 | + env->current_tb = NULL; | |
979 | 977 | tb_reset_jump_recursive(tb); |
978 | + interrupt_lock = 0; | |
980 | 979 | } |
981 | 980 | } |
982 | 981 | |
... | ... | @@ -998,7 +997,9 @@ void cpu_abort(CPUState *env, const char *fmt, ...) |
998 | 997 | |
999 | 998 | #if !defined(CONFIG_USER_ONLY) |
1000 | 999 | |
1001 | -void tlb_flush(CPUState *env) | |
1000 | +/* NOTE: if flush_global is true, also flush global entries (not | |
1001 | + implemented yet) */ | |
1002 | +void tlb_flush(CPUState *env, int flush_global) | |
1002 | 1003 | { |
1003 | 1004 | int i; |
1004 | 1005 | |
... | ... | @@ -1293,7 +1294,7 @@ int page_unprotect(unsigned long addr) |
1293 | 1294 | |
1294 | 1295 | #else |
1295 | 1296 | |
1296 | -void tlb_flush(CPUState *env) | |
1297 | +void tlb_flush(CPUState *env, int flush_global) | |
1297 | 1298 | { |
1298 | 1299 | } |
1299 | 1300 | ... | ... |