From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KqCrA-0001dx-R2 for qemu-devel@nongnu.org; Wed, 15 Oct 2008 16:20:32 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KqCr9-0001cu-2K for qemu-devel@nongnu.org; Wed, 15 Oct 2008 16:20:32 -0400 Received: from [199.232.76.173] (port=51387 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KqCr8-0001cq-KG for qemu-devel@nongnu.org; Wed, 15 Oct 2008 16:20:30 -0400 Received: from e33.co.us.ibm.com ([32.97.110.151]:37206) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KqCr7-0005Bn-OH for qemu-devel@nongnu.org; Wed, 15 Oct 2008 16:20:30 -0400 Received: from d03relay02.boulder.ibm.com (d03relay02.boulder.ibm.com [9.17.195.227]) by e33.co.us.ibm.com (8.13.8/8.13.8) with ESMTP id m9FKKPsZ019256 for ; Wed, 15 Oct 2008 16:20:25 -0400 Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168]) by d03relay02.boulder.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id m9FKKGOs210588 for ; Wed, 15 Oct 2008 14:20:20 -0600 Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1]) by d03av02.boulder.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m9FKJhWJ012614 for ; Wed, 15 Oct 2008 14:19:43 -0600 Message-ID: <48F65079.1040607@us.ibm.com> Date: Wed, 15 Oct 2008 15:20:09 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1224107718-19128-1-git-send-email-glommer@redhat.com> <1224107718-19128-3-git-send-email-glommer@redhat.com> In-Reply-To: <1224107718-19128-3-git-send-email-glommer@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH 02/21] introduce QEMUAccel and fill it with interrupt specific driver Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Glauber Costa Cc: jan.kiszka@siemens.com, jes@sgi.com, qemu-devel@nongnu.org, avi@qumranet.com, Glauber Costa , dmitry.baryshkov@siemens.com Glauber Costa wrote: > From: Glauber Costa > > 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 > Signed-off-by: Dmitry Baryshkov > --- > Makefile.target | 2 +- > accel.c | 17 +++++++++++++++++ > accel.h | 20 ++++++++++++++++++++ > exec.c | 3 +++ > kqemu.c | 9 +++++++++ > vl.c | 17 +++++------------ > 6 files changed, 55 insertions(+), 13 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.c b/exec.c > index 1cad0be..21253cc 100644 > --- a/exec.c > +++ b/exec.c > @@ -43,6 +43,8 @@ > #include > #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 9b52237..87c06cd 100644 > --- a/kqemu.c > +++ b/kqemu.c > @@ -50,6 +50,7 @@ > #include > #include > #include "kqemu.h" > +#include "accel.h" > > #ifdef _WIN32 > #define KQEMU_DEVICE "\\\\.\\kqemu" > @@ -150,6 +151,8 @@ static void kqemu_update_cpuid(CPUState *env) > accelerated code */ > } > > +QEMUAccel kqemu_accel; > + > int kqemu_start(void) > { > struct kqemu_init kinit; > @@ -232,6 +235,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; > @@ -243,6 +247,11 @@ void kqemu_init_env(CPUState *env) > env->kqemu_enabled = kqemu_allowed; > } > > +QEMUAccel kqemu_accel = { > + .cpu_interrupt = kqemu_cpu_interrupt, > +}; > The hook kqemu uses is for CPU_INTERRUPT_EXIT which is basically intended to allow IO to run. The fact that it's done via cpu_interrupt is somewhat hackish. I think a better hook would be something like run_io_handlers. Since this is called from signal handlers, we have to be clear that this code needs to be signal safe. This is compared to say a generic cpu_interrupt hook which doesn't necessarily need to be signal safe. Regards, Anthony Liguori