summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/log.h6
-rw-r--r--kernel/kernel.c13
-rw-r--r--kernel/log.c96
-rw-r--r--linker.ld11
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);
+}
diff --git a/linker.ld b/linker.ld
index 4f86e10..5bf6586 100644
--- a/linker.ld
+++ b/linker.ld
@@ -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.*)