From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KszDf-000786-It for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:15 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KszDd-00075m-EA for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:15 -0400 Received: from [199.232.76.173] (port=51699 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KszDc-00075I-TU for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:12 -0400 Received: from mx2.redhat.com ([66.187.237.31]:54645) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KszDb-0006Fa-8l for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:12 -0400 From: Glauber Costa Date: Thu, 23 Oct 2008 12:18:59 -0200 Message-Id: <1224771556-11146-16-git-send-email-glommer@redhat.com> In-Reply-To: <1224771556-11146-1-git-send-email-glommer@redhat.com> References: <1224771556-11146-1-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 15/32] wrap modify_page through accel calls 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: aliguori@us.ibm.com, jan.kiszka@siemens.com, jes@sgi.com, avi@qumranet.com, Glauber Costa , dmitry.baryshkov@siemens.com From: Glauber Costa Yet another accel field: modify_page Signed-off-by: Glauber Costa --- accel.c | 1 + accel.h | 7 +++++++ exec-all.h | 1 - exec.c | 27 ++++++++++++--------------- kqemu.c | 5 ++++- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/accel.c b/accel.c index 58ac053..d615912 100644 --- a/accel.c +++ b/accel.c @@ -24,5 +24,6 @@ QEMUAccel noaccel = { .info = noaccel_info, .profile = accel_nop, .set_notdirty = accel_nop, + .modify_page = accel_nop, }; diff --git a/accel.h b/accel.h index 76e1f3b..e232f87 100644 --- a/accel.h +++ b/accel.h @@ -11,6 +11,7 @@ typedef struct QEMUAccel { int (*info)(CPUState *env, char *buf); int (*profile)(CPUState *env, char *buf); void (*set_notdirty)(ram_addr_t addr); + void (*modify_page)(ram_addr_t addr, int dirty_flags); } QEMUAccel; extern QEMUAccel *current_accel; @@ -55,4 +56,10 @@ static inline void accel_set_notdirty(target_ulong addr) { current_accel->set_notdirty(addr); } + +static inline void accel_modify_page(target_ulong addr, int dirty_flags) +{ + current_accel->modify_page(addr, dirty_flags); +} + #endif diff --git a/exec-all.h b/exec-all.h index cb2e7c6..6c62f06 100644 --- a/exec-all.h +++ b/exec-all.h @@ -366,7 +366,6 @@ static inline int can_do_io(CPUState *env) #define MSR_QPI_COMMBASE 0xfabe0010 int kqemu_cpu_exec(CPUState *env); -void kqemu_modify_page(CPUState *env, ram_addr_t ram_addr); void kqemu_set_phys_mem(uint64_t start_addr, ram_addr_t size, ram_addr_t phys_offset); void kqemu_record_dump(void); diff --git a/exec.c b/exec.c index fa62167..089a91e 100644 --- a/exec.c +++ b/exec.c @@ -2378,12 +2378,11 @@ static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr, dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; #endif } + stb_p(phys_ram_base + ram_addr, val); -#ifdef USE_KQEMU - if (cpu_single_env->kqemu_enabled && - (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK) - kqemu_modify_page(cpu_single_env, ram_addr); -#endif + + accel_modify_page(ram_addr, dirty_flags); + dirty_flags |= (0xff & ~CODE_DIRTY_FLAG); phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags; /* we remove the notdirty callback only if the code has been @@ -2403,12 +2402,11 @@ static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr, dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; #endif } + stw_p(phys_ram_base + ram_addr, val); -#ifdef USE_KQEMU - if (cpu_single_env->kqemu_enabled && - (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK) - kqemu_modify_page(cpu_single_env, ram_addr); -#endif + + accel_modify_page(ram_addr, dirty_flags); + dirty_flags |= (0xff & ~CODE_DIRTY_FLAG); phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags; /* we remove the notdirty callback only if the code has been @@ -2428,12 +2426,11 @@ static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr, dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; #endif } + stl_p(phys_ram_base + ram_addr, val); -#ifdef USE_KQEMU - if (cpu_single_env->kqemu_enabled && - (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK) - kqemu_modify_page(cpu_single_env, ram_addr); -#endif + + accel_modify_page(ram_addr, dirty_flags); + dirty_flags |= (0xff & ~CODE_DIRTY_FLAG); phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS] = dirty_flags; /* we remove the notdirty callback only if the code has been diff --git a/kqemu.c b/kqemu.c index 98ec1a0..5777afd 100644 --- a/kqemu.c +++ b/kqemu.c @@ -304,7 +304,7 @@ static void kqemu_reset_modified_ram_pages(void) nb_modified_ram_pages = 0; } -void kqemu_modify_page(CPUState *env, ram_addr_t ram_addr) +static void kqemu_modify_page(ram_addr_t ram_addr, int dirty_flags) { unsigned long page_index; int ret; @@ -312,6 +312,8 @@ void kqemu_modify_page(CPUState *env, ram_addr_t ram_addr) DWORD temp; #endif + if ((dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK) + return; page_index = ram_addr >> TARGET_PAGE_BITS; if (!modified_ram_pages_table[page_index]) { #if 0 @@ -1114,6 +1116,7 @@ QEMUAccel kqemu_accel = { .info = kqemu_info, .profile = kqemu_profile, .set_notdirty = kqemu_set_notdirty, + .modify_page = kqemu_modify_page, }; #endif -- 1.5.5.1