Skip to content

Commit

Permalink
Move process_loop to ProcessManager static
Browse files Browse the repository at this point in the history
  • Loading branch information
djphoenix committed Nov 19, 2016
1 parent bd39d47 commit bd2f0be
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/boot/bootstrap.s
Expand Up @@ -225,7 +225,7 @@ x64_entry:
call _ZN3SMP4initEv
call _ZN13ModuleManager4initEv
mov %rsp, %rbp
jmp _Z12process_loopv
jmp _ZN14ProcessManager12process_loopEv

reloc_vtables:
lea _start(%rip), %rcx
Expand Down
2 changes: 1 addition & 1 deletion src/platform/smp.cpp
Expand Up @@ -32,7 +32,7 @@ void SMP::startup() {
ACPI::getController()->activateCPU();
startupMutex.lock();
startupMutex.release();
process_loop();
ProcessManager::process_loop();
}

void SMP::init() {
Expand Down
3 changes: 1 addition & 2 deletions src/process/include/processmanager.hpp
Expand Up @@ -20,8 +20,6 @@
#include "process.hpp"
#include "interrupts.hpp"

void NORETURN process_loop();

struct QueuedThread {
Process *process;
Thread *thread;
Expand Down Expand Up @@ -50,4 +48,5 @@ class ProcessManager {
void queueThread(Process *process, Thread *thread);
void dequeueThread(Thread *thread);
static ProcessManager* getManager();
static void NORETURN process_loop();
};
18 changes: 7 additions & 11 deletions src/process/processmanager.cpp
Expand Up @@ -18,18 +18,14 @@

#include "acpi.hpp"

void NORETURN _loop() {
for (;;)
asm volatile("hlt");
}

void process_loop() {
void ProcessManager::process_loop() {
uint32_t cpuid = ACPI::getController()->getCPUID();
Thread nullThread = Thread();
asm volatile("mov %%rsp, %0":"=m"(nullThread.regs.rsp));
nullThread.regs.rip = (uintptr_t)&_loop;
Thread nullThread;
asm volatile("movq %%rsp, %0":"=m"(nullThread.regs.rsp));
asm volatile("leaq _loop(%%rip), %0":"=r"(nullThread.regs.rip));
ProcessManager::getManager()->createNullThread(cpuid, nullThread);
_loop();
asm volatile("_loop:");
for (;;) asm volatile("hlt");
}

Mutex ProcessManager::managerMutex;
Expand Down Expand Up @@ -75,7 +71,7 @@ void ProcessManager::createNullThread(uint32_t cpuid, Thread thread) {
}
bool ProcessManager::SwitchProcess(intcb_regs *regs) {
processSwitchMutex.lock();
if (nullThreads[regs->cpuid].regs.rip != (uintptr_t)&_loop) {
if (nullThreads[regs->cpuid].regs.rip == 0) {
processSwitchMutex.release();
return false;
}
Expand Down

0 comments on commit bd2f0be

Please sign in to comment.