summaryrefslogtreecommitdiff
path: root/kernel/src/boot/multiboot2.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/boot/multiboot2.c')
-rw-r--r--kernel/src/boot/multiboot2.c64
1 files changed, 53 insertions, 11 deletions
diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c
index 9c2998f..d0b0667 100644
--- a/kernel/src/boot/multiboot2.c
+++ b/kernel/src/boot/multiboot2.c
@@ -2,14 +2,59 @@
#include <multiboot2.h>
#include <graphics.h>
-#include <debug.h>
#include <paging.h>
+#include <libk/stdio.h>
+#include <libk/string.h>
+#include <libk/list.h>
+#include <heap.h>
+
#define KERNEL_VMA 0xc0000000
/* https://www.gnu.org/software/grub/manual/multiboot2/html_node/Boot-information-format.html */
-void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
+void init_fb(mb2_tag_fb* tag_fb)
+{
+ main_fb.addr = tag_fb->framebuffer_addr;
+ main_fb.width = tag_fb->framebuffer_width;
+ main_fb.height = tag_fb->framebuffer_height;
+ main_fb.pitch = tag_fb->framebuffer_pitch;
+ main_fb.bpp = tag_fb->framebuffer_bpp;
+
+ // identity map framebuffer address
+ map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE);
+ map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE);
+}
+
+void init_mmap(mb2_tag_mmap* tag_mmap)
+{
+ list_t* mmap = NULL;
+
+ // get data and store it into list
+ for (size_t i = sizeof(mb2_tag_mmap); i < tag_mmap->size; i += sizeof(mb2_tag_mmap_entry)) {
+ mb2_tag_mmap_entry* mmap_entry;
+ mmap_entry = (mb2_tag_mmap_entry*)kalloc(sizeof(mb2_tag_mmap_entry));
+ memcpy(mmap_entry, (char*)tag_mmap + i, sizeof(mb2_tag_mmap_entry));
+ add_to_list_head(&mmap, mmap_entry);
+ }
+
+ // print data from list
+ for (list_t* tmp = mmap; tmp != NULL; tmp = tmp->next) {
+ mb2_tag_mmap_entry* mmap_entry;
+ mmap_entry = tmp->data;
+ printf("base_addr: 0x%x, length: 0x%x, type: %d\n", mmap_entry->base_addr, mmap_entry->length, mmap_entry->type);
+ }
+
+ // free data
+ for (list_t* tmp = mmap; tmp != NULL; tmp = tmp->next) {
+ kfree(tmp->data);
+ }
+
+ // free list
+ free_list(&mmap);
+}
+
+void read_mb2(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
{
if (multiboot_magic != MB2_MAGIC) {
// not loaded by multiboot2 bootloader
@@ -18,6 +63,7 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
// we will store framebuffer information here
static mb2_tag_fb* tag_fb;
+ static mb2_tag_mmap* tag_mmap;
// skip first 8 bytes (total_size + reserved)
mb2_tag_header* tag_header = (mb2_tag_header*)((char*)multiboot_bootinfo + 8 + KERNEL_VMA);
@@ -28,6 +74,9 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
case MB2_TAG_FB:
tag_fb = (mb2_tag_fb*)tag_header;
break;
+ case MB2_TAG_MMAP:
+ tag_mmap = (mb2_tag_mmap*)tag_header;
+ break;
default:
break;
}
@@ -36,13 +85,6 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic)
tag_header += tag_header->size / 8 + ((tag_header->size % 8) > 0);
}
- main_fb.addr = tag_fb->framebuffer_addr;
- main_fb.width = tag_fb->framebuffer_width;
- main_fb.height = tag_fb->framebuffer_height;
- main_fb.pitch = tag_fb->framebuffer_pitch;
- main_fb.bpp = tag_fb->framebuffer_bpp;
-
- // identity map framebuffer address
- map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE);
- map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE);
+ init_fb(tag_fb);
+ init_mmap(tag_mmap);
}