@@ -856,7 +856,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;
@@ -885,32 +885,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,
@@ -922,7 +924,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;
}
@@ -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 {
@@ -2796,10 +2796,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;
@@ -2848,10 +2848,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;
@@ -3019,11 +3019,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);
}
@@ -3039,11 +3039,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);
}
@@ -3059,11 +3059,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);
}
@@ -3480,7 +3480,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 */
@@ -3694,7 +3694,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;
@@ -3855,7 +3855,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));
}
}
}
@@ -3924,7 +3924,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));
}
}
}
@@ -3967,7 +3967,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));
}
}
}