43,7 → 43,6 |
#include <align.h> |
#include <interrupt.h> |
#include <arch/mm/memory_init.h> |
#include <mm/heap.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <genarch/mm/page_pt.h> |
103,6 → 102,8 |
*/ |
void main_bsp(void) |
{ |
__address stackaddr; |
|
config.cpu_count = 1; |
config.cpu_active = 1; |
|
111,19 → 112,22 |
config.init_addr = init_addr; |
config.init_size = init_size; |
|
if (init_size > 0) |
config.heap_addr = init_addr + init_size; |
else |
config.heap_addr = hardcoded_load_address + hardcoded_ktext_size + hardcoded_kdata_size; |
config.kernel_size = ALIGN_UP(hardcoded_ktext_size + hardcoded_kdata_size, PAGE_SIZE); |
stackaddr = config.base + config.kernel_size; |
/* Avoid placing kernel on top of init */ |
if (overlaps(stackaddr,stackaddr+CONFIG_STACK_SIZE, |
config.init_addr, config.init_addr+config.init_size)) { |
|
stackaddr = ALIGN_UP(config.init_addr+config.init_size, |
CONFIG_STACK_SIZE); |
config.init_size = ALIGN_UP(config.init_size,CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE; |
} else { |
config.kernel_size += CONFIG_STACK_SIZE; |
} |
|
config.heap_size = CONFIG_HEAP_SIZE + (config.memory_size / FRAME_SIZE) * sizeof(frame_t); |
|
config.kernel_size = ALIGN_UP(config.heap_addr - hardcoded_load_address + config.heap_size, PAGE_SIZE); |
config.heap_delta = config.kernel_size - (config.heap_addr - hardcoded_load_address + config.heap_size); |
config.kernel_size = config.kernel_size + CONFIG_STACK_SIZE; |
|
context_save(&ctx); |
context_set(&ctx, FADDR(main_bsp_separated_stack), config.base + config.kernel_size - CONFIG_STACK_SIZE, CONFIG_STACK_SIZE); |
context_set(&ctx, FADDR(main_bsp_separated_stack), |
stackaddr, CONFIG_STACK_SIZE); |
context_restore(&ctx); |
/* not reached */ |
} |
140,7 → 144,6 |
thread_t *t; |
|
the_initialize(THE); |
|
/* |
* kconsole data structures must be initialized very early |
* because other subsystems will register their respective |
158,14 → 161,13 |
* Memory management subsystems initialization. |
*/ |
arch_pre_mm_init(); |
early_heap_init(config.heap_addr, config.heap_size + config.heap_delta); |
/* Initialize at least 1 memory segment big enough for slab to work */ |
frame_init(); |
slab_cache_init(); |
as_init(); |
page_init(); |
tlb_init(); |
arch_post_mm_init(); |
|
arch_post_mm_init(); |
version_print(); |
|
printf("%P: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n", |
178,11 → 180,9 |
|
printf("config.memory_size=%dM\n", config.memory_size/(1024*1024)); |
printf("config.cpu_count=%d\n", config.cpu_count); |
|
cpu_init(); |
|
calibrate_delay_loop(); |
|
timeout_init(); |
scheduler_init(); |
task_init(); |