From bd7d4366b6643b5c6cd04f40dd32f5d9c9575fd6 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Fri, 5 Aug 2022 14:33:51 +0200 Subject: organised files; switched to recursive make --- kernel/src/boot/multiboot2.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 kernel/src/boot/multiboot2.c (limited to 'kernel/src/boot/multiboot2.c') diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c new file mode 100644 index 0000000..e228ce1 --- /dev/null +++ b/kernel/src/boot/multiboot2.c @@ -0,0 +1,41 @@ +#include +#include +#include + +fb_t fb; + +/* 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) +{ + if (multiboot_magic != MB2_MAGIC) { + // not loaded by multiboot2 bootloader + __asm__ volatile ("hlt;"); + } + + // we will store framebuffer information here + static mb2_tag_fb* tag_fb; + + // skip first 8 bytes (total_size + reserved) + mb2_tag_header* tag_header = multiboot_bootinfo + 1; + + while (tag_header->type != MB2_TAG_END) { + // process tag_type + switch(tag_header->type) { + case MB2_TAG_FB: + tag_fb = (mb2_tag_fb*)tag_header; + break; + default: + break; + } + + // next mb2_tag + tag_header += tag_header->size / 8 + ((tag_header->size % 8) > 0); + } + + fb.addr = tag_fb->framebuffer_addr; + fb.width = tag_fb->framebuffer_width; + fb.height = tag_fb->framebuffer_height; + fb.pitch = tag_fb->framebuffer_pitch; + fb.bpp = tag_fb->framebuffer_bpp; +} -- cgit v1.2.3