From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LAmGj-0002gq-UP for qemu-devel@nongnu.org; Thu, 11 Dec 2008 09:11:58 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LAmGh-0002fm-2E for qemu-devel@nongnu.org; Thu, 11 Dec 2008 09:11:55 -0500 Received: from [199.232.76.173] (port=39027 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LAmGg-0002fe-Ru for qemu-devel@nongnu.org; Thu, 11 Dec 2008 09:11:54 -0500 Received: from mx2.redhat.com ([66.187.237.31]:38211) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LAmGg-00063G-E1 for qemu-devel@nongnu.org; Thu, 11 Dec 2008 09:11:54 -0500 From: Glauber Costa Date: Thu, 11 Dec 2008 09:11:50 -0500 Message-Id: <1229004710-28331-3-git-send-email-glommer@redhat.com> In-Reply-To: <1229004710-28331-2-git-send-email-glommer@redhat.com> References: <1229004710-28331-1-git-send-email-glommer@redhat.com> <1229004710-28331-2-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 2/2] reduce code duplication 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: avi@redhat.com, kvm@vger.kernel.org Code for all versions of notdirty_mem_write are quite alike. Rewrite it as a generator macro. Signed-off-by: Glauber Costa --- exec.c | 66 ++++++++++++++++----------------------------------------------- 1 files changed, 17 insertions(+), 49 deletions(-) diff --git a/exec.c b/exec.c index 35e0b8e..986c3b0 100644 --- a/exec.c +++ b/exec.c @@ -2455,43 +2455,27 @@ static CPUWriteMemoryFunc *unassigned_mem_write[3] = { unassigned_mem_writel, }; -static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr, - uint32_t val) +static inline void store_size(target_phys_addr_t addr, uint32_t val, char siz) { - int dirty_flags; - dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; - if (!(dirty_flags & CODE_DIRTY_FLAG)) { -#if !defined(CONFIG_USER_ONLY) - tb_invalidate_phys_page_fast(ram_addr, 'b'); - dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; -#endif + switch (siz) { + case 'b': stb_p(addr, val); break; + case 'w': stw_p(addr, val); break; + case 'l': stl_p(addr, val); break; } - 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 - 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 - flushed */ - if (dirty_flags == 0xff) - tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr); } -static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr, - uint32_t val) +static inline void notdirty_mem_write_size(void *opaque, target_phys_addr_t ram_addr, + uint32_t val, char siz) { int dirty_flags; dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; if (!(dirty_flags & CODE_DIRTY_FLAG)) { #if !defined(CONFIG_USER_ONLY) - tb_invalidate_phys_page_fast(ram_addr, 'w'); + tb_invalidate_phys_page_fast(ram_addr, siz); dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; #endif } - stw_p(phys_ram_base + ram_addr, val); + store_size((target_phys_addr_t)phys_ram_base + ram_addr, val, siz); #ifdef USE_KQEMU if (cpu_single_env->kqemu_enabled && (dirty_flags & KQEMU_MODIFY_PAGE_MASK) != KQEMU_MODIFY_PAGE_MASK) @@ -2505,30 +2489,14 @@ static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr, tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr); } -static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr, - uint32_t val) -{ - int dirty_flags; - dirty_flags = phys_ram_dirty[ram_addr >> TARGET_PAGE_BITS]; - if (!(dirty_flags & CODE_DIRTY_FLAG)) { -#if !defined(CONFIG_USER_ONLY) - tb_invalidate_phys_page_fast(ram_addr, 'l'); - 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 - 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 - flushed */ - if (dirty_flags == 0xff) - tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr); -} +#define gen_notdirty(s) static void notdirty_mem_write##s(void *opaque, \ + target_phys_addr_t ram_addr, uint32_t val)\ +{ notdirty_mem_write_size(opaque, ram_addr, val, #s[0]); } + +gen_notdirty(b) +gen_notdirty(w) +gen_notdirty(l) +#undef gen_notdirty static CPUReadMemoryFunc *error_mem_read[3] = { NULL, /* never used */ -- 1.5.6.5