Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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,
					 &reg_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;
}