limine/test/stivale.c
2021-11-10 10:41:25 +04:00

69 lines
2.7 KiB
C

#include <stivale.h>
#include <stdint.h>
#include <e9print.h>
#include <stddef.h>
static uint8_t stack[4096] = {0};
void stivale_main(struct stivale_struct *info);
__attribute__((section(".stivalehdr"), used))
struct stivale_header header = {
.stack = (uint64_t)(uintptr_t)stack + sizeof(stack),
.framebuffer_bpp = 0,
.framebuffer_width = 0,
.framebuffer_height = 0,
.flags = (1 << 3) | (1 << 4),
.entry_point = (uint64_t)(uintptr_t)stivale_main
};
void stivale_main(struct stivale_struct *info) {
e9_printf("Stivale struct at %x", info);
e9_puts("Stivale information passed to the kernel:");
e9_printf("Cmdline: %s", (char*)info->cmdline);
e9_printf("Memory map at %x with contents:", info->memory_map_addr);
struct stivale_mmap_entry *memmap = ((struct stivale_mmap_entry *)(info->memory_map_addr));
for (size_t i = 0; i < info->memory_map_entries; i++) {
struct stivale_mmap_entry e = memmap[i];
e9_printf("\tEntry %d: [%x+%x] %x", i, e.base, e.length, e.type);
}
e9_printf("Framebuffer at %x with specifics:", info->framebuffer_addr);
e9_printf("\tPitch: %d", info->framebuffer_pitch);
e9_printf("\tWidth: %d", info->framebuffer_width);
e9_printf("\tHeight: %d", info->framebuffer_height);
e9_printf("\tBPP: %d", info->framebuffer_bpp);
if (info->flags & (1 << 1)) {
e9_printf("\tExtended colour information provided:");
e9_printf("\t\tMemory model: %d", info->fb_memory_model);
e9_printf("\t\tRed mask size: %d", info->fb_red_mask_size);
e9_printf("\t\tRed mask shift: %d", info->fb_red_mask_shift);
e9_printf("\t\tGreen mask size: %d", info->fb_green_mask_size);
e9_printf("\t\tGreen mask shift: %d", info->fb_green_mask_shift);
e9_printf("\t\tBlue mask size: %d", info->fb_blue_mask_size);
e9_printf("\t\tBlue mask shift: %d", info->fb_blue_mask_shift);
}
if (info->flags & (1 << 2)) {
e9_printf("\tSMBIOS information provided:");
e9_printf("\t\t32-bit entry: %x", info->smbios_entry_32);
e9_printf("\t\t64-bit entry: %x", info->smbios_entry_64);
}
e9_printf("RSDP at %x", info->rsdp);
e9_printf("Module map at %x with modules:", info->modules);
struct stivale_module *modules = ((struct stivale_module *)(info->modules));
for (size_t i = 0; i < info->module_count; i++) {
struct stivale_module e = *modules;
e9_printf("\tModule %d: [%x->%x] %s", i, e.begin, e.end, e.string);
modules = (struct stivale_module *)e.next;
}
e9_printf("Epoch is %x", info->epoch);
e9_printf("Flags are %x", info->flags);
// Guru meditation.
for (;;);
}