Revision 1cbdabe2 hw/virtio.c

b/hw/virtio.c
73 73
    int inuse;
74 74
    uint16_t vector;
75 75
    void (*handle_output)(VirtIODevice *vdev, VirtQueue *vq);
76
    VirtIODevice *vdev;
77
    EventNotifier guest_notifier;
78
    EventNotifier host_notifier;
76 79
};
77 80

  
78 81
/* virt queue functions */
......
592 595
    return &vdev->vq[i];
593 596
}
594 597

  
598
void virtio_irq(VirtQueue *vq)
599
{
600
    vq->vdev->isr |= 0x01;
601
    virtio_notify_vector(vq->vdev, vq->vector);
602
}
603

  
595 604
void virtio_notify(VirtIODevice *vdev, VirtQueue *vq)
596 605
{
597 606
    /* Always notify when queue is empty (when feature acknowledge) */
......
714 723
    vdev->queue_sel = 0;
715 724
    vdev->config_vector = VIRTIO_NO_VECTOR;
716 725
    vdev->vq = qemu_mallocz(sizeof(VirtQueue) * VIRTIO_PCI_QUEUE_MAX);
717
    for(i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++)
726
    for(i = 0; i < VIRTIO_PCI_QUEUE_MAX; i++) {
718 727
        vdev->vq[i].vector = VIRTIO_NO_VECTOR;
728
        vdev->vq[i].vdev = vdev;
729
    }
719 730

  
720 731
    vdev->name = name;
721 732
    vdev->config_len = config_size;
......
733 744
    vdev->binding = binding;
734 745
    vdev->binding_opaque = opaque;
735 746
}
747

  
748
target_phys_addr_t virtio_queue_get_desc_addr(VirtIODevice *vdev, int n)
749
{
750
    return vdev->vq[n].vring.desc;
751
}
752

  
753
target_phys_addr_t virtio_queue_get_avail_addr(VirtIODevice *vdev, int n)
754
{
755
    return vdev->vq[n].vring.avail;
756
}
757

  
758
target_phys_addr_t virtio_queue_get_used_addr(VirtIODevice *vdev, int n)
759
{
760
    return vdev->vq[n].vring.used;
761
}
762

  
763
target_phys_addr_t virtio_queue_get_ring_addr(VirtIODevice *vdev, int n)
764
{
765
    return vdev->vq[n].vring.desc;
766
}
767

  
768
target_phys_addr_t virtio_queue_get_desc_size(VirtIODevice *vdev, int n)
769
{
770
    return sizeof(VRingDesc) * vdev->vq[n].vring.num;
771
}
772

  
773
target_phys_addr_t virtio_queue_get_avail_size(VirtIODevice *vdev, int n)
774
{
775
    return offsetof(VRingAvail, ring) +
776
        sizeof(u_int64_t) * vdev->vq[n].vring.num;
777
}
778

  
779
target_phys_addr_t virtio_queue_get_used_size(VirtIODevice *vdev, int n)
780
{
781
    return offsetof(VRingUsed, ring) +
782
        sizeof(VRingUsedElem) * vdev->vq[n].vring.num;
783
}
784

  
785
target_phys_addr_t virtio_queue_get_ring_size(VirtIODevice *vdev, int n)
786
{
787
    return vdev->vq[n].vring.used - vdev->vq[n].vring.desc +
788
	    virtio_queue_get_used_size(vdev, n);
789
}
790

  
791
uint16_t virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n)
792
{
793
    return vdev->vq[n].last_avail_idx;
794
}
795

  
796
void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n, uint16_t idx)
797
{
798
    vdev->vq[n].last_avail_idx = idx;
799
}
800

  
801
VirtQueue *virtio_get_queue(VirtIODevice *vdev, int n)
802
{
803
    return vdev->vq + n;
804
}
805

  
806
EventNotifier *virtio_queue_get_guest_notifier(VirtQueue *vq)
807
{
808
    return &vq->guest_notifier;
809
}
810
EventNotifier *virtio_queue_get_host_notifier(VirtQueue *vq)
811
{
812
    return &vq->host_notifier;
813
}

Also available in: Unified diff