summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kernel/common/log.c11
-rw-r--r--kernel/riscv/kernel.c6
-rw-r--r--kernel/riscv/linker.ld4
-rw-r--r--kernel/riscv/start.S24
4 files changed, 24 insertions, 21 deletions
diff --git a/kernel/common/log.c b/kernel/common/log.c
index 88136f2..d75daeb 100644
--- a/kernel/common/log.c
+++ b/kernel/common/log.c
@@ -4,19 +4,11 @@ __attribute__((section(".ringbuf"), aligned(64)))
volatile char log_ring[RINGBUF_SIZE];
static int pos = 0;
-void stub(char c) {
- (void)c;
- return;
-}
-
-console_callback_t callback = stub;
-
void put_char(char c) {
log_ring[pos++] = c;
if (pos >= RINGBUF_SIZE)
pos = 0;
- callback(c);
}
void put_string(const char *s) {
@@ -104,6 +96,3 @@ void printk(const char *fmt, ...) {
__builtin_va_end(args);
}
-void register_console_callback(console_callback_t cb) {
- callback = cb;
-}
diff --git a/kernel/riscv/kernel.c b/kernel/riscv/kernel.c
index d34437f..665d7f4 100644
--- a/kernel/riscv/kernel.c
+++ b/kernel/riscv/kernel.c
@@ -30,13 +30,13 @@ struct kernel_info *discover_arch(void *fdt) {
struct dt_node *memory = dt_find_device(head, "memory");
if (memory == NULL) {
- printk("[E;F] Failed to fidn the memory device!");
+ printk("[E;F] Failed to find the memory device!");
return NULL;
}
size_t len = 0;
- uint8_t *memory_reg = dt_get_prop(head, "reg", &len);
+ uint8_t *memory_reg = dt_get_prop(memory, "reg", &len);
if (!memory_reg || len < sizeof(uintptr_t) + sizeof(size_t)) {
printk("[E;F] reg property for memory in provided device tree is nonexistent or invalid!");
@@ -67,7 +67,7 @@ struct kernel_info *discover_arch(void *fdt) {
}
void kernel_main(size_t hart, void *fdt) {
- printk("wkern version %s (Compiler %s, Linker %s)%s\n", VERSION, COMPILER_NAME, LINKER_NAME);
+ printk("wkern version %s (Compiler %s, Linker %s)\n", VERSION, COMPILER_NAME, LINKER_NAME);
if (hart != 0)
return;
diff --git a/kernel/riscv/linker.ld b/kernel/riscv/linker.ld
index 5bf6586..ec51176 100644
--- a/kernel/riscv/linker.ld
+++ b/kernel/riscv/linker.ld
@@ -4,8 +4,8 @@ ENTRY(_start)
MEMORY
{
ROM (rx) : ORIGIN = 0x80000000, LENGTH = 1M
- RAM (rwx) : ORIGIN = 0x81000000, LENGTH = 1M
- LOGRAM (rw) : ORIGIN = 0x82000000, LENGTH = 1M
+ RAM (rwx) : ORIGIN = 0x80100000, LENGTH = 1M
+ LOGRAM (rw) : ORIGIN = 0x80200000, LENGTH = 1M
}
SECTIONS
diff --git a/kernel/riscv/start.S b/kernel/riscv/start.S
index ecec47b..aa35916 100644
--- a/kernel/riscv/start.S
+++ b/kernel/riscv/start.S
@@ -12,17 +12,31 @@ _start:
la t0, _syscall_start
csrw stvec, t0
-
+
la sp, __stack_top
+ # Copy .data
+ la t0, __data_load
+ la t1, __data_start
+ la t2, __data_end
+
+1:
+ beq t1, t2, 2f
+ lw t3, 0(t0)
+ sw t3, 0(t1)
+ addi t0, t0, 4
+ addi t1, t1, 4
+ j 1b
+2:
+ # Zero .bss
la t0, __bss_start
la t1, __bss_end
- beq t0, t1, 2f
-1:
+3:
+ beq t0, t1, 4f
sw zero, 0(t0)
addi t0, t0, 4
- bltu t0, t1, 1b
-2:
+ j 3b
+4:
call kernel_main
wfi