[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 18/20] accel_trace_io
From: |
Glauber Costa |
Subject: |
[Qemu-devel] [PATCH 18/20] accel_trace_io |
Date: |
Fri, 27 Jun 2008 17:38:21 -0300 |
kqemu keeps trace of the last io done. Do it through
an accel_wrapper.
Signed-off-by: Glauber Costa <address@hidden>
---
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
- [Qemu-devel] [PATCH 08/20] move disabling code to kqemu.c instead of vl.c, (continued)
- [Qemu-devel] [PATCH 08/20] move disabling code to kqemu.c instead of vl.c, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 09/20] set_notdirty goes through accel wrapper, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 10/20] wrap modify_page through accel calls, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 11/20] remove kqemu reference from hw/pc.c, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 12/20] build list of available accelerators, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 13/20] decorate application name, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 14/20] tsc: kvm will use it, but it is pretty general, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 15/20] shift for masks., Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 16/20] small changes in headers needed to acomodate kvm files as is., Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 17/20] add hook to cpu_register_physical_memory, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 18/20] accel_trace_io,
Glauber Costa <=
- [Qemu-devel] [PATCH 19/20] get_env accel wrapper, Glauber Costa, 2008/06/27
- [Qemu-devel] [PATCH 20/20] add next_cpu_index, Glauber Costa, 2008/06/27