radix-old/kernel/kernel.c
2023-02-28 12:41:28 +01:00

46 lines
1.2 KiB
C

#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();
}