From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Kt0eo-00088d-Cz for qemu-devel@nongnu.org; Thu, 23 Oct 2008 09:55:22 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Kt0em-00086B-CL for qemu-devel@nongnu.org; Thu, 23 Oct 2008 09:55:21 -0400 Received: from [199.232.76.173] (port=46307 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Kt0em-00085h-0M for qemu-devel@nongnu.org; Thu, 23 Oct 2008 09:55:20 -0400 Received: from e1.ny.us.ibm.com ([32.97.182.141]:43365) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Kt0el-0000MK-HS for qemu-devel@nongnu.org; Thu, 23 Oct 2008 09:55:19 -0400 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e1.ny.us.ibm.com (8.13.8/8.13.8) with ESMTP id m9NDtHK8028600 for ; Thu, 23 Oct 2008 09:55:17 -0400 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id m9NDtHWk030814 for ; Thu, 23 Oct 2008 09:55:17 -0400 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m9NDtHGk025712 for ; Thu, 23 Oct 2008 09:55:17 -0400 Message-ID: <49008242.4080307@us.ibm.com> Date: Thu, 23 Oct 2008 08:55:14 -0500 From: Anthony Liguori MIME-Version: 1.0 References: <1224771556-11146-1-git-send-email-glommer@redhat.com> <1224771556-11146-5-git-send-email-glommer@redhat.com> In-Reply-To: <1224771556-11146-5-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 04/32] move kqemu_cpu_exec to kqemu.c 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, dmitry.baryshkov@siemens.com Glauber Costa wrote: > Only pieces of code that are frame-safe can be moved. > compute_all() is an example of a non-frame-safe calling. > So it has to be done prior to calling kqemu_cpu_exec(). > > Signed-off-by: Glauber Costa > --- > cpu-exec.c | 33 +++++++++++++-------------------- > kqemu.c | 18 +++++++++++++++++- > 2 files changed, 30 insertions(+), 21 deletions(-) > > diff --git a/cpu-exec.c b/cpu-exec.c > index 6d4dcdd..f06df26 100644 > --- a/cpu-exec.c > +++ b/cpu-exec.c > @@ -336,27 +336,20 @@ int cpu_exec(CPUState *env1) > env->exception_index = -1; > } > #ifdef USE_KQEMU > - if (kqemu_is_ok(env) && env->interrupt_request == 0) { > - int ret; > - env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK); > - ret = kqemu_cpu_exec(env); > - /* put eflags in CPU temporary format */ > - CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); > - DF = 1 - (2 * ((env->eflags >> 10) & 1)); > - CC_OP = CC_OP_EFLAGS; > - env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); > - if (ret == 1) { > - /* exception */ > - longjmp(env->jmp_env, 1); > - } else if (ret == 2) { > - /* softmmu execution needed */ > + env->eflags = env->eflags | cc_table[CC_OP].compute_all() | (DF & DF_MASK); > Can't do this unconditionally since you're now recomputing all condition flags even when kqemu is not in use. So unfortunately I'm not sure the code can be cleaned up much more if compute_all() must stay in cpu_exec. Regards, Anthony Liguori > + ret = kqemu_cpu_exec(env); > + env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); > + if (ret == 1) { > + /* exception */ > + longjmp(env->jmp_env, 1); > + } else if (ret == 2) { > + /* softmmu execution needed */ > + } else { > + if (env->interrupt_request != 0) { > + /* hardware interrupt will be executed just after */ > } else { > - if (env->interrupt_request != 0) { > - /* hardware interrupt will be executed just after */ > - } else { > - /* otherwise, we restart */ > - longjmp(env->jmp_env, 1); > - } > + /* otherwise, we restart */ > + longjmp(env->jmp_env, 1); > } > } > #endif > diff --git a/kqemu.c b/kqemu.c > index 4783aa2..39938e0 100644 > --- a/kqemu.c > +++ b/kqemu.c > @@ -30,6 +30,7 @@ > #ifdef HOST_SOLARIS > #include > #endif > +#include "exec.h" > #include > #include > #include > @@ -689,7 +690,7 @@ static inline void kqemu_save_seg(SegmentCache *sc, > sc->base = ksc->base; > } > > -int kqemu_cpu_exec(CPUState *env) > +int kqemu_do_cpu_exec(CPUState *env) > { > struct kqemu_cpu_state kcpu_state, *kenv = &kcpu_state; > int ret, cpl, i; > @@ -939,6 +940,21 @@ int kqemu_cpu_exec(CPUState *env) > return 0; > } > > +int kqemu_cpu_exec(CPUState *env) > +{ > + > + int ret = 2; > + if (kqemu_is_ok(env) && env->interrupt_request == 0) { > + ret = kqemu_do_cpu_exec(env); > + /* put eflags in CPU temporary format */ > + CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C); > + DF = 1 - (2 * ((env->eflags >> 10) & 1)); > + CC_OP = CC_OP_EFLAGS; > + } > + return ret; > +} > + > + > void kqemu_cpu_interrupt(CPUState *env) > { > #if defined(_WIN32) >