--- 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 <sys/ucontext.h> #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 ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Don't miss this year's exciting event. There's still time to save $100. Use priority code J8TL2D2. http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel