From 412925a790caf53738d002d51cab1ff4f7c0ae26 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sun, 18 Oct 2020 14:25:06 -0400 Subject: [PATCH] switch from multiboot to multiboot2 --- Rsconscript | 2 +- src/boot.S | 30 +++++++++++++++--------------- src/kernel_main.c | 42 ++++++++++++++++++++++++++++++++++++------ 3 files changed, 52 insertions(+), 22 deletions(-) diff --git a/Rsconscript b/Rsconscript index af7e747..b0c3b61 100644 --- a/Rsconscript +++ b/Rsconscript @@ -24,7 +24,7 @@ build do File.open("#{tmpdir}/iso/boot/grub/grub.cfg", "wb") do |fh| fh.write(< -void kernel_main(uint32_t mbinfo) +uint32_t * fb; +uint32_t pitch; +uint32_t width; +uint32_t height; + +static uint32_t * process_mbinfo_tag(uint32_t * mbinfo) { - volatile uint32_t * mbi = (volatile uint32_t *)mbinfo; - volatile uint32_t * fb = (volatile uint32_t *)mbi[88 / 4]; - uint32_t pitch = mbi[96 / 4]; - uint32_t width = mbi[100 / 4]; - uint32_t height = mbi[104 / 4]; + uint32_t type = mbinfo[0]; + uint32_t size = mbinfo[1]; + switch (type) + { + case 0u: + return 0u; + + case 8u: + fb = (uint32_t *)mbinfo[2]; + pitch = mbinfo[4]; + width = mbinfo[5]; + height = mbinfo[6]; + break; + } + return (uint32_t *)(((uint32_t)mbinfo + size + 7u) & 0xFFFFFFF8u); +} + +static void process_mbinfo(uint32_t * mbinfo) +{ + /* Skip multiboot2 boot information header. */ + mbinfo += 2u; + do + { + mbinfo = process_mbinfo_tag(mbinfo); + } while (mbinfo != (uint32_t *)0u); +} + +void kernel_main(uint32_t * mbinfo) +{ + process_mbinfo(mbinfo); for (uint32_t row = 0u; row < height; row++) { for (uint32_t col = 0u; col < width; col++)