[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 15/42] virtio: add modern config accessors
From: |
Michael S. Tsirkin |
Subject: |
[Qemu-devel] [PULL 15/42] virtio: add modern config accessors |
Date: |
Thu, 11 Jun 2015 13:58:47 +0200 |
virtio 1.0 defines config space as LE,
as opposed to pre-1.0 which was native endian.
Add API for transports to execute word/dword accesses in
little endian format - will be useful for mmio
and pci (byte access is also wrapped, for completeness).
For simplicity, we still keep config in host native
endian format, byteswap to LE on guest access.
Signed-off-by: Michael S. Tsirkin <address@hidden>
Reviewed-by: Michael S. Tsirkin <address@hidden>
---
include/hw/virtio/virtio.h | 9 +++++
hw/virtio/virtio.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 105 insertions(+)
diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h
index b9e36f9..473fb75 100644
--- a/include/hw/virtio/virtio.h
+++ b/include/hw/virtio/virtio.h
@@ -174,6 +174,15 @@ uint32_t virtio_config_readl(VirtIODevice *vdev, uint32_t
addr);
void virtio_config_writeb(VirtIODevice *vdev, uint32_t addr, uint32_t data);
void virtio_config_writew(VirtIODevice *vdev, uint32_t addr, uint32_t data);
void virtio_config_writel(VirtIODevice *vdev, uint32_t addr, uint32_t data);
+uint32_t virtio_config_modern_readb(VirtIODevice *vdev, uint32_t addr);
+uint32_t virtio_config_modern_readw(VirtIODevice *vdev, uint32_t addr);
+uint32_t virtio_config_modern_readl(VirtIODevice *vdev, uint32_t addr);
+void virtio_config_modern_writeb(VirtIODevice *vdev,
+ uint32_t addr, uint32_t data);
+void virtio_config_modern_writew(VirtIODevice *vdev,
+ uint32_t addr, uint32_t data);
+void virtio_config_modern_writel(VirtIODevice *vdev,
+ uint32_t addr, uint32_t data);
void virtio_queue_set_addr(VirtIODevice *vdev, int n, hwaddr addr);
hwaddr virtio_queue_get_addr(VirtIODevice *vdev, int n);
void virtio_queue_set_num(VirtIODevice *vdev, int n, int num);
diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
index cae5eca..fb49ffc 100644
--- a/hw/virtio/virtio.c
+++ b/hw/virtio/virtio.c
@@ -729,6 +729,102 @@ void virtio_config_writel(VirtIODevice *vdev, uint32_t
addr, uint32_t data)
}
}
+uint32_t virtio_config_modern_readb(VirtIODevice *vdev, uint32_t addr)
+{
+ VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+ uint8_t val;
+
+ if (addr + sizeof(val) > vdev->config_len) {
+ return (uint32_t)-1;
+ }
+
+ k->get_config(vdev, vdev->config);
+
+ val = ldub_p(vdev->config + addr);
+ return val;
+}
+
+uint32_t virtio_config_modern_readw(VirtIODevice *vdev, uint32_t addr)
+{
+ VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+ uint16_t val;
+
+ if (addr + sizeof(val) > vdev->config_len) {
+ return (uint32_t)-1;
+ }
+
+ k->get_config(vdev, vdev->config);
+
+ val = lduw_le_p(vdev->config + addr);
+ return val;
+}
+
+uint32_t virtio_config_modern_readl(VirtIODevice *vdev, uint32_t addr)
+{
+ VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+ uint32_t val;
+
+ if (addr + sizeof(val) > vdev->config_len) {
+ return (uint32_t)-1;
+ }
+
+ k->get_config(vdev, vdev->config);
+
+ val = ldl_le_p(vdev->config + addr);
+ return val;
+}
+
+void virtio_config_modern_writeb(VirtIODevice *vdev,
+ uint32_t addr, uint32_t data)
+{
+ VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+ uint8_t val = data;
+
+ if (addr + sizeof(val) > vdev->config_len) {
+ return;
+ }
+
+ stb_p(vdev->config + addr, val);
+
+ if (k->set_config) {
+ k->set_config(vdev, vdev->config);
+ }
+}
+
+void virtio_config_modern_writew(VirtIODevice *vdev,
+ uint32_t addr, uint32_t data)
+{
+ VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+ uint16_t val = data;
+
+ if (addr + sizeof(val) > vdev->config_len) {
+ return;
+ }
+
+ stw_le_p(vdev->config + addr, val);
+
+ if (k->set_config) {
+ k->set_config(vdev, vdev->config);
+ }
+}
+
+void virtio_config_modern_writel(VirtIODevice *vdev,
+ uint32_t addr, uint32_t data)
+{
+ VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
+ uint32_t val = data;
+
+ if (addr + sizeof(val) > vdev->config_len) {
+ return;
+ }
+
+ stl_le_p(vdev->config + addr, val);
+
+ if (k->set_config) {
+ k->set_config(vdev, vdev->config);
+ }
+}
+
void virtio_queue_set_addr(VirtIODevice *vdev, int n, hwaddr addr)
{
vdev->vq[n].vring.desc = addr;
--
MST
- [Qemu-devel] [PULL 04/42] dataplane: allow virtio-1 devices, (continued)
- [Qemu-devel] [PULL 04/42] dataplane: allow virtio-1 devices, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 06/42] virtio: allow to fail setting status, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 07/42] virtio-net: no writeable mac for virtio-1, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 08/42] virtio-net: support longer header, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 10/42] vhost_net: add version_1 feature, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 09/42] virtio-net: enable virtio 1.0, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 12/42] linux-headers: add virtio_pci, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 14/42] virtio: generation counter support, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 13/42] virtio-pci: initial virtio 1.0 support, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 11/42] vhost: 64 bit features, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 15/42] virtio: add modern config accessors,
Michael S. Tsirkin <=
- [Qemu-devel] [PULL 16/42] virtio-pci: switch to modern accessors for 1.0, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 17/42] virtio-pci: add flags to enable/disable legacy/modern, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 18/42] virtio-pci: make QEMU_VIRTIO_PCI_QUEUE_MEM_MULT smaller, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 22/42] virtio_balloon: header update, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 23/42] virtio-balloon: switch to virtio_add_feature, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 24/42] virtio-pci: add struct VirtIOPCIRegion for virtio-1 regions, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 25/42] virtio-pci: add virtio_pci_modern_regions_init(), Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 26/42] virtio-pci: add virtio_pci_modern_region_map(), Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 27/42] virtio-pci: move virtio_pci_add_mem_cap call to virtio_pci_modern_region_map, Michael S. Tsirkin, 2015/06/11
- [Qemu-devel] [PULL 29/42] virtio-pci: drop identical virtio_pci_cap, Michael S. Tsirkin, 2015/06/11