#include <stdint.h> #include <stddef.h> #include <limine.h> // The Limine requests can be placed anywhere, but it is important that // the compiler does not optimise them away, so, usually, they should // be made volatile or equivalent. static volatile struct limine_terminal_request terminal_request = { .id = LIMINE_TERMINAL_REQUEST, .revision = 0 }; static void done(void) { for (;;) { asm ("hlt"); } } // Our quick and dirty strlen() implementation. size_t strlen(const char *str) { size_t ret = 0; while (*str++) { ret++; } return ret; } // The following will be our kernel's entry point. void _start(void) { // Ensure we got a terminal if (terminal_request.response == NULL || terminal_request.response->terminal_count < 1) { done(); } // We should now be able to call the Limine terminal to print out // a simple "Hello World" to screen. const char *hello_msg = "Hello World"; struct limine_terminal *terminal = terminal_request.response->terminals[0]; terminal_request.response->write(terminal, hello_msg, strlen(hello_msg)); // We're done, just hang... done(); }