summaryrefslogtreecommitdiff
path: root/kernel/bump.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/bump.c')
-rw-r--r--kernel/bump.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/kernel/bump.c b/kernel/bump.c
new file mode 100644
index 0000000..369f92f
--- /dev/null
+++ b/kernel/bump.c
@@ -0,0 +1,49 @@
+#include <bump.h>
+#include <common.h>
+
+static char eheap[EHEAP_SIZE] = {0};
+static size_t eheap_off = 0;
+
+struct mem_info *km_find_memory(struct dt_node *head) {
+ struct dt_node *child = head->children;
+ while (child) {
+ return km_find_memory(child);
+ child = child->next;
+ }
+
+ if (strlen(head->name) != 0) {
+ struct dt_prop *prop_head = head->props;
+ while (prop_head) {
+ if (strcmp(prop_head->name, "device_type") == 0
+ && strcmp(prop_head->value, "memory") == 0) {
+ size_t len = 0;
+ uint32_t *reg = (uint32_t *)dt_get_prop(head, "reg", &len);
+ if (reg && len >= 8) {
+ uint32_t base = be32_to_cpu(reg[0]);
+ uint32_t size = be32_to_cpu(reg[1]);
+ struct mem_info *ret = kemalloc(sizeof(struct mem_info));
+ ret->start = (void*)base;
+ ret->size = (size_t)size;
+
+ return ret;
+ }
+ }
+ prop_head = prop_head->next;
+ }
+ }
+ return NULL;
+}
+
+
+void* kemalloc(size_t size) {
+ size = (size + 7) & ~7;
+
+ if (eheap_off + size > EHEAP_SIZE) {
+ return NULL;
+ }
+
+ void *ptr = &eheap[eheap_off];
+ eheap_off += size;
+ return ptr;
+}
+