diff --git a/qemu/aarch64.h b/qemu/aarch64.h index 4e805205..9850e831 100644 --- a/qemu/aarch64.h +++ b/qemu/aarch64.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_aarch64 #define cpu_outl cpu_outl_aarch64 #define cpu_outw cpu_outw_aarch64 +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_aarch64 #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_aarch64 -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_aarch64 #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_aarch64 #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_aarch64 #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_aarch64 diff --git a/qemu/aarch64eb.h b/qemu/aarch64eb.h index 5f341c69..63a1b4d5 100644 --- a/qemu/aarch64eb.h +++ b/qemu/aarch64eb.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_aarch64eb #define cpu_outl cpu_outl_aarch64eb #define cpu_outw cpu_outw_aarch64eb +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_aarch64eb #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_aarch64eb -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_aarch64eb #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_aarch64eb #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_aarch64eb #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_aarch64eb diff --git a/qemu/arm.h b/qemu/arm.h index 1088b17f..44f0b212 100644 --- a/qemu/arm.h +++ b/qemu/arm.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_arm #define cpu_outl cpu_outl_arm #define cpu_outw cpu_outw_arm +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_arm #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_arm -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_arm #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_arm #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_arm #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_arm diff --git a/qemu/armeb.h b/qemu/armeb.h index 9df9e212..d242a51f 100644 --- a/qemu/armeb.h +++ b/qemu/armeb.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_armeb #define cpu_outl cpu_outl_armeb #define cpu_outw cpu_outw_armeb +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_armeb #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_armeb -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_armeb #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_armeb #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_armeb #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_armeb diff --git a/qemu/exec.c b/qemu/exec.c index 6fbeb8b0..f9b47406 100644 --- a/qemu/exec.c +++ b/qemu/exec.c @@ -1032,7 +1032,9 @@ static ram_addr_t ram_block_add(struct uc_struct *uc, RAMBlock *new_block, Error old_ram_size, new_ram_size); } } - cpu_physical_memory_set_dirty_range(uc, new_block->offset, new_block->length); + cpu_physical_memory_set_dirty_range(uc, new_block->offset, + new_block->length, + DIRTY_CLIENTS_ALL); qemu_ram_setup_dump(new_block->host, new_block->length); //qemu_madvise(new_block->host, new_block->length, QEMU_MADV_HUGEPAGE); diff --git a/qemu/header_gen.py b/qemu/header_gen.py index 9ecd65c1..a06d06a8 100644 --- a/qemu/header_gen.py +++ b/qemu/header_gen.py @@ -290,8 +290,8 @@ symbols = ( 'cpu_outb', 'cpu_outl', 'cpu_outw', + 'cpu_physical_memory_all_dirty', 'cpu_physical_memory_clear_dirty_range', - 'cpu_physical_memory_get_clean', 'cpu_physical_memory_get_dirty', 'cpu_physical_memory_get_dirty_flag', 'cpu_physical_memory_is_clean', diff --git a/qemu/include/exec/ram_addr.h b/qemu/include/exec/ram_addr.h index a4c9007c..551bf702 100644 --- a/qemu/include/exec/ram_addr.h +++ b/qemu/include/exec/ram_addr.h @@ -32,6 +32,9 @@ void *qemu_get_ram_ptr(struct uc_struct *uc, ram_addr_t addr); void qemu_ram_free(struct uc_struct *c, ram_addr_t addr); void qemu_ram_free_from_ptr(struct uc_struct *uc, ram_addr_t addr); +#define DIRTY_CLIENTS_ALL ((1 << DIRTY_MEMORY_NUM) - 1) +#define DIRTY_CLIENTS_NOCODE (DIRTY_CLIENTS_ALL & ~(1 << DIRTY_MEMORY_CODE)) + static inline bool cpu_physical_memory_get_dirty(struct uc_struct *uc, ram_addr_t start, ram_addr_t length, unsigned client) @@ -47,7 +50,7 @@ static inline bool cpu_physical_memory_get_dirty(struct uc_struct *uc, ram_addr_ return next < end; } -static inline bool cpu_physical_memory_get_clean(struct uc_struct *uc, ram_addr_t start, +static inline bool cpu_physical_memory_all_dirty(struct uc_struct *uc, ram_addr_t start, ram_addr_t length, unsigned client) { @@ -59,7 +62,7 @@ static inline bool cpu_physical_memory_get_clean(struct uc_struct *uc, ram_addr_ page = start >> TARGET_PAGE_BITS; next = find_next_zero_bit(uc->ram_list.dirty_memory[client], end, page); - return next < end; + return next >= end; } static inline bool cpu_physical_memory_get_dirty_flag(struct uc_struct *uc, ram_addr_t addr, @@ -76,7 +79,7 @@ static inline bool cpu_physical_memory_is_clean(struct uc_struct *uc, ram_addr_t static inline bool cpu_physical_memory_range_includes_clean(struct uc_struct *uc, ram_addr_t start, ram_addr_t length) { - return cpu_physical_memory_get_clean(uc, start, length, DIRTY_MEMORY_CODE); + return !cpu_physical_memory_all_dirty(uc, start, length, DIRTY_MEMORY_CODE); } static inline void cpu_physical_memory_set_dirty_flag(struct uc_struct *uc, ram_addr_t addr, @@ -87,13 +90,17 @@ static inline void cpu_physical_memory_set_dirty_flag(struct uc_struct *uc, ram_ } static inline void cpu_physical_memory_set_dirty_range(struct uc_struct *uc, ram_addr_t start, - ram_addr_t length) + ram_addr_t length, + uint8_t mask) { unsigned long end, page; end = TARGET_PAGE_ALIGN(start + length) >> TARGET_PAGE_BITS; page = start >> TARGET_PAGE_BITS; - bitmap_set(uc->ram_list.dirty_memory[DIRTY_MEMORY_CODE], page, end - page); + if (unlikely(mask & (1 << DIRTY_MEMORY_CODE))) { + bitmap_set(uc->ram_list.dirty_memory[DIRTY_MEMORY_CODE], page, end - page); + } + } #if !defined(_WIN32) @@ -136,7 +143,8 @@ static inline void cpu_physical_memory_set_dirty_lebitmap(struct uc_struct *uc, addr = page_number * TARGET_PAGE_SIZE; ram_addr = start + addr; cpu_physical_memory_set_dirty_range(uc, ram_addr, - TARGET_PAGE_SIZE * hpratio); + TARGET_PAGE_SIZE * hpratio, + DIRTY_CLIENTS_ALL); } while (c != 0); } } diff --git a/qemu/m68k.h b/qemu/m68k.h index 27aecc00..715a4595 100644 --- a/qemu/m68k.h +++ b/qemu/m68k.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_m68k #define cpu_outl cpu_outl_m68k #define cpu_outw cpu_outw_m68k +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_m68k #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_m68k -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_m68k #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_m68k #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_m68k #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_m68k diff --git a/qemu/mips.h b/qemu/mips.h index 441c0bb8..9171bbbc 100644 --- a/qemu/mips.h +++ b/qemu/mips.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_mips #define cpu_outl cpu_outl_mips #define cpu_outw cpu_outw_mips +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_mips #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mips -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mips #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mips #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mips #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mips diff --git a/qemu/mips64.h b/qemu/mips64.h index 5ae64fd3..73181162 100644 --- a/qemu/mips64.h +++ b/qemu/mips64.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_mips64 #define cpu_outl cpu_outl_mips64 #define cpu_outw cpu_outw_mips64 +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_mips64 #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mips64 -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mips64 #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mips64 #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mips64 #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mips64 diff --git a/qemu/mips64el.h b/qemu/mips64el.h index 73d6040a..36248cf9 100644 --- a/qemu/mips64el.h +++ b/qemu/mips64el.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_mips64el #define cpu_outl cpu_outl_mips64el #define cpu_outw cpu_outw_mips64el +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_mips64el #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mips64el -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mips64el #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mips64el #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mips64el #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mips64el diff --git a/qemu/mipsel.h b/qemu/mipsel.h index ef7e07f0..15281dc0 100644 --- a/qemu/mipsel.h +++ b/qemu/mipsel.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_mipsel #define cpu_outl cpu_outl_mipsel #define cpu_outw cpu_outw_mipsel +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_mipsel #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_mipsel -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_mipsel #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_mipsel #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_mipsel #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_mipsel diff --git a/qemu/powerpc.h b/qemu/powerpc.h index 8c83a261..733e61f1 100644 --- a/qemu/powerpc.h +++ b/qemu/powerpc.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_powerpc #define cpu_outl cpu_outl_powerpc #define cpu_outw cpu_outw_powerpc +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_powerpc #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_powerpc -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_powerpc #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_powerpc #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_powerpc #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_powerpc diff --git a/qemu/sparc.h b/qemu/sparc.h index e94c8dc9..a8f68908 100644 --- a/qemu/sparc.h +++ b/qemu/sparc.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_sparc #define cpu_outl cpu_outl_sparc #define cpu_outw cpu_outw_sparc +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_sparc #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_sparc -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_sparc #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_sparc #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_sparc #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_sparc diff --git a/qemu/sparc64.h b/qemu/sparc64.h index 6d53877b..a149eabf 100644 --- a/qemu/sparc64.h +++ b/qemu/sparc64.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_sparc64 #define cpu_outl cpu_outl_sparc64 #define cpu_outw cpu_outw_sparc64 +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_sparc64 #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_sparc64 -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_sparc64 #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_sparc64 #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_sparc64 #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_sparc64 diff --git a/qemu/x86_64.h b/qemu/x86_64.h index 83b91df6..57afa7d2 100644 --- a/qemu/x86_64.h +++ b/qemu/x86_64.h @@ -284,8 +284,8 @@ #define cpu_outb cpu_outb_x86_64 #define cpu_outl cpu_outl_x86_64 #define cpu_outw cpu_outw_x86_64 +#define cpu_physical_memory_all_dirty cpu_physical_memory_all_dirty_x86_64 #define cpu_physical_memory_clear_dirty_range cpu_physical_memory_clear_dirty_range_x86_64 -#define cpu_physical_memory_get_clean cpu_physical_memory_get_clean_x86_64 #define cpu_physical_memory_get_dirty cpu_physical_memory_get_dirty_x86_64 #define cpu_physical_memory_get_dirty_flag cpu_physical_memory_get_dirty_flag_x86_64 #define cpu_physical_memory_is_clean cpu_physical_memory_is_clean_x86_64