diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/elf.c | 3 | ||||
| -rw-r--r-- | src/main.c | 8 | ||||
| -rw-r--r-- | src/mem.c | 17 | ||||
| -rw-r--r-- | src/pmem.c | 1 | ||||
| -rw-r--r-- | src/tcb.c | 2 |
5 files changed, 25 insertions, 6 deletions
@@ -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; } /** @@ -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); @@ -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; +} @@ -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; @@ -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); } } |
