#include "tasking.hpp" #include struct Task { Registers regs; bool valid = false; }; static std::array tasks; static int current = -1; void schedule(Registers& regs) { if (current < 0) return; tasks[current].regs = regs; do { if (++current >= tasks.size()) current = 0; } while (!tasks[current].valid); regs = tasks[current].regs; } void tasking_initialize() { tasks[0].valid = true; current = 0; asm volatile("int $0x20"); } bool tasking_spawn(void (*entry)(), unsigned ssize) { int i = -1; for (i = 0; i < tasks.size(); ++i) { if (!tasks[i].valid) break; } if (i < 0) return false; tasks[i] = Task(); auto& r = tasks[i].regs; auto stack = reinterpret_cast(new std::uint8_t[ssize]); r.ebp = stack + ssize; r.esp = r.ebp; r.eip = reinterpret_cast(entry); r.cs = 0x8; r.eflags = tasks[current].regs.eflags; tasks[i].valid = true; return true; }