X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=kitten%2Fuser%2Fliblwk%2Fpmem.c;fp=kitten%2Fuser%2Fliblwk%2Fpmem.c;h=800ffaf587a4175a7bd7068e7fbdf3b90c1221f9;hb=66a1a4c7a9edcd7d8bc207aca093d694a6e6b5b2;hp=0000000000000000000000000000000000000000;hpb=f7cf9c19ecb0a589dd45ae0d2c91814bd3c2acc2;p=palacios.git diff --git a/kitten/user/liblwk/pmem.c b/kitten/user/liblwk/pmem.c new file mode 100644 index 0000000..800ffaf --- /dev/null +++ b/kitten/user/liblwk/pmem.c @@ -0,0 +1,67 @@ +/* Copyright (c) 2008, Sandia National Laboratories */ + +#include + +const char * +pmem_type_to_string(pmem_type_t type) +{ + switch(type) { + case PMEM_TYPE_BOOTMEM: return "BOOTMEM"; break; + case PMEM_TYPE_BIGPHYSAREA: return "BIGPHYSAREA"; break; + case PMEM_TYPE_INITRD: return "INITRD"; break; + case PMEM_TYPE_INIT_TASK: return "INIT_TASK"; break; + case PMEM_TYPE_KMEM: return "KMEM"; break; + case PMEM_TYPE_UMEM: return "UMEM"; break; + } + return "UNKNOWN"; +} + +void +pmem_region_unset_all(struct pmem_region *rgn) +{ + rgn->type_is_set = false; + rgn->lgroup_is_set = false; + rgn->allocated_is_set = false; + rgn->name_is_set = false; +} + +int +pmem_alloc_umem(size_t size, size_t alignment, struct pmem_region *rgn) +{ + struct pmem_region constraint, result; + + /* Find and allocate a chunk of PMEM_TYPE_UMEM physical memory */ + pmem_region_unset_all(&constraint); + constraint.start = 0; + constraint.end = (paddr_t)(-1); + constraint.type = PMEM_TYPE_UMEM; constraint.type_is_set = true; + constraint.allocated = false; constraint.allocated_is_set = true; + + if (pmem_alloc(size, alignment, &constraint, &result)) + return -ENOMEM; + + *rgn = result; + return 0; +} + +bool +pmem_is_umem(paddr_t start, size_t extent) +{ + struct pmem_region query, result; + int status; + + pmem_region_unset_all(&query); + query.start = start; + query.end = start + extent; + query.type = PMEM_TYPE_UMEM; query.type_is_set = true; + result.end = 0; + + while ((status = pmem_query(&query, &result)) == 0) { + if (result.start != query.start) + return false; + if (result.end == query.end) + break; + query.start = result.end; + } + return (status) ? false : true; +}