git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
feat: (vm) memory mapping support: mmap/munmap
[lunaix-os.git]
/
lunaix-os
/
kernel
/
mm
/
region.c
diff --git
a/lunaix-os/kernel/mm/region.c
b/lunaix-os/kernel/mm/region.c
index d9fddeb0688da964512df788207637f959e6e0dd..0e0982d7d2d9b0915ed6065c7fb90deb79c000e0 100644
(file)
--- a/
lunaix-os/kernel/mm/region.c
+++ b/
lunaix-os/kernel/mm/region.c
@@
-1,65
+1,71
@@
-#include <lunaix/mm/kalloc.h>
#include <lunaix/mm/region.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)
{
unsigned long start,
unsigned long end,
unsigned int attr)
{
- struct mm_region* region =
lxm
alloc(sizeof(struct mm_region));
+ struct mm_region* region =
v
alloc(sizeof(struct mm_region));
*region = (struct mm_region){ .attr = attr, .end = end, .start = start };
*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
}
void
-region_release_all(struct
mm_region** regions
)
+region_release_all(struct
llist_header* lead
)
{
struct mm_region *pos, *n;
{
struct mm_region *pos, *n;
- llist_for_each(pos, n,
&(*regions)->h
ead, head)
+ llist_for_each(pos, n,
l
ead, head)
{
{
-
lx
free(pos);
+
v
free(pos);
}
}
-
- *regions = NULL;
}
void
}
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;
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_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;
return NULL;
}
struct mm_region *pos, *n;
- llist_for_each(pos, n,
&(*regions)->h
ead, head)
+ llist_for_each(pos, n,
l
ead, head)
{
{
- if (
vaddr >= pos->start
&& vaddr < pos->end) {
+ if (
pos->start <= vaddr
&& vaddr < pos->end) {
return pos;
}
}
return pos;
}
}