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++
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;
|
|
}
|
|
|