Merge branch 'signal-dev'
[lunaix-os.git] / lunaix-os / kernel / mm / region.c
1 #include <lunaix/mm/kalloc.h>
2 #include <lunaix/mm/region.h>
3
4 void
5 region_add(struct mm_region* regions,
6            unsigned long start,
7            unsigned long end,
8            unsigned int attr)
9 {
10     struct mm_region* region = lxmalloc(sizeof(struct mm_region));
11
12     *region = (struct mm_region){ .attr = attr, .end = end, .start = start };
13
14     llist_append(&regions->head, &region->head);
15 }
16
17 void
18 region_release_all(struct mm_region* regions)
19 {
20     struct mm_region *pos, *n;
21
22     llist_for_each(pos, n, &regions->head, head)
23     {
24         lxfree(pos);
25     }
26 }
27
28 void
29 region_copy(struct mm_region* src, struct mm_region* dest)
30 {
31     if (!src) {
32         return;
33     }
34
35     struct mm_region *pos, *n;
36
37     llist_for_each(pos, n, &src->head, head)
38     {
39         region_add(dest, pos->start, pos->end, pos->attr);
40     }
41 }
42
43 struct mm_region*
44 region_get(struct mm_region* regions, unsigned long vaddr)
45 {
46     if (!regions) {
47         return NULL;
48     }
49
50     struct mm_region *pos, *n;
51
52     llist_for_each(pos, n, &regions->head, head)
53     {
54         if (pos->start <= vaddr && vaddr < pos->end) {
55             return pos;
56         }
57     }
58     return NULL;
59 }