summaryrefslogtreecommitdiffstats
path: root/hal/memory.h
diff options
context:
space:
mode:
Diffstat (limited to 'hal/memory.h')
-rw-r--r--hal/memory.h55
1 files changed, 44 insertions, 11 deletions
diff --git a/hal/memory.h b/hal/memory.h
index ab5f6ad..84cb7f2 100644
--- a/hal/memory.h
+++ b/hal/memory.h
@@ -4,7 +4,27 @@
#include "hal/obj.h"
#include "api/syscall.h"
#include "sys/syscall.h"
+#include "lib/bitmap.h"
#include <stdbool.h>
+#include <stdatomic.h>
+
+typedef uintptr_t physaddr_t;
+typedef uintptr_t virtaddr_t;
+typedef unsigned short shmem_off_t;
+
+/**Represents a region of alloc-able memory.
+ * */
+typedef struct jove_memory_region
+{
+ struct jove_memory_region *next;
+ struct jove_memory_region *prev;
+ atomic_flag lock;
+ bool toplevel;
+ struct bitmap bitmap;
+} jove_region_t;
+
+#define JOVE_REGION_GRANULARITY BITMAP_BLOCK_BITS
+#define JOVE_REGION_OVERHEAD(pages) (sizeof(jove_region_t) + ((pages) + JOVE_REGION_GRANULARITY-1) / JOVE_REGION_GRANULARITY)
typedef struct jove_obj_untyped
{
@@ -13,34 +33,47 @@ typedef struct jove_obj_untyped
#define JOVE_UNTYPED_MINSIZE 0x10
-void mem_setup_untyped(void);
+void mem_setup_regions(void);
+
+physaddr_t phys_fromvirt(virtaddr_t virt);
+void *phys_tovirt(physaddr_t phys);
+
+jove_region_t *region_from_addr(physaddr_t addr);
+jove_region_t *region_data(jove_owned_obj_t *region_obj);
+physaddr_t region_base(jove_owned_obj_t *region_obj);
+unsigned int region_pages(jove_owned_obj_t *region_obj);
+unsigned int region_freepages(jove_owned_obj_t *region_obj);
+
+void region_new(jove_owned_obj_t *dest_obj, physaddr_t base, size_t pages);
+int region_split(jove_owned_obj_t *source_obj, jove_owned_obj_t *dest_obj, size_t pages);
+int region_release(jove_owned_obj_t *region_obj);
-void *phys_tovirt(uintptr_t phys);
+int region_alloc(jove_owned_obj_t *region_obj, jove_owned_obj_t *dest_obj);
+int region_alloc_contig(jove_owned_obj_t *region_obj, jove_owned_obj_t *dest_obj, size_t pages);
uintptr_t untyped_address(jove_owned_obj_t *tgt);
size_t untyped_size(jove_owned_obj_t *tgt);
int untyped_split(jove_owned_obj_t *tgt, jove_owned_obj_t *dst, size_t bytes);
int untyped_merge(jove_owned_obj_t *a, jove_owned_obj_t *b);
-int untyped_retype(jove_owned_obj_t *tgt, uint8_t newtype);
-void pagedir_invlpg(uintptr_t vptr);
+void pagedir_invlpg(virtaddr_t vptr);
-uintptr_t *pagedir_get_mapping(
- jove_owned_obj_t *pagedir, uintptr_t vptr);
+virtaddr_t *pagedir_get_mapping(
+ jove_owned_obj_t *pagedir, virtaddr_t vptr);
-uintptr_t pagedir_ident_from_mapping(uintptr_t *mapping);
-void pagedir_mapping_set_present(uintptr_t *mapping, bool present);
+virtaddr_t pagedir_ident_from_mapping(virtaddr_t *mapping);
+void pagedir_mapping_set_present(virtaddr_t *mapping, bool present);
int pagedir_map_untyped_frame(
jove_owned_obj_t *tgt, jove_perm_obj_t *untyped_obj,
- uintptr_t vptr, struct syscall_pagedir_flags flg);
+ virtaddr_t vptr, struct syscall_pagedir_flags flg);
int pagedir_map_untyped_table(
jove_owned_obj_t *tgt, jove_perm_obj_t *untyped_obj,
- uintptr_t vptr);
+ virtaddr_t vptr);
int pagedir_map_shmem_frame(
jove_owned_obj_t *tgt, jove_perm_obj_t *shmem_obj, uint8_t page_offset,
- uintptr_t vptr, struct syscall_pagedir_flags flg);
+ virtaddr_t vptr, struct syscall_pagedir_flags flg);
int pagedir_unmap_untyped_frame(
jove_owned_obj_t *tgt, jove_owned_obj_t *dst, uintptr_t vptr);