From 1321c76d96910c2c807207f3fdfeb560c598ca60 Mon Sep 17 00:00:00 2001 From: Jun Nakajima Date: Fri, 4 Mar 2011 17:17:45 -0800 Subject: x86: Enable KVM mode for Android x86 emulator (update/rebase) This patch enables KVM mode on x86 Linux to boost performance of x86 emulaiton if the hardware-based virtualization feature is present on the host machine. Change-Id: I4b24474b3ec115a3b9a7bf017801f4f610253b09 Signed-off-by: Xiaohui Xin Signed-off-by: Yunhong Jiang Signed-off-by: Jun Nakajima --- hw/goldfish_nand.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'hw/goldfish_nand.c') diff --git a/hw/goldfish_nand.c b/hw/goldfish_nand.c index 6d2182f..8d9b5db 100644 --- a/hw/goldfish_nand.c +++ b/hw/goldfish_nand.c @@ -16,6 +16,10 @@ #include "qemu_debug.h" #include "android/android.h" +#ifdef TARGET_I386 +#include "kvm.h" +#endif + #define DEBUG 1 #if DEBUG # define D(...) VERBOSE_PRINT(init,__VA_ARGS__) @@ -374,6 +378,10 @@ static uint32_t nand_dev_read_file(nand_dev *dev, uint32_t data, uint64_t addr, if(!eof) { read_len = do_read(dev->fd, dev->data, read_len); } +#ifdef TARGET_I386 + if (kvm_enabled()) + cpu_synchronize_state(cpu_single_env, 0); +#endif cpu_memory_rw_debug(cpu_single_env, data, dev->data, read_len, 1); data += read_len; len -= read_len; @@ -393,6 +401,10 @@ static uint32_t nand_dev_write_file(nand_dev *dev, uint32_t data, uint64_t addr, while(len > 0) { if(len < write_len) write_len = len; +#ifdef TARGET_I386 + if (kvm_enabled()) + cpu_synchronize_state(cpu_single_env, 0); +#endif cpu_memory_rw_debug(cpu_single_env, data, dev->data, write_len, 0); ret = do_write(dev->fd, dev->data, write_len); if(ret < write_len) { @@ -455,6 +467,10 @@ uint32_t nand_dev_do_cmd(nand_dev_controller_state *s, uint32_t cmd) case NAND_CMD_GET_DEV_NAME: if(size > dev->devname_len) size = dev->devname_len; +#ifdef TARGET_I386 + if (kvm_enabled()) + cpu_synchronize_state(cpu_single_env, 0); +#endif cpu_memory_rw_debug(cpu_single_env, s->data, (uint8_t*)dev->devname, size, 1); return size; case NAND_CMD_READ: @@ -464,6 +480,10 @@ uint32_t nand_dev_do_cmd(nand_dev_controller_state *s, uint32_t cmd) size = dev->max_size - addr; if(dev->fd >= 0) return nand_dev_read_file(dev, s->data, addr, size); +#ifdef TARGET_I386 + if (kvm_enabled()) + cpu_synchronize_state(cpu_single_env, 0); +#endif cpu_memory_rw_debug(cpu_single_env,s->data, &dev->data[addr], size, 1); return size; case NAND_CMD_WRITE: @@ -475,6 +495,10 @@ uint32_t nand_dev_do_cmd(nand_dev_controller_state *s, uint32_t cmd) size = dev->max_size - addr; if(dev->fd >= 0) return nand_dev_write_file(dev, s->data, addr, size); +#ifdef TARGET_I386 + if (kvm_enabled()) + cpu_synchronize_state(cpu_single_env, 0); +#endif cpu_memory_rw_debug(cpu_single_env,s->data, &dev->data[addr], size, 0); return size; case NAND_CMD_ERASE: -- cgit v1.1