Пример #1
0
int
aspace_map_region_anywhere(
	id_t         id,
	vaddr_t *    start,
	size_t       extent,
	vmflags_t    flags,
	vmpagesize_t pagesz,
	const char * name,
	paddr_t      pmem
)
{
	int status;

retry:
	if ((status = aspace_find_hole(id, 0, extent, pagesz, start)))
		return status;

	if ((status = aspace_add_region(id, *start, extent, flags, pagesz, name))) {
		if (status == -ENOTUNIQ)
			goto retry; /* we lost a race with someone */
		return status;
	}

	if ((status = aspace_map_pmem(id, pmem, *start, extent))) {
		aspace_del_region(id, *start, extent);
		return status;
	}

	return 0;
}
Пример #2
0
int
sys_aspace_map_pmem(
	id_t       id,
	paddr_t    pmem,
	vaddr_t    start,
	size_t     extent
)
{
	int status;

	if (current->uid != 0)
		return -EPERM;

	if ((id < UASPACE_MIN_ID) || (id > UASPACE_MAX_ID))
		return -EINVAL;

	/* Only allow user-space to map user memory */
	get_cpu_var(umem_only) = true;
	status = aspace_map_pmem(id, pmem, start, extent);
	get_cpu_var(umem_only) = false;

	return status;
}
Пример #3
0
int
aspace_map_region(
	id_t         id,
	vaddr_t      start,
	size_t       extent,
	vmflags_t    flags,
	vmpagesize_t pagesz,
	const char * name,
	paddr_t      pmem
)
{
	int status;

	if ((status = aspace_add_region(id, start, extent, flags, pagesz, name)))
		return status;

	if ((status = aspace_map_pmem(id, pmem, start, extent))) {
		aspace_del_region(id, start, extent);
		return status;
	}

	return 0;
}
Пример #4
0
static void* map( paddr_t paddr, size_t extent )
{
    id_t my_id;
    int status;
    vaddr_t vstart;

//    Debug1( "paddr=%#lx extent=%#lx\n", paddr, extent );

    if ( ( status = aspace_get_myid( &my_id ) ) ) {
        printf("ERROR: aspace_get_myid() status=%d\n", status);
        return (void*) -1;
    }

    if ( ( status = aspace_find_hole( my_id, 0, extent,
                                      PAGE_SIZE, &vstart ) ) ) {
        printf("ERROR: aspace_find_hole() status=%d\n", status);
        return (void*) -1;
    }

//    Debug1("vstart=%#lx\n",vstart);
    if ( ( status = aspace_add_region( my_id, vstart, extent,
                                       VM_READ | VM_WRITE | VM_USER, PAGE_SIZE, "application") ) ) {
        printf("ERROR: aspace_add_region() status=%d\n", status);
        return (void*) -1;
    }

    if ( ( status = aspace_map_pmem( my_id, paddr, vstart, extent ) ) ) {
        printf("ERROR: aspace_map_pmem() status=%d\n", status);
        aspace_del_region( my_id, vstart, extent );
        return (void*) -1;
    }

//    Debug1( "paddr=%#lx vstart=%#lx len=%#lx\n", paddr, vstart, extent );

    return (void*) vstart;
}