[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 13/24] cpu-exec: Migrate some generic fns to cpu-exec
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 13/24] cpu-exec: Migrate some generic fns to cpu-exec-common |
Date: |
Wed, 16 Sep 2015 14:29:44 +0200 |
From: Peter Crosthwaite <address@hidden>
The goal is to split the functions such that cpu-exec is CPU specific
content, while cpus-exec-common.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 a new module,
cpu-exec-common.
Signed-off-by: Peter Crosthwaite <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
Makefile.target | 1 +
cpu-exec-common.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
cpu-exec.c | 59 ----------------------------------------
3 files changed, 82 insertions(+), 59 deletions(-)
create mode 100644 cpu-exec-common.c
diff --git a/Makefile.target b/Makefile.target
index 92cff90..0d8c504 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -85,6 +85,7 @@ all: $(PROGS) stap
#########################################################
# cpu emulator library
obj-y = exec.o translate-all.o cpu-exec.o
+obj-y += cpu-exec-common.o
obj-y += tcg/tcg.o tcg/tcg-op.o tcg/optimize.o
obj-$(CONFIG_TCG_INTERPRETER) += tci.o
obj-$(CONFIG_TCG_INTERPRETER) += disas/tci.o
diff --git a/cpu-exec-common.c b/cpu-exec-common.c
new file mode 100644
index 0000000..16d305b
--- /dev/null
+++ b/cpu-exec-common.c
@@ -0,0 +1,81 @@
+/*
+ * emulator main execution loop
+ *
+ * Copyright (c) 2003-2005 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include "cpu.h"
+#include "sysemu/cpus.h"
+#include "exec/memory-internal.h"
+
+bool exit_request;
+CPUState *tcg_current_cpu;
+
+/* 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 cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc)
+{
+ if (pc) {
+ cpu_restore_state(cpu, pc);
+ }
+ cpu->current_tb = NULL;
+ siglongjmp(cpu->jmp_env, 1);
+}
diff --git a/cpu-exec.c b/cpu-exec.c
index 8945533..947e646 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"
#include "exec/tb-hash.h"
@@ -128,61 +127,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);
-}
-
-void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc)
-{
- if (pc) {
- cpu_restore_state(cpu, pc);
- }
- 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)
-{
- 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)
{
@@ -385,9 +329,6 @@ static void cpu_handle_debug_exception(CPUState *cpu)
/* main execution loop */
-bool exit_request;
-CPUState *tcg_current_cpu;
-
int cpu_exec(CPUState *cpu)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
--
2.5.0
- [Qemu-devel] [PULL 02/24] update Linux headers to 4.3-rc1, (continued)
- [Qemu-devel] [PULL 02/24] update Linux headers to 4.3-rc1, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 06/24] kvm: Add kvm system event crash handler, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 03/24] update-linux-headers: copy standard-headers files one by one, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 04/24] target-i386: move asm-x86/hyperv.h to standard-headers, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 05/24] cpu: Add crash_occurred flag into CPUState, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 08/24] hmp-commands-info: move info_cmds content out of monitor.c, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 07/24] i386/kvm: Hyper-v crash msrs set/get'ers and migration, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 10/24] hmp-commands.hx: fix end of table info, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 12/24] qemu-char: Use g_new() & friends where that makes obvious sense, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 11/24] monitor: added generation of documentation for hmp-commands-info.hx, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 13/24] cpu-exec: Migrate some generic fns to cpu-exec-common,
Paolo Bonzini <=
- [Qemu-devel] [PULL 14/24] translate-all: Move tcg_handle_interrupt() to -common, Paolo Bonzini, 2015/09/16
- [Qemu-devel] [PULL 16/24] tcg: Move tci_tb_ptr to -common, Paolo Bonzini, 2015/09/16
[Qemu-devel] [PULL 15/24] tcg: split tcg_op_defs to -common, Paolo Bonzini, 2015/09/16
[Qemu-devel] [PULL 09/24] monitor: remove target-specific code from monitor.c, Paolo Bonzini, 2015/09/16
[Qemu-devel] [PULL 18/24] cputlb: move CPU_LOOP() for tlb_reset() to exec.c, Paolo Bonzini, 2015/09/16
[Qemu-devel] [PULL 17/24] translate: move real_host_page setting to -common, Paolo Bonzini, 2015/09/16