Subject: [PATCH][UPDATE] kvm-userspace: simplify mmio callback
From: Christian Ehrhardt [EMAIL PROTECTED]
Merging the read[bwlq]/write[bwlq] callback callback pointers to
mmio_read/write functions simplifies the callback interface.
On the qemu side it now uses the cpu_physical_memory_rw function.
Additonally this patch merges the RedHat 7.1 mmio workaround that
was spread to two code locations.
Signed-off-by: Christian Ehrhardt [EMAIL PROTECTED]
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 93d7b6b..fd93f44 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -826,44 +826,17 @@ static int handle_mmio(kvm_context_t kvm, struct kvm_run
*kvm_run)
{
unsigned long addr = kvm_run-mmio.phys_addr;
void *data = kvm_run-mmio.data;
- int r = -1;
- /* hack: Red Hat 7.1 generates these wierd accesses. */
- if (addr == 0xa kvm_run-mmio.len == 3)
+ /* hack: Red Hat 7.1 generates these weird accesses. */
+ if ((addr 0xa-4 addr = 0xa) kvm_run-mmio.len == 3)
return 0;
- if (kvm_run-mmio.is_write) {
- switch (kvm_run-mmio.len) {
- case 1:
- r = kvm-callbacks-writeb(kvm-opaque, addr, *(uint8_t
*)data);
- break;
- case 2:
- r = kvm-callbacks-writew(kvm-opaque, addr,
*(uint16_t *)data);
- break;
- case 4:
- r = kvm-callbacks-writel(kvm-opaque, addr,
*(uint32_t *)data);
- break;
- case 8:
- r = kvm-callbacks-writeq(kvm-opaque, addr,
*(uint64_t *)data);
- break;
- }
- } else {
- switch (kvm_run-mmio.len) {
- case 1:
- r = kvm-callbacks-readb(kvm-opaque, addr, (uint8_t
*)data);
- break;
- case 2:
- r = kvm-callbacks-readw(kvm-opaque, addr, (uint16_t
*)data);
- break;
- case 4:
- r = kvm-callbacks-readl(kvm-opaque, addr, (uint32_t
*)data);
- break;
- case 8:
- r = kvm-callbacks-readq(kvm-opaque, addr, (uint64_t
*)data);
- break;
- }
- }
- return r;
+ if (kvm_run-mmio.is_write)
+ return kvm-callbacks-mmio_write(kvm-opaque, addr, data,
+ kvm_run-mmio.len);
+ else
+ return kvm-callbacks-mmio_read(kvm-opaque, addr, data,
+ kvm_run-mmio.len);
}
int handle_io_window(kvm_context_t kvm)
diff --git a/libkvm/libkvm.h b/libkvm/libkvm.h
index 110912a..62407f5 100644
--- a/libkvm/libkvm.h
+++ b/libkvm/libkvm.h
@@ -45,22 +45,12 @@ struct kvm_callbacks {
int (*outw)(void *opaque, uint16_t addr, uint16_t data);
/// For 32bit IO writes from the guest (Usually when executing 'outl')
int (*outl)(void *opaque, uint16_t addr, uint32_t data);
- /// For 8bit memory reads from unmapped memory (For MMIO devices)
-int (*readb)(void *opaque, uint64_t addr, uint8_t *data);
- /// For 16bit memory reads from unmapped memory (For MMIO devices)
-int (*readw)(void *opaque, uint64_t addr, uint16_t *data);
- /// For 32bit memory reads from unmapped memory (For MMIO devices)
-int (*readl)(void *opaque, uint64_t addr, uint32_t *data);
- /// For 64bit memory reads from unmapped memory (For MMIO devices)
-int (*readq)(void *opaque, uint64_t addr, uint64_t *data);
- /// For 8bit memory writes to unmapped memory (For MMIO devices)
-int (*writeb)(void *opaque, uint64_t addr, uint8_t data);
- /// For 16bit memory writes to unmapped memory (For MMIO devices)
-int (*writew)(void *opaque, uint64_t addr, uint16_t data);
- /// For 32bit memory writes to unmapped memory (For MMIO devices)
-int (*writel)(void *opaque, uint64_t addr, uint32_t data);
- /// For 64bit memory writes to unmapped memory (For MMIO devices)
-int (*writeq)(void *opaque, uint64_t addr, uint64_t data);
+ /// generic memory reads to unmapped memory (For MMIO devices)
+int (*mmio_read)(void *opaque, uint64_t addr, uint8_t *data,
+ int len);
+ /// generic memory writes to unmapped memory (For MMIO devices)
+int (*mmio_write)(void *opaque, uint64_t addr, uint8_t *data,
+ int len);
int (*debug)(void *opaque, int vcpu);
/*!
* \brief Called when the VCPU issues an 'hlt' instruction.
diff --git a/qemu/qemu-kvm.c b/qemu/qemu-kvm.c
index cc47ca2..8027ed1 100644
--- a/qemu/qemu-kvm.c
+++ b/qemu/qemu-kvm.c
@@ -477,58 +477,18 @@ static int kvm_outl(void *opaque, uint16_t addr, uint32_t
data)
return 0;
}
-static int kvm_readb(void *opaque, uint64_t