diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-07-26 15:25:22 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-07-26 15:26:49 -0500 |
| commit | 5c12f756189373fb25220fe8824d4df785e61742 (patch) | |
| tree | 9e1907d1f63254e8272358aa51cd4d8e9d627957 | |
| parent | 9137408a4989fcafca6527a2e17e5a7348d00dde (diff) | |
create ringbuffer for logging
| -rw-r--r-- | include/log.h | 6 | ||||
| -rw-r--r-- | kernel/kernel.c | 13 | ||||
| -rw-r--r-- | kernel/log.c | 96 | ||||
| -rw-r--r-- | linker.ld | 11 |
4 files changed, 122 insertions, 4 deletions
diff --git a/include/log.h b/include/log.h new file mode 100644 index 0000000..2b35922 --- /dev/null +++ b/include/log.h @@ -0,0 +1,6 @@ +#pragma once + +#define RINGBUF_SIZE 64 * 1024 + +void vprintk(const char *message, __builtin_va_list args); +void printk(const char *message, ...); diff --git a/kernel/kernel.c b/kernel/kernel.c index da44428..70a0ad8 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,19 +1,26 @@ #include <types.h> #include <dtb.h> #include <bump.h> +#include <log.h> + +uint32_t user_regs[31]; void kernel_main(size_t hart, void *fdt) { - (void)hart; + printk("Doing kernel init with hard ID %d", hart); struct dt_node *head = dt_parse(fdt); struct mem_info *info = km_find_memory(head); + if (!info) { - while (1); + printk("failed to find memory info!"); + return; } km_init(info); +} +void kernel_trap() { - while(1); + } diff --git a/kernel/log.c b/kernel/log.c new file mode 100644 index 0000000..3392223 --- /dev/null +++ b/kernel/log.c @@ -0,0 +1,96 @@ +#include <log.h> +#include <types.h> +__attribute__((section(".ringbuf"), aligned(64))) +volatile char log_ring[RINGBUF_SIZE]; +static int pos = 0; + +void put_char(char c) { + log_ring[pos++] = c; + if (pos >= RINGBUF_SIZE) + pos = 0; +} + +void put_string(const char *s) { + while (*s) + put_char(*s++); +} + +void put_uint(unsigned int value, unsigned int radix) { + char tmp[16]; + const char digits[] = "0123456789abcdef"; + int i = 0; + + if (value == 0) { + put_char('0'); + return; + } + + while (value) { + tmp[i++] = digits[value % radix]; + value /= radix; + } + + while (i--) + put_char(tmp[i]); +} + +void put_int(int value) { + if (value < 0) { + put_char('-'); + put_uint((unsigned int)(-value), 10); + } else { + put_uint((unsigned int)value, 10); + } +} + +void vprintk(const char *fmt, __builtin_va_list args) { + while (*fmt) { + if (*fmt != '%') { + put_char(*fmt++); + continue; + } + + fmt++; + + switch (*fmt) { + case '%': + put_char('%'); + break; + + case 'c': + put_char((char)__builtin_va_arg(args, int)); + break; + + case 's': + put_string(__builtin_va_arg(args, const char *)); + break; + + case 'd': + case 'i': + put_int(__builtin_va_arg(args, int)); + break; + + case 'u': + put_uint(__builtin_va_arg(args, unsigned int), 10); + break; + + case 'x': + put_uint(__builtin_va_arg(args, unsigned int), 16); + break; + + default: + put_char('%'); + put_char(*fmt); + break; + } + + fmt++; + } +} + +void printk(const char *fmt, ...) { + __builtin_va_list args; + __builtin_va_start(args, fmt); + vprintk(fmt, args); + __builtin_va_end(args); +} @@ -4,7 +4,8 @@ ENTRY(_start) MEMORY { ROM (rx) : ORIGIN = 0x80000000, LENGTH = 1M - RAM (rwx) : ORIGIN = 0x80400000, LENGTH = 1M + RAM (rwx) : ORIGIN = 0x81000000, LENGTH = 1M + LOGRAM (rw) : ORIGIN = 0x82000000, LENGTH = 1M } SECTIONS @@ -51,6 +52,14 @@ SECTIONS __stack_top = .; } > RAM + .ringbuf (NOLOAD) : ALIGN(64) + { + __ringbuf_start = .; + KEEP(*(.ringbuf)) + . = ALIGN(64); + __ringbuf_end = .; + } > LOGRAM + /DISCARD/ : { *(.eh_frame) *(.eh_frame.*) |
