On Mon, Feb 13, 2017 at 2:19 PM, Richard Henderson <r...@twiddle.net> wrote: > 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?
cpu_exec() has its own sigsetjmp, not cpu_tb_exec(). The exception is the debug exception from the generated code. Without this new sigsetjmp, it'll jump to cpu_exec() instead of coming back here. Thanks, -- Pranith