acadia/zion/syscall/capability.cpp

29 lines
737 B
C++
Raw Normal View History

#include "syscall/capability.h"
2023-06-21 18:28:54 -07:00
#include <glacier/status/error.h>
#include "scheduler/scheduler.h"
z_err_t CapDuplicate(ZCapDuplicateReq* req) {
auto& proc = gScheduler->CurrentProcess();
auto cap = proc.GetCapability(req->cap_in);
if (!cap) {
2023-06-21 18:28:54 -07:00
return glcr::CAP_NOT_FOUND;
}
if (!(cap->permissions() & kZionPerm_Duplicate)) {
return glcr::CAP_PERMISSION_DENIED;
}
*req->cap_out = proc.AddNewCapability(cap->raw_obj(),
cap->permissions() & req->perm_mask);
2023-06-21 18:28:54 -07:00
return glcr::OK;
}
z_err_t CapRelease(ZCapReleaseReq* req) {
auto& proc = gScheduler->CurrentProcess();
if (proc.ReleaseCapability(req->cap).empty()) {
return glcr::CAP_NOT_FOUND;
}
return glcr::OK;
}