Subject: [PATCH] [1/1] simplify mmio read/write callback structure
Subject: [PATCH] [1/1] simplify mmio read/write callback structure
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.
---
[diffstat]
libkvm/libkvm.c | 40 ++++-------------------------------- libkvm/libkvm.h | 19 ++--------------- qemu/qemu-kvm.c | 62 +++----------------------------------------------------- user/main.c | 52 ++++++---------------------------------------- 4 files changed, 19 insertions(+), 154 deletions(-)
[diff]
*Attached*
Signature · 10 lines
Grüsse / regards, Christian Ehrhardt IBM Linux Technology Center, Open Virtualization +49 7031/16-3385 [email protected] [email protected] IBM Deutschland Entwicklung GmbH Vorsitzender des Aufsichtsrats: Johann Weihen Geschäftsführung: Herbert Kircher Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294
libkvm/libkvm.c +8 -35
@@ -771,44 +771,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 ==0xa0000 && kvm_run->mmio.len ==3 ) +/* hack: Red Hat 7.1 generates these weird accesses. */ +if ((addr >0xa0000 -4 && addr <=0xa0000 ) && 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)
libkvm/libkvm.h +6 -16
@@ -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.
qemu/qemu-kvm.c +9 -55
81 lines not on this page · raw message
user/main.c +4 -50
78 lines not on this page · raw message
-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
kvm-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel