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; }
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; }
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; }
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; }