diff mbox

[06/15] s390x: Dispatch interrupts to KVM or the real CPU

Message ID 1301927544-32767-7-git-send-email-agraf@suse.de
State New
Headers show

Commit Message

Alexander Graf April 4, 2011, 2:32 p.m. UTC
The KVM interrupt injection path is non-generic for now. So we need to push
knowledge of how to inject a device interrupt using KVM into the actual device
code.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 hw/s390-virtio-bus.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

Comments

Aurelien Jarno April 10, 2011, 8:37 p.m. UTC | #1
On Mon, Apr 04, 2011 at 04:32:15PM +0200, Alexander Graf wrote:
> The KVM interrupt injection path is non-generic for now. So we need to push
> knowledge of how to inject a device interrupt using KVM into the actual device
> code.
> 
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
>  hw/s390-virtio-bus.c |   10 ++++++++--
>  1 files changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
> index 60e0135..35acf53 100644
> --- a/hw/s390-virtio-bus.c
> +++ b/hw/s390-virtio-bus.c
> @@ -43,6 +43,8 @@
>      do { } while (0)
>  #endif
>  
> +#define VIRTIO_EXT_CODE   0x2603
> +
>  struct BusInfo s390_virtio_bus_info = {
>      .name       = "s390-virtio",
>      .size       = sizeof(VirtIOS390Bus),
> @@ -304,9 +306,13 @@ static void virtio_s390_notify(void *opaque, uint16_t vector)
>  {
>      VirtIOS390Device *dev = (VirtIOS390Device*)opaque;
>      uint64_t token = s390_virtio_device_vq_token(dev, vector);
> +    CPUState *env = s390_cpu_addr2state(0);
>  
> -    /* XXX kvm dependency! */
> -    kvm_s390_virtio_irq(s390_cpu_addr2state(0), 0, token);
> +    if (kvm_enabled()) {
> +        kvm_s390_virtio_irq(env, 0, token);
> +    } else {
> +        cpu_inject_ext(env, VIRTIO_EXT_CODE, 0, token);

cpu_inject_ext() is defined in a later patch so the patch series should
probably be reordered to not break bisecting (for the KVM version only
in that case).

> +    }
>  }
>  
>  static unsigned virtio_s390_get_features(void *opaque)
> -- 
> 1.6.0.2
> 
> 
>
diff mbox

Patch

diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
index 60e0135..35acf53 100644
--- a/hw/s390-virtio-bus.c
+++ b/hw/s390-virtio-bus.c
@@ -43,6 +43,8 @@ 
     do { } while (0)
 #endif
 
+#define VIRTIO_EXT_CODE   0x2603
+
 struct BusInfo s390_virtio_bus_info = {
     .name       = "s390-virtio",
     .size       = sizeof(VirtIOS390Bus),
@@ -304,9 +306,13 @@  static void virtio_s390_notify(void *opaque, uint16_t vector)
 {
     VirtIOS390Device *dev = (VirtIOS390Device*)opaque;
     uint64_t token = s390_virtio_device_vq_token(dev, vector);
+    CPUState *env = s390_cpu_addr2state(0);
 
-    /* XXX kvm dependency! */
-    kvm_s390_virtio_irq(s390_cpu_addr2state(0), 0, token);
+    if (kvm_enabled()) {
+        kvm_s390_virtio_irq(env, 0, token);
+    } else {
+        cpu_inject_ext(env, VIRTIO_EXT_CODE, 0, token);
+    }
 }
 
 static unsigned virtio_s390_get_features(void *opaque)