aboutsummaryrefslogtreecommitdiff
path: root/src/scheduler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/scheduler.cc')
-rw-r--r--src/scheduler.cc48
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;
}