From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JweAK-0005dq-0Q for qemu-devel@nongnu.org; Thu, 15 May 2008 10:10:40 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JweAJ-0005dM-8K for qemu-devel@nongnu.org; Thu, 15 May 2008 10:10:39 -0400 Received: from [199.232.76.173] (port=37567 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JweAJ-0005dI-5q for qemu-devel@nongnu.org; Thu, 15 May 2008 10:10:39 -0400 Received: from mx1.redhat.com ([66.187.233.31]:36001) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JweAI-0003Fo-NN for qemu-devel@nongnu.org; Thu, 15 May 2008 10:10:38 -0400 From: Glauber Costa Date: Thu, 15 May 2008 11:09:25 -0300 Message-Id: <121086059420-git-send-email-gcosta@redhat.com> In-Reply-To: <12108605912878-git-send-email-gcosta@redhat.com> References: <12108605731805-git-send-email-gcosta@redhat.com> <12108605813076-git-send-email-gcosta@redhat.com> <12108605843020-git-send-email-gcosta@redhat.com> <12108605883967-git-send-email-gcosta@redhat.com> <12108605912878-git-send-email-gcosta@redhat.com> Subject: [Qemu-devel] [PATCH 05/13] [PATCH] wrap cache flushing functions into accel drivers 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 --- exec-all.h | 16 ++++++++++++++-- exec.c | 12 ++---------- kqemu.c | 15 +++++++++------ 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/exec-all.h b/exec-all.h index 9e211dc..bfc6576 100644 --- a/exec-all.h +++ b/exec-all.h @@ -581,6 +581,8 @@ static inline target_ulong get_phys_addr_code(CPUState *env1, target_ulong addr) typedef struct QEMUAccel { void (*cpu_interrupt)(CPUState *env); void (*init_env)(CPUState *env); + void (*flush_cache)(CPUState *env, int global); + void (*flush_page)(CPUState *env, target_ulong addr); } QEMUAccel; extern QEMUAccel *current_accel; @@ -602,12 +604,22 @@ static inline void accel_init_env(CPUState *env) current_accel->init_env(env); } +static inline void accel_flush_cache(CPUState *env, int global) +{ + if (current_accel && current_accel->flush_cache) + current_accel->flush_cache(env, global); +} + +static inline void accel_flush_page(CPUState *env, target_ulong addr) +{ + if (current_accel && current_accel->flush_page) + current_accel->flush_page(env, addr); +} + #ifdef USE_KQEMU #define KQEMU_MODIFY_PAGE_MASK (0xff & ~(VGA_DIRTY_FLAG | CODE_DIRTY_FLAG)) int kqemu_cpu_exec(CPUState *env); -void kqemu_flush_page(CPUState *env, target_ulong addr); -void kqemu_flush(CPUState *env, int global); void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr); void kqemu_modify_page(CPUState *env, ram_addr_t ram_addr); void kqemu_record_dump(void); diff --git a/exec.c b/exec.c index 73360d3..5b093a3 100644 --- a/exec.c +++ b/exec.c @@ -1438,11 +1438,7 @@ void tlb_flush(CPUState *env, int flush_global) #if !defined(CONFIG_SOFTMMU) munmap((void *)MMAP_AREA_START, MMAP_AREA_END - MMAP_AREA_START); #endif -#ifdef USE_KQEMU - if (env->kqemu_enabled) { - kqemu_flush(env, flush_global); - } -#endif + accel_flush_cache(env, flush_global); tlb_flush_count++; } @@ -1488,11 +1484,7 @@ void tlb_flush_page(CPUState *env, target_ulong addr) if (addr < MMAP_AREA_END) munmap((void *)addr, TARGET_PAGE_SIZE); #endif -#ifdef USE_KQEMU - if (env->kqemu_enabled) { - kqemu_flush_page(env, addr); - } -#endif + accel_flush_page(env, addr); } /* update the TLBs so that writes to code in the virtual page 'addr' diff --git a/kqemu.c b/kqemu.c index e0422de..524c74d 100644 --- a/kqemu.c +++ b/kqemu.c @@ -261,12 +261,6 @@ void kqemu_cpu_interrupt(CPUState *env) #endif } -QEMUAccel kqemu_accel = { - .cpu_interrupt = kqemu_cpu_interrupt, - .init_env = kqemu_init_env, -}; - - void kqemu_flush_page(CPUState *env, target_ulong addr) { #if defined(DEBUG) @@ -290,6 +284,15 @@ void kqemu_flush(CPUState *env, int global) nb_pages_to_flush = KQEMU_FLUSH_ALL; } +QEMUAccel kqemu_accel = { + .cpu_interrupt = kqemu_cpu_interrupt, + .init_env = kqemu_init_env, + .flush_cache = kqemu_flush, + .flush_page = kqemu_flush_page, +}; + + + void kqemu_set_notdirty(CPUState *env, ram_addr_t ram_addr) { #ifdef DEBUG -- 1.5.5