summaryrefslogtreecommitdiff
path: root/kernel/lib
diff options
context:
space:
mode:
authorIan McFarlane <i.mcfarlane2002@gmail.com>2025-04-17 14:19:40 -0400
committerIan McFarlane <i.mcfarlane2002@gmail.com>2025-04-17 14:19:40 -0400
commit7108e7c951f7cff79ce4992f1c7d8d0af0bb5af6 (patch)
treee99684b87952bded5e51c83848a5d35ab53d9ab0 /kernel/lib
parentstarting on ata (diff)
parentclang 18 in flake instead of zig (diff)
downloadcomus-7108e7c951f7cff79ce4992f1c7d8d0af0bb5af6.tar.gz
comus-7108e7c951f7cff79ce4992f1c7d8d0af0bb5af6.tar.bz2
comus-7108e7c951f7cff79ce4992f1c7d8d0af0bb5af6.zip
Merge branch 'main' into ata
Diffstat (limited to 'kernel/lib')
-rw-r--r--kernel/lib/backtrace.c6
-rw-r--r--kernel/lib/isprint.c6
-rw-r--r--kernel/lib/kprintf.c66
-rw-r--r--kernel/lib/panic.c1
4 files changed, 49 insertions, 30 deletions
diff --git a/kernel/lib/backtrace.c b/kernel/lib/backtrace.c
index fb708b2..485cc0f 100644
--- a/kernel/lib/backtrace.c
+++ b/kernel/lib/backtrace.c
@@ -1,4 +1,5 @@
#include <lib.h>
+#include <comus/mboot.h>
struct stackframe {
struct stackframe *rbp;
@@ -38,9 +39,10 @@ void log_backtrace_ex(void *ip, void *bp)
{
struct stackframe *frame = bp;
kputs("Stack trace:\n");
- kprintf(" %p\n", ip);
+ kprintf(" %p\t%s\n", ip, mboot_get_elf_sym((uint64_t)ip));
while (frame) {
- kprintf(" %p\n", frame->rip);
+ kprintf(" %p\t%s\n", frame->rip,
+ mboot_get_elf_sym((uint64_t)frame->rip));
frame = frame->rbp;
}
}
diff --git a/kernel/lib/isprint.c b/kernel/lib/isprint.c
new file mode 100644
index 0000000..e5582dc
--- /dev/null
+++ b/kernel/lib/isprint.c
@@ -0,0 +1,6 @@
+#include <lib.h>
+
+int isprint(int c)
+{
+ return ((unsigned)(c - 0x20) <= (0x7e - 0x20));
+}
diff --git a/kernel/lib/kprintf.c b/kernel/lib/kprintf.c
index 7b1ed71..452e45c 100644
--- a/kernel/lib/kprintf.c
+++ b/kernel/lib/kprintf.c
@@ -1,6 +1,7 @@
+#include "lib/kio.h"
#include <lib.h>
+#include <comus/term.h>
#include <comus/drivers/uart.h>
-#include <comus/drivers/term.h>
#define PRINTF_NUMERIC_BUF_LEN 50
@@ -217,6 +218,9 @@ static void get_radix(char spec, options_t *opts)
case 'o':
opts->radix = 8;
break;
+ case 'b':
+ opts->radix = 2;
+ break;
default:
opts->radix = 10;
break;
@@ -262,43 +266,48 @@ static int printf_lltoa(char *buf, options_t *opts, bool is_neg,
}
precision = 0;
- // sign
- if (is_neg) {
- *(buf++) = '-';
- } else if (opts->sign) {
- *(buf++) = '+';
- } else if (opts->space) {
- *(buf++) = ' ';
+ // write number
+ if (num == 0) {
+ *(buf++) = '0';
+ }
+ while (num) {
+ if (opts->precision_set && precision++ >= opts->precision)
+ break;
+ *(buf++) = printf_itoc(opts->is_uppercase, num % opts->radix);
+ num /= opts->radix;
+ }
+
+ // print zeros if needed
+ if (opts->width_set && len < opts->width && opts->zero) {
+ while (len++ < opts->width)
+ *(buf++) = '0';
}
// radix specifier
if (opts->hash) {
- if (opts->radix == 8) {
+ if (opts->radix == 2) {
+ *(buf++) = 'b';
*(buf++) = '0';
+ }
+ if (opts->radix == 8) {
*(buf++) = 'o';
+ *(buf++) = '0';
}
if (opts->radix == 16) {
- *(buf++) = '0';
*(buf++) = 'x';
+ *(buf++) = '0';
}
}
- // print zeros if needed
- if (opts->width_set && len < opts->width && opts->zero) {
- while (len++ < opts->width)
- *(buf++) = '0';
+ // sign
+ if (is_neg) {
+ *(buf++) = '-';
+ } else if (opts->sign) {
+ *(buf++) = '+';
+ } else if (opts->space) {
+ *(buf++) = ' ';
}
- // write number
- if (num == 0) {
- *(buf++) = '0';
- }
- while (num) {
- if (opts->precision_set && precision++ >= opts->precision)
- break;
- *(buf++) = printf_itoc(opts->is_uppercase, num % opts->radix);
- num /= opts->radix;
- }
*(buf++) = '\0';
return buf - start;
@@ -333,8 +342,8 @@ static void handle_int_specifier(context_t *ctx, options_t *const opts,
printf_putc(ctx, opts->zero ? '0' : ' ');
}
// number
- for (int i = 0; i < buf_len; i++)
- printf_putc(ctx, buf[i]);
+ for (int i = 1; i <= buf_len; i++)
+ printf_putc(ctx, buf[buf_len - i]);
// right padding
if (opts->left == 1) {
for (int i = 0; i < padding; i++)
@@ -424,13 +433,15 @@ static void do_printf(context_t *ctx, va_list args)
switch (spec) {
case 'p':
opts.len = PRINTF_LEN_SIZE_T;
- opts.width_set = true;
+ opts.width_set = 1;
+ opts.width = sizeof(void *) * 2;
opts.radix = 16;
opts.hash = true;
opts.zero = true;
case 'd':
case 'i':
case 'u':
+ case 'b':
case 'o':
case 'x':
case 'X':
@@ -478,6 +489,7 @@ static void do_printf(context_t *ctx, va_list args)
// unsigned int
case 'p':
case 'u':
+ case 'b':
case 'o':
case 'x':
case 'X':
diff --git a/kernel/lib/panic.c b/kernel/lib/panic.c
index dc62eb7..72f5c51 100644
--- a/kernel/lib/panic.c
+++ b/kernel/lib/panic.c
@@ -1,4 +1,3 @@
-#include "lib/klib.h"
#include <lib.h>
#include <stdarg.h>
#include <comus/asm.h>