On 02/13/2017 11:10 PM, Alex Bennée wrote:
@@ -239,9 +240,16 @@ static void cpu_exec_step(CPUState *cpu)
1 | CF_NOCACHE | CF_IGNORE_ICOUNT);
tb->orig_tb = NULL;
tb_unlock();
- /* execute the generated code */
- trace_exec_tb_nocache(tb, pc);
- cpu_tb_exec(cpu, tb);
+
+ cc->cpu_exec_enter(cpu);
+
+ if (sigsetjmp(cpu->jmp_env, 0) == 0) {
+ /* execute the generated code */
+ trace_exec_tb_nocache(tb, pc);
+ cpu_tb_exec(cpu, tb);
+ }
I don't understand this, since cpu_tb_exec has its own sigsetjmp. Where is the
exception supposed to come from that escapes?
+ } else if (r == EXCP_ATOMIC) {
+ qemu_mutex_unlock_iothread();
+ cpu_exec_step_atomic(cpu);
+ qemu_mutex_lock_iothread();
...
+ case EXCP_ATOMIC:
+ qemu_mutex_unlock_iothread();
+ cpu_exec_step_atomic(cpu);
+ qemu_mutex_lock_iothread();
I just noticed this, but if you have to do a v13, it might be best to move
these locks inside cpu_exec_step_atomic, as with tcg_cpu_exec. Otherwise leave
it for later.
r~