Thread (17 messages) flat view 17 messages, 2 authors, 2016-09-06
STALE3651d

[RFC PATCH v3 5/5] arm/arm64: vgic-new: Implement KVM_DEV_ARM_VGIC_GRP_LEVEL_INFO ioctl

From: Vijay Kilari <hidden>
Date: 2016-09-06 14:12:19
Also in: kvmarm

On Tue, Aug 30, 2016 at 7:30 PM, Christoffer Dall
[off-list ref] wrote:
On Wed, Aug 24, 2016 at 04:50:09PM +0530, vijay.kilari at gmail.com wrote:
quoted
From: Vijaya Kumar K <redacted>
 }
diff --git a/virt/kvm/arm/vgic/vgic-mmio-v3.c b/virt/kvm/arm/vgic/vgic-mmio-v3.c
index 61abea0..fde1472 100644
--- a/virt/kvm/arm/vgic/vgic-mmio-v3.c
+++ b/virt/kvm/arm/vgic/vgic-mmio-v3.c
@@ -789,3 +789,22 @@ int vgic_v3_redist_uaccess(struct kvm_vcpu *vcpu, bool is_write,

      return vgic_v3_uaccess(vcpu, dev, is_write, offset, val);
 }
+
+int vgic_v3_line_level_info_uaccess(struct kvm_vcpu *vcpu, bool is_write,
+                                 u32 intid, u32 *val)
+{
+     unsigned int len = 4;
+     u8 buf[4];
+     int ret;
+
+     if (is_write) {
+             vgic_data_host_to_mmio_bus(buf, len, *val);
why do you involve the mmio bus in this?
This is doing LE conversion. This is being done by vgic_uaccess function.
IRC, This sys register access in not following vgic_uaccess path. Hence
added it here.
quoted
+             ret = vgic_write_irq_line_level_info(vcpu, intid, len, buf);
+     } else {
+             ret = vgic_read_irq_line_level_info(vcpu, intid, len, buf);
+             if (!ret)
+                     *val = vgic_data_mmio_bus_to_host(buf, len);
+     }
+
+     return ret;
+}
diff --git a/virt/kvm/arm/vgic/vgic-mmio.c b/virt/kvm/arm/vgic/vgic-mmio.c
index 38f2c75..74d0449 100644
--- a/virt/kvm/arm/vgic/vgic-mmio.c
+++ b/virt/kvm/arm/vgic/vgic-mmio.c
@@ -391,6 +391,40 @@ void vgic_mmio_write_config(struct kvm_vcpu *vcpu,
      }
 }

+int vgic_read_irq_line_level_info(struct kvm_vcpu *vcpu, u32 intid,
+                               unsigned int len, void *val)
+{
+     unsigned long data = 0;
+     int i;
+
+     for (i = 0; i < len * 8; i++) {
+             struct vgic_irq *irq = vgic_get_irq(vcpu->kvm, vcpu, intid + i);
+
+             if (irq->line_level)
+                     data |= (1U << i);
+     }
+     vgic_data_host_to_mmio_bus(val, len, data);
why???
Same as above reason
quoted
+
+     return 0;
+}
+
+int vgic_write_irq_line_level_info(struct kvm_vcpu *vcpu, u32 intid,
+                                unsigned int len, const void *val)
+{
+     int i;
+     unsigned long data = vgic_data_mmio_bus_to_host(val, len);
why???
Same as above reason
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help