From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KCKk2-0003Dm-Dz for qemu-devel@nongnu.org; Fri, 27 Jun 2008 16:40:22 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KCKk1-0003D2-OX for qemu-devel@nongnu.org; Fri, 27 Jun 2008 16:40:22 -0400 Received: from [199.232.76.173] (port=51164 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KCKk1-0003Cv-Kg for qemu-devel@nongnu.org; Fri, 27 Jun 2008 16:40:21 -0400 Received: from mx1.redhat.com ([66.187.233.31]:55973) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KCKk1-00081w-TV for qemu-devel@nongnu.org; Fri, 27 Jun 2008 16:40:22 -0400 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id m5RKeKlA014645 for ; Fri, 27 Jun 2008 16:40:20 -0400 Received: from pobox-2.corp.redhat.com (pobox-2.corp.redhat.com [10.11.255.15]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m5RKeKZm006076 for ; Fri, 27 Jun 2008 16:40:20 -0400 Received: from localhost.localdomain (vpn-4-80.str.redhat.com [10.32.4.80]) by pobox-2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m5RKdadq004563 for ; Fri, 27 Jun 2008 16:40:19 -0400 From: Glauber Costa Date: Fri, 27 Jun 2008 17:38:21 -0300 Message-Id: <1214599103-13846-19-git-send-email-gcosta@redhat.com> In-Reply-To: <1214599103-13846-18-git-send-email-gcosta@redhat.com> References: <1214599103-13846-1-git-send-email-gcosta@redhat.com> <1214599103-13846-2-git-send-email-gcosta@redhat.com> <1214599103-13846-3-git-send-email-gcosta@redhat.com> <1214599103-13846-4-git-send-email-gcosta@redhat.com> <1214599103-13846-5-git-send-email-gcosta@redhat.com> <1214599103-13846-6-git-send-email-gcosta@redhat.com> <1214599103-13846-7-git-send-email-gcosta@redhat.com> <1214599103-13846-8-git-send-email-gcosta@redhat.com> <1214599103-13846-9-git-send-email-gcosta@redhat.com> <1214599103-13846-10-git-send-email-gcosta@redhat.com> <1214599103-13846-11-git-send-email-gcosta@redhat.com> <1214599103-13846-12-git-send-email-gcosta@redhat.com> <1214599103-13846-13-git-send-email-gcosta@redhat.com> <1214599103-13846-14-git-send-email-gcosta@redhat.com> <1214599103-13846-15-git-send-email-gcosta@redhat.com> <1214599103-13846-16-git-send-email-gcosta@redhat.com> <1214599103-13846-17-git-send-email-gcosta@redhat.com> <1214599103-13846-18-git-send-email-gcosta@redhat.com> Subject: [Qemu-devel] [PATCH 18/20] accel_trace_io 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 kqemu keeps trace of the last io done. Do it through an accel_wrapper. Signed-off-by: Glauber Costa --- accel.h | 16 +++++++++++++++- kqemu.c | 18 ++++++++++++++++++ vl.c | 30 ++++++------------------------ 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/accel.h b/accel.h index a9eee65..52b95e4 100644 --- a/accel.h +++ b/accel.h @@ -12,7 +12,8 @@ typedef struct QEMUAccel { uint64_t (*get_real_ticks)(void); void (*register_physical_memory)(uint64_t start_addr, ram_addr_t size, ram_addr_t phys_offset); - + void (*trace_io)(CPUState *env); + int (*break_loop)(CPUState *env); } QEMUAccel; typedef struct QEMUCont { @@ -135,3 +136,16 @@ static inline void accel_register_phys_mem(uint64_t start_addr, if (current_accel && current_accel->register_physical_memory) current_accel->register_physical_memory(start_addr, size, phys_offset); } + +static inline void accel_trace_io(CPUState *env) +{ + if (current_accel && current_accel->trace_io) + current_accel->trace_io(env); +} + +static inline int accel_break_loop(CPUState *env) +{ + if (current_accel && current_accel->break_loop) + return current_accel->break_loop(env); + return 0; +} diff --git a/kqemu.c b/kqemu.c index e8ce6cf..ad64345 100644 --- a/kqemu.c +++ b/kqemu.c @@ -433,6 +433,22 @@ void kqemu_set_phys_mem(uint64_t start_addr, ram_addr_t size, } } +void kqemu_trace_io(CPUState *env) +{ + if (env) + env->last_io_time = cpu_get_time_fast(); +} + +int kqemu_break_loop(CPUState *env) +{ +#define MIN_CYCLE_BEFORE_SWITCH (100 * 1000) + if (kqemu_is_ok(env) && + (cpu_get_time_fast() - env->last_io_time) >= MIN_CYCLE_BEFORE_SWITCH) { + return 1; + } + return 0; +} + QEMUAccel kqemu_accel = { .name = "KQEMU", .cpu_interrupt = kqemu_cpu_interrupt, @@ -449,6 +465,8 @@ QEMUAccel kqemu_accel = { performance reasons */ .get_real_ticks = cpu_get_real_ticks, .register_physical_memory = kqemu_set_phys_mem, + .trace_io = kqemu_trace_io, + .break_loop = kqemu_break_loop, }; static void __attribute__((constructor)) register_kqemu(void) diff --git a/vl.c b/vl.c index 688fc3a..382af09 100644 --- a/vl.c +++ b/vl.c @@ -399,10 +399,7 @@ void cpu_outb(CPUState *env, int addr, int val) fprintf(logfile, "outb: %04x %02x\n", addr, val); #endif ioport_write_table[0][addr](ioport_opaque[addr], addr, val); -#ifdef USE_KQEMU - if (env) - env->last_io_time = cpu_get_time_fast(); -#endif + accel_trace_io(env); } void cpu_outw(CPUState *env, int addr, int val) @@ -412,10 +409,7 @@ void cpu_outw(CPUState *env, int addr, int val) fprintf(logfile, "outw: %04x %04x\n", addr, val); #endif ioport_write_table[1][addr](ioport_opaque[addr], addr, val); -#ifdef USE_KQEMU - if (env) - env->last_io_time = cpu_get_time_fast(); -#endif + accel_trace_io(env); } void cpu_outl(CPUState *env, int addr, int val) @@ -425,10 +419,7 @@ void cpu_outl(CPUState *env, int addr, int val) fprintf(logfile, "outl: %04x %08x\n", addr, val); #endif ioport_write_table[2][addr](ioport_opaque[addr], addr, val); -#ifdef USE_KQEMU - if (env) - env->last_io_time = cpu_get_time_fast(); -#endif + accel_trace_io(env); } int cpu_inb(CPUState *env, int addr) @@ -439,10 +430,7 @@ int cpu_inb(CPUState *env, int addr) if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inb : %04x %02x\n", addr, val); #endif -#ifdef USE_KQEMU - if (env) - env->last_io_time = cpu_get_time_fast(); -#endif + accel_trace_io(env); return val; } @@ -454,10 +442,7 @@ int cpu_inw(CPUState *env, int addr) if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inw : %04x %04x\n", addr, val); #endif -#ifdef USE_KQEMU - if (env) - env->last_io_time = cpu_get_time_fast(); -#endif + accel_trace_io(env); return val; } @@ -469,10 +454,7 @@ int cpu_inl(CPUState *env, int addr) if (loglevel & CPU_LOG_IOPORT) fprintf(logfile, "inl : %04x %08x\n", addr, val); #endif -#ifdef USE_KQEMU - if (env) - env->last_io_time = cpu_get_time_fast(); -#endif + accel_trace_io(env); return val; } -- 1.5.5.1