diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-07 00:49:55 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-07 00:49:55 +0300 |
| commit | 03e12129927b0deba537a11bb5575bef93c57d0f (patch) | |
| tree | 3e2fce59e7c6d604e163236b44f7f96d1c31e279 | |
| parent | 3fedbb6e1f849c5e0a4033d68201d60c2fc48121 (diff) | |
| download | kmi-03e12129927b0deba537a11bb5575bef93c57d0f.tar.gz kmi-03e12129927b0deba537a11bb5575bef93c57d0f.zip | |
fixed crash with dbg_fdt()
+ Apparently dbg_fdt() itself wasn't buggy, but for whatever reason GCC
produced an absolute load to the prefix string in __print_prefix()
which caused all the issues. Unclear why, seems like a compiler bug.
This commit is more of a workaround, I'd still like to investigate
this further.
| -rw-r--r-- | arch/riscv64/conf/kernel-link.S | 3 | ||||
| -rw-r--r-- | src/debug.c | 38 | ||||
| -rw-r--r-- | src/main.c | 3 |
3 files changed, 20 insertions, 24 deletions
diff --git a/arch/riscv64/conf/kernel-link.S b/arch/riscv64/conf/kernel-link.S index 1a0d42f..832a886 100644 --- a/arch/riscv64/conf/kernel-link.S +++ b/arch/riscv64/conf/kernel-link.S @@ -11,7 +11,7 @@ SECTIONS { * hack. * @todo look into this further. */ - . = ABSOLUTE(VM_DMAP); + . = VM_DMAP; __kernel_start = .; .text ALIGN(4K) : AT(0) { *(.kernel.start); @@ -24,6 +24,7 @@ SECTIONS { .data : { *(.data*) + *(.sdata*) } .bss : { diff --git a/src/debug.c b/src/debug.c index fcec537..15640b4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -364,6 +364,16 @@ static size_t __integral_val(ssize_t value, size_t base, size_t flags, return ret + 1; } +static size_t __puts(const char *s) +{ + size_t i = 0; + while (s[i]) { + __putchar(s[i++]); + } + + return i; +} + /** * Print prefix corresponding to \c base. * @@ -372,28 +382,14 @@ static size_t __integral_val(ssize_t value, size_t base, size_t flags, */ static size_t __print_prefix(size_t base) { - size_t i = 0; - - const char *hex = "0x"; - const char *oct = "0"; - const char *bin = "0b"; - const char *empty = ""; - - const char *prefix; - - if (base == 16) - prefix = hex; - else if (base == 8) - prefix = oct; - else if (base == 2) - prefix = bin; - else - prefix = empty; - - for (; *prefix; ++i) - __putchar(*prefix++); + switch (base) { + case 16: return __puts("0x"); + case 8: return __puts("0"); + case 2: return __puts("0b"); + default: + } - return i; + return 0; } /** @@ -66,7 +66,7 @@ __noreturn void kernel(void *fdt, uintptr_t load_addr, struct vmem *d) /* start up debugging in kernel IO */ setup_io_dbg(d); - //dbg_fdt(fdt); + dbg_fdt(fdt); setup_arch(fdt); @@ -106,7 +106,6 @@ __noreturn void main(unsigned long hart, void *fdt, uintptr_t load_addr) (void)hart; /** @todo some kind of lottery? */ - pm_t ram_base = __fdt_ram_base(fdt); pm_t ram_size = __fdt_ram_size(fdt); set_ram_base(ram_base); |
