From patchwork Fri Jun 4 21:45:39 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cam Macdonell X-Patchwork-Id: 54723 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) by ozlabs.org (Postfix) with ESMTP id 2A0F1B7D64 for ; Sat, 5 Jun 2010 07:58:23 +1000 (EST) Received: from localhost ([127.0.0.1]:53196 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OKeoq-0006Zl-Cn for incoming@patchwork.ozlabs.org; Fri, 04 Jun 2010 17:52:48 -0400 Received: from [140.186.70.92] (port=49406 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OKeiZ-0003vW-35 for qemu-devel@nongnu.org; Fri, 04 Jun 2010 17:46:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OKeiS-0000TJ-Vk for qemu-devel@nongnu.org; Fri, 04 Jun 2010 17:46:18 -0400 Received: from fleet.cs.ualberta.ca ([129.128.22.22]:52445) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OKeiS-0000Nn-MC for qemu-devel@nongnu.org; Fri, 04 Jun 2010 17:46:12 -0400 Received: from localhost.localdomain (st-brides.cs.ualberta.ca [129.128.23.21]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-auth.cs.ualberta.ca (Postfix) with ESMTP id 62A7728040; Fri, 4 Jun 2010 15:46:00 -0600 (MDT) From: Cam Macdonell To: qemu-devel@nongnu.org Date: Fri, 4 Jun 2010 15:45:39 -0600 Message-Id: <1275687942-12312-4-git-send-email-cam@cs.ualberta.ca> X-Mailer: git-send-email 1.6.3.2.198.g6096d In-Reply-To: <1275687942-12312-3-git-send-email-cam@cs.ualberta.ca> References: <1275687942-12312-1-git-send-email-cam@cs.ualberta.ca> <1275687942-12312-2-git-send-email-cam@cs.ualberta.ca> <1275687942-12312-3-git-send-email-cam@cs.ualberta.ca> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) Cc: Cam Macdonell , kvm@vger.kernel.org Subject: [Qemu-devel] [PATCH v6 3/6] Change phys_ram_dirty to phys_ram_status X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org phys_ram_dirty are 8-bit values storing 3 dirty bits. Change to more generic phys_ram_flags and use lower 4-bits for dirty status and leave upper 4 for other uses. The names of functions may need to be changed as well, such as c_p_m_get_dirty(). --- cpu-all.h | 16 +++++++++------- exec.c | 36 ++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/cpu-all.h b/cpu-all.h index 47a5722..9080cc7 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -858,7 +858,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr); /* memory API */ extern int phys_ram_fd; -extern uint8_t *phys_ram_dirty; +extern uint8_t *phys_ram_flags; extern ram_addr_t ram_size; extern ram_addr_t last_ram_offset; @@ -887,32 +887,34 @@ extern int mem_prealloc; #define CODE_DIRTY_FLAG 0x02 #define MIGRATION_DIRTY_FLAG 0x08 +#define DIRTY_ALL_FLAG (VGA_DIRTY_FLAG | CODE_DIRTY_FLAG | MIGRATION_DIRTY_FLAG) + /* read dirty bit (return 0 or 1) */ static inline int cpu_physical_memory_is_dirty(ram_addr_t addr) { - return phys_ram_dirty[addr >> TARGET_PAGE_BITS] == 0xff; + return phys_ram_flags[addr >> TARGET_PAGE_BITS] == DIRTY_ALL_FLAG; } static inline int cpu_physical_memory_get_dirty_flags(ram_addr_t addr) { - return phys_ram_dirty[addr >> TARGET_PAGE_BITS]; + return phys_ram_flags[addr >> TARGET_PAGE_BITS]; } static inline int cpu_physical_memory_get_dirty(ram_addr_t addr, int dirty_flags) { - return phys_ram_dirty[addr >> TARGET_PAGE_BITS] & dirty_flags; + return phys_ram_flags[addr >> TARGET_PAGE_BITS] & dirty_flags; } static inline void cpu_physical_memory_set_dirty(ram_addr_t addr) { - phys_ram_dirty[addr >> TARGET_PAGE_BITS] = 0xff; + phys_ram_flags[addr >> TARGET_PAGE_BITS] = DIRTY_ALL_FLAG; } static inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr, int dirty_flags) { - return phys_ram_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flags; + return phys_ram_flags[addr >> TARGET_PAGE_BITS] |= dirty_flags; } static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start, @@ -924,7 +926,7 @@ static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start, len = length >> TARGET_PAGE_BITS; mask = ~dirty_flags; - p = phys_ram_dirty + (start >> TARGET_PAGE_BITS); + p = phys_ram_flags + (start >> TARGET_PAGE_BITS); for (i = 0; i < len; i++) { p[i] &= mask; } diff --git a/exec.c b/exec.c index 7b0e1c5..39c18a7 100644 --- a/exec.c +++ b/exec.c @@ -116,7 +116,7 @@ uint8_t *code_gen_ptr; #if !defined(CONFIG_USER_ONLY) int phys_ram_fd; -uint8_t *phys_ram_dirty; +uint8_t *phys_ram_flags; static int in_migration; typedef struct RAMBlock { @@ -2801,10 +2801,10 @@ ram_addr_t qemu_ram_map(ram_addr_t size, void *host) new_block->next = ram_blocks; ram_blocks = new_block; - phys_ram_dirty = qemu_realloc(phys_ram_dirty, + phys_ram_flags = qemu_realloc(phys_ram_flags, (last_ram_offset + size) >> TARGET_PAGE_BITS); - memset(phys_ram_dirty + (last_ram_offset >> TARGET_PAGE_BITS), - 0xff, size >> TARGET_PAGE_BITS); + memset(phys_ram_flags + (last_ram_offset >> TARGET_PAGE_BITS), + DIRTY_ALL_FLAG, size >> TARGET_PAGE_BITS); last_ram_offset += size; @@ -2853,10 +2853,10 @@ ram_addr_t qemu_ram_alloc(ram_addr_t size) new_block->next = ram_blocks; ram_blocks = new_block; - phys_ram_dirty = qemu_realloc(phys_ram_dirty, + phys_ram_flags = qemu_realloc(phys_ram_flags, (last_ram_offset + size) >> TARGET_PAGE_BITS); - memset(phys_ram_dirty + (last_ram_offset >> TARGET_PAGE_BITS), - 0xff, size >> TARGET_PAGE_BITS); + memset(phys_ram_flags + (last_ram_offset >> TARGET_PAGE_BITS), + DIRTY_ALL_FLAG, size >> TARGET_PAGE_BITS); last_ram_offset += size; @@ -3024,11 +3024,11 @@ static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr, #endif } stb_p(qemu_get_ram_ptr(ram_addr), val); - dirty_flags |= (0xff & ~CODE_DIRTY_FLAG); + dirty_flags |= (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG); cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags); /* we remove the notdirty callback only if the code has been flushed */ - if (dirty_flags == 0xff) + if (dirty_flags == DIRTY_ALL_FLAG) tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr); } @@ -3044,11 +3044,11 @@ static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr, #endif } stw_p(qemu_get_ram_ptr(ram_addr), val); - dirty_flags |= (0xff & ~CODE_DIRTY_FLAG); + dirty_flags |= (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG); cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags); /* we remove the notdirty callback only if the code has been flushed */ - if (dirty_flags == 0xff) + if (dirty_flags == DIRTY_ALL_FLAG) tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr); } @@ -3064,11 +3064,11 @@ static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr, #endif } stl_p(qemu_get_ram_ptr(ram_addr), val); - dirty_flags |= (0xff & ~CODE_DIRTY_FLAG); + dirty_flags |= (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG); cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags); /* we remove the notdirty callback only if the code has been flushed */ - if (dirty_flags == 0xff) + if (dirty_flags == DIRTY_ALL_FLAG) tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr); } @@ -3485,7 +3485,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, tb_invalidate_phys_page_range(addr1, addr1 + l, 0); /* set dirty bit */ cpu_physical_memory_set_dirty_flags( - addr1, (0xff & ~CODE_DIRTY_FLAG)); + addr1, (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG)); } /* qemu doesn't execute guest code directly, but kvm does therefore flush instruction caches */ @@ -3699,7 +3699,7 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len, tb_invalidate_phys_page_range(addr1, addr1 + l, 0); /* set dirty bit */ cpu_physical_memory_set_dirty_flags( - addr1, (0xff & ~CODE_DIRTY_FLAG)); + addr1, (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG)); } addr1 += l; access_len -= l; @@ -3860,7 +3860,7 @@ void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val) tb_invalidate_phys_page_range(addr1, addr1 + 4, 0); /* set dirty bit */ cpu_physical_memory_set_dirty_flags( - addr1, (0xff & ~CODE_DIRTY_FLAG)); + addr1, (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG)); } } } @@ -3929,7 +3929,7 @@ void stl_phys(target_phys_addr_t addr, uint32_t val) tb_invalidate_phys_page_range(addr1, addr1 + 4, 0); /* set dirty bit */ cpu_physical_memory_set_dirty_flags(addr1, - (0xff & ~CODE_DIRTY_FLAG)); + (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG)); } } } @@ -3972,7 +3972,7 @@ void stw_phys(target_phys_addr_t addr, uint32_t val) tb_invalidate_phys_page_range(addr1, addr1 + 2, 0); /* set dirty bit */ cpu_physical_memory_set_dirty_flags(addr1, - (0xff & ~CODE_DIRTY_FLAG)); + (DIRTY_ALL_FLAG & ~CODE_DIRTY_FLAG)); } } }