From 3fedbb6e1f849c5e0a4033d68201d60c2fc48121 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 6 Jul 2024 23:37:11 +0300 Subject: core bringup + various warnings + dbg_fdt() is apparently broken, possibly due to UB or something, but it causes some issues with optimizations enabled. Remove it temporarily --- src/elf.c | 3 +++ src/main.c | 8 +++++--- src/mem.c | 17 +++++++++++++++-- src/pmem.c | 1 + src/tcb.c | 2 +- 5 files changed, 25 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/elf.c b/src/elf.c index a38f3c2..9add641 100644 --- a/src/elf.c +++ b/src/elf.c @@ -69,6 +69,8 @@ static void __map_exec(struct tcb *t, vm_t bin, uint8_t ei_c, vm_t phstart, if (!start) return; /* out of memory or something */ + info("mapped ELF section to %x\n", start); + uint8_t elf_flags = program_header_prop(ei_c, runner, p_flags); uint8_t uvflags = __elf_to_uvflags(elf_flags); @@ -108,6 +110,7 @@ static vm_t __map_dyn(struct tcb *t, vm_t bin, uint8_t ei_c, vm_t phstart, /** \todo this path should only be taken when no PT_INTERP is defined, as * making sure ld is loaded should be done in userspace. Maybe a bit * hacky, I know.*/ + return 0; } /** diff --git a/src/main.c b/src/main.c index 1f4c250..169efc3 100644 --- a/src/main.c +++ b/src/main.c @@ -61,14 +61,12 @@ __noreturn void kernel(void *fdt, uintptr_t load_addr, struct vmem *d) /* we should be in kernelspace, so use the virtual address of our FDT. */ fdt = __va(fdt); - bkl_lock(); - /* dbg uses direct mapping at this point */ init_dbg(fdt); /* start up debugging in kernel IO */ setup_io_dbg(d); - dbg_fdt(fdt); + //dbg_fdt(fdt); setup_arch(fdt); @@ -80,11 +78,14 @@ __noreturn void kernel(void *fdt, uintptr_t load_addr, struct vmem *d) vm_t proc_fdt = 0, proc_initrd = 0; init_proc(fdt, &proc_fdt, &proc_initrd); + /* lock kernel since we're about to start other threads as well */ + bkl_lock(); /* try to bring up other cores on system */ smp_bringup(d, fdt); /* start running init program */ run_init(cur_tcb(), proc_fdt, proc_initrd); + unreachable(); } /** @@ -110,6 +111,7 @@ __noreturn void main(unsigned long hart, void *fdt, uintptr_t load_addr) pm_t ram_size = __fdt_ram_size(fdt); set_ram_base(ram_base); set_ram_size(ram_size); + set_load_addr(load_addr); init_mem(fdt); diff --git a/src/mem.c b/src/mem.c index 4fb9d5a..89657e8 100644 --- a/src/mem.c +++ b/src/mem.c @@ -26,6 +26,9 @@ pm_t ram_base; /** RAM size. */ size_t ram_size; +/** Load address. */ +pm_t load_addr; + enum mm_order nearest_order(size_t size) { for (enum mm_order order = max_order(); order >= MM_MIN; --order) @@ -56,7 +59,7 @@ void init_mem(void *fdt) } } -void set_ram_base(uintptr_t base) +void set_ram_base(pm_t base) { ram_base = base; } @@ -66,7 +69,12 @@ void set_ram_size(size_t size) ram_size = size; } -uintptr_t get_ram_base() +void set_load_addr(pm_t addr) +{ + load_addr = addr; +} + +pm_t get_ram_base() { return ram_base; } @@ -75,3 +83,8 @@ size_t get_ram_size() { return ram_size; } + +uintptr_t get_load_addr() +{ + return load_addr; +} diff --git a/src/pmem.c b/src/pmem.c index cf70c3f..fac7731 100644 --- a/src/pmem.c +++ b/src/pmem.c @@ -604,6 +604,7 @@ static pm_t select_base(pm_t ram_base, pm_t ram_size, pm_t size, return base; retry: + continue; } return 0; diff --git a/src/tcb.c b/src/tcb.c index 45c31ce..27256e9 100644 --- a/src/tcb.c +++ b/src/tcb.c @@ -303,7 +303,7 @@ void unreference_proc(struct tcb *p) hard_assert(is_proc(p), RETURN_VOID); p->refcount--; if (zombie(p) && p->refcount == 0) { - dbg("thread %d is completely destroyed\n", p->tid); + dbg("thread %ld is completely destroyed\n", (long)p->tid); __destroy_thread_data(p); } } -- cgit v1.3