/kernel/trunk/generic/include/config.h |
---|
37,20 → 37,28 |
#define CONFIG_MEMORY_SIZE (8*1024*1024) |
#define CONFIG_STACK_SIZE STACK_SIZE |
#define CONFIG_INIT_TASKS 32 |
struct config { |
typedef struct { |
__address addr; |
size_t size; |
} init_task_t; |
typedef struct { |
count_t cnt; |
init_task_t tasks[CONFIG_INIT_TASKS]; |
} init_t; |
typedef struct { |
count_t cpu_count; |
volatile count_t cpu_active; |
__address base; |
size_t memory_size; |
__address init_addr; |
size_t init_size; |
size_t kernel_size; /**< Size of memory in bytes taken by kernel and stack */ |
}; |
} config_t; |
extern config_t config; |
extern init_t init; |
#endif |
/kernel/trunk/generic/include/typedefs.h |
---|
40,7 → 40,6 |
typedef unsigned long long task_id_t; |
typedef struct config config_t; |
typedef struct cpu_info cpu_info_t; |
typedef struct cpu cpu_t; |
/kernel/trunk/generic/src/main/kinit.c |
---|
133,15 → 133,16 |
interrupts_enable(); |
if (config.init_size > 0) { |
count_t i; |
for (i = 0; i < init.cnt; i++) { |
/* |
* Create the first user task. |
* Run user tasks. |
*/ |
if (config.init_addr % FRAME_SIZE) |
panic("config.init_addr is not frame aligned"); |
if (init.tasks[i].addr % FRAME_SIZE) |
panic("init[%d].addr is not frame aligned", i); |
utask = task_run_program((void *)config.init_addr); |
utask = task_run_program((void *) init.tasks[i].addr); |
if (utask) |
ipc_phone_0 = &utask->answerbox; |
else |
/kernel/trunk/generic/src/main/main.c |
---|
63,6 → 63,7 |
#include <smp/smp.h> |
config_t config; /**< Global configuration structure. */ |
init_t init = {0}; /**< Initial user-space tasks */ |
context_t ctx; |
75,9 → 76,6 |
size_t hardcoded_ktext_size = 0; |
size_t hardcoded_kdata_size = 0; |
__address init_addr = 0; |
size_t init_size = 0; |
void main_bsp(void); |
void main_ap(void); |
110,21 → 108,22 |
config.base = hardcoded_load_address; |
config.memory_size = get_memory_size(); |
config.init_addr = init_addr; |
config.init_size = init_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,CONFIG_STACK_SIZE, |
config.init_addr, config.init_size)) { |
count_t i; |
bool overlap = false; |
for (i = 0; i < init.cnt; i++) |
if (overlaps(stackaddr, CONFIG_STACK_SIZE, init.tasks[i].addr, init.tasks[i].size)) { |
stackaddr = ALIGN_UP(init.tasks[i].addr + init.tasks[i].size, CONFIG_STACK_SIZE); |
init.tasks[i].size = ALIGN_UP(init.tasks[i].size, CONFIG_STACK_SIZE) + CONFIG_STACK_SIZE; |
overlap = true; |
} |
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 { |
if (!overlap) |
config.kernel_size += CONFIG_STACK_SIZE; |
} |
context_save(&ctx); |
context_set(&ctx, FADDR(main_bsp_separated_stack), |
189,8 → 188,9 |
task_init(); |
thread_init(); |
if (config.init_size > 0) |
printf("config.init_addr=%P, config.init_size=%d\n", config.init_addr, config.init_size); |
count_t i; |
for (i = 0; i < init.cnt; i++) |
printf("init[%d].addr=%P, init[%d].size=%d\n", i, init.tasks[i].addr, i, init.tasks[i].size); |
ipc_init(); |
/* |
/kernel/trunk/generic/src/mm/frame.c |
---|
810,14 → 810,19 |
if (confframe >= start && confframe < start+count) { |
for (;confframe < start+count;confframe++) { |
addr = PFN2ADDR(confframe); |
if (overlaps(addr, PFN2ADDR(confcount), |
KA2PA(config.base),config.kernel_size)) |
if (overlaps(addr, PFN2ADDR(confcount), KA2PA(config.base), config.kernel_size)) |
continue; |
if (config.init_addr) |
if (overlaps(addr,PFN2ADDR(confcount), |
KA2PA(config.init_addr), |
config.init_size)) |
bool overlap = false; |
count_t i; |
for (i = 0; i < init.cnt; i++) |
if (overlaps(addr, PFN2ADDR(confcount), KA2PA(init.tasks[i].addr), init.tasks[i].size)) { |
overlap = true; |
break; |
} |
if (overlap) |
continue; |
break; |
} |
if (confframe >= start+count) |
989,9 → 994,10 |
pfn_t firstframe = ADDR2PFN(KA2PA(config.base)); |
pfn_t lastframe = ADDR2PFN(KA2PA(config.base+config.kernel_size)); |
frame_mark_unavailable(firstframe,lastframe-firstframe+1); |
if (config.init_size > 0) |
frame_mark_unavailable(ADDR2PFN(KA2PA(config.init_addr)), |
SIZE2FRAMES(config.init_size)); |
count_t i; |
for (i = 0; i < init.cnt; i++) |
frame_mark_unavailable(ADDR2PFN(KA2PA(init.tasks[i].addr)), SIZE2FRAMES(init.tasks[i].size)); |
} |
} |