void mem_lock_heap(uintptr_t *start, size_t *size) { assert(!mem_locked); mem_locked = 1; *start = heap_start; *size = platform_mem_size() - heap_start; }
void mem_init(void) { extern char _stext[], _etext[], _erodata[], _end[]; uint64_t mem_size; mem_size = platform_mem_size(); heap_start = ((uint64_t)&_end + PAGE_SIZE - 1) & PAGE_MASK; /* * Cowardly refuse to run with less than 512KB of free memory. */ if (heap_start + 0x80000 > mem_size) PANIC("Not enough memory", NULL); log(INFO, "Solo5: Memory map: %lu MB addressable:\n", mem_size >> 20); log(INFO, "Solo5: unused @ (0x0 - 0x%lx)\n", _stext-1); log(INFO, "Solo5: text @ (0x%lx - 0x%lx)\n", _stext, _etext-1); log(INFO, "Solo5: rodata @ (0x%lx - 0x%lx)\n", _etext, _erodata-1); log(INFO, "Solo5: data @ (0x%lx - 0x%lx)\n", _erodata, _end-1); log(INFO, "Solo5: heap >= 0x%lx < stack < 0x%lx\n", heap_start, mem_size); }
void _start(void *arg) { crt_init_tls(); crt_init_ssp(); volatile int gdb = 1; serial_init(); if (!gdb) log(INFO, "Solo5: Waiting for gdb...\n"); while (gdb == 0) ; cpu_init(); platform_init(arg); /* * Switch away from the bootstrap stack (in boot.S) as early as possible. */ _newstack(platform_mem_size(), _start2, 0); }