From 5d56d1a5b4d52702eb4e4ea6f05e4b6eebf41ca8 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Fri, 25 Nov 2022 23:44:40 +0100 Subject: UBSAN - FINALLY FIXING UNDEFINED BEHAVIOUR --- kernel/src/libk/serial_stdio.c | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 kernel/src/libk/serial_stdio.c (limited to 'kernel/src/libk') diff --git a/kernel/src/libk/serial_stdio.c b/kernel/src/libk/serial_stdio.c new file mode 100644 index 0000000..a56750b --- /dev/null +++ b/kernel/src/libk/serial_stdio.c @@ -0,0 +1,61 @@ +#include +#include +#include +#include +#include +#include + +void serial_print_char(char c) +{ + write_serial(c); +} + +void serial_print_string(const char* s) +{ + for (size_t i = 0; i < strlen(s); i++) { + serial_print_char(s[i]); + } +} + +void serial_print_int(uint64_t num) +{ + char a[100]; + itos(num, a); + serial_print_string(a); +} + +void serial_print_hex(uint64_t num) +{ + char a[100]; + itoh(num, a); + serial_print_string(a); +} + +void serial_printf(const char *s, ...) +{ + size_t count = 0; + for(size_t i = 0; i < strlen(s); i++) if(s[i] == '%') count++; + + va_list list; + va_start(list, s); + + for(size_t i = 0; i < strlen(s); i++) + { + if(s[i] == '%') + { + i++; + if(s[i] == 'c') serial_print_char((char)va_arg(list, uint32_t)); + else if(s[i] == 's') serial_print_string(va_arg(list, char*)); + else if(s[i] == 'd') serial_print_int((uint64_t)va_arg(list, uint64_t)); + else if(s[i] == 'x') serial_print_hex((uint64_t)va_arg(list, uint64_t)); + else + { + serial_print_string("Wrong format using printf\n"); + return; + } + } + else serial_print_char(s[i]); + } + + va_end(list); +} -- cgit v1.2.3