diff options
Diffstat (limited to 'src/scheduler.cc')
-rw-r--r-- | src/scheduler.cc | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/src/scheduler.cc b/src/scheduler.cc index cce15a8..9a1b54f 100644 --- a/src/scheduler.cc +++ b/src/scheduler.cc @@ -10,42 +10,36 @@ void task_b(void) { } constexpr uint16_t max_tasks = 256; -static cpu_state_t* tasks[max_tasks]; +uint16_t curr_task = 0; +uint16_t last_task = 0; +static Scheduler::task tasks[max_tasks]; -static uint8_t stack_a[4096] = {0}; -static uint8_t stack_b[4096] = {0}; +/* TODO dynamically allocate task stacks */ +__attribute__((aligned(16))) uint8_t stack_a[4096] = {0}; +__attribute__((aligned(16))) uint8_t stack_b[4096] = {0}; Scheduler::Scheduler(uint16_t cs) : InterruptHandler(0x00) { - printk("add_task: ", add_task(stack_b, cs, task_b), '\n'); - printk("add_task: ", add_task(stack_a, cs, task_a), '\n'); - - printk("task0 eip: ", uhex{tasks[1]->eip}, '\n'); - printk("task1 eip: ", uhex{tasks[2]->eip}, '\n'); + printk("add_task: ", add_task({stack_a, task_a, cs}), " stack ", + uhex{reinterpret_cast<uint32_t>(tasks[1].cpu) + sizeof(cpu_state_t)}, " eip: ", uhex{tasks[1].cpu->eip}, '\n'); + printk("add_task: ", add_task({stack_b, task_b, cs}), " stack ", + uhex{reinterpret_cast<uint32_t>(tasks[2].cpu) + sizeof(cpu_state_t)}, " eip: ", uhex{tasks[2].cpu->eip}, '\n'); } -uint16_t Scheduler::add_task(uint8_t* stack, uint16_t cs, void (*entry)()) { - if (last_task_id == (max_tasks - 1)) return 0; - - uint16_t id = ++last_task_id; - ++num_tasks; +uint16_t Scheduler::add_task(Scheduler::task t) { + if (last_task == (max_tasks - 1)) return 0; - cpu_state_t* cpu_state = reinterpret_cast<cpu_state_t*>(stack + 4096 - sizeof(cpu_state_t)); - cpu_state->eip = reinterpret_cast<uint32_t>(entry); - cpu_state->cs = cs; - cpu_state->eflags = 0x202; + uint16_t id = ++last_task; + tasks[id] = t; - tasks[id] = cpu_state; - printk("adding task: cs ", uhex{cpu_state->cs}, " stack ", uhex{reinterpret_cast<uint32_t>(tasks[id])}, " entry ", - uhex{cpu_state->eip}, '\n'); return id; } cpu_state_t* Scheduler::trigger(cpu_state_t* cpu) { - tasks[current_task] = cpu; - - current_task++; - if (current_task > num_tasks) current_task = 0; - - printk("\n\nswapped to task ", current_task, '\n'); - return tasks[current_task]; + if (curr_task != 0) { + tasks[curr_task].cpu = cpu; + } + ++curr_task; + if (curr_task > last_task) curr_task = 1; + cpu = tasks[curr_task].cpu; + return cpu; } |