aboutsummaryrefslogtreecommitdiff
path: root/src/scheduler.cc
blob: 9a1b54f407e7dbb0a8ca862c9c978f47ed0c1fb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "scheduler.h"
#include <stdlib.h>

void task_a(void) {
  while (true) printk("A");
}

void task_b(void) {
  while (true) printk("B");
}

constexpr uint16_t max_tasks = 256;
uint16_t curr_task = 0;
uint16_t last_task = 0;
static Scheduler::task tasks[max_tasks];

/* 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_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(Scheduler::task t) {
  if (last_task == (max_tasks - 1)) return 0;

  uint16_t id = ++last_task;
  tasks[id] = t;

  return id;
}

cpu_state_t* Scheduler::trigger(cpu_state_t* cpu) {
  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;
}