Skip to content

Commit

Permalink
Process exit syscall
Browse files Browse the repository at this point in the history
  • Loading branch information
djphoenix committed Apr 25, 2017
1 parent 988ac00 commit 8c5eba6
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 15 deletions.
3 changes: 2 additions & 1 deletion src/modules/hello/hello.cpp
Expand Up @@ -26,9 +26,10 @@ MODDESC(description, "Prints \"Hello, world\" text");
MODDESC(requirements, "");
MODDESC(developer, "PhoeniX");

extern "C" { void module(); void puts(const char *); }
extern "C" { void module(); void puts(const char *); void exit(int); }

void module() {
puts("Hello, ");
puts("world!\n");
exit(0);
}
8 changes: 8 additions & 0 deletions src/platform/syscall.cpp
Expand Up @@ -27,6 +27,13 @@ static void syscall_puts(uintptr_t strptr) {
delete str;
}

static void syscall_exit(int code) {
ProcessManager *manager = ProcessManager::getManager();
Process *process = manager->currentProcess();
process->exit(code);
ProcessManager::process_loop();
}

#define SYSCALL_ENT(name) { \
syscall_hash(#name), \
reinterpret_cast<void*>(syscall_ ## name) \
Expand All @@ -37,6 +44,7 @@ static const struct {
void *entry;
} PACKED syscall_map[] = {
SYSCALL_ENT(puts),
SYSCALL_ENT(exit),
{0, 0}
};

Expand Down
1 change: 1 addition & 0 deletions src/process/include/process.hpp
Expand Up @@ -46,6 +46,7 @@ class Process {
Process();
~Process();
void startup();
void exit(int code);
void addThread(Thread *thread, bool suspended);

uint64_t getId() { return id; }
Expand Down
8 changes: 8 additions & 0 deletions src/process/process.cpp
Expand Up @@ -291,3 +291,11 @@ void Process::startup() {
id = (ProcessManager::getManager())->RegisterProcess(this);
addThread(thread, false);
}

void Process::exit(int code) {
printf("EXIT %d\n", code);
for (size_t i = 0; i < threads.getCount(); i++) {
ProcessManager::getManager()->dequeueThread(threads[i]);
}
delete this;
}
24 changes: 10 additions & 14 deletions src/process/processmanager.cpp
Expand Up @@ -56,10 +56,11 @@ bool ProcessManager::FaultHandler(
return getManager()->HandleFault(intr, code, regs);
}
bool ProcessManager::SwitchProcess(intcb_regs *regs) {
processSwitchMutex.lock();
uintptr_t loopbase = (uintptr_t)&process_loop, looptop;
asm volatile("lea process_loop_top(%%rip), %q0":"=r"(looptop));
processSwitchMutex.lock();
if (regs->dpl == 0 &&
cpuThreads[regs->cpuid] == 0 &&
(regs->rip < loopbase || regs->rip >= looptop)) {
processSwitchMutex.release();
return false;
Expand Down Expand Up @@ -108,25 +109,14 @@ bool ProcessManager::SwitchProcess(intcb_regs *regs) {

bool ProcessManager::HandleFault(
uint32_t intr, uint32_t code, intcb_regs *regs) {
if (regs->dpl != 3)
return false;
uint64_t t = EnterCritical();
processSwitchMutex.lock();
QueuedThread *thread = cpuThreads[regs->cpuid];
cpuThreads[regs->cpuid] = 0;
processSwitchMutex.release();
LeaveCritical(t);
uint8_t instrbuf[3];
thread->process->readData(instrbuf, regs->rip, 3);
if ((intr != 0x0E) || (regs->rsp != thread->thread->stack_top)
|| !((instrbuf[0] == 0xF3 && instrbuf[1] == 0xC3) || // repz ret
(instrbuf[0] == 0xC3) || // ret
false)
|| false) {
Interrupts::print(intr, regs, code);
} else {
printf("Exit\n");
}
if (!thread) return false;
Interrupts::print(intr, regs, code);
delete thread->process;
delete thread;
if (SwitchProcess(regs))
Expand Down Expand Up @@ -191,6 +181,12 @@ void ProcessManager::dequeueThread(Thread *thread) {
delete next;
next = prev ? prev->next : nextThread;
}
for (size_t cpu = 0; cpu < ACPI::getController()->getCPUCount(); cpu++) {
if (!cpuThreads[cpu]) continue;
if (cpuThreads[cpu]->thread != thread) continue;
delete cpuThreads[cpu];
cpuThreads[cpu] = 0;
}
processSwitchMutex.release();
LeaveCritical(t);
}
Expand Down

0 comments on commit 8c5eba6

Please sign in to comment.