aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2024-07-07 00:49:55 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2024-07-07 00:49:55 +0300
commit03e12129927b0deba537a11bb5575bef93c57d0f (patch)
tree3e2fce59e7c6d604e163236b44f7f96d1c31e279
parent3fedbb6e1f849c5e0a4033d68201d60c2fc48121 (diff)
downloadkmi-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.S3
-rw-r--r--src/debug.c38
-rw-r--r--src/main.c3
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;
}
/**
diff --git a/src/main.c b/src/main.c
index 169efc3..aaf4cde 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);