static int virtio_blk_reset(struct virtio_device *dev) { int i, rc; struct virtio_blk_dev_req *req; struct virtio_blk_dev *vbdev = dev->emu_data; DPRINTF("%s: dev=%s\n", __func__, dev->name); for (i = 0; i < VIRTIO_BLK_QUEUE_SIZE; i++) { req = &vbdev->reqs[i]; if (vmm_vdisk_get_request_type(&req->r) != VMM_VDISK_REQUEST_UNKNOWN) { vmm_vdisk_abort_request(vbdev->vdisk, &req->r); } memset(req, 0, sizeof(*req)); vmm_vdisk_set_request_type(&req->r, VMM_VDISK_REQUEST_UNKNOWN); } rc = virtio_queue_cleanup(&vbdev->vqs[VIRTIO_BLK_IO_QUEUE]); if (rc) { return rc; } return VMM_OK; }
static int virtio_net_reset(struct virtio_device *dev) { int rc; struct virtio_net_dev *ndev = dev->emu_data; rc = virtio_queue_cleanup(&ndev->vqs[VIRTIO_NET_RX_QUEUE]); if (rc) { return rc; } rc = virtio_queue_cleanup(&ndev->vqs[VIRTIO_NET_TX_QUEUE]); if (rc) { return rc; } return VMM_OK; }
static int virtio_blk_reset(struct virtio_device *dev) { int rc; struct virtio_blk_dev *bdev = dev->emu_data; rc = virtio_queue_cleanup(&bdev->vqs[VIRTIO_BLK_IO_QUEUE]); if (rc) { return rc; } return VMM_OK; }
int virtio_queue_setup(struct virtio_queue *vq, struct vmm_guest *guest, physical_addr_t guest_pfn, physical_size_t guest_page_size, u32 desc_count, u32 align) { int rc = 0; u32 reg_flags; physical_addr_t gphys_addr, hphys_addr; physical_size_t gphys_size, avail_size; if ((rc = virtio_queue_cleanup(vq))) { return rc; } gphys_addr = guest_pfn * guest_page_size; gphys_size = vring_size(desc_count, align); if ((rc = vmm_guest_physical_map(guest, gphys_addr, gphys_size, &hphys_addr, &avail_size, ®_flags))) { vmm_printf("Failed vmm_guest_physical_map\n"); return VMM_EFAIL; } if (!(reg_flags & VMM_REGION_ISRAM)) { return VMM_EINVALID; } if (avail_size < gphys_size) { return VMM_EINVALID; } vq->addr = (void *)vmm_host_memmap(hphys_addr, gphys_size, VMM_MEMORY_FLAGS_NORMAL); if (!vq->addr) { return VMM_ENOMEM; } vring_init(&vq->vring, desc_count, vq->addr, align); vq->guest = guest; vq->desc_count = desc_count; vq->align = align; vq->guest_pfn = guest_pfn; vq->guest_page_size = guest_page_size; vq->guest_addr = gphys_addr; vq->host_addr = hphys_addr; vq->total_size = gphys_size; return VMM_OK; }