From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56205) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YzKPw-0000Jn-Md for qemu-devel@nongnu.org; Mon, 01 Jun 2015 03:45:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YzKPt-0003ko-Ar for qemu-devel@nongnu.org; Mon, 01 Jun 2015 03:45:52 -0400 Received: from mail-wi0-x22f.google.com ([2a00:1450:400c:c05::22f]:33395) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YzKPs-0003ki-Vv for qemu-devel@nongnu.org; Mon, 01 Jun 2015 03:45:49 -0400 Received: by wicmx19 with SMTP id mx19so62463548wic.0 for ; Mon, 01 Jun 2015 00:45:48 -0700 (PDT) Sender: Paolo Bonzini Message-ID: <556C0DA1.3050108@redhat.com> Date: Mon, 01 Jun 2015 09:45:37 +0200 From: Paolo Bonzini MIME-Version: 1.0 References: In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC v2 04/34] cpu-exec: Migrate some generic fns to cpus.c List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Crosthwaite , qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, rth@twiddle.net, edgar.iglesias@gmail.com, afaerber@suse.de, Peter Crosthwaite 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 > --- > 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. 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 */ >