diff options
author | Jon Santmyer <jon@jonsantmyer.com> | 2025-07-30 14:32:01 -0400 |
---|---|---|
committer | Jon Santmyer <jon@jonsantmyer.com> | 2025-07-30 14:32:01 -0400 |
commit | b905869a35f062a4e5072f10bec3a2ba3db0e365 (patch) | |
tree | 0666691804878857b4bb07daca8a54f5ddb8ae0b /lib | |
download | jove-kernel-b905869a35f062a4e5072f10bec3a2ba3db0e365.tar.gz jove-kernel-b905869a35f062a4e5072f10bec3a2ba3db0e365.tar.bz2 jove-kernel-b905869a35f062a4e5072f10bec3a2ba3db0e365.zip |
working userland with some invoke syscalls
Diffstat (limited to 'lib')
-rw-r--r-- | lib/itoa.c | 32 | ||||
-rw-r--r-- | lib/log.c | 14 | ||||
-rw-r--r-- | lib/mem.c | 27 | ||||
-rw-r--r-- | lib/objdir.c | 15 | ||||
-rw-r--r-- | lib/panic.c | 15 | ||||
-rw-r--r-- | lib/print.c | 146 | ||||
-rw-r--r-- | lib/strcmp.c | 8 | ||||
-rw-r--r-- | lib/strlen.c | 9 |
8 files changed, 266 insertions, 0 deletions
diff --git a/lib/itoa.c b/lib/itoa.c new file mode 100644 index 0000000..57f0c22 --- /dev/null +++ b/lib/itoa.c @@ -0,0 +1,32 @@ +#include "string.h" + +int +ltostr(char *s, int size, unsigned long l, bool sign, int radix) +{ + unsigned wsize = 0; + unsigned digits = 0; + if((long)l < 0 && sign) { + l = -((long)l); + if(size > wsize && s != 0) s[wsize] = '-'; + wsize++; + } + + for(unsigned long lv = l; lv != 0; lv /= radix) { + digits++; + } + + if(digits-- == 0) { + if(size > wsize && s != 0) s[wsize] = '0'; + wsize++; + } + + for(unsigned long lv = l; lv != 0; lv /= radix) { + int digit = lv % radix; + if(size > digits - wsize && s != 0) { + s[digits - wsize] = (digit >= 10 ? (digit + 'a' - 10) : digit + '0'); + } + wsize++; + } + if(size > wsize && s != 0) s[wsize] = 0; + return ++wsize; +} diff --git a/lib/log.c b/lib/log.c new file mode 100644 index 0000000..6bc770d --- /dev/null +++ b/lib/log.c @@ -0,0 +1,14 @@ +#include "print.h" +#include <stdarg.h> + +void +_klogf(const char *file, const char *func, int line, const char *fmt, ...) +{ + kprintf("%s:%i ", func, line); + + va_list ap; + va_start(ap, fmt); + kvprintf(fmt, ap); + va_end(ap); + +} diff --git a/lib/mem.c b/lib/mem.c new file mode 100644 index 0000000..2ce67f3 --- /dev/null +++ b/lib/mem.c @@ -0,0 +1,27 @@ +#include "string.h" + +void* +memset(void *dest, char c, size_t n) +{ + char *a = dest; + for(size_t i = 0; i < n; i++) a[i] = c; + return dest; +} + +void* +memcpy(void *dest, const void *src, size_t n) +{ + char *a = dest; + const char *b = src; + for(size_t i = 0; i < n; i++) a[i] = b[i]; + return dest; +} + +void* +memmove(void *dest, const void *src, size_t n) +{ + char buffer[n]; + memcpy(buffer, src, n); + memcpy(dest, buffer, n); + return dest; +} diff --git a/lib/objdir.c b/lib/objdir.c new file mode 100644 index 0000000..665da4c --- /dev/null +++ b/lib/objdir.c @@ -0,0 +1,15 @@ +#include "object.h" + +objdir_entry_t* +objdir_seek(objdir_t *dir, uintmax_t index) +{ + uint8_t tli = index & 0xFF; + if(tli == 0) return &dir->self; + + objdir_entry_t *entry = &dir->entries[tli]; + if(entry->type == KO_OBJECT_DIRECTORY) { + if(tli == index) return entry; + return objdir_seek((objdir_t*)entry->data, index >> 8); + } + return entry; +} diff --git a/lib/panic.c b/lib/panic.c new file mode 100644 index 0000000..bfe80e8 --- /dev/null +++ b/lib/panic.c @@ -0,0 +1,15 @@ +#include "panic.h" +#include "print.h" + +NORETURN void +_kpanic(const char *file, int line, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + kprintf("KERNEL PANIC:%s:%i: \n", file, line); + kvprintf(fmt, ap); + + va_end(ap); + hcf(); +} diff --git a/lib/print.c b/lib/print.c new file mode 100644 index 0000000..45c7671 --- /dev/null +++ b/lib/print.c @@ -0,0 +1,146 @@ +#include "print.h" +#include "device/uart.h" +#include "jove.h" +#include "string.h" +#include <stddef.h> +#include <stdbool.h> + +int +kprintf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int r = kvprintf(fmt, ap); + va_end(ap); + return r; +} + +int +ksprintf(char *s, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int r = kvsprintf(s, fmt, ap); + va_end(ap); + return r; +} + +int +ksnprintf(char *s, int size, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + int r = kvsnprintf(s, size, fmt, ap); + va_end(ap); + return r; +} + +int kvprintf(const char *fmt, va_list ap) +{ + va_list ap_dup; + va_copy(ap_dup, ap); + int size = kvsnprintf(0, 0, fmt, ap); + char buffer[size]; + kvsnprintf(buffer, size, fmt, ap_dup); + +#ifdef ENABLE_UART + uart_write(&_initDirectory, _initData.log_object, buffer, size - 1); +#endif + return size; +} + +int +kvsprintf(char *s, const char *fmt, va_list ap) +{ + return kvsnprintf(s, 65536, fmt, ap); +} + +int +kvsnprintf(char *s, int size, const char *fmt, va_list ap) +{ + const char *fmtc = fmt; + int wsize = 0; + do{ + if(*fmtc != '%') { + if(s != NULL && wsize < size) s[wsize] = *fmtc; + wsize++; + continue; + } + + bool sign = true; + bool caps = true; + int radix = 10; + int lpad = 0; + int paramw = sizeof(int); + + if(*(++fmtc) == 0) goto done; + switch(*fmtc) { + case 'c': + if(s != NULL && wsize < size) s[wsize] = va_arg(ap, int); + wsize++; + break; + case 'p': //fallthrough; + paramw = sizeof(uintptr_t); + lpad = paramw * 2; + case 'X': //fallthrough + case 'x': //fallthrough + sign = false; + radix = 16; + goto printint; + break; + case 'u': //fallthrough + sign = false; + goto printint; + break; + case 'i': + goto printint; + break; + case 's': + goto printstr; + break; + default: + break; + } + continue; +printstr: + { + char *arg_s = va_arg(ap, char*); + if(arg_s == 0) arg_s = "(NULL)"; + size_t ssize = strlen(arg_s); + for(char *c = arg_s; *c; c++) { + if(s != NULL && wsize < size) s[wsize] = *c; + wsize++; + } + } + continue; +printint: + { + int isize = 1; + void *iptr = NULL; + if(s != NULL) { + iptr = &s[wsize]; + } + switch(paramw) { + case sizeof(int): isize = ltostr(iptr, size - wsize, va_arg(ap, int), sign, radix); break; + case sizeof(uintptr_t): isize = ltostr(iptr, size - wsize, va_arg(ap, long), sign, radix); break; + default: break; + } + if(lpad) { + if(isize < lpad) { + lpad -= isize - 1; + if(s != 0) { + memmove(&s[wsize + lpad], &s[wsize], isize); + memset(&s[wsize], '0', lpad); + } + isize += lpad; + + } + } + wsize += isize; + continue; + } + }while(*(fmtc++) != 0); +done: + if(s != NULL && wsize < size) s[wsize++] = 0; + return wsize; +} diff --git a/lib/strcmp.c b/lib/strcmp.c new file mode 100644 index 0000000..da6a51a --- /dev/null +++ b/lib/strcmp.c @@ -0,0 +1,8 @@ +#include "string.h" + +int +strcmp(const char *s1, const char *s2) +{ + while(*s1 && *s2 && *(s1++) == *(s2++)); + return *s2 - *s1; +} diff --git a/lib/strlen.c b/lib/strlen.c new file mode 100644 index 0000000..da34697 --- /dev/null +++ b/lib/strlen.c @@ -0,0 +1,9 @@ +#include "string.h" + +size_t +strlen(const char *s) +{ + size_t l = 0; + for(; s[l]; l++); + return l; +} |