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