1 #include <lunaix/mm/page.h>
2 #include <lunaix/mm/region.h>
3 #include <lunaix/mm/valloc.h>
4 #include <lunaix/spike.h>
6 #include <klibc/string.h>
9 region_create(ptr_t start, ptr_t end, u32_t attr)
11 assert_msg(PG_ALIGNED(start), "not page aligned");
12 assert_msg(PG_ALIGNED(end), "not page aligned");
13 struct mm_region* region = valloc(sizeof(struct mm_region));
15 (struct mm_region){ .attr = attr, .start = start, .end = end - 1 };
20 region_create_range(ptr_t start, size_t length, u32_t attr)
22 assert_msg(PG_ALIGNED(start), "not page aligned");
23 assert_msg(PG_ALIGNED(length), "not page aligned");
24 struct mm_region* region = valloc(sizeof(struct mm_region));
25 *region = (struct mm_region){ .attr = attr,
27 .end = start + length - 1 };
32 region_add(vm_regions_t* lead, struct mm_region* vmregion)
34 if (llist_empty(lead)) {
35 llist_append(lead, &vmregion->head);
40 struct mm_region *pos = (struct mm_region*)lead,
41 *n = list_entry(lead->next, struct mm_region, head);
43 if (vmregion->start >= cur_end && vmregion->end <= n->start) {
48 n = list_entry(n->head.next, struct mm_region, head);
49 } while ((ptr_t)&pos->head != (ptr_t)lead);
51 // XXX caution. require mm_region::head to be the lead of struct
52 llist_insert_after(&pos->head, &vmregion->head);
56 region_release_all(vm_regions_t* lead)
58 struct mm_region *pos, *n;
60 llist_for_each(pos, n, lead, head)
67 region_copy(vm_regions_t* src, vm_regions_t* dest)
73 struct mm_region *pos, *n, *dup;
75 llist_for_each(pos, n, src, head)
77 dup = valloc(sizeof(struct mm_region));
78 memcpy(dup, pos, sizeof(*pos));
79 region_add(dest, dup);
84 region_get(vm_regions_t* lead, unsigned long vaddr)
86 if (llist_empty(lead)) {
90 struct mm_region *pos, *n;
92 llist_for_each(pos, n, lead, head)
94 if (pos->start <= vaddr && vaddr < pos->end) {