From aaf7355c5ededfcdc877c7f2989fb1ba02dfb848 Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Mon, 27 May 2024 13:53:52 -0500 Subject: libk: create a subset libc for kernel use Create a subset of the C library for use inside the kernel. Signed-off-by: Danny Holman --- kernel/init.c | 30 +++++++------ kernel/io.c | 84 ------------------------------------ kernel/string.c | 130 -------------------------------------------------------- 3 files changed, 17 insertions(+), 227 deletions(-) delete mode 100644 kernel/io.c delete mode 100644 kernel/string.c (limited to 'kernel') diff --git a/kernel/init.c b/kernel/init.c index 98ac05c..d4a3638 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -1,31 +1,35 @@ -#include +#include +#include +#include #include -#include -#include +#include +#include #include void jump_userspace(void); char rootfs[1024]; - -int start_init(int argc, char* argv[]) { - while (1); - return 0; -} +char init_bin[1024]; +int gdbstub = 0; void process_cmd(char *cmdline) { char *token = strtok(cmdline, " "); while (token != NULL) { if (strncmp(token, "root=", 5) == 0) - strcpy(rootfs, &token[6]); + strcpy(rootfs, &token[5]); + if (strncmp(token, "init=", 5) == 0) + strcpy(init_bin, &token[5]); + if (strncmp(token, "gdb", 3) == 0) + gdbstub = 1; + token = strtok(NULL, " "); } } void kernel_main(char *cmdline) { - kmalloc_init(); - kprintf("Box Kernel version %s\n", VERSION); + kprintf("Box kernel version %s\n", VERSION); + process_cmd(cmdline); + serial_init(); sched_init(); - - //jump_userspace(); + //pci_check_buses(); } diff --git a/kernel/io.c b/kernel/io.c deleted file mode 100644 index 0a4ba6d..0000000 --- a/kernel/io.c +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include -#include -#include - -static int ringbuf_init = 0; -static struct ringbuf rb; - -char* convert(unsigned int num, int base) { - static char rep[] = "0123456789ABCDEF"; - static char buffer[50]; - char *ptr; - - ptr = &buffer[49]; - *ptr = '\0'; - - do { - *--ptr = rep[num%base]; - num /= base; - } while (num != 0); - - return ptr; -} - -int vkprintf(const char *fmt, va_list args) { - if (ringbuf_init == 0) { - rb_init(&rb, 1024, 4096); - ringbuf_init = 1; - } - - char *s; - int i; - - char buffer[4096]; - for (size_t n = 0; n < strlen(fmt); n++) { - if (fmt[n] != '%') { - buffer[strlen(buffer)] = fmt[n]; - continue; - } else { - n++; - } - - switch (fmt[n]) { - case 'c': - i = va_arg(args, int); - buffer[strlen(buffer)] = i; - break; - case 's': - s = va_arg(args, char*); - strcat(buffer, s); - break; - case 'd': - i = va_arg(args, int); - if (i < 0) { - i = -i; - strcat(buffer, "-"); - } - strcat(buffer, convert(i, 10)); - break; - case 'o': - i = va_arg(args, unsigned int); - strcat(buffer, convert(i, 10)); - break; - case 'x': - i = va_arg(args, unsigned int); - strcat(buffer, convert(i, 16)); - break; - } - } - rb_push_back(&rb, buffer, strlen(buffer)); - memset(buffer, 0, 4096); - return 0; -} - -int kprintf(const char *fmt, ...) { - va_list args; - int done; - - va_start(args, fmt); - done = vkprintf(fmt, args); - va_end(args); - - return done; -} diff --git a/kernel/string.c b/kernel/string.c deleted file mode 100644 index fa0fd3f..0000000 --- a/kernel/string.c +++ /dev/null @@ -1,130 +0,0 @@ -#include - -int memcmp(const void *str1, const void *str2, size_t n) { - unsigned char const *p1 = str1; - unsigned char const *p2 = str2; - int ret = 0; - - if (str1 == str2) - return 0; - - while (n > 0) { - if (*p1 != *p2) { - ret = (*p1 > *p2)?1:-1; - break; - } - n--; - p1++; - p2++; - } - return ret; -} - -void* memcpy(void* __restrict dest, const void* __restrict src, size_t n) { - if (dest == src) - return dest; - - unsigned char *pdest = dest; - unsigned char const *psrc = src; - for (size_t i = 0; i < n; i++) - pdest[i] = psrc[i]; - return dest; -} - -char* strncpy(char* __restrict dest, const char* __restrict src, size_t n) { - for (int i = 0; i < n; i++) { - if (src[i] == '\0') - break; - dest[i] = src[i]; - } -} - -char* strcpy(char* __restrict dest, const char* __restrict src) { - if (strlen(src) > strlen(dest)) - return NULL; - return (char*)memcpy(dest, src, strlen(src)); -} - -char* strcat(char* __restrict dest, const char* __restrict src) { - return (char*)memcpy(&dest[strlen(dest)], src, strlen(src)); -} - -void* memmove(void* __restrict dest, const void* __restrict src, size_t n) { - if (dest == src) - return dest; - - unsigned char const *psrc = src; - unsigned char buffer[n]; - - for (size_t i = 0; i < n; i++) - buffer[i] = psrc[i]; - return memcpy(dest, (void*)buffer, n); -} - -void* memset(void *str, int c, size_t n) { - unsigned char *p = str; - for (size_t i = 0; i < n; i++) - p[i] = (unsigned char)c; - return str; -} - -int strncmp(const char *str1, const char *str2, size_t n) { - return memcmp(str1, str2, n); -} - -int strcmp(const char *str1, const char *str2) { - size_t str1_sz = strlen(str1); - size_t str2_sz = strlen(str2); - if (str1_sz > str2_sz) - return memcmp(str1, str2, str2_sz); - return memcmp(str1, str2, str1_sz); -} - -size_t strlen(const char *str) { - size_t i = 0; - while (str[i] != '\0') - i++; - return i; -} - -int _is_delim(char c, const char *delim) { - while (*delim != '\0') { - if (c == *delim) - return 1; - delim++; - } - return 0; -} - -char* strtok(char* __restrict str, const char* __restrict delim) { - static char *old_str; - - if (str == NULL) - str = old_str; - - while (1) { - if (_is_delim(*str, delim)) { - str++; - continue; - } - - if (*str == '\0') - return NULL; - break; - } - - char *ret = str; - while (1) { - if (*str == '\0') { - old_str = str; - return ret; - } - - if (_is_delim(*str, delim)) { - *str = '\0'; - old_str = str + 1; - return ret; - } - str++; - } -} -- cgit v1.2.3