aboutsummaryrefslogtreecommitdiff
path: root/src/mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem.c')
-rw-r--r--src/mem.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/mem.c b/src/mem.c
new file mode 100644
index 0000000..1581bdc
--- /dev/null
+++ b/src/mem.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <mem.h>
+#include <log.h>
+
+// TODO: Better data structure
+struct memory {
+ size_t size;
+ vaddr virt; // for vm
+ void *physical; // actually alloced
+ struct memory *next;
+};
+
+static struct memory *memory = 0;
+static struct memory *head = 0;
+
+static uint64_t zero = 0;
+
+void *mem_alloc(size_t size, vaddr virt)
+{
+ if (head) {
+ memory->next = malloc(sizeof(*head));
+ memory = memory->next;
+ } else {
+ head = malloc(sizeof(*head));
+ memory = head;
+ }
+ memory->size = size;
+ memory->virt = virt;
+ memory->physical = calloc(1, size);
+ memory->next = 0;
+ return memory->physical;
+}
+
+void *mem_phys(vaddr virt)
+{
+ struct memory *iterator = head;
+ while (iterator) {
+ if (virt >= iterator->virt &&
+ virt < iterator->virt + iterator->size)
+ return iterator->physical + (virt - iterator->virt);
+ iterator = iterator->next;
+ }
+ errln("illegal memory access %x", virt);
+ return &zero;
+}
+
+void mem_free_all(void)
+{
+ struct memory *iterator = head;
+ while (iterator) {
+ free(iterator->physical);
+ struct memory *temp = iterator->next;
+ free(iterator);
+ iterator = temp;
+ }
+}