Message ID | 20170213121017.12907-13-alex.bennee@linaro.org |
---|---|
State | New |
Headers | show |
Series | MTTCG Base enabling patches with ARM enablement | expand |
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~
On Mon, Feb 13, 2017 at 2:19 PM, Richard Henderson <rth@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
On 02/14/2017 06:33 AM, Pranith Kumar wrote: > On Mon, Feb 13, 2017 at 2:19 PM, Richard Henderson <rth@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. Bah. Sorry, ENOCOFFEE. Reviewed-by: Richard Henderson <rth@twiddle.net> r~
Richard Henderson <rth@twiddle.net> writes: > On 02/13/2017 11:10 PM, Alex Bennée wrote: >> @@ -239,9 +240,16 @@ static void cpu_exec_step(CPUState *cpu) <snip> >> + } 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. Will that work given cpu_exec_step_atomic() is common between linux-user and system emulation? -- Alex Bennée
On 02/14/2017 09:50 PM, Alex Bennée wrote: > > Richard Henderson <rth@twiddle.net> writes: > >> On 02/13/2017 11:10 PM, Alex Bennée wrote: >>> @@ -239,9 +240,16 @@ static void cpu_exec_step(CPUState *cpu) > <snip> >>> + } 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. > > Will that work given cpu_exec_step_atomic() is common between linux-user > and system emulation? Ug. No, you're right. r~
diff --git a/cpu-exec.c b/cpu-exec.c index b0ddada8c1..e61f5747c8 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -228,6 +228,7 @@ static void cpu_exec_nocache(CPUState *cpu, int max_cycles, static void cpu_exec_step(CPUState *cpu) { + CPUClass *cc = CPU_GET_CLASS(cpu); CPUArchState *env = (CPUArchState *)cpu->env_ptr; TranslationBlock *tb; target_ulong cs_base, pc; @@ -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); + } + + cc->cpu_exec_exit(cpu); tb_lock(); tb_phys_invalidate(tb, -1); tb_free(tb); diff --git a/cpus.c b/cpus.c index 25897edbd3..cb44544fcf 100644 --- a/cpus.c +++ b/cpus.c @@ -1347,6 +1347,11 @@ static void *qemu_tcg_rr_cpu_thread_fn(void *arg) if (r == EXCP_DEBUG) { cpu_handle_guest_debug(cpu); break; + } else if (r == EXCP_ATOMIC) { + qemu_mutex_unlock_iothread(); + cpu_exec_step_atomic(cpu); + qemu_mutex_lock_iothread(); + break; } } else if (cpu->stop) { if (cpu->unplug) { @@ -1457,6 +1462,10 @@ static void *qemu_tcg_cpu_thread_fn(void *arg) */ g_assert(cpu->halted); break; + case EXCP_ATOMIC: + qemu_mutex_unlock_iothread(); + cpu_exec_step_atomic(cpu); + qemu_mutex_lock_iothread(); default: /* Ignore everything else? */ break;