This is required so that the guest does not execute any stale instructions.
qemu-kvm does this in cpu_physical_memory_rw, but not in cpu_physical_memory_write_rom. Signed-off-by: Scott Wood <scottw...@freescale.com> --- exec.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/exec.c b/exec.c index 983c0db..055d304 100644 --- a/exec.c +++ b/exec.c @@ -33,6 +33,7 @@ #include "osdep.h" #include "kvm.h" #include "qemu-timer.h" +#include "cache-utils.h" #if defined(CONFIG_USER_ONLY) #include <qemu.h> #include <signal.h> @@ -3768,6 +3769,12 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, cpu_physical_memory_set_dirty_flags( addr1, (0xff & ~CODE_DIRTY_FLAG)); } + /* qemu doesn't execute guest code directly, but kvm does + therefore flush instruction caches */ + if (kvm_enabled()) { + flush_icache_range((unsigned long)ptr, + (unsigned long)ptr + l); + } } } else { if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && @@ -3838,6 +3845,13 @@ void cpu_physical_memory_write_rom(target_phys_addr_t addr, /* ROM/RAM case */ ptr = qemu_get_ram_ptr(addr1); memcpy(ptr, buf, l); + + /* qemu doesn't execute guest code directly, but kvm does + therefore flush instruction caches */ + if (kvm_enabled()) { + flush_icache_range((unsigned long)ptr, + (unsigned long)ptr + l); + } } len -= l; buf += l; -- 1.7.1