From patchwork Fri Apr 8 18:00:29 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: KVM: flush icache after writing to RAM Date: Fri, 08 Apr 2011 08:00:29 -0000 From: Scott Wood X-Patchwork-Id: 90403 Message-Id: <20110408180028.GA22376@schlenkerla.am.freescale.net> To: 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 --- 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 #include @@ -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;