From d43d7caf15a01dd9c2ef1d9e975df3ef7c4e9204 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Fri, 27 Sep 2024 06:02:49 -0400 Subject: wip: initial commit --- tasking.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 tasking.cpp (limited to 'tasking.cpp') diff --git a/tasking.cpp b/tasking.cpp new file mode 100644 index 0000000..9e2cd49 --- /dev/null +++ b/tasking.cpp @@ -0,0 +1,60 @@ +#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; +} + -- cgit v1.2.3