X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=kitten%2Fuser%2Fliblwk%2Faspace.c;fp=kitten%2Fuser%2Fliblwk%2Faspace.c;h=176dd758ffe34fdfe1e4cb6e32faf646f0532304;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=0000000000000000000000000000000000000000;hpb=f7cf9c19ecb0a589dd45ae0d2c91814bd3c2acc2;p=palacios.git diff --git a/kitten/user/liblwk/aspace.c b/kitten/user/liblwk/aspace.c new file mode 100644 index 0000000..176dd75 --- /dev/null +++ b/kitten/user/liblwk/aspace.c @@ -0,0 +1,58 @@ +/* Copyright (c) 2008, Sandia National Laboratories */ + +#include + +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; +} + +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; +}