summaryrefslogtreecommitdiff
path: root/kernel/src/boot/multiboot2.c
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-08-05 14:33:51 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-08-05 14:33:51 +0200
commitbd7d4366b6643b5c6cd04f40dd32f5d9c9575fd6 (patch)
tree92429e897be007d46c8f063a39a986df2124111a /kernel/src/boot/multiboot2.c
parentbe3274c49d0ca5e31daa855c4c109d830fdead67 (diff)
organised files; switched to recursive make
Diffstat (limited to 'kernel/src/boot/multiboot2.c')
-rw-r--r--kernel/src/boot/multiboot2.c41
1 files changed, 41 insertions, 0 deletions
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 <stdint.h>
+#include <multiboot2.h>
+#include <graphics.h>
+
+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;
+}