You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.7 KiB
C

3 years ago
#include "kernel.h"
#include "ktypes.h"
3 years ago
#include "ecall.h"
#include "sched.h"
#include "io.h"
#include "malloc.h"
3 years ago
void create_processes_from_bin_table();
3 years ago
extern ProcessControlBlock processes[PROCESS_COUNT];
loaded_binary binary_table[NUM_BINARIES] __attribute__ ((section (".data")));
extern void memset(unsigned int, void*, void*);
3 years ago
extern void init()
{
init_ecall_table();
dbgln("Kernel started!", 15);
create_processes_from_bin_table();
3 years ago
scheduler_run_next();
}
void create_processes_from_bin_table()
{
char msg[28] = "found bin with id 0 at pos 0";
ProcessControlBlock* next_process = processes;
malloc_info info;
info.allocate_memory_end = (void*) 0xFF0000;
info.allocate_memory_start = (void*) 0;
for (int i = 0; i < NUM_BINARIES; i++) {
if (binary_table[i].binid == 0)
break;
// print message
msg[18] = (char) binary_table[i].binid + '0';
msg[27] = (char) i + '0';
dbgln(msg, 28);
info.allocate_memory_start = binary_table[i].bounds[1];
}
// initialize malloc
malloc_init(&info);
for (int i = 0; i < NUM_BINARIES; i++) {
if (binary_table[i].binid == 0)
break;
optional_voidptr stack_top = malloc_stack(1<<12); // allocate 4Kib stack
if (has_error(stack_top)) {
dbgln("Error while allocating stack for initial process", 48);
continue;
}
next_process->status = PROC_RDY;
next_process->pid = binary_table[i].binid;
next_process->pc = binary_table[i].entrypoint;
next_process->regs[1] = (int) stack_top.value; // set stack top, put 32 bytes of zeros there
next_process++;
dbgln("enabled process from table", 26);
}
}