diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/apos/mem.h | 3 | ||||
| -rw-r--r-- | include/apos/mem_nodes.h | 12 | ||||
| -rw-r--r-- | include/apos/sp_tree.h | 36 | ||||
| -rw-r--r-- | include/apos/utils.h | 17 | ||||
| -rw-r--r-- | include/apos/vmem.h | 29 |
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 */ |
