From 501a706643a056863b6ea214882a2be270966f87 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Tue, 16 Aug 2022 18:03:58 +0200 Subject: libk/list.h; reading mmap from multiboot2 --- kernel/src/boot/multiboot2.c | 64 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 11 deletions(-) (limited to 'kernel/src/boot') 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 #include -#include #include +#include +#include +#include +#include + #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); } -- cgit v1.2.3