summaryrefslogtreecommitdiffhomepage
path: root/src/loader/impl/mb1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/loader/impl/mb1.c')
-rw-r--r--src/loader/impl/mb1.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/loader/impl/mb1.c b/src/loader/impl/mb1.c
index 4aa267a..e713dd7 100644
--- a/src/loader/impl/mb1.c
+++ b/src/loader/impl/mb1.c
@@ -4,6 +4,7 @@
#include <elf.h>
#include <impl/mb1.h>
#include <lib.h>
+#include <mem.h>
#include <pnc.h>
// The address where data gets stored
@@ -39,6 +40,22 @@ static u32 mb1_store(void *data, u32 size)
return MB1_LOAD_ADDRESS + (offset - size);
}
+static void mb1_store_mmap(struct mb1_info *info)
+{
+ struct mem_map *mem_map = mem_map_get();
+ info->flags |= MB1_INFO_MEM_MAP;
+ info->mmap_length = mem_map->count * sizeof(struct mb1_mmap_entry);
+ info->mmap_addr = mb1_store(NULL, 0);
+ for (u32 i = 0; i < mem_map->count; i++) {
+ struct mb1_mmap_entry mmap_entry;
+ mmap_entry.struct_size = sizeof(mmap_entry) - 4;
+ mmap_entry.addr_low = mem_map->entry[i].base;
+ mmap_entry.len_low = mem_map->entry[i].length;
+ mmap_entry.type = mem_map->entry[i].type;
+ mb1_store(&mmap_entry, sizeof(mmap_entry));
+ }
+}
+
// Load the mb1 structs into memory
static void mb1_load(struct mb1_entry *entry)
{
@@ -55,6 +72,10 @@ static void mb1_load(struct mb1_entry *entry)
info->flags |= MB1_INFO_BOOT_LOADER_NAME;
char loader_name[] = "SegelBoot";
info->boot_loader_name = mb1_store(loader_name, sizeof(loader_name));
+
+ // Set memory map
+ /* if (entry->flags & 2) TODO */
+ mb1_store_mmap(info);
}
// Jump to kernel with correct info pointer in eax