예제 #1
0
파일: mem.c 프로젝트: djwillia/solo5
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;
}
예제 #2
0
파일: mem.c 프로젝트: djwillia/solo5
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);
}
예제 #3
0
파일: start.c 프로젝트: mato/solo5
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);
}