From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KszEI-0007Pj-4Q for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:54 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KszED-0007Op-DI for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:53 -0400 Received: from [199.232.76.173] (port=51723 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KszED-0007Ok-94 for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:49 -0400 Received: from mx20.gnu.org ([199.232.41.8]:41091) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KszEB-0006OK-ML for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:49 -0400 Received: from mx2.redhat.com ([66.187.237.31]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KszE0-0006Xn-Aa for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:36 -0400 From: Glauber Costa Date: Thu, 23 Oct 2008 12:19:09 -0200 Message-Id: <1224771556-11146-26-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 25/32] provide accel hook for cpu_exec 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: jan.kiszka@siemens.com, aliguori@us.ibm.com, jes@sgi.com, avi@qumranet.com, dmitry.baryshkov@siemens.com let kqemu_cpu_exec be called through an accelerator hook. Some parts of what was done in cpu_execution cannot go to a separate functions, because of code generator constraints: compute_all() is an example, because the function definition will get no parameters and yet expect env to be at AREG0. This expects a particular frame that is destroyed by function calls. Signed-off-by: Glauber Costa --- accel.c | 7 +++++++ accel.h | 6 ++++++ cpu-exec.c | 5 ++--- exec-all.h | 1 - kqemu.c | 5 +++-- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/accel.c b/accel.c index 28dd2ee..8d635f0 100644 --- a/accel.c +++ b/accel.c @@ -1,4 +1,5 @@ #include "hw/hw.h" +#include "exec-all.h" #include "accel.h" QEMUAccel *current_accel; @@ -19,6 +20,11 @@ CPUState *noaccel_get_env(void) return qemu_mallocz(sizeof(CPUState)); } +int noaccel_cpu_exec(CPUState *env) +{ + return EXEC_EXIT_SOFTMMU; +} + #define accel_nop ((void *)_accel_nop) /* Accelerator wrapper for the no-accel (raw qemu) case */ @@ -40,5 +46,6 @@ QEMUAccel noaccel = { .register_physical_memory = accel_nop, .trace_io = accel_nop, .break_loop = accel_nop, + .cpu_exec = noaccel_cpu_exec, }; diff --git a/accel.h b/accel.h index 0c5ff33..1741f06 100644 --- a/accel.h +++ b/accel.h @@ -22,6 +22,7 @@ typedef struct QEMUAccel { ram_addr_t size, ram_addr_t phys_offset); void (*trace_io)(CPUState *env); int (*break_loop)(CPUState *env); + int (*cpu_exec)(CPUState *env); } QEMUAccel; typedef struct QEMUCont { @@ -161,4 +162,9 @@ static inline int accel_break_loop(CPUState *env) { return current_accel->break_loop(env); } + +static inline int accel_cpu_exec(CPUState *env) +{ + return current_accel->cpu_exec(env); +} #endif diff --git a/cpu-exec.c b/cpu-exec.c index b47cf43..a0b6055 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -336,9 +336,9 @@ int cpu_exec(CPUState *env1) } env->exception_index = -1; } -#ifdef USE_KQEMU + env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK); - ret = kqemu_cpu_exec(env); + ret = accel_cpu_exec(env); env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); if (ret == EXEC_EXIT_INTR) { /* exception */ @@ -353,7 +353,6 @@ int cpu_exec(CPUState *env1) longjmp(env->jmp_env, 1); } } -#endif next_tb = 0; /* force lookup of first TB */ for(;;) { diff --git a/exec-all.h b/exec-all.h index 6c62f06..8228746 100644 --- a/exec-all.h +++ b/exec-all.h @@ -365,7 +365,6 @@ static inline int can_do_io(CPUState *env) #define MSR_QPI_COMMBASE 0xfabe0010 -int kqemu_cpu_exec(CPUState *env); void kqemu_set_phys_mem(uint64_t start_addr, ram_addr_t size, ram_addr_t phys_offset); void kqemu_record_dump(void); diff --git a/kqemu.c b/kqemu.c index f99a4f1..5162d55 100644 --- a/kqemu.c +++ b/kqemu.c @@ -731,7 +731,7 @@ static inline void kqemu_save_seg(SegmentCache *sc, sc->base = ksc->base; } -int kqemu_do_cpu_exec(CPUState *env) +static int kqemu_do_cpu_exec(CPUState *env) { struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state; int ret, cpl, i; @@ -981,7 +981,7 @@ int kqemu_do_cpu_exec(CPUState *env) return EXEC_EXIT_DONE; } -int kqemu_cpu_exec(CPUState *env) +static int kqemu_cpu_exec(CPUState *env) { int ret = EXEC_EXIT_SOFTMMU; @@ -1179,6 +1179,7 @@ QEMUAccel kqemu_accel = { .register_physical_memory = kqemu_set_phys_mem, .trace_io = kqemu_trace_io, .break_loop = kqemu_break_loop, + .cpu_exec = kqemu_cpu_exec, }; #endif -- 1.5.5.1