From: Glauber Costa <glommer@redhat.com>
To: qemu-devel@nongnu.org
Cc: aliguori@us.ibm.com, jan.kiszka@siemens.com, jes@sgi.com,
avi@qumranet.com, Glauber Costa <gcosta@redhat.com>,
dmitry.baryshkov@siemens.com
Subject: [Qemu-devel] [PATCH 07/32] introduce QEMUAccel and fill it with interrupt specific driver
Date: Thu, 23 Oct 2008 12:18:51 -0200 [thread overview]
Message-ID: <1224771556-11146-8-git-send-email-glommer@redhat.com> (raw)
In-Reply-To: <1224771556-11146-1-git-send-email-glommer@redhat.com>
From: Glauber Costa <gcosta@redhat.com>
This patch introduces QEMUAccel, a placeholder for function pointers
that aims at helping qemu to abstract accelerators such as kqemu and
kvm (actually, the 'accelerator' name was proposed by avi kivity, since
he loves referring to kvm that way).
To begin with, the accelerator is given the opportunity to register a
cpu_interrupt function, to be called after the raw cpu_interrupt.
This has the side effect of, for the kqemu accelerator, calling kqemu_cpu_interrupt
everytime, which didn't use to happen. But looking at the code, this seems safe to me.
This patch applies on raw qemu.
Signed-off-by: Glauber Costa <glommer@redhat.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@siemens.com>
---
Makefile.target | 2 +-
accel.c | 17 +++++++++++++++++
accel.h | 20 ++++++++++++++++++++
exec-all.h | 1 -
exec.c | 3 +++
kqemu.c | 11 ++++++++++-
vl.c | 17 +++++------------
7 files changed, 56 insertions(+), 15 deletions(-)
create mode 100644 accel.c
create mode 100644 accel.h
diff --git a/Makefile.target b/Makefile.target
index e2edf9d..623ecd8 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -188,7 +188,7 @@ all: $(PROGS)
#########################################################
# cpu emulator library
LIBOBJS=exec.o kqemu.o translate-all.o cpu-exec.o\
- translate.o host-utils.o
+ translate.o host-utils.o accel.o
ifdef CONFIG_DYNGEN_OP
exec.o: dyngen-opc.h
LIBOBJS+=op.o
diff --git a/accel.c b/accel.c
new file mode 100644
index 0000000..d30460d
--- /dev/null
+++ b/accel.c
@@ -0,0 +1,17 @@
+#include "hw/hw.h"
+#include "accel.h"
+
+QEMUAccel *current_accel;
+
+int _accel_nop(void)
+{
+ return 0;
+}
+
+#define accel_nop ((void *)_accel_nop)
+
+/* Accelerator wrapper for the no-accel (raw qemu) case */
+QEMUAccel noaccel = {
+ .cpu_interrupt = accel_nop,
+};
+
diff --git a/accel.h b/accel.h
new file mode 100644
index 0000000..8e5ddc6
--- /dev/null
+++ b/accel.h
@@ -0,0 +1,20 @@
+#ifndef _ACCEL_H_
+#define _ACCEL_H_
+
+typedef struct QEMUAccel {
+ void (*cpu_interrupt)(CPUState *env);
+} QEMUAccel;
+
+extern QEMUAccel *current_accel;
+extern QEMUAccel noaccel;
+
+static inline void register_qemu_accel(QEMUAccel *accel)
+{
+ current_accel = accel;
+}
+
+static inline void accel_cpu_interrupt(CPUState *env)
+{
+ current_accel->cpu_interrupt(env);
+}
+#endif
diff --git a/exec-all.h b/exec-all.h
index 9ea9b4e..0a84f58 100644
--- a/exec-all.h
+++ b/exec-all.h
@@ -372,7 +372,6 @@ void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr);
void kqemu_modify_page(CPUState *env, ram_addr_t ram_addr);
void kqemu_set_phys_mem(uint64_t start_addr, ram_addr_t size,
ram_addr_t phys_offset);
-void kqemu_cpu_interrupt(CPUState *env);
void kqemu_record_dump(void);
extern uint32_t kqemu_comm_base;
diff --git a/exec.c b/exec.c
index 1cad0be..21253cc 100644
--- a/exec.c
+++ b/exec.c
@@ -43,6 +43,8 @@
#include <qemu.h>
#endif
+#include "accel.h"
+
//#define DEBUG_TB_INVALIDATE
//#define DEBUG_FLUSH
//#define DEBUG_TLB
@@ -1430,6 +1432,7 @@ void cpu_single_step(CPUState *env, int enabled)
tb_flush(env);
}
#endif
+ accel_cpu_interrupt(env);
}
/* enable or disable low levels log */
diff --git a/kqemu.c b/kqemu.c
index 11f8c8a..dc989a3 100644
--- a/kqemu.c
+++ b/kqemu.c
@@ -51,6 +51,7 @@
#include <unistd.h>
#include <fcntl.h>
#include "kqemu.h"
+#include "accel.h"
#ifdef _WIN32
#define KQEMU_DEVICE "\\\\.\\kqemu"
@@ -151,6 +152,8 @@ static void kqemu_update_cpuid(CPUState *env)
accelerated code */
}
+QEMUAccel kqemu_accel;
+
int kqemu_start(void)
{
struct kqemu_init kinit;
@@ -233,6 +236,7 @@ int kqemu_start(void)
}
nb_pages_to_flush = 0;
nb_ram_pages_to_update = 0;
+ register_qemu_accel(&kqemu_accel);
qpi_init();
return 0;
@@ -959,7 +963,7 @@ int kqemu_cpu_exec(CPUState *env)
}
-void kqemu_cpu_interrupt(CPUState *env)
+static void kqemu_cpu_interrupt(CPUState *env)
{
#if defined(_WIN32)
/* cancelling the I/O request causes KQEMU to finish executing the
@@ -1042,4 +1046,9 @@ static void qpi_init(void)
cpu_register_physical_memory(kqemu_comm_base & ~0xfff,
0x1000, qpi_io_memory);
}
+
+QEMUAccel kqemu_accel = {
+ .cpu_interrupt = kqemu_cpu_interrupt,
+};
+
#endif
diff --git a/vl.c b/vl.c
index c0e43ac..adf5b25 100644
--- a/vl.c
+++ b/vl.c
@@ -149,6 +149,8 @@
#define SMBD_COMMAND "/usr/sbin/smbd"
#endif
+#include "accel.h"
+
//#define DEBUG_UNUSED_IOPORT
//#define DEBUG_IOPORT
//#define DEBUG_NET
@@ -1317,11 +1319,6 @@ static void host_alarm_handler(int host_signum)
if (env) {
/* stop the currently executing cpu because a timer occured */
cpu_interrupt(env, CPU_INTERRUPT_EXIT);
-#ifdef USE_KQEMU
- if (env->kqemu_enabled) {
- kqemu_cpu_interrupt(env);
- }
-#endif
}
event_pending = 1;
}
@@ -7560,14 +7557,8 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id)
void qemu_service_io(void)
{
CPUState *env = cpu_single_env;
- if (env) {
+ if (env)
cpu_interrupt(env, CPU_INTERRUPT_EXIT);
-#ifdef USE_KQEMU
- if (env->kqemu_enabled) {
- kqemu_cpu_interrupt(env);
- }
-#endif
- }
}
/***********************************************************/
@@ -8824,6 +8815,8 @@ int main(int argc, char **argv)
}
#endif
+ register_qemu_accel(&noaccel);
+
register_machines();
machine = first_machine;
cpu_model = NULL;
--
1.5.5.1
next prev parent reply other threads:[~2008-10-23 12:22 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-23 14:18 [Qemu-devel] [PATCH 0/32] New shot at accelerators Glauber Costa
2008-10-23 13:35 ` [Qemu-devel] " Jan Kiszka
2008-10-23 14:07 ` Glauber Costa
2008-10-23 14:15 ` Avi Kivity
2008-10-23 13:44 ` Anthony Liguori
2008-10-23 14:18 ` [Qemu-devel] [PATCH 01/32] use anonymous memory for kqemu Glauber Costa
2008-10-23 13:35 ` [Qemu-devel] " Jan Kiszka
2008-10-23 13:48 ` Anthony Liguori
2008-10-23 14:17 ` Jan Kiszka
2008-10-23 14:25 ` Anthony Liguori
2008-10-23 15:08 ` Leonardo Reiter
2008-10-23 15:20 ` Leonardo Reiter
2008-10-24 19:30 ` Andreas Färber
2008-10-24 19:59 ` Ben Taylor
2008-10-25 10:17 ` [Qemu-devel] QEMU on Solaris 10 (was: [PATCH 01/32] use anonymous memory for kqemu.) Andreas Färber
2008-10-25 10:27 ` Andreas Färber
2008-10-25 10:45 ` Blue Swirl
2008-10-24 15:37 ` [Qemu-devel] Re: [PATCH 01/32] use anonymous memory for kqemu Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 02/32] protect exec-all.h frm multiple inclusion Glauber Costa
2008-10-23 13:52 ` [Qemu-devel] " Anthony Liguori
2008-10-23 14:18 ` [Qemu-devel] [PATCH 03/32] change definition of FILE for linux Glauber Costa
2008-10-23 13:52 ` [Qemu-devel] " Anthony Liguori
2008-10-23 14:13 ` Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 04/32] move kqemu_cpu_exec to kqemu.c Glauber Costa
2008-10-23 13:55 ` [Qemu-devel] " Anthony Liguori
2008-10-23 14:21 ` Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 05/32] use more meaningful values for kqemu_cpu_exec Glauber Costa
2008-10-23 13:57 ` [Qemu-devel] " Anthony Liguori
2008-10-23 14:23 ` Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 06/32] split kqemu_init into two Glauber Costa
2008-10-23 13:58 ` [Qemu-devel] " Anthony Liguori
2008-10-23 14:28 ` Glauber Costa
2008-10-23 14:18 ` Glauber Costa [this message]
2008-10-23 14:00 ` [Qemu-devel] Re: [PATCH 07/32] introduce QEMUAccel and fill it with interrupt specific driver Anthony Liguori
2008-10-23 14:18 ` [Qemu-devel] [PATCH 08/32] init env made accel driver Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 09/32] wrap cache flushing functions into accel drivers Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 10/32] turn info kqemu into generic info accelerator Glauber Costa
2008-10-23 14:03 ` [Qemu-devel] " Anthony Liguori
2008-10-23 14:24 ` Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 11/32] separate accelerator part of info profiler Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 12/32] move kqemu externs to kqemu.h Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 13/32] move disabling code to kqemu.c instead of vl.c Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 14/32] set_notdirty goes through accel wrapper Glauber Costa
2008-10-23 14:18 ` [Qemu-devel] [PATCH 15/32] wrap modify_page through accel calls Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 16/32] remove kqemu reference from hw/pc.c Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 17/32] build list of available accelerators Glauber Costa
2008-10-23 13:45 ` [Qemu-devel] " Avi Kivity
2008-10-23 15:09 ` Glauber Costa
2008-10-23 15:15 ` Avi Kivity
2008-10-23 14:19 ` [Qemu-devel] [PATCH 18/32] provide --accel option Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 19/32] add hook to cpu_register_physical_memory Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 20/32] accel_trace_io Glauber Costa
2008-10-23 14:20 ` [Qemu-devel] " Anthony Liguori
2008-10-23 17:26 ` Glauber de Oliveira Costa
2008-10-25 11:10 ` [Qemu-devel] " andrzej zaborowski
2008-10-25 11:14 ` Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 21/32] get_env accel wrapper Glauber Costa
2008-10-23 13:36 ` [Qemu-devel] " Avi Kivity
2008-10-23 14:19 ` [Qemu-devel] [PATCH 22/32] add next_cpu_index Glauber Costa
2008-10-23 14:21 ` [Qemu-devel] " Anthony Liguori
2008-10-23 14:37 ` Glauber Costa
2008-10-23 14:40 ` Jan Kiszka
2008-10-23 14:55 ` Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 23/32] move cpu_get_time_fast to kqemu.c Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 24/32] check wether kqemu is enabled in open code Glauber Costa
2008-10-23 13:38 ` [Qemu-devel] " Jan Kiszka
2008-10-23 14:49 ` Glauber Costa
2008-10-23 14:23 ` Anthony Liguori
2008-10-23 14:31 ` Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 25/32] provide accel hook for cpu_exec Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 26/32] provide two accelerators for kqemu Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 27/32] arch-specific hooks for accelerator Glauber Costa
2008-10-23 13:30 ` [Qemu-devel] " Avi Kivity
2008-10-23 13:35 ` Jan Kiszka
2008-10-23 13:47 ` Avi Kivity
2008-10-23 14:19 ` [Qemu-devel] [PATCH 28/32] iret arch specific accelerator Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 29/32] sysret/sysexit " Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 30/32] lcall/lret arch specific accel hooks Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 31/32] remove kqemu_is_ok tests Glauber Costa
2008-10-23 14:19 ` [Qemu-devel] [PATCH 32/32] clean up kqemu code Glauber Costa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1224771556-11146-8-git-send-email-glommer@redhat.com \
--to=glommer@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=avi@qumranet.com \
--cc=dmitry.baryshkov@siemens.com \
--cc=gcosta@redhat.com \
--cc=jan.kiszka@siemens.com \
--cc=jes@sgi.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).