diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-10-06 14:02:03 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2008-10-06 14:02:03 +0000 |
commit | 74576198d7831674506a8f2142a5fd853584a9ff (patch) | |
tree | c0ae5584a8d2b06f41fe3206f20ff3e562fb4f69 /exec.c | |
parent | c6ca28d636cdc24574aa1822f5f424de5dc89758 (diff) |
Add dirty tracking for live migration
This patch adds a dirty tracking bit for live migration. We use 0x08 because
kqemu uses 0x04.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5433 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'exec.c')
-rw-r--r-- | exec.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -38,6 +38,7 @@ #include "qemu-common.h" #include "tcg.h" #include "hw/hw.h" +#include "osdep.h" #if defined(CONFIG_USER_ONLY) #include <qemu.h> #endif @@ -113,6 +114,7 @@ ram_addr_t phys_ram_size; int phys_ram_fd; uint8_t *phys_ram_base; uint8_t *phys_ram_dirty; +static int in_migration; static ram_addr_t phys_ram_alloc_offset = 0; #endif @@ -1809,6 +1811,17 @@ void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end, } } +int cpu_physical_memory_set_dirty_tracking(int enable) +{ + in_migration = enable; + return 0; +} + +int cpu_physical_memory_get_dirty_tracking(void) +{ + return in_migration; +} + static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry) { ram_addr_t ram_addr; @@ -2964,9 +2977,19 @@ void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val) io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val); } else { - ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) + - (addr & ~TARGET_PAGE_MASK); + unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK); + ptr = phys_ram_base + addr1; stl_p(ptr, val); + + if (unlikely(in_migration)) { + if (!cpu_physical_memory_is_dirty(addr1)) { + /* invalidate code */ + tb_invalidate_phys_page_range(addr1, addr1 + 4, 0); + /* set dirty bit */ + phys_ram_dirty[addr1 >> TARGET_PAGE_BITS] |= + (0xff & ~CODE_DIRTY_FLAG); + } + } } } |