On Mon, Jun 1, 2015 at 12:45 AM, Paolo Bonzini <pbonz...@redhat.com> wrote: > > > On 31/05/2015 08:11, Peter Crosthwaite wrote: >> The goal is to split the functions such that cpu-exec is CPU specific >> content, while cpus.c is generic code only. The function interface to >> cpu-exec needs to be virtualised to prepare support for multi-arch and >> moving these definitions out saves bloating the QOM interface. So >> move these definitions out of cpu-exec to the architecture independent >> cpus.c. >> >> Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com> >> --- >> cpu-exec.c | 49 ------------------------------------------------- >> cpus.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 49 insertions(+), 49 deletions(-) >> >> diff --git a/cpu-exec.c b/cpu-exec.c >> index 0266609..dbea47c 100644 >> --- a/cpu-exec.c >> +++ b/cpu-exec.c >> @@ -25,7 +25,6 @@ >> #include "sysemu/qtest.h" >> #include "qemu/timer.h" >> #include "exec/address-spaces.h" >> -#include "exec/memory-internal.h" >> #include "qemu/rcu.h" >> >> /* -icount align implementation. */ >> @@ -127,52 +126,6 @@ static void init_delay_params(SyncClocks *sc, const >> CPUState *cpu) >> } >> #endif /* CONFIG USER ONLY */ >> >> -void cpu_loop_exit(CPUState *cpu) >> -{ >> - cpu->current_tb = NULL; >> - siglongjmp(cpu->jmp_env, 1); >> -} >> - >> -/* exit the current TB from a signal handler. The host registers are >> - restored in a state compatible with the CPU emulator >> - */ >> -#if defined(CONFIG_SOFTMMU) >> -void cpu_resume_from_signal(CPUState *cpu, void *puc) >> -{ >> - /* XXX: restore cpu registers saved in host registers */ >> - >> - cpu->exception_index = -1; >> - siglongjmp(cpu->jmp_env, 1); >> -} >> - >> -void cpu_reload_memory_map(CPUState *cpu) > > This doesn't really belong in cpus.c... I don't have a better > suggestion though, so perhaps just add a FIXME in case one day there is > a cpu-exec-common.c. >
We need to go to the cpu-exec-common.c solution anyways due linux-user usage of cpu_loop_exit(). cpus.c is compiled out for linux-user. Regards, Peter > Paolo > >> -{ >> - AddressSpaceDispatch *d; >> - >> - if (qemu_in_vcpu_thread()) { >> - /* Do not let the guest prolong the critical section as much as it >> - * as it desires. >> - * >> - * Currently, this is prevented by the I/O thread's periodinc >> kicking >> - * of the VCPU thread (iothread_requesting_mutex, >> qemu_cpu_kick_thread) >> - * but this will go away once TCG's execution moves out of the >> global >> - * mutex. >> - * >> - * This pair matches cpu_exec's rcu_read_lock()/rcu_read_unlock(), >> which >> - * only protects cpu->as->dispatch. Since we reload it below, we >> can >> - * split the critical section. >> - */ >> - rcu_read_unlock(); >> - rcu_read_lock(); >> - } >> - >> - /* The CPU and TLB are protected by the iothread lock. */ >> - d = atomic_rcu_read(&cpu->as->dispatch); >> - cpu->memory_dispatch = d; >> - tlb_flush(cpu, 1); >> -} >> -#endif >> - >> /* Execute a TB, and fix up the CPU state afterwards if necessary */ >> static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, uint8_t *tb_ptr) >> { >> @@ -344,8 +297,6 @@ static void cpu_handle_debug_exception(CPUState *cpu) >> >> /* main execution loop */ >> >> -volatile sig_atomic_t exit_request; >> - >> int cpu_exec(CPUState *cpu) >> { >> CPUClass *cc = CPU_GET_CLASS(cpu); >> diff --git a/cpus.c b/cpus.c >> index c8a2911..2dc4a9a 100644 >> --- a/cpus.c >> +++ b/cpus.c >> @@ -28,6 +28,7 @@ >> #include "monitor/monitor.h" >> #include "qapi/qmp/qerror.h" >> #include "sysemu/sysemu.h" >> +#include "exec/memory-internal.h" >> #include "exec/gdbstub.h" >> #include "sysemu/dma.h" >> #include "sysemu/kvm.h" >> @@ -64,6 +65,8 @@ >> >> #endif /* CONFIG_LINUX */ >> >> +volatile sig_atomic_t exit_request; >> + >> static CPUState *next_cpu; >> int64_t max_delay; >> int64_t max_advance; >> @@ -1394,6 +1397,52 @@ static void tcg_exec_all(void) >> exit_request = 0; >> } >> >> +/* exit the current TB from a signal handler. The host registers are >> + restored in a state compatible with the CPU emulator >> + */ >> +#if defined(CONFIG_SOFTMMU) >> +void cpu_resume_from_signal(CPUState *cpu, void *puc) >> +{ >> + /* XXX: restore cpu registers saved in host registers */ >> + >> + cpu->exception_index = -1; >> + siglongjmp(cpu->jmp_env, 1); >> +} >> + >> +void cpu_reload_memory_map(CPUState *cpu) >> +{ >> + AddressSpaceDispatch *d; >> + >> + if (qemu_in_vcpu_thread()) { >> + /* Do not let the guest prolong the critical section as much as it >> + * as it desires. >> + * >> + * Currently, this is prevented by the I/O thread's periodinc >> kicking >> + * of the VCPU thread (iothread_requesting_mutex, >> qemu_cpu_kick_thread) >> + * but this will go away once TCG's execution moves out of the >> global >> + * mutex. >> + * >> + * This pair matches cpu_exec's rcu_read_lock()/rcu_read_unlock(), >> which >> + * only protects cpu->as->dispatch. Since we reload it below, we >> can >> + * split the critical section. >> + */ >> + rcu_read_unlock(); >> + rcu_read_lock(); >> + } >> + >> + /* The CPU and TLB are protected by the iothread lock. */ >> + d = atomic_rcu_read(&cpu->as->dispatch); >> + cpu->memory_dispatch = d; >> + tlb_flush(cpu, 1); >> +} >> +#endif >> + >> +void cpu_loop_exit(CPUState *cpu) >> +{ >> + cpu->current_tb = NULL; >> + siglongjmp(cpu->jmp_env, 1); >> +} >> + >> void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg) >> { >> /* XXX: implement xxx_cpu_list for targets that still miss it */ >> >