From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JrzTm-0007Z3-Lj for qemu-devel@nongnu.org; Fri, 02 May 2008 13:55:30 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JrzTl-0007YI-IV for qemu-devel@nongnu.org; Fri, 02 May 2008 13:55:29 -0400 Received: from [199.232.76.173] (port=52467 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JrzTl-0007YE-6v for qemu-devel@nongnu.org; Fri, 02 May 2008 13:55:29 -0400 Received: from mx1.redhat.com ([66.187.233.31]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JrzTk-00072a-PQ for qemu-devel@nongnu.org; Fri, 02 May 2008 13:55:28 -0400 From: Glauber Costa Date: Fri, 2 May 2008 14:49:11 -0300 Message-Id: <12097505681610-git-send-email-gcosta@redhat.com> In-Reply-To: <1209750562292-git-send-email-gcosta@redhat.com> References: <12097505533742-git-send-email-gcosta@redhat.com> <1209750562292-git-send-email-gcosta@redhat.com> Subject: [Qemu-devel] [PATCH 2/4] [PATCH] exec interrupt made abstract by accel_yyy() 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: kvm-devel@lists.sourceforge.net, mtosatti@redhat.com --- cpu-exec.c | 29 ++++++++++++++++++----------- exec-all.h | 10 ++++++++++ kqemu.c | 3 +++ 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/cpu-exec.c b/cpu-exec.c index 3246264..79da619 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -35,6 +35,22 @@ #include #endif +/* FIXME: This does not belong here */ +int kqemu_exec_interrupt(CPUState *env) +{ + int ret = 0; + if (kqemu_is_ok(env) && env->interrupt_request == 0) { + 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); + } + return ret; +} + int tb_invalidated_flag; //#define DEBUG_EXEC @@ -388,16 +404,8 @@ 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 (accel_exec_interrupt(env, &ret)) { if (ret == 1) { /* exception */ longjmp(env->jmp_env, 1); @@ -412,7 +420,6 @@ int cpu_exec(CPUState *env1) } } } -#endif T0 = 0; /* force lookup of first TB */ for(;;) { diff --git a/exec-all.h b/exec-all.h index 5162307..621e1ca 100644 --- a/exec-all.h +++ b/exec-all.h @@ -576,6 +576,7 @@ static inline target_ulong get_phys_addr_code(CPUState *env, target_ulong addr) typedef struct QEMUAccel { void (*cpu_interrupt)(CPUState *env); + int (*exec_interrupt)(CPUState *env); } QEMUAccel; extern QEMUAccel *current_accel; @@ -591,6 +592,15 @@ static inline void accel_cpu_interrupt(CPUState *env) current_accel->cpu_interrupt(env); } +static inline int accel_exec_interrupt(CPUState *env, int *ret) +{ + if (current_accel && current_accel->exec_interrupt) { + *ret = current_accel->exec_interrupt(env); + return 1; + } + return 0; +} + #ifdef USE_KQEMU #define KQEMU_MODIFY_PAGE_MASK (0xff & ~(VGA_DIRTY_FLAG | CODE_DIRTY_FLAG)) diff --git a/kqemu.c b/kqemu.c index c46698c..08622ad 100644 --- a/kqemu.c +++ b/kqemu.c @@ -167,8 +167,11 @@ void kqemu_cpu_interrupt(CPUState *env) #endif } +extern int kqemu_exec_interrupt(CPUState *env); + QEMUAccel kqemu_accel = { .cpu_interrupt = kqemu_cpu_interrupt, + .exec_interrupt = kqemu_exec_interrupt, }; int kqemu_init(CPUState *env) -- 1.5.0.6