-#include <lunaix/mm/kalloc.h>
#include <lunaix/mm/region.h>
+#include <lunaix/mm/valloc.h>
-void
-region_add(struct mm_region** regions,
+struct mm_region*
+region_add(struct llist_header* lead,
unsigned long start,
unsigned long end,
unsigned int attr)
{
- struct mm_region* region = lxmalloc(sizeof(struct mm_region));
+ struct mm_region* region = valloc(sizeof(struct mm_region));
*region = (struct mm_region){ .attr = attr, .end = end, .start = start };
- if (!*regions) {
- llist_init_head(®ion->head);
- *regions = region;
- } else {
- llist_append(&(*regions)->head, ®ion->head);
+ if (llist_empty(lead)) {
+ llist_append(lead, ®ion->head);
+ return region;
}
+
+ struct mm_region *pos, *n;
+ llist_for_each(pos, n, lead, head)
+ {
+ if (start >= pos->end && end <= n->start) {
+ break;
+ }
+ }
+
+ llist_insert_after(&pos->head, ®ion->head);
+ return region;
}
void
-region_release_all(struct mm_region** regions)
+region_release_all(struct llist_header* lead)
{
struct mm_region *pos, *n;
- llist_for_each(pos, n, &(*regions)->head, head)
+ llist_for_each(pos, n, lead, head)
{
- lxfree(pos);
+ vfree(pos);
}
-
- *regions = NULL;
}
void
-region_copy(struct mm_region** src, struct mm_region** dest)
+region_copy(struct llist_header* src, struct llist_header* dest)
{
- if (!*src) {
+ if (!src) {
return;
}
struct mm_region *pos, *n;
- llist_init_head(*dest);
- llist_for_each(pos, n, &(*src)->head, head)
+ llist_for_each(pos, n, src, head)
{
region_add(dest, pos->start, pos->end, pos->attr);
}
}
struct mm_region*
-region_get(struct mm_region** regions, unsigned long vaddr)
+region_get(struct llist_header* lead, unsigned long vaddr)
{
- if (!*regions) {
+ if (llist_empty(lead)) {
return NULL;
}
struct mm_region *pos, *n;
- llist_for_each(pos, n, &(*regions)->head, head)
+ llist_for_each(pos, n, lead, head)
{
- if (vaddr >= pos->start && vaddr < pos->end) {
+ if (pos->start <= vaddr && vaddr < pos->end) {
return pos;
}
}