aboutsummaryrefslogtreecommitdiffstats
path: root/hw
diff options
context:
space:
mode:
Diffstat (limited to 'hw')
-rw-r--r--hw/goldfish_device.c10
-rw-r--r--hw/goldfish_nand.c33
-rw-r--r--hw/goldfish_tty.c12
-rw-r--r--hw/hw.h3
-rw-r--r--hw/pc.c6
5 files changed, 60 insertions, 4 deletions
diff --git a/hw/goldfish_device.c b/hw/goldfish_device.c
index 3ced4ce..e98161a 100644
--- a/hw/goldfish_device.c
+++ b/hw/goldfish_device.c
@@ -12,6 +12,9 @@
#include "qemu_file.h"
#include "arm_pic.h"
#include "goldfish_device.h"
+#ifdef TARGET_I386
+#include "kvm.h"
+#endif
#define PDEV_BUS_OP_DONE (0x00)
#define PDEV_BUS_OP_REMOVE_DEV (0x04)
@@ -148,8 +151,13 @@ static void goldfish_bus_write(void *opaque, target_phys_addr_t offset, uint32_t
};
break;
case PDEV_BUS_GET_NAME:
- if(s->current)
+ if(s->current) {
+#ifdef TARGET_I386
+ if(kvm_enabled())
+ cpu_synchronize_state(cpu_single_env, 0);
+#endif
cpu_memory_rw_debug(cpu_single_env, value, (void*)s->current->name, strlen(s->current->name), 1);
+ }
break;
default:
cpu_abort (cpu_single_env, "goldfish_bus_write: Bad offset %x\n", offset);
diff --git a/hw/goldfish_nand.c b/hw/goldfish_nand.c
index 2aff835..eb0c355 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:
@@ -638,6 +662,8 @@ void nand_add_dev(const char *arg)
uint32_t extra_size = 64;
uint32_t erase_pages = 64;
+ VERBOSE_PRINT(init, "%s: %s", __FUNCTION__, arg);
+
while(arg) {
next_arg = strchr(arg, ',');
value = strchr(arg, '=');
@@ -662,10 +688,11 @@ void nand_add_dev(const char *arg)
if(value != NULL)
goto bad_arg_and_value;
devname_len = arg_len;
- devname = malloc(arg_len);
+ devname = malloc(arg_len+1);
if(devname == NULL)
goto out_of_memory;
memcpy(devname, arg, arg_len);
+ devname[arg_len] = 0;
}
else if(value == NULL) {
if(arg_match("readonly", arg, arg_len)) {
@@ -739,7 +766,7 @@ void nand_add_dev(const char *arg)
if(rwfilename) {
rwfd = open(rwfilename, O_BINARY | (read_only ? O_RDONLY : O_RDWR));
- if(rwfd < 0 && read_only) {
+ if(rwfd < 0) {
XLOG("could not open file %s, %s\n", rwfilename, strerror(errno));
exit(1);
}
@@ -792,7 +819,7 @@ void nand_add_dev(const char *arg)
exit(1);
}
if(do_write(rwfd, dev->data, read_size) != read_size) {
- XLOG("could not write file %s, %s\n", initfilename, strerror(errno));
+ XLOG("could not write file %s, %s\n", rwfilename, strerror(errno));
exit(1);
}
} while(read_size == dev->erase_size);
diff --git a/hw/goldfish_tty.c b/hw/goldfish_tty.c
index 904a07b..fd8eca8 100644
--- a/hw/goldfish_tty.c
+++ b/hw/goldfish_tty.c
@@ -13,6 +13,10 @@
#include "qemu-char.h"
#include "goldfish_device.h"
+#ifdef TARGET_I386
+#include "kvm.h"
+#endif
+
enum {
TTY_PUT_CHAR = 0x00,
TTY_BYTES_READY = 0x04,
@@ -126,6 +130,10 @@ static void goldfish_tty_write(void *opaque, target_phys_addr_t offset, uint32_t
if (to_write > len)
to_write = len;
+#ifdef TARGET_I386
+ if (kvm_enabled())
+ cpu_synchronize_state(cpu_single_env, 0);
+#endif
cpu_memory_rw_debug(cpu_single_env, buf, (uint8_t*)temp, to_write, 0);
qemu_chr_write(s->cs, (const uint8_t*)temp, to_write);
buf += to_write;
@@ -138,6 +146,10 @@ static void goldfish_tty_write(void *opaque, target_phys_addr_t offset, uint32_t
case TTY_CMD_READ_BUFFER:
if(s->ptr_len > s->data_count)
cpu_abort (cpu_single_env, "goldfish_tty_write: reading more data than available %d %d\n", s->ptr_len, s->data_count);
+#ifdef TARGET_I386
+ if (kvm_enabled())
+ cpu_synchronize_state(cpu_single_env, 0);
+#endif
cpu_memory_rw_debug(cpu_single_env,s->ptr, s->data, s->ptr_len,1);
//printf("goldfish_tty_write: read %d bytes to %x\n", s->ptr_len, s->ptr);
if(s->data_count > s->ptr_len)
diff --git a/hw/hw.h b/hw/hw.h
index 4f9b650..efcbe1e 100644
--- a/hw/hw.h
+++ b/hw/hw.h
@@ -4,7 +4,10 @@
#include "qemu-common.h"
#include "irq.h"
+
+#if defined(TARGET_PHYS_ADDRESS_SPACE_BITS) && !defined(NEED_CPU_H)
#include "cpu.h"
+#endif
/* VM Load/Save */
diff --git a/hw/pc.c b/hw/pc.c
index 72b6813..ff7670e 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -788,6 +788,7 @@ static int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
static int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 }; */
#ifdef HAS_AUDIO
+#ifndef CONFIG_ANDROID
static void audio_init (PCIBus *pci_bus, qemu_irq *pic)
{
struct soundhw *c;
@@ -805,6 +806,7 @@ static void audio_init (PCIBus *pci_bus, qemu_irq *pic)
}
}
#endif
+#endif
static void pc_init_ne2k_isa(NICInfo *nd, qemu_irq *pic)
{
@@ -1184,7 +1186,11 @@ static void pc_init1(ram_addr_t ram_size,
events_dev_init(event0_device.base, i8259[event0_device.irq]);
#ifdef HAS_AUDIO
+#ifndef CONFIG_ANDROID
audio_init(pci_enabled ? pci_bus : NULL, i8259);
+#else
+ goldfish_audio_init(0xff004000, 0, audio_input_source);
+#endif
#endif
#ifndef CONFIG_ANDROID