acadia/zion/syscall/process.cpp

42 lines
1.2 KiB
C++
Raw Normal View History

#include "syscall/process.h"
#include "capability/capability.h"
2023-06-26 15:01:55 -07:00
#include "debug/debug.h"
#include "scheduler/cleanup.h"
#include "scheduler/process_manager.h"
#include "scheduler/scheduler.h"
z_err_t ProcessExit(ZProcessExitReq* req) {
auto curr_thread = gScheduler->CurrentThread();
dbgln("Exit code: {}", static_cast<glcr::ErrorCode>(req->code));
curr_thread->process().Exit();
panic("Returned from thread exit");
2023-06-21 18:28:54 -07:00
return glcr::UNIMPLEMENTED;
}
z_err_t ProcessSpawn(ZProcessSpawnReq* req) {
auto& curr_proc = gScheduler->CurrentProcess();
auto cap = curr_proc.GetCapability(req->proc_cap);
RET_ERR(ValidateCapability<Process>(cap, kZionPerm_SpawnProcess));
2023-06-21 15:07:40 -07:00
glcr::RefPtr<Process> proc = Process::Create();
gProcMan->InsertProcess(proc);
*req->new_proc_cap = curr_proc.AddNewCapability(proc);
*req->new_vmas_cap = curr_proc.AddNewCapability(proc->vmas());
if (req->bootstrap_cap != 0) {
auto cap = curr_proc.GetCapability(req->bootstrap_cap);
if (!cap) {
2023-06-21 18:28:54 -07:00
return glcr::CAP_NOT_FOUND;
}
if (!(cap->HasPermissions(kZionPerm_Transmit))) {
return glcr::CAP_PERMISSION_DENIED;
}
*req->new_bootstrap_cap = proc->AddExistingCapability(
curr_proc.ReleaseCapability(req->bootstrap_cap));
}
2023-06-21 18:28:54 -07:00
return glcr::OK;
}