예제 #1
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;
}
예제 #2
0
파일: pl110.c 프로젝트: 32bitmicro/xvisor
static int pl110_display_pixeldata(struct vmm_vdisplay *vdis,
				   struct vmm_pixelformat *pf,
				   u32 *rows, u32 *cols,
				   physical_addr_t *pa)
{
	u32 flags;
	physical_addr_t gpa, hpa;
	physical_size_t gsz, hsz;
	int rc, bits_per_pixel, bytes_per_pixel;
	struct pl110_state *s = vmm_vdisplay_priv(vdis);

	if (!pl110_enabled(s)) {
		return VMM_ENOTAVAIL;
	}

	switch (s->bpp) {
	case BPP_16:
	case BPP_16_565:
		bits_per_pixel = 16;
		bytes_per_pixel = 2;
		break;
	case BPP_32:
		bits_per_pixel = 32;
		bytes_per_pixel = 4;
		break;
	default:
		return VMM_EINVALID;
	};

	gpa = s->upbase;
	gsz = (s->cols * s->rows) * bytes_per_pixel;
	rc = vmm_guest_physical_map(s->guest, gpa, gsz, &hpa, &hsz, &flags);
	if (rc) {
		return rc;
	}

	if (!(flags & VMM_REGION_REAL) ||
	    !(flags & VMM_REGION_MEMORY) ||
	    !(flags & VMM_REGION_ISRAM)) {
		return VMM_EINVALID;
	}

	vmm_pixelformat_init_default(pf, bits_per_pixel);
	*rows = s->rows;
	*cols = s->cols;
	*pa = hpa;

	return VMM_OK;
}