From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KszDJ-0006tl-Fa for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:22:53 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KszDH-0006tK-W3 for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:22:53 -0400 Received: from [199.232.76.173] (port=51690 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KszDH-0006tH-PB for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:22:51 -0400 Received: from mx2.redhat.com ([66.187.237.31]:54618) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KszDG-0006Ai-Oz for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:22:51 -0400 From: Glauber Costa Date: Thu, 23 Oct 2008 12:18:51 -0200 Message-Id: <1224771556-11146-8-git-send-email-glommer@redhat.com> In-Reply-To: <1224771556-11146-1-git-send-email-glommer@redhat.com> References: <1224771556-11146-1-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 07/32] 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: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com, jan.kiszka@siemens.com, jes@sgi.com, avi@qumranet.com, Glauber Costa , dmitry.baryshkov@siemens.com 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-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 #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 #include #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