1 #include <lunaix/mm/region.h>
2 #include <lunaix/mm/valloc.h>
4 #include <klibc/string.h>
7 region_create(ptr_t start, ptr_t end, u32_t attr)
9 return valloc(sizeof(struct mm_region));
13 region_add(vm_regions_t* lead, struct mm_region* vmregion)
15 if (llist_empty(lead)) {
16 llist_append(lead, &vmregion->head);
21 struct mm_region *pos = (struct mm_region*)lead,
22 *n = list_entry(lead->next, struct mm_region, head);
24 if (vmregion->start >= cur_end && vmregion->end <= n->start) {
29 n = list_entry(n->head.next, struct mm_region, head);
30 } while ((ptr_t)&pos->head != (ptr_t)lead);
32 // XXX caution. require mm_region::head to be the lead of struct
33 llist_insert_after(&pos->head, &vmregion->head);
37 region_release_all(vm_regions_t* lead)
39 struct mm_region *pos, *n;
41 llist_for_each(pos, n, lead, head)
48 region_copy(vm_regions_t* src, vm_regions_t* dest)
54 struct mm_region *pos, *n, *dup;
56 llist_for_each(pos, n, src, head)
58 dup = valloc(sizeof(struct mm_region));
59 memcpy(dup, pos, sizeof(*pos));
60 region_add(dest, dup);
65 region_get(vm_regions_t* lead, unsigned long vaddr)
67 if (llist_empty(lead)) {
71 struct mm_region *pos, *n;
73 llist_for_each(pos, n, lead, head)
75 if (pos->start <= vaddr && vaddr < pos->end) {