You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.0 KiB
C++

#include "tasking.hpp"
#include <array>
struct Task
{
Registers regs;
bool valid = false;
};
static std::array<Task, 4> 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<std::uint32_t>(new std::uint8_t[ssize]);
r.ebp = stack + ssize;
r.esp = r.ebp;
r.eip = reinterpret_cast<std::uint32_t>(entry);
r.cs = 0x8;
r.eflags = tasks[current].regs.eflags;
tasks[i].valid = true;
return true;
}