From bd0acf88361a4b73a49d11a45177e72bf32091bc Mon Sep 17 00:00:00 2001 From: Clyne Sullivan <clyne@bitgloo.com> Date: Fri, 27 Sep 2024 19:43:17 -0400 Subject: fix pit_busy_wait; better tasking --- tasking.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'tasking.cpp') diff --git a/tasking.cpp b/tasking.cpp index 5cfe091..97dd51a 100644 --- a/tasking.cpp +++ b/tasking.cpp @@ -7,6 +7,7 @@ struct Task enum class State { Invalid, Staging, + Staged, Running }; @@ -33,14 +34,14 @@ void schedule(const Registers& regs) do { if (++current >= tasks.size()) current = 0; - } while (tasks[current].state == Task::Invalid); + } while (tasks[current].state == Task::Invalid || tasks[current].state == Task::Staging); asm volatile(R"( mov %0, %%esp mov %1, %%ebp )" :: "m" (tasks[current].esp), "m" (tasks[current].ebp)); - if (tasks[current].state == Task::Staging) { + if (tasks[current].state == Task::Staged) { tasks[current].state = Task::Running; asm volatile(R"( pop %eax @@ -69,7 +70,7 @@ bool tasking_spawn(void (*entry)(), unsigned ssize) if (i < 0) return false; - tasks[i] = Task(); + tasks[i].state = Task::Staging; auto stack = reinterpret_cast<std::uint32_t>(new std::uint8_t[ssize]); const auto stackend = stack + ssize; @@ -81,9 +82,11 @@ bool tasking_spawn(void (*entry)(), unsigned ssize) r->cs = 0x8; asm volatile("pushfl; pop %%eax" : "=a"(r->eflags)); - tasks[i].esp = regbase; - tasks[i].ebp = stackend; - tasks[i].state = Task::Staging; + tasks[i] = Task { + .esp = regbase, + .ebp = stackend, + .state = Task::Staged + }; return true; } -- cgit v1.2.3