From a97b7b146663abd0e3337b67641daefc3ac638ce Mon Sep 17 00:00:00 2001 From: mintsuki Date: Wed, 8 Mar 2023 08:21:58 +0100 Subject: [PATCH] Update --- kernel/kernel.c | 71 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/kernel/kernel.c b/kernel/kernel.c index 3f67ab1..2899413 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -11,10 +11,61 @@ static volatile struct limine_terminal_request terminal_request = { .revision = 0 }; -static void done(void) { - for (;;) { - asm ("hlt"); +// GCC and Clang reserve the right to generate calls to the following +// 4 functions even if they are not directly called. +// Implement them as the C specification mandates. +// DO NOT remove or rename these functions, or stuff will eventually break! +// They CAN be moved to a different .c file. + +void *memcpy(void *dest, const void *src, size_t n) { + uint8_t *pdest = (uint8_t *)dest; + const uint8_t *psrc = (const uint8_t *)src; + + for (size_t i = 0; i < n; i++) { + pdest[i] = psrc[i]; } + + return dest; +} + +void *memset(void *s, int c, size_t n) { + uint8_t *p = (uint8_t *)s; + + for (size_t i = 0; i < n; i++) { + p[i] = (uint8_t)c; + } + + return s; +} + +void *memmove(void *dest, const void *src, size_t n) { + uint8_t *pdest = (uint8_t *)dest; + const uint8_t *psrc = (const uint8_t *)src; + + if (src > dest) { + for (size_t i = 0; i < n; i++) { + pdest[i] = psrc[i]; + } + } else if (src < dest) { + for (size_t i = n; i > 0; i--) { + pdest[i-1] = psrc[i-1]; + } + } + + return dest; +} + +int memcmp(const void *s1, const void *s2, size_t n) { + const uint8_t *p1 = (const uint8_t *)s1; + const uint8_t *p2 = (const uint8_t *)s2; + + for (size_t i = 0; i < n; i++) { + if (p1[i] != p2[i]) { + return p1[i] < p2[i] ? -1 : 1; + } + } + + return 0; } // Our quick and dirty strlen() implementation. @@ -26,12 +77,22 @@ size_t strlen(const char *str) { return ret; } +// Halt and catch fire function. +static void hcf(void) { + asm ("cli"); + for (;;) { + asm ("hlt"); + } +} + // The following will be our kernel's entry point. +// If renaming _start() to something else, make sure to change the +// linker script accordingly. void _start(void) { // Ensure we got a terminal if (terminal_request.response == NULL || terminal_request.response->terminal_count < 1) { - done(); + hcf(); } // We should now be able to call the Limine terminal to print out @@ -42,5 +103,5 @@ void _start(void) { terminal_request.response->write(terminal, hello_msg, strlen(hello_msg)); // We're done, just hang... - done(); + hcf(); }