Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios.git] / kitten / user / liblwk / pmem.c
1 /* Copyright (c) 2008, Sandia National Laboratories */
2
3 #include <lwk/liblwk.h>
4
5 const char *
6 pmem_type_to_string(pmem_type_t type)
7 {
8         switch(type) {
9                 case PMEM_TYPE_BOOTMEM:     return "BOOTMEM";     break;
10                 case PMEM_TYPE_BIGPHYSAREA: return "BIGPHYSAREA"; break;
11                 case PMEM_TYPE_INITRD:      return "INITRD";      break;
12                 case PMEM_TYPE_INIT_TASK:   return "INIT_TASK";   break;
13                 case PMEM_TYPE_KMEM:        return "KMEM";        break;
14                 case PMEM_TYPE_UMEM:        return "UMEM";        break;
15         }
16         return "UNKNOWN";
17 }
18
19 void
20 pmem_region_unset_all(struct pmem_region *rgn)
21 {
22         rgn->type_is_set      = false;
23         rgn->lgroup_is_set    = false;
24         rgn->allocated_is_set = false;
25         rgn->name_is_set      = false;
26 }
27
28 int
29 pmem_alloc_umem(size_t size, size_t alignment, struct pmem_region *rgn)
30 {
31         struct pmem_region constraint, result;
32
33         /* Find and allocate a chunk of PMEM_TYPE_UMEM physical memory */
34         pmem_region_unset_all(&constraint);
35         constraint.start     = 0;
36         constraint.end       = (paddr_t)(-1);
37         constraint.type      = PMEM_TYPE_UMEM; constraint.type_is_set = true;
38         constraint.allocated = false;          constraint.allocated_is_set = true;
39
40         if (pmem_alloc(size, alignment, &constraint, &result))
41                 return -ENOMEM;
42
43         *rgn = result;
44         return 0;
45 }
46
47 bool
48 pmem_is_umem(paddr_t start, size_t extent)
49 {
50         struct pmem_region query, result;
51         int status;
52
53         pmem_region_unset_all(&query);
54         query.start = start;
55         query.end   = start + extent;
56         query.type  = PMEM_TYPE_UMEM; query.type_is_set = true; 
57         result.end  = 0;
58
59         while ((status = pmem_query(&query, &result)) == 0) {
60                 if (result.start != query.start)
61                         return false;
62                 if (result.end == query.end)
63                         break;
64                 query.start = result.end;
65         }
66         return (status) ? false : true;
67 }