aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/apos/mem.h3
-rw-r--r--include/apos/mem_nodes.h12
-rw-r--r--include/apos/sp_tree.h36
-rw-r--r--include/apos/utils.h17
-rw-r--r--include/apos/vmem.h29
5 files changed, 88 insertions, 9 deletions
diff --git a/include/apos/mem.h b/include/apos/mem.h
index 7c5a2dc..0b3bffd 100644
--- a/include/apos/mem.h
+++ b/include/apos/mem.h
@@ -39,4 +39,7 @@ extern size_t __mm_max_order;
void init_mem(size_t max_order, size_t shifts[10], size_t page_shift);
enum mm_mode_t get_mmode(void *fdt);
+#define BASE_PAGE_SIZE (__o_size(BASE_PAGE))
+#define BASE_PAGE (MM_O0)
+
#endif /* APOS_MEM_H */
diff --git a/include/apos/mem_nodes.h b/include/apos/mem_nodes.h
new file mode 100644
index 0000000..a10e4ea
--- /dev/null
+++ b/include/apos/mem_nodes.h
@@ -0,0 +1,12 @@
+#ifndef MM_NODES_H
+#define MM_NODES_H
+
+#include <apos/vmem.h>
+
+void init_mem_blocks();
+void destroy_mem_blocks();
+
+struct sp_mem *get_mem_node();
+void free_mem_node(struct sp_mem *m);
+
+#endif /* MM_NODES_H */
diff --git a/include/apos/sp_tree.h b/include/apos/sp_tree.h
new file mode 100644
index 0000000..bbf9f9f
--- /dev/null
+++ b/include/apos/sp_tree.h
@@ -0,0 +1,36 @@
+#ifndef SP_TREE_H
+#define SP_TREE_H
+
+#define sp_root(r) (r.sp_r)
+#define sp_left(n) (n->left)
+#define sp_right(n) (n->right)
+#define sp_rparen(n) (sp_right(n)->parent)
+#define sp_lparen(n) (sp_left(n)->parent)
+#define sp_paren(n) (n->parent)
+#define sp_gparen(n) (n->parent->parent)
+#define sp_has_gparen(n) (sp_paren(n) && sp_gparen(n))
+
+struct sp_node {
+ short hint;
+ struct sp_node *left;
+ struct sp_node *right;
+ struct sp_node *parent;
+};
+
+struct sp_root {
+ struct sp_node *sp_r;
+};
+
+enum sp_dir {
+ LEFT, RIGHT
+};
+
+struct sp_node *sp_first(struct sp_node *n);
+struct sp_node *sp_last(struct sp_node *n);
+
+void sp_insert(struct sp_node **root, struct sp_node *p,
+ struct sp_node *n, enum sp_dir d);
+
+void sp_remove(struct sp_node **root, struct sp_node *n);
+
+#endif /* SP_TREE_H */
diff --git a/include/apos/utils.h b/include/apos/utils.h
index 39d5b83..881cd8f 100644
--- a/include/apos/utils.h
+++ b/include/apos/utils.h
@@ -14,10 +14,24 @@
#define GLUE2(x, y) x##y
#define GLUE(x, y) GLUE2(x, y)
+#include <apos/builtin.h>
+
+#if __has_builtin(__builtin_offsetof)
+#define offsetof(type, member) __builtin_offsetof(type, member)
+#else
+#define offsetof(type, member) ((size_t)&((type *)0)->member)
+#endif
+
+#define container_of(ptr, type, member) \
+ ((type *)((char *)(ptr) - offsetof(type, member)))
+
#include <apos/types.h>
static inline size_t align_up(size_t val, size_t a)
{
+ if(!a)
+ return val;
+
size_t rem = val % a;
if (rem == 0)
@@ -28,6 +42,9 @@ static inline size_t align_up(size_t val, size_t a)
static inline size_t align_down(size_t val, size_t a)
{
+ if(!a)
+ return val;
+
return val - (val % a);
}
diff --git a/include/apos/vmem.h b/include/apos/vmem.h
index e72f783..eb7ad17 100644
--- a/include/apos/vmem.h
+++ b/include/apos/vmem.h
@@ -1,11 +1,29 @@
#ifndef APOS_VMEM_H
#define APOS_VMEM_H
-#include <apos/pmem.h>
-
/* arch-specific data */
#include <vmem.h>
+/* common */
+#include <apos/pmem.h>
+#include <apos/sp_tree.h>
+
+struct sp_mem {
+ struct sp_node sp_n;
+
+ struct sp_mem *next;
+ struct sp_mem *prev;
+
+ char flags;
+
+ vm_t end;
+ vm_t start;
+};
+
+#define mem_container(ptr)\
+ container_of(ptr, struct sp_mem, sp_n)
+
+
/* general overview of the different functions:
* (un)map_vmem: map one known page of physical memory to one known page of
* virtual memory
@@ -29,11 +47,4 @@ vm_t map_vregion(struct vm_branch_t *branch, pm_t base, vm_t start, size_t size,
void unmap_vregion(struct vm_branch_t *branch, vm_t start);
void init_vmem(struct vm_branch_t *branch, vm_t tmp_pte);
-
-#if defined(KERNEL)
-void arch_init_vmem(struct vm_branch_t *branch, vm_t tmp_pte);
-#else
-struct vm_branch_t *arch_get_tmp_pte(struct vm_branch_t *branch);
-#endif
-
#endif /* APOS_VMEM_H */