summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/mm/heap.h50
-rw-r--r--src/include/toxic/config.h11
2 files changed, 61 insertions, 0 deletions
diff --git a/src/include/mm/heap.h b/src/include/mm/heap.h
new file mode 100644
index 0000000..4c55ae4
--- /dev/null
+++ b/src/include/mm/heap.h
@@ -0,0 +1,50 @@
+#ifndef HEAP_H
+#define HEAP_H
+#include <stddef.h>
+#include <toxic/config.h>
+
+/*
+ * Heap table consists of an array of 1-byte long entries describing
+ * each PAGE_SIZE region inside the heap.
+ */
+
+/*
+ * Each entry in the heap table is 1byte long, where:
+ *
+ * bit 7: Set when next page in this heap belongs to the same allocation
+ * bit 6: Set when the current page in the first in this allocation map
+ * bit 5-1: Reserved
+ * bit 0: Used flag
+ */
+#define HEAP_ENTRY_INUSE 0x1
+#define HEAP_ENTRY_FREE 0x0
+
+#define HEAP_ENTRY_HAS_NEXT 0x80 /* 0b1000000 */
+#define HEAP_ENTRY_IS_FIRST 0x40 /* 0b01000000 */
+
+
+#define HEAP_ENTRY_USED_MASK ((unsigned char) 0x01)
+/*
+ * Define a macro for entry size so in future
+ * I can turn this into a proper structure
+ */
+#define HEAP_ENTRY_SIZE (sizeof(unsigned char))
+
+struct heap_table {
+ unsigned char *entries;
+ size_t count;
+};
+
+/* Heap descriptor */
+struct heap {
+ struct heap_table *table;
+ void *start_addr;
+};
+
+int heap_create(struct heap *heap, void *start, void *end,
+ struct heap_table *tbl);
+
+void * heap_malloc(struct heap *heap, size_t size);
+void heap_free(struct heap *heap, void *ptr);
+
+#endif /* HEAP_H */
diff --git a/src/include/toxic/config.h b/src/include/toxic/config.h
new file mode 100644
index 0000000..19d05a9
--- /dev/null
+++ b/src/include/toxic/config.h
@@ -0,0 +1,11 @@
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#define TOTAL_INTERRUPTS 512
+#define KERNEL_CODE_SELECTOR 0x08
+#define KERNEL_DATA_SELECTOR 0x010
+
+/* Kernel heap settings */
+#define PAGE_SIZE (4096)
+
+#endif /* CONFIG_H */