diff options
Diffstat (limited to 'kernel/riscv')
| -rw-r--r-- | kernel/riscv/kernel.c | 6 | ||||
| -rw-r--r-- | kernel/riscv/linker.ld | 4 | ||||
| -rw-r--r-- | kernel/riscv/start.S | 24 |
3 files changed, 24 insertions, 10 deletions
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 |
