Example #1
0
void *arch_gnttab_alloc_shared(unsigned long *frames)
{
	struct vm_struct *area;
	area = alloc_vm_area(PAGE_SIZE * max_nr_grant_frames());
	BUG_ON(area == NULL);
	return area->addr;
}
Example #2
0
static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
{
	struct gnttab_setup_table setup;
	unsigned long *frames;
	unsigned int nr_gframes = end_idx + 1;
	int rc;

	frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
	if (!frames)
		return -ENOMEM;

	setup.dom        = DOMID_SELF;
	setup.nr_frames  = nr_gframes;
	set_xen_guest_handle(setup.frame_list, frames);

	rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
	if (rc == -ENOSYS) {
		kfree(frames);
		return -ENOSYS;
	}

	BUG_ON(rc || setup.status);

	rc = arch_gnttab_map_shared(frames, nr_gframes, max_nr_grant_frames(),
				    &shared);
	BUG_ON(rc);

	kfree(frames);

	return 0;
}
Example #3
0
static int
gnttab_map(unsigned int start_idx, unsigned int end_idx)
{
	struct xen_add_to_physmap xatp;
	unsigned int i = end_idx;

	/*
	 * Loop backwards, so that the first hypercall has the largest index,
	 * ensuring that the table will grow only once.
	 */
	do {
		xatp.domid = DOMID_SELF;
		xatp.idx = i;
		xatp.space = XENMAPSPACE_grant_table;
		xatp.gpfn = (resume_frames >> PAGE_SHIFT) + i;
		if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
			panic("HYPERVISOR_memory_op failed to map gnttab");
	} while (i-- > start_idx);

	if (shared == NULL) {
		vm_offset_t area;

		area = kva_alloc(PAGE_SIZE * max_nr_grant_frames());
		KASSERT(area, ("can't allocate VM space for grant table"));
		shared = (grant_entry_t *)area;
	}

	for (i = start_idx; i <= end_idx; i++) {
		pmap_kenter((vm_offset_t) shared + i * PAGE_SIZE,
		    resume_frames + i * PAGE_SIZE);
	}

	return (0);
}
int
gnttab_resume(void)
{

    if (max_nr_grant_frames() < nr_grant_frames)
        return (ENOSYS);
    return (gnttab_map(0, nr_grant_frames - 1));
}
Example #5
0
static int gnttab_expand(unsigned int req_entries)
{
	int rc;
	unsigned int cur, extra;

	cur = nr_grant_frames;
	extra = ((req_entries + (ENTRIES_PER_GRANT_FRAME-1)) /
		 ENTRIES_PER_GRANT_FRAME);
	if (cur + extra > max_nr_grant_frames())
		return -ENOSPC;

	if ((rc = gnttab_map(cur, cur + extra - 1)) == 0)
		rc = grow_gnttab_list(extra);

	return rc;
}
Example #6
0
static int
gnttab_expand(unsigned int req_entries)
{
	int error;
	unsigned int cur, extra;

	cur = nr_grant_frames;
	extra = howmany(req_entries, GREFS_PER_GRANT_FRAME);
	if (cur + extra > max_nr_grant_frames())
		return (ENOSPC);

	error = gnttab_map(cur, cur + extra - 1);
	if (!error)
		error = grow_gnttab_list(extra);

	return (error);
}
Example #7
0
static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
{
	struct gnttab_setup_table setup;
	unsigned long *frames;
	unsigned int nr_gframes = end_idx + 1;
	int rc;

	frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
	if (!frames)
		return -ENOMEM;

	setup.dom        = DOMID_SELF;
	setup.nr_frames  = nr_gframes;
	set_xen_guest_handle(setup.frame_list, frames);

	rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
	if (rc == -ENOSYS) {
		kfree(frames);
		return -ENOSYS;
	}

	BUG_ON(rc || setup.status);

#ifndef __ia64__
	if (shared == NULL) {
		struct vm_struct *area;
		area = alloc_vm_area(PAGE_SIZE * max_nr_grant_frames());
		BUG_ON(area == NULL);
		shared = area->addr;
	}
	rc = apply_to_page_range(&init_mm, (unsigned long)shared,
				 PAGE_SIZE * nr_gframes,
				 map_pte_fn, &frames);
	BUG_ON(rc);
        frames -= nr_gframes; /* adjust after map_pte_fn() */
#else
	shared = __va(frames[0] << PAGE_SHIFT);
#endif

	kfree(frames);

	return 0;
}
static int
gnttab_map(unsigned int start_idx, unsigned int end_idx)
{
    struct gnttab_setup_table setup;
    u_long *frames;

    unsigned int nr_gframes = end_idx + 1;
    int i, rc;

    frames = malloc(nr_gframes * sizeof(unsigned long), M_DEVBUF, M_NOWAIT);
    if (!frames)
        return (ENOMEM);

    setup.dom        = DOMID_SELF;
    setup.nr_frames  = nr_gframes;
    set_xen_guest_handle(setup.frame_list, frames);

    rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
    if (rc == -ENOSYS) {
        free(frames, M_DEVBUF);
        return (ENOSYS);
    }
    KASSERT(!(rc || setup.status),
            ("unexpected result from grant_table_op"));

    if (shared == NULL) {
        vm_offset_t area;

        area = kmem_alloc_nofault(kernel_map,
                                  PAGE_SIZE * max_nr_grant_frames());
        KASSERT(area, ("can't allocate VM space for grant table"));
        shared = (grant_entry_t *)area;
    }

    for (i = 0; i < nr_gframes; i++)
        PT_SET_MA(((caddr_t)shared) + i*PAGE_SIZE,
                  ((vm_paddr_t)frames[i]) << PAGE_SHIFT | PG_RW | PG_V);

    free(frames, M_DEVBUF);

    return (0);
}
Example #9
0
int gnttab_resume(void)
{
	unsigned int max_nr_gframes, nr_gframes;

	nr_gframes = nr_grant_frames;
	max_nr_gframes = max_nr_grant_frames();
	if (max_nr_gframes < nr_gframes)
		return -ENOSYS;

	if (!resume_frames) {
		resume_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
		shared = ioremap(resume_frames, PAGE_SIZE * max_nr_gframes);
		if (shared == NULL) {
			printk("error to ioremap gnttab share frames\n");
			return -1;
		}
	}

	gnttab_map(0, nr_gframes - 1);

	return 0;
}
Example #10
0
int
gnttab_resume(void)
{
    int error;
    unsigned int max_nr_gframes, nr_gframes;

    nr_gframes = nr_grant_frames;
    max_nr_gframes = max_nr_grant_frames();
    if (max_nr_gframes < nr_gframes)
        return (ENOSYS);

    if (!resume_frames) {
        error = xenpci_alloc_space(PAGE_SIZE * max_nr_gframes,
                                   &resume_frames);
        if (error) {
            printf("error mapping gnttab share frames\n");
            return (error);
        }
    }

    return (gnttab_map(0, nr_gframes - 1));
}
Example #11
0
int
gnttab_resume(device_t dev)
{
	unsigned int max_nr_gframes, nr_gframes;

	nr_gframes = nr_grant_frames;
	max_nr_gframes = max_nr_grant_frames();
	if (max_nr_gframes < nr_gframes)
		return (ENOSYS);

	if (!resume_frames) {
		KASSERT(dev != NULL,
		    ("No resume frames and no device provided"));

		gnttab_pseudo_phys_res = xenmem_alloc(dev,
		    &gnttab_pseudo_phys_res_id, PAGE_SIZE * max_nr_gframes);
		if (gnttab_pseudo_phys_res == NULL)
			panic("Unable to reserve physical memory for gnttab");
		resume_frames = rman_get_start(gnttab_pseudo_phys_res);
	}

	return (gnttab_map(0, nr_gframes - 1));
}
Example #12
0
int gnttab_resume(void)
{
	if (max_nr_grant_frames() < nr_grant_frames)
		return 0;
	return gnttab_map(0, nr_grant_frames - 1);
}
Example #13
0
static int gnttab_resume(void)
{
	if (max_nr_grant_frames() < nr_grant_frames)
		return -ENOSYS;
	return gnttab_map(0, nr_grant_frames - 1);
}
Example #14
0
static int gnttab_resume(struct sys_device *dev)
{
	if (max_nr_grant_frames() < nr_grant_frames)
		return -ENOSYS;
	return gnttab_map(0, nr_grant_frames - 1);
}