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,6 +142,7 @@ int cpu_exec(CPUState *env1) | ||
142 | /* prepare setjmp context for exception handling */ | 142 | /* prepare setjmp context for exception handling */ |
143 | for(;;) { | 143 | for(;;) { |
144 | if (setjmp(env->jmp_env) == 0) { | 144 | if (setjmp(env->jmp_env) == 0) { |
145 | + env->current_tb = NULL; | ||
145 | /* if an exception is pending, we execute it here */ | 146 | /* if an exception is pending, we execute it here */ |
146 | if (env->exception_index >= 0) { | 147 | if (env->exception_index >= 0) { |
147 | if (env->exception_index >= EXCP_INTERRUPT) { | 148 | if (env->exception_index >= EXCP_INTERRUPT) { |
exec-all.h
@@ -85,7 +85,7 @@ int page_unprotect(unsigned long address); | @@ -85,7 +85,7 @@ int page_unprotect(unsigned long address); | ||
85 | void tb_invalidate_page_range(target_ulong start, target_ulong end); | 85 | void tb_invalidate_page_range(target_ulong start, target_ulong end); |
86 | void tlb_flush_page(CPUState *env, uint32_t addr); | 86 | void tlb_flush_page(CPUState *env, uint32_t addr); |
87 | void tlb_flush_page_write(CPUState *env, uint32_t addr); | 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 | int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, | 89 | int tlb_set_page(CPUState *env, uint32_t vaddr, uint32_t paddr, int prot, |
90 | int is_user, int is_softmmu); | 90 | int is_user, int is_softmmu); |
91 | 91 |
exec.c
@@ -260,10 +260,6 @@ void tb_flush(CPUState *env) | @@ -260,10 +260,6 @@ void tb_flush(CPUState *env) | ||
260 | nb_tbs, | 260 | nb_tbs, |
261 | nb_tbs > 0 ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0); | 261 | nb_tbs > 0 ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0); |
262 | #endif | 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 | nb_tbs = 0; | 263 | nb_tbs = 0; |
268 | for(i = 0;i < CODE_GEN_HASH_SIZE; i++) | 264 | for(i = 0;i < CODE_GEN_HASH_SIZE; i++) |
269 | tb_hash[i] = NULL; | 265 | tb_hash[i] = NULL; |
@@ -970,13 +966,16 @@ void cpu_set_log_filename(const char *filename) | @@ -970,13 +966,16 @@ void cpu_set_log_filename(const char *filename) | ||
970 | void cpu_interrupt(CPUState *env, int mask) | 966 | void cpu_interrupt(CPUState *env, int mask) |
971 | { | 967 | { |
972 | TranslationBlock *tb; | 968 | TranslationBlock *tb; |
969 | + static int interrupt_lock; | ||
973 | 970 | ||
974 | env->interrupt_request |= mask; | 971 | env->interrupt_request |= mask; |
975 | /* if the cpu is currently executing code, we must unlink it and | 972 | /* if the cpu is currently executing code, we must unlink it and |
976 | all the potentially executing TB */ | 973 | all the potentially executing TB */ |
977 | tb = env->current_tb; | 974 | tb = env->current_tb; |
978 | - if (tb) { | 975 | + if (tb && !testandset(&interrupt_lock)) { |
976 | + env->current_tb = NULL; | ||
979 | tb_reset_jump_recursive(tb); | 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,7 +997,9 @@ void cpu_abort(CPUState *env, const char *fmt, ...) | ||
998 | 997 | ||
999 | #if !defined(CONFIG_USER_ONLY) | 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 | int i; | 1004 | int i; |
1004 | 1005 | ||
@@ -1293,7 +1294,7 @@ int page_unprotect(unsigned long addr) | @@ -1293,7 +1294,7 @@ int page_unprotect(unsigned long addr) | ||
1293 | 1294 | ||
1294 | #else | 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 |